Mercurial > mplayer.hg
changeset 9791:c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
Add on/off for flag params
Remove the span stuff (unused, never finished, etc)
Add object setting option (syntax like -vf but with a settable separator)
Add a 'custom url' option type (url where each part can be any kind of
option)
Replace all exit() with a return code, exit will be done in the cmd line parser
author | albeu |
---|---|
date | Wed, 02 Apr 2003 16:11:15 +0000 |
parents | 864cdb2debb0 |
children | 4c34dc17e43d |
files | m_option.c m_option.h |
diffstat | 2 files changed, 294 insertions(+), 140 deletions(-) [+] |
line wrap: on
line diff
--- a/m_option.c Wed Apr 02 16:05:21 2003 +0000 +++ b/m_option.c Wed Apr 02 16:11:15 2003 +0000 @@ -76,6 +76,7 @@ static int parse_flag(m_option_t* opt,char *name, char *param, void* dst, int src) { if (src == M_CONFIG_FILE) { if (!strcasecmp(param, "yes") || /* any other language? */ + !strcasecmp(param, "on") || !strcasecmp(param, "ja") || !strcasecmp(param, "si") || !strcasecmp(param, "igen") || @@ -85,6 +86,7 @@ !strcmp(param, "1")) { if(dst) VAL(dst) = opt->max; } else if (!strcasecmp(param, "no") || + !strcasecmp(param, "off") || !strcasecmp(param, "nein") || !strcasecmp(param, "nicht") || !strcasecmp(param, "nem") || @@ -797,7 +799,7 @@ mp_msg(MSGT_CFGPARSER, MSGL_INFO, "%s", (char *) opt->p); if(opt->priv == NULL) - exit(1); // Call something else instead ?? + return M_OPT_EXIT; return 1; } @@ -959,7 +961,7 @@ for(i = 0 ; mp_imgfmt_list[i].name ; i++) mp_msg(MSGT_CFGPARSER, MSGL_INFO, " %s",mp_imgfmt_list[i].name); mp_msg(MSGT_CFGPARSER, MSGL_INFO, "\n"); - exit(0); + return M_OPT_EXIT; } for(i = 0 ; mp_imgfmt_list[i].name ; i++) { @@ -992,115 +994,6 @@ NULL }; -/// Span stuff : Not finished -static int parse_play_pos(m_play_pos_t* pos,char* opt, char *s) { - char *ep; - long tmp; - int i; - - memset(pos,0,sizeof(m_play_pos_t)); - - if(!s || s[0] == '\0') - return M_OPT_MISSING_PARAM; - - // Track index - tmp = strtol(s, &ep, 0); - if(ep != s) { - if(tmp < 1) { - mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Track/Chapter index must be > 0\n", opt); - return M_OPT_OUT_OF_RANGE; - } - pos->idx = tmp; - if(ep[0] == '\0') - return 1; - s = ep; - } - - // Span - tmp = strlen(s); - if(s[0] != '[' || s[tmp-1] != ']') { - mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid argument ?\n", opt); - return M_OPT_INVALID; - } - s[tmp-1] = '\0'; - s++; - - // hh:mm:ss - for( i = 2 ; i >= 0 && s[0] != 0 ; i--) { - if(s[0] == ':') { - tmp = 0; - s++; - } else { - tmp = strtol(s, &ep, 0); - if(tmp < 0 || (ep[0] != '\0' && ep[0] != (i > 0 ? ':' : '.') )) { - mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid argument ?\n", opt); - return M_OPT_INVALID; - } - pos->seconds += tmp * pow(60,i); - s = ep; - if(s[0] != '\0') - s++; - - } - } - - // sectors - if(s[0]) { - tmp = strtol(s, &ep, 0); - if(tmp < 0 || ep[0] != '\0') { - mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid argument ?\n", opt); - return M_OPT_INVALID; - } - pos->sectors = tmp; - } - - return 1; -} - - -static int parse_span(m_option_t* opt,char *name, char *param, void* dst, int src) { - m_span_t* span = dst; - char *s = param,*e = NULL; - int r = M_OPT_INVALID; - - if(param == NULL) - return M_OPT_MISSING_PARAM; - - e = strchr(param,'-'); - if(e) { - e[0] = '\0'; - e++; - } - - if(s[0] == '\0' && e[0] == '\0') { - mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid argument\n"); - return M_OPT_INVALID; - } - - if(s[0]) { - r = parse_play_pos(&span->start,name,s); - if(r < 0) return r; - } - if(e && e[0] != '\0') - r = parse_play_pos(&span->end,name,s); - - return r; -} - -m_option_type_t m_option_type_span = { - "Span", - "The syntax is 1[hh:mm:ss.zz]-5[hh:mm:ss.zz]", - sizeof(m_span_t), - 0, - parse_span, - NULL, - copy_opt, - copy_opt, - NULL, - NULL -}; - - //// Objects (ie filters, etc) settings #include "m_struct.h" @@ -1174,7 +1067,7 @@ } static int get_obj_params(char* opt_name, char* name,char* params, - m_struct_t* desc,char*** _ret) { + m_struct_t* desc,char separator, char*** _ret) { int n = 0,nold = 0, nopts,r; char* ptr,*last_ptr = params,*eq; char** ret; @@ -1183,8 +1076,7 @@ char min[50],max[50]; if(!desc->fields) { printf("%s doesn't have any options\n\n",name); - //exit_player(); - exit(0); + return M_OPT_EXIT; } printf("\n Name Type Min Max\n\n"); for(n = 0 ; desc->fields[n].name ; n++) { @@ -1205,8 +1097,7 @@ max); } printf("\n"); - //exit_player() isn't avaible in mencoder - exit(0); + return M_OPT_EXIT; } for(nopts = 0 ; desc->fields[nopts].name ; nopts++) @@ -1215,15 +1106,20 @@ // TODO : Check that each opt can be parsed r = 1; while(last_ptr && last_ptr[0] != '\0') { - ptr = strchr(last_ptr,':'); + ptr = strchr(last_ptr,separator); if(!ptr) { r = get_obj_param(opt_name,name,desc,last_ptr,&nold,nopts,NULL); n++; break; } + if(ptr == last_ptr) { // Empty field, count it and go on + nold++; + last_ptr = ptr+1; + continue; + } ptr[0] = '\0'; r = get_obj_param(opt_name,name,desc,last_ptr,&nold,nopts,NULL); - ptr[0] = ':'; + ptr[0] = separator; if(r < 0) break; n++; last_ptr = ptr+1; @@ -1237,12 +1133,17 @@ last_ptr = params; while(last_ptr && last_ptr[0] != '\0') { - ptr = strchr(last_ptr,':'); + ptr = strchr(last_ptr,separator); if(!ptr) { get_obj_param(opt_name,name,desc,last_ptr,&nold,nopts,&ret[n*2]); n++; break; } + if(ptr == last_ptr) { // Empty field, count it and go on + last_ptr = ptr+1; + nold++; + continue; + } ptr[0] = '\0'; get_obj_param(opt_name,name,desc,last_ptr,&nold,nopts,&ret[n*2]); n++; @@ -1254,6 +1155,64 @@ return 1; } +static int parse_obj_params(m_option_t* opt,char *name, + char *param, void* dst, int src) { + char** opts; + int r; + m_obj_params_t* p = opt->priv; + m_struct_t* desc = p->desc; + char* cpy = strdup(param); + + // We need the object desc + if(!p) + return M_OPT_INVALID; + + r = get_obj_params(name,desc->name,cpy,desc,p->separator,&opts); + free(cpy); + if(r < 0) + return r; + if(!dst) + return 1; + + for(r = 0 ; opts[r] ; r += 2) + m_struct_set(desc,dst,opts[r],opts[r+1]); + + return 1; +} + + +m_option_type_t m_option_type_obj_params = { + "Object params", + "", + 0, + 0, + parse_obj_params, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/// Some predefined types as a definition is quiet lenthy + +/// Span arguments +static m_span_t m_span_params_dflts = { -1, -1 }; +static m_option_t m_span_params_fields[] = { + {"start", M_ST_OFF(m_span_t,start), CONF_TYPE_INT, M_OPT_MIN, 1 ,0, NULL}, + {"end", M_ST_OFF(m_span_t,end), CONF_TYPE_INT, M_OPT_MIN , 1 ,0, NULL}, + { NULL, NULL, 0, 0, 0, 0, NULL } +}; +static struct m_struct_st m_span_opts = { + "m_span", + sizeof(m_span_t), + &m_span_params_dflts, + m_span_params_fields +}; +m_obj_params_t m_span_params_def = { + &m_span_opts, + '-' +}; static int parse_obj_settings(char* opt,char* str,m_obj_list_t* list, m_obj_settings_t **_ret, int ret_n) { @@ -1284,7 +1243,7 @@ plist[0] = strdup("_oldargs_"); plist[1] = strdup(param); } else if(desc) { - r = get_obj_params(opt,str,param,desc,_ret ? &plist : NULL); + r = get_obj_params(opt,str,param,desc,':',_ret ? &plist : NULL); if(r < 0) return r; } @@ -1322,7 +1281,7 @@ mp_msg(MSGT_VFILTER,MSGL_INFO," %-15s: %s\n", M_ST_MB(char*,ol->list[n],ol->name_off), M_ST_MB(char*,ol->list[n],ol->info_off)); - exit(0); + return M_OPT_EXIT; } ptr = str = strdup(param); @@ -1446,7 +1405,7 @@ pre += s) mp_msg(MSGT_CFGPARSER, MSGL_ERR, " %s",pre_name); mp_msg(MSGT_CFGPARSER, MSGL_ERR, "\n"); - exit(0); + return M_OPT_EXIT; } for(pre_name = M_ST_MB(char*,pre,obj_p->name_off) ; pre_name ; @@ -1491,4 +1450,197 @@ NULL }; +static int parse_custom_url(m_option_t* opt,char *name, + char *url, void* dst, int src) { + int pos1, pos2, r; + char *ptr1=NULL, *ptr2=NULL, *ptr3=NULL; + m_struct_t* desc = opt->priv; + + if(!desc) { + mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: customs url need a pointer to a m_struct_t in the priv field\n",name); + return M_OPT_PARSER_ERR; + } + + // extract the protocol + ptr1 = strstr(url, "://"); + if( ptr1==NULL ) { + // Filename only + if(m_option_list_find(desc->fields,"filename")) { + m_struct_set(desc,dst,"filename",url); + return 1; + } + mp_msg(MSGT_CFGPARSER, MSGL_ERR,"Option %s: url doesn't have a valid protocol!\n",name); + return M_OPT_INVALID; + } + pos1 = ptr1-url; + if(dst && m_option_list_find(desc->fields,"protocol")) { + ptr1[0] = '\0'; + r = m_struct_set(desc,dst,"protocol",url); + ptr1[0] = ':'; + if(r < 0) { + mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: error while setting protocol\n",name); + return r; + } + } + + // jump the "://" + ptr1 += 3; + pos1 += 3; + + // check if a username:password is given + ptr2 = strstr(ptr1, "@"); + ptr3 = strstr(ptr1, "/"); + if( ptr3!=NULL && ptr3<ptr2 ) { + // it isn't really a username but rather a part of the path + ptr2 = NULL; + } + if( ptr2!=NULL ) { + + // We got something, at least a username... + int len = ptr2-ptr1; + if(!m_option_list_find(desc->fields,"username")) { + mp_msg(MSGT_CFGPARSER, MSGL_WARN, "Option %s: this url doesn't have a username part\n",name); + // skip + } else { + ptr3 = strstr(ptr1, ":"); + if( ptr3!=NULL && ptr3<ptr2 ) { + // We also have a password + int len2 = ptr2-ptr3-1; + if(!m_option_list_find(desc->fields,"password")) { + mp_msg(MSGT_CFGPARSER, MSGL_WARN, "Option %s: this url doesn't have a password part part\n",name); + // skip + } else { // Username and password + if(dst) { + ptr3[0] = '\0'; + r = m_struct_set(desc,dst,"username",ptr1); + ptr3[0] = ':'; + if(r < 0) { + mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: error while setting username\n",name); + return r; + } + ptr2[0] = '\0'; + r = m_struct_set(desc,dst,"password",ptr3+1); + ptr2[0] = '@'; + if(r < 0) { + mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: error while setting password\n",name); + return r; + } + } + } + } else { // User name only + ptr2[0] = '\0'; + r = m_struct_set(desc,dst,"username",ptr1); + ptr2[0] = '@'; + if(r < 0) { + mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: error while setting username\n",name); + return r; + } + } + } + } + + // before looking for a port number check if we have an IPv6 type numeric address + // in IPv6 URL the numeric address should be inside square braces. + ptr2 = strstr(ptr1, "["); + ptr3 = strstr(ptr1, "]"); + if( ptr2!=NULL && ptr3!=NULL ) { + // we have an IPv6 numeric address + ptr1++; + pos1++; + ptr2 = ptr3; + } else { + ptr2 = ptr1; + } + + // look if the port is given + ptr2 = strstr(ptr2, ":"); + // If the : is after the first / it isn't the port + ptr3 = strstr(ptr1, "/"); + if(ptr3 && ptr3 - ptr2 < 0) ptr2 = NULL; + if( ptr2==NULL ) { + // No port is given + // Look if a path is given + if( ptr3==NULL ) { + // No path/filename + // So we have an URL like http://www.hostname.com + pos2 = strlen(url); + } else { + // We have an URL like http://www.hostname.com/file.txt + pos2 = ptr3-url; + } + } else { + // We have an URL beginning like http://www.hostname.com:1212 + // Get the port number + if(!m_option_list_find(desc->fields,"port")) { + mp_msg(MSGT_CFGPARSER, MSGL_WARN, "Option %s: this url doesn't have a port part part\n",name); + // skip + } else { + if(dst) { + int p = atoi(ptr2+1); + char tmp[100]; + snprintf(tmp,99,"%d",p); + r = m_struct_set(desc,dst,"port",tmp); + if(r < 0) { + mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: error while setting port\n",name); + return r; + } + } + } + pos2 = ptr2-url; + } + if( strstr(ptr1, "]")!=NULL ) pos2--; + // Get the hostname + if(pos2-pos1 > 0) { + if(!m_option_list_find(desc->fields,"hostname")) { + mp_msg(MSGT_CFGPARSER, MSGL_WARN, "Option %s: this url doesn't have a hostname part\n",name); + // skip + } else { + char tmp[pos2-pos1+1]; + strncpy(tmp,ptr1, pos2-pos1); + tmp[pos2-pos1] = '\0'; + r = m_struct_set(desc,dst,"hostname",tmp); + if(r < 0) { + mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: error while setting hostname\n",name); + return r; + } + } + } + // Look if a path is given + ptr2 = strstr(ptr1, "/"); + if( ptr2!=NULL ) { + // A path/filename is given + // check if it's not a trailing '/' + if( strlen(ptr2)>1 ) { + // copy the path/filename in the URL container + if(!m_option_list_find(desc->fields,"filename")) { + mp_msg(MSGT_CFGPARSER, MSGL_WARN, "Option %s: this url doesn't have a hostname part part\n"); + // skip + } else { + if(dst) { + r = m_struct_set(desc,dst,"filename",ptr2); + if(r < 0) { + mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: error while setting filename\n"); + return r; + } + } + } + } + } + return 1; +} + +/// TODO : Write the other needed funcs for 'normal' options +m_option_type_t m_option_type_custom_url = { + "Custom URL", + "", + 0, + 0, + parse_custom_url, + NULL, + NULL, + NULL, + NULL, + NULL +}; + #endif
--- a/m_option.h Wed Apr 02 16:05:21 2003 +0000 +++ b/m_option.h Wed Apr 02 16:11:15 2003 +0000 @@ -37,22 +37,6 @@ typedef m_opt_func_param_t cfg_func_param_t; typedef m_opt_func_t cfg_func_t; -// Track/Chapter range -// accept range in the form 1[hh:mm:ss.zz]-5[hh:mm:ss.zz] -// ommited fields are assumed to be 0 -// Not finished !!!! -typedef struct { - int idx; // in the e.g 1 or 5 - unsigned int seconds; // hh:mm:ss converted in seconds - unsigned int sectors; // zz -} m_play_pos_t; - -typedef struct { - m_play_pos_t start; - m_play_pos_t end; -} m_span_t; -extern m_option_type_t m_option_type_span; - typedef struct { void** list; void* name_off; @@ -70,13 +54,28 @@ typedef struct { - struct m_struct* in_desc; - struct m_struct* out_desc; + struct m_struct_st* in_desc; + struct m_struct_st* out_desc; void* presets; // Pointer to an arry of struct defined by in_desc void* name_off; // Offset of the preset name inside the in_struct } m_obj_presets_t; extern m_option_type_t m_option_type_obj_presets; +extern m_option_type_t m_option_type_custom_url; + +typedef struct { + struct m_struct_st* desc; // Fields description + char separator; // Field separator to use +} m_obj_params_t; +extern m_option_type_t m_option_type_obj_params; + +typedef struct { + int start; + int end; +} m_span_t; +extern m_obj_params_t m_span_params_def; + + // Don't be stupid keep tho old names ;-) #define CONF_TYPE_FLAG (&m_option_type_flag) #define CONF_TYPE_INT (&m_option_type_int) @@ -94,6 +93,8 @@ #define CONF_TYPE_SPAN (&m_option_type_span) #define CONF_TYPE_OBJ_SETTINGS_LIST (&m_option_type_obj_settings_list) #define CONF_TYPE_OBJ_PRESETS (&m_option_type_obj_presets) +#define CONF_TYPE_CUSTOM_URL (&m_option_type_custom_url) +#define CONF_TYPE_OBJ_PARAMS (&m_option_type_obj_params) ///////////////////////////////////////////////////////////////////////////////////////////// @@ -206,6 +207,7 @@ #define M_OPT_INVALID -3 #define M_OPT_OUT_OF_RANGE -4 #define M_OPT_PARSER_ERR -5 +#define M_OPT_EXIT -6 m_option_t* m_option_list_find(m_option_t* list,char* name);