#include "stdio.h" #include "ctype.h" #include "tib.h" #define pos(x) fseek(stream,x,0) long int nextrecord(), recsize(), nextline(); /* getword(stream,p,ignore): read next sequence of nonspaces on current line into *p. null if no more words on current line. %x (x in ignore) terminates line. all words of the form %a are returned as null. *p is a null terminated string (char p[MAXSTR]). */ getword(stream,p,ignore) FILE *stream; char *p, *ignore; { char c; char *oldp, *stop; oldp= p; stop= p+MAXSTR-1; do{ c= getc(stream); } while (isspace(c) && c!='\n'); while (!isspace(c)) { *p= c; if (p < stop) p++; c= getc(stream); } *p= NULL; if (oldp[0]=='%') { oldp[0]= NULL; if (index(ignore, oldp[1]) != NULL) while (c!='\n') c=getc(stream); } } /* recsize(stream,start): returns length of record beginning at start (record ends at blank line or eof) assumes and retains stream positioned at start */ long int recsize(stream,start) FILE *stream; long int start; { char c; /* length = # of chars from start to beginning */ long int length; /* of current line. c in current line. */ int nonspaces; /* nonspaces = # of nonspaces in current line. */ nonspaces= 0; c= getc(stream); length= 0L; while ( (c!='\n' || nonspaces!=0) && c!=EOF) { if (c=='\n') { length= ftell(stream)-start; nonspaces= 0; } else if (!isspace(c)) nonspaces++; c= getc(stream); } pos(start); return(length); } /* nextrecord(stream,x): seeks in stream for first non-blank line at or after char x in stream. seeks to eof if x is past last record. x is the index of a character in the file (not eof). returns position in stream. (returns EOF, if seeks to EOF) */ long int nextrecord(stream,x) FILE *stream; long int x; { long int start; /* position of the beginning of the line */ char c; /* containing c */ pos(x); start= x; /* find start of first non-blank record */ for(;;) { c= getc(stream); if (c=='\n') start= ftell(stream); else if (!isspace(c)) break; } if (feof(stream)) { pos(start); start= EOF; } else pos(start); return(start); } /* nextline(stream,x): seeks in stream after first newline at or after char x in stream. seeks to eof if x is in last line. x is the index of a character in the file (not eof). returns position in stream */ long int nextline(stream,x) FILE *stream; long int x; { char c; pos(x); do { c = getc(stream); } while ((c != '\n') && (c != EOF)) ; return(ftell(stream)); } /* printline(stream): copies stream up to a newline */ printline(stream) FILE *stream; { char c; while ((c=getc(stream)) != '\n' && c!=EOF) putchar(c); putchar('\n'); } /* getline(stream,p): store in *p next chars in stream up to \n advance stream past \n. limit of MAXSTR-1 chars may be stored at p. */ getline(stream,p) FILE *stream; char *p; { char *stop; stop= p+MAXSTR-1; while ( (*p= getc(stream)) != '\n' && *p!=EOF) if (p