numparm, upgrade message() to accept format strings

This commit is contained in:
rlar 2011-02-19 14:45:42 +00:00
parent 76a7f5b5f7
commit 1ab4158abd
2 changed files with 58 additions and 102 deletions

View File

@ -1,3 +1,7 @@
2011-02-19 Robert Larice
* src/frontend/numparam/xpressn.c :
numparm, upgrade message() to accept format strings
2011-02-19 Robert Larice
* src/frontend/numparam/xpressn.c :
numparm, shrink scope for dstrings, mostly message() related

View File

@ -6,6 +6,7 @@
*/
#include <stdio.h> /* for function message() only. */
#include <stdarg.h>
#include "general.h"
#include "numparam.h"
@ -20,7 +21,7 @@
extern double gauss0(void);
extern double drand(void);
void debugwarn(tdico *d, char *s);
static void debugwarn(tdico *d, char *s);
/************ keywords ************/
@ -163,41 +164,47 @@ mathfunction (int f, double z, double x)
return y;
}
static bool
message (tdico * dic, char *s)
/* record 'dic' should know about source file and line */
{
char *srcfile ; /* src file name */
SPICE_DSTRING t ; /* temp dstring */
spice_dstring_init(&t) ;
dic->errcount++;
srcfile = spice_dstring_value( &(dic->srcfile) ) ;
if ((srcfile != NULL) && srcfile[0])
{
scopyd(&t, &(dic->srcfile)) ;
cadd (&t, ':');
}
#ifdef __GNUC__
static bool message(tdico * dic, const char *fmt, ...)
__attribute__ ((format (__printf__, 2, 3)));
#endif
static bool
message(tdico * dic, const char *fmt, ...)
{
va_list ap;
char *srcfile = spice_dstring_value( &(dic->srcfile) ) ;
if (srcfile && *srcfile)
fprintf(stderr, "%s:", srcfile);
if (dic->srcline >= 0)
{
sadd (&t, "Original line no.: ");
nadd (&t, dic->oldline);
sadd (&t, ", new internal line no.: ");
nadd (&t, dic->srcline);
sadd (&t, ":\n");
}
sadd (&t, s);
cadd (&t, '\n');
fputs ( spice_dstring_value(&t), stderr);
spice_dstring_free(&t) ;
fprintf
( stderr,
"Original line no.: %d, new internal line no.: %d:\n",
dic->oldline,
dic->srcline
);
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
fprintf(stderr,"\n");
dic->errcount++;
return 1 /* error! */ ;
}
void
static void
debugwarn (tdico * d, char *s)
{
message (d, s);
message (d, "%s", s);
d->errcount--;
}
@ -401,13 +408,7 @@ fetchnumentry (tdico * dico, char *t, bool *perr)
u = entry_p->vl ;
else
{
SPICE_DSTRING s ;
spice_dstring_init(&s) ;
scopys(&s, "Undefined number [") ;
sadd (&s, t);
cadd (&s, ']');
err = message (dico, spice_dstring_value(&s) ) ;
spice_dstring_free(&s) ;
err = message (dico, "Undefined number [%s]", t);
u = 0.0;
}
@ -465,13 +466,10 @@ define (tdico * dico,
char c;
bool err, warn;
entry *entry_p ; /* spice table entry */
SPICE_DSTRING vartemp ; /* vairable temp */
NGHASHPTR htable_p ; /* hash table */
NG_IGNORE(pval);
spice_dstring_init(&vartemp) ;
if( dico->stack_depth > 0 )
{
/* can't be lazy anymore */
@ -513,26 +511,20 @@ define (tdico * dico,
if ( entry_p->level < dico->stack_depth)
{
/* warn about re-write to a global scope! */
scopys(&vartemp, t) ;
cadd (&vartemp, ':');
nadd (&vartemp, entry_p->level);
sadd (&vartemp, " overwritten.");
warn = message (dico, spice_dstring_value(&vartemp));
warn = message (dico, "%s:%d overwritten.", t, entry_p->level);
}
}
else
{
scopys( &vartemp, t) ;
sadd ( &vartemp, ": cannot redefine");
/* suppress error message, resulting from multiple definition of
symbols (devices) in .model lines with same name, but in different subcircuits.
Subcircuit expansion is o.k., we have to deal with this numparam
behaviour later. (H. Vogt 090426)
*/
/*err = message (dico, v);*/
if(0)
message (dico, "%s: cannot redefine", t);
}
}
spice_dstring_free(&vartemp) ;
return err;
}
@ -644,9 +636,7 @@ deffuma ( /* define function or macro entry. */
}
else
{
scopy (v, t);
sadd (v, " already defined");
err = message (dico, v);
err = message (dico, "%s already defined", t);
}
}
else
@ -835,12 +825,7 @@ fetchnumber (tdico * dico, char *s, int *pi, bool *perror)
if(1 != sscanf(s, "%lG%n", &u, &n)) {
SPICE_DSTRING vstr ;
spice_dstring_init(&vstr) ;
scopys(&vstr, "Number format error: ") ;
sadd (&vstr, s);
*perror = message (dico, spice_dstring_value(&vstr));
spice_dstring_free(&vstr) ;
*perror = message (dico, "Number format error: \"%s\"", s) ;
return 0.0; /* FIXME return NaN */
@ -957,15 +942,7 @@ fetchoperator (tdico * dico,
{
state = 0;
if (c > ' ')
{
SPICE_DSTRING vstr ;
spice_dstring_init(&vstr) ;
spice_dstring_append(&vstr, "Syntax error: letter [", -1 );
cadd (&vstr, c);
cadd (&vstr, ']');
error = message (dico, spice_dstring_value(&vstr) );
spice_dstring_free(&vstr) ;
}
error = message (dico, "Syntax error: letter [%c]", c);
}
*pi = i;
*pstate = state;
@ -1341,13 +1318,9 @@ formula (tdico * dico, char *s, bool *perror)
oldstate = state;
}
} /* while */ ;
if ((natom == 0) || (oldstate != 4))
{
spice_dstring_reinit(&tstr) ;
sadd( &tstr, " Expression err: ");
sadd (&tstr, s);
error = message (dico, spice_dstring_value(&tstr));
}
error = message (dico, " Expression err: %s", s);
if (negate == 1)
{
@ -1459,20 +1432,9 @@ evaluate (tdico * dico, SPICE_DSTRINGPTR qstr_p, char *t, unsigned char mode)
while (!(done));
}
if (!(entry_p))
{
SPICE_DSTRING vstr ;
spice_dstring_init(&vstr) ;
cadd (&vstr, '\"');
sadd (&vstr, t);
sadd (&vstr, "\" not evaluated. ");
if (nolookup)
sadd (&vstr, "Lookup failure.");
err = message (dico, spice_dstring_value(&vstr));
spice_dstring_free(&vstr) ;
}
if (!entry_p)
err = message (dico,
"\"%s\" not evaluated.%s", t, nolookup ? " Lookup failure." : "");
}
else
{
@ -1559,7 +1521,7 @@ scanline (tdico * dico, char *s, char *r, bool err)
}
else
{
err = message (dico, s);
err = message (dico, "%s", s);
}
}
else if (c == Intro)
@ -1631,7 +1593,7 @@ scanline (tdico * dico, char *s, char *r, bool err)
}
else
{
message (dico, s);
message (dico, "%s", s);
}
}
else if (c == Nodekey)
@ -1767,14 +1729,7 @@ insertnumber (tdico * dico, int i, char *s, SPICE_DSTRINGPTR ustr_p)
cadd (&vstr, ' ');
if ( spice_dstring_length (&vstr) > MAX_STRING_INSERT)
{
SPICE_DSTRING mstr ;
spice_dstring_init(&mstr) ;
spice_dstring_append( &mstr, " insertnumber fails: ", -1);
sadd (&mstr, spice_dstring_value(ustr_p));
message (dico, spice_dstring_value(&mstr)) ;
spice_dstring_free(&mstr) ;
}
message (dico, " insertnumber fails: %s", spice_dstring_value(ustr_p));
found = 0;
@ -2396,13 +2351,10 @@ nupa_subcktcall (tdico * dico, char *s, char *x, bool err)
dicostack (dico, Push); /* create local symbol scope */
if (narg != n)
{
scopys(&tstr, " Mismatch: ");
nadd (&tstr, n);
sadd (&tstr, " formal but ");
nadd (&tstr, narg);
sadd (&tstr, " actual params.");
err = message (dico, spice_dstring_value(&tstr));
message (dico, spice_dstring_value(&idlist));
err = message ( dico,
" Mismatch: %d formal but %d actual params.\n"
"%s",
n, narg, spice_dstring_value(&idlist) );
/* ;} else { debugwarn(dico, idlist) */ ;
}
err = nupa_assignment (dico, spice_dstring_value(&idlist), 'N');