unwanted whitespace change, just a distracting mess

This commit is contained in:
mhx 2016-01-01 20:32:22 +01:00 committed by rlar
parent 58333b320d
commit 8ca0b944df
2 changed files with 92 additions and 223 deletions

View File

@ -1,6 +1,6 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group
**********/
#include "ngspice/ngspice.h"
@ -12,14 +12,12 @@ Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group
#include "ngspice/memory.h"
#include "ngspice/inpdefs.h"
#include "ngspice/fteext.h"
#include "circuits.h"
#include "com_history.h"
#include "quote.h"
#include "ngspice/cpextern.h"
#include "variable.h"
bool cp_noglob = TRUE;
bool cp_nonomatch = FALSE;
bool cp_noclobber = FALSE;
@ -28,14 +26,12 @@ bool cp_echo = FALSE; /* CDHW */
struct variable *variables = NULL;
wordlist *
cp_varwl(struct variable *var)
{
wordlist *wl = NULL, *w, *wx = NULL;
char buf[BSIZE_SP], *copystring;
struct variable *vt;
switch (var->va_type) {
case CP_BOOL:
/* Can't ever be FALSE. */
@ -72,12 +68,10 @@ cp_varwl(struct variable *var)
var->va_type);
return NULL;
}
wl = wl_cons(copy(buf), NULL);
return wl;
}
/* Set a variable. */
void
cp_vset(char *varname, enum cp_types type, void *value)
@ -86,11 +80,8 @@ cp_vset(char *varname, enum cp_types type, void *value)
int i;
bool alreadythere = FALSE, v_free = FALSE;
char *copyvarname;
/* varname = cp_unquote(varname); DG: Memory leak old varname is lost*/
copyvarname = cp_unquote(varname);
w = NULL;
for (v = variables; v; v = v->va_next) {
if (eq(copyvarname, v->va_name)) {
@ -99,21 +90,18 @@ cp_vset(char *varname, enum cp_types type, void *value)
}
w = v;
}
if (alreadythere) {
if (v->va_type == CP_LIST)
free_struct_variable(v->va_vlist);
if (v->va_type == CP_STRING)
tfree(v->va_string);
}
if (!v) {
v = alloc(struct variable);
v->va_name = copy(copyvarname);
v->va_next = NULL;
v_free = TRUE;
}
switch (type) {
case CP_BOOL:
if (* ((bool *) value) == FALSE) {
@ -128,23 +116,18 @@ cp_vset(char *varname, enum cp_types type, void *value)
v->va_bool = TRUE;
}
break;
case CP_NUM:
v->va_num = * (int *) value;
break;
case CP_REAL:
v->va_real = * (double *) value;
break;
case CP_STRING:
v->va_string = copy((char*) value);
break;
case CP_LIST:
v->va_vlist = (struct variable *) value;
break;
default:
fprintf(cp_err,
"cp_vset: INTERNAL ERROR: bad variable type %d.\n",
@ -152,9 +135,7 @@ cp_vset(char *varname, enum cp_types type, void *value)
tfree(copyvarname);
return;
}
v->va_type = type;
/* Now, see if there is anything interesting going on. We
* recognize these special variables: noglob, nonomatch, history,
* echo, noclobber, prompt, and verbose. cp_remvar looks for these
@ -180,7 +161,6 @@ cp_vset(char *varname, enum cp_types type, void *value)
}
switch (i = cp_usrset(v, TRUE)) {
case US_OK:
/* Normal case. */
if (!alreadythere) {
@ -188,7 +168,6 @@ cp_vset(char *varname, enum cp_types type, void *value)
variables = v;
}
break;
case US_DONTRECORD:
/* Do nothing... */
if (alreadythere) {
@ -196,19 +175,17 @@ cp_vset(char *varname, enum cp_types type, void *value)
"%s already there, but `don't record'\n", v->va_name);
}
break;
case US_READONLY:
fprintf(cp_err, "ERROR: %s is a read-only variable.\n", v->va_name);
if (alreadythere)
fprintf(cp_err, "cp_vset: INTERNAL ERROR: "
"it was already there too!!\n");
break;
case US_SIMVAR:
if (alreadythere) {
/* somehow it got into the front-end list of variables */
if (w) {
w->va_next = v->va_next;
w->va_next = v->va_next;
} else {
variables = v->va_next;
}
@ -235,13 +212,11 @@ cp_vset(char *varname, enum cp_types type, void *value)
}
}
break;
case US_NOSIMVAR:
/* What do you do? */
tfree(v->va_name);
tfree(v);
break;
default:
fprintf(cp_err, "cp_vset: INTERNAL ERROR: bad US val %d\n", i);
break;
@ -249,12 +224,11 @@ cp_vset(char *varname, enum cp_types type, void *value)
tfree(copyvarname);
}
/* CDHW This needs leak checking carefully CDHW */
/* mhx: Uses ft_numparse, which interprets SPICE numbers. Therefore it worked incorrectly
for com_set: it prevented e.g. set ape="1MEG" (ape became CP_NUM 1e6 instead of CP_STRING '1meg').
Therefore I changed the function to FIRST check if the rhs is a string (look for quotes), and only
if it is not, continue with ft_numparse.
/* mhx: Uses ft_numparse, which interprets SPICE numbers. Therefore it worked incorrectly
for com_set: it prevented e.g. set ape="1MEG" (ape became CP_NUM 1e6 instead of CP_STRING '1meg').
Therefore I changed the function to FIRST check if the rhs is a string (look for quotes), and only
if it is not, continue with ft_numparse.
Note: cp_setparse is used by com_set and com_option, where this new behavior should be ok.
cp_setparse is used in inp.c (4) for .option scale=xxx. Assumed new behavior will be ok.
cp_setparse is used in rawfile.c (2) to parse "option: xxx". Assumed new behavior will be ok.
@ -268,14 +242,10 @@ cp_setparse(wordlist *wl)
struct variable *listv = NULL, *vv, *lv = NULL;
struct variable *vars = NULL;
int balance;
while (wl) {
if (name)
tfree(name);
name = cp_unquote(wl->wl_word);
wl = wl->wl_next;
if ((!wl || (*wl->wl_word != '=')) && !strchr(name, '=')) { /* 'name ccccc' */
vv = alloc(struct variable);
@ -287,8 +257,7 @@ cp_setparse(wordlist *wl)
tfree(name); /*DG: cp_unquote Memory leak*/
continue;
}
if (wl && eq(wl->wl_word, "=")) { /* 'name =' */
if (wl && eq(wl->wl_word, "=")) { /* 'name =' */
wl = wl->wl_next;
if (wl == NULL) {
fprintf(cp_err, "ERROR: bad set form.\n");
@ -324,20 +293,18 @@ cp_setparse(wordlist *wl)
controlled_exit(EXIT_BAD);
return NULL;
}
/* val = cp_unquote(val); DG: bad old val is lost*/
isstring = (*val == '"'); /* mhx: is this sufficient? */
copyval = cp_unquote(val); /*DG*/
isstring = (*val == '"'); /* mhx: is this sufficient? */
copyval = cp_unquote(val); /*DG*/
strcpy(val, copyval);
tfree(copyval);
if (eq(val, "(")) {
if (eq(val, "(")) {
/* The beginning of a list... We have to walk down the
* list until we find a close paren... If there are nested
* ()'s, treat them as tokens... */
balance = 1;
while (wl && wl->wl_word) {
bool isstringc;
bool isstringc;
if (eq(wl->wl_word, "(")) {
balance++;
} else if (eq(wl->wl_word, ")")) {
@ -346,13 +313,13 @@ cp_setparse(wordlist *wl)
}
vv = alloc(struct variable);
vv->va_next = NULL;
isstringc = (*wl->wl_word == '"'); /* mhx: is this sufficient? */
copyval = ss = cp_unquote(wl->wl_word);
isstringc = (*wl->wl_word == '"'); /* mhx: is this sufficient? */
copyval = ss = cp_unquote(wl->wl_word);
if (isstringc) {
vv->va_type = CP_STRING;
vv->va_string = copy(ss);
} else {
td = ft_numparse(&ss, FALSE);
td = ft_numparse(&ss, FALSE);
if (td) {
vv->va_type = CP_REAL;
vv->va_real = *td;
@ -361,14 +328,14 @@ cp_setparse(wordlist *wl)
vv->va_string = copy(ss);
fprintf(cp_err, "cp_setparse() :: ft_numparse() didn't recognize `%s' for assignment to `%s' as CP_REAL, using CP_STRING.\n", ss, name);
}
}
}
tfree(copyval); /*DG: must free ss any way to avoid cp_unquote memory leak*/
if (listv) {
lv->va_next = vv;
lv = vv;
} else {
listv = lv = vv;
}
}
wl = wl->wl_next;
}
if (balance && !wl) {
@ -378,31 +345,28 @@ cp_setparse(wordlist *wl)
controlled_exit(EXIT_BAD);
return NULL;
}
vv = alloc(struct variable);
vv->va_name = copy(name);
vv->va_type = CP_LIST;
vv->va_vlist = listv;
vv->va_next = vars;
vars = vv;
wl = wl->wl_next;
continue;
}
/* there shouldn't be quotes around val at this point? */
/* there shouldn't be quotes around val at this point? */
if (*val == '"')
isstring |= TRUE; /* mhx: is this sufficient? */
copyval = ss = cp_unquote(val); /* 'name = ccccc' */
vv = alloc(struct variable);
vv->va_name = copy(name);
vv->va_next = vars;
vars = vv;
copyval = ss = cp_unquote(val); /* 'name = ccccc'*/
vv = alloc(struct variable);
vv->va_name = copy(name);
vv->va_next = vars;
vars = vv;
if (isstring) {
vv->va_type = CP_STRING;
vv->va_string = copy(val);
} else {
td = ft_numparse(&ss, FALSE); /* FALSE: because set x=1umeter should work and 'meter' ignored */
td = ft_numparse(&ss, FALSE); /* FALSE: because set x=1umeter should work and 'meter' ignored */
if (td) {
vv->va_type = CP_REAL;
vv->va_real = *td;
@ -410,17 +374,15 @@ cp_setparse(wordlist *wl)
vv->va_type = CP_STRING;
vv->va_string = copy(val);
}
}
tfree(copyval); /*DG: must free ss any way to avoid cp_unquote memory leak */
tfree(name); /* va: cp_unquote memory leak: free name for every loop */
}
tfree(copyval); /*DG: must free ss any way to avoid cp_unquote memory leak */
tfree(name); /* va: cp_unquote memory leak: free name for every loop */
}
if (name)
tfree(name);
return vars;
}
/* free the struct variable. The type of the union is given by va_type */
void
free_struct_variable(struct variable *v)
@ -436,7 +398,6 @@ free_struct_variable(struct variable *v)
}
}
void
cp_remvar(char *varname)
{
@ -444,9 +405,7 @@ cp_remvar(char *varname)
struct variable *uv1, *uv2;
bool found = TRUE;
int i, var_index = 0;
cp_usrvars(&uv1, &uv2);
for (v = variables; v; v = v->va_next) {
var_index = 0;
if (eq(v->va_name, varname))
@ -480,7 +439,6 @@ cp_remvar(char *varname)
v->va_num = 0;
found = FALSE;
}
/* Note that 'unset history' doesn't do anything here... Causes
* trouble... */
if (eq(varname, "noglob"))
@ -501,7 +459,6 @@ cp_remvar(char *varname)
cp_program = "";
switch (i = cp_usrset(v, FALSE)) {
case US_OK:
/* Normal case. */
if (found) {
@ -515,10 +472,8 @@ cp_remvar(char *varname)
} else {
ft_curckt->ci_vars = v->va_next;
}
}
break;
case US_DONTRECORD:
/* Do nothing... */
if (found)
@ -527,7 +482,7 @@ cp_remvar(char *varname)
case US_READONLY:
/* Badness... */
fprintf(cp_err, "ERROR: %s is read-only.\n", v->va_name);
fprintf(cp_err, "ERROR: %s is read-only.\n", v->va_name);
if (found)
fprintf(cp_err, "cp_remvar: INTERNAL ERROR: var %d\n", *varname);
break;
@ -543,7 +498,7 @@ cp_remvar(char *varname)
}
if (u) {
if (lv)
lv->va_next = u->va_next;
lv->va_next = u->va_next;
else
ft_curckt->ci_vars = u->va_next;
tfree(u);
@ -555,26 +510,22 @@ cp_remvar(char *varname)
fprintf(cp_err, "cp_remvar: INTERNAL ERROR: US val %d\n", i);
break;
}
v->va_next = NULL;
tfree(v->va_name);
free_struct_variable(v);
free_struct_variable(uv1);
}
/*
/*
* Determine the value of a variable. Fail if the variable is unset,
* and if the type doesn't match, try and make it work...
* and if the type doesn't match, try and make it work...
*/
bool
cp_getvar(char *name, enum cp_types type, void *retval)
{
struct variable *v;
struct variable *uv1, *uv2;
cp_usrvars(&uv1, &uv2);
for (v = variables; v && !eq(name, v->va_name); v = v->va_next)
;
if (v == NULL)
@ -583,14 +534,12 @@ cp_getvar(char *name, enum cp_types type, void *retval)
if (v == NULL)
for (v = uv2; v && !eq(name, v->va_name); v = v->va_next)
;
if (v == NULL) {
if (type == CP_BOOL && retval)
* (bool *) retval = FALSE;
free_struct_variable(uv1);
return FALSE;
}
if (v->va_type == type) {
switch (type) {
case CP_BOOL:
@ -630,9 +579,7 @@ cp_getvar(char *name, enum cp_types type, void *retval)
}
free_struct_variable(uv1);
return TRUE;
} else {
/* Try to coerce it.. */
if ((type == CP_NUM) && (v->va_type == CP_REAL)) {
int *i;
@ -660,7 +607,6 @@ cp_getvar(char *name, enum cp_types type, void *retval)
}
}
/* A variable substitution is indicated by a $, and the variable name
* is the following string of non-special characters. All variable
* values are inserted as a single word, except for lists, which are a
@ -685,8 +631,7 @@ span_var_expr(char *t)
{
int parenthesis = 0;
int brackets = 0;
while (*t && (isalphanum((int)*t) || strchr(VALIDCHARS, *t)))
while (*t && (isalphanum((int)*t) || strchr(VALIDCHARS, *t)))
switch (*t++)
{
case '[':
@ -710,11 +655,9 @@ span_var_expr(char *t)
default:
break;
}
return t;
}
wordlist *
cp_variablesubst(wordlist *wlist)
{
@ -724,7 +667,6 @@ cp_variablesubst(wordlist *wlist)
int i;
for (wl = wlist; wl; wl = wl->wl_next) {
t = wl->wl_word;
i = 0;
while ((s = strchr(t, cp_dol)) != NULL) {
@ -744,9 +686,9 @@ cp_variablesubst(wordlist *wlist)
if (i) {
(void) strcpy(buf, wbuf);
if (nwl) {
(void) strcat(buf, nwl->wl_word);
tfree(nwl->wl_word);
nwl->wl_word = copy(buf);
(void) strcat(buf, nwl->wl_word);
tfree(nwl->wl_word);
nwl->wl_word = copy(buf);
} else {
nwl = wl_cons(copy(buf), NULL);
}
@ -770,11 +712,9 @@ cp_variablesubst(wordlist *wlist)
wbuf[i++] = *s;
}
}
return wlist;
}
/* Evaluate a variable. */
wordlist *
vareval(char *string)
@ -785,21 +725,17 @@ vareval(char *string)
char *oldstring = copy(string);
char *range = NULL;
int i, up, low;
cp_wstrip(string);
if ((s = strchr(string, '[')) != NULL) {
*s = '\0';
range = s + 1;
}
switch (*string) {
case '$':
(void) sprintf(buf, "%d", getpid());
wl = wl_cons(copy(buf), NULL);
tfree(oldstring);
return (wl);
case '<':
(void) fflush(cp_out);
if (!fgets(buf, BSIZE_SP, cp_in)) {
@ -815,7 +751,6 @@ vareval(char *string)
wl->wl_word = copy("");
tfree(oldstring);
return (wl);
case '?':
string++;
for (v = variables; v; v = v->va_next)
@ -826,7 +761,6 @@ vareval(char *string)
wl = wl_cons(copy(v ? "1" : "0"), NULL);
tfree(oldstring);
return (wl);
case '#':
string++;
for (v = variables; v; v = v->va_next)
@ -848,13 +782,11 @@ vareval(char *string)
wl = wl_cons(copy(buf), NULL);
tfree(oldstring);
return (wl);
case '\0':
wl = wl_cons(copy("$"), NULL);
tfree(oldstring);
return (wl);
}
/* The notation var[stuff] has two meanings... If this is a real
* variable, then the [] denotes range, but if this is a strange
* (e.g, device parameter) variable, it could be anything...
@ -884,7 +816,6 @@ vareval(char *string)
return NULL;
}
wl = cp_varwl(v);
/* Now parse and deal with 'range' ... */
if (range) {
/* rather crude fix when range itself is a $expression */
@ -922,21 +853,18 @@ vareval(char *string)
return wl;
}
static int
vcmp(const void *a, const void *b)
{
int i;
struct xxx *v1 = (struct xxx *) a;
struct xxx *v2 = (struct xxx *) b;
if ((i = strcmp(v1->x_v->va_name, v2->x_v->va_name)) != 0)
return (i);
else
return (v1->x_char - v2->x_char);
}
/* Print the values of currently defined variables. */
void
cp_vprint(void)
@ -947,18 +875,14 @@ cp_vprint(void)
int i, j;
char *s;
struct xxx *vars;
cp_usrvars(&uv1, &uv2);
for (v = uv1, i = 0; v; v = v->va_next)
i++;
for (v = uv2; v; v = v->va_next)
i++;
for (v = variables; v; v = v->va_next)
i++;
vars = TMALLOC(struct xxx, i);
out_init();
for (v = variables, i = 0; v; v = v->va_next, i++) {
vars[i].x_v = v;
@ -972,9 +896,7 @@ cp_vprint(void)
vars[i].x_v = v;
vars[i].x_char = '+';
}
qsort(vars, (size_t) i, sizeof(*vars), vcmp);
for (j = 0; j < i; j++) {
if (j && eq(vars[j].x_v->va_name, vars[j-1].x_v->va_name))
continue;
@ -991,6 +913,5 @@ cp_vprint(void)
out_printf("%s\n", s);
}
}
tfree(vars);
}

View File

@ -1,6 +1,6 @@
/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group
**********/
/*
@ -24,7 +24,6 @@ Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group
struct dvec *EVTfindvec(char *node);
static void
vec_rebuild_lookup_table(struct plot *pl)
{
@ -55,7 +54,6 @@ vec_rebuild_lookup_table(struct plot *pl)
pl->pl_lookup_valid = TRUE;
}
/* Find a named vector in a plot. We are careful to copy the vector if
* v_link2 is set, because otherwise we will get screwed up. */
static struct dvec *
@ -77,7 +75,7 @@ findvec(char *word, struct plot *pl)
vec_new(v);
} else {
v = d;
}
}
if (end)
end->v_link2 = v;
else
@ -96,7 +94,7 @@ findvec(char *word, struct plot *pl)
vec_new(v);
} else {
v = d;
}
}
if (end)
end->v_link2 = v;
else
@ -111,11 +109,11 @@ findvec(char *word, struct plot *pl)
for (d = pl->pl_dvecs; d; d = d->v_next) {
if ((d->v_flags & VF_PERMANENT) && (d->v_type == SV_CURRENT)) {
if (d->v_link2) {
v = vec_copy(d);
vec_new(v);
v = vec_copy(d);
vec_new(v);
} else {
v = d;
}
}
if (end)
end->v_link2 = v;
else
@ -130,11 +128,11 @@ findvec(char *word, struct plot *pl)
for (d = pl->pl_dvecs; d; d = d->v_next) {
if ((d->v_flags & VF_PERMANENT) && (!cieq(d->v_name, pl->pl_scale->v_name))) {
if (d->v_link2) {
v = vec_copy(d);
vec_new(v);
v = vec_copy(d);
vec_new(v);
} else {
v = d;
}
}
if (end)
end->v_link2 = v;
else
@ -187,7 +185,6 @@ findvec(char *word, struct plot *pl)
return d;
}
/* If there are imbedded numeric strings, compare them numerically, not
* alphabetically.
*/
@ -219,7 +216,6 @@ namecmp(const void *a, const void *b)
}
}
static int
veccmp(const void *a, const void *b)
{
@ -233,7 +229,6 @@ veccmp(const void *a, const void *b)
return namecmp((*d1)->v_name, (*d2)->v_name);
}
/* Sort all the vectors in d, first by plot name and then by vector
* name. Do the right thing with numbers. */
static struct dvec *
@ -261,7 +256,6 @@ sortvecs(struct dvec *d)
return d;
}
/* Load in a rawfile. */
void
ft_loadfile(char *file)
@ -293,7 +287,6 @@ ft_loadfile(char *file)
plotl_changed = TRUE;
}
void
plot_add(struct plot *pl)
{
@ -303,7 +296,6 @@ plot_add(struct plot *pl)
fprintf(cp_out, "Title: %s\nName: %s\nDate: %s\n\n", pl->pl_title,
pl->pl_name, pl->pl_date);
if (plot_cur)
plot_cur->pl_ccom = cp_kwswitch(CT_VECTOR, pl->pl_ccom);
@ -329,32 +321,24 @@ plot_add(struct plot *pl)
plot_setcur(pl->pl_typename);
}
/* Remove a vector from the database, if it is there. */
void
vec_remove(char *name)
{
struct dvec *ov;
for (ov = plot_cur->pl_dvecs; ov; ov = ov->v_next)
if (cieq(name, ov->v_name) && (ov->v_flags & VF_PERMANENT))
break;
if (!ov)
return;
ov->v_flags &= ~VF_PERMANENT;
/* Remove from the keyword list. */
cp_remkword(CT_VECTOR, name);
}
/* Get a vector by name. This deals with v(1), etc. almost properly. Also,
* it checks for pre-defined vectors.
*/
struct dvec *
vec_fromplot(char *word, struct plot *plot)
{
@ -374,7 +358,7 @@ vec_fromplot(char *word, struct plot *plot)
}
/* scanf("%c(%s)" doesn't do what it should do. ) */
if (!d && (sscanf(word, "%c(%s", /* ) */ &cc, buf) == 2) &&
if (!d && (sscanf(word, "%c(%s", /* ) */ &cc, buf) == 2) &&
/* ( */ ((s = strrchr(buf, ')')) != NULL) &&
(s[1] == '\0')) {
*s = '\0';
@ -385,17 +369,15 @@ vec_fromplot(char *word, struct plot *plot)
}
d = findvec(buf, plot);
}
return d;
}
/* This is the main lookup routine for names. The possible types of names are:
* name An ordinary vector.
* plot.name A vector from a particular plot.
* name An ordinary vector.
* plot.name A vector from a particular plot.
* @device[parm] A device parameter.
* @model[parm] A model parameter.
* @param A circuit parameter.
* @param A circuit parameter.
* For the @ cases, we construct a dvec with length 1 to hold the value.
* In the other two cases, either the plot or the name can be "all", a
* wildcard.
@ -413,12 +395,12 @@ vec_get(const char *vec_name)
char buf[BSIZE_SP], *s, *wd, *word, *whole, *name = NULL, *param;
int i = 0;
struct variable *vv;
int indexvar; /* mhx */
wd = word = copy(vec_name); /* Gets mangled below... */
if (*word != SPECCHAR) { /* mhx: eventually replace atoi() by full evaluate */
char *ps = strchr(wd, '['), *pe = strchr(wd, ']');
int indexvar; /* mhx */
wd = word = copy(vec_name); /* Gets mangled below... */
if (*word != SPECCHAR) { /* mhx: eventually replace atoi() by full evaluate */
char *ps = strchr(wd, '['), *pe = strchr(wd, ']');
if (ps && pe && pe > ps) {
whole = copy(word);
*ps = '\0';
@ -448,11 +430,11 @@ vec_get(const char *vec_name)
} else {
/* This used to be an error... */
pl = plot_cur;
}
}
}
} else {
pl = plot_cur;
}
}
if (pl) {
d = vec_fromplot(word, pl);
@ -473,29 +455,29 @@ vec_get(const char *vec_name)
}
}
d = newv;
if (!d) {
if (!d) {
fprintf(cp_err,
"ERROR: plot wildcard (name %s) matches nothing\n",
word);
tfree(wd);
tfree(wd);
return NULL;
}
}
/* In case of data[ix] we must return a SINGLE value
(vector of length 1) instead of the vector.
/* In case of data[ix] we must return a SINGLE value
(vector of length 1) instead of the vector.
Duplicates a lot of code that still follows :-( */
if (d && indexvar != -1) {
struct dvec *ad;
ad = alloc(struct dvec);
ZERO(ad, struct dvec);
ad->v_name = copy(whole); /* so the name could be data[2] or data[expression] :-) */
ad->v_type = d->v_type;
ad->v_flags = d->v_flags; /* VF_REAL; or complex? */
ad->v_length = 1;
ad->v_realdata = TMALLOC(double, 1);
*ad->v_realdata = *d->v_realdata;
tfree(whole);
struct dvec *ad;
ad = alloc(struct dvec);
ZERO(ad, struct dvec);
ad->v_name = copy(whole); /* so the name could be data[2] or data[expression] :-) */
ad->v_type = d->v_type;
ad->v_flags = d->v_flags; /* VF_REAL; or complex? */
ad->v_length = 1;
ad->v_realdata = TMALLOC(double, 1);
*ad->v_realdata = *d->v_realdata;
tfree(whole);
}
if (!d && (*word == SPECCHAR)) {
@ -519,16 +501,14 @@ vec_get(const char *vec_name)
*s = '\0';
} else {
param = NULL;
}
}
if (ft_curckt) {
/*
* This is what is done in case of "alter r1 resistance = 1234"
* This is what is done in case of "alter r1 resistance = 1234"
* r1 resistance, 0
* if_setparam(ft_curckt->ci_ckt, &dev, param, dv, do_model);
*/
/* vv = if_getparam (ft_curckt->ci_ckt, &name, param, 0, 0); */
vv = if_getparam(ft_curckt->ci_ckt, &name, param, 0, 0);
if (!vv) {
@ -563,7 +543,7 @@ vec_get(const char *vec_name)
* print @pot[pos_node]
* To fix this, it is necessary to define:
* OPU( "pos_node", POT_QUEST_POS_NODE, IF_REAL,"Positive node of potentiometer"),
* int POTnegNode; // number of negative node of potentiometer (Node_3)
* int POTnegNode; // number of negative node of potentiometer (Node_3)
* case POT_QUEST_POS_NODE:
* value->rValue = (double)fast->POTposNode;
* return OK;
@ -595,7 +575,6 @@ vec_get(const char *vec_name)
* used with the parameters of isrc and vsrc
*/
struct variable *nv;
double *list;
list = TMALLOC(double, 1);
nv = alloc(struct variable);
@ -646,17 +625,15 @@ vec_get(const char *vec_name)
case CP_NUM:
fprintf(stdout, "%s=%d\n", nv->va_name, nv->va_num);
break;
default: {
default: {
fprintf(stderr, "ERROR: enumeration value `CP_BOOL' or `CP_LIST' not handled in vec_get\nAborting...\n");
controlled_exit(EXIT_FAILURE);
}
}
}
nv = nv->va_next;
if (!nv)
break;
}
/* To distinguish those does not take anything for print screen to
* make a print or M1 @ @ M1 [all] leaving only the correct data
* and not the last
@ -664,7 +641,6 @@ vec_get(const char *vec_name)
d->v_rlength = 1;
}
}
tfree(vv->va_name);
tfree(vv); /* va: tfree vv->va_name and vv (avoid memory leakages) */
tfree(wd);
@ -672,16 +648,13 @@ vec_get(const char *vec_name)
tfree(whole);
return d;
}
tfree(wd);
return sortvecs(d);
}
/* Execute the commands for a plot. This is done whenever a plot becomes
* the current plot.
*/
void
plot_docoms(wordlist *wl)
{
@ -697,9 +670,7 @@ plot_docoms(wordlist *wl)
cp_interactive = inter;
}
/* Create a copy of a vector. */
struct dvec *
vec_copy(struct dvec *v)
{
@ -743,9 +714,9 @@ vec_copy(struct dvec *v)
*/
nv->v_rlength = v->v_rlength;
nv->v_outindex = 0; /*XXX???*/
nv->v_linestyle = 0; /*XXX???*/
nv->v_color = 0; /*XXX???*/
nv->v_outindex = 0; /*XXX???*/
nv->v_linestyle = 0; /*XXX???*/
nv->v_color = 0; /*XXX???*/
nv->v_defcolor = v->v_defcolor;
nv->v_numdims = v->v_numdims;
for (i = 0; i < v->v_numdims; i++)
@ -758,11 +729,9 @@ vec_copy(struct dvec *v)
return nv;
}
/* Create a new plot structure. This just fills in the typename and sets up
* the ccom struct.
*/
struct plot *
plot_alloc(char *name)
{
@ -792,16 +761,14 @@ plot_alloc(char *name)
return pl;
}
/* Stick a new vector in the proper place in the plot list. */
void
vec_new(struct dvec *d)
{
/* Note that this can't happen. */
if (plot_cur == NULL) {
fprintf(cp_err, "vec_new: INTERNAL ERROR: no cur plot\n");
controlled_exit(1);
controlled_exit(1);
}
plot_cur->pl_lookup_valid = FALSE;
if ((d->v_flags & VF_PERMANENT) && (plot_cur->pl_scale == NULL))
@ -816,7 +783,6 @@ vec_new(struct dvec *d)
d->v_plot->pl_dvecs = d;
}
/* Because of the way that all vectors, including temporary vectors,
* are linked together under the current plot, they can often be
* left lying around. This gets rid of all vectors that don't have
@ -841,13 +807,11 @@ vec_gc(void)
vec_free(d);
}
}
for (pl = plot_list; pl; pl = pl->pl_next)
for (d = pl->pl_dvecs; d; d = d->v_next)
d->v_link2 = NULL;
}
/* Free a dvector. This is sort of a pain because we also have to make sure
* that it has been unlinked from its plot structure. If the name of the
* vector is NULL, then we have already freed it so don't try again. (This
@ -885,14 +849,14 @@ vec_free_x(struct dvec *v)
}
if (pl->pl_scale == v) {
if (pl->pl_dvecs)
pl->pl_scale = pl->pl_dvecs; /* Random one... */
pl->pl_scale = pl->pl_dvecs; /* Random one... */
else
pl->pl_scale = NULL;
}
}
if (v->v_name)
tfree(v->v_name);
tfree(v->v_name);
if (v->v_realdata)
tfree(v->v_realdata);
if (v->v_compdata)
@ -900,34 +864,29 @@ vec_free_x(struct dvec *v)
tfree(v);
}
/*
* return TRUE if every vector element is zero
*/
BOOL
vec_iszero(struct dvec *v)
{
int i;
for (; v; v = v->v_link2)
if (isreal(v))
for (i = 0; i < v->v_length; i++) {
int i;
for (; v; v = v->v_link2)
if (isreal(v))
for (i = 0; i < v->v_length; i++) {
if (v->v_realdata[i] != 0.0)
return FALSE;
}
}
else
for (i = 0; i < v->v_length; i++) {
if (realpart(v->v_compdata[i]) != 0.0)
return FALSE;
if (imagpart(v->v_compdata[i]) != 0.0)
return FALSE;
}
return TRUE;
}
return TRUE;
}
/* This is something we do in a few places... Since vectors get copied a lot,
* we can't just compare pointers to tell if two vectors are 'really' the same.
*/
@ -945,7 +904,7 @@ vec_eq(struct dvec *v1, struct dvec *v2)
s2 = vec_basename(v2);
if (cieq(s1, s2))
rtn = TRUE;
rtn = TRUE;
else
rtn = FALSE;
@ -966,7 +925,7 @@ vec_basename(struct dvec *v)
if (strchr(v->v_name, '.')) {
if (cieq(v->v_plot->pl_typename, v->v_name))
(void) strcpy(buf, v->v_name + strlen(v->v_name) + 1);
(void) strcpy(buf, v->v_name + strlen(v->v_name) + 1);
else
(void) strcpy(buf, v->v_name);
} else {
@ -984,7 +943,6 @@ vec_basename(struct dvec *v)
return copy(s);
}
/* Make a plot the current one. This gets called by cp_usrset() when one
* does a 'set curplot = name'.
* va: ATTENTION: has unlinked old keyword-class-tree from keywords[CT_VECTOR]
@ -1042,7 +1000,6 @@ plot_new(struct plot *pl)
* The data array is replaced with a new one that has the elements
* in the proper order. Otherwise the transposition is done in place.
*/
void
vec_transpose(struct dvec *v)
{
@ -1064,7 +1021,6 @@ vec_transpose(struct dvec *v)
*/
blocksize = dim0*dim1;
nummatrices = v->v_length / blocksize;
/* Note:
* olda[i,j] is at data[i*dim0+j]
* newa[j,i] is at data[j*dim1+i]
@ -1074,7 +1030,6 @@ vec_transpose(struct dvec *v)
* though. The formulation below gathers scattered old data into
* consecutive new data.
*/
if (isreal(v)) {
newreal = TMALLOC(double, v->v_length);
oldreal = v->v_realdata;
@ -1119,7 +1074,6 @@ vec_transpose(struct dvec *v)
* of 1-d vectors, linked together with v_link2. It is here so that plot
* can do intelligent things.
*/
struct dvec *
vec_mkfamily(struct dvec *v)
{
@ -1145,14 +1099,11 @@ vec_mkfamily(struct dvec *v)
for (i = 0; i < MAXDIMS; i++)
count[i] = 0;
for (d = vecs, j = 0; d; j++, d = d->v_link2) {
indexstring(count, v->v_numdims - 1, buf2);
(void) sprintf(buf, "%s%s", v->v_name, buf2);
d->v_name = copy(buf);
d->v_type = v->v_type;
d->v_flags = v->v_flags;
d->v_minsignal = v->v_minsignal;
d->v_maxsignal = v->v_maxsignal;
d->v_gridtype = v->v_gridtype;
@ -1177,13 +1128,10 @@ vec_mkfamily(struct dvec *v)
for (d = vecs; d; d = d->v_link2)
vec_new(d);
return vecs;
}
/* This function will match "op" with "op1", but not "op1" with "op12". */
bool
plot_prefix(char *pre, char *str)
{
@ -1198,7 +1146,7 @@ plot_prefix(char *pre, char *str)
}
if (*pre || (*str && isdigit((int)pre[-1])))
return FALSE;
return FALSE;
else
return TRUE;
}