
#define NKEYWORD 6

/* linear search , ordered by estimate frequency of use --

PRIVATE char keyword[][10] = {
  "if", "else", "while", "print", "return",
  "send", "receive", "wait", "signal", "region",
  "process", "global", "semaphore", "main",0 };

-- if YES instantiate type of token --
PRIVATE isReservedWord2( char * str, int * tktype )
{
  int t;
  for( t=0; t<NKEYWORD; t++ )
    if( strcmp(keyword[t],str) == 0) {
      *tktype = t;
      return 1;
    }
  return 0;
}
*/

/* this code is from Schreiner, A.T. and Friedman, H.G. "Intro. to
   compiler construction with UNIX", Prentice hall, 1985
 */
typedef struct {
  char *name;
  int  tk;
} rw_entry;

PRIVATE rw_entry rwtable[] = {
  "else", 	tkELSE,
  "if",         tkIF,
  "main",       tkMAIN,
  "print",      tkPRINT,
  "return",     tkRETURN,
  "while",      tkWHILE
};

/* return token of reserved word, if not found return tkIDEN */
PRIVATE int chkReservedWord( char * str )
{
  rw_entry *low = rwtable;
  rw_entry *high = &rwtable[NKEYWORD-1];
  rw_entry *mid;
  int c;

  while( low <= high ) {
    mid = low + (high-low)/2;
    if( ( c = strcmp(mid->name, str)) == 0 )
      return mid->tk;
    else if ( c < 0 )
      low = mid + 1;
    else
      high = mid - 1;
  }
  return tkIDENTIFIER;
}
