texinfo-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[5512] all_files


From: Gavin D. Smith
Subject: [5512] all_files
Date: Fri, 02 May 2014 16:43:27 +0000

Revision: 5512
          http://svn.sv.gnu.org/viewvc/?view=rev&root=texinfo&revision=5512
Author:   gavin
Date:     2014-05-02 16:43:26 +0000 (Fri, 02 May 2014)
Log Message:
-----------
all_files

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/info/indices.c
    trunk/info/indices.h
    trunk/info/info.c
    trunk/info/info.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog     2014-05-02 13:23:20 UTC (rev 5511)
+++ trunk/ChangeLog     2014-05-02 16:43:26 UTC (rev 5512)
@@ -1,5 +1,23 @@
 2014-05-02  Gavin Smith  <address@hidden>
 
+       * info/info.c (all_files): Get working again, having been broken
+       by recent changes to startup.  Don't use info_follow_menus.
+
+       * info/indices.c (allfiles_node): Declared global.
+       (allfiles_create_node) Moved to info.c
+
+       * info/info.c (node_file_name): Argument dirok deleted.
+       (allfiles_create_node): Don't use numbers as labels of menu entries.
+       Don't create a containing FILE_BUFFER for allfiles_node.
+       (info_find_matching_files): Use add_pointer_to_array to build up
+       list.  Check for man pages directly (previously this was done in
+       info_follow_menus).
+
+       * info/info.h (add_pointer_to_array): Comment rewritten to match
+       macro definition.
+
+2014-05-02  Gavin Smith  <address@hidden>
+
        * info/footnotes.c (info_get_or_remove_footnotes): Don't
        display footnotes for "*" node.
 

Modified: trunk/info/indices.c
===================================================================
--- trunk/info/indices.c        2014-05-02 13:23:20 UTC (rev 5511)
+++ trunk/info/indices.c        2014-05-02 16:43:26 UTC (rev 5512)
@@ -954,47 +954,8 @@
     window_clear_echo_area ();
 }
 
-static NODE *allfiles_node;
+NODE *allfiles_node = 0;
 
-NODE *
-allfiles_create_node (char *term, REFERENCE **fref)
-{
-  int i;
-  struct text_buffer text;
-  size_t off;
-  FILE_BUFFER *fb;
-  
-  text_buffer_init (&text);
-  text_buffer_printf (&text, _("File names matching `%s'"), term);
-  text_buffer_add_char (&text, 0);
-  off = text.off;
-
-  text_buffer_printf (&text,
-                     "\n\n%c\n%s %s\n\n"
-                     "Info File Index\n"
-                     "***************\n\n"
-                     "File names that match `%s':\n\n"
-                     "* Menu:\n\n",
-                     INFO_COOKIE,
-                     INFO_NODE_LABEL, text.base, term);
-
-  memmove (text.base, text.base + off, text.off - off);
-  text.off -= off;
-
-  for (i = 0; fref[i]; i++)
-    {
-      text_buffer_printf (&text, "* %4i: (%s)", i+1, fref[i]->filename);
-      if (fref[i]->nodename)
-       text_buffer_printf (&text, "%s", fref[i]->nodename);
-      text_buffer_printf (&text, ".\n");
-    }
-
-  fb = create_virtindex_file_buffer (NULL, text.base, text.off);
-  allfiles_node = create_virtindex_node (fb);
-
-  return allfiles_node;
-}
-
 DECLARE_INFO_COMMAND (info_all_files, _("Show all matching files"))
 {
   if (!allfiles_node)

Modified: trunk/info/indices.h
===================================================================
--- trunk/info/indices.h        2014-05-02 13:23:20 UTC (rev 5511)
+++ trunk/info/indices.h        2014-05-02 16:43:26 UTC (rev 5512)
@@ -38,6 +38,4 @@
 extern void do_info_index_search (WINDOW *window, FILE_BUFFER *fb, int count, 
char *search_string);
 extern int index_entry_exists (FILE_BUFFER *fb, char *string);
 
-NODE *allfiles_create_node (char *term, REFERENCE **fref);
-
 #endif /* not INFO_INDICES_H */

Modified: trunk/info/info.c
===================================================================
--- trunk/info/info.c   2014-05-02 13:23:20 UTC (rev 5511)
+++ trunk/info/info.c   2014-05-02 16:43:26 UTC (rev 5512)
@@ -156,13 +156,12 @@
 
 
 static char *
-node_file_name (NODE *node, int dirok)
+node_file_name (NODE *node)
 {
   if (node->parent)
     return node->parent;
   else if (node->filename
-          && (dirok ||
-              !is_dir_name (filename_non_directory (node->filename))))
+          && (!is_dir_name (filename_non_directory (node->filename))))
     return node->filename;
   return 0;
 }
