int makedirectory(char *dir) { char *slash; for (slash = dir + strlen(dir); slash > dir && *slash != '/'; slash--) ; if (slash == dir) { return 0; } if (mkdir(dir, 0700)) { if (errno != ENOENT && errno != EEXIST) { fprintf(stderr, "mkdir(%s): %s\n", dir, strerror(errno)); return 1; } if (*slash != '/') { return 1; } *slash = '\0'; if (makedirectory(dir)) { *slash = '/'; return 1; } *slash = '/'; if (mkdir(dir, 0700) && errno != EEXIST) { fprintf(stderr, "mkdir(%s): %s\n", dir, strerror(errno)); return 1; } } return 0; }
int write_dungeon(dungeon_t *d, char *file) { char *home; char *filename; FILE *f; size_t len; uint32_t be32; if (!file) { if (!(home = getenv("HOME"))) { fprintf(stderr, "\"HOME\" is undefined. Using working directory.\n"); home = (char *) "."; } len = (strlen(home) + strlen(SAVE_DIR) + strlen(DUNGEON_SAVE_FILE) + 1 /* The NULL terminator */ + 2 /* The slashes */); filename = (char *) malloc(len * sizeof (*filename)); sprintf(filename, "%s/%s/", home, SAVE_DIR); makedirectory(filename); strcat(filename, DUNGEON_SAVE_FILE); if (!(f = fopen(filename, "w"))) { perror(filename); free(filename); return 1; } free(filename); } else { if (!(f = fopen(file, "w"))) { perror(file); exit(-1); } } /* The semantic, which is 6 bytes, 0-5 */ fwrite(DUNGEON_SAVE_SEMANTIC, 1, sizeof (DUNGEON_SAVE_SEMANTIC) - 1, f); /* The version, 4 bytes, 6-9 */ be32 = htobe32(DUNGEON_SAVE_VERSION); fwrite(&be32, sizeof (be32), 1, f); /* The size of the file, 4 bytes, 10-13 */ be32 = htobe32(calculate_dungeon_size(d)); fwrite(&be32, sizeof (be32), 1, f); /* The dungeon map, 1680 bytes, 14-1693 */ write_dungeon_map(d, f); /* And the rooms, num_rooms * 4 bytes, 1694-end */ write_rooms(d, f); fclose(f); return 0; }