enable token 'table' to occur at any place in e source line
This commit is contained in:
parent
ffb3800e34
commit
65181ff5c3
|
|
@ -4280,87 +4280,85 @@ inp_compat(struct card *card)
|
|||
title_tok, node1, node2, title_tok);
|
||||
// skip "table"
|
||||
cut_line = skip_ws(cut_line);
|
||||
if (!ciprefix("table", cut_line)) {
|
||||
fprintf(stderr, "Error: bad syntax in line %d\n %s\n",
|
||||
card->linenum_orig, card->line);
|
||||
controlled_exit(EXIT_BAD);
|
||||
}
|
||||
cut_line += 5;
|
||||
// compatibility, allow table = {expr} {pairs}
|
||||
if (*cut_line == '=')
|
||||
*cut_line++ = ' ';
|
||||
// get the expression
|
||||
str_ptr = gettok_char(&cut_line, '{', FALSE, FALSE);
|
||||
expression = gettok_char(&cut_line, '}', TRUE, TRUE); /* expression */
|
||||
if (!expression || !str_ptr) {
|
||||
fprintf(stderr, "Error: bad syntax in line %d\n %s\n",
|
||||
card->linenum_orig, card->line);
|
||||
controlled_exit(EXIT_BAD);
|
||||
}
|
||||
tfree(str_ptr);
|
||||
/* remove '{' and '}' from expression */
|
||||
if ((str_ptr = strchr(expression, '{')) != NULL)
|
||||
*str_ptr = ' ';
|
||||
if ((str_ptr = strchr(expression, '}')) != NULL)
|
||||
*str_ptr = ' ';
|
||||
/* cut_line may now have a '=', if yes, it will have '{' and '}'
|
||||
(braces around token after '=') */
|
||||
if ((str_ptr = strchr(cut_line, '=')) != NULL)
|
||||
*str_ptr = ' ';
|
||||
if ((str_ptr = strchr(cut_line, '{')) != NULL)
|
||||
*str_ptr = ' ';
|
||||
if ((str_ptr = strchr(cut_line, '}')) != NULL)
|
||||
*str_ptr = ' ';
|
||||
/* get first two numbers to establish extrapolation */
|
||||
str_ptr = cut_line;
|
||||
ffirstno = gettok_node(&cut_line);
|
||||
if (!ffirstno) {
|
||||
fprintf(stderr, "Error: bad syntax in line %d\n %s\n",
|
||||
card->linenum_orig, card->line);
|
||||
controlled_exit(EXIT_BAD);
|
||||
}
|
||||
firstno = copy(ffirstno);
|
||||
fnumber = INPevaluate(&ffirstno, &nerror, TRUE);
|
||||
secondno = gettok_node(&cut_line);
|
||||
midline = cut_line;
|
||||
cut_line = strrchr(str_ptr, '(');
|
||||
if (!cut_line) {
|
||||
fprintf(stderr, "Error: bad syntax in line %d (missing parentheses)\n %s\n",
|
||||
card->linenum_orig, card->line);
|
||||
controlled_exit(EXIT_BAD);
|
||||
}
|
||||
/* replace '(' with ',' and ')' with ' ' */
|
||||
for (; *str_ptr; str_ptr++)
|
||||
if (*str_ptr == '(')
|
||||
*str_ptr = ',';
|
||||
else if (*str_ptr == ')')
|
||||
if (ciprefix("table", cut_line)) {
|
||||
/* a regular TABLE line */
|
||||
cut_line += 5;
|
||||
// compatibility, allow table = {expr} {pairs}
|
||||
if (*cut_line == '=')
|
||||
*cut_line++ = ' ';
|
||||
// get the expression
|
||||
str_ptr = gettok_char(&cut_line, '{', FALSE, FALSE);
|
||||
expression = gettok_char(&cut_line, '}', TRUE, TRUE); /* expression */
|
||||
if (!expression || !str_ptr) {
|
||||
fprintf(stderr, "Error: bad syntax in line %d\n %s\n",
|
||||
card->linenum_orig, card->line);
|
||||
controlled_exit(EXIT_BAD);
|
||||
}
|
||||
tfree(str_ptr);
|
||||
/* remove '{' and '}' from expression */
|
||||
if ((str_ptr = strchr(expression, '{')) != NULL)
|
||||
*str_ptr = ' ';
|
||||
/* scan for last two numbers */
|
||||
lastno = gettok_node(&cut_line);
|
||||
lnumber = INPevaluate(&lastno, &nerror, FALSE);
|
||||
/* check for max-min and take half the difference for delta */
|
||||
delta = (lnumber-fnumber)/2.;
|
||||
lastlastno = gettok_node(&cut_line);
|
||||
if (!secondno || (*midline == '\0') || (delta <= 0.) || !lastlastno) {
|
||||
fprintf(stderr, "Error: bad syntax in line %d\n %s\n",
|
||||
card->linenum_orig, card->line);
|
||||
controlled_exit(EXIT_BAD);
|
||||
if ((str_ptr = strchr(expression, '}')) != NULL)
|
||||
*str_ptr = ' ';
|
||||
/* cut_line may now have a '=', if yes, it will have '{' and '}'
|
||||
(braces around token after '=') */
|
||||
if ((str_ptr = strchr(cut_line, '=')) != NULL)
|
||||
*str_ptr = ' ';
|
||||
if ((str_ptr = strchr(cut_line, '{')) != NULL)
|
||||
*str_ptr = ' ';
|
||||
if ((str_ptr = strchr(cut_line, '}')) != NULL)
|
||||
*str_ptr = ' ';
|
||||
/* get first two numbers to establish extrapolation */
|
||||
str_ptr = cut_line;
|
||||
ffirstno = gettok_node(&cut_line);
|
||||
if (!ffirstno) {
|
||||
fprintf(stderr, "Error: bad syntax in line %d\n %s\n",
|
||||
card->linenum_orig, card->line);
|
||||
controlled_exit(EXIT_BAD);
|
||||
}
|
||||
firstno = copy(ffirstno);
|
||||
fnumber = INPevaluate(&ffirstno, &nerror, TRUE);
|
||||
secondno = gettok_node(&cut_line);
|
||||
midline = cut_line;
|
||||
cut_line = strrchr(str_ptr, '(');
|
||||
if (!cut_line) {
|
||||
fprintf(stderr, "Error: bad syntax in line %d (missing parentheses)\n %s\n",
|
||||
card->linenum_orig, card->line);
|
||||
controlled_exit(EXIT_BAD);
|
||||
}
|
||||
/* replace '(' with ',' and ')' with ' ' */
|
||||
for (; *str_ptr; str_ptr++)
|
||||
if (*str_ptr == '(')
|
||||
*str_ptr = ',';
|
||||
else if (*str_ptr == ')')
|
||||
*str_ptr = ' ';
|
||||
/* scan for last two numbers */
|
||||
lastno = gettok_node(&cut_line);
|
||||
lnumber = INPevaluate(&lastno, &nerror, FALSE);
|
||||
/* check for max-min and take half the difference for delta */
|
||||
delta = (lnumber-fnumber)/2.;
|
||||
lastlastno = gettok_node(&cut_line);
|
||||
if (!secondno || (*midline == '\0') || (delta <= 0.) || !lastlastno) {
|
||||
fprintf(stderr, "Error: bad syntax in line %d\n %s\n",
|
||||
card->linenum_orig, card->line);
|
||||
controlled_exit(EXIT_BAD);
|
||||
}
|
||||
ckt_array[1] = tprintf("b%s %s_int1 0 v = pwl(%s, %e, %s, %s, %s, %s, %e, %s)",
|
||||
title_tok, title_tok, expression, fnumber-delta, secondno, firstno, secondno,
|
||||
midline, lnumber + delta, lastlastno);
|
||||
|
||||
// comment out current variable e line
|
||||
*(card->line) = '*';
|
||||
// insert new B source line immediately after current line
|
||||
for (i = 0; i < 2; i++)
|
||||
card = insert_new_line(card, ckt_array[i], 0, 0);
|
||||
|
||||
tfree(firstno);
|
||||
tfree(lastlastno);
|
||||
tfree(title_tok);
|
||||
tfree(node1);
|
||||
tfree(node2);
|
||||
}
|
||||
ckt_array[1] = tprintf("b%s %s_int1 0 v = pwl(%s, %e, %s, %s, %s, %s, %e, %s)",
|
||||
title_tok, title_tok, expression, fnumber-delta, secondno, firstno, secondno,
|
||||
midline, lnumber + delta, lastlastno);
|
||||
|
||||
// comment out current variable e line
|
||||
*(card->line) = '*';
|
||||
// insert new B source line immediately after current line
|
||||
for (i = 0; i < 2; i++)
|
||||
card = insert_new_line(card, ckt_array[i], 0, 0);
|
||||
|
||||
tfree(firstno);
|
||||
tfree(lastlastno);
|
||||
tfree(title_tok);
|
||||
tfree(node1);
|
||||
tfree(node2);
|
||||
}
|
||||
/* Exxx n1 n2 VOL = {equation}
|
||||
-->
|
||||
|
|
|
|||
Loading…
Reference in New Issue