Pristine Ack-5.5
[Ack-5.5.git] / lang / occam / comp / keytab.c
1 /* $Id: keytab.c,v 1.6 1994/06/24 12:27:01 ceriel Exp $ */
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
10 # define NKEYWORDS      ((sizeof keytab) / (sizeof *keytab))
11 # define MAXKEYLEN      8
12
13 typedef struct {
14         int k_token;
15         char *k_str;
16 } KTAB;
17
18 KTAB keytab[] = {
19         { AFTER,        "AFTER"    }, { ALLOCATE,       "ALLOCATE" },
20         { ALT,          "ALT"      }, { AND,            "AND"      },
21         { ANY,          "ANY"      }, { BYTE,           "BYTE"     },
22         { CHAN,         "CHAN"     }, { DEF,            "DEF"      },
23         { FALSE,        "FALSE"    }, { FOR,            "FOR"      },
24         { IF,           "IF"       }, { LOAD,           "LOAD"     },
25         { NOT,          "NOT"      }, { NOW,            "NOW"      },
26         { OR,           "OR"       }, { PAR,            "PAR"      },
27         { PLACED,       "PLACED"   }, { PORT,           "PORT"     },
28         { PRI,          "PRI"      }, { PROC,           "PROC"     },
29         { SEQ,          "SEQ"      }, { SKIP,           "SKIP"     },
30         { TABLE,        "TABLE"    }, { TRUE,           "TRUE"     },
31         { VALUE,        "VALUE"    }, { VAR,            "VAR"      },
32         { WAIT,         "WAIT"     }, { WHILE,          "WHILE"    },
33 };
34
35 /*
36  *      The table of keywords is searched for the occurence of `str',
37  *      if found the corresponding token number is returned,
38  *      otherwise IDENTIFIER is the returned token number.
39  */
40 keyword(str) char *str;
41 {
42         register int high= NKEYWORDS-1;
43         register int low= 0;
44         register int i, cmp;
45         char *lowerupper();
46         register char *key;
47
48         if ((key=lowerupper(str))==0) return IDENTIFIER;
49
50         do {
51                 i= (high+low) / 2;
52                 if ((cmp= strcmp(key, keytab[i].k_str)) == 0) break;
53                 else if (cmp > 0) low= i+1;
54                 else high= i-1;
55         } while (low <= high);
56         
57         return low<=high ? keytab[i].k_token : IDENTIFIER;
58 }
59
60 char *lowerupper(str) register char *str;
61 {
62         static char keyword[MAXKEYLEN+1];
63         register char *key=keyword;
64
65         if (islower(*str)) {
66                 do {
67                         *key++ = toupper(*str);
68                         str++;
69                 } while (key<keyword+MAXKEYLEN && islower(*str));
70         } else {
71                 do
72                         *key++ = *str++;
73                 while (key<keyword+MAXKEYLEN && isupper(*str));
74         }
75         *key=0;
76
77         return *str==0 ? keyword : 0;
78 }
79
80 char *keyname(key) register int key;
81 {
82         register KTAB *kp;
83
84         for (kp= keytab; kp< keytab+NKEYWORDS; kp++)
85                 if (kp->k_token == key) return kp->k_str;
86
87         return 0;
88 }