Commit | Line | Data |
---|---|---|
9fffe423 TL |
1 | #include "head.h" |
2 | ||
3 | finit(name) | |
4 | char *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 | ||
28 | fnext() { | |
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 | ||
44 | fprev() { | |
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 | ||
72 | fprint() { | |
73 | register char *p; | |
74 | ||
75 | printf("%d: ", fline); | |
76 | p = fbuf; | |
77 | while(putchar(*p++) != '\n') | |
78 | ; | |
79 | } | |
80 | ||
81 | ffind(num) | |
82 | register 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 | ||
100 | bad: error("Not that many lines in file"); | |
101 | ffind(ofline); | |
102 | } | |
103 | ||
104 | fback(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 | ||
114 | fforward(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 | ||
127 | fprintn(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 | } |