Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / form.h @ 13

History | View | Annotate | Download (17 KB)

1 13 up20180614
/*        $NetBSD: form.h,v 1.23 2015/09/07 15:50:49 joerg Exp $        */
2
3
/*-
4
 * Copyright (c) 1998-1999 Brett Lymn
5
 *               (blymn@baea.com.au, brett_lymn@yahoo.com.au)
6
 * All rights reserved.
7
 *
8
 * This code has been donated to The NetBSD Foundation by the Author.
9
 *
10
 * Redistribution and use in source and binary forms, with or without
11
 * modification, are permitted provided that the following conditions
12
 * are met:
13
 * 1. Redistributions of source code must retain the above copyright
14
 *    notice, this list of conditions and the following disclaimer.
15
 * 2. The name of the author may not be used to endorse or promote products
16
 *    derived from this software without specific prior written permission
17
 *
18
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
 *
29
 *
30
 */
31
32
#ifndef FORM_H
33
#define FORM_H 1
34
#include <sys/queue.h>
35
#include <stdarg.h>
36
#include <curses.h>
37
#include <eti.h>
38
39
/* Define the types of field justification that can be used. */
40
#define NO_JUSTIFICATION  (0)
41
#define JUSTIFY_RIGHT     (1)
42
#define JUSTIFY_LEFT      (2)
43
#define JUSTIFY_CENTER    (3)
44
45
/* Define the max and min valid justification styles for range checking */
46
#define MIN_JUST_STYLE    NO_JUSTIFICATION
47
#define MAX_JUST_STYLE    JUSTIFY_CENTER
48
49
/* Options for the fields */
50
typedef unsigned int Form_Options;
51
52
/* form options */
53
#define O_BS_OVERLOAD (0x001)
54
#define O_NL_OVERLOAD (0x002)
55
56
/* field options */
57
#define O_VISIBLE  (0x001)  /* Field is visible */
58
#define O_ACTIVE   (0x002)  /* Field is active in the form */
59
#define O_PUBLIC   (0x004)  /* The contents entered into the field is echoed */
60
#define O_EDIT     (0x008)  /* Can edit the field */
61
#define O_WRAP     (0x010)  /* The field contents can line wrap */
62
#define O_BLANK    (0x020)  /* Blank the field on modification */
63
#define O_AUTOSKIP (0x040)  /* Skip to next field when current is full */
64
#define O_NULLOK   (0x080)  /* Field is allowed to contain no data */
65
#define O_STATIC   (0x100)  /* Field is not dynamic */
66
#define O_PASSOK   (0x200)  /* An umodified field is OK */
67
#define O_REFORMAT (0x400)  /* Insert newlines at linebreaks on buffer get */
68
69
/*
70
 * Form driver requests - be VERY careful about changing the ordering
71
 * of the requests below.  The form driver code depends on a particular
72
 * order for the requests.
73
 */
74
#define REQ_MIN_REQUEST   (KEY_MAX + 0x101) /* must equal value of the
75
                                               first request */
76
77
#define REQ_NEXT_PAGE     (KEY_MAX + 0x101) /* next page in form */
78
#define REQ_PREV_PAGE     (KEY_MAX + 0x102) /* previous page in form */
79
#define REQ_FIRST_PAGE    (KEY_MAX + 0x103) /* goto first page in form */
80
#define REQ_LAST_PAGE     (KEY_MAX + 0x104) /* goto last page in form */
81
82
#define REQ_NEXT_FIELD    (KEY_MAX + 0x105) /* move to the next field */
83
#define REQ_PREV_FIELD    (KEY_MAX + 0x106) /* move to the previous field */
84
#define REQ_FIRST_FIELD   (KEY_MAX + 0x107) /* goto the first field */
85
#define REQ_LAST_FIELD    (KEY_MAX + 0x108) /* goto the last field */
86
87
#define REQ_SNEXT_FIELD   (KEY_MAX + 0x109) /* move to the next field
88
                                               in sorted order */
