ラベル表にプログラム名(prog)を追加
[YACASL2.git] / src / label.c
index 02840a5..5a0b4cc 100644 (file)
@@ -4,12 +4,12 @@
 LABELTAB *labels[LABELTABSIZE];
 
 /* ラベル表からアドレスを検索する */
-WORD getlabel(const char *label)
+WORD getlabel(const char *label, const char *prog)
 {
     LABELTAB *np;
 
-    for(np = labels[hash(label, LABELTABSIZE)]; np != NULL; np = np->next){
-        if(strcmp(label, np->name) == 0) {
+    for(np = labels[hash(label, LABELTABSIZE)]; np != NULL; np = np->next) {
+        if(strcmp(label, np->label) == 0) {
             return np->adr;
         }
     }
@@ -17,17 +17,19 @@ WORD getlabel(const char *label)
 }
 
 /* ラベルを表に追加する */
-bool addlabel(const char *label, WORD adr)
+bool addlabel(const char *prog, const char *label, WORD adr)
 {
     LABELTAB *np;
     unsigned hashval;
 
-    if(getlabel(label) != 0xFFFF){
+    if(getlabel(label, prog) != 0xFFFF) {
         setcerr(101, label);    /* label already defined */
         return false;
     }
     np = (LABELTAB *) malloc(sizeof(*np));
-    if(np == NULL || (np->name = strdup(label)) == NULL){
+    if(np == NULL || (np->label = strdup(label)) == NULL ||
+       (prog != NULL && (np->prog = strdup(prog)) == NULL))
+    {
         setcerr(102, NULL);    /* label table is full */
         return false;
     }
@@ -43,9 +45,13 @@ void printlabel()
 {
     int i;
     LABELTAB *np;
-    for(i = 0; i < LABELTABSIZE; i++){
-        for(np = labels[i]; np != NULL; np = np->next){
-            fprintf(stdout, "%s ---> #%04X\n", np->name, np->adr);
+    for(i = 0; i < LABELTABSIZE; i++) {
+        for(np = labels[i]; np != NULL; np = np->next) {
+            if(np->prog == NULL) {
+                fprintf(stdout, "%s ---> #%04X\n", np->label, np->adr);
+            } else {
+                fprintf(stdout, "%s.%s ---> #%04X\n", np->prog, np->label, np->adr);
+            }
         }
     }
 }
@@ -55,10 +61,11 @@ void freelabel()
 {
     int i;
     LABELTAB *np, *nq;
-    for(i = 0; i < LABELTABSIZE; i++){
+    for(i = 0; i < LABELTABSIZE; i++) {
         for(np = labels[i]; np != NULL; np = nq){
             nq = np->next;
-            free(np->name);
+            free(np->prog);
+            free(np->label);
             free(np);
         }
     }