diff --git a/src/frontend/shyu.c b/src/frontend/shyu.c index d139394a1..f77d858d3 100644 --- a/src/frontend/shyu.c +++ b/src/frontend/shyu.c @@ -323,9 +323,16 @@ next: else flag = 1; - for (i = 0; i < ft_sim->analyses[save]->numParms; i++) { - /* find the parameter */ - if (0 == strcmp(token, ft_sim->analyses[save]->analysisParms[i].keyword)) { + i = ft_find_analysis_parm(save, token); + + if (i < 0) { + /* didn't find it! */ + current->error = INPerrCat + (current->error, + INPmkTemp(" Error: unknown parameter on .sens - ignored \n")); + continue; + } + /* found it, analysis which, parameter i */ if (ft_sim->analyses[save]->analysisParms[i].dataType & IF_FLAG) { /* one of the keywords! */ @@ -345,16 +352,6 @@ next: if (error) current->error = INPerrCat(current->error, INPerror(error)); } - break; - } - } - - if (i == ft_sim->analyses[save]->numParms) { - /* didn't find it! */ - current->error = INPerrCat - (current->error, - INPmkTemp(" Error: unknown parameter on .sens - ignored \n")); - } } if ((err = ft_sim->doAnalyses (ckt, 1, ft_curckt->ci_curTask)) != OK) { diff --git a/src/frontend/spiceif.c b/src/frontend/spiceif.c index 3996fa5ff..05ec4b59e 100644 --- a/src/frontend/spiceif.c +++ b/src/frontend/spiceif.c @@ -427,11 +427,8 @@ if_option(CKTcircuit *ckt, char *name, enum cp_types type, void *value) return 0; } - for (i = 0; i < ft_sim->analyses[which]->numParms; i++) - if (eq(ft_sim->analyses[which]->analysisParms[i].keyword, name) && - (ft_sim->analyses[which]->analysisParms[i].dataType & IF_SET)) - break; - if (i == ft_sim->analyses[which]->numParms) { + i = ft_find_analysis_parm(which, name); + if (i < 0 || !(ft_sim->analyses[which]->analysisParms[i].dataType & IF_SET)) { /* See if this is unsupported or obsolete. */ for (vv = unsupported; *vv; vv++) if (eq(name, *vv)) { @@ -1212,11 +1209,12 @@ int if_analQbyName(CKTcircuit *ckt, int which, JOB *anal, char *name, IFvalue *parm) { int i; - for (i = 0; i < ft_sim->analyses[which]->numParms; i++) - if (strcmp(ft_sim->analyses[which]->analysisParms[i].keyword, name) == 0) - return (ft_sim->askAnalysisQuest - (ckt, anal, ft_sim->analyses[which]->analysisParms[i].id, parm, NULL)); - return (E_BADPARM); + i = ft_find_analysis_parm(which, name); + if (i < 0) + return (E_BADPARM); + + return (ft_sim->askAnalysisQuest + (ckt, anal, ft_sim->analyses[which]->analysisParms[i].id, parm, NULL)); } @@ -1291,10 +1289,8 @@ if_getstat(CKTcircuit *ckt, char *name) } if (name) { - for (i = 0; i < ft_sim->analyses[which]->numParms; i++) - if (eq(ft_sim->analyses[which]->analysisParms[i].keyword, name)) - break; - if (i == ft_sim->analyses[which]->numParms) + i = ft_find_analysis_parm(which, name); + if (i < 0) return (NULL); if (ft_sim->askAnalysisQuest (ckt, &(ft_curckt->ci_curTask->taskOptions), ft_sim->analyses[which]->analysisParms[i].id, &parm, @@ -1729,3 +1725,14 @@ ft_find_analysis(char *name) return j; return -1; } + + +int +ft_find_analysis_parm(int which, char *name) +{ + int i; + for (i = 0; i < ft_sim->analyses[which]->numParms; i++) + if (!strcmp(ft_sim->analyses[which]->analysisParms[i].keyword, name)) + return i; + return -1; +} diff --git a/src/include/ngspice/fteext.h b/src/include/ngspice/fteext.h index 2a7a987a1..6747f6881 100644 --- a/src/include/ngspice/fteext.h +++ b/src/include/ngspice/fteext.h @@ -307,6 +307,7 @@ extern void if_setparam_model(CKTcircuit *ckt, char **name, char *val ); extern void if_setparam(CKTcircuit *ckt, char **name, char *param, struct dvec *val, int do_model); extern struct variable *if_getstat(CKTcircuit *ckt, char *name); extern int ft_find_analysis(char *name); +extern int ft_find_analysis_parm(int which, char *name); /* typesdef.c */ diff --git a/src/spicelib/parser/inp2dot.c b/src/spicelib/parser/inp2dot.c index 2d3f90719..6789a2261 100644 --- a/src/spicelib/parser/inp2dot.c +++ b/src/spicelib/parser/inp2dot.c @@ -516,10 +516,12 @@ dot_sens2(char *line, CKTcircuit *ckt, INPtables *tab, card *current, while (*line) { /* read the entire line */ INPgetTok(&line, &token, 1); - for (i = 0; i < ft_sim->analyses[which]->numParms; i++) { - /* find the parameter */ - if (0 == strcmp(token, - ft_sim->analyses[which]->analysisParms[i].keyword)) { + i = ft_find_analysis_parm(which, token); + if (i < 0) { + /* didn't find it! */ + LITERR(" Error: unknown parameter on .sens-ignored \n"); + continue; + } /* found it, analysis which, parameter i */ if (ft_sim->analyses[which]->analysisParms[i].dataType & IF_FLAG) { /* one of the keywords! */ @@ -546,13 +548,6 @@ dot_sens2(char *line, CKTcircuit *ckt, INPtables *tab, card *current, INPerrCat(current->error, INPerror(error)); } - break; - } - } - if (i == ft_sim->analyses[which]->numParms) { - /* didn't find it! */ - LITERR(" Error: unknown parameter on .sens-ignored \n"); - } } return (0); } diff --git a/src/spicelib/parser/inpapnam.c b/src/spicelib/parser/inpapnam.c index ad09083b7..c3c8fa0ce 100644 --- a/src/spicelib/parser/inpapnam.c +++ b/src/spicelib/parser/inpapnam.c @@ -17,16 +17,19 @@ INPapName(CKTcircuit *ckt, int type, JOB *analPtr, char *parmname, { int i; - if (parmname && ft_sim->analyses[type]) { - for (i = 0; i < ft_sim->analyses[type]->numParms; i++) - if (strcmp(parmname, - ft_sim->analyses[type]->analysisParms[i].keyword) == - 0) { - return ft_sim->setAnalysisParm (ckt, analPtr, - ft_sim->analyses[type]->analysisParms[i].id, - value, - NULL); - } - } - return (E_BADPARM); + if (!parmname) + return (E_BADPARM); + + if (!ft_sim->analyses[type]) + return (E_BADPARM); + + i = ft_find_analysis_parm(type, parmname); + + if (i < 0) + return (E_BADPARM); + + return ft_sim->setAnalysisParm (ckt, analPtr, + ft_sim->analyses[type]->analysisParms[i].id, + value, + NULL); } diff --git a/src/spicelib/parser/inpdoopt.c b/src/spicelib/parser/inpdoopt.c index 976492f2d..5908d1132 100644 --- a/src/spicelib/parser/inpdoopt.c +++ b/src/spicelib/parser/inpdoopt.c @@ -44,8 +44,8 @@ INPdoOpts( INPgetTok(&line,&token,1); /* throw away '.option' */ while (*line) { INPgetTok(&line,&token,1); - for(i=0;inumParms;i++) { - if(strcmp(token,prm->analysisParms[i].keyword) == 0) { + i = ft_find_analysis_parm(which, token); + if(i >= 0) { if(!(prm->analysisParms[i].dataType & IF_UNIMP_MASK)) { errmsg = TMALLOC(char, 45 + strlen(token)); (void) sprintf(errmsg, @@ -53,8 +53,10 @@ INPdoOpts( optCard->error = INPerrCat(optCard->error,errmsg); val = INPgetValue(ckt,&line, prm->analysisParms[i].dataType, tab); - break; + continue; } + } + if(i >= 0) { if(prm->analysisParms[i].dataType & IF_SET) { val = INPgetValue(ckt,&line, prm->analysisParms[i].dataType&IF_VARTYPES, tab); @@ -66,15 +68,12 @@ INPdoOpts( "Warning: can't set option %s\n", token); optCard->error = INPerrCat(optCard->error, errmsg); } - break; + continue; } - } } - if(i == prm->numParms) { errmsg = TMALLOC(char, 100); (void) strcpy(errmsg," Error: unknown option - ignored\n"); optCard->error = INPerrCat(optCard->error,errmsg); fprintf(stderr, "%s\n", optCard->error); - } } }