From 2b714046a6f26036d03ae2d5e8b410cf83b4526c Mon Sep 17 00:00:00 2001 From: j8takagi Date: Sun, 14 Mar 2010 01:17:34 +0900 Subject: [PATCH 1/1] =?utf8?q?=E3=83=A9=E3=83=99=E3=83=AB=E3=81=AB?= =?utf8?q?=E9=96=A2=E3=81=99=E3=82=8B=E7=84=A1=E9=A7=84=E3=81=AA=E5=8B=95?= =?utf8?q?=E4=BD=9C=E3=82=92=E5=89=8A=E9=99=A4=E3=80=81=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/label.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/label.c b/src/label.c index 8d3aa4b..790a29a 100644 --- a/src/label.c +++ b/src/label.c @@ -24,6 +24,7 @@ unsigned labelhash(const char *prog, const char *label) /* ラベル表からアドレスを検索する */ WORD getlabel(const char *prog, const char *label) { + assert(label != NULL); LABELTAB *np; for(np = labels[labelhash(prog, label)]; np != NULL; np = np->next) { if((prog == NULL || (np->prog != NULL && strcmp(prog, np->prog) == 0)) && @@ -35,40 +36,38 @@ WORD getlabel(const char *prog, const char *label) return 0xFFFF; } -/* ラベルを表に追加する */ +/* プログラム名、ラベル、アドレスをラベル表に追加する */ bool addlabel(const char *prog, const char *label, WORD adr) { + assert(label != NULL); LABELTAB *np; unsigned hashval; - char *keys[2]; - int i = 0; + /* 登録されたラベルを検索。すでに登録されている場合はエラー発生 */ if(getlabel(prog, label) != 0xFFFF) { setcerr(101, label); /* label already defined */ return false; } - np = malloc(sizeof(*np)); - if(np == NULL || (np->label = strdup(label)) == NULL || + /* プログラム名、ラベル、アドレスを設定。メモリーを確保できない場合はエラー発生 */ + if((np = malloc(sizeof(LABELTAB))) == NULL || (np->label = strdup(label)) == NULL || (prog != NULL && (np->prog = strdup(prog)) == NULL)) { setcerr(102, NULL); /* label table is full */ return false; } - if(prog != NULL) { - keys[i++] = strdup(prog); - } + np->adr = adr; + /* ラベル数の設定 */ labelcnt++; - keys[i] = strdup(label); + /* ハッシュ表の設定 */ hashval = labelhash(prog, label); np->next = labels[hashval]; labels[hashval] = np; - np->adr = adr; return true; } int compare_adr(const void *a, const void *b) { - return (**(const LABELARRAY **)a).adr - (**(const LABELARRAY **)b).adr; + return (**(LABELARRAY **)a).adr - (**(LABELARRAY **)b).adr; } /* ラベル表を表示する */ @@ -80,11 +79,11 @@ void printlabel() for(i = 0; i < LABELTABSIZE; i++) { for(np = labels[i]; np != NULL; np = np->next) { - ar[asize] = malloc(sizeof(LABELARRAY *)); + assert(np->label != NULL); + ar[asize] = malloc(sizeof(LABELARRAY)); ar[asize]->prog = (np->prog == NULL ? NULL : strdup(np->prog)); ar[asize]->label = strdup(np->label); - ar[asize]->adr = np->adr; - asize++; + ar[asize++]->adr = np->adr; } } qsort(ar, asize, sizeof(*ar), compare_adr); @@ -104,7 +103,9 @@ void freelabel() for(i = 0; i < LABELTABSIZE; i++) { for(np = labels[i]; np != NULL; np = nq) { nq = np->next; - free(np->prog); + if(np->prog != NULL) { + free(np->prog); + } free(np->label); free(np); } -- 2.18.0