Sophon_Result sophon_insfile_store (Sophon_VM *vm, Sophon_Module *mod, Sophon_IOFunc func, Sophon_Ptr data) { Sophon_U16 i; SOPHON_ASSERT(vm && mod && func); put_u32(func, data, SOPHON_INSFILE_MAGIC); put_u32(func, data, SOPHON_INSFILE_VERSION); if (mod->name) put_str(vm, func, data, mod->name); else put_u32(func, data, 0); put_u16(func, data, mod->const_count); for (i = 0; i < mod->const_count; i++) { put_value(vm, func, data, mod->consts[i]); } put_u16(func, data, mod->func_count); for (i = 0; i < mod->func_count; i++) { put_func(vm, func, data, mod->funcs[i]); } return SOPHON_OK; }
size_t tds_sys_iconv (iconv_t cd, const char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft) { const unsigned char *ib; unsigned char *ob; size_t il, ol; int local_errno; #undef CD #define CD ((int) (TDS_INTPTR) cd) /* iconv defines valid semantics for NULL inputs, but we don't support them. */ if (!inbuf || !*inbuf || !inbytesleft || !outbuf || !*outbuf || !outbytesleft) return 0; /* * some optimizations * - do not use errno directly only assign a time * (some platform define errno as a complex macro) * - some processors have few registers, deference and copy input variable * (this make also compiler optimize more due to removed aliasing) * also we use unsigned to remove required unsigned casts */ local_errno = 0; il = *inbytesleft; ol = *outbytesleft; ib = (const unsigned char*) *inbuf; ob = (unsigned char*) *outbuf; if (CD == Like_to_Like) { size_t copybytes = (il < ol)? il : ol; memcpy(ob, ib, copybytes); ob += copybytes; ol -= copybytes; ib += copybytes; il -= copybytes; } else if (CD & ~0x77) { local_errno = EINVAL; } else { iconv_get_t get_func = iconv_gets[(CD>>4) & 7]; iconv_put_t put_func = iconv_puts[ CD & 7]; while (il) { ICONV_CHAR out_c; int readed = get_func(ib, il, &out_c), written; if (TDS_UNLIKELY(readed < 0)) { local_errno = -readed; break; } written = put_func(ob, ol, out_c); if (TDS_UNLIKELY(written < 0)) { local_errno = -written; break; } il -= readed; ib += readed; ol -= written; ob += written; } } /* back to source */ *inbytesleft = il; *outbytesleft = ol; *inbuf = (const char*) ib; *outbuf = (char*) ob; if (il && !local_errno) local_errno = E2BIG; if (local_errno) { errno = local_errno; return (size_t)(-1); } return 0; }