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