diff options
Diffstat (limited to 'Build/source/utils/texinfo/info/nodemenu.c')
-rw-r--r-- | Build/source/utils/texinfo/info/nodemenu.c | 346 |
1 files changed, 0 insertions, 346 deletions
diff --git a/Build/source/utils/texinfo/info/nodemenu.c b/Build/source/utils/texinfo/info/nodemenu.c deleted file mode 100644 index c230db02e74..00000000000 --- a/Build/source/utils/texinfo/info/nodemenu.c +++ /dev/null @@ -1,346 +0,0 @@ -/* nodemenu.c -- produce a menu of all visited nodes. - $Id: nodemenu.c,v 1.10 2008/02/26 16:51:05 karl Exp $ - - Copyright (C) 1993, 1997, 1998, 2002, 2003, 2004, 2007 - 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/>. - - Written by Brian Fox (bfox@ai.mit.edu). */ - -#include "info.h" - -NODE * get_visited_nodes (Function *filter_func); - -/* Return a line describing the format of a node information line. */ -static const char * -nodemenu_format_info (void) -{ - return (_("\n\ -* Menu:\n\ - (File)Node Lines Size Containing File\n\ - ---------- ----- ---- ---------------")); -} - -/* Produce a formatted line of information about NODE. Here is what we want - the output listing to look like: - -* Menu: - (File)Node Lines Size Containing File - ---------- ----- ---- --------------- -* (emacs)Buffers:: 48 2230 /usr/gnu/info/emacs/emacs-1 -* (autoconf)Writing configure.in:: 123 58789 /usr/gnu/info/autoconf/autoconf-1 -* (dir)Top:: 40 589 /usr/gnu/info/dir -*/ -static char * -format_node_info (NODE *node) -{ - register int i, len; - char *parent, *containing_file; - static char *line_buffer = (char *)NULL; - - if (!line_buffer) - line_buffer = (char *)xmalloc (1000); - - if (node->parent) - { - parent = filename_non_directory (node->parent); - if (!parent) - parent = node->parent; - } - else - parent = (char *)NULL; - - containing_file = node->filename; - - if (!parent && !*containing_file) - sprintf (line_buffer, "* %s::", node->nodename); - else - { - char *file = (char *)NULL; - - if (parent) - file = parent; - else - file = filename_non_directory (containing_file); - - if (!file) - file = containing_file; - - if (!*file) - file = "dir"; - - sprintf (line_buffer, "* (%s)%s::", file, node->nodename); - } - - len = pad_to (36, line_buffer); - - { - int lines = 1; - - for (i = 0; i < node->nodelen; i++) - if (node->contents[i] == '\n') - lines++; - - sprintf (line_buffer + len, "%d", lines); - } - - len = pad_to (44, line_buffer); - sprintf (line_buffer + len, "%ld", node->nodelen); - - if (node->filename && *(node->filename)) - { - len = pad_to (51, line_buffer); - strcpy (line_buffer + len, node->filename); - } - - return xstrdup (line_buffer); -} - -/* Little string comparison routine for qsort (). */ -static int -compare_strings (const void *entry1, const void *entry2) -{ - char **e1 = (char **) entry1; - char **e2 = (char **) entry2; - - return (mbscasecmp (*e1, *e2)); -} - -/* The name of the nodemenu node. */ -static char *nodemenu_nodename = "*Node Menu*"; - -/* Produce an informative listing of all the visited nodes, and return it - in a node. If FILTER_FUNC is non-null, it is a function which filters - which nodes will appear in the listing. FILTER_FUNC takes an argument - of NODE, and returns non-zero if the node should appear in the listing. */ -NODE * -get_visited_nodes (Function *filter_func) -{ - register int i, iw_index; - INFO_WINDOW *info_win; - NODE *node; - char **lines = (char **)NULL; - int lines_index = 0, lines_slots = 0; - - if (!info_windows) - return ((NODE *)NULL); - - for (iw_index = 0; (info_win = info_windows[iw_index]); iw_index++) - { - for (i = 0; i < info_win->nodes_index; i++) - { - node = info_win->nodes[i]; - - /* We skip mentioning "*Node Menu*" nodes. */ - if (internal_info_node_p (node) && - (strcmp (node->nodename, nodemenu_nodename) == 0)) - continue; - - if (node && (!filter_func || (*filter_func) (node))) - { - char *line; - - line = format_node_info (node); - add_pointer_to_array - (line, lines_index, lines, lines_slots, 20, char *); - } - } - } - - /* Sort the array of information lines, if there are any. */ - if (lines) - { - register int j, newlen; - char **temp; - - qsort (lines, lines_index, sizeof (char *), compare_strings); - - /* Delete duplicates. */ - for (i = 0, newlen = 1; i < lines_index - 1; i++) - { - /* Use FILENAME_CMP here, since the most important piece - of info in each line is the file name of the node. */ - if (FILENAME_CMP (lines[i], lines[i + 1]) == 0) - { - free (lines[i]); - lines[i] = (char *)NULL; - } - else - newlen++; - } - - /* We have free ()'d and marked all of the duplicate slots. - Copy the live slots rather than pruning the dead slots. */ - temp = (char **)xmalloc ((1 + newlen) * sizeof (char *)); - for (i = 0, j = 0; i < lines_index; i++) - if (lines[i]) - temp[j++] = lines[i]; - - temp[j] = (char *)NULL; - free (lines); - lines = temp; - lines_index = newlen; - } - - initialize_message_buffer (); - - printf_to_message_buffer - ("%s", replace_in_documentation - (_("Here is the menu of nodes you have recently visited.\n\ -Select one from this menu, or use `\\[history-node]' in another window.\n"), 0), - NULL, NULL); - - printf_to_message_buffer ("%s\n", (char *) nodemenu_format_info (), - NULL, NULL); - - for (i = 0; (lines != (char **)NULL) && (i < lines_index); i++) - { - printf_to_message_buffer ("%s\n", lines[i], NULL, NULL); - free (lines[i]); - } - - if (lines) - free (lines); - - node = message_buffer_to_node (); - add_gcable_pointer (node->contents); - return (node); -} - -DECLARE_INFO_COMMAND (list_visited_nodes, - _("Make a window containing a menu of all of the currently visited nodes")) -{ - WINDOW *new; - NODE *node; - - set_remembered_pagetop_and_point (window); - - /* If a window is visible and showing the buffer list already, re-use it. */ - for (new = windows; new; new = new->next) - { - node = new->node; - - if (internal_info_node_p (node) && - (strcmp (node->nodename, nodemenu_nodename) == 0)) - break; - } - - /* If we couldn't find an existing window, try to use the next window - in the chain. */ - if (!new) - { - if (window->next) - new = window->next; - /* If there is more than one window, wrap around. */ - else if (window != windows) - new = windows; - } - - /* If we still don't have a window, make a new one to contain the list. */ - if (!new) - { - WINDOW *old_active; - - old_active = active_window; - active_window = window; - new = window_make_window ((NODE *)NULL); - active_window = old_active; - } - - /* If we couldn't make a new window, use this one. */ - if (!new) - new = window; - - /* Lines do not wrap in this window. */ - new->flags |= W_NoWrap; - node = get_visited_nodes ((Function *)NULL); - name_internal_node (node, nodemenu_nodename); - -#if 0 - /* Even if this is an internal node, we don't want the window - system to treat it specially. So we turn off the internalness - of it here. */ - /* Why? We depend on internal_info_node_p returning true, so we must - not remove the flag. Otherwise, the *Node Menu* nodes themselves - appear in the node menu. --Andreas Schwab - <schwab@issan.informatik.uni-dortmund.de>. */ - node->flags &= ~N_IsInternal; -#endif - - /* If this window is already showing a node menu, reuse the existing node - slot. */ - { - int remember_me = 1; - -#if defined (NOTDEF) - if (internal_info_node_p (new->node) && - (strcmp (new->node->nodename, nodemenu_nodename) == 0)) - remember_me = 0; -#endif /* NOTDEF */ - - window_set_node_of_window (new, node); - - if (remember_me) - remember_window_and_node (new, node); - } - - active_window = new; -} - -DECLARE_INFO_COMMAND (select_visited_node, - _("Select a node which has been previously visited in a visible window")) -{ - char *line; - NODE *node; - REFERENCE **menu; - - node = get_visited_nodes ((Function *)NULL); - - menu = info_menu_of_node (node); - free (node); - - line = - info_read_completing_in_echo_area (window, - _("Select visited node: "), menu); - - window = active_window; - - /* User aborts, just quit. */ - if (!line) - { - info_abort_key (window, 0, 0); - info_free_references (menu); - return; - } - - if (*line) - { - REFERENCE *entry; - - /* Find the selected label in the references. */ - entry = info_get_labeled_reference (line, menu); - - if (!entry) - info_error (_("The reference disappeared! (%s)."), line, NULL); - else - info_select_reference (window, entry); - } - - free (line); - info_free_references (menu); - - if (!info_error_was_printed) - window_clear_echo_area (); -} |