[Toxine-cvs] CVS: toxine/src commands.c,1.61,1.62 common.h,1.26,1.27 main.c,1.27,1.28 parse.c,1.6,1.
Brought to you by:
f1rmb
From: Daniel Caujolle-B. <f1...@us...> - 2004-05-16 20:28:50
|
Update of /cvsroot/toxine/toxine/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18819 Modified Files: commands.c common.h main.c parse.c utils.c utils.h Log Message: support any $ envvar in any command Index: commands.c =================================================================== RCS file: /cvsroot/toxine/toxine/src/commands.c,v retrieving revision 1.61 retrieving revision 1.62 diff -u -r1.61 -r1.62 --- commands.c 12 Apr 2004 12:34:51 -0000 1.61 +++ commands.c 16 May 2004 20:28:39 -0000 1.62 @@ -2254,114 +2254,6 @@ } } -static char *get_var(toxine_t *tox, const char *var) { - - if(tox && var) { - char *variable; - - variable = strchr(var, '$'); - - if(variable && (*variable == '$') && (*(variable + 1) != '$')) { - static char buffer[32768]; - char varname[1024]; - int found = 0; - - memset(buffer, 0, sizeof(buffer)); - memset(varname, 0, sizeof(varname)); - - if(sscanf(variable, "$\(%[a-z-A-Z-0-9-_])", &varname[0]) == 1) - found = 1; - else if(sscanf(variable, "$\{%[a-z-A-Z-0-9-_]}", &varname[0]) == 1) - found = 1; - else if(sscanf(variable, "$%[a-z-A-Z-0-9-_]", &varname[0]) == 1) - found = 1; - - if(found) { - static const char day_names[] = "SunMonTueWedThuFriSat"; - static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; - - found = 0; - if(!strncasecmp(varname, "result", 6)) { - snprintf(buffer, sizeof(buffer), "%d", toxine_get_last_int_result(tox)); - found = 1; - } - else if(!strncasecmp(varname, "cresult", 7)) { - snprintf(buffer, sizeof(buffer), "%s", toxine_get_last_char_result(tox)); - found = 1; - } - else if(!strncasecmp(varname, "cxresult", 7)) { - char *p = toxine_get_last_char_result(tox); - if(p) { - int val = strtol(p, &p, 10); - snprintf(buffer, sizeof(buffer), "0x%x", val); - } - else - snprintf(buffer, sizeof(buffer), "Nothing available"); - found = 1; - } - else if(!strncasecmp(varname, "iresult", 7)) { - snprintf(buffer, sizeof(buffer), "%d", toxine_get_last_int_result(tox)); - found = 1; - } - else if(!strncasecmp(varname, "xresult", 7)) { - snprintf(buffer, sizeof(buffer), "0x%x", toxine_get_last_int_result(tox)); - found = 1; - } - else if(!strncasecmp(varname, "version", 7)) { - snprintf(buffer, sizeof(buffer), "%s", VERSION); - found = 1; - } - else if(!strncasecmp(varname, "date", 4)) { - time_t curtime; - struct tm *lt; - - time(&curtime); - lt = localtime(&curtime); - snprintf(buffer, sizeof(buffer), "%-3.3s %-3.3s %d %d", - day_names + 3 * lt->tm_wday, month_names + 3 * lt->tm_mon, - lt->tm_mday, (lt->tm_year + 1900)); - found = 1; - } - else if(!strncasecmp(varname, "time", 4)) { - time_t curtime; - struct tm *lt; - - time(&curtime); - lt = localtime(&curtime); - snprintf(buffer, sizeof(buffer), "%02d:%02d:%02d", lt->tm_hour, lt->tm_min, lt->tm_sec); - found = 1; - } - else if(!strncasecmp(varname, "config_file", 11)) { - snprintf(buffer, sizeof(buffer), "%s", (tox->configfile) ? tox->configfile : "UNSET"); - found = 1; - } - else if(!strncasecmp(varname, "video_driver", 12)) { - snprintf(buffer, sizeof(buffer), "%s", (tox->video.name) ? tox->video.name : "UNSET"); - found = 1; - } - else if(!strncasecmp(varname, "audio_driver", 12)) { - snprintf(buffer, sizeof(buffer), "%s", (tox->audio.name) ? tox->audio.name : "UNSET"); - found = 1; - } - else if(!strncasecmp(varname, "mrl", 3)) { - snprintf(buffer, sizeof(buffer), "%s", (tox->current_mrl) ? tox->current_mrl : "UNSET"); - found = 1; - } - else if(!strncasecmp(varname, "script_file", 11)) { - snprintf(buffer, sizeof(buffer), "%s", (tox->script.filename) ? tox->script.filename : "UNSET"); - found = 1; - } - - if(found) - return &buffer[0]; - - } - } - } - - return NULL; -} - static void do_echo(commands_t *command, toxine_t *tox, void *data) { int i; int nargs = toxine_is_args(tox); @@ -2371,7 +2263,7 @@ i = 1; while(i <= nargs) { arg = toxine_get_arg(tox, i++); - if((var = get_var(tox, arg)) != NULL) + if((var = toxine_get_var(tox, arg)) != NULL) len += strlen(var); else len += strlen(arg); @@ -2393,7 +2285,7 @@ arg = toxine_get_arg(tox, i++); - if((var = get_var(tox, arg)) != NULL) + if((var = toxine_get_var(tox, arg)) != NULL) strcat(buffer, var); else strcat(buffer, arg); Index: common.h =================================================================== RCS file: /cvsroot/toxine/toxine/src/common.h,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- common.h 11 Apr 2004 13:29:38 -0000 1.26 +++ common.h 16 May 2004 20:28:40 -0000 1.27 @@ -170,6 +170,9 @@ } mediamark_t; struct toxine_s { + int argc; + char **argv; + xine_t *xine; xine_stream_t *stream; xine_event_queue_t *event_queue; Index: main.c =================================================================== RCS file: /cvsroot/toxine/toxine/src/main.c,v retrieving revision 1.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- main.c 6 May 2004 19:18:33 -0000 1.27 +++ main.c 16 May 2004 20:28:40 -0000 1.28 @@ -136,6 +136,14 @@ for(i = 0; i < 256; i++) toxine_free(tox->command.args[i]); + + if(tox->argc) { + for(i = 0; i < tox->argc; i++) + toxine_free(tox->argv[i]); + + toxine_free(tox->argv); + tox->argc = 0; + } toxine_free(tox->script.filename); @@ -144,6 +152,21 @@ } /* + * + */ +static void toxine_get_extra_argv(toxine_t *tox, int argc, char *argv[], char *argv_zero) { + int i; + + tox->argc = argc + 1; + tox->argv = (char **) xine_xmalloc(sizeof(char *) * (argc + 2)); + tox->argv[0] = strdup(argv_zero); + + for(i = 1; i < tox->argc; i++) + tox->argv[i] = strdup(argv[i - 1]); +} + + +/* * ... */ int main(int argc, char **argv) { @@ -171,6 +194,8 @@ tox->msg_fd = -1; tox->playlist.cur = -1; tox->playlist.loop = 0; + tox->argc = 0; + tox->argv = NULL; /* * parse command line @@ -266,6 +291,9 @@ toxine_show_version(); + if(argc - optind) + toxine_get_extra_argv(tox, argc - optind, &argv[optind], argv[0]); + /* * generate and init a config "object" */ Index: parse.c =================================================================== RCS file: /cvsroot/toxine/toxine/src/parse.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- parse.c 7 Apr 2004 18:21:07 -0000 1.6 +++ parse.c 16 May 2004 20:28:40 -0000 1.7 @@ -242,6 +242,39 @@ goto __end_args; break; + case '$': + { + char *var; + char buffer[2048]; + char *p = buffer; + char *pp = pcmd; + + memset(&buffer, 0, sizeof(buffer)); + + while(pp && *pp && *pp != ' ') { + *p = *pp; + p++; + pp++; + } + p = '\0'; + + if((var = toxine_get_var(tox, buffer))) { + p = var; + + while(p && *p != '\0') { + *pb = *p; + pb++; + p++; + } + pcmd += strlen(buffer); + goto __end_args; + } + else + goto __store_char; + + } + break; + case ' ': if((*(pcmd - 1) != '\\') && ((get_quote == 0) && (get_dbl_quote == 0))) { Index: utils.c =================================================================== RCS file: /cvsroot/toxine/toxine/src/utils.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- utils.c 11 Apr 2004 13:29:38 -0000 1.25 +++ utils.c 16 May 2004 20:28:40 -0000 1.26 @@ -670,3 +670,144 @@ break; } } + +char *toxine_get_var(toxine_t *tox, const char *var) { + + if(tox && var) { + char *variable; + + variable = strchr(var, '$'); + + if(variable && (*variable == '$') && (*(variable + 1) != '$')) { + static char buffer[32768]; + char varname[1024]; + int found = 0; + + memset(buffer, 0, sizeof(buffer)); + memset(varname, 0, sizeof(varname)); + + if(sscanf(variable, "$\(%[a-z-A-Z-0-9-_])", &varname[0]) == 1) + found = 1; + else if(sscanf(variable, "$\{%[a-z-A-Z-0-9-_]}", &varname[0]) == 1) + found = 1; + else if(sscanf(variable, "$%[a-z-A-Z-0-9-_]", &varname[0]) == 1) + found = 1; + + if(found) { + char *envvar; + + if((envvar = getenv(varname))) { + snprintf(buffer, sizeof(buffer), "%s", envvar); + + return &buffer[0]; + } + } + + if(found) { + static const char day_names[] = "SunMonTueWedThuFriSat"; + static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; + + found = 0; + if(!strncasecmp(varname, "result", 6)) { + snprintf(buffer, sizeof(buffer), "%d", toxine_get_last_int_result(tox)); + found = 1; + } + else if(!strncasecmp(varname, "cresult", 7)) { + snprintf(buffer, sizeof(buffer), "%s", toxine_get_last_char_result(tox)); + found = 1; + } + else if(!strncasecmp(varname, "cxresult", 7)) { + char *p = toxine_get_last_char_result(tox); + if(p) { + int val = strtol(p, &p, 10); + snprintf(buffer, sizeof(buffer), "0x%x", val); + } + else + snprintf(buffer, sizeof(buffer), "Nothing available"); + found = 1; + } + else if(!strncasecmp(varname, "iresult", 7)) { + snprintf(buffer, sizeof(buffer), "%d", toxine_get_last_int_result(tox)); + found = 1; + } + else if(!strncasecmp(varname, "xresult", 7)) { + snprintf(buffer, sizeof(buffer), "0x%x", toxine_get_last_int_result(tox)); + found = 1; + } + else if(!strncasecmp(varname, "version", 7)) { + snprintf(buffer, sizeof(buffer), "%s", VERSION); + found = 1; + } + else if(!strncasecmp(varname, "date", 4)) { + time_t curtime; + struct tm *lt; + + time(&curtime); + lt = localtime(&curtime); + snprintf(buffer, sizeof(buffer), "%-3.3s %-3.3s %d %d", + day_names + 3 * lt->tm_wday, month_names + 3 * lt->tm_mon, + lt->tm_mday, (lt->tm_year + 1900)); + found = 1; + } + else if(!strncasecmp(varname, "time", 4)) { + time_t curtime; + struct tm *lt; + + time(&curtime); + lt = localtime(&curtime); + snprintf(buffer, sizeof(buffer), "%02d:%02d:%02d", lt->tm_hour, lt->tm_min, lt->tm_sec); + found = 1; + } + else if(!strncasecmp(varname, "config_file", 11)) { + snprintf(buffer, sizeof(buffer), "%s", (tox->configfile) ? tox->configfile : "UNSET"); + found = 1; + } + else if(!strncasecmp(varname, "video_driver", 12)) { + snprintf(buffer, sizeof(buffer), "%s", (tox->video.name) ? tox->video.name : "UNSET"); + found = 1; + } + else if(!strncasecmp(varname, "audio_driver", 12)) { + snprintf(buffer, sizeof(buffer), "%s", (tox->audio.name) ? tox->audio.name : "UNSET"); + found = 1; + } + else if(!strncasecmp(varname, "mrl", 3)) { + snprintf(buffer, sizeof(buffer), "%s", (tox->current_mrl) ? tox->current_mrl : "UNSET"); + found = 1; + } + else if(!strncasecmp(varname, "script_file", 11)) { + snprintf(buffer, sizeof(buffer), "%s", (tox->script.filename) ? tox->script.filename : "UNSET"); + found = 1; + } + else { + char *p = varname; + int isargv = 1; + + + while(p && *p != '\0') { + if(!isdigit(*p)) { + isargv = 0; + break; + } + p++; + } + + if(isargv) { + char *p = varname; + int val = strtol(p, &p, 10); + + if((val >= 0) && (val < tox->argc)) { + snprintf(buffer, sizeof(buffer), "%s", tox->argv[val]); + found = 1; + } + } + } + + if(found) + return &buffer[0]; + + } + } + } + + return NULL; +} Index: utils.h =================================================================== RCS file: /cvsroot/toxine/toxine/src/utils.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- utils.h 7 Apr 2004 18:21:07 -0000 1.12 +++ utils.h 16 May 2004 20:28:40 -0000 1.13 @@ -55,4 +55,6 @@ void toxine_show_stream_info(int info_type, uint32_t iinfo); +char *toxine_get_var(toxine_t *tox, const char *var); + #endif |