トークン取得のルーチンを修正
authorj8takagi <j8takagi@nifty.com>
Tue, 26 Apr 2011 15:20:54 +0000 (00:20 +0900)
committerj8takagi <j8takagi@nifty.com>
Tue, 26 Apr 2011 15:20:54 +0000 (00:20 +0900)
include/struct.h
src/token.c

index e862786..05ff5f9 100644 (file)
@@ -47,42 +47,37 @@ extern SYSTEM *sys;
 
 /**
  * COMET II 命令
 
 /**
  * COMET II 命令
- * 命令タイプは、オペランドにより6種類に分類
+ * 命令タイプは、オペランドにより5種類に分類
  */
 typedef enum {
     /**
  */
 typedef enum {
     /**
-     *  オペランド数2または3。命令語長2
-     *     第1オペランド: 汎用レジスタ
-     *     第2オペランド: アドレス
-     *     第3オペランド: 指標レジスタ
+     *  オペランド数2または3
+     *  - 第1オペランド: 汎用レジスタ。必須
+     *  - 第2オペランド: アドレス。必須
+     *  - 第3オペランド: 指標レジスタとして用いる汎用レジスタ。任意
      */
      */
-    R_ADR_X = 010,
+    R_ADR_X = 01,
     /**
     /**
-     *  オペランド数2または3。。命令語長2
-     *     第1オペランド: 汎用レジスタ
-     *     第2オペランド: アドレスに格納されている内容
-     *     第3オペランド: 指標レジスタ
+     *  オペランド数2
+     *  - 第1オペランド: 汎用レジスタ。必須
+     *  - 第2オペランド: 汎用レジスタ。必須
      */
      */
-    R1_R2 = 020,
+    R1_R2 = 02,
     /**
     /**
-     * オペランド数1または2。命令語長1
-     *     第1オペランド: アドレス
-     *     第2オペランド: 指標レジスタ
+     * オペランド数1または2
+     * - 第1オペランド: アドレス。必須
+     * - 第2オペランド: 指標レジスタとして用いる汎用レジスタ。任意
      */
      */
-    ADR_X = 030,
+    ADR_X = 03,
     /**
     /**
-     *   オペランド数1。命令語長1
-     *     第1オペランド: 汎用レジスタ
+     * オペランド数1
+     * - 第1オペランド: 汎用レジスタ。必須
      */
      */
-    R_ = 040,
+    R_ = 04,
     /**
     /**
-     *  オペランドなし。命令語長1
+     * オペランドなし
      */
      */
-    NONE = 0,
-    /**
-     *  COMET II命令以外
-     */
-    NOTCMD = 077,
+    NONE = 00,
 } CMDTYPE;
 
 /**
 } CMDTYPE;
 
 /**
index de29faf..dac982f 100644 (file)
@@ -119,7 +119,7 @@ CMDLINE *linetok(const char *line)
             break;
         }
     }
             break;
         }
     }
-    if(*tokens != '\0') {
+    if(*tokens != '\n' && *tokens != '\0') {
         p = tokens;
         cmdl = malloc_chk(sizeof(CMDLINE), "cmdl");
         /* ラベルの取得。行の先頭が空白またはタブの場合、ラベルは空 */
         p = tokens;
         cmdl = malloc_chk(sizeof(CMDLINE), "cmdl");
         /* ラベルの取得。行の先頭が空白またはタブの場合、ラベルは空 */
@@ -143,6 +143,7 @@ CMDLINE *linetok(const char *line)
             if(cmdl->label != NULL) {         /* ラベルが定義されていて命令がない場合はエラー */
                 setcerr(105, NULL);    /* no command in the line */
             }
             if(cmdl->label != NULL) {         /* ラベルが定義されていて命令がない場合はエラー */
                 setcerr(105, NULL);    /* no command in the line */
             }
+            FREE(cmdl);
         } else {
             /* 命令の取得 */
             sepp = p + strcspn(p, " \t\n");
         } else {
             /* 命令の取得 */
             sepp = p + strcspn(p, " \t\n");