#include "bc_string.h" #include "bc_io.h" #include /* $Id$ */ _readln() { register int c; while( (c=fgetc(_chanrd)) != EOF && c!= '\n') ; } readskip() { register int c; #ifdef DEBUG printf("readskip\n"); #endif while( (c=fgetc(_chanrd)) != EOF && c!= ',' && c!= '\n') ; } _readint(addr) int *addr; { int i; char buf[1024]; #ifdef DEBUG printf("read int from %d\n",_chann); #endif _asschn(); if( fscanf(_chanrd,"%d",&i) != 1) { if( ferror(_chanrd)) error(29); if( feof(_chanrd)) error(2); if( _chann == -1) { _asschn(); /* may be closed by now */ fgets(buf,1024,_chanrd); printf("?Redo "); _readint(addr); return; } error(40); }else { readskip(); *addr=i;} } _readflt(addr) double *addr; { double f; char buf[1024]; #ifdef DEBUG printf("read flt from %d\n",_chann); #endif _asschn(); if( fscanf(_chanrd,"%lf",&f) != 1) { if( ferror(_chanrd)) error(29); if( feof(_chanrd)) error(2); if( _chann == -1) { fgets(buf,1024,_chanrd); printf("?Redo "); _readflt(addr); return; } error(40); }else { readskip(); *addr=f;} } _readstr(s) String **s; { char buffer[1024]; register int kar ; char *c; #ifdef DEBUG printf("read str from %d\n",_chann); #endif _asschn(); c= buffer; kar= fgetc(_chanrd); while(isspace(kar) && kar!= EOF) kar= fgetc(_chanrd); *c=kar ; if( kar== '"') { /* read quoted string */ #ifdef DEBUG printf("qouted string\n"); #endif while ( (kar= fgetc(_chanrd)) != EOF && kar!='"' ) *c++ = kar ; ungetc(kar,_chanrd); *c=0; }else if( isalpha(*c)) { /* read normal string */ c++; #ifdef DEBUG printf("non-qouted string\n"); #endif while( (kar= fgetc(_chanrd)) != ',' && kar!= EOF && !isspace(kar) && kar!='\n') *c++= kar ; ungetc(kar,_chanrd); *c=0; }else{ if( ferror(_chanrd)) error(29); if( feof(_chanrd)) error(2); if( _chann == -1) { fgets(buffer,1024,_chanrd); printf("?Redo "); _rdline(s); return; } error(40); } #ifdef DEBUG printf("string read: %s\n",buffer); #endif readskip(); /* save value read */ _decstr(*s); *s= (String *) _newstr(buffer); } extern int _seektab[]; _restore(line) int line; { int nr; char buffer[1024]; #ifdef DEBUG printf("seek to %d",line); #endif fseek(_chanrd,0l,0); if( line) { /* search number of lines to skip */ for(nr=0; _seektab[nr] && _seektab[nr]< line; nr+=2) #ifdef DEBUG printf("test %d %d\n",_seektab[nr], _seektab[nr+1]); #endif ; nr /= 2; #ifdef DEBUG printf(" %d lines to skip\n",nr); #endif while(nr-- >0 ) fgets(buffer,1024,_chanrd); } } _rdline(s) String **s; { char buffer[1024]; if( fgets(buffer,1024,_chanrd) == 0) { if( _chann == -1) { printf("?Redo "); _rdline(s); return; } error(40); } _decstr(*s); *s= (String *) _newstr(buffer); }