|
|
1.1 root 1: #include "head.h"
2:
3: /*
4: * These procedures manage the source files examined by sdb.
5: */
6:
7: /* Change the current source file to `name'. */
8: finit(name)
9: char *name; {
10: register char *p, *q;
11:
12: if (fiobuf.fd) close(fiobuf.fd);
13: q = name;
14: for (p=fp; *q; *p++ = *q++) ;
15: *p = 0;
16: if ((fiobuf.fd = open(filework,0)) == -1) {
17: nolines = 1;
18: perror(filework);
19: return;
20: }
21: binit(&fiobuf);
22: cpstr(curfile, name);
23: for (p=fbuf;;p++) {
24: if (bread(&fiobuf,p,1) <= 0) {
25: nolines = 1;
26: printf("%s: No lines in file\n", name);
27: return;
28: }
29: if (*p == '\n') break;
30: }
31: fline = 1;
32: maxfline = 0;
33: nolines = 0;
34: }
35:
36: /* Make the next line current. */
37: fnext() {
38: register char *p;
39:
40: if (nolines){
41: return;
42: }
43: for(p=fbuf;;p++) {
44: if (bread(&fiobuf,p,1) <= 0) {
45: p--;
46: blseek(&fiobuf,0L,0);
47: fline = 0;
48: continue;
49: }
50: if (*p == '\n') break;
51: }
52: fline++;
53: }
54:
55:
56: /* Make the previous line current. */
57: fprev() {
58: char c;
59: register int i;
60:
61: if (nolines){
62: return;
63: }
64: for(i=0; i<3; i++) {
65: for (;;) {
66: if (bread(&fiobuf, &c+1, -1) <= 0) {
67: if (maxfline) blseek(&fiobuf,0L,2);
68: else {
69: blseek(&fiobuf,0L,0);
70: for(;;) {
71: if (bread(&fiobuf,&c,1)<=0)
72: break;
73: if (c == '\n') maxfline++;
74: }
75: }
76: }
77: if (c == '\n') break;
78: }
79: }
80: bread(&fiobuf, &c, 1); /* eat the '\n' */
81:
82: fline -= 2;
83: if (fline < 0) fline = maxfline - 1;
84:
85: fnext();
86: }
87:
88:
89: /* Print the current line. */
90: fprint() {
91: register char *p;
92:
93: if (nolines){
94: error("No lines in file");
95: return;
96: }
97: printf("%d: ", fline);
98: p = fbuf;
99: while(putchar(*p++) != '\n')
100: ;
101: }
102:
103: /* Make line `num' current. */
104: ffind(num)
105: register int num; {
106: register int i, ofline;
107:
108: if (nolines){
109: return;
110: }
111: ofline = fline;
112: if (num>fline)
113: for (i=fline; i<num; i++) {
114: fnext();
115: if (fline == 1) goto bad;
116: }
117: if (num<fline)
118: for (i=num; i<ofline; i++) {
119: fprev();
120: }
121:
122: if (maxfline & num>maxfline) goto bad;
123:
124: return;
125:
126: bad: error("Not that many lines in file");
127: ffind(ofline);
128: }
129:
130: /* Go back n lines. */
131: fback(n) {
132: int i;
133:
134: if (nolines){
135: return(0);
136: }
137: for (i=0; i<n; i++) {
138: if (fline == 1) return(i);
139: fprev();
140: }
141: return(i);
142: }
143:
144: /* Go forwards n lines. */
145: fforward(n) {
146: int i;
147:
148: if (nolines){
149: return(0);
150: }
151: for (i=0; i<n; i++) {
152: fnext();
153: if (fline == 1) {
154: fprev();
155: return(i);
156: }
157: }
158: return(i);
159: }
160:
161: /* Print n lines. */
162: fprintn(n) {
163: int i;
164:
165: if (nolines){
166: error("No lines in file");
167: return(0);
168: }
169: for (i=0; i<n; i++) {
170: fprint();
171: fnext();
172: if (fline == 1) break;
173: }
174: fprev();
175: return(i);
176: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.