}
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;
{
WORD adr = lptr;
assert(*str == '=');
- str++;
- if(*str == '\'') { /* 文字定数 */
+ if(*(++str) == '\'') { /* 文字定数 */
writestr(str, true, pass);
} else {
writememory(nh2word(str), lptr++, 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);
}
}
}
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) {