From aeb3d25983f4912a00352c82e983da347488fedf Mon Sep 17 00:00:00 2001
From: Patrick McDermott <patrick.mcdermott@libiquity.com>
Date: Tue, 16 Mar 2021 09:33:07 -0400
Subject: Find games either in build dir or installed

---
diff --git a/Makefile.am b/Makefile.am
index 4b77625..3aed5f2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -51,6 +51,7 @@ dodge_balls_CPPFLAGS = \
 	$(SDL_IMAGE_CFLAGS) \
 	$(ZLIB_CFLAGS) \
 	$(EXPAT_CFLAGS) \
+	-DABS_BUILDDIR=\"$(abs_builddir)\" \
 	-DGAMESDIR=\"$(gamesdir)\"
 dodge_balls_LDADD = \
 	$(ASAN_CFLAGS) \
diff --git a/configure.ac b/configure.ac
index 012a287..ecc933a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -36,8 +36,8 @@ test -d "${srcdir}/.git" || CFLAGS="${save_CFLAGS}"
 funcs_missing=false
 AC_CHECK_FUNCS(
 	[\
-		alphasort calloc free malloc printf putchar scandir sscanf \
-		strcmp strdup vprintf
+		alphasort calloc dirname free malloc printf putchar realpath \
+		scandir sscanf strcmp strdup vprintf
 	],
 	[],
 	[funcs_missing=true])
diff --git a/src/game.c b/src/game.c
index 001fcca..2bf99c5 100644
--- a/src/game.c
+++ b/src/game.c
@@ -30,13 +30,13 @@ _db_game_is_dir(const struct dirent *entry)
 }
 
 int
-db_games_find(char ***games)
+db_games_find(const char *games_dir, char ***games)
 {
 	struct dirent **entries;
 	int             n;
 	int             i;
 
-	n = scandir("games", &entries, &_db_game_is_dir, alphasort);
+	n = scandir(games_dir, &entries, &_db_game_is_dir, alphasort);
 
 	*games = calloc(n, sizeof(**games));
 	if (*games == NULL) {
diff --git a/src/game.h b/src/game.h
index 447d56b..f49c7e8 100644
--- a/src/game.h
+++ b/src/game.h
@@ -20,6 +20,6 @@
 #ifndef DB_GAME_H_
 #define DB_GAME_H_
 
-int db_games_find(char ***games);
+int db_games_find(const char *games_dir, char ***games);
 
 #endif  /* DB_GAME_H_ */
diff --git a/src/main.c b/src/main.c
index 64d8e3d..344cdad 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,15 +1,28 @@
+#include <libgen.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include "game.h"
 
 int
 main(int argc, char *argv[])
 {
-	char **games;
-	int    n;
-	int    i;
+	char        *program_dir;
+	const char  *games_dir;
+	char       **games;
+	int          n;
+	int          i;
 
-	n = db_games_find(&games);
+	program_dir = realpath(dirname(argv[0]), NULL);
+	if (strcmp(program_dir, ABS_BUILDDIR) == 0) {
+		/* Running in place */
+		games_dir = ABS_BUILDDIR "/games";
+	} else {
+		/* Running from installation */
+		games_dir = GAMESDIR;
+	}
+	free(program_dir);
+	n = db_games_find(games_dir, &games);
 	printf("%d games:\n", n);
 	for (i = 0; i < n; ++i) {
 		printf("\t%s\n", games[i]);
--
cgit v0.9.1