Changeset View
Changeset View
Standalone View
Standalone View
contrib/ldns/parse.c
Show All 21 Lines | |||||
/* add max_limit here? */ | /* add max_limit here? */ | ||||
ssize_t | ssize_t | ||||
ldns_fget_token(FILE *f, char *token, const char *delim, size_t limit) | ldns_fget_token(FILE *f, char *token, const char *delim, size_t limit) | ||||
{ | { | ||||
return ldns_fget_token_l(f, token, delim, limit, NULL); | return ldns_fget_token_l(f, token, delim, limit, NULL); | ||||
} | } | ||||
ssize_t | ldns_status | ||||
ldns_fget_token_l(FILE *f, char *token, const char *delim, size_t limit, int *line_nr) | ldns_fget_token_l_st(FILE *f, char **token, size_t *limit, bool fixed | ||||
, const char *delim, int *line_nr) | |||||
{ | { | ||||
int c, prev_c; | int c, prev_c; | ||||
int p; /* 0 -> no parenthese seen, >0 nr of ( seen */ | int p; /* 0 -> no parentheses seen, >0 nr of ( seen */ | ||||
int com, quoted; | int com, quoted; | ||||
char *t; | char *t, *old_token; | ||||
size_t i; | size_t i; | ||||
const char *d; | const char *d; | ||||
const char *del; | const char *del; | ||||
/* standard delimeters */ | /* standard delimiters */ | ||||
if (!delim) { | if (!delim) { | ||||
/* from isspace(3) */ | /* from isspace(3) */ | ||||
del = LDNS_PARSE_NORMAL; | del = LDNS_PARSE_NORMAL; | ||||
} else { | } else { | ||||
del = delim; | del = delim; | ||||
} | } | ||||
if (!token || !limit) | |||||
return LDNS_STATUS_NULL; | |||||
if (fixed) { | |||||
if (*token == NULL || *limit == 0) | |||||
return LDNS_STATUS_NULL; | |||||
} else if (*token == NULL) { | |||||
*limit = LDNS_MAX_LINELEN; | |||||
if (!(*token = LDNS_XMALLOC(char, *limit + 1))) | |||||
return LDNS_STATUS_MEM_ERR; | |||||
} else if (*limit == 0) | |||||
return LDNS_STATUS_ERR; | |||||
p = 0; | p = 0; | ||||
i = 0; | i = 0; | ||||
com = 0; | com = 0; | ||||
quoted = 0; | quoted = 0; | ||||
prev_c = 0; | prev_c = 0; | ||||
t = token; | t = *token; | ||||
if (del[0] == '"') { | if (del[0] == '"') { | ||||
quoted = 1; | quoted = 1; | ||||
} | } | ||||
while ((c = getc(f)) != EOF) { | while ((c = getc(f)) != EOF) { | ||||
if (c == '\r') /* carriage return */ | if (c == '\r') /* carriage return */ | ||||
c = ' '; | c = ' '; | ||||
if (c == '(' && prev_c != '\\' && !quoted) { | if (c == '(' && prev_c != '\\' && !quoted) { | ||||
/* this only counts for non-comments */ | /* this only counts for non-comments */ | ||||
Show All 11 Lines | if (c == ')' && prev_c != '\\' && !quoted) { | ||||
} | } | ||||
prev_c = c; | prev_c = c; | ||||
continue; | continue; | ||||
} | } | ||||
if (p < 0) { | if (p < 0) { | ||||
/* more ) then ( - close off the string */ | /* more ) then ( - close off the string */ | ||||
*t = '\0'; | *t = '\0'; | ||||
return 0; | return i == 0 ? LDNS_STATUS_SYNTAX_EMPTY | ||||
: LDNS_STATUS_OK; | |||||
} | } | ||||
/* do something with comments ; */ | /* do something with comments ; */ | ||||
if (c == ';' && quoted == 0) { | if (c == ';' && quoted == 0) { | ||||
if (prev_c != '\\') { | if (prev_c != '\\') { | ||||
com = 1; | com = 1; | ||||
} | } | ||||
} | } | ||||
Show All 17 Lines | while ((c = getc(f)) != EOF) { | ||||
} | } | ||||
if (com == 1) { | if (com == 1) { | ||||
*t = ' '; | *t = ' '; | ||||
prev_c = c; | prev_c = c; | ||||
continue; | continue; | ||||
} | } | ||||
if (c == '\n' && p != 0 && t > token) { | if (c == '\n' && p != 0 && t > *token) { | ||||
/* in parentheses */ | /* in parentheses */ | ||||
if (line_nr) { | if (line_nr) { | ||||
*line_nr = *line_nr + 1; | *line_nr = *line_nr + 1; | ||||
} | } | ||||
if (*limit > 0 | |||||
&& (i >= *limit || (size_t)(t - *token) >= *limit)) { | |||||
if (fixed) { | |||||
*t = '\0'; | |||||
return LDNS_STATUS_SYNTAX_ERR; | |||||
} | |||||
old_token = *token; | |||||
*limit *= 2; | |||||
*token = LDNS_XREALLOC(*token, char, *limit + 1); | |||||
if (*token == NULL) { | |||||
*token = old_token; | |||||
*t = '\0'; | |||||
return LDNS_STATUS_MEM_ERR; | |||||
} | |||||
if (*token != old_token) | |||||
t = *token + (t - old_token); | |||||
} | |||||
*t++ = ' '; | *t++ = ' '; | ||||
prev_c = c; | prev_c = c; | ||||
continue; | continue; | ||||
} | } | ||||
/* check if we hit the delim */ | /* check if we hit the delim */ | ||||
for (d = del; *d; d++) { | for (d = del; *d; d++) { | ||||
if (c == *d && i > 0 && prev_c != '\\' && p == 0) { | if (c == *d && i > 0 && prev_c != '\\' && p == 0) { | ||||
if (c == '\n' && line_nr) { | if (c == '\n' && line_nr) { | ||||
*line_nr = *line_nr + 1; | *line_nr = *line_nr + 1; | ||||
} | } | ||||
goto tokenread; | goto tokenread; | ||||
} | } | ||||
} | } | ||||
if (c != '\0' && c != '\n') { | if (c != '\0' && c != '\n') { | ||||
i++; | i++; | ||||
} | } | ||||
if (limit > 0 && (i >= limit || (size_t)(t-token) >= limit)) { | if (*limit > 0 | ||||
&& (i >= *limit || (size_t)(t - *token) >= *limit)) { | |||||
if (fixed) { | |||||
*t = '\0'; | *t = '\0'; | ||||
return -1; | return LDNS_STATUS_SYNTAX_ERR; | ||||
} | } | ||||
old_token = *token; | |||||
*limit *= 2; | |||||
*token = LDNS_XREALLOC(*token, char, *limit + 1); | |||||
if (*token == NULL) { | |||||
*token = old_token; | |||||
*t = '\0'; | |||||
return LDNS_STATUS_MEM_ERR; | |||||
} | |||||
if (*token != old_token) | |||||
t = *token + (t - old_token); | |||||
} | |||||
if (c != '\0' && c != '\n') { | if (c != '\0' && c != '\n') { | ||||
*t++ = c; | *t++ = c; | ||||
} | } | ||||
if (c == '\n' && line_nr) { | |||||
*line_nr = *line_nr + 1; | |||||
} | |||||
if (c == '\\' && prev_c == '\\') | if (c == '\\' && prev_c == '\\') | ||||
prev_c = 0; | prev_c = 0; | ||||
else prev_c = c; | else prev_c = c; | ||||
} | } | ||||
*t = '\0'; | *t = '\0'; | ||||
if (c == EOF) { | if (c == EOF) { | ||||
return (ssize_t)i; | return i == 0 ? LDNS_STATUS_SYNTAX_EMPTY : LDNS_STATUS_OK; | ||||
} | } | ||||
if (i == 0) { | |||||
/* nothing read */ | |||||
return -1; | |||||
} | |||||
if (p != 0) { | if (p != 0) { | ||||
return -1; | return LDNS_STATUS_SYNTAX_ERR; | ||||
} | } | ||||
return (ssize_t)i; | return i == 0 ? LDNS_STATUS_SYNTAX_EMPTY : LDNS_STATUS_OK; | ||||
tokenread: | tokenread: | ||||
if(*del == '"') /* do not skip over quotes, they are significant */ | if(*del == '"') /* do not skip over quotes, they are significant */ | ||||
ldns_fskipcs_l(f, del+1, line_nr); | ldns_fskipcs_l(f, del+1, line_nr); | ||||
else ldns_fskipcs_l(f, del, line_nr); | else ldns_fskipcs_l(f, del, line_nr); | ||||
*t = '\0'; | *t = '\0'; | ||||
if (p != 0) { | if (p != 0) { | ||||
return -1; | return LDNS_STATUS_SYNTAX_ERR; | ||||
} | } | ||||
return i == 0 ? LDNS_STATUS_SYNTAX_EMPTY : LDNS_STATUS_OK; | |||||
} | |||||
return (ssize_t)i; | |||||
ssize_t | |||||
ldns_fget_token_l(FILE *f, char *token, const char *delim, size_t limit, int *line_nr) | |||||
{ | |||||
if (limit == 0) | |||||
limit = LDNS_MAX_LINELEN; | |||||
if (ldns_fget_token_l_st(f, &token, &limit, true, delim, line_nr)) | |||||
return -1; | |||||
else | |||||
return (ssize_t)strlen(token); | |||||
} | } | ||||
ssize_t | ssize_t | ||||
ldns_fget_keyword_data(FILE *f, const char *keyword, const char *k_del, char *data, | ldns_fget_keyword_data(FILE *f, const char *keyword, const char *k_del, char *data, | ||||
const char *d_del, size_t data_limit) | const char *d_del, size_t data_limit) | ||||
{ | { | ||||
return ldns_fget_keyword_data_l(f, keyword, k_del, data, d_del, | return ldns_fget_keyword_data_l(f, keyword, k_del, data, d_del, | ||||
data_limit, NULL); | data_limit, NULL); | ||||
Show All 33 Lines | ldns_fget_keyword_data_l(FILE *f, const char *keyword, const char *k_del, char *data, | ||||
} | } | ||||
} | } | ||||
ssize_t | ssize_t | ||||
ldns_bget_token(ldns_buffer *b, char *token, const char *delim, size_t limit) | ldns_bget_token(ldns_buffer *b, char *token, const char *delim, size_t limit) | ||||
{ | { | ||||
int c, lc; | int c, lc; | ||||
int p; /* 0 -> no parenthese seen, >0 nr of ( seen */ | int p; /* 0 -> no parentheses seen, >0 nr of ( seen */ | ||||
int com, quoted; | int com, quoted; | ||||
char *t; | char *t; | ||||
size_t i; | size_t i; | ||||
const char *d; | const char *d; | ||||
const char *del; | const char *del; | ||||
/* standard delimiters */ | /* standard delimiters */ | ||||
if (!delim) { | if (!delim) { | ||||
▲ Show 20 Lines • Show All 204 Lines • Show Last 20 Lines |