Add a new function char* gettok_np(char** s)
which finds a token, while scanning over (), like they were white spaces. It also proceeds with s while still finding (), (which gettok_noparens does not do).
This commit is contained in:
parent
975ea03308
commit
86dedbd1f5
|
|
@ -55,6 +55,7 @@ size_t get_substring_matches(size_t n_char_pattern, const char *p_pattern,
|
||||||
char *gettok(char **s);
|
char *gettok(char **s);
|
||||||
char *gettok_char(char **s, char p, bool inc_p, bool nested);
|
char *gettok_char(char **s, char p, bool inc_p, bool nested);
|
||||||
char *gettok_instance(char **);
|
char *gettok_instance(char **);
|
||||||
|
char *gettok_np(char **);
|
||||||
bool has_escape_or_quote(size_t n, const char *str);
|
bool has_escape_or_quote(size_t n, const char *str);
|
||||||
bool is_arith_char(char c);
|
bool is_arith_char(char c);
|
||||||
bool isquote(char ch);
|
bool isquote(char ch);
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,8 @@ static inline const char *next_substr(
|
||||||
const size_t msb_factor, const size_t h_pattern, size_t *p_h_string);
|
const size_t msb_factor, const size_t h_pattern, size_t *p_h_string);
|
||||||
static bool can_overlap(size_t n_char_pattern, const char * const p_pattern);
|
static bool can_overlap(size_t n_char_pattern, const char * const p_pattern);
|
||||||
|
|
||||||
|
static void findtok_np(char** p_str, char** p_token, char** p_token_end);
|
||||||
|
|
||||||
|
|
||||||
/* This function returns true if the string s begins with the
|
/* This function returns true if the string s begins with the
|
||||||
* string p and false otherwise. */
|
* string p and false otherwise. */
|
||||||
|
|
@ -454,7 +456,7 @@ nexttok(const char *s)
|
||||||
* nexttok skips over whitespaces and the next token in s
|
* nexttok skips over whitespaces and the next token in s
|
||||||
* returns NULL if there is nothing left to skip.
|
* returns NULL if there is nothing left to skip.
|
||||||
* It replaces constructs like txfree(gettok(&actstring)) by
|
* It replaces constructs like txfree(gettok(&actstring)) by
|
||||||
* actstring = nexttok(actstring). This is derived from the gettok_noparens version.
|
* actstring = nexttok(actstring). This is derived from the gettok_np version.
|
||||||
* It acts like gettok, except that it treats parens and commas like
|
* It acts like gettok, except that it treats parens and commas like
|
||||||
* whitespace.
|
* whitespace.
|
||||||
*-------------------------------------------------------------------------*/
|
*-------------------------------------------------------------------------*/
|
||||||
|
|
@ -606,6 +608,60 @@ char *gettok_noparens(char **s)
|
||||||
} /* end of function gettok_noparens */
|
} /* end of function gettok_noparens */
|
||||||
|
|
||||||
|
|
||||||
|
/* findtok_np() does the string scanning for gettok_np() but
|
||||||
|
* does not allocate a token. It skips over all white spaces, ',', '('and ')' */
|
||||||
|
static
|
||||||
|
void findtok_np(char** p_str, char** p_token, char** p_token_end)
|
||||||
|
{
|
||||||
|
char* str = *p_str;
|
||||||
|
|
||||||
|
while (isspace_c(*str) || *str == ',' || *str == '(' || *str == ')')
|
||||||
|
str++;
|
||||||
|
|
||||||
|
if (!*str) {
|
||||||
|
*p_str = str;
|
||||||
|
*p_token = (char*)NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*p_token = str; /* Token starts after whitespace */
|
||||||
|
{
|
||||||
|
char c;
|
||||||
|
while ((c = *str) != '\0' &&
|
||||||
|
!isspace_c(c) &&
|
||||||
|
(c != '(') &&
|
||||||
|
(c != ')') &&
|
||||||
|
(c != ',')
|
||||||
|
) {
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*p_token_end = str;
|
||||||
|
|
||||||
|
while (isspace_c(*str) || *str == ',' || *str == '(' || *str == ')')
|
||||||
|
str++;
|
||||||
|
|
||||||
|
*p_str = str;
|
||||||
|
} /* end of function findtok_noparen */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------*
|
||||||
|
* gettok_np acts like gettok, except that it treats parens and commas like
|
||||||
|
* whitespace. That is, it stops parsing and returns when it finds one of
|
||||||
|
* those chars. It then moves s beyond all white spaces, ',', '('and ')'.
|
||||||
|
*-------------------------------------------------------------------------*/
|
||||||
|
char* gettok_np(char** s)
|
||||||
|
{
|
||||||
|
char* token, * token_e;
|
||||||
|
findtok_np(s, &token, &token_e);
|
||||||
|
if (token == (char*)NULL) {
|
||||||
|
return (char*)NULL; /* return NULL if we come to end of line */
|
||||||
|
}
|
||||||
|
|
||||||
|
return copy_substring(token, token_e);
|
||||||
|
} /* end of function gettok_noparens */
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*
|
/*-------------------------------------------------------------------------*
|
||||||
* gettok_model acts like gettok_noparens, however when it encounters a '{',
|
* gettok_model acts like gettok_noparens, however when it encounters a '{',
|
||||||
* it searches for the corresponding '}' and adds the string to the output
|
* it searches for the corresponding '}' and adds the string to the output
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue