Browse Source

numparm, upgrade message() to accept format strings

pre-master-46
rlar 15 years ago
parent
commit
1ab4158abd
  1. 4
      ChangeLog
  2. 152
      src/frontend/numparam/xpressn.c

4
ChangeLog

@ -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 2011-02-19 Robert Larice
* src/frontend/numparam/xpressn.c : * src/frontend/numparam/xpressn.c :
numparm, shrink scope for dstrings, mostly message() related numparm, shrink scope for dstrings, mostly message() related

152
src/frontend/numparam/xpressn.c

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

Loading…
Cancel
Save