some fixes
[libpicofe.git] / common / config.c
index 534fb40..e2a2395 100644 (file)
@@ -21,10 +21,10 @@ extern const int cdopt_entry_count;
 static menu_entry *cfg_opts[] = { opt_entries, opt2_entries, cdopt_entries };
 static const int *cfg_opt_counts[] = { &opt_entry_count, &opt2_entry_count, &cdopt_entry_count };
 
-#define NL "\n"
+#define NL "\r\n"
 
 
-static void mystrip(char *str)
+static char *mystrip(char *str)
 {
        int i, len;
 
@@ -32,10 +32,13 @@ static void mystrip(char *str)
        for (i = 0; i < len; i++)
                if (str[i] != ' ') break;
        if (i > 0) memmove(str, str + i, len - i + 1);
+
        len = strlen(str);
        for (i = len - 1; i >= 0; i--)
                if (str[i] != ' ') break;
        str[i+1] = 0;
+
+       return str;
 }
 
 
@@ -167,22 +170,18 @@ static void keys_write(FILE *fn, const char *bind_str, const int binds[32],
 #endif
                for (i = 0; i < sizeof(me_ctrl_actions) / sizeof(me_ctrl_actions[0]); i++) {
                        if (me_ctrl_actions[i].mask & binds[t]) {
-                               sprintf(act, "player%i ", ((binds[t]>>16)&1)+1);
-                               strncpy(act + 8, me_ctrl_actions[i].name, 31);
-                               break;
+                               strncpy(act, me_ctrl_actions[i].name, 31);
+                               fprintf(fn, "%s %s = player%i %s" NL, bind_str, names[t],
+                                       ((binds[t]>>16)&1)+1, mystrip(act));
                        }
                }
-               if (act[0] == 0)
-               {
-                       for (i = 0; emuctrl_actions[i].name != NULL; i++)
-                               if (emuctrl_actions[i].mask & binds[t]) {
-                                       strncpy(act, emuctrl_actions[i].name, 31);
-                                       break;
-                               }
-               }
-               mystrip(act);
 
-               fprintf(fn, "%s %s = %s" NL, bind_str, names[t], act);
+               for (i = 0; emuctrl_actions[i].name != NULL; i++) {
+                       if (emuctrl_actions[i].mask & binds[t]) {
+                               strncpy(act, emuctrl_actions[i].name, 31);
+                               fprintf(fn, "%s %s = %s" NL, bind_str, names[t], mystrip(act));
+                       }
+               }
        }
 }
 
@@ -323,6 +322,9 @@ write:
        keys_write(fn, "bind_joy2", currentConfig.JoyBinds[2], defaultConfig.JoyBinds[2], joyKeyNames, 1);
        keys_write(fn, "bind_joy3", currentConfig.JoyBinds[3], defaultConfig.JoyBinds[3], joyKeyNames, 1);
 
+       if (section == NULL)
+               fprintf(fn, "Sound Volume = %i" NL, currentConfig.volume);
+
        fprintf(fn, NL);
 
        if (fo != NULL)
@@ -351,7 +353,7 @@ int config_writelrom(const char *fname)
        int size;
        FILE *f;
 
-       if (strlen(lastRomFile) == 0) return 0;
+       if (strlen(lastRomFile) == 0) return -1;
 
        f = fopen(fname, "r");
        if (f != NULL)
@@ -566,9 +568,11 @@ static int custom_read(menu_entry *me, const char *var, const char *val)
 }
 
 
+static unsigned int keys_encountered = 0;
+
 static void keys_parse(const char *var, const char *val, int binds[32], const char *names[32])
 {
-       int t, i, keys_encountered = 0;
+       int t, i;
        unsigned int player;
 
        for (t = 0; t < 32; t++)
@@ -580,7 +584,7 @@ static void keys_parse(const char *var, const char *val, int binds[32], const ch
                return;
        }
 
-       if (!(keys_encountered & (1<<t))) {
+       if (binds == currentConfig.KeyBinds && !(keys_encountered & (1<<t))) { // hack
                binds[t] = 0;
                keys_encountered |= 1<<t;
        }
@@ -607,7 +611,6 @@ static void keys_parse(const char *var, const char *val, int binds[32], const ch
 fail:
        lprintf("unhandled action \"%s\"\n", val);
        return;
-
 }
 
 
@@ -626,6 +629,11 @@ static void parse(const char *var, const char *val)
        if (strcasecmp(var, "LastUsedROM") == 0)
                return; /* handled elsewhere */
 
+       if (strcasecmp(var, "Sound Volume") == 0) {
+               currentConfig.volume = atoi(val);
+               return;
+       }
+
        // key binds
        if (strncasecmp(var, "bind ", 5) == 0) {
                keys_parse(var + 5, val, currentConfig.KeyBinds, keyNames);
@@ -686,7 +694,7 @@ int config_readsect(const char *fname, const char *section)
        FILE *f;
 
        f = fopen(fname, "r");
-       if (f == NULL) return 0;
+       if (f == NULL) return -1;
 
        if (section != NULL)
        {
@@ -698,6 +706,8 @@ int config_readsect(const char *fname, const char *section)
                }
        }
 
+       keys_encountered = 0;
+
        while (!feof(f))
        {
                tmp = fgets(line, sizeof(line), f);