#ifndef TRE_H
#define TRE_H 1
#include "tre-config.h"
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_LIBUTF8_H
#include <libutf8.h>
#endif
#ifdef TRE_USE_SYSTEM_REGEX_H
#include TRE_SYSTEM_REGEX_H_PATH
#define tre_regcomp regcomp
#define tre_regexec regexec
#define tre_regerror regerror
#define tre_regfree regfree
#ifdef TRE_APPROX
#define tre_regaexec regaexec
#define tre_reganexec reganexec
#define tre_regawexec regawexec
#define tre_regawnexec regawnexec
#endif
#define tre_regncomp regncomp
#define tre_regnexec regnexec
#define tre_regwcomp regwcomp
#define tre_regwexec regwexec
#define tre_regwncomp regwncomp
#define tre_regwnexec regwnexec
#define tre_regcomp_l regcomp_l
#define tre_regncomp_l regncomp_l
#define tre_regwcomp_l regwcomp_l
#define tre_regwncomp_l regwncomp_l
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifdef TRE_USE_SYSTEM_REGEX_H
#ifndef REG_OK
#define REG_OK 0
#endif
#ifndef HAVE_REG_ERRCODE_T
typedef int reg_errcode_t;
#endif
#if !defined(REG_NOSPEC) && !defined(REG_LITERAL)
#define REG_LITERAL 0x1000
#endif
#ifndef REG_BASIC
#define REG_BASIC 0
#endif
#if 0
#define REG_LEFT_ASSOC (REG_LITERAL << 1)
#define REG_UNGREEDY (REG_LEFT_ASSOC << 1)
#define REG_APPROX_MATCHER 0x1000
#define REG_BACKTRACKING_MATCHER (REG_APPROX_MATCHER << 1)
#endif
#define RE_MAGIC ((('r'^0200)<<8) | 'e')
#else
typedef int regoff_t;
typedef struct {
size_t re_nsub;
const void *re_endp;
void *value;
} regex_t;
typedef struct {
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
typedef enum {
REG_OK = 0,
REG_NOMATCH,
REG_BADPAT,
REG_ECOLLATE,
REG_ECTYPE,
REG_EESCAPE,
REG_ESUBREG,
REG_EBRACK,
REG_EPAREN,
REG_EBRACE,
REG_BADBR,
REG_ERANGE,
REG_ESPACE,
REG_BADRPT,
REG_INVARG,
REG_ILLSEQ,
} reg_errcode_t;
#define REG_EXTENDED 1
#define REG_ICASE (REG_EXTENDED << 1)
#define REG_NEWLINE (REG_ICASE << 1)
#define REG_NOSUB (REG_NEWLINE << 1)
#define REG_BASIC 0
#define REG_LITERAL (REG_NOSUB << 1)
#define REG_LEFT_ASSOC (REG_LITERAL << 1)
#define REG_UNGREEDY (REG_LEFT_ASSOC << 1)
#define REG_PEND (REG_UNGREEDY << 1)
#define REG_NOTBOL 1
#define REG_NOTEOL (REG_NOTBOL << 1)
#define REG_APPROX_MATCHER (REG_NOTEOL << 1)
#define REG_BACKTRACKING_MATCHER (REG_APPROX_MATCHER << 1)
#define REG_STARTEND (REG_BACKTRACKING_MATCHER << 1)
#endif
#if defined(REG_LITERAL) && !defined(REG_NOSPEC)
#define REG_NOSPEC REG_LITERAL
#elif defined(REG_NOSPEC) && !defined(REG_LITERAL)
#define REG_LITERAL REG_NOSPEC
#endif
#undef RE_DUP_MAX
#define RE_DUP_MAX 255
extern int
tre_regcomp(regex_t * __restrict preg, const char * __restrict regex, int cflags);
extern int
tre_regexec(const regex_t * __restrict preg, const char * __restrict string, size_t nmatch,
regmatch_t pmatch[ __restrict ], int eflags);
extern size_t
tre_regerror(int errcode, const regex_t * __restrict preg, char * __restrict errbuf,
size_t errbuf_size);
extern void
tre_regfree(regex_t *preg);
#ifdef TRE_WCHAR
#ifdef HAVE_WCHAR_H
#include <wchar.h>
#endif
extern int
tre_regwcomp(regex_t * __restrict preg, const wchar_t * __restrict regex, int cflags);
extern int
tre_regwexec(const regex_t * __restrict preg, const wchar_t * __restrict string,
size_t nmatch, regmatch_t pmatch[ __restrict ], int eflags);
#endif
extern int
tre_regncomp(regex_t * __restrict preg, const char * __restrict regex, size_t len, int cflags);
extern int
tre_regnexec(const regex_t * __restrict preg, const char * __restrict string, size_t len,
size_t nmatch, regmatch_t pmatch[ __restrict ], int eflags);
#ifdef TRE_WCHAR
extern int
tre_regwncomp(regex_t * __restrict preg, const wchar_t * __restrict regex, size_t len, int cflags);
extern int
tre_regwnexec(const regex_t * __restrict preg, const wchar_t * __restrict string, size_t len,
size_t nmatch, regmatch_t pmatch[ __restrict ], int eflags);
#endif
#include <xlocale.h>
extern int
tre_regcomp_l(regex_t * __restrict preg, const char * __restrict regex, int cflags, locale_t __restrict loc);
#ifdef TRE_WCHAR
extern int
tre_regwcomp_l(regex_t * __restrict preg, const wchar_t * __restrict regex, int cflags, locale_t __restrict loc);
#endif
extern int
tre_regncomp_l(regex_t * __restrict preg, const char * __restrict regex, size_t len, int cflags, locale_t __restrict loc);
#ifdef TRE_WCHAR
extern int
tre_regwncomp_l(regex_t * __restrict preg, const wchar_t * __restrict regex, size_t len, int cflags, locale_t __restrict loc);
#endif
#ifdef TRE_APPROX
typedef struct {
int cost_ins;
int cost_del;
int cost_subst;
int max_cost;
int max_ins;
int max_del;
int max_subst;
int max_err;
} regaparams_t;
typedef struct {
size_t nmatch;
regmatch_t *pmatch;
int cost;
int num_ins;
int num_del;
int num_subst;
} regamatch_t;
extern int
tre_regaexec(const regex_t * __restrict preg, const char * __restrict string,
regamatch_t * __restrict match, regaparams_t params, int eflags);
extern int
tre_reganexec(const regex_t * __restrict preg, const char * __restrict string, size_t len,
regamatch_t * __restrict match, regaparams_t params, int eflags);
#ifdef TRE_WCHAR
extern int
tre_regawexec(const regex_t * __restrict preg, const wchar_t * __restrict string,
regamatch_t * __restrict match, regaparams_t params, int eflags);
extern int
tre_regawnexec(const regex_t * __restrict preg, const wchar_t * __restrict string, size_t len,
regamatch_t * __restrict match, regaparams_t params, int eflags);
#endif
extern void
tre_regaparams_default(regaparams_t *params);
#endif
#ifdef TRE_WCHAR
typedef wchar_t tre_char_t;
#else
typedef unsigned char tre_char_t;
#endif
#ifdef TRE_STR_USER
typedef struct {
int (*get_next_char)(tre_char_t *c, unsigned int *pos_add, void *context);
void (*rewind)(size_t pos, void *context);
int (*compare)(size_t pos1, size_t pos2, size_t len, void *context);
void *context;
} tre_str_source;
extern int
tre_reguexec(const regex_t * __restrict preg, const tre_str_source * __restrict string,
size_t nmatch, regmatch_t pmatch[ __restrict ], int eflags);
#endif
#ifndef __LIBC__
extern char *
tre_version(void);
extern int
tre_config(int query, void *result);
enum {
TRE_CONFIG_APPROX,
TRE_CONFIG_WCHAR,
TRE_CONFIG_MULTIBYTE,
TRE_CONFIG_SYSTEM_ABI,
TRE_CONFIG_VERSION
};
extern int
tre_have_backrefs(const regex_t *preg);
#ifdef TRE_APPROX
extern int
tre_have_approx(const regex_t *preg);
#endif
#endif
#ifdef __cplusplus
}
#endif
#endif