YACAL2: CASL2処理系
[YACASL2.git] / src / label.c
1 #include "casl2.h"
2 #include "assemble.h"
3
4 LABELTAB *labels[LABELTABSIZE];
5
6 /* ラベル表からアドレスを検索する */
7 WORD getlabel(const char *label)
8 {
9     LABELTAB *np;
10
11     for(np = labels[hash(label, LABELTABSIZE)]; np != NULL; np = np->next){
12         if(strcmp(label, np->name) == 0) {
13             return np->adr;
14         }
15     }
16     return 0xFFFF;
17 }
18
19 /* ラベルを表に追加する */
20 bool addlabel(const char *label, WORD adr)
21 {
22     LABELTAB *np;
23     unsigned hashval;
24
25     if(getlabel(label) != 0xFFFF){
26         setcerr(101, label);    /* label already defined */
27         return false;
28     }
29     np = (LABELTAB *) malloc(sizeof(*np));
30     if(np == NULL || (np->name = strdup(label)) == NULL){
31         setcerr(102, NULL);    /* label table is full */
32         return false;
33     }
34     hashval = hash(label, LABELTABSIZE);
35     np->next = labels[hashval];
36     labels[hashval] = np;
37     np->adr = adr;
38     return true;
39 }
40
41 /* ラベル表を表示する */
42 void printlabel()
43 {
44     int i;
45     LABELTAB *np;
46     for(i = 0; i < LABELTABSIZE; i++){
47         for(np = labels[i]; np != NULL; np = np->next){
48             fprintf(stdout, "%s ---> #%04X\n", np->name, np->adr);
49         }
50     }
51 }
52
53 /* ラベル表を解放する */
54 void freelabel()
55 {
56     int i;
57     LABELTAB *np, *nq;
58     for(i = 0; i < LABELTABSIZE; i++){
59         for(np = labels[i]; np != NULL; np = nq){
60             nq = np->next;
61             free(np->name);
62             free(np);
63         }
64     }
65 }