コード例 #1
0
ファイル: stringapi.c プロジェクト: matsuu/konoha
static METHOD knh__String_replace(Ctx *ctx, knh_sfp_t *sfp)
{
	knh_bytes_t base = knh_String_tobytes(sfp[0].s);
	knh_bytes_t target = knh_String_tobytes(sfp[1].s);
	knh_bytes_t alt = knh_String_tobytes(sfp[2].s);
	knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf);
	int search_flag= 0, ch = target.buf[0], i;

	if (base.len == 0 || target.len == 0) KNH_RETURN(ctx, sfp, sfp[0].o);
	for(i = 0; i < base.len - target.len+1; i++) {
		if(base.buf[i] == ch && knh_bytes_equals_(base, i, target)) {
		    knh_Bytes_write(ctx, cwb->ba, alt);
			i += target.len - 1;
			search_flag = 1;
		}else {
			knh_Bytes_putc(ctx, cwb->ba, base.buf[i]);
		}
	}
	if(search_flag == 0) {
		KNH_RETURN(ctx, sfp, sfp[0].o);
	}
	else {
		knh_bytes_t leftover = {base.buf + i, base.len - i};
		knh_Bytes_write(ctx, cwb->ba, leftover);
		KNH_RETURN(ctx, sfp, knh_cwb_newString(ctx, cwb));
	}
}
コード例 #2
0
ファイル: stringapi.c プロジェクト: matsuu/konoha
static METHOD knh__String_opSub(Ctx *ctx, knh_sfp_t *sfp)
{
	knh_bytes_t base = knh_String_tobytes(sfp[0].s);
	knh_bytes_t t = knh_String_tobytes(sfp[1].s);
	knh_uchar_t c = t.buf[0];
	knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf);
	size_t i;
	for(i = 0; i < base.len; i++) {
		if(base.buf[i] == c) {
			size_t j;
			for(j = 1; j < t.len; j++) {
				if(base.buf[i+j] != t.buf[j]) break;
			}
			if(j == t.len) {
				i += t.len - 1;
				continue;
			}
		}
		knh_Bytes_putc(ctx, cwb->ba, base.buf[i]);
	}
	if(base.len == knh_cwb_size(cwb)) {
		knh_cwb_close(cwb);
		KNH_RETURN(ctx, sfp, sfp[0].o);
	}
	else {
		KNH_RETURN(ctx, sfp, knh_cwb_newString(ctx, cwb));
	}
}
コード例 #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_get(Ctx *ctx, knh_sfp_t *sfp)
{
	knh_bytes_t base = knh_String_tobytes(sfp[0].s);
	if(knh_String_isASCII(sfp[0].s)) {
		size_t n = knh_array_index(ctx, p_int(sfp[1]), knh_String_strlen(sfp[0].s));
		base.buf = base.buf + n;
		base.len = 1;
		KNH_RETURN(ctx, sfp, new_String(ctx, base, sfp[0].s));
	}
	else {
		size_t off = knh_array_index(ctx, p_int(sfp[1]), knh_bytes_mlen(base));
		knh_bytes_t sub = knh_bytes_mofflen(base, off, 1);
		KNH_RETURN(ctx, sfp, new_String(ctx, sub, sfp[0].s));
	}
}
コード例 #5
0
ファイル: xml.c プロジェクト: matsuu/konoha
METHOD Xml_new(Ctx *ctx, knh_sfp_t *sfp)
{
    xmlChar* version = (xmlChar*)p_char(sfp[1]);
    xmlDocPtr doc = xmlNewDoc(version);
    knh_Glue_init(ctx,sfp[0].glue,doc,knh_xml_gfree);
    KNH_RETURN(ctx,sfp,sfp[0].o);
}
コード例 #6
0
ファイル: narutoapi.c プロジェクト: matsuu/konoha
METHOD knh__Script_readLine(Ctx *ctx, knh_sfp_t *sfp)
{
	char *line;
	if(IS_NULL(sfp[1].o)) {
		line = knh_readline("");
	}
	else {
		line = knh_readline(knh_String_text(ctx, sfp[1].s));
	}
	if(line == NULL) {
		KNH_RETURN(ctx, sfp, KNH_NULL);
	}
	else {
		KNH_RETURN(ctx, sfp, new_String(ctx, B(line), NULL));
	}
}
コード例 #7
0
ファイル: stringapi.c プロジェクト: matsuu/konoha
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);
}
コード例 #8
0
ファイル: xmlreader.c プロジェクト: matsuu/konoha
/* @method String XmlReader.lookupNameSpace(String ns) */
METHOD XmlReader_lookupNameSpace(Ctx *ctx, knh_sfp_t *sfp)
{
    xmlTextReaderPtr reader = (xmlTextReaderPtr) p_cptr(sfp[0]);
    xmlChar* ns   = (xmlChar*) p_char(sfp[1]);
    char* ret = (char*) xmlTextReaderLookupNamespace(reader,ns);
    KNH_RETURN(ctx,sfp,new_String(ctx,B(ret),NULL));
}
コード例 #9
0
ファイル: xmlreader.c プロジェクト: matsuu/konoha
/* @method String XmlReader.getAttributeNo(Int numer) */
METHOD XmlReader_getAttributeNo(Ctx *ctx, knh_sfp_t *sfp)
{
    xmlTextReaderPtr reader = (xmlTextReaderPtr) p_cptr(sfp[0]);
    int num = p_int(sfp[1]);
    char* ret = (char*) xmlTextReaderGetAttributeNo(reader,num);
    KNH_RETURN(ctx,sfp,new_String(ctx,B(ret),NULL));
}
コード例 #10
0
ファイル: xml.c プロジェクト: matsuu/konoha
METHOD Xml_createNode(Ctx *ctx, knh_sfp_t *sfp)
{
    xmlDocPtr doc = (xmlDocPtr) p_cptr(sfp[0]);
    xmlChar *name = (xmlChar*) p_char(sfp[1]);
    doc->children = xmlNewDocNode(doc, NULL, name , NULL);
    KNH_RETURN(ctx,sfp,new_Glue(ctx,(char*)"libxml2.XmlNode",doc->children,NULL));
}
コード例 #11
0
ファイル: xml.c プロジェクト: matsuu/konoha
METHOD Xml_dump(Ctx *ctx, knh_sfp_t *sfp)
{
    xmlDocPtr doc = (xmlDocPtr) p_cptr(sfp[0]);
    xmlChar* ret;
    int   size;
    xmlDocDumpMemory(doc,&ret,&size);
    KNH_RETURN(ctx, sfp, new_String(ctx, B((char*)ret), NULL));
}
コード例 #12
0
ファイル: hashapi.c プロジェクト: matsuu/konoha
static METHOD knh__HashMap_get(Ctx *ctx, knh_sfp_t *sfp)
{
	HashMap *o = (HashMap*)sfp[0].o;
	knh_hcode_t hcode = knh_stack_hashCode(ctx, sfp + 1);
	knh_uintptr_t h =  hcode % DP(o)->hmax;
	knh_hashentry_t *e = DP(o)->array[h];

	while(e != NULL) {
		if(e->hcode == hcode
				&& knh_Object_cid(sfp[1].o) == knh_Object_cid(e->key)
				&& knh_stack_equals(ctx, sfp + 1, e->key)) {
			KNH_RETURN(ctx, sfp, e->value);
		}
		e = e->next;
	}
	KNH_RETURN(ctx, sfp, KNH_NULL);
}
コード例 #13
0
ファイル: xmlreader.c プロジェクト: matsuu/konoha
/* @method String XmlReader.getAttributeNs(String ns, String name) */
METHOD XmlReader_getAttributeNs(Ctx *ctx, knh_sfp_t *sfp)
{
    xmlTextReaderPtr reader = (xmlTextReaderPtr) p_cptr(sfp[0]);
    xmlChar* ns   = (xmlChar*) p_char(sfp[1]);
    xmlChar* name = (xmlChar*) p_char(sfp[2]);
    char* ret = (char*) xmlTextReaderGetAttributeNs(reader,ns,name);
    KNH_RETURN(ctx,sfp,new_String(ctx,B(ret),NULL));
}
コード例 #14
0
ファイル: xml.c プロジェクト: matsuu/konoha
METHOD XmlNode_getChild(Ctx *ctx, knh_sfp_t *sfp)
{
    xmlNodePtr node  = (xmlNodePtr) p_cptr(sfp[0]);
    xmlNodePtr child = (xmlNodePtr) node->children;
    if(child == NULL){
        KNH_THROWs(ctx, "XmlNode: dont have child!");
    }
    KNH_RETURN(ctx,sfp,new_Glue(ctx,(char*)"libxml2.XmlNode",child,NULL));
}
コード例 #15
0
ファイル: hashapi.c プロジェクト: matsuu/konoha
static METHOD knh__HashMap_new(Ctx *ctx, knh_sfp_t *sfp)
{
	HashMap *o = (HashMap*)sfp[0].o;
	int init = IS_NULL(sfp[1].o) ? KNH_HASH_INITSIZE: p_int(sfp[1]);
	if(init > 0) {
		ctx->share->StructTable[STRUCT_HashMap].finit(ctx, sfp[0].o, init);
	}
	KNH_RETURN(ctx, sfp, o);
}
コード例 #16
0
ファイル: stringapi.c プロジェクト: matsuu/konoha
static METHOD knh__String_opMod(Ctx *ctx, knh_sfp_t *sfp)
{
	if(!IS_bString(sfp[0].o)) {
		KNH_RETURN(ctx, sfp, TS_EMPTY);
	}
	else {
		knh_bytes_t base = knh_String_tobytes(sfp[0].s);
		knh_bytes_t delim = knh_String_tobytes(sfp[1].s);
		knh_index_t index = knh_bytes_indexOf(base, delim);
		if(index == -1) {
			KNH_RETURN(ctx, sfp, TS_EMPTY);
		}
		else {
			base = knh_bytes_last(base, index + delim.len);
			KNH_RETURN(ctx, sfp, new_String(ctx, base, sfp[0].s));
		}
	}
}
コード例 #17
0
ファイル: xml.c プロジェクト: matsuu/konoha
METHOD XmlNode_getNext(Ctx *ctx, knh_sfp_t *sfp)
{
    xmlNodePtr node = (xmlNodePtr) p_cptr(sfp[0]);
    xmlNodePtr next = (xmlNodePtr) node->next;
    if(next == NULL){
        KNH_THROWs(ctx, "XmlNode: dont have next!");
    }
    KNH_RETURN(ctx,sfp,new_Glue(ctx,(char*)"libxml2.XmlNode",next,NULL));
}
コード例 #18
0
ファイル: stringapi.c プロジェクト: matsuu/konoha
static METHOD knh__String_opMul(Ctx *ctx, knh_sfp_t *sfp)
{
	knh_intptr_t n = p_int(sfp[1]);
	if(n <= 0) {
		KNH_RETURN(ctx, sfp, TS_EMPTY);
	}else if(n == 1) {
		KNH_RETURN(ctx, sfp, sfp[0].o);
	}
	else {
		knh_bytes_t base = knh_String_tobytes(sfp[0].s);
		knh_cwb_t cwbbuf, *cwb = knh_cwb_open(ctx, &cwbbuf);
		knh_intptr_t i;
		for(i = 0; i < n; i++) {
			knh_Bytes_write(ctx, cwb->ba, base);
		}
		KNH_RETURN(ctx, sfp, knh_cwb_newString(ctx, cwb));
	}
}
コード例 #19
0
ファイル: xml.c プロジェクト: matsuu/konoha
METHOD XmlNode_getName(Ctx *ctx, knh_sfp_t *sfp)
{
    xmlNodePtr node= (xmlNodePtr) p_cptr(sfp[0]);
    xmlChar* ret = (xmlChar *)"";
    if(node->name){
        ret = (xmlChar *)node->name;
    }
    KNH_RETURN(ctx, sfp, new_String(ctx, B((char*)ret), NULL));
}
コード例 #20
0
ファイル: xml.c プロジェクト: matsuu/konoha
/* XmlNode */
METHOD XmlNode_createNode(Ctx *ctx, knh_sfp_t *sfp)
{
    xmlNodePtr parent = (xmlNodePtr) p_cptr(sfp[0]);
    xmlChar *name = (xmlChar*) p_char(sfp[1]);
    xmlChar *val  = (xmlChar*) p_char(sfp[2]);

    xmlNodePtr node = xmlNewChild(parent, NULL, name, val);
    KNH_RETURN(ctx,sfp,new_Glue(ctx,(char*)"libxml2.XmlNode",node,NULL));
}
コード例 #21
0
ファイル: xmlreader.c プロジェクト: matsuu/konoha
/* @method This! XmlReader.new(String filename) */
METHOD XmlReader_new(Ctx *ctx, knh_sfp_t *sfp)
{
    char* filename = (char*)p_char(sfp[1]);
    xmlTextReaderPtr reader = xmlNewTextReaderFilename(filename);
    if(reader == NULL) {
        KNH_THROWs(ctx, "XmlReader: cant load file");
    }
    knh_Glue_init(ctx,sfp[0].glue,reader,knh_xmlreader_gfree);
    KNH_RETURN(ctx,sfp,sfp[0].o);
}
コード例 #22
0
ファイル: xml.c プロジェクト: matsuu/konoha
METHOD XmlNode_getAttr(Ctx *ctx, knh_sfp_t *sfp)
{
    xmlNodePtr node= (xmlNodePtr) p_cptr(sfp[0]);
    xmlChar *name = (xmlChar *) p_char(sfp[1]);
    xmlChar *ret  = (xmlChar *)"";
    if(node->properties){
        ret  = xmlGetProp(node,name);
    }
    KNH_RETURN(ctx, sfp, new_String(ctx, B((char*)ret), NULL));
}
コード例 #23
0
ファイル: xml.c プロジェクト: matsuu/konoha
METHOD XmlNode_getContent(Ctx *ctx, knh_sfp_t *sfp)
{
    xmlNodePtr node= (xmlNodePtr) p_cptr(sfp[0]);
    xmlChar* ret = (xmlChar *)"";
    if(node->content){
        ret = node->content;
        fprintf(stdout,"[%s]\n",(char*)node->content);
    }
    KNH_RETURN(ctx, sfp, new_String(ctx, B((char*)ret), NULL));
}
コード例 #24
0
ファイル: xml.c プロジェクト: matsuu/konoha
METHOD XPath_new(Ctx *ctx, knh_sfp_t *sfp)
{
    xmlDocPtr doc = (xmlDocPtr) p_cptr(sfp[1]);
    xmlXPathContextPtr xctx;
    if (!(xctx = xmlXPathNewContext(doc))) {
        KNH_THROWs(ctx, "XPATH: cant create xmlXPathContext");
    }
    knh_Glue_init(ctx,sfp[0].glue,xctx,knh_xpath_gfree);
    KNH_RETURN(ctx,sfp,sfp[0].o);
}
コード例 #25
0
ファイル: stringapi.c プロジェクト: matsuu/konoha
static METHOD knh__String_trim(Ctx *ctx, knh_sfp_t *sfp)
{
	knh_bytes_t t = knh_String_tobytes(sfp[0].s);
	knh_bytes_t t2 = knh_bytes_trim(t);
	String *s = sfp[0].s;
	if(t.len > t2.len) {
		s = new_String(ctx, t2, s);
	}
	KNH_RETURN(ctx, sfp, s);
}
コード例 #26
0
ファイル: xmlreader.c プロジェクト: matsuu/konoha
/* @method String XmlReader.getAttribute() */
METHOD XmlReader_getAttribute(Ctx *ctx, knh_sfp_t *sfp)
{
    xmlTextReaderPtr reader = (xmlTextReaderPtr) p_cptr(sfp[0]);
    xmlChar * ns = (xmlChar *) p_char(sfp[1]);
    char* ret = (char*) xmlTextReaderGetAttribute(reader,ns);
    if(ret == NULL){
        ret = "";
    }
    KNH_RETURN(ctx,sfp,new_String(ctx,B(ret),NULL));
}
コード例 #27
0
ファイル: xmlreader.c プロジェクト: matsuu/konoha
/* @method String XmlReader.getQuoteChar() */
METHOD XmlReader_getQuoteChar(Ctx *ctx, knh_sfp_t *sfp)
{
    xmlTextReaderPtr reader = (xmlTextReaderPtr) p_cptr(sfp[0]);
    int num = xmlTextReaderQuoteChar(reader);
    char* ret = " ";
    if(num == 34){
        ret[0] = '"';
    } else {
        ret[0] = '\0';
    }
    KNH_RETURN(ctx,sfp,new_String(ctx,B(ret),NULL));
}
コード例 #28
0
METHOD Chardev_new(Ctx *ctx, knh_sfp_t *sfp)
{
	printk("%s:%d\n",__func__,__LINE__);
	knh_device_t *dev = new_device(ctx, sfp[1].s);
	knh_RawPtr_init(ctx, sfp[0].glue, dev, device_gfree);

	// set ref for object.
	// but we do not set ref because it becomes cyclic refalence.
	dev->self = sfp[0].o;
	printk("%s:%d, cid=%d\n",__func__,__LINE__, knh_Object_cid(sfp[0].o));
	KNH_RETURN(ctx, sfp, sfp[0].o);
}
コード例 #29
0
ファイル: stringapi.c プロジェクト: matsuu/konoha
static METHOD knh__String_opDiv(Ctx *ctx, knh_sfp_t *sfp)
{
	if(!IS_bString(sfp[0].o)) {
		KNH_RETURN(ctx, sfp, TS_EMPTY);
	}
	else {
		knh_bytes_t base = knh_String_tobytes(sfp[0].s);
		knh_index_t index = knh_bytes_indexOf(base, knh_String_tobytes(sfp[1].s));
		if(index == -1) {
			KNH_RETURN(ctx, sfp, sfp[0].o);
		}
		else {
			if(index == 0) {
				KNH_RETURN(ctx, sfp, TS_EMPTY);
			}
			else {
				base.len = index;
				KNH_RETURN(ctx, sfp, new_String(ctx, base, sfp[0].s));
			}
		}
	}
}
コード例 #30
0
ファイル: stringapi.c プロジェクト: matsuu/konoha
static METHOD knh__String_new(Ctx *ctx, knh_sfp_t *sfp)
{
	String *s;
	if(IS_NULL(sfp[2].o)) {
		s = new_String(ctx, knh_Bytes_tobytes(sfp[1].ba), NULL);
	}
	else {
		BytesConv *bc = new_BytesConv__in(ctx, knh_String_tochar(sfp[2].s));
		KNH_SETv(ctx, sfp[3].o, bc);
		s = new_String__bconv(ctx, knh_Bytes_tobytes(sfp[1].ba), bc);
	}
	KNH_RETURN(ctx, sfp, s);
}