parser/inpgtok.c, whitespace cleanup

This commit is contained in:
rlar 2015-02-28 11:01:21 +01:00
parent 4ae35e8974
commit 39d391fe33
1 changed files with 323 additions and 311 deletions

View File

@ -4,99 +4,105 @@ Author: 1985 Thomas L. Quarles
Modified: 2000 AlansFixes
**********/
/* get input token from 'line',
* and return a pointer to it in 'token'
*/
/* get input token from 'line',
* and return a pointer to it in 'token'
*/
/* INPgetTok: node names
INPgetUTok: numbers and other elements in expressions
(called from INPevaluate)
*/
(called from INPevaluate)
*/
#include "ngspice/ngspice.h"
#include "ngspice/iferrmsg.h"
#include "ngspice/inpdefs.h"
#include "inpxx.h"
/*-------------------------------------------------------------------
* INPgetTok -- this fcn extracts a generic input token from
* 'line' and returns a pointer to it in 'token'.
* INPgetTok -- this fcn extracts a generic input token from
* 'line' and returns a pointer to it in 'token'.
*------------------------------------------------------------------*/
int INPgetTok(char **line, char **token, int gobble)
/* eat non-whitespace trash AFTER token? */
int
INPgetTok(char **line, char **token, int gobble)
/* gobble: eat non-whitespace trash AFTER token? */
{
char *point;
int signstate;
int diffpoints;
int diffpoints;
/* scan along throwing away garbage characters until end of line
or a separation char is found */
for (point = *line; *point != '\0'; point++) {
if (*point == ' ')
continue;
if (*point == '\t')
continue;
if (*point == '\r')
continue;
if (*point == '=')
continue;
if (*point == '(')
continue;
if (*point == ')')
continue;
if (*point == ',')
continue;
break;
if (*point == ' ')
continue;
if (*point == '\t')
continue;
if (*point == '\r')
continue;
if (*point == '=')
continue;
if (*point == '(')
continue;
if (*point == ')')
continue;
if (*point == ',')
continue;
break;
}
/* mark beginning of token */
*line = point;
/* now find all good characters up to next occurance of a
/* now find all good characters up to next occurance of a
separation character. */
signstate = 0;
for (point = *line; *point != '\0'; point++) {
if (*point == ' ')
break;
if (*point == '\t')
break;
if (*point == '\r')
break;
if (*point == '=')
break;
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 == '+') || (*point == '-')){
/* Treat '+' signs same as '-' signs */
if (signstate == 1 || signstate == 3) break;
signstate += 1;
continue;
}
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 == ' ')
break;
if (*point == '\t')
break;
if (*point == '\r')
break;
if (*point == '=')
break;
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 == '+') || (*point == '-')) {
/* Treat '+' signs same as '-' signs */
if (signstate == 1 || signstate == 3)
break;
signstate += 1;
continue;
}
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++;
if (point == *line && *point) /* Weird items, 1 char */
point++;
diffpoints = (int)(point - *line);
*token = TMALLOC(char, 1 + diffpoints);
@ -104,30 +110,22 @@ int INPgetTok(char **line, char **token, int gobble)
return (E_NOMEM);
(void) strncpy(*token, *line, (size_t) diffpoints);
*(*token + diffpoints) = '\0';
*line = point;
/*
if (point == *line && *point)
point++;
*token = TMALLOC(char, 1 + point - *line);
if (!*token)
return (E_NOMEM);
(void) strncpy(*token, *line, point - *line);
*(*token + (point - *line)) = '\0';
*line = point;
*/
/* gobble garbage to next token */
for (; **line != '\0'; (*line)++) {
if (**line == ' ')
continue;
if (**line == '\t')
continue;
if (**line == '\r')
continue;
if ((**line == '=') && gobble)
continue;
if ((**line == ',') && gobble)
continue;
break;
if (**line == ' ')
continue;
if (**line == '\t')
continue;
if (**line == '\r')
continue;
if ((**line == '=') && gobble)
continue;
if ((**line == ',') && gobble)
continue;
break;
}
#ifdef TRACE
@ -140,14 +138,16 @@ int INPgetTok(char **line, char **token, int gobble)
/*-------------------------------------------------------------------
* INPgetNetTok -- this fcn extracts an input netname token from
* 'line' and returns a pointer to it in 'token'.
* INPgetNetTok -- this fcn extracts an input netname token from
* 'line' and returns a pointer to it in 'token'.
* This fcn cloned from INPgetTok by SDB to enable
* complex netnames (e.g. netnames like '+VCC' and 'IN-').
* mailto:sdb@cloud9.net -- 4.7.2003
*------------------------------------------------------------------*/
int INPgetNetTok(char **line, char **token, int gobble)
/* eat non-whitespace trash AFTER token? */
int
INPgetNetTok(char **line, char **token, int gobble)
/* gobble: eat non-whitespace trash AFTER token? */
{
char *point;
int diffpoints;
@ -155,77 +155,67 @@ int INPgetNetTok(char **line, char **token, int gobble)
/* scan along throwing away garbage characters until end of line
or a separation char is found */
for (point = *line; *point != '\0'; point++) {
if (*point == ' ')
continue;
if (*point == '\t')
continue;
if (*point == '=')
continue;
if (*point == '(')
continue;
if (*point == ')')
continue;
if (*point == ',')
continue;
break;
if (*point == ' ')
continue;
if (*point == '\t')
continue;
if (*point == '=')
continue;
if (*point == '(')
continue;
if (*point == ')')
continue;
if (*point == ',')
continue;
break;
}
/* mark beginning of token */
*line = point;
/* now find all good characters up to next occurance of a
/* now find all good characters up to next occurance of a
separation character. INPgetNetTok is very liberal about
what it accepts. */
for (point = *line; *point != '\0'; point++) {
if (*point == ' ')
break;
if (*point == '\t')
break;
if (*point == '\r')
break;
if (*point == '=')
break;
if (*point == ',')
break;
if (*point == ')')
break;
if (*point == ' ')
break;
if (*point == '\t')
break;
if (*point == '\r')
break;
if (*point == '=')
break;
if (*point == ',')
break;
if (*point == ')')
break;
}
if (point == *line && *point) /* Weird items, 1 char */
point++;
if (point == *line && *point) /* Weird items, 1 char */
point++;
/* now copy found token into *token */
diffpoints = (int)(point - *line);
*token = TMALLOC(char, 1 + diffpoints);
if (!*token)
return (E_NOMEM);
(void) strncpy(*token, *line, (size_t) diffpoints);
*(*token + diffpoints) = '\0';
*line = point;
/*
if (point == *line && *point)
point++;
*token = TMALLOC(char, 1 + point - *line);
if (!*token)
return (E_NOMEM);
(void) strncpy(*token, *line, point - *line);
*(*token + (point - *line)) = '\0';
*line = point;
*/
/* gobble garbage to next token */
for (; **line != '\0'; (*line)++) {
if (**line == ' ')
continue;
if (**line == '\t')
continue;
if (**line == '\r')
continue;
if ((**line == '=') && gobble)
continue;
if ((**line == ',') && gobble)
continue;
break;
if (**line == ' ')
continue;
if (**line == '\t')
continue;
if (**line == '\r')
continue;
if ((**line == '=') && gobble)
continue;
if ((**line == ',') && gobble)
continue;
break;
}
#ifdef TRACE
@ -237,42 +227,43 @@ int INPgetNetTok(char **line, char **token, int gobble)
}
/*-------------------------------------------------------------------
* INPgetUTok -- this fcn extracts an input refdes token from
* 'line' and returns a pointer to it in 'token'.
* INPgetUTok -- this fcn extracts an input refdes token from
* 'line' and returns a pointer to it in 'token'.
*------------------------------------------------------------------*/
int INPgetUTok(char **line, char **token, int gobble)
/* eat non-whitespace trash AFTER token? */
int
INPgetUTok(char **line, char **token, int gobble)
/* gobble: eat non-whitespace trash AFTER token? */
{
char *point, separator;
int signstate;
/* scan along throwing away garbage characters */
for (point = *line; *point != '\0'; point++) {
if (*point == ' ')
continue;
if (*point == '\t')
continue;
if (*point == '=')
continue;
if (*point == '(')
continue;
if (*point == ')')
continue;
if (*point == ',')
continue;
break;
if (*point == ' ')
continue;
if (*point == '\t')
continue;
if (*point == '=')
continue;
if (*point == '(')
continue;
if (*point == ')')
continue;
if (*point == ',')
continue;
break;
}
if (*point == '"') {
separator = '"';
point++;
separator = '"';
point++;
} else if (*point == '\'') {
separator = '\'';
point++;
separator = '\'';
point++;
} else
separator = 0;
separator = 0;
/* mark beginning of token */
*line = point;
@ -280,118 +271,131 @@ int INPgetUTok(char **line, char **token, int gobble)
/* now find all good characters */
signstate = 0;
for (point = *line; *point != '\0'; point++) {
if (separator) {
if (*point == separator)
break;
else
continue;
}
if (*point == ' ')
break;
if (*point == '\t')
break;
if (*point == '=')
break;
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 == '-') {
if (signstate == 1 || signstate == 3)
break;
signstate += 1;
continue;
}
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 (separator) {
if (*point == separator)
break;
else
continue;
}
if (*point == ' ')
break;
if (*point == '\t')
break;
if (*point == '=')
break;
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 == '-') {
if (signstate == 1 || signstate == 3)
break;
signstate += 1;
continue;
}
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 (separator && *point == separator)
point--;
if (point == *line && *point) /* Weird items, 1 char */
point++;
point--;
if (point == *line && *point) /* Weird items, 1 char */
point++;
*token = TMALLOC(char, 1 + point - *line);
if (!*token)
return (E_NOMEM);
return (E_NOMEM);
(void) strncpy(*token, *line, (size_t) (point - *line));
*(*token + (point - *line)) = '\0';
/* gobble garbage to next token */
for (; *point != '\0'; point++) {
if (*point == separator)
continue;
if (*point == ' ')
continue;
if (*point == '\t')
continue;
if ((*point == '=') && gobble)
continue;
if ((*point == ',') && gobble)
continue;
break;
if (*point == separator)
continue;
if (*point == ' ')
continue;
if (*point == '\t')
continue;
if ((*point == '=') && gobble)
continue;
if ((*point == ',') && gobble)
continue;
break;
}
*line = point;
#ifdef TRACE
/* SDB debug statement */
/* printf("found refdes token (%s) and rest of line (%s)\n",*token,*line); */
/* printf("found refdes token (%s) and rest of line (%s)\n",*token,*line); */
#endif
return (OK);
}
/*-------------------------------------------------------------------
* INPgetUTok plus points < > ? :, called from INPevaluate called
* from INPevaluate with gobble == 2
* fcn added to avoid unforeseeable side effects during other calls
* to INPevaluate.
* to INPevaluate.
*------------------------------------------------------------------*/
int INPgetU2Tok(char **line, char **token, int gobble)
/* eat non-whitespace trash AFTER token? */
int
INPgetU2Tok(char **line, char **token, int gobble)
/* gobble: eat non-whitespace trash AFTER token? */
{
char *point, separator;
int signstate;
/* scan along throwing away garbage characters */
for (point = *line; *point != '\0'; point++) {
if (*point == ' ')
continue;
if (*point == '\t')
continue;
if (*point == '=')
continue;
if (*point == '(')
continue;
if (*point == ')')
continue;
if (*point == ',')
continue;
break;
if (*point == ' ')
continue;
if (*point == '\t')
continue;
if (*point == '=')
continue;
if (*point == '(')
continue;
if (*point == ')')
continue;
if (*point == ',')
continue;
break;
}
if (*point == '"') {
separator = '"';
point++;
separator = '"';
point++;
} else if (*point == '\'') {
separator = '\'';
point++;
separator = '\'';
point++;
} else
separator = 0;
separator = 0;
/* mark beginning of token */
*line = point;
@ -399,86 +403,94 @@ int INPgetU2Tok(char **line, char **token, int gobble)
/* now find all good characters */
signstate = 0;
for (point = *line; *point != '\0'; point++) {
if (separator) {
if (*point == separator)
break;
else
continue;
}
if (*point == ' ')
break;
if (*point == '\t')
break;
if (*point == '=')
break;
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 == '-') {
if (signstate == 1 || signstate == 3)
break;
signstate += 1;
continue;
}
if (*point == '*')
break;
if (*point == '/')
break;
if (*point == '^')
break;
if (*point == '<')
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 (separator) {
if (*point == separator)
break;
else
continue;
}
if (*point == ' ')
break;
if (*point == '\t')
break;
if (*point == '=')
break;
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 == '-') {
if (signstate == 1 || signstate == 3)
break;
signstate += 1;
continue;
}
if (*point == '*')
break;
if (*point == '/')
break;
if (*point == '^')
break;
if (*point == '<')
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 (separator && *point == separator)
point--;
if (point == *line && *point) /* Weird items, 1 char */
point++;
point--;
if (point == *line && *point) /* Weird items, 1 char */
point++;
*token = TMALLOC(char, 1 + point - *line);
if (!*token)
return (E_NOMEM);
return (E_NOMEM);
(void) strncpy(*token, *line, (size_t) (point - *line));
*(*token + (point - *line)) = '\0';
/* gobble garbage to next token */
for (; *point != '\0'; point++) {
if (*point == separator)
continue;
if (*point == ' ')
continue;
if (*point == '\t')
continue;
if ((*point == '=') && gobble)
continue;
if ((*point == ',') && gobble)
continue;
break;
if (*point == separator)
continue;
if (*point == ' ')
continue;
if (*point == '\t')
continue;
if ((*point == '=') && gobble)
continue;
if ((*point == ',') && gobble)
continue;
break;
}
*line = point;
#ifdef TRACE
/* SDB debug statement */
/* printf("found refdes token (%s) and rest of line (%s)\n",*token,*line); */
/* printf("found refdes token (%s) and rest of line (%s)\n",*token,*line); */
#endif
return (OK);