Пример #1
0
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);
}
Пример #2
0
/* 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);
    }
}