14a1a9510SRong-En Fan /****************************************************************************
2*21817992SBaptiste Daroussin * Copyright 2018-2020,2021 Thomas E. Dickey *
3e1865124SBaptiste Daroussin * Copyright 1998-2012,2015 Free Software Foundation, Inc. *
44a1a9510SRong-En Fan * *
54a1a9510SRong-En Fan * Permission is hereby granted, free of charge, to any person obtaining a *
64a1a9510SRong-En Fan * copy of this software and associated documentation files (the *
74a1a9510SRong-En Fan * "Software"), to deal in the Software without restriction, including *
84a1a9510SRong-En Fan * without limitation the rights to use, copy, modify, merge, publish, *
94a1a9510SRong-En Fan * distribute, distribute with modifications, sublicense, and/or sell *
104a1a9510SRong-En Fan * copies of the Software, and to permit persons to whom the Software is *
114a1a9510SRong-En Fan * furnished to do so, subject to the following conditions: *
124a1a9510SRong-En Fan * *
134a1a9510SRong-En Fan * The above copyright notice and this permission notice shall be included *
144a1a9510SRong-En Fan * in all copies or substantial portions of the Software. *
154a1a9510SRong-En Fan * *
164a1a9510SRong-En Fan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
174a1a9510SRong-En Fan * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
184a1a9510SRong-En Fan * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
194a1a9510SRong-En Fan * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
204a1a9510SRong-En Fan * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
214a1a9510SRong-En Fan * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
224a1a9510SRong-En Fan * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
234a1a9510SRong-En Fan * *
244a1a9510SRong-En Fan * Except as contained in this notice, the name(s) of the above copyright *
254a1a9510SRong-En Fan * holders shall not be used in advertising or otherwise to promote the *
264a1a9510SRong-En Fan * sale, use or other dealings in this Software without prior written *
274a1a9510SRong-En Fan * authorization. *
284a1a9510SRong-En Fan ****************************************************************************/
290e3d5408SPeter Wemm
300e3d5408SPeter Wemm /***************************************************************************
310e3d5408SPeter Wemm * *
324a1a9510SRong-En Fan * Author : Juergen Pfeifer *
330e3d5408SPeter Wemm * *
340e3d5408SPeter Wemm ***************************************************************************/
350e3d5408SPeter Wemm
360e3d5408SPeter Wemm #include "form.priv.h"
370e3d5408SPeter Wemm
38*21817992SBaptiste Daroussin MODULE_ID("$Id: fty_regex.c,v 1.33 2021/08/14 15:01:52 tom Exp $")
390e3d5408SPeter Wemm
40aae38d10SBaptiste Daroussin #if HAVE_REGEX_H_FUNCS || HAVE_LIB_PCRE2 /* We prefer POSIX regex */
41aae38d10SBaptiste Daroussin
427a656419SBaptiste Daroussin #if HAVE_PCRE2POSIX_H
437a656419SBaptiste Daroussin #include <pcre2posix.h>
44*21817992SBaptiste Daroussin
45*21817992SBaptiste Daroussin /* pcre2 used to provide its "POSIX" entrypoints using the same names as the
46*21817992SBaptiste Daroussin * standard ones in the C runtime, but that never worked because the linker
47*21817992SBaptiste Daroussin * would use the C runtime. Debian patched the library to fix this symbol
48*21817992SBaptiste Daroussin * conflict, but overlooked the header file, and Debian's patch was made
49*21817992SBaptiste Daroussin * obsolete when pcre2 was changed early in 2019 to provide different names.
50*21817992SBaptiste Daroussin *
51*21817992SBaptiste Daroussin * Here is a workaround to make the older version of Debian's package work.
52*21817992SBaptiste Daroussin */
53*21817992SBaptiste Daroussin #if !defined(PCRE2regcomp) && defined(HAVE_PCRE2REGCOMP)
54*21817992SBaptiste Daroussin
55*21817992SBaptiste Daroussin #undef regcomp
56*21817992SBaptiste Daroussin #undef regexec
57*21817992SBaptiste Daroussin #undef regfree
58*21817992SBaptiste Daroussin
59*21817992SBaptiste Daroussin #ifdef __cplusplus
60*21817992SBaptiste Daroussin extern "C"
61*21817992SBaptiste Daroussin {
62*21817992SBaptiste Daroussin #endif
63*21817992SBaptiste Daroussin PCRE2POSIX_EXP_DECL int PCRE2regcomp(regex_t *, const char *, int);
64*21817992SBaptiste Daroussin PCRE2POSIX_EXP_DECL int PCRE2regexec(const regex_t *, const char *, size_t,
65*21817992SBaptiste Daroussin regmatch_t *, int);
66*21817992SBaptiste Daroussin PCRE2POSIX_EXP_DECL void PCRE2regfree(regex_t *);
67*21817992SBaptiste Daroussin #ifdef __cplusplus
68*21817992SBaptiste Daroussin } /* extern "C" */
69*21817992SBaptiste Daroussin #endif
70*21817992SBaptiste Daroussin #define regcomp(r,s,n) PCRE2regcomp(r,s,n)
71*21817992SBaptiste Daroussin #define regexec(r,s,n,m,x) PCRE2regexec(r,s,n,m,x)
72*21817992SBaptiste Daroussin #define regfree(r) PCRE2regfree(r)
73*21817992SBaptiste Daroussin #endif
74*21817992SBaptiste Daroussin /* end workaround... */
75aae38d10SBaptiste Daroussin #elif HAVE_PCREPOSIX_H
76aae38d10SBaptiste Daroussin #include <pcreposix.h>
77aae38d10SBaptiste Daroussin #else
780e3d5408SPeter Wemm #include <regex.h>
79aae38d10SBaptiste Daroussin #endif
800e3d5408SPeter Wemm
810e3d5408SPeter Wemm typedef struct
820e3d5408SPeter Wemm {
830e3d5408SPeter Wemm regex_t *pRegExp;
840e3d5408SPeter Wemm unsigned long *refCount;
854a1a9510SRong-En Fan }
864a1a9510SRong-En Fan RegExp_Arg;
870e3d5408SPeter Wemm
880e3d5408SPeter Wemm #elif HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS
890e3d5408SPeter Wemm #undef RETURN
900e3d5408SPeter Wemm static int reg_errno;
910e3d5408SPeter Wemm
924a1a9510SRong-En Fan static char *
934a1a9510SRong-En Fan RegEx_Init(char *instring)
940e3d5408SPeter Wemm {
950e3d5408SPeter Wemm reg_errno = 0;
960e3d5408SPeter Wemm return instring;
970e3d5408SPeter Wemm }
980e3d5408SPeter Wemm
994a1a9510SRong-En Fan static char *
1004a1a9510SRong-En Fan RegEx_Error(int code)
1010e3d5408SPeter Wemm {
1020e3d5408SPeter Wemm reg_errno = code;
1030e3d5408SPeter Wemm return 0;
1040e3d5408SPeter Wemm }
1050e3d5408SPeter Wemm
1060e3d5408SPeter Wemm #define INIT register char *sp = RegEx_Init(instring);
1070e3d5408SPeter Wemm #define GETC() (*sp++)
1080e3d5408SPeter Wemm #define PEEKC() (*sp)
1090e3d5408SPeter Wemm #define UNGETC(c) (--sp)
1100e3d5408SPeter Wemm #define RETURN(c) return(c)
1110e3d5408SPeter Wemm #define ERROR(c) return RegEx_Error(c)
1120e3d5408SPeter Wemm
1130e3d5408SPeter Wemm #if HAVE_REGEXP_H_FUNCS
1140e3d5408SPeter Wemm #include <regexp.h>
1150e3d5408SPeter Wemm #else
1160e3d5408SPeter Wemm #include <regexpr.h>
1170e3d5408SPeter Wemm #endif
1180e3d5408SPeter Wemm
1190e3d5408SPeter Wemm typedef struct
1200e3d5408SPeter Wemm {
1210e3d5408SPeter Wemm char *compiled_expression;
1220e3d5408SPeter Wemm unsigned long *refCount;
1234a1a9510SRong-En Fan }
1244a1a9510SRong-En Fan RegExp_Arg;
1250e3d5408SPeter Wemm
1260e3d5408SPeter Wemm /* Maximum Length we allow for a compiled regular expression */
1270e3d5408SPeter Wemm #define MAX_RX_LEN (2048)
1280e3d5408SPeter Wemm #define RX_INCREMENT (256)
1290e3d5408SPeter Wemm
1300e3d5408SPeter Wemm #endif
1310e3d5408SPeter Wemm
13206bfebdeSXin LI #if HAVE_REGEX_H_FUNCS | HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS
13306bfebdeSXin LI # define MAYBE_UNUSED
13406bfebdeSXin LI #else
13506bfebdeSXin LI # define MAYBE_UNUSED GCC_UNUSED
13606bfebdeSXin LI #endif
13706bfebdeSXin LI
1380e3d5408SPeter Wemm /*---------------------------------------------------------------------------
1390e3d5408SPeter Wemm | Facility : libnform
14006bfebdeSXin LI | Function : static void *Generic_RegularExpression_Type(void * arg)
1410e3d5408SPeter Wemm |
1420e3d5408SPeter Wemm | Description : Allocate structure for regex type argument.
1430e3d5408SPeter Wemm |
1440e3d5408SPeter Wemm | Return Values : Pointer to argument structure or NULL on error
1450e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
1464a1a9510SRong-En Fan static void *
Generic_RegularExpression_Type(void * arg MAYBE_UNUSED)14706bfebdeSXin LI Generic_RegularExpression_Type(void *arg MAYBE_UNUSED)
1480e3d5408SPeter Wemm {
1490e3d5408SPeter Wemm #if HAVE_REGEX_H_FUNCS
15006bfebdeSXin LI char *rx = (char *)arg;
15106bfebdeSXin LI RegExp_Arg *preg = (RegExp_Arg *)0;
1520e3d5408SPeter Wemm
15306bfebdeSXin LI if (rx)
15406bfebdeSXin LI {
155aae38d10SBaptiste Daroussin preg = typeCalloc(RegExp_Arg, 1);
1564a1a9510SRong-En Fan
1570e3d5408SPeter Wemm if (preg)
1580e3d5408SPeter Wemm {
15906bfebdeSXin LI T((T_CREATE("RegExp_Arg %p"), (void *)preg));
1605ca44d1cSRong-En Fan if (((preg->pRegExp = typeMalloc(regex_t, 1)) != 0)
1610e3d5408SPeter Wemm && !regcomp(preg->pRegExp, rx,
1620e3d5408SPeter Wemm (REG_EXTENDED | REG_NOSUB | REG_NEWLINE)))
1630e3d5408SPeter Wemm {
16406bfebdeSXin LI T((T_CREATE("regex_t %p"), (void *)preg->pRegExp));
16573f0a83dSXin LI if ((preg->refCount = typeMalloc(unsigned long, 1)) != 0)
1660e3d5408SPeter Wemm *(preg->refCount) = 1;
1670e3d5408SPeter Wemm }
1680e3d5408SPeter Wemm else
1690e3d5408SPeter Wemm {
1700e3d5408SPeter Wemm if (preg->pRegExp)
1710e3d5408SPeter Wemm free(preg->pRegExp);
1720e3d5408SPeter Wemm free(preg);
1730e3d5408SPeter Wemm preg = (RegExp_Arg *)0;
1740e3d5408SPeter Wemm }
1750e3d5408SPeter Wemm }
17606bfebdeSXin LI }
1770e3d5408SPeter Wemm return ((void *)preg);
1780e3d5408SPeter Wemm #elif HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS
17906bfebdeSXin LI char *rx = (char *)arg;
18006bfebdeSXin LI RegExp_Arg *pArg = (RegExp_Arg *)0;
1810e3d5408SPeter Wemm
18206bfebdeSXin LI if (rx)
18306bfebdeSXin LI {
1845ca44d1cSRong-En Fan pArg = typeMalloc(RegExp_Arg, 1);
1850e3d5408SPeter Wemm
1860e3d5408SPeter Wemm if (pArg)
1870e3d5408SPeter Wemm {
1880e3d5408SPeter Wemm int blen = RX_INCREMENT;
1894a1a9510SRong-En Fan
1905ca44d1cSRong-En Fan T((T_CREATE("RegExp_Arg %p"), pArg));
1910e3d5408SPeter Wemm pArg->compiled_expression = NULL;
19273f0a83dSXin LI if ((pArg->refCount = typeMalloc(unsigned long, 1)) != 0)
1930e3d5408SPeter Wemm *(pArg->refCount) = 1;
1940e3d5408SPeter Wemm
1954a1a9510SRong-En Fan do
1964a1a9510SRong-En Fan {
1975ca44d1cSRong-En Fan char *buf = typeMalloc(char, blen);
1984a1a9510SRong-En Fan
1990e3d5408SPeter Wemm if (buf)
2000e3d5408SPeter Wemm {
2010e3d5408SPeter Wemm #if HAVE_REGEXP_H_FUNCS
2020e3d5408SPeter Wemm char *last_pos = compile(rx, buf, &buf[blen], '\0');
2034a1a9510SRong-En Fan
2040e3d5408SPeter Wemm #else /* HAVE_REGEXPR_H_FUNCS */
2050e3d5408SPeter Wemm char *last_pos = compile(rx, buf, &buf[blen]);
2060e3d5408SPeter Wemm #endif
2070e3d5408SPeter Wemm if (reg_errno)
2080e3d5408SPeter Wemm {
2090e3d5408SPeter Wemm free(buf);
2100e3d5408SPeter Wemm if (reg_errno == 50)
2110e3d5408SPeter Wemm blen += RX_INCREMENT;
2120e3d5408SPeter Wemm else
2130e3d5408SPeter Wemm {
2140e3d5408SPeter Wemm free(pArg);
2150e3d5408SPeter Wemm pArg = NULL;
2160e3d5408SPeter Wemm break;
2170e3d5408SPeter Wemm }
2180e3d5408SPeter Wemm }
2190e3d5408SPeter Wemm else
2200e3d5408SPeter Wemm {
2210e3d5408SPeter Wemm pArg->compiled_expression = buf;
2220e3d5408SPeter Wemm break;
2230e3d5408SPeter Wemm }
2240e3d5408SPeter Wemm }
2254a1a9510SRong-En Fan }
2264a1a9510SRong-En Fan while (blen <= MAX_RX_LEN);
2270e3d5408SPeter Wemm }
2280e3d5408SPeter Wemm if (pArg && !pArg->compiled_expression)
2290e3d5408SPeter Wemm {
2300e3d5408SPeter Wemm free(pArg);
2310e3d5408SPeter Wemm pArg = NULL;
2320e3d5408SPeter Wemm }
23306bfebdeSXin LI }
2340e3d5408SPeter Wemm return (void *)pArg;
2350e3d5408SPeter Wemm #else
2360e3d5408SPeter Wemm return 0;
2370e3d5408SPeter Wemm #endif
2380e3d5408SPeter Wemm }
2390e3d5408SPeter Wemm
2400e3d5408SPeter Wemm /*---------------------------------------------------------------------------
2410e3d5408SPeter Wemm | Facility : libnform
24206bfebdeSXin LI | Function : static void *Make_RegularExpression_Type(va_list * ap)
24306bfebdeSXin LI |
24406bfebdeSXin LI | Description : Allocate structure for regex type argument.
24506bfebdeSXin LI |
24606bfebdeSXin LI | Return Values : Pointer to argument structure or NULL on error
24706bfebdeSXin LI +--------------------------------------------------------------------------*/
24806bfebdeSXin LI static void *
Make_RegularExpression_Type(va_list * ap)24906bfebdeSXin LI Make_RegularExpression_Type(va_list *ap)
25006bfebdeSXin LI {
25106bfebdeSXin LI char *rx = va_arg(*ap, char *);
25206bfebdeSXin LI
25306bfebdeSXin LI return Generic_RegularExpression_Type((void *)rx);
25406bfebdeSXin LI }
25506bfebdeSXin LI
25606bfebdeSXin LI /*---------------------------------------------------------------------------
25706bfebdeSXin LI | Facility : libnform
2580e3d5408SPeter Wemm | Function : static void *Copy_RegularExpression_Type(
2590e3d5408SPeter Wemm | const void * argp)
2600e3d5408SPeter Wemm |
2610e3d5408SPeter Wemm | Description : Copy structure for regex type argument.
2620e3d5408SPeter Wemm |
2630e3d5408SPeter Wemm | Return Values : Pointer to argument structure or NULL on error.
2640e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
2654a1a9510SRong-En Fan static void *
Copy_RegularExpression_Type(const void * argp MAYBE_UNUSED)26606bfebdeSXin LI Copy_RegularExpression_Type(const void *argp MAYBE_UNUSED)
2670e3d5408SPeter Wemm {
2680e3d5408SPeter Wemm #if (HAVE_REGEX_H_FUNCS | HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS)
2690e3d5408SPeter Wemm const RegExp_Arg *ap = (const RegExp_Arg *)argp;
2700e3d5408SPeter Wemm const RegExp_Arg *result = (const RegExp_Arg *)0;
2710e3d5408SPeter Wemm
2720e3d5408SPeter Wemm if (ap)
2730e3d5408SPeter Wemm {
2740e3d5408SPeter Wemm *(ap->refCount) += 1;
2750e3d5408SPeter Wemm result = ap;
2760e3d5408SPeter Wemm }
2770e3d5408SPeter Wemm return (void *)result;
2780e3d5408SPeter Wemm #else
2790e3d5408SPeter Wemm return 0;
2800e3d5408SPeter Wemm #endif
2810e3d5408SPeter Wemm }
2820e3d5408SPeter Wemm
2830e3d5408SPeter Wemm /*---------------------------------------------------------------------------
2840e3d5408SPeter Wemm | Facility : libnform
2850e3d5408SPeter Wemm | Function : static void Free_RegularExpression_Type(void * argp)
2860e3d5408SPeter Wemm |
2870e3d5408SPeter Wemm | Description : Free structure for regex type argument.
2880e3d5408SPeter Wemm |
2890e3d5408SPeter Wemm | Return Values : -
2900e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
2914a1a9510SRong-En Fan static void
Free_RegularExpression_Type(void * argp MAYBE_UNUSED)29206bfebdeSXin LI Free_RegularExpression_Type(void *argp MAYBE_UNUSED)
2930e3d5408SPeter Wemm {
2940e3d5408SPeter Wemm #if HAVE_REGEX_H_FUNCS | HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS
2950e3d5408SPeter Wemm RegExp_Arg *ap = (RegExp_Arg *)argp;
2964a1a9510SRong-En Fan
2970e3d5408SPeter Wemm if (ap)
2980e3d5408SPeter Wemm {
2990e3d5408SPeter Wemm if (--(*(ap->refCount)) == 0)
3000e3d5408SPeter Wemm {
3010e3d5408SPeter Wemm #if HAVE_REGEX_H_FUNCS
3020e3d5408SPeter Wemm if (ap->pRegExp)
3030e3d5408SPeter Wemm {
3040e3d5408SPeter Wemm free(ap->refCount);
3050e3d5408SPeter Wemm regfree(ap->pRegExp);
306aae38d10SBaptiste Daroussin free(ap->pRegExp);
3070e3d5408SPeter Wemm }
3080e3d5408SPeter Wemm #elif HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS
3090e3d5408SPeter Wemm if (ap->compiled_expression)
3100e3d5408SPeter Wemm {
3110e3d5408SPeter Wemm free(ap->refCount);
3120e3d5408SPeter Wemm free(ap->compiled_expression);
3130e3d5408SPeter Wemm }
3140e3d5408SPeter Wemm #endif
3150e3d5408SPeter Wemm free(ap);
3160e3d5408SPeter Wemm }
3170e3d5408SPeter Wemm }
3180e3d5408SPeter Wemm #endif
3190e3d5408SPeter Wemm }
3200e3d5408SPeter Wemm
3210e3d5408SPeter Wemm /*---------------------------------------------------------------------------
3220e3d5408SPeter Wemm | Facility : libnform
3230e3d5408SPeter Wemm | Function : static bool Check_RegularExpression_Field(
3240e3d5408SPeter Wemm | FIELD * field,
3250e3d5408SPeter Wemm | const void * argp)
3260e3d5408SPeter Wemm |
3270e3d5408SPeter Wemm | Description : Validate buffer content to be a valid regular expression
3280e3d5408SPeter Wemm |
3290e3d5408SPeter Wemm | Return Values : TRUE - field is valid
3300e3d5408SPeter Wemm | FALSE - field is invalid
3310e3d5408SPeter Wemm +--------------------------------------------------------------------------*/
3324a1a9510SRong-En Fan static bool
Check_RegularExpression_Field(FIELD * field MAYBE_UNUSED,const void * argp MAYBE_UNUSED)33306bfebdeSXin LI Check_RegularExpression_Field(FIELD *field MAYBE_UNUSED,
33406bfebdeSXin LI const void *argp MAYBE_UNUSED)
3350e3d5408SPeter Wemm {
3360e3d5408SPeter Wemm bool match = FALSE;
3374a1a9510SRong-En Fan
3380e3d5408SPeter Wemm #if HAVE_REGEX_H_FUNCS
3390e3d5408SPeter Wemm const RegExp_Arg *ap = (const RegExp_Arg *)argp;
3404a1a9510SRong-En Fan
3410e3d5408SPeter Wemm if (ap && ap->pRegExp)
3424a1a9510SRong-En Fan match = (regexec(ap->pRegExp, field_buffer(field, 0), 0, NULL, 0)
3434a1a9510SRong-En Fan ? FALSE
3444a1a9510SRong-En Fan : TRUE);
3450e3d5408SPeter Wemm #elif HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS
3460e3d5408SPeter Wemm RegExp_Arg *ap = (RegExp_Arg *)argp;
3474a1a9510SRong-En Fan
3480e3d5408SPeter Wemm if (ap && ap->compiled_expression)
3494a1a9510SRong-En Fan match = (step(field_buffer(field, 0), ap->compiled_expression)
3504a1a9510SRong-En Fan ? TRUE
3514a1a9510SRong-En Fan : FALSE);
3520e3d5408SPeter Wemm #endif
3530e3d5408SPeter Wemm return match;
3540e3d5408SPeter Wemm }
3550e3d5408SPeter Wemm
3564a1a9510SRong-En Fan static FIELDTYPE typeREGEXP =
3574a1a9510SRong-En Fan {
3580e3d5408SPeter Wemm _HAS_ARGS | _RESIDENT,
3590e3d5408SPeter Wemm 1, /* this is mutable, so we can't be const */
3600e3d5408SPeter Wemm (FIELDTYPE *)0,
3610e3d5408SPeter Wemm (FIELDTYPE *)0,
3620e3d5408SPeter Wemm Make_RegularExpression_Type,
3630e3d5408SPeter Wemm Copy_RegularExpression_Type,
3640e3d5408SPeter Wemm Free_RegularExpression_Type,
36506bfebdeSXin LI INIT_FT_FUNC(Check_RegularExpression_Field),
36606bfebdeSXin LI INIT_FT_FUNC(NULL),
36706bfebdeSXin LI INIT_FT_FUNC(NULL),
36806bfebdeSXin LI INIT_FT_FUNC(NULL),
36906bfebdeSXin LI #if NCURSES_INTEROP_FUNCS
37006bfebdeSXin LI Generic_RegularExpression_Type
37106bfebdeSXin LI #endif
3720e3d5408SPeter Wemm };
3730e3d5408SPeter Wemm
3747a656419SBaptiste Daroussin FORM_EXPORT_VAR(FIELDTYPE *) TYPE_REGEXP = &typeREGEXP;
3750e3d5408SPeter Wemm
37606bfebdeSXin LI #if NCURSES_INTEROP_FUNCS
37706bfebdeSXin LI /* The next routines are to simplify the use of ncurses from
3787a656419SBaptiste Daroussin programming languages with restrictions on interop with C level
37906bfebdeSXin LI constructs (e.g. variable access or va_list + ellipsis constructs)
38006bfebdeSXin LI */
3817a656419SBaptiste Daroussin FORM_EXPORT(FIELDTYPE *)
_nc_TYPE_REGEXP(void)38206bfebdeSXin LI _nc_TYPE_REGEXP(void)
38306bfebdeSXin LI {
38406bfebdeSXin LI return TYPE_REGEXP;
38506bfebdeSXin LI }
38606bfebdeSXin LI #endif
38706bfebdeSXin LI
3880e3d5408SPeter Wemm /* fty_regex.c ends here */
389