Example #1
0
/* 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;
}
Example #2
0
/* 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;
}