>From c23dae8c0231543a241bd54f6e5af0f348f70d99 Mon Sep 17 00:00:00 2001
From: Bruno Haible
Date: Wed, 20 Mar 2019 00:35:11 +0100
Subject: [PATCH 1/2] libtextstyle-optional: New module.
* lib/textstyle.in.h: New file, based on libtextstyle's textstyle.h.
* m4/libtextstyle-optional.m4: New file, based on m4/libtextstyle.m4.
* modules/libtextstyle-optional: New file.
---
ChangeLog | 7 +
lib/textstyle.in.h | 377 ++++++++++++++++++++++++++++++++++++++++++
m4/libtextstyle-optional.m4 | 30 ++++
modules/libtextstyle-optional | 45 +++++
4 files changed, 459 insertions(+)
create mode 100644 lib/textstyle.in.h
create mode 100644 m4/libtextstyle-optional.m4
create mode 100644 modules/libtextstyle-optional
diff --git a/ChangeLog b/ChangeLog
index 8a4c5f3..af9d7f1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
2019-03-19 Bruno Haible
+ libtextstyle-optional: New module.
+ * lib/textstyle.in.h: New file, based on libtextstyle's textstyle.h.
+ * m4/libtextstyle-optional.m4: New file, based on m4/libtextstyle.m4.
+ * modules/libtextstyle-optional: New file.
+
+2019-03-19 Bruno Haible
+
c-stack: Make signal handlers more reliable.
* lib/c-stack.c (progname): New variable.
(die): Use it.
diff --git a/lib/textstyle.in.h b/lib/textstyle.in.h
new file mode 100644
index 0000000..65fa670
--- /dev/null
+++ b/lib/textstyle.in.h
@@ -0,0 +1,377 @@
+/* Dummy replacement for part of the public API of the libtextstyle library.
+ Copyright (C) 2006-2007, 2019 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 . */
+
+/* Written by Bruno Haible , 2019. */
+
+/* This file is used as replacement when libtextstyle with its include file
+ is not found.
+ It supports the essential API and implements it in a way that does not
+ provide text styling. That is, it produces plain text output via
+ FILE objects.
+ Thus, it allows a package to be build with or without a dependency to
+ libtextstyle, with very few occurrences of '#if HAVE_LIBTEXTSTYLE'.
+
+ Restriction:
+ It assumes that freopen() is not being called on stdout and stderr. */
+
+#ifndef _TEXTSTYLE_H
+#define _TEXTSTYLE_H
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#if HAVE_TCDRAIN
+# include
+#endif
+
+/* ----------------------------- From ostream.h ----------------------------- */
+
+/* Describes the scope of a flush operation. */
+typedef enum
+{
+ /* Flushes buffers in this ostream_t.
+ Use this value if you want to write to the underlying ostream_t. */
+ FLUSH_THIS_STREAM = 0,
+ /* Flushes all buffers in the current process.
+ Use this value if you want to write to the same target through a
+ different file descriptor or a FILE stream. */
+ FLUSH_THIS_PROCESS = 1,
+ /* Flushes buffers in the current process and attempts to flush the buffers
+ in the kernel.
+ Use this value so that some other process (or the kernel itself)
+ may write to the same target. */
+ FLUSH_ALL = 2
+} ostream_flush_scope_t;
+
+
+/* An output stream is an object to which one can feed a sequence of bytes. */
+
+typedef FILE * ostream_t;
+
+static inline void
+ostream_write_mem (ostream_t stream, const void *data, size_t len)
+{
+ if (len > 0)
+ fwrite (data, 1, len, stream);
+}
+
+static inline void
+ostream_flush (ostream_t stream, ostream_flush_scope_t scope)
+{
+ fflush (stream);
+ if (scope == FLUSH_ALL)
+ {
+ int fd = fileno (stream);
+ if (fd >= 0)
+ {
+ /* For streams connected to a disk file: */
+ fsync (fd);
+ #if HAVE_TCDRAIN
+ /* For streams connected to a terminal: */
+ {
+ int retval;
+
+ do
+ retval = tcdrain (fd);
+ while (retval < 0 && errno == EINTR);
+ }
+ #endif
+ }
+ }
+}
+
+static inline void
+ostream_free (ostream_t stream)
+{
+ if (stream == stdin || stream == stderr)
+ fflush (stream);
+ else
+ fclose (stream);
+}
+
+static inline void
+ostream_write_str (ostream_t stream, const char *string)
+{
+ ostream_write_mem (stream, string, strlen (string));
+}
+
+/* ------------------------- From styled-ostream.h ------------------------- */
+
+typedef ostream_t styled_ostream_t;
+
+#define styled_ostream_write_mem ostream_write_mem
+#define styled_ostream_flush ostream_flush
+#define styled_ostream_free ostream_free
+
+static inline void
+styled_ostream_begin_use_class (styled_ostream_t stream _GL_UNUSED,
+ const char *classname _GL_UNUSED)
+{
+}
+
+static inline void
+styled_ostream_end_use_class (styled_ostream_t stream _GL_UNUSED,
+ const char *classname _GL_UNUSED)
+{
+}
+
+static inline void
+styled_ostream_flush_to_current_style (styled_ostream_t stream _GL_UNUSED)
+{
+}
+
+/* -------------------------- From file-ostream.h -------------------------- */
+
+typedef ostream_t file_ostream_t;
+
+#define file_ostream_write_mem ostream_write_mem
+#define file_ostream_flush ostream_flush
+#define file_ostream_free ostream_free
+
+static inline file_ostream_t
+file_ostream_create (FILE *fp)
+{
+ return fp;
+}
+
+/* --------------------------- From fd-ostream.h --------------------------- */
+
+typedef ostream_t fd_ostream_t;
+
+#define fd_ostream_write_mem ostream_write_mem
+#define fd_ostream_flush ostream_flush
+#define fd_ostream_free ostream_free
+
+static inline fd_ostream_t
+fd_ostream_create (int fd, const char *filename _GL_UNUSED,
+ bool buffered _GL_UNUSED)
+{
+ if (fd == 1)
+ return stdout;
+ else if (fd == 2)
+ return stderr;
+ else
+ return fdopen (fd, "w");
+}
+
+/* -------------------------- From term-ostream.h -------------------------- */
+
+typedef int term_color_t;
+enum
+{
+ COLOR_DEFAULT = -1 /* unknown */
+};
+
+typedef enum
+{
+ WEIGHT_NORMAL = 0,
+ WEIGHT_BOLD,
+ WEIGHT_DEFAULT = WEIGHT_NORMAL
+} term_weight_t;
+
+typedef enum
+{
+ POSTURE_NORMAL = 0,
+ POSTURE_ITALIC, /* same as oblique */
+ POSTURE_DEFAULT = POSTURE_NORMAL
+} term_posture_t;
+
+typedef enum
+{
+ UNDERLINE_OFF = 0,
+ UNDERLINE_ON,
+ UNDERLINE_DEFAULT = UNDERLINE_OFF
+} term_underline_t;
+
+typedef ostream_t term_ostream_t;
+
+#define term_ostream_write_mem ostream_write_mem
+#define term_ostream_flush ostream_flush
+#define term_ostream_free ostream_free
+
+static inline term_color_t
+term_ostream_get_color (term_ostream_t stream _GL_UNUSED)
+{
+ return COLOR_DEFAULT;
+}
+
+static inline void
+term_ostream_set_color (term_ostream_t stream _GL_UNUSED,
+ term_color_t color _GL_UNUSED)
+{
+}
+
+static inline term_color_t
+term_ostream_get_bgcolor (term_ostream_t stream _GL_UNUSED)
+{
+ return COLOR_DEFAULT;
+}
+
+static inline void
+term_ostream_set_bgcolor (term_ostream_t stream _GL_UNUSED,
+ term_color_t color _GL_UNUSED)
+{
+}
+
+static inline term_weight_t
+term_ostream_get_weight (term_ostream_t stream _GL_UNUSED)
+{
+ return WEIGHT_DEFAULT;
+}
+
+static inline void
+term_ostream_set_weight (term_ostream_t stream _GL_UNUSED,
+ term_weight_t weight _GL_UNUSED)
+{
+}
+
+static inline term_posture_t
+term_ostream_get_posture (term_ostream_t stream _GL_UNUSED)
+{
+ return POSTURE_DEFAULT;
+}
+
+static inline void
+term_ostream_set_posture (term_ostream_t stream _GL_UNUSED,
+ term_posture_t posture _GL_UNUSED)
+{
+}
+
+static inline term_underline_t
+term_ostream_get_underline (term_ostream_t stream _GL_UNUSED)
+{
+ return UNDERLINE_DEFAULT;
+}
+
+static inline void
+term_ostream_set_underline (term_ostream_t stream _GL_UNUSED,
+ term_underline_t underline _GL_UNUSED)
+{
+}
+
+static inline void
+term_ostream_flush_to_current_style (term_ostream_t stream)
+{
+ fflush (stream);
+}
+
+typedef enum
+{
+ TTYCTL_AUTO = 0, /* Automatic best-possible choice. */
+ TTYCTL_NONE, /* No control.
+ Result: Garbled output can occur, and the terminal can
+ be left in any state when the program is interrupted. */
+ TTYCTL_PARTIAL, /* Signal handling.
+ Result: Garbled output can occur, but the terminal will
+ be left in the default state when the program is
+ interrupted. */
+ TTYCTL_FULL /* Signal handling and disabling echo and flush-upon-signal.
+ Result: No garbled output, and the the terminal will
+ be left in the default state when the program is
+ interrupted. */
+} ttyctl_t;
+
+static inline term_ostream_t
+term_ostream_create (int fd, const char *filename,
+ ttyctl_t tty_control _GL_UNUSED)
+{
+ return fd_ostream_create (fd, filename, true);
+}
+
+/* ----------------------- From term-styled-ostream.h ----------------------- */
+
+typedef styled_ostream_t term_styled_ostream_t;
+
+#define term_styled_ostream_write_mem ostream_write_mem
+#define term_styled_ostream_flush ostream_flush
+#define term_styled_ostream_free ostream_free
+#define term_styled_ostream_begin_use_class styled_ostream_begin_use_class
+#define term_styled_ostream_end_use_class styled_ostream_end_use_class
+#define term_styled_ostream_flush_to_current_style styled_ostream_flush_to_current_style
+
+static inline term_styled_ostream_t
+term_styled_ostream_create (int fd, const char *filename,
+ ttyctl_t tty_control _GL_UNUSED,
+ const char *css_filename _GL_UNUSED)
+{
+ return fd_ostream_create (fd, filename, true);
+}
+
+/* ----------------------- From html-styled-ostream.h ----------------------- */
+
+typedef styled_ostream_t html_styled_ostream_t;
+
+static inline html_styled_ostream_t
+html_styled_ostream_create (ostream_t destination, const char *css_filename)
+{
+ abort ();
+ return NULL;
+}
+
+/* ------------------------------ From color.h ------------------------------ */
+
+#define color_test_mode false
+
+enum color_option { color_no, color_tty, color_yes, color_html };
+#define color_mode color_no
+
+#define style_file_name NULL
+
+static inline bool
+handle_color_option (const char *option _GL_UNUSED)
+{
+ return false;
+}
+
+static inline void
+handle_style_option (const char *option _GL_UNUSED)
+{
+}
+
+static inline void
+print_color_test (void)
+{
+ abort ();
+}
+
+static inline void
+style_file_prepare (const char *style_file_envvar _GL_UNUSED,
+ const char *stylesdir_envvar _GL_UNUSED,
+ const char *stylesdir_after_install _GL_UNUSED,
+ const char *default_style_file _GL_UNUSED)
+{
+}
+
+/* ------------------------------ From misc.h ------------------------------ */
+
+static inline styled_ostream_t
+styled_ostream_create (int fd, const char *filename,
+ ttyctl_t tty_control _GL_UNUSED,
+ const char *css_filename _GL_UNUSED)
+{
+ return fd_ostream_create (fd, filename, true);
+}
+
+static inline void
+libtextstyle_set_failure_exit_code (int exit_code _GL_UNUSED)
+{
+}
+
+#endif /* _TEXTSTYLE_H */
diff --git a/m4/libtextstyle-optional.m4 b/m4/libtextstyle-optional.m4
new file mode 100644
index 0000000..16c8f16
--- /dev/null
+++ b/m4/libtextstyle-optional.m4
@@ -0,0 +1,30 @@
+# libtextstyle-optional.m4 serial 1
+dnl Copyright (C) 2019 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl gl_LIBTEXTSTYLE_OPTIONAL
+dnl Searches for an installed libtextstyle or uses the included source code
+dnl parts that define only part of the API and does not do any styling.
+dnl If found, it sets and AC_SUBSTs HAVE_LIBTEXTSTYLE=yes and the LIBTEXTSTYLE
+dnl and LTLIBTEXTSTYLE variables, and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIBTEXTSTYLE to 1.
+dnl Otherwise, it sets and AC_SUBSTs HAVE_LIBTEXTSTYLE=no and LIBTEXTSTYLE and
+dnl LTLIBTEXTSTYLE to empty.
+
+AC_DEFUN([gl_LIBTEXTSTYLE_OPTIONAL],
+[
+ AC_REQUIRE([gl_LIBTEXTSTYLE])
+ if test $HAVE_LIBTEXTSTYLE = yes; then
+ TEXTSTYLE_H=
+ else
+ TEXTSTYLE_H=textstyle.h
+ AC_REQUIRE([AC_C_INLINE])
+ AC_CHECK_FUNCS_ONCE([tcdrain])
+ fi
+ AC_SUBST([TEXTSTYLE_H])
+ AM_CONDITIONAL([GL_GENERATE_TEXTSTYLE_H], [test -n "$TEXTSTYLE_H"])
+])
diff --git a/modules/libtextstyle-optional b/modules/libtextstyle-optional
new file mode 100644
index 0000000..f936986
--- /dev/null
+++ b/modules/libtextstyle-optional
@@ -0,0 +1,45 @@
+Description:
+Try to use system libtextstyle for output of styled text.
+
+Files:
+lib/textstyle.in.h
+m4/libtextstyle-optional.m4
+
+Depends-on:
+libtextstyle
+stdbool
+unistd
+fsync
+
+configure.ac:
+gl_LIBTEXTSTYLE_OPTIONAL
+
+Makefile.am:
+BUILT_SOURCES += $(TEXTSTYLE_H)
+
+# We need the following in order to create a dummy placeholder for
+# when the system doesn't have one.
+if GL_GENERATE_TEXTSTYLE_H
+textstyle.h: textstyle.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)rm -f address@hidden $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/textstyle.in.h; \
+ } > address@hidden && \
+ mv address@hidden $@
+else
+textstyle.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += textstyle.h textstyle.h-t
+
+Include:
+#include
+
+Link:
+$(LTLIBTEXTSTYLE) when linking with libtool, $(LIBTEXTSTYLE) otherwise
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible, Akim Demaille
--
2.7.4