Added a trailing type character to nupa's

numparm__________xxxxxxxt inserts. With
this, it is now possible to replace not only
the standard {xxxx} with a double, but also
{%xxxx} with an integer and {$xxxx} with
a boolean. Example application: replace
node names with .param equates.
This commit is contained in:
mhx 2016-12-31 17:02:06 +01:00
parent 0c87e6600c
commit d6e0607577
3 changed files with 32 additions and 15 deletions

View File

@ -65,3 +65,5 @@ dico_t *nupa_fetchinstance(void);
char getidtype(dico_t *, char *s);
entry_t *attrib(dico_t *, NGHASHPTR htable, char *t, char op, struct nscope *level);
void del_attrib(void *);
#define ACT_CHARACTS 24 /* actual string length to be inserted and replaced */

View File

@ -105,6 +105,7 @@ stripbraces(SPICE_DSTRINGPTR dstr_p)
char *s; /* value of dynamic string */
char *t_p; /* value of t dynamic string */
SPICE_DSTRING tstr; /* temporary dynamic string */
char type;
n = 0;
spice_dstring_init(&tstr);
@ -117,7 +118,12 @@ stripbraces(SPICE_DSTRINGPTR dstr_p)
if (s[i] == '{') {
/* something to strip */
j = i + 1;
switch (s[i + 1]) {
case '%': type = '%'; break;
case '$': type = '$'; break;
default: type = '0';
}
j = i + 1;
nest = 1;
n++;
@ -139,8 +145,8 @@ stripbraces(SPICE_DSTRINGPTR dstr_p)
cadd(&tstr, ' ');
{
char buf[25+1];
sprintf(buf, "numparm__________%08lx", placeholder);
char buf[ACT_CHARACTS + 1];
sprintf(buf, "numparm__________%07lx%c", placeholder, type); /* mhx */
sadd(&tstr, buf);
}
cadd(&tstr, ' ');

View File

@ -23,7 +23,6 @@
extern char *nupa_inst_name; /* see spicenum.c */
extern long dynsubst; /* see inpcom.c */
#define ACT_CHARACTS 25 /* actual string length to be inserted and replaced */
#define S_init 0
#define S_atom 1
@ -1142,11 +1141,16 @@ evaluate(dico_t *dico, SPICE_DSTRINGPTR qstr_p, char *t, unsigned char mode)
entry_t *entry;
bool numeric, done, nolookup;
bool err;
char type = '0';
spice_dstring_reinit(qstr_p);
numeric = 0;
err = 0;
if (t[0] == '%') { type = '%'; t++; }
else if (t[0] == '$') { type = '$'; t++; }
else type = '0';
if (mode == 1) {
/* string? */
stupcase(t);
@ -1205,8 +1209,16 @@ evaluate(dico_t *dico, SPICE_DSTRINGPTR qstr_p, char *t, unsigned char mode)
*/
char buf[ACT_CHARACTS + 1];
if (snprintf(buf, sizeof(buf), "% 25.17e", u) != ACT_CHARACTS) {
fprintf(stderr, "ERROR: xpressn.c, %s(%d)\n", __FUNCTION__, __LINE__);
bool errs = NO;
switch (type) {
case '0': errs = (snprintf(buf, sizeof(buf), "% *.17e", ACT_CHARACTS, u) != ACT_CHARACTS); break;
case '$': errs = (snprintf(buf, sizeof(buf), "% *s", ACT_CHARACTS, u ? "yes" : "no") != ACT_CHARACTS); break;
case '%': errs = (snprintf(buf, sizeof(buf), "% *d", ACT_CHARACTS, (int)u) != ACT_CHARACTS); break;
default : errs = YES;
}
if (errs) {
fprintf(cp_err, "ERROR: xpressn.c, %s(%d)\n", __FUNCTION__, __LINE__);
fprintf(cp_err, "Expression under consideration = `%s', value to be substituted = %g\n", t, u);
controlled_exit(1);
}
scopys(qstr_p, buf);
@ -1227,18 +1239,15 @@ insertnumber(dico_t *dico, int i, char *s, SPICE_DSTRINGPTR ustr_p)
char buf[ACT_CHARACTS+1];
long id = 0;
int n = 0;
int n = 0, res = 0;
char *p = strstr(s+i, "numparm__________");
if (p &&
(1 == sscanf(p, "numparm__________%8lx%n", &id, &n)) &&
(n == ACT_CHARACTS) &&
(id > 0) && (id < dynsubst + 1) &&
(snprintf(buf, sizeof(buf), "%-25s", u) == ACT_CHARACTS))
{
memcpy(p, buf, ACT_CHARACTS);
return (int)(p - s) + ACT_CHARACTS;
if (p) res = sscanf(p, "numparm__________%7lx%n", &id, &n);
if (p && (res == 1) && (n == ACT_CHARACTS) && (id > 0) && (id < dynsubst + 1) &&
(snprintf(buf, sizeof(buf), "%-*s", ACT_CHARACTS, u) == ACT_CHARACTS)) {
memcpy(p, buf, ACT_CHARACTS); *(p + ACT_CHARACTS) = ' ';
return (int)(p - s) + ACT_CHARACTS;
}
message