From f2aa753d493ac8fac41f0041525bfd9d8f54eba6 Mon Sep 17 00:00:00 2001 From: Dmitry Marakasov Date: Fri, 12 Sep 2014 20:17:41 +0400 Subject: [PATCH] Fix highscore file handling Don't create highscore file in the current directory, instead create in under $XDG_DATA_HOME/2048/highscore or $HOME/.local/share/2048/highscore as modern apps should. --- Makefile | 8 ++++---- src/2048.h | 11 ++++++++++- src/highscore_file.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 src/highscore_file.c diff --git a/Makefile b/Makefile index c5fe6b4..92c2ff5 100644 --- a/Makefile +++ b/Makefile @@ -4,11 +4,11 @@ LIBS = -lcurses all: 2048 -2048: src/2048.c - $(CC) $(CFLAGS) src/2048.c -o 2048 $(LIBS) +2048: src/2048.c src/2048.h src/highscore_file.c + $(CC) $(CFLAGS) src/2048.c src/highscore_file.c -o 2048 $(LIBS) -2048nc: src/2048_no_curses.c - $(CC) $(CFLAGS) src/2048_no_curses.c -o 2048nc +2048nc: src/2048_no_curses.c src/2048.h src/highscore_file.c + $(CC) $(CFLAGS) src/2048_no_curses.c src/highscore_file.c -o 2048nc clean: rm -f 2048 2048nc diff --git a/src/2048.h b/src/2048.h index d1f5b3e..4681f45 100644 --- a/src/2048.h +++ b/src/2048.h @@ -1,6 +1,10 @@ #ifndef _2048_H_ #define _2048_H_ +#include +#include +#include + typedef enum { DIR_UP, DIR_RIGHT, @@ -8,6 +12,11 @@ typedef enum { DIR_LEFT } dir_t; +#define DATADIR_NAME "2048" +#define HIGHSCORE_FILE_NAME "highscore" + +const char* get_highscore_file(); + // Repeat an expression y, x times */ #define ITER(x, expr)\ do {\ @@ -38,7 +47,7 @@ typedef enum { /* Constants */ #define DEFAULT_GRID_SIZE 4 -#define HISCORE_FILE ".hs2048g" +#define HISCORE_FILE get_highscore_file() #define USAGE_STR\ "Usage:\n"\ " ./2048 [options]\n"\ diff --git a/src/highscore_file.c b/src/highscore_file.c new file mode 100644 index 0000000..baeab33 --- /dev/null +++ b/src/highscore_file.c @@ -0,0 +1,29 @@ +#include "2048.h" + +#include +#include +#include +#include + +const char* get_highscore_file() { + static char buffer[4096]; + if (getenv("XDG_DATA_HOME") != NULL) { + snprintf(buffer, sizeof(buffer), "%s/%s/%s", getenv("XDG_DATA_HOME"), DATADIR_NAME, HIGHSCORE_FILE_NAME); + } else if (getenv("HOME") != NULL) { + snprintf(buffer, sizeof(buffer), "%s/.local/share/%s/%s", getenv("HOME"), DATADIR_NAME, HIGHSCORE_FILE_NAME); + } else { + return HIGHSCORE_FILE_NAME; + } + + // create hierarrchy of directories up to highscore file location + char* sep = strrchr(buffer, '/'); + while (sep != NULL) { + *sep = '\0'; + if (strlen(buffer) != 0) + mkdir(buffer, 0777); + char* tmpsep = sep; + sep = strrchr(buffer, '/'); + *tmpsep = '/'; + } + return buffer; +}