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