X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Fassemble.c;h=5e18000aa39bc01200b77268eba2cd7f7d6d8057;hp=de255b13b4267ff0a5d722538bd7b1328f5b0462;hb=d650cc4148ccd23f940ac60050c36c89897c168f;hpb=9a1bf3c55911d68225635c91b68de98490c25a6f diff --git a/src/assemble.c b/src/assemble.c index de255b1..5e18000 100644 --- a/src/assemble.c +++ b/src/assemble.c @@ -320,9 +320,9 @@ WORD getadr(const char *prog, const char *str, PASS pass) { WORD adr = 0x0; - if(*str == '=') { + if(str[0] == '=') { adr = getliteral(str, pass); - } else if(isdigit(*str) || *str == '-' || *str == '#') { + } else if(isdigit(str[0]) || str[0] == '-' || str[0] == '#') { adr = nh2word(str); } else { if(pass == SECOND) { @@ -339,12 +339,13 @@ WORD grword(const char *str, bool is_x) WORD r; /* "GR[0-7]" 以外の文字列では、0xFFFFを返して終了 */ - if(!(strlen(str) == 3 && strncmp(str, "GR", 2) == 0 && - (*(str+2) >= '0' && *(str+2) <= '0' + (GRSIZE - 1)))) + if(strlen(str) != 3 || + strncmp(str, "GR", 2) != 0 || + str[2] < '0' || str[2] > '0' + (GRSIZE - 1)) { return 0xFFFF; } - r = (WORD)(*(str+2) - '0'); + r = (WORD)(str[2] - '0'); /* GR0は指標レジスタとして用いることができない */ if(is_x == true && r == 0x0) { setcerr(120, ""); /* GR0 in operand x */ @@ -355,10 +356,11 @@ WORD grword(const char *str, bool is_x) WORD getliteral(const char *str, PASS pass) { - assert(*str == '='); + assert(str[0] == '='); WORD adr = asptr->lptr; - if(*(++str) == '\'') { /* 文字定数 */ + str++; + if(str[0] == '\'') { /* 文字定数 */ writestr(str, true, pass); } else { writememory(nh2word(str), (asptr->lptr)++, pass); @@ -384,29 +386,27 @@ void writememory(WORD word, WORD adr, PASS pass) void writestr(const char *str, bool literal, PASS pass) { - assert(*str == '\''); - const char *p = str + 1; + assert(str[0] == '\''); + int i; bool lw = false; - for(; ;) { - /* 閉じ「'」がないまま文字列が終了した場合 */ - if(*p == '\0') { + /* 「'」の場合、1文字スキップし、次の文字が「'」でなければ正常終了 */ + for(i = 1; str[i] != '\'' || str[++i] == '\''; i++) { + /* 「'」が閉じないまま文字列が終了した場合はエラー */ + if(!str[i]) { setcerr(123, str); /* unclosed quote */ break; } - /* 「'」の場合、次の文字が「'」でない場合は正常終了 */ - if(*p == '\'' && *(++p) != '\'') { - break; - } else if(literal == true && lw == true) { + if(literal == true && lw == true) { setcerr(124, str); /* more than one character in literal */ break; } /*リテラルの場合はリテラル領域に書込 */ if(literal == true) { - writememory(*(p++), (asptr->lptr)++, pass); + writememory(str[i], (asptr->lptr)++, pass); lw = true; } else { - writememory(*(p++), (asptr->ptr)++, pass); + writememory(str[i], (asptr->ptr)++, pass); } } } @@ -418,7 +418,7 @@ void writedc(const char *str, PASS pass) if(*str == '\'') { writestr(str, false, pass); } else { - if(*str == '#' || isdigit(*str) || *str == '-') { + if(str[0] == '#' || isdigit(str[0]) || str[0] == '-') { adr = nh2word(str); } else { if(pass == SECOND && (adr = getlabel(asptr->prog, str)) == 0xFFFF) { @@ -435,7 +435,7 @@ void assemble_start(const CMDLINE *cmdl, PASS pass) setcerr(106, ""); /* operand count mismatch */ return; } - if(*(cmdl->label) == '\0') { + if(!cmdl->label[0]) { setcerr(107, ""); /* no label in START */ return; } @@ -461,7 +461,7 @@ void assemble_end(const CMDLINE *cmdl, PASS pass) else if(pass == SECOND) { execptr->end = asptr->lptr; } - *(asptr->prog) = '\0'; + strcpy(asptr->prog, ""); } void assemble_ds(const CMDLINE *cmdl, PASS pass) @@ -569,7 +569,7 @@ bool casl2cmd(CMD *cmdtbl, const CMDLINE *cmdl, PASS pass) { int i; void (*cmdptr)(); - for(i = 0; *(cmdtbl[i].name) != '\0'; i++) { + for(i = 0; cmdtbl[i].name[0]; i++) { if(strcmp(cmdl->cmd, cmdtbl[i].name) == 0) { cmdptr = cmdtbl[i].ptr; (*cmdptr)(cmdl, pass); @@ -669,7 +669,7 @@ bool assemble_comet2cmd(const CMDLINE *cmdl, PASS pass) bool assembletok(const CMDLINE *cmdl, PASS pass) { /* 命令がない場合 */ - if(*(cmdl->cmd) == '\0') { + if(!cmdl->cmd[0]) { return true; } /* アセンブラ命令またはマクロ命令の書込 */ @@ -694,7 +694,7 @@ bool assembleline(const char *line, PASS pass) stat = (cerr->num == 0) ? true : false; if(cmdl != NULL) { if(stat == true) { - if(pass == FIRST && *(cmdl->label) != '\0') { + if(pass == FIRST && cmdl->label[0]) { stat = addlabel(asptr->prog, cmdl->label, asptr->ptr); } } @@ -747,13 +747,13 @@ bool assemblefile(const char *file, PASS pass) return (cerr->num == 0) ? true : false; } -void assemble(int filec, char *filev[], WORD adr) +bool assemble(int filec, char *filev[], WORD adr) { int i; PASS pass; WORD bp[filec]; + bool stat = false; - create_cmdtype_code(); /* 命令の名前とタイプがキーのハッシュ表を作成 */ asptr = malloc_chk(sizeof(ASPTR), "asptr"); /* アセンブル時のプロパティ用の領域確保 */ asptr->prog = malloc_chk(LABELSIZE + 1, "asptr.prog"); asptr->ptr = adr; @@ -772,7 +772,8 @@ void assemble(int filec, char *filev[], WORD adr) fprintf(stdout, "\nAssemble %s (%d)\n", filev[i], pass); } /* ファイルをアセンブル */ - if(assemblefile(filev[i], pass) == false) { + stat = assemblefile(filev[i], pass); + if(stat == false) { goto asfin; } } @@ -785,10 +786,10 @@ void assemble(int filec, char *filev[], WORD adr) } } asfin: - freelabel(); /* ラベルハッシュ表を解放 */ - free_cmdtype_code(); /* 命令の名前とタイプがキーのハッシュ表を解放 */ - FREE(asptr->prog); /* アセンブル時のプロパティを解放 */ + freelabel(); /* ラベルハッシュ表を解放 */ + FREE(asptr->prog); /* アセンブル時のプロパティを解放 */ FREE(asptr); + return stat; } /* assemble.hで定義された関数群 */