コマンド表とラベル表の作成時に、共用体版hash関数を使うように変更
[YACASL2.git] / src / label.c
index 02840a5..d740b2e 100644 (file)
@@ -3,13 +3,31 @@
 
 LABELTAB *labels[LABELTABSIZE];
 
+/* プログラム名とラベルに対応するハッシュ値を返す */
+unsigned labelhash(const char *prog, const char *label)
+{
+    HKEY *keys[2];
+    int i = 0;
+    if(prog != NULL) {
+        keys[i] = malloc(sizeof(HKEY));
+        keys[i]->type = CHARS;
+        keys[i++]->val.s = strdup(prog);
+    }
+    keys[i] = malloc(sizeof(HKEY));
+    keys[i]->type = CHARS;
+    keys[i]->val.s = strdup(label);
+    /* ハッシュ値を返す */
+    return hash(i+1, keys, LABELTABSIZE);
+}
+
 /* ラベル表からアドレスを検索する */
-WORD getlabel(const char *label)
+WORD getlabel(const char *prog, const char *label)
 {
     LABELTAB *np;
-
-    for(np = labels[hash(label, LABELTABSIZE)]; np != NULL; np = np->next){
-        if(strcmp(label, np->name) == 0) {
+    for(np = labels[labelhash(prog, label)]; np != NULL; np = np->next) {
+        if((prog == NULL || (np->prog != NULL && strcmp(prog, np->prog) == 0)) &&
+           strcmp(label, np->label) == 0)
+        {
             return np->adr;
         }
     }
@@ -17,21 +35,29 @@ 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;
+    char *keys[2];
+    int i = 0;
 
-    if(getlabel(label) != 0xFFFF){
+    if(getlabel(prog, label) != 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;
     }
-    hashval = hash(label, LABELTABSIZE);
+    if(prog != NULL) {
+        keys[i++] = strdup(prog);
+    }
+    keys[i] = strdup(label);;
+    hashval = labelhash(prog, label);
     np->next = labels[hashval];
     labels[hashval] = np;
     np->adr = adr;
@@ -43,9 +69,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 +85,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);
         }
     }