/******************************************************************************* This file is Part of the ZEngine Library for 2D game development. Copyright (C) 2002, 2003 James Turk Licensed under a BSD-style license. The maintainer of this library is James Turk (james@conceptofzero.net) and the home of this Library is http://www.zengine.sourceforge.net *******************************************************************************/ /** \file ZE_Utility.cpp \brief Source file for ZEngine utility functions. Source file containing open utilities for use inside and alongside ZEngine.
$Id: ZE_Utility.cpp,v 1.11 2003/09/24 02:03:18 cozman Exp $
\author James Turk **/ #include "ZE_Utility.h" namespace ZE { std::string FormatStr(const char *fmtstr, ...) { char buf[512]; va_list args; //simply puts args into the buffer using standard parsing rules va_start(args,fmtstr); vsprintf(buf, fmtstr, args); va_end(args); return buf; } SDL_RWops* RWFromZip(std::string zipname, std::string filename) { unzFile zip = unzOpen(zipname.c_str()); unz_file_info info; void *buffer; if(!zip) //failed to open zip { //log error return NULL; } //locate the file and open it (last param means case sensitive comparison) unzLocateFile(zip,filename.c_str(),0); if(unzOpenCurrentFile(zip) != UNZ_OK) //failed to open file within zip { return NULL; } //find current file info (we are looking for uncompressed file size) unzGetCurrentFileInfo(zip,&info,NULL,0,NULL,0,NULL,0); //create a buffer big enough to hold uncompressed file in memory buffer = (void*)new char[info.uncompressed_size]; if(!buffer) { unzCloseCurrentFile(zip); unzClose(zip); //log error (failed to allocate memory?!) return NULL; } //load into memory unzReadCurrentFile(zip, buffer, info.uncompressed_size); //close archive unzCloseCurrentFile(zip); unzClose(zip); return SDL_RWFromMem(buffer, info.uncompressed_size); //return buffer in RW form } //Each of the Free*s safely frees & NULLs the pointer void FreeImage(SDL_Surface *&image) { if(image) { SDL_FreeSurface(image); image = NULL; } } #ifdef USE_SDL_MIXER void FreeSound(Mix_Chunk *&chunk) { if(chunk) { Mix_FreeChunk(chunk); chunk = NULL; } } void FreeMusic(Mix_Music *&music) { if(music) { Mix_FreeMusic(music); music = NULL; } } #endif #ifdef USE_SDL_TTF void FreeFont(TTF_Font *&font) { if(font) { TTF_CloseFont(font); font = NULL; } } #endif }