From: j8takagi Date: Sat, 16 Feb 2019 03:03:05 +0000 (+0900) Subject: strip_casl2_commentの、''があるときの動作を修正 X-Git-Tag: v0.5p9~17 X-Git-Url: https://j8takagi.net/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=58b56a6373dbd2b2ce8d30f7661ff15f584fb03f;p=YACASL2.git strip_casl2_commentの、''があるときの動作を修正 --- diff --git a/VERSION b/VERSION index 3c9753e..498e4a9 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -v0.5p6 +v0.5p7 diff --git a/src/token.c b/src/token.c index fa531b5..22f33ba 100644 --- a/src/token.c +++ b/src/token.c @@ -1,8 +1,4 @@ -#include -#include -#include "cerr.h" -#include "cmem.h" -#include "assemble.h" +#include "token.h" /** * @brief 「,」区切りの文字列から、オペランドのトークンを取得 @@ -56,7 +52,7 @@ OPD *opdtok(const char *str) /* 「'」の場合 */ if(p[i] == '\'') { /* 「''」以外の場合はquote値を反転する */ - if(p[i+1] != '\'' && (i == 0 || p[i-1] != '\'')) { + if(p[i+1] != '\'' && (quoting == false || p[i-1] != '\'')) { quoting = !quoting; } /* 「'」をカウントする。「''」の場合は1をカウント */ @@ -105,7 +101,7 @@ char *strip_casl2_comment(char *s) for(i = 0; s[i]; i++) { /* 「'」で囲まれた文字列の場合。「''」は無視 */ - if(s[i] == '\'' && s[i+1] != '\'' && (i == 0 || s[i-1] != '\'')) { + if(s[i] == '\'' && s[i+1] != '\'' && (quoting == false || s[i-1] != '\'')) { quoting = !quoting; /* 「'」で囲まれた文字列でない場合、文字列末尾の「;」以降を削除 */ } else if(quoting == false && s[i] == ';') { @@ -118,10 +114,11 @@ char *strip_casl2_comment(char *s) CMDLINE *linetok(const char *line) { - char *tok = NULL, *p = NULL, *lbl = NULL; + char *tok = NULL, *p = NULL; int i; CMDLINE *cmdl = NULL; + assert(line); if(!line[0] || line[0] == '\n') { return NULL; } @@ -139,22 +136,20 @@ CMDLINE *linetok(const char *line) /* ラベルの取得 */ /* 行の先頭が空白またはタブの場合、ラベルは空 */ if((i = strcspn(p, " \t")) == 0) { - lbl = strdup_chk("", "linetok.lbl"); + cmdl->label = strdup_chk("", "cmdl->label"); } else { - lbl = strndup_chk(p, i, "linetok.lbl"); + cmdl->label = strndup_chk(p, i, "cmdl->label"); /* ラベルの文字列が長すぎる場合はエラー */ if(i > LABELSIZE) { - setcerr(104, lbl); /* label length is too long */ - FREE(lbl); + setcerr(104, cmdl->label); /* label length is too long */ + FREE(cmdl->label); goto linetokfin; } - /* 文字列先頭をラベルの次の文字に移動 */ - p += i; } - /* ラベル取得の実行 */ - cmdl->label = lbl; /* 命令の取得 */ + /* 文字列先頭をラベルの次の文字に移動 */ + p += i; /* 文字列先頭を、ラベルと命令の間の空白の後ろに移動 */ p += strspn(p, " \t"); /* 命令がない場合は、終了 */