static int lmz_writer_finalize(lua_State *L) { lmz_file_t* zip = luaL_checkudata(L, 1, "miniz_writer"); void* data; size_t size; if (!mz_zip_writer_finalize_heap_archive(&(zip->archive), &data, &size)) { luaL_error(L, "Problem finalizing archive"); } lua_pushlstring(L, data, size); return 1; }
static int Lwriter_finalize(lua_State *L) { mz_zip_archive *za = (mz_zip_archive*)luaL_checkudata(L, 1, LMZ_ZIP_WRITER); if (mz_zip_get_type(za) == MZ_ZIP_TYPE_HEAP) { size_t len = 0; void* s = NULL; mz_bool result = mz_zip_writer_finalize_heap_archive(za, &s, &len); lua_pushlstring(L, s, len); free(s); return result ? 1 : lmz_zip_pusherror(L, za, NULL); } else if (!mz_zip_writer_finalize_archive(za)) return lmz_zip_pusherror(L, za, NULL); return_self(L); }
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; }