#define NULL 0
...
typedef struct _iobuf {
int cnt; /* Characters left */
char *ptr; /* Next character's place */
char *base; /* Buffer's place */
int flag; /* Way of accesing the file */
int fd; /* File Descriptor */
}FILE;
extern FILE _iob[20];
enum _flags {
_READ = 01,
_WRITE = 02;
_UNBUF = 04,
_EOF = 010,
_ERR = 020
};
...
#define getc(p) (--(p)->cnt >= 0) \
? (unsigned char ) *(p)->ptr++ L _fillbuf((x), p)
#define putc(x,p) (--(p)-> >= 0) \
? *(p)->ptr++ = (x) : _flushbuf((x), p)
...
int _fillbuf( FILE *fp )
{
int bufsize;
if((fp->flag & (_READ|_EOF|_ERR)) != _READ) {
bufsuze = (fp->flag & _UNBUF) ? i : BUFSIZ;
if(fp->base == NULL)
if((fp
->base
= (char *) malloc(bufsize
) == NULL
) return EOF;
}
fp->ptr = fp->base;
fp->ctr = read(fp->fd, fp->ptr, bufsiz);
if(--fp->cnt < 0) {
if(fp ->cnt -- -1)
fp->flag |= _EOF;
else
fp->flag |= _ERR;
fp->cnt = 0;
return EOF;
}
}
I2RlZmluZSBOVUxMCTAKCi4uLgoKdHlwZWRlZiBzdHJ1Y3QgX2lvYnVmCXsKCWludCBjbnQ7CS8qIENoYXJhY3RlcnMgbGVmdCAqLwoJY2hhciAqcHRyOwkvKiBOZXh0IGNoYXJhY3RlcidzIHBsYWNlICovCgljaGFyICpiYXNlOwkvKiBCdWZmZXIncyBwbGFjZSAqLwoJaW50IGZsYWc7CS8qIFdheSBvZiBhY2Nlc2luZyB0aGUgZmlsZSAqLwoJaW50IGZkOwkJLyogRmlsZSBEZXNjcmlwdG9yICovCn1GSUxFOwoKZXh0ZXJuIEZJTEUgX2lvYlsyMF07CgplbnVtIF9mbGFncwl7CglfUkVBRCA9IDAxLAoJX1dSSVRFID0gMDI7CglfVU5CVUYgPSAwNCwKCV9FT0YgPSAwMTAsCglfRVJSID0gMDIwCn07CgouLi4KCiNkZWZpbmUgZ2V0YyhwKQkoLS0ocCktPmNudCA+PSAwKSBcCgk/ICh1bnNpZ25lZCBjaGFyICkgKihwKS0+cHRyKysgTCBfZmlsbGJ1ZigoeCksIHApCgojZGVmaW5lIHB1dGMoeCxwKSAoLS0ocCktPiA+PSAwKSBcCgk/ICoocCktPnB0cisrID0gKHgpIDogX2ZsdXNoYnVmKCh4KSwgcCkKCQouLi4KCmludCBfZmlsbGJ1ZiggRklMRSAqZnAgKQp7CglpbnQgYnVmc2l6ZTsKCQoJaWYoKGZwLT5mbGFnICYgKF9SRUFEfF9FT0Z8X0VSUikpICE9IF9SRUFEKQl7CgkJYnVmc3V6ZSA9IChmcC0+ZmxhZyAmIF9VTkJVRikgPyBpIDogQlVGU0laOwoJCWlmKGZwLT5iYXNlID09IE5VTEwpCgkJCWlmKChmcC0+YmFzZSA9IChjaGFyICopIG1hbGxvYyhidWZzaXplKSA9PSBOVUxMKQoJCQkJcmV0dXJuIEVPRjsKCX0KCQoJZnAtPnB0ciA9IGZwLT5iYXNlOwoJZnAtPmN0ciA9IHJlYWQoZnAtPmZkLCBmcC0+cHRyLCBidWZzaXopOwoJaWYoLS1mcC0+Y250IDwgMCkJewoJCWlmKGZwIC0+Y250IC0tIC0xKQoJCQlmcC0+ZmxhZyB8PSBfRU9GOwoJCWVsc2UKCQkJZnAtPmZsYWcgfD0gX0VSUjsKCQlmcC0+Y250ID0gMDsKCQlyZXR1cm4gRU9GOwoJfQp9