#include "puzzles.h" #include #include char *puzzleFileName; void matchDoubleQuoteFile(FILE *fp); char* matchDoubleQuoteStr(char *str); /* Initialize puzzle part of the game, by passing the puzzle file name */ void initPuzzles(char* fileName){ puzzleFileName = fileName; } /* Return the number of puzzles in the puzzle file. Count them by way of the double quotes */ int numberOfPuzzles (){ FILE *puzzleFile; int ch; int quoteNumber = 0; int result; puzzleFile = fopen(puzzleFileName, "r"); while ((ch = getc(puzzleFile)) != EOF) if (ch == '"') quoteNumber++; if (quoteNumber % 4 != 0){ printf("Malformed puzzle file"); exit(-1);} else { result = quoteNumber/4; } fclose(puzzleFile); return result; } /* Get puzzle number n. The first puzzle is counted as number 0 */ puzzle getPuzzle(int n){ FILE *puzzleFile; puzzle result; int i, ch, num; char *puzzleLine, *catStr, *puzzleStr; char *puzzleLineQ1, *puzzleLineQ2, *puzzleLineQ3, *puzzleLineQ4; puzzleLine = (char*)malloc(PUZZLEMAXCOUNT); catStr = (char*)calloc(PUZZLEMAXCOUNT,1); puzzleStr = (char*)calloc(PUZZLEMAXCOUNT,1); puzzleFile = fopen(puzzleFileName, "r"); for(i = 0; i < n*4; i++) matchDoubleQuoteFile(puzzleFile); /* read through n*4 double quotes */ while (isspace(ch = getc(puzzleFile))); /* skip white space */ ungetc(ch,puzzleFile); /* put double quote back */ fgets(puzzleLine, PUZZLEMAXCOUNT, puzzleFile); /* read a line from puzzle file */ puzzleLineQ1 = matchDoubleQuoteStr(puzzleLine); /* identify quotes in string */ puzzleLineQ2 = matchDoubleQuoteStr(puzzleLineQ1+1); puzzleLineQ3 = matchDoubleQuoteStr(puzzleLineQ2+1); puzzleLineQ4 = matchDoubleQuoteStr(puzzleLineQ3+1); strncpy(catStr, puzzleLineQ1+1, puzzleLineQ2 - puzzleLineQ1 - 1); strncpy(puzzleStr, puzzleLineQ3+1, puzzleLineQ4 - puzzleLineQ3 - 1); num = 0; for(i = 0; i < strlen(puzzleStr); i++) if (isalpha(puzzleStr[i])) num++; result.category = catStr, result.phrase = puzzleStr; result.numberOfCharsToGuess = num; fclose(puzzleFile); return result; } /* Read until a double quote is encountered */ void matchDoubleQuoteFile(FILE *fp){ int ch; ch = getc(fp); while(ch != '"') { ch = getc(fp); } } /* Return a pointer to the first occurrence of a double quote character in str*/ char *matchDoubleQuoteStr(char *str){ char *res; res = strchr(str, '"'); if (res != NULL) return res; else exit(-1); }