[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 {
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [5961] parsetexi update,
Gavin D. Smith <=