annotate parser-mpcmd.c @ 30378:8339bca8e4b4

Move the resync-related code into more consistent places instead of having it scattered all over the place with half of it forgotten in some places.
author reimar
date Sun, 24 Jan 2010 15:16:39 +0000
parents 93947ce0e2cb
children c1a3f1bbba26
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18265
1a14fde7680d Doxygen Attack! - Chapter 3
albeu
parents: 18209
diff changeset
1
1a14fde7680d Doxygen Attack! - Chapter 3
albeu
parents: 18209
diff changeset
2 /// \file
1a14fde7680d Doxygen Attack! - Chapter 3
albeu
parents: 18209
diff changeset
3 /// \ingroup ConfigParsers Playtree
1a14fde7680d Doxygen Attack! - Chapter 3
albeu
parents: 18209
diff changeset
4
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
5 #include "config.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
6
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
7 #include <stdio.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
8 #include <stdlib.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
9 #include <string.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
10 #include <errno.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
11
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
12 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
13 #include <assert.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
14 #endif
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
15
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
16 #include "mp_msg.h"
21312
d78e7d5bc6d5 localization of parser-m*cmd.c messages
ptt
parents: 18265
diff changeset
17 #include "help_mp.h"
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
18 #include "m_option.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
19 #include "m_config.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
20 #include "playtree.h"
26263
65d1238b3631 Include some .h files in corresponding .c files
uau
parents: 25227
diff changeset
21 #include "parser-mpcmd.h"
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
22
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
23 static int recursion_depth = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
24 static int mode = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
25
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
26 #define GLOBAL 0
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
27 #define LOCAL 1
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
28 #define DROP_LOCAL 2
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
29
12543
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
30 #define dvd_range(a) (a>0 && a<256)
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
31 #define UNSET_GLOBAL (mode = LOCAL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
32 // Use this 1 if you want to have only global option (no per file option)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
33 // #define UNSET_GLOBAL (mode = GLOBAL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
34
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
35
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
36 static int is_entry_option(char *opt, char *param, play_tree_t** ret) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
37 play_tree_t* entry = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
38
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
39 *ret = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
40
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
41 if(strcasecmp(opt,"playlist") == 0) { // We handle playlist here
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
42 if(!param)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
43 return M_OPT_MISSING_PARAM;
12267
14bdbd687113 Fail if empty or nonexitant playlist
rtognimp
parents: 10595
diff changeset
44
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
45 entry = parse_playlist_file(param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
46 if(!entry)
12267
14bdbd687113 Fail if empty or nonexitant playlist
rtognimp
parents: 10595
diff changeset
47 return -1;
14bdbd687113 Fail if empty or nonexitant playlist
rtognimp
parents: 10595
diff changeset
48 else {
14bdbd687113 Fail if empty or nonexitant playlist
rtognimp
parents: 10595
diff changeset
49 *ret=entry;
14bdbd687113 Fail if empty or nonexitant playlist
rtognimp
parents: 10595
diff changeset
50 return 1;
14bdbd687113 Fail if empty or nonexitant playlist
rtognimp
parents: 10595
diff changeset
51 }
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
52 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
53 return 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
54 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
55
10542
928c02fa9949 fix the bug where only the last file of the command line is found
pl
parents: 10513
diff changeset
56 static inline void add_entry(play_tree_t **last_parentp,
928c02fa9949 fix the bug where only the last file of the command line is found
pl
parents: 10513
diff changeset
57 play_tree_t **last_entryp, play_tree_t *entry) {
928c02fa9949 fix the bug where only the last file of the command line is found
pl
parents: 10513
diff changeset
58 if(*last_entryp == NULL)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28051
diff changeset
59 play_tree_set_child(*last_parentp,entry);
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28051
diff changeset
60 else
10542
928c02fa9949 fix the bug where only the last file of the command line is found
pl
parents: 10513
diff changeset
61 play_tree_append_entry(*last_entryp,entry);
928c02fa9949 fix the bug where only the last file of the command line is found
pl
parents: 10513
diff changeset
62 *last_entryp = entry;
10513
b3f144efb724 c vs c++ syntax
alex
parents: 10397
diff changeset
63 }
b3f144efb724 c vs c++ syntax
alex
parents: 10397
diff changeset
64
18265
1a14fde7680d Doxygen Attack! - Chapter 3
albeu
parents: 18209
diff changeset
65 /// Setup the \ref Config from command line arguments and build a playtree.
1a14fde7680d Doxygen Attack! - Chapter 3
albeu
parents: 18209
diff changeset
66 /** \ingroup ConfigParsers
1a14fde7680d Doxygen Attack! - Chapter 3
albeu
parents: 18209
diff changeset
67 */
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
68 play_tree_t*
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
69 m_config_parse_mp_command_line(m_config_t *config, int argc, char **argv)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
70 {
12543
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
71 int i,j,start_title=-1,end_title=-1;
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
72 char *opt,*splitpos=NULL;
29850
93947ce0e2cb Support the range syntax (like dvd://2-5) also for dvdnav.
reimar
parents: 29263
diff changeset
73 char entbuf[15];
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
74 int no_more_opts = 0;
16345
feb16d0117c8 allow multiple help clauses on the command line, Patch by kiriuja " mplayer-patches AH en-directo POUM net "
gpoirier
parents: 15742
diff changeset
75 int opt_exit = 0; // flag indicating whether mplayer should exit without playing anything
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
76 play_tree_t *last_parent, *last_entry = NULL, *root;
27397
d47744b95b78 Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents: 27394
diff changeset
77 #ifdef CONFIG_MACOSX_FINDER
28051
9e739bdb049c Get rid of pointless 'extern' keywords.
diego
parents: 27397
diff changeset
78 play_tree_t *macosx_finder_args(m_config_t *, int , char **);
13909
07dadc3066f3 add support for macosx finder argument support (let you bundle mplayer to be a finder compliant .app) patch by Chris Roccati <roccati@pobox.com>
nplourde
parents: 12816
diff changeset
79 #endif
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
80
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
81 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
82 assert(config != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
83 assert(argv != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
84 assert(argc >= 1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
85 #endif
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
86
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
87 config->mode = M_COMMAND_LINE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
88 mode = GLOBAL;
27397
d47744b95b78 Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents: 27394
diff changeset
89 #ifdef CONFIG_MACOSX_FINDER
13909
07dadc3066f3 add support for macosx finder argument support (let you bundle mplayer to be a finder compliant .app) patch by Chris Roccati <roccati@pobox.com>
nplourde
parents: 12816
diff changeset
90 root=macosx_finder_args(config, argc, argv);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28051
diff changeset
91 if(root)
13909
07dadc3066f3 add support for macosx finder argument support (let you bundle mplayer to be a finder compliant .app) patch by Chris Roccati <roccati@pobox.com>
nplourde
parents: 12816
diff changeset
92 return root;
07dadc3066f3 add support for macosx finder argument support (let you bundle mplayer to be a finder compliant .app) patch by Chris Roccati <roccati@pobox.com>
nplourde
parents: 12816
diff changeset
93 #endif
07dadc3066f3 add support for macosx finder argument support (let you bundle mplayer to be a finder compliant .app) patch by Chris Roccati <roccati@pobox.com>
nplourde
parents: 12816
diff changeset
94
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
95 last_parent = root = play_tree_new();
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
96 /* in order to work recursion detection properly in parse_config_file */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
97 ++recursion_depth;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
98
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
99 for (i = 1; i < argc; i++) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
100 //next:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
101 opt = argv[i];
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
102 /* check for -- (no more options id.) except --help! */
15245
4fdfe0860cc5 Make "mplayer -- --a" play the file --a instead of bailing out with a useless
reimar
parents: 14541
diff changeset
103 if ((*opt == '-') && (*(opt+1) == '-') && (*(opt+2) == 0))
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
104 {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
105 no_more_opts = 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
106 if (i+1 >= argc)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
107 {
21312
d78e7d5bc6d5 localization of parser-m*cmd.c messages
ptt
parents: 18265
diff changeset
108 mp_msg(MSGT_CFGPARSER, MSGL_ERR, MSGTR_NoFileGivenOnCommandLine);
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
109 goto err_out;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
110 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
111 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
112 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
113 if((opt[0] == '{') && (opt[1] == '\0'))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
114 {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
115 play_tree_t* entry = play_tree_new();
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
116 UNSET_GLOBAL;
8175
bf5d1da56ecd Basic support for random playing (-rnd and -nornd)
albeu
parents: 8164
diff changeset
117 if(last_parent->flags & PLAY_TREE_RND)
bf5d1da56ecd Basic support for random playing (-rnd and -nornd)
albeu
parents: 8164
diff changeset
118 entry->flags |= PLAY_TREE_RND;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
119 if(last_entry == NULL) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
120 play_tree_set_child(last_parent,entry);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
121 } else {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
122 play_tree_append_entry(last_entry,entry);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
123 last_entry = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
124 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
125 last_parent = entry;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
126 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
127 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
128
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
129 if((opt[0] == '}') && (opt[1] == '\0'))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
130 {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
131 if( ! last_parent || ! last_parent->parent) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
132 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "too much }-\n");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
133 goto err_out;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
134 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
135 last_entry = last_parent;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
136 last_parent = last_entry->parent;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
137 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
138 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28051
diff changeset
139
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
140 if ((no_more_opts == 0) && (*opt == '-') && (*(opt+1) != 0)) /* option */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
141 {
13932
f845791e2823 fix: when doing -loop 0 -shuffle, the arg after shuffle was skipped
reimar
parents: 13909
diff changeset
142 int tmp = 0;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
143 /* remove trailing '-' */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
144 opt++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
145
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
146 mp_msg(MSGT_CFGPARSER, MSGL_DBG3, "this_opt = option: %s\n", opt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
147 // We handle here some specific option
17472
526abfe30498 Make -list-options work in both MPlayer and MEncoder.
albeu
parents: 16345
diff changeset
148 // Loop option when it apply to a group
526abfe30498 Make -list-options work in both MPlayer and MEncoder.
albeu
parents: 16345
diff changeset
149 if(strcasecmp(opt,"loop") == 0 &&
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
150 (! last_entry || last_entry->child) ) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
151 int l;
18097
df9633d451dc avoid crash when running "mplayer -loop" (dereferencing uninitialize pointer).
reimar
parents: 17472
diff changeset
152 char* end = NULL;
8400
587b62cd4119 10l noticed by "Puk Madick" <pingy@swirvemail.com>
arpi
parents: 8175
diff changeset
153 l = (i+1<argc) ? strtol(argv[i+1],&end,0) : 0;
18097
df9633d451dc avoid crash when running "mplayer -loop" (dereferencing uninitialize pointer).
reimar
parents: 17472
diff changeset
154 if(!end || *end != '\0') {
21312
d78e7d5bc6d5 localization of parser-m*cmd.c messages
ptt
parents: 18265
diff changeset
155 mp_msg(MSGT_CFGPARSER, MSGL_ERR, MSGTR_TheLoopOptionMustBeAnInteger, argv[i+1]);
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
156 tmp = ERR_OUT_OF_RANGE;
9106
2c1aee5bb754 Ok, firstly fixed the bug in parser-mpcmd.c where it
arpi
parents: 8458
diff changeset
157 } else {
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
158 play_tree_t* pt = last_entry ? last_entry : last_parent;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
159 l = l <= 0 ? -1 : l;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
160 pt->loop = l;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
161 tmp = 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
162 }
8452
418b0017a8d2 -rnd --> -shuffle
diego
parents: 8426
diff changeset
163 } else if(strcasecmp(opt,"shuffle") == 0) {
8175
bf5d1da56ecd Basic support for random playing (-rnd and -nornd)
albeu
parents: 8164
diff changeset
164 if(last_entry && last_entry->child)
bf5d1da56ecd Basic support for random playing (-rnd and -nornd)
albeu
parents: 8164
diff changeset
165 last_entry->flags |= PLAY_TREE_RND;
bf5d1da56ecd Basic support for random playing (-rnd and -nornd)
albeu
parents: 8164
diff changeset
166 else
bf5d1da56ecd Basic support for random playing (-rnd and -nornd)
albeu
parents: 8164
diff changeset
167 last_parent->flags |= PLAY_TREE_RND;
8452
418b0017a8d2 -rnd --> -shuffle
diego
parents: 8426
diff changeset
168 } else if(strcasecmp(opt,"noshuffle") == 0) {
8175
bf5d1da56ecd Basic support for random playing (-rnd and -nornd)
albeu
parents: 8164
diff changeset
169 if(last_entry && last_entry->child)
bf5d1da56ecd Basic support for random playing (-rnd and -nornd)
albeu
parents: 8164
diff changeset
170 last_entry->flags &= ~PLAY_TREE_RND;
bf5d1da56ecd Basic support for random playing (-rnd and -nornd)
albeu
parents: 8164
diff changeset
171 else
bf5d1da56ecd Basic support for random playing (-rnd and -nornd)
albeu
parents: 8164
diff changeset
172 last_parent->flags &= ~PLAY_TREE_RND;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
173 } else {
25227
75837c33484b Mark more m_option_t uses as const
reimar
parents: 21312
diff changeset
174 const m_option_t* mp_opt = NULL;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
175 play_tree_t* entry = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
176
8458
92a7bf835d98 2*10l=20l
arpi
parents: 8452
diff changeset
177 tmp = is_entry_option(opt,(i+1<argc) ? argv[i + 1] : NULL,&entry);
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
178 if(tmp > 0) { // It's an entry
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
179 if(entry) {
10542
928c02fa9949 fix the bug where only the last file of the command line is found
pl
parents: 10513
diff changeset
180 add_entry(&last_parent,&last_entry,entry);
8175
bf5d1da56ecd Basic support for random playing (-rnd and -nornd)
albeu
parents: 8164
diff changeset
181 if((last_parent->flags & PLAY_TREE_RND) && entry->child)
bf5d1da56ecd Basic support for random playing (-rnd and -nornd)
albeu
parents: 8164
diff changeset
182 entry->flags |= PLAY_TREE_RND;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
183 UNSET_GLOBAL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
184 } else if(mode == LOCAL) // Entry is empty we have to drop his params
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
185 mode = DROP_LOCAL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
186 } else if(tmp == 0) { // 'normal' options
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
187 mp_opt = m_config_get_option(config,opt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
188 if (mp_opt != NULL) { // Option exist
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
189 if(mode == GLOBAL || (mp_opt->flags & M_OPT_GLOBAL))
8426
ca2813aafb35 more i+1<argc checks
arpi
parents: 8400
diff changeset
190 tmp = (i+1<argc) ? m_config_set_option(config, opt, argv[i + 1])
ca2813aafb35 more i+1<argc checks
arpi
parents: 8400
diff changeset
191 : m_config_set_option(config, opt, NULL);
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
192 else {
8458
92a7bf835d98 2*10l=20l
arpi
parents: 8452
diff changeset
193 tmp = m_config_check_option(config, opt, (i+1<argc) ? argv[i + 1] : NULL);
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
194 if(tmp >= 0 && mode != DROP_LOCAL) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
195 play_tree_t* pt = last_entry ? last_entry : last_parent;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
196 play_tree_set_param(pt,opt, argv[i + 1]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
197 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
198 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
199 } else {
10595
522afd56703c 100l to albeu for his english grammar, and 10l to me becouse I noticed that lately (my backward compatibilty macro uses M_OPT_UNKNOWN)
alex
parents: 10594
diff changeset
200 tmp = M_OPT_UNKNOWN;
21312
d78e7d5bc6d5 localization of parser-m*cmd.c messages
ptt
parents: 18265
diff changeset
201 mp_msg(MSGT_CFGPARSER, MSGL_ERR, MSGTR_UnknownOptionOnCommandLine, opt);
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
202 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
203 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
204 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
205
16345
feb16d0117c8 allow multiple help clauses on the command line, Patch by kiriuja " mplayer-patches AH en-directo POUM net "
gpoirier
parents: 15742
diff changeset
206 if (tmp <= M_OPT_EXIT) {
feb16d0117c8 allow multiple help clauses on the command line, Patch by kiriuja " mplayer-patches AH en-directo POUM net "
gpoirier
parents: 15742
diff changeset
207 opt_exit = 1;
feb16d0117c8 allow multiple help clauses on the command line, Patch by kiriuja " mplayer-patches AH en-directo POUM net "
gpoirier
parents: 15742
diff changeset
208 tmp = M_OPT_EXIT - tmp;
feb16d0117c8 allow multiple help clauses on the command line, Patch by kiriuja " mplayer-patches AH en-directo POUM net "
gpoirier
parents: 15742
diff changeset
209 } else
9792
4c34dc17e43d Exit when the option parser return M_OPT_EXIT
albeu
parents: 9747
diff changeset
210 if (tmp < 0) {
21312
d78e7d5bc6d5 localization of parser-m*cmd.c messages
ptt
parents: 18265
diff changeset
211 mp_msg(MSGT_CFGPARSER, MSGL_FATAL, MSGTR_ErrorParsingOptionOnCommandLine, opt);
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
212 goto err_out;
9792
4c34dc17e43d Exit when the option parser return M_OPT_EXIT
albeu
parents: 9747
diff changeset
213 }
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
214 i += tmp;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
215 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
216 else /* filename */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
217 {
29850
93947ce0e2cb Support the range syntax (like dvd://2-5) also for dvdnav.
reimar
parents: 29263
diff changeset
218 int is_dvdnav = strstr(argv[i],"dvdnav://") != NULL;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
219 play_tree_t* entry = play_tree_new();
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
220 mp_msg(MSGT_CFGPARSER, MSGL_DBG2,"Adding file %s\n",argv[i]);
12543
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
221 // if required expand DVD filename entries like dvd://1-3 into component titles
29850
93947ce0e2cb Support the range syntax (like dvd://2-5) also for dvdnav.
reimar
parents: 29263
diff changeset
222 if ( strstr(argv[i],"dvd://") != NULL || is_dvdnav)
12543
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
223 {
29850
93947ce0e2cb Support the range syntax (like dvd://2-5) also for dvdnav.
reimar
parents: 29263
diff changeset
224 int offset = is_dvdnav ? 9 : 6;
93947ce0e2cb Support the range syntax (like dvd://2-5) also for dvdnav.
reimar
parents: 29263
diff changeset
225 splitpos=strstr(argv[i]+offset,"-");
12543
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
226 if(splitpos != NULL)
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
227 {
29850
93947ce0e2cb Support the range syntax (like dvd://2-5) also for dvdnav.
reimar
parents: 29263
diff changeset
228 start_title=strtol(argv[i]+offset,NULL,10);
12543
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
229 if (start_title<0) { //entries like dvd://-2 start title implied 1
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
230 end_title=abs(start_title);
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
231 start_title=1;
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
232 } else {
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
233 end_title=strtol(splitpos+1,NULL,10);
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
234 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28051
diff changeset
235
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28051
diff changeset
236 if (dvd_range(start_title) && dvd_range(end_title) && (start_title<end_title))
12543
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
237 {
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
238 for (j=start_title;j<=end_title;j++)
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
239 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28051
diff changeset
240 if (j!=start_title)
12543
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
241 entry=play_tree_new();
29850
93947ce0e2cb Support the range syntax (like dvd://2-5) also for dvdnav.
reimar
parents: 29263
diff changeset
242 snprintf(entbuf,sizeof(entbuf),is_dvdnav ? "dvdnav://%d" : "dvd://%d",j);
12543
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
243 play_tree_add_file(entry,entbuf);
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
244 add_entry(&last_parent,&last_entry,entry);
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
245 last_entry = entry;
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
246 }
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
247 } else {
21312
d78e7d5bc6d5 localization of parser-m*cmd.c messages
ptt
parents: 18265
diff changeset
248 mp_msg(MSGT_CFGPARSER, MSGL_ERR, MSGTR_InvalidPlayEntry, argv[i]);
12543
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
249 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28051
diff changeset
250
12543
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
251 } else { // dvd:// or dvd://x entry
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
252 play_tree_add_file(entry,argv[i]);
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
253 }
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
254 } else {
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
255 play_tree_add_file(entry,argv[i]);
12543
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
256 }
2cbc9f1f728f Support dvd://start_title-end_title as requested on wishlist
rtognimp
parents: 12267
diff changeset
257
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
258 // Lock stdin if it will be used as input
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
259 if(strcasecmp(argv[i],"-") == 0)
12816
fba780800efe -use-stdin renamed to -noconsolecontrols.
diego
parents: 12543
diff changeset
260 m_config_set_option(config,"noconsolecontrols",NULL);
10542
928c02fa9949 fix the bug where only the last file of the command line is found
pl
parents: 10513
diff changeset
261 add_entry(&last_parent,&last_entry,entry);
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
262 UNSET_GLOBAL; // We start entry specific options
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
263
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
264 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
265 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
266
16345
feb16d0117c8 allow multiple help clauses on the command line, Patch by kiriuja " mplayer-patches AH en-directo POUM net "
gpoirier
parents: 15742
diff changeset
267 if (opt_exit)
feb16d0117c8 allow multiple help clauses on the command line, Patch by kiriuja " mplayer-patches AH en-directo POUM net "
gpoirier
parents: 15742
diff changeset
268 goto err_out;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
269 --recursion_depth;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
270 if(last_parent != root)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
271 mp_msg(MSGT_CFGPARSER, MSGL_ERR,"Missing }- ?\n");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
272 return root;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
273
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
274 err_out:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
275 --recursion_depth;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
276 play_tree_free(root,1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
277 return NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
278 }