Merge svn changes up to r28728
[mplayer.git] / parser-mecmd.c
blob6229022dfc49e33ce93d46bf51f490440965f9ad
2 /// \file
3 /// \ingroup ConfigParsers MEntry
5 #include "config.h"
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <errno.h>
12 #ifdef MP_DEBUG
13 #include <assert.h>
14 #endif
16 #include "mp_msg.h"
17 #include "help_mp.h"
18 #include "m_option.h"
19 #include "m_config.h"
20 #include "parser-mecmd.h"
22 void
23 m_entry_list_free(m_entry_t* lst) {
24 int i,j;
26 for(i = 0 ; lst[i].name != NULL ; i++){
27 free(lst[i].name);
28 for(j = 0 ; lst[i].opts[2*j] != NULL ; j++) {
29 free(lst[i].opts[2*j]);
30 free(lst[i].opts[2*j+1]);
32 free(lst[i].opts);
34 free(lst);
37 int
38 m_entry_set_options(m_config_t *config, m_entry_t* entry) {
39 int i,r;
41 for(i = 0 ; entry->opts[2*i] != NULL ; i++){
42 r = m_config_set_option(config,entry->opts[2*i],entry->opts[2*i+1]);
43 if(r < 0)
44 return 0;
46 return 1;
52 m_entry_t*
53 m_config_parse_me_command_line(m_config_t *config, int argc, char **argv)
55 int i,nf = 0,no = 0;
56 int tmp;
57 char *opt;
58 int no_more_opts = 0;
59 int opt_exit = 0;
60 m_entry_t *lst = NULL, *entry = NULL;
62 #ifdef MP_DEBUG
63 assert(config != NULL);
64 assert(argv != NULL);
65 assert(argc >= 1);
66 #endif
68 config->mode = M_COMMAND_LINE;
70 lst = calloc(1,sizeof(m_entry_t));
72 for (i = 1; i < argc; i++) {
73 //next:
74 opt = argv[i];
75 /* check for -- (no more options id.) except --help! */
76 if ((*opt == '-') && (*(opt+1) == '-') && (*(opt+2) == 0))
78 no_more_opts = 1;
79 if (i+1 >= argc)
81 mp_msg(MSGT_CFGPARSER, MSGL_ERR, MSGTR_NoFileGivenOnCommandLine);
82 goto err_out;
84 continue;
87 if ((no_more_opts == 0) && (*opt == '-') && (*(opt+1) != 0)) /* option */
89 const m_option_t* mp_opt = NULL;
90 /* remove trailing '-' */
91 opt++;
92 mp_msg(MSGT_CFGPARSER, MSGL_DBG3, "this_opt = option: %s\n", opt);
93 mp_opt = m_config_get_option(config,opt);
94 if(!mp_opt) {
95 tmp = M_OPT_UNKNOWN;
96 mp_msg(MSGT_CFGPARSER, MSGL_ERR, MSGTR_NotAnMEncoderOption, opt);
97 goto err_out;
99 if(!entry || (mp_opt->flags & M_OPT_GLOBAL)){
100 tmp = m_config_set_option(config, opt, argv[i + 1]);
101 if (tmp <= M_OPT_EXIT) {
102 opt_exit = 1;
103 tmp = M_OPT_EXIT - tmp;
105 else
106 if(tmp < 0){
107 // mp_msg(MSGT_CFGPARSER, MSGL_ERR, "m_config_set_option() failed (%d)\n",tmp);
108 mp_msg(MSGT_CFGPARSER, MSGL_FATAL, MSGTR_ErrorParsingOptionOnCommandLine, opt);
109 goto err_out;
111 } else {
112 tmp = m_config_check_option(config, opt, argv[i + 1]);
113 if (tmp <= M_OPT_EXIT) {
114 opt_exit = 1;
115 tmp = M_OPT_EXIT - tmp;
117 if(tmp >= 0) {
118 entry->opts = realloc(entry->opts,(no+2)*2*sizeof(char*));
119 entry->opts[2*no] = strdup(opt);
120 entry->opts[2*no+1] = argv[i + 1] ? strdup(argv[i + 1]) : NULL;
121 entry->opts[2*no+2] = entry->opts[2*no+3] = NULL;
122 no++;
123 } else {
124 // mp_msg(MSGT_CFGPARSER, MSGL_ERR, "m_config_set_option() failed (%d)\n",tmp);
125 goto err_out;
128 i += tmp;
129 } else {/* filename */
130 mp_msg(MSGT_CFGPARSER, MSGL_DBG2,"Adding file %s\n",argv[i]);
131 lst = realloc(lst,(nf+2)*sizeof(m_entry_t));
132 lst[nf].name = strdup(argv[i]);
133 lst[nf].opts = calloc(2,sizeof(char*));
134 entry = &lst[nf];
135 no = 0;
136 memset(&lst[nf+1],0,sizeof(m_entry_t));
137 nf++;
141 if (opt_exit)
142 exit(0);
143 if(nf == 0) {
144 m_entry_list_free(lst);
145 mp_msg(MSGT_CFGPARSER, MSGL_ERR, MSGTR_NoFileGiven);
146 return NULL;
148 return lst;
150 err_out:
151 m_entry_list_free(lst);
152 return NULL;