summaryrefslogtreecommitdiff
path: root/Build/source/utils/texinfo/info/info.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/texinfo/info/info.c')
-rw-r--r--Build/source/utils/texinfo/info/info.c700
1 files changed, 0 insertions, 700 deletions
diff --git a/Build/source/utils/texinfo/info/info.c b/Build/source/utils/texinfo/info/info.c
deleted file mode 100644
index 38414257d93..00000000000
--- a/Build/source/utils/texinfo/info/info.c
+++ /dev/null
@@ -1,700 +0,0 @@
-/* info.c -- Display nodes of Info files in multiple windows.
- $Id: info.c,v 1.30 2008/03/20 18:37:58 karl Exp $
-
- Copyright (C) 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
- 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
-
- 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 3 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, see <http://www.gnu.org/licenses/>.
-
- Originally written by Brian Fox (bfox@ai.mit.edu). */
-
-#include "info.h"
-#include "indices.h"
-#include "dribble.h"
-#include "getopt.h"
-#if defined (HANDLE_MAN_PAGES)
-# include "man.h"
-#endif /* HANDLE_MAN_PAGES */
-
-char *program_name = "info";
-
-/* Non-zero means search all indices for APROPOS_SEARCH_STRING. */
-static int apropos_p = 0;
-
-/* Variable containing the string to search for when apropos_p is non-zero. */
-static char *apropos_search_string = (char *)NULL;
-
-/* Non-zero means search all indices for INDEX_SEARCH_STRING. Unlike
- apropos, this puts the user at the node, running info. */
-static int index_search_p = 0;
-
-/* Non-zero means look for the node which describes the invocation
- and command-line options of the program, and start the info
- session at that node. */
-static int goto_invocation_p = 0;
-
-/* Variable containing the string to search for when index_search_p is
- non-zero. */
-static char *index_search_string = (char *)NULL;
-
-/* Non-zero means print version info only. */
-static int print_version_p = 0;
-
-/* Non-zero means print a short description of the options. */
-static int print_help_p = 0;
-
-/* Array of the names of nodes that the user specified with "--node" on the
- command line. */
-static char **user_nodenames = (char **)NULL;
-static int user_nodenames_index = 0;
-static int user_nodenames_slots = 0;
-
-/* String specifying the first file to load. This string can only be set
- by the user specifying "--file" on the command line. */
-static char *user_filename = (char *)NULL;
-
-/* String specifying the name of the file to dump nodes to. This value is
- filled if the user speficies "--output" on the command line. */
-static char *user_output_filename = (char *)NULL;
-
-/* Non-zero indicates that when "--output" is specified, all of the menu
- items of the specified nodes (and their subnodes as well) should be
- dumped in the order encountered. This basically can print a book. */
-int dump_subnodes = 0;
-
-/* Non-zero means make default keybindings be loosely modeled on vi(1). */
-int vi_keys_p = 0;
-
-/* Non-zero means don't remove ANSI escape sequences. */
-int raw_escapes_p = 1;
-
-/* Non-zero means print the absolute location of the file to be loaded. */
-static int print_where_p = 0;
-
-#ifdef __MSDOS__
-/* Non-zero indicates that screen output should be made 'speech-friendly'.
- Since on MSDOS the usual behavior is to write directly to the video
- memory, speech synthesizer software cannot grab the output. Therefore,
- we provide a user option which tells us to avoid direct screen output
- and use stdout instead (which loses the color output). */
-int speech_friendly = 0;
-#endif
-
-/* Structure describing the options that Info accepts. We pass this structure
- to getopt_long (). If you add or otherwise change this structure, you must
- also change the string which follows it. */
-#define DRIBBLE_OPTION 2
-#define RESTORE_OPTION 3
-#define IDXSRCH_OPTION 4
-static struct option long_options[] = {
- { "apropos", 1, 0, 'k' },
- { "directory", 1, 0, 'd' },
- { "dribble", 1, 0, DRIBBLE_OPTION },
- { "file", 1, 0, 'f' },
- { "help", 0, &print_help_p, 1 },
- { "index-search", 1, 0, IDXSRCH_OPTION },
- { "location", 0, &print_where_p, 1 },
- { "node", 1, 0, 'n' },
- { "output", 1, 0, 'o' },
- { "raw-escapes", 0, &raw_escapes_p, 1 },
- { "no-raw-escapes", 0, &raw_escapes_p, 0 },
- { "restore", 1, 0, RESTORE_OPTION },
- { "show-options", 0, 0, 'O' },
- { "subnodes", 0, &dump_subnodes, 1 },
- { "usage", 0, 0, 'O' },
- { "version", 0, &print_version_p, 1 },
- { "vi-keys", 0, &vi_keys_p, 1 },
- { "where", 0, &print_where_p, 1 },
-#ifdef __MSDOS__
- { "speech-friendly", 0, &speech_friendly, 1 },
-#endif
- {NULL, 0, NULL, 0}
-};
-
-/* String describing the shorthand versions of the long options found above. */
-#ifdef __MSDOS__
-static char *short_options = "k:d:n:f:ho:ORswb";
-#else
-static char *short_options = "k:d:n:f:ho:ORws";
-#endif
-
-/* When non-zero, the Info window system has been initialized. */
-int info_windows_initialized_p = 0;
-
-/* Some "forward" declarations. */
-static void info_short_help (void);
-static void init_messages (void);
-
-
-/* **************************************************************** */
-/* */
-/* Main Entry Point to the Info Program */
-/* */
-/* **************************************************************** */
-
-int
-main (int argc, char *argv[])
-{
- int getopt_long_index; /* Index returned by getopt_long (). */
- NODE *initial_node; /* First node loaded by Info. */
-
-#ifdef HAVE_SETLOCALE
- /* Set locale via LC_ALL. */
- setlocale (LC_ALL, "");
-#endif /* HAVE_SETLOCALE */
-
-#ifdef ENABLE_NLS
- /* Set the text message domain. */
- bindtextdomain (PACKAGE, LOCALEDIR);
- textdomain (PACKAGE);
-#endif
-
- init_messages ();
-
- while (1)
- {
- int option_character;
-
- option_character = getopt_long
- (argc, argv, short_options, long_options, &getopt_long_index);
-
- /* getopt_long returns EOF when there are no more long options. */
- if (option_character == EOF)
- break;
-
- /* If this is a long option, then get the short version of it. */
- if (option_character == 0 && long_options[getopt_long_index].flag == 0)
- option_character = long_options[getopt_long_index].val;
-
- /* Case on the option that we have received. */
- switch (option_character)
- {
- case 0:
- break;
-
- /* User wants to add a directory. */
- case 'd':
- info_add_path (optarg, INFOPATH_PREPEND);
- break;
-
- /* User is specifying a particular node. */
- case 'n':
- add_pointer_to_array (optarg, user_nodenames_index, user_nodenames,
- user_nodenames_slots, 10, char *);
- break;
-
- /* User is specifying a particular Info file. */
- case 'f':
- if (user_filename)
- free (user_filename);
-
- user_filename = xstrdup (optarg);
- break;
-
- /* Treat -h like --help. */
- case 'h':
- print_help_p = 1;
- break;
-
- /* User is specifying the name of a file to output to. */
- case 'o':
- if (user_output_filename)
- free (user_output_filename);
- user_output_filename = xstrdup (optarg);
- break;
-
- /* User has specified that she wants to find the "Options"
- or "Invocation" node for the program. */
- case 'O':
- goto_invocation_p = 1;
- break;
-
- /* User has specified that she wants the escape sequences
- in man pages to be passed thru unaltered. */
- case 'R':
- raw_escapes_p = 1;
- break;
-
- /* User is specifying that she wishes to dump the subnodes of
- the node that she is dumping. */
- case 's':
- dump_subnodes = 1;
- break;
-
- /* For compatibility with man, -w is --where. */
- case 'w':
- print_where_p = 1;
- break;
-
-#ifdef __MSDOS__
- /* User wants speech-friendly output. */
- case 'b':
- speech_friendly = 1;
- break;
-#endif /* __MSDOS__ */
-
- /* User has specified a string to search all indices for. */
- case 'k':
- apropos_p = 1;
- maybe_free (apropos_search_string);
- apropos_search_string = xstrdup (optarg);
- break;
-
- /* User has specified a dribble file to receive keystrokes. */
- case DRIBBLE_OPTION:
- close_dribble_file ();
- open_dribble_file (optarg);
- break;
-
- /* User has specified an alternate input stream. */
- case RESTORE_OPTION:
- info_set_input_from_file (optarg);
- break;
-
- /* User has specified a string to search all indices for. */
- case IDXSRCH_OPTION:
- index_search_p = 1;
- maybe_free (index_search_string);
- index_search_string = xstrdup (optarg);
- break;
-
- default:
- fprintf (stderr, _("Try --help for more information.\n"));
- xexit (1);
- }
- }
-
- /* If the output device is not a terminal, and no output filename has been
- specified, make user_output_filename be "-", so that the info is written
- to stdout, and turn on the dumping of subnodes. */
- if ((!isatty (fileno (stdout))) && (user_output_filename == (char *)NULL))
- {
- user_output_filename = xstrdup ("-");
- dump_subnodes = 1;
- }
-
- /* If the user specified --version, then show the version and exit. */
- if (print_version_p)
- {
- printf ("info (GNU %s) %s\n", PACKAGE, VERSION);
- puts ("");
- printf (_("Copyright (C) %s Free Software Foundation, Inc.\n\
-License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n\
-This is free software: you are free to change and redistribute it.\n\
-There is NO WARRANTY, to the extent permitted by law.\n"),
- "2008");
- xexit (0);
- }
-
- /* If the `--help' option was present, show the help and exit. */
- if (print_help_p)
- {
- info_short_help ();
- xexit (0);
- }
-
- /* If the user hasn't specified a path for Info files, default it.
- Lowest priority is our messy hardwired list in filesys.h.
- Then comes the user's INFODIR from the Makefile.
- Highest priority is the environment variable, if set. */
- if (!infopath)
- {
- char *path_from_env = getenv ("INFOPATH");
-
- if (path_from_env)
- {
- unsigned len = strlen (path_from_env);
- /* Trailing : on INFOPATH means insert the default path. */
- if (len && path_from_env[len - 1] == PATH_SEP[0])
- {
- path_from_env[len - 1] = 0;
- info_add_path (DEFAULT_INFOPATH, INFOPATH_PREPEND);
- }
-#ifdef INFODIR /* from the Makefile */
- info_add_path (INFODIR, INFOPATH_PREPEND);
-#endif
- info_add_path (path_from_env, INFOPATH_PREPEND);
- }
- else
- {
- info_add_path (DEFAULT_INFOPATH, INFOPATH_PREPEND);
-#ifdef INFODIR /* from the Makefile */
- info_add_path (INFODIR, INFOPATH_PREPEND);
-#endif
-#ifdef INFODIR2 /* from the Makefile, too */
-# ifdef INFODIR
- if (!STREQ (INFODIR, INFODIR2))
-# endif
- info_add_path (INFODIR2, INFOPATH_PREPEND);
-#endif
- }
- }
-
- /* If the user specified a particular filename, add the path of that
- file to the contents of INFOPATH. */
- if (user_filename)
- add_file_directory_to_path (user_filename);
-
- /* If the user wants to search every known index for a given string,
- do that now, and report the results. */
- if (apropos_p)
- {
- info_apropos (apropos_search_string);
- xexit (0);
- }
-
- /* Get the initial Info node. It is either "(dir)Top", or what the user
- specifed with values in user_filename and user_nodenames. */
- initial_node = info_get_node (user_filename,
- user_nodenames ? user_nodenames[0] : 0);
-
- /* If we couldn't get the initial node, this user is in trouble. */
- if (!initial_node)
- {
- if (info_recent_file_error)
- info_error (info_recent_file_error, NULL, NULL);
- else
- info_error (msg_cant_find_node,
- user_nodenames ? user_nodenames[0] : "Top", NULL);
- xexit (1);
- }
-
- /* Special cases for when the user specifies multiple nodes. If we
- are dumping to an output file, dump all of the nodes specified.
- Otherwise, attempt to create enough windows to handle the nodes
- that this user wants displayed. */
- if (user_nodenames_index > 1)
- {
- free (initial_node);
-
- if (print_where_p)
- printf ("%s\n", user_filename ? user_filename : "unknown?!");
- else if (user_output_filename)
- dump_nodes_to_file
- (user_filename, user_nodenames, user_output_filename, dump_subnodes);
- else
- begin_multiple_window_info_session (user_filename, user_nodenames);
-
- xexit (0);
- }
-
- /* If there are arguments remaining, they are the names of menu items
- in sequential info files starting from the first one loaded. That
- file name is either "dir", or the contents of user_filename if one
- was specified. */
- {
- const char *errstr;
- char *errarg1, *errarg2;
- NODE *new_initial_node;
-
- /* If they say info -O info, we want to show them the invocation node
- for standalone info; there's nothing useful in info.texi. */
- if (goto_invocation_p && argv[optind]
- && mbscasecmp (argv[optind], "info") == 0)
- argv[optind] = "info-stnd";
-
- new_initial_node = info_follow_menus (initial_node, argv + optind,
- &errstr, &errarg1, &errarg2);
-
- if (new_initial_node && new_initial_node != initial_node)
- initial_node = new_initial_node;
-
- if (print_where_p)
- {
- if (initial_node->parent)
- printf ("%s\n", initial_node->parent);
- else if (initial_node->filename
- && !is_dir_name (filename_non_directory (initial_node->filename)))
- printf ("%s\n", initial_node->filename);
- else
- xexit (1);
- xexit (0);
- }
-
- /* If the user specified that this node should be output, then do that
- now. Otherwise, start the Info session with this node. Or act
- accordingly if the initial node was not found. */
- if (user_output_filename && !goto_invocation_p)
- {
- if (!errstr)
- dump_node_to_file (initial_node, user_output_filename,
- dump_subnodes);
- else
- info_error (errstr, errarg1, errarg2);
- }
- else
- {
-
- if (errstr)
- begin_info_session_with_error (initial_node, errstr,
- errarg1, errarg2);
- /* If the user specified `--index-search=STRING' or
- --show-options, start the info session in the node
- corresponding to what they want. */
- else if (index_search_p || goto_invocation_p)
- {
- int status = 0;
-
- initialize_info_session (initial_node, 0);
-
- if (goto_invocation_p
- || index_entry_exists (windows, index_search_string))
- {
- terminal_prep_terminal ();
- terminal_clear_screen ();
- info_last_executed_command = (VFunction *)NULL;
-
- if (index_search_p)
- do_info_index_search (windows, 0, index_search_string);
- else
- {
- /* If they said "info --show-options foo bar baz",
- the last of the arguments is the program whose
- options they want to see. */
- char **p = argv + optind;
- char *program;
-
- if (*p)
- {
- while (p[1])
- p++;
- program = xstrdup (*p);
- }
- else if (user_filename)
- /* If there's no command-line arguments to
- supply the program name, use the Info file
- name (sans extension and leading directories)
- instead. */
- program = program_name_from_file_name (user_filename);
- else
- program = xstrdup ("");
-
- info_intuit_options_node (windows, initial_node, program);
- free (program);
- }
-
- if (user_output_filename)
- {
- dump_node_to_file (windows->node, user_output_filename,
- dump_subnodes);
- }
- else
- info_read_and_dispatch ();
-
- /* On program exit, leave the cursor at the bottom of the
- window, and restore the terminal IO. */
- terminal_goto_xy (0, screenheight - 1);
- terminal_clear_to_eol ();
- fflush (stdout);
- terminal_unprep_terminal ();
- }
- else
- {
- fprintf (stderr, _("no index entries found for `%s'\n"),
- index_search_string);
- status = 2;
- }
-
- close_dribble_file ();
- xexit (status);
- }
- else
- begin_info_session (initial_node);
- }
-
- xexit (0);
- }
-
- return 0; /* Avoid bogus warnings. */
-}
-
-void
-add_file_directory_to_path (char *filename)
-{
- char *directory_name = xstrdup (filename);
- char *temp = filename_non_directory (directory_name);
-
- if (temp != directory_name)
- {
- if (HAVE_DRIVE (directory_name) && temp == directory_name + 2)
- {
- /* The directory of "d:foo" is stored as "d:.", to avoid
- mixing it with "d:/" when a slash is appended. */
- *temp = '.';
- temp += 2;
- }
- temp[-1] = 0;
- info_add_path (directory_name, INFOPATH_PREPEND);
- }
-
- free (directory_name);
-}
-
-
-/* Error handling. */
-
-/* Non-zero if an error has been signalled. */
-int info_error_was_printed = 0;
-
-/* Non-zero means ring terminal bell on errors. */
-int info_error_rings_bell_p = 1;
-
-/* Print FORMAT with ARG1 and ARG2. If the window system was initialized,
- then the message is printed in the echo area. Otherwise, a message is
- output to stderr. */
-void
-info_error (const char *format, void *arg1, void *arg2)
-{
- info_error_was_printed = 1;
-
- if (!info_windows_initialized_p || display_inhibited)
- {
- fprintf (stderr, "%s: ", program_name);
- if (arg1)
- fprintf (stderr, format, arg1, arg2);
- else
- /* If we're passed a string, just print it. Otherwise a % in a
- filename gets treated as a format specifier. */
- fputs (format, stderr);
- fprintf (stderr, "\n");
- fflush (stderr);
- }
- else
- {
- if (!echo_area_is_active)
- {
- if (info_error_rings_bell_p)
- terminal_ring_bell ();
- window_message_in_echo_area (format, arg1, arg2);
- }
- else
- {
- NODE *temp = build_message_node (format, arg1, arg2);
- if (info_error_rings_bell_p)
- terminal_ring_bell ();
- inform_in_echo_area (temp->contents);
- free (temp->contents);
- free (temp);
- }
- }
-}
-
-
-/* Produce a scaled down description of the available options to Info. */
-static void
-info_short_help (void)
-{
- printf (_("\
-Usage: %s [OPTION]... [MENU-ITEM...]\n\
-\n\
-Read documentation in Info format.\n"), program_name);
- puts ("");
-
- puts (_("\
-Options:\n\
- -k, --apropos=STRING look up STRING in all indices of all manuals.\n\
- -d, --directory=DIR add DIR to INFOPATH.\n\
- --dribble=FILENAME remember user keystrokes in FILENAME.\n\
- -f, --file=FILENAME specify Info file to visit."));
-
- puts (_("\
- -h, --help display this help and exit.\n\
- --index-search=STRING go to node pointed by index entry STRING.\n\
- -n, --node=NODENAME specify nodes in first visited Info file.\n\
- -o, --output=FILENAME output selected nodes to FILENAME."));
-
- puts (_("\
- -R, --raw-escapes output \"raw\" ANSI escapes (default).\n\
- --no-raw-escapes output escapes as literal text.\n\
- --restore=FILENAME read initial keystrokes from FILENAME.\n\
- -O, --show-options, --usage go to command-line options node."));
-
-#ifdef __MSDOS__
- puts (_("\
- -b, --speech-friendly be friendly to speech synthesizers."));
-#endif
-
- puts (_("\
- --subnodes recursively output menu items.\n\
- --vi-keys use vi-like and less-like key bindings.\n\
- --version display version information and exit.\n\
- -w, --where, --location print physical location of Info file."));
-
- puts (_("\n\
-The first non-option argument, if present, is the menu entry to start from;\n\
-it is searched for in all `dir' files along INFOPATH.\n\
-If it is not present, info merges all `dir' files and shows the result.\n\
-Any remaining arguments are treated as the names of menu\n\
-items relative to the initial node visited."));
-
- puts (_("\n\
-Examples:\n\
- info show top-level dir menu\n\
- info emacs start at emacs node from top-level dir\n\
- info emacs buffers start at buffers node within emacs manual\n\
- info --show-options emacs start at node with emacs' command line options\n\
- info --subnodes -o out.txt emacs dump entire manual to out.txt\n\
- info -f ./foo.info show file ./foo.info, not searching dir"));
-
- puts (_("\n\
-Email bug reports to bug-texinfo@gnu.org,\n\
-general questions and discussion to help-texinfo@gnu.org.\n\
-Texinfo home page: http://www.gnu.org/software/texinfo/"));
-
- xexit (0);
-}
-
-
-/* Initialize strings for gettext. Because gettext doesn't handle N_ or
- _ within macro definitions, we put shared messages into variables and
- use them that way. This also has the advantage that there's only one
- copy of the strings. */
-
-const char *msg_cant_find_node;
-const char *msg_cant_file_node;
-const char *msg_cant_find_window;
-const char *msg_cant_find_point;
-const char *msg_cant_kill_last;
-const char *msg_no_menu_node;
-const char *msg_no_foot_node;
-const char *msg_no_xref_node;
-const char *msg_no_pointer;
-const char *msg_unknown_command;
-const char *msg_term_too_dumb;
-const char *msg_at_node_bottom;
-const char *msg_at_node_top;
-const char *msg_one_window;
-const char *msg_win_too_small;
-const char *msg_cant_make_help;
-
-static void
-init_messages (void)
-{
- msg_cant_find_node = _("Cannot find node `%s'.");
- msg_cant_file_node = _("Cannot find node `(%s)%s'.");
- msg_cant_find_window = _("Cannot find a window!");
- msg_cant_find_point = _("Point doesn't appear within this window's node!");
- msg_cant_kill_last = _("Cannot delete the last window.");
- msg_no_menu_node = _("No menu in this node.");
- msg_no_foot_node = _("No footnotes in this node.");
- msg_no_xref_node = _("No cross references in this node.");
- msg_no_pointer = _("No `%s' pointer for this node.");
- msg_unknown_command = _("Unknown Info command `%c'; try `?' for help.");
- msg_term_too_dumb = _("Terminal type `%s' is not smart enough to run Info.");
- msg_at_node_bottom = _("You are already at the last page of this node.");
- msg_at_node_top = _("You are already at the first page of this node.");
- msg_one_window = _("Only one window.");
- msg_win_too_small = _("Resulting window would be too small.");
- msg_cant_make_help = _("Not enough room for a help window, please delete a window.");
-}