shithub: choc

Download patch

ref: bc8517a05648054df17e556d4116e63a20fef75a
parent: f149adaeb7f6ea23aa09a8777a966420815bada1
author: Simon Howard <fraggle@gmail.com>
date: Tue Mar 25 18:38:11 EDT 2014

config: Add API to get/set config variables.

It is useful to be able to set variables through an API provided by
the config module; this means that it is possible for one module to
set config variables of another in a more loosely-coupled way.

--- a/src/m_config.c
+++ b/src/m_config.c
@@ -1627,14 +1627,55 @@
     return parm;
 }
 
+static void SetVariable(default_t *def, char *value)
+{
+    int intparm;
+
+    // parameter found
+
+    switch (def->type)
+    {
+        case DEFAULT_STRING:
+            * (char **) def->location = strdup(value);
+            break;
+
+        case DEFAULT_INT:
+        case DEFAULT_INT_HEX:
+            * (int *) def->location = ParseIntParameter(value);
+            break;
+
+        case DEFAULT_KEY:
+
+            // translate scancodes read from config
+            // file (save the old value in untranslated)
+
+            intparm = ParseIntParameter(value);
+            def->untranslated = intparm;
+            if (intparm >= 0 && intparm < 128)
+            {
+                intparm = scantokey[intparm];
+            }
+            else
+            {
+                intparm = 0;
+            }
+
+            def->original_translated = intparm;
+            * (int *) def->location = intparm;
+            break;
+
+        case DEFAULT_FLOAT:
+            * (float *) def->location = (float) atof(value);
+            break;
+    }
+}
+
 static void LoadDefaultCollection(default_collection_t *collection)
 {
-    default_t *def;
     FILE *f;
+    default_t *def;
     char defname[80];
     char strparm[100];
-    char *s;
-    int intparm;
 
     // read the file in, overriding any set defaults
     f = fopen(collection->filename, "r");
@@ -1646,26 +1687,18 @@
 
         return;
     }
-    
+
     while (!feof(f))
     {
-        if (fscanf (f, "%79s %[^\n]\n", defname, strparm) != 2)
+        if (fscanf(f, "%79s %99[^\n]\n", defname, strparm) != 2)
         {
             // This line doesn't match
-          
+
             continue;
         }
 
-        // Strip off trailing non-printable characters (\r characters
-        // from DOS text files)
-
-        while (strlen(strparm) > 0 && !isprint(strparm[strlen(strparm)-1]))
-        {
-            strparm[strlen(strparm)-1] = '\0';
-        }
-        
         // Find the setting in the list
-       
+
         def = SearchCollection(collection, defname);
 
         if (def == NULL || !def->bound)
@@ -1676,47 +1709,25 @@
             continue;
         }
 
-        // parameter found
+        // Strip off trailing non-printable characters (\r characters
+        // from DOS text files)
 
-        switch (def->type)
+        while (strlen(strparm) > 0 && !isprint(strparm[strlen(strparm)-1]))
         {
-            case DEFAULT_STRING:
-                s = strdup(strparm + 1);
-                s[strlen(s) - 1] = '\0';
-                * (char **) def->location = s;
-                break;
+            strparm[strlen(strparm)-1] = '\0';
+        }
 
-            case DEFAULT_INT:
-            case DEFAULT_INT_HEX:
-                * (int *) def->location = ParseIntParameter(strparm);
-                break;
-
-            case DEFAULT_KEY:
-
-                // translate scancodes read from config
-                // file (save the old value in untranslated)
-
-                intparm = ParseIntParameter(strparm);
-                def->untranslated = intparm;
-                if (intparm >= 0 && intparm < 128)
-                {
-                    intparm = scantokey[intparm];
-                }
-                else
-                {
-                    intparm = 0;
-                }
-
-                def->original_translated = intparm;
-                * (int *) def->location = intparm;
-                break;
-
-            case DEFAULT_FLOAT:
-                * (float *) def->location = (float) atof(strparm);
-                break;
+        // Surrounded by quotes? If so, remove them.
+        if (strlen(strparm) >= 2
+         && strparm[0] == '"' && strparm[strlen(strparm) - 1] == '"')
+        {
+            strparm[strlen(strparm) - 1] = '\0';
+            memmove(strparm, strparm + 1, sizeof(strparm) - 1);
         }
+
+        SetVariable(def, strparm);
     }
-            
+
     fclose (f);
 }
 
@@ -1861,6 +1872,72 @@
 
     variable->location = location;
     variable->bound = true;
+}
+
+// Set the value of a particular variable; an API function for other
+// parts of the program to assign values to config variables by name.
+
+boolean M_SetVariable(char *name, char *value)
+{
+    default_t *variable;
+
+    variable = GetDefaultForName(name);
+
+    if (variable == NULL || !variable->bound)
+    {
+        return false;
+    }
+
+    SetVariable(variable, value);
+
+    return true;
+}
+
+// Get the value of a variable.
+
+int M_GetIntVariable(char *name)
+{
+    default_t *variable;
+
+    variable = GetDefaultForName(name);
+
+    if (variable == NULL || !variable->bound
+     || (variable->type != DEFAULT_INT && variable->type != DEFAULT_INT_HEX))
+    {
+        return 0;
+    }
+
+    return *((int *) variable->location);
+}
+
+const char *M_GetStrVariable(char *name)
+{
+    default_t *variable;
+
+    variable = GetDefaultForName(name);
+
+    if (variable == NULL || !variable->bound
+     || variable->type != DEFAULT_STRING)
+    {
+        return NULL;
+    }
+
+    return *((const char **) variable->location);
+}
+
+float M_GetFloatVariable(char *name)
+{
+    default_t *variable;
+
+    variable = GetDefaultForName(name);
+
+    if (variable == NULL || !variable->bound
+     || variable->type != DEFAULT_FLOAT)
+    {
+        return 0;
+    }
+
+    return *((float *) variable->location);
 }
 
 // Get the path to the default configuration dir to use, if NULL
--- a/src/m_config.h
+++ b/src/m_config.h
@@ -28,11 +28,17 @@
 #ifndef __M_CONFIG__
 #define __M_CONFIG__
 
+#include "doomtype.h"
+
 void M_LoadDefaults(void);
 void M_SaveDefaults(void);
 void M_SaveDefaultsAlternate(char *main, char *extra);
 void M_SetConfigDir(char *dir);
 void M_BindVariable(char *name, void *variable);
+boolean M_SetVariable(char *name, char *value);
+int M_GetIntVariable(char *name);
+const char *M_GetStrVariable(char *name);
+float M_GetFloatVariable(char *name);
 void M_SetConfigFilenames(char *main_config, char *extra_config);
 char *M_GetSaveGameDir(char *iwadname);