diff options
Diffstat (limited to '')
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | asset.h (renamed from path.h) | 39 | ||||
-rw-r--r-- | freecell.c | 13 | ||||
-rw-r--r-- | sol.c | 11 |
4 files changed, 37 insertions, 28 deletions
diff --git a/Makefile b/Makefile index cf107f6..073f0be 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ $(BINS): cards.o cards.o dump.o freecell.o sol.o: cards.h -freecell.o sol.o: layout.h path.h stack.h +freecell.o sol.o: asset.h layout.h stack.h clean: rm -f $(BINS) *.o *.bmp diff --git a/path.h b/asset.h index f3832d9..cc37709 100644 --- a/path.h +++ b/asset.h @@ -14,21 +14,34 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef PATH_H -#define PATH_H +#ifndef ASSET_H +#define ASSET_H #include <SDL_filesystem.h> #include <SDL_rwops.h> -#include <stddef.h> #include <stdio.h> +#include <stdlib.h> + +struct Paths { + char *base; + char *pref; +}; + +static inline int assetPaths(struct Paths *paths) { + paths->base = SDL_GetBasePath(); + if (!paths->base) return -1; + paths->pref = SDL_GetPrefPath("Causal Agency", "Entertainment Pack"); + if (!paths->pref) return -1; + return 0; +} static inline SDL_RWops * -pathSearch(const char *base, const char *pref, const char **names, size_t len) { - const char *paths[3] = { pref, base, "" }; +assetOpen(const struct Paths *paths, const char *names[], size_t len) { + const char *dirs[3] = { paths->pref, paths->base, "" }; for (size_t i = 0; i < 3; ++i) { for (size_t j = 0; j < len; ++j) { char path[1024]; - snprintf(path, sizeof(path), "%s%s", paths[i], names[j]); + snprintf(path, sizeof(path), "%s%s", dirs[i], names[j]); SDL_RWops *rw = SDL_RWFromFile(path, "rb"); if (rw) return rw; } @@ -36,22 +49,24 @@ pathSearch(const char *base, const char *pref, const char **names, size_t len) { return NULL; } -static inline SDL_RWops *pathCards(const char *base, const char *pref) { +static inline SDL_RWops *assetOpenCards(const struct Paths *paths) { const char *names[3] = { "CARDS.DLL", "SOL.EXE", "cards.dll" }; - SDL_RWops *rw = pathSearch(base, pref, names, 3); + SDL_RWops *rw = assetOpen(paths, names, 3); if (rw) return rw; char msg[4096]; snprintf( msg, sizeof(msg), "%s or %s not found in:\n%s\n%s", - names[0], names[1], pref, base + names[0], names[1], paths->pref, paths->base + ); + SDL_ShowSimpleMessageBox( + SDL_MESSAGEBOX_ERROR, "Entertainment Pack", msg, NULL ); - SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Cards", msg, NULL); return NULL; } -static inline SDL_RWops *pathFreeCell(const char *base, const char *pref) { +static inline SDL_RWops *assetOpenFreeCell(const struct Paths *paths) { const char *names[2] = { "FREECELL.EXE", "freecell.exe" }; - return pathSearch(base, pref, names, 2); + return assetOpen(paths, names, 2); } #endif diff --git a/freecell.c b/freecell.c index 2d1b97c..39bdb12 100644 --- a/freecell.c +++ b/freecell.c @@ -20,9 +20,9 @@ #include <stdlib.h> #include <time.h> +#include "asset.h" #include "cards.h" #include "layout.h" -#include "path.h" #include "stack.h" #define ARRAY_LEN(a) (sizeof(a) / sizeof((a)[0])) @@ -360,11 +360,8 @@ int main(void) { if (SDL_Init(SDL_INIT_VIDEO) < 0) err("SDL_Init"); atexit(SDL_Quit); - char *basePath = SDL_GetBasePath(); - if (!basePath) err("SDL_GetBasePath"); - - char *prefPath = SDL_GetPrefPath("Causal Agency", "Cards"); - if (!prefPath) err("SDL_GetPrefPath"); + struct Paths paths; + if (assetPaths(&paths) < 0) err("SDL_GetPrefPath"); bool kings = false; struct { @@ -372,7 +369,7 @@ int main(void) { SDL_Surface *kings[Cards_FreeCellCount]; } surfaces; - SDL_RWops *rw = pathCards(basePath, prefPath); + SDL_RWops *rw = assetOpenCards(&paths); if (!rw) return EXIT_FAILURE; int error = Cards_LoadCards( surfaces.cards, Cards_Empty, @@ -381,7 +378,7 @@ int main(void) { if (error) err("Cards_LoadCards"); SDL_RWclose(rw); - rw = pathFreeCell(basePath, prefPath); + rw = assetOpenFreeCell(&paths); if (rw) { kings = true; int error = Cards_LoadFreeCell( diff --git a/sol.c b/sol.c index f02e4a1..cf643f2 100644 --- a/sol.c +++ b/sol.c @@ -20,9 +20,9 @@ #include <stdlib.h> #include <time.h> +#include "asset.h" #include "cards.h" #include "layout.h" -#include "path.h" #include "stack.h" #define ARRAY_LEN(a) (sizeof(a) / sizeof((a)[0])) @@ -325,13 +325,10 @@ int main(void) { if (SDL_Init(SDL_INIT_VIDEO) < 0) err("SDL_Init"); atexit(SDL_Quit); - char *basePath = SDL_GetBasePath(); - if (!basePath) err("SDL_GetBasePath"); + struct Paths paths; + if (assetPaths(&paths) < 0) err("SDL_GetPrefPath"); - char *prefPath = SDL_GetPrefPath("Causal Agency", "Cards"); - if (!prefPath) err("SDL_GetPrefPath"); - - SDL_RWops *rw = pathCards(basePath, prefPath); + SDL_RWops *rw = assetOpenCards(&paths); if (!rw) return EXIT_FAILURE; SDL_Surface *surfaces[Cards_CardCount]; |