From 65181ff5c3838e78c8c51672b5a4287be5747a36 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Wed, 21 Feb 2018 12:47:39 +0100 Subject: [PATCH] enable token 'table' to occur at any place in e source line --- src/frontend/inpcom.c | 156 +++++++++++++++++++++--------------------- 1 file changed, 77 insertions(+), 79 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 8d84ac823..5341133a2 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -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} -->