|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1982 Regents of the University of California ! 3: */ ! 4: #ifndef lint ! 5: static char sccsid[] = "@(#)asio.c 4.4 2/14/82"; ! 6: #endif not lint ! 7: ! 8: #include <stdio.h> ! 9: #include "as.h" ! 10: /* ! 11: * Block I/O routines for logical I/O concurrently in ! 12: * more than one place in the same file. ! 13: */ ! 14: int biofd; /* file descriptor for block I/O file */ ! 15: off_t boffset; /* physical position in logical file */ ! 16: BFILE *biobufs; /* the block I/O buffers */ ! 17: ! 18: #define error(severity, message) \ ! 19: {yyerror(message); if (severity) delexit();} ! 20: ! 21: Flushfield(n) ! 22: register int n; ! 23: { ! 24: while (n>0) { ! 25: outb(bitfield); ! 26: bitfield >>= 8; ! 27: n -= 8; ! 28: } ! 29: bitoff=0; ! 30: bitfield=0; ! 31: } ! 32: ! 33: /* ! 34: * Block I/O Routines ! 35: */ ! 36: bopen(bp, off) ! 37: struct biobuf *bp; ! 38: off_t off; ! 39: { ! 40: ! 41: bp->b_ptr = bp->b_buf; ! 42: bp->b_nleft = BUFSIZ - off % BUFSIZ; ! 43: bp->b_off = off; ! 44: bp->b_link = biobufs; ! 45: biobufs = bp; ! 46: } ! 47: ! 48: int bwrerror; ! 49: ! 50: bwrite(p, cnt, bp) ! 51: register char *p; ! 52: register int cnt; ! 53: register struct biobuf *bp; ! 54: { ! 55: register int put; ! 56: register char *to; ! 57: ! 58: top: ! 59: if (cnt == 0) ! 60: return; ! 61: if (bp->b_nleft) { ! 62: put = bp->b_nleft; ! 63: if (put > cnt) ! 64: put = cnt; ! 65: bp->b_nleft -= put; ! 66: to = bp->b_ptr; ! 67: #ifdef lint ! 68: *to = *to; ! 69: #endif lint ! 70: asm("movc3 r8,(r11),(r7)"); ! 71: bp->b_ptr += put; ! 72: p += put; ! 73: cnt -= put; ! 74: goto top; ! 75: } ! 76: if (cnt >= BUFSIZ) { ! 77: if (bp->b_ptr != bp->b_buf) ! 78: bflush1(bp); ! 79: put = cnt - cnt % BUFSIZ; ! 80: if (boffset != bp->b_off) ! 81: (void)lseek(biofd, (long)bp->b_off, 0); ! 82: if (write(biofd, p, put) != put) { ! 83: bwrerror = 1; ! 84: error(1, "Output write error"); ! 85: } ! 86: bp->b_off += put; ! 87: boffset = bp->b_off; ! 88: p += put; ! 89: cnt -= put; ! 90: goto top; ! 91: } ! 92: bflush1(bp); ! 93: goto top; ! 94: } ! 95: ! 96: bflush() ! 97: { ! 98: register struct biobuf *bp; ! 99: ! 100: if (bwrerror) ! 101: return; ! 102: for (bp = biobufs; bp; bp = bp->b_link) ! 103: bflush1(bp); ! 104: } ! 105: ! 106: bflush1(bp) ! 107: register struct biobuf *bp; ! 108: { ! 109: register int cnt = bp->b_ptr - bp->b_buf; ! 110: ! 111: if (cnt == 0) ! 112: return; ! 113: if (boffset != bp->b_off) ! 114: (void)lseek(biofd, (long)bp->b_off, 0); ! 115: if (write(biofd, bp->b_buf, cnt) != cnt) { ! 116: bwrerror = 1; ! 117: error(1, "Output write error"); ! 118: } ! 119: bp->b_off += cnt; ! 120: boffset = bp->b_off; ! 121: bp->b_ptr = bp->b_buf; ! 122: bp->b_nleft = BUFSIZ; ! 123: } ! 124: ! 125: bflushc(bp, c) ! 126: register struct biobuf *bp; ! 127: char c; ! 128: { ! 129: bflush1(bp); ! 130: bputc(c, bp); ! 131: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.