Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
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;
}
Пример #4
0
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;
        }
    }
}
Пример #5
0
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);
}
Пример #6
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);
}
Пример #7
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);
}
Пример #8
0
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);
}
Пример #9
0
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;
}
Пример #10
0
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;
}
Пример #11
0
{}
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);
    }
Пример #12
0
void cxStringClean(cxString string)
{
    if(cxStringLength(string) > 0){
        utstring_clear(&string->strptr);
    }
}