xref: /illumos-gate/usr/src/lib/libeti/form/common/field.c (revision 581cede61ac9c14d8d4ea452562a567189eead78)
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
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
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
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 *
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 *
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 *
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
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
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
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
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
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
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 *
422 field_type(FIELD *f)
423 {
424 	return (Field(f)->type);
425 }
426 
427 char *
428 field_arg(FIELD *f)
429 {
430 	return (Field(f)->arg);
431 }
432 
433 	/*
434 	 *  set_new_page
435 	 */
436 
437 int
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
454 new_page(FIELD *f)
455 {
456 	if (Status(Field(f), NEW_PAGE))
457 		return (TRUE);
458 	else
459 		return (FALSE);
460 }
461