diff --git a/retroarch.c b/retroarch.c index 99f1b942e9..665f0933ef 100644 --- a/retroarch.c +++ b/retroarch.c @@ -4085,173 +4085,209 @@ static void retroarch_print_version(void) **/ static void retroarch_print_help(const char *arg0) { + char buf[2048]; + buf[0] = '\0'; + frontend_driver_attach_console(); + fputs("\n", stdout); puts("==================================================================="); retroarch_print_version(); puts("==================================================================="); + fputs("\n", stdout); - printf("Usage: %s [OPTIONS]... [FILE]\n", arg0); + printf("Usage: %s [OPTIONS]... [FILE]\n\n", arg0); - { - char buf[2720]; - buf[0] = '\0'; - - strlcpy(buf, " -h, --help Show this help message.\n", sizeof(buf)); - strlcat(buf, " -v, --verbose Verbose logging.\n", sizeof(buf)); - strlcat(buf, " --log-file FILE Log messages to FILE.\n", sizeof(buf)); - strlcat(buf, " --version Show version.\n", sizeof(buf)); - strlcat(buf, " --features Prints available features compiled into " - "program.\n", sizeof(buf)); + strlcat(buf, " -h, --help " + "Show this help message.\n", sizeof(buf)); + strlcat(buf, " -v, --verbose " + "Verbose logging.\n", sizeof(buf)); + strlcat(buf, " --log-file=FILE " + "Log messages to FILE.\n", sizeof(buf)); + strlcat(buf, " --version " + "Show version.\n", sizeof(buf)); + strlcat(buf, " --features " + "Print available features compiled into program.\n", sizeof(buf)); #ifdef HAVE_MENU - strlcat(buf, " --menu Do not require content or libretro core to " - "be loaded,\n" - " starts directly in menu. If no arguments " - "are passed to\n" - " the program, it is equivalent to using " - "--menu as only argument.\n", sizeof(buf)); + strlcat(buf, " --menu " + "Do not require content or libretro core to be loaded,\n", sizeof(buf)); + strlcat(buf, " " + " starts directly in menu. If no arguments are passed to\n", sizeof(buf)); + strlcat(buf, " " + " the program, it is equivalent to using --menu as only argument.\n", sizeof(buf)); #endif - strlcat(buf, " -s, --save=PATH Path for save files (*.srm). (DEPRECATED, use --appendconfig and savefile_directory)\n", sizeof(buf)); - strlcat(buf, " -S, --savestate=PATH Path for the save state files (*.state). (DEPRECATED, use --appendconfig and savestate_directory)\n", sizeof(buf)); - strlcat(buf, " --set-shader PATH Path to a shader (preset) that will be loaded each time content is loaded.\n" - " Effectively overrides automatic shader presets.\n" - " An empty argument \"\" will disable automatic shader presets.\n", sizeof(buf)); - strlcat(buf, " -f, --fullscreen Start the program in fullscreen regardless " - "of config settings.\n", sizeof(buf)); #ifdef HAVE_CONFIGFILE + strlcat(buf, " -c, --config=FILE " + "Path for config file.\n", sizeof(buf)); #ifdef _WIN32 - strlcat(buf, " -c, --config=FILE Path for config file." - "\n\t\tDefaults to retroarch.cfg in same directory as retroarch.exe." - "\n\t\tIf a default config is not found, the program will attempt to " - "create one.\n" - , sizeof(buf)); + strlcat(buf, " " + " Defaults to retroarch.cfg in same directory as retroarch.exe.\n", sizeof(buf)); + strlcat(buf, " " + " If a default config is not found, the program will attempt to create one.\n", sizeof(buf)); #else - strlcat(buf, " -c, --config=FILE Path for config file." - "\n\t\tBy default looks for config in $XDG_CONFIG_HOME/retroarch/" - "retroarch.cfg,\n\t\t$HOME/.config/retroarch/retroarch.cfg,\n\t\t" - "and $HOME/.retroarch.cfg.\n\t\tIf a default config is not found, " - "the program will attempt to create one based on the \n\t\t" - "skeleton config (" GLOBAL_CONFIG_DIR "/retroarch.cfg). \n" - , sizeof(buf)); + strlcat(buf, " " + " By default looks for config in\n", sizeof(buf)); + strlcat(buf, " " + " $XDG_CONFIG_HOME/retroarch/retroarch.cfg,\n", sizeof(buf)); + strlcat(buf, " " + " $HOME/.config/retroarch/retroarch.cfg, and\n", sizeof(buf)); + strlcat(buf, " " + " $HOME/.retroarch.cfg.\n", sizeof(buf)); + strlcat(buf, " " + " If a default config is not found, the program will attempt to create one\n", sizeof(buf)); + strlcat(buf, " " + " based on the skeleton config (" GLOBAL_CONFIG_DIR "/retroarch.cfg).\n", sizeof(buf)); #endif + strlcat(buf, " --appendconfig=FILE " + "Extra config files are loaded in, and take priority over\n", sizeof(buf)); + strlcat(buf, " " + " config selected in -c (or default). Multiple configs are\n", sizeof(buf)); + strlcat(buf, " " + " delimited by '|'.\n", sizeof(buf)); #endif - strlcat(buf, " --appendconfig=FILE\n" - " Extra config files are loaded in, " - "and take priority over\n" - " config selected in -c (or default). " - "Multiple configs are\n" - " delimited by '|'.\n", sizeof(buf)); + + fputs(buf, stdout); + buf[0] = '\0'; + #ifdef HAVE_DYNAMIC - /* Note: Must strlcat the the string literal in two passes - * due to C89 limitations (509 character limit) */ - strlcat(buf, " -L, --libretro=FILE Path to libretro implementation. " - "Overrides any config setting. FILE may be one of the following:" - , sizeof(buf)); - strlcat(buf, - "\n\t\t1. The full path to a core shared object library: path/to/<core_name>_libretro.<lib_ext>" - "\n\t\t2. A core shared object library 'file name' (*): <core_name>_libretro.<lib_ext>" - "\n\t\t3. A core 'short name' (*): <core_name>_libretro OR <core_name>" - "\n\t\t(*) If 'file name' or 'short name' do not correspond to an existing full file path," - "\n\t\t the configured frontend 'cores' directory will be searched for a match\n" - , sizeof(buf)); + strlcat(buf, " -L, --libretro=FILE " + "Path to libretro implementation. Overrides any config setting.\n", sizeof(buf)); + strlcat(buf, " " + " FILE may be one of the following:\n", sizeof(buf)); + strlcat(buf, " " + " 1. The full path to a core shared object library: path/to/<core_name>_libretro.<lib_ext>\n", sizeof(buf)); + strlcat(buf, " " + " 2. A core shared object library 'file name' (*): <core_name>_libretro.<lib_ext>\n", sizeof(buf)); + strlcat(buf, " " + " 3. A core 'short name' (*): <core_name>_libretro OR <core_name>\n", sizeof(buf)); + strlcat(buf, " " + " (*) If 'file name' or 'short name' do not correspond to an existing full file path,\n", sizeof(buf)); + strlcat(buf, " " + " the configured frontend 'cores' directory will be searched for a match.\n", sizeof(buf)); #endif - strlcat(buf, " --subsystem=NAME Use a subsystem of the libretro core. " - "Multiple content\n" - " files are loaded as multiple arguments. " - "If a content\n" - " file is skipped, use a blank (\"\") " - "command line argument.\n" - " Content must be loaded in an order " - "which depends on the\n" - " particular subsystem used. See verbose " - "log output to learn\n" - " how a particular subsystem wants content " - "to be loaded.\n", sizeof(buf)); - puts(buf); - } - printf(" -N, --nodevice=PORT\n" - " Disconnects controller device connected " - "to PORT (1 to %d).\n", MAX_USERS); - printf(" -A, --dualanalog=PORT\n" - " Connect a DualAnalog controller to PORT " - "(1 to %d).\n", MAX_USERS); - printf(" -d, --device=PORT:ID\n" - " Connect a generic device into PORT of " - "the device (1 to %d).\n", MAX_USERS); + strlcat(buf, " --subsystem=NAME " + "Use a subsystem of the libretro core. Multiple content\n", sizeof(buf)); + strlcat(buf, " " + " files are loaded as multiple arguments. If a content\n", sizeof(buf)); + strlcat(buf, " " + " file is skipped, use a blank (\"\") command line argument.\n", sizeof(buf)); + strlcat(buf, " " + " Content must be loaded in an order which depends on the\n", sizeof(buf)); + strlcat(buf, " " + " particular subsystem used. See verbose log output to learn\n", sizeof(buf)); + strlcat(buf, " " + " how a particular subsystem wants content to be loaded.\n", sizeof(buf)); + + strlcat(buf, " -f, --fullscreen " + "Start the program in fullscreen regardless of config setting.\n", sizeof(buf)); + strlcat(buf, " --set-shader=PATH " + "Path to a shader (preset) that will be loaded each time content is loaded.\n", sizeof(buf)); + strlcat(buf, " " + " Effectively overrides automatic shader presets.\n", sizeof(buf)); + strlcat(buf, " " + " An empty argument \"\" will disable automatic shader presets.\n", sizeof(buf)); + + fputs(buf, stdout); + buf[0] = '\0'; + + printf( " -N, --nodevice=PORT " + "Disconnects controller device connected to PORT (1 to %d).\n", MAX_USERS); + printf( " -A, --dualanalog=PORT " + "Connect a DualAnalog controller to PORT (1 to %d).\n", MAX_USERS); + printf( " -d, --device=PORT:ID " + "Connect a generic device into PORT of the device (1 to %d).\n", MAX_USERS); + strlcat(buf, " " + " Format is PORT:ID, where ID is a number corresponding to the particular device.\n", sizeof(buf)); + + strlcat(buf, " -M, --sram-mode=MODE " + "SRAM handling mode. MODE can be:\n", sizeof(buf)); + strlcat(buf, " " + " 'noload-nosave', 'noload-save', 'load-nosave' or 'load-save'.\n", sizeof(buf)); + strlcat(buf, " " + " Note: 'noload-save' implies that save files *WILL BE OVERWRITTEN*.\n", sizeof(buf)); - { - char buf[2560]; - buf[0] = '\0'; - strlcpy(buf, " Format is PORT:ID, where ID is a number " - "corresponding to the particular device.\n", sizeof(buf)); -#ifdef HAVE_BSV_MOVIE - strlcat(buf, " -P, --bsvplay=FILE Playback a BSV movie file.\n", sizeof(buf)); - strlcat(buf, " -R, --bsvrecord=FILE Start recording a BSV movie file from " - "the beginning.\n", sizeof(buf)); - strlcat(buf, " --eof-exit Exit upon reaching the end of the " - "BSV movie file.\n", sizeof(buf)); -#endif - strlcat(buf, " -M, --sram-mode=MODE SRAM handling mode. MODE can be " - "'noload-nosave',\n" - " 'noload-save', 'load-nosave' or " - "'load-save'.\n" - " Note: 'noload-save' implies that " - "save files *WILL BE OVERWRITTEN*.\n", sizeof(buf)); #ifdef HAVE_NETWORKING - strlcat(buf, " -H, --host Host netplay as user 1.\n", sizeof(buf)); - strlcat(buf, " -C, --connect=HOST Connect to netplay server as user 2.\n", sizeof(buf)); - strlcat(buf, " --port=PORT Port used to netplay. Default is 55435.\n", sizeof(buf)); - strlcat(buf, " --stateless Use \"stateless\" mode for netplay\n", sizeof(buf)); - strlcat(buf, " (requires a very fast network).\n", sizeof(buf)); - strlcat(buf, " --check-frames=NUMBER\n" - " Check frames when using netplay.\n", sizeof(buf)); + strlcat(buf, " -H, --host " + "Host netplay as user 1.\n", sizeof(buf)); + strlcat(buf, " -C, --connect=HOST " + "Connect to netplay server as user 2.\n", sizeof(buf)); + strlcat(buf, " --port=PORT " + "Port used to netplay. Default is 55435.\n", sizeof(buf)); + strlcat(buf, " --nick=NICK " + "Picks a username (for use with netplay). Not mandatory.\n", sizeof(buf)); + strlcat(buf, " --stateless " + "Use \"stateless\" mode for netplay (requires a very fast network).\n", sizeof(buf)); + strlcat(buf, " --check-frames=NUMBER " + "Check frames when using netplay.\n", sizeof(buf)); #ifdef HAVE_NETWORK_CMD - strlcat(buf, " --command Sends a command over UDP to an already " - "running program process.\n", sizeof(buf)); - strlcat(buf, " Available commands are listed if command is invalid.\n", sizeof(buf)); + strlcat(buf, " --command " + "Sends a command over UDP to an already running program process.\n", sizeof(buf)); + strlcat(buf, " " + " Available commands are listed if command is invalid.\n", sizeof(buf)); +#endif #endif +#ifdef HAVE_BSV_MOVIE + strlcat(buf, " -P, --bsvplay=FILE " + "Playback a BSV movie file.\n", sizeof(buf)); + strlcat(buf, " -R, --bsvrecord=FILE " + "Start recording a BSV movie file from the beginning.\n", sizeof(buf)); + strlcat(buf, " --eof-exit " + "Exit upon reaching the end of the BSV movie file.\n", sizeof(buf)); #endif - strlcat(buf, " --nick=NICK Picks a username (for use with netplay). " - "Not mandatory.\n", sizeof(buf)); - strlcat(buf, " -r, --record=FILE Path to record video file.\n " - "Using .mkv extension is recommended.\n", sizeof(buf)); - strlcat(buf, " --recordconfig Path to settings used during recording.\n", sizeof(buf)); - strlcat(buf, " --size=WIDTHxHEIGHT\n" - " Overrides output video size when recording.\n", sizeof(buf)); + strlcat(buf, " -r, --record=FILE " + "Path to record video file. Using mkv extension is recommended.\n", sizeof(buf)); + strlcat(buf, " --recordconfig " + "Path to settings used during recording.\n", sizeof(buf)); + strlcat(buf, " --size=WIDTHxHEIGHT " + "Overrides output video size when recording.\n", sizeof(buf)); + + fputs(buf, stdout); + buf[0] = '\0'; + + strlcat(buf, " -D, --detach " + "Detach program from the running console. Not relevant for all platforms.\n", sizeof(buf)); + strlcat(buf, " --max-frames=NUMBER " + "Runs for the specified number of frames, then exits.\n", sizeof(buf)); + #ifdef HAVE_PATCH - strlcat(buf, " -U, --ups=FILE Specifies path for UPS patch that will be " - "applied to content.\n", sizeof(buf)); - strlcat(buf, " --bps=FILE Specifies path for BPS patch that will be " - "applied to content.\n", sizeof(buf)); - strlcat(buf, " --ips=FILE Specifies path for IPS patch that will be " - "applied to content.\n", sizeof(buf)); - strlcat(buf, " --no-patch Disables all forms of content patching.\n", sizeof(buf)); + strlcat(buf, " -U, --ups=FILE " + "Specifies path for UPS patch that will be applied to content.\n", sizeof(buf)); + strlcat(buf, " --bps=FILE " + "Specifies path for BPS patch that will be applied to content.\n", sizeof(buf)); + strlcat(buf, " --ips=FILE " + "Specifies path for IPS patch that will be applied to content.\n", sizeof(buf)); + strlcat(buf, " --no-patch " + "Disables all forms of content patching.\n", sizeof(buf)); #endif - strlcat(buf, " -D, --detach Detach program from the running console. " - "Not relevant for all platforms.\n", sizeof(buf)); - strlcat(buf, " --max-frames=NUMBER\n" - " Runs for the specified number of frames, " - "then exits.\n", sizeof(buf)); + #ifdef HAVE_SCREENSHOTS - strlcat(buf, " --max-frames-ss\n" - " Takes a screenshot at the end of max-frames.\n", sizeof(buf)); - strlcat(buf, " --max-frames-ss-path=FILE\n" - " Path to save the screenshot to at the end of max-frames.\n", sizeof(buf)); + strlcat(buf, " --max-frames-ss " + "Takes a screenshot at the end of max-frames.\n", sizeof(buf)); + strlcat(buf, " --max-frames-ss-path=FILE " + "Path to save the screenshot to at the end of max-frames.\n", sizeof(buf)); #endif + #ifdef HAVE_ACCESSIBILITY - strlcat(buf, " --accessibility\n" - " Enables accessibilty for blind users using text-to-speech.\n", sizeof(buf)); + strlcat(buf, " --accessibility " + "Enables accessibilty for blind users using text-to-speech.\n", sizeof(buf)); #endif - strlcat(buf, " --load-menu-on-error\n" - " Open menu instead of quitting if specified core or content fails to load.\n", sizeof(buf)); - strlcat(buf, " -e, --entryslot=NUMBER\n" - " Slot from which to load an entry state\n", sizeof(buf)); - puts(buf); - } + + strlcat(buf, " --load-menu-on-error " + "Open menu instead of quitting if specified core or content fails to load.\n", sizeof(buf)); + strlcat(buf, " -e, --entryslot=NUMBER " + "Slot from which to load an entry state.\n", sizeof(buf)); + + strlcat(buf, " -s, --save=PATH " + "Path for save files (*.srm). (DEPRECATED, use --appendconfig and savefile_directory)\n", sizeof(buf)); + strlcat(buf, " -S, --savestate=PATH " + "Path for the save state files (*.state). (DEPRECATED, use --appendconfig and savestate_directory)\n", sizeof(buf)); + + fputs(buf, stdout); + fputs("\n", stdout); } #ifdef HAVE_DYNAMIC