89
#define REQ_SPREV_FIELD   (KEY_MAX + 0x10a) /* move to the prev field
90
                                               in sorted order */
91
#define REQ_SFIRST_FIELD  (KEY_MAX + 0x10b) /* move to the first
92
                                               sorted field */
93
#define REQ_SLAST_FIELD   (KEY_MAX + 0x10c) /* move to the last sorted
94
                                               field */
95
96
#define REQ_LEFT_FIELD    (KEY_MAX + 0x10d) /* go left one field */
97
#define REQ_RIGHT_FIELD   (KEY_MAX + 0x10e) /* go right one field */
98
#define REQ_UP_FIELD      (KEY_MAX + 0x10f) /* go up one field */
99
#define REQ_DOWN_FIELD    (KEY_MAX + 0x110) /* go down one field */
100
101
#define REQ_NEXT_CHAR     (KEY_MAX + 0x111) /* move to the next char
102
                                               in field */
103
#define REQ_PREV_CHAR     (KEY_MAX + 0x112) /* move to the previous
104
                                               char in field */
105
#define REQ_NEXT_LINE     (KEY_MAX + 0x113) /* go to the next line in
106
                                               the field */
107
#define REQ_PREV_LINE     (KEY_MAX + 0x114) /* go to the previous line
108
                                               in the field */
109
#define REQ_NEXT_WORD     (KEY_MAX + 0x115) /* go to the next word in
110
                                               the field */
111
#define REQ_PREV_WORD     (KEY_MAX + 0x116) /* go to the previous word
112
                                               in the field */
113
#define REQ_BEG_FIELD     (KEY_MAX + 0x117) /* go to the beginning of
114
                                               the field */
115
#define REQ_END_FIELD     (KEY_MAX + 0x118) /* go to the end of the field */
116
#define REQ_BEG_LINE      (KEY_MAX + 0x119) /* go to the beginning of
117
                                               the line */
118
#define REQ_END_LINE      (KEY_MAX + 0x11a) /* go to the end of the
119
                                               line */
120
#define REQ_LEFT_CHAR     (KEY_MAX + 0x11b) /* move left in the field */
121
#define REQ_RIGHT_CHAR    (KEY_MAX + 0x11c) /* move right in the field */
122
#define REQ_UP_CHAR       (KEY_MAX + 0x11d) /* move up in the field */
123
#define REQ_DOWN_CHAR     (KEY_MAX + 0x11e) /* move down in the field */
124
125
#define REQ_NEW_LINE      (KEY_MAX + 0x11f) /* insert/overlay a new line */
126
#define REQ_INS_CHAR      (KEY_MAX + 0x120) /* insert a blank char at
127
                                               the cursor */
128
#define REQ_INS_LINE      (KEY_MAX + 0x121) /* insert a blank line at
129
                                               the cursor */
130
131
#define REQ_DEL_CHAR      (KEY_MAX + 0x122) /* delete the current character */
132
#define REQ_DEL_PREV      (KEY_MAX + 0x123) /* delete the character
133
                                               before the current */
134
#define REQ_DEL_LINE      (KEY_MAX + 0x124) /* delete the current line */
135
#define REQ_DEL_WORD      (KEY_MAX + 0x125) /* delete the word at the cursor */
136
#define REQ_CLR_EOL       (KEY_MAX + 0x126) /* clear to the end of the line */
137
#define REQ_CLR_EOF       (KEY_MAX + 0x127) /* clear to the end of the field */
138
#define REQ_CLR_FIELD     (KEY_MAX + 0x128) /* clear the field */
139
140
#define REQ_OVL_MODE      (KEY_MAX + 0x129) /* overlay mode */
141
#define REQ_INS_MODE      (KEY_MAX + 0x12a) /* insert mode */
142
143
#define REQ_SCR_FLINE     (KEY_MAX + 0x12b) /* scroll field forward one line */
144
#define REQ_SCR_BLINE     (KEY_MAX + 0x12c) /* scroll field backward
145
                                               one line */
