diff --git a/src/frontend/diff.c b/src/frontend/diff.c index 6a50d1d88..1109ede24 100644 --- a/src/frontend/diff.c +++ b/src/frontend/diff.c @@ -1,6 +1,7 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group +Modified: 2001 Paolo Nenzi (printnum) **********/ /* @@ -22,6 +23,7 @@ static bool nameeq(char *n1, char *n2) { char buf1[BSIZE_SP], buf2[BSIZE_SP]; + int i; if (eq(n1, n2)) @@ -51,8 +53,9 @@ com_diff(wordlist *wl) struct dvec *v1, *v2; double d1, d2; complex c1, c2, c3; - register int i, j; + int i, j; wordlist *tw; + char numbuf[BSIZE_SP],numbuf2[BSIZE_SP] ,numbuf3[BSIZE_SP], numbuf4[BSIZE_SP]; /* For printnum */ if (!cp_getvar("diff_vntol", VT_REAL, (char *) &vntol)) vntol = 1.0e-6; @@ -204,14 +207,16 @@ com_diff(wordlist *wl) d2 = v2->v_realdata[i]; if (MAX(fabs(d1), fabs(d2)) * reltol + tol < fabs(d1 - d2)) { + printnum(numbuf, d1); fprintf(cp_out, "%s.%s[%d] = %-15s ", p1->pl_typename, v1->v_name, i, - printnum(d1)); + numbuf); + printnum(numbuf, d2); fprintf(cp_out, "%s.%s[%d] = %s\n", p2->pl_typename, v2->v_name, i, - printnum(d2)); + numbuf); } } else { c1 = v1->v_compdata[i]; @@ -224,14 +229,20 @@ com_diff(wordlist *wl) cmax = MAX(cm1, cm2); if (cmax * reltol + tol < cmag(&c3)) { + + printnum(numbuf, realpart(&c1)); + printnum(numbuf2, imagpart(&c1)); + printnum(numbuf3, realpart(&c2)); + printnum(numbuf4, imagpart(&c2)); + fprintf(cp_out, "%s.%s[%d] = %-10s, %-10s %s.%s[%d] = %-10s, %s\n", p1->pl_typename, v1->v_name, i, - copy(printnum(realpart(&c1))), - copy(printnum(imagpart(&c1))), + numbuf, + numbuf2, p2->pl_typename, v2->v_name, i, - copy(printnum(realpart(&c2))), - copy(printnum(imagpart(&c2)))); + numbuf3, + numbuf4); } } } diff --git a/src/frontend/dotcards.c b/src/frontend/dotcards.c index 6e41873d8..620af5462 100644 --- a/src/frontend/dotcards.c +++ b/src/frontend/dotcards.c @@ -167,6 +167,7 @@ ft_cktcoms(bool terse) static wordlist twl = { "col", NULL, NULL } ; struct plot *pl; int i, found; + char numbuf[BSIZE_SP]; /* For printnum*/ all.wl_next = NULL; all.wl_word = "all"; @@ -207,16 +208,18 @@ ft_cktcoms(bool terse) v->v_name); continue; } - if ((v->v_type == SV_VOLTAGE) && (*(v->v_name)!='@')) - fprintf(cp_out, "\t%-30s%15s\n", v->v_name, - printnum(v->v_realdata[0])); + if ((v->v_type == SV_VOLTAGE) && (*(v->v_name)!='@')) { + printnum(numbuf, v->v_realdata[0]); + fprintf(cp_out, "\t%-30s%15s\n", v->v_name, numbuf); + } } fprintf(cp_out, "\n\tSource\tCurrent\n"); fprintf(cp_out, "\t------\t-------\n\n"); for (v = plot_cur->pl_dvecs; v; v = v->v_next) - if (v->v_type == SV_CURRENT) - fprintf(cp_out, "\t%-30s%15s\n", v->v_name, - printnum(v->v_realdata[0])); + if (v->v_type == SV_CURRENT) { + printnum(numbuf, v->v_realdata[0]); + fprintf(cp_out, "\t%-30s%15s\n", v->v_name, numbuf); + } fprintf(cp_out, "\n"); if (!ft_nomod) @@ -378,6 +381,7 @@ static void fixdotplot(wordlist *wl) { char buf[BSIZE_SP], *s; + char numbuf[128]; /* Printnum Fix */ double *d, d1, d2; while (wl) { @@ -408,13 +412,14 @@ fixdotplot(wordlist *wl) wl->wl_next = alloc(struct wordlist); wl->wl_next->wl_prev = wl; wl = wl->wl_next; - (void) strcpy(buf, printnum(d1)); - wl->wl_word = copy(buf); + + printnum(numbuf, d1); + wl->wl_word = copy(numbuf); wl->wl_next = alloc(struct wordlist); wl->wl_next->wl_prev = wl; wl = wl->wl_next; - (void) strcpy(buf, printnum(d2)); - wl->wl_word = copy(buf); + printnum(numbuf, d2); + wl->wl_word = copy(numbuf); } wl = wl->wl_next; } diff --git a/src/frontend/postcoms.c b/src/frontend/postcoms.c index d72bc653c..fea0ad4f9 100644 --- a/src/frontend/postcoms.c +++ b/src/frontend/postcoms.c @@ -74,6 +74,7 @@ com_print(wordlist *wl) bool col = TRUE, nobreak = FALSE, noprintscale, plotnames = FALSE; bool optgiven = FALSE; char *s, buf[BSIZE_SP], buf2[BSIZE_SP]; + char numbuf[BSIZE_SP], numbuf2[BSIZE_SP]; int ngood; if (wl == NULL) @@ -140,17 +141,20 @@ com_print(wordlist *wl) ll = 10; if (v->v_length == 1) { if (isreal(v)) { - out_printf("%s = %s\n", buf, - printnum(*v->v_realdata)); + printnum(numbuf, *v->v_realdata); + out_printf("%s = %s\n", buf, numbuf); } else { /*DG: memory leak here copy of the string returned by printnum will never be freed out_printf("%s = %s,%s\n", buf, copy(printnum(realpart(v->v_compdata))), - copy(printnum(imagpart(v->v_compdata)))); - */ + copy(printnum(imagpart(v->v_compdata)))); */ + + printnum(numbuf, realpart(v->v_compdata)); + printnum(numbuf2, imagpart(v->v_compdata)); + out_printf("%s = %s,%s\n", buf, - printnum(realpart(v->v_compdata)), - printnum(imagpart(v->v_compdata))); + numbuf, + numbuf2); } @@ -158,8 +162,9 @@ com_print(wordlist *wl) out_printf("%s = ( ", buf); for (i = 0; i < v->v_length; i++) if (isreal(v)) { - (void) strcpy(buf, - printnum(v->v_realdata[i])); + + printnum(numbuf, v->v_realdata[i]); + (void) strcpy(buf, numbuf); out_send(buf); ll += strlen(buf); ll = (ll + 7) / 8; @@ -171,9 +176,11 @@ com_print(wordlist *wl) out_send("\t"); } else { /*DG*/ + printnum(numbuf, realpart(&v->v_compdata[i])); + printnum(numbuf2, imagpart(&v->v_compdata[i])); (void) sprintf(buf, "%s,%s", - printnum(realpart(&v->v_compdata[i])), - printnum(imagpart(&v->v_compdata[i]))); + numbuf, + numbuf2); out_send(buf); ll += strlen(buf); ll = (ll + 7) / 8; diff --git a/src/include/cpstd.h b/src/include/cpstd.h index be8496a33..8b2b297fa 100644 --- a/src/include/cpstd.h +++ b/src/include/cpstd.h @@ -31,7 +31,7 @@ Author: 1986 Wayne A. Christopher, U. C. Berkeley CAD Group extern char *getusername(); extern char *gethome(); extern char *tildexpand(); -extern char *printnum(); +extern void printnum(); extern int cp_numdgt; extern void fatal(); diff --git a/src/misc/printnum.c b/src/misc/printnum.c index 9b9c12117..134406f7d 100644 --- a/src/misc/printnum.c +++ b/src/misc/printnum.c @@ -1,10 +1,11 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group +Modified: 2001 Paolo Nenzi **********/ -/* Print a number in a reasonable form. This is the sort of thing that - * %G does, but more appropriate for spice. Returns static data. +/* Paolo Nenzi 2001: printnum does not returns static data anymore. + * It is up to the caller to allocate space for strings. */ #include "ngspice.h" @@ -13,10 +14,8 @@ Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group int cp_numdgt = -1; -char * -printnum(double num) +void printnum(char *buf, double num) { - static char buf[128]; int n; if (cp_numdgt > 1) @@ -27,6 +26,5 @@ printnum(double num) n--; (void) sprintf(buf, "%.*e", n, num); - - return (buf); + } diff --git a/src/misc/printnum.h b/src/misc/printnum.h index 3995f210b..e405c69db 100644 --- a/src/misc/printnum.h +++ b/src/misc/printnum.h @@ -6,6 +6,6 @@ #ifndef PRINTNUM_H_INCLUDED #define PRINTNUM_H_INCLUDED -char * printnum(double num); +void printnum(char * buf, double num); #endif