From 90f4a2137bd5ad59ca3140dddaa43f8449e5b7b7 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 19 Feb 2011 14:37:40 +0000 Subject: [PATCH] numparm, cleanup parseunit() and fetchnumber() --- ChangeLog | 4 + src/frontend/numparam/xpressn.c | 143 ++++++++------------------------ 2 files changed, 38 insertions(+), 109 deletions(-) diff --git a/ChangeLog b/ChangeLog index 787f2d282..a7f148dfa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 diff --git a/src/frontend/numparam/xpressn.c b/src/frontend/numparam/xpressn.c index 2fa35656c..b7cf45fe2 100644 --- a/src/frontend/numparam/xpressn.c +++ b/src/frontend/numparam/xpressn.c @@ -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;