|
|
1.1 ! root 1: /* ! 2: * oswrite( mode,recsiz,ioptr,scptr ) writes the record in scblk to ! 3: * the designated output file. there are two types of transfers: ! 4: * ! 5: * unbuffered write is done immediately ! 6: * ! 7: * buffered write is done into buffer ! 8: * ! 9: * in either case, a new-line is appended to the record if in ! 10: * line mode (mode > 0) ! 11: */ ! 12: ! 13: #include "spitblks.h" ! 14: #include "spitio.h" ! 15: ! 16: int ! 17: oswrite( mode, recsiz, ioptr, scptr ) ! 18: ! 19: int mode; ! 20: register int recsiz; ! 21: struct ioblk *ioptr; ! 22: struct scblk *scptr; ! 23: ! 24: { ! 25: char *saveloc, savech; ! 26: register char *cp = scptr -> str; ! 27: register int fdn = ioptr -> fdn; ! 28: int ioerrcnt = 0; ! 29: ! 30: /* ! 31: * if in line mode, save the character after the string ! 32: * requested to be written and insert a new-line ! 33: */ ! 34: if ( mode > 0 ) { ! 35: saveloc = cp + recsiz; ! 36: savech = *saveloc; ! 37: *saveloc = '\n'; ! 38: recsiz++; ! 39: } ! 40: ! 41: /* if unbuffered, write the string directly to the output */ ! 42: if ( ioptr -> flg & IO_WRC ) { ! 43: if ( write( fdn, cp, recsiz ) != recsiz) ! 44: ioerrcnt++; ! 45: ! 46: } else { /* buffered */ ! 47: register struct bfblk *bfptr = ioptr -> buf; ! 48: ! 49: while (recsiz > 0) { ! 50: register int n = recsiz; ! 51: ! 52: if ( n > bfptr -> rem ) ! 53: n = bfptr -> rem; ! 54: ! 55: recsiz -= n; ! 56: ! 57: if ( n == bfptr -> siz ) { ! 58: if ( write ( fdn, cp, n ) != n) ! 59: ioerrcnt++; ! 60: cp += n; ! 61: } else { ! 62: register char *r = bfptr -> buf + bfptr -> off; ! 63: bfptr -> off += n; ! 64: bfptr -> rem -= n; ! 65: ! 66: /* copy n characters from *cp to *r */ ! 67: if ( n & 1 ) ! 68: *r++ = *cp++; ! 69: n >>= 1; ! 70: while (--n >= 0) { ! 71: *r++ = *cp++; ! 72: *r++ = *cp++; ! 73: } ! 74: ! 75: if ( bfptr -> rem == 0 ) ! 76: ioerrcnt += flush( ioptr ); ! 77: } ! 78: } ! 79: ! 80: } ! 81: ! 82: /* if line mode, restore the previously saved character */ ! 83: if ( mode > 0 ) ! 84: *saveloc = savech; ! 85: ! 86: return ioerrcnt; ! 87: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.