xref: /freebsd/contrib/ncurses/form/fty_regex.c (revision 21817992b3314c908ab50f0bb88d2ee750b9c4ac)
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