+
+#define HIGHSCOREFULLPATHBUFSIZ 256
+
+static void highScoreInit(void)
+{
+ char *home;
+
+ if (highscorefullpath != NULL)
+ return;
+
+ if ((highscorefullpath = malloc(HIGHSCOREFULLPATHBUFSIZ)) == NULL)
+ goto err;
+ if ((home = getenv("HOME")) == NULL)
+ goto err;
+ (void)snprintf(highscorefullpath, HIGHSCOREFULLPATHBUFSIZ - 1,
+ "%s/%s", home, HIGHSCORE_FILE);
+ highscorefullpath[HIGHSCOREFULLPATHBUFSIZ - 1] = '\0';
+
+ return;
+err:
+ if (highscorefullpath != NULL) {
+ free(highscorefullpath);
+ highscorefullpath = NULL;
+ }
+}
+
+static void highScoreLoad(void)
+{
+ FILE *fh;
+ char line[64];
+
+ if (highscorefullpath == NULL)
+ return;
+
+ if ((fh = fopen(highscorefullpath, "r")) != NULL) {
+ if (fgets(line, 63, fh) != NULL) {
+ line[63] = '\0';
+ hiscore = atol(line);
+ }
+ if (fgets(line, 63, fh) != NULL) {
+ line[63] = '\0';
+ hilevel = atoi(line);
+ }
+ (void)fclose(fh);
+ }
+}
+
+/* XXX Should ideally save in a new unique file and rename for safety */
+void highScoreSave(void)
+{
+ FILE *fh;
+
+ if (highscorefullpath == NULL)
+ return;
+
+ if ((fh = fopen(highscorefullpath, "w")) != NULL) {
+ (void)fprintf(fh, "%ld\n", hiscore);
+ (void)fprintf(fh, "%d\n", hilevel);
+ (void)fclose(fh);
+ }
+}