texinfo-commits
[Top][All Lists]
Advanced

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

[5961] parsetexi update


From: Gavin D. Smith
Subject: [5961] parsetexi update
Date: Sun, 14 Dec 2014 01:06:22 +0000

Revision: 5961
          http://svn.sv.gnu.org/viewvc/?view=rev&root=texinfo&revision=5961
Author:   gavin
Date:     2014-12-14 01:06:21 +0000 (Sun, 14 Dec 2014)
Log Message:
-----------
parsetexi update

Modified Paths:
--------------
    trunk/parsetexi/ChangeLog
    trunk/parsetexi/Makefile.am
    trunk/parsetexi/Parsetexi/lib/Parsetexi.pm
    trunk/parsetexi/debug_perl.txt
    trunk/parsetexi/dump_perl.c
    trunk/parsetexi/end_line.c
    trunk/parsetexi/macro.c
    trunk/parsetexi/makeinfo
    trunk/parsetexi/parser.h
    trunk/parsetexi/text.c
    trunk/parsetexi/text.h
    trunk/parsetexi/tree_types.h

Added Paths:
-----------
    trunk/parsetexi/extra.c
    trunk/parsetexi/labels.c

Modified: trunk/parsetexi/ChangeLog
===================================================================
--- trunk/parsetexi/ChangeLog   2014-12-13 19:53:15 UTC (rev 5960)
+++ trunk/parsetexi/ChangeLog   2014-12-14 01:06:21 UTC (rev 5961)
@@ -1,3 +1,19 @@
+2014-12-14  Gavin Smith  <address@hidden>
+
+       * tree_types.h (ELEMENT): Add fields to save information about 
+       'extra' keys on an element.
+       * extra.c: New file.
+       * dump_perl.c (dump_tree_to_perl): Dump lines filling in 'extra' 
+       keys at the end.
+       * tree_types.h (ELEMENT): Extra fields added to aid dumping.
+
+       * end_line.c <@node>: Call 'add_extra_key_contents' to set 
+       "node_content" key.
+       * Parsetexi/lib/Parsetexi.pm (_complete_node_list): Comment out 
+       code setting "node_content" keys on node elements.
+
+       * text.c (text_printf): New function.
+
 2014-12-12  Gavin Smith  <address@hidden>
 
        * Parsetexi/lib/Parsetexi.pm (parse_texi_file): Set 

Modified: trunk/parsetexi/Makefile.am
===================================================================
--- trunk/parsetexi/Makefile.am 2014-12-13 19:53:15 UTC (rev 5960)
+++ trunk/parsetexi/Makefile.am 2014-12-14 01:06:21 UTC (rev 5961)
@@ -22,7 +22,8 @@
                  macro.c \
                  handle_commands.c handle_commands.h \
                  def.c def.h \
-                 dump_perl.c
+                 dump_perl.c \
+                 extra.c
 
 parsetexi_SOURCES=$(libparsetexi_a_SOURCES) main.c
 

Modified: trunk/parsetexi/Parsetexi/lib/Parsetexi.pm
===================================================================
--- trunk/parsetexi/Parsetexi/lib/Parsetexi.pm  2014-12-13 19:53:15 UTC (rev 
5960)
+++ trunk/parsetexi/Parsetexi/lib/Parsetexi.pm  2014-12-14 01:06:21 UTC (rev 
5961)
@@ -186,17 +186,13 @@
 
       $child->{'extra'}->{'nodes_manuals'} = [];
       foreach my $node_arg (@{$child->{'args'}}) {
-       if (!defined($child->{'type'})
-             or ($child->{'type'} ne 'empty_spaces_after_command'
-                   and $child->{'type'} ne 'spaces_at_end')) {
-         push $child->{'extra'}->{'nodes_manuals'},
-           {'node_content' => $node_arg->{'contents'}};
+       push $child->{'extra'}->{'nodes_manuals'},
+         {'node_content' => $node_arg->{'contents'}};
 
-         # Set 'node_content' on the node element itself.
-         if (!defined($child->{'extra'}->{'node_content'})) {
-           $child->{'extra'}->{'node_content'} = $node_arg->{'contents'};
-         }
-       }
+       # Set 'node_content' on the node element itself.
+       #if (!defined($child->{'extra'}->{'node_content'})) {
+       #  $child->{'extra'}->{'node_content'} =  $node_arg->{'contents'};
+       #}
       }
     }
   }
