/* Read the puzzle file corresponding to series, and the corresponding * solutions in the answer file, until at least level maps have been * successfully parsed, or the end is reached. The files are opened if * they have not been already. No files are opened if the requested * level has already been loaded into memory. */ int readlevelinseries(gameseries *series, int level) { int n; if (level < 0) return FALSE; if (series->count > level) return TRUE; if (!series->allmapsread) { if (!series->mapfp) { currentfilename = series->filename; series->mapfp = openfileindir(datadir, series->filename, "r"); if (!series->mapfp) return fileerr(NULL); if (!readseriesheader(series)) return fileerr("file contains no maps"); if (*savedir) { series->answerfp = openfileindir(savedir, series->filename, "r"); if (series->answerfp) { savedirchecked = TRUE; series->answersreadonly = TRUE; } } else series->answerfp = NULL; } while (!series->allmapsread && series->count <= level) { while (series->count >= series->allocated) { n = series->allocated ? series->allocated * 2 : 16; if (!(series->games = realloc(series->games, n * sizeof *series->games))) memerrexit(); memset(series->games + series->allocated, 0, (n - series->allocated) * sizeof *series->games); series->allocated = n; } if (readlevelmap(series->mapfp, series->games + series->count)) { series->games[series->count].seriesname = series->name; if (!series->allanswersread) readanswers(series->answerfp, series->games + series->count); ++series->count; } if (feof(series->mapfp)) { fclose(series->mapfp); series->mapfp = NULL; series->allmapsread = TRUE; } if (series->answerfp && feof(series->answerfp)) series->allanswersread = TRUE; } } return series->count > level; }
/* Read the list of unsolvable levels from the given filename. If the * filename does not contain a path, then the function looks for the * file in the resource directory and the user's save directory. */ int loadunslistfromfile(char const *filename) { fileinfo file; memset(&file, 0, sizeof file); if (openfileindir(&file, resdir, filename, "r", NULL)) { readunslist(&file); fileclose(&file, NULL); } if (!haspathname(filename)) { memset(&file, 0, sizeof file); if (openfileindir(&file, savedir, filename, "r", NULL)) { readunslist(&file); fileclose(&file, NULL); } } return TRUE; }