X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ftoken.c;h=457ca8f5f6f2ddb7a29e02ec573e4d3090e40288;hb=8365c3016d2564c0498d2dc21300b1bff57e929b;hp=de29fafdad36fd8e4730a2cfe1af111413c0334c;hpb=4a1d361916c660b63611a40520eaf7c78788f123;p=YACASL2.git diff --git a/src/token.c b/src/token.c index de29faf..457ca8f 100644 --- a/src/token.c +++ b/src/token.c @@ -4,9 +4,17 @@ #include "cmem.h" #include "assemble.h" +/** + * @brief 「,」区切りの文字列から、オペランドのトークンを取得 + * + * @return オペランドのトークン + * + * @param *str 「,」区切りの文字列 + */ +OPD *opdtok(const char *str); /** - * 行トークン取得のエラー定義 + * @brief 行トークン取得のエラー定義 */ CERR cerr_linetok[] = { { 104, "label length is too long" }, @@ -14,7 +22,7 @@ CERR cerr_linetok[] = { }; /** - * オペランドトークン取得のエラー定義 + * @brief オペランドトークン取得のエラー定義 */ static CERR cerr_opdtok[] = { { 117, "operand too many in DC" }, @@ -23,18 +31,6 @@ static CERR cerr_opdtok[] = { { 123, "unclosed quote" }, }; -/** - * オペランドトークン取得のエラーを追加 - */ -void addcerrlist_tok() -{ - addcerrlist(ARRAYSIZE(cerr_linetok), cerr_linetok); - addcerrlist(ARRAYSIZE(cerr_opdtok), cerr_opdtok); -} - -/** - * 「,」区切りの文字列から、オペランドのトークンを取得 - */ OPD *opdtok(const char *str) { OPD *opd = malloc_chk(sizeof(OPD), "opd"); @@ -50,41 +46,41 @@ OPD *opdtok(const char *str) do { /* オペランド数が多すぎる場合はエラー */ if(opd->opdc >= OPDSIZE) { - setcerr(117, NULL); /* operand is too many */ + setcerr(117, ""); /* operand is too many */ break; } /* 先頭が等号(=)の場合 */ - if(*r == '=') { + if(r[0] == '=') { r++; } /* 「'」の場合 */ - if(*r == '\'') { + if(r[0] == '\'') { /* 「''」以外の場合はquote値を反転 */ - if(*(r+1) != '\'' && !(q < r && *(r-1) == '\'')) { + if(r[1] != '\'' && !(q < r && r[-1] == '\'')) { quoting = !quoting; } /* 文字列の長さを数える。「'」の場合は数えない */ - if(*(r+1) != '\'') { + if(r[1] != '\'') { rcnt++; } } if(quoting == true) { /* 閉じ「'」がないまま文字列が終了した場合 */ - if(*r == '\0') { + if(!r[0]) { setcerr(123, str); /* unclosed quote */ break; } r++; } else { sepp = r + strcspn(r, ", "); - sepc = *sepp; - *sepp = '\0'; - if(*q == '\0') { - setcerr(121, NULL); /* cannot get operand token */ + sepc = sepp[0]; + strcpy(sepp, ""); + if(!q[0]) { + setcerr(121, ""); /* cannot get operand token */ break; } if(strlen(q) - rcnt > OPDSIZE) { - setcerr(118, NULL); /* operand length is too long */ + setcerr(118, ""); /* operand length too long */ break; } opd->opdv[(++opd->opdc)-1] = strdup_chk(q, "opd.opdv[]"); @@ -96,67 +92,75 @@ OPD *opdtok(const char *str) return opd; } -/** - * 空白またはタブで区切られた1行から、トークンを取得する - */ +/* assemble.hで定義された関数群 */ +void addcerrlist_tok() +{ + addcerrlist(ARRAYSIZE(cerr_linetok), cerr_linetok); + addcerrlist(ARRAYSIZE(cerr_opdtok), cerr_opdtok); +} + CMDLINE *linetok(const char *line) { char *tokens, *p, *sepp; bool quoting = false; CMDLINE *cmdl = NULL; - if(*line == '\0') { + if(!line[0]) { return NULL; } tokens = strdup_chk(line, "tokens"); /* コメントを削除 */ - for(p = tokens; *p != '\0'; p++) { + for(p = tokens; p[0]; p++) { /* 「'」で囲まれた文字列の処理。「''」は無視 */ - if(*p == '\'' && *(p+1) != '\'' && !(p > tokens && *(p-1) == '\'')) { + if(p[0] == '\'' && p[1] != '\'' && !(p > tokens && p[-1] == '\'')) { quoting = !quoting; - } else if(quoting == false && *p == ';') { - *p = '\0'; + } else if(quoting == false && p[0] == ';') { + strcpy(p, ""); break; } } - if(*tokens != '\0') { + if(tokens[0] && tokens[0] != '\n') { 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; + strcpy(cmdl->label, ""); } else { /* ラベルを取得 */ - *sepp = '\0'; + strcpy(sepp, ""); /* 文字列が長すぎる場合はエラー */ 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; } /* ラベルと命令の間の空白をスキップ */ - while(*p == ' ' || *p == '\t') { + while(p[0] == ' ' || p[0] == '\t') { p++; } /* 命令とオペランドの取得 */ - if(*p == '\n' || *p == '\0') { /* 命令がない場合は、終了 */ - if(cmdl->label != NULL) { /* ラベルが定義されていて命令がない場合はエラー */ - setcerr(105, NULL); /* no command in the line */ + if(!p[0] || p[0] == '\n') { /* 命令がない場合は、終了 */ + if(cmdl->label) { /* ラベルが定義されていて命令がない場合はエラー */ + setcerr(105, ""); /* no command in the line */ } + FREE(cmdl->label); + FREE(cmdl); } else { /* 命令の取得 */ sepp = p + strcspn(p, " \t\n"); - *sepp = '\0'; + strcpy(sepp, ""); cmdl->cmd = strdup_chk(p, "cmdl.cmd"); p = sepp + 1; /* 命令とオペランドの間の空白をスキップ */ - while(*p == ' ' || *p == '\t') { + while(p[0] == ' ' || p[0] == '\t') { p++; } /* 改行かタブまでの文字列を取得 */ /* 「'」で囲まれた文字列に含まれる場合があるため、空白は無視 */ if((sepp = p + strcspn(p, "\t\n")) > p) { - *sepp = '\0'; + strcpy(sepp, ""); cmdl->opd = opdtok(p); } else { cmdl->opd = malloc_chk(sizeof(OPD), "cmdl.opd");