Changeset 1900


Ignore:
Timestamp:
06/06/12 00:55:04 (13 months ago)
Author:
philmoz
Message:

Add min/max range option to script parameters to control allowed values on parameters.

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/core/gui.c

    r1890 r1900  
    13451345            script_submenu_items[p].type=MENUITEM_INT; 
    13461346            script_submenu_items[p].value=&conf.script_vars[script_param_order[i]-1]; 
     1347            if (script_range_values[script_param_order[i]-1] != 0) 
     1348            { 
     1349                if (script_range_values[script_param_order[i]-1] == MENU_MINMAX(0,1)) 
     1350                { 
     1351                    script_submenu_items[p].type = MENUITEM_BOOL; 
     1352                } 
     1353                else 
     1354                { 
     1355                    script_submenu_items[p].type |= MENUITEM_F_MINMAX; 
     1356                    script_submenu_items[p].arg = script_range_values[script_param_order[i]-1]; 
     1357                } 
     1358            } 
    13471359            ++p; 
    13481360        } 
  • trunk/core/gui_menu.h

    r1874 r1900  
    3333#define MENUITEM_ARG_CALLBACK   0x0300 
    3434 
    35 #define MENU_MINMAX(min, max)   (((max)<<16)|(min)) 
     35#define MENU_MINMAX(min, max)   (((max)<<16)|(min&0xFFFF)) 
    3636 
    3737//------------------------------------------------------------------- 
  • trunk/core/script.c

    r1890 r1900  
    55#include "gui.h" 
    66#include "gui_draw.h" 
     7#include "gui_menu.h" 
    78#include "conf.h" 
    89#include "script.h" 
     
    106107int script_param_order[SCRIPT_NUM_PARAMS];                  // Ordered as_in_script list of variables ( [idx] = id_of_var ) 
    107108                                                            // to display in same order in script 
     109int script_range_values[SCRIPT_NUM_PARAMS];                 // Min/Max values for param validation 
    108110static char script_params_update[SCRIPT_NUM_PARAMS];        // Flag is such parameter exist 
    109111static int script_loaded_params[SCRIPT_NUM_PARAMS];         // Copy of original values of parameters  
     
    113115 
    114116//------------------------------------------------------------------- 
     117 
     118const char* skip_whitespace(const char* p)  { while (*p==' ' || *p=='\t') p++; return p; }  // Skip past whitespace 
     119const char* skip_token(const char* p)       { while (*p!=' ' && *p!='\t') p++; return p; }  // Skip to next whitespace 
     120 
     121//------------------------------------------------------------------- 
    115122static void process_title(const char *title) { 
    116123    register const char *ptr = title; 
    117124    register int i=0; 
    118125 
    119     while (ptr[0]==' ' || ptr[0]=='\t') ++ptr; // whitespaces 
     126    ptr = skip_whitespace(ptr); 
    120127    while (i<(sizeof(script_title)-1) && ptr[i] && ptr[i]!='\r' && ptr[i]!='\n') { 
    121128        script_title[i]=ptr[i]; 
     
    138145    register int n, i=0; 
    139146 
    140     while (ptr[0]==' ' || ptr[0]=='\t') ++ptr; // whitespaces 
     147    ptr = skip_whitespace(ptr); 
    141148    if (ptr[0] && (ptr[0]>='a' && ptr[0]<='a'+SCRIPT_NUM_PARAMS) && (ptr[1]==' ' || ptr[1]=='\t')) { 
    142149        n=ptr[0]-'a'; 
    143         ptr+=2; 
    144         while (ptr[0]==' ' || ptr[0]=='\t') ++ptr; // whitespaces 
     150        ptr = skip_whitespace(ptr+2); 
    145151        script_params_update[n] = 1; 
    146152        while (i<(sizeof(script_params[0])-1) && ptr[i] && ptr[i]!='\r' && ptr[i]!='\n') { 
     
    169175    register int n; 
    170176 
    171     while (ptr[0]==' ' || ptr[0]=='\t') ++ptr; // whitespaces 
     177    ptr = skip_whitespace(ptr); 
    172178    if (ptr[0] && (ptr[0]>='a' && ptr[0]<='a'+SCRIPT_NUM_PARAMS) && (ptr[1]==' ' || ptr[1]=='\t')) { 
    173179        n=ptr[0]-'a'; 
    174         ptr+=2; 
     180        ptr = skip_whitespace(ptr+2); 
    175181        if (!update || script_params_update[n]) 
    176182        { 
    177183            conf.script_vars[n] = strtol(ptr, NULL, 0); 
    178184            script_loaded_params[n] = conf.script_vars[n]; 
     185        } 
     186    } // ??? else produce error message 
     187} 
     188 
     189//------------------------------------------------------------------- 
     190// Process one entry "@range VAR MIN MAX" 
     191//      param = ptr right after descriptor (should point to var) 
     192//      update = 0 - get 
     193//               1 - only if updated 
     194//------------------------------------------------------------------- 
     195static void process_range(const char *param, char update) { 
     196    register const char *ptr = param; 
     197    register int n; 
     198 
     199    ptr = skip_whitespace(ptr); 
     200    if (ptr[0] && (ptr[0]>='a' && ptr[0]<='a'+SCRIPT_NUM_PARAMS) && (ptr[1]==' ' || ptr[1]=='\t')) { 
     201        n=ptr[0]-'a'; 
     202        ptr = skip_whitespace(ptr+2); 
     203        if (!update || script_params_update[n]) 
     204        { 
     205            short min = strtol(ptr,NULL,0); 
     206            ptr = skip_whitespace(skip_token(ptr)); 
     207            short max = strtol(ptr,NULL,0); 
     208            script_range_values[n] = MENU_MINMAX(min,max); 
    179209        } 
    180210    } // ??? else produce error message 
     
    201231        script_params[i][0]=0; 
    202232        script_param_order[i]=0; 
     233        script_range_values[i] = 0; 
    203234    } 
    204235 
    205236    while (ptr[0]) { 
    206         while (ptr[0]==' ' || ptr[0]=='\t') ++ptr; // whitespaces 
     237        ptr = skip_whitespace(ptr); 
    207238        if (ptr[0]=='@') { 
    208239            if (strncmp("@title", ptr, 6)==0) { 
     
    219250                ptr+=8; 
    220251                process_default(ptr, 0); 
     252            } else if (update_vars && strncmp("@range", ptr, 6)==0) { 
     253                ptr+=6; 
     254                process_range(ptr, 0); 
    221255            } 
    222256        } 
     
    329363                ptr+=8; 
    330364                process_default(ptr, 1); 
     365            } else if (strncmp("@range", ptr, 6)==0) { 
     366                ptr+=6; 
     367                process_range(ptr, 1); 
    331368            } 
    332369        } 
     
    353390{ 
    354391    int i, n, fd, changed=0; 
    355     char *buf,*p; 
     392    char *buf; 
    356393    for(i = 0; i < SCRIPT_NUM_PARAMS; i++) 
    357394    { 
     
    375412 
    376413    // max possible params * (param description + some extra for @default etc) 
    377     buf=umalloc(SCRIPT_NUM_PARAMS*(28 + 20)); 
     414    buf=umalloc(256); 
    378415    if(!buf) 
    379416        return; 
     
    385422    } 
    386423    buf[0] = 0; 
    387     p=buf; 
    388424    for(n = 0; n < SCRIPT_NUM_PARAMS; ++n) 
    389425    { 
    390426        if (script_params[n][0] != 0) 
    391427        { 
    392             p+=sprintf(p,"@param %c %s\n@default %c %d\n",'a'+n,script_params[n],'a'+n,conf.script_vars[n]); 
    393         } 
    394     } 
    395     write(fd, buf, strlen(buf)); 
     428            sprintf(buf,"@param %c %s\n@default %c %d\n",'a'+n,script_params[n],'a'+n,conf.script_vars[n]); 
     429            if (script_range_values[n] != 0) 
     430                sprintf(buf+strlen(buf),"@range %c %d %d\n",'a'+n,(short)(script_range_values[n]&0xFFFF),(short)(script_range_values[n]>>16)); 
     431            write(fd, buf, strlen(buf)); 
     432        } 
     433    } 
    396434    close(fd); 
    397435    ufree(buf); 
  • trunk/include/script.h

    r1719 r1900  
    1919extern char script_title[36]; 
    2020extern char script_params[SCRIPT_NUM_PARAMS][28]; 
     21extern int script_range_values[SCRIPT_NUM_PARAMS]; 
    2122extern int script_param_order[SCRIPT_NUM_PARAMS]; 
    2223 
  • trunk/lib/ubasic/tokenizer.c

    r1719 r1900  
    202202  {"@param",                  TOKENIZER_REM}, 
    203203  {"@default",                TOKENIZER_REM}, 
     204  {"@range",                  TOKENIZER_REM}, 
    204205 
    205206  {"md_detect_motion",        TOKENIZER_MD_DETECT_MOTION}, 
Note: See TracChangeset for help on using the changeset viewer.