146
#define REQ_SCR_FPAGE     (KEY_MAX + 0x12d) /* scroll field forward one page */
147
#define REQ_SCR_BPAGE     (KEY_MAX + 0x12e) /* scroll field backward
148
                                               one page */
149
#define REQ_SCR_FHPAGE    (KEY_MAX + 0x12f) /* scroll field forward
150
                                               half a page */
151
#define REQ_SCR_BHPAGE    (KEY_MAX + 0x130) /* scroll field backward
152
                                               half a page */
153
154
#define REQ_SCR_FCHAR     (KEY_MAX + 0x131) /* horizontal scroll
155
                                               forward a character */
156
#define REQ_SCR_BCHAR     (KEY_MAX + 0x132) /* horizontal scroll
157
                                               backward a character */
158
#define REQ_SCR_HFLINE    (KEY_MAX + 0x133) /* horizontal scroll
159
                                               forward a line */
160
#define REQ_SCR_HBLINE    (KEY_MAX + 0x134) /* horizontal scroll
161
                                               backward a line */
162
#define REQ_SCR_HFHALF    (KEY_MAX + 0x135) /* horizontal scroll
163
                                               forward half a line */
164
#define REQ_SCR_HBHALF    (KEY_MAX + 0x136) /* horizontal scroll
165
                                               backward half a line */
166
167
#define REQ_VALIDATION    (KEY_MAX + 0x137) /* validate the field */
168
#define REQ_PREV_CHOICE   (KEY_MAX + 0x138) /* display previous field choice */
169
#define REQ_NEXT_CHOICE   (KEY_MAX + 0x139) /* display next field choice */
170
171
#define REQ_MAX_COMMAND   (KEY_MAX + 0x139) /* must match the last
172
                                               driver command */
