|
|
1.1 ! root 1: #include "stream.h" ! 2: ! 3: /* define some UNIX calls */ ! 4: extern int open (char *, int); ! 5: extern int close (int); ! 6: extern long lseek (int, long, int); ! 7: extern int read (int, char *, unsigned); ! 8: extern int write (int, char *, unsigned); ! 9: extern int creat (char *, int); ! 10: ! 11: /* ! 12: * Open a file with the given mode. ! 13: * Return: NULL if failure ! 14: * this if success ! 15: */ ! 16: filebuf* filebuf.open (char *name, open_mode om) ! 17: { ! 18: switch (om) { ! 19: case input: ! 20: fd = ::open(name, 0); ! 21: break; ! 22: case output: ! 23: if ((fd = ::open(name,1)) < 0) fd = creat(name, 664); ! 24: break; ! 25: case append: ! 26: if ((fd = ::open(name,1)) < 0) ! 27: fd = creat(name, 664); ! 28: else { ! 29: if (lseek(fd, 0, 2) < 0) { ! 30: (void)::close(fd); ! 31: fd = -1; ! 32: } ! 33: } ! 34: break; ! 35: } ! 36: ! 37: if (fd < 0) return NULL; ! 38: ! 39: opened = 1; ! 40: return this; ! 41: } ! 42: ! 43: /* ! 44: * Empty an output buffer. ! 45: * Returns: EOF on error ! 46: * 0 on success ! 47: */ ! 48: int filebuf.overflow(int c) ! 49: { ! 50: if (!opened || allocate()==EOF) return EOF; ! 51: ! 52: if (base == eptr) { ! 53: /* unbuffered IO */ ! 54: if (c != EOF) { ! 55: *pptr = c; ! 56: if (write(fd, pptr, 1) != 1) return EOF; ! 57: } ! 58: } else { ! 59: /* buffered IO */ ! 60: if (pptr > base) ! 61: if (write(fd, base, pptr-base) != pptr-base) return EOF; ! 62: pptr = gptr = base; ! 63: if (c != EOF) *pptr++ = c; ! 64: } ! 65: return c & 0377; ! 66: } ! 67: ! 68: /* ! 69: * Fill an input buffer. ! 70: * Returns: EOF on error or end of input ! 71: * next character on success ! 72: */ ! 73: int filebuf.underflow() ! 74: { ! 75: int count; ! 76: ! 77: if (!opened || allocate()==EOF) return EOF; ! 78: ! 79: if ((count=read(fd, base, eptr-base)) < 1) return EOF; ! 80: ! 81: gptr = base; ! 82: pptr = base + count; ! 83: return *gptr & 0377; ! 84: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.