X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fassemble.c;h=27ebfdbe3c0d89d4c31418f00d1454a15814afb2;hb=dbba1efb7f290dec54755c26baa05e263459560d;hp=d46caefc0c31fdfbb2047ed3d698f6d70997a874;hpb=712486afe58b10ef37c5fa915de889ab8d1dd6cd;p=YACASL2.git diff --git a/src/assemble.c b/src/assemble.c index d46caef..27ebfdb 100644 --- a/src/assemble.c +++ b/src/assemble.c @@ -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); } } }