texinfo-commits
[Top][All Lists]
Advanced

[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);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]