예제 #1
0
static void Farray_multiaddN(CTX ctx, kArray *a, ksfp_t *v)
{
	size_t i, n = knh_stack_argc(ctx, v);
	size_t capacity = a->dim->capacity;
	if(!(a->size + n < capacity)) {
		knh_Array_grow(ctx, a, k_grow(a->size), a->size + n);
	}
	for(i = 0; i < n; i++) {
		a->nlist[a->size+i] = v[i].ndata;
	}
	a->size += n;
}
예제 #2
0
static void Farray_multiaddO(CTX ctx, kArray *a, ksfp_t *v)
{
	size_t i, n = knh_stack_argc(ctx, v);
	size_t capacity = a->dim->capacity;
	if(!(a->size + n < capacity)) {
		knh_Array_grow(ctx, a, k_grow(a->size), a->size + n);
	}
	for(i = 0; i < n; i++) {
		KNH_INITv_withWB(a, a->list[a->size+i], v[i].o);
	}
	a->size += n;
}
예제 #3
0
파일: stringapi.c 프로젝트: matsuu/konoha
static METHOD knh__String_format(Ctx *ctx, knh_sfp_t *sfp)
{
	knh_bytes_t fmt = knh_String_tobytes(sfp[0].s);
	knh_sfp_t *param = sfp + 1;
	int ac = knh_stack_argc(ctx, param);
	knh_bytes_t mt, expr, next;

	if(!knh_bytes_findMT(ctx, fmt, &mt, &expr, &next)) {
		KNH_RETURN(ctx, sfp, sfp[0].s);
	}

	knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf);
	int count;
	for(count = 0; ; count++) {
		if(mt.buf > fmt.buf + 1) {
			fmt.len = (mt.buf - fmt.buf) - 1;
			knh_Bytes_write(ctx, cwb->ba, fmt);
		}
		int index = count;
		if(expr.len > 0) {
			knh_int_t num;
			if(knh_bytes_parseint(expr, &num)) {
				index = (int)num;
			}
		}
		if(0 <= index && index < ac) {
			knh_sfp_t *esp = KNH_LOCAL(ctx);
			KNH_SETv(ctx, esp[1].o, param[index].o); esp[1].data = param[index].data;
			Object *m = KNH_NULL;
			if(knh_bytes_isOptionalMT(mt)) m = UP(new_String(ctx, mt, NULL));
			mt.buf = mt.buf - 1; mt.len++;   /* 's' == > '%s' */
			knh_methodn_t mn = knh_getmn(ctx, mt, METHODN__empty);
			knh_esp1_format(ctx, mn, cwb->w, m);
		}
		else {
			if(knh_Context_isDebug(ctx)) {
				KNH_THROW_OUTOFINDEX(ctx, index, ac);
			}
		}
		fmt.buf = next.buf; fmt.len = next.len;
		if(!knh_bytes_findMT(ctx, fmt, &mt, &expr, &next)) {
			break;
		}
	}
	if(fmt.len > 0) {
		knh_Bytes_write(ctx, cwb->ba, fmt);
	}
	KNH_RETURN(ctx, sfp, new_StringX__cwb(ctx, knh_Object_cid(sfp[0].o), cwb));
}
예제 #4
0
파일: stringapi.c 프로젝트: matsuu/konoha
static METHOD knh__String_concat(Ctx *ctx, knh_sfp_t *sfp)
{
	int i, ac = knh_stack_argc(ctx, sfp);
	knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf);
	knh_sfp_t *esp = KNH_LOCAL(ctx);
	for(i = 0; i < ac; i++) {
		if(IS_bString(sfp[i].o)) {
			knh_Bytes_write(ctx, cwb->ba, knh_String_tobytes(sfp[i].s));
		}
		else {
			KNH_ASSERT(esp == ctx->esp);
			KNH_SETv(ctx, esp[1].o, sfp[i].o); esp[1].data = sfp[i].data;
			knh_esp1_format(ctx, METHODN__s, cwb->w, KNH_NULL);
		}
	}
	KNH_RETURN(ctx, sfp, knh_cwb_newString(ctx, cwb));
}
예제 #5
0
#include "../konoha_mpi.h"
#include <konoha1/konohalang.h>
#else
#include "../../konoha1/konohalang.h"
#endif

#define ArrayMNFunc(X) {MN_##X , __Array_##X}

/* ------------------------------------------------------------------------ */
/* Array Index */

static KMETHOD __Array_new__ARRAY(CTX ctx, ksfp_t *sfp _RIX)
{
	kArray *a = sfp[0].a;
	kint_t init, x = 0, y = 1, z = 1, w = 1;
	size_t dim = knh_stack_argc(ctx, sfp+1);
	switch(dim) {
		case 4: w = sfp[dim-4+1].ivalue;
		case 3: z = sfp[dim-3+1].ivalue;
		case 2: y = sfp[dim-2+1].ivalue;
		case 1: x = sfp[dim-1+1].ivalue;
	}
	init = x * y * z * w;
	DBG_P("x=%d,y=%d,z=%d,w=%d,dim=%d,init=%d",x,y,z,w,dim, init);
	if(0 <= init && init < LONG_MAX) {
		knh_Array_grow(ctx, a, (size_t)init, 0);
		a->size = (size_t)init;
		if(!Array_isNDATA(a)) {
			kclass_t p1 = O_p1(a);
			Object *v = knh_getClassDefaultValue(ctx, p1);
			size_t i;