|
|
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: static char hexdigit [] =
18: "0123456789abcdef";
19:
20: #define error(severity, message) \
21: {yyerror(message); if (severity) delexit();}
22:
23: Flushfield(n)
24: register int n;
25: {
26: while (n>0) {
27: n -= 8;
28: outb((bitfield >> n) & 0xFF);
29: if (liston && (passno == 2))
30: byte_out((bitfield >> n) & 0xFF);
31: }
32: bitoff=0;
33: bitfield=0;
34: }
35:
36: /*
37: * Block I/O Routines
38: */
39: bopen(bp, off)
40: struct biobuf *bp;
41: off_t off;
42: {
43:
44: bp->b_ptr = bp->b_buf;
45: bp->b_nleft = BUFSIZ - off % BUFSIZ;
46: bp->b_off = off;
47: bp->b_link = biobufs;
48: biobufs = bp;
49: }
50:
51: int bwrerror;
52:
53: bwrite(p, cnt, bp)
54: register char *p;
55: register int cnt;
56: register struct biobuf *bp;
57: {
58: register int put;
59: register char *to;
60:
61: top:
62: if (cnt == 0)
63: return;
64: if (bp->b_nleft) {
65: put = bp->b_nleft;
66: if (put > cnt)
67: put = cnt;
68: bp->b_nleft -= put;
69: to = bp->b_ptr;
70: #ifdef lint
71: *to = *to;
72: #endif lint
73: movblk (p, to, put);
74: bp->b_ptr += put;
75: p += put;
76: cnt -= put;
77: goto top;
78: }
79: if (cnt >= BUFSIZ) {
80: if (bp->b_ptr != bp->b_buf)
81: bflush1(bp);
82: put = cnt - cnt % BUFSIZ;
83: if (boffset != bp->b_off)
84: (void)lseek(biofd, (long)bp->b_off, 0);
85: if (write(biofd, p, put) != put) {
86: bwrerror = 1;
87: error(1, "Output write error");
88: }
89: bp->b_off += put;
90: boffset = bp->b_off;
91: p += put;
92: cnt -= put;
93: goto top;
94: }
95: bflush1(bp);
96: goto top;
97: }
98:
99: bflush()
100: {
101: register struct biobuf *bp;
102:
103: if (bwrerror)
104: return;
105: for (bp = biobufs; bp; bp = bp->b_link)
106: bflush1(bp);
107: }
108:
109: bflush1(bp)
110: register struct biobuf *bp;
111: {
112: register int cnt = bp->b_ptr - bp->b_buf;
113:
114: if (cnt == 0)
115: return;
116: if (boffset != bp->b_off)
117: (void)lseek(biofd, (long)bp->b_off, 0);
118: if (write(biofd, bp->b_buf, cnt) != cnt) {
119: bwrerror = 1;
120: error(1, "Output write error");
121: }
122: bp->b_off += cnt;
123: boffset = bp->b_off;
124: bp->b_ptr = bp->b_buf;
125: bp->b_nleft = BUFSIZ;
126: }
127:
128: bflushc(bp, c)
129: register struct biobuf *bp;
130: char c;
131: {
132: bflush1(bp);
133: bputc(c, bp);
134: }
135:
136: movblk (src, dest, cnt)
137: char *src, *dest;
138:
139: {
140: while (cnt--)
141: *dest++ = *src++;
142: }
143:
144: byte_out (byte)
145: u_char byte;
146: {
147: *layoutpos++ = hexdigit [(byte >> 4) & 0xf];
148: *layoutpos++ = hexdigit [byte & 0xf];
149: }
150:
151: word_out (word)
152: u_short (word);
153: {
154: union
155: {
156: u_short _word;
157: char _ch[2];
158: } charr;
159:
160: charr._word = word;
161: byte_out (charr._ch[0]);
162: byte_out (charr._ch[1]);
163: }
164:
165: long_out (longword)
166: u_int longword;
167: {
168: union
169: {
170: u_int _int;
171: char _ch[4];
172: } charr;
173:
174: charr._int = longword;
175: byte_out (charr._ch[0]);
176: byte_out (charr._ch[1]);
177: byte_out (charr._ch[2]);
178: byte_out (charr._ch[3]);
179: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.