texinfo-commits
[Top][All Lists]
Advanced

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

[6126] parsetexi include directories


From: Gavin D. Smith
Subject: [6126] parsetexi include directories
Date: Sat, 14 Feb 2015 14:23:58 +0000

Revision: 6126
          http://svn.sv.gnu.org/viewvc/?view=rev&root=texinfo&revision=6126
Author:   gavin
Date:     2015-02-14 14:23:57 +0000 (Sat, 14 Feb 2015)
Log Message:
-----------
parsetexi include directories

Modified Paths:
--------------
    trunk/parsetexi/ChangeLog
    trunk/parsetexi/Parsetexi/Parsetexi.xs
    trunk/parsetexi/Parsetexi/lib/Parsetexi.pm
    trunk/parsetexi/api.h
    trunk/parsetexi/input.c
    trunk/parsetexi/input.h
    trunk/parsetexi/main.c
    trunk/parsetexi/parser.c
    trunk/parsetexi/parser.h
    trunk/parsetexi/test-files/email.texi

Added Paths:
-----------
    trunk/parsetexi/test-files/include-1.texi
    trunk/parsetexi/test-files/include-2.texi

Modified: trunk/parsetexi/ChangeLog
===================================================================
--- trunk/parsetexi/ChangeLog   2015-02-13 20:45:56 UTC (rev 6125)
+++ trunk/parsetexi/ChangeLog   2015-02-14 14:23:57 UTC (rev 6126)
@@ -1,3 +1,11 @@
+2015-02-14  Gavin Smith  <address@hidden>
+
+       * input.c, Parsetexi/Parsetexi.xs (add_include_directory): New 
+       function.
+       * Parsetexi/lib/Parsetexi.pm (parser): Call it.
+       * input.c (input_push_file): Look through list of include 
+       directories.
+
 2015-02-13  Gavin Smith  <address@hidden>
 
        * parser.c (abort_empty_line) <ET_empty_line>: Clear type of

Modified: trunk/parsetexi/Parsetexi/Parsetexi.xs
===================================================================
--- trunk/parsetexi/Parsetexi/Parsetexi.xs      2015-02-13 20:45:56 UTC (rev 
6125)
+++ trunk/parsetexi/Parsetexi/Parsetexi.xs      2015-02-14 14:23:57 UTC (rev 
6126)
@@ -57,3 +57,7 @@
 contents_child_by_index (e, index)
         ELEMENT *e
         int index
+
+void
+add_include_directory (filename)
+        char *filename

Modified: trunk/parsetexi/Parsetexi/lib/Parsetexi.pm
===================================================================
--- trunk/parsetexi/Parsetexi/lib/Parsetexi.pm  2015-02-13 20:45:56 UTC (rev 
6125)
+++ trunk/parsetexi/Parsetexi/lib/Parsetexi.pm  2015-02-14 14:23:57 UTC (rev 
6126)
@@ -86,6 +86,8 @@
 # Stub for Texinfo::Parser::parser (line 574)
 sub parser (;$$)
 {
+  my $conf = shift;
+
   my %parser_blanks = (
     'labels' => {},
     'extra' => {},
@@ -115,6 +117,21 @@
   $parser->{'gettext'} = $parser_default_configuration{'gettext'};
   $parser->{'pgettext'} = $parser_default_configuration{'pgettext'};
 
+  if (defined($conf)) {
+    foreach my $key (keys (%$conf)) {
+      if ($key eq 'include_directories') {
+        warn "Passed include_directories\n";
+        foreach my $d (@{$conf->{'include_directories'}}) {
+          warn "got dir $d\n";
+          add_include_directory ($d);
+        }
+
+      } else {
+        warn "ignoring parser configuration value \"$key\"\n";
+      }
+    }
+  }
+
   bless $parser;
 
   $parser->Texinfo::Report::new;
@@ -163,30 +180,6 @@
   }
 }
 
