xref: /original-bsd/old/as.vax/asio.c (revision d25e1985)
1 /* Coypright (c) 1980 Regents of the University of California */
2 static	char sccsid[] = "@(#)asio.c 4.3 08/16/80";
3 #include <stdio.h>
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  */
9 int	biofd;			/* file descriptor for block I/O file */
10 off_t	boffset;		/* physical position in logical file */
11 BFILE	*biobufs;		/* the block I/O buffers */
12 
13 #define	error(severity, message) \
14 	{yyerror(message); if (severity) delexit();}
15 
16 Flushfield(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 
28 /*
29  *	Block I/O Routines
30  */
31 bopen(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 
43 int	bwrerror;
44 
45 bwrite(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 
53 top:
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 
88 bflush()
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 
98 bflush1(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 
117 bflushc(bp, c)
118 	register struct biobuf *bp;
119 	char	c;
120 {
121 
122 	bflush1(bp);
123 	bputc(c, bp);
124 }
125