static int Lzip_write_string(lua_State *L) { size_t size_to_reserve_at_beginning = (size_t)luaL_optinteger(L, 1, 0); size_t initial_allocation_size = (size_t)luaL_optinteger(L, 2, LUAL_BUFFERSIZE); mz_zip_archive* za = (mz_zip_archive*)lua_newuserdata(L, sizeof(mz_zip_archive)); mz_zip_zero_struct(za); if (!mz_zip_writer_init_heap(za, size_to_reserve_at_beginning, initial_allocation_size)) return lmz_zip_pusherror(L, za, NULL); luaL_setmetatable(L, LMZ_ZIP_WRITER); return 1; }
static int lmz_writer_init(lua_State *L) { size_t size_to_reserve_at_beginning = luaL_optint(L, 1, 0); size_t initial_allocation_size = luaL_optint(L, 2, 128 * 1024); lmz_file_t* zip = lua_newuserdata(L, sizeof(*zip)); mz_zip_archive* archive = &(zip->archive); luaL_getmetatable(L, "miniz_writer"); lua_setmetatable(L, -2); memset(archive, 0, sizeof(*archive)); zip->loop = uv_default_loop(); if (!mz_zip_writer_init_heap(archive, size_to_reserve_at_beginning, initial_allocation_size)) { return luaL_error(L, "Problem initializing heap writer"); } return 1; }
std::string pak::bin() //const { std::string result; if( type == paktype::ZIP ) { mz_zip_archive zip_archive; memset( &zip_archive, 0, sizeof(zip_archive) ); mz_bool status = mz_zip_writer_init_heap( &zip_archive, 0, 128 * 1024 ); assert( status ); if( !status ) return "mz_zip_writer_init_heap() failed!", std::string(); for( iterator it = this->begin(); it != this->end(); ++it ) { const char *filename = it->operator[]("filename").c_str(); const char *content = it->operator[]("content").c_str(); const size_t bufsize = it->operator[]("content").size(); status = mz_zip_writer_add_mem( &zip_archive, filename, content, bufsize, MZ_DEFAULT_COMPRESSION ); if( !status ) return "mz_zip_writer_add_mem() failed!", std::string(); } void *pBuf; size_t pSize; status = mz_zip_writer_finalize_heap_archive( &zip_archive, &pBuf, &pSize); if( !status ) return "mz_zip_writer_finalize_heap_archive() failed!", std::string(); // Ends archive writing, freeing all allocations, and closing the output file if mz_zip_writer_init_file() was used. // Note for the archive to be valid, it must have been finalized before ending. status = mz_zip_writer_end( &zip_archive ); assert( status ); if( !status ) return "mz_zip_writer_end() failed!", std::string(); result.resize( pSize ); memcpy( &result.at(0), pBuf, pSize ); free( pBuf ); } else {} return result; }