tSome configuration file handling functions moved out of optdialog.c and dopewars.c into the new "configfile" module; also, when rewriting a config file, the function will now be satisfied by a partial header match. - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit a2351de9f780df19fda04d33656c050865b8565e
 (DIR) parent 41d6f76d8c0674a44f19c425f2e1ebcbfcf9d6bc
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Mon, 24 Jun 2002 11:34:10 +0000
       
       Some configuration file handling functions moved out of optdialog.c and
       dopewars.c into the new "configfile" module; also, when rewriting a config
       file, the function will now be satisfied by a partial header match.
       
       
       Diffstat:
         M src/Makefile.am                     |       1 +
         A src/configfile.c                    |     232 ++++++++++++++++++++++++++++++
         A src/configfile.h                    |      30 ++++++++++++++++++++++++++++++
         M src/dopewars.c                      |     113 -------------------------------
         M src/dopewars.h                      |       1 -
         M src/gui_client/optdialog.c          |      82 +------------------------------
       
       6 files changed, 265 insertions(+), 194 deletions(-)
       ---
 (DIR) diff --git a/src/Makefile.am b/src/Makefile.am
       t@@ -25,6 +25,7 @@ dopewars_DEPENDENCIES = @GUILIB@ @CURSESLIB@ @GTKPORTLIB@ @CURSESPORTLIB@ @INTLL
        
        bin_PROGRAMS = dopewars
        dopewars_SOURCES = admin.c admin.h AIPlayer.c AIPlayer.h util.c util.h \
       +                   configfile.c configfile.h \
                           dopewars.c dopewars.h error.c error.h log.c log.h \
                           message.c message.h network.c network.h nls.h \
                           serverside.c serverside.h sound.c sound.h \
 (DIR) diff --git a/src/configfile.c b/src/configfile.c
       t@@ -0,0 +1,232 @@
       +/************************************************************************
       + * configfile.c   Functions for dealing with dopewars config files      *
       + * Copyright (C)  2002  Ben Webb                                        *
       + *                Email: ben@bellatrix.pcl.ox.ac.uk                     *
       + *                WWW: http://dopewars.sourceforge.net/                 *
       + *                                                                      *
       + * This program is free software; you can redistribute it and/or        *
       + * modify it under the terms of the GNU General Public License          *
       + * as published by the Free Software Foundation; either version 2       *
       + * of the License, or (at your option) any later version.               *
       + *                                                                      *
       + * This program is distributed in the hope that it will be useful,      *
       + * but WITHOUT ANY WARRANTY; without even the implied warranty of       *
       + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
       + * GNU General Public License for more details.                         *
       + *                                                                      *
       + * You should have received a copy of the GNU General Public License    *
       + * along with this program; if not, write to the Free Software          *
       + * Foundation, Inc., 59 Temple Place - Suite 330, Boston,               *
       + *                   MA  02111-1307, USA.                               *
       + ************************************************************************/
       +
       +#ifdef HAVE_CONFIG_H
       +#include <config.h>
       +#endif
       +
       +#include <string.h>             /* For memcmp etc. */
       +#include <stdio.h>              /* For fgetc etc. */
       +#include <stdlib.h>             /* For atoi */
       +#include <errno.h>              /* For errno */
       +#include <ctype.h>              /* For isprint */
       +#include <glib.h>
       +
       +#include "dopewars.h"           /* For struct GLOBALS etc. */
       +#include "nls.h"                /* For _ function */
       +#include "error.h"              /* For ErrStrFromErrno */
       +
       +/*
       + * Prints the given string to a file, converting control characters
       + * and escaping other special characters.
       + */
       +static void PrintEscaped(FILE *fp, gchar *str)
       +{
       +  guint i;
       +
       +  for (i = 0; i < strlen(str); i++) {
       +    switch(str[i]) {
       +    case '"':
       +    case '\'':
       +    case '\\':
       +      fputc('\\', fp);
       +      fputc(str[i], fp);
       +      break;
       +    case '\n':
       +      fputs("\\n", fp);
       +      break;
       +    case '\t':
       +      fputs("\\t", fp);
       +      break;
       +    case '\r':
       +      fputs("\\r", fp);
       +      break;
       +    case '\b':
       +      fputs("\\b", fp);
       +      break;
       +    case '\f':
       +      fputs("\\f", fp);
       +      break;
       +    default:
       +      if (isprint(str[i])) {
       +        fputc(str[i], fp);
       +      } else {
       +        fprintf(fp, "\\%o", (int)(guchar)str[i]);
       +      }
       +    }
       +  }
       +}
       +
       +/*
       + *  * Writes a single configuration file variable (identified by GlobalIndex
       + *   * and StructIndex) to the specified file, in a format suitable for reading
       + *    * back in (via. ParseNextConfig and friends).
       + *     */
       +static void WriteConfigValue(FILE *fp, int GlobalIndex, int StructIndex)
       +{
       +  gchar *GlobalName;
       +
       +  if (Globals[GlobalIndex].NameStruct[0]) {
       +    GlobalName =
       +        g_strdup_printf("%s[%d].%s", Globals[GlobalIndex].NameStruct,
       +                        StructIndex, Globals[GlobalIndex].Name);
       +  } else {
       +    GlobalName = Globals[GlobalIndex].Name;
       +  }
       +
       +  if (Globals[GlobalIndex].IntVal) {
       +    fprintf(fp, "%s = %d\n", GlobalName,
       +            *GetGlobalInt(GlobalIndex, StructIndex));
       +  } else if (Globals[GlobalIndex].BoolVal) {
       +    fprintf(fp, "%s = %s\n", GlobalName,
       +            *GetGlobalBoolean(GlobalIndex, StructIndex) ?
       +            _("TRUE") : _("FALSE"));
       +  } else if (Globals[GlobalIndex].PriceVal) {
       +    gchar *prstr = pricetostr(*GetGlobalPrice(GlobalIndex, StructIndex));
       +
       +    fprintf(fp, "%s = %s\n", GlobalName, prstr);
       +    g_free(prstr);
       +  } else if (Globals[GlobalIndex].StringVal) {
       +    fprintf(fp, "%s = \"", GlobalName);
       +    PrintEscaped(fp, *GetGlobalString(GlobalIndex, StructIndex));
       +    fprintf(fp, "\"\n");
       +  } else if (Globals[GlobalIndex].StringList) {
       +    int i;
       +
       +    fprintf(fp, "%s = { ", GlobalName);
       +    for (i = 0; i < *Globals[GlobalIndex].MaxIndex; i++) {
       +      if (i > 0)
       +        fprintf(fp, ", ");
       +      fputc('"', fp);
       +      PrintEscaped(fp, (*Globals[GlobalIndex].StringList)[i]);
       +      fputc('"', fp);
       +    }
       +    fprintf(fp, " }\n");
       +  }
       +
       +  if (Globals[GlobalIndex].NameStruct[0])
       +    g_free(GlobalName);
       +}
       +
       +
       +static void ReadFileToString(FILE *fp, gchar *str, int matchlen)
       +{
       +  int len, mpos, ch;
       +  gchar *match;
       +  GString *file;
       +
       +  file = g_string_new("");
       +  len = strlen(str);
       +  if (matchlen > 0) {
       +    len = MIN(len, matchlen);
       +  }
       +  match = g_new(gchar, len);
       +  mpos = 0;
       +
       +  while (mpos < len && (ch = fgetc(fp)) != EOF) {
       +    g_string_append_c(file, ch);
       +    match[mpos++] = ch;
       +    if (ch != str[mpos - 1]) {
       +      int start;
       +      gboolean shortmatch = FALSE;
       +
       +      for (start = 1; start < mpos; start++) {
       +        if (memcmp(str, &match[start], mpos - start) == 0) {
       +          mpos -= start;
       +          memmove(match, &match[start], mpos);
       +          shortmatch = TRUE;
       +          break;
       +        }
       +      }
       +      if (!shortmatch)
       +        mpos = 0;
       +    }
       +  }
       +  g_string_truncate(file, file->len - mpos);
       +
       +  g_free(match);
       +
       +  rewind(fp);
       +  ftruncate(fileno(fp), 0);
       +  fprintf(fp, file->str);
       +
       +  fprintf(fp, str);
       +
       +  g_string_free(file, TRUE);
       +}
       +
       +/*
       + * Writes all of the configuration file variables that have changed
       + * (together with their values) to the given file.
       + */
       +static void WriteConfigFile(FILE *fp)
       +{
       +  int i, j;
       +
       +  for (i = 0; i < NUMGLOB; i++) {
       +    if (Globals[i].Modified) {
       +      if (Globals[i].NameStruct[0]) {
       +        for (j = 1; j <= *Globals[i].MaxIndex; j++) {
       +          WriteConfigValue(fp, i, j);
       +        }
       +      } else {
       +        WriteConfigValue(fp, i, 0);
       +      }
       +    }
       +  }
       +}
       +
       +void UpdateConfigFile(gchar *cfgfile)
       +{
       +  FILE *fp;
       +  static gchar *header =
       +      "\n### Everything from here on is written automatically by\n"
       +      "### the dopewars program; you can edit it manually, but any\n"
       +      "### formatting (comments, etc.) will be lost at the next rewrite.\n\n";
       +
       +  if (!cfgfile) {
       +    cfgfile = GetLocalConfigFile();
       +    if (!cfgfile) {
       +      g_warning(_("Could not determine local config file to write to"));
       +      return;
       +    }
       +  }
       +
       +  fp = fopen(cfgfile, "r+");
       +  if (!fp) {
       +    fp = fopen(cfgfile, "w+");
       +  }
       +
       +  if (!fp) {
       +    gchar *errstr = ErrStrFromErrno(errno);
       +    g_warning(_("Could not open file %s: %s"), cfgfile, errstr);
       +    g_free(errstr);
       +    g_free(cfgfile);
       +    return;
       +  }
       +
       +  ReadFileToString(fp, header, 50);
       +  WriteConfigFile(fp);
       +
       +  fclose(fp);
       +  g_free(cfgfile);
       +}
 (DIR) diff --git a/src/configfile.h b/src/configfile.h
       t@@ -0,0 +1,30 @@
       +/************************************************************************
       + * configfile.h   Functions for dealing with dopewars config files      *
       + * Copyright (C)  2002  Ben Webb                                        *
       + *                Email: ben@bellatrix.pcl.ox.ac.uk                     *
       + *                WWW: http://dopewars.sourceforge.net/                 *
       + *                                                                      *
       + * This program is free software; you can redistribute it and/or        *
       + * modify it under the terms of the GNU General Public License          *
       + * as published by the Free Software Foundation; either version 2       *
       + * of the License, or (at your option) any later version.               *
       + *                                                                      *
       + * This program is distributed in the hope that it will be useful,      *
       + * but WITHOUT ANY WARRANTY; without even the implied warranty of       *
       + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
       + * GNU General Public License for more details.                         *
       + *                                                                      *
       + * You should have received a copy of the GNU General Public License    *
       + * along with this program; if not, write to the Free Software          *
       + * Foundation, Inc., 59 Temple Place - Suite 330, Boston,               *
       + *                   MA  02111-1307, USA.                               *
       + ************************************************************************/
       +
       +#ifndef __DP_CONFIGFILE_H__
       +#define __DP_CONFIGFILE_H__
       +
       +#include <glib.h>
       +
       +void UpdateConfigFile(const gchar *cfgfile);
       +
       +#endif /* __DP_CONFIGFILE_H__ */
 (DIR) diff --git a/src/dopewars.c b/src/dopewars.c
       t@@ -1976,119 +1976,6 @@ gboolean CheckMaxIndex(GScanner *scanner, int GlobalIndex, int StructIndex,
          return FALSE;
        }
        
       -/*
       - * Prints the given string to a file, converting control characters
       - * and escaping other special characters.
       - */
       -static void PrintEscaped(FILE *fp, gchar *str)
       -{
       -  guint i;
       -
       -  for (i = 0; i < strlen(str); i++) {
       -    switch(str[i]) {
       -    case '"':
       -    case '\'':
       -    case '\\':
       -      fputc('\\', fp);
       -      fputc(str[i], fp);
       -      break;
       -    case '\n':
       -      fputs("\\n", fp);
       -      break;
       -    case '\t':
       -      fputs("\\t", fp);
       -      break;
       -    case '\r':
       -      fputs("\\r", fp);
       -      break;
       -    case '\b':
       -      fputs("\\b", fp);
       -      break;
       -    case '\f':
       -      fputs("\\f", fp);
       -      break;
       -    default:
       -      if (isprint(str[i])) {
       -        fputc(str[i], fp);
       -      } else {
       -        fprintf(fp, "\\%o", (int)(guchar)str[i]);
       -      }
       -    }
       -  }
       -}
       -
       -/*
       - * Writes a single configuration file variable (identified by GlobalIndex
       - * and StructIndex) to the specified file, in a format suitable for reading
       - * back in (via. ParseNextConfig and friends).
       - */
       -static void WriteConfigValue(FILE *fp, int GlobalIndex, int StructIndex)
       -{
       -  gchar *GlobalName;
       -
       -  if (Globals[GlobalIndex].NameStruct[0]) {
       -    GlobalName =
       -        g_strdup_printf("%s[%d].%s", Globals[GlobalIndex].NameStruct,
       -                        StructIndex, Globals[GlobalIndex].Name);
       -  } else {
       -    GlobalName = Globals[GlobalIndex].Name;
       -  }
       -
       -  if (Globals[GlobalIndex].IntVal) {
       -    fprintf(fp, "%s = %d\n", GlobalName,
       -            *GetGlobalInt(GlobalIndex, StructIndex));
       -  } else if (Globals[GlobalIndex].BoolVal) {
       -    fprintf(fp, "%s = %s\n", GlobalName,
       -            *GetGlobalBoolean(GlobalIndex, StructIndex) ?
       -            _("TRUE") : _("FALSE"));
       -  } else if (Globals[GlobalIndex].PriceVal) {
       -    gchar *prstr = pricetostr(*GetGlobalPrice(GlobalIndex, StructIndex));
       -
       -    fprintf(fp, "%s = %s\n", GlobalName, prstr);
       -    g_free(prstr);
       -  } else if (Globals[GlobalIndex].StringVal) {
       -    fprintf(fp, "%s = \"", GlobalName);
       -    PrintEscaped(fp, *GetGlobalString(GlobalIndex, StructIndex));
       -    fprintf(fp, "\"\n");
       -  } else if (Globals[GlobalIndex].StringList) {
       -    int i;
       -
       -    fprintf(fp, "%s = { ", GlobalName);
       -    for (i = 0; i < *Globals[GlobalIndex].MaxIndex; i++) {
       -      if (i > 0)
       -        fprintf(fp, ", ");
       -      fputc('"', fp);
       -      PrintEscaped(fp, (*Globals[GlobalIndex].StringList)[i]);
       -      fputc('"', fp);
       -    }
       -    fprintf(fp, " }\n");
       -  }
       -
       -  if (Globals[GlobalIndex].NameStruct[0])
       -    g_free(GlobalName);
       -}
       -
       -/*
       - * Writes all of the configuration file variables that have changed
       - * (together with their values) to the given file.
       - */
       -void WriteConfigFile(FILE *fp)
       -{
       -  int i, j;
       -
       -  for (i = 0; i < NUMGLOB; i++) {
       -    if (Globals[i].Modified) {
       -      if (Globals[i].NameStruct[0]) {
       -        for (j = 1; j <= *Globals[i].MaxIndex; j++) {
       -          WriteConfigValue(fp, i, j);
       -        }
       -      } else {
       -        WriteConfigValue(fp, i, 0);
       -      }
       -    }
       -  }
       -}
       -
        void PrintConfigValue(int GlobalIndex, int StructIndex,
                              gboolean IndexGiven, GScanner *scanner)
        {
 (DIR) diff --git a/src/dopewars.h b/src/dopewars.h
       t@@ -428,7 +428,6 @@ void RestoreConfig(void);
        void ScannerErrorHandler(GScanner *scanner, gchar *msg, gint error);
        gboolean IsConnectedPlayer(Player *play);
        void BackupConfig(void);
       -void WriteConfigFile(FILE *fp);
        gchar *GetDocIndex(void);
        gchar *GetGlobalConfigFile(void);
        gchar *GetLocalConfigFile(void);
 (DIR) diff --git a/src/gui_client/optdialog.c b/src/gui_client/optdialog.c
       t@@ -26,8 +26,8 @@
        
        #include <string.h>             /* For strcmp */
        #include <stdlib.h>             /* For atoi */
       -#include <errno.h>              /* For errno */
        
       +#include "configfile.h"         /* For UpdateConfigFile etc. */
        #include "dopewars.h"           /* For struct GLOBALS etc. */
        #include "gtk_client.h"         /* For mainwindow etc. */
        #include "nls.h"                /* For _ function */
       t@@ -488,88 +488,10 @@ static void list_row_unselect(GtkCList *clist, gint row, gint column,
          }
        }
        
       -static void ReadFileToString(FILE *fp, gchar *str)
       -{
       -  int len, mpos, ch;
       -  gchar *match;
       -  GString *file;
       -
       -  file = g_string_new("");
       -  len = strlen(str);
       -  match = g_new(gchar, len);
       -  mpos = 0;
       -
       -  while (mpos < len && (ch = fgetc(fp)) != EOF) {
       -    g_string_append_c(file, ch);
       -    match[mpos++] = ch;
       -    if (ch != str[mpos - 1]) {
       -      int start;
       -      gboolean shortmatch = FALSE;
       -
       -      for (start = 1; start < mpos; start++) {
       -        if (memcmp(str, &match[start], mpos - start) == 0) {
       -          mpos -= start;
       -          memmove(match, &match[start], mpos);
       -          shortmatch = TRUE;
       -          break;
       -        }
       -      }
       -      if (!shortmatch)
       -        mpos = 0;
       -    }
       -  }
       -
       -  g_free(match);
       -
       -  rewind(fp);
       -  ftruncate(fileno(fp), 0);
       -  fprintf(fp, file->str);
       -
       -  if (mpos < len)
       -    fprintf(fp, str);
       -
       -  g_string_free(file, TRUE);
       -}
       -
       -static void UpdateLocalConfig(void)
       -{
       -  gchar *cfgfile;
       -  FILE *fp;
       -  static gchar *header =
       -      "\n### Everything from here on is written automatically by the\n"
       -      "### dopewars graphical client; you can edit it manually, but any\n"
       -      "### formatting (comments, etc.) will be lost at the next rewrite.\n\n";
       -
       -  cfgfile = GetLocalConfigFile();
       -  if (!cfgfile) {
       -    g_warning(_("Could not determine local config file to write to"));
       -    return;
       -  }
       -
       -  fp = fopen(cfgfile, "r+");
       -  if (!fp) {
       -    fp = fopen(cfgfile, "w+");
       -  }
       -
       -  if (!fp) {
       -    gchar *errstr = ErrStrFromErrno(errno);
       -    g_warning(_("Could not open file %s: %s"), cfgfile, errstr);
       -    g_free(errstr);
       -    g_free(cfgfile);
       -    return;
       -  }
       -
       -  ReadFileToString(fp, header);
       -  WriteConfigFile(fp);
       -
       -  fclose(fp);
       -  g_free(cfgfile);
       -}
       -
        static void OKCallback(GtkWidget *widget, GtkWidget *dialog)
        {
          SaveConfigWidgets();
       -  UpdateLocalConfig();
       +  UpdateConfigFile(NULL);
          gtk_widget_destroy(dialog);
        }