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

index a328532..450452b 100644 (file)
@@ -107,15 +107,16 @@ CMDLINE *linetok(const char *line)
     bool quoting = false;
     CMDLINE *cmdl = NULL;
 
     bool quoting = false;
     CMDLINE *cmdl = NULL;
 
-    if(!line[0]) {
+    if(!line[0] || line[0] == '\n') {
         return NULL;
     }
     tok = p = strdup_chk(line, "tok");
     /* コメントを削除 */
     for(i = 0; p[i]; i++) {
         return NULL;
     }
     tok = p = strdup_chk(line, "tok");
     /* コメントを削除 */
     for(i = 0; p[i]; i++) {
-        /* ã\80\8c\80\8dã\81§å\9b²ã\81¾ã\82\8cã\81\9fæ\96\87å­\97å\88\97ã\81®å\87¦ç\90\86。「''」は無視 */
-        if(p[i] == '\'' && p[i+1] != '\'' && !(i > 0 && p[i-1] == '\'')) {
+        /* ã\80\8c\80\8dã\81§å\9b²ã\81¾ã\82\8cã\81\9fæ\96\87å­\97å\88\97ã\81®å ´å\90\88。「''」は無視 */
+        if(p[i] == '\'' && p[i+1] != '\'' && (i == 0 || p[i-1] != '\'')) {
             quoting = !quoting;
             quoting = !quoting;
+        /* 「'」で囲まれた文字列でない場合、文字列末尾の「;」以降を削除 */
         } else if(quoting == false && p[i] == ';') {
             p[i] = '\0';
             break;
         } else if(quoting == false && p[i] == ';') {
             p[i] = '\0';
             break;
@@ -131,17 +132,18 @@ CMDLINE *linetok(const char *line)
     } else {        /* ラベルを取得 */
         /* 文字列が長すぎる場合はエラー */
         if(i > LABELSIZE) {
     } else {        /* ラベルを取得 */
         /* 文字列が長すぎる場合はエラー */
         if(i > LABELSIZE) {
-            p[i] = '\0';
-            setcerr(104, p);    /* label length is too long */
+            setcerr(104, strndup_chk(p, i, "cerr"));    /* label length is too long */
         } else {
             cmdl->label = strndup_chk(p, i, "cmdl->label");
         }
         } else {
             cmdl->label = strndup_chk(p, i, "cmdl->label");
         }
+        /* 文字列の先頭をラベルの次の文字に移動 */
         p += i + 1;
     }
         p += i + 1;
     }
-    /* ラベルと命令の間の空白をスキップ */
-    while(p[0] == ' ' || p[0] == '\t') {
-        p++;
+    /* 文字列の先頭から、ラベルと命令の間の空白を削除 */
+    for(i = 0; p[i] == ' ' || p[i] == '\t'; i++) {
+        ;
     }
     }
+    p += i;
     /* 命令とオペランドの取得 */
     if(!p[0] || p[0] == '\n') {        /* 命令がない場合は、終了 */
         if(cmdl->label) {      /* ラベルが定義されていて命令がない場合はエラー */
     /* 命令とオペランドの取得 */
     if(!p[0] || p[0] == '\n') {        /* 命令がない場合は、終了 */
         if(cmdl->label) {      /* ラベルが定義されていて命令がない場合はエラー */
@@ -153,20 +155,20 @@ CMDLINE *linetok(const char *line)
     }
     /* 命令の取得 */
     i = strcspn(p, " \t\n");
     }
     /* 命令の取得 */
     i = strcspn(p, " \t\n");
-    p[i] = '\0';
-    cmdl->cmd = strdup_chk(p, "cmdl.cmd");
+    cmdl->cmd = strndup_chk(p, i, "cmdl.cmd");
+    /* 文字列の先頭を命令の次の文字に移動 */
     p += i + 1;
     p += i + 1;
-    /* 命令とオペランドの間の空白をスキップ */
-    while(p[0] == ' ' || p[0] == '\t') {
-        p++;
+    /* 文字列の先頭から、命令とオペランドの間の空白を削除 */
+    for(i = 0; p[i] == ' ' || p[i] == '\t'; i++) {
+        ;
     }
     }
+    p += i;
     /* 改行かタブまでの文字列を取得 */
     /* 「'」で囲まれた文字列に含まれる場合があるため、空白は無視 */
     if((i = strcspn(p, "\t\n")) > 0) {
     /* 改行かタブまでの文字列を取得 */
     /* 「'」で囲まれた文字列に含まれる場合があるため、空白は無視 */
     if((i = strcspn(p, "\t\n")) > 0) {
-        p[i] = '\0';
-        cmdl->opd = opdtok(p);
+        cmdl->opd = opdtok(strndup_chk(p, i, "cmdl->opd"));
     } else {
     } else {
-        cmdl->opd = malloc_chk(sizeof(OPD), "cmdl.opd");
+        cmdl->opd = malloc_chk(sizeof(OPD), "cmdl->opd");
         cmdl->opd->opdc = 0;
     }
 linetokfin:
         cmdl->opd->opdc = 0;
     }
 linetokfin: