Update to the model name search function:

A model name is any token not being a true ngspice number,
except for tokens with some prohibited front characters
{*^@\\\' .
This commit is contained in:
Holger Vogt 2017-11-19 14:24:43 +01:00
parent 66439eb2f7
commit 78ab9c477b
1 changed files with 69 additions and 15 deletions

View File

@ -1809,31 +1809,85 @@ get_adevice_model_name(char *line)
/*
* FIXME, this is a mere hack of the worst kind
* to distinguish modelname tokens from other tokens
* by a simple comparison for well known discrete device name patterns
* To distinguish modelname tokens from other tokens
* by checking if token is not a valid ngspice number
*/
static int
is_a_modelname(const char *s)
{
char *st;
/* first character of model name is character from alphabet */
if (isalpha_c(s[0]))
return TRUE;
/* first characters not allowed in model name (including '\0')*/
if (strchr("{*^@\\\'", s[0]))
return FALSE;
/* not beeing a valid number */
if (strtod(s, &st))
/* test if we have a true number */
if (*st == '\0' || isspace(*st))
return FALSE;
else {
/* look for the scale factor (alphabetic) and skip it.
* INPevaluate will not do it because is does not swallow
* the scale factor from the string.
*/
switch (*st) {
case 't':
case 'T':
case 'g':
case 'G':
case 'k':
case 'K':
case 'u':
case 'U':
case 'n':
case 'N':
case 'p':
case 'P':
case 'f':
case 'F':
st = st + 1;
break;
case 'm':
case 'M':
if (((st[1] == 'E') || (st[1] == 'e')) &&
((st[2] == 'G') || (st[2] == 'g')))
{
st = st + 3; /* Meg */
}
else if (((st[1] == 'I') || (st[1] == 'i')) &&
((st[2] == 'L') || (st[2] == 'l')))
{
st = st + 3; /* Mil */
}
else {
st = st + 1; /* m, milli */
}
break;
default:
break;
}
/* test if we have a true scale factor */
if (*st == '\0' || isspace(*st))
return FALSE;
/* e.g. 1N4002, but do not accept floats (for example 1E2) */
if (isdigit_c(s[0]) && isalpha_c(s[1]) && isdigit_c(s[2]) && toupper_c(s[1]) != 'E')
return TRUE;
/* test if people use Ohms, F, H for RLC, like pF or uOhms */
if (ciprefix("ohms", st))
st = st + 4;
else if (ciprefix("farad", st))
st = st + 5;
else if (ciprefix("henry", st))
st = st + 5;
else if ((*st == 'f') || (*st == 'h'))
st = st + 1;
/* e.g. 2SK456 */
if (isdigit_c(s[0]) && isalpha_c(s[1]) && isalpha_c(s[2]) && isdigit_c(s[3]))
return TRUE;
if (*st == '\0' || isspace(*st))
return FALSE;
}
/* e.g. 1SMB4148 */
if (isdigit_c(s[0]) && isalpha_c(s[1]) && isalpha_c(s[2]) && isalpha_c(s[3]) && isdigit_c(s[4]))
return TRUE;
return FALSE;
/* token starts with non alphanum character */
return TRUE;
}