@@ -352,6 +351,44 @@
 }
 
 
+/* Defined in indices.c */
+extern NODE *allfiles_node;
+
+static void
+allfiles_create_node (char *term, REFERENCE **fref)
+{
+  int i;
+  struct text_buffer text;
+  FILE_BUFFER *fb;
+  
+  text_buffer_init (&text);
+
+  text_buffer_printf (&text,
+                     "%s File names matching `%s'\n\n"
+                     "Info File Index\n"
+                     "***************\n\n"
+                     "File names that match `%s':\n\n"
+                     "* Menu:\n\n",
+                      INFO_NODE_LABEL,
+                     term, term);
+
+  for (i = 0; fref[i]; i++)
+    {
+      text_buffer_printf (&text, "* (%s)", fref[i]->filename);
+      if (fref[i]->nodename)
+       text_buffer_printf (&text, "%s", fref[i]->nodename);
+      text_buffer_printf (&text, "::\n");
+    }
+
+  allfiles_node = info_create_node ();
+  allfiles_node->nodename = xstrdup ("Info File Index");
+  allfiles_node->contents = text.base;
+  allfiles_node->nodelen = text.off;
+  allfiles_node->body_start = strcspn (allfiles_node->contents, "\n");
+
+  scan_node_contents (0, &allfiles_node);
+}
+
 static char *
 dirname (const char *file)
 {
@@ -371,144 +408,109 @@
 static REFERENCE **
 info_find_matching_files (char *filename)
 {
-  size_t argc = 0;
-  size_t argn = 0;
-  REFERENCE **argv = NULL;
+  REFERENCE **ref_list = NULL;
+  size_t ref_slots = 0;
+  size_t ref_index = 0;
+  REFERENCE *new_ref;
+  NODE *man_node;
+
   int i = 0;
-  char *p;
   
+  /* Initialize empty list. */
+  add_pointer_to_array (0, ref_index, ref_list, ref_slots, 2);
+  ref_index--;
+
   while (1)
     {
+      char *p;
+
       p = info_file_find_next_in_path (filename, infopath (), &i, 0);
-      if (argc == argn)
-       {
-         if (argn == 0)
-           argn = 2;
-         argv = x2nrealloc (argv, &argn, sizeof (argv[0]));
-       }
       if (!p)
-       {
-         argv[argc] = NULL;
-         break;
-       }
+        break;
 
-      argv[argc] = xzalloc (sizeof (*argv[0]));
-      argv[argc]->filename = p;
-      ++argc;
+      new_ref = xzalloc (sizeof (REFERENCE));
+      new_ref->filename = p;
+      add_pointer_to_array (new_ref, ref_index, ref_list, ref_slots, 2);
     }
 
-  return argv;
+  /* Check for man page. */
+  man_node = get_manpage_node (filename);
+  if (man_node)
+    {
+      free (man_node);
+
+      new_ref = xzalloc (sizeof (REFERENCE));
+      new_ref->filename = MANPAGE_FILE_BUFFER_NAME;
+      new_ref->nodename = filename;
+      add_pointer_to_array (new_ref, ref_index, ref_list, ref_slots, 2);
+    }
+
+  return ref_list;
 }
 
 static int
 all_files (char *filename, int argc, char **argv)
 {
   REFERENCE **fref;
+  REFERENCE *ref;
   char *fname;
   int i, j;
   int dirok;
   struct info_namelist_entry *nlist = NULL;
   int dump_flags = dump_subnodes;
   
-  if (user_filename)
-    {
-      fname = user_filename;
-      dirok = 0;
-    }
-  else
-    {
-      fname = "dir";
-      dirok = 1;
-    }
+  fname = user_filename ? user_filename : argv[0] ? argv[0] : 0;
+  if (!fname)
+    return EXIT_FAILURE;
   
   fref = info_find_matching_files (fname);
   
-  for (i = 0; fref[i]; )
+  for (i = 0; ref = fref[i]; )
     {
-      NODE *node;
-      
-      if (!user_filename)
-       {
-         char *p = dirname (fref[i]->filename);
-         infopath_add (p, INFOPATH_INIT);
-         free (p);
-       }
-      node = info_get_node (fref[i]->filename,
-                           user_nodenames ? user_nodenames[0] : 0,
-                           PARSE_NODE_DFLT);
-      
-      if (node)
-       {
-         char *subnode_name = info_follow_menus (node, argv, NULL, 1);
-          NODE *subnode = info_get_node (node->filename, subnode_name,
-                                         PARSE_NODE_DFLT);
-         if (!subnode)
-           {
-             forget_info_file (fref[i]->filename);
-             node = NULL;
-           }
-         else
-           node = subnode;
-       }
-      
-      if (node)
-       {
-         const char *name = node_file_name (node, dirok);
-         if (!name)
-           node = NULL;
-         else
-           {
-             free (fref[i]->filename);
-             fref[i]->filename = xstrdup (name);
-           }
-       }
-      
-      if (!node)
-       {
-         info_reference_free (fref[i]);
-         for (j = i; (fref[j] = fref[j + 1]); j++);
-       }
+      if (info_namelist_add (&nlist, ref->filename) == 0)
+        {
+          ++i;
+        }
       else
-       {
-         if (info_namelist_add (&nlist, fref[i]->filename) == 0)
-           {
-             if (print_where_p)
-               printf ("%s\n", fref[i]->filename);
-             else if (user_output_filename)
-               {
-                 dump_node_to_file (node, user_output_filename, dump_flags);
-                 dump_flags |= DUMP_APPEND;
-               }
-             else
-               fref[i]->nodename = xstrdup (node->nodename);
-             forget_info_file (fref[i]->filename);
-             ++i;
-           }
-         else
-           {
-             forget_info_file (fref[i]->filename);
-             info_reference_free (fref[i]);
-             for (j = i; (fref[j] = fref[j + 1]); j++);
-           }
+        {
+          /* It's a duplicate.  This shouldn't happen, though. */
+          forget_info_file (ref->filename);
+
+          /* Delete this reference from fref. */
+          info_reference_free (ref);
+          for (j = i; (fref[j] = fref[j + 1]); j++);
        }
     }
   
   info_namelist_free (nlist);
 
-  if (print_where_p || user_output_filename)
-    return EXIT_SUCCESS;
+  /* TODO: Unify with --output handling in main(). */
+  if (user_output_filename)
+    {
+      NODE *node;
+      int dump_flags = dump_subnodes;
 
-#if 0
-  if (i <= 1)
+      for (i = 0; fref[i]; i++)
+        {
+          node = info_get_node (fref[i]->filename, fref[i]->nodename,
+                                PARSE_NODE_DFLT);
+          dump_node_to_file (node, user_output_filename, dump_flags);
+          dump_flags |= DUMP_APPEND;
+        }
+      return EXIT_SUCCESS;
+    }
+
+  /* TODO: Unify with --where handling in main(). */
+  if (print_where_p)
     {
-      if (!single_file (user_filename, argc, argv))
-        return EXIT_FAILURE;
-      info_session ();
+      for (i = 0; fref[i]; i++)
+        printf ("%s\n", fref[i]->filename);
+      return EXIT_SUCCESS;
     }
-#endif
   
   initialize_info_session ();
-  info_set_node_of_window (active_window, allfiles_create_node (argc ? argv[0] 
: fname, fref));;
+  allfiles_create_node (fname, fref);
+  info_set_node_of_window (active_window, allfiles_node);
   display_startup_message ();
   info_session ();
   return EXIT_SUCCESS;

Modified: trunk/info/info.h
===================================================================
--- trunk/info/info.h   2014-05-02 13:23:20 UTC (rev 5511)
+++ trunk/info/info.h   2014-05-02 16:43:26 UTC (rev 5512)
@@ -59,9 +59,8 @@
 
 /* Add POINTER to the list of pointers found in ARRAY.  SLOTS is the number
    of slots that have already been allocated.  INDEX is the index into the
-   array where POINTER should be added.  GROW is the number of slots to grow
-   ARRAY by, in the case that it needs growing.  TYPE is a cast of the type
-   of object stored in ARRAY (e.g., NODE_ENTRY *. */
+   array where POINTER should be added.  MINSLOTS is the number of slots to
+   start the array with in case it is empty. */
 #define add_pointer_to_array(pointer, idx, array, slots, minslots)     \
   do                                                                   \
     {                                                                  \




reply via email to

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