static bool parse_flag(bstr name, bstr f) { struct m_option opt = {NULL, NULL, CONF_TYPE_FLAG, 0, 0, 1, NULL}; int val = 0; m_option_parse(&opt, name, f, &val); return !!val; }
static stream_t *open_stream_plugin(const stream_info_t *sinfo, const char *filename, int mode, struct MPOpts *options, int *file_format, int *ret, char **redirected_url) { void* arg = NULL; stream_t* s; m_struct_t* desc = (m_struct_t*)sinfo->opts; // Parse options if(desc) { arg = m_struct_alloc(desc); if(sinfo->opts_url) { m_option_t url_opt = { "stream url", arg , CONF_TYPE_CUSTOM_URL, 0, 0 ,0, (void *)sinfo->opts }; if (m_option_parse(&url_opt, bstr("stream url"), bstr(filename), false, arg) < 0) { mp_tmsg(MSGT_OPEN,MSGL_ERR, "URL parsing failed on url %s\n",filename); m_struct_free(desc,arg); return NULL; } } } s = new_stream(-2,-2); s->opts = options; s->url=strdup(filename); s->flags |= mode; *ret = sinfo->open(s,mode,arg,file_format); if((*ret) != STREAM_OK) { #ifdef CONFIG_NETWORKING if (*ret == STREAM_REDIRECTED && redirected_url) { if (s->streaming_ctrl && s->streaming_ctrl->url && s->streaming_ctrl->url->url) *redirected_url = strdup(s->streaming_ctrl->url->url); else *redirected_url = NULL; } streaming_ctrl_free(s->streaming_ctrl); #endif free(s->url); free(s); return NULL; } if(s->type <= -2) mp_msg(MSGT_OPEN,MSGL_WARN, "Warning streams need a type !!!!\n"); if(s->flags & MP_STREAM_SEEK && !s->seek) s->flags &= ~MP_STREAM_SEEK; if(s->seek && !(s->flags & MP_STREAM_SEEK)) s->flags |= MP_STREAM_SEEK; s->mode = mode; mp_msg(MSGT_OPEN,MSGL_V, "STREAM: [%s] %s\n",sinfo->name,filename); mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Description: %s\n",sinfo->info); mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Author: %s\n", sinfo->author); mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Comment: %s\n", sinfo->comment); return s; }
stream_t* open_stream_plugin(stream_info_t* sinfo,char* filename,int mode, char** options, int* file_format, int* ret) { void* arg = NULL; stream_t* s; m_struct_t* desc = (m_struct_t*)sinfo->opts; // Parse options if(desc) { arg = m_struct_alloc(desc); if(sinfo->opts_url) { m_option_t url_opt = { "stream url", arg , CONF_TYPE_CUSTOM_URL, 0, 0 ,0, sinfo->opts }; if(m_option_parse(&url_opt,"stream url",filename,arg,M_CONFIG_FILE) < 0) { mp_msg(MSGT_OPEN,MSGL_ERR, "URL parsing failed on url %s\n",filename); m_struct_free(desc,arg); return NULL; } } if(options) { int i; for(i = 0 ; options[i] != NULL ; i += 2) { mp_msg(MSGT_OPEN,MSGL_DBG2, "Set stream arg %s=%s\n", options[i],options[i+1]); if(!m_struct_set(desc,arg,options[i],options[i+1])) mp_msg(MSGT_OPEN,MSGL_WARN, "Failed to set stream option %s=%s\n", options[i],options[i+1]); } } } s = new_stream(-2,-2); s->url=strdup(filename); s->flags |= mode; *ret = sinfo->open(s,mode,arg,file_format); if((*ret) != STREAM_OK) { free(s->url); free(s); return NULL; } if(s->type <= -2) mp_msg(MSGT_OPEN,MSGL_WARN, "Warning streams need a type !!!!\n"); if(s->flags & STREAM_SEEK && !s->seek) s->flags &= ~STREAM_SEEK; if(s->seek && !(s->flags & STREAM_SEEK)) s->flags |= STREAM_SEEK; s->mode = mode; mp_msg(MSGT_OPEN,MSGL_V, "STREAM: [%s] %s\n",sinfo->name,filename); mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Description: %s\n",sinfo->info); mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Author: %s\n", sinfo->author); mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Comment: %s\n", sinfo->comment); return s; }
static stream_t* open_stream_plugin(const stream_info_t* sinfo, const char* filename, int mode, char** options, int* file_format, int* ret, char** redirected_url) { void* arg = NULL; stream_t* s; m_struct_t* desc = (m_struct_t*)sinfo->opts; // Parse options if(desc) { arg = m_struct_alloc(desc); if(sinfo->opts_url) { m_option_t url_opt = { "stream url", arg , CONF_TYPE_CUSTOM_URL, 0, 0 ,0, sinfo->opts }; if(m_option_parse(&url_opt,"stream url",filename,arg,M_CONFIG_FILE) < 0) { mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_URLParsingFailed,filename); m_struct_free(desc,arg); return NULL; } } if(options) { int i; for(i = 0 ; options[i] != NULL ; i += 2) { mp_msg(MSGT_OPEN,MSGL_DBG2, "Set stream arg %s=%s\n", options[i],options[i+1]); if(!m_struct_set(desc,arg,options[i],options[i+1])) mp_msg(MSGT_OPEN,MSGL_WARN, MSGTR_FailedSetStreamOption, options[i],options[i+1]); } } } s = new_stream(-2,-2); s->capture_file = NULL; s->url=strdup(filename); s->flags |= mode; *ret = sinfo->open(s,mode,arg,file_format); if((*ret) != STREAM_OK) { #ifdef CONFIG_NETWORKING if (*ret == STREAM_REDIRECTED && redirected_url) { if (s->streaming_ctrl && s->streaming_ctrl->url && s->streaming_ctrl->url->url) *redirected_url = strdup(s->streaming_ctrl->url->url); else *redirected_url = NULL; } streaming_ctrl_free(s->streaming_ctrl); #endif free(s->url); free(s); return NULL; } if(s->type <= -2) mp_msg(MSGT_OPEN,MSGL_WARN, MSGTR_StreamNeedType); if(s->flags & MP_STREAM_SEEK && !s->seek) s->flags &= ~MP_STREAM_SEEK; if(s->seek && !(s->flags & MP_STREAM_SEEK)) s->flags |= MP_STREAM_SEEK; s->mode = mode; mp_msg(MSGT_OPEN,MSGL_V, "STREAM: [%s] %s\n",sinfo->name,filename); mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Description: %s\n",sinfo->info); mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Author: %s\n", sinfo->author); mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Comment: %s\n", sinfo->comment); return s; }
static int parse_subconf(const m_option_t* opt,const char *name, char *param, void* dst, int src) { char *subparam; char *subopt; int nr = 0,i,r; const m_option_t *subopts; const char *p; char** lst = NULL; if (param == NULL || strlen(param) == 0) return M_OPT_MISSING_PARAM; subparam = malloc(strlen(param)+1); subopt = malloc(strlen(param)+1); p = param; subopts = opt->p; while(p[0]) { int sscanf_ret = 1; int optlen = strcspn(p, ":="); /* clear out */ subopt[0] = subparam[0] = 0; av_strlcpy(subopt, p, optlen + 1); p = &p[optlen]; if (p[0] == '=') { sscanf_ret = 2; p = &p[1]; if (p[0] == '"') { p = &p[1]; optlen = strcspn(p, "\""); av_strlcpy(subparam, p, optlen + 1); p = &p[optlen]; if (p[0] != '"') { mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Terminating '\"' missing for '%s'\n", subopt); return M_OPT_INVALID; } p = &p[1]; } else if (p[0] == '%') { p = &p[1]; optlen = (int)strtol(p, (char**)&p, 0); if (!p || p[0] != '%' || (optlen > strlen(p) - 1)) { mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Invalid length %i for '%s'\n", optlen, subopt); return M_OPT_INVALID; } p = &p[1]; av_strlcpy(subparam, p, optlen + 1); p = &p[optlen]; } else { optlen = strcspn(p, ":"); av_strlcpy(subparam, p, optlen + 1); p = &p[optlen]; } } if (p[0] == ':') p = &p[1]; else if (p[0]) { mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Incorrect termination for '%s'\n", subopt); return M_OPT_INVALID; } switch(sscanf_ret) { case 1: subparam[0] = 0; case 2: for(i = 0 ; subopts[i].name ; i++) { if(!strcmp(subopts[i].name,subopt)) break; } if(!subopts[i].name) { mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Unknown suboption %s\n",name,subopt); return M_OPT_UNKNOWN; } r = m_option_parse(&subopts[i],subopt, subparam[0] == 0 ? NULL : subparam,NULL,src); if(r < 0) return r; if(dst) { lst = (char**)realloc(lst,2 * (nr+2) * sizeof(char*)); lst[2*nr] = strdup(subopt); lst[2*nr+1] = subparam[0] == 0 ? NULL : strdup(subparam); memset(&lst[2*(nr+1)],0,2*sizeof(char*)); nr++; } break; } } free(subparam); free(subopt); if(dst) VAL(dst) = lst; return 1; }
static int m_config_parse_option(const m_config_t *config, char *arg, char *param, int set) { m_config_option_t *co; int r = 0; #ifdef MP_DEBUG assert(config != NULL); assert(config->lvl > 0); assert(arg != NULL); #endif co = m_config_get_co(config,arg); if(!co){ // mp_msg(MSGT_CFGPARSER, MSGL_ERR,"Unknown option: %s\n",arg); return M_OPT_UNKNOWN; } #ifdef MP_DEBUG // This is the only mandatory function assert(co->opt->type->parse); #endif // Check if this option isn't forbidden in the current mode if((config->mode == M_CONFIG_FILE) && (co->opt->flags & M_OPT_NOCFG)) { mp_msg(MSGT_CFGPARSER, MSGL_ERR,MSGTR_InvalidCfgfileOption,arg); return M_OPT_INVALID; } if((config->mode == M_COMMAND_LINE) && (co->opt->flags & M_OPT_NOCMD)) { mp_msg(MSGT_CFGPARSER, MSGL_ERR,MSGTR_InvalidCmdlineOption,arg); return M_OPT_INVALID; } // During command line preparse set only pre-parse options // Otherwise only set pre-parse option if they were not already set. if(((config->mode == M_COMMAND_LINE_PRE_PARSE) && !(co->opt->flags & M_OPT_PRE_PARSE)) || ((config->mode != M_COMMAND_LINE_PRE_PARSE) && (co->opt->flags & M_OPT_PRE_PARSE) && (co->flags & M_CFG_OPT_SET))) set = 0; // Option with children are a bit different to parse if(co->opt->type->flags & M_OPT_TYPE_HAS_CHILD) { char** lst = NULL; int i,sr; // Parse the child options r = m_option_parse(co->opt,arg,param,&lst,M_COMMAND_LINE); // Set them now if(r >= 0) for(i = 0 ; lst && lst[2*i] ; i++) { int l = strlen(co->name) + 1 + strlen(lst[2*i]) + 1; if(r >= 0) { // Build the full name char n[l]; sprintf(n,"%s:%s",co->name,lst[2*i]); sr = m_config_parse_option(config,n,lst[2*i+1],set); if(sr < 0){ if(sr == M_OPT_UNKNOWN){ mp_msg(MSGT_CFGPARSER, MSGL_ERR,MSGTR_InvalidSuboption,co->name,lst[2*i]); r = M_OPT_INVALID; } else if(sr == M_OPT_MISSING_PARAM){ mp_msg(MSGT_CFGPARSER, MSGL_ERR,MSGTR_MissingSuboptionParameter,lst[2*i],co->name); r = M_OPT_INVALID; } else r = sr; } } free(lst[2*i]); free(lst[2*i+1]); } free(lst); } else r = m_option_parse(co->opt,arg,param,set ? co->slots->data : NULL,config->mode); // Parsing failed ? if(r < 0) return r; // Set the option if(set) { m_option_set(co->opt,co->opt->p,co->slots->data); co->flags |= M_CFG_OPT_SET; } return r; }