inpcom.c, abstraction, introduce `inp_spawn_brace()'

This commit is contained in:
rlar 2014-08-02 12:06:47 +02:00
parent 26a036ed54
commit 668b7e23c5
1 changed files with 39 additions and 29 deletions

View File

@ -148,6 +148,8 @@ static char *skip_ws(char *d) { while (isspace(*d)) d++; return
static char *skip_back_non_ws_(char *d, char *start) { while (d > start && !isspace(d[-1])) d--; return d; }
static char *skip_back_ws_(char *d, char *start) { while (d > start && isspace(d[-1])) d--; return d; }
static char *inp_spawn_brace(char *s);
static char *inp_pathresolve(const char *name);
static char *inp_pathresolve_at(char *name, char *dir);
void tprint(struct line *deck);
@ -1264,9 +1266,7 @@ inp_chk_for_multi_in_vcvs(struct line *c, int *line_number)
xy_values1_e = skip_ws(comma_ptr + 1);
if (*xy_values1_e == '{') {
xy_values1_e = strchr(xy_values1_e, '}');
if (xy_values1_e)
xy_values1_e ++;
xy_values1_e = inp_spawn_brace(xy_values1_e);
} else {
xy_values1_e = skip_non_ws(xy_values1_e);
}
@ -1942,6 +1942,26 @@ inp_search_opening_paren(char *s, char *start)
#endif
/* search forward for closing brace */
static char *
inp_spawn_brace(char *s)
{
int count = 0;
// assert(*s == '{')
while (*s) {
if (*s == '{')
count++;
if (*s == '}')
count--;
if (count == 0)
return s + 1;
s++;
}
return NULL;
}
/*-------------------------------------------------------------------------*
removes " " quotes, returns lower case letters,
replaces non-printable characterss with '_' *
@ -2129,7 +2149,7 @@ inp_fix_subckt(struct names *subckt_w_params, char *s)
struct line *head = NULL, *start_card = NULL, *end_card = NULL, *prev_card = NULL, *c = NULL;
char *equal, *beg, *buffer, *ptr1, *ptr2, *new_str = NULL;
char keep;
int num_params = 0, i = 0, bracedepth = 0;
int num_params = 0, i = 0;
/* find first '=' */
equal = strchr(s, '=');
if (!strstr(s, "params:") && equal != NULL) {
@ -2159,26 +2179,15 @@ inp_fix_subckt(struct names *subckt_w_params, char *s)
ptr1 = skip_back_non_ws_(ptr1, beg);
/* ptr1 points to beginning of parameter */
/* if parameter is an expression and starts with '{', find closing '}'
Braces maybe nested (will they ever be ?). */
if (*ptr2 == '{') {
bracedepth = 1;
while (bracedepth > 0) {
ptr2++;
if (*ptr2 == '{')
bracedepth++;
else if (*ptr2 == '}')
bracedepth--;
else if (*ptr2 == '\0') {
fprintf(stderr, "Error: Missing } in line %s\n", s);
controlled_exit(EXIT_FAILURE);
}
}
ptr2++;/* ptr2 points past end of parameter {...} */
}
if (*ptr2 == '{')
ptr2 = inp_spawn_brace(ptr2);
else
/* take only the next token (separated by space) as the parameter */
ptr2 = skip_non_ws(ptr2); /* ptr2 points past end of parameter */
ptr2 = skip_non_ws(ptr2);
if (!ptr2) {
fprintf(stderr, "Error: Missing } in line %s\n", s);
controlled_exit(EXIT_FAILURE);
}
keep = *ptr2;
if (keep == '\0') {
@ -2545,13 +2554,14 @@ inp_get_params(char *line, char *param_names[], char *param_values[])
/* get parameter value */
value = skip_ws(equal_ptr + 1);
if (*value == '{') {
end = value;
while (*end && *end != '}')
end++;
end++;
} else {
if (*value == '{')
end = inp_spawn_brace(value);
else
end = skip_non_ws(value);
if (!end) {
fprintf(stderr, "Error: Missing } in %s\n", line);
controlled_exit(EXIT_FAILURE);
}
keep = *end;