git @ Cat's Eye Technologies Illgol-Grand-Mal / master 1. ILLGOL / src / scan.c
master

Tree @master (Download .tar.gz)

scan.c @masterraw · history · blame

/*
  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 == '#')
  {
    token[0] = x;
    token[1] = 0;
    scan_trace("Discrete Symbol");
    return;
  }
  token[0] = 0;
}