blob: 4d1dfe7bf01e533d8790bc4759c819dcb3d59bd3 [file] [log] [blame]
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +05301/****************************************************************************
Steve Kondikae271bc2015-11-15 02:50:53 +01002 * Copyright (c) 1998-2012,2014 Free Software Foundation, Inc. *
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +05303 * *
4 * Permission is hereby granted, free of charge, to any person obtaining a *
5 * copy of this software and associated documentation files (the *
6 * "Software"), to deal in the Software without restriction, including *
7 * without limitation the rights to use, copy, modify, merge, publish, *
8 * distribute, distribute with modifications, sublicense, and/or sell *
9 * copies of the Software, and to permit persons to whom the Software is *
10 * furnished to do so, subject to the following conditions: *
11 * *
12 * The above copyright notice and this permission notice shall be included *
13 * in all copies or substantial portions of the Software. *
14 * *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
18 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
21 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
22 * *
23 * Except as contained in this notice, the name(s) of the above copyright *
24 * holders shall not be used in advertising or otherwise to promote the *
25 * sale, use or other dealings in this Software without prior written *
26 * authorization. *
27 ****************************************************************************/
28
29/****************************************************************************
30 * Author: Juergen Pfeifer, 1995,1997 *
31 ****************************************************************************/
32
Steve Kondikae271bc2015-11-15 02:50:53 +010033/* $Id: form.priv.h,v 0.38 2014/11/01 13:56:14 tom Exp $ */
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053034
35#ifndef FORM_PRIV_H
36#define FORM_PRIV_H 1
Steve Kondikae271bc2015-11-15 02:50:53 +010037/* *INDENT-OFF*/
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053038#include "curses.priv.h"
39#include "mf_common.h"
40
41#if USE_WIDEC_SUPPORT
42#if HAVE_WCTYPE_H
43#include <wctype.h>
44#endif
45
46#ifndef MB_LEN_MAX
47#define MB_LEN_MAX 8 /* should be >= MB_CUR_MAX, but that may be a function */
48#endif
49
50#define FIELD_CELL NCURSES_CH_T
51
52#define NCURSES_FIELD_INTERNALS char** expanded; WINDOW *working;
53#define NCURSES_FIELD_EXTENSION , (char **)0, (WINDOW *)0
54
55#else
56
57#define FIELD_CELL char
58
59#define NCURSES_FIELD_EXTENSION /* nothing */
60
61#endif
62
63#include "form.h"
64
Steve Kondikae271bc2015-11-15 02:50:53 +010065 /***********************
66 * Default objects *
67 ***********************/
68extern NCURSES_EXPORT_VAR(FORM *) _nc_Default_Form;
69extern NCURSES_EXPORT_VAR(FIELD *) _nc_Default_Field;
70extern NCURSES_EXPORT_VAR(FIELDTYPE *) _nc_Default_FieldType;
71
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053072/* form status values */
73#define _OVLMODE (0x04U) /* Form is in overlay mode */
74#define _WINDOW_MODIFIED (0x10U) /* Current field window has been modified */
75#define _FCHECK_REQUIRED (0x20U) /* Current field needs validation */
76
77/* field status values */
78#define _CHANGED (0x01U) /* Field has been changed */
79#define _NEWTOP (0x02U) /* Vertical scrolling occurred */
80#define _NEWPAGE (0x04U) /* field begins new page of form */
81#define _MAY_GROW (0x08U) /* dynamic field may still grow */
82
83/* fieldtype status values */
84#define _LINKED_TYPE (0x01U) /* Type is a linked type */
85#define _HAS_ARGS (0x02U) /* Type has arguments */
86#define _HAS_CHOICE (0x04U) /* Type has choice methods */
87#define _RESIDENT (0x08U) /* Type is built-in */
Steve Kondikae271bc2015-11-15 02:50:53 +010088#define _GENERIC (0x10U) /* A generic field type */
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +053089
90/* This are the field options required to be a selectable field in field
91 navigation requests */
92#define O_SELECTABLE (O_ACTIVE | O_VISIBLE)
93
94/* If form is NULL replace form argument by default-form */
95#define Normalize_Form(form) \
96 ((form) = (form != 0) ? (form) : _nc_Default_Form)
97
98/* If field is NULL replace field argument by default-field */
99#define Normalize_Field(field) \
100 ((field) = (field != 0) ? (field) : _nc_Default_Field)
101
Steve Kondikae271bc2015-11-15 02:50:53 +0100102#if NCURSES_SP_FUNCS
103#define Get_Form_Screen(form) \
104 ((form)->win ? _nc_screen_of((form->win)):CURRENT_SCREEN)
105#else
106#define Get_Form_Screen(form) CURRENT_SCREEN
107#endif
108
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530109/* Retrieve forms window */
110#define Get_Form_Window(form) \
Steve Kondikae271bc2015-11-15 02:50:53 +0100111 ((form)->sub \
112 ? (form)->sub \
113 : ((form)->win \
114 ? (form)->win \
115 : StdScreen(Get_Form_Screen(form))))
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530116
117/* Calculate the size for a single buffer for this field */
118#define Buffer_Length(field) ((field)->drows * (field)->dcols)
119
120/* Calculate the total size of all buffers for this field */
121#define Total_Buffer_Size(field) \
Steve Kondikae271bc2015-11-15 02:50:53 +0100122 ( (size_t)(Buffer_Length(field) + 1) * (size_t)(1+(field)->nbuf) * sizeof(FIELD_CELL) )
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530123
124/* Logic to determine whether or not a field is single lined */
125#define Single_Line_Field(field) \
126 (((field)->rows + (field)->nrow) == 1)
127
Steve Kondikae271bc2015-11-15 02:50:53 +0100128#define Field_Has_Option(f,o) ((((unsigned)(f)->opts) & o) != 0)
129
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530130/* Logic to determine whether or not a field is selectable */
131#define Field_Is_Selectable(f) (((unsigned)((f)->opts) & O_SELECTABLE)==O_SELECTABLE)
132#define Field_Is_Not_Selectable(f) (((unsigned)((f)->opts) & O_SELECTABLE)!=O_SELECTABLE)
133
134typedef struct typearg
135 {
136 struct typearg *left;
137 struct typearg *right;
138 }
139TypeArgument;
140
141/* This is a dummy request code (normally invalid) to be used internally
142 with the form_driver() routine to position to the first active field
143 on the form
144*/
145#define FIRST_ACTIVE_MAGIC (-291056)
146
147#define ALL_FORM_OPTS ( \
148 O_NL_OVERLOAD |\
149 O_BS_OVERLOAD )
150
Steve Kondikae271bc2015-11-15 02:50:53 +0100151#define STD_FIELD_OPTS (Field_Options)( \
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530152 O_VISIBLE |\
153 O_ACTIVE |\
154 O_PUBLIC |\
155 O_EDIT |\
156 O_WRAP |\
157 O_BLANK |\
158 O_AUTOSKIP|\
159 O_NULLOK |\
160 O_PASSOK |\
Steve Kondikae271bc2015-11-15 02:50:53 +0100161 O_STATIC)
162
163#define ALL_FIELD_OPTS (Field_Options)( \
164 STD_FIELD_OPTS |\
165 O_DYNAMIC_JUSTIFY)
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530166
167#define C_BLANK ' '
168#define is_blank(c) ((c)==C_BLANK)
169
170#define C_ZEROS '\0'
171
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530172extern NCURSES_EXPORT(TypeArgument *) _nc_Make_Argument (const FIELDTYPE*, va_list*, int*);
173extern NCURSES_EXPORT(TypeArgument *) _nc_Copy_Argument (const FIELDTYPE*, const TypeArgument*, int*);
174extern NCURSES_EXPORT(void) _nc_Free_Argument (const FIELDTYPE*, TypeArgument*);
175extern NCURSES_EXPORT(bool) _nc_Copy_Type (FIELD*, FIELD const *);
176extern NCURSES_EXPORT(void) _nc_Free_Type (FIELD *);
177
178extern NCURSES_EXPORT(int) _nc_Synchronize_Attributes (FIELD*);
179extern NCURSES_EXPORT(int) _nc_Synchronize_Options (FIELD*, Field_Options);
180extern NCURSES_EXPORT(int) _nc_Set_Form_Page (FORM*, int, FIELD*);
181extern NCURSES_EXPORT(int) _nc_Refresh_Current_Field (FORM*);
182extern NCURSES_EXPORT(FIELD *) _nc_First_Active_Field (FORM*);
183extern NCURSES_EXPORT(bool) _nc_Internal_Validation (FORM*);
184extern NCURSES_EXPORT(int) _nc_Set_Current_Field (FORM*, FIELD*);
185extern NCURSES_EXPORT(int) _nc_Position_Form_Cursor (FORM*);
186
Steve Kondikae271bc2015-11-15 02:50:53 +0100187#if NCURSES_INTEROP_FUNCS
188extern NCURSES_EXPORT(FIELDTYPE *) _nc_TYPE_INTEGER(void);
189extern NCURSES_EXPORT(FIELDTYPE *) _nc_TYPE_ALNUM(void);
190extern NCURSES_EXPORT(FIELDTYPE *) _nc_TYPE_ALPHA(void);
191extern NCURSES_EXPORT(FIELDTYPE *) _nc_TYPE_ENUM(void);
192extern NCURSES_EXPORT(FIELDTYPE *) _nc_TYPE_NUMERIC(void);
193extern NCURSES_EXPORT(FIELDTYPE *) _nc_TYPE_REGEXP(void);
194extern NCURSES_EXPORT(FIELDTYPE *) _nc_TYPE_IPV4(void);
195
196extern NCURSES_EXPORT(FIELDTYPE *)
197_nc_generic_fieldtype(bool (*const field_check) (FORM*,
198 FIELD *,
199 const void *),
200 bool (*const char_check) (int,
201 FORM*,
202 FIELD*,
203 const void *),
204 bool (*const next)(FORM*,FIELD*,const void*),
205 bool (*const prev)(FORM*,FIELD*,const void*),
206 void (*freecallback)(void*));
207extern NCURSES_EXPORT(int) _nc_set_generic_fieldtype(FIELD*, FIELDTYPE*, int (*)(void**));
208extern NCURSES_EXPORT(WINDOW*) _nc_form_cursor(const FORM* , int* , int* );
209
210#define INIT_FT_FUNC(func) {func}
211#else
212#define INIT_FT_FUNC(func) func
213#endif
214
215extern NCURSES_EXPORT(void) _nc_get_fieldbuffer(FORM*, FIELD*, FIELD_CELL*);
216
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530217#if USE_WIDEC_SUPPORT
218extern NCURSES_EXPORT(wchar_t *) _nc_Widen_String(char *, int *);
219#endif
220
221#ifdef TRACE
222
Steve Kondikae271bc2015-11-15 02:50:53 +0100223#define returnField(code) TRACE_RETURN1(code,field)
224#define returnFieldPtr(code) TRACE_RETURN1(code,field_ptr)
225#define returnForm(code) TRACE_RETURN1(code,form)
226#define returnFieldType(code) TRACE_RETURN1(code,field_type)
227#define returnFormHook(code) TRACE_RETURN1(code,form_hook)
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530228
229extern NCURSES_EXPORT(FIELD **) _nc_retrace_field_ptr (FIELD **);
230extern NCURSES_EXPORT(FIELD *) _nc_retrace_field (FIELD *);
231extern NCURSES_EXPORT(FIELDTYPE *) _nc_retrace_field_type (FIELDTYPE *);
Steve Kondikae271bc2015-11-15 02:50:53 +0100232extern NCURSES_EXPORT(FORM *) _nc_retrace_form (FORM *);
233extern NCURSES_EXPORT(Form_Hook) _nc_retrace_form_hook (Form_Hook);
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530234
235#else /* !TRACE */
236
237#define returnFieldPtr(code) return code
238#define returnFieldType(code) return code
239#define returnField(code) return code
240#define returnForm(code) return code
241#define returnFormHook(code) return code
242
243#endif /* TRACE/!TRACE */
244
245/*
246 * Use Check_CTYPE_Field() to simplify FIELDTYPE's that use only the ccheck()
247 * function.
248 */
249#if USE_WIDEC_SUPPORT
250#define Check_CTYPE_Field(result, buffer, width, ccheck) \
251 while (*buffer && *buffer == ' ') \
252 buffer++; \
253 if (*buffer) \
254 { \
255 bool blank = FALSE; \
256 int len; \
257 int n; \
258 wchar_t *list = _nc_Widen_String((char *)buffer, &len); \
259 if (list != 0) \
260 { \
261 result = TRUE; \
262 for (n = 0; n < len; ++n) \
263 { \
264 if (blank) \
265 { \
266 if (list[n] != ' ') \
267 { \
268 result = FALSE; \
269 break; \
270 } \
271 } \
272 else if (list[n] == ' ') \
273 { \
274 blank = TRUE; \
275 result = (n + 1 >= width); \
276 } \
277 else if (!ccheck(list[n], NULL)) \
278 { \
279 result = FALSE; \
280 break; \
281 } \
282 } \
283 free(list); \
284 } \
285 }
286#else
287#define Check_CTYPE_Field(result, buffer, width, ccheck) \
288 while (*buffer && *buffer == ' ') \
289 buffer++; \
290 if (*buffer) \
291 { \
292 unsigned char *s = buffer; \
293 int l = -1; \
294 while (*buffer && ccheck(*buffer, NULL)) \
295 buffer++; \
296 l = (int)(buffer - s); \
297 while (*buffer && *buffer == ' ') \
298 buffer++; \
299 result = ((*buffer || (l < width)) ? FALSE : TRUE); \
300 }
301#endif
Steve Kondikae271bc2015-11-15 02:50:53 +0100302/* *INDENT-ON*/
Amit Daniel Kachhape6a01f52011-07-20 11:45:59 +0530303
304#endif /* FORM_PRIV_H */