add a new function gettok_model to consider {...} expressions

in VDMOS .model statements
This commit is contained in:
Holger Vogt 2019-04-13 12:42:55 +02:00
parent 263ea850ad
commit 32d6519f09
3 changed files with 39 additions and 1 deletions

View File

@ -6645,7 +6645,7 @@ inp_vdmos_model(struct card *deck)
cut_line = cut_line + 1;
new_line = NULL;
while (cut_line && *cut_line) {
token = gettok_noparens(&cut_line);
token = gettok_model(&cut_line);
if (!ciprefix("pchan", token) && !ciprefix("ron=", token) && !ciprefix("vds=", token) &&
!ciprefix("qg=", token) && !ciprefix("mfg=", token) && !ciprefix("nchan", token))
wl_append_word(NULL, &wl, token);

View File

@ -241,6 +241,7 @@ extern char *gettok_noparens(char **s);
extern char *gettok_node(char **s);
extern char *gettok_iv(char **s);
extern char *nexttok(const char *s);
extern char *gettok_model(char **s);
extern int get_l_paren(char **s);
extern int get_r_paren(char **s);

View File

@ -413,6 +413,43 @@ gettok_noparens(char **s)
return copy_substring(token, token_e);
}
/*-------------------------------------------------------------------------*
* gettok_model acts like gettok_noparens, however when it encounters a '{',
* it searches for the corresponding '}' and adds the string to the output
* token.
*-------------------------------------------------------------------------*/
char *
gettok_model(char **s)
{
char c;
const char *token, *token_e;
*s = skip_ws(*s);
if (!**s)
return NULL; /* return NULL if we come to end of line */
token = *s;
while ((c = **s) != '\0' &&
!isspace_c(c) &&
(**s != '(') &&
(**s != ')') &&
(**s != ',')
) {
(*s)++;
if (**s == '{') {
char *tmpstr = gettok_char(s, '}', FALSE, TRUE);
tfree(tmpstr);
}
}
token_e = *s;
*s = skip_ws(*s);
return copy_substring(token, token_e);
}
char *
gettok_instance(char **s)