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++;