From 5a4b3d78dc422e2f388cbbd55007ea808c256d80 Mon Sep 17 00:00:00 2001 From: j8takagi Date: Sat, 9 Feb 2019 00:38:48 +0900 Subject: [PATCH] =?utf8?q?=E3=82=BD=E3=83=BC=E3=82=B9=E3=81=AE=E6=8E=A8?= =?utf8?q?=E6=95=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit ポインタ演算を書き換え --- src/assemble.c | 33 ++++++++++++++++++--------------- src/token.c | 44 ++++++++++++++++++++++---------------------- 2 files changed, 40 insertions(+), 37 deletions(-) diff --git a/src/assemble.c b/src/assemble.c index c9dd43b..901da29 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); @@ -387,26 +389,27 @@ void writestr(const char *str, bool literal, PASS pass) assert(*str == '\''); const char *p = str + 1; bool lw = false; + int i; - for(; ;) { + for(i = 0; p[i] != '\'' || p[i+1] == '\''; i++) { /* 閉じ「'」がないまま文字列が終了した場合 */ - if(*p == '\0') { + if(!p[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(p[i] == '\'') { + i++; + } /*リテラルの場合はリテラル領域に書込 */ if(literal == true) { - writememory(*(p++), (asptr->lptr)++, pass); + writememory(p[i], (asptr->lptr)++, pass); lw = true; } else { - writememory(*(p++), (asptr->ptr)++, pass); + writememory(p[i], (asptr->ptr)++, pass); } } } diff --git a/src/token.c b/src/token.c index 95df50f..457ca8f 100644 --- a/src/token.c +++ b/src/token.c @@ -50,32 +50,32 @@ OPD *opdtok(const char *str) break; } /* 先頭が等号(=)の場合 */ - if(*r == '=') { + if(r[0] == '=') { r++; } /* 「'」の場合 */ - if(*r == '\'') { + if(r[0] == '\'') { /* 「''」以外の場合はquote値を反転 */ - if(*(r+1) != '\'' && !(q < r && *(r-1) == '\'')) { + if(r[1] != '\'' && !(q < r && r[-1] == '\'')) { quoting = !quoting; } /* 文字列の長さを数える。「'」の場合は数えない */ - if(*(r+1) != '\'') { + if(r[1] != '\'') { rcnt++; } } if(quoting == true) { /* 閉じ「'」がないまま文字列が終了した場合 */ - if(*r == '\0') { + if(!r[0]) { setcerr(123, str); /* unclosed quote */ break; } r++; } else { sepp = r + strcspn(r, ", "); - sepc = *sepp; - *sepp = '\0'; - if(*q == '\0') { + sepc = sepp[0]; + strcpy(sepp, ""); + if(!q[0]) { setcerr(121, ""); /* cannot get operand token */ break; } @@ -105,29 +105,29 @@ CMDLINE *linetok(const char *line) bool quoting = false; CMDLINE *cmdl = NULL; - if(*line == '\0') { + if(!line[0]) { return NULL; } tokens = strdup_chk(line, "tokens"); /* コメントを削除 */ - for(p = tokens; *p != '\0'; p++) { + for(p = tokens; p[0]; p++) { /* 「'」で囲まれた文字列の処理。「''」は無視 */ - if(*p == '\'' && *(p+1) != '\'' && !(p > tokens && *(p-1) == '\'')) { + if(p[0] == '\'' && p[1] != '\'' && !(p > tokens && p[-1] == '\'')) { quoting = !quoting; - } else if(quoting == false && *p == ';') { - *p = '\0'; + } else if(quoting == false && p[0] == ';') { + strcpy(p, ""); break; } } - if(*tokens != '\n' && *tokens != '\0') { + if(tokens[0] && tokens[0] != '\n') { p = tokens; cmdl = malloc_chk(sizeof(CMDLINE), "cmdl"); cmdl->label = malloc_chk(LABELSIZE + 1, "cmdl.label"); /* ラベルの取得。行の先頭が空白またはタブの場合、ラベルは空 */ if((sepp = p + strcspn(p, " \t\n")) == p){ - *(cmdl->label) = '\0'; + strcpy(cmdl->label, ""); } else { /* ラベルを取得 */ - *sepp = '\0'; + strcpy(sepp, ""); /* 文字列が長すぎる場合はエラー */ if(strlen(p) > LABELSIZE) { setcerr(104, p); /* label length is too long */ @@ -137,12 +137,12 @@ CMDLINE *linetok(const char *line) p = sepp + 1; } /* ラベルと命令の間の空白をスキップ */ - while(*p == ' ' || *p == '\t') { + while(p[0] == ' ' || p[0] == '\t') { p++; } /* 命令とオペランドの取得 */ - if(*p == '\n' || *p == '\0') { /* 命令がない場合は、終了 */ - if(*(cmdl->label) != '\0') { /* ラベルが定義されていて命令がない場合はエラー */ + if(!p[0] || p[0] == '\n') { /* 命令がない場合は、終了 */ + if(cmdl->label) { /* ラベルが定義されていて命令がない場合はエラー */ setcerr(105, ""); /* no command in the line */ } FREE(cmdl->label); @@ -150,17 +150,17 @@ CMDLINE *linetok(const char *line) } else { /* 命令の取得 */ sepp = p + strcspn(p, " \t\n"); - *sepp = '\0'; + strcpy(sepp, ""); cmdl->cmd = strdup_chk(p, "cmdl.cmd"); p = sepp + 1; /* 命令とオペランドの間の空白をスキップ */ - while(*p == ' ' || *p == '\t') { + while(p[0] == ' ' || p[0] == '\t') { p++; } /* 改行かタブまでの文字列を取得 */ /* 「'」で囲まれた文字列に含まれる場合があるため、空白は無視 */ if((sepp = p + strcspn(p, "\t\n")) > p) { - *sepp = '\0'; + strcpy(sepp, ""); cmdl->opd = opdtok(p); } else { cmdl->opd = malloc_chk(sizeof(OPD), "cmdl.opd"); -- 2.18.0