keytab.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /* $Header$ */
  2. /*
  3. * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  4. * See the copyright notice in the ACK home directory, in the file "Copyright".
  5. */
  6. /* keytab.c */
  7. # include "Lpars.h"
  8. # include <ctype.h>
  9. # define NKEYWORDS ((sizeof keytab) / (sizeof *keytab))
  10. # define MAXKEYLEN 8
  11. typedef struct {
  12. int k_token;
  13. char *k_str;
  14. } KTAB;
  15. KTAB keytab[] = {
  16. { AFTER, "AFTER" }, { ALLOCATE, "ALLOCATE" },
  17. { ALT, "ALT" }, { AND, "AND" },
  18. { ANY, "ANY" }, { BYTE, "BYTE" },
  19. { CHAN, "CHAN" }, { DEF, "DEF" },
  20. { FALSE, "FALSE" }, { FOR, "FOR" },
  21. { IF, "IF" }, { LOAD, "LOAD" },
  22. { NOT, "NOT" }, { NOW, "NOW" },
  23. { OR, "OR" }, { PAR, "PAR" },
  24. { PLACED, "PLACED" }, { PORT, "PORT" },
  25. { PRI, "PRI" }, { PROC, "PROC" },
  26. { SEQ, "SEQ" }, { SKIP, "SKIP" },
  27. { TABLE, "TABLE" }, { TRUE, "TRUE" },
  28. { VALUE, "VALUE" }, { VAR, "VAR" },
  29. { WAIT, "WAIT" }, { WHILE, "WHILE" },
  30. };
  31. /*
  32. * The table of keywords is searched for the occurence of `str',
  33. * if found the corresponding token number is returned,
  34. * otherwise IDENTIFIER is the returned token number.
  35. */
  36. keyword(str) char *str;
  37. {
  38. register int high= NKEYWORDS-1;
  39. register int low= 0;
  40. register int i, cmp;
  41. char *lowerupper();
  42. register char *key;
  43. if ((key=lowerupper(str))==0) return IDENTIFIER;
  44. do {
  45. i= (high+low) / 2;
  46. if ((cmp= strcmp(key, keytab[i].k_str)) == 0) break;
  47. else if (cmp > 0) low= i+1;
  48. else high= i-1;
  49. } while (low <= high);
  50. return low<=high ? keytab[i].k_token : IDENTIFIER;
  51. }
  52. char *lowerupper(str) register char *str;
  53. {
  54. static char keyword[MAXKEYLEN+1];
  55. register char *key=keyword;
  56. if (islower(*str)) {
  57. do
  58. *key++ = toupper(*str++);
  59. while (key<keyword+MAXKEYLEN && islower(*str));
  60. } else {
  61. do
  62. *key++ = *str++;
  63. while (key<keyword+MAXKEYLEN && isupper(*str));
  64. }
  65. *key=0;
  66. return *str==0 ? keyword : 0;
  67. }
  68. char *keyname(key) register int key;
  69. {
  70. register KTAB *kp;
  71. for (kp= keytab; kp< keytab+NKEYWORDS; kp++)
  72. if (kp->k_token == key) return kp->k_str;
  73. return 0;
  74. }