「make check」でのテストが、コマンド更新時だけに実行されるよう修正
[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, const char *prog)
8 {
9     LABELTAB *np;
10
11     for(np = labels[hash(label, LABELTABSIZE)]; np != NULL; np = np->next) {
12         if(strcmp(label, np->label) == 0) {
13             return np->adr;
14         }
15     }
16     return 0xFFFF;
17 }
18
19 /* ラベルを表に追加する */
20 bool addlabel(const char *prog, const char *label, WORD adr)
21 {
22     LABELTAB *np;
23     unsigned hashval;
24
25     if(getlabel(label, prog) != 0xFFFF) {
26         setcerr(101, label);    /* label already defined */
27         return false;
28     }
29     np = (LABELTAB *) malloc(sizeof(*np));
30     if(np == NULL || (np->label = strdup(label)) == NULL ||
31        (prog != NULL && (np->prog = strdup(prog)) == NULL))
32     {
33         setcerr(102, NULL);    /* label table is full */
34         return false;
35     }
36     hashval = hash(label, LABELTABSIZE);
37     np->next = labels[hashval];
38     labels[hashval] = np;
39     np->adr = adr;
40     return true;
41 }
42
43 /* ラベル表を表示する */
44 void printlabel()
45 {
46     int i;
47     LABELTAB *np;
48     for(i = 0; i < LABELTABSIZE; i++) {
49         for(np = labels[i]; np != NULL; np = np->next) {
50             if(np->prog == NULL) {
51                 fprintf(stdout, "%s ---> #%04X\n", np->label, np->adr);
52             } else {
53                 fprintf(stdout, "%s.%s ---> #%04X\n", np->prog, np->label, np->adr);
54             }
55         }
56     }
57 }
58
59 /* ラベル表を解放する */
60 void freelabel()
61 {
62     int i;
63     LABELTAB *np, *nq;
64     for(i = 0; i < LABELTABSIZE; i++) {
65         for(np = labels[i]; np != NULL; np = nq){
66             nq = np->next;
67             free(np->prog);
68             free(np->label);
69             free(np);
70         }
71     }
72 }