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