Mercurial > mplayer.hg
view parser-mecmd.c @ 8644:0bfd73828e33
This patch fixes so that the exit code (or return code if you like) is set
to zero when mplayer exits because of natural EOF or by the quit command.
This can be useful if you (like me) use mplayer in scripts.
patch by Oskar Liljeblad <oskar@osk.mine.nu>
author | arpi |
---|---|
date | Sun, 29 Dec 2002 21:06:20 +0000 |
parents | 487cfc28525d |
children | 268b3fbc35b7 |
line wrap: on
line source
#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