Gizmondo port updated to 1.51b
[libpicofe.git] / common / config.c
index d4833f6..eb6cedb 100644 (file)
@@ -3,20 +3,28 @@
  * (c)
  */
 
+#include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include "config.h"
+#include "lprintf.h"
+
+static char *mystrip(char *str);
+
+#ifndef _MSC_VER
+
 #include "menu.h"
 #include "emu.h"
-#include "lprintf.h"
 #include <Pico/Pico.h>
 
 extern menu_entry opt_entries[];
 extern menu_entry opt2_entries[];
 extern menu_entry cdopt_entries[];
+extern menu_entry ctrlopt_entries[];
 extern const int opt_entry_count;
 extern const int opt2_entry_count;
 extern const int cdopt_entry_count;
+extern const int ctrlopt_entry_count;
 #ifdef PSP
 extern menu_entry opt3_entries[];
 extern const int opt3_entry_count;
@@ -27,6 +35,7 @@ static menu_entry *cfg_opts[] =
        opt_entries,
        opt2_entries,
        cdopt_entries,
+       ctrlopt_entries,
 #ifdef PSP
        opt3_entries,
 #endif
@@ -37,6 +46,7 @@ static const int *cfg_opt_counts[] =
        &opt_entry_count,
        &opt2_entry_count,
        &cdopt_entry_count,
+       &ctrlopt_entry_count,
 #ifdef PSP
        &opt3_entry_count,
 #endif
@@ -45,24 +55,6 @@ static const int *cfg_opt_counts[] =
 #define NL "\r\n"
 
 
-static char *mystrip(char *str)
-{
-       int i, len;
-
-       len = strlen(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;
-}
-
-
 static int seek_sect(FILE *f, const char *section)
 {
        char line[128], *tmp;
@@ -118,7 +110,6 @@ static void custom_write(FILE *f, const menu_entry *me, int no_def)
                                case 1:  str = "hw horizontal";     break;
                                case 2:  str = "hw horiz. + vert."; break;
                                case 3:  str = "sw horizontal";     break;
-                               case 1:  str = "ON";  break;
                        }
                        fprintf(f, "Scaling = %s", str);
 #endif
@@ -290,6 +281,9 @@ static int default_var(const menu_entry *me)
                case MA_CDOPT_LEDS:
                        return defaultConfig.EmuOpt;
 
+               case MA_CTRL_TURBO_RATE:
+                       return defaultConfig.turbo_rate;
+
                case MA_OPT_SAVE_SLOT:
                default:
                        return 0;
@@ -383,7 +377,7 @@ write:
                                if (!no_defaults || ((*(int *)me->var ^ default_var(me)) & me->mask))
                                        fprintf(fn, "%s = %i" NL, me->name, (*(int *)me->var & me->mask) ? 1 : 0);
                        } else if (me->beh == MB_RANGE) {
-                               if (!no_defaults || ((*(int *)me->var ^ default_var(me)) & me->mask))
+                               if (!no_defaults || (*(int *)me->var ^ default_var(me)))
                                        fprintf(fn, "%s = %i" NL, me->name, *(int *)me->var);
                        }
                }
@@ -791,7 +785,7 @@ static void parse(const char *var, const char *val)
                        ret = custom_read(me, var, val);
                }
        }
-       if (!ret) lprintf("config_readsect: unhandled var: %s\n", var);
+       if (!ret) lprintf("config_readsect: unhandled var: \"%s\"\n", var);
 }
 
 
@@ -808,12 +802,11 @@ int config_havesect(const char *fname, const char *section)
        return ret;
 }
 
-
 int config_readsect(const char *fname, const char *section)
 {
-       char line[128], *var, *val, *tmp;
-       int len, i, ret;
+       char line[128], *var, *val;
        FILE *f;
+       int ret;
 
        f = fopen(fname, "r");
        if (f == NULL) return -1;
@@ -832,35 +825,9 @@ int config_readsect(const char *fname, const char *section)
 
        while (!feof(f))
        {
-               tmp = fgets(line, sizeof(line), f);
-               if (tmp == NULL) break;
-
-               if (line[0] == '[') break; // other section
-
-               // strip comments, linefeed, spaces..
-               len = strlen(line);
-               for (i = 0; i < len; i++)
-                       if (line[i] == '#' || line[i] == '\r' || line[i] == '\n') { line[i] = 0; break; }
-               mystrip(line);
-               len = strlen(line);
-               if (len <= 0) continue;
-
-               // get var and val
-               for (i = 0; i < len; i++)
-                       if (line[i] == '=') break;
-               if (i >= len || strchr(&line[i+1], '=') != NULL) {
-                       lprintf("config_readsect: can't parse: %s\n", line);
-                       continue;
-               }
-               line[i] = 0;
-               var = line;
-               val = &line[i+1];
-               mystrip(var);
-               mystrip(val);
-               if (strlen(var) == 0 || (strlen(val) == 0 && strncasecmp(var, "bind", 4) != 0)) {
-                       lprintf("config_readsect: something's empty: \"%s\" = \"%s\"\n", var, val);
-                       continue;
-               }
+               ret = config_get_var_val(f, line, sizeof(line), &var, &val);
+               if (ret ==  0) break;
+               if (ret == -1) continue;
 
                parse(var, val);
        }
@@ -869,3 +836,71 @@ int config_readsect(const char *fname, const char *section)
        return 0;
 }
 
+#endif // _MSC_VER
+
+static char *mystrip(char *str)
+{
+       int i, len;
+
+       len = strlen(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;
+}
+
+/* returns:
+ *  0 - EOF, end
+ *  1 - parsed ok
+ * -1 - failed to parse line
+ */
+int config_get_var_val(void *file, char *line, int lsize, char **rvar, char **rval)
+{
+       char *var, *val, *tmp;
+       FILE *f = file;
+       int len, i;
+
+       tmp = fgets(line, lsize, f);
+       if (tmp == NULL) return 0;
+
+       if (line[0] == '[') return 0; // other section
+
+       // strip comments, linefeed, spaces..
+       len = strlen(line);
+       for (i = 0; i < len; i++)
+               if (line[i] == '#' || line[i] == '\r' || line[i] == '\n') { line[i] = 0; break; }
+       mystrip(line);
+       len = strlen(line);
+       if (len <= 0) return -1;;
+
+       // get var and val
+       for (i = 0; i < len; i++)
+               if (line[i] == '=') break;
+       if (i >= len || strchr(&line[i+1], '=') != NULL) {
+               lprintf("config_readsect: can't parse: %s\n", line);
+               return -1;
+       }
+       line[i] = 0;
+       var = line;
+       val = &line[i+1];
+       mystrip(var);
+       mystrip(val);
+
+#ifndef _MSC_VER
+       if (strlen(var) == 0 || (strlen(val) == 0 && strncasecmp(var, "bind", 4) != 0)) {
+               lprintf("config_readsect: something's empty: \"%s\" = \"%s\"\n", var, val);
+               return -1;;
+       }
+#endif
+
+       *rvar = var;
+       *rval = val;
+       return 1;
+}
+