Enabled NUPA's capability to recognize quoted strings.

NUPA has an options string ( dico->option that must be set to SPICE-3.
When not, recognized strings are uppercased before being returned.
Facilitated .PARAM to recognize strings in two ways: by sharps #xxx#
and now also by quotes "xxx".
This commit is contained in:
mhx 2017-01-07 23:46:44 +01:00
parent 0e89d94a9c
commit 4aed813422
2 changed files with 20 additions and 14 deletions

View File

@ -589,6 +589,9 @@ inp_spsource(FILE *fp, bool comfile, char *filename, bool intfile)
/* lines .width, .four, .plot, .print, .save added to wl_first, removed from deck */
/* lines .op, .meas, .tf added to wl_first */
inp_casefix(s); /* s: first token from line */
if (!ciprefix(".param", s))
/* mhx: casefix strips quotes(!?), and .PARAM therefore does not see them. */
/* maybe .func shold also be allowed? */
inp_casefix(dd->li_line);
if (eq(s, ".width") ||
ciprefix(".four", s) ||
@ -1382,8 +1385,7 @@ com_alterparam(wordlist *wl)
curr_line = dd->li_line;
char *start = gettok_char(&curr_line, '=', TRUE, FALSE);
tfree(dd->li_line);
/* mhx: re-inserted braces. It works/ed (sometimes) without them. */
dd->li_line = tprintf("%s{%s}", start, pval);
dd->li_line = tprintf("%s%s", start, pval);
found = TRUE;
tfree(start);
}

View File

@ -251,8 +251,9 @@ initdico(dico_t *dico)
int asize = NESTINGDEPTH; /* default allocation depth of the synbol stack */
COMPATMODE_T compat_mode;
spice_dstring_init(&(dico->option));
spice_dstring_init(&(dico->srcfile));
spice_dstring_init (&(dico->option));
spice_dstring_value (&dico->option) = "spice-3"; /* mhx: If not, nupa uppercases quoted strings */
spice_dstring_init (&(dico->srcfile));
dico->srcline = -1;
dico->errcount = 0;
@ -1539,6 +1540,10 @@ nupa_assignment(dico_t *dico, char *s, char mode)
SPICE_DSTRING tstr; /* temporary dstring */
SPICE_DSTRING ustr; /* temporary dstring */
#define SHARP(x) (s[x] == '#' || s[x] == '"')
#define LBRAC(x) (s[x] == '{')
#define RBRAC(x) (s[x] == '}')
spice_dstring_init(&tstr);
spice_dstring_init(&ustr);
ls = length(s);
@ -1573,14 +1578,10 @@ nupa_assignment(dico_t *dico, char *s, char mode)
if (i > ls)
error = message(dico, " = sign expected.\n");
for (ix = i; ix < ls - 1; ix++) { /* change delimiters {# and #} to double quotes */
int ssharp = 0;
if (s[ix] == '{' && s[ix + 1] == '#') { s[ix] = ' '; s[ix + 1] = '"'; strptr = &s[ix + 1]; }
if (s[ix] == '#' && s[ix + 1] == '}') { s[ix] = '"'; s[ix + 1] = '\0'; }
if (s[ix] == '#' && !s[ix + 1] == '}') {
s[ix] = '"'; ssharp++;
if (ssharp == 2) { s[ix + 1] = '\0'; ssharp = 0; }
}
strptr = strchr(&s[i], '\"'); /* mhx: maybe this is a quoted string already; .param x = "hello" */
for (ix = i; ix < ls - 1; ix++) { /* change possible delimiters {# and #} to double quotes */
if (LBRAC(ix) && SHARP(ix + 1)) { s[ix] = ' '; s[ix + 1] = '"'; strptr = &s[ix + 1]; }
if (SHARP(ix) && RBRAC(ix + 1)) { s[ix] = '"'; s[ix + 1] = '\0'; }
}
dtype = getexpress(s, &ustr, &i);
@ -1611,6 +1612,9 @@ nupa_assignment(dico_t *dico, char *s, char mode)
spice_dstring_free(&ustr);
return error;
#undef SHARP
#undef RBRAC
#undef LBRAC
}