Annotation of 43BSD/bin/as/asio.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.