Fixing vgrind formatting glitches
[unix-history] / usr / src / old / as.vax / asio.c
CommitLineData
8ad3c13d
BJ
1/* Coypright (c) 1980 Regents of the University of California */
2static char sccsid[] = "@(#)asio.c 4.1 %G%";
3#include <stdio.h>
4#include <sys/types.h>
5#include "as.h"
6/*
7 * Block I/O routines for logical I/O concurrently in
8 * more than one place in the same file.
9 */
10int biofd; /* file descriptor for block I/O file */
11off_t boffset; /* physical position in logical file */
12BFILE *biobufs; /* the block I/O buffers */
13
14#define error(severity, message) \
15 {yyerror(message); if (severity) delexit();}
16
17Flushfield(n)
18 register int n;
19{
20 while (n>0) {
21 outb(bitfield);
22 bitfield >>= 8;
23 n -= 8;
24 }
25 bitoff=0;
26 bitfield=0;
27}
28
29#ifdef ASFWRITE
30/*
31 * This is our version of fwrite...
32 * Hacked out fast version of fwrite that
33 * doesn't iterate over each and every character;
34 * We poke directly into the buffer area, and move things
35 * with a movc3.
36 */
37fwrite(p, n, m, f)
38 register char *p;
39 int n, m;
40 register FILE *f;
41{
42 register int cnt = n * m;
43 register int put;
44 register char *to;
45
46top:
47 if (cnt == 0)
48 return;
49 if (f->_cnt) {
50 put = f->_cnt;
51 if (put > cnt)
52 put = cnt;
53 f->_cnt -= put;
54 to = f->_ptr;
55 asm("movc3 r8,(r11),(r7)");
56 f->_ptr += put;
57 p += put;
58 cnt -= put;
59 goto top;
60 }
61 if (cnt >= BUFSIZ) {
62 fflush(f);
63 put = cnt - cnt % BUFSIZ;
64 if (write(f->_file, p, put) != put)
65 error(1, "Output write error in fwrite");
66 p += put;
67 cnt -= put;
68 goto top;
69 }
70 _flsbuf(*p++, f);
71 --cnt;
72 goto top;
73}
74
75/*
76 * This has been stolen from the usual place...
77 * It is put here so that the loader doesn't complain
78 * about multiple definitions in the archived object module.
79 *
80 * archived in: /lib/libc.a
81 * object module from: /usr/src/libc/stdio/rdwr.c
82 */
83fread(ptr, size, count, iop)
84 unsigned size, count;
85 register char *ptr;
86 register FILE *iop;
87{
88 register c;
89 unsigned ndone, s;
90
91 ndone = 0;
92 if (size)
93 for (; ndone<count; ndone++) {
94 s = size;
95 do {
96 if ((c = getc(iop)) >= 0)
97 *ptr++ = c;
98 else
99 return(ndone);
100 } while (--s);
101 }
102 return(ndone);
103}
104#endif ASFWRITE
105
106bopen(bp, off)
107 struct biobuf *bp;
108 off_t off;
109{
110
111 bp->b_ptr = bp->b_buf;
112 bp->b_nleft = BUFSIZ - off % BUFSIZ;
113 bp->b_off = off;
114 bp->b_link = biobufs;
115 biobufs = bp;
116}
117
118int bwrerror;
119
120bwrite(p, cnt, bp)
121 register char *p;
122 register int cnt;
123 register struct biobuf *bp;
124{
125 register int put;
126 register char *to;
127
128top:
129 if (cnt == 0)
130 return;
131 if (bp->b_nleft) {
132 put = bp->b_nleft;
133 if (put > cnt)
134 put = cnt;
135 bp->b_nleft -= put;
136 to = bp->b_ptr;
137 asm("movc3 r8,(r11),(r7)");
138 bp->b_ptr += put;
139 p += put;
140 cnt -= put;
141 goto top;
142 }
143 if (cnt >= BUFSIZ) {
144 if (bp->b_ptr != bp->b_buf)
145 bflush1(bp);
146 put = cnt - cnt % BUFSIZ;
147 if (boffset != bp->b_off)
148 lseek(biofd, bp->b_off, 0);
149 if (write(biofd, p, put) != put) {
150 bwrerror = 1;
151 error(1, "Output write error");
152 }
153 bp->b_off += put;
154 boffset = bp->b_off;
155 p += put;
156 cnt -= put;
157 goto top;
158 }
159 bflush1(bp);
160 goto top;
161}
162
163bflush()
164{
165 register struct biobuf *bp;
166
167 if (bwrerror)
168 return;
169 for (bp = biobufs; bp; bp = bp->b_link)
170 bflush1(bp);
171}
172
173bflush1(bp)
174 register struct biobuf *bp;
175{
176 register int cnt = bp->b_ptr - bp->b_buf;
177
178 if (cnt == 0)
179 return;
180 if (boffset != bp->b_off)
181 lseek(biofd, bp->b_off, 0);
182 if (write(biofd, bp->b_buf, cnt) != cnt) {
183 bwrerror = 1;
184 error(1, "Output write error");
185 }
186 bp->b_off += cnt;
187 boffset = bp->b_off;
188 bp->b_ptr = bp->b_buf;
189 bp->b_nleft = BUFSIZ;
190}
191
192bflushc(bp, c)
193 register struct biobuf *bp;
194 char c;
195{
196
197 bflush1(bp);
198 bputc(c, bp);
199}