Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-2-2
Commits
679018d1
Commit
679018d1
authored
Aug 22, 2011
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move help command line options handling to a new file
parent
faa48255
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
892 additions
and
783 deletions
+892
-783
src/Makefile.am
src/Makefile.am
+1
-0
src/config/configuration.h
src/config/configuration.h
+1
-0
src/config/help.c
src/config/help.c
+887
-0
src/libvlc.c
src/libvlc.c
+1
-783
src/libvlc.h
src/libvlc.h
+2
-0
No files found.
src/Makefile.am
View file @
679018d1
...
...
@@ -456,6 +456,7 @@ SOURCES_libvlc_common = \
config/core.c
\
config/chain.c
\
config/file.c
\
config/help.c
\
config/intf.c
\
config/keys.c
\
config/cmdline.c
\
...
...
src/config/configuration.h
View file @
679018d1
...
...
@@ -36,6 +36,7 @@ int config_LoadCmdLine ( vlc_object_t *, int, const char *[], int * );
int
config_LoadConfigFile
(
vlc_object_t
*
);
#define config_LoadCmdLine(a,b,c,d) config_LoadCmdLine(VLC_OBJECT(a),b,c,d)
#define config_LoadConfigFile(a) config_LoadConfigFile(VLC_OBJECT(a))
bool
config_PrintHelp
(
vlc_object_t
*
);
int
config_SortConfig
(
void
);
void
config_UnsortConfig
(
void
);
...
...
src/config/help.c
0 → 100644
View file @
679018d1
/*****************************************************************************
* help.c: command line help
*****************************************************************************
* Copyright (C) 1998-2011 the VideoLAN team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <vlc_common.h>
#include <vlc_charset.h>
#include <vlc_modules.h>
#include "modules/modules.h"
#include "config/configuration.h"
#include "libvlc.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#elif defined( WIN32 ) && !defined( UNDER_CE )
# include <io.h>
#endif
#if defined( WIN32 ) && !defined( UNDER_CE )
static
void
ShowConsole
(
void
);
static
void
PauseConsole
(
void
);
#endif
static
void
Help
(
vlc_object_t
*
,
const
char
*
);
static
void
Usage
(
vlc_object_t
*
,
const
char
*
);
static
void
Version
(
void
);
static
void
ListModules
(
vlc_object_t
*
,
bool
);
static
int
ConsoleWidth
(
void
);
/**
* Checks for help command line options such as --help or --version.
* If one is found, print the corresponding text.
* \return true if a command line options caused some help message to be
* printed, false otherwise.
*/
bool
config_PrintHelp
(
vlc_object_t
*
obj
)
{
char
*
str
;
/* Check for short help option */
if
(
var_InheritBool
(
obj
,
"help"
))
{
Help
(
obj
,
"help"
);
return
true
;
}
/* Check for version option */
if
(
var_InheritBool
(
obj
,
"version"
))
{
Version
();
return
true
;
}
/* Check for help on modules */
str
=
var_InheritString
(
obj
,
"module"
);
if
(
str
!=
NULL
)
{
Help
(
obj
,
str
);
free
(
str
);
return
true
;
}
/* Check for full help option */
if
(
var_InheritBool
(
obj
,
"full-help"
))
{
var_Create
(
obj
,
"advanced"
,
VLC_VAR_BOOL
);
var_SetBool
(
obj
,
"advanced"
,
true
);
var_Create
(
obj
,
"help-verbose"
,
VLC_VAR_BOOL
);
var_SetBool
(
obj
,
"help-verbose"
,
true
);
Help
(
obj
,
"full-help"
);
return
true
;
}
/* Check for long help option */
if
(
var_InheritBool
(
obj
,
"longhelp"
))
{
Help
(
obj
,
"longhelp"
);
return
true
;
}
/* Check for module list option */
if
(
var_InheritBool
(
obj
,
"list"
))
{
ListModules
(
obj
,
false
);
return
true
;
}
if
(
var_InheritBool
(
obj
,
"list-verbose"
))
{
ListModules
(
obj
,
true
);
return
true
;
}
return
false
;
}
/*****************************************************************************
* Help: print program help
*****************************************************************************
* Print a short inline help. Message interface is initialized at this stage.
*****************************************************************************/
static
inline
void
print_help_on_full_help
(
void
)
{
utf8_fprintf
(
stdout
,
"
\n
"
);
utf8_fprintf
(
stdout
,
"%s
\n
"
,
_
(
"To get exhaustive help, use '-H'."
)
);
}
static
const
char
vlc_usage
[]
=
N_
(
"Usage: %s [options] [stream] ...
\n
"
"You can specify multiple streams on the commandline.
\n
"
"They will be enqueued in the playlist.
\n
"
"The first item specified will be played first.
\n
"
"
\n
"
"Options-styles:
\n
"
" --option A global option that is set for the duration of the program.
\n
"
" -option A single letter version of a global --option.
\n
"
" :option An option that only applies to the stream directly before it
\n
"
" and that overrides previous settings.
\n
"
"
\n
"
"Stream MRL syntax:
\n
"
" [[access][/demux]://]URL[@[title][:chapter][-[title][:chapter]]]
\n
"
" [:option=value ...]
\n
"
"
\n
"
" Many of the global --options can also be used as MRL specific :options.
\n
"
" Multiple :option=value pairs can be specified.
\n
"
"
\n
"
"URL syntax:
\n
"
" file:///path/file Plain media file
\n
"
" http://host[:port]/file HTTP URL
\n
"
" ftp://host[:port]/file FTP URL
\n
"
" mms://host[:port]/file MMS URL
\n
"
" screen:// Screen capture
\n
"
" dvd://[device][@raw_device] DVD device
\n
"
" vcd://[device] VCD device
\n
"
" cdda://[device] Audio CD device
\n
"
" udp://[[<source address>]@[<bind address>][:<bind port>]]
\n
"
" UDP stream sent by a streaming server
\n
"
" vlc://pause:<seconds> Pause the playlist for a certain time
\n
"
" vlc://quit Special item to quit VLC
\n
"
"
\n
"
);
static
void
Help
(
vlc_object_t
*
p_this
,
char
const
*
psz_help_name
)
{
#if defined (WIN32) && !defined (UNDER_CE)
ShowConsole
();
#endif
if
(
psz_help_name
&&
!
strcmp
(
psz_help_name
,
"help"
)
)
{
utf8_fprintf
(
stdout
,
vlc_usage
,
"vlc"
);
Usage
(
p_this
,
"=help"
);
Usage
(
p_this
,
"=main"
);
print_help_on_full_help
();
}
else
if
(
psz_help_name
&&
!
strcmp
(
psz_help_name
,
"longhelp"
)
)
{
utf8_fprintf
(
stdout
,
vlc_usage
,
"vlc"
);
Usage
(
p_this
,
NULL
);
print_help_on_full_help
();
}
else
if
(
psz_help_name
&&
!
strcmp
(
psz_help_name
,
"full-help"
)
)
{
utf8_fprintf
(
stdout
,
vlc_usage
,
"vlc"
);
Usage
(
p_this
,
NULL
);
}
else
if
(
psz_help_name
)
{
Usage
(
p_this
,
psz_help_name
);
}
#if defined (WIN32) && !defined (UNDER_CE)
PauseConsole
();
#endif
}
/*****************************************************************************
* Usage: print module usage
*****************************************************************************
* Print a short inline help. Message interface is initialized at this stage.
*****************************************************************************/
# define COL(x) "\033[" #x ";1m"
# define RED COL(31)
# define GREEN COL(32)
# define YELLOW COL(33)
# define BLUE COL(34)
# define MAGENTA COL(35)
# define CYAN COL(36)
# define WHITE COL(0)
# define GRAY "\033[0m"
static
void
print_help_section
(
const
module_t
*
m
,
const
module_config_t
*
p_item
,
bool
b_color
,
bool
b_description
)
{
if
(
!
p_item
)
return
;
if
(
b_color
)
{
utf8_fprintf
(
stdout
,
RED
" %s:
\n
"
GRAY
,
module_gettext
(
m
,
p_item
->
psz_text
)
);
if
(
b_description
&&
p_item
->
psz_longtext
)
utf8_fprintf
(
stdout
,
MAGENTA
" %s
\n
"
GRAY
,
module_gettext
(
m
,
p_item
->
psz_longtext
)
);
}
else
{
utf8_fprintf
(
stdout
,
" %s:
\n
"
,
module_gettext
(
m
,
p_item
->
psz_text
)
);
if
(
b_description
&&
p_item
->
psz_longtext
)
utf8_fprintf
(
stdout
,
" %s
\n
"
,
module_gettext
(
m
,
p_item
->
psz_longtext
)
);
}
}
static
void
Usage
(
vlc_object_t
*
p_this
,
char
const
*
psz_search
)
{
#define FORMAT_STRING " %s --%s%s%s%s%s%s%s "
/* short option ------' | | | | | | |
* option name ------------' | | | | | |
* <bra ---------------------' | | | | |
* option type or "" ----------' | | | |
* ket> -------------------------' | | |
* padding spaces -----------------' | |
* comment --------------------------' |
* comment suffix ---------------------'
*
* The purpose of having bra and ket is that we might i18n them as well.
*/
#define COLOR_FORMAT_STRING (WHITE" %s --%s"YELLOW"%s%s%s%s%s%s "GRAY)
#define COLOR_FORMAT_STRING_BOOL (WHITE" %s --%s%s%s%s%s%s%s "GRAY)
#define LINE_START 8
#define PADDING_SPACES 25
#ifdef WIN32
# define OPTION_VALUE_SEP "="
#else
# define OPTION_VALUE_SEP " "
#endif
char
psz_spaces_text
[
PADDING_SPACES
+
LINE_START
+
1
];
char
psz_spaces_longtext
[
LINE_START
+
3
];
char
psz_format
[
sizeof
(
COLOR_FORMAT_STRING
)];
char
psz_format_bool
[
sizeof
(
COLOR_FORMAT_STRING_BOOL
)];
char
psz_buffer
[
10000
];
char
psz_short
[
4
];
int
i_width
=
ConsoleWidth
()
-
(
PADDING_SPACES
+
LINE_START
+
1
);
int
i_width_description
=
i_width
+
PADDING_SPACES
-
1
;
bool
b_advanced
=
var_InheritBool
(
p_this
,
"advanced"
);
bool
b_description
=
var_InheritBool
(
p_this
,
"help-verbose"
);
bool
b_description_hack
;
bool
b_color
=
var_InheritBool
(
p_this
,
"color"
);
bool
b_has_advanced
=
false
;
bool
b_found
=
false
;
int
i_only_advanced
=
0
;
/* Number of modules ignored because they
* only have advanced options */
bool
b_strict
=
psz_search
&&
*
psz_search
==
'='
;
if
(
b_strict
)
psz_search
++
;
memset
(
psz_spaces_text
,
' '
,
PADDING_SPACES
+
LINE_START
);
psz_spaces_text
[
PADDING_SPACES
+
LINE_START
]
=
'\0'
;
memset
(
psz_spaces_longtext
,
' '
,
LINE_START
+
2
);
psz_spaces_longtext
[
LINE_START
+
2
]
=
'\0'
;
#ifndef WIN32
if
(
!
isatty
(
1
)
)
#endif
b_color
=
false
;
// don't put color control codes in a .txt file
if
(
b_color
)
{
strcpy
(
psz_format
,
COLOR_FORMAT_STRING
);
strcpy
(
psz_format_bool
,
COLOR_FORMAT_STRING_BOOL
);
}
else
{
strcpy
(
psz_format
,
FORMAT_STRING
);
strcpy
(
psz_format_bool
,
FORMAT_STRING
);
}
/* List all modules */
module_t
**
list
=
module_list_get
(
NULL
);
if
(
!
list
)
return
;
/* Ugly hack to make sure that the help options always come first
* (part 1) */
if
(
!
psz_search
)
Usage
(
p_this
,
"help"
);
/* Enumerate the config for each module */
for
(
size_t
i
=
0
;
list
[
i
];
i
++
)
{
bool
b_help_module
;
module_t
*
p_parser
=
list
[
i
];
module_config_t
*
p_item
=
NULL
;
module_config_t
*
p_section
=
NULL
;
module_config_t
*
p_end
=
p_parser
->
p_config
+
p_parser
->
confsize
;
const
char
*
objname
=
module_get_object
(
p_parser
);
if
(
psz_search
&&
(
b_strict
?
strcmp
(
objname
,
psz_search
)
:
!
strstr
(
objname
,
psz_search
)
)
)
{
char
*
const
*
pp_shortcuts
=
p_parser
->
pp_shortcuts
;
unsigned
i
;
for
(
i
=
0
;
i
<
p_parser
->
i_shortcuts
;
i
++
)
{
if
(
b_strict
?
!
strcmp
(
psz_search
,
pp_shortcuts
[
i
]
)
:
!!
strstr
(
pp_shortcuts
[
i
],
psz_search
)
)
break
;
}
if
(
i
==
p_parser
->
i_shortcuts
)
continue
;
}
/* Ignore modules without config options */
if
(
!
p_parser
->
i_config_items
)
{
continue
;
}
b_help_module
=
!
strcmp
(
"help"
,
objname
);
/* Ugly hack to make sure that the help options always come first
* (part 2) */
if
(
!
psz_search
&&
b_help_module
)
continue
;
/* Ignore modules with only advanced config options if requested */
if
(
!
b_advanced
)
{
for
(
p_item
=
p_parser
->
p_config
;
p_item
<
p_end
;
p_item
++
)
{
if
(
CONFIG_ITEM
(
p_item
->
i_type
)
&&
!
p_item
->
b_advanced
&&
!
p_item
->
b_removed
)
break
;
}
if
(
p_item
==
p_end
)
{
i_only_advanced
++
;
continue
;
}
}
b_found
=
true
;
/* Print name of module */
if
(
strcmp
(
"main"
,
objname
)
)
{
if
(
b_color
)
utf8_fprintf
(
stdout
,
"
\n
"
GREEN
"%s"
GRAY
" (%s)
\n
"
,
module_gettext
(
p_parser
,
p_parser
->
psz_longname
),
objname
);
else
utf8_fprintf
(
stdout
,
"
\n
%s
\n
"
,
module_gettext
(
p_parser
,
p_parser
->
psz_longname
)
);
}
if
(
p_parser
->
psz_help
)
{
if
(
b_color
)
utf8_fprintf
(
stdout
,
CYAN
" %s
\n
"
GRAY
,
module_gettext
(
p_parser
,
p_parser
->
psz_help
)
);
else
utf8_fprintf
(
stdout
,
" %s
\n
"
,
module_gettext
(
p_parser
,
p_parser
->
psz_help
)
);
}
/* Print module options */
for
(
p_item
=
p_parser
->
p_config
;
p_item
<
p_end
;
p_item
++
)
{
char
*
psz_text
,
*
psz_spaces
=
psz_spaces_text
;
const
char
*
psz_bra
=
NULL
,
*
psz_type
=
NULL
,
*
psz_ket
=
NULL
;
const
char
*
psz_suf
=
""
,
*
psz_prefix
=
NULL
;
signed
int
i
;
size_t
i_cur_width
;
/* Skip removed options */
if
(
p_item
->
b_removed
)
{
continue
;
}
/* Skip advanced options if requested */
if
(
p_item
->
b_advanced
&&
!
b_advanced
)
{
b_has_advanced
=
true
;
continue
;
}
switch
(
CONFIG_CLASS
(
p_item
->
i_type
)
)
{
case
0
:
// hint class
switch
(
p_item
->
i_type
)
{
case
CONFIG_HINT_CATEGORY
:
case
CONFIG_HINT_USAGE
:
if
(
!
strcmp
(
"main"
,
objname
)
)
{
if
(
b_color
)
utf8_fprintf
(
stdout
,
GREEN
"
\n
%s
\n
"
GRAY
,
module_gettext
(
p_parser
,
p_item
->
psz_text
)
);
else
utf8_fprintf
(
stdout
,
"
\n
%s
\n
"
,
module_gettext
(
p_parser
,
p_item
->
psz_text
)
);
}
if
(
b_description
&&
p_item
->
psz_longtext
)
{
if
(
b_color
)
utf8_fprintf
(
stdout
,
CYAN
" %s
\n
"
GRAY
,
module_gettext
(
p_parser
,
p_item
->
psz_longtext
)
);
else
utf8_fprintf
(
stdout
,
" %s
\n
"
,
module_gettext
(
p_parser
,
p_item
->
psz_longtext
)
);
}
break
;
case
CONFIG_HINT_SUBCATEGORY
:
if
(
strcmp
(
"main"
,
objname
)
)
break
;
case
CONFIG_SECTION
:
p_section
=
p_item
;
break
;
}
break
;
case
CONFIG_ITEM_STRING
:
print_help_section
(
p_parser
,
p_section
,
b_color
,
b_description
);
p_section
=
NULL
;
psz_bra
=
OPTION_VALUE_SEP
"<"
;
psz_type
=
_
(
"string"
);
psz_ket
=
">"
;
if
(
p_item
->
ppsz_list
)
{
psz_bra
=
OPTION_VALUE_SEP
"{"
;
psz_type
=
psz_buffer
;
psz_buffer
[
0
]
=
'\0'
;
for
(
i
=
0
;
p_item
->
ppsz_list
[
i
];
i
++
)
{
if
(
i
)
strcat
(
psz_buffer
,
","
);
strcat
(
psz_buffer
,
p_item
->
ppsz_list
[
i
]
);
}
psz_ket
=
"}"
;
}
break
;
case
CONFIG_ITEM_INTEGER
:
print_help_section
(
p_parser
,
p_section
,
b_color
,
b_description
);
p_section
=
NULL
;
psz_bra
=
OPTION_VALUE_SEP
"<"
;
psz_type
=
_
(
"integer"
);
psz_ket
=
">"
;
if
(
p_item
->
min
.
i
||
p_item
->
max
.
i
)
{
sprintf
(
psz_buffer
,
"%s [%"
PRId64
" .. %"
PRId64
"]"
,
psz_type
,
p_item
->
min
.
i
,
p_item
->
max
.
i
);
psz_type
=
psz_buffer
;
}
if
(
p_item
->
i_list
)
{
psz_bra
=
OPTION_VALUE_SEP
"{"
;
psz_type
=
psz_buffer
;
psz_buffer
[
0
]
=
'\0'
;
for
(
i
=
0
;
p_item
->
ppsz_list_text
[
i
];
i
++
)
{
if
(
i
)
strcat
(
psz_buffer
,
", "
);
sprintf
(
psz_buffer
+
strlen
(
psz_buffer
),
"%i (%s)"
,
p_item
->
pi_list
[
i
],
module_gettext
(
p_parser
,
p_item
->
ppsz_list_text
[
i
]
)
);
}
psz_ket
=
"}"
;
}
break
;
case
CONFIG_ITEM_FLOAT
:
print_help_section
(
p_parser
,
p_section
,
b_color
,
b_description
);
p_section
=
NULL
;
psz_bra
=
OPTION_VALUE_SEP
"<"
;
psz_type
=
_
(
"float"
);
psz_ket
=
">"
;
if
(
p_item
->
min
.
f
||
p_item
->
max
.
f
)
{
sprintf
(
psz_buffer
,
"%s [%f .. %f]"
,
psz_type
,
p_item
->
min
.
f
,
p_item
->
max
.
f
);
psz_type
=
psz_buffer
;
}
break
;
case
CONFIG_ITEM_BOOL
:
print_help_section
(
p_parser
,
p_section
,
b_color
,
b_description
);
p_section
=
NULL
;
psz_bra
=
""
;
psz_type
=
""
;
psz_ket
=
""
;
if
(
!
b_help_module
)
{
psz_suf
=
p_item
->
value
.
i
?
_
(
" (default enabled)"
)
:
_
(
" (default disabled)"
);
}
break
;
}
if
(
!
psz_type
)
{
continue
;
}
/* Add short option if any */
if
(
p_item
->
i_short
)
{
sprintf
(
psz_short
,
"-%c,"
,
p_item
->
i_short
);
}
else
{
strcpy
(
psz_short
,
" "
);
}
i
=
PADDING_SPACES
-
strlen
(
p_item
->
psz_name
)
-
strlen
(
psz_bra
)
-
strlen
(
psz_type
)
-
strlen
(
psz_ket
)
-
1
;
if
(
CONFIG_CLASS
(
p_item
->
i_type
)
==
CONFIG_ITEM_BOOL
&&
!
b_help_module
)
{
psz_prefix
=
", --no-"
;
i
-=
strlen
(
p_item
->
psz_name
)
+
strlen
(
psz_prefix
);
}
if
(
i
<
0
)
{
psz_spaces
[
0
]
=
'\n'
;
i
=
0
;
}
else
{
psz_spaces
[
i
]
=
'\0'
;
}
if
(
CONFIG_CLASS
(
p_item
->
i_type
)
==
CONFIG_ITEM_BOOL
&&
!
b_help_module
)
{
utf8_fprintf
(
stdout
,
psz_format_bool
,
psz_short
,
p_item
->
psz_name
,
psz_prefix
,
p_item
->
psz_name
,
psz_bra
,
psz_type
,
psz_ket
,
psz_spaces
);
}
else
{
utf8_fprintf
(
stdout
,
psz_format
,
psz_short
,
p_item
->
psz_name
,
""
,
""
,
psz_bra
,
psz_type
,
psz_ket
,
psz_spaces
);
}
psz_spaces
[
i
]
=
' '
;
/* We wrap the rest of the output */
sprintf
(
psz_buffer
,
"%s%s"
,
module_gettext
(
p_parser
,
p_item
->
psz_text
),
psz_suf
);
b_description_hack
=
b_description
;
description:
psz_text
=
psz_buffer
;
i_cur_width
=
b_description
&&
!
b_description_hack
?
i_width_description
:
i_width
;
if
(
!*
psz_text
)
strcpy
(
psz_text
,
" "
);
while
(
*
psz_text
)
{
char
*
psz_parser
,
*
psz_word
;
size_t
i_end
=
strlen
(
psz_text
);
/* If the remaining text fits in a line, print it. */
if
(
i_end
<=
i_cur_width
)
{
if
(
b_color
)
{
if
(
!
b_description
||
b_description_hack
)
utf8_fprintf
(
stdout
,
BLUE
"%s
\n
"
GRAY
,
psz_text
);
else
utf8_fprintf
(
stdout
,
"%s
\n
"
,
psz_text
);
}
else
{
utf8_fprintf
(
stdout
,
"%s
\n
"
,
psz_text
);
}
break
;
}
/* Otherwise, eat as many words as possible */
psz_parser
=
psz_text
;
do
{
psz_word
=
psz_parser
;
psz_parser
=
strchr
(
psz_word
,
' '
);
/* If no space was found, we reached the end of the text
* block; otherwise, we skip the space we just found. */
psz_parser
=
psz_parser
?
psz_parser
+
1
:
psz_text
+
i_end
;
}
while
(
(
size_t
)(
psz_parser
-
psz_text
)
<=
i_cur_width
);
/* We cut a word in one of these cases:
* - it's the only word in the line and it's too long.
* - we used less than 80% of the width and the word we are
* going to wrap is longer than 40% of the width, and even
* if the word would have fit in the next line. */
if
(
psz_word
==
psz_text
||
(
(
size_t
)(
psz_word
-
psz_text
)
<
80
*
i_cur_width
/
100
&&
(
size_t
)(
psz_parser
-
psz_word
)
>
40
*
i_cur_width
/
100
)
)
{
char
c
=
psz_text
[
i_cur_width
];
psz_text
[
i_cur_width
]
=
'\0'
;
if
(
b_color
)
{
if
(
!
b_description
||
b_description_hack
)
utf8_fprintf
(
stdout
,
BLUE
"%s
\n
%s"
GRAY
,
psz_text
,
psz_spaces
);
else
utf8_fprintf
(
stdout
,
"%s
\n
%s"
,
psz_text
,
psz_spaces
);
}
else
{
utf8_fprintf
(
stdout
,
"%s
\n
%s"
,
psz_text
,
psz_spaces
);
}
psz_text
+=
i_cur_width
;
psz_text
[
0
]
=
c
;
}
else
{
psz_word
[
-
1
]
=
'\0'
;
if
(
b_color
)
{
if
(
!
b_description
||
b_description_hack
)
utf8_fprintf
(
stdout
,
BLUE
"%s
\n
%s"
GRAY
,
psz_text
,
psz_spaces
);
else
utf8_fprintf
(
stdout
,
"%s
\n
%s"
,
psz_text
,
psz_spaces
);
}
else
{
utf8_fprintf
(
stdout
,
"%s
\n
%s"
,
psz_text
,
psz_spaces
);
}
psz_text
=
psz_word
;
}
}
if
(
b_description_hack
&&
p_item
->
psz_longtext
)
{
sprintf
(
psz_buffer
,
"%s%s"
,
module_gettext
(
p_parser
,
p_item
->
psz_longtext
),
psz_suf
);
b_description_hack
=
false
;
psz_spaces
=
psz_spaces_longtext
;
utf8_fprintf
(
stdout
,
"%s"
,
psz_spaces
);
goto
description
;
}
}
}
if
(
b_has_advanced
)
{
if
(
b_color
)
utf8_fprintf
(
stdout
,
"
\n
"
WHITE
"%s"
GRAY
" %s
\n
"
,
_
(
"Note:"
),
_
(
"add --advanced to your command line to see advanced options."
));
else
utf8_fprintf
(
stdout
,
"
\n
%s %s
\n
"
,
_
(
"Note:"
),
_
(
"add --advanced to your command line to see advanced options."
));
}
if
(
i_only_advanced
>
0
)
{
if
(
b_color
)
{
utf8_fprintf
(
stdout
,
"
\n
"
WHITE
"%s"
GRAY
" "
,
_
(
"Note:"
)
);
utf8_fprintf
(
stdout
,
_
(
"%d module(s) were not displayed because they only have advanced options.
\n
"
),
i_only_advanced
);
}
else
{
utf8_fprintf
(
stdout
,
"
\n
%s "
,
_
(
"Note:"
)
);
utf8_fprintf
(
stdout
,
_
(
"%d module(s) were not displayed because they only have advanced options.
\n
"
),
i_only_advanced
);
}
}
else
if
(
!
b_found
)
{
if
(
b_color
)
utf8_fprintf
(
stdout
,
"
\n
"
WHITE
"%s"
GRAY
"
\n
"
,
_
(
"No matching module found. Use --list or "
\
"--list-verbose to list available modules."
)
);
else
utf8_fprintf
(
stdout
,
"
\n
%s
\n
"
,
_
(
"No matching module found. Use --list or "
\
"--list-verbose to list available modules."
)
);
}
/* Release the module list */
module_list_free
(
list
);
}
/*****************************************************************************
* ListModules: list the available modules with their description
*****************************************************************************
* Print a list of all available modules (builtins and plugins) and a short
* description for each one.
*****************************************************************************/
static
void
ListModules
(
vlc_object_t
*
p_this
,
bool
b_verbose
)
{
module_t
*
p_parser
;
bool
b_color
=
var_InheritBool
(
p_this
,
"color"
);
#ifdef WIN32
# ifndef UNDER_CE
ShowConsole
();
# endif
b_color
=
false
;
// don't put color control codes in a .txt file
#else
if
(
!
isatty
(
1
)
)
b_color
=
false
;
#endif
/* List all modules */
module_t
**
list
=
module_list_get
(
NULL
);
/* Enumerate each module */
for
(
size_t
j
=
0
;
(
p_parser
=
list
[
j
])
!=
NULL
;
j
++
)
{
const
char
*
objname
=
module_get_object
(
p_parser
);
if
(
b_color
)
utf8_fprintf
(
stdout
,
GREEN
" %-22s "
WHITE
"%s
\n
"
GRAY
,
objname
,
module_gettext
(
p_parser
,
p_parser
->
psz_longname
)
);
else
utf8_fprintf
(
stdout
,
" %-22s %s
\n
"
,
objname
,
module_gettext
(
p_parser
,
p_parser
->
psz_longname
)
);
if
(
b_verbose
)
{
char
*
const
*
pp_shortcuts
=
p_parser
->
pp_shortcuts
;
for
(
unsigned
i
=
0
;
i
<
p_parser
->
i_shortcuts
;
i
++
)
{
if
(
strcmp
(
pp_shortcuts
[
i
],
objname
)
)
{
if
(
b_color
)
utf8_fprintf
(
stdout
,
CYAN
" s %s
\n
"
GRAY
,
pp_shortcuts
[
i
]
);
else
utf8_fprintf
(
stdout
,
" s %s
\n
"
,
pp_shortcuts
[
i
]
);
}
}
if
(
p_parser
->
psz_capability
)
{
if
(
b_color
)
utf8_fprintf
(
stdout
,
MAGENTA
" c %s (%d)
\n
"
GRAY
,
p_parser
->
psz_capability
,
p_parser
->
i_score
);
else
utf8_fprintf
(
stdout
,
" c %s (%d)
\n
"
,
p_parser
->
psz_capability
,
p_parser
->
i_score
);
}
}
}
module_list_free
(
list
);
#if defined (WIN32) && !defined (UNDER_CE)
PauseConsole
();
#endif
}
/*****************************************************************************
* Version: print complete program version
*****************************************************************************
* Print complete program version and build number.
*****************************************************************************/
static
void
Version
(
void
)
{
#if defined (WIN32) && !defined (UNDER_CE)
ShowConsole
();
#endif
utf8_fprintf
(
stdout
,
_
(
"VLC version %s (%s)
\n
"
),
VERSION_MESSAGE
,
psz_vlc_changeset
);
utf8_fprintf
(
stdout
,
_
(
"Compiled by %s on %s (%s)
\n
"
),
VLC_CompileBy
(),
VLC_CompileHost
(),
__DATE__
" "
__TIME__
);
utf8_fprintf
(
stdout
,
_
(
"Compiler: %s
\n
"
),
VLC_Compiler
()
);
utf8_fprintf
(
stdout
,
"%s"
,
LICENSE_MSG
);
#ifdef WIN32
/* Pause the console because it's destroyed when we exit */
PauseConsole
();
#endif
}
#if defined (WIN32) && !defined (UNDER_CE)
/*****************************************************************************
* ShowConsole: On Win32, create an output console for debug messages
*****************************************************************************
* This function is useful only on Win32.
*****************************************************************************/
static
void
ShowConsole
(
void
)
{
FILE
*
f_help
=
NULL
;
if
(
getenv
(
"PWD"
)
)
return
;
/* Cygwin shell or Wine */
AllocConsole
();
/* Use the ANSI code page (e.g. Windows-1252) as expected by the LibVLC
* Unicode/locale subsystem. By default, we have the obsolecent OEM code
* page (e.g. CP437 or CP850). */
SetConsoleOutputCP
(
GetACP
());
SetConsoleTitle
(
"VLC media player version "
PACKAGE_VERSION
);
freopen
(
"CONOUT$"
,
"w"
,
stderr
);
freopen
(
"CONIN$"
,
"r"
,
stdin
);
f_help
=
fopen
(
"vlc-help.txt"
,
"wt"
);
if
(
f_help
!=
NULL
)
{
fclose
(
f_help
);
freopen
(
"vlc-help.txt"
,
"wt"
,
stdout
);
utf8_fprintf
(
stderr
,
_
(
"
\n
Dumped content to vlc-help.txt file.
\n
"
)
);
}
else
freopen
(
"CONOUT$"
,
"w"
,
stdout
);
}
/*****************************************************************************
* PauseConsole: On Win32, wait for a key press before closing the console
*****************************************************************************
* This function is useful only on Win32.
*****************************************************************************/
static
void
PauseConsole
(
void
)
{
if
(
getenv
(
"PWD"
)
)
return
;
/* Cygwin shell or Wine */
utf8_fprintf
(
stderr
,
_
(
"
\n
Press the RETURN key to continue...
\n
"
)
);
getchar
();
fclose
(
stdout
);
}
#endif
/*****************************************************************************
* ConsoleWidth: Return the console width in characters
*****************************************************************************
* We use the stty shell command to get the console width; if this fails or
* if the width is less than 80, we default to 80.
*****************************************************************************/
static
int
ConsoleWidth
(
void
)
{
unsigned
i_width
=
80
;
#ifndef WIN32
FILE
*
file
=
popen
(
"stty size 2>/dev/null"
,
"r"
);
if
(
file
!=
NULL
)
{
if
(
fscanf
(
file
,
"%*u %u"
,
&
i_width
)
<=
0
)
i_width
=
80
;
pclose
(
file
);
}
#elif !defined (UNDER_CE)
CONSOLE_SCREEN_BUFFER_INFO
buf
;
if
(
GetConsoleScreenBufferInfo
(
GetStdHandle
(
STD_OUTPUT_HANDLE
),
&
buf
))
i_width
=
buf
.
dwSize
.
X
;
#endif
return
i_width
;
}
src/libvlc.c
View file @
679018d1
...
...
@@ -161,18 +161,6 @@ void vlc_release (gc_object_t *p_gc)
static
void
SetLanguage
(
char
const
*
);
#endif
static
void
GetFilenames
(
libvlc_int_t
*
,
unsigned
,
const
char
*
const
[]
);
static
void
Help
(
libvlc_int_t
*
,
char
const
*
psz_help_name
);
static
void
Usage
(
libvlc_int_t
*
,
char
const
*
psz_search
);
static
void
ListModules
(
libvlc_int_t
*
,
bool
);
static
void
Version
(
void
);
#ifdef WIN32
static
void
ShowConsole
(
bool
);
static
void
PauseConsole
(
void
);
#endif
static
int
ConsoleWidth
(
void
);
extern
const
char
psz_vlc_changeset
[];
/**
* Allocate a libvlc instance, initialize global data if needed
...
...
@@ -230,11 +218,9 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
const
char
*
ppsz_argv
[]
)
{
libvlc_priv_t
*
priv
=
libvlc_priv
(
p_libvlc
);
char
*
p_tmp
=
NULL
;
char
*
psz_modules
=
NULL
;
char
*
psz_parser
=
NULL
;
char
*
psz_control
=
NULL
;
bool
b_exit
=
false
;
playlist_t
*
p_playlist
=
NULL
;
char
*
psz_val
;
...
...
@@ -313,54 +299,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
/*xgettext: Translate "C" to the language code: "fr", "en_GB", "nl", "ru"... */
msg_Dbg
(
p_libvlc
,
"translation test: code is
\"
%s
\"
"
,
_
(
"C"
)
);
/* Check for short help option */
if
(
var_InheritBool
(
p_libvlc
,
"help"
)
)
{
Help
(
p_libvlc
,
"help"
);
b_exit
=
true
;
}
/* Check for version option */
else
if
(
var_InheritBool
(
p_libvlc
,
"version"
)
)
{
Version
();
b_exit
=
true
;
}
/* Check for help on modules */
else
if
(
(
p_tmp
=
var_InheritString
(
p_libvlc
,
"module"
))
)
{
Help
(
p_libvlc
,
p_tmp
);
free
(
p_tmp
);
b_exit
=
true
;
}
/* Check for full help option */
else
if
(
var_InheritBool
(
p_libvlc
,
"full-help"
)
)
{
var_Create
(
p_libvlc
,
"advanced"
,
VLC_VAR_BOOL
);
var_SetBool
(
p_libvlc
,
"advanced"
,
true
);
var_Create
(
p_libvlc
,
"help-verbose"
,
VLC_VAR_BOOL
);
var_SetBool
(
p_libvlc
,
"help-verbose"
,
true
);
Help
(
p_libvlc
,
"full-help"
);
b_exit
=
true
;
}
/* Check for long help option */
else
if
(
var_InheritBool
(
p_libvlc
,
"longhelp"
)
)
{
Help
(
p_libvlc
,
"longhelp"
);
b_exit
=
true
;
}
/* Check for module list option */
else
if
(
var_InheritBool
(
p_libvlc
,
"list"
)
)
{
ListModules
(
p_libvlc
,
false
);
b_exit
=
true
;
}
else
if
(
var_InheritBool
(
p_libvlc
,
"list-verbose"
)
)
{
ListModules
(
p_libvlc
,
true
);
b_exit
=
true
;
}
if
(
b_exit
)
if
(
config_PrintHelp
(
VLC_OBJECT
(
p_libvlc
)))
{
module_EndBank
(
true
);
return
VLC_EEXITSUCCESS
;
...
...
@@ -1001,699 +940,6 @@ static void GetFilenames( libvlc_int_t *p_vlc, unsigned n,
}
}
/*****************************************************************************
* Help: print program help
*****************************************************************************
* Print a short inline help. Message interface is initialized at this stage.
*****************************************************************************/
static
inline
void
print_help_on_full_help
(
void
)
{
utf8_fprintf
(
stdout
,
"
\n
"
);
utf8_fprintf
(
stdout
,
"%s
\n
"
,
_
(
"To get exhaustive help, use '-H'."
)
);
}
static
const
char
vlc_usage
[]
=
N_
(
"Usage: %s [options] [stream] ..."
"
\n
You can specify multiple streams on the commandline. They will be enqueued in the playlist."
"
\n
The first item specified will be played first."
"
\n
"
"
\n
Options-styles:"
"
\n
--option A global option that is set for the duration of the program."
"
\n
-option A single letter version of a global --option."
"
\n
:option An option that only applies to the stream directly before it"
"
\n
and that overrides previous settings."
"
\n
"
"
\n
Stream MRL syntax:"
"
\n
[[access][/demux]://]URL[@[title][:chapter][-[title][:chapter]]] [:option=value ...]"
"
\n
"
"
\n
Many of the global --options can also be used as MRL specific :options."
"
\n
Multiple :option=value pairs can be specified."
"
\n
"
"
\n
URL syntax:"
"
\n
[file://]filename Plain media file"
"
\n
http://ip:port/file HTTP URL"
"
\n
ftp://ip:port/file FTP URL"
"
\n
mms://ip:port/file MMS URL"
"
\n
screen:// Screen capture"
"
\n
[dvd://][device][@raw_device] DVD device"
"
\n
[vcd://][device] VCD device"
"
\n
[cdda://][device] Audio CD device"
"
\n
udp://[[<source address>]@[<bind address>][:<bind port>]]"
"
\n
UDP stream sent by a streaming server"
"
\n
vlc://pause:<seconds> Special item to pause the playlist for a certain time"
"
\n
vlc://quit Special item to quit VLC"
"
\n
"
);
static
void
Help
(
libvlc_int_t
*
p_this
,
char
const
*
psz_help_name
)
{
#ifdef WIN32
ShowConsole
(
true
);
#endif
if
(
psz_help_name
&&
!
strcmp
(
psz_help_name
,
"help"
)
)
{
utf8_fprintf
(
stdout
,
vlc_usage
,
"vlc"
);
Usage
(
p_this
,
"=help"
);
Usage
(
p_this
,
"=main"
);
print_help_on_full_help
();
}
else
if
(
psz_help_name
&&
!
strcmp
(
psz_help_name
,
"longhelp"
)
)
{
utf8_fprintf
(
stdout
,
vlc_usage
,
"vlc"
);
Usage
(
p_this
,
NULL
);
print_help_on_full_help
();
}
else
if
(
psz_help_name
&&
!
strcmp
(
psz_help_name
,
"full-help"
)
)
{
utf8_fprintf
(
stdout
,
vlc_usage
,
"vlc"
);
Usage
(
p_this
,
NULL
);
}
else
if
(
psz_help_name
)
{
Usage
(
p_this
,
psz_help_name
);
}
#ifdef WIN32
/* Pause the console because it's destroyed when we exit */
PauseConsole
();
#endif
fflush
(
stdout
);
}
/*****************************************************************************
* Usage: print module usage
*****************************************************************************
* Print a short inline help. Message interface is initialized at this stage.
*****************************************************************************/
# define COL(x) "\033[" #x ";1m"
# define RED COL(31)
# define GREEN COL(32)
# define YELLOW COL(33)
# define BLUE COL(34)
# define MAGENTA COL(35)
# define CYAN COL(36)
# define WHITE COL(0)
# define GRAY "\033[0m"
static
void
print_help_section
(
const
module_t
*
m
,
const
module_config_t
*
p_item
,
bool
b_color
,
bool
b_description
)
{
if
(
!
p_item
)
return
;
if
(
b_color
)
{
utf8_fprintf
(
stdout
,
RED
" %s:
\n
"
GRAY
,
module_gettext
(
m
,
p_item
->
psz_text
)
);
if
(
b_description
&&
p_item
->
psz_longtext
)
utf8_fprintf
(
stdout
,
MAGENTA
" %s
\n
"
GRAY
,
module_gettext
(
m
,
p_item
->
psz_longtext
)
);
}
else
{
utf8_fprintf
(
stdout
,
" %s:
\n
"
,
module_gettext
(
m
,
p_item
->
psz_text
)
);
if
(
b_description
&&
p_item
->
psz_longtext
)
utf8_fprintf
(
stdout
,
" %s
\n
"
,
module_gettext
(
m
,
p_item
->
psz_longtext
)
);
}
}
static
void
Usage
(
libvlc_int_t
*
p_this
,
char
const
*
psz_search
)
{
#define FORMAT_STRING " %s --%s%s%s%s%s%s%s "
/* short option ------' | | | | | | |
* option name ------------' | | | | | |
* <bra ---------------------' | | | | |
* option type or "" ----------' | | | |
* ket> -------------------------' | | |
* padding spaces -----------------' | |
* comment --------------------------' |
* comment suffix ---------------------'
*
* The purpose of having bra and ket is that we might i18n them as well.
*/
#define COLOR_FORMAT_STRING (WHITE" %s --%s"YELLOW"%s%s%s%s%s%s "GRAY)
#define COLOR_FORMAT_STRING_BOOL (WHITE" %s --%s%s%s%s%s%s%s "GRAY)
#define LINE_START 8
#define PADDING_SPACES 25
#ifdef WIN32
# define OPTION_VALUE_SEP "="
#else
# define OPTION_VALUE_SEP " "
#endif
char
psz_spaces_text
[
PADDING_SPACES
+
LINE_START
+
1
];
char
psz_spaces_longtext
[
LINE_START
+
3
];
char
psz_format
[
sizeof
(
COLOR_FORMAT_STRING
)];
char
psz_format_bool
[
sizeof
(
COLOR_FORMAT_STRING_BOOL
)];
char
psz_buffer
[
10000
];
char
psz_short
[
4
];
int
i_width
=
ConsoleWidth
()
-
(
PADDING_SPACES
+
LINE_START
+
1
);
int
i_width_description
=
i_width
+
PADDING_SPACES
-
1
;
bool
b_advanced
=
var_InheritBool
(
p_this
,
"advanced"
);
bool
b_description
=
var_InheritBool
(
p_this
,
"help-verbose"
);
bool
b_description_hack
;
bool
b_color
=
var_InheritBool
(
p_this
,
"color"
);
bool
b_has_advanced
=
false
;
bool
b_found
=
false
;
int
i_only_advanced
=
0
;
/* Number of modules ignored because they
* only have advanced options */
bool
b_strict
=
psz_search
&&
*
psz_search
==
'='
;
if
(
b_strict
)
psz_search
++
;
memset
(
psz_spaces_text
,
' '
,
PADDING_SPACES
+
LINE_START
);
psz_spaces_text
[
PADDING_SPACES
+
LINE_START
]
=
'\0'
;
memset
(
psz_spaces_longtext
,
' '
,
LINE_START
+
2
);
psz_spaces_longtext
[
LINE_START
+
2
]
=
'\0'
;
#ifndef WIN32
if
(
!
isatty
(
1
)
)
#endif
b_color
=
false
;
// don't put color control codes in a .txt file
if
(
b_color
)
{
strcpy
(
psz_format
,
COLOR_FORMAT_STRING
);
strcpy
(
psz_format_bool
,
COLOR_FORMAT_STRING_BOOL
);
}
else
{
strcpy
(
psz_format
,
FORMAT_STRING
);
strcpy
(
psz_format_bool
,
FORMAT_STRING
);
}
/* List all modules */
module_t
**
list
=
module_list_get
(
NULL
);
if
(
!
list
)
return
;
/* Ugly hack to make sure that the help options always come first
* (part 1) */
if
(
!
psz_search
)
Usage
(
p_this
,
"help"
);
/* Enumerate the config for each module */
for
(
size_t
i
=
0
;
list
[
i
];
i
++
)
{
bool
b_help_module
;
module_t
*
p_parser
=
list
[
i
];
module_config_t
*
p_item
=
NULL
;
module_config_t
*
p_section
=
NULL
;
module_config_t
*
p_end
=
p_parser
->
p_config
+
p_parser
->
confsize
;
const
char
*
objname
=
module_get_object
(
p_parser
);
if
(
psz_search
&&
(
b_strict
?
strcmp
(
objname
,
psz_search
)
:
!
strstr
(
objname
,
psz_search
)
)
)
{
char
*
const
*
pp_shortcuts
=
p_parser
->
pp_shortcuts
;
unsigned
i
;
for
(
i
=
0
;
i
<
p_parser
->
i_shortcuts
;
i
++
)
{
if
(
b_strict
?
!
strcmp
(
psz_search
,
pp_shortcuts
[
i
]
)
:
!!
strstr
(
pp_shortcuts
[
i
],
psz_search
)
)
break
;
}
if
(
i
==
p_parser
->
i_shortcuts
)
continue
;
}
/* Ignore modules without config options */
if
(
!
p_parser
->
i_config_items
)
{
continue
;
}
b_help_module
=
!
strcmp
(
"help"
,
objname
);
/* Ugly hack to make sure that the help options always come first
* (part 2) */
if
(
!
psz_search
&&
b_help_module
)
continue
;
/* Ignore modules with only advanced config options if requested */
if
(
!
b_advanced
)
{
for
(
p_item
=
p_parser
->
p_config
;
p_item
<
p_end
;
p_item
++
)
{
if
(
CONFIG_ITEM
(
p_item
->
i_type
)
&&
!
p_item
->
b_advanced
&&
!
p_item
->
b_removed
)
break
;
}
if
(
p_item
==
p_end
)
{
i_only_advanced
++
;
continue
;
}
}
b_found
=
true
;
/* Print name of module */
if
(
strcmp
(
"main"
,
objname
)
)
{
if
(
b_color
)
utf8_fprintf
(
stdout
,
"
\n
"
GREEN
"%s"
GRAY
" (%s)
\n
"
,
module_gettext
(
p_parser
,
p_parser
->
psz_longname
),
objname
);
else
utf8_fprintf
(
stdout
,
"
\n
%s
\n
"
,
module_gettext
(
p_parser
,
p_parser
->
psz_longname
)
);
}
if
(
p_parser
->
psz_help
)
{
if
(
b_color
)
utf8_fprintf
(
stdout
,
CYAN
" %s
\n
"
GRAY
,
module_gettext
(
p_parser
,
p_parser
->
psz_help
)
);
else
utf8_fprintf
(
stdout
,
" %s
\n
"
,
module_gettext
(
p_parser
,
p_parser
->
psz_help
)
);
}
/* Print module options */
for
(
p_item
=
p_parser
->
p_config
;
p_item
<
p_end
;
p_item
++
)
{
char
*
psz_text
,
*
psz_spaces
=
psz_spaces_text
;
const
char
*
psz_bra
=
NULL
,
*
psz_type
=
NULL
,
*
psz_ket
=
NULL
;
const
char
*
psz_suf
=
""
,
*
psz_prefix
=
NULL
;
signed
int
i
;
size_t
i_cur_width
;
/* Skip removed options */
if
(
p_item
->
b_removed
)
{
continue
;
}
/* Skip advanced options if requested */
if
(
p_item
->
b_advanced
&&
!
b_advanced
)
{
b_has_advanced
=
true
;
continue
;
}
switch
(
CONFIG_CLASS
(
p_item
->
i_type
)
)
{
case
0
:
// hint class
switch
(
p_item
->
i_type
)
{
case
CONFIG_HINT_CATEGORY
:
case
CONFIG_HINT_USAGE
:
if
(
!
strcmp
(
"main"
,
objname
)
)
{
if
(
b_color
)
utf8_fprintf
(
stdout
,
GREEN
"
\n
%s
\n
"
GRAY
,
module_gettext
(
p_parser
,
p_item
->
psz_text
)
);
else
utf8_fprintf
(
stdout
,
"
\n
%s
\n
"
,
module_gettext
(
p_parser
,
p_item
->
psz_text
)
);
}
if
(
b_description
&&
p_item
->
psz_longtext
)
{
if
(
b_color
)
utf8_fprintf
(
stdout
,
CYAN
" %s
\n
"
GRAY
,
module_gettext
(
p_parser
,
p_item
->
psz_longtext
)
);
else
utf8_fprintf
(
stdout
,
" %s
\n
"
,
module_gettext
(
p_parser
,
p_item
->
psz_longtext
)
);
}
break
;
case
CONFIG_HINT_SUBCATEGORY
:
if
(
strcmp
(
"main"
,
objname
)
)
break
;
case
CONFIG_SECTION
:
p_section
=
p_item
;
break
;
}
break
;
case
CONFIG_ITEM_STRING
:
print_help_section
(
p_parser
,
p_section
,
b_color
,
b_description
);
p_section
=
NULL
;
psz_bra
=
OPTION_VALUE_SEP
"<"
;
psz_type
=
_
(
"string"
);
psz_ket
=
">"
;
if
(
p_item
->
ppsz_list
)
{
psz_bra
=
OPTION_VALUE_SEP
"{"
;
psz_type
=
psz_buffer
;
psz_buffer
[
0
]
=
'\0'
;
for
(
i
=
0
;
p_item
->
ppsz_list
[
i
];
i
++
)
{
if
(
i
)
strcat
(
psz_buffer
,
","
);
strcat
(
psz_buffer
,
p_item
->
ppsz_list
[
i
]
);
}
psz_ket
=
"}"
;
}
break
;
case
CONFIG_ITEM_INTEGER
:
print_help_section
(
p_parser
,
p_section
,
b_color
,
b_description
);
p_section
=
NULL
;
psz_bra
=
OPTION_VALUE_SEP
"<"
;
psz_type
=
_
(
"integer"
);
psz_ket
=
">"
;
if
(
p_item
->
min
.
i
||
p_item
->
max
.
i
)
{
sprintf
(
psz_buffer
,
"%s [%"
PRId64
" .. %"
PRId64
"]"
,
psz_type
,
p_item
->
min
.
i
,
p_item
->
max
.
i
);
psz_type
=
psz_buffer
;
}
if
(
p_item
->
i_list
)
{
psz_bra
=
OPTION_VALUE_SEP
"{"
;
psz_type
=
psz_buffer
;
psz_buffer
[
0
]
=
'\0'
;
for
(
i
=
0
;
p_item
->
ppsz_list_text
[
i
];
i
++
)
{
if
(
i
)
strcat
(
psz_buffer
,
", "
);
sprintf
(
psz_buffer
+
strlen
(
psz_buffer
),
"%i (%s)"
,
p_item
->
pi_list
[
i
],
module_gettext
(
p_parser
,
p_item
->
ppsz_list_text
[
i
]
)
);
}
psz_ket
=
"}"
;
}
break
;
case
CONFIG_ITEM_FLOAT
:
print_help_section
(
p_parser
,
p_section
,
b_color
,
b_description
);
p_section
=
NULL
;
psz_bra
=
OPTION_VALUE_SEP
"<"
;
psz_type
=
_
(
"float"
);
psz_ket
=
">"
;
if
(
p_item
->
min
.
f
||
p_item
->
max
.
f
)
{
sprintf
(
psz_buffer
,
"%s [%f .. %f]"
,
psz_type
,
p_item
->
min
.
f
,
p_item
->
max
.
f
);
psz_type
=
psz_buffer
;
}
break
;
case
CONFIG_ITEM_BOOL
:
print_help_section
(
p_parser
,
p_section
,
b_color
,
b_description
);
p_section
=
NULL
;
psz_bra
=
""
;
psz_type
=
""
;
psz_ket
=
""
;
if
(
!
b_help_module
)
{
psz_suf
=
p_item
->
value
.
i
?
_
(
" (default enabled)"
)
:
_
(
" (default disabled)"
);
}
break
;
}
if
(
!
psz_type
)
{
continue
;
}
/* Add short option if any */
if
(
p_item
->
i_short
)
{
sprintf
(
psz_short
,
"-%c,"
,
p_item
->
i_short
);
}
else
{
strcpy
(
psz_short
,
" "
);
}
i
=
PADDING_SPACES
-
strlen
(
p_item
->
psz_name
)
-
strlen
(
psz_bra
)
-
strlen
(
psz_type
)
-
strlen
(
psz_ket
)
-
1
;
if
(
CONFIG_CLASS
(
p_item
->
i_type
)
==
CONFIG_ITEM_BOOL
&&
!
b_help_module
)
{
psz_prefix
=
", --no-"
;
i
-=
strlen
(
p_item
->
psz_name
)
+
strlen
(
psz_prefix
);
}
if
(
i
<
0
)
{
psz_spaces
[
0
]
=
'\n'
;
i
=
0
;
}
else
{
psz_spaces
[
i
]
=
'\0'
;
}
if
(
CONFIG_CLASS
(
p_item
->
i_type
)
==
CONFIG_ITEM_BOOL
&&
!
b_help_module
)
{
utf8_fprintf
(
stdout
,
psz_format_bool
,
psz_short
,
p_item
->
psz_name
,
psz_prefix
,
p_item
->
psz_name
,
psz_bra
,
psz_type
,
psz_ket
,
psz_spaces
);
}
else
{
utf8_fprintf
(
stdout
,
psz_format
,
psz_short
,
p_item
->
psz_name
,
""
,
""
,
psz_bra
,
psz_type
,
psz_ket
,
psz_spaces
);
}
psz_spaces
[
i
]
=
' '
;
/* We wrap the rest of the output */
sprintf
(
psz_buffer
,
"%s%s"
,
module_gettext
(
p_parser
,
p_item
->
psz_text
),
psz_suf
);
b_description_hack
=
b_description
;
description:
psz_text
=
psz_buffer
;
i_cur_width
=
b_description
&&
!
b_description_hack
?
i_width_description
:
i_width
;
if
(
!*
psz_text
)
strcpy
(
psz_text
,
" "
);
while
(
*
psz_text
)
{
char
*
psz_parser
,
*
psz_word
;
size_t
i_end
=
strlen
(
psz_text
);
/* If the remaining text fits in a line, print it. */
if
(
i_end
<=
i_cur_width
)
{
if
(
b_color
)
{
if
(
!
b_description
||
b_description_hack
)
utf8_fprintf
(
stdout
,
BLUE
"%s
\n
"
GRAY
,
psz_text
);
else
utf8_fprintf
(
stdout
,
"%s
\n
"
,
psz_text
);
}
else
{
utf8_fprintf
(
stdout
,
"%s
\n
"
,
psz_text
);
}
break
;
}
/* Otherwise, eat as many words as possible */
psz_parser
=
psz_text
;
do
{
psz_word
=
psz_parser
;
psz_parser
=
strchr
(
psz_word
,
' '
);
/* If no space was found, we reached the end of the text
* block; otherwise, we skip the space we just found. */
psz_parser
=
psz_parser
?
psz_parser
+
1
:
psz_text
+
i_end
;
}
while
(
(
size_t
)(
psz_parser
-
psz_text
)
<=
i_cur_width
);
/* We cut a word in one of these cases:
* - it's the only word in the line and it's too long.
* - we used less than 80% of the width and the word we are
* going to wrap is longer than 40% of the width, and even
* if the word would have fit in the next line. */
if
(
psz_word
==
psz_text
||
(
(
size_t
)(
psz_word
-
psz_text
)
<
80
*
i_cur_width
/
100
&&
(
size_t
)(
psz_parser
-
psz_word
)
>
40
*
i_cur_width
/
100
)
)
{
char
c
=
psz_text
[
i_cur_width
];
psz_text
[
i_cur_width
]
=
'\0'
;
if
(
b_color
)
{
if
(
!
b_description
||
b_description_hack
)
utf8_fprintf
(
stdout
,
BLUE
"%s
\n
%s"
GRAY
,
psz_text
,
psz_spaces
);
else
utf8_fprintf
(
stdout
,
"%s
\n
%s"
,
psz_text
,
psz_spaces
);
}
else
{
utf8_fprintf
(
stdout
,
"%s
\n
%s"
,
psz_text
,
psz_spaces
);
}
psz_text
+=
i_cur_width
;
psz_text
[
0
]
=
c
;
}
else
{
psz_word
[
-
1
]
=
'\0'
;
if
(
b_color
)
{
if
(
!
b_description
||
b_description_hack
)
utf8_fprintf
(
stdout
,
BLUE
"%s
\n
%s"
GRAY
,
psz_text
,
psz_spaces
);
else
utf8_fprintf
(
stdout
,
"%s
\n
%s"
,
psz_text
,
psz_spaces
);
}
else
{
utf8_fprintf
(
stdout
,
"%s
\n
%s"
,
psz_text
,
psz_spaces
);
}
psz_text
=
psz_word
;
}
}
if
(
b_description_hack
&&
p_item
->
psz_longtext
)
{
sprintf
(
psz_buffer
,
"%s%s"
,
module_gettext
(
p_parser
,
p_item
->
psz_longtext
),
psz_suf
);
b_description_hack
=
false
;
psz_spaces
=
psz_spaces_longtext
;
utf8_fprintf
(
stdout
,
"%s"
,
psz_spaces
);
goto
description
;
}
}
}
if
(
b_has_advanced
)
{
if
(
b_color
)
utf8_fprintf
(
stdout
,
"
\n
"
WHITE
"%s"
GRAY
" %s
\n
"
,
_
(
"Note:"
),
_
(
"add --advanced to your command line to see advanced options."
));
else
utf8_fprintf
(
stdout
,
"
\n
%s %s
\n
"
,
_
(
"Note:"
),
_
(
"add --advanced to your command line to see advanced options."
));
}
if
(
i_only_advanced
>
0
)
{
if
(
b_color
)
{
utf8_fprintf
(
stdout
,
"
\n
"
WHITE
"%s"
GRAY
" "
,
_
(
"Note:"
)
);
utf8_fprintf
(
stdout
,
_
(
"%d module(s) were not displayed because they only have advanced options.
\n
"
),
i_only_advanced
);
}
else
{
utf8_fprintf
(
stdout
,
"
\n
%s "
,
_
(
"Note:"
)
);
utf8_fprintf
(
stdout
,
_
(
"%d module(s) were not displayed because they only have advanced options.
\n
"
),
i_only_advanced
);
}
}
else
if
(
!
b_found
)
{
if
(
b_color
)
utf8_fprintf
(
stdout
,
"
\n
"
WHITE
"%s"
GRAY
"
\n
"
,
_
(
"No matching module found. Use --list or "
\
"--list-verbose to list available modules."
)
);
else
utf8_fprintf
(
stdout
,
"
\n
%s
\n
"
,
_
(
"No matching module found. Use --list or "
\
"--list-verbose to list available modules."
)
);
}
/* Release the module list */
module_list_free
(
list
);
}
/*****************************************************************************
* ListModules: list the available modules with their description
*****************************************************************************
* Print a list of all available modules (builtins and plugins) and a short
* description for each one.
*****************************************************************************/
static
void
ListModules
(
libvlc_int_t
*
p_this
,
bool
b_verbose
)
{
module_t
*
p_parser
;
bool
b_color
=
var_InheritBool
(
p_this
,
"color"
);
#ifdef WIN32
ShowConsole
(
true
);
b_color
=
false
;
// don't put color control codes in a .txt file
#else
if
(
!
isatty
(
1
)
)
b_color
=
false
;
#endif
/* List all modules */
module_t
**
list
=
module_list_get
(
NULL
);
/* Enumerate each module */
for
(
size_t
j
=
0
;
(
p_parser
=
list
[
j
])
!=
NULL
;
j
++
)
{
const
char
*
objname
=
module_get_object
(
p_parser
);
if
(
b_color
)
utf8_fprintf
(
stdout
,
GREEN
" %-22s "
WHITE
"%s
\n
"
GRAY
,
objname
,
module_gettext
(
p_parser
,
p_parser
->
psz_longname
)
);
else
utf8_fprintf
(
stdout
,
" %-22s %s
\n
"
,
objname
,
module_gettext
(
p_parser
,
p_parser
->
psz_longname
)
);
if
(
b_verbose
)
{
char
*
const
*
pp_shortcuts
=
p_parser
->
pp_shortcuts
;
for
(
unsigned
i
=
0
;
i
<
p_parser
->
i_shortcuts
;
i
++
)
{
if
(
strcmp
(
pp_shortcuts
[
i
],
objname
)
)
{
if
(
b_color
)
utf8_fprintf
(
stdout
,
CYAN
" s %s
\n
"
GRAY
,
pp_shortcuts
[
i
]
);
else
utf8_fprintf
(
stdout
,
" s %s
\n
"
,
pp_shortcuts
[
i
]
);
}
}
if
(
p_parser
->
psz_capability
)
{
if
(
b_color
)
utf8_fprintf
(
stdout
,
MAGENTA
" c %s (%d)
\n
"
GRAY
,
p_parser
->
psz_capability
,
p_parser
->
i_score
);
else
utf8_fprintf
(
stdout
,
" c %s (%d)
\n
"
,
p_parser
->
psz_capability
,
p_parser
->
i_score
);
}
}
}
module_list_free
(
list
);
#ifdef WIN32
/* Pause the console because it's destroyed when we exit */
PauseConsole
();
#endif
}
/*****************************************************************************
* Version: print complete program version
*****************************************************************************
* Print complete program version and build number.
*****************************************************************************/
static
void
Version
(
void
)
{
#ifdef WIN32
ShowConsole
(
true
);
#endif
utf8_fprintf
(
stdout
,
_
(
"VLC version %s (%s)
\n
"
),
VERSION_MESSAGE
,
psz_vlc_changeset
);
utf8_fprintf
(
stdout
,
_
(
"Compiled by %s on %s (%s)
\n
"
),
VLC_CompileBy
(),
VLC_CompileHost
(),
__DATE__
" "
__TIME__
);
utf8_fprintf
(
stdout
,
_
(
"Compiler: %s
\n
"
),
VLC_Compiler
()
);
utf8_fprintf
(
stdout
,
"%s"
,
LICENSE_MSG
);
#ifdef WIN32
/* Pause the console because it's destroyed when we exit */
PauseConsole
();
#endif
}
/*****************************************************************************
* ShowConsole: On Win32, create an output console for debug messages
*****************************************************************************
...
...
@@ -1748,31 +994,3 @@ static void PauseConsole( void )
# endif
}
#endif
/*****************************************************************************
* ConsoleWidth: Return the console width in characters
*****************************************************************************
* We use the stty shell command to get the console width; if this fails or
* if the width is less than 80, we default to 80.
*****************************************************************************/
static
int
ConsoleWidth
(
void
)
{
unsigned
i_width
=
80
;
#ifndef WIN32
FILE
*
file
=
popen
(
"stty size 2>/dev/null"
,
"r"
);
if
(
file
!=
NULL
)
{
if
(
fscanf
(
file
,
"%*u %u"
,
&
i_width
)
<=
0
)
i_width
=
80
;
pclose
(
file
);
}
#elif !defined (UNDER_CE)
CONSOLE_SCREEN_BUFFER_INFO
buf
;
if
(
GetConsoleScreenBufferInfo
(
GetStdHandle
(
STD_OUTPUT_HANDLE
),
&
buf
))
i_width
=
buf
.
dwSize
.
X
;
#endif
return
i_width
;
}
src/libvlc.h
View file @
679018d1
...
...
@@ -25,6 +25,8 @@
#ifndef LIBVLC_LIBVLC_H
# define LIBVLC_LIBVLC_H 1
extern
const
char
psz_vlc_changeset
[];
typedef
struct
variable_t
variable_t
;
/* Actions (hot keys) */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment