} else if(isdigit(*str) || *str == '-' || *str == '#') {
adr = nh2word(str);
} else {
- if(pass == SECOND && (adr = getlabel(prog, str)) == 0xFFFF) {
- if(prog != NULL) {
+ if(pass == SECOND) {
+ if((adr = getlabel(prog, str)) == 0xFFFF) {
setcerr(103, str); /* label not found */
}
}
return;
}
/* プログラム名の設定 */
- asptr->prog = strdup_chk(cmdl->label, "asptr.prog");
+ strcpy(asptr->prog, cmdl->label);
/* オペランドがある場合、実行開始アドレスを設定 */
if(pass == SECOND && cmdl->opd->opdv[0] != NULL) {
if((execptr->start = getlabel(asptr->prog, cmdl->opd->opdv[0])) == 0xFFFF) {
else if(pass == SECOND) {
execptr->end = asptr->lptr;
}
- FREE(asptr->prog);
+ *(asptr->prog) = '\0';
}
/**
/* CALL以外の命令の場合と、プログラムの入口名を取得できない場合は、 */
/* 同一プログラム内のラベルを取得 */
if(pass == SECOND && cmd == 0x8000) { /* CALL命令 */
- adr = getlabel(NULL, cmdl->opd->opdv[0]);
+ adr = getlabel("", cmdl->opd->opdv[0]);
}
if(cmd != 0x8000 || (pass == SECOND && adr == 0xFFFF)) {
adr = getadr(asptr->prog, cmdl->opd->opdv[0], pass);
create_cmdtype_code(); /* 命令の名前とタイプがキーのハッシュ表を作成 */
asptr = malloc_chk(sizeof(ASPTR), "asptr"); /* アセンブル時のプロパティ用の領域確保 */
+ asptr->prog = malloc_chk(sizeof(LABELSIZE + 1), "asptr.prog");
asptr->ptr = 0;
/* アセンブル。ラベル表作成のため、2回行う */
for(pass = FIRST; pass <= SECOND; pass++) {
asfin:
freelabel(); /* ラベルハッシュ表を解放 */
free_cmdtype_code(); /* 命令の名前とタイプがキーのハッシュ表を解放 */
- FREE(asptr); /* アセンブル時のプロパティを解放 */
+ FREE(asptr->prog); /* アセンブル時のプロパティを解放 */
+ FREE(asptr);
}
/**
int i = 0, j;
unsigned h;
- if(prog != NULL) {
+ if(*prog != '\0') {
keys[i] = malloc_chk(sizeof(HKEY), "labelhash.key");
keys[i]->type = CHARS;
keys[i]->val.s = strdup_chk(prog, "labelhash.key.val");
LABELTAB *p;
for(p = labels[labelhash(prog, label)]; p != NULL; p = p->next) {
- if((prog == NULL || (p->prog != NULL && strcmp(prog, p->prog) == 0)) &&
+ if((*prog == '\0' || (strcmp(prog, p->prog) == 0)) &&
strcmp(label, p->label) == 0)
{
return p->adr;
/* メモリを確保 */
p = malloc_chk(sizeof(LABELTAB), "labels.next");
/* プログラム名を設定 */
- if(prog == NULL) {
- p->prog = NULL;
- } else {
- p->prog = strdup_chk(prog, "labels.prog");
- }
+ p->prog = strdup_chk(prog, "labels.prog");
/* ラベルを設定 */
p->label = strdup_chk(label, "labels.label");
/* アドレスを設定 */
for(p = labels[i]; p != NULL; p = p->next) {
assert(p->label != NULL);
l[s] = malloc_chk(sizeof(LABELARRAY), "lables");
- if(p->prog == NULL) {
- l[s]->prog = NULL;
- } else {
- l[s]->prog = strdup_chk(p->prog, "labels.prog");
- }
+ l[s]->prog = strdup_chk(p->prog, "labels.prog");
l[s]->label = strdup_chk(p->label, "labels.label");
l[s++]->adr = p->adr;
}
}
qsort(l, s, sizeof(*l), compare_adr);
for(i = 0; i < s; i++) {
- if(l[i]->prog != NULL) {
+ if(*(l[i]->prog) != '\0') {
fprintf(stdout, "%s.", l[i]->prog);
}
fprintf(stdout, "%s ---> #%04X\n", l[i]->label, l[i]->adr);