From b3277ca53e539172830b1fbcb14a59cfa326bbfe Mon Sep 17 00:00:00 2001 From: Tim Edwards Date: Thu, 12 Oct 2017 12:11:30 -0400 Subject: [PATCH] Modified reading of SPICE files so that parameters in quotes get treated monolithically instead of being broken up into separate tokens according to space characters, which screws up the parameter parsing. --- base/netfile.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/base/netfile.c b/base/netfile.c index 245fbe0..0045222 100644 --- a/base/netfile.c +++ b/base/netfile.c @@ -193,6 +193,67 @@ static struct filestack *OpenFiles = NULL; #define TOKEN_DELIMITER " \t\n\r" +/*----------------------------------------------------------------------*/ +/* TrimQuoted() --- */ +/* Remove spaces from inside single- or double-quoted strings. */ +/*----------------------------------------------------------------------*/ + +void TrimQuoted(char *line) +{ + char *qstart, *qend, *lptr; + int slen; + int changed; + + /* Single-quoted entries */ + changed = TRUE; + lptr = line; + while (changed) + { + changed = FALSE; + qstart = strchr(lptr, '\''); + if (qstart) + { + qend = strchr(qstart + 1, '\''); + if (qend && (qend > qstart)) { + slen = strlen(lptr); + for (lptr = qstart + 1; lptr < qend; lptr++) { + if (*lptr == ' ') { + memmove(lptr, lptr + 1, slen); + qend--; + changed = TRUE; + } + } + lptr++; + } + } + } + + /* Double-quoted entries */ + changed = TRUE; + lptr = line; + while (changed) + { + changed = FALSE; + qstart = strchr(lptr, '\"'); + if (qstart) + { + qend = strchr(qstart + 1, '\"'); + if (qend && (qend > qstart)) { + slen = strlen(lptr); + for (lptr = qstart + 1; lptr < qend; lptr++) { + if (*lptr == ' ') { + memmove(lptr, lptr + 1, slen); + qend--; + changed = TRUE; + } + } + lptr++; + } + } + } + +} + /*----------------------------------------------------------------------*/ /* GetNextLineNoNewline() */ /* */ @@ -233,6 +294,7 @@ int GetNextLineNoNewline() } linenum++; strcpy(linetok, line); + TrimQuoted(linetok); nexttok = strtok(linetok, TOKEN_DELIMITER); return 0;