X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fassemble.c;h=27ebfdbe3c0d89d4c31418f00d1454a15814afb2;hb=dbba1efb7f290dec54755c26baa05e263459560d;hp=329704152f2c1f3687f664cf131ea5a084d6ec5c;hpb=0e3065564e83037d5fbbb3e0e1595e7ce95ce8eb;p=YACASL2.git diff --git a/src/assemble.c b/src/assemble.c index 3297041..27ebfdb 100644 --- a/src/assemble.c +++ b/src/assemble.c @@ -61,7 +61,7 @@ bool writememory(WORD word, WORD adr, PASS pass) } if(cerrno == 0) { memory[adr] = word; - if(pass == SECOND && asdetailmode == true) { + if(pass == SECOND && (&asmode)->asdetailmode == true) { fprintf(stdout, "\t#%04X\t#%04X\n", adr, word); } status = true; @@ -75,8 +75,7 @@ WORD getliteral(const char *str, PASS pass) { WORD adr = lptr; assert(*str == '='); - str++; - if(*str == '\'') { /* 文字定数 */ + if(*(++str) == '\'') { /* 文字定数 */ writestr(str, true, pass); } else { writememory(nh2word(str), lptr++, pass); @@ -89,19 +88,28 @@ WORD getliteral(const char *str, PASS pass) void writestr(const char *str, bool literal, PASS pass) { assert(cerrno == 0 && *str == '\''); - str++; - while(*str != '\0') { - if(*str == '\'') { - if(*(str+1) != '\'') { - break; - } - str++; + const char *p = str + 1; + bool lw = false; + + for(; ;) { + /* 閉じ「'」がないまま文字列が終了した場合 */ + if(*p == '\0') { + setcerr(123, str); /* illegal string */ + break; + } + /* 「'」の場合、次の文字が「'」でない場合は正常終了 */ + if(*p == '\'' && *(++p) != '\'') { + break; + } else if(literal == true && lw == true) { + setcerr(124, str); /* more than one character in literal */ + break; } /*リテラルの場合はリテラル領域に書込 */ if(literal == true) { - writememory(*(str++), lptr++, pass); + writememory(*(p++), lptr++, pass); + lw = true; } else { - writememory(*(str++), ptr++, pass); + writememory(*(p++), ptr++, pass); } } } @@ -409,7 +417,9 @@ bool assemble(const char *file, PASS pass) break; } lineno++; - if((pass == FIRST && srcmode == true) || (pass == SECOND && asdetailmode == true)) { + if((pass == FIRST && (&asmode)->srcmode == true) || + (pass == SECOND && (&asmode)->asdetailmode == true)) + { fprintf(stdout, "%s:%5d:%s", file, lineno, line); } if((cmdl = linetok(line)) != NULL) {