strip_casl2_commentの、''があるときの動作を修正
authorj8takagi <j8takagi@nifty.com>
Sat, 16 Feb 2019 03:03:05 +0000 (12:03 +0900)
committerj8takagi <j8takagi@nifty.com>
Sat, 16 Feb 2019 03:08:21 +0000 (12:08 +0900)
VERSION
src/token.c

diff --git a/VERSION b/VERSION
index 3c9753e..498e4a9 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,2 +1,2 @@
-v0.5p6
+v0.5p7
 
index fa531b5..22f33ba 100644 (file)
@@ -1,8 +1,4 @@
-#include <stdio.h>
-#include <string.h>
-#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");
     /* 命令がない場合は、終了 */