numparm, cleanup parseunit() and fetchnumber()

This commit is contained in:
rlar 2011-02-19 14:37:40 +00:00
parent 7e27d6c9ac
commit 90f4a2137b
2 changed files with 38 additions and 109 deletions

View File

@ -1,3 +1,7 @@
2011-02-19 Robert Larice
* src/frontend/numparam/xpressn.c :
numparm, cleanup parseunit() and fetchnumber()
2011-02-15 Holger Vogt
* spicelib/parser/inpfindl.c:41 with MINGW level=4.00000e000
returned 3 instead of 4 at INPevaluate() line 210

View File

@ -714,42 +714,20 @@ keyword ( SPICE_DSTRINGPTR keys_p, SPICE_DSTRINGPTR tstr_p)
}
static double
parseunit (double x, char *s)
parseunit (char *s)
/* the Spice suffixes */
{
double u = 0;
SPICE_DSTRING t ;
bool isunit;
isunit = 1;
spice_dstring_init(&t) ;
pscopy (&t, s, 0, 3);
if (steq ( spice_dstring_value(&t), "MEG"))
u = 1e6;
else if (s[0] == 'G')
u = 1e9;
else if (s[0] == 'K')
u = 1e3;
else if (s[0] == 'M')
u = 0.001;
else if (s[0] == 'U')
u = 1e-6;
else if (s[0] == 'N')
u = 1e-9;
else if (s[0] == 'P')
u = 1e-12;
else if (s[0] == 'F')
u = 1e-15;
else
isunit = 0;
if (isunit)
x = x * u;
spice_dstring_free(&t) ;
return x;
switch(toupper(s[0]))
{
case 'G': return 1e9;
case 'K': return 1e3;
case 'M': return ci_prefix("MEG", s) ? 1e6 : 1e-3;
case 'U': return 1e-6;
case 'N': return 1e-9;
case 'P': return 1e-12;
case 'F': return 1e-15;
default : return 1;
}
}
static int
@ -848,91 +826,38 @@ exists (tdico * d, char *s, int *pi, bool *perror)
}
static double
fetchnumber (tdico * dico, char *s, int ls, int *pi, bool *perror)
fetchnumber (tdico * dico, char *s, int *pi, bool *perror)
/* parse a Spice number in string s */
{
bool error = *perror;
int i = *pi;
int k, err;
char d;
char *t ;
SPICE_DSTRING tstr ;
SPICE_DSTRING vstr ;
double u;
spice_dstring_init(&tstr) ;
spice_dstring_init(&vstr) ;
k = i;
int n = 0;
do
{
k++;
if (k > ls)
d = (char)(0);
else
d = s[k - 1];
}
while (!(!((d == '.') || ((d >= '0') && (d <= '9')))));
s += *pi - 1; /* broken semantic !! */
if ((d == 'e') || (d == 'E'))
{
/* exponent follows */
k++;
d = s[k - 1];
if(1 != sscanf(s, "%lG%n", &u, &n)) {
if ((d == '+') || (d == '-'))
k++;
do
{
k++;
if (k > ls)
d = (char)(0);
else
d = s[k - 1];
}
while (!(!((d >= '0') && (d <= '9'))));
}
pscopy (&tstr, s, i-1, k - i) ;
t = spice_dstring_value(&tstr) ;
if (t[0] == '.')
cins ( &tstr, '0');
else if (t[length (t) - 1] == '.')
cadd (&tstr, '0');
t = spice_dstring_value(&tstr) ;
u = rval (t, &err); /* extract real value from string here */
if (err != 0)
{
SPICE_DSTRING vstr ;
spice_dstring_init(&vstr) ;
scopys(&vstr, "Number format error: ") ;
sadd (&vstr, t);
error = message (dico, spice_dstring_value(&vstr)) ;
}
else
{
spice_dstring_reinit(&tstr);
while (alfa (d))
{
cadd (&tstr, upcase (d));
k++;
sadd (&vstr, s);
*perror = message (dico, spice_dstring_value(&vstr));
spice_dstring_free(&vstr) ;
if (k > ls)
d = Nul;
else
d = s[k - 1];
}
return 0.0; /* FIXME return NaN */
t = spice_dstring_value(&tstr) ;
u = parseunit (u, t);
}
i = k - 1;
*perror = error;
*pi = i;
spice_dstring_free(&tstr) ;
spice_dstring_free(&vstr) ;
u *= parseunit (s + n);
/* swallow unit
* FIXME `100MegBaz42' should emit an error message
* FIXME should we allow whitespace ? `100 MEG' ?
*/
while (s[n] && alfa(s[n]))
n++;
*pi += n-1; /* very broken semantic !!! */
return u;
}
@ -1349,7 +1274,7 @@ formula (tdico * dico, char *s, bool *perror)
}
else if (((c == '.') || ((c >= '0') && (c <= '9'))))
{
u = fetchnumber (dico, s, ls, &i, &error);
u = fetchnumber (dico, s, &i, &error);
if (negate)
{
u = -1 * u;