X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Ftoken.c;h=e8b630b0753ca6ac0542017a9568bdb0784ab6ae;hp=54ebf3f9cea53e762976694d78461ac2d50e182b;hb=4ee27a568fb9222907a566e59aaefe248f08a8e4;hpb=f3433b11c1e3a2ec3d6f7b332afa5cf5f69dc360 diff --git a/src/token.c b/src/token.c index 54ebf3f..e8b630b 100644 --- a/src/token.c +++ b/src/token.c @@ -4,9 +4,9 @@ /* 「,」区切りの文字列から、オペランドのトークンを取得 */ OPD *opdtok(const char *str) { - OPD *opd = malloc(sizeof(OPD)); + OPD *opd = malloc_chk(sizeof(OPD), "opd"); char *p, *q, *sepp; - int sepc = ',', len; + int sepc = ',', qcnt = 0; bool quoting = false; opd->opdc = 0; @@ -15,10 +15,9 @@ OPD *opdtok(const char *str) } p = q = strdup(str); do { - len = 0; /* オペランド数が多すぎる場合はエラー */ if(opd->opdc >= OPDSIZE) { - setcerr(117, str); /* operand is too many */ + setcerr(117, NULL); /* operand is too many */ break; } /* 先頭が「=」の場合の処理 */ @@ -33,7 +32,7 @@ OPD *opdtok(const char *str) } /* 「'」の分、文字列の長さを小さくする */ if(*(q+1) != '\'') { - len--; + qcnt++; } } if(quoting == true) { @@ -51,13 +50,13 @@ OPD *opdtok(const char *str) setcerr(121, NULL); /* cannot get operand token */ break; } - len += strlen(p); - if(len > OPDSIZE) { + if(strlen(p) - qcnt > OPDSIZE) { setcerr(118, NULL); /* operand length is too long */ break; } opd->opdv[(++opd->opdc)-1] = strdup(p); p = q = sepp + 1; + qcnt = 0; } } while(sepc == ','); return opd; @@ -68,7 +67,7 @@ CMDLINE *linetok(const char *line) { char *tokens, *p, *sepp; bool quoting = false; - CMDLINE *cmdl = malloc(sizeof(CMDLINE)); + CMDLINE *cmdl = malloc_chk(sizeof(CMDLINE), "cmdl"); if(line == NULL || strlen(line) == 0) { return NULL; @@ -120,7 +119,7 @@ CMDLINE *linetok(const char *line) p++; } /* オペランドを取得 */ - cmdl->opd = malloc(sizeof(OPD)); + cmdl->opd = malloc_chk(sizeof(OPD), "cmdl->opd"); /* 改行かタブまでの文字列を取得。 「'」で囲まれた文字列に含まれる場合があるため、空白は無視 */ if((sepp = p + strcspn(p, "\t\n")) > p) {