VarGet.c revision 0568f49b
1444c061aSmrg/*
2444c061aSmrg
3249c3046SmrgCopyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
41477040fSmrg
51477040fSmrgPermission is hereby granted, free of charge, to any person obtaining a
61477040fSmrgcopy of this software and associated documentation files (the "Software"),
71477040fSmrgto deal in the Software without restriction, including without limitation
81477040fSmrgthe rights to use, copy, modify, merge, publish, distribute, sublicense,
91477040fSmrgand/or sell copies of the Software, and to permit persons to whom the
101477040fSmrgSoftware is furnished to do so, subject to the following conditions:
111477040fSmrg
121477040fSmrgThe above copyright notice and this permission notice (including the next
131477040fSmrgparagraph) shall be included in all copies or substantial portions of the
141477040fSmrgSoftware.
151477040fSmrg
161477040fSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
171477040fSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
181477040fSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
191477040fSmrgTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
201477040fSmrgLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
211477040fSmrgFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
221477040fSmrgDEALINGS IN THE SOFTWARE.
23444c061aSmrg
24444c061aSmrg*/
25444c061aSmrg
26444c061aSmrg/*
27444c061aSmrg
28444c061aSmrgCopyright 1985, 1986, 1987, 1988, 1989, 1998  The Open Group
29444c061aSmrg
30444c061aSmrgPermission to use, copy, modify, distribute, and sell this software and its
31444c061aSmrgdocumentation for any purpose is hereby granted without fee, provided that
32444c061aSmrgthe above copyright notice appear in all copies and that both that
33444c061aSmrgcopyright notice and this permission notice appear in supporting
34444c061aSmrgdocumentation.
35444c061aSmrg
36444c061aSmrgThe above copyright notice and this permission notice shall be included in
37444c061aSmrgall copies or substantial portions of the Software.
38444c061aSmrg
39444c061aSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
40444c061aSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
41444c061aSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
42444c061aSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
43444c061aSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
44444c061aSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
45444c061aSmrg
46444c061aSmrgExcept as contained in this notice, the name of The Open Group shall not be
47444c061aSmrgused in advertising or otherwise to promote the sale, use or other dealings
48444c061aSmrgin this Software without prior written authorization from The Open Group.
49444c061aSmrg
50444c061aSmrg*/
51444c061aSmrg
52444c061aSmrg#ifdef HAVE_CONFIG_H
53444c061aSmrg#include <config.h>
54444c061aSmrg#endif
55444c061aSmrg#include "IntrinsicI.h"
56444c061aSmrg#include "VarargsI.h"
57444c061aSmrg#include "StringDefs.h"
58444c061aSmrg
59444c061aSmrgstatic String XtNxtGetTypedArg = "xtGetTypedArg";
60444c061aSmrg
61444c061aSmrgvoid
62444c061aSmrgXtVaGetSubresources(
63444c061aSmrg    Widget widget,
64444c061aSmrg    XtPointer base,
65444c061aSmrg    _Xconst char* name,
66444c061aSmrg    _Xconst char* class,
67444c061aSmrg    XtResourceList resources,
68444c061aSmrg    Cardinal num_resources,
69444c061aSmrg    ...)
70444c061aSmrg{
71444c061aSmrg    va_list                 var;
72444c061aSmrg    XtTypedArgList          args;
73444c061aSmrg    Cardinal                num_args;
74444c061aSmrg    int			    total_count, typed_count;
75444c061aSmrg    WIDGET_TO_APPCON(widget);
76444c061aSmrg
77444c061aSmrg    LOCK_APP(app);
78444c061aSmrg    va_start(var, num_resources);
79444c061aSmrg    _XtCountVaList(var, &total_count, &typed_count);
80444c061aSmrg    va_end(var);
81444c061aSmrg
82444c061aSmrg    va_start(var, num_resources);
83444c061aSmrg
84444c061aSmrg    _XtVaToTypedArgList(var, total_count, &args, &num_args);
85444c061aSmrg
86444c061aSmrg    _XtGetSubresources(widget, base, name, class, resources, num_resources,
87444c061aSmrg	NULL, 0, args, num_args);
88444c061aSmrg
890568f49bSmrg    XtFree((XtPointer)args);
90444c061aSmrg
91444c061aSmrg    va_end(var);
92444c061aSmrg    UNLOCK_APP(app);
93444c061aSmrg}
94444c061aSmrg
95444c061aSmrg
96444c061aSmrgvoid
97444c061aSmrgXtVaGetApplicationResources(Widget widget, XtPointer base, XtResourceList resources, Cardinal num_resources, ...)
98444c061aSmrg{
99444c061aSmrg    va_list                 var;
100444c061aSmrg    XtTypedArgList          args;
101444c061aSmrg    Cardinal                num_args;
102444c061aSmrg    int			    total_count, typed_count;
103444c061aSmrg    WIDGET_TO_APPCON(widget);
104444c061aSmrg
105444c061aSmrg    LOCK_APP(app);
106444c061aSmrg    va_start(var,num_resources);
107444c061aSmrg    _XtCountVaList(var, &total_count, &typed_count);
108444c061aSmrg    va_end(var);
109444c061aSmrg
110444c061aSmrg    va_start(var,num_resources);
111444c061aSmrg
112444c061aSmrg    _XtVaToTypedArgList(var, total_count, &args, &num_args);
113444c061aSmrg
114444c061aSmrg    _XtGetApplicationResources(widget, base, resources, num_resources,
115444c061aSmrg	NULL, 0, args, num_args);
116444c061aSmrg
1170568f49bSmrg    XtFree((XtPointer)args);
118444c061aSmrg
119444c061aSmrg    va_end(var);
120444c061aSmrg    UNLOCK_APP(app);
121444c061aSmrg}
122444c061aSmrg
123444c061aSmrg
124444c061aSmrgstatic void
125444c061aSmrgGetTypedArg(
126444c061aSmrg    Widget              widget,
127444c061aSmrg    XtTypedArgList	typed_arg,
128444c061aSmrg    XtResourceList      resources,
129444c061aSmrg    Cardinal            num_resources)
130444c061aSmrg{
131444c061aSmrg    String              from_type = NULL;
132444c061aSmrg    Cardinal		from_size = 0;
133444c061aSmrg    XrmValue            from_val, to_val;
134444c061aSmrg    register Cardinal   i;
135444c061aSmrg    Arg			arg;
136444c061aSmrg    XtPointer		value;
137444c061aSmrg
138444c061aSmrg    /* note we presume that the XtResourceList to be un-compiled */
139444c061aSmrg
140444c061aSmrg    for (i = 0; i < num_resources; i++) {
141444c061aSmrg        if (StringToName(typed_arg->name) == StringToName(resources[i].resource_name)) {
142444c061aSmrg            from_type = resources[i].resource_type;
143444c061aSmrg	    from_size = resources[i].resource_size;
144444c061aSmrg            break;
145444c061aSmrg        }
146444c061aSmrg    }
147444c061aSmrg
148444c061aSmrg    if (i == num_resources) {
149444c061aSmrg	XtAppWarningMsg(XtWidgetToApplicationContext(widget),
150444c061aSmrg            "unknownType", XtNxtGetTypedArg, XtCXtToolkitError,
151444c061aSmrg            "Unable to find type of resource for conversion",
1520568f49bSmrg            NULL, NULL);
153444c061aSmrg 	return;
154444c061aSmrg    }
155444c061aSmrg
156444c061aSmrg    value = ALLOCATE_LOCAL(from_size);
157444c061aSmrg    if (value == NULL) _XtAllocError(NULL);
158444c061aSmrg    XtSetArg(arg, typed_arg->name, value);
159444c061aSmrg    XtGetValues(widget, &arg, 1);
160444c061aSmrg
161444c061aSmrg    from_val.size = from_size;
162444c061aSmrg    from_val.addr = (XPointer)value;
163444c061aSmrg    to_val.addr = (XPointer)typed_arg->value;
1640568f49bSmrg    to_val.size = (unsigned) typed_arg->size;
165444c061aSmrg
166444c061aSmrg    if (!XtConvertAndStore(widget, from_type, &from_val,
167444c061aSmrg			   typed_arg->type, &to_val)) {
168444c061aSmrg	if (to_val.size > (unsigned) typed_arg->size) {
169444c061aSmrg	    String params[2];
170444c061aSmrg	    Cardinal num_params = 2;
171444c061aSmrg	    params[0] = typed_arg->type;
172444c061aSmrg	    params[1] = XtName(widget);
173444c061aSmrg	    XtAppWarningMsg(XtWidgetToApplicationContext(widget),
174444c061aSmrg		"insufficientSpace", XtNxtGetTypedArg, XtCXtToolkitError,
175444c061aSmrg		"Insufficient space for converted type '%s' in widget '%s'",
176444c061aSmrg		params, &num_params);
177444c061aSmrg	}
178444c061aSmrg	else {
179444c061aSmrg	    String params[3];
180444c061aSmrg	    Cardinal num_params = 3;
181444c061aSmrg	    params[0] = from_type;
182444c061aSmrg	    params[1] = typed_arg->type;
183444c061aSmrg	    params[2] = XtName(widget);
184444c061aSmrg	    XtAppWarningMsg(XtWidgetToApplicationContext(widget),
185444c061aSmrg		"conversionFailed", XtNxtGetTypedArg, XtCXtToolkitError,
186444c061aSmrg		"Type conversion (%s to %s) failed for widget '%s'",
187444c061aSmrg		params, &num_params);
188444c061aSmrg	}
189444c061aSmrg    }
190444c061aSmrg    DEALLOCATE_LOCAL(value);
191444c061aSmrg}
192444c061aSmrg
193444c061aSmrgstatic int
194444c061aSmrgGetNestedArg(
195444c061aSmrg    Widget              widget,
196444c061aSmrg    XtTypedArgList	avlist,
197444c061aSmrg    ArgList             args,
198444c061aSmrg    XtResourceList      resources,
199444c061aSmrg    Cardinal            num_resources)
200444c061aSmrg{
201444c061aSmrg    int         count = 0;
202444c061aSmrg
203444c061aSmrg    for (; avlist->name != NULL; avlist++) {
204444c061aSmrg        if (avlist->type != NULL) {
205444c061aSmrg	    GetTypedArg(widget, avlist, resources, num_resources);
206444c061aSmrg        } else if(strcmp(avlist->name, XtVaNestedList) == 0) {
207444c061aSmrg            count += GetNestedArg(widget, (XtTypedArgList)avlist->value,
208444c061aSmrg				     args, resources, num_resources);
209444c061aSmrg        } else {
210444c061aSmrg            (args+count)->name = avlist->name;
211444c061aSmrg            (args+count)->value = avlist->value;
212444c061aSmrg            ++count;
213444c061aSmrg        }
214444c061aSmrg    }
215444c061aSmrg
216444c061aSmrg    return(count);
217444c061aSmrg}
218444c061aSmrg
219444c061aSmrgvoid
220444c061aSmrgXtVaGetValues(Widget widget, ...)
221444c061aSmrg{
222444c061aSmrg    va_list		var;
223444c061aSmrg    String      	attr;
224444c061aSmrg    ArgList    		args;
225444c061aSmrg    XtTypedArg		typed_arg;
226444c061aSmrg    XtResourceList      resources = (XtResourceList)NULL;
227444c061aSmrg    Cardinal            num_resources;
228444c061aSmrg    int			count, total_count, typed_count;
229444c061aSmrg    WIDGET_TO_APPCON(widget);
230444c061aSmrg
231444c061aSmrg    LOCK_APP(app);
232444c061aSmrg    va_start(var,widget);
233444c061aSmrg
234444c061aSmrg    _XtCountVaList(var, &total_count, &typed_count);
235444c061aSmrg
236444c061aSmrg    if (total_count != typed_count) {
2370568f49bSmrg	size_t limit = (size_t)(total_count - typed_count);
2380568f49bSmrg        args = (ArgList)__XtMalloc((unsigned)(limit * sizeof(Arg)));
239444c061aSmrg    }
240444c061aSmrg    else args = NULL;		/* for lint; really unused */
241444c061aSmrg    va_end(var);
242444c061aSmrg
2430568f49bSmrg    if (args != NULL) {
2440568f49bSmrg	va_start(var,widget);
2450568f49bSmrg	for(attr = va_arg(var, String), count = 0 ; attr != NULL;
2460568f49bSmrg			    attr = va_arg(var, String)) {
2470568f49bSmrg	    if (strcmp(attr, XtVaTypedArg) == 0) {
2480568f49bSmrg		typed_arg.name = va_arg(var, String);
2490568f49bSmrg		typed_arg.type = va_arg(var, String);
2500568f49bSmrg		typed_arg.value = va_arg(var, XtArgVal);
2510568f49bSmrg		typed_arg.size = va_arg(var, int);
2520568f49bSmrg
2530568f49bSmrg		if (resources == NULL) {
2540568f49bSmrg		    XtGetResourceList(XtClass(widget), &resources,&num_resources);
2550568f49bSmrg		}
2560568f49bSmrg
2570568f49bSmrg		GetTypedArg(widget, &typed_arg, resources, num_resources);
2580568f49bSmrg	    } else if (strcmp(attr, XtVaNestedList) == 0) {
2590568f49bSmrg		if (resources == NULL) {
2600568f49bSmrg		    XtGetResourceList(XtClass(widget),&resources, &num_resources);
2610568f49bSmrg		}
2620568f49bSmrg
2630568f49bSmrg		count += GetNestedArg(widget, va_arg(var, XtTypedArgList),
2640568f49bSmrg					 (args+count), resources, num_resources);
2650568f49bSmrg	    } else {
2660568f49bSmrg		args[count].name = attr;
2670568f49bSmrg		args[count].value = va_arg(var, XtArgVal);
2680568f49bSmrg		count ++;
269444c061aSmrg	    }
270444c061aSmrg	}
2710568f49bSmrg	va_end(var);
272444c061aSmrg    }
273444c061aSmrg
2740568f49bSmrg    XtFree((XtPointer)resources);
275444c061aSmrg
2760568f49bSmrg    if (args != NULL) {
2770568f49bSmrg	XtGetValues(widget, args, (Cardinal) count);
278444c061aSmrg	XtFree((XtPointer)args);
279444c061aSmrg    }
280444c061aSmrg    UNLOCK_APP(app);
281444c061aSmrg}
282444c061aSmrg
283444c061aSmrgvoid
284444c061aSmrgXtVaGetSubvalues(XtPointer base,XtResourceList  resources, Cardinal num_resources, ...)
285444c061aSmrg{
286444c061aSmrg    va_list	var;
287444c061aSmrg    ArgList    	args;
288444c061aSmrg    Cardinal   	num_args;
289444c061aSmrg    int		total_count, typed_count;
290444c061aSmrg
291444c061aSmrg    va_start(var,num_resources);
292444c061aSmrg
293444c061aSmrg    _XtCountVaList(var, &total_count, &typed_count);
294444c061aSmrg
295444c061aSmrg    if (typed_count != 0) {
296444c061aSmrg	XtWarning("XtVaTypedArg is an invalid argument to XtVaGetSubvalues()\n");
297444c061aSmrg    }
298444c061aSmrg    va_end(var);
299444c061aSmrg
300444c061aSmrg    va_start(var,num_resources);
301444c061aSmrg    _XtVaToArgList((Widget)NULL, var, total_count, &args, &num_args);
302444c061aSmrg    va_end(var);
303444c061aSmrg
304444c061aSmrg    XtGetSubvalues(base, resources, num_resources, args, num_args);
305444c061aSmrg
3060568f49bSmrg    XtFree((XtPointer)args);
307444c061aSmrg}
308