VarGet.c revision 249c3046
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
89444c061aSmrg    if (num_args != 0) {
90444c061aSmrg	XtFree((XtPointer)args);
91444c061aSmrg    }
92444c061aSmrg
93444c061aSmrg    va_end(var);
94444c061aSmrg    UNLOCK_APP(app);
95444c061aSmrg}
96444c061aSmrg
97444c061aSmrg
98444c061aSmrgvoid
99444c061aSmrgXtVaGetApplicationResources(Widget widget, XtPointer base, XtResourceList resources, Cardinal num_resources, ...)
100444c061aSmrg{
101444c061aSmrg    va_list                 var;
102444c061aSmrg    XtTypedArgList          args;
103444c061aSmrg    Cardinal                num_args;
104444c061aSmrg    int			    total_count, typed_count;
105444c061aSmrg    WIDGET_TO_APPCON(widget);
106444c061aSmrg
107444c061aSmrg    LOCK_APP(app);
108444c061aSmrg    va_start(var,num_resources);
109444c061aSmrg    _XtCountVaList(var, &total_count, &typed_count);
110444c061aSmrg    va_end(var);
111444c061aSmrg
112444c061aSmrg    va_start(var,num_resources);
113444c061aSmrg
114444c061aSmrg    _XtVaToTypedArgList(var, total_count, &args, &num_args);
115444c061aSmrg
116444c061aSmrg    _XtGetApplicationResources(widget, base, resources, num_resources,
117444c061aSmrg	NULL, 0, args, num_args);
118444c061aSmrg
119444c061aSmrg    if (num_args != 0) {
120444c061aSmrg	XtFree((XtPointer)args);
121444c061aSmrg    }
122444c061aSmrg
123444c061aSmrg    va_end(var);
124444c061aSmrg    UNLOCK_APP(app);
125444c061aSmrg}
126444c061aSmrg
127444c061aSmrg
128444c061aSmrgstatic void
129444c061aSmrgGetTypedArg(
130444c061aSmrg    Widget              widget,
131444c061aSmrg    XtTypedArgList	typed_arg,
132444c061aSmrg    XtResourceList      resources,
133444c061aSmrg    Cardinal            num_resources)
134444c061aSmrg{
135444c061aSmrg    String              from_type = NULL;
136444c061aSmrg    Cardinal		from_size = 0;
137444c061aSmrg    XrmValue            from_val, to_val;
138444c061aSmrg    register Cardinal   i;
139444c061aSmrg    Arg			arg;
140444c061aSmrg    XtPointer		value;
141444c061aSmrg
142444c061aSmrg    /* note we presume that the XtResourceList to be un-compiled */
143444c061aSmrg
144444c061aSmrg    for (i = 0; i < num_resources; i++) {
145444c061aSmrg        if (StringToName(typed_arg->name) == StringToName(resources[i].resource_name)) {
146444c061aSmrg            from_type = resources[i].resource_type;
147444c061aSmrg	    from_size = resources[i].resource_size;
148444c061aSmrg            break;
149444c061aSmrg        }
150444c061aSmrg    }
151444c061aSmrg
152444c061aSmrg    if (i == num_resources) {
153444c061aSmrg	XtAppWarningMsg(XtWidgetToApplicationContext(widget),
154444c061aSmrg            "unknownType", XtNxtGetTypedArg, XtCXtToolkitError,
155444c061aSmrg            "Unable to find type of resource for conversion",
156444c061aSmrg            (String *)NULL, (Cardinal *)NULL);
157444c061aSmrg 	return;
158444c061aSmrg    }
159444c061aSmrg
160444c061aSmrg    value = ALLOCATE_LOCAL(from_size);
161444c061aSmrg    if (value == NULL) _XtAllocError(NULL);
162444c061aSmrg    XtSetArg(arg, typed_arg->name, value);
163444c061aSmrg    XtGetValues(widget, &arg, 1);
164444c061aSmrg
165444c061aSmrg    from_val.size = from_size;
166444c061aSmrg    from_val.addr = (XPointer)value;
167444c061aSmrg    to_val.addr = (XPointer)typed_arg->value;
168444c061aSmrg    to_val.size = typed_arg->size;
169444c061aSmrg
170444c061aSmrg    if (!XtConvertAndStore(widget, from_type, &from_val,
171444c061aSmrg			   typed_arg->type, &to_val)) {
172444c061aSmrg	if (to_val.size > (unsigned) typed_arg->size) {
173444c061aSmrg	    String params[2];
174444c061aSmrg	    Cardinal num_params = 2;
175444c061aSmrg	    params[0] = typed_arg->type;
176444c061aSmrg	    params[1] = XtName(widget);
177444c061aSmrg	    XtAppWarningMsg(XtWidgetToApplicationContext(widget),
178444c061aSmrg		"insufficientSpace", XtNxtGetTypedArg, XtCXtToolkitError,
179444c061aSmrg		"Insufficient space for converted type '%s' in widget '%s'",
180444c061aSmrg		params, &num_params);
181444c061aSmrg	}
182444c061aSmrg	else {
183444c061aSmrg	    String params[3];
184444c061aSmrg	    Cardinal num_params = 3;
185444c061aSmrg	    params[0] = from_type;
186444c061aSmrg	    params[1] = typed_arg->type;
187444c061aSmrg	    params[2] = XtName(widget);
188444c061aSmrg	    XtAppWarningMsg(XtWidgetToApplicationContext(widget),
189444c061aSmrg		"conversionFailed", XtNxtGetTypedArg, XtCXtToolkitError,
190444c061aSmrg		"Type conversion (%s to %s) failed for widget '%s'",
191444c061aSmrg		params, &num_params);
192444c061aSmrg	}
193444c061aSmrg    }
194444c061aSmrg    DEALLOCATE_LOCAL(value);
195444c061aSmrg}
196444c061aSmrg
197444c061aSmrgstatic int
198444c061aSmrgGetNestedArg(
199444c061aSmrg    Widget              widget,
200444c061aSmrg    XtTypedArgList	avlist,
201444c061aSmrg    ArgList             args,
202444c061aSmrg    XtResourceList      resources,
203444c061aSmrg    Cardinal            num_resources)
204444c061aSmrg{
205444c061aSmrg    int         count = 0;
206444c061aSmrg
207444c061aSmrg    for (; avlist->name != NULL; avlist++) {
208444c061aSmrg        if (avlist->type != NULL) {
209444c061aSmrg	    GetTypedArg(widget, avlist, resources, num_resources);
210444c061aSmrg        } else if(strcmp(avlist->name, XtVaNestedList) == 0) {
211444c061aSmrg            count += GetNestedArg(widget, (XtTypedArgList)avlist->value,
212444c061aSmrg				     args, resources, num_resources);
213444c061aSmrg        } else {
214444c061aSmrg            (args+count)->name = avlist->name;
215444c061aSmrg            (args+count)->value = avlist->value;
216444c061aSmrg            ++count;
217444c061aSmrg        }
218444c061aSmrg    }
219444c061aSmrg
220444c061aSmrg    return(count);
221444c061aSmrg}
222444c061aSmrg
223444c061aSmrgvoid
224444c061aSmrgXtVaGetValues(Widget widget, ...)
225444c061aSmrg{
226444c061aSmrg    va_list		var;
227444c061aSmrg    String      	attr;
228444c061aSmrg    ArgList    		args;
229444c061aSmrg    XtTypedArg		typed_arg;
230444c061aSmrg    XtResourceList      resources = (XtResourceList)NULL;
231444c061aSmrg    Cardinal            num_resources;
232444c061aSmrg    int			count, total_count, typed_count;
233444c061aSmrg    WIDGET_TO_APPCON(widget);
234444c061aSmrg
235444c061aSmrg    LOCK_APP(app);
236444c061aSmrg    va_start(var,widget);
237444c061aSmrg
238444c061aSmrg    _XtCountVaList(var, &total_count, &typed_count);
239444c061aSmrg
240444c061aSmrg    if (total_count != typed_count) {
241444c061aSmrg        args = (ArgList)__XtMalloc((unsigned)((total_count - typed_count)
242444c061aSmrg				* sizeof(Arg)));
243444c061aSmrg    }
244444c061aSmrg    else args = NULL;		/* for lint; really unused */
245444c061aSmrg    va_end(var);
246444c061aSmrg
247444c061aSmrg    va_start(var,widget);
248444c061aSmrg    for(attr = va_arg(var, String), count = 0 ; attr != NULL;
249444c061aSmrg			attr = va_arg(var, String)) {
250444c061aSmrg	if (strcmp(attr, XtVaTypedArg) == 0) {
251444c061aSmrg	    typed_arg.name = va_arg(var, String);
252444c061aSmrg	    typed_arg.type = va_arg(var, String);
253444c061aSmrg	    typed_arg.value = va_arg(var, XtArgVal);
254444c061aSmrg	    typed_arg.size = va_arg(var, int);
255444c061aSmrg
256444c061aSmrg	    if (resources == NULL) {
257444c061aSmrg		XtGetResourceList(XtClass(widget), &resources,&num_resources);
258444c061aSmrg	    }
259444c061aSmrg
260444c061aSmrg	    GetTypedArg(widget, &typed_arg, resources, num_resources);
261444c061aSmrg	} else if (strcmp(attr, XtVaNestedList) == 0) {
262444c061aSmrg	    if (resources == NULL) {
263444c061aSmrg		XtGetResourceList(XtClass(widget),&resources, &num_resources);
264444c061aSmrg	    }
265444c061aSmrg
266444c061aSmrg	    count += GetNestedArg(widget, va_arg(var, XtTypedArgList),
267444c061aSmrg				     (args+count), resources, num_resources);
268444c061aSmrg	} else {
269444c061aSmrg	    args[count].name = attr;
270444c061aSmrg	    args[count].value = va_arg(var, XtArgVal);
271444c061aSmrg	    count ++;
272444c061aSmrg	}
273444c061aSmrg    }
274444c061aSmrg    va_end(var);
275444c061aSmrg
276444c061aSmrg    if (resources != (XtResourceList)NULL) {
277444c061aSmrg	XtFree((XtPointer)resources);
278444c061aSmrg    }
279444c061aSmrg
280444c061aSmrg    if (total_count != typed_count) {
281444c061aSmrg	XtGetValues(widget, args, count);
282444c061aSmrg	XtFree((XtPointer)args);
283444c061aSmrg    }
284444c061aSmrg    UNLOCK_APP(app);
285444c061aSmrg}
286444c061aSmrg
287444c061aSmrgvoid
288444c061aSmrgXtVaGetSubvalues(XtPointer base,XtResourceList  resources, Cardinal num_resources, ...)
289444c061aSmrg{
290444c061aSmrg    va_list	var;
291444c061aSmrg    ArgList    	args;
292444c061aSmrg    Cardinal   	num_args;
293444c061aSmrg    int		total_count, typed_count;
294444c061aSmrg
295444c061aSmrg    va_start(var,num_resources);
296444c061aSmrg
297444c061aSmrg    _XtCountVaList(var, &total_count, &typed_count);
298444c061aSmrg
299444c061aSmrg    if (typed_count != 0) {
300444c061aSmrg	XtWarning("XtVaTypedArg is an invalid argument to XtVaGetSubvalues()\n");
301444c061aSmrg    }
302444c061aSmrg    va_end(var);
303444c061aSmrg
304444c061aSmrg    va_start(var,num_resources);
305444c061aSmrg    _XtVaToArgList((Widget)NULL, var, total_count, &args, &num_args);
306444c061aSmrg    va_end(var);
307444c061aSmrg
308444c061aSmrg    XtGetSubvalues(base, resources, num_resources, args, num_args);
309444c061aSmrg
310444c061aSmrg    if (num_args != 0) {
311444c061aSmrg        XtFree((XtPointer)args);
312444c061aSmrg    }
313444c061aSmrg}
314