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