Changeset 1901


Ignore:
Timestamp:
06/07/12 10:53:10 (13 months ago)
Author:
philmoz
Message:

Add 'list of values' option to script parameters to control allowed values on parameters.

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/core/gui.c

    r1900 r1901  
    13361336    register int p=0, i; 
    13371337 
    1338     for (i=0; i<sizeof(script_submenu_items_top)/sizeof(script_submenu_items_top[0]); ++p, ++i) { 
     1338    for (i=0; i<sizeof(script_submenu_items_top)/sizeof(script_submenu_items_top[0]); ++p, ++i) 
     1339    { 
    13391340        script_submenu_items[p]=script_submenu_items_top[i]; 
    13401341    } 
    1341     for (i=0; i<SCRIPT_NUM_PARAMS; ++i) { 
    1342         if (script_param_order[i]) { 
    1343             script_submenu_items[p].symbol=0x0; 
    1344             script_submenu_items[p].text=(int)script_params[script_param_order[i]-1]; 
    1345             script_submenu_items[p].type=MENUITEM_INT; 
    1346             script_submenu_items[p].value=&conf.script_vars[script_param_order[i]-1]; 
    1347             if (script_range_values[script_param_order[i]-1] != 0) 
     1342    for (i=0; i<SCRIPT_NUM_PARAMS; ++i) 
     1343    { 
     1344        if (script_param_order[i]) 
     1345        { 
     1346            int n = script_param_order[i]-1; 
     1347 
     1348            script_submenu_items[p].symbol = 0x0; 
     1349            script_submenu_items[p].text = (int)script_params[n]; 
     1350            script_submenu_items[p].type = MENUITEM_INT; 
     1351            script_submenu_items[p].value = &conf.script_vars[n]; 
     1352 
     1353            if (script_range_values[n] != 0) 
    13481354            { 
    1349                 if (script_range_values[script_param_order[i]-1] == MENU_MINMAX(0,1)) 
     1355                if (script_range_values[n] == MENU_MINMAX(0,1)) 
    13501356                { 
    13511357                    script_submenu_items[p].type = MENUITEM_BOOL; 
     
    13541360                { 
    13551361                    script_submenu_items[p].type |= MENUITEM_F_MINMAX; 
    1356                     script_submenu_items[p].arg = script_range_values[script_param_order[i]-1]; 
     1362                    script_submenu_items[p].arg = script_range_values[n]; 
    13571363                } 
    13581364            } 
     1365            else if (script_named_counts[n] != 0) 
     1366            { 
     1367                script_submenu_items[p].type = MENUITEM_ENUM2; 
     1368                script_submenu_items[p].opt_len = script_named_counts[n]; 
     1369                script_submenu_items[p].arg = (int)script_named_values[n]; 
     1370            } 
     1371 
    13591372            ++p; 
    13601373        } 
    13611374    } 
    1362     for (i=0; i<sizeof(script_submenu_items_bottom)/sizeof(script_submenu_items_bottom[0]); ++p, ++i) { 
     1375    for (i=0; i<sizeof(script_submenu_items_bottom)/sizeof(script_submenu_items_bottom[0]); ++p, ++i) 
     1376    { 
    13631377        script_submenu_items[p]=script_submenu_items_bottom[i]; 
    13641378    } 
  • trunk/core/script.c

    r1900 r1901  
    108108                                                            // to display in same order in script 
    109109int script_range_values[SCRIPT_NUM_PARAMS];                 // Min/Max values for param validation 
     110const char **script_named_values[SCRIPT_NUM_PARAMS];        // Array of list values for named parameters 
     111int script_named_counts[SCRIPT_NUM_PARAMS];                 // Count of # of entries in each script_list_values array 
     112char *script_named_strings[SCRIPT_NUM_PARAMS];              // Base storage for named value string data 
    110113static char script_params_update[SCRIPT_NUM_PARAMS];        // Flag is such parameter exist 
    111114static int script_loaded_params[SCRIPT_NUM_PARAMS];         // Copy of original values of parameters  
     
    117120 
    118121const char* skip_whitespace(const char* p)  { while (*p==' ' || *p=='\t') p++; return p; }  // Skip past whitespace 
    119 const char* skip_token(const char* p)       { while (*p!=' ' && *p!='\t') p++; return p; }  // Skip to next whitespace 
     122const char* skip_token(const char* p)       { while (*p && *p!='\r' && *p!='\n' && *p!=' ' && *p!='\t') p++; return p; }  // Skip past current token value 
     123const char* skip_toeol(const char* p)       { while (*p!='\r' && *p!='\n') p++; return p; } // Skip to end of line 
    120124 
    121125//------------------------------------------------------------------- 
     
    141145// RETURN VALUE: 0 if err, 1..26 = id of var 
    142146//------------------------------------------------------------------- 
    143 static int process_param(const char *param, int update) { 
     147static int process_param(const char *param, int update) 
     148{ 
    144149    register const char *ptr = param; 
    145150    register int n, i=0; 
     
    171176//               1 - only if updated 
    172177//------------------------------------------------------------------- 
    173 static void process_default(const char *param, char update) { 
     178static void process_default(const char *param, char update) 
     179{ 
    174180    register const char *ptr = param; 
    175181    register int n; 
     
    193199//               1 - only if updated 
    194200//------------------------------------------------------------------- 
    195 static void process_range(const char *param, char update) { 
     201static void process_range(const char *param, char update) 
     202{ 
    196203    register const char *ptr = param; 
    197204    register int n; 
    198205 
    199206    ptr = skip_whitespace(ptr); 
    200     if (ptr[0] && (ptr[0]>='a' && ptr[0]<='a'+SCRIPT_NUM_PARAMS) && (ptr[1]==' ' || ptr[1]=='\t')) { 
     207    if (ptr[0] && (ptr[0]>='a' && ptr[0]<='a'+SCRIPT_NUM_PARAMS) && (ptr[1]==' ' || ptr[1]=='\t')) 
     208    { 
    201209        n=ptr[0]-'a'; 
    202210        ptr = skip_whitespace(ptr+2); 
     
    212220 
    213221//------------------------------------------------------------------- 
     222// Process one entry "@values VAR A B C D ..." 
     223//      param = ptr right after descriptor (should point to var) 
     224//      update = 0 - get 
     225//               1 - only if updated 
     226//------------------------------------------------------------------- 
     227static void process_values(const char *param, char update) 
     228{ 
     229    register const char *ptr = param; 
     230    register int n; 
     231 
     232    ptr = skip_whitespace(ptr); 
     233    if (ptr[0] && (ptr[0]>='a' && ptr[0]<='a'+SCRIPT_NUM_PARAMS) && (ptr[1]==' ' || ptr[1]=='\t')) 
     234    { 
     235        n=ptr[0]-'a'; 
     236        ptr = skip_whitespace(ptr+2); 
     237        if (!update || script_params_update[n]) 
     238        { 
     239            int len = skip_toeol(ptr) - ptr; 
     240            script_named_strings[n] = malloc(len+1); 
     241            strncpy(script_named_strings[n], ptr, len); 
     242            script_named_strings[n][len] = 0; 
     243 
     244            const char *p = script_named_strings[n]; 
     245            int cnt = 0; 
     246            while (*p) 
     247            { 
     248                p = skip_whitespace(skip_token(p)); 
     249                cnt++; 
     250            } 
     251            script_named_counts[n] = cnt; 
     252            script_named_values[n] = malloc(cnt * sizeof(char*)); 
     253 
     254            p = script_named_strings[n]; 
     255            cnt = 0; 
     256            while (*p) 
     257            { 
     258                script_named_values[n][cnt] = p; 
     259                p = skip_token(p); 
     260                if (*p) 
     261                { 
     262                    *((char*)p) = 0; 
     263                    p = skip_whitespace(p+1); 
     264                } 
     265                cnt++; 
     266            } 
     267        } 
     268    } // ??? else produce error message 
     269} 
     270 
     271//------------------------------------------------------------------- 
    214272// PURPOSE: Parse script for @xxx 
    215273// PARAMETERS:  fn - full path of script 
     
    232290        script_param_order[i]=0; 
    233291        script_range_values[i] = 0; 
     292        if (script_named_values[i]) free(script_named_values[i]); 
     293        script_named_values[i] = 0; 
     294        if (script_named_strings[i]) free(script_named_strings[i]); 
     295        script_named_strings[i] = 0; 
     296        script_named_counts[i] = 0; 
    234297    } 
    235298 
     
    253316                ptr+=6; 
    254317                process_range(ptr, 0); 
     318            } else if (update_vars && strncmp("@values", ptr, 7)==0) { 
     319                ptr+=7; 
     320                process_values(ptr, 0); 
    255321            } 
    256322        } 
     
    366432                ptr+=6; 
    367433                process_range(ptr, 1); 
     434            } else if (strncmp("@values", ptr, 7)==0) { 
     435                ptr+=7; 
     436                process_values(ptr, 0); 
    368437            } 
    369438        } 
     
    429498            if (script_range_values[n] != 0) 
    430499                sprintf(buf+strlen(buf),"@range %c %d %d\n",'a'+n,(short)(script_range_values[n]&0xFFFF),(short)(script_range_values[n]>>16)); 
     500            if (script_named_counts[n] != 0) 
     501            { 
     502                sprintf(buf+strlen(buf),"@values %c",'a'+n); 
     503                for (i=0; i<script_named_counts[n]; i++) 
     504                    sprintf(buf+strlen(buf)," %s",script_named_values[n][i]); 
     505                strcat(buf,"\n"); 
     506            } 
    431507            write(fd, buf, strlen(buf)); 
    432508        } 
  • trunk/include/script.h

    r1900 r1901  
    2121extern int script_range_values[SCRIPT_NUM_PARAMS]; 
    2222extern int script_param_order[SCRIPT_NUM_PARAMS]; 
     23extern const char **script_named_values[SCRIPT_NUM_PARAMS]; 
     24extern int script_named_counts[SCRIPT_NUM_PARAMS]; 
    2325 
    2426//------------------------------------------------------------------- 
  • trunk/lib/ubasic/tokenizer.c

    r1900 r1901  
    203203  {"@default",                TOKENIZER_REM}, 
    204204  {"@range",                  TOKENIZER_REM}, 
     205  {"@values",                 TOKENIZER_REM}, 
    205206 
    206207  {"md_detect_motion",        TOKENIZER_MD_DETECT_MOTION}, 
Note: See TracChangeset for help on using the changeset viewer.