-# Set the 'menu_entry' extra key on each menu entry.  This was the
-## return value of _parse_node_manual (line 2257, Parser.pm).
-#sub _add_menu_entry_node_keys ($) {
-#  my $menu = shift;
-#  foreach my $entry (@{$menu->{'contents'}}) {
-#    next if !$entry->{'type'} or $entry->{'type'} ne 'menu_entry';
-#    foreach my $part (@{$entry->{'args'}}) {
-#      if ($part->{'type'} eq 'menu_entry_node') {
-#      #$entry->{'extra'}->{'menu_entry_node'}->{'manual_content'} = ...;
-#
-#      # In Texinfo::Parser::_parse_node_manual, a copy was taken of
-#      # the contents, and leading and trailing whitespace elements
-#      # removed with _trim_spaces_comment_from_content.
-#      $entry->{'extra'}->{'menu_entry_node'}->{'node_content'}
-#        = $part->{'contents'};
-#
-#      # TODO: Actually get normalized node name of target.
-#      $entry->{'extra'}->{'menu_entry_node'}->{'normalized'}
-#        = $part->{'contents'}[0]{'text'};
-#      }
-#    }
-#  }
-#}
-
 # Look for a menu in the node, saving in the 'menus' array reference
 # of the node element
 # This array was built on line 4800 of Parser.pm.
@@ -210,8 +203,6 @@
   foreach my $child (@{$contents}) {
     if ($child->{'cmdname'} and $child->{'cmdname'} eq 'menu') {
       push @{$node->{'menus'}}, $child;
-      # Disable - do this in the C code now.
-      #_add_menu_entry_node_keys ($child);
     }
   }
 }
@@ -268,11 +259,11 @@
     $tree_stream = dump_tree_to_string_3 ();
     #print "tree stream is $tree_stream\n";
     eval $tree_stream;
+    print "Got data.\n";
   } else {
 
-    # Note we are calling a separate executable instead of using the code
-    # compliled into Parsetexi.pm as a library.  We should add functions 
-    # to Parsetexi.pm to get the tree without doing this.
+    # This calls a separate executable instead of using the code
+    # compliled into Parsetexi.pm as a library.
     $tree_stream = qx(./parsetexi $file_name 2>/dev/null);
 
     print "Reading tree...\n";

Modified: trunk/parsetexi/api.h
===================================================================
--- trunk/parsetexi/api.h       2015-02-13 20:45:56 UTC (rev 6125)
+++ trunk/parsetexi/api.h       2015-02-14 14:23:57 UTC (rev 6126)
@@ -12,3 +12,6 @@
 char *dump_tree_to_string_3 (void);
 char *dump_root_element_1 (void);
 char *dump_root_element_2 (void);
+
+/* In input.c */
+void add_include_directory (char *filename);

Modified: trunk/parsetexi/input.c
===================================================================
--- trunk/parsetexi/input.c     2015-02-13 20:45:56 UTC (rev 6125)
+++ trunk/parsetexi/input.c     2015-02-14 14:23:57 UTC (rev 6126)
@@ -23,6 +23,7 @@
 #include "tree_types.h"
 #include "input.h"
 #include "text.h"
+#include "api.h"
 
 enum input_type { IN_file, IN_text };
 
@@ -192,14 +193,47 @@
      a macro expansion, or was pushed back when reading the file preamble. */
 }
 
+
+static char **include_dirs;
+static size_t include_dirs_number;
+static size_t include_dirs_space;
+
 void
+add_include_directory (char *filename)
+{
+  if (include_dirs_number == include_dirs_space)
+    {
+      include_dirs = realloc (include_dirs,
+                              sizeof (char *) * (include_dirs_space += 5));
+    }
+  include_dirs[include_dirs_number++] = filename;
+}
+
+/* Try to open a file called FILENAME, looking for it in the list of include
+   directories. */
+void
 input_push_file (char *filename)
 {
   FILE *stream;
+  int i;
+
   save_line_nr ();
 
-  stream = fopen (filename, "r");
+  for (i = 0; i < include_dirs_number; i++)
+    {
+      /* TODO: The Perl code (in Common.pm, 'locate_include_file') handles a 
+         volume in a path (like "A:"), possibly more general treatment with 
+         File::Spec module. */
+      /* Also checks if filename is absolute. */
 
+      char *fullpath;
+      asprintf (&fullpath, "%s/%s", include_dirs[i], filename);
+      stream = fopen (fullpath, "r");
+      free (fullpath);
+      if (stream)
+        break;
+    }
+
   if (!stream)
     {
       fprintf (stderr, "Could not open %s\n", filename);

Modified: trunk/parsetexi/input.h
===================================================================
--- trunk/parsetexi/input.h     2015-02-13 20:45:56 UTC (rev 6125)
+++ trunk/parsetexi/input.h     2015-02-14 14:23:57 UTC (rev 6126)
@@ -3,7 +3,7 @@
 char *new_line (void);
 char *next_text (void);
 
-void input_push_file (char *line);
-void input_push_text (char *filename);
+void input_push_text (char *line);
+void input_push_file (char *filename);
 
 extern LINE_NR line_nr;

Modified: trunk/parsetexi/main.c
===================================================================
--- trunk/parsetexi/main.c      2015-02-13 20:45:56 UTC (rev 6125)
+++ trunk/parsetexi/main.c      2015-02-14 14:23:57 UTC (rev 6126)
@@ -30,6 +30,7 @@
       exit (1);
     }
   init_index_commands ();
+  add_include_directory (".");
   parse_texi_file (argv[1]);
   dump_tree_to_perl (Root);
 

Modified: trunk/parsetexi/parser.c
===================================================================
--- trunk/parsetexi/parser.c    2015-02-13 20:45:56 UTC (rev 6125)
+++ trunk/parsetexi/parser.c    2015-02-14 14:23:57 UTC (rev 6126)
@@ -129,12 +129,31 @@
 /* parse_texi_file */
 /* 835 */
 void
-parse_texi_file (char *filename)
+parse_texi_file (const char *filename_in)
 {
+  char *p, *q;
   char *linep, *line = 0;
   ELEMENT *root = new_element (ET_text_root);
   ELEMENT *preamble = 0;
+  char *filename = strdup (filename_in);
 
+  /* Strip off a leading directory path, by looking for the last
+     '/' in filename. */
+  p = 0;
+  q = strchr (filename, '/');
+  while (q)
+    {
+      p = q;
+      q = strchr (q + 1, '/');
+    }
+
+  if (p)
+    {
+      *p = '\0';
+      add_include_directory (filename);
+      filename = p + 1;
+    }
+
   input_push_file (filename);
 
   /* Check for preamble. */

Modified: trunk/parsetexi/parser.h
===================================================================
--- trunk/parsetexi/parser.h    2015-02-13 20:45:56 UTC (rev 6125)
+++ trunk/parsetexi/parser.h    2015-02-14 14:23:57 UTC (rev 6126)
@@ -32,7 +32,7 @@
 void push_conditional_stack (enum command_id cond);
 enum command_id pop_conditional_stack (void);
 extern size_t conditional_number;
-void parse_texi_file (char *filename);
+void parse_texi_file (const char *filename);
 int abort_empty_line (ELEMENT **current_inout, char *additional);
 ELEMENT *end_paragraph (ELEMENT *current);
 void isolate_last_space (ELEMENT *current, enum element_type type);

Modified: trunk/parsetexi/test-files/email.texi
===================================================================
--- trunk/parsetexi/test-files/email.texi       2015-02-13 20:45:56 UTC (rev 
6125)
+++ trunk/parsetexi/test-files/email.texi       2015-02-14 14:23:57 UTC (rev 
6126)
@@ -1 +1 @@
address@hidden, same place}
address@hidden bug-texinfo , same place }

Added: trunk/parsetexi/test-files/include-1.texi
===================================================================
--- trunk/parsetexi/test-files/include-1.texi                           (rev 0)
+++ trunk/parsetexi/test-files/include-1.texi   2015-02-14 14:23:57 UTC (rev 
6126)
@@ -0,0 +1,5 @@
address@hidden Top
+
+top
+
address@hidden include-2.texi

Added: trunk/parsetexi/test-files/include-2.texi
===================================================================
--- trunk/parsetexi/test-files/include-2.texi                           (rev 0)
+++ trunk/parsetexi/test-files/include-2.texi   2015-02-14 14:23:57 UTC (rev 
6126)
@@ -0,0 +1,3 @@
address@hidden Second
+
+second




reply via email to

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