ソースコードの推敲
authorj8takagi <j8takagi@nifty.com>
Sun, 10 Feb 2019 01:40:01 +0000 (10:40 +0900)
committerj8takagi <j8takagi@nifty.com>
Sun, 10 Feb 2019 01:40:01 +0000 (10:40 +0900)
src/token.c

index 450452b..b6d971c 100644 (file)
@@ -102,7 +102,7 @@ void addcerrlist_tok()
 
 CMDLINE *linetok(const char *line)
 {
-    char *tok, *p;
+    char *tok = NULL, *p = NULL, *lbl = NULL;
     int i;
     bool quoting = false;
     CMDLINE *cmdl = NULL;
@@ -122,30 +122,42 @@ CMDLINE *linetok(const char *line)
             break;
         }
     }
+    /* 文字列末尾の改行と空白を削除 */
+    i = strlen(p) - 1;
+    while(i > 0 && (p[i] == '\n' || p[i] == ' ' || p[i] == '\t')) {
+        p[i--] = '\0';
+    }
+    /* 空行の場合、終了 */
     if(!p[0] || p[0] == '\n') {
         goto linetokfin;
     }
     cmdl = malloc_chk(sizeof(CMDLINE), "cmdl");
-    /* ラベルの取得。行の先頭が空白またはタブの場合、ラベルは空 */
-    if((i = strcspn(p, " \t\n")) == 0){
-        cmdl->label = strdup_chk("", "cmdl->label");
-    } else {        /* ラベルを取得 */
+
+    /* ラベルの取得 */
+    /* 行の先頭が空白またはタブの場合、ラベルは空 */
+    if((i = strcspn(p, " \t\n")) == 0) {
+        lbl = strdup_chk("", "linetok.lbl");
+    } else {
+        lbl = strndup_chk(p, i, "linetok.lbl");
         /* 文字列が長すぎる場合はエラー */
         if(i > LABELSIZE) {
-            setcerr(104, strndup_chk(p, i, "cerr"));    /* label length is too long */
-        } else {
-            cmdl->label = strndup_chk(p, i, "cmdl->label");
+            setcerr(104, lbl);    /* label length is too long */
+            FREE(lbl);
+            goto linetokfin;
         }
-        /* 文字列先頭をラベルの次の文字に移動 */
-        p += i + 1;
+        /* 文字列先頭をラベルの次の文字に移動 */
+        p += i;
     }
-    /* 文字列の先頭から、ラベルと命令の間の空白を削除 */
+    cmdl->label = lbl;
+
+    /* 命令の取得 */
+    /* 文字列先頭の、ラベルと命令の間の空白を削除 */
     for(i = 0; p[i] == ' ' || p[i] == '\t'; i++) {
         ;
     }
     p += i;
-    /* å\91½ä»¤ã\81¨ã\82ªã\83\9aã\83©ã\83³ã\83\89ã\81®å\8f\96å¾\97 */
-    if(!p[0] || p[0] == '\n') {        /* 命令がない場合は、終了 */
+    /* å\91½ä»¤ã\81\8cã\81ªã\81\84å ´å\90\88ã\81¯ã\80\81çµ\82äº\86 */
+    if(!p[0]) {
         if(cmdl->label) {      /* ラベルが定義されていて命令がない場合はエラー */
             setcerr(105, "");    /* no command in the line */
         }
@@ -153,24 +165,20 @@ CMDLINE *linetok(const char *line)
         FREE(cmdl);
         goto linetokfin;
     }
-    /* 命令の取得 */
-    i = strcspn(p, " \t\n");
+    /* 命令取得の実行 */
+    i = strcspn(p, " \t");
     cmdl->cmd = strndup_chk(p, i, "cmdl.cmd");
+
+    /* オペランドの取得 */
     /* 文字列の先頭を命令の次の文字に移動 */
     p += i + 1;
-    /* 文字列の先頭から、命令とオペランドの間の空白を削除 */
+    /* 文字列先頭の、命令とオペランドの間の空白を削除 */
     for(i = 0; p[i] == ' ' || p[i] == '\t'; i++) {
         ;
     }
     p += i;
-    /* 改行かタブまでの文字列を取得 */
-    /* 「'」で囲まれた文字列に含まれる場合があるため、空白は無視 */
-    if((i = strcspn(p, "\t\n")) > 0) {
-        cmdl->opd = opdtok(strndup_chk(p, i, "cmdl->opd"));
-    } else {
-        cmdl->opd = malloc_chk(sizeof(OPD), "cmdl->opd");
-        cmdl->opd->opdc = 0;
-    }
+    /* オペランド取得の実行 */
+    cmdl->opd = opdtok(p);
 linetokfin:
     FREE(tok);
     return cmdl;