add directory study
This commit is contained in:
69
study/linux-travel/minix-386/estdio21.tar/estdio21/fputs.c
Normal file
69
study/linux-travel/minix-386/estdio21.tar/estdio21/fputs.c
Normal file
@@ -0,0 +1,69 @@
|
||||
/* f p u t s */
|
||||
|
||||
#include "stdiolib.h"
|
||||
|
||||
/*LINTLIBRARY*/
|
||||
|
||||
#define WRITEAHEAD 4 /* write-ahead factor */
|
||||
|
||||
int fputs F2(CONST char *, s, FILE *, fp)
|
||||
|
||||
{
|
||||
register __stdiobuf_t *wp; /* output buffer pointer */
|
||||
register __stdiobuf_t *p; /* buffer pointer */
|
||||
register __stdiobuf_t *we; /* end of output buffer */
|
||||
__stdiosize_t len; /* length of string */
|
||||
|
||||
if (CHECKWRITE(fp))
|
||||
return 0;
|
||||
|
||||
/* Fix char casting problems */
|
||||
p = (__stdiobuf_t *) s;
|
||||
|
||||
/* Dump directly into unbuffered streams */
|
||||
if (TESTFLAG(fp, _IONBF)) {
|
||||
len = strlen(p);
|
||||
return __iowrite(fileno(fp), p, len) != len ? EOF : 0;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
wp = GETWRITEPTR(fp);
|
||||
we = GETWRITELIMIT(fp);
|
||||
|
||||
/* A fairly empty buffer -- must match WRITEAHEAD */
|
||||
if (BUFFERSIZE(fp) >= WRITEAHEAD) {
|
||||
we -= WRITEAHEAD;
|
||||
while (wp < we) {
|
||||
#if WRITEAHEAD != 4
|
||||
<< Writeahead factor assumed to be 4 >>
|
||||
#else
|
||||
if ((wp[0] = p[0]) == 0) goto Done0;
|
||||
if ((wp[1] = p[1]) == 0) goto Done1;
|
||||
if ((wp[2] = p[2]) == 0) goto Done2;
|
||||
if ((wp[3] = p[3]) == 0) goto Done3;
|
||||
#endif
|
||||
wp += WRITEAHEAD;
|
||||
p += WRITEAHEAD;
|
||||
}
|
||||
we += WRITEAHEAD;
|
||||
}
|
||||
|
||||
/* Near end of buffer */
|
||||
for (; wp < we; wp++) {
|
||||
if ((*wp = *p++) == 0)
|
||||
goto Done0;
|
||||
}
|
||||
SETWRITEPTR(fp, wp);
|
||||
(void) FFLUSH(fp);
|
||||
}
|
||||
|
||||
Done3: wp += 3; goto Done0;
|
||||
Done2: wp += 2; goto Done0;
|
||||
Done1: wp += 1;
|
||||
Done0:
|
||||
|
||||
SETWRITEPTR(fp, wp);
|
||||
if (TESTFLAG(fp, _IOLBF) && strchr(s, '\n') != NULL)
|
||||
(void) FFLUSH(fp);
|
||||
return ferror(fp) ? EOF : 0;
|
||||
}
|
||||
Reference in New Issue
Block a user