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