|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)streams.c 2.4 3/5/87";
3: #endif not lint
4: #
5:
6: # include "stdio.h"
7: # include "streams.h"
8: # include "ctype.h"
9:
10: /* getword(stream,p,ignore):
11: read next sequence of nonspaces on current line into *p.
12: null if no more words on current line.
13: %x (x in ignore) terminates line and any following non-blank lines that
14: don't begin with '%'
15: all words of the form %a are returned as null.
16: *p is a null terminated string (char p[maxstr]).
17: */
18: getword(stream,p,ignore)
19: FILE *stream;
20: char *p, *ignore;
21: { char c;
22: char *oldp, *stop;
23: long save;
24:
25: oldp= p;
26: stop= p+maxstr-1;
27: do{ c= getc(stream);
28: } while (isspace(c) && c!='\n');
29:
30: while (!isspace(c))
31: { *p= c;
32: if (p < stop) p++;
33: c= getc(stream);
34: }
35: *p= NULL;
36:
37: if (oldp[0]=='%')
38: { oldp[0]= NULL;
39: if (index(ignore, oldp[1]) != NULL)
40: { do{ while (c!='\n') c=getc(stream);
41: save= ftell(stream);
42: c= getc(stream);
43: } while (c!= EOF && !isspace(c) && c!='%');
44: pos(save);
45: }
46: }
47: }
48:
49:
50:
51: /* recsize(stream,start):
52: returns length of record beginning at start
53: (record ends at blank line or eof)
54: assumes and retains stream positioned at start
55: */
56: long int recsize(stream,start)
57: FILE *stream;
58: long int start;
59: { char c; /* length = # of chars from start to beginning */
60: long int length; /* of current line. c in current line. */
61: int nonspaces; /* nonspaces = # of nonspaces in current line. */
62:
63: nonspaces= 0;
64: c= getc(stream);
65: length= 0L;
66:
67: while ( (c!='\n' || nonspaces!=0) && c!=EOF)
68: { if (c=='\n')
69: { length= ftell(stream)-start;
70: nonspaces= 0;
71: }
72: else if (!isspace(c)) nonspaces++;
73:
74: c= getc(stream);
75: }
76:
77: pos(start);
78: return(length);
79: }
80:
81:
82: /* nextrecord(stream,x): seeks in stream for first non-blank line
83: at or after char x in stream. seeks to eof if x is past last record.
84: x is the index of a character in the file (not eof).
85: returns position in stream. (returns EOF, if seeks to EOF)
86: */
87: long int nextrecord(stream,x)
88: FILE *stream;
89: long int x;
90: { long int start; /* position of the beginning of the line */
91: char c; /* containing c */
92:
93: pos(x);
94: start= x;
95: /* find start of first non-blank record */
96: c= getc(stream);
97: for(;;)
98: { if (c=='\n') {start= ftell(stream); c= getc(stream);}
99: else if (c=='#') while (c!='\n') c=getc(stream);
100: else if (!isspace(c)) break;
101: else c= getc(stream);
102: }
103:
104: if (feof(stream)) { pos(start); start= EOF; }
105: else pos(start);
106: return(start);
107: }
108:
109: /* nextline(stream,x): seeks in stream after first newline at or after
110: char x in stream. seeks to eof if x is in last line.
111: x is the index of a character in the file (not eof).
112: returns position in stream
113: */
114: long int nextline(stream,x)
115: FILE *stream;
116: long int x;
117: { pos(x);
118: while (getc(stream)!='\n') ;
119: return(ftell(stream));
120: }
121:
122:
123: /* printline(stream): copies stream up to a newline
124: */
125: printline(stream)
126: FILE *stream;
127: { char c;
128: while ((c=getc(stream)) != '\n' && c!=EOF) putchar(c);
129: putchar('\n');
130: }
131:
132: /* getline(stream,p): store in *p next chars in stream up to \n
133: advance stream past \n.
134: limit of maxstr-1 chars may be stored at p.
135: */
136: getline(stream,p)
137: FILE *stream;
138: char *p;
139: { char *stop;
140: stop= p+maxstr-1;
141: while ( (*p= getc(stream)) != '\n' && *p!=EOF)
142: if (p<stop) p++;
143: *p= NULL;
144: }
145:
146: /* replace string old at the head of subj by new */
147: strreplace(subj, old, new)
148: char *subj, *old, *new;
149: {
150: char buf[128];
151: int lg;
152: strcpy(buf, &subj[strlen(old)]);
153: strcpy(subj, new);
154: strcat(subj, buf);
155: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.