diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index dbc617a8b..7529c9731 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -6342,6 +6342,7 @@ static struct card * pspice_compat(struct card *oldcard) { struct card *card, *newcard, *nextcard; + int skip_control = 0; /* add predefined params TEMP, VT, GMIN to beginning of deck */ char *new_str = copy(".param temp = 'temper - 273.15'"); @@ -6377,5 +6378,70 @@ pspice_compat(struct card *oldcard) nextcard = insert_new_line(nextcard, new_str, 1, 0); } } + + /* replace & with && and | with || and *# with * # */ + for (card = newcard; card; card = card->nextcard) { + char *t; + char *cut_line = card->line; + + /* we don't have command lines in a PSPICE model */ + if (ciprefix("*#", cut_line)) { + char *tmpstr = tprintf("* #%s", cut_line + 2); + tfree(card->line); + card->line = tmpstr; + continue; + } + + if (*cut_line == '*') + continue; + /* exclude any command inside .control ... .endc */ + if (ciprefix(".control", cut_line)) { + skip_control++; + continue; + } + else if (ciprefix(".endc", cut_line)) { + skip_control--; + continue; + } + else if (skip_control > 0) { + continue; + } + if ((t = strstr(card->line, "&")) != NULL) { + while (t && (t[1] != '&')) { + char *tt = NULL; + char *tn = copy(t + 1);/*skip |*/ + char *strbeg = copy_substring(card->line, t); + tfree(card->line); + card->line = tprintf("%s&&%s", strbeg, tn); + tfree(strbeg); + tfree(tn); + t = card->line; + while ((t = strstr(t, "&&")) != NULL) + tt = t = t + 2; + if (!tt) + break; + else + t = strstr(tt, "&"); + } + } + if ((t = strstr(card->line, "|")) != NULL) { + while (t && (t[1] != '|')) { + char *tt = NULL; + char *tn = copy(t + 1);/*skip |*/ + char *strbeg = copy_substring(card->line, t); + tfree(card->line); + card->line = tprintf("%s||%s", strbeg, tn); + tfree(strbeg); + tfree(tn); + t = card->line; + while ((t = strstr(t, "||")) != NULL) + tt = t = t + 2; + if (!tt) + break; + else + t = strstr(tt, "|"); + } + } + } return newcard; }