Browse Source

Introduce variacle 'plainlet' which allow simple copying

of vectors, even if the right hand side vector name
contain forbidden characters (like math characters).

set plainlet
let newvec = v(/out)
unset plainlet
pre-master-46
Holger Vogt 5 years ago
parent
commit
95754d29c1
  1. 30
      src/frontend/com_let.c

30
src/frontend/com_let.c

@ -30,6 +30,7 @@ static int get_index_values(char *s, int n_elem_this_dim,
int get_one_index_value(const char *s, int *p_index);
/* let <vec_name> = <expr>
* let <vec_name> = <vec_name_old> if variable 'plainlet' is set
* let <vec_name>[<bracket_expr>] = <expr>
* <bracket_expr> = <index_expr> <sep> <index_expr> <sep> ...
* <index_expr>
@ -125,16 +126,29 @@ void com_let(wordlist *wl)
n_dst_index = vec_dst->v_numdims;
} /* end of case that an indexing bracket '[' was found */
/* Evaluate rhs */
if ((names = ft_getpnames_from_string(
rhs, TRUE)) == (struct pnode *) NULL) {
fprintf(cp_err, "Error: RHS \"%s\" invalid\n", rhs);
goto quit;
/* 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.*/
if (cp_getvar("plainlet", CP_BOOL, NULL, 0)) {
vec_src = vec_get(rhs);
if (vec_src == (struct dvec *) NULL) {
fprintf(cp_err, "Error: Can't evaluate \"%s\"\n", rhs);
goto quit;
}
}
if ((vec_src = ft_evaluate(names)) == (struct dvec *) NULL) {
fprintf(cp_err, "Error: Can't evaluate \"%s\"\n", rhs);
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 {
if ((names = ft_getpnames_from_string(
rhs, TRUE)) == (struct pnode*)NULL) {
fprintf(cp_err, "Error: RHS \"%s\" invalid\n", rhs);
goto quit;
}
if ((vec_src = ft_evaluate(names)) == (struct dvec*)NULL) {
fprintf(cp_err, "Error: Can't evaluate \"%s\"\n", rhs);
goto quit;
}
}
if (vec_src->v_link2) {

Loading…
Cancel
Save