tOptions dialog should now save configuration properly to ~/.dopewars - 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 86756a22b3d292d6b4c4c33d3f3e17c01ed8353d
 (DIR) parent bbf78e913710efb8fa6baaf791a6c6e0459d6621
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Sat,  2 Mar 2002 18:56:49 +0000
       
       Options dialog should now save configuration properly to ~/.dopewars
       
       
       Diffstat:
         M src/gui_client/optdialog.c          |      76 ++++++++++++++++++++++++++++++-
       
       1 file changed, 75 insertions(+), 1 deletion(-)
       ---
 (DIR) diff --git a/src/gui_client/optdialog.c b/src/gui_client/optdialog.c
       t@@ -26,6 +26,7 @@
        
        #include <string.h>             /* For strcmp */
        #include <stdlib.h>             /* For atoi */
       +#include <errno.h>              /* For errno */
        
        #include "dopewars.h"           /* For struct GLOBALS etc. */
        #include "gtk_client.h"         /* For mainwindow etc. */
       t@@ -461,10 +462,83 @@ static void list_row_unselect(GtkCList *clist, gint row, gint column,
          }
        }
        
       +static gboolean ReadFileToString(FILE *fp, gchar *str)
       +{
       +  int len, mpos, numread;
       +  gchar *match, ch;
       +
       +  len = strlen(str);
       +  match = g_new(gchar, len);
       +  mpos = numread = 0;
       +
       +  while ((ch = fgetc(fp)) != EOF && mpos < len) {
       +    numread++;
       +    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);
       +  if (mpos == len) {
       +    fseek(fp, numread, SEEK_SET);
       +    ftruncate(fileno(fp), numread);
       +    return TRUE;
       +  } else {
       +    return FALSE;
       +  }
       +}
       +
       +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) {
       +    g_warning(_("Could not open file %s: %s"), cfgfile, strerror(errno));
       +    g_free(cfgfile);
       +    return;
       +  }
       +
       +  if (!ReadFileToString(fp, header))
       +    fprintf(fp, header);
       +  WriteConfigFile(fp);
       +
       +  fclose(fp);
       +  g_free(cfgfile);
       +}
       +
        static void OKCallback(GtkWidget *widget, GtkWidget *dialog)
        {
          SaveConfigWidgets();
       -  WriteConfigFile(stdout);
       +  UpdateLocalConfig();
          gtk_widget_destroy(dialog);
        }