Exemplo n.º 1
0
ksymbol_t knh_getfnq(CTX, kbytes_t tname, ksymbol_t def)
{
	ksymbol_t mask = 0;
	kindex_t idx = knh_bytes_index(tname, ':');
	if(idx > 0) {
		tname = knh_bytes_first(tname, idx);
	}
	else if(knh_bytes_startsWith_(tname, STEXT("super."))) {
		mask = (def == FN_NONAME) ? 0 : KFLAG_FN_SUPER;
		tname = knh_bytes_last(tname, 6);
	}
	else if(!knh_bytes_endsWith_(tname, STEXT("__"))) {
		if(tname.utext[0] == '_' && def != FN_NONAME) {
			mask = KFLAG_FN_U1;
			tname = knh_bytes_last(tname, 1);
		}
		if(tname.utext[0] == '_' && def != FN_NONAME) {
			mask = KFLAG_FN_U2;
			tname = knh_bytes_last(tname, 1);
		}
		while(tname.utext[0] == '_') {
			tname = knh_bytes_last(tname, 1);
		}
	}
	return getSymbol(_ctx, tname, def) | mask;
}
Exemplo n.º 2
0
static METHOD knh__String_substring(Ctx *ctx, knh_sfp_t *sfp)
{
	knh_bytes_t base = knh_String_tobytes(sfp[0].s);
	knh_bytes_t sub;
	if(knh_String_isASCII(sfp[0].s)) {
		size_t offset = IS_NULL(sfp[1].o) ? 0 : knh_array_index(ctx, sfp[1].ivalue, base.len);
		sub = knh_bytes_last(base, offset);
		if(IS_NOTNULL(sfp[2].o)) {
			size_t len = (size_t)sfp[2].ivalue;
			if(len < sub.len) sub = knh_bytes_first(sub, len);
		}
	}
	else { // multibytes
		size_t mlen = knh_bytes_mlen(base);
		size_t offset = IS_NULL(sfp[1].o) ? 0 : knh_array_index(ctx, sfp[1].ivalue, mlen);
		size_t length = IS_NULL(sfp[2].o) ? (mlen - offset) : (size_t)sfp[2].ivalue;
		sub = knh_bytes_mofflen(base, offset, length);
	}

	String *s;
	if(sub.len == 0) {
		s = TS_EMPTY;
	}
	else if(sub.len == base.len) {
		s = sfp[0].s;
	}
	else {
		s = new_String(ctx, sub, sfp[0].s);
	}
	KNH_RETURN(ctx, sfp, s);
}
Exemplo n.º 3
0
KNHAPI(int) knh_bytes_parseURLhost(knh_bytes_t url, char *buf, size_t bufsiz)
{
	knh_index_t loc = knh_bytes_index(url, ':');
	if(loc > 0 && url.buf[loc+1] == '/' && url.buf[loc+2] == '/') {
		knh_bytes_t t = knh_bytes_last(url, loc+3);
		loc = knh_bytes_index(t, '@');
		if(loc > 0) t = knh_bytes_last(t, loc+1);
		loc = knh_bytes_index(t, '/');
		if(loc > 0) t = knh_bytes_first(t, loc);
		loc = knh_bytes_index(t, ':');
		if(loc > 0) t = knh_bytes_first(t, loc);
		knh_format_bytes(buf, bufsiz, t);
		return 1;
	}
	knh_format_bytes(buf, bufsiz, STEXT("localhost"));
	return 0;
}
Exemplo n.º 4
0
KNHAPI(int) knh_bytes_parseURL(knh_bytes_t url, char *buf, size_t bufsiz)
{
	knh_index_t loc = knh_bytes_index(url, '?');
	if(loc > 0) url = knh_bytes_first(url, loc);
	loc = knh_bytes_index(url, ':');
	if(loc > 0 && url.buf[loc+1] == '/' && url.buf[loc+2] == '/') {
		knh_bytes_t scheme = knh_bytes_first(url, loc + 3);
		knh_bytes_t t = knh_bytes_last(url, loc+3);
		loc = knh_bytes_index(t, '@');
		if(loc > 0) {
			knh_bytes_t t = knh_bytes_last(t, loc+1);
		}
		knh_format_join2(buf, bufsiz, scheme, t);
		return 1;
	}
	knh_format_bytes(buf, bufsiz, url); // default
	return 0;
}
Exemplo n.º 5
0
KNHAPI(int) knh_bytes_parseURLuname(knh_bytes_t url, char *buf, size_t bufsiz)
{
	knh_index_t loc = knh_bytes_index(url, ':');
	if(loc > 0 && url.buf[loc+1] == '/' && url.buf[loc+2] == '/') {
		knh_bytes_t t = knh_bytes_last(url, loc+3);
		loc = knh_bytes_index(t, '@');
		if(loc > 0) {
			t = knh_bytes_first(t, loc);
			loc = knh_bytes_index(t, ':');
			if(loc > 0) {
				t = knh_bytes_first(t, loc);
			}
			knh_format_bytes(buf, bufsiz, t);
			return 1;
		}
	}
	knh_format_bytes(buf, bufsiz, STEXT("konoha")); // default
	return 0;
}
Exemplo n.º 6
0
KNHAPI(int) knh_bytes_parseURLscheme(knh_bytes_t url, char *buf, size_t bufsiz)
{
	knh_index_t loc = knh_bytes_index(url, ':');
	if(loc > 0 && url.buf[loc+1] == '/' && url.buf[loc+2] == '/') {
		knh_format_bytes(buf, bufsiz, knh_bytes_first(url, loc));
		return 1;
	}
	knh_format_bytes(buf, bufsiz, STEXT("http")); // default
	return 0;
}
Exemplo n.º 7
0
static METHOD knh__String_startsWith__IgnoreCase(Ctx *ctx, knh_sfp_t *sfp)
{
	knh_bytes_t base = knh_String_tobytes(sfp[0].s);
	knh_bytes_t expr = knh_String_tobytes(sfp[1].s);
	int res = 0;
	if(expr.len < base.len) {
		base = knh_bytes_first(base, expr.len);
		res = (knh_bytes_strcasecmp(base, expr) == 0);
	}
	KNH_RETURN_Boolean(ctx, sfp, res);
}
Exemplo n.º 8
0
KNHAPI(int) knh_bytes_parseURLport(knh_bytes_t url, int *port)
{
	knh_index_t loc = knh_bytes_index(url, ':');
	if(loc > 0 && url.buf[loc+1] == '/' && url.buf[loc+2] == '/') {
		knh_bytes_t t = knh_bytes_last(url, loc+3);
		loc = knh_bytes_index(t, '@');
		if(loc > 0) t = knh_bytes_last(t, loc+1);
		loc = knh_bytes_index(t, '/');
		if(loc > 0) t = knh_bytes_first(t, loc);
		loc = knh_bytes_index(t, ':');
		if(loc > 0) {
			knh_int_t n = *port;
			if(knh_bytes_parseint(knh_bytes_last(t, loc+1), &n)) {
				*port = (int)n;
				return 1;
			}
		}
	}
	return 0;
}
Exemplo n.º 9
0
static
METHOD knh__Regex_new(Ctx *ctx, knh_sfp_t *sfp)
{
	knh_Regex_t *o = (Regex*)sfp[0].o;
	knh_bytes_t p = knh_String_tobytes(sfp[1].s);
	knh_index_t loc = knh_bytes_index(p, ':');
	KNH_SETv(ctx, o->pattern, sfp[1].s);
	if(loc == -1) {
		o->df = knh_System_getRegexDriver(ctx, STEXT("re"));
	}
	else {
		o->df = knh_System_getRegexDriver(ctx, knh_bytes_first(p, loc));
	}
	o->reg = o->df->regmalloc(ctx);
	{
		char *ptn = (char*)(knh_bytes_last(p, loc+1).buf);
		char *opt = IS_NULL(sfp[2].o) ? "" : knh_String_tochar(sfp[2].s);
		o->df->regcomp(ctx, o->reg, ptn, opt);
	}
	KNH_RETURN(ctx, sfp, sfp[0].o);
}
Exemplo n.º 10
0
static METHOD knh__String_split(Ctx *ctx, knh_sfp_t *sfp)
{
	Array *a = NULL;
	int istrim = IS_NULL(sfp[2].o) ? 0 : (int)sfp[2].ivalue;
	if(IS_NULL(sfp[1].o)) {
		a = knh_String_toCharArray(ctx, sfp[0].s, istrim);
	}
	else {
		knh_bytes_t delim = knh_String_tobytes(sfp[1].s);
		if(delim.len == 0) {
			a = knh_String_toCharArray(ctx, sfp[0].s, istrim);
		}
		else {
			knh_bytes_t base = knh_String_tobytes(sfp[0].s);
			a = new_Array(ctx, CLASS_String, 8);
			while(1) {
				knh_index_t loc = knh_bytes_indexOf(base, delim);
				if(loc == -1) {
					if(istrim) base = knh_bytes_trim(base);
					knh_Array_add(ctx, a, UP(new_String(ctx, base, sfp[0].s)));
					break;
				}
				else if(loc == 0) {
					knh_Array_add(ctx, a, UP(TS_EMPTY));
				}
				else {
					knh_bytes_t t = knh_bytes_first(base, loc);
					if(istrim) t = knh_bytes_trim(t);
					knh_Array_add(ctx, a, UP(new_String(ctx, t, sfp[0].s)));
				}
				base.buf = base.buf + loc + delim.len;
				base.len = base.len - loc - delim.len;
			}
		}
	}
	KNH_ASSERT(a != NULL);
	KNH_RETURN(ctx, sfp, a);
}
Exemplo n.º 11
0
int knh_bytes_parsefloat(knh_bytes_t t, knh_float_t *value)
{
	if(t.buf[0] == '0' && (t.buf[1] == 'x' || t.buf[1] == 'b')) {
		knh_int_t n = 0;
		int res = knh_bytes_parseint(t, &n);
		*value = (knh_float_t)n;
		return res;
	}

	knh_index_t loc = knh_bytes_index(t, 'E');
	if(loc == -1) loc = knh_bytes_index(t, 'e');
	if(loc != -1) {
		t = knh_bytes_first(t, loc);
	}

	size_t i = 0;
	knh_float_t v = 0.0, prev = 0.0, c = 1.0;

	if(t.buf[0] == '-') i = 1;

	for(;i < t.len; i++) {
		if('0' <= t.buf[i] && t.buf[i] <= '9') {
			prev = v;
			v = v * 10 + (t.buf[i] - '0');
#if defined(KNH_USING_MATH) && !defined(KONOHA_ON_WINDOWS)
			if(isinf(v)||isnan(v)) {
				*value = 0.0;
				return 1;
			}
#endif
		}
		else if(t.buf[i] == '.') {
			i++;
			break;
		}
		else {
			*value = (t.buf[0] == '-') ? -v : v;
			return 1;
		}
	}

	for(; i < t.len; i++) {
		if('0' <= t.buf[i] && t.buf[i] <= '9') {
			prev = v;
			c *= 10;
#if defined(KNH_USING_MATH) && !defined(KONOHA_ON_WINDOWS)
			if(isinf(c)||isnan(c)) {
				break;
			}
#endif
			v = v + ((t.buf[i] - '0') / c);
		}else {
			break;
		}
	}

	v = (t.buf[0] == '-') ? -v : v ;

	if(loc != -1) {
		knh_bytes_t t2 = knh_bytes_last(t, loc + 1);
		knh_intptr_t scale = knh_bytes_toint(t2);
		int j;
		if(scale > 0) {
			for(j = 0; j < scale; j++) {
				v *= 10;
			}
		}
		else if(scale < 0) {
			scale = -scale;
			for(j = 0; j < scale; j++) {
				v /= 10;
			}
		}
	}
	*value = v;
	return 1;
}