void mesh_eval_field(struct mesh* m, unsigned ent_dim, char const* name, unsigned ncomps, void (*fun)(double const* x, double* out)) { double* data = eval_field(mesh_count(m, ent_dim), mesh_find_tag(m, ent_dim, "coordinates")->d.f64, ncomps, fun); mesh_add_tag(m, ent_dim, TAG_F64, name, ncomps, data); }
/* generate c code from crabql */ static void crabql_generate_code(struct crabql *crabql, msgpack_object *o, UT_string *s) { struct field *field; if (o == NULL) { uts_printf_concat(s, "-1LL"); return; } switch (o->type) { case MSGPACK_OBJECT_NIL: uts_printf_concat(s, "0"); break; case MSGPACK_OBJECT_BOOLEAN: uts_printf_concat(s, o->via.boolean ? "-1" : "0"); break; case MSGPACK_OBJECT_POSITIVE_INTEGER: uts_printf_concat(s, "%"PRIu64"LL", o->via.u64); break; case MSGPACK_OBJECT_NEGATIVE_INTEGER: uts_printf_concat(s, "%"PRId64"LL", o->via.i64); break; case MSGPACK_OBJECT_DOUBLE: uts_printf_concat(s, "%.18lf", o->via.dec); break; case MSGPACK_OBJECT_RAW: if (mp_raw_eq(*o, "_table")) { uts_printf_concat(s, "(context->table)"); break; } field = eval_field(crabql, o); ERROR_CHECK(); make_field_data_get(field, s); break; case MSGPACK_OBJECT_ARRAY: if (o->via.array.size == 0) { uts_printf_concat(s, "0"); } else { msgpack_object* p = o->via.array.ptr; if (p->type == MSGPACK_OBJECT_RAW && p->via.raw.size > 0 && p->via.raw.ptr[0] == '$') { // operator for (size_t i = 0; i < sizeof(ops) / sizeof(ops[0]); i++) { if (mp_raw_eq(*p, ops[i].name)) { ops[i].func(crabql, p, s, o->via.raw.size); return; } } for (size_t i = 0; i < p->via.raw.size; i++) putchar(p->via.raw.ptr[i]); putchar(10); ERROR_ASSERT(!"unknown operator"); } else { // list uts_printf_concat(s, "(0"); msgpack_object* const pend = o->via.array.ptr + o->via.array.size; for(; p < pend; ++p) { uts_printf_concat(s, ", "); crabql_generate_code(crabql, p, s); } uts_printf_concat(s, ")"); return; } } case MSGPACK_OBJECT_MAP: ERROR_ASSERT(crabql->data_mode != DATA_MODE_NONE); msgpack_object_kv* p = o->via.map.ptr; msgpack_object_kv* const pend = o->via.map.ptr + o->via.map.size; uts_printf_concat(s, "(1"); for(; p < pend; ++p) { ERROR_ASSERT(p->key.type == MSGPACK_OBJECT_RAW); ERROR_ASSERT(crabql->data_mode != DATA_MODE_NONE); ERROR_ASSERT(crabql->schema); field = eval_field(crabql, &p->key); ERROR_ASSERT(field); ERROR_CHECK(); if (crabql->data_mode == DATA_MODE_READ) { uts_printf_concat(s, " && ("); make_field_data_get(field, s); uts_printf_concat(s, " == "); crabql_generate_code(crabql, &p->val, s); uts_printf_concat(s, ")"); } else if (crabql->data_mode == DATA_MODE_WRITE) { // WRITE uts_printf_concat(s, ", data_write(context, %p, ", field); crabql_generate_code(crabql, &p->val, s); uts_printf_concat(s, ")"); } } uts_printf_concat(s, ")"); return; default: // FIXME ERROR_ASSERT(0); } }