//------------------------------------------------------------------- // Process one entry "@default VAR VALUE" //------------------------------------------------------------------- static const char* get_default(sc_param *p, const char *ptr, int isScript) { ptr = skip_to_token(ptr); if (p) { int type = MENUITEM_INT|MENUITEM_SCRIPT_PARAM; int range = 0; if (strncmp(ptr, "true", 4) == 0) { p->val = 1; type = MENUITEM_BOOL|MENUITEM_SCRIPT_PARAM; range = MENU_MINMAX(1,0); // Force boolean data type in Lua (ToDo: this is clunky, needs fixing) } else if (strncmp(ptr, "false", 5) == 0) { p->val = 0; type = MENUITEM_BOOL|MENUITEM_SCRIPT_PARAM; range = MENU_MINMAX(1,0); // Force boolean data type in Lua (ToDo: this is clunky, needs fixing) } else { p->val = strtol(ptr, NULL, 0); } p->old_val = p->val; if (isScript) // Loading from script file (rather than saved param set file) { p->def_val = p->val; p->range = range; p->range_type = type; } } return skip_token(ptr); }
//------------------------------------------------------------------- // Process short form entry on single line // '#VAR=VAL "TITLE" [MIN MAX]' // or '#VAR=VAL "TITLE" {A B C D ...}' //------------------------------------------------------------------- static int process_single(const char *ptr) { sc_param *p; ptr = get_name(ptr, MAX_PARAM_NAME_LEN, &p, 1); if (p) { ptr = get_default(p, ptr, 1); ptr = skip_whitespace(ptr); if ((*ptr == '"') || (*ptr == '\'')) { const char *s = skip_tochar(ptr+1, *ptr); p->desc = malloc(s-ptr); strncpy(p->desc, ptr+1, s-ptr-1); p->desc[s-ptr-1] = 0; if (*s == *ptr) s++; ptr = skip_whitespace(s); } else { // Error - log to console and abort return 0; } if (*ptr == '[') { ptr = get_range(p, ptr+1, ']'); } else if (*ptr == '{') { ptr = get_values(p, ptr+1, '}'); ptr = skip_whitespace(ptr); if (strncmp(ptr,"table",5) == 0) { p->data_type = DTYPE_TABLE; p->val--; // Initial value is 1 based for Lua table, convert to 0 based for C code p->def_val--; // also adjust default } } ptr = skip_whitespace(ptr); if (strncmp(ptr,"bool",4) == 0) { p->range = MENU_MINMAX(1,0); // Force boolean data type in Lua (ToDo: this is clunky, needs fixing) p->range_type = MENUITEM_BOOL|MENUITEM_SCRIPT_PARAM; ptr = skip_token(ptr); } ptr = skip_whitespace(ptr); if (strncmp(ptr,"long",4) == 0) { p->range = 9999999; p->range_type = MENUITEM_INT|MENUITEM_SD_INT; ptr = skip_token(ptr); } } return 1; }
//------------------------------------------------------------------- // Process one entry "@range VAR MIN MAX" //------------------------------------------------------------------- static const char* get_range(sc_param *p, const char *ptr, char end) { ptr = skip_whitespace(ptr); int min = strtol(ptr,NULL,0); ptr = skip_whitespace(skip_token(ptr)); int max = strtol(ptr,NULL,0); if (p) { p->range = MENU_MINMAX(min,max); p->range_type = MENUITEM_INT|MENUITEM_F_MINMAX|MENUITEM_SCRIPT_PARAM; if ((p->range == MENU_MINMAX(0,1)) || (p->range == MENU_MINMAX(1,0))) p->range_type = MENUITEM_BOOL|MENUITEM_SCRIPT_PARAM; else if ((min >= 0) && (max >= 0)) p->range_type |= MENUITEM_F_UNSIGNED; } ptr = skip_tochar(ptr, end); if (end && (*ptr == end)) ptr++; return ptr; }
//------------------------------------------------------------------- // Process one entry "@range VAR MIN MAX" // param = ptr right after descriptor (should point to var) //------------------------------------------------------------------- static void process_range(const char *param) { register const char *ptr = param; register int n; ptr = skip_whitespace(ptr); if (ptr[0] && (ptr[0]>='a' && ptr[0]<='a'+SCRIPT_NUM_PARAMS) && (ptr[1]==' ' || ptr[1]=='\t')) { n = ptr[0]-'a'; ptr = skip_whitespace(ptr+2); int min = strtol(ptr,NULL,0); ptr = skip_whitespace(skip_token(ptr)); int max = strtol(ptr,NULL,0); script_range_values[n] = MENU_MINMAX(min,max); if ((min == 0) && (max == 1)) script_range_types[n] = MENUITEM_BOOL; else if ((min >= 0) && (max >= 0)) script_range_types[n] = MENUITEM_INT|MENUITEM_F_MINMAX|MENUITEM_F_UNSIGNED; else script_range_types[n] = MENUITEM_INT|MENUITEM_F_MINMAX; } // ??? else produce error message }