CASL2コードで、ローカル以外のラベルを使わないように修正
[YACASL2.git] / src / label.c
1 #include "casl2.h"
2 #include "assemble.h"
3
4 LABELTAB *labels[LABELTABSIZE];
5
6 /* プログラム名とラベルに対応するハッシュ値を返す */
7 unsigned labelhash(const char *prog, const char *label)
8 {
9     HKEY *keys[2];
10     int i = 0;
11     if(prog != NULL) {
12         keys[i] = malloc(sizeof(HKEY));
13         keys[i]->type = CHARS;
14         keys[i++]->val.s = strdup(prog);
15     }
16     keys[i] = malloc(sizeof(HKEY));
17     keys[i]->type = CHARS;
18     keys[i]->val.s = strdup(label);
19     /* ハッシュ値を返す */
20     return hash(i+1, keys, LABELTABSIZE);
21 }
22
23 /* ラベル表からアドレスを検索する */
24 WORD getlabel(const char *prog, const char *label)
25 {
26     LABELTAB *np;
27     for(np = labels[labelhash(prog, label)]; np != NULL; np = np->next) {
28         if(((prog == NULL && np->prog == NULL) ||
29             (prog != NULL && np->prog != NULL && strcmp(prog, np->prog) == 0)) &&
30            strcmp(label, np->label) == 0)
31         {
32             return np->adr;
33         }
34     }
35     return 0xFFFF;
36 }
37
38 /* ラベルを表に追加する */
39 bool addlabel(const char *prog, const char *label, WORD adr)
40 {
41     LABELTAB *np;
42     unsigned hashval;
43     char *keys[2];
44     int i = 0;
45
46     if(getlabel(prog, label) != 0xFFFF) {
47         setcerr(101, label);    /* label already defined */
48         return false;
49     }
50     np = (LABELTAB *) malloc(sizeof(*np));
51     if(np == NULL || (np->label = strdup(label)) == NULL ||
52        (prog != NULL && (np->prog = strdup(prog)) == NULL))
53     {
54         setcerr(102, NULL);    /* label table is full */
55         return false;
56     }
57     if(prog != NULL) {
58         keys[i++] = strdup(prog);
59     }
60     keys[i] = strdup(label);;
61     hashval = labelhash(prog, label);
62     np->next = labels[hashval];
63     labels[hashval] = np;
64     np->adr = adr;
65     return true;
66 }
67
68 /* ラベル表を表示する */
69 void printlabel()
70 {
71     int i;
72     LABELTAB *np;
73     for(i = 0; i < LABELTABSIZE; i++) {
74         for(np = labels[i]; np != NULL; np = np->next) {
75             if(np->prog == NULL) {
76                 fprintf(stdout, "%s ---> #%04X\n", np->label, np->adr);
77             } else {
78                 fprintf(stdout, "%s.%s ---> #%04X\n", np->prog, np->label, np->adr);
79             }
80         }
81     }
82 }
83
84 /* ラベル表を解放する */
85 void freelabel()
86 {
87     int i;
88     LABELTAB *np, *nq;
89     for(i = 0; i < LABELTABSIZE; i++) {
90         for(np = labels[i]; np != NULL; np = nq){
91             nq = np->next;
92             free(np->prog);
93             free(np->label);
94             free(np);
95         }
96     }
97 }