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)); } }
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)); } }
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)); }
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)); } }
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); }
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)); } }
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); }
/* @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)); }
/* @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)); }
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)); }
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)); }
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); }
/* @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)); }
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)); }
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); }
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)); } } }
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)); }
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)); } }
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)); }
/* 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)); }
/* @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); }
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)); }
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)); }
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); }
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); }
/* @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)); }
/* @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)); }
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); }
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)); } } } }
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); }