/*
scan.c for illgol.c
*/
FILE * scanfile;
char token[256];
void scan_trace(char * s)
{
/* fprintf(stderr, "%s: %s\n", s, token); */
}
void scan(void)
{
char x;
int i = 0;
RESTART_SCAN: /* a regrettable label */
if (feof(scanfile)) { token[0] = 0; return; }
x = (char)getc(scanfile);
if (feof(scanfile)) { token[0] = 0; return; }
while (x <= ' ')
{
x = (char)getc(scanfile);
if (feof(scanfile)) { token[0] = 0; return; }
}
if ((x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z'))
{
while ((x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z') ||
(x >= '0' && x <= '9') || (x == '\''))
{
token[i++] = x;
x = (char)getc(scanfile);
if (feof(scanfile)) { token[0] = 0; return; }
}
ungetc(x, scanfile);
token[i] = 0;
if(!strcmp(token, "NB"))
{
x = (char)getc(scanfile);
if (feof(scanfile)) { token[0] = 0; return; }
while (x != '\n')
{
x = (char)getc(scanfile);
if (feof(scanfile)) { token[0] = 0; return; }
}
i = 0;
goto RESTART_SCAN;
}
scan_trace("Alphanumeric");
return;
}
if (x >= '0' && x <= '9')
{
while (x >= '0' && x <= '9')
{
token[i++] = x;
x = (char)getc(scanfile);
if (feof(scanfile)) { token[0] = 0; return; }
}
ungetc(x, scanfile);
token[i] = 0;
scan_trace("Digit");
return;
}
if (x == '"')
{
token[i++] = x;
x = (char)getc(scanfile);
if (feof(scanfile)) { token[0] = 0; return; }
while (x != '"')
{
token[i++] = x;
x = (char)getc(scanfile);
if (feof(scanfile)) { token[0] = 0; return; }
}
token[i] = 0;
scan_trace("String");
return;
}
if (x == '+' || x == '-' || x == '>' || x == '<')
{
while (x == '+' || x == '-' || x == '>' || x == '<' || x == '=')
{
token[i++] = x;
x = (char)getc(scanfile);
if (feof(scanfile)) { token[0] = 0; return; }
}
ungetc(x, scanfile);
token[i] = 0;
scan_trace("Compound Symbol");
return;
}
if (x == '(' || x == ')' || x == '=' || x == ';' || x == '*' || x == '/'
|| x == '|' || x == '&' || x == '^' || x == '.' || x == '!'
|| x == '{' || x == '}' || x == ',' || x == '[' || x == ']'
|| x == '~' || x == '?' || x == '#' || x == '@')
{
token[0] = x;
token[1] = 0;
scan_trace("Discrete Symbol");
return;
}
token[0] = 0;
}