X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Fassemble.c;h=5e18000aa39bc01200b77268eba2cd7f7d6d8057;hp=daee475bf7a1faf21ea598a62596c3b1c2c18244;hb=d650cc4148ccd23f940ac60050c36c89897c168f;hpb=5bc7ef914b3c7ef960eba0ef1dc70f1549685b66 diff --git a/src/assemble.c b/src/assemble.c index daee475..5e18000 100644 --- a/src/assemble.c +++ b/src/assemble.c @@ -386,34 +386,28 @@ 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[0] == '\'') { - p++; - if(p[0] != '\'') { - 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[0], (asptr->lptr)++, pass); + writememory(str[i], (asptr->lptr)++, pass); lw = true; } else { - writememory(p[0], (asptr->ptr)++, pass); + writememory(str[i], (asptr->ptr)++, pass); } - p++; } } @@ -424,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) { @@ -753,11 +747,12 @@ 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; asptr = malloc_chk(sizeof(ASPTR), "asptr"); /* アセンブル時のプロパティ用の領域確保 */ asptr->prog = malloc_chk(LABELSIZE + 1, "asptr.prog"); @@ -777,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; } } @@ -793,6 +789,7 @@ asfin: freelabel(); /* ラベルハッシュ表を解放 */ FREE(asptr->prog); /* アセンブル時のプロパティを解放 */ FREE(asptr); + return stat; } /* assemble.hで定義された関数群 */