Bell 32V release
[unix-history] / usr / src / cmd / sdb / fio.c
CommitLineData
9fffe423
TL
1#include "head.h"
2
3finit(name)
4char *name; {
5 register char *p, *q;
6
7 if (fiobuf.fd) close(fiobuf.fd);
8 q = name;
9 for (p=fp; *q; *p++ = *q++) ;
10 *p = 0;
11 if ((fiobuf.fd = open(filework,0)) == -1) {
12 perror(filework);
13 return;
14 }
15 binit(&fiobuf);
16 cpstr(curfile, name);
17 for (p=fbuf;;p++) {
18 if (bread(&fiobuf,p,1) <= 0) {
19 printf("%s - No lines in file\n", name);
20 return;
21 }
22 if (*p == '\n') break;
23 }
24 fline = 1;
25 maxfline = 0;
26}
27
28fnext() {
29 register char *p;
30
31 for(p=fbuf;;p++) {
32 if (bread(&fiobuf,p,1) <= 0) {
33 p--;
34 blseek(&fiobuf,0L,0);
35 fline = 0;
36 continue;
37 }
38 if (*p == '\n') break;
39 }
40 fline++;
41}
42
43
44fprev() {
45 char c;
46 register int i;
47
48 for(i=0; i<3; i++) {
49 for (;;) {
50 if (bread(&fiobuf, &c+1, -1) <= 0) {
51 if (maxfline) blseek(&fiobuf,0L,2);
52 else {
53 blseek(&fiobuf,0L,0);
54 for(;;) {
55 if (bread(&fiobuf,&c,1)<=0) break;
56 if (c == '\n') maxfline++;
57 }
58 }
59 }
60 if (c == '\n') break;
61 }
62 }
63 bread(&fiobuf, &c, 1); /* eat the '\n' */
64
65 fline -= 2;
66 if (fline < 0) fline = maxfline - 1;
67
68 fnext();
69}
70
71
72fprint() {
73 register char *p;
74
75 printf("%d: ", fline);
76 p = fbuf;
77 while(putchar(*p++) != '\n')
78 ;
79}
80
81ffind(num)
82register int num; {
83 register int i, ofline;
84
85 ofline = fline;
86 if (num>fline)
87 for (i=fline; i<num; i++) {
88 fnext();
89 if (fline == 1) goto bad;
90 }
91 if (num<fline)
92 for (i=num; i<ofline; i++) {
93 fprev();
94 }
95
96 if (maxfline & num>maxfline) goto bad;
97
98 return;
99
100bad: error("Not that many lines in file");
101 ffind(ofline);
102}
103
104fback(n) {
105 int i;
106
107 for (i=0; i<n; i++) {
108 if (fline == 1) return(i);
109 fprev();
110 }
111 return(i);
112}
113
114fforward(n) {
115 int i;
116
117 for (i=0; i<n; i++) {
118 fnext();
119 if (fline == 1) {
120 fprev();
121 return(i);
122 }
123 }
124 return(i);
125}
126
127fprintn(n) {
128 int i;
129
130 for (i=0; i<n; i++) {
131 fprint();
132 fnext();
133 if (fline == 1) break;
134 }
135 fprev();
136 return(i);
137}