[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[no subject]
From: |
Patrice Dumas |
Date: |
Sun, 22 Jun 2025 05:09:47 -0400 (EDT) |
branch: master
commit 5c1ced98838f0a6af93f5fc4de35c99bdd310931
Author: Patrice Dumas <pertusus@free.fr>
AuthorDate: Sun Jun 22 11:03:20 2025 +0200
* tta/perl/Makefile.am (dist_convertmodules_DATA),
tta/perl/Texinfo/Convert/TreeElementConverterXS.pm,
tta/perl/Texinfo/Convert/TreeElementConverter.pm (%XS_overrides),
tta/perl/XSTexinfo/Makefile.am (xs_LTLIBRARIES)
(TreeElementConverterXS_*),
tta/perl/XSTexinfo/parser_document/TreeElementXS.xs,
tta/perl/XSTexinfo/parser_document/TreeElementConverterXS.xs:
split TreeElementConverterXS.xs out of TreeElementXS.xs for
Texinfo::Convert::TreeElementConverter overriden functions.
---
.gitignore | 1 +
ChangeLog | 12 +
tta/perl/Makefile.am | 1 +
tta/perl/Texinfo/Convert/TreeElementConverter.pm | 47 +-
tta/perl/Texinfo/Convert/TreeElementConverterXS.pm | 52 ++
tta/perl/XSTexinfo/Makefile.am | 17 +
...{TreeElementXS.xs => TreeElementConverterXS.xs} | 483 ++----------------
.../XSTexinfo/parser_document/TreeElementXS.xs | 537 +--------------------
8 files changed, 149 insertions(+), 1001 deletions(-)
diff --git a/.gitignore b/.gitignore
index ba7904ecd3..081c103049 100644
--- a/.gitignore
+++ b/.gitignore
@@ -362,6 +362,7 @@ tta/perl/XSTexinfo/parser_document/Parsetexi.c
tta/perl/XSTexinfo/parser_document/ReaderXS.c
tta/perl/XSTexinfo/parser_document/StructuringTransfoXS.c
tta/perl/XSTexinfo/parser_document/TreeElementXS.c
+tta/perl/XSTexinfo/parser_document/TreeElementConverterXS.c
tta/perl/XSTexinfo/parser_document/.libs
tta/perl/XSTexinfo/parser_document/*.lo
diff --git a/ChangeLog b/ChangeLog
index 9cb9f4ea5b..e84566711e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2025-06-22 Patrice Dumas <pertusus@free.fr>
+
+ * tta/perl/Makefile.am (dist_convertmodules_DATA),
+ tta/perl/Texinfo/Convert/TreeElementConverterXS.pm,
+ tta/perl/Texinfo/Convert/TreeElementConverter.pm (%XS_overrides),
+ tta/perl/XSTexinfo/Makefile.am (xs_LTLIBRARIES)
+ (TreeElementConverterXS_*),
+ tta/perl/XSTexinfo/parser_document/TreeElementXS.xs,
+ tta/perl/XSTexinfo/parser_document/TreeElementConverterXS.xs:
+ split TreeElementConverterXS.xs out of TreeElementXS.xs for
+ Texinfo::Convert::TreeElementConverter overriden functions.
+
2025-06-22 Patrice Dumas <pertusus@free.fr>
* tta/perl/Texinfo/Common.pm (item_itemize_prepended): rename
diff --git a/tta/perl/Makefile.am b/tta/perl/Makefile.am
index b7e2f1fb62..1391144818 100644
--- a/tta/perl/Makefile.am
+++ b/tta/perl/Makefile.am
@@ -136,6 +136,7 @@ dist_convertmodules_DATA = \
Texinfo/Convert/Text.pm \
Texinfo/Convert/TextContent.pm \
Texinfo/Convert/TreeElementConverter.pm \
+ Texinfo/Convert/TreeElementConverterXS.pm \
Texinfo/Convert/TreeElementReadDocBook.pm \
Texinfo/Convert/Unicode.pm \
Texinfo/Convert/Utils.pm
diff --git a/tta/perl/Texinfo/Convert/TreeElementConverter.pm
b/tta/perl/Texinfo/Convert/TreeElementConverter.pm
index c5ee6bdc4c..6c3415ac5e 100644
--- a/tta/perl/Texinfo/Convert/TreeElementConverter.pm
+++ b/tta/perl/Texinfo/Convert/TreeElementConverter.pm
@@ -36,6 +36,8 @@ use Carp qw(cluck confess);
use Texinfo::XSLoader;
+use Texinfo::Convert::TreeElementConverterXS;
+
use Texinfo::Commands;
use Texinfo::CommandsValues;
use Texinfo::Common;
@@ -59,50 +61,49 @@ our $module_loaded = 0;
my %XS_overrides = (
"Texinfo::Convert::TreeElementConverter::new_tree_element"
- => "Texinfo::TreeElement::new_tree_element",
+ => "Texinfo::Convert::TreeElementConverterXS::new_tree_element",
"Texinfo::Convert::TreeElementConverter::get_tree_element_index_entry"
- => "Texinfo::TreeElement::get_tree_element_index_entry",
+ =>
"Texinfo::Convert::TreeElementConverterXS::get_tree_element_index_entry",
"Texinfo::Convert::TreeElementConverter::get_global_unique_tree_element"
- => "Texinfo::TreeElement::get_global_unique_tree_element",
+ =>
"Texinfo::Convert::TreeElementConverterXS::get_global_unique_tree_element",
"Texinfo::Convert::TreeElementConverter::global_commands_information_command_list"
- => "Texinfo::TreeElement::global_commands_information_command_list",
+ =>
"Texinfo::Convert::TreeElementConverterXS::global_commands_information_command_list",
"Texinfo::Convert::TreeElementConverter::tree_element_item_itemize_prepended"
- => "Texinfo::TreeElement::tree_element_item_itemize_prepended",
+ =>
"Texinfo::Convert::TreeElementConverterXS::tree_element_item_itemize_prepended",
"Texinfo::Convert::TreeElementConverter::item_itemize_prepended"
- => "Texinfo::TreeElement::tree_element_item_itemize_prepended",
+ =>
"Texinfo::Convert::TreeElementConverterXS::tree_element_item_itemize_prepended",
"Texinfo::Convert::TreeElementConverter::find_element_authors"
- => "Texinfo::TreeElement::element_find_element_authors",
+ =>
"Texinfo::Convert::TreeElementConverterXS::element_find_element_authors",
"Texinfo::Convert::TreeElementConverter::element_find_element_authors"
- => "Texinfo::TreeElement::element_find_element_authors",
+ =>
"Texinfo::Convert::TreeElementConverterXS::element_find_element_authors",
"Texinfo::Convert::TreeElementConverter::element_table_item_content_tree"
- => "Texinfo::TreeElement::element_table_item_content_tree",
+ =>
"Texinfo::Convert::TreeElementConverterXS::element_table_item_content_tree",
"Texinfo::Convert::TreeElementConverter::table_item_content_tree"
- => "Texinfo::TreeElement::element_table_item_content_tree",
+ =>
"Texinfo::Convert::TreeElementConverterXS::element_table_item_content_tree",
"Texinfo::Convert::TreeElementConverter::comment_or_end_line"
- => "Texinfo::TreeElement::comment_or_end_line",
+ => "Texinfo::Convert::TreeElementConverterXS::comment_or_end_line",
"Texinfo::Convert::TreeElementConverter::tree_element_comment_or_end_line"
- => "Texinfo::TreeElement::comment_or_end_line",
+ => "Texinfo::Convert::TreeElementConverterXS::comment_or_end_line",
"Texinfo::Convert::TreeElementConverter::argument_comment_end_line"
- => "Texinfo::TreeElement::argument_comment_end_line",
+ => "Texinfo::Convert::TreeElementConverterXS::argument_comment_end_line",
"Texinfo::Convert::TreeElementConverter::tree_element_argument_comment_end_line"
- => "Texinfo::TreeElement::argument_comment_end_line",
+ => "Texinfo::Convert::TreeElementConverterXS::argument_comment_end_line",
"Texinfo::Convert::TreeElementConverter::element_expand_verbatiminclude"
- => "Texinfo::TreeElement::element_expand_verbatiminclude",
+ =>
"Texinfo::Convert::TreeElementConverterXS::element_expand_verbatiminclude",
"Texinfo::Convert::TreeElementConverter::element_expand_today"
- => "Texinfo::TreeElement::element_expand_today",
+ => "Texinfo::Convert::TreeElementConverterXS::element_expand_today",
"Texinfo::Convert::TreeElementConverter::index_content_element"
- => "Texinfo::TreeElement::tree_element_index_content_element",
+ =>
"Texinfo::Convert::TreeElementConverterXS::tree_element_index_content_element",
"Texinfo::Convert::TreeElementConverter::tree_element_index_content_element"
- => "Texinfo::TreeElement::tree_element_index_content_element",
+ =>
"Texinfo::Convert::TreeElementConverterXS::tree_element_index_content_element",
"Texinfo::Convert::TreeElementConverter::element_gdt"
- => "Texinfo::TreeElement::element_gdt",
+ => "Texinfo::Convert::TreeElementConverterXS::element_gdt",
"Texinfo::Convert::TreeElementConverter::tree_elements_sections_list"
- => "Texinfo::TreeElement::tree_elements_sections_list",
+ => "Texinfo::Convert::TreeElementConverterXS::tree_elements_sections_list",
"Texinfo::Convert::TreeElementConverter::tree_elements_nodes_list"
- => "Texinfo::TreeElement::tree_elements_nodes_list",
+ => "Texinfo::Convert::TreeElementConverterXS::tree_elements_nodes_list",
"Texinfo::Convert::TreeElementConverter::tree_elements_headings_list"
- => "Texinfo::TreeElement::tree_elements_headings_list",
-
+ => "Texinfo::Convert::TreeElementConverterXS::tree_elements_headings_list",
);
sub import {
diff --git a/tta/perl/Texinfo/Convert/TreeElementConverterXS.pm
b/tta/perl/Texinfo/Convert/TreeElementConverterXS.pm
new file mode 100644
index 0000000000..3cb775f2c3
--- /dev/null
+++ b/tta/perl/Texinfo/Convert/TreeElementConverterXS.pm
@@ -0,0 +1,52 @@
+# Copyright 2023-2025 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License,
+# or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+package Texinfo::Convert::TreeElementConverterXS;
+
+# This package loads XS implementations of tree element converter functions.
+
+use 5.006;
+use strict;
+use warnings;
+
+our $VERSION = '7.2dev';
+
+use Texinfo::XSLoader;
+
+our $XS_package;
+
+BEGIN {
+ if (Texinfo::XSLoader::XS_structuring_enabled()) {
+ $XS_package = Texinfo::XSLoader::init (
+ "Texinfo::Convert::TreeElementConverterXS",
+ undef,
+ "TreeElementConverterXS",
+ undef,
+ ['texinfo', 'texinfoxs', 'texinfo-convert', 'texinfo-convertxs'],
+ );
+ }
+}
+
+# NB Don't add more functions down here, because this can cause an error
+# with some versions of Perl, connected with any typeglob assignments done
+# above. ("Can't call mro_method_changed_in() on anonymous symbol table").
+#
+# See
http://perl5.git.perl.org/perl.git/commitdiff/03d9f026ae253e9e69212a3cf6f1944437e9f070?hp=ac73ea1ec401df889d312b067f78b618f7ffecc3
+#
+# (change to Perl interpreter on 22 Oct 2011)
+
+
+1;
+__END__
diff --git a/tta/perl/XSTexinfo/Makefile.am b/tta/perl/XSTexinfo/Makefile.am
index 52935ab31e..f0abaac2af 100644
--- a/tta/perl/XSTexinfo/Makefile.am
+++ b/tta/perl/XSTexinfo/Makefile.am
@@ -180,6 +180,23 @@ TreeElementXS_la_CFLAGS = $(XSLIBS_CFLAGS)
TreeElementXS_la_LIBADD = $(top_builddir)/C/libtexinfo-convertxs.la
$(top_builddir)/C/libtexinfoxs.la $(top_builddir)/C/libtexinfo-convert.la
$(top_builddir)/C/libtexinfo.la $(platform_PERL_LIBADD)
TreeElementXS_la_LDFLAGS = $(XSLIBS_LDFLAGS)
+########################## TreeElementConverter XS
+
+if HAVE_ICONV
+xs_LTLIBRARIES += TreeElementConverterXS.la
+endif
+
+nodist_TreeElementConverterXS_la_SOURCES =
parser_document/TreeElementConverterXS.c
+CLEANFILES += parser_document/TreeElementConverterXS.c
+
+EXTRA_DIST += parser_document/TreeElementConverterXS.xs
+
+# locate include files under out-of-source builds.
+TreeElementConverterXS_la_CPPFLAGS = -I$(txi_libs_srcdir)/main
-I$(txi_libs_srcdir)/convert $(XSLIBS_CPPFLAGS)
+TreeElementConverterXS_la_CFLAGS = $(XSLIBS_CFLAGS)
+TreeElementConverterXS_la_LIBADD = $(top_builddir)/C/libtexinfo-convertxs.la
$(top_builddir)/C/libtexinfoxs.la $(top_builddir)/C/libtexinfo-convert.la
$(top_builddir)/C/libtexinfo.la $(platform_PERL_LIBADD)
+TreeElementConverterXS_la_LDFLAGS = $(XSLIBS_LDFLAGS)
+
########################## Reader XS
if HAVE_ICONV
diff --git a/tta/perl/XSTexinfo/parser_document/TreeElementXS.xs
b/tta/perl/XSTexinfo/parser_document/TreeElementConverterXS.xs
similarity index 60%
copy from tta/perl/XSTexinfo/parser_document/TreeElementXS.xs
copy to tta/perl/XSTexinfo/parser_document/TreeElementConverterXS.xs
index 66eb8728cf..1d4ff9704e 100644
--- a/tta/perl/XSTexinfo/parser_document/TreeElementXS.xs
+++ b/tta/perl/XSTexinfo/parser_document/TreeElementConverterXS.xs
@@ -49,13 +49,10 @@
/* See the NOTE in build_perl_info.c on use of functions related to
memory allocation */
-
-MODULE = Texinfo::TreeElement PACKAGE = Texinfo::TreeElement
+MODULE = Texinfo::Convert::TreeElementConverterXS PACKAGE =
Texinfo::Convert::TreeElementConverterXS
PROTOTYPES: ENABLE
-# not in Texinfo::TreeElement but in Texinfo::Convert::Converter in order
-# to be able to find the document.
SV *
new_tree_element (SV *converter_in, SV *element_hash, int use_sv=0)
PREINIT:
@@ -499,445 +496,6 @@ element_expand_today (SV *build_tree_sv, SV *test_sv, SV
*lang_translations_sv,
OUTPUT:
RETVAL
-SV *
-tree_elements_sections_list (SV *converter_in)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_converter_sv_document (converter_in, 0);
- if (document)
- RETVAL = build_tree_elements_sections_list (document);
- else
- RETVAL = newSV (0);
- OUTPUT:
- RETVAL
-
-SV *
-tree_elements_nodes_list (SV *converter_in)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_converter_sv_document (converter_in, 0);
- if (document)
- RETVAL = build_tree_elements_nodes_list (document);
- else
- RETVAL = newSV (0);
- OUTPUT:
- RETVAL
-
-SV *
-tree_elements_headings_list (SV *converter_in)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_converter_sv_document (converter_in, 0);
- if (document)
- RETVAL = build_tree_elements_headings_list (document);
- else
- RETVAL = newSV (0);
- OUTPUT:
- RETVAL
-
-# following is in TreeElements. Many accessors are not actually used
-# because using an accessor is much slower than accessing hash values in Perl
-SV *
-new (SV *element_hash)
- PREINIT:
- HV *hv_stash;
- CODE:
- /*
- fprintf (stderr, "Unexpected call of TreeElement new through XS\n");
- debug_print_element_sv (element_hash);
- */
- hv_stash = gv_stashpv ("Texinfo::TreeElement", GV_ADD);
- /* the refcount needs to be increased probably because the
- argument is "mortal" and has its counters decreased upon
- leaving the function */
- RETVAL = sv_bless (SvREFHVCNT_inc (element_hash), hv_stash);
- OUTPUT:
- RETVAL
-
-SV *
-type (SV *element_sv)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
- if (element->type && element->type != ET_normal_text
- && !(type_data[element->type].flags & TF_c_only))
- RETVAL = newSVpv (type_data[element->type].name, 0);
- else
- RETVAL = newSV (0);
- }
- else
- {
- const char *key = "type";
- HV *element_hv = (HV *) SvRV (element_sv);
- SV **sv = hv_fetch (element_hv, key, strlen(key), 0);
- if (sv && SvOK (*sv))
- RETVAL = newSVsv (*sv);
- else
- RETVAL = newSV (0);
- }
- OUTPUT:
- RETVAL
-
-SV *
-cmdname (SV *element_sv)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
-
- if (!(type_data[element->type].flags & TF_text)
- && element->e.c->cmd)
- RETVAL = newSVpv (element_command_name (element), 0);
- else
- RETVAL = newSV (0);
- }
- else
- {
- const char *key = "cmdname";
- HV *element_hv = (HV *) SvRV (element_sv);
- SV **sv = hv_fetch (element_hv, key, strlen(key), 0);
- if (sv && SvOK (*sv))
- RETVAL = newSVsv (*sv);
- else
- RETVAL = newSV (0);
- }
- OUTPUT:
- RETVAL
-
-SV *
-text (SV *element_sv)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
-
- if (type_data[element->type].flags & TF_text)
- RETVAL
- = newSVpv_utf8 (element->e.text->text, element->e.text->end);
- else
- RETVAL = newSV (0);
- }
- else
- {
- const char *key = "text";
- HV *element_hv = (HV *) SvRV (element_sv);
- SV **sv = hv_fetch (element_hv, key, strlen(key), 0);
- if (sv && SvOK (*sv))
- RETVAL = newSVsv (*sv);
- else
- RETVAL = newSV (0);
- }
- OUTPUT:
- RETVAL
-
-SV *
-children_number (SV *element_sv)
- PREINIT:
- DOCUMENT *document;
- int contents_nr = 0;
- CODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
-
- if (!(type_data[element->type].flags & TF_text))
- contents_nr = element->e.c->contents.number;
- }
- else
- {
- const char *key = "contents";
- HV *element_hv = (HV *) SvRV (element_sv);
- SV **sv = hv_fetch (element_hv, key, strlen(key), 0);
- if (sv && SvOK (*sv))
- {
- AV *av = (AV *) SvRV (*sv);
- contents_nr = AvFILL (av) +1;
- }
- }
- RETVAL = newSViv (contents_nr);
- OUTPUT:
- RETVAL
-
-SV *
-get_child (SV *element_sv, int e_index)
- PREINIT:
- DOCUMENT *document;
- SV *result_sv = 0;
- CODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
-
- if (!(type_data[element->type].flags & TF_text))
- {
- int contents_nr = element->e.c->contents.number;
- int list_index;
- if (contents_nr)
- {
- if (e_index < 0)
- list_index = contents_nr + e_index;
- else
- list_index = e_index;
- if (list_index < contents_nr && list_index >= 0)
- {
- ELEMENT *child
- = element->e.c->contents.list[list_index];
- register_element_handle_in_sv (child, document);
- result_sv = newSVsv ((SV *)child->sv);
- }
- }
- }
- }
- else
- {
- const char *key = "contents";
- HV *element_hv = (HV *) SvRV (element_sv);
- SV **contents_sv = hv_fetch (element_hv, key, strlen(key), 0);
- if (contents_sv && SvOK (*contents_sv))
- {
- SSize_t contents_nr;
- SSize_t list_index;
- AV *av = (AV *) SvRV (*contents_sv);
- contents_nr = AvFILL (av) +1;
- if (contents_nr)
- {
- if (e_index < 0)
- list_index = contents_nr + e_index;
- else
- list_index = e_index;
- if (list_index < contents_nr && list_index >= 0)
- {
- SV **sv = av_fetch (av, list_index, 0);
- if (sv && SvOK (*sv))
- result_sv = newSVsv (*sv);
- else
- fprintf (stderr, "BUG: child %d not found\n",
- e_index);
- }
- }
- }
- }
- if (result_sv)
- RETVAL = result_sv;
- else
- RETVAL = newSV (0);
- OUTPUT:
- RETVAL
-
-SV *
-get_children (SV *element_sv)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
-
- if (!(type_data[element->type].flags & TF_text)
- && element->e.c->contents.number)
- {
- AV *av = newAV ();
- size_t i;
- for (i = 0; i < element->e.c->contents.number; i++)
- {
- SV *child_sv;
- ELEMENT *child = element->e.c->contents.list[i];
- register_element_handle_in_sv (child, document);
- child_sv = SvREFHVCNT_inc ((SV *)child->sv);
- av_push (av, child_sv);
- }
- RETVAL = newRV_noinc ((SV *)av);
- }
- else
- RETVAL = newSV (0);
- }
- else
- {
- const char *key = "contents";
- HV *element_hv = (HV *) SvRV (element_sv);
- SV **sv = hv_fetch (element_hv, key, strlen(key), 0);
- if (sv && SvOK (*sv))
- RETVAL = newSVsv (*sv);
- else
- RETVAL = newSV (0);
- }
- OUTPUT:
- RETVAL
-
-SV *
-parent (SV *element_sv)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
-
- if (element->parent)
- {
- register_element_handle_in_sv (element->parent, document);
- RETVAL = newSVsv ((SV *)element->parent->sv);
- }
- else
- RETVAL = newSV (0);
- }
- else
- {
- const char *key = "parent";
- HV *element_hv = (HV *) SvRV (element_sv);
- SV **sv = hv_fetch (element_hv, key, strlen(key), 0);
- if (sv && SvOK (*sv))
- RETVAL = newSVsv (*sv);
- else
- RETVAL = newSV (0);
- }
- OUTPUT:
- RETVAL
-
-SV *
-source_info (SV *element_sv)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
-
- if (!(type_data[element->type].flags & TF_text))
- {
- const SOURCE_INFO *source_info = &element->e.c->source_info;
- HV *hv = newHV ();
- build_source_info_hash (source_info, hv);
- RETVAL = newRV_noinc ((SV *)hv);
- }
- else
- RETVAL = newSV (0);
- }
- else
- {
- const char *key = "source_info";
- HV *element_hv = (HV *) SvRV (element_sv);
- SV **sv = hv_fetch (element_hv, key, strlen(key), 0);
- if (sv && SvOK (*sv))
- RETVAL = newSVsv (*sv);
- else
- RETVAL = newSV (0);
- }
- OUTPUT:
- RETVAL
-
-SV *
-get_attribute (SV *element_sv, attribute)
- const char *attribute = (char *)SvPV_nolen($arg);
- PREINIT:
- DOCUMENT *document;
- SV *result_sv = 0;
- CODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
-
- if (type_data[element->type].flags & TF_text)
- {
- if (!strcmp (attribute, "inserted")
- && (element->flags & EF_inserted))
- result_sv = newSViv (1);
- }
- else
- result_sv = build_element_attribute (element, attribute,
- document);
- }
- else
- {
- static const char *info_type[2] = {"extra", "info"};
- int i;
- HV *element_hv = (HV *) SvRV (element_sv);
- for (i = 0; i < 2; i++)
- {
- const char *key = info_type[i];
- SV **sv_info = hv_fetch (element_hv, key, strlen(key), 0);
- if (sv_info && SvOK (*sv_info))
- {
- HV *hv_info = (HV *) SvRV (*sv_info);
- SV **sv = hv_fetch (hv_info, attribute,
- strlen(attribute), 0);
- if (sv)
- {
- if (SvOK (*sv))
- result_sv = newSVsv (*sv);
- break;
- }
- }
- }
- }
- if (result_sv)
- RETVAL = result_sv;
- else
- RETVAL = newSV (0);
- OUTPUT:
- RETVAL
-
-void
-add_to_element_contents (SV *parent_element_sv, SV *element_sv)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_sv_element_document (parent_element_sv, 0);
- if (document)
- {
- ELEMENT *parent_element
- = get_sv_element_element (parent_element_sv, document);
- ELEMENT *element = get_sv_element_element (element_sv, document);
- add_to_element_contents (parent_element, element);
- }
-
- const char *key = "contents";
- HV *parent_element_hv = (HV *) SvRV (parent_element_sv);
- HV *element_hv = (HV *) SvRV (element_sv);
- SV **sv = hv_fetch (parent_element_hv, key, strlen(key), 0);
- AV *contents_av;
- if (sv && SvOK (*sv))
- contents_av = (AV *) SvRV (*sv);
- else
- {
- contents_av = newAV ();
- hv_store (parent_element_hv, key, strlen(key),
- newRV_noinc ((SV *)contents_av), 0);
- }
-
- av_push (contents_av, SvREFHVCNT_inc (element_sv));
-
- hv_store (element_hv, "parent", strlen ("parent"),
- newSVsv (element_sv), 0);
-
SV *
element_gdt (string, SV *lang_translations_sv, SV *document_sv, ...)
const char *string = (char *)SvPVutf8_nolen($arg);
@@ -986,3 +544,42 @@ element_gdt (string, SV *lang_translations_sv, SV
*document_sv, ...)
OUTPUT:
RETVAL
+SV *
+tree_elements_sections_list (SV *converter_in)
+ PREINIT:
+ DOCUMENT *document;
+ CODE:
+ document = get_converter_sv_document (converter_in, 0);
+ if (document)
+ RETVAL = build_tree_elements_sections_list (document);
+ else
+ RETVAL = newSV (0);
+ OUTPUT:
+ RETVAL
+
+SV *
+tree_elements_nodes_list (SV *converter_in)
+ PREINIT:
+ DOCUMENT *document;
+ CODE:
+ document = get_converter_sv_document (converter_in, 0);
+ if (document)
+ RETVAL = build_tree_elements_nodes_list (document);
+ else
+ RETVAL = newSV (0);
+ OUTPUT:
+ RETVAL
+
+SV *
+tree_elements_headings_list (SV *converter_in)
+ PREINIT:
+ DOCUMENT *document;
+ CODE:
+ document = get_converter_sv_document (converter_in, 0);
+ if (document)
+ RETVAL = build_tree_elements_headings_list (document);
+ else
+ RETVAL = newSV (0);
+ OUTPUT:
+ RETVAL
+
diff --git a/tta/perl/XSTexinfo/parser_document/TreeElementXS.xs
b/tta/perl/XSTexinfo/parser_document/TreeElementXS.xs
index 66eb8728cf..d148e5e811 100644
--- a/tta/perl/XSTexinfo/parser_document/TreeElementXS.xs
+++ b/tta/perl/XSTexinfo/parser_document/TreeElementXS.xs
@@ -49,497 +49,12 @@
/* See the NOTE in build_perl_info.c on use of functions related to
memory allocation */
-
MODULE = Texinfo::TreeElement PACKAGE = Texinfo::TreeElement
PROTOTYPES: ENABLE
-# not in Texinfo::TreeElement but in Texinfo::Convert::Converter in order
-# to be able to find the document.
-SV *
-new_tree_element (SV *converter_in, SV *element_hash, int use_sv=0)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_converter_sv_document (converter_in, 0);
-
- if (document)
- {
- CONVERTER *converter = get_sv_converter (converter_in, 0);
- ELEMENT *e = new_element_from_sv (document, element_hash,
- converter);
- if (use_sv)
- {
- HV *hv_stash = gv_stashpv ("Texinfo::TreeElement", GV_ADD);
- /* this first refcount increase keeps the mortal argument alive */
- e->sv = sv_bless (SvREFHVCNT_inc (element_hash), hv_stash);
- register_sv_element_handle_in_sv (e, e->sv, document);
- RETVAL = (SvREFHVCNT_inc (e->sv));
- }
- else
- {
- register_element_handle_in_sv (e, document);
- RETVAL = newSVsv ((SV *)e->sv);
- }
- }
- else
- {
- HV *hv_stash = gv_stashpv ("Texinfo::TreeElement", GV_ADD);
- RETVAL = sv_bless (SvREFHVCNT_inc (element_hash), hv_stash);
- }
- OUTPUT:
- RETVAL
-
-SV *
-get_global_unique_tree_element (SV *converter_in, cmdname)
- const char *cmdname = (char *)SvPV_nolen($arg);
- PREINIT:
- DOCUMENT *document;
- SV *result_sv = 0;
- CODE:
- document = get_converter_sv_document (converter_in, 0);
- if (document)
- {
- enum command_id cmd = lookup_builtin_command (cmdname);
- if (cmd)
- {
- ELEMENT *element = (ELEMENT *)get_cmd_global_uniq_command (
- &document->global_commands, cmd);
- if (element)
- {
- register_element_handle_in_sv (element, document);
- result_sv = newSVsv ((SV *)element->sv);
- }
- }
- }
- if (result_sv)
- RETVAL = result_sv;
- else
- RETVAL = newSV (0);
- OUTPUT:
- RETVAL
-
-SV *
-global_commands_information_command_list (SV *document_sv, char *cmdname)
- PREINIT:
- SV *result_sv = 0;
- DOCUMENT *document;
- enum command_id cmd;
- CODE:
- document = get_sv_document_document (document_sv,
- "global_commands_information_command_list");
- cmd = lookup_builtin_command (cmdname);
- if (document && cmd)
- {
- const ELEMENT_LIST *command_list
- = get_cmd_global_multi_command (&document->global_commands,
cmd);
- if (command_list && command_list->number)
- {
- size_t i;
- AV *av = newAV ();
- result_sv = newRV_inc ((SV *) av);
- for (i = 0; i < command_list->number; i++)
- {
- ELEMENT *element = command_list->list[i];
- register_element_handle_in_sv (element, document);
-
- av_push (av, newSVsv ((SV *) element->sv));
- }
- }
- }
- if (result_sv)
- RETVAL = result_sv;
- else
- RETVAL = newSV (0);
- OUTPUT:
- RETVAL
-
-void
-get_tree_element_index_entry (SV *, SV *element_sv)
- PREINIT:
- DOCUMENT *document;
- SV *index_entry_sv = 0;
- SV *index_info_sv = 0;
- PPCODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
- const INDEX_ENTRY_LOCATION *index_entry_info
- = lookup_extra_index_entry (element,
- AI_key_index_entry);
-
- if (index_entry_info)
- {
- INDEX_ENTRY_AND_INDEX *idx_info
- = lookup_index_entry (index_entry_info,
- &document->indices_info);
- if (idx_info->index_entry)
- {
- const INDEX_ENTRY *index_entry = idx_info->index_entry;
- HV *entry_hv = build_index_entry (index_entry);
- HV *index_info_hv
- = build_single_index_info (idx_info->index);
- index_entry_sv = newRV_noinc ((SV *)entry_hv);
- index_info_sv = newRV_noinc ((SV *)index_info_hv);
-
- register_element_handle_in_sv (index_entry->entry_element,
- document);
- if (index_entry->entry_associated_element)
- register_element_handle_in_sv (
- index_entry->entry_associated_element,
- document);
- }
- free (idx_info);
- }
- }
-
- if (!index_entry_sv)
- {
- index_entry_sv = newSV (0);
- index_info_sv = newSV (0);
- }
-
- EXTEND(SP, 2);
- PUSHs(sv_2mortal(index_entry_sv));
- PUSHs(sv_2mortal(index_info_sv));
-
-void
-comment_or_end_line (SV *, SV *element_sv)
- PREINIT:
- DOCUMENT *document;
- SV *comment_sv = 0;
- SV *end_line_sv = 0;
- PPCODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
- COMMENT_OR_END_LINE *end_line_info = comment_or_end_line (element);
- if (end_line_info->comment)
- comment_sv = newSVsv ((SV *)end_line_info->comment->sv);
- else
- end_line_sv = newSVpv_utf8 (end_line_info->end_line, 0);
- non_perl_free (end_line_info);
- }
-
- if (!comment_sv)
- comment_sv = newSV (0);
- if (!end_line_sv)
- end_line_sv = newSV (0);
-
- EXTEND(SP, 2);
- PUSHs(sv_2mortal(comment_sv));
- PUSHs(sv_2mortal(end_line_sv));
-
-void
-argument_comment_end_line (SV *, SV *element_sv)
- PREINIT:
- DOCUMENT *document;
- SV *comment_sv = 0;
- SV *end_line_sv = 0;
- SV *argument_sv = 0;
- PPCODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
- ARGUMENT_COMMENT_END_LINE *arg_end_l_info
- = argument_comment_end_line (element);
- if (arg_end_l_info->comment_end_line.comment)
- comment_sv = newSVsv ((SV *)
- arg_end_l_info->comment_end_line.comment->sv);
- else
- end_line_sv = newSVpv_utf8 (
- arg_end_l_info->comment_end_line.end_line, 0);
-
- if (arg_end_l_info->argument)
- {
- register_element_handle_in_sv (
- (ELEMENT *)arg_end_l_info->argument, document);
- argument_sv = newSVsv ((SV *)arg_end_l_info->argument->sv);
- }
-
- non_perl_free (arg_end_l_info);
- }
-
- if (!argument_sv)
- argument_sv = newSV (0);
- if (!comment_sv)
- comment_sv = newSV (0);
- if (!end_line_sv)
- end_line_sv = newSV (0);
-
- EXTEND(SP, 3);
- PUSHs(sv_2mortal(argument_sv));
- PUSHs(sv_2mortal(comment_sv));
- PUSHs(sv_2mortal(end_line_sv));
-
-SV *
-tree_element_item_itemize_prepended (SV *element_sv)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
- const ELEMENT *prepended
- = item_itemize_prepended (element);
- register_element_handle_in_sv ((ELEMENT *)prepended, document);
- RETVAL = newSVsv ((SV *)prepended->sv);
- }
- else
- RETVAL = newSV (0);
- OUTPUT:
- RETVAL
-
-SV *
-tree_element_index_content_element (SV *element_sv, int
prefer_reference_element=0)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
- ELEMENT *idx_content = index_content_element (element,
- prefer_reference_element);
- register_element_handle_in_sv (idx_content, document);
- RETVAL = newSVsv ((SV *)idx_content->sv);
- }
- else
- RETVAL = newSV (0);
- OUTPUT:
- RETVAL
-
-SV *
-element_table_item_content_tree (SV *, SV *element_sv)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- ELEMENT *converted_e;
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
- TREE_ADDED_ELEMENTS *tree = table_item_content_tree (0, element);
- if (tree)
- {
- build_texinfo_tree (tree->tree, 1);
- converted_e = tree->tree;
- if (tree->status == tree_added_status_elements_added)
- {
- size_t i;
- for (i = 0; i < tree->added.number; i++)
- {
- ELEMENT *added_e = tree->added.list[i];
- register_element_handle_in_sv (added_e, document);
- }
- }
- free (tree->added.list);
- free (tree);
- }
- else
- {
- converted_e = element->e.c->contents.list[0];
- register_element_handle_in_sv (converted_e, document);
- }
- RETVAL = newSVsv ((SV *)converted_e->sv);
- }
- else
- RETVAL = newSV (0);
- OUTPUT:
- RETVAL
-
-void
-element_find_element_authors (SV *element_sv, SV *quotation_authors_sv)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- size_t i;
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
- AV *quotation_authors_av = (AV *) SvRV (quotation_authors_sv);
- CONST_ELEMENT_LIST *quotation_authors = new_const_element_list ();
-
- find_element_authors (element, quotation_authors);
-
- for (i = 0; i < quotation_authors->number; i++)
- {
- const ELEMENT *author = quotation_authors->list[i];
-
- register_element_handle_in_sv ((ELEMENT *)author, document);
-
- av_push (quotation_authors_av, newSVsv ((SV *)author->sv));
- }
- destroy_const_element_list (quotation_authors);
- }
-
-SV *
-element_expand_verbatiminclude (SV *element_sv, SV
*input_file_name_encoding_sv, int doc_encoding_for_input_file_name, SV
*locale_encoding_sv, SV *include_directories_sv, ...)
- PROTOTYPE: $$$$$;$$
- PREINIT:
- DOCUMENT *document;
- SV *result_sv = 0;
- CODE:
- document = get_sv_element_document (element_sv, 0);
- if (document)
- {
- const char *input_file_name_encoding = 0;
- const char *locale_encoding = 0;
- STRING_LIST *include_directories = 0;
- const ELEMENT *element
- = get_sv_element_element (element_sv, document);
- ELEMENT *result;
- SV *converter_sv = 0;
- CONVERTER *converter = 0;
- ERROR_MESSAGE_LIST *error_messages = 0;
-
- if (SvOK (input_file_name_encoding_sv))
- input_file_name_encoding
- = (char *)SvPVutf8_nolen (input_file_name_encoding_sv);
- if (SvOK (locale_encoding_sv))
- locale_encoding = (char *)SvPVutf8_nolen (locale_encoding_sv);
-
- if (items > 7 && SvOK(ST(7)))
- converter_sv = ST(7);
-
- if (converter_sv)
- converter = get_sv_converter (converter_sv, 0);
-
- if (converter)
- error_messages = &converter->error_messages;
- else if (converter_sv)
- {
- error_messages = (ERROR_MESSAGE_LIST *)
- non_perl_malloc (sizeof (ERROR_MESSAGE_LIST));
- memset (error_messages, 0, sizeof (ERROR_MESSAGE_LIST));
- }
-
- if (include_directories_sv)
- {
- include_directories = new_string_list ();
- add_svav_to_string_list (include_directories_sv,
- include_directories, svt_dir);
- }
- result = expand_verbatiminclude (input_file_name_encoding,
- doc_encoding_for_input_file_name, locale_encoding,
- include_directories, 0, error_messages,
- &document->global_info, element);
- if (result)
- {
- result_sv = build_texinfo_tree (result, 1);
- register_element_handle_in_sv (result, document);
- }
- if (!converter && converter_sv)
- {
- pass_errors_to_registrar (error_messages, converter_sv, 0, 0);
- wipe_error_message_list (error_messages);
- free (error_messages);
- }
-
- if (include_directories)
- destroy_strings_list (include_directories);
- }
-
- if (result_sv)
- RETVAL = SvREFHVCNT_inc (result_sv);
- else
- RETVAL = newSV (0);
- OUTPUT:
- RETVAL
-
-SV *
-element_expand_today (SV *build_tree_sv, SV *test_sv, SV
*lang_translations_sv, SV *debug_sv, SV *converter_in)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_converter_sv_document (converter_in, 0);
- if (document)
- {
- int build_tree = 0;
- int debug = 0;
- int test = 0;
- LANG_TRANSLATION *lang_translations
- = get_lang_translations_sv (lang_translations_sv);
-
- if (SvOK (build_tree_sv))
- build_tree = SvIV (build_tree_sv);
- if (SvOK (debug_sv))
- debug = SvIV (debug_sv);
- if (SvOK (test_sv))
- test = SvIV (test_sv);
-
- /* we do not set the converter argument even when we could, nor
- the translation function, although we could check the converter
- output format and set it if HTML, assuming that there is no
- need for a specific translation function for the output formats
- using this function
- */
- ELEMENT *e_today = expand_today (test, lang_translations,
- debug, 0, 0);
- if (build_tree)
- build_texinfo_tree (e_today, 1);
- register_element_handle_in_sv (e_today, document);
-
- RETVAL = SvREFHVCNT_inc ((SV *) e_today->sv);
- }
- else
- RETVAL = newSV (0);
- OUTPUT:
- RETVAL
-
-SV *
-tree_elements_sections_list (SV *converter_in)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_converter_sv_document (converter_in, 0);
- if (document)
- RETVAL = build_tree_elements_sections_list (document);
- else
- RETVAL = newSV (0);
- OUTPUT:
- RETVAL
-
-SV *
-tree_elements_nodes_list (SV *converter_in)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_converter_sv_document (converter_in, 0);
- if (document)
- RETVAL = build_tree_elements_nodes_list (document);
- else
- RETVAL = newSV (0);
- OUTPUT:
- RETVAL
-
-SV *
-tree_elements_headings_list (SV *converter_in)
- PREINIT:
- DOCUMENT *document;
- CODE:
- document = get_converter_sv_document (converter_in, 0);
- if (document)
- RETVAL = build_tree_elements_headings_list (document);
- else
- RETVAL = newSV (0);
- OUTPUT:
- RETVAL
-
-# following is in TreeElements. Many accessors are not actually used
-# because using an accessor is much slower than accessing hash values in Perl
+# Some accessors are not actually used because using an accessor is much
+# slower than accessing hash values in Perl
SV *
new (SV *element_hash)
PREINIT:
@@ -938,51 +453,3 @@ add_to_element_contents (SV *parent_element_sv, SV
*element_sv)
hv_store (element_hv, "parent", strlen ("parent"),
newSVsv (element_sv), 0);
-SV *
-element_gdt (string, SV *lang_translations_sv, SV *document_sv, ...)
- const char *string = (char *)SvPVutf8_nolen($arg);
- PROTOTYPE: $$$;$$$$
- PREINIT:
- DOCUMENT *document;
- SV *replaced_substrings_sv = 0;
- int debug = 0;
- const char *translation_context = 0;
- int build_tree = 0;
- CODE:
- if (items > 3 && SvOK(ST(3)))
- replaced_substrings_sv = ST(3);
- if (items > 4 && SvOK(ST(4)))
- build_tree = SvIV (ST(4));
- if (items > 5 && SvOK(ST(5)))
- debug = SvIV (ST(5));
- if (items > 6 && SvOK(ST(6)))
- translation_context = (char *)SvPVutf8_nolen(ST(6));
-
- document = get_sv_document_document (document_sv, "element_gdt");
- if (document)
- {
- NAMED_STRING_ELEMENT_LIST *replaced_substrings = 0;
- LANG_TRANSLATION *lang_translations
- = get_lang_translations_sv (lang_translations_sv);
- ELEMENT *e_result;
-
- if (replaced_substrings_sv)
- {
- replaced_substrings
- = get_replaced_substrings (replaced_substrings_sv);
- }
- e_result = gdt_tree (string, document, lang_translations,
- replaced_substrings, debug,
- translation_context);
- if (build_tree)
- build_texinfo_tree (e_result, 1);
- register_element_handle_in_sv (e_result, document);
- if (replaced_substrings)
- destroy_named_string_element_list (replaced_substrings);
- RETVAL = SvREFHVCNT_inc ((SV *)e_result->sv);
- }
- else
- RETVAL = newSV (0);
- OUTPUT:
- RETVAL
-