6 * @return ハッシュ値をセットしたキー
10 HKEY *label_hashkey(const char *value);
13 * プログラム名とラベルに対応するハッシュ値を返す
20 unsigned labelhash(const char *prog, const char *label);
23 * ラベルを比較した結果を返す。qsort内で使われる関数
25 * @return ラベルが同一の場合は0、異なる場合は0以外
30 int compare_adr(const void *a, const void *b);
35 static int labelcnt = 0;
40 static LABELTAB *labels[LABELTABSIZE];
45 static CERR cerr_label[] = {
46 { 101, "label already defined" },
47 { 102, "label table is full" },
48 { 103, "label not found" },
51 HKEY *label_hashkey(const char *value) {
54 key = malloc_chk(sizeof(HKEY), "label_hashkey");
56 key->val.s = strdup_chk(value, "label_hashkey.value");
60 unsigned labelhash(const char *prog, const char *label)
67 keys[i++] = label_hashkey(prog);
69 keys[i] = label_hashkey(label);
70 h = hash(i+1, keys, LABELTABSIZE);
71 for(j = 0; j < i + 1; j++) {
78 int compare_adr(const void *a, const void *b)
80 return (**(LABELARRAY **)a).adr - (**(LABELARRAY **)b).adr;
83 /* assemble.hで定義された関数群 */
84 void addcerrlist_label()
86 addcerrlist(ARRAYSIZE(cerr_label), cerr_label);
89 WORD getlabel(const char *prog, const char *label)
91 assert(prog != NULL && label != NULL);
95 for(p = labels[labelhash(prog, label)]; p != NULL; p = p->next) {
97 if((!prog[0] || (strcmp(prog, l->prog) == 0)) &&
98 strcmp(label, l->label) == 0)
106 bool addlabel(const char *prog, const char *label, WORD adr)
108 assert(label != NULL);
113 /* 登録されたラベルを検索。すでに登録されている場合はエラー発生 */
114 if(getlabel(prog, label) != 0xFFFF) {
115 setcerr(101, label); /* label already defined */
119 p = malloc_chk(sizeof(LABELTAB), "labels.next");
120 l = p->label = malloc_chk(sizeof(LABELARRAY), "labels.label");
122 l->prog = strdup_chk(prog, "label.prog");
124 l->label = strdup_chk(label, "label.label");
130 p->next = labels[h = labelhash(prog, label)];
141 l = calloc_chk(labelcnt, sizeof(LABELARRAY **), "labels");
142 for(i = 0; i < LABELTABSIZE; i++) {
143 for(p = labels[i]; p != NULL; p = p->next) {
144 assert(p->label != NULL);
148 qsort(l, s, sizeof(*l), compare_adr);
149 for(i = 0; i < s; i++) {
151 fprintf(stdout, "%s.", l[i]->prog);
153 fprintf(stdout, "%s ---> #%04X\n", l[i]->label, l[i]->adr);
163 for(i = 0; i < LABELTABSIZE; i++) {
164 for(p = labels[i]; p != NULL; p = q) {
166 FREE(p->label->prog);
167 FREE(p->label->label);