150276Speter/**************************************************************************** 2262685Sdelphij * Copyright (c) 1998-2009,2012 Free Software Foundation, Inc. * 350276Speter * * 450276Speter * Permission is hereby granted, free of charge, to any person obtaining a * 550276Speter * copy of this software and associated documentation files (the * 650276Speter * "Software"), to deal in the Software without restriction, including * 750276Speter * without limitation the rights to use, copy, modify, merge, publish, * 850276Speter * distribute, distribute with modifications, sublicense, and/or sell * 950276Speter * copies of the Software, and to permit persons to whom the Software is * 1050276Speter * furnished to do so, subject to the following conditions: * 1150276Speter * * 1250276Speter * The above copyright notice and this permission notice shall be included * 1350276Speter * in all copies or substantial portions of the Software. * 1450276Speter * * 1550276Speter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * 1650276Speter * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * 1750276Speter * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 1850276Speter * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 1950276Speter * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 2050276Speter * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * 2150276Speter * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * 2250276Speter * * 2350276Speter * Except as contained in this notice, the name(s) of the above copyright * 2450276Speter * holders shall not be used in advertising or otherwise to promote the * 2550276Speter * sale, use or other dealings in this Software without prior written * 2650276Speter * authorization. * 2750276Speter ****************************************************************************/ 2850276Speter 2950276Speter/**************************************************************************** 30166124Srafan * Author: Juergen Pfeifer, 1995,1997 * 3150276Speter ****************************************************************************/ 3250276Speter 33262685Sdelphij/* $Id: form.priv.h,v 0.33 2012/03/11 00:37:46 tom Exp $ */ 34166124Srafan 35166124Srafan#ifndef FORM_PRIV_H 36166124Srafan#define FORM_PRIV_H 1 37262685Sdelphij/* *INDENT-OFF*/ 38166124Srafan#include "curses.priv.h" 3950276Speter#include "mf_common.h" 40166124Srafan 41166124Srafan#if USE_WIDEC_SUPPORT 42166124Srafan#if HAVE_WCTYPE_H 43166124Srafan#include <wctype.h> 44166124Srafan#endif 45166124Srafan 46166124Srafan#ifndef MB_LEN_MAX 47166124Srafan#define MB_LEN_MAX 8 /* should be >= MB_CUR_MAX, but that may be a function */ 48166124Srafan#endif 49166124Srafan 50166124Srafan#define FIELD_CELL NCURSES_CH_T 51166124Srafan 52166124Srafan#define NCURSES_FIELD_INTERNALS char** expanded; WINDOW *working; 53166124Srafan#define NCURSES_FIELD_EXTENSION , (char **)0, (WINDOW *)0 54166124Srafan 55166124Srafan#else 56166124Srafan 57166124Srafan#define FIELD_CELL char 58166124Srafan 59166124Srafan#define NCURSES_FIELD_EXTENSION /* nothing */ 60166124Srafan 61166124Srafan#endif 62166124Srafan 6350276Speter#include "form.h" 6450276Speter 65262629Sdelphij /*********************** 66262629Sdelphij * Default objects * 67262629Sdelphij ***********************/ 68262629Sdelphijextern NCURSES_EXPORT_VAR(FORM *) _nc_Default_Form; 69262629Sdelphijextern NCURSES_EXPORT_VAR(FIELD *) _nc_Default_Field; 70262629Sdelphijextern NCURSES_EXPORT_VAR(FIELDTYPE *) _nc_Default_FieldType; 71262629Sdelphij 7250276Speter/* form status values */ 73166124Srafan#define _OVLMODE (0x04U) /* Form is in overlay mode */ 74166124Srafan#define _WINDOW_MODIFIED (0x10U) /* Current field window has been modified */ 75166124Srafan#define _FCHECK_REQUIRED (0x20U) /* Current field needs validation */ 7650276Speter 7750276Speter/* field status values */ 78166124Srafan#define _CHANGED (0x01U) /* Field has been changed */ 79166124Srafan#define _NEWTOP (0x02U) /* Vertical scrolling occurred */ 80166124Srafan#define _NEWPAGE (0x04U) /* field begins new page of form */ 81166124Srafan#define _MAY_GROW (0x08U) /* dynamic field may still grow */ 8250276Speter 8350276Speter/* fieldtype status values */ 84166124Srafan#define _LINKED_TYPE (0x01U) /* Type is a linked type */ 85166124Srafan#define _HAS_ARGS (0x02U) /* Type has arguments */ 86166124Srafan#define _HAS_CHOICE (0x04U) /* Type has choice methods */ 87166124Srafan#define _RESIDENT (0x08U) /* Type is built-in */ 88262629Sdelphij#define _GENERIC (0x10U) /* A generic field type */ 8950276Speter 9050276Speter/* This are the field options required to be a selectable field in field 9150276Speter navigation requests */ 9250276Speter#define O_SELECTABLE (O_ACTIVE | O_VISIBLE) 9350276Speter 9450276Speter/* If form is NULL replace form argument by default-form */ 95166124Srafan#define Normalize_Form(form) \ 96166124Srafan ((form) = (form != 0) ? (form) : _nc_Default_Form) 9750276Speter 9850276Speter/* If field is NULL replace field argument by default-field */ 99166124Srafan#define Normalize_Field(field) \ 100166124Srafan ((field) = (field != 0) ? (field) : _nc_Default_Field) 10150276Speter 102262629Sdelphij#if NCURSES_SP_FUNCS 103262629Sdelphij#define Get_Form_Screen(form) \ 104262629Sdelphij ((form)->win ? _nc_screen_of((form->win)):CURRENT_SCREEN) 105262629Sdelphij#else 106262629Sdelphij#define Get_Form_Screen(form) CURRENT_SCREEN 107262629Sdelphij#endif 108262629Sdelphij 10950276Speter/* Retrieve forms window */ 11050276Speter#define Get_Form_Window(form) \ 111262629Sdelphij ((form)->sub \ 112262629Sdelphij ? (form)->sub \ 113262629Sdelphij : ((form)->win \ 114262629Sdelphij ? (form)->win \ 115262629Sdelphij : StdScreen(Get_Form_Screen(form)))) 11650276Speter 11750276Speter/* Calculate the size for a single buffer for this field */ 11850276Speter#define Buffer_Length(field) ((field)->drows * (field)->dcols) 11950276Speter 12050276Speter/* Calculate the total size of all buffers for this field */ 12150276Speter#define Total_Buffer_Size(field) \ 122262685Sdelphij ( (size_t)(Buffer_Length(field) + 1) * (size_t)(1+(field)->nbuf) * sizeof(FIELD_CELL) ) 12350276Speter 12450276Speter/* Logic to determine whether or not a field is single lined */ 12550276Speter#define Single_Line_Field(field) \ 12650276Speter (((field)->rows + (field)->nrow) == 1) 12750276Speter 12850276Speter/* Logic to determine whether or not a field is selectable */ 129166124Srafan#define Field_Is_Selectable(f) (((unsigned)((f)->opts) & O_SELECTABLE)==O_SELECTABLE) 130166124Srafan#define Field_Is_Not_Selectable(f) (((unsigned)((f)->opts) & O_SELECTABLE)!=O_SELECTABLE) 13150276Speter 132166124Srafantypedef struct typearg 133166124Srafan { 134166124Srafan struct typearg *left; 135166124Srafan struct typearg *right; 136166124Srafan } 137166124SrafanTypeArgument; 13850276Speter 13950276Speter/* This is a dummy request code (normally invalid) to be used internally 14050276Speter with the form_driver() routine to position to the first active field 14150276Speter on the form 14250276Speter*/ 14350276Speter#define FIRST_ACTIVE_MAGIC (-291056) 14450276Speter 14550276Speter#define ALL_FORM_OPTS ( \ 14650276Speter O_NL_OVERLOAD |\ 14750276Speter O_BS_OVERLOAD ) 14850276Speter 149166124Srafan#define ALL_FIELD_OPTS (Field_Options)( \ 15050276Speter O_VISIBLE |\ 15150276Speter O_ACTIVE |\ 15250276Speter O_PUBLIC |\ 15350276Speter O_EDIT |\ 15450276Speter O_WRAP |\ 15550276Speter O_BLANK |\ 15650276Speter O_AUTOSKIP|\ 15750276Speter O_NULLOK |\ 15850276Speter O_PASSOK |\ 15950276Speter O_STATIC ) 16050276Speter 16150276Speter#define C_BLANK ' ' 16250276Speter#define is_blank(c) ((c)==C_BLANK) 16350276Speter 164166124Srafan#define C_ZEROS '\0' 165166124Srafan 166166124Srafanextern NCURSES_EXPORT(TypeArgument *) _nc_Make_Argument (const FIELDTYPE*, va_list*, int*); 167166124Srafanextern NCURSES_EXPORT(TypeArgument *) _nc_Copy_Argument (const FIELDTYPE*, const TypeArgument*, int*); 168166124Srafanextern NCURSES_EXPORT(void) _nc_Free_Argument (const FIELDTYPE*, TypeArgument*); 16976726Speterextern NCURSES_EXPORT(bool) _nc_Copy_Type (FIELD*, FIELD const *); 17076726Speterextern NCURSES_EXPORT(void) _nc_Free_Type (FIELD *); 17150276Speter 17276726Speterextern NCURSES_EXPORT(int) _nc_Synchronize_Attributes (FIELD*); 173166124Srafanextern NCURSES_EXPORT(int) _nc_Synchronize_Options (FIELD*, Field_Options); 174166124Srafanextern NCURSES_EXPORT(int) _nc_Set_Form_Page (FORM*, int, FIELD*); 17576726Speterextern NCURSES_EXPORT(int) _nc_Refresh_Current_Field (FORM*); 17676726Speterextern NCURSES_EXPORT(FIELD *) _nc_First_Active_Field (FORM*); 17776726Speterextern NCURSES_EXPORT(bool) _nc_Internal_Validation (FORM*); 178166124Srafanextern NCURSES_EXPORT(int) _nc_Set_Current_Field (FORM*, FIELD*); 17976726Speterextern NCURSES_EXPORT(int) _nc_Position_Form_Cursor (FORM*); 180166124Srafan 181262629Sdelphij#if NCURSES_INTEROP_FUNCS 182262629Sdelphijextern NCURSES_EXPORT(FIELDTYPE *) _nc_TYPE_INTEGER(void); 183262629Sdelphijextern NCURSES_EXPORT(FIELDTYPE *) _nc_TYPE_ALNUM(void); 184262629Sdelphijextern NCURSES_EXPORT(FIELDTYPE *) _nc_TYPE_ALPHA(void); 185262629Sdelphijextern NCURSES_EXPORT(FIELDTYPE *) _nc_TYPE_ENUM(void); 186262629Sdelphijextern NCURSES_EXPORT(FIELDTYPE *) _nc_TYPE_NUMERIC(void); 187262629Sdelphijextern NCURSES_EXPORT(FIELDTYPE *) _nc_TYPE_REGEXP(void); 188262629Sdelphijextern NCURSES_EXPORT(FIELDTYPE *) _nc_TYPE_IPV4(void); 189262629Sdelphij 190262629Sdelphijextern NCURSES_EXPORT(FIELDTYPE *) 191262629Sdelphij_nc_generic_fieldtype(bool (*const field_check) (FORM*, 192262629Sdelphij FIELD *, 193262629Sdelphij const void *), 194262629Sdelphij bool (*const char_check) (int, 195262629Sdelphij FORM*, 196262629Sdelphij FIELD*, 197262629Sdelphij const void *), 198262629Sdelphij bool (*const next)(FORM*,FIELD*,const void*), 199262629Sdelphij bool (*const prev)(FORM*,FIELD*,const void*), 200262629Sdelphij void (*freecallback)(void*)); 201262629Sdelphijextern NCURSES_EXPORT(int) _nc_set_generic_fieldtype(FIELD*, FIELDTYPE*, int (*)(void**)); 202262629Sdelphijextern NCURSES_EXPORT(WINDOW*) _nc_form_cursor(const FORM* , int* , int* ); 203262629Sdelphij 204262629Sdelphij#define INIT_FT_FUNC(func) {func} 205262629Sdelphij#else 206262629Sdelphij#define INIT_FT_FUNC(func) func 207262629Sdelphij#endif 208262629Sdelphij 209262629Sdelphijextern NCURSES_EXPORT(void) _nc_get_fieldbuffer(FORM*, FIELD*, FIELD_CELL*); 210262629Sdelphij 211166124Srafan#if USE_WIDEC_SUPPORT 212166124Srafanextern NCURSES_EXPORT(wchar_t *) _nc_Widen_String(char *, int *); 213166124Srafan#endif 214166124Srafan 215166124Srafan#ifdef TRACE 216166124Srafan 217166124Srafan#define returnField(code) TRACE_RETURN(code,field) 218166124Srafan#define returnFieldPtr(code) TRACE_RETURN(code,field_ptr) 219166124Srafan#define returnForm(code) TRACE_RETURN(code,form) 220166124Srafan#define returnFieldType(code) TRACE_RETURN(code,field_type) 221166124Srafan#define returnFormHook(code) TRACE_RETURN(code,form_hook) 222166124Srafan 223166124Srafanextern NCURSES_EXPORT(FIELD **) _nc_retrace_field_ptr (FIELD **); 224166124Srafanextern NCURSES_EXPORT(FIELD *) _nc_retrace_field (FIELD *); 225166124Srafanextern NCURSES_EXPORT(FIELDTYPE *) _nc_retrace_field_type (FIELDTYPE *); 226262629Sdelphijextern NCURSES_EXPORT(FORM *) _nc_retrace_form (FORM *); 227262629Sdelphijextern NCURSES_EXPORT(Form_Hook) _nc_retrace_form_hook (Form_Hook); 228166124Srafan 229166124Srafan#else /* !TRACE */ 230166124Srafan 231166124Srafan#define returnFieldPtr(code) return code 232166124Srafan#define returnFieldType(code) return code 233166124Srafan#define returnField(code) return code 234166124Srafan#define returnForm(code) return code 235166124Srafan#define returnFormHook(code) return code 236166124Srafan 237166124Srafan#endif /* TRACE/!TRACE */ 238166124Srafan 239166124Srafan/* 240166124Srafan * Use Check_CTYPE_Field() to simplify FIELDTYPE's that use only the ccheck() 241166124Srafan * function. 242166124Srafan */ 243166124Srafan#if USE_WIDEC_SUPPORT 244166124Srafan#define Check_CTYPE_Field(result, buffer, width, ccheck) \ 245166124Srafan while (*buffer && *buffer == ' ') \ 246166124Srafan buffer++; \ 247166124Srafan if (*buffer) \ 248166124Srafan { \ 249166124Srafan bool blank = FALSE; \ 250166124Srafan int len; \ 251166124Srafan int n; \ 252166124Srafan wchar_t *list = _nc_Widen_String((char *)buffer, &len); \ 253166124Srafan if (list != 0) \ 254166124Srafan { \ 255166124Srafan result = TRUE; \ 256166124Srafan for (n = 0; n < len; ++n) \ 257166124Srafan { \ 258166124Srafan if (blank) \ 259166124Srafan { \ 260166124Srafan if (list[n] != ' ') \ 261166124Srafan { \ 262166124Srafan result = FALSE; \ 263166124Srafan break; \ 264166124Srafan } \ 265166124Srafan } \ 266166124Srafan else if (list[n] == ' ') \ 267166124Srafan { \ 268166124Srafan blank = TRUE; \ 269166124Srafan result = (n + 1 >= width); \ 270166124Srafan } \ 271166124Srafan else if (!ccheck(list[n], NULL)) \ 272166124Srafan { \ 273166124Srafan result = FALSE; \ 274166124Srafan break; \ 275166124Srafan } \ 276166124Srafan } \ 277166124Srafan free(list); \ 278166124Srafan } \ 279166124Srafan } 280166124Srafan#else 281166124Srafan#define Check_CTYPE_Field(result, buffer, width, ccheck) \ 282166124Srafan while (*buffer && *buffer == ' ') \ 283166124Srafan buffer++; \ 284166124Srafan if (*buffer) \ 285166124Srafan { \ 286166124Srafan unsigned char *s = buffer; \ 287166124Srafan int l = -1; \ 288166124Srafan while (*buffer && ccheck(*buffer, NULL)) \ 289166124Srafan buffer++; \ 290166124Srafan l = (int)(buffer - s); \ 291166124Srafan while (*buffer && *buffer == ' ') \ 292166124Srafan buffer++; \ 293166124Srafan result = ((*buffer || (l < width)) ? FALSE : TRUE); \ 294166124Srafan } 295166124Srafan#endif 296262685Sdelphij/* *INDENT-ON*/ 297166124Srafan 298166124Srafan#endif /* FORM_PRIV_H */ 299