173
174
/* The following defines are for ncurses compatibility */
175
#define MIN_FORM_COMMAND        REQ_MIN_REQUEST
176
#define MAX_FORM_COMMAND        REQ_MAX_COMMAND
177
178
179
typedef struct _form_string {
180
        size_t allocated;
181
        unsigned int length;
182
        char *string;
183
} FORM_STR;
184
185
typedef struct _form_field FIELD;
186
typedef struct _form_struct FORM;
187
typedef struct _form_fieldtype FIELDTYPE;
188
189
typedef struct _formi_page_struct _FORMI_PAGE_START;
190
typedef struct formi_type_link_struct _FORMI_TYPE_LINK;
191
typedef struct _formi_field_lines _FORMI_FIELD_LINES;
192
193
194
typedef void (*Form_Hook)(FORM *);
195
196
/* definition of a field in the form */
197
struct _form_field {
198
        unsigned int rows; /* rows in the field */
199
        unsigned int cols; /* columns in the field */
200
        unsigned int drows; /* dynamic rows */
201
        unsigned int dcols; /* dynamic columns */
202
        unsigned int max; /* maximum growth */
203
        unsigned int form_row; /* starting row in the form subwindow */
204
        unsigned int form_col; /* starting column in the form subwindow */
205
        unsigned int nrows; /* number of off screen rows */
206
        int index; /* index of this field in form fields array. */
207
        int nbuf; /* number of buffers associated with this field */
208
        int buf0_status; /* set to true if buffer 0 has changed. */
209
        int justification; /* justification style of the field */
210
        int overlay; /* set to true if field is in overlay mode */
211
        _FORMI_FIELD_LINES *cur_line; /* pointer to the current line cursor
212
                                         is on */
213
        unsigned int start_char; /* starting char in string (horiz scroll) */
214
        _FORMI_FIELD_LINES *start_line; /* start line in field (vert scroll) */
215
        unsigned int row_count; /* number of rows actually used in field */
216
        unsigned int row_xpos; /* char offset of cursor in field, not same
217
                                  as cursor_xpos due to tab expansion */
218
        unsigned int cursor_xpos; /* x pos of cursor in field */
219
        unsigned int cursor_ypos; /* y pos of cursor in field */
220
        short page_break; /* start of a new page on the form if 1 */
221
        short page; /* number of the page this field is on */
222
        chtype fore; /* character attributes for the foreground */
223
        chtype back; /* character attributes for the background */
224
        int pad; /* padding character */
225
        Form_Options opts; /* options for the field */
226
        FORM *parent; /* the form this field is bound to, if any */
227
        FIELD *up; /* field above this one */
228
        FIELD *down; /* field below this one */
229
        FIELD *left; /* field to the left of this one */
230
        FIELD *right; /* field to the right of this one */
231
        void *userptr;  /* user defined pointer. */
232
        FIELD *link; /* used if fields are linked */
233
        FIELDTYPE *type; /* type struct for the field */
234
        TAILQ_ENTRY(_form_field) glue; /* tail queue glue for sorting fields */
235
        char *args; /* args for field type. */
236
        _FORMI_FIELD_LINES *alines; /* array of the starts and ends of lines */
237
        _FORMI_FIELD_LINES *free; /* list of lines available for reuse */
238
        FORM_STR *buffers; /* array of buffers for the field */
239
};
240
241
/* define the types of fields we can have */
242
extern FIELDTYPE *TYPE_ALNUM;
243
extern FIELDTYPE *TYPE_ALPHA;
244
extern FIELDTYPE *TYPE_ENUM;
245
extern FIELDTYPE *TYPE_INTEGER;
246
extern FIELDTYPE *TYPE_NUMERIC;
247
extern FIELDTYPE *TYPE_REGEXP;
248
extern FIELDTYPE *TYPE_IPV4;
249
extern FIELDTYPE *TYPE_IPV6;
250
extern FIELDTYPE *TYPE_USER;
251
252
/* definition of a field type. */
253
struct _form_fieldtype {
254
        unsigned flags; /* status of the type */
255
        unsigned refcount; /* in use if > 0 */
256
        _FORMI_TYPE_LINK *link; /* set if this type is linked */
257
258
        char * (*make_args)(va_list *); /* make the args for the type */
259
        char * (*copy_args)(char *); /* copy the args for the type */
260
        void (*free_args)(char *); /* free storage used by the args */
261
        int (*field_check)(FIELD *, char *); /* field validation routine */
262
        int (*char_check)(int, char *); /* char validation routine */
263
        int (*next_choice)(FIELD *, char *); /* function to select next
264
                                                choice */
265
        int (*prev_choice)(FIELD *, char *); /* function to select prev
266
                                                choice */
267
};
268
269
/*definition of a form */
270
271
struct _form_struct {
272
        int in_init; /* true if performing a init or term function */
273
        int posted; /* the form is posted */
274
        int wrap; /* wrap from last field to first field if true */
275
        WINDOW *win; /* window for the form */
276
        WINDOW *subwin; /* subwindow for the form */
277
        WINDOW *scrwin; /* this is the window to use for output */
278
        void *userptr; /* user defined pointer */
279
        Form_Options opts; /* options for the form */
280
        Form_Hook form_init; /* function called when form posted and
281
                                after page change */
282
        Form_Hook form_term; /* function called when form is unposted and
283
                                before page change */
284
        Form_Hook field_init; /* function called when form posted and after
285
                                 current field changes */
286
        Form_Hook field_term; /* function called when form unposted and
287
                                 before current field changes */
288
        int field_count; /* number of fields attached */
289
        int cur_field; /* current field */
290
        int page; /* current page of form */
291
        int max_page; /* number of pages in the form */
292
        _FORMI_PAGE_START *page_starts; /* dynamic array of fields that start
293
                                           the pages */
294
        TAILQ_HEAD(_formi_sort_head, _form_field) sorted_fields; /* sorted field
295
                                                                list */
296
        FIELD **fields; /* array of fields attached to this form. */
297
};
298
299
/* Public function prototypes. */
300
__BEGIN_DECLS
301
302
FIELD       *current_field(FORM *);
303
int          data_ahead(FORM *);
304
int          data_behind(FORM *);
305
FIELD       *dup_field(FIELD *, int, int);
306
int          dynamic_field_info(FIELD *, int *, int *, int *);
307
char        *field_arg(FIELD *);
308
chtype       field_back(FIELD *);
309
char        *field_buffer(FIELD *, int);
310
int          field_count(FORM *);
311
chtype       field_fore(FIELD *);
312
int          field_index(FIELD *);
313
int          field_info(FIELD *, int *, int *, int *, int *, int *, int *);
314
Form_Hook    field_init(FORM *);
315
int          field_just(FIELD *);
316
Form_Options field_opts(FIELD *);
317
int          field_opts_off(FIELD *, Form_Options);
318
int          field_opts_on(FIELD *, Form_Options);
319
int          field_pad(FIELD *);
320
int          field_status(FIELD *);
321
Form_Hook    field_term(FORM *);
322
FIELDTYPE   *field_type(FIELD *);
323
void        *field_userptr(FIELD *);
324
int          form_driver(FORM *, int);
325
FIELD      **form_fields(FORM *);
326
Form_Hook    form_init(FORM *);
327
int          form_max_page(FORM *);
328
Form_Options form_opts(FORM *);
329
int          form_opts_off(FORM *, Form_Options);
330
int          form_opts_on(FORM *, Form_Options);
331
int          form_page(FORM *);
332
WINDOW      *form_sub(FORM *);
333
Form_Hook    form_term(FORM *);
334
void        *form_userptr(FORM *);
335
WINDOW      *form_win(FORM *);
336
int          free_field(FIELD *);
337
int          free_fieldtype(FIELDTYPE *);
338
int          free_form(FORM *);
339
FIELD       *link_field(FIELD *, int, int);
340
FIELDTYPE   *link_fieldtype(FIELDTYPE *, FIELDTYPE *);
341
int          move_field(FIELD *, int, int);
342
FIELD       *new_field(int, int, int, int, int, int);
343
FIELDTYPE   *new_fieldtype(int (* field_check)(FIELD *, char *),
344
                           int (* char_check)(int, char *));
