1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /* Copyright (c) 1988 AT&T */
23 /* All Rights Reserved */
24
25
26 /*
27 * Copyright (c) 1997, by Sun Microsystems, Inc.
28 * All rights reserved.
29 */
30
31 #pragma ident "%Z%%M% %I% %E% SMI"
32
33 /*LINTLIBRARY*/
34
35 #include <sys/types.h>
36 #include <stdlib.h>
37 #include "utility.h"
38
39 /*
40 * default field
41 */
42
43 static FIELD default_field =
44 {
45 0, /* status */
46 0, /* rows */
47 0, /* cols */
48 0, /* frow */
49 0, /* fcol */
50 0, /* drows */
51 0, /* dcols */
52 0, /* maxgrow */
53 0, /* nrow */
54 0, /* nbuf */
55 NO_JUSTIFICATION, /* just */
56 0, /* page */
57 0, /* index */
58 ' ', /* pad */
59 A_NORMAL, /* fore */
60 A_NORMAL, /* back */
61 O_VISIBLE |
62 O_ACTIVE |
63 O_PUBLIC |
64 O_EDIT |
65 O_WRAP |
66 O_BLANK |
67 O_AUTOSKIP |
68 O_NULLOK |
69 O_PASSOK |
70 O_STATIC, /* opts */
71 (FIELD *)0, /* snext */
72 (FIELD *)0, /* sprev */
73 (FIELD *)0, /* link */
74 (FORM *)0, /* form */
75 (FIELDTYPE *)0, /* type */
76 (char *)0, /* arg */
77 (char *)0, /* buf */
78 (char *)0, /* usrptr */
79 };
80
81 FIELD * _DEFAULT_FIELD = &default_field;
82
83 /*
84 * MakeType
85 */
86
87 static int
MakeType(FIELD * f,va_list * ap)88 MakeType(FIELD *f, va_list *ap)
89 {
90 int err = 0;
91
92 f->arg = MakeArg(f, ap, &err); /* pick off type specific args */
93
94 if (err) {
95 FreeArg(f); /* release type specific args */
96 f->type = (FIELDTYPE *)0;
97 f->arg = (char *)0;
98 return (FALSE);
99 }
100 IncrType(f->type); /* increment reference count */
101 return (TRUE);
102 }
103
104 /*
105 * CopyType
106 */
107
108 static int
CopyType(FIELD * f,FIELD * fsrc)109 CopyType(FIELD *f, FIELD *fsrc)
110 {
111 int err = 0;
112
113 f->type = fsrc->type; /* copy field type */
114 f->arg = CopyArg(fsrc, &err); /* copy type specific info */
115
116 if (err) {
117 FreeArg(f); /* release type specific args */
118 f->type = (FIELDTYPE *)0;
119 f->arg = (char *)0;
120 return (FALSE);
121 }
122 IncrType(f->type); /* increment reference count */
123 return (TRUE);
124 }
125
126 /*
127 * FreeType
128 */
129
130 static void
FreeType(FIELD * f)131 FreeType(FIELD *f)
132 {
133 DecrType(f->type); /* decrement reference count */
134 FreeArg(f); /* release type specific args */
135 }
136
137 /*
138 * new_field
139 */
140
141 FIELD *
new_field(int rows,int cols,int frow,int fcol,int nrow,int nbuf)142 new_field(int rows, int cols, int frow, int fcol, int nrow, int nbuf)
143
144 /* int rows; number of visible rows */
145 /* int cols; number of visible cols */
146 /* int frow; first row relative to form origin */
147 /* int fcol; first col relative to form origin */
148 /* int nrow; number of off screen rows */
149 /* int nbuf; number of additional buffers */
150 {
151 FIELD *f = (FIELD *) 0;
152 int i, size;
153
154 if (rows > 0 && cols > 0 && frow >= 0 && fcol >= 0 && nrow >= 0 &&
155 nbuf >= 0 && Alloc(f, FIELD)) {
156 *f = *_DEFAULT_FIELD;
157
158 f->rows = rows;
159 f->cols = cols;
160 f->frow = frow;
161 f->fcol = fcol;
162 f->drows = rows + nrow;
163 f->dcols = cols;
164 f->nrow = nrow;
165 f->nbuf = nbuf;
166 f->link = f;
167
168 if (CopyType(f, _DEFAULT_FIELD)) {
169 size = TotalBuf(f);
170
171 if (arrayAlloc(Buf(f), size, char)) {
172 (void) memset(Buf(f), ' ', size);
173
174 for (i = 0; i <= f->nbuf; ++i)
175 *(Buffer(f, i + 1) - 1) = '\0';
176 return (f);
177 }
178 }
179 }
180 (void) free_field(f);
181 return ((FIELD *) 0);
182 }
183
184 /*
185 * dup_field
186 */
187
188 FIELD *
dup_field(FIELD * field,int frow,int fcol)189 dup_field(FIELD *field, int frow, int fcol)
190
191 /* FIELD * field; field to duplicate */
192 /* int frow; first row relative to form origin */
193 /* int fcol; first col relative to form origin */
194 {
195 FIELD *f = (FIELD *) 0;
196 int size;
197
198 if (field && frow >= 0 && fcol >= 0 && Alloc(f, FIELD)) {
199 *f = *_DEFAULT_FIELD;
200
201 f->frow = frow;
202 f->fcol = fcol;
203 f->link = f;
204
205 f->rows = field->rows;
206 f->cols = field->cols;
207 f->drows = field->drows;
208 f->dcols = field->dcols;
209 f->maxgrow = field->maxgrow;
210 f->nrow = field->nrow;
211 f->nbuf = field->nbuf;
212 f->just = field->just;
213 f->fore = field->fore;
214 f->back = field->back;
215 f->pad = field->pad;
216 f->opts = field->opts;
217 f->usrptr = field->usrptr;
218 f->status = Status(field, GROWABLE);
219
220 if (CopyType(f, field)) {
221 size = TotalBuf(f);
222
223 if (arrayAlloc(Buf(f), size, char)) {
224 (void) memcpy(Buf(f), Buf(field), size);
225 return (f);
226 }
227 }
228 }
229 (void) free_field(f);
230 return ((FIELD *) 0);
231 }
232
233 /*
234 * link_field
235 */
236
237 FIELD *
link_field(FIELD * field,int frow,int fcol)238 link_field(FIELD *field, int frow, int fcol)
239
240 /* FIELD * field; field to link to */
241 /* int frow; first row relative to form origin */
242 /* int fcol; first col relative to form origin */
243 {
244 FIELD *f = (FIELD *) 0;
245
246 if (field && frow >= 0 && fcol >= 0 && Alloc(f, FIELD)) {
247 *f = *_DEFAULT_FIELD;
248
249 f->frow = frow;
250 f->fcol = fcol;
251
252 f->link = field->link;
253 field->link = f; /* add field to linked list */
254
255 f->buf = field->buf;
256 f->rows = field->rows;
257 f->cols = field->cols;
258 f->drows = field->drows;
259 f->dcols = field->dcols;
260 f->maxgrow = field->maxgrow;
261 f->nrow = field->nrow;
262 f->nbuf = field->nbuf;
263 f->just = field->just;
264 f->fore = field->fore;
265 f->back = field->back;
266 f->pad = field->pad;
267 f->opts = field->opts;
268 f->usrptr = field->usrptr;
269 f->status = Status(field, GROWABLE);
270
271 if (CopyType(f, field))
272 return (f);
273 }
274 (void) free_field(f);
275 return ((FIELD *) 0);
276 }
277
278 /*
279 * free_field
280 */
281
282 int
free_field(FIELD * f)283 free_field(FIELD *f)
284 {
285 FIELD *p;
286
287 if (!f)
288 return (E_BAD_ARGUMENT);
289
290 if (f->form)
291 return (E_CONNECTED);
292
293 if (f->link != f) { /* check for linked field */
294 for (p = f->link; p->link != f; p = p->link)
295 ;
296 p->link = f->link; /* delete from list */
297 } else
298 Free(Buf(f)); /* free buffer space */
299
300 FreeType(f);
301 Free(f);
302 return (E_OK);
303 }
304
305 /*
306 * field_info
307 */
308
309 int
field_info(FIELD * f,int * rows,int * cols,int * frow,int * fcol,int * nrow,int * nbuf)310 field_info(FIELD *f, int *rows, int *cols, int *frow, int *fcol,
311 int *nrow, int *nbuf)
312
313 /* FIELD *f; field whose information is wanted */
314 /* int *rows; number of visible rows */
315 /* int *cols; number of visible cols */
316 /* int *frow; first row relative to form origin */
317 /* int *fcol; first col relative to form origin */
318 /* int *nrow; number of off screen rows */
319 /* int *nbuf; number of additional buffers */
320 {
321 if (!f)
322 return (E_BAD_ARGUMENT);
323
324 *rows = f->rows;
325 *cols = f->cols;
326 *frow = f->frow;
327 *fcol = f->fcol;
328 *nrow = f->nrow;
329 *nbuf = f->nbuf;
330 return (E_OK);
331 }
332
333 /*
334 * set_max_field
335 */
336
337 int
set_max_field(FIELD * f,int max)338 set_max_field(FIELD *f, int max)
339 {
340 BOOLEAN onerow = OneRow(f);
341
342 if (!f || max && ((onerow && f->dcols > max) ||
343 (!onerow && f->drows > max)))
344 return (E_BAD_ARGUMENT);
345
346 f->maxgrow = max;
347 Clr(f, GROWABLE);
348
349 if (!Opt(f, O_STATIC) && ((!max || onerow && f->dcols < max) ||
350 (!onerow && f->drows < max))) {
351 Set(f, GROWABLE);
352 }
353
354 return (E_OK);
355 }
356
357 /*
358 * dynamic_field_info
359 */
360
361 int
dynamic_field_info(FIELD * f,int * drows,int * dcols,int * max)362 dynamic_field_info(FIELD *f, int *drows, int *dcols, int *max)
363
364 /* FIELD *f; field whose information is wanted */
365 /* int *drows; number of actual rows */
366 /* int *dcols; number of actual cols */
367 /* int *max; maximum growth allowable, else -1 */
368 {
369 if (!f)
370 return (E_BAD_ARGUMENT);
371
372 *drows = f->drows;
373 *dcols = f->dcols;
374 *max = f->maxgrow;
375 return (E_OK);
376 }
377
378 /*
379 * move_field
380 */
381
382 int
move_field(FIELD * f,int frow,int fcol)383 move_field(FIELD *f, int frow, int fcol)
384
385 /* FIELD *f; field to move */
386 /* int frow; first row relative to form origin */
387 /* int fcol; first col relative to form origin */
388 {
389 if (! f || frow < 0 || fcol < 0)
390 return (E_BAD_ARGUMENT);
391
392 if (f->form)
393 return (E_CONNECTED);
394
395 f->frow = frow;
396 f->fcol = fcol;
397 return (E_OK);
398 }
399
400 /*
401 * set_field_type
402 */
403
404 int
set_field_type(FIELD * f,FIELDTYPE * ft,...)405 set_field_type(FIELD *f, FIELDTYPE *ft, ...)
406 {
407 va_list ap;
408 int v = E_SYSTEM_ERROR;
409
410 va_start(ap, ft);
411 f = Field(f);
412 FreeType(f); /* free old type */
413 f->type = ft;
414
415 if (MakeType(f, &ap)) /* set up new type */
416 v = E_OK;
417 va_end(ap);
418 return (v);
419 }
420
421 FIELDTYPE *
field_type(FIELD * f)422 field_type(FIELD *f)
423 {
424 return (Field(f)->type);
425 }
426
427 char *
field_arg(FIELD * f)428 field_arg(FIELD *f)
429 {
430 return (Field(f)->arg);
431 }
432
433 /*
434 * set_new_page
435 */
436
437 int
set_new_page(FIELD * f,int flag)438 set_new_page(FIELD *f, int flag)
439 {
440 f = Field(f);
441
442 if (f->form)
443 return (E_CONNECTED);
444
445 if (flag)
446 Set(f, NEW_PAGE);
447 else
448 Clr(f, NEW_PAGE);
449
450 return (E_OK);
451 }
452
453 int
new_page(FIELD * f)454 new_page(FIELD *f)
455 {
456 if (Status(Field(f), NEW_PAGE))
457 return (TRUE);
458 else
459 return (FALSE);
460 }
461