|
|
1.1 root 1: # include "stdio.h"
2: # include "streams.h"
3: # include "ctype.h"
4:
5: char *strncpy();
6: void exit();
7:
8: #define IWORD 20
9: #define IMAX 5
10: char igntab[IWORD][IMAX];
11: int igcnt;
12:
13: /* getword(stream,p):
14: read next sequence of alpha-numberic on current line into *p.
15: null if no more words on current line.
16: *p is a null terminated string (char p[maxstr]).
17: */
18: getword(stream,p)
19: FILE *stream;
20: char *p;
21: {
22: char c;
23: char *oldp, *stop;
24: register int i;
25: static ignored = 0;
26:
27: oldp= p;
28: stop= p+maxstr-1;
29: do {
30: c= getc(stream);
31: if(c == EOF) {
32: *p = NULL;
33: return;
34: }
35: } while (!isalnum(c) && c!='%');
36:
37: do {
38: *p= c;
39: if (p < stop) p++;
40: c= getc(stream);
41: } while(isalnum(c));
42: *p= NULL;
43: if (oldp[0]=='%') {
44: oldp[0]= NULL;
45: ignored = 0;
46: for(i=0;i<igcnt;i++) {
47: if(strncmp(&igntab[i][0],&oldp[1],IMAX-1)== 0) {
48: ignored = 1;
49: while(c != '\n' && c != EOF) c=getc(stream);
50: break;
51: }
52: }
53: }
54: else if (ignored) {
55: oldp[0] = NULL;
56: while(c != '\n' && c != EOF) c=getc(stream);
57: }
58: }
59:
60:
61:
62: /* recsize(stream,start):
63: returns length of record beginning at start
64: (record ends at blank line or eof)
65: assumes and retains stream positioned at start
66: */
67: long int recsize(stream,start)
68: FILE *stream;
69: long int start;
70: {
71: char line[256];
72: long int length;
73:
74: while(fgets(line,256,stream)) {
75: if(line[0] == '\n') {
76: length = ftell(stream)-start-1;
77: pos(start);
78: return(length);
79: }
80: }
81: length = ftell(stream)-start;
82: pos(start);
83: return(length);
84: }
85:
86: /* nextrecord(stream,x): seeks in stream for first non-blank line
87: at or after char x in stream. seeks to eof if x is past last record.
88: x is the index of a character in the file (not eof).
89: returns position in stream. (returns EOF, if seeks to EOF)
90: */
91: long int nextrecord(stream,x)
92: FILE *stream;
93: long int x;
94: {
95: long int start; /* position of the beginning of the line */
96: char c; /* containing c */
97:
98: pos(x);
99: start= x;
100: /* find start of first non-blank record */
101: for(;;){
102: c= getc(stream);
103: if (c=='\n') start= ftell(stream);
104: else if (!isspace(c)) break;
105: }
106:
107: if (feof(stream)) {
108: pos(start);
109: start= EOF;
110: }
111: else pos(start);
112: return(start);
113: }
114:
115: /* nextline(stream,x): seeks in stream after first newline at or after
116: char x in stream. seeks to eof if x is in last line.
117: x is the index of a character in the file (not eof).
118: returns position in stream
119: */
120: long int nextline(stream,x)
121: FILE *stream;
122: long int x;
123: {
124: pos(x);
125: while (getc(stream)!='\n') ;
126: return(ftell(stream));
127: }
128:
129:
130: /* printline(stream): copies stream up to a newline
131: */
132: printline(stream)
133: FILE *stream;
134: {
135: int c;
136: while ((c=getc(stream)) != '\n' && c!=EOF) putchar(c);
137: putchar('\n');
138: }
139:
140: /* getline(stream,p): store in *p next chars in stream up to \n
141: advance stream past \n.
142: limit of maxstr-1 chars may be stored at p.
143: */
144: getline(stream,p)
145: FILE *stream;
146: char *p;
147: {
148: char *stop;
149: int ci;
150:
151: stop= p+maxstr-1;
152: while (((ci= getc(stream)) != '\n') && (ci!=EOF)) {
153: if (ci == EOF)
154: break;
155: *p = ci;
156: if (p<stop) p++;
157: }
158: *p= NULL;
159: }
160:
161:
162: #define MAXL 512
163: #define MIN(a,b) (a<b?a:b)
164: load_ign(istring)
165: char *istring;
166: {
167: FILE *fig;
168: char line[MAXL];
169:
170: if((fig = fopen(istring,"r")) == NULL) {
171: fprintf(stderr,"invert: error reading %s\n",istring);
172: return(-1);
173: }
174: igcnt=0;
175: while(fgets(line,MAXL,fig)) {
176: if(igcnt == IWORD) {
177: fprintf(stderr,
178: "load_ign: warning:too many words in ignore file\n");
179: return(igcnt);
180: }
181: strncpy(&igntab[igcnt++][0],line+1,MIN(strlen(line+1)-1,IMAX-1));
182: }
183: return(igcnt);
184: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.