diff --git a/lib/src/geneval.c b/lib/src/geneval.c index 1c2283a2b..c6bd6d95d 100644 --- a/lib/src/geneval.c +++ b/lib/src/geneval.c @@ -7750,6 +7750,86 @@ static NODE *do_assert (NODE *l, NODE *r, parser *p) return ret; } +static NODE *in_set_node (NODE *set, NODE *val, parser *p) +{ + gretl_matrix *m = set->v.m; + NODE *ret = NULL; + + if (starting(p)) { + if (val->t == NUM) { + ret = aux_scalar_node(p); + } else if (val->t == SERIES) { + ret = aux_series_node(p); + } else if (val->t == MAT) { + ret = aux_matrix_node(p); + if (!p->err) { + int r = val->v.m->rows; + int c = val->v.m->cols; + + ret->v.m = gretl_zero_matrix_new(r, c); + } + } + if (!p->err) { + int i, n = m->rows * m->cols; + double x; + + if (val->t == NUM) { + x = val->v.xval; + if (na(x)) { + ret->v.xval = NADBL; + } else { + ret->v.xval = 0; + for (i=0; ival[i] == x) { + ret->v.xval = 1; + break; + } + } + } + } else if (val->t == SERIES) { + int t; + + for (t=p->dset->t1; t<=p->dset->t2; t++) { + x = val->v.xvec[t]; + if (na(x)) { + ret->v.xvec[t] = NADBL; + } else { + ret->v.xvec[t] = 0; + for (i=0; ival[i] == x) { + ret->v.xvec[t] = 1; + break; + } + } + } + } + } else if (val->t == MAT) { + gretl_matrix *v = val->v.m; + int k, nv = v->rows * v->cols; + + for (k=0; kval[k]; + if (na(x)) { + ret->v.m->val[k] = NADBL; + } else { + ret->v.m->val[k] = 0; + for (i=0; ival[i] == x) { + ret->v.m->val[k] = 1; + break; + } + } + } + } + } + } + } else { + ret = aux_any_node(p); + } + + return ret; +} + static NODE *single_string_func (NODE *n, NODE *x, int f, parser *p) { NODE *ret = aux_string_node(p); @@ -17796,6 +17876,13 @@ static NODE *eval (NODE *t, parser *p) p->err = E_TYPES; } break; + case F_INSET: + if (l->t == MAT && (r->t == NUM || r->t == SERIES || r->t == MAT)) { + ret = in_set_node(l, r, p); + } else { + p->err = E_TYPES; + } + break; case F_OBSLABEL: if (l->t == NUM || l->t == MAT) { ret = int_to_string_func(l, t->t, p); diff --git a/lib/src/genlex.c b/lib/src/genlex.c index 5eeaca290..ace54de12 100644 --- a/lib/src/genlex.c +++ b/lib/src/genlex.c @@ -577,6 +577,7 @@ struct str_table funcs[] = { { F_ASSERT, "assert" }, { F_VMA, "vma" }, { F_BCHECK, "bcheck" }, + { F_INSET, "inset" }, { 0, NULL } }; diff --git a/lib/src/genparse.h b/lib/src/genparse.h index 7a0145045..912e49a85 100644 --- a/lib/src/genparse.h +++ b/lib/src/genparse.h @@ -400,6 +400,7 @@ enum { F_ERRORIF, F_BINCOEFF, F_ASSERT, + F_INSET, F2_MAX, /* SEPARATOR: end of two-arg functions */ F_WMEAN, F_WVAR,