static void func_new (void *vo, NCDModuleInst *i, const struct NCDModuleInst_new_params *params) { struct instance *o = vo; o->i = i; // check arguments NCDValRef str1_arg; NCDValRef str2_arg; if (!NCDVal_ListRead(params->args, 2, &str1_arg, &str2_arg)) { ModuleLog(i, BLOG_ERROR, "wrong arity"); goto fail0; } if (!NCDVal_IsString(str1_arg) || !NCDVal_IsString(str2_arg)) { ModuleLog(i, BLOG_ERROR, "wrong type"); goto fail0; } // compare o->result = (NCDVal_Compare(str1_arg, str2_arg) == 0); // signal up NCDModuleInst_Backend_Up(i); return; fail0: NCDModuleInst_Backend_DeadError(i); }
static void value_compare_eval (NCDCall call, value_compare_func func) { if (NCDCall_ArgCount(&call) != 2) { return FunctionLog(&call, BLOG_ERROR, "value_compare: need two arguments"); } NCDValRef vals[2]; for (int i = 0; i < 2; i++) { vals[i] = NCDCall_EvalArg(&call, i, NCDCall_ResMem(&call)); if (NCDVal_IsInvalid(vals[i])) { return; } } int res = func(NCDVal_Compare(vals[0], vals[1])); NCDCall_SetResult(&call, ncd_make_boolean(NCDCall_ResMem(&call), res)); }
static int compute_different (NCDValRef v1, NCDValRef v2) { return NCDVal_Compare(v1, v2) != 0; }
static int compute_equal (NCDValRef v1, NCDValRef v2) { return NCDVal_Compare(v1, v2) == 0; }
static int compute_greater_equal (NCDValRef v1, NCDValRef v2) { return NCDVal_Compare(v1, v2) >= 0; }
static int compute_lesser_equal (NCDValRef v1, NCDValRef v2) { return NCDVal_Compare(v1, v2) <= 0; }
static int compute_lesser (NCDValRef v1, NCDValRef v2) { return NCDVal_Compare(v1, v2) < 0; }
static int val_comparator (void *user, NCDValRef *v1, NCDValRef *v2) { return NCDVal_Compare(*v1, *v2); }