summaryrefslogtreecommitdiffstats
path: root/parser-mecmd.c
diff options
context:
space:
mode:
authoralbeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-11-12 01:56:42 +0000
committeralbeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-11-12 01:56:42 +0000
commit126725660d4bebbab8570221c5681dc01d98fe86 (patch)
tree3ebdca9acf6fae38bfdba5b4159fbd16177da828 /parser-mecmd.c
parent0f622e2d6fe735d727b9d8fd12cea22e03fd954b (diff)
downloadmpv-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.c153
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