@@ -222,7 +218,7 @@
   #print "Reading tree...\n";
   eval $tree_stream;
   #print "Read tree.\n";
-
+         
   #print "Adjusting tree...\n";
   _add_parents ($VAR1);
   _complete_node_list ($self, $VAR1);

Modified: trunk/parsetexi/debug_perl.txt
===================================================================
--- trunk/parsetexi/debug_perl.txt      2014-12-13 19:53:15 UTC (rev 5960)
+++ trunk/parsetexi/debug_perl.txt      2014-12-14 01:06:21 UTC (rev 5961)
@@ -1,3 +1,5 @@
+For inspecting execution of installed makeinfo:
+
 perl -d `which makeinfo` sample.texi
 
 b  /usr/local/share/texinfo/Texinfo/Parser.pm:5344
@@ -4,3 +6,13 @@
 
 p _print_tree ($current)
 
+-----
+For inspecting execution of Parsetexi module:
+
+Uncomment DEBUG line in ./makeinfo.
+
+b Parsetexi/lib/Parsetexi.pm:227
+
+With _print_tree exported from Texinfo::Parser, can do
+
+p Texinfo::Parser::_print_tree ($VAR1->{'contents'}[1])

Modified: trunk/parsetexi/dump_perl.c
===================================================================
--- trunk/parsetexi/dump_perl.c 2014-12-13 19:53:15 UTC (rev 5960)
+++ trunk/parsetexi/dump_perl.c 2014-12-14 01:06:21 UTC (rev 5961)
@@ -3,11 +3,17 @@
 
 #include "parser.h"
 #include "input.h"
+#include "text.h"
 
 #define element_type_name(e) element_type_names[(e)->type]
 
+#define TREE_ROOT_VAR "$VAR1"
+
 int indent = 0;
 
+/* A dump to fill in references from one part of the tree to another. */
+static TEXT fixup_dump;
+
 void dump_contents (ELEMENT *);
 void dump_element (ELEMENT *);
 
@@ -29,6 +35,9 @@
 
   for (i = 0; i < e->args.number; i++)
     {
+      e->args.list[i]->parent_type = route_args;
+      e->args.list[i]->index_in_parent = i;
+
       dump_indent ();
       dump_element (e->args.list[i]);
       printf (",\n");
@@ -48,6 +57,9 @@
 
   for (i = 0; i < e->contents.number; i++)
     {
+      e->contents.list[i]->parent_type = route_contents;
+      e->contents.list[i]->index_in_parent = i;
+
       dump_indent ();
       dump_element (e->contents.list[i]);
       printf (",\n");
@@ -58,7 +70,123 @@
   printf ("],\n");
 }
 
+/* Recursively go up to the root of the tree.  On the way back print the path 
+   to the element into FIXUP_DUMP. */
 void
+dump_route_to_element (ELEMENT *e)
+{
+  if (e->parent)
+    dump_route_to_element (e->parent);
+
+  switch (e->parent_type)
+    {
+    case route_args:
+      text_append (&fixup_dump, "{'args'}");
+      text_printf (&fixup_dump, "[%d]", e->index_in_parent);
+      break;
+    case route_contents:
+      text_append (&fixup_dump, "{'contents'}");
+      text_printf (&fixup_dump, "[%d]", e->index_in_parent);
+      break;
+    case route_uninitialized:
+      if (e->parent)
+        abort ();
+      text_append (&fixup_dump, TREE_ROOT_VAR "->");
+      break;
+    default:
+      abort ();
+    }
+}
+
+/* Append to FIXUP_DUMP a line assigning the I'th 'extra' key of E. */
+void
+dump_fixup_line (ELEMENT *e, int i)
+{
+  dump_route_to_element (e);
+  text_printf (&fixup_dump, "{'extra'}{'%s'}", e->extra[i].key);
+
+  text_append (&fixup_dump, " = ");
+  dump_route_to_element (e->extra[i].value);
+
+  switch (e->extra[i].type)
+    {
+    case extra_element:
+      break;
+    case extra_element_contents:
+      text_append (&fixup_dump, "->{'contents'}");
+      break;
+    case extra_element_text:
+      text_append (&fixup_dump, "->{'text'}");
+      break;
+    default:
+      abort ();
+    }
+  text_append (&fixup_dump, ";\n");
+}
+
+/* Dump a skeleton for the 'extra' key.  For each key, if the referenced 
+   element has been dumped yet and we know its, append a line filling in the 
+   value of the key to FIXUP_DUMP.  Otherwise, record the reference in the 
+   'pending_references' field.  Look through the pending references in E 
itself 
+   for references to this element from elsewhere. */
+void
+dump_extra (ELEMENT *e)
+{
+  int i;
+
+  printf ("{\n");
+  indent += 2;
+
+  if (e->extra_number > 0)
+    {
+      for (i = 0; i < e->extra_number; i++)
+        {
+          dump_indent ();
+          printf ("'%s' => {},\n", e->extra[i].key);
+
+          if (e->extra[i].value->parent_type != route_uninitialized)
+            {
+              dump_fixup_line (e, i);
+            }
+          else /* Add a pending reference to this element. */
+            {
+              ELEMENT *e2;
+
+              e2 = e->extra[i].value;
+
+              if (e2->pending_number == e2->pending_space)
+                {
+                  e2->pending_references = realloc (e2->pending_references,
+                      (e2->pending_space += 2) * sizeof (PENDING_REFERENCE));
+                  if (!e2->pending_references)
+                    abort ();
+                }
+
+              e2->pending_references[e2->pending_number].element = e;
+              e2->pending_references[e2->pending_number++].extra_index = i;
+            }
+        }
+    }
+
+  if (e->pending_number > 0)
+    {
+      for (i = 0; i < e->pending_number; i++)
+        {
+          ELEMENT *referring;
+          int index;
+
+          referring = e->pending_references[i].element;
+          index = e->pending_references[i].extra_index;
+          dump_fixup_line (referring, index);
+        }
+    }
+
+  indent -= 2;
+  dump_indent ();
+  printf ("},\n");
+}
+
+void
 dump_string (char *s)
 {
      while (*s)
@@ -92,10 +220,7 @@
   
   if (e->text.text)
     {
-      char *s;
       dump_indent ();
-      /* FIXME: Need to escape backslashes, e.g. output
-         \\input instead of \input. */
       printf ("'text' => '");
       dump_string (e->text.text);
       printf ("',\n");
@@ -115,6 +240,13 @@
       dump_contents (e);
     }
 
+  if (e->extra_number > 0)
+    {
+      dump_indent ();
+      printf ("'extra' => ");
+      dump_extra (e);
+    }
+
   indent -= 2;
   dump_indent ();
   printf ("}");
@@ -123,7 +255,10 @@
 void
 dump_tree_to_perl (ELEMENT *root)
 {
-  printf ("$VAR1 = ");
+  text_init (&fixup_dump);
+  printf (TREE_ROOT_VAR " = ");
   dump_element (root);
   printf (";\n");
+  if (fixup_dump.end > 0)
+    printf ("%s", fixup_dump.text);
 }

Modified: trunk/parsetexi/end_line.c
===================================================================
--- trunk/parsetexi/end_line.c  2014-12-13 19:53:15 UTC (rev 5960)
+++ trunk/parsetexi/end_line.c  2014-12-14 01:06:21 UTC (rev 5961)
@@ -260,6 +260,33 @@
         }
       else if (current->cmd == CM_node) /* 3235 */
         {
+          int i;
+          ELEMENT *arg;
+          /* Construct 'nodes_manuals' array.  This would be an 'extra' 
+             reference to an array that doesn't exist anywhere else. */
+
+          /* This sets the 'node_content' and 'normalized' keys on each 
element 
+             in 'nodes_manuals'. */
+          //parse_node_manual ();
+
+          
+          /* Look for first non-empty argument. */
+          /* In Perl a copy of the argument list is taken and the empty space 
+             arguments are removed with trim_spaces_comment_from_content. */
+          add_extra_key_contents (current, "node_content",
+                                  current->args.list[0]);
+
+          /* Also set 'normalized' here.  The normalized labels are actually 
+             the keys of "labels_information($parser)". */
+
+          /*Check that the node name doesn't have a filename element for 
+            referring to an external manual (_check_internal_node), and that 
it 
+            is not empty (_check_empty_node).  */
+          //check_node_label ();
+
+          /* This sets 'node_content' and 'normalized' on the node, among
+             other things (which were already set in parse_node_manual). */
+          //register_label (current, current->args.list[0]);
         }
       else if (current->cmd == CM_listoffloats) /* 3248 */
         {

Added: trunk/parsetexi/extra.c
===================================================================
--- trunk/parsetexi/extra.c                             (rev 0)
+++ trunk/parsetexi/extra.c     2014-12-14 01:06:21 UTC (rev 5961)
@@ -0,0 +1,43 @@
+#include "parser.h"
+
+static void
+add_extra_key (ELEMENT *e, char *key, ELEMENT *value)
+{
+  if (e->extra_number == e->extra_space)
+    {
+      e->extra = realloc (e->extra,
+                          (e->extra_space += 5) * sizeof (KEY_PAIR));
+      if (!e->extra)
+        abort ();
+    }
+
+  e->extra[e->extra_number].key = key;
+  e->extra[e->extra_number++].value = value;
+}
+
+/* Add an extra key that is a reference to another element (for example, 
+   'associated_section' on a node command element. */
+void
+add_extra_key_element (ELEMENT *e, char *key, ELEMENT *value)
+{
+  add_extra_key (e, key, value);
+  e->extra[e->extra_number - 1].type = extra_element;
+}
+
+/* Add an extra key that is a reference to the contents array of another
+   element (for example, 'node_content' on a node command element). */
+void
+add_extra_key_contents (ELEMENT *e, char *key, ELEMENT *value)
+{
+  add_extra_key (e, key, value);
+  e->extra[e->extra_number - 1].type = extra_element_contents;
+}
+
+/* Add an extra key that is a reference to the text field of another
+   element/ */
+void
+add_extra_key_text (ELEMENT *e, char *key, ELEMENT *value)
+{
+  add_extra_key (e, key, value);
+  e->extra[e->extra_number - 1].type = extra_element_text;
+}

Added: trunk/parsetexi/labels.c
===================================================================
--- trunk/parsetexi/labels.c                            (rev 0)
+++ trunk/parsetexi/labels.c    2014-12-14 01:06:21 UTC (rev 5961)
@@ -0,0 +1,5 @@
+void
+register_label (ELEMENT *current, ELEMENT *label)
+{
+  /* Texinfo::Convert::Texinfo::convert is used here. */
+}

Modified: trunk/parsetexi/macro.c
===================================================================
--- trunk/parsetexi/macro.c     2014-12-13 19:53:15 UTC (rev 5960)
+++ trunk/parsetexi/macro.c     2014-12-14 01:06:21 UTC (rev 5961)
@@ -247,7 +247,7 @@
           else
           // then what? e.g. is "@m {     }" one empty argument or none?
             if (arg_number != 0)
-              abort;
+              abort ();
 
           debug ("MACRO NEW ARG");
           pline = sep + 1;

Modified: trunk/parsetexi/makeinfo
===================================================================
--- trunk/parsetexi/makeinfo    2014-12-13 19:53:15 UTC (rev 5960)
+++ trunk/parsetexi/makeinfo    2014-12-14 01:06:21 UTC (rev 5961)
@@ -1,6 +1,6 @@
 #! /usr/bin/env bash
 
-#DEBUG=perl -d
+#DEBUG='perl -d'
 #OPTIONS='-c DEBUG=1'
 COMMAND=${COMMAND:-./texi2any-C.pl}
 

Modified: trunk/parsetexi/parser.h
===================================================================
--- trunk/parsetexi/parser.h    2014-12-13 19:53:15 UTC (rev 5960)
+++ trunk/parsetexi/parser.h    2014-12-14 01:06:21 UTC (rev 5961)
@@ -57,3 +57,8 @@
 
 /* In dump_perl.c */
 void dump_tree_to_perl (ELEMENT *root);
+
+/* In extra.c */
+void add_extra_key_element (ELEMENT *e, char *key, ELEMENT *value);
+void add_extra_key_contents (ELEMENT *e, char *key, ELEMENT *value);
+void add_extra_key_text (ELEMENT *e, char *key, ELEMENT *value);

Modified: trunk/parsetexi/text.c
===================================================================
--- trunk/parsetexi/text.c      2014-12-13 19:53:15 UTC (rev 5960)
+++ trunk/parsetexi/text.c      2014-12-14 01:06:21 UTC (rev 5961)
@@ -1,7 +1,11 @@
+#define _GNU_SOURCE
 #include <stdlib.h>
 #include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
 
 #include "tree_types.h"
+#include "text.h"
 
 /* Make sure there are LEN free bytes. */
 static void
@@ -20,6 +24,19 @@
 }
 
 void
+text_printf (TEXT *t, char *format, ...)
+{
+  va_list v;
+  char *s;
+
+  va_start (v, format);
+  vasprintf (&s, format, v);
+  text_append (t, s);
+  free (s);
+  va_end (v);
+}
+
+void
 text_append_n (TEXT *t, char *s, size_t len)
 {
   text_alloc (t, len + 1);

Modified: trunk/parsetexi/text.h
===================================================================
--- trunk/parsetexi/text.h      2014-12-13 19:53:15 UTC (rev 5960)
+++ trunk/parsetexi/text.h      2014-12-14 01:06:21 UTC (rev 5961)
@@ -1,5 +1,6 @@
 void text_init (TEXT *t);
 void text_append (TEXT *t, char *s);
 void text_append_n (TEXT *t, char *s, size_t len);
+void text_printf (TEXT *t, char *format, ...);
 
 #define text_base(t) ((t)->space ? (t)->text : (char *) 0)

Modified: trunk/parsetexi/tree_types.h
===================================================================
--- trunk/parsetexi/tree_types.h        2014-12-13 19:53:15 UTC (rev 5960)
+++ trunk/parsetexi/tree_types.h        2014-12-14 01:06:21 UTC (rev 5961)
@@ -8,9 +8,16 @@
     size_t end;
 } TEXT;
 
+enum extra_type {
+    extra_element,
+    extra_element_contents,
+    extra_element_text,
+};
+
 typedef struct KEY_PAIR {
     char *key;
-    char *value;
+    enum extra_type type;
+    struct ELEMENT *value;
 } KEY_PAIR;
 
 typedef struct ELEMENT_LIST {
@@ -22,18 +29,41 @@
 typedef struct LINE_NR {
 } LINE_NR;
 
+/* Type of a link in the route from the root of the tree to an element. */
+enum route_element_type { route_uninitialized, route_contents, route_args };
+
+typedef struct {
+    /* Element that contains a reference to this one. */
+    struct ELEMENT *element;
+
+    /* Index into the referring element's extra keys that is the reference. */
+    int extra_index;
+} PENDING_REFERENCE;
+
 typedef struct ELEMENT {
     enum command_id cmd;
     TEXT text;
     enum element_type type;
     ELEMENT_LIST args;
     ELEMENT_LIST contents;
-    struct ELEMENT *parent; /* !! No way to serialize !! */
+    struct ELEMENT *parent;
     LINE_NR line_nr;
-    KEY_PAIR **extra;
 
+    KEY_PAIR *extra;
+    size_t extra_number;
+    size_t extra_space;
+
     /* Not used in final output. */
     int remaining_args; /* Could be a stack instead. */
+
+    /********* Used when dumping to a text stream only. ************/
+
+    int index_in_parent;
+    enum route_element_type parent_type;
+
+    PENDING_REFERENCE *pending_references;
+    size_t pending_number;
+    size_t pending_space;
 } ELEMENT;
 
 typedef struct GLOBAL_INFO {




reply via email to

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