X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=form%2Ffty_int.c;h=c7e3135c882b49802a7a916fe0ca6e5bbbd60bb3;hp=d8ac3d03d709d2a72e3356b129f3d3c54d9ab2ed;hb=9f479192e3ca3413d235c66bf058f8cc63764898;hpb=5242fccf157e715ed878455a3efea6c82b840eb5 diff --git a/form/fty_int.c b/form/fty_int.c index d8ac3d03..c7e3135c 100644 --- a/form/fty_int.c +++ b/form/fty_int.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2006,2007 Free Software Foundation, Inc. * + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2010,2012 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 * @@ -34,7 +35,7 @@ #include "form.priv.h" -MODULE_ID("$Id: fty_int.c,v 1.21 2007/02/03 23:37:46 tom Exp $") +MODULE_ID("$Id: fty_int.c,v 1.33 2021/06/17 21:11:08 tom Exp $") #if USE_WIDEC_SUPPORT #define isDigit(c) (iswdigit((wint_t)(c)) || isdigit(UChar(c))) @@ -52,34 +53,66 @@ typedef struct } thisARG; +typedef struct + { + int precision; + long low; + long high; + } +integerPARM; + /*--------------------------------------------------------------------------- -| Facility : libnform -| Function : static void *Make_This_Type( va_list * ap ) -| +| Facility : libnform +| Function : static void *Generic_This_Type( void * arg ) +| | Description : Allocate structure for integer type argument. | | Return Values : Pointer to argument structure or NULL on error +--------------------------------------------------------------------------*/ static void * -Make_This_Type(va_list *ap) +Generic_This_Type(void *arg) { - thisARG *argp = (thisARG *) malloc(sizeof(thisARG)); + thisARG *argp = (thisARG *)0; + thisARG *param = (thisARG *)arg; - if (argp) + if (param) { - T((T_CREATE("thisARG %p"), argp)); - argp->precision = va_arg(*ap, int); - argp->low = va_arg(*ap, long); - argp->high = va_arg(*ap, long); + argp = typeMalloc(thisARG, 1); + + if (argp) + { + T((T_CREATE("thisARG %p"), (void *)argp)); + *argp = *param; + } } return (void *)argp; } /*--------------------------------------------------------------------------- -| Facility : libnform +| Facility : libnform +| Function : static void *Make_This_Type( va_list * ap ) +| +| Description : Allocate structure for integer type argument. +| +| Return Values : Pointer to argument structure or NULL on error ++--------------------------------------------------------------------------*/ +static void * +Make_This_Type(va_list *ap) +{ + thisARG arg; + + arg.precision = va_arg(*ap, int); + arg.low = va_arg(*ap, long); + arg.high = va_arg(*ap, long); + + return Generic_This_Type((void *)&arg); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform | Function : static void *Copy_This_Type(const void * argp) -| -| Description : Copy structure for integer type argument. +| +| Description : Copy structure for integer type argument. | | Return Values : Pointer to argument structure or NULL on error. +--------------------------------------------------------------------------*/ @@ -87,14 +120,15 @@ static void * Copy_This_Type(const void *argp) { const thisARG *ap = (const thisARG *)argp; - thisARG *result = (thisARG *) 0; + thisARG *result = (thisARG *)0; if (argp) { - result = (thisARG *) malloc(sizeof(thisARG)); + result = typeMalloc(thisARG, 1); + if (result) { - T((T_CREATE("thisARG %p"), result)); + T((T_CREATE("thisARG %p"), (void *)result)); *result = *ap; } } @@ -102,9 +136,9 @@ Copy_This_Type(const void *argp) } /*--------------------------------------------------------------------------- -| Facility : libnform +| Facility : libnform | Function : static void Free_This_Type(void * argp) -| +| | Description : Free structure for integer type argument. | | Return Values : - @@ -117,11 +151,11 @@ Free_This_Type(void *argp) } /*--------------------------------------------------------------------------- -| Facility : libnform +| Facility : libnform | Function : static bool Check_This_Field( | FIELD * field, | const void * argp) -| +| | Description : Validate buffer content to be a valid integer value | | Return Values : TRUE - field is valid @@ -136,11 +170,9 @@ Check_This_Field(FIELD *field, const void *argp) int prec = argi->precision; unsigned char *bp = (unsigned char *)field_buffer(field, 0); char *s = (char *)bp; - long val; - char buf[100]; bool result = FALSE; - while (*bp && *bp == ' ') + while (*bp == ' ') bp++; if (*bp) { @@ -149,13 +181,14 @@ Check_This_Field(FIELD *field, const void *argp) #if USE_WIDEC_SUPPORT if (*bp) { - bool blank = FALSE; int len; - int n; wchar_t *list = _nc_Widen_String((char *)bp, &len); if (list != 0) { + bool blank = FALSE; + int n; + result = TRUE; for (n = 0; n < len; ++n) { @@ -193,7 +226,8 @@ Check_This_Field(FIELD *field, const void *argp) #endif if (result) { - val = atol(s); + long val = atol(s); + if (low < high) { if (val < low || val > high) @@ -201,7 +235,10 @@ Check_This_Field(FIELD *field, const void *argp) } if (result) { - sprintf(buf, "%.*ld", (prec > 0 ? prec : 0), val); + char buf[100]; + + _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) + "%.*ld", (prec > 0 ? prec : 0), val); set_field_buffer(field, 0, buf); } } @@ -210,11 +247,11 @@ Check_This_Field(FIELD *field, const void *argp) } /*--------------------------------------------------------------------------- -| Facility : libnform +| Facility : libnform | Function : static bool Check_This_Character( | int c, | const void * argp) -| +| | Description : Check a character for the integer type. | | Return Values : TRUE - character is valid @@ -235,12 +272,27 @@ static FIELDTYPE typeTHIS = Make_This_Type, Copy_This_Type, Free_This_Type, - Check_This_Field, - Check_This_Character, - NULL, - NULL + INIT_FT_FUNC(Check_This_Field), + INIT_FT_FUNC(Check_This_Character), + INIT_FT_FUNC(NULL), + INIT_FT_FUNC(NULL), +#if NCURSES_INTEROP_FUNCS + Generic_This_Type +#endif }; -NCURSES_EXPORT_VAR(FIELDTYPE*) TYPE_INTEGER = &typeTHIS; +FORM_EXPORT_VAR(FIELDTYPE *) TYPE_INTEGER = &typeTHIS; + +#if NCURSES_INTEROP_FUNCS +/* The next routines are to simplify the use of ncurses from + programming languages with restrictions on interop with C level + constructs (e.g. variable access or va_list + ellipsis constructs) +*/ +FORM_EXPORT(FIELDTYPE *) +_nc_TYPE_INTEGER(void) +{ + return TYPE_INTEGER; +} +#endif /* fty_int.c ends here */