aboutsummaryrefslogtreecommitdiffstats
path: root/cad/spice/files/patch-src_lib_inp_inpgtok_c
blob: 29bce2b1f7b7c48a1274316330c30e911844f526 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
--- src/lib/inp/inpgtok.c.orig  2010-02-09 15:39:09.000000000 +0000
+++ src/lib/inp/inpgtok.c   2010-02-09 15:43:10.000000000 +0000
@@ -27,6 +27,7 @@
    int gobble; /* eat non-whitespace trash AFTER token? */
 {
     char * point;
+    int signstate;
 
     /* scan along throwing away garbage characters */
     for(point = *line;*point != '\0' ; point++ ) {
@@ -41,6 +42,7 @@
     /* mark beginning of token */
     *line = point;
     /* now find all good characters */
+    signstate = 0;
     for(point = *line;*point!='\0';point++) {
         if(*point == ' ') break;
         if(*point == '\t') break;
@@ -48,6 +50,22 @@
         if(*point == '(') break;
         if(*point == ')') break;
         if(*point == ',') break;
+       /* This is not complex enough to catch all errors, but it will
+          get the "good" parses */
+   if(*point == '+' && (signstate == 1 || signstate == 3)) break;
+   if(*point == '-' && (signstate == 1 || signstate == 3)) break;
+   if(*point == '*') break;
+   if(*point == '/') break;
+   if(*point == '^') break;
+   if (isdigit(*point) || *point == '.') {
+       if (signstate > 1)                              
+           signstate = 3;
+       else
+           signstate = 1;
+   } else if (tolower(*point) == 'e' && signstate == 1)
+       signstate = 2;
+   else
+       signstate = 3;
     }
     if (point == *line && *point)  /* Weird items, 1 char */
    point++;