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