/* $Id: rcfile.c,v 1.4 2002/03/02 21:02:21 sverrehu Exp $ */ /************************************************************************** * * FILE rcfile.c * MODULE OF Card game. * * DESCRIPTION Parse the startup file for this program. * * WRITTEN BY Sverre H. Huseby * **************************************************************************/ #include #include #include #include #include #include #include "parsefile.h" #include "envvar.h" #include "game.h" #include "board.h" #include "rcfile.h" /************************************************************************** * * * P R I V A T E F U N C T I O N S * * * **************************************************************************/ static int rcParseError(const char *s) { msgError("%s in `%s', line %d\n", s, pfGetCurrentFile(), pfGetCurrentLine()); return -1; } static int rcCheckAssignment(int argc, char *argv[]) { if (argc == 1 || strcmp(argv[1], "=") != 0) return rcParseError("missing `='"); else if (argc == 2 || !strlen(argv[2])) return rcParseError("missing argument to assignment"); else if (argc > 3) return rcParseError("too many arguments to assignment"); return 0; } static int rcCheckBooleanAssignment(int argc, char *argv[]) { if (rcCheckAssignment(argc, argv) != 0 || pfGetBooleanValue(argv[2]) == -1) return -1; return 0; } static int rcParseLine(int argc, char *argv[]) { int tmp; if (pfStrCaseCmp(argv[0], "NumberOfGamesPlayed") == 0) { if (rcCheckAssignment(argc, argv) == 0) gameNumPlayed = atoi(argv[2]); } else if (pfStrCaseCmp(argv[0], "NumberOfGamesSolved") == 0) { if (rcCheckAssignment(argc, argv) == 0) gameNumSolved = atoi(argv[2]); } else if (pfStrCaseCmp(argv[0], "TotalTimePlayed") == 0) { if (rcCheckAssignment(argc, argv) == 0) gameTotalTime = atol(argv[2]); } else if (pfStrCaseCmp(argv[0], "CardBackground") == 0) { if (rcCheckAssignment(argc, argv) == 0) { tmp = atoi(argv[2]); if (tmp >= 0 && tmp < CARD_NUM_BACKS) boardCardBackground = tmp; else rcParseError("CardBackground out of range"); } } else if (pfStrCaseCmp(argv[0], "CardsToDraw") == 0) { if (rcCheckAssignment(argc, argv) == 0) { tmp = atoi(argv[2]); if (tmp == 1 || tmp == 3) gameNumCardsToDraw = tmp; else rcParseError("illegal CardsToDraw"); } } else if (pfStrCaseCmp(argv[0], "IncludeInHighscoreFile") == 0) { if (rcCheckBooleanAssignment(argc, argv) == 0) gameIncludeInHighscoreList = pfGetBooleanValue(argv[2]); } else if (pfStrCaseCmp(argv[0], "Timing") == 0) { if (rcCheckBooleanAssignment(argc, argv) == 0) gameDoTiming = pfGetBooleanValue(argv[2]); } else { rcParseError("syntax error"); } return 1; /* continue parsing */ } /************************************************************************** * * * P U B L I C F U N C T I O N S * * * **************************************************************************/ void rcRead(void) { char *home, *filename; /* read rc-file in user's home directory */ if ((home = getenv("HOME")) != NULL) { filename = xmalloc(strlen(home) + strlen(RC_FILE) + 2); strcpy(filename, home); strcat(filename, "/"); strcat(filename, RC_FILE); pfParseFile(filename, rcParseLine, 1); free(filename); } } void rcWrite(void) { char *home, *filename; FILE * f; /* read rc-file in user's home directory */ if ((home = getenv("HOME")) != NULL) { filename = xmalloc(strlen(home) + strlen(RC_FILE) + 2); strcpy(filename, home); strcat(filename, "/"); strcat(filename, RC_FILE); if ((f = fopen(filename, "w")) != NULL) { fprintf(f, "# Generated and updated automatically " "by the Solitaire card game \"sol\".\n"); fprintf(f, "NumberOfGamesPlayed = %d\n", gameNumPlayed); fprintf(f, "NumberOfGamesSolved = %d\n", gameNumSolved); fprintf(f, "TotalTimePlayed = %ld\n", gameTotalTime); fprintf(f, "CardBackground = %d\n", boardCardBackground); fprintf(f, "CardsToDraw = %d\n", gameNumCardsToDraw); fprintf(f, "IncludeInHighscoreFile = %s\n", gameIncludeInHighscoreList ? "yes" : "no"); fprintf(f, "Timing = %s\n", gameDoTiming ? "yes" : "no"); fclose(f); } free(filename); } }