Add error checking when parsing the .dc or dc commands.

This commit is contained in:
Holger Vogt 2025-06-28 11:11:53 +02:00
parent 005aad92d7
commit 99ed8ceb66
1 changed files with 19 additions and 2 deletions

View File

@ -288,8 +288,8 @@ dot_dc(char *line, CKTcircuit *ckt, INPtables *tab, struct card *current,
NG_IGNORE(gnode);
/* .dc SRC1NAME Vstart1 Vstop1 Vinc1 [SRC2NAME Vstart2 */
/* Vstop2 Vinc2 */
/* .dc SRC1NAME Vstart1 Vstop1 Vinc1 [SRC2NAME Vstart2 Vstop2 Vinc2]
Return 1 upon error because of bad syntax (missing tokens).*/
which = ft_find_analysis("DC");
if (which == -1) {
LITERR("DC transfer curve analysis unsupported\n");
@ -297,23 +297,37 @@ dot_dc(char *line, CKTcircuit *ckt, INPtables *tab, struct card *current,
}
IFC(newAnalysis, (ckt, which, "DC transfer characteristic", &foo, task));
INPgetTok(&line, &name, 1);
if (*name == '\0')
return 1;
INPinsert(&name, tab);
ptemp.uValue = name;
GCA(INPapName, (ckt, which, foo, "name1", &ptemp));
if (*line == '\0')
return 1;
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* vstart1 */
GCA(INPapName, (ckt, which, foo, "start1", parm));
if (*line == '\0')
return 1;
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* vstop1 */
GCA(INPapName, (ckt, which, foo, "stop1", parm));
if (*line == '\0')
return 1;
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* vinc1 */
GCA(INPapName, (ckt, which, foo, "step1", parm));
if (*line) {
INPgetTok(&line, &name, 1);
if (*line == '\0')
return 1;
INPinsert(&name, tab);
ptemp.uValue = name;
GCA(INPapName, (ckt, which, foo, "name2", &ptemp));
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* vstart2 */
if (*line == '\0')
return 1;
GCA(INPapName, (ckt, which, foo, "start2", parm));
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* vstop2 */
if (*line == '\0')
return 1;
GCA(INPapName, (ckt, which, foo, "stop2", parm));
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* vinc2 */
GCA(INPapName, (ckt, which, foo, "step2", parm));
@ -861,6 +875,9 @@ INP2dot(CKTcircuit *ckt, INPtables *tab, struct card *current, TSKtask *task, CK
goto quit;
} else if ((strcmp(token, ".dc") == 0)) {
rtn = dot_dc(line, ckt, tab, current, task, gnode, foo);
if (rtn == 1) {
current->error = copy("Bad syntax! ");
}
goto quit;
} else if ((strcmp(token, ".tf") == 0)) {
rtn = dot_tf(line, ckt, tab, current, task, gnode, foo);