X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=form%2Ffty_regex.c;h=2c0a4caa6bb312d82247a92ecec8ea4cc9d83989;hp=4362f25af4005b82583fa4d8cd376e4471e51a68;hb=03f728e5bb3630a54fffc4a2ff2f8dbfcce9088e;hpb=55ccd2b959766810cf7db8d1c4462f338ce0afc8 diff --git a/form/fty_regex.c b/form/fty_regex.c index 4362f25a..2c0a4caa 100644 --- a/form/fty_regex.c +++ b/form/fty_regex.c @@ -1,10 +1,31 @@ +/**************************************************************************** + * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ -/* - * THIS CODE IS SPECIFICALLY EXEMPTED FROM THE NCURSES PACKAGE COPYRIGHT. - * You may freely copy it for use as a template for your own field types. - * If you develop a field type that might be of general use, please send - * it back to the ncurses maintainers for inclusion in the next version. - */ /*************************************************************************** * * * Author : Juergen Pfeifer * @@ -13,7 +34,7 @@ #include "form.priv.h" -MODULE_ID("$Id: fty_regex.c,v 1.18 2004/05/29 19:19:09 tom Exp $") +MODULE_ID("$Id: fty_regex.c,v 1.24 2010/01/23 21:14:37 tom Exp $") #if HAVE_REGEX_H_FUNCS /* We prefer POSIX regex */ #include @@ -69,94 +90,109 @@ RegExp_Arg; #endif +#if HAVE_REGEX_H_FUNCS | HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS +# define MAYBE_UNUSED +#else +# define MAYBE_UNUSED GCC_UNUSED +#endif + /*--------------------------------------------------------------------------- | Facility : libnform -| Function : static void *Make_RegularExpression_Type(va_list * ap) +| Function : static void *Generic_RegularExpression_Type(void * arg) | | Description : Allocate structure for regex type argument. | | Return Values : Pointer to argument structure or NULL on error +--------------------------------------------------------------------------*/ static void * -Make_RegularExpression_Type(va_list *ap) +Generic_RegularExpression_Type(void *arg MAYBE_UNUSED) { #if HAVE_REGEX_H_FUNCS - char *rx = va_arg(*ap, char *); - RegExp_Arg *preg; + char *rx = (char *)arg; + RegExp_Arg *preg = (RegExp_Arg *)0; - preg = (RegExp_Arg *)malloc(sizeof(RegExp_Arg)); - - if (preg) + if (rx) { - if (((preg->pRegExp = (regex_t *) malloc(sizeof(regex_t))) != 0) - && !regcomp(preg->pRegExp, rx, - (REG_EXTENDED | REG_NOSUB | REG_NEWLINE))) - { - preg->refCount = (unsigned long *)malloc(sizeof(unsigned long)); + preg = typeMalloc(RegExp_Arg, 1); - *(preg->refCount) = 1; - } - else + if (preg) { - if (preg->pRegExp) - free(preg->pRegExp); - free(preg); - preg = (RegExp_Arg *)0; + T((T_CREATE("RegExp_Arg %p"), (void *)preg)); + if (((preg->pRegExp = typeMalloc(regex_t, 1)) != 0) + && !regcomp(preg->pRegExp, rx, + (REG_EXTENDED | REG_NOSUB | REG_NEWLINE))) + { + T((T_CREATE("regex_t %p"), (void *)preg->pRegExp)); + preg->refCount = typeMalloc(unsigned long, 1); + + *(preg->refCount) = 1; + } + else + { + if (preg->pRegExp) + free(preg->pRegExp); + free(preg); + preg = (RegExp_Arg *)0; + } } } return ((void *)preg); #elif HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS - char *rx = va_arg(*ap, char *); - RegExp_Arg *pArg; + char *rx = (char *)arg; + RegExp_Arg *pArg = (RegExp_Arg *)0; - pArg = (RegExp_Arg *)malloc(sizeof(RegExp_Arg)); - - if (pArg) + if (rx) { - int blen = RX_INCREMENT; + pArg = typeMalloc(RegExp_Arg, 1); - pArg->compiled_expression = NULL; - pArg->refCount = (unsigned long *)malloc(sizeof(unsigned long)); + if (pArg) + { + int blen = RX_INCREMENT; - *(pArg->refCount) = 1; + T((T_CREATE("RegExp_Arg %p"), pArg)); + pArg->compiled_expression = NULL; + pArg->refCount = typeMalloc(unsigned long, 1); - do - { - char *buf = (char *)malloc(blen); + *(pArg->refCount) = 1; - if (buf) + do { + char *buf = typeMalloc(char, blen); + + if (buf) + { #if HAVE_REGEXP_H_FUNCS - char *last_pos = compile(rx, buf, &buf[blen], '\0'); + char *last_pos = compile(rx, buf, &buf[blen], '\0'); #else /* HAVE_REGEXPR_H_FUNCS */ - char *last_pos = compile(rx, buf, &buf[blen]); + char *last_pos = compile(rx, buf, &buf[blen]); #endif - if (reg_errno) - { - free(buf); - if (reg_errno == 50) - blen += RX_INCREMENT; + if (reg_errno) + { + free(buf); + if (reg_errno == 50) + blen += RX_INCREMENT; + else + { + free(pArg); + pArg = NULL; + break; + } + } else { - free(pArg); - pArg = NULL; + pArg->compiled_expression = buf; break; } } - else - { - pArg->compiled_expression = buf; - break; - } } + while (blen <= MAX_RX_LEN); + } + if (pArg && !pArg->compiled_expression) + { + free(pArg); + pArg = NULL; } - while (blen <= MAX_RX_LEN); - } - if (pArg && !pArg->compiled_expression) - { - free(pArg); - pArg = NULL; } return (void *)pArg; #else @@ -164,6 +200,22 @@ Make_RegularExpression_Type(va_list *ap) #endif } +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Make_RegularExpression_Type(va_list * ap) +| +| Description : Allocate structure for regex type argument. +| +| Return Values : Pointer to argument structure or NULL on error ++--------------------------------------------------------------------------*/ +static void * +Make_RegularExpression_Type(va_list *ap) +{ + char *rx = va_arg(*ap, char *); + + return Generic_RegularExpression_Type((void *)rx); +} + /*--------------------------------------------------------------------------- | Facility : libnform | Function : static void *Copy_RegularExpression_Type( @@ -174,7 +226,7 @@ Make_RegularExpression_Type(va_list *ap) | Return Values : Pointer to argument structure or NULL on error. +--------------------------------------------------------------------------*/ static void * -Copy_RegularExpression_Type(const void *argp) +Copy_RegularExpression_Type(const void *argp MAYBE_UNUSED) { #if (HAVE_REGEX_H_FUNCS | HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS) const RegExp_Arg *ap = (const RegExp_Arg *)argp; @@ -200,7 +252,7 @@ Copy_RegularExpression_Type(const void *argp) | Return Values : - +--------------------------------------------------------------------------*/ static void -Free_RegularExpression_Type(void *argp) +Free_RegularExpression_Type(void *argp MAYBE_UNUSED) { #if HAVE_REGEX_H_FUNCS | HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS RegExp_Arg *ap = (RegExp_Arg *)argp; @@ -240,7 +292,8 @@ Free_RegularExpression_Type(void *argp) | FALSE - field is invalid +--------------------------------------------------------------------------*/ static bool -Check_RegularExpression_Field(FIELD *field, const void *argp) +Check_RegularExpression_Field(FIELD *field MAYBE_UNUSED, + const void *argp MAYBE_UNUSED) { bool match = FALSE; @@ -271,12 +324,27 @@ static FIELDTYPE typeREGEXP = Make_RegularExpression_Type, Copy_RegularExpression_Type, Free_RegularExpression_Type, - Check_RegularExpression_Field, - NULL, - NULL, - NULL + INIT_FT_FUNC(Check_RegularExpression_Field), + INIT_FT_FUNC(NULL), + INIT_FT_FUNC(NULL), + INIT_FT_FUNC(NULL), +#if NCURSES_INTEROP_FUNCS + Generic_RegularExpression_Type +#endif }; NCURSES_EXPORT_VAR(FIELDTYPE*) TYPE_REGEXP = &typeREGEXP; +#if NCURSES_INTEROP_FUNCS +/* The next routines are to simplify the use of ncurses from + programming languages with restictions on interop with C level + constructs (e.g. variable access or va_list + ellipsis constructs) +*/ +NCURSES_EXPORT(FIELDTYPE *) +_nc_TYPE_REGEXP(void) +{ + return TYPE_REGEXP; +} +#endif + /* fty_regex.c ends here */