バージョンアップ
[YACASL2.git] / src / monitor.c
index ec24645..d923771 100644 (file)
@@ -24,7 +24,7 @@ unsigned adrhash(WORD adr)
 
 bool getbps(WORD adr)
 {
-    BPSLIST *p;
+    BPSLIST *p = NULL;
 
     for(p = bps[adrhash(adr)]; p != NULL; p = p->next) {
         if(p->adr == adr) {
@@ -36,8 +36,8 @@ bool getbps(WORD adr)
 
 bool addbps(WORD adr)
 {
-    BPSLIST *p;
-    unsigned h;
+    BPSLIST *p = NULL;
+    unsigned h = 0;
 
     /* 登録されたラベルを検索。すでに登録されている場合は終了 */
     if(getbps(adr) == true) {
@@ -56,8 +56,9 @@ bool addbps(WORD adr)
 
 bool delbps(WORD adr)
 {
-    BPSLIST *p, *q;
-    unsigned h;
+    BPSLIST *p = NULL;
+    BPSLIST *q = NULL;
+    unsigned h = 0;
     bool res = false;
 
     p = bps[h = adrhash(adr)];
@@ -88,7 +89,7 @@ bool delbps(WORD adr)
 void listbps()
 {
     int i, cnt = 0;
-    BPSLIST *p;
+    BPSLIST *p = NULL;
 
     fprintf(stdout, "List of breakpoints\n");
     for(i = 0; i < BPSTABSIZE; i++) {
@@ -104,7 +105,8 @@ void listbps()
 
 void freebpslist(BPSLIST *head)
 {
-    BPSLIST *p, *q;
+    BPSLIST *p = NULL;
+    BPSLIST *q = NULL;
     for(p = head; p != NULL; p = q) {
         q = p->next;
         FREE(p);
@@ -113,8 +115,7 @@ void freebpslist(BPSLIST *head)
 
 void freebps()
 {
-    int i;
-    for(i = 0; i < BPSTABSIZE; i++) {
+    for(int i = 0; i < BPSTABSIZE; i++) {
         freebpslist(bps[i]);
         bps[i] = NULL;
     }
@@ -123,8 +124,9 @@ void freebps()
 MONARGS *monargstok(const char *str)
 {
     MONARGS *args = malloc_chk(sizeof(MONARGS), "args");
-    char *tok, *p, sepc = ' ';
-    int i = 0;
+    char *tok = NULL;
+    char *p = NULL;
+    char sepc = ' ';
 
     args->argc = 0;
     if(!str || !str[0]) {
@@ -132,11 +134,10 @@ MONARGS *monargstok(const char *str)
     }
     tok = p = strdup_chk(str, "argstok.p");
     do {
-        i = strcspn(p, " ");
+        int i = strcspn(p, " ");
         sepc = p[i];
         args->argv[(args->argc)++] = strndup_chk(p, i, "args->argv[]");
         p += i + 1;
-        i = 0;
     } while(sepc == ' ');
     FREE(tok);
     return args;
@@ -144,25 +145,31 @@ MONARGS *monargstok(const char *str)
 
 MONCMDLINE *monlinetok(const char *line)
 {
-    char *tokens, *p;
-    long l;
+    char *tokens = NULL;
+    char *p = NULL;
+    int i = 0;
     MONCMDLINE *moncmdl = NULL;
 
     if(!line[0] || line[0] == '\n') {
         return NULL;
     }
     p = tokens = strdup_chk(line, "tokens");
+    /* コメントを削除 */
+    strip_casl2_comment(p);
+    /* 文字列末尾の改行と空白を削除 */
+    strip_end(p);
+
     moncmdl = malloc_chk(sizeof(MONCMDLINE), "moncmdl");
     /* コマンドの取得 */
-    moncmdl->cmd = malloc_chk((l = strcspn(p, " \t\n")) + 1, "moncmdl.cmd");
-    strncpy(moncmdl->cmd, p, l);
+    i = strcspn(p, " \t\n");
+    moncmdl->cmd = strndup_chk(p, i, "moncmdl->cmd");
     /* コマンドと引数の間の空白をスキップ */
-    p += l;
+    p += i;
     while(*p == ' ' || *p == '\t') {
         p++;
     }
     /* 引数として、改行までの文字列を取得 */
-    if((l = strcspn(p, "\n")) > 0) {
+    if(strcspn(p, "\n") > 0) {
         moncmdl->args = monargstok(p);
     } else {
         moncmdl->args = malloc_chk(sizeof(MONARGS), "moncmdl.args");
@@ -365,35 +372,42 @@ void free_moncmdline(MONCMDLINE *moncmdl)
     }
 }
 
+int monquit()
+{
+    int stat = 0;
+    shutdown();
+    freebps();
+    free_cmdtable(HASH_CMDTYPE);
+    free_cmdtable(HASH_CODE);
+    if(cerr->num > 0) {
+        stat = 1;
+    }
+    freecerr();
+    return stat;
+}
+
 void monitor()
 {
     char *buf = NULL;
-    int i;
-    MONCMDLINE *moncmdl;
+    MONCMDLINE *moncmdl = NULL;
     MONCMDTYPE cmdtype = MONREPEAT;
 
     do {
         fprintf(stdout, "%s ", monitor_prompt);
         buf = malloc_chk(MONINSIZE + 1, "monitor.buf");
         fgets(buf, MONINSIZE, stdin);
-        fprintf(stdout, "%s", buf);
         if(!buf[0]) {
             cmdtype = MONQUIT;
         }
-        if((i = strcspn(buf, "\n")) > 0 || buf[0] == '\n') {
-            buf[i] = '\0';
-        }
+        strip_end(buf);        /* 文字列末尾の改行と空白を削除 */
+        fprintf(stdout, "%s\n", buf);
         if((moncmdl = monlinetok(buf)) != NULL) {
             cmdtype = monitorcmd(moncmdl->cmd, moncmdl->args);
             free_moncmdline(moncmdl);
         }
         FREE(buf);
         if(cmdtype == MONQUIT) {
-            shutdown();
-            freebps();
-            free_cmdtable(HASH_CODE);
-            freecerr();
-            exit(0);
+            exit(monquit());
         }
     } while(cmdtype == MONREPEAT);
 }