Allow KiCad special token V(/xyz) by quoting

This commit is contained in:
Holger Vogt 2024-08-28 15:14:00 +02:00
parent ce656bd400
commit d18680d728
1 changed files with 69 additions and 1 deletions

View File

@ -29,6 +29,8 @@ static int get_index_values(char *s, int n_elem_this_dim,
index_range_t *p_range);
int get_one_index_value(const char *s, int *p_index);
static char* kivec(char* rhs);
/* let <vec_name> = <expr>
* let <vec_name> = <vec_name_old> if variable 'plainlet' is set
* let <vec_name>[<bracket_expr>] = <expr>
@ -127,6 +129,7 @@ void com_let(wordlist *wl)
} /* end of case that an indexing bracket '[' was found */
/* Evaluate rhs */
/* Just copy a vector. rhs has to be a valid existing vector name
May be used to copy vectors with forbidden characters in their names
into a vector with a valid name.*/
@ -137,6 +140,27 @@ void com_let(wordlist *wl)
goto quit;
}
}
/* KiCad special vectors: set "" around node name inside of vector
v(/out1) -> v("/out1") */
else if (strstr(rhs, "v(/")) {
char *rhs2 = kivec(rhs);
if (rhs2) {
if ((names = ft_getpnames_from_string(
rhs2, TRUE)) == (struct pnode*)NULL) {
fprintf(cp_err, "Error: RHS \"%s\" invalid\n", rhs2);
tfree(rhs2);
goto quit;
}
if ((vec_src = ft_evaluate(names)) == (struct dvec*)NULL) {
fprintf(cp_err, "Error: Can't evaluate \"%s\"\n", rhs);
tfree(rhs2);
goto quit;
}
tfree(rhs2);
}
else
goto quit;
}
/* evaluate the rhs expression as usual, math characters may not be used in vec names,
the expression parser then will complain about a syntax error */
else {
@ -151,7 +175,7 @@ void com_let(wordlist *wl)
}
}
if (vec_src->v_link2) {
if (vec_src && vec_src->v_link2) {
fprintf(cp_err, "Warning: extra wildcard values ignored\n");
}
@ -796,5 +820,49 @@ static void copy_vector_data_with_stride(struct dvec *vec_dst,
} /* end of case both real or complex */
} /* end of function copy_vector_data_with_stride */
/* KiCad special vectors: set "" around node name
v(/out1) -> v("/out1") */
static char* kivec(char* rhs) {
char *str1, *str2, *cont, *next, *newstr = NULL, *newstrc = NULL;
next = cont = rhs;
size_t rhslen = strlen(rhs);
size_t ii = 0;
/* How many "v(/" do we have in the line? */
while ((str1 = strstr(cont, "v(/"))) {
ii++;
cont = str1 + 1;
}
cont = rhs;
while ((str1 = strstr(cont, "v(/"))) {
str2 = strchr(str1, ')');
if (str2) {
rhslen = rhslen + 2 * ii + 1;
cont = str2;
if (!newstr) {
newstrc = newstr = TMALLOC(char, rhslen);
}
/* copy */
while (next < str1 + 2)
*newstrc++ = *next++;
*newstrc++ = '\"';
while (next < str2)
*newstrc++ = *next++;
*newstrc++ = '\"';
}
else {
fprintf(stderr, "Error: Bad right hand side %s\n", rhs);
tfree(newstr);
return NULL;
}
}
if (newstrc) {
while (*next != '\0')
*newstrc++ = *next++;
*newstrc = '\0';
}
return newstr;
}