Changeset 1905


Ignore:
Timestamp:
06/10/12 08:03:57 (11 months ago)
Author:
philmoz
Message:

Merged revision(s) 1900-1901 from trunk:
Add @range and @values options for script parameters.
http://chdk.setepontos.com/index.php?topic=8151.msg86221#msg86221
http://chdk.setepontos.com/index.php?topic=8151.msg86294#msg86294

Location:
branches/release-1_0
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • branches/release-1_0

  • branches/release-1_0/core/gui.c

    r1856 r1905  
    13661366    register int p=0, i; 
    13671367 
    1368     for (i=0; i<sizeof(script_submenu_items_top)/sizeof(script_submenu_items_top[0]); ++p, ++i) { 
     1368    for (i=0; i<sizeof(script_submenu_items_top)/sizeof(script_submenu_items_top[0]); ++p, ++i) 
     1369    { 
    13691370        script_submenu_items[p]=script_submenu_items_top[i]; 
    13701371    } 
    1371     for (i=0; i<SCRIPT_NUM_PARAMS; ++i) { 
    1372         if (script_param_order[i]) { 
    1373             script_submenu_items[p].symbol=0x0; 
    1374             script_submenu_items[p].text=(int)script_params[script_param_order[i]-1]; 
    1375             script_submenu_items[p].type=MENUITEM_INT; 
    1376             script_submenu_items[p].value=&conf.script_vars[script_param_order[i]-1]; 
     1372    for (i=0; i<SCRIPT_NUM_PARAMS; ++i) 
     1373    { 
     1374        if (script_param_order[i]) 
     1375        { 
     1376            int n = script_param_order[i]-1; 
     1377 
     1378            script_submenu_items[p].symbol = 0x0; 
     1379            script_submenu_items[p].text = (int)script_params[n]; 
     1380            script_submenu_items[p].type = MENUITEM_INT; 
     1381            script_submenu_items[p].value = &conf.script_vars[n]; 
     1382 
     1383            if (script_range_values[n] != 0) 
     1384            { 
     1385                if (script_range_values[n] == MENU_MINMAX(0,1)) 
     1386                { 
     1387                    script_submenu_items[p].type = MENUITEM_BOOL; 
     1388                } 
     1389                else 
     1390                { 
     1391                    script_submenu_items[p].type |= MENUITEM_F_MINMAX; 
     1392                    script_submenu_items[p].arg = script_range_values[n]; 
     1393                } 
     1394            } 
     1395            else if (script_named_counts[n] != 0) 
     1396            { 
     1397                script_submenu_items[p].type = MENUITEM_ENUM2; 
     1398                script_submenu_items[p].opt_len = script_named_counts[n]; 
     1399                script_submenu_items[p].arg = (int)script_named_values[n]; 
     1400            } 
     1401 
    13771402            ++p; 
    13781403        } 
    13791404    } 
    1380     for (i=0; i<sizeof(script_submenu_items_bottom)/sizeof(script_submenu_items_bottom[0]); ++p, ++i) { 
     1405    for (i=0; i<sizeof(script_submenu_items_bottom)/sizeof(script_submenu_items_bottom[0]); ++p, ++i) 
     1406    { 
    13811407        script_submenu_items[p]=script_submenu_items_bottom[i]; 
    13821408    } 
  • branches/release-1_0/core/gui_menu.h

    r1407 r1905  
    3232#define MENUITEM_ARG_CALLBACK   0x0300 
    3333 
    34 #define MENU_MINMAX(min, max)   (((max)<<16)|(min)) 
     34#define MENU_MINMAX(min, max)   (((max)<<16)|(min&0xFFFF)) 
    3535 
    3636//------------------------------------------------------------------- 
  • branches/release-1_0/core/script.c

    r1721 r1905  
    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 
     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 
    108113static char script_params_update[SCRIPT_NUM_PARAMS];        // Flag is such parameter exist 
    109114static int script_loaded_params[SCRIPT_NUM_PARAMS];         // Copy of original values of parameters  
     
    113118 
    114119//------------------------------------------------------------------- 
     120 
     121const char* skip_whitespace(const char* p)  { while (*p==' ' || *p=='\t') p++; return p; }  // Skip past 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 
     124 
     125//------------------------------------------------------------------- 
    115126static void process_title(const char *title) { 
    116127    register const char *ptr = title; 
    117128    register int i=0; 
    118129 
    119     while (ptr[0]==' ' || ptr[0]=='\t') ++ptr; // whitespaces 
     130    ptr = skip_whitespace(ptr); 
    120131    while (i<(sizeof(script_title)-1) && ptr[i] && ptr[i]!='\r' && ptr[i]!='\n') { 
    121132        script_title[i]=ptr[i]; 
     
    134145// RETURN VALUE: 0 if err, 1..26 = id of var 
    135146//------------------------------------------------------------------- 
    136 static int process_param(const char *param, int update) { 
     147static int process_param(const char *param, int update) 
     148{ 
    137149    register const char *ptr = param; 
    138150    register int n, i=0; 
    139151 
    140     while (ptr[0]==' ' || ptr[0]=='\t') ++ptr; // whitespaces 
     152    ptr = skip_whitespace(ptr); 
    141153    if (ptr[0] && (ptr[0]>='a' && ptr[0]<='a'+SCRIPT_NUM_PARAMS) && (ptr[1]==' ' || ptr[1]=='\t')) { 
    142154        n=ptr[0]-'a'; 
    143         ptr+=2; 
    144         while (ptr[0]==' ' || ptr[0]=='\t') ++ptr; // whitespaces 
     155        ptr = skip_whitespace(ptr+2); 
    145156        script_params_update[n] = 1; 
    146157        while (i<(sizeof(script_params[0])-1) && ptr[i] && ptr[i]!='\r' && ptr[i]!='\n') { 
     
    165176//               1 - only if updated 
    166177//------------------------------------------------------------------- 
    167 static void process_default(const char *param, char update) { 
     178static void process_default(const char *param, char update) 
     179{ 
    168180    register const char *ptr = param; 
    169181    register int n; 
    170182 
    171     while (ptr[0]==' ' || ptr[0]=='\t') ++ptr; // whitespaces 
     183    ptr = skip_whitespace(ptr); 
    172184    if (ptr[0] && (ptr[0]>='a' && ptr[0]<='a'+SCRIPT_NUM_PARAMS) && (ptr[1]==' ' || ptr[1]=='\t')) { 
    173185        n=ptr[0]-'a'; 
    174         ptr+=2; 
     186        ptr = skip_whitespace(ptr+2); 
    175187        if (!update || script_params_update[n]) 
    176188        { 
    177189            conf.script_vars[n] = strtol(ptr, NULL, 0); 
    178190            script_loaded_params[n] = conf.script_vars[n]; 
     191        } 
     192    } // ??? else produce error message 
     193} 
     194 
     195//------------------------------------------------------------------- 
     196// Process one entry "@range VAR MIN MAX" 
     197//      param = ptr right after descriptor (should point to var) 
     198//      update = 0 - get 
     199//               1 - only if updated 
     200//------------------------------------------------------------------- 
     201static void process_range(const char *param, char update) 
     202{ 
     203    register const char *ptr = param; 
     204    register int n; 
     205 
     206    ptr = skip_whitespace(ptr); 
     207    if (ptr[0] && (ptr[0]>='a' && ptr[0]<='a'+SCRIPT_NUM_PARAMS) && (ptr[1]==' ' || ptr[1]=='\t')) 
     208    { 
     209        n=ptr[0]-'a'; 
     210        ptr = skip_whitespace(ptr+2); 
     211        if (!update || script_params_update[n]) 
     212        { 
     213            short min = strtol(ptr,NULL,0); 
     214            ptr = skip_whitespace(skip_token(ptr)); 
     215            short max = strtol(ptr,NULL,0); 
     216            script_range_values[n] = MENU_MINMAX(min,max); 
     217        } 
     218    } // ??? else produce error message 
     219} 
     220 
     221//------------------------------------------------------------------- 
     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            } 
    179267        } 
    180268    } // ??? else produce error message 
     
    201289        script_params[i][0]=0; 
    202290        script_param_order[i]=0; 
     291        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; 
    203297    } 
    204298 
    205299    while (ptr[0]) { 
    206         while (ptr[0]==' ' || ptr[0]=='\t') ++ptr; // whitespaces 
     300        ptr = skip_whitespace(ptr); 
    207301        if (ptr[0]=='@') { 
    208302            if (strncmp("@title", ptr, 6)==0) { 
     
    219313                ptr+=8; 
    220314                process_default(ptr, 0); 
     315            } else if (update_vars && strncmp("@range", ptr, 6)==0) { 
     316                ptr+=6; 
     317                process_range(ptr, 0); 
     318            } else if (update_vars && strncmp("@values", ptr, 7)==0) { 
     319                ptr+=7; 
     320                process_values(ptr, 0); 
    221321            } 
    222322        } 
     
    329429                ptr+=8; 
    330430                process_default(ptr, 1); 
     431            } else if (strncmp("@range", ptr, 6)==0) { 
     432                ptr+=6; 
     433                process_range(ptr, 1); 
     434            } else if (strncmp("@values", ptr, 7)==0) { 
     435                ptr+=7; 
     436                process_values(ptr, 0); 
    331437            } 
    332438        } 
     
    353459{ 
    354460    int i, n, fd, changed=0; 
    355     char *buf,*p; 
     461    char *buf; 
    356462    for(i = 0; i < SCRIPT_NUM_PARAMS; i++) 
    357463    { 
     
    375481 
    376482    // max possible params * (param description + some extra for @default etc) 
    377     buf=umalloc(SCRIPT_NUM_PARAMS*(28 + 20)); 
     483    buf=umalloc(256); 
    378484    if(!buf) 
    379485        return; 
     
    385491    } 
    386492    buf[0] = 0; 
    387     p=buf; 
    388493    for(n = 0; n < SCRIPT_NUM_PARAMS; ++n) 
    389494    { 
    390495        if (script_params[n][0] != 0) 
    391496        { 
    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)); 
     497            sprintf(buf,"@param %c %s\n@default %c %d\n",'a'+n,script_params[n],'a'+n,conf.script_vars[n]); 
     498            if (script_range_values[n] != 0) 
     499                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            } 
     507            write(fd, buf, strlen(buf)); 
     508        } 
     509    } 
    396510    close(fd); 
    397511    ufree(buf); 
  • branches/release-1_0/include/script.h

    r1712 r1905  
    2020extern char script_title[36]; 
    2121extern char script_params[SCRIPT_NUM_PARAMS][28]; 
     22extern int script_range_values[SCRIPT_NUM_PARAMS]; 
    2223extern int script_param_order[SCRIPT_NUM_PARAMS]; 
     24extern const char **script_named_values[SCRIPT_NUM_PARAMS]; 
     25extern int script_named_counts[SCRIPT_NUM_PARAMS]; 
    2326 
    2427//------------------------------------------------------------------- 
  • branches/release-1_0/lib/ubasic/tokenizer.c

    r1712 r1905  
    202202  {"@param",                  TOKENIZER_REM}, 
    203203  {"@default",                TOKENIZER_REM}, 
     204  {"@range",                  TOKENIZER_REM}, 
     205  {"@values",                 TOKENIZER_REM}, 
    204206 
    205207  {"md_detect_motion",        TOKENIZER_MD_DETECT_MOTION}, 
Note: See TracChangeset for help on using the changeset viewer.