|
|
1.1 root 1: /*% cc -c -O %
2: */
3: #include "vars.h"
4: #define BLKSIZE 512
5: #ifdef BIGTMP
6: #define MAXBLOCKS 4095
7: #else
8: #define MAXBLOCKS 255
9: #endif
10: #define BLMASK MAXBLOCKS
11: char ibuff[512];
12: int iblock = -1;
13: int oblock = 0;
14: char obuff[512];
15: int ooff; /* offset of next byte in obuff */
16: initio()
17: {
18: lock++;
19: iblock = -1;
20: oblock = 0;
21: ooff = 0;
22: unlock();
23: }
24: char *getline(tl, lbuf)
25: int tl;
26: char *lbuf;
27: {
28: register char *bp, *lp;
29: register int nl;
30: extern int read();
31:
32: lp = lbuf;
33: nl = -((tl<<1) & 0774);
34: tl = (tl>>8) & BLMASK;
35: do {
36: if (nl<=0) {
37: if (tl==oblock)
38: bp = obuff;
39: else {
40: bp = ibuff;
41: if (tl!=iblock) {
42: iblock = -1; /* signal protection */
43: blkio(tl, bp, read);
44: iblock = tl;
45: }
46: }
47: tl++;
48: bp -= nl;
49: nl += BLKSIZE;
50: }
51: nl--;
52: } while (*lp++ = *bp++);
53: return(lbuf);
54: }
55: int putline()
56: {
57: register char *op, *lp;
58: register int r;
59: extern int write();
60:
61: modified();
62: lp = linebuf;
63: r = (oblock<<8) + (ooff>>1); /* ooff may be 512! */
64: op = obuff + ooff;
65: lock++;
66: do {
67: if (op >= obuff+BLKSIZE) {
68: /* delay updating oblock until after blkio succeeds */
69: blkio(oblock, op=obuff, write);
70: oblock++;
71: ooff = 0;
72: }
73: if((*op = *lp++) == '\n') {
74: *op++ = '\0';
75: linebp = lp;
76: break;
77: }
78: } while (*op++);
79: ooff = (((op-obuff)+3)&~3);
80: unlock();
81: return (r);
82: }
83: blkio(b, buf, iofcn)
84: char *buf;
85: int (*iofcn)();
86: {
87: if (b>=MAXBLOCKS
88: || (lseek(tfile, ((long) b) * 512L, 0)<0L)
89: || (*iofcn)(tfile, buf, 512) != 512) {
90: error('T');
91: }
92: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.