Tidy code in get_number_terminals(), removing unneeded copying.

This commit is contained in:
Giles Atkinson 2025-02-25 10:05:20 +00:00 committed by Holger Vogt
parent d18479b45b
commit b41b8a48c3
1 changed files with 59 additions and 47 deletions

View File

@ -5156,10 +5156,10 @@ static int inp_get_param_level(
the first letter of its instance line. Returns 0 upon error. */
int get_number_terminals(char *c)
{
int i, j, k;
int i, j, k;
char *inst;
char *name[12];
char nam_buf[128];
bool area_found = FALSE;
bool area_found = FALSE;
if (!c)
return 0;
@ -5181,28 +5181,31 @@ int get_number_terminals(char *c)
but still allow self heating diode with ngspice syntax. */
if (newcompat.ps && !search_plain_identifier(c, "thermal"))
return 2;
i = 0;
/* find the first token with "off" or "=" in the line*/
while ((i < 10) && (*c != '\0')) {
char *inst = gettok_instance(&c);
strncpy(nam_buf, inst, sizeof(nam_buf) - 1);
txfree(inst);
if ( i > 3 && (search_plain_identifier(nam_buf, "off") || search_plain_identifier(nam_buf, "thermal") || strchr(nam_buf, '=')))
for (i = 0; (i < 10) && (*c != '\0'); ++i) {
inst = gettok_instance(&c);
if (i > 3 && (search_plain_identifier(inst, "off") ||
search_plain_identifier(inst, "thermal") ||
strchr(inst, '='))) {
txfree(inst);
break;
i++;
}
txfree(inst);
}
return i - 2;
break;
case 'x':
i = 0;
/* find the first token with "params:" or "=" in the line*/
while ((i < 100) && (*c != '\0')) {
char *inst = gettok_instance(&c);
strncpy(nam_buf, inst, sizeof(nam_buf) - 1);
txfree(inst);
if (search_plain_identifier(nam_buf, "params:") || strchr(nam_buf, '='))
for (i = 0; (i < 100) && (*c != '\0'); ++i) {
inst = gettok_instance(&c);
if (search_plain_identifier(inst, "params:") ||
strchr(inst, '=')) {
txfree(inst);
break;
i++;
}
txfree(inst);
}
return i - 2;
break;
@ -5223,34 +5226,36 @@ int get_number_terminals(char *c)
case 'm': /* recognition of 4, 5, 6, or 7 nodes for SOI devices needed
*/
{
i = 0;
char* cc, * ccfree;
cc = copy(c);
/* required to make m= 1 a single token m=1 */
ccfree = cc = inp_remove_ws(cc);
/* find the first token with "off", "tnodeout", "thermal" or "=" in the line*/
while ((i < 20) && (*cc != '\0')) {
char* inst = gettok_instance(&cc);
strncpy(nam_buf, inst, sizeof(nam_buf) - 1);
txfree(inst);
if ( i > 4 && (search_plain_identifier(nam_buf, "off") || strchr(nam_buf, '=') ||
search_plain_identifier(nam_buf, "tnodeout") || search_plain_identifier(nam_buf, "thermal")))
for (i = 0; (i < 20) && (*cc != '\0'); ++i) {
inst = gettok_instance(&cc);
if ( i > 4 &&
(search_plain_identifier(inst, "off") ||
strchr(inst, '=') ||
search_plain_identifier(inst, "tnodeout") ||
search_plain_identifier(inst, "thermal"))) {
txfree(inst);
break;
i++;
}
txfree(inst);
}
tfree(ccfree);
return i - 2;
break;
}
case 'p': /* recognition of up to 100 cpl nodes */
i = j = 0;
/* find the last token in the line*/
while ((i < 100) && (*c != '\0')) {
char *tmp_inst = gettok_instance(&c);
strncpy(nam_buf, tmp_inst, 32);
tfree(tmp_inst);
if (strchr(nam_buf, '='))
for (i = j = 0; (i < 100) && (*c != '\0'); ++i) {
inst = gettok_instance(&c);
if (strchr(inst, '='))
j++;
tfree(inst);
i++;
}
if (i == 100)
@ -5263,21 +5268,27 @@ int get_number_terminals(char *c)
/* 12 tokens maximum */
{
char* cc, * ccfree;
i = j = 0;
cc = copy(c);
/* required to make m= 1 a single token m=1 */
ccfree = cc = inp_remove_ws(cc);
while ((i < 12) && (*cc != '\0')) {
for (i = j = 0; (i < 12) && (*cc != '\0'); ++i) {
char* comma;
name[i] = gettok_instance(&cc);
if (search_plain_identifier(name[i], "off") || strchr(name[i], '='))
if (search_plain_identifier(name[i], "off") ||
strchr(name[i], '=')) {
j++;
}
#ifdef CIDER
if (search_plain_identifier(name[i], "save") || search_plain_identifier(name[i], "print"))
if (search_plain_identifier(name[i], "save") ||
search_plain_identifier(name[i], "print")) {
j++;
}
#endif
/* If we have IC=VBE, VCE instead of IC=VBE,VCE we need to inc
* j */
/* If we have IC=VBE, VCE instead of IC=VBE,VCE
* we need to increment j.
*/
if ((comma = strchr(name[i], ',')) != NULL &&
(*(++comma) == '\0'))
j++;
@ -5285,14 +5296,14 @@ int get_number_terminals(char *c)
*/
if (eq(name[i], ","))
j++;
i++;
}
tfree(ccfree);
i--;
tfree(ccfree);
area_found = FALSE;
for (k = i; k > i - j - 1; k--) {
bool only_digits = TRUE;
char* nametmp = name[k];
/* MNAME has to contain at least one alpha character. AREA may
be assumed if we have a token with only digits, and where
the previous token does not end with a ',' */
@ -5317,19 +5328,20 @@ int get_number_terminals(char *c)
#ifdef OSDI
case 'n': /* Recognize an unknown number of nodes by stopping at tokens with '=' */
{
i = 0;
char* cc, * ccfree;
cc = copy(c);
/* required to make m= 1 a single token m=1 */
ccfree = cc = inp_remove_ws(cc);
/* find the first token with "off", "tnodeout", "thermal" or "=" in the line*/
while ((i < 20) && (*cc != '\0')) {
char* inst = gettok_instance(&cc);
strncpy(nam_buf, inst, sizeof(nam_buf) - 1);
txfree(inst);
if (i > 2 && (strchr(nam_buf, '=')))
/* Find the first token with "off", "tnodeout", "thermal" or "=" */
for (i = 0; (i < 20) && (*cc != '\0'); ++i) {
inst = gettok_instance(&cc);
if (i > 2 && (strchr(inst, '='))) {
txfree(inst);
break;
i++;
}
txfree(inst);
}
tfree(ccfree);
return i - 2;