diff options
author | albeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-11-12 01:56:42 +0000 |
---|---|---|
committer | albeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-11-12 01:56:42 +0000 |
commit | 126725660d4bebbab8570221c5681dc01d98fe86 (patch) | |
tree | 3ebdca9acf6fae38bfdba5b4159fbd16177da828 /parser-mecmd.c | |
parent | 0f622e2d6fe735d727b9d8fd12cea22e03fd954b (diff) | |
download | mpv-126725660d4bebbab8570221c5681dc01d98fe86.tar.bz2 mpv-126725660d4bebbab8570221c5681dc01d98fe86.tar.xz |
New config system + cleanup of header inter dependency
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@8165 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'parser-mecmd.c')
-rw-r--r-- | parser-mecmd.c | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/parser-mecmd.c b/parser-mecmd.c new file mode 100644 index 0000000000..fd868e5261 --- /dev/null +++ b/parser-mecmd.c @@ -0,0 +1,153 @@ + +#include "config.h" + +#ifdef NEW_CONFIG + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +#ifdef MP_DEBUG +#include <assert.h> +#endif + +#include "mp_msg.h" +#include "m_option.h" +#include "m_config.h" +#include "parser-mecmd.h" + + +void +m_entry_list_free(m_entry_t* lst) { + int i,j; + + for(i = 0 ; lst[i].name != NULL ; i++){ + free(lst[i].name); + for(j = 0 ; lst[i].opts[2*j] != NULL ; j++) { + free(lst[i].opts[2*j]); + free(lst[i].opts[2*j+1]); + } + free(lst[i].opts); + } + free(lst); +} + +int +m_entry_set_options(m_config_t *config, m_entry_t* entry) { + int i,r; + + for(i = 0 ; entry->opts[2*i] != NULL ; i++){ + r = m_config_set_option(config,entry->opts[2*i],entry->opts[2*i+1]); + if(r < 0) + return 0; + } + return 1; +} + + + + +m_entry_t* +m_config_parse_me_command_line(m_config_t *config, int argc, char **argv) +{ + int i,nf = 0,no = 0; + int tmp; + char *opt; + int no_more_opts = 0; + m_entry_t *lst = NULL, *entry = NULL; + void add_file(char* file) { + mp_msg(MSGT_CFGPARSER, MSGL_DBG2,"Adding file %s\n",argv[i]); + lst = realloc(lst,(nf+2)*sizeof(m_entry_t)); + lst[nf].name = strdup(file); + lst[nf].opts = calloc(2,sizeof(char*)); + entry = &lst[nf]; + no = 0; + memset(&lst[nf+1],0,sizeof(m_entry_t)); + nf++; + } + +#ifdef MP_DEBUG + assert(config != NULL); + assert(argv != NULL); + assert(argc >= 1); +#endif + + config->mode = M_COMMAND_LINE; + + lst = calloc(1,sizeof(m_entry_t)); + + for (i = 1; i < argc; i++) { + //next: + opt = argv[i]; + /* check for -- (no more options id.) except --help! */ + if ((*opt == '-') && (*(opt+1) == '-') && (*(opt+2) != 'h')) + { + no_more_opts = 1; + if (i+1 >= argc) + { + mp_msg(MSGT_CFGPARSER, MSGL_ERR, "You added '--' but no filenames presented!\n"); + goto err_out; + } + continue; + } + + if ((no_more_opts == 0) && (*opt == '-') && (*(opt+1) != 0)) /* option */ + { + m_option_t* mp_opt = NULL; + /* remove trailing '-' */ + opt++; + mp_msg(MSGT_CFGPARSER, MSGL_DBG3, "this_opt = option: %s\n", opt); + mp_opt = m_config_get_option(config,opt); + if(!mp_opt) { + tmp = M_OPT_UNKNOW; + mp_msg(MSGT_CFGPARSER, MSGL_ERR, "%s in not an MEncoder option\n",opt); + goto err_out; + } + // Hack for the -vcd ... options + if(strcasecmp(opt,"vcd") == 0) + add_file("VCD Track"); + if(strcasecmp(opt,"dvd") == 0) + add_file("DVD Title"); + if(strcasecmp(opt,"tv") == 0 && argv[i + 1]) { // TV is a bit more tricky + char* param = argv[i + 1]; + char* on = strstr(param,"on"); + for( ; on ; on = strstr(on + 1,"on")) { + if(on[2] != ':' && on[2] != '\0') continue; + if(on != param && *(on - 1) != ':') continue; + add_file("TV Channel"); + break; + } + } + if(!entry || (mp_opt->flags & M_OPT_GLOBAL)) + tmp = m_config_set_option(config, opt, argv[i + 1]); + else { + tmp = m_config_check_option(config, opt, argv[i + 1]); + if(tmp >= 0) { + entry->opts = realloc(entry->opts,(no+2)*2*sizeof(char*)); + entry->opts[2*no] = strdup(opt); + entry->opts[2*no+1] = argv[i + 1] ? strdup(argv[i + 1]) : NULL; + entry->opts[2*no+2] = entry->opts[2*no+3] = NULL; + no++; + } + } + if (tmp < 0) + goto err_out; + i += tmp; + } else /* filename */ + add_file(argv[i]); + } + + if(nf == 0) { + m_entry_list_free(lst); + mp_msg(MSGT_CFGPARSER, MSGL_ERR, "No file given\n"); + return NULL; + } + return lst; + + err_out: + m_entry_list_free(lst); + return NULL; +} + +#endif |