about summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--Makefile2
-rw-r--r--asset.h (renamed from path.h)39
-rw-r--r--freecell.c13
-rw-r--r--sol.c11
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];