mirror of
https://github.com/rkd77/elinks.git
synced 2024-12-04 14:46:47 -05:00
TRE: Check for 32-bit wchar_t at configure time
This check used to be in src/elinks.h. Move it to configure.in so that (1) the result can be logged and (2) ELinks won't even link with TRE if wchar_t prevents its use. Also, rename HAVE_TRE_REGEX_H to CONFIG_TRE, to reflect that it is not always defined if the header exists.
This commit is contained in:
parent
07c90ea438
commit
0c756fc3e8
85
configure.in
85
configure.in
@ -925,11 +925,20 @@ fi
|
|||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Check for TRE library
|
# Check for TRE library
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
|
#
|
||||||
|
# This section only checks that --without-tre is not given and the
|
||||||
|
# library seems to work, and sets TRE_CFLAGS, TRE_LIBS, and
|
||||||
|
# tre_log. It does not define CONFIG_TRE, and always resets
|
||||||
|
# LIBS and CFLAGS back to their original values.
|
||||||
|
#
|
||||||
|
# After any --enable-utf-8 and --disable-utf-8 options have been
|
||||||
|
# handled, a separate section decides whether to actually use TRE.
|
||||||
|
|
||||||
AC_ARG_WITH([[tre]], [[ --without-tre disable TRE regex search support]])
|
AC_ARG_WITH([[tre]], [[ --without-tre disable TRE regex search support]])
|
||||||
if test "$with_tre" = no; then
|
if test "$with_tre" = no; then
|
||||||
AC_MSG_CHECKING([[for TRE]])
|
AC_MSG_CHECKING([[for TRE]])
|
||||||
AC_MSG_RESULT([[disabled]])
|
AC_MSG_RESULT([[disabled]])
|
||||||
|
tre_log="no (explicitly disabled)"
|
||||||
else
|
else
|
||||||
AC_MSG_CHECKING([[for TRE in pkg-config]])
|
AC_MSG_CHECKING([[for TRE in pkg-config]])
|
||||||
if pkg-config tre; then
|
if pkg-config tre; then
|
||||||
@ -955,22 +964,12 @@ else
|
|||||||
regwcomp(&re, L"zap", REG_ICASE);
|
regwcomp(&re, L"zap", REG_ICASE);
|
||||||
regwexec(&re, L"ELIZAPROGRAM", 1, match, 0);],
|
regwexec(&re, L"ELIZAPROGRAM", 1, match, 0);],
|
||||||
[AC_MSG_RESULT([[yes]])
|
[AC_MSG_RESULT([[yes]])
|
||||||
AC_DEFINE([HAVE_TRE_REGEX_H], [1],
|
tre_log="available"],
|
||||||
[Define to 1 if you have the <tre/regex.h> header file.])
|
|
||||||
# TRE_CFLAGS will be used only where needed.
|
|
||||||
# TRE_LIBS will be kept in LIBS and used everywhere.
|
|
||||||
EL_RESTORE_FLAGS
|
|
||||||
LIBS="$TRE_LIBS $LIBS"],
|
|
||||||
[AC_MSG_RESULT([[no]])
|
[AC_MSG_RESULT([[no]])
|
||||||
TRE_CFLAGS=
|
tre_log="no (TRE not found)"])
|
||||||
TRE_LIBS=
|
EL_RESTORE_FLAGS
|
||||||
EL_RESTORE_FLAGS])
|
|
||||||
AC_SUBST(TRE_CFLAGS)
|
|
||||||
AC_SUBST(TRE_LIBS)
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_CHECK_SIZEOF([wchar_t], [4], [[#include <wchar.h>]])
|
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Check for Ruby, optional even if installed.
|
# Check for Ruby, optional even if installed.
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
@ -1385,6 +1384,66 @@ AC_ARG_ENABLE(weehoofooboomookerchoo,
|
|||||||
[AC_MSG_ERROR(Are you strange, or what?)])
|
[AC_MSG_ERROR(Are you strange, or what?)])
|
||||||
|
|
||||||
|
|
||||||
|
# ===================================================================
|
||||||
|
# Decide whether to use TRE
|
||||||
|
# ===================================================================
|
||||||
|
#
|
||||||
|
# This must be done after the CONFIG_UTF8 check above.
|
||||||
|
# The first part of the TRE check is separate, to get
|
||||||
|
# the configure --help output in a sensible order.
|
||||||
|
|
||||||
|
if test "$tre_log" = "available"; then
|
||||||
|
if test "$CONFIG_UTF8" = "yes"; then
|
||||||
|
# When CONFIG_UTF8 and CONFIG_TRE are both defined,
|
||||||
|
# src/viewer/text/search.c makes a string of
|
||||||
|
# unicode_val_T and gives it to regwexec(), which
|
||||||
|
# expects a string of wchar_t. If the unicode_val_T
|
||||||
|
# and wchar_t types are too different, this won't
|
||||||
|
# work, so try to detect that and disable regexp
|
||||||
|
# operations entirely in that case.
|
||||||
|
#
|
||||||
|
# Currently, this code only compares the sizes of the
|
||||||
|
# types. src/intl/charsets.h defines unicode_val_T as
|
||||||
|
# uint32_t, so we check whether wchar_t has exactly 32
|
||||||
|
# bits. But don't use AC_CHECK_SIZEOF for this, because
|
||||||
|
# there doesn't seem to be a documented way to get the
|
||||||
|
# result of that for use in the configure script.
|
||||||
|
#
|
||||||
|
# C99 says the implementation can define
|
||||||
|
# __STDC_ISO_10646__ if wchar_t values match ISO 10646
|
||||||
|
# (or Unicode) numbers in all locales. Do not check
|
||||||
|
# that macro here, because it is too restrictive: it
|
||||||
|
# should be enough for ELinks if the values match in
|
||||||
|
# the locales where ELinks is actually run.
|
||||||
|
AC_MSG_CHECKING([[whether wchar_t is exactly 32-bit]])
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
int dummy[(sizeof(wchar_t) * CHAR_BIT == 32) ? 1 : -1];]], [])],
|
||||||
|
[AC_MSG_RESULT([[yes]])
|
||||||
|
tre_log="TRE"],
|
||||||
|
[AC_MSG_RESULT([[no]])
|
||||||
|
tre_log="no (unsuitable wchar_t)"])
|
||||||
|
else
|
||||||
|
# If UTF-8 is not used, then wchar_t doesn't matter.
|
||||||
|
tre_log="TRE"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$tre_log" = "TRE"; then
|
||||||
|
AC_DEFINE([CONFIG_TRE], [1],
|
||||||
|
[Define as 1 to use the TRE library for regular expression searching. This requires the <tre/regex.h> header file. If you define CONFIG_UTF8 too, then wchar_t must be exactly 32-bit so that it matches unicode_val_T.])
|
||||||
|
# TRE_CFLAGS will be used only where needed.
|
||||||
|
LIBS="$LIBS $TRE_LIBS"
|
||||||
|
else
|
||||||
|
TRE_LIBS=
|
||||||
|
TRE_CFLAGS=
|
||||||
|
fi
|
||||||
|
AC_SUBST(TRE_CFLAGS)
|
||||||
|
AC_SUBST(TRE_LIBS)
|
||||||
|
EL_LOG_CONFIG([[CONFIG_TRE]], [[Regexp searching]], [[$tre_log]])
|
||||||
|
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Further LDFLAGS tweaks
|
# Further LDFLAGS tweaks
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
|
@ -407,7 +407,7 @@ static struct option_info config_options_info[] = {
|
|||||||
N_("Whether the search should match the document text while "
|
N_("Whether the search should match the document text while "
|
||||||
"maintaining case sensitivity.")),
|
"maintaining case sensitivity.")),
|
||||||
|
|
||||||
#ifdef HAVE_TRE_REGEX_H
|
#ifdef CONFIG_TRE
|
||||||
INIT_OPT_INT("document.browse.search", N_("Regular expressions"),
|
INIT_OPT_INT("document.browse.search", N_("Regular expressions"),
|
||||||
"regex", 0, 0, 2, 0,
|
"regex", 0, 0, 2, 0,
|
||||||
N_("Enable searching with regular expressions:\n"
|
N_("Enable searching with regular expressions:\n"
|
||||||
|
24
src/elinks.h
24
src/elinks.h
@ -29,30 +29,6 @@
|
|||||||
#define DEBUG_MEMLEAK
|
#define DEBUG_MEMLEAK
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* When CONFIG_UTF8 is defined, src/viewer/text/search.c makes a string
|
|
||||||
* of unicode_val_T and gives it to regwexec(), which expects a string
|
|
||||||
* of wchar_t. If the unicode_val_T and wchar_t types are too different,
|
|
||||||
* this won't work, so try to detect that and disable regexp operations
|
|
||||||
* entirely in that case.
|
|
||||||
*
|
|
||||||
* Currently, this code only compares the sizes of the types. Because
|
|
||||||
* unicode_val_T is defined as uint32_t and POSIX says bytes are 8-bit,
|
|
||||||
* sizeof(unicode_val_T) is 4 and the following compares SIZEOF_WCHAR_T
|
|
||||||
* to that.
|
|
||||||
*
|
|
||||||
* C99 says the implementation can define __STDC_ISO_10646__ if wchar_t
|
|
||||||
* values match ISO 10646 (or Unicode) numbers in all locales. Do not
|
|
||||||
* check that macro here, because it is too restrictive: it should be
|
|
||||||
* enough for ELinks if the values match in the locales where ELinks is
|
|
||||||
* actually run. */
|
|
||||||
|
|
||||||
#ifdef CONFIG_UTF8
|
|
||||||
#if SIZEOF_WCHAR_T != 4
|
|
||||||
#undef HAVE_TRE_REGEX_H
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This maybe overrides some of the standard high-level functions, to ensure
|
/* This maybe overrides some of the standard high-level functions, to ensure
|
||||||
* the expected behaviour. These overrides are not system specific. */
|
* the expected behaviour. These overrides are not system specific. */
|
||||||
#include "osdep/stub.h"
|
#include "osdep/stub.h"
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#ifndef EL__INTL_CHARSETS_H
|
#ifndef EL__INTL_CHARSETS_H
|
||||||
#define EL__INTL_CHARSETS_H
|
#define EL__INTL_CHARSETS_H
|
||||||
|
|
||||||
|
/* The TRE check in configure.in assumes unicode_val_T is uint32_t. */
|
||||||
typedef uint32_t unicode_val_T;
|
typedef uint32_t unicode_val_T;
|
||||||
|
|
||||||
/* U+0020 SPACE. Normally the same as ' ' or L' ' but perhaps ELinks
|
/* U+0020 SPACE. Normally the same as ' ' or L' ' but perhaps ELinks
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
#include <sys/types.h> /* FreeBSD needs this before regex.h */
|
#include <sys/types.h> /* FreeBSD needs this before regex.h */
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#ifdef HAVE_TRE_REGEX_H
|
#ifdef CONFIG_TRE
|
||||||
#include <tre/regex.h>
|
#include <tre/regex.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -270,7 +270,7 @@ get_range(struct document *document, int y, int height, int l,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_TRE_REGEX_H
|
#ifdef CONFIG_TRE
|
||||||
/** Returns a string @c doc that is a copy of the text in the search
|
/** Returns a string @c doc that is a copy of the text in the search
|
||||||
* nodes from @a s1 to (@a s1 + @a doclen - 1) with the space at the
|
* nodes from @a s1 to (@a s1 + @a doclen - 1) with the space at the
|
||||||
* end of each line converted to a new-line character (LF). */
|
* end of each line converted to a new-line character (LF). */
|
||||||
@ -465,7 +465,7 @@ is_in_range_regex(struct document *document, int y, int height,
|
|||||||
|
|
||||||
return common_ctx.found;
|
return common_ctx.found;
|
||||||
}
|
}
|
||||||
#endif /* HAVE_TRE_REGEX_H */
|
#endif /* CONFIG_TRE */
|
||||||
|
|
||||||
static UCHAR *
|
static UCHAR *
|
||||||
memacpy_u(unsigned char *text, int textlen, int utf8)
|
memacpy_u(unsigned char *text, int textlen, int utf8)
|
||||||
@ -602,7 +602,7 @@ is_in_range(struct document *document, int y, int height,
|
|||||||
if (get_range(document, y, height, textlen, &s1, &s2))
|
if (get_range(document, y, height, textlen, &s1, &s2))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
#ifdef HAVE_TRE_REGEX_H
|
#ifdef CONFIG_TRE
|
||||||
if (get_opt_int("document.browse.search.regex"))
|
if (get_opt_int("document.browse.search.regex"))
|
||||||
return is_in_range_regex(document, y, height, text, textlen,
|
return is_in_range_regex(document, y, height, text, textlen,
|
||||||
min, max, s1, s2, utf8);
|
min, max, s1, s2, utf8);
|
||||||
@ -681,7 +681,7 @@ srch_failed:
|
|||||||
*pl = len;
|
*pl = len;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_TRE_REGEX_H
|
#ifdef CONFIG_TRE
|
||||||
struct get_searched_regex_context {
|
struct get_searched_regex_context {
|
||||||
int xoffset;
|
int xoffset;
|
||||||
int yoffset;
|
int yoffset;
|
||||||
@ -749,7 +749,7 @@ get_searched_regex(struct document_view *doc_view, struct point **pt, int *pl,
|
|||||||
*pt = ctx.points;
|
*pt = ctx.points;
|
||||||
*pl = ctx.len;
|
*pl = ctx.len;
|
||||||
}
|
}
|
||||||
#endif /* HAVE_TRE_REGEX_H */
|
#endif /* CONFIG_TRE */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
get_searched(struct document_view *doc_view, struct point **pt, int *pl, int utf8)
|
get_searched(struct document_view *doc_view, struct point **pt, int *pl, int utf8)
|
||||||
@ -773,7 +773,7 @@ get_searched(struct document_view *doc_view, struct point **pt, int *pl, int utf
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_TRE_REGEX_H
|
#ifdef CONFIG_TRE
|
||||||
if (get_opt_int("document.browse.search.regex"))
|
if (get_opt_int("document.browse.search.regex"))
|
||||||
get_searched_regex(doc_view, pt, pl, l, s1, s2, utf8);
|
get_searched_regex(doc_view, pt, pl, l, s1, s2, utf8);
|
||||||
else
|
else
|
||||||
@ -1594,7 +1594,7 @@ search_typeahead(struct session *ses, struct document_view *doc_view,
|
|||||||
* a nice cleanup target ;-). --pasky */
|
* a nice cleanup target ;-). --pasky */
|
||||||
|
|
||||||
enum search_option {
|
enum search_option {
|
||||||
#ifdef HAVE_TRE_REGEX_H
|
#ifdef CONFIG_TRE
|
||||||
SEARCH_OPT_REGEX,
|
SEARCH_OPT_REGEX,
|
||||||
#endif
|
#endif
|
||||||
SEARCH_OPT_CASE,
|
SEARCH_OPT_CASE,
|
||||||
@ -1602,7 +1602,7 @@ enum search_option {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct option_resolver resolvers[] = {
|
static struct option_resolver resolvers[] = {
|
||||||
#ifdef HAVE_TRE_REGEX_H
|
#ifdef CONFIG_TRE
|
||||||
{ SEARCH_OPT_REGEX, "regex" },
|
{ SEARCH_OPT_REGEX, "regex" },
|
||||||
#endif
|
#endif
|
||||||
{ SEARCH_OPT_CASE, "case" },
|
{ SEARCH_OPT_CASE, "case" },
|
||||||
@ -1669,7 +1669,7 @@ search_dlg_do(struct terminal *term, struct memory_list *ml,
|
|||||||
hop->values, SEARCH_OPTIONS);
|
hop->values, SEARCH_OPTIONS);
|
||||||
hop->data = data;
|
hop->data = data;
|
||||||
|
|
||||||
#ifdef HAVE_TRE_REGEX_H
|
#ifdef CONFIG_TRE
|
||||||
#define SEARCH_WIDGETS_COUNT 8
|
#define SEARCH_WIDGETS_COUNT 8
|
||||||
#else
|
#else
|
||||||
#define SEARCH_WIDGETS_COUNT 5
|
#define SEARCH_WIDGETS_COUNT 5
|
||||||
@ -1693,7 +1693,7 @@ search_dlg_do(struct terminal *term, struct memory_list *ml,
|
|||||||
field = get_dialog_offset(dlg, SEARCH_WIDGETS_COUNT);
|
field = get_dialog_offset(dlg, SEARCH_WIDGETS_COUNT);
|
||||||
add_dlg_field(dlg, text, 0, 0, NULL, MAX_STR_LEN, field, history);
|
add_dlg_field(dlg, text, 0, 0, NULL, MAX_STR_LEN, field, history);
|
||||||
|
|
||||||
#ifdef HAVE_TRE_REGEX_H
|
#ifdef CONFIG_TRE
|
||||||
add_dlg_radio(dlg, _("Normal search", term), 1, 0, &hop->values[SEARCH_OPT_REGEX].number);
|
add_dlg_radio(dlg, _("Normal search", term), 1, 0, &hop->values[SEARCH_OPT_REGEX].number);
|
||||||
add_dlg_radio(dlg, _("Regexp search", term), 1, 1, &hop->values[SEARCH_OPT_REGEX].number);
|
add_dlg_radio(dlg, _("Regexp search", term), 1, 1, &hop->values[SEARCH_OPT_REGEX].number);
|
||||||
add_dlg_radio(dlg, _("Extended regexp search", term), 1, 2, &hop->values[SEARCH_OPT_REGEX].number);
|
add_dlg_radio(dlg, _("Extended regexp search", term), 1, 2, &hop->values[SEARCH_OPT_REGEX].number);
|
||||||
|
Loading…
Reference in New Issue
Block a user