Vera's patch to close "show +" and similar constructs segfault.
This commit is contained in:
parent
d2472a93a9
commit
1baba94cd1
|
|
@ -73,7 +73,7 @@ all_show(wordlist *wl, int mode)
|
|||
|
||||
if (!cp_getvar("width", VT_NUM, (char *) &screen_width))
|
||||
screen_width = DEF_WIDTH;
|
||||
count = (screen_width - LEFT_WIDTH) / (DEV_WIDTH + 1);
|
||||
count = (screen_width - LEFT_WIDTH) / (DEV_WIDTH + 1);
|
||||
|
||||
n = 0;
|
||||
do {
|
||||
|
|
@ -101,10 +101,7 @@ all_show(wordlist *wl, int mode)
|
|||
else
|
||||
thisgroup = next;
|
||||
}
|
||||
/*
|
||||
tfree(w->wl_word);
|
||||
tfree(w);
|
||||
*/
|
||||
/* w must not be freed here */
|
||||
w = NULL;
|
||||
} else if (eq(w->wl_word, "+")) {
|
||||
if (params) {
|
||||
|
|
@ -120,16 +117,10 @@ all_show(wordlist *wl, int mode)
|
|||
else
|
||||
thisgroup = next;
|
||||
}
|
||||
/*
|
||||
tfree(w->wl_word);
|
||||
tfree(w);
|
||||
*/
|
||||
/* w must not be freed here */
|
||||
w = NULL;
|
||||
} else if (eq(w->wl_word, ":")) {
|
||||
/*
|
||||
tfree(w->wl_word);
|
||||
tfree(w);
|
||||
*/
|
||||
/* w must not be freed here */
|
||||
w = NULL;
|
||||
if (!params) {
|
||||
params = next;
|
||||
|
|
@ -145,10 +136,7 @@ all_show(wordlist *wl, int mode)
|
|||
}
|
||||
} else if (eq(w->wl_word, ";") || eq(w->wl_word, ",")) {
|
||||
nextgroup = next;
|
||||
/*
|
||||
tfree(w->wl_word);
|
||||
tfree(w);
|
||||
*/
|
||||
/* w must not be freed here */
|
||||
w = NULL;
|
||||
if (prev)
|
||||
prev->wl_next = NULL;
|
||||
|
|
@ -180,7 +168,7 @@ all_show(wordlist *wl, int mode)
|
|||
if (ft_sim->devices[dg->dev_type_no]->numModelParms) {
|
||||
i = 0;
|
||||
do {
|
||||
printf("%*s", LEFT_WIDTH, "model");
|
||||
printf("%*s", LEFT_WIDTH, "model");
|
||||
j = dgen_for_n(dg, count, printstr, "m", i);
|
||||
i += 1;
|
||||
printf("\n");
|
||||
|
|
@ -193,7 +181,7 @@ all_show(wordlist *wl, int mode)
|
|||
else if (!params)
|
||||
param_forall(dg, DGEN_DEFPARAMS);
|
||||
if (params)
|
||||
wl_forall(params, listparam, (void *)dg);
|
||||
wl_forall(params, listparam, dg);
|
||||
printf("\n");
|
||||
|
||||
} else if (ft_sim->devices[dg->dev_type_no]->numModelParms) {
|
||||
|
|
@ -215,7 +203,7 @@ all_show(wordlist *wl, int mode)
|
|||
else if (!params)
|
||||
param_forall(dg, DGEN_DEFPARAMS);
|
||||
if (params)
|
||||
wl_forall(params, listparam, (void *)dg);
|
||||
wl_forall(params, listparam, dg);
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
|
@ -254,7 +242,7 @@ printstr(dgen *dg, char *name)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
param_forall(dgen *dg, int flags)
|
||||
{
|
||||
int i, j, k, found;
|
||||
|
|
@ -286,8 +274,7 @@ param_forall(dgen *dg, int flags)
|
|||
plist[i].keyword);
|
||||
else
|
||||
printf("%*.*s", LEFT_WIDTH, LEFT_WIDTH, " ");
|
||||
k = dgen_for_n(dg, count, printvals,
|
||||
(char *) (plist + i), j);
|
||||
k = dgen_for_n(dg, count, printvals, (plist + i), j);
|
||||
printf("\n");
|
||||
j += 1;
|
||||
} while (k);
|
||||
|
|
@ -296,7 +283,7 @@ param_forall(dgen *dg, int flags)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
listparam(wordlist *p, dgen *dg)
|
||||
{
|
||||
int i, j, k, found;
|
||||
|
|
@ -331,7 +318,7 @@ listparam(wordlist *p, dgen *dg)
|
|||
printf("%*.*s", LEFT_WIDTH, LEFT_WIDTH, p->wl_word);
|
||||
else
|
||||
printf("%*.*s", LEFT_WIDTH, LEFT_WIDTH, " ");
|
||||
k = dgen_for_n(dg, count, printvals, (void *)(plist + i), j);
|
||||
k = dgen_for_n(dg, count, printvals, (plist + i), j);
|
||||
printf("\n");
|
||||
j += 1;
|
||||
} while (k > 0);
|
||||
|
|
@ -462,7 +449,7 @@ printvals(dgen *dg, IFparm *p, int i)
|
|||
|
||||
|
||||
/* (old "show" command)
|
||||
* Display various device parameters. The syntax of this command is
|
||||
* Display various device parameters. The syntax of this command is
|
||||
* show devicelist : parmlist
|
||||
* where devicelist can be "all", the name of a device, a string like r*,
|
||||
* which means all devices with names that begin with 'r', repeated one
|
||||
|
|
@ -495,7 +482,7 @@ old_show(wordlist *wl)
|
|||
inp_casefix(devs->wl_word);
|
||||
tw = wl_append(tw, devexpand(devs->wl_word));
|
||||
}
|
||||
|
||||
|
||||
devs = tw;
|
||||
for (tw = parms; tw; tw = tw->wl_next)
|
||||
if (eq(tw->wl_word, "all"))
|
||||
|
|
@ -571,7 +558,7 @@ com_altermod(wordlist *wl)
|
|||
com_alter_common(wl, 1);
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
com_alter_common(wordlist *wl, int do_model)
|
||||
{
|
||||
wordlist *eqword, *words;
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ wl_forall(wordlist *wl, void (*fn) (/* ??? */), void *data)
|
|||
dgen *
|
||||
dgen_init(GENcircuit *ckt, wordlist *wl, int nomix, int flag, int model)
|
||||
{
|
||||
dgen *dg;
|
||||
dgen *dg, *dg_save;
|
||||
wordlist **prevp;
|
||||
|
||||
dg = NEW(dgen);
|
||||
|
|
@ -37,6 +37,7 @@ dgen_init(GENcircuit *ckt, wordlist *wl, int nomix, int flag, int model)
|
|||
dg->dev_type_no = -1;
|
||||
dg->dev_list = wl;
|
||||
dg->flags = 0;
|
||||
dg_save = dg; /* va: save, to avoid memory leak */
|
||||
|
||||
prevp = &wl;
|
||||
|
||||
|
|
@ -51,6 +52,8 @@ dgen_init(GENcircuit *ckt, wordlist *wl, int nomix, int flag, int model)
|
|||
dg->flags |= DGEN_DEFDEVS | flag;
|
||||
|
||||
dgen_next(&dg);
|
||||
/* va: it might be too much tests, but safer is better... */
|
||||
if (dg!=dg_save && dg==NULL && dg_save!=NULL) tfree(dg_save);
|
||||
|
||||
return dg;
|
||||
}
|
||||
|
|
@ -79,18 +82,17 @@ dgen_for_n(dgen *dg, int n, int (*fn) (/* ??? */), void *data, int subindex)
|
|||
}
|
||||
|
||||
void
|
||||
dgen_nth_next(dgen **dg, int n)
|
||||
dgen_nth_next(dgen **p_dg, int n)
|
||||
{
|
||||
int i, dnum;
|
||||
dgen * dg_old=*dg;
|
||||
dgen * dg_save=*p_dg; /* va: save, to avoid memory leak */
|
||||
|
||||
dnum = (*p_dg)->dev_type_no;
|
||||
|
||||
dnum = (*dg)->dev_type_no;
|
||||
|
||||
for (i = 0; *dg && (*dg)->dev_type_no == dnum && i < n; i++) {
|
||||
dgen_next(dg);
|
||||
/* va, it might be too much tests, but safer is better... */
|
||||
if (*dg!=dg_old && *dg==NULL && dg_old!=NULL) tfree(dg_old);
|
||||
for (i = 0; *p_dg && (*p_dg)->dev_type_no == dnum && i < n; i++) {
|
||||
dgen_next(p_dg);
|
||||
/* va: it might be too much tests, but safer is better... */
|
||||
if (*p_dg!=dg_save && *p_dg==NULL && dg_save!=NULL) tfree(dg_save);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,11 +6,12 @@
|
|||
#ifndef GENS_H_INCLUDED
|
||||
#define GENS_H_INCLUDED
|
||||
|
||||
void wl_forall(wordlist *wl, void (*fn) (/* ??? */), void *data);
|
||||
#include "dgen.h"
|
||||
|
||||
void wl_forall(wordlist *wl, void (*fn)(/* ??? */), void *data);
|
||||
dgen * dgen_init(GENcircuit *ckt, wordlist *wl, int nomix, int flag, int model);
|
||||
int dgen_for_n(dgen *dg, int n, int (*fn) (/* ??? */), void *data, int subindex);
|
||||
void dgen_nth_next(dgen **dg, int n);
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
#endif /* GENS_H_INCLUDED */
|
||||
Loading…
Reference in New Issue