175 lines
2.8 KiB
C
175 lines
2.8 KiB
C
#include "bc_string.h"
|
|
#include "bc_io.h"
|
|
#include <ctype.h>
|
|
|
|
/* $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);
|
|
}
|