Valgrindで判明したメモリーに関する問題を修正
[YACASL2.git] / src / token.c
index fb35c8b..713a61f 100644 (file)
@@ -122,16 +122,18 @@ CMDLINE *linetok(const char *line)
     if(*tokens != '\n' && *tokens != '\0') {
         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 = NULL;
+            *(cmdl->label) = '\0';
         } else {        /* ラベルを取得 */
             *sepp = '\0';
             /* 文字列が長すぎる場合はエラー */
             if(strlen(p) > LABELSIZE) {
                 setcerr(104, p);    /* label length is too long */
+            } else {
+                strcpy(cmdl->label, p);
             }
-            cmdl->label = strdup_chk(p, "cmdl.label");
             p = sepp + 1;
         }
         /* ラベルと命令の間の空白をスキップ */
@@ -140,9 +142,10 @@ CMDLINE *linetok(const char *line)
         }
         /* 命令とオペランドの取得 */
         if(*p == '\n' || *p == '\0') {        /* 命令がない場合は、終了 */
-            if(cmdl->label != NULL) {         /* ラベルが定義されていて命令がない場合はエラー */
+            if(*(cmdl->label) != '\0') {      /* ラベルが定義されていて命令がない場合はエラー */
                 setcerr(105, "");    /* no command in the line */
             }
+            FREE(cmdl->label);
             FREE(cmdl);
         } else {
             /* 命令の取得 */