|
@@ -781,6 +781,25 @@ int pevent_peek_char(void)
|
|
|
return __peek_char();
|
|
|
}
|
|
|
|
|
|
+static int extend_token(char **tok, char *buf, int size)
|
|
|
+{
|
|
|
+ char *newtok = realloc(*tok, size);
|
|
|
+
|
|
|
+ if (!newtok) {
|
|
|
+ free(*tok);
|
|
|
+ *tok = NULL;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!*tok)
|
|
|
+ strcpy(newtok, buf);
|
|
|
+ else
|
|
|
+ strcat(newtok, buf);
|
|
|
+ *tok = newtok;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static enum event_type force_token(const char *str, char **tok);
|
|
|
|
|
|
static enum event_type __read_token(char **tok)
|
|
@@ -865,17 +884,10 @@ static enum event_type __read_token(char **tok)
|
|
|
do {
|
|
|
if (i == (BUFSIZ - 1)) {
|
|
|
buf[i] = 0;
|
|
|
- if (*tok) {
|
|
|
- *tok = realloc(*tok, tok_size + BUFSIZ);
|
|
|
- if (!*tok)
|
|
|
- return EVENT_NONE;
|
|
|
- strcat(*tok, buf);
|
|
|
- } else
|
|
|
- *tok = strdup(buf);
|
|
|
+ tok_size += BUFSIZ;
|
|
|
|
|
|
- if (!*tok)
|
|
|
+ if (extend_token(tok, buf, tok_size) < 0)
|
|
|
return EVENT_NONE;
|
|
|
- tok_size += BUFSIZ;
|
|
|
i = 0;
|
|
|
}
|
|
|
last_ch = ch;
|
|
@@ -914,17 +926,10 @@ static enum event_type __read_token(char **tok)
|
|
|
while (get_type(__peek_char()) == type) {
|
|
|
if (i == (BUFSIZ - 1)) {
|
|
|
buf[i] = 0;
|
|
|
- if (*tok) {
|
|
|
- *tok = realloc(*tok, tok_size + BUFSIZ);
|
|
|
- if (!*tok)
|
|
|
- return EVENT_NONE;
|
|
|
- strcat(*tok, buf);
|
|
|
- } else
|
|
|
- *tok = strdup(buf);
|
|
|
+ tok_size += BUFSIZ;
|
|
|
|
|
|
- if (!*tok)
|
|
|
+ if (extend_token(tok, buf, tok_size) < 0)
|
|
|
return EVENT_NONE;
|
|
|
- tok_size += BUFSIZ;
|
|
|
i = 0;
|
|
|
}
|
|
|
ch = __read_char();
|
|
@@ -933,14 +938,7 @@ static enum event_type __read_token(char **tok)
|
|
|
|
|
|
out:
|
|
|
buf[i] = 0;
|
|
|
- if (*tok) {
|
|
|
- *tok = realloc(*tok, tok_size + i);
|
|
|
- if (!*tok)
|
|
|
- return EVENT_NONE;
|
|
|
- strcat(*tok, buf);
|
|
|
- } else
|
|
|
- *tok = strdup(buf);
|
|
|
- if (!*tok)
|
|
|
+ if (extend_token(tok, buf, tok_size + i + 1) < 0)
|
|
|
return EVENT_NONE;
|
|
|
|
|
|
if (type == EVENT_ITEM) {
|