/* Copyright 2010-2023 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 . */
#ifdef HAVE_CONFIG_H
#include
#endif
#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
/* Avoid warnings about Perl headers redefining symbols that gnulib
redefined already. */
#if defined _WIN32 && !defined __CYGWIN__
#undef free
#endif
#include "XSUB.h"
#include "ppport.h"
#include "xspara.h"
MODULE = Texinfo::Convert::Paragraph PACKAGE = Texinfo::Convert::Paragraph PREFIX = xspara_
PROTOTYPES: ENABLE
int
xspara_init (unused, unused2)
int unused
char *unused2
void
xspara_set_state (state)
SV * state
# Return a reference blessed into the XSParagraph class
# CLASS is ignored because we know it is "XSParagraph". Optional
# CONF parameter.
SV *
xspara_new (class, ...)
SV * class
PREINIT:
HV *conf = 0;
int id;
CODE:
items--;
if (items > 0)
{
if (SvROK(ST(1)) && SvTYPE(SvRV(ST(1))) == SVt_PVHV)
conf = (HV *) SvRV(ST(1));
}
id = xspara_new (conf);
/* Create an integer, which the other functions
need as their first argument. */
RETVAL = newSViv (id);
OUTPUT:
RETVAL
int
xspara_end_line_count (paragraph)
SV *paragraph
CODE:
xspara_set_state (paragraph);
RETVAL = xspara_end_line_count ();
OUTPUT:
RETVAL
int
xspara_counter (paragraph)
SV *paragraph
CODE:
xspara_set_state (paragraph);
RETVAL = xspara_counter ();
OUTPUT:
RETVAL
void
xspara__end_line (paragraph)
SV *paragraph
CODE:
xspara_set_state (paragraph);
xspara__end_line ();
char *
xspara_end_line (paragraph)
SV *paragraph
CODE:
xspara_set_state (paragraph);
RETVAL = xspara_end_line ();
OUTPUT:
RETVAL
char *
xspara_get_pending (paragraph)
SV *paragraph
CODE:
xspara_set_state (paragraph);
RETVAL = xspara_get_pending ();
OUTPUT:
RETVAL
# ... is for add_spaces
SV *
xspara_add_pending_word (paragraph, ...)
SV *paragraph
PREINIT:
int add_spaces = 0;
char *retval;
CODE:
items -= 1;
if (items > 0)
{
if (SvOK(ST(1)))
{
add_spaces = (int)SvIV(ST(1));;
}
}
xspara_set_state (paragraph);
retval = xspara_add_pending_word (add_spaces);
RETVAL = newSVpv (retval, 0);
SvUTF8_on (RETVAL);
OUTPUT:
RETVAL
SV *
xspara_end (paragraph)
SV *paragraph
PREINIT:
char *retval;
CODE:
xspara_set_state (paragraph);
retval = xspara_end ();
RETVAL = newSVpv (retval, 0);
SvUTF8_on (RETVAL);
OUTPUT:
RETVAL
SV *
xspara_add_text (paragraph, text_in)
SV *paragraph
SV *text_in
PREINIT:
char *text;
STRLEN text_len;
TEXT retval;
CODE:
/* Always convert the input to UTF8 with sv_utf8_upgrade, so we can
process it properly in xspara_add_next. */
if (!SvUTF8 (text_in))
sv_utf8_upgrade (text_in);
text = SvPV (text_in, text_len);
xspara_set_state (paragraph);
retval = xspara_add_text (text, text_len);
RETVAL = newSVpv (retval.text ? retval.text : "", retval.end);
SvUTF8_on (RETVAL);
OUTPUT:
RETVAL
SV *
xspara_add_next (paragraph, text_in, ...)
SV *paragraph
SV *text_in
PREINIT:
char *text;
STRLEN text_len;
TEXT retval;
SV *arg_in;
int transparent = 0;
CODE:
items -= 2;
if (items > 0)
{
items--;
arg_in = ST(2);
if (SvOK(arg_in))
transparent = (int)SvIV(arg_in);
}
/* Always convert the input to UTF8 with sv_utf8_upgrade, so we can
process it properly in xspara_add_next. */
if (!SvUTF8 (text_in))
sv_utf8_upgrade (text_in);
text = SvPV (text_in, text_len);
xspara_set_state (paragraph);
retval = xspara_add_next (text, text_len, transparent);
RETVAL = newSVpv (retval.text ? retval.text : "", retval.end);
SvUTF8_on (RETVAL);
OUTPUT:
RETVAL
void
xspara_remove_end_sentence (paragraph)
SV *paragraph
CODE:
xspara_set_state (paragraph);
xspara_remove_end_sentence ();
void
xspara_add_end_sentence (paragraph, value)
SV *paragraph
SV * value
PREINIT:
int intvalue = 0;
CODE:
if (SvOK(value))
intvalue = (int)SvIV(value);
xspara_set_state (paragraph);
xspara_add_end_sentence (intvalue);
void
xspara_allow_end_sentence (paragraph)
SV *paragraph
CODE:
xspara_set_state (paragraph);
xspara_allow_end_sentence ();
# Optional parameters are IGNORE_COLUMNS, KEEP_END_LINES, FRENCHSPACING,
# DOUBLE_WIDTH_NO_BREAK.
# Pass them to the C function as -1 if not given or undef.
void
xspara_set_space_protection (paragraph, space_protection_in, ...)
SV *paragraph
SV * space_protection_in
PREINIT:
int space_protection = -1;
int ignore_columns = -1;
int keep_end_lines = -1;
int french_spacing = -1;
int double_width_no_break = -1;
SV *arg_in;
CODE:
if (SvOK(space_protection_in))
space_protection = (int)SvIV(space_protection_in);
/* Get optional arguments from stack. */
items -= 2;
if (items > 0)
{
items--;
arg_in = ST(2);
if (SvOK(arg_in))
ignore_columns = (int)SvIV(arg_in);
}
if (items > 0)
{
items--;
arg_in = ST(3);
if (SvOK(arg_in))
keep_end_lines = (int)SvIV(arg_in);
}
if (items > 0)
{
items--;
arg_in = ST(4);
if (SvOK(arg_in))
french_spacing = (int)SvIV(arg_in);
}
if (items > 0)
{
items--;
arg_in = ST(5);
if (SvOK(arg_in))
double_width_no_break = (int)SvIV(arg_in);
}
xspara_set_state (paragraph);
xspara_set_space_protection
(space_protection, ignore_columns, keep_end_lines,
french_spacing, double_width_no_break);