static void z_call2(xsMachine *the, z_t *z, kcl_z_f2 f) { kcl_int_t *a = arith_get_integer(z, xsArg(0)); kcl_int_t *b = arith_get_integer(z, xsArg(1)); kcl_int_t *r = NULL; kcl_err_t err; err = (*f)(z->ctx, a, b, &r); if (err != KCL_ERR_NONE) kcl_throw_error(the, err); arith_set_integer(z, xsResult, r); }
static void z_call3(xsMachine *the, z_t *z, kcl_z_f3 f, xsSlot *rem) { kcl_int_t *a = arith_get_integer(z, xsArg(0)); kcl_int_t *b = arith_get_integer(z, xsArg(1)); kcl_int_t *r = NULL, *m = NULL; kcl_err_t err; err = (*f)(z->ctx, a, b, &r, rem != NULL ? &m : NULL); if (err != KCL_ERR_NONE) kcl_throw_error(the, err); arith_set_integer(z, xsResult, r); if (rem != NULL) { arith_set_integer(z, *rem, m); } }
void xs_ed_mul(xsMachine *the) { ed_t *ed = xsGetHostData(xsThis); kcl_ecp_t *p, *r; kcl_int_t *k; kcl_err_t err; xsVars(1); p = arith_get_ecp(ed, xsArg(0)); k = arith_get_integer(ed, xsArg(1)); (void)((err = kcl_ecp_alloc(&r)) || (err = kcl_ed_mul(ed->ctx, p, k, r))); if (err != KCL_ERR_NONE) kcl_throw_error(the, err); arith_set_ecp(ed, xsResult, r); }
void xs_z_toString(xsMachine *the) { z_t *z = xsGetHostData(xsThis); kcl_int_t *ai = arith_get_integer(z, xsArg(0)); unsigned int radix = xsToInteger(xsArg(1)); size_t usize, n; char *str; kcl_err_t err; #define NBITS(n) (n < 4 ? 1: n < 8 ? 2: n < 16 ? 3: n < 32 ? 4: 5) usize = kcl_int_sizeof(ai); n = (usize * 8) / NBITS(radix); /* quite inaccurate, but better than shortage */ n += 2; /* for "+-" sign + '\0' */ if ((str = crypt_malloc(n)) == NULL) kcl_throw_error(the, KCL_ERR_NOMEM); if ((err = kcl_z_i2str(z->ctx, ai, str, n, radix)) != KCL_ERR_NONE) goto bail; xsResult = xsString(str); bail: crypt_free(str); if (err != KCL_ERR_NONE) kcl_throw_error(the, err); }