345
FORM        *new_form(FIELD **);
346
int          new_page(FIELD *);
347
int          pos_form_cursor(FORM *);
348
int          post_form(FORM *);
349
int          scale_form(FORM *, int *, int *);
350
int          set_current_field(FORM *, FIELD *);
351
int          set_field_back(FIELD *, chtype);
352
int          set_field_buffer(FIELD *, int, const char *);
353
int          set_field_fore(FIELD *, chtype);
354
int          set_field_init(FORM *, Form_Hook);
355
int          set_field_just(FIELD *, int);
356
int          set_field_opts(FIELD *, Form_Options);
357
int          set_field_pad(FIELD *, int);
358
int          set_field_printf(FIELD *, int, char *, ...) __printflike(3, 4);
359
int          set_field_status(FIELD *, int);
360
int          set_field_term(FORM *, Form_Hook);
361
int          set_field_type(FIELD *, FIELDTYPE *, ...);
362
int          set_field_userptr(FIELD *, void *);
363
int          set_fieldtype_arg(FIELDTYPE *, char *(*)(va_list *),
364
                               char *(*)(char *),
365
                               void (*)(char *));
366
int          set_fieldtype_choice(FIELDTYPE *, int (*)(FIELD *, char *),
367
                                  int (*)(FIELD *, char *));
368
int          set_form_fields(FORM *, FIELD **);
369
int          set_form_init(FORM *, Form_Hook);
370
int          set_form_opts(FORM *, Form_Options);
371
int          set_form_page(FORM *, int);
372
int          set_form_sub(FORM *, WINDOW *);
373
int          set_form_term(FORM *, Form_Hook);
374
int          set_form_userptr(FORM *, void *);
375
int          set_form_win(FORM *, WINDOW *);
376
int          set_max_field(FIELD *, int);
377
int          set_new_page(FIELD *, int);
378
int          unpost_form(FORM *);
379
380
__END_DECLS
381
382
#endif /* FORM_H */