[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[5487] don't concatenate all open man pages together in memory
From: |
Gavin D. Smith |
Subject: |
[5487] don't concatenate all open man pages together in memory |
Date: |
Wed, 23 Apr 2014 21:39:22 +0000 |
Revision: 5487
http://svn.sv.gnu.org/viewvc/?view=rev&root=texinfo&revision=5487
Author: gavin
Date: 2014-04-23 21:39:21 +0000 (Wed, 23 Apr 2014)
Log Message:
-----------
don't concatenate all open man pages together in memory
Modified Paths:
--------------
trunk/ChangeLog
trunk/info/man.c
trunk/info/man.h
trunk/info/nodes.c
trunk/info/session.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2014-04-23 17:39:40 UTC (rev 5486)
+++ trunk/ChangeLog 2014-04-23 21:39:21 UTC (rev 5487)
@@ -1,17 +1,44 @@
2014-04-23 Gavin Smith <address@hidden>
- * window.h (WINDOW): Change size_t fields to long to avoid
+ * info/man.c: (get_manpage_node): Arguments changed. Do not
+ keep all the man page contents in one long buffer.
+ (manpage_file_buffer): New variable.
+ (create_manpage_file_buffer): Initialize manpage_file_buffer.
+ (make_manpage_node): Function deleted.
+ (manpage_node_of_file_buffer): Merged into get_manpage_node.
+ (locate_manpage_xref, xrefs_of_manpage)
+ (manpage_xrefs_in_binding, create_manpage_file_buffer): Functions
+ declared static.
+
+ * info/nodes.c (info_find_file_internal)
+ (info_reload_file_buffer_contents, info_get_node_of_file_buffer):
+ Special handling of man pages removed.
+ (info_get_node_with_defaults): Call get_manpage_node to get
+ man page nodes.
+
+ * session.c (info_follow_menus): Call get_manpage_node instead of
+ make_manpage_node.
+ (info_man): Get man page via info_get_node instead of
+ info_parse_and_select.
+
+ Note: These changes stop the undocumented and probably
+ unintended support of invoking the program as
+ "info '(filename)nodename'", which only worked by accident.
+
+2014-04-23 Gavin Smith <address@hidden>
+
+ * info/window.h (WINDOW): Change size_t fields to long to avoid
unwanted unsigned arithmetic.
- * session.c: Some re-ordering of functions, and comment added
+ * info/session.c: Some re-ordering of functions, and comment added
warning about what happens if you do this.
- * echo-area.c, infodoc.c, m-x.c, indices.c, footnotes.c,
- variables.c: Warning about reordering DECLARE_INFO_COMMAND
- declarations copied.
+ * info/echo-area.c, info/infodoc.c, info/m-x.c,
+ info/indices.c, info/footnotes.c, variables.c: Warning about
+ reordering DECLARE_INFO_COMMAND declarations copied.
- * Makefile.am: Add infokey dependency for tests.
+ * info/Makefile.am: Add infokey dependency for tests.
- * session.c (_scroll_forward, _scroll_backward): Remove
+ * info/session.c (_scroll_forward, _scroll_backward): Remove
logic applicable to only some of the scrolling functions.
Don't scroll if already at bottom of node. Don't move point.
(info_scroll_forward, info_scroll_backward)
@@ -30,7 +57,7 @@
(info_universal_argument, info_initialize_numeric_arg)
(info_numeric_arg_digit_loop, info_dispatch_on_key): Use new
variables if in echo area.
- * echo-area.c (ea_delete, ea_rubout): Use ea_explicit_arg
+ * info/echo-area.c (ea_delete, ea_rubout): Use ea_explicit_arg
instead of info_explicit_arg.
2014-04-23 Gavin Smith <address@hidden>
Modified: trunk/info/man.c
===================================================================
--- trunk/info/man.c 2014-04-23 17:39:40 UTC (rev 5486)
+++ trunk/info/man.c 2014-04-23 21:39:21 UTC (rev 5487)
@@ -55,115 +55,109 @@
static char const * const exec_extensions[] = { "", NULL };
#endif
+static long locate_manpage_xref (NODE *node, long int start, int dir);
+static REFERENCE **xrefs_of_manpage (NODE *node);
+static REFERENCE **manpage_xrefs_in_binding (NODE *node,
+ SEARCH_BINDING *binding);
static char *read_from_fd (int fd);
-static NODE *manpage_node_of_file_buffer (FILE_BUFFER *file_buffer,
- char *pagename);
static char *get_manpage_contents (char *pagename);
+static void create_manpage_file_buffer (void);
-NODE *
-make_manpage_node (char *pagename)
-{
- return info_get_node (MANPAGE_FILE_BUFFER_NAME, pagename,
- PARSE_NODE_VERBATIM);
-}
+/* We store the contents of retrieved man pages in here. */
+static FILE_BUFFER *manpage_file_buffer = 0;
NODE *
-get_manpage_node (FILE_BUFFER *file_buffer, char *pagename)
+get_manpage_node (char *pagename)
{
- NODE *node;
+ int i;
+ NODE *tag, *node = 0;
+ char *page;
- node = manpage_node_of_file_buffer (file_buffer, pagename);
+ if (!manpage_file_buffer)
+ create_manpage_file_buffer ();
- if (!node)
+ for (i = 0; (tag = manpage_file_buffer->tags[i]); i++)
+ if (!strcmp (tag->nodename, pagename))
+ break;
+
+ /* Node was not found, so we have to create it. */
+ if (!tag)
{
- char *page;
+ tag = info_create_node ();
+ tag->filename = MANPAGE_FILE_BUFFER_NAME;
+ tag->nodename = xstrdup (pagename);
+ tag->flags |= (N_HasTagsTable | N_IsManPage);
+ tag->contents = 0;
+ tag->up = "(dir)";
+
+ /* Save this node. */
+ add_pointer_to_array (tag, i,
+ manpage_file_buffer->tags,
+ manpage_file_buffer->tags_slots, 100);
+ }
+
+ /* Node wasn't found, or its contents were freed since last time. */
+ if (!tag->contents)
+ {
+ char header[1024];
+ int hlen, plen;
+
page = get_manpage_contents (pagename);
+ if (!page)
+ return 0;
+ plen = strlen (page);
- if (page)
+ if (!preprocess_nodes_p)
{
- char header[1024];
- long oldsize, newsize;
- int hlen, plen;
- char *old_contents = file_buffer->contents;
-
- sprintf (header, "\n\n%c\n%s %s, %s %s, %s (dir)\n\n",
- INFO_COOKIE,
- INFO_FILE_LABEL, file_buffer->filename,
+ sprintf (header, "%s %s, %s %s, %s (dir)\n\n",
+ INFO_FILE_LABEL, MANPAGE_FILE_BUFFER_NAME,
INFO_NODE_LABEL, pagename,
INFO_UP_LABEL);
- oldsize = file_buffer->filesize;
hlen = strlen (header);
- plen = strlen (page);
- newsize = (oldsize + hlen + plen);
- file_buffer->contents = xrealloc (file_buffer->contents, 1 +
newsize);
- memcpy (file_buffer->contents + oldsize, header, hlen);
- memcpy (file_buffer->contents + oldsize + hlen, page, plen);
- file_buffer->contents[newsize] = '\0';
- file_buffer->filesize = newsize;
- file_buffer->finfo.st_size = newsize;
- build_tags_and_nodes (file_buffer);
- free (page);
- /* We have just relocated file_buffer->contents from under
- the feet of info_windows[] array. Therefore, all the
- nodes on that list which are showing man pages have their
- contents member pointing into the blue. Undo that harm. */
- if (old_contents && oldsize && old_contents != file_buffer->contents
- && info_windows)
- {
- int iw;
- INFO_WINDOW *info_win;
- char *old_contents_end = old_contents + oldsize;
- for (iw = 0; (info_win = info_windows[iw]); iw++)
- {
- int in;
+ tag->contents = xcalloc (1, hlen + plen + 1);
+ memcpy (node->contents, header, hlen);
+ memcpy (node->contents + hlen, page, plen);
- for (in = 0; in < info_win->nodes_index; in++)
- {
- NODE *tmp_node = info_win->nodes[in];
+ /* Set nodelen. */
+ tag->nodelen = hlen + plen;
- /* It really only suffices to see that node->filename
- is "*manpages*". But after several hours of
- debugging this, would you blame me for being a bit
- paranoid? */
- if (tmp_node && tmp_node->filename
- && tmp_node->contents
- && strcmp (tmp_node->filename,
- MANPAGE_FILE_BUFFER_NAME) == 0
- && tmp_node->contents >= old_contents
- && tmp_node->contents + tmp_node->nodelen
- <= old_contents_end)
- {
- info_win->nodes[in] =
- manpage_node_of_file_buffer (file_buffer,
- tmp_node->nodename);
- free (tmp_node->nodename);
- free (tmp_node);
- }
- }
- }
- }
+ /* FIXME: Don't allocate page just to immediately free it. */
+ free (page);
}
+ else
+ {
+ tag->contents = page;
+ tag->nodelen = plen;
+ }
- node = manpage_node_of_file_buffer (file_buffer, pagename);
+ /* FIXME: add_gcable_pointer (tag->contents)? */
+ tag->body_start = strcspn (tag->contents, "\n");
}
+ if (!tag->references)
+ tag->references = xrefs_of_manpage (tag);
+
+ node = xmalloc (sizeof (NODE));
+ *node = *tag;
return node;
}
-FILE_BUFFER *
+static void
create_manpage_file_buffer (void)
{
- FILE_BUFFER *file_buffer = make_file_buffer ();
- file_buffer->filename = xstrdup (MANPAGE_FILE_BUFFER_NAME);
- file_buffer->fullpath = xstrdup (MANPAGE_FILE_BUFFER_NAME);
- file_buffer->finfo.st_size = 0;
- file_buffer->filesize = 0;
- file_buffer->contents = NULL;
- file_buffer->flags = (N_IsInternal | N_CannotGC | N_IsManPage);
+ manpage_file_buffer = make_file_buffer ();
+ manpage_file_buffer->filename = xstrdup (MANPAGE_FILE_BUFFER_NAME);
+ manpage_file_buffer->fullpath = xstrdup (MANPAGE_FILE_BUFFER_NAME);
+ manpage_file_buffer->finfo.st_size = 0;
+ manpage_file_buffer->filesize = 0;
+ manpage_file_buffer->contents = NULL;
+ manpage_file_buffer->flags = (N_IsInternal | N_CannotGC | N_IsManPage);
- return file_buffer;
+ /* Initialize empty tags table. */
+ manpage_file_buffer->tags = xmalloc (sizeof (NODE *));
+ manpage_file_buffer->tags[0] = 0;
}
/* Scan the list of directories in PATH looking for FILENAME. If we find
@@ -383,57 +377,6 @@
return formatted_page;
}
-static NODE *
-manpage_node_of_file_buffer (FILE_BUFFER *file_buffer, char *pagename)
-{
- NODE *node = NULL;
- NODE *tag = NULL;
-
- if (file_buffer->contents)
- {
- register int i;
-
- for (i = 0; (tag = file_buffer->tags[i]); i++)
- {
- if (mbscasecmp (pagename, tag->nodename) == 0)
- break;
- }
- }
-
- if (tag)
- {
- node = info_create_node ();
- node->filename = file_buffer->filename;
- node->nodename = xstrdup (tag->nodename);
- node->contents = file_buffer->contents + tag->nodestart;
- node->nodelen = tag->nodelen;
- node->nodestart = tag->nodestart;
- node->flags |= (N_HasTagsTable | N_IsManPage);
- node->contents += skip_node_separator (node->contents);
- node->body_start = strcspn(node->contents, "\n");
-
- node->up = "(dir)";
-
- /* Set nodelen, which is currently -1. */
-
- {
- SEARCH_BINDING node_body;
-
- node_body.buffer = file_buffer->contents;
- node_body.start = node->nodestart;
- node_body.start +=
- skip_node_separator (file_buffer->contents + node->nodestart);
- node_body.end = file_buffer->filesize;
- node_body.flags = S_FoldCase;
- node->nodelen = get_node_length (&node_body);
-
- node->references = xrefs_of_manpage (node);
- }
- }
-
- return node;
-}
-
static char *
read_from_fd (int fd)
{
@@ -553,7 +496,7 @@
return &frs_binding;
}
-REFERENCE **
+static REFERENCE **
xrefs_of_manpage (NODE *node)
{
SEARCH_BINDING *reference_section;
@@ -625,7 +568,7 @@
return refs;
}
-long
+static long
locate_manpage_xref (NODE *node, long int start, int dir)
{
REFERENCE **refs;
Modified: trunk/info/man.h
===================================================================
--- trunk/info/man.h 2014-04-23 17:39:40 UTC (rev 5486)
+++ trunk/info/man.h 2014-04-23 21:39:21 UTC (rev 5487)
@@ -23,13 +23,6 @@
#define MANPAGE_FILE_BUFFER_NAME "*manpages*"
-extern NODE *make_manpage_node (char *pagename);
-extern NODE *get_manpage_node (FILE_BUFFER *file_buffer,
- char *pagename);
-extern FILE_BUFFER *create_manpage_file_buffer (void);
-extern long locate_manpage_xref (NODE *node, long int start, int dir);
-extern REFERENCE **xrefs_of_manpage (NODE *node);
-extern REFERENCE **manpage_xrefs_in_binding (NODE *node,
- SEARCH_BINDING *binding);
+extern NODE *get_manpage_node (char *pagename);
#endif /* INFO_MAN_H */
Modified: trunk/info/nodes.c
===================================================================
--- trunk/info/nodes.c 2014-04-23 17:39:40 UTC (rev 5486)
+++ trunk/info/nodes.c 2014-04-23 21:39:21 UTC (rev 5487)
@@ -627,12 +627,6 @@
if (is_dir_name (filename_non_directory (filename)))
return file_buffer;
-#if defined (HANDLE_MAN_PAGES)
- /* Do the same for the magic MANPAGE file. */
- if (file_buffer->flags & N_IsManPage)
- return file_buffer;
-#endif /* HANDLE_MAN_PAGES */
-
/* The file appears to be already loaded, and is not "dir". Check
to see if it's changed since the last time it was loaded. */
if (stat (file_buffer->fullpath, &new_info) == -1)
@@ -675,14 +669,7 @@
}
/* The file wasn't loaded. Try to load it now. */
-#if defined (HANDLE_MAN_PAGES)
- /* If the name of the file that we want is our special file buffer for
- Unix manual pages, then create the file buffer, and return it now. */
- if (mbscasecmp (filename, MANPAGE_FILE_BUFFER_NAME) == 0)
- file_buffer = create_manpage_file_buffer ();
- else
-#endif /* HANDLE_MAN_PAGES */
- file_buffer = info_load_file_internal (filename, get_tags);
+ file_buffer = info_load_file_internal (filename, get_tags);
/* If the file was loaded, remember the name under which it was found. */
if (file_buffer)
@@ -895,12 +882,6 @@
{
int is_compressed;
-#if defined (HANDLE_MAN_PAGES)
- /* If this is the magic manpage node, don't try to reload, just give up. */
- if (fb->flags & N_IsManPage)
- return;
-#endif
-
fb->flags &= ~N_IsCompressed;
/* Let the filesystem do all the work for us. */
@@ -973,7 +954,7 @@
info_get_node_with_defaults (char *filename_in, char *nodename_in,
int flag, WINDOW *window)
{
- NODE *node;
+ NODE *node = 0;
FILE_BUFFER *file_buffer = NULL;
char *filename = 0, *nodename = 0;
@@ -990,23 +971,34 @@
if (is_dir_name (filename))
maybe_build_dir_node (filename);
+#ifdef HANDLE_MAN_PAGES
+ if (mbscasecmp (filename, MANPAGE_FILE_BUFFER_NAME) == 0)
+ {
+ return get_manpage_node (nodename);
+ }
+#endif
+
/* Find the correct info file, or give up. */
file_buffer = info_find_file (filename);
+ if (file_buffer)
+ {
+ /* Look for the node. */
+ node = info_get_node_of_file_buffer (nodename, file_buffer);
+ }
+
+#ifdef HANDLE_MAN_PAGES
if (!file_buffer)
{
- node = make_manpage_node (filename);
+ /* Try to find a man page with this name as a fall back. */
+ node = get_manpage_node (filename);
if (!node)
{
if (filesys_error_number)
info_recent_file_error =
filesys_error_string (filename, filesys_error_number);
- free (filename); free (nodename);
- return NULL;
}
}
- else
- /* Look for the node. */
- node = info_get_node_of_file_buffer (nodename, file_buffer);
+#endif
/* If the node not found was "Top", try again with different case,
unless this was a man page. */
@@ -1106,14 +1098,6 @@
node->nodelen = file_buffer->filesize;
node_set_body_start (node);
}
-#if defined (HANDLE_MAN_PAGES)
- /* If the file buffer is the magic one associated with manpages, call
- the manpage node finding function instead. */
- else if (file_buffer->flags & N_IsManPage)
- {
- node = get_manpage_node (file_buffer, nodename);
- }
-#endif /* HANDLE_MAN_PAGES */
/* If this is the "main" info file, it might contain a tags table. Search
the tags table for an entry which matches the node that we want. If
there is a tags table, get the file which contains this node, but don't
Modified: trunk/info/session.c
===================================================================
--- trunk/info/session.c 2014-04-23 17:39:40 UTC (rev 5486)
+++ trunk/info/session.c 2014-04-23 21:39:21 UTC (rev 5487)
@@ -2875,7 +2875,6 @@
if (!first_arg)
first_arg = arg;
- /* FIXME: This contains cross-references as well. */
menu = initial_node->references;
/* If no menu item in this node, stop here, but let the user
@@ -2886,7 +2885,7 @@
debug (3, ("no menu found"));
if (arg == first_arg && !strict)
{
- node = make_manpage_node (first_arg);
+ node = get_manpage_node (first_arg);
if (node)
{
debug (3, ("falling back to manpage node"));
@@ -2936,7 +2935,7 @@
else if (strict)
return NULL;
else
- node = make_manpage_node (first_arg);
+ node = get_manpage_node (first_arg);
if (node)
goto maybe_got_node;
}
@@ -2961,7 +2960,7 @@
PARSE_NODE_VERBATIM);
if (!strict && !node && arg == first_arg)
{
- node = make_manpage_node (first_arg);
+ node = get_manpage_node (first_arg);
if (node)
goto maybe_got_node;
}
@@ -3278,15 +3277,9 @@
if (*line)
{
- char *goto_command;
-
- goto_command = xmalloc
- (4 + strlen (MANPAGE_FILE_BUFFER_NAME) + strlen (line));
-
- sprintf (goto_command, "(%s)%s", MANPAGE_FILE_BUFFER_NAME, line);
-
- info_parse_and_select (goto_command, window);
- free (goto_command);
+ NODE *manpage = info_get_node (MANPAGE_FILE_BUFFER_NAME, line, 0);
+ if (manpage)
+ info_set_node_of_window (1, window, manpage);
}
free (line);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [5487] don't concatenate all open man pages together in memory,
Gavin D. Smith <=