diff --git a/src/defs.h b/src/defs.h index ac98070..ae6dde6 100644 --- a/src/defs.h +++ b/src/defs.h @@ -56,7 +56,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define MAX_DESCRIPTION_LENGTH 512 #define MAX_LINE_LENGTH 1024 #define MAX_FILENAME_LENGTH 1024 -#define MAX_PATH_LENGTH 4096 #define NUM_TEXTURE_BUCKETS 32 #define NUM_ATLAS_BUCKETS 64 diff --git a/src/game/game.c b/src/game/game.c index 495ce8f..23e882e 100644 --- a/src/game/game.c +++ b/src/game/game.c @@ -275,7 +275,7 @@ static void loadMetaInfo(void) void loadGame(int slot) { cJSON *root, *node, *statsJSON; - char *text, filename[MAX_PATH_LENGTH], *statName; + char *text, *filename, *statName; int i; Tuple *t; Trophy *trophy; @@ -286,7 +286,7 @@ void loadGame(int slot) game.saveSlot = slot; - sprintf(filename, "%s/%d/game.json", app.saveDir, game.saveSlot); + filename = buildFormattedString("%s/%d/game.json", app.saveDir, game.saveSlot); if (fileExists(filename)) { @@ -341,17 +341,19 @@ void loadGame(int slot) free(text); } + + free(filename); } void saveGame(void) { cJSON *root, *statsJSON, *keysJSON, *keyJSON, *missionsJSON, *missionJSON, *trophiesJSON, *trophyJSON; - char filename[MAX_PATH_LENGTH], *out; + char *filename, *out; Tuple *t; Trophy *trophy; int i; - sprintf(filename, "%s/%d/game.json", app.saveDir, game.saveSlot); + filename = buildFormattedString("%s/%d/game.json", app.saveDir, game.saveSlot); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Saving game to '%s' ...", filename); @@ -409,6 +411,8 @@ void saveGame(void) cJSON_Delete(root); free(out); + + free(filename); } /* @@ -418,10 +422,10 @@ void saveGame(void) void restoreGameState(void) { cJSON *root, *node, *statsJSON; - char *text, filename[MAX_PATH_LENGTH]; + char *text, *filename; int i; - sprintf(filename, "%s/%d/game.json", app.saveDir, game.saveSlot); + filename = buildFormattedString("%s/%d/game.json", app.saveDir, game.saveSlot); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Restoring game from '%s' ...", filename); @@ -453,6 +457,8 @@ void restoreGameState(void) cJSON_Delete(root); free(text); + + free(filename); } char *getSaveWidgetLabel(char *filename) @@ -498,9 +504,9 @@ char *getSaveWidgetLabel(char *filename) void deleteSaveSlot(int slot) { int i, numFiles; - char path[MAX_PATH_LENGTH], **filenames; + char *path, **filenames; - sprintf(path, "%s/%d", app.saveDir, slot); + path = buildFormattedString("%s/%d", app.saveDir, slot); filenames = getFileList(path, &numFiles); @@ -518,6 +524,8 @@ void deleteSaveSlot(int slot) } free(filenames); + + free(path); } static int sortItems(const void *a, const void *b) diff --git a/src/game/game.h b/src/game/game.h index cde2097..c3ea080 100644 --- a/src/game/game.h +++ b/src/game/game.h @@ -33,6 +33,7 @@ extern int lookup(char *name); extern char *readFile(const char *filename); extern char *timeToString(int seconds, int showHours); extern int writeFile(const char *filename, const char *data); +extern char *buildFormattedString(const char *format, ...); extern App app; extern Entity *self; diff --git a/src/game/title.c b/src/game/title.c index 030ab40..4ee9be3 100644 --- a/src/game/title.c +++ b/src/game/title.c @@ -164,7 +164,7 @@ static void draw(void) static int getRecentSave(void) { - char filename[MAX_PATH_LENGTH]; + char *filename; int i, slot, curModTime, modTime; slot = -1; @@ -172,7 +172,7 @@ static int getRecentSave(void) for (i = 0 ; i < MAX_SAVE_SLOTS ; i++) { - sprintf(filename, "%s/%d/game.json", app.saveDir, i); + filename = buildFormattedString("%s/%d/game.json", app.saveDir, i); if (fileExists(filename)) { @@ -184,6 +184,8 @@ static int getRecentSave(void) slot = i; } } + + free(filename); } return slot; @@ -192,7 +194,7 @@ static int getRecentSave(void) static void populateSaveSlotWidgets(void) { int i; - char name[MAX_NAME_LENGTH], filename[MAX_PATH_LENGTH]; + char name[MAX_NAME_LENGTH], *filename; for (i = 0 ; i < MAX_SAVE_SLOTS ; i++) { @@ -200,7 +202,7 @@ static void populateSaveSlotWidgets(void) save[i] = getWidget(name, "saveSlot"); - sprintf(filename, "%s/%d/game.json", app.saveDir, i); + filename = buildFormattedString("%s/%d/game.json", app.saveDir, i); if (fileExists(filename)) { @@ -216,6 +218,8 @@ static void populateSaveSlotWidgets(void) save[i]->value[1] = i; save[i]->action = &doSaveSlot; + + free(filename); } } diff --git a/src/game/title.h b/src/game/title.h index 934b034..f971b42 100644 --- a/src/game/title.h +++ b/src/game/title.h @@ -54,6 +54,7 @@ extern void setSelectedWidget(char *name, char *group); extern void showWidgetGroup(char *group); extern void startSectionTransition(void); extern void stopMusic(void); +extern char *buildFormattedString(const char *format, ...); extern App app; extern Colors colors; diff --git a/src/plat/unix/unixInit.c b/src/plat/unix/unixInit.c index 4dbd40d..04e26bd 100644 --- a/src/plat/unix/unixInit.c +++ b/src/plat/unix/unixInit.c @@ -24,8 +24,7 @@ static void mkpath(const char *path); void createSaveFolder(void) { - char *userHome; - char dir[MAX_PATH_LENGTH]; + char *userHome, *dir; int i; userHome = getenv("HOME"); @@ -40,12 +39,14 @@ void createSaveFolder(void) for (i = 0 ; i < MAX_SAVE_SLOTS ; i++) { - sprintf(dir, "%s/.local/share/blobwarsAttrition/%d", userHome, i); + dir = buildFormattedString("%s/.local/share/blobwarsAttrition/%d", userHome, i); mkpath(dir); + + free(dir); } - sprintf(app.saveDir, "%s/.local/share/blobwarsAttrition", userHome); + app.saveDir = buildFormattedString("%s/.local/share/blobwarsAttrition", userHome); } static void mkpath(const char *path) diff --git a/src/plat/unix/unixInit.h b/src/plat/unix/unixInit.h index 3d612a0..a30b993 100644 --- a/src/plat/unix/unixInit.h +++ b/src/plat/unix/unixInit.h @@ -25,5 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "../../common.h" +extern char *buildFormattedString(const char *format, ...); + extern App app; extern Dev dev; diff --git a/src/plat/win32/win32Init.c b/src/plat/win32/win32Init.c index 3ad2693..32a19b7 100644 --- a/src/plat/win32/win32Init.c +++ b/src/plat/win32/win32Init.c @@ -24,8 +24,7 @@ static void mkpath(const char *path); void createSaveFolder(void) { - char *userHome; - char dir[MAX_PATH_LENGTH]; + char *userHome, *dir; int i; userHome = getenv("USERPROFILE"); @@ -40,12 +39,14 @@ void createSaveFolder(void) for (i = 0 ; i < MAX_SAVE_SLOTS ; i++) { - sprintf(dir, "%s\\blobwarsAttrition\\%d", userHome, i); + dir = buildFormattedString("%s\\blobwarsAttrition\\%d", userHome, i); mkpath(dir); + + free(dir); } - sprintf(app.saveDir, "%s\\blobwarsAttrition", userHome); + app.saveDir = buildFormattedString("%s\\blobwarsAttrition", userHome); } void mkpath(const char *path) diff --git a/src/plat/win32/win32Init.h b/src/plat/win32/win32Init.h index 6579e25..464a5db 100644 --- a/src/plat/win32/win32Init.h +++ b/src/plat/win32/win32Init.h @@ -24,5 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "../../common.h" +extern char *buildFormattedString(const char *format, ...); + extern App app; extern Dev dev; diff --git a/src/structs.h b/src/structs.h index cb47caf..ce8801d 100644 --- a/src/structs.h +++ b/src/structs.h @@ -337,7 +337,7 @@ typedef struct { } Config; typedef struct { - char saveDir[MAX_FILENAME_LENGTH]; + char *saveDir; float scaleX; float scaleY; Mouse mouse; diff --git a/src/system/draw.c b/src/system/draw.c index 6f1761a..996264a 100644 --- a/src/system/draw.c +++ b/src/system/draw.c @@ -261,20 +261,22 @@ static void initColor(SDL_Color *c, int r, int g, int b) void saveScreenshot(char *name) { - char filename[MAX_PATH_LENGTH]; + char *filename; SDL_Surface *screenshot; if (name != NULL) { - sprintf(filename, "%s/%d/%s.png", app.saveDir, game.saveSlot, name); + filename = buildFormattedString("%s/%d/%s.png", app.saveDir, game.saveSlot, name); } else { - sprintf(filename, "%s/%d.png", dev.screenshotFolder, SDL_GetTicks()); + filename = buildFormattedString("%s/%d.png", dev.screenshotFolder, SDL_GetTicks()); } screenshot = SDL_CreateRGBSurface(0, SCREEN_WIDTH, SCREEN_HEIGHT, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000); SDL_RenderReadPixels(app.renderer, NULL, SDL_PIXELFORMAT_ARGB8888, screenshot->pixels, screenshot->pitch); SDL_SavePNG(screenshot, filename); SDL_FreeSurface(screenshot); + + free(filename); } diff --git a/src/system/draw.h b/src/system/draw.h index 3893efa..4993823 100644 --- a/src/system/draw.h +++ b/src/system/draw.h @@ -22,6 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "savepng.h" extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...); +extern char *buildFormattedString(const char *format, ...); extern App app; extern Colors colors; diff --git a/src/system/init.c b/src/system/init.c index 9af2e6d..91c2c1a 100644 --- a/src/system/init.c +++ b/src/system/init.c @@ -228,11 +228,11 @@ static void loadConfig(void) { int i; cJSON *root, *controlsJSON, *node; - char *text, filename[MAX_PATH_LENGTH]; + char *text, *filename; initDefaultConfig(); - sprintf(filename, "%s/%s", app.saveDir, CONFIG_FILENAME); + filename = buildFormattedString("%s/%s", app.saveDir, CONFIG_FILENAME); if (fileExists(filename)) { @@ -278,15 +278,17 @@ static void loadConfig(void) cJSON_Delete(root); free(text); } + + free(filename); } void saveConfig(void) { int i; - char *out, filename[MAX_PATH_LENGTH]; + char *out, *filename; cJSON *root, *controlsJSON, *keysJSON, *joypadJSON; - sprintf(filename, "%s/%s", app.saveDir, CONFIG_FILENAME); + filename = buildFormattedString("%s/%s", app.saveDir, CONFIG_FILENAME); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Saving config ..."); @@ -330,6 +332,8 @@ void saveConfig(void) cJSON_Delete(root); free(out); + + free(filename); } void cleanup(void) diff --git a/src/system/init.h b/src/system/init.h index 72d9912..6b2ff24 100644 --- a/src/system/init.h +++ b/src/system/init.h @@ -54,5 +54,6 @@ extern void presentScene(void); extern char *readFile(const char *filename); extern void setLanguage(char *applicationName, char *languageCode); extern int writeFile(const char *filename, const char *data); +extern char *buildFormattedString(const char *format, ...); extern App app; diff --git a/src/util/util.c b/src/util/util.c index b638180..ae1eb76 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -81,6 +81,25 @@ void *resize(void *array, int oldSize, int newSize) return newArray; } +char *buildFormattedString(const char *format, ...) +{ + int n; + char *s; + va_list args; + + va_start(args, format); + n = vsnprintf(NULL, 0, format, args) + 1; + va_end(args); + + s = malloc(sizeof(char) * n); + + va_start(args, format); + vsprintf(s, format, args); + va_end(args); + + return s; +} + /* * public domain strtok_r() by Charlie Gordon * diff --git a/src/world/worldLoader.c b/src/world/worldLoader.c index 6dadd1d..61d3f63 100644 --- a/src/world/worldLoader.c +++ b/src/world/worldLoader.c @@ -29,7 +29,7 @@ static void loadObjectives(cJSON *root); void loadWorld(char *id) { cJSON *root; - char *text, filename[MAX_PATH_LENGTH]; + char *text, *filename; memset(&world, 0, sizeof(World)); @@ -38,7 +38,7 @@ void loadWorld(char *id) world.objectiveTail = &world.objectiveHead; world.particleTail = &world.particleHead; - sprintf(filename, "%s/%d/%s.json", app.saveDir, game.saveSlot, id); + filename = buildFormattedString("%s/%d/%s.json", app.saveDir, game.saveSlot, id); if (!game.isComplete && fileExists(filename)) { @@ -79,6 +79,8 @@ void loadWorld(char *id) cJSON_Delete(root); free(text); + + free(filename); } static void loadEnemyTypes(char *enemyTypes) diff --git a/src/world/worldLoader.h b/src/world/worldLoader.h index e4b9390..aca76b5 100644 --- a/src/world/worldLoader.h +++ b/src/world/worldLoader.h @@ -24,6 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. extern Entity *createEntity(char *typeStr); extern int fileExists(const char *filename); extern char *readFile(const char *filename); +extern char *buildFormattedString(const char *format, ...); extern App app; extern Dev dev; diff --git a/src/world/worldSaver.c b/src/world/worldSaver.c index 3cd40e4..fa319de 100644 --- a/src/world/worldSaver.c +++ b/src/world/worldSaver.c @@ -30,9 +30,9 @@ static int canPersistEntity(void); void saveWorld(void) { cJSON *root; - char filename[MAX_PATH_LENGTH], *out; + char *filename, *out; - sprintf(filename, "%s/%d/%s.json", app.saveDir, game.saveSlot, world.id); + filename = buildFormattedString("%s/%d/%s.json", app.saveDir, game.saveSlot, world.id); SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Saving world to '%s' ...", filename); @@ -66,6 +66,8 @@ void saveWorld(void) cJSON_Delete(root); free(out); + + free(filename); } static void saveEnemyTypes(cJSON *root) diff --git a/src/world/worldSaver.h b/src/world/worldSaver.h index 563ebf3..65531e9 100644 --- a/src/world/worldSaver.h +++ b/src/world/worldSaver.h @@ -22,6 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "../json/cJSON.h" extern int writeFile(const char *filename, const char *data); +extern char *buildFormattedString(const char *format, ...); extern App app; extern Entity *self;