X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Ftoken.c;h=95df50f66e00347bf0dab10835b30ca22d16218d;hp=984fc5a9afd7ac61fd412c1d1a9d6eb8d5e91f03;hb=7fbde1700bbe9d8f779033ad3b842d3dceb3e1c6;hpb=b90798d778c10ee358a852e4b8e69fd494bcf10f diff --git a/src/token.c b/src/token.c index 984fc5a..95df50f 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"); @@ -84,7 +80,7 @@ OPD *opdtok(const char *str) break; } if(strlen(q) - rcnt > OPDSIZE) { - setcerr(118, ""); /* operand length is too long */ + setcerr(118, ""); /* operand length too long */ break; } opd->opdv[(++opd->opdc)-1] = strdup_chk(q, "opd.opdv[]"); @@ -96,9 +92,13 @@ 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; @@ -125,14 +125,15 @@ CMDLINE *linetok(const char *line) cmdl->label = malloc_chk(LABELSIZE + 1, "cmdl.label"); /* ラベルの取得。行の先頭が空白またはタブの場合、ラベルは空 */ if((sepp = p + strcspn(p, " \t\n")) == p){ - cmdl->label = '\0'; + *(cmdl->label) = '\0'; } else { /* ラベルを取得 */ *sepp = '\0'; /* 文字列が長すぎる場合はエラー */ if(strlen(p) > LABELSIZE) { setcerr(104, p); /* label length is too long */ + } else { + strcpy(cmdl->label, p); } - strcpy(cmdl->label, p); p = sepp + 1; } /* ラベルと命令の間の空白をスキップ */ @@ -141,9 +142,10 @@ CMDLINE *linetok(const char *line) } /* 命令とオペランドの取得 */ if(*p == '\n' || *p == '\0') { /* 命令がない場合は、終了 */ - if(cmdl->label != '\0') { /* ラベルが定義されていて命令がない場合はエラー */ + if(*(cmdl->label) != '\0') { /* ラベルが定義されていて命令がない場合はエラー */ setcerr(105, ""); /* no command in the line */ } + FREE(cmdl->label); FREE(cmdl); } else { /* 命令の取得 */