#include <stdio.h>
#include "defs.h"
#if defined (WIN32)
# include <compat/compat.h>
#else
# include <dirent.h>
#endif
//#include "compat/compat.h"
#include "str.h"
#include "files.h"
int line_number;
void xungetc(int c, FILE *fp);
int xgetc(FILE *fp);
const char *fread_string(FILE *fp)
{
char buf[MAX_STRING_LENGTH];
char *plast;
int c;
plast = buf;
/*
* Skip blanks.
* Read first char.
*/
do
c = xgetc(fp);
while (isspace(c));
for (;;) {
/*
* Back off the char type lookup,
* it was too dirty for portability.
* -- Furey
*/
if (plast - buf >= sizeof(buf) - 1) {
printf("fread_string: line too long (truncated)", 0);
buf[sizeof(buf)-1] = '\0';
return str_dup(buf);
}
switch (c) {
default:
*plast++ = c;
break;
case EOF:
printf("fread_string:EOF");
return str_empty;
case '\r':
break;
case '~':
if ((c = xgetc(fp)) == '~') {
*plast++ = c;
break;
}
xungetc(c, fp);
*plast = '\0';
return str_dup(buf);
}
c = xgetc(fp);
}
}
char * fread_word (FILE * fp)
{
static char word [MAX_INPUT_LENGTH] ;
char * pword ;
char cEnd ;
do cEnd = xgetc(fp) ;
while (cEnd && isspace(cEnd)) ;
if (cEnd == EOF) return NULL ;
if (cEnd == '\'' || cEnd == '"')
pword = word ;
else
{
word[0] = cEnd ;
pword = word + 1 ;
cEnd = ' ' ;
}
for (; pword < word + MAX_INPUT_LENGTH ; pword++)
{
*pword = xgetc (fp) ;
if (*pword == EOF)
{
*pword = '\0' ;
return word ;
}
if ((cEnd == ' ') ? isspace(*pword) : (*pword == cEnd))
{
if (cEnd == ' ') xungetc (*pword, fp) ;
*pword = '\0' ;
return word ;
}
}
printf ("fread_word: word too long") ;
return NULL ;
}
char fread_letter(FILE *fp)
{
char c ;
do c = xgetc(fp) ;
while (c != EOF && isspace(c)) ;
return c ;
}
void fread_to_eol (FILE * fp)
{
char c ;
do c = xgetc(fp) ;
while (c != EOF && c != '\n' && c != '\r') ;
if (c == EOF) return ;
do c = xgetc(fp) ;
while (c == '\n' || c == '\r') ;
if (c == EOF) return ;
xungetc(c, fp) ;
return ;
}
int xgetc(FILE *fp)
{
int c = getc(fp);
if (c == '\n')
line_number++;
return c;
}
void xungetc(int c, FILE *fp)
{
if (c == '\n')
line_number--;
ungetc(c, fp);
}
int fread_number(FILE *fp)
{
int number;
bool sign;
char c;
do
c = xgetc(fp);
while (isspace(c));
number = 0;
sign = FALSE;
if (c == '+')
c = xgetc(fp);
else if (c == '-') {
sign = TRUE;
c = xgetc(fp);
}
if (!isdigit(c)) {
printf("fread_number: bad format");
exit(1);
}
while (isdigit(c)) {
number = number * 10 + c - '0';
c = xgetc(fp);
}
if (sign)
number = 0 - number;
if (c == '|')
number += fread_number(fp);
else if (c != ' ')
xungetc(c, fp);
return number;
}