xref: /freebsd/contrib/ncurses/form/form.priv.h (revision 21817992b3314c908ab50f0bb88d2ee750b9c4ac)
10e3d5408SPeter Wemm /****************************************************************************
2*21817992SBaptiste Daroussin  * Copyright 2018-2021,2024 Thomas E. Dickey                                *
3e1865124SBaptiste Daroussin  * Copyright 1998-2016,2017 Free Software Foundation, Inc.                  *
40e3d5408SPeter Wemm  *                                                                          *
50e3d5408SPeter Wemm  * Permission is hereby granted, free of charge, to any person obtaining a  *
60e3d5408SPeter Wemm  * copy of this software and associated documentation files (the            *
70e3d5408SPeter Wemm  * "Software"), to deal in the Software without restriction, including      *
80e3d5408SPeter Wemm  * without limitation the rights to use, copy, modify, merge, publish,      *
90e3d5408SPeter Wemm  * distribute, distribute with modifications, sublicense, and/or sell       *
100e3d5408SPeter Wemm  * copies of the Software, and to permit persons to whom the Software is    *
110e3d5408SPeter Wemm  * furnished to do so, subject to the following conditions:                 *
120e3d5408SPeter Wemm  *                                                                          *
130e3d5408SPeter Wemm  * The above copyright notice and this permission notice shall be included  *
140e3d5408SPeter Wemm  * in all copies or substantial portions of the Software.                   *
150e3d5408SPeter Wemm  *                                                                          *
160e3d5408SPeter Wemm  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
170e3d5408SPeter Wemm  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
180e3d5408SPeter Wemm  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
190e3d5408SPeter Wemm  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
200e3d5408SPeter Wemm  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
210e3d5408SPeter Wemm  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
220e3d5408SPeter Wemm  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
230e3d5408SPeter Wemm  *                                                                          *
240e3d5408SPeter Wemm  * Except as contained in this notice, the name(s) of the above copyright   *
250e3d5408SPeter Wemm  * holders shall not be used in advertising or otherwise to promote the     *
260e3d5408SPeter Wemm  * sale, use or other dealings in this Software without prior written       *
270e3d5408SPeter Wemm  * authorization.                                                           *
280e3d5408SPeter Wemm  ****************************************************************************/
290e3d5408SPeter Wemm 
300e3d5408SPeter Wemm /****************************************************************************
314a1a9510SRong-En Fan  *   Author:  Juergen Pfeifer, 1995,1997                                    *
320e3d5408SPeter Wemm  ****************************************************************************/
330e3d5408SPeter Wemm 
34*21817992SBaptiste Daroussin /* $Id: form.priv.h,v 0.49 2024/02/24 12:17:31 tom Exp $ */
354a1a9510SRong-En Fan 
364a1a9510SRong-En Fan #ifndef FORM_PRIV_H
374a1a9510SRong-En Fan #define FORM_PRIV_H 1
3873f0a83dSXin LI /* *INDENT-OFF*/
394a1a9510SRong-En Fan #include "curses.priv.h"
40aae38d10SBaptiste Daroussin 
41aae38d10SBaptiste Daroussin #define NCURSES_OPAQUE_FORM  0
42aae38d10SBaptiste Daroussin 
430e3d5408SPeter Wemm #include "mf_common.h"
444a1a9510SRong-En Fan 
454a1a9510SRong-En Fan #if USE_WIDEC_SUPPORT
464a1a9510SRong-En Fan #if HAVE_WCTYPE_H
474a1a9510SRong-En Fan #include <wctype.h>
484a1a9510SRong-En Fan #endif
494a1a9510SRong-En Fan 
504a1a9510SRong-En Fan #define FIELD_CELL NCURSES_CH_T
514a1a9510SRong-En Fan 
524a1a9510SRong-En Fan #define NCURSES_FIELD_INTERNALS char** expanded; WINDOW *working;
534a1a9510SRong-En Fan #define NCURSES_FIELD_EXTENSION , (char **)0, (WINDOW *)0
544a1a9510SRong-En Fan 
554a1a9510SRong-En Fan #else
564a1a9510SRong-En Fan 
574a1a9510SRong-En Fan #define FIELD_CELL char
584a1a9510SRong-En Fan 
594a1a9510SRong-En Fan #define NCURSES_FIELD_EXTENSION /* nothing */
604a1a9510SRong-En Fan 
614a1a9510SRong-En Fan #endif
624a1a9510SRong-En Fan 
630e3d5408SPeter Wemm #include "form.h"
640e3d5408SPeter Wemm 
6506bfebdeSXin LI 	/***********************
6606bfebdeSXin LI 	*   Default objects    *
6706bfebdeSXin LI 	***********************/
687a656419SBaptiste Daroussin extern FORM_EXPORT_VAR(FORM *)      _nc_Default_Form;
697a656419SBaptiste Daroussin extern FORM_EXPORT_VAR(FIELD *)     _nc_Default_Field;
707a656419SBaptiste Daroussin extern FORM_EXPORT_VAR(FIELDTYPE *) _nc_Default_FieldType;
7106bfebdeSXin LI 
720e3d5408SPeter Wemm /* form  status values */
734a1a9510SRong-En Fan #define _OVLMODE         (0x04U) /* Form is in overlay mode                */
744a1a9510SRong-En Fan #define _WINDOW_MODIFIED (0x10U) /* Current field window has been modified */
754a1a9510SRong-En Fan #define _FCHECK_REQUIRED (0x20U) /* Current field needs validation         */
760e3d5408SPeter Wemm 
770e3d5408SPeter Wemm /* field status values */
784a1a9510SRong-En Fan #define _CHANGED         (0x01U) /* Field has been changed                 */
794a1a9510SRong-En Fan #define _NEWTOP          (0x02U) /* Vertical scrolling occurred            */
804a1a9510SRong-En Fan #define _NEWPAGE         (0x04U) /* field begins new page of form          */
814a1a9510SRong-En Fan #define _MAY_GROW        (0x08U) /* dynamic field may still grow           */
820e3d5408SPeter Wemm 
830e3d5408SPeter Wemm /* fieldtype status values */
844a1a9510SRong-En Fan #define _LINKED_TYPE     (0x01U) /* Type is a linked type                  */
854a1a9510SRong-En Fan #define _HAS_ARGS        (0x02U) /* Type has arguments                     */
864a1a9510SRong-En Fan #define _HAS_CHOICE      (0x04U) /* Type has choice methods                */
874a1a9510SRong-En Fan #define _RESIDENT        (0x08U) /* Type is built-in                       */
8806bfebdeSXin LI #define _GENERIC         (0x10U) /* A generic field type                   */
890e3d5408SPeter Wemm 
900e3d5408SPeter Wemm /* This are the field options required to be a selectable field in field
910e3d5408SPeter Wemm    navigation requests */
920e3d5408SPeter Wemm #define O_SELECTABLE (O_ACTIVE | O_VISIBLE)
930e3d5408SPeter Wemm 
940e3d5408SPeter Wemm /* If form is NULL replace form argument by default-form */
954a1a9510SRong-En Fan #define Normalize_Form(form) \
964a1a9510SRong-En Fan   ((form) = (form != 0) ? (form) : _nc_Default_Form)
970e3d5408SPeter Wemm 
980e3d5408SPeter Wemm /* If field is NULL replace field argument by default-field */
994a1a9510SRong-En Fan #define Normalize_Field(field) \
1004a1a9510SRong-En Fan   ((field) = (field != 0) ? (field) : _nc_Default_Field)
1010e3d5408SPeter Wemm 
10206bfebdeSXin LI #if NCURSES_SP_FUNCS
10306bfebdeSXin LI #define Get_Form_Screen(form) \
10406bfebdeSXin LI   ((form)->win ? _nc_screen_of((form->win)):CURRENT_SCREEN)
10506bfebdeSXin LI #else
10606bfebdeSXin LI #define Get_Form_Screen(form) CURRENT_SCREEN
10706bfebdeSXin LI #endif
10806bfebdeSXin LI 
1097a656419SBaptiste Daroussin /* Retrieve form's window */
1100e3d5408SPeter Wemm #define Get_Form_Window(form) \
11106bfebdeSXin LI   ((form)->sub \
11206bfebdeSXin LI    ? (form)->sub \
11306bfebdeSXin LI    : ((form)->win \
11406bfebdeSXin LI       ? (form)->win \
11506bfebdeSXin LI       : StdScreen(Get_Form_Screen(form))))
1160e3d5408SPeter Wemm 
1170e3d5408SPeter Wemm /* Calculate the size for a single buffer for this field */
1180e3d5408SPeter Wemm #define Buffer_Length(field) ((field)->drows * (field)->dcols)
1190e3d5408SPeter Wemm 
1200e3d5408SPeter Wemm /* Calculate the total size of all buffers for this field */
1210e3d5408SPeter Wemm #define Total_Buffer_Size(field) \
12273f0a83dSXin LI    ( (size_t)(Buffer_Length(field) + 1) * (size_t)(1+(field)->nbuf) * sizeof(FIELD_CELL) )
1230e3d5408SPeter Wemm 
1240e3d5408SPeter Wemm /* Logic to determine whether or not a field is single lined */
1250e3d5408SPeter Wemm #define Single_Line_Field(field) \
1260e3d5408SPeter Wemm    (((field)->rows + (field)->nrow) == 1)
1270e3d5408SPeter Wemm 
128aae38d10SBaptiste Daroussin #define Field_Has_Option(f,o)      ((((unsigned)(f)->opts) & o) != 0)
129aae38d10SBaptiste Daroussin 
1300e3d5408SPeter Wemm /* Logic to determine whether or not a field is selectable */
1314a1a9510SRong-En Fan #define Field_Is_Selectable(f)     (((unsigned)((f)->opts) & O_SELECTABLE)==O_SELECTABLE)
1324a1a9510SRong-En Fan #define Field_Is_Not_Selectable(f) (((unsigned)((f)->opts) & O_SELECTABLE)!=O_SELECTABLE)
1330e3d5408SPeter Wemm 
1344a1a9510SRong-En Fan typedef struct typearg
1354a1a9510SRong-En Fan   {
1360e3d5408SPeter Wemm     struct typearg *left;
1370e3d5408SPeter Wemm     struct typearg *right;
1384a1a9510SRong-En Fan   }
1394a1a9510SRong-En Fan TypeArgument;
1400e3d5408SPeter Wemm 
1410e3d5408SPeter Wemm /* This is a dummy request code (normally invalid) to be used internally
1420e3d5408SPeter Wemm    with the form_driver() routine to position to the first active field
1430e3d5408SPeter Wemm    on the form
1440e3d5408SPeter Wemm */
1450e3d5408SPeter Wemm #define FIRST_ACTIVE_MAGIC (-291056)
1460e3d5408SPeter Wemm 
1470e3d5408SPeter Wemm #define ALL_FORM_OPTS  (                \
1480e3d5408SPeter Wemm 			O_NL_OVERLOAD  |\
1490e3d5408SPeter Wemm 			O_BS_OVERLOAD   )
1500e3d5408SPeter Wemm 
151aae38d10SBaptiste Daroussin #define STD_FIELD_OPTS (Field_Options)( \
1520e3d5408SPeter Wemm 			O_VISIBLE |\
1530e3d5408SPeter Wemm 			O_ACTIVE  |\
1540e3d5408SPeter Wemm 			O_PUBLIC  |\
1550e3d5408SPeter Wemm 			O_EDIT    |\
1560e3d5408SPeter Wemm 			O_WRAP    |\
1570e3d5408SPeter Wemm 			O_BLANK   |\
1580e3d5408SPeter Wemm 			O_AUTOSKIP|\
1590e3d5408SPeter Wemm 			O_NULLOK  |\
1600e3d5408SPeter Wemm 			O_PASSOK  |\
1610e3d5408SPeter Wemm 			O_STATIC)
1620e3d5408SPeter Wemm 
163aae38d10SBaptiste Daroussin #define ALL_FIELD_OPTS (Field_Options)( \
164aae38d10SBaptiste Daroussin 			STD_FIELD_OPTS |\
165aae38d10SBaptiste Daroussin 			O_DYNAMIC_JUSTIFY |\
166aae38d10SBaptiste Daroussin 			O_NO_LEFT_STRIP |\
167aae38d10SBaptiste Daroussin 			O_EDGE_INSERT_STAY |\
168aae38d10SBaptiste Daroussin 			O_INPUT_LIMIT)
169aae38d10SBaptiste Daroussin 
1700e3d5408SPeter Wemm #define C_BLANK ' '
1710e3d5408SPeter Wemm #define is_blank(c) ((c)==C_BLANK)
1720e3d5408SPeter Wemm 
1734a1a9510SRong-En Fan #define C_ZEROS '\0'
1744a1a9510SRong-En Fan 
1757a656419SBaptiste Daroussin extern FORM_EXPORT(TypeArgument *) _nc_Make_Argument (const FIELDTYPE*, va_list*, int*);
1767a656419SBaptiste Daroussin extern FORM_EXPORT(TypeArgument *) _nc_Copy_Argument (const FIELDTYPE*, const TypeArgument*, int*);
1777a656419SBaptiste Daroussin extern FORM_EXPORT(void) _nc_Free_Argument (const FIELDTYPE*, TypeArgument*);
1787a656419SBaptiste Daroussin extern FORM_EXPORT(bool) _nc_Copy_Type (FIELD*, FIELD const *);
1797a656419SBaptiste Daroussin extern FORM_EXPORT(void) _nc_Free_Type (FIELD *);
1800e3d5408SPeter Wemm 
1817a656419SBaptiste Daroussin extern FORM_EXPORT(int) _nc_Synchronize_Attributes (FIELD*);
1827a656419SBaptiste Daroussin extern FORM_EXPORT(int) _nc_Synchronize_Options (FIELD*, Field_Options);
1837a656419SBaptiste Daroussin extern FORM_EXPORT(int) _nc_Set_Form_Page (FORM*, int, FIELD*);
1847a656419SBaptiste Daroussin extern FORM_EXPORT(int) _nc_Refresh_Current_Field (FORM*);
1857a656419SBaptiste Daroussin extern FORM_EXPORT(FIELD *) _nc_First_Active_Field (FORM*);
1867a656419SBaptiste Daroussin extern FORM_EXPORT(bool) _nc_Internal_Validation (FORM*);
1877a656419SBaptiste Daroussin extern FORM_EXPORT(int) _nc_Set_Current_Field (FORM*, FIELD*);
1887a656419SBaptiste Daroussin extern FORM_EXPORT(int) _nc_Position_Form_Cursor (FORM*);
1897a656419SBaptiste Daroussin extern FORM_EXPORT(void) _nc_Unset_Current_Field(FORM *form);
1904a1a9510SRong-En Fan 
19106bfebdeSXin LI #if NCURSES_INTEROP_FUNCS
1927a656419SBaptiste Daroussin extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_INTEGER(void);
1937a656419SBaptiste Daroussin extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_ALNUM(void);
1947a656419SBaptiste Daroussin extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_ALPHA(void);
1957a656419SBaptiste Daroussin extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_ENUM(void);
1967a656419SBaptiste Daroussin extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_NUMERIC(void);
1977a656419SBaptiste Daroussin extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_REGEXP(void);
1987a656419SBaptiste Daroussin extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_IPV4(void);
19906bfebdeSXin LI 
2007a656419SBaptiste Daroussin extern FORM_EXPORT(FIELDTYPE *)
20106bfebdeSXin LI _nc_generic_fieldtype(bool (*const field_check) (FORM*,
20206bfebdeSXin LI 						 FIELD *,
20306bfebdeSXin LI 						 const void *),
20406bfebdeSXin LI 		      bool (*const char_check)  (int,
20506bfebdeSXin LI 						 FORM*,
20606bfebdeSXin LI 						 FIELD*,
20706bfebdeSXin LI 						 const void *),
20806bfebdeSXin LI 		      bool (*const next)(FORM*,FIELD*,const void*),
20906bfebdeSXin LI 		      bool (*const prev)(FORM*,FIELD*,const void*),
21006bfebdeSXin LI 		      void (*freecallback)(void*));
2117a656419SBaptiste Daroussin extern FORM_EXPORT(int) _nc_set_generic_fieldtype(FIELD*, FIELDTYPE*, int (*)(void**));
2127a656419SBaptiste Daroussin extern FORM_EXPORT(WINDOW*) _nc_form_cursor(const FORM* , int* , int* );
21306bfebdeSXin LI 
21406bfebdeSXin LI #define INIT_FT_FUNC(func) {func}
21506bfebdeSXin LI #else
21606bfebdeSXin LI #define INIT_FT_FUNC(func) func
21706bfebdeSXin LI #endif
21806bfebdeSXin LI 
2197a656419SBaptiste Daroussin extern FORM_EXPORT(void) _nc_get_fieldbuffer(FORM*, FIELD*, FIELD_CELL*);
22006bfebdeSXin LI 
2214a1a9510SRong-En Fan #if USE_WIDEC_SUPPORT
2227a656419SBaptiste Daroussin extern FORM_EXPORT(wchar_t *) _nc_Widen_String(char *, int *);
2234a1a9510SRong-En Fan #endif
2244a1a9510SRong-En Fan 
2254a1a9510SRong-En Fan #ifdef TRACE
2264a1a9510SRong-En Fan 
227aae38d10SBaptiste Daroussin #define returnField(code)	TRACE_RETURN1(code,field)
228aae38d10SBaptiste Daroussin #define returnFieldPtr(code)	TRACE_RETURN1(code,field_ptr)
229aae38d10SBaptiste Daroussin #define returnForm(code)	TRACE_RETURN1(code,form)
230aae38d10SBaptiste Daroussin #define returnFieldType(code)	TRACE_RETURN1(code,field_type)
231aae38d10SBaptiste Daroussin #define returnFormHook(code)	TRACE_RETURN1(code,form_hook)
2324a1a9510SRong-En Fan 
2337a656419SBaptiste Daroussin extern FORM_EXPORT(FIELD **)	    _nc_retrace_field_ptr (FIELD **);
2347a656419SBaptiste Daroussin extern FORM_EXPORT(FIELD *)	    _nc_retrace_field (FIELD *);
2357a656419SBaptiste Daroussin extern FORM_EXPORT(FIELDTYPE *)  _nc_retrace_field_type (FIELDTYPE *);
2367a656419SBaptiste Daroussin extern FORM_EXPORT(FORM *)       _nc_retrace_form (FORM *);
2377a656419SBaptiste Daroussin extern FORM_EXPORT(Form_Hook)    _nc_retrace_form_hook (Form_Hook);
2384a1a9510SRong-En Fan 
2394a1a9510SRong-En Fan #else /* !TRACE */
2404a1a9510SRong-En Fan 
2414a1a9510SRong-En Fan #define returnFieldPtr(code)	return code
2424a1a9510SRong-En Fan #define returnFieldType(code)	return code
2434a1a9510SRong-En Fan #define returnField(code)	return code
2444a1a9510SRong-En Fan #define returnForm(code)	return code
2454a1a9510SRong-En Fan #define returnFormHook(code)	return code
2464a1a9510SRong-En Fan 
2474a1a9510SRong-En Fan #endif /* TRACE/!TRACE */
2484a1a9510SRong-En Fan 
2494a1a9510SRong-En Fan /*
2504a1a9510SRong-En Fan  * Use Check_CTYPE_Field() to simplify FIELDTYPE's that use only the ccheck()
2514a1a9510SRong-En Fan  * function.
2524a1a9510SRong-En Fan  */
2534a1a9510SRong-En Fan #if USE_WIDEC_SUPPORT
2544a1a9510SRong-En Fan #define Check_CTYPE_Field(result, buffer, width, ccheck) \
2554a1a9510SRong-En Fan   while (*buffer && *buffer == ' ') \
2564a1a9510SRong-En Fan     buffer++; \
2574a1a9510SRong-En Fan   if (*buffer) \
2584a1a9510SRong-En Fan     { \
2594a1a9510SRong-En Fan       bool blank = FALSE; \
2604a1a9510SRong-En Fan       int len; \
2614a1a9510SRong-En Fan       int n; \
2624a1a9510SRong-En Fan       wchar_t *list = _nc_Widen_String((char *)buffer, &len); \
2634a1a9510SRong-En Fan       if (list != 0) \
2644a1a9510SRong-En Fan 	{ \
2654a1a9510SRong-En Fan 	  result = TRUE; \
2664a1a9510SRong-En Fan 	  for (n = 0; n < len; ++n) \
2674a1a9510SRong-En Fan 	    { \
2684a1a9510SRong-En Fan 	      if (blank) \
2694a1a9510SRong-En Fan 		{ \
2704a1a9510SRong-En Fan 		  if (list[n] != ' ') \
2714a1a9510SRong-En Fan 		    { \
2724a1a9510SRong-En Fan 		      result = FALSE; \
2734a1a9510SRong-En Fan 		      break; \
2744a1a9510SRong-En Fan 		    } \
2754a1a9510SRong-En Fan 		} \
2764a1a9510SRong-En Fan 	      else if (list[n] == ' ') \
2774a1a9510SRong-En Fan 		{ \
2784a1a9510SRong-En Fan 		  blank = TRUE; \
2794a1a9510SRong-En Fan 		  result = (n + 1 >= width); \
2804a1a9510SRong-En Fan 		} \
2814a1a9510SRong-En Fan 	      else if (!ccheck(list[n], NULL)) \
2824a1a9510SRong-En Fan 		{ \
2834a1a9510SRong-En Fan 		  result = FALSE; \
2844a1a9510SRong-En Fan 		  break; \
2854a1a9510SRong-En Fan 		} \
2864a1a9510SRong-En Fan 	    } \
2874a1a9510SRong-En Fan 	  free(list); \
2884a1a9510SRong-En Fan 	} \
2894a1a9510SRong-En Fan     }
2904a1a9510SRong-En Fan #else
2914a1a9510SRong-En Fan #define Check_CTYPE_Field(result, buffer, width, ccheck) \
2924a1a9510SRong-En Fan   while (*buffer && *buffer == ' ') \
2934a1a9510SRong-En Fan     buffer++; \
2944a1a9510SRong-En Fan   if (*buffer) \
2954a1a9510SRong-En Fan     { \
2964a1a9510SRong-En Fan       unsigned char *s = buffer; \
2974a1a9510SRong-En Fan       int l = -1; \
2984a1a9510SRong-En Fan       while (*buffer && ccheck(*buffer, NULL)) \
2994a1a9510SRong-En Fan 	buffer++; \
3004a1a9510SRong-En Fan       l = (int)(buffer - s); \
3014a1a9510SRong-En Fan       while (*buffer && *buffer == ' ') \
3024a1a9510SRong-En Fan 	buffer++; \
3034a1a9510SRong-En Fan       result = ((*buffer || (l < width)) ? FALSE : TRUE); \
3044a1a9510SRong-En Fan     }
3054a1a9510SRong-En Fan #endif
30673f0a83dSXin LI /* *INDENT-ON*/
3074a1a9510SRong-En Fan 
3084a1a9510SRong-En Fan #endif /* FORM_PRIV_H */
309