cxJson cxJsonCreate(cxString json) { CX_ASSERT(json != NULL, "args error"); cxJson this = CX_CREATE(cxJson); json_error_t error = {0}; if(cxStringLength(json) <= 0){ return this; } this->json = json_loadb(cxStringBody(json), cxStringLength(json), JSON_DECODE_ANY, &error); CX_ASSERT(this->json != NULL, "cxJson load error (%d:%d) %s:%s",error.line,error.column,error.source,error.text); return this; }
cxBool cxDBSet(cxAny db,cxString key,cxString value) { cxDB this = db; cxDBEnv env = cxDBGetEnv(db); CX_ASSERT(this->flags & DB_RDONLY, "only env ,can't set data"); cxDBTxn txn = cxStackTop(env->txn); DBT k={0}; k.data = (void *)cxStringBody(key); k.size = cxStringLength(key); k.flags = DB_DBT_USERMEM; DBT v={0}; v.data = (void *)cxStringBody(value); v.size = cxStringLength(value); v.flags = DB_DBT_USERMEM; return this->dbptr->put(this->dbptr,cxDBTxnPtr(txn),&k,&v,0) == 0; }
CX_METHOD_DEF(cxTextureJPG,Load,cxBool,cxStream stream) { cxBool ret = false; struct jpeg_decompress_struct cinfo; cxJPEGError error; cinfo.err = jpeg_std_error(&error.pub); error.error = false; error.pub.error_exit = cxJPGErrorExit; jpeg_create_decompress(&cinfo); if(error.error){ CX_ERROR("jpg create decompress failed"); goto finished; } cxString bytes = CX_CALL(stream, AllBytes, CX_M(cxString)); if(bytes == NULL){ CX_ERROR("jpg read stream data error"); goto finished; } jpeg_mem_src(&cinfo, (cxUChar *)cxStringBody(bytes), cxStringLength(bytes)); jpeg_read_header(&cinfo, true); if(error.error){ CX_ERROR("jpg read head failed"); goto finished; } this->cxTexture.size = cxSize2fv(cinfo.image_width, cinfo.image_height); this->cxTexture.hasAlpha = false; jpeg_start_decompress(&cinfo); if(error.error){ CX_ERROR("jpg start decompress failed"); goto finished; } int row_stride = cinfo.output_width * cinfo.output_components; cxAny data = allocator->malloc(row_stride * cinfo.output_height); JSAMPARRAY buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); int line = 0; while(cinfo.output_scanline < cinfo.output_height){ jpeg_read_scanlines(&cinfo, buffer, 1); memcpy(data + line * row_stride, buffer[0], row_stride); line++; } GLint unpack = 0; glGetIntegerv(GL_UNPACK_ALIGNMENT, &unpack); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); cxOpenGLGenTextures(1, &this->cxTexture.textureId); cxOpenGLBindTexture(this->cxTexture.textureId, 0); cxOpenGLSetTexParameters(this->cxTexture.texParam); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, cinfo.image_width, cinfo.image_height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); glPixelStorei(GL_UNPACK_ALIGNMENT, unpack); cxOpenGLBindTexture(0, 0); allocator->free(data); ret = true; finished: jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); return ret; }
void cxStringReplace(cxString string,cxChar find,cxChar rep) { cxChar *ptr = (cxChar *)cxStringBody(string); cxInt len = cxStringLength(string); for(cxInt i=0; i < len; i++){ if(ptr[i] == find){ ptr[i] = rep; } } }
cxBool cxDBHas(cxAny db,cxString key) { cxDB this = db; cxDBEnv env = cxDBGetEnv(db); cxDBTxn txn = cxStackTop(env->txn); DBT k={0}; k.data = (void *)cxStringBody(key); k.size = cxStringLength(key); k.flags = DB_DBT_USERMEM; return (this->dbptr->exists(this->dbptr,cxDBTxnPtr(txn),&k,0) == 0); }
cxBool cxDBDel(cxAny db,cxString key) { cxDB this = db; cxDBEnv env = cxDBGetEnv(db); CX_ASSERT(this->flags & DB_RDONLY, "only env ,can't del data"); cxDBTxn txn = cxStackTop(env->txn); DBT k={0}; k.data = (void *)cxStringBody(key); k.size = cxStringLength(key); k.flags = DB_DBT_USERMEM; return (this->dbptr->del(this->dbptr,cxDBTxnPtr(txn),&k,0) == 0); }
cxString cxMD5(cxString v) { static const char hex[16] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; CX_ASSERT(v != NULL, "args error"); mongo_md5_state_t state={0}; mongo_md5_byte_t digest[MD5_DIGEST_LENGTH]; mongo_md5_init(&state); mongo_md5_append(&state, (const mongo_md5_byte_t *)cxStringBody(v), cxStringLength(v)); mongo_md5_finish(&state, digest); cxChar md5[MD5_DIGEST_LENGTH*2 + 1]={0}; for(cxInt i = 0; i < MD5_DIGEST_LENGTH; i++){ md5[2*i] = hex[(digest[i] & 0xf0)>> 4]; md5[2*i + 1] = hex[digest[i] & 0x0f]; } return cxStringConstChars(md5); }
cxString cxDBGet(cxAny db,cxString key) { cxDB this = db; cxDBEnv env = cxDBGetEnv(db); cxDBTxn txn = cxStackTop(env->txn); DBT k={0}; k.data = (void *)cxStringBody(key); k.size = cxStringLength(key); k.flags = DB_DBT_USERMEM; DBT v={0}; v.flags = DB_DBT_MALLOC; if(this->dbptr->get(this->dbptr, cxDBTxnPtr(txn), &k, &v,0) != 0){ return NULL; } if(v.size == 0 || v.data == NULL){ return NULL; } return cxStringAttach(v.data, v.size); }
static cxInt cxEngineLuaLoader(lua_State *L) { cxChar path[PATH_MAX] = {0}; cxConstChars file = luaL_checkstring(L, 1); cxConstChars ext = strrchr(file, '.'); cxString data = NULL; if(ext == NULL || !cxConstCharsEqu(ext, ".lua")){ snprintf(path, PATH_MAX, "%s.lua",file); data = cxEngineGetLuaScript(path); } if(data == NULL){ snprintf(path, PATH_MAX, "%s",file); data = cxEngineGetLuaScript(path); } if(data != NULL){ luaL_loadbuffer(L, cxStringBody(data), cxStringLength(data), file); return 1; } luaL_error(L, "error loading file %s error",path); return 1; }
cxArray cxStringSplit(cxString string,cxConstChars sp) { CX_ASSERT(string != NULL, "args error"); cxConstChars body = cxStringBody(string); cxInt length = cxStringLength(string) + 1; cxChar buffer[length]; cxInt idx = 0; cxArray ret = CX_CREATE(cxArray); for(cxInt i=0; i < length; i++){ if(!cxConstCharsHasChar(sp, body[i]) && body[i] != '\0'){ buffer[idx++] = body[i]; continue; } if(idx == 0){ continue; } cxString item = CX_CREATE(cxString); cxStringAppend(item, buffer, idx); cxArrayAppend(ret, item); idx = 0; } return ret; }
{} CX_OBJECT_FREE(cxRegex, cxObject) { if(this->regex != NULL){ pcre_free(this->regex); } CX_RELEASE(this->input); } CX_OBJECT_TERM(cxRegex, cxObject) cxString cxRegexReplace(cxRegex this,cxRegexReplaceFunc replaceFunc,cxAny arg) { CX_ASSERT(replaceFunc != NULL, "args error"); cxString ret = CX_CREATE(cxString); cxInt start = 0; cxInt length = cxStringLength(this->input); cxConstChars ptr = cxStringBody(this->input); while(cxRegexNext(this)){ cxRegexPos pos = cxRegexPosition(this, 0); if((pos.start - start) > 0){ cxStringAppend(ret, ptr + start, pos.start - start); } cxString replace = replaceFunc(this,arg); if(cxStringOK(replace)){ cxStringConcat(ret, replace); } start = pos.end; } if(start < length){ cxStringAppend(ret, ptr + start, length - start); }
void cxStringClean(cxString string) { if(cxStringLength(string) > 0){ utstring_clear(&string->strptr); } }