Resources.c revision 1477040f
1444c061aSmrg/* $Xorg: Resources.c,v 1.4 2001/02/09 02:03:56 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.
241477040fSmrg
251477040fSmrgCopyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
26444c061aSmrg
27444c061aSmrg                        All Rights Reserved
28444c061aSmrg
291477040fSmrgPermission to use, copy, modify, and distribute this software and its
301477040fSmrgdocumentation for any purpose and without fee is hereby granted,
31444c061aSmrgprovided that the above copyright notice appear in all copies and that
321477040fSmrgboth that copyright notice and this permission notice appear in
331477040fSmrgsupporting documentation, and that the name of Digital not be
34444c061aSmrgused in advertising or publicity pertaining to distribution of the
351477040fSmrgsoftware without specific, written prior permission.
36444c061aSmrg
37444c061aSmrgDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
38444c061aSmrgALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
39444c061aSmrgDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
40444c061aSmrgANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
41444c061aSmrgWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
42444c061aSmrgARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
43444c061aSmrgSOFTWARE.
44444c061aSmrg
45444c061aSmrg******************************************************************/
46444c061aSmrg
47444c061aSmrg/*
48444c061aSmrg
49444c061aSmrgCopyright 1987, 1988, 1994, 1998  The Open Group
50444c061aSmrg
51444c061aSmrgPermission to use, copy, modify, distribute, and sell this software and its
52444c061aSmrgdocumentation for any purpose is hereby granted without fee, provided that
53444c061aSmrgthe above copyright notice appear in all copies and that both that
54444c061aSmrgcopyright notice and this permission notice appear in supporting
55444c061aSmrgdocumentation.
56444c061aSmrg
57444c061aSmrgThe above copyright notice and this permission notice shall be included in
58444c061aSmrgall copies or substantial portions of the Software.
59444c061aSmrg
60444c061aSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
61444c061aSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
62444c061aSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
63444c061aSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
64444c061aSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
65444c061aSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
66444c061aSmrg
67444c061aSmrgExcept as contained in this notice, the name of The Open Group shall not be
68444c061aSmrgused in advertising or otherwise to promote the sale, use or other dealings
69444c061aSmrgin this Software without prior written authorization from The Open Group.
70444c061aSmrg
71444c061aSmrg*/
72444c061aSmrg
73444c061aSmrg/* $XFree86: xc/lib/Xt/Resources.c,v 1.11tsi Exp $ */
74444c061aSmrg
75444c061aSmrg/*LINTLIBRARY*/
76444c061aSmrg#ifdef HAVE_CONFIG_H
77444c061aSmrg#include <config.h>
78444c061aSmrg#endif
79444c061aSmrg#include "IntrinsicI.h"
80444c061aSmrg#include "VarargsI.h"
81444c061aSmrg#include "Shell.h"
82444c061aSmrg#include "ShellP.h"
83444c061aSmrg#include "StringDefs.h"
84444c061aSmrg#include <stdio.h>
85444c061aSmrg
86444c061aSmrgstatic XrmClass	QBoolean, QString, QCallProc, QImmediate;
87444c061aSmrgstatic XrmName QinitialResourcesPersistent, QInitialResourcesPersistent;
88444c061aSmrgstatic XrmClass QTranslations, QTranslationTable;
89444c061aSmrgstatic XrmName Qtranslations, QbaseTranslations;
90444c061aSmrgstatic XrmName Qscreen;
91444c061aSmrgstatic XrmClass QScreen;
92444c061aSmrg
93444c061aSmrg#ifdef CRAY
94444c061aSmrgvoid Cjump();
95444c061aSmrgchar *Cjumpp = (char *) Cjump;
96444c061aSmrgvoid Cjump() {}
97444c061aSmrg#endif
98444c061aSmrg
99444c061aSmrgvoid _XtCopyFromParent(
100444c061aSmrg    Widget      widget,
101444c061aSmrg    int		offset,
102444c061aSmrg    XrmValue    *value)
103444c061aSmrg{
104444c061aSmrg    if (widget->core.parent == NULL) {
105444c061aSmrg	XtAppWarningMsg(XtWidgetToApplicationContext(widget),
106444c061aSmrg		"invalidParent","xtCopyFromParent",XtCXtToolkitError,
107444c061aSmrg                  "CopyFromParent must have non-NULL parent",
108444c061aSmrg		  (String *)NULL, (Cardinal *)NULL);
109444c061aSmrg        value->addr = NULL;
110444c061aSmrg        return;
111444c061aSmrg    }
112444c061aSmrg    value->addr = (XPointer)(((char *)widget->core.parent) + offset);
113444c061aSmrg} /* _XtCopyFromParent */
114444c061aSmrg
115444c061aSmrg
116444c061aSmrg/* If the alignment characteristics of your machine are right, these may be
117444c061aSmrg   faster */
118444c061aSmrg
119444c061aSmrg#ifdef UNALIGNED
120444c061aSmrg
121444c061aSmrgvoid _XtCopyFromArg(
122444c061aSmrg    XtArgVal src,
123444c061aSmrg    char* dst,
124444c061aSmrg    register unsigned int size)
125444c061aSmrg{
126444c061aSmrg    if	    (size == sizeof(long))	*(long *)dst = (long)src;
127444c061aSmrg    else if (size == sizeof(short))	*(short *)dst = (short)src;
128444c061aSmrg    else if (size == sizeof(char))	*(char *)dst = (char)src;
129444c061aSmrg    else if (size == sizeof(XtPointer))	*(XtPointer *)dst = (XtPointer)src;
130444c061aSmrg    else if (size == sizeof(char*))	*(char **)dst = (char*)src;
131444c061aSmrg    else if (size == sizeof(XtArgVal))	*(XtArgVal *)dst = src;
132444c061aSmrg    else if (size > sizeof(XtArgVal))
133444c061aSmrg	(void) memmove((char *) dst, (char *)  src, (int) size);
134444c061aSmrg    else
135444c061aSmrg	(void) memmove((char *) dst, (char *) &src, (int) size);
136444c061aSmrg} /* _XtCopyFromArg */
137444c061aSmrg
138444c061aSmrgvoid _XtCopyToArg(
139444c061aSmrg    char* src,
140444c061aSmrg    XtArgVal *dst,
141444c061aSmrg    register unsigned int size)
142444c061aSmrg{
143444c061aSmrg    if (! (*dst)) {
144444c061aSmrg#ifdef GETVALUES_BUG
145444c061aSmrg	/* old GetValues semantics (storing directly into arglists) are bad,
146444c061aSmrg	 * but preserve for compatibility as long as arglist contains NULL.
147444c061aSmrg	 */
148444c061aSmrg        if	(size == sizeof(long))	   *dst = (XtArgVal)*(long*)src;
149444c061aSmrg	else if (size == sizeof(short))    *dst = (XtArgVal)*(short*)src;
150444c061aSmrg	else if (size == sizeof(char))	   *dst = (XtArgVal)*(char*)src;
151444c061aSmrg	else if (size == sizeof(XtPointer)) *dst = (XtArgVal)*(XtPointer*)src;
152444c061aSmrg	else if (size == sizeof(char*))    *dst = (XtArgVal)*(char**)src;
153444c061aSmrg	else if (size == sizeof(XtArgVal)) *dst = *(XtArgVal*)src;
154444c061aSmrg	else (void) memmove((char*)dst, (char*)src, (int)size);
155444c061aSmrg#else
156444c061aSmrg	XtErrorMsg("invalidGetValues", "xtGetValues", XtCXtToolkitError,
157444c061aSmrg	    "NULL ArgVal in XtGetValues", (String*) NULL, (Cardinal*) NULL);
158444c061aSmrg#endif
159444c061aSmrg    }
160444c061aSmrg    else {
161444c061aSmrg	/* proper GetValues semantics: argval is pointer to destination */
162444c061aSmrg	if	(size == sizeof(long))	   *((long*)*dst) = *(long*)src;
163444c061aSmrg	else if (size == sizeof(short))    *((short*)*dst) = *(short*)src;
164444c061aSmrg	else if (size == sizeof(char))	   *((char*)*dst) = *(char*)src;
165444c061aSmrg	else if (size == sizeof(XtPointer)) *((XtPointer*)*dst) = *(XtPointer*)src;
166444c061aSmrg	else if (size == sizeof(char*))    *((char**)*dst) = *(char**)src;
167444c061aSmrg	else if (size == sizeof(XtArgVal)) *((XtArgVal*)*dst)= *(XtArgVal*)src;
168444c061aSmrg	else (void) memmove((char*)*dst, (char*)src, (int)size);
169444c061aSmrg    }
170444c061aSmrg} /* _XtCopyToArg */
171444c061aSmrg
172444c061aSmrgstatic void CopyToArg(
173444c061aSmrg    char* src,
174444c061aSmrg    XtArgVal *dst,
175444c061aSmrg    register unsigned int size)
176444c061aSmrg{
177444c061aSmrg    if (! (*dst)) {
178444c061aSmrg	/* old GetValues semantics (storing directly into arglists) are bad,
179444c061aSmrg	 * but preserve for compatibility as long as arglist contains NULL.
180444c061aSmrg	 */
181444c061aSmrg        if	(size == sizeof(long))	   *dst = (XtArgVal)*(long*)src;
182444c061aSmrg	else if (size == sizeof(short))    *dst = (XtArgVal)*(short*)src;
183444c061aSmrg	else if (size == sizeof(char))	   *dst = (XtArgVal)*(char*)src;
184444c061aSmrg	else if (size == sizeof(XtPointer)) *dst = (XtArgVal)*(XtPointer*)src;
185444c061aSmrg	else if (size == sizeof(char*))    *dst = (XtArgVal)*(char**)src;
186444c061aSmrg	else if (size == sizeof(XtArgVal)) *dst = *(XtArgVal*)src;
187444c061aSmrg	else (void) memmove((char*)dst, (char*)src, (int)size);
188444c061aSmrg    }
189444c061aSmrg    else {
190444c061aSmrg	/* proper GetValues semantics: argval is pointer to destination */
191444c061aSmrg	if	(size == sizeof(long))	   *((long*)*dst) = *(long*)src;
192444c061aSmrg	else if (size == sizeof(short))    *((short*)*dst) = *(short*)src;
193444c061aSmrg	else if (size == sizeof(char))	   *((char*)*dst) = *(char*)src;
194444c061aSmrg	else if (size == sizeof(XtPointer)) *((XtPointer*)*dst) = *(XtPointer*)src;
195444c061aSmrg	else if (size == sizeof(char*))    *((char**)*dst) = *(char**)src;
196444c061aSmrg	else if (size == sizeof(XtArgVal)) *((XtArgVal*)*dst)= *(XtArgVal*)src;
197444c061aSmrg	else (void) memmove((char*)*dst, (char*)src, (int)size);
198444c061aSmrg    }
199444c061aSmrg} /* CopyToArg */
200444c061aSmrg
201444c061aSmrg#else
202444c061aSmrgvoid _XtCopyFromArg(
203444c061aSmrg    XtArgVal src,
204444c061aSmrg    char* dst,
205444c061aSmrg    register unsigned int size)
206444c061aSmrg{
207444c061aSmrg    if (size > sizeof(XtArgVal))
208444c061aSmrg	(void) memmove((char *) dst, (char *)  src, (int) size);
209444c061aSmrg    else {
210444c061aSmrg	union {
211444c061aSmrg	    long	longval;
212444c061aSmrg#ifdef LONG64
213444c061aSmrg	    int		intval;
214444c061aSmrg#endif
215444c061aSmrg	    short	shortval;
216444c061aSmrg	    char	charval;
217444c061aSmrg	    char*	charptr;
218444c061aSmrg	    XtPointer	ptr;
219444c061aSmrg	} u;
220444c061aSmrg	char *p = (char*)&u;
221444c061aSmrg	if	(size == sizeof(long))	    u.longval = (long)src;
222444c061aSmrg#ifdef LONG64
223444c061aSmrg	else if (size == sizeof(int))	    u.intval = (int)src;
224444c061aSmrg#endif
225444c061aSmrg	else if (size == sizeof(short))	    u.shortval = (short)src;
226444c061aSmrg	else if (size == sizeof(char))	    u.charval = (char)src;
227444c061aSmrg	else if (size == sizeof(XtPointer)) u.ptr = (XtPointer)src;
228444c061aSmrg	else if (size == sizeof(char*))	    u.charptr = (char*)src;
229444c061aSmrg	else				    p = (char*)&src;
230444c061aSmrg
231444c061aSmrg	(void) memmove(dst, p, (int) size);
232444c061aSmrg    }
233444c061aSmrg} /* _XtCopyFromArg */
234444c061aSmrg
235444c061aSmrgvoid _XtCopyToArg(
236444c061aSmrg    char* src,
237444c061aSmrg    XtArgVal *dst,
238444c061aSmrg    register unsigned int size)
239444c061aSmrg{
240444c061aSmrg    if (!*dst) {
241444c061aSmrg#ifdef GETVALUES_BUG
242444c061aSmrg	/* old GetValues semantics (storing directly into arglists) are bad,
243444c061aSmrg	 * but preserve for compatibility as long as arglist contains NULL.
244444c061aSmrg	 */
245444c061aSmrg	union {
246444c061aSmrg	    long	longval;
247444c061aSmrg#ifdef LONG64
248444c061aSmrg	    int		intval;
249444c061aSmrg#endif
250444c061aSmrg	    short	shortval;
251444c061aSmrg	    char	charval;
252444c061aSmrg	    char*	charptr;
253444c061aSmrg	    XtPointer	ptr;
254444c061aSmrg	} u;
255444c061aSmrg	if (size <= sizeof(XtArgVal)) {
256444c061aSmrg	    (void) memmove((char*)&u, (char*)src, (int)size );
257444c061aSmrg	    if	    (size == sizeof(long)) 	*dst = (XtArgVal)u.longval;
258444c061aSmrg#ifdef LONG64
259444c061aSmrg	    else if (size == sizeof(int))	*dst = (XtArgVal)u.intval;
260444c061aSmrg#endif
261444c061aSmrg	    else if (size == sizeof(short))	*dst = (XtArgVal)u.shortval;
262444c061aSmrg	    else if (size == sizeof(char))	*dst = (XtArgVal)u.charval;
263444c061aSmrg	    else if (size == sizeof(char*))	*dst = (XtArgVal)u.charptr;
264444c061aSmrg	    else if (size == sizeof(XtPointer))	*dst = (XtArgVal)u.ptr;
265444c061aSmrg	    else (void) memmove((char*)dst, (char*)src, (int)size );
266444c061aSmrg	}
267444c061aSmrg	else
268444c061aSmrg	    (void) memmove((char*)dst, (char*)src, (int)size );
269444c061aSmrg#else
270444c061aSmrg	XtErrorMsg("invalidGetValues", "xtGetValues", XtCXtToolkitError,
271444c061aSmrg	    "NULL ArgVal in XtGetValues", (String*) NULL, (Cardinal*) NULL);
272444c061aSmrg#endif
273444c061aSmrg    }
274444c061aSmrg    else {
275444c061aSmrg	/* proper GetValues semantics: argval is pointer to destination */
276444c061aSmrg	(void) memmove((char*)*dst, (char*)src, (int)size );
277444c061aSmrg    }
278444c061aSmrg} /* _XtCopyToArg */
279444c061aSmrg
280444c061aSmrgstatic void CopyToArg(
281444c061aSmrg    char* src,
282444c061aSmrg    XtArgVal *dst,
283444c061aSmrg    register unsigned int size)
284444c061aSmrg{
285444c061aSmrg    if (!*dst) {
286444c061aSmrg	/* old GetValues semantics (storing directly into arglists) are bad,
287444c061aSmrg	 * but preserve for compatibility as long as arglist contains NULL.
288444c061aSmrg	 */
289444c061aSmrg	union {
290444c061aSmrg	    long	longval;
291444c061aSmrg#ifdef LONG64
292444c061aSmrg	    int		intval;
293444c061aSmrg#endif
294444c061aSmrg	    short	shortval;
295444c061aSmrg	    char	charval;
296444c061aSmrg	    char*	charptr;
297444c061aSmrg	    XtPointer	ptr;
298444c061aSmrg	} u;
299444c061aSmrg	if (size <= sizeof(XtArgVal)) {
300444c061aSmrg	    (void) memmove((char*)&u, (char*)src, (int)size );
301444c061aSmrg	    if	    (size == sizeof(long)) 	*dst = (XtArgVal)u.longval;
302444c061aSmrg#ifdef LONG64
303444c061aSmrg	    else if (size == sizeof(int))	*dst = (XtArgVal)u.intval;
304444c061aSmrg#endif
305444c061aSmrg	    else if (size == sizeof(short))	*dst = (XtArgVal)u.shortval;
306444c061aSmrg	    else if (size == sizeof(char))	*dst = (XtArgVal)u.charval;
307444c061aSmrg	    else if (size == sizeof(char*))	*dst = (XtArgVal)u.charptr;
308444c061aSmrg	    else if (size == sizeof(XtPointer))	*dst = (XtArgVal)u.ptr;
309444c061aSmrg	    else (void) memmove((char*)dst, (char*)src, (int)size );
310444c061aSmrg	}
311444c061aSmrg	else
312444c061aSmrg	    (void) memmove((char*)dst, (char*)src, (int)size );
313444c061aSmrg    }
314444c061aSmrg    else {
315444c061aSmrg	/* proper GetValues semantics: argval is pointer to destination */
316444c061aSmrg	(void) memmove((char*)*dst, (char*)src, (int)size );
317444c061aSmrg    }
318444c061aSmrg} /* CopyToArg */
319444c061aSmrg
320444c061aSmrg#endif
321444c061aSmrg
322444c061aSmrgstatic Cardinal CountTreeDepth(
323444c061aSmrg    Widget w)
324444c061aSmrg{
325444c061aSmrg    Cardinal count;
326444c061aSmrg
327444c061aSmrg    for (count = 1; w != NULL; w = (Widget) w->core.parent)
328444c061aSmrg	count++;
329444c061aSmrg
330444c061aSmrg    return count;
331444c061aSmrg}
332444c061aSmrg
333444c061aSmrgstatic void GetNamesAndClasses(
334444c061aSmrg    register Widget	  w,
335444c061aSmrg    register XrmNameList  names,
336444c061aSmrg    register XrmClassList classes)
337444c061aSmrg{
338444c061aSmrg    register Cardinal length, j;
339444c061aSmrg    register XrmQuark t;
340444c061aSmrg    WidgetClass class;
341444c061aSmrg
342444c061aSmrg    /* Return null-terminated quark arrays, with length the number of
343444c061aSmrg       quarks (not including NULL) */
344444c061aSmrg
345444c061aSmrg    LOCK_PROCESS;
346444c061aSmrg    for (length = 0; w != NULL; w = (Widget) w->core.parent) {
347444c061aSmrg	names[length] = w->core.xrm_name;
348444c061aSmrg	class = XtClass(w);
349444c061aSmrg	/* KLUDGE KLUDGE KLUDGE KLUDGE */
350444c061aSmrg	if (w->core.parent == NULL && XtIsApplicationShell(w)) {
351444c061aSmrg	    classes[length] =
352444c061aSmrg		((ApplicationShellWidget) w)->application.xrm_class;
353444c061aSmrg	} else classes[length] = class->core_class.xrm_class;
354444c061aSmrg	length++;
355444c061aSmrg     }
356444c061aSmrg    UNLOCK_PROCESS;
357444c061aSmrg    /* They're in backwards order, flop them around */
358444c061aSmrg    for (j = 0; j < length/2; j++) {
359444c061aSmrg	t = names[j];
360444c061aSmrg	names[j] = names[length-j-1];
361444c061aSmrg	names[length-j-1] = t;
362444c061aSmrg        t = classes[j];
363444c061aSmrg	classes[j] = classes[length-j-1];
364444c061aSmrg	classes[length-j-1] = t;
365444c061aSmrg    }
366444c061aSmrg    names[length] = NULLQUARK;
367444c061aSmrg    classes[length] = NULLQUARK;
368444c061aSmrg} /* GetNamesAndClasses */
369444c061aSmrg
370444c061aSmrg
371444c061aSmrg/* Spiffy fast compiled form of resource list.				*/
372444c061aSmrg/* XtResourceLists are compiled in-place into XrmResourceLists		*/
373444c061aSmrg/* All atoms are replaced by quarks, and offsets are -offset-1 to	*/
374444c061aSmrg/* indicate that this list has been compiled already			*/
375444c061aSmrg
376444c061aSmrgvoid _XtCompileResourceList(
377444c061aSmrg    register XtResourceList resources,
378444c061aSmrg    	     Cardinal       num_resources)
379444c061aSmrg{
380444c061aSmrg    register Cardinal count;
381444c061aSmrg
382444c061aSmrg#define xrmres  ((XrmResourceList) resources)
383444c061aSmrg#define PSToQ   XrmPermStringToQuark
384444c061aSmrg
385444c061aSmrg    for (count = 0; count < num_resources; resources++, count++) {
386444c061aSmrg    	xrmres->xrm_name	 = PSToQ(resources->resource_name);
387444c061aSmrg    	xrmres->xrm_class	 = PSToQ(resources->resource_class);
388444c061aSmrg    	xrmres->xrm_type	 = PSToQ(resources->resource_type);
389444c061aSmrg        xrmres->xrm_offset	 = (Cardinal)
390444c061aSmrg		(-(int)resources->resource_offset - 1);
391444c061aSmrg    	xrmres->xrm_default_type = PSToQ(resources->default_type);
392444c061aSmrg    }
393444c061aSmrg#undef PSToQ
394444c061aSmrg#undef xrmres
395444c061aSmrg} /* _XtCompileResourceList */
396444c061aSmrg
397444c061aSmrg/* Like _XtCompileResourceList, but strings are not permanent */
398444c061aSmrgstatic void  XrmCompileResourceListEphem(
399444c061aSmrg    register XtResourceList resources,
400444c061aSmrg    	     Cardinal       num_resources)
401444c061aSmrg{
402444c061aSmrg    register Cardinal count;
403444c061aSmrg
404444c061aSmrg#define xrmres  ((XrmResourceList) resources)
405444c061aSmrg
406444c061aSmrg    for (count = 0; count < num_resources; resources++, count++) {
407444c061aSmrg    	xrmres->xrm_name	 = StringToName(resources->resource_name);
408444c061aSmrg    	xrmres->xrm_class	 = StringToClass(resources->resource_class);
409444c061aSmrg    	xrmres->xrm_type	 = StringToQuark(resources->resource_type);
410444c061aSmrg        xrmres->xrm_offset	 = (Cardinal)
411444c061aSmrg		(-(int)resources->resource_offset - 1);
412444c061aSmrg    	xrmres->xrm_default_type = StringToQuark(resources->default_type);
413444c061aSmrg    }
414444c061aSmrg#undef xrmres
415444c061aSmrg} /* XrmCompileResourceListEphem */
416444c061aSmrg
417444c061aSmrgstatic void BadSize(
418444c061aSmrg    Cardinal size,
419444c061aSmrg    XrmQuark name)
420444c061aSmrg{
421444c061aSmrg    String params[2];
422444c061aSmrg    Cardinal num_params = 2;
423444c061aSmrg
424444c061aSmrg    params[0] = (String)(long) size;
425444c061aSmrg    params[1] = XrmQuarkToString(name);
426444c061aSmrg    XtWarningMsg("invalidSizeOverride", "xtDependencies", XtCXtToolkitError,
427444c061aSmrg	"Representation size %d must match superclass's to override %s",
428444c061aSmrg	params, &num_params);
429444c061aSmrg} /* BadType */
430444c061aSmrg
431444c061aSmrg/*
432444c061aSmrg * Create a new resource list, with the class resources following the
433444c061aSmrg * superclass's resources.  If a resource in the class list overrides
434444c061aSmrg * a superclass resource, then just replace the superclass entry in place.
435444c061aSmrg *
436444c061aSmrg * At the same time, add a level of indirection to the XtResourceList to
437444c061aSmrg * create and XrmResourceList.
438444c061aSmrg */
439444c061aSmrgvoid _XtDependencies(
440444c061aSmrg    XtResourceList  *class_resp,	/* VAR */
441444c061aSmrg    Cardinal	    *class_num_resp,    /* VAR */
442444c061aSmrg    XrmResourceList *super_res,
443444c061aSmrg    Cardinal	    super_num_res,
444444c061aSmrg    Cardinal	    super_widget_size)
445444c061aSmrg{
446444c061aSmrg    register XrmResourceList *new_res;
447444c061aSmrg	     Cardinal	     new_num_res;
448444c061aSmrg	     XrmResourceList class_res = (XrmResourceList) *class_resp;
449444c061aSmrg	     Cardinal        class_num_res = *class_num_resp;
450444c061aSmrg    register Cardinal	     i, j;
451444c061aSmrg	     Cardinal        new_next;
452444c061aSmrg
453444c061aSmrg    if (class_num_res == 0) {
454444c061aSmrg	/* Just point to superclass resource list */
455444c061aSmrg	*class_resp = (XtResourceList) super_res;
456444c061aSmrg	*class_num_resp = super_num_res;
457444c061aSmrg	return;
458444c061aSmrg    }
459444c061aSmrg
460444c061aSmrg    /* Allocate and initialize new_res with superclass resource pointers */
461444c061aSmrg    new_num_res = super_num_res + class_num_res;
462444c061aSmrg    new_res = (XrmResourceList *) __XtMalloc(new_num_res*sizeof(XrmResourceList));
463444c061aSmrg    if (super_num_res > 0)
464444c061aSmrg	XtMemmove(new_res, super_res, super_num_res * sizeof(XrmResourceList));
465444c061aSmrg
466444c061aSmrg    /* Put pointers to class resource entries into new_res */
467444c061aSmrg    new_next = super_num_res;
468444c061aSmrg    for (i = 0; i < class_num_res; i++) {
469444c061aSmrg	if ((Cardinal)(-class_res[i].xrm_offset-1) < super_widget_size) {
470444c061aSmrg	    /* Probably an override of superclass resources--look for overlap */
471444c061aSmrg	    for (j = 0; j < super_num_res; j++) {
472444c061aSmrg		if (class_res[i].xrm_offset == new_res[j]->xrm_offset) {
473444c061aSmrg		    /* Spec is silent on what fields subclass can override.
474444c061aSmrg		     * The only two of real concern are type & size.
475444c061aSmrg		     * Although allowing type to be over-ridden introduces
476444c061aSmrg		     * the possibility of errors, it's at present the only
477444c061aSmrg		     * reasonable way to allow a subclass to force a private
478444c061aSmrg		     * converter to be invoked for a subset of fields.
479444c061aSmrg		     */
480444c061aSmrg		    /* We do insist that size be identical to superclass */
481444c061aSmrg		    if (class_res[i].xrm_size != new_res[j]->xrm_size) {
482444c061aSmrg			BadSize(class_res[i].xrm_size,
483444c061aSmrg				(XrmQuark) class_res[i].xrm_name);
484444c061aSmrg			class_res[i].xrm_size = new_res[j]->xrm_size;
485444c061aSmrg		    }
486444c061aSmrg		    new_res[j] = &(class_res[i]);
487444c061aSmrg		    new_num_res--;
488444c061aSmrg		    goto NextResource;
489444c061aSmrg		}
490444c061aSmrg	    } /* for j */
491444c061aSmrg	}
492444c061aSmrg	/* Not an overlap, add an entry to new_res */
493444c061aSmrg	new_res[new_next++] = &(class_res[i]);
494444c061aSmrgNextResource:;
495444c061aSmrg    } /* for i */
496444c061aSmrg
497444c061aSmrg    /* Okay, stuff new resources back into class record */
498444c061aSmrg    *class_resp = (XtResourceList) new_res;
499444c061aSmrg    *class_num_resp = new_num_res;
500444c061aSmrg} /* _XtDependencies */
501444c061aSmrg
502444c061aSmrg
503444c061aSmrgvoid _XtResourceDependencies(
504444c061aSmrg    WidgetClass wc)
505444c061aSmrg{
506444c061aSmrg    WidgetClass sc;
507444c061aSmrg
508444c061aSmrg    sc = wc->core_class.superclass;
509444c061aSmrg    if (sc == NULL) {
510444c061aSmrg	_XtDependencies(&(wc->core_class.resources),
511444c061aSmrg			&(wc->core_class.num_resources),
512444c061aSmrg			(XrmResourceList *) NULL, (unsigned)0, (unsigned)0);
513444c061aSmrg    } else {
514444c061aSmrg	_XtDependencies(&(wc->core_class.resources),
515444c061aSmrg			&(wc->core_class.num_resources),
516444c061aSmrg			(XrmResourceList *) sc->core_class.resources,
517444c061aSmrg			sc->core_class.num_resources,
518444c061aSmrg			sc->core_class.widget_size);
519444c061aSmrg    }
520444c061aSmrg} /* _XtResourceDependencies */
521444c061aSmrg
522444c061aSmrgvoid _XtConstraintResDependencies(
523444c061aSmrg    ConstraintWidgetClass wc)
524444c061aSmrg{
525444c061aSmrg    ConstraintWidgetClass sc;
526444c061aSmrg
527444c061aSmrg    if (wc == (ConstraintWidgetClass) constraintWidgetClass) {
528444c061aSmrg	_XtDependencies(&(wc->constraint_class.resources),
529444c061aSmrg			&(wc->constraint_class.num_resources),
530444c061aSmrg			(XrmResourceList *)NULL, (unsigned)0, (unsigned)0);
531444c061aSmrg    } else {
532444c061aSmrg	sc = (ConstraintWidgetClass) wc->core_class.superclass;
533444c061aSmrg	_XtDependencies(&(wc->constraint_class.resources),
534444c061aSmrg			&(wc->constraint_class.num_resources),
535444c061aSmrg			(XrmResourceList *) sc->constraint_class.resources,
536444c061aSmrg			sc->constraint_class.num_resources,
537444c061aSmrg			sc->constraint_class.constraint_size);
538444c061aSmrg    }
539444c061aSmrg} /* _XtConstraintResDependencies */
540444c061aSmrg
541444c061aSmrg
542444c061aSmrg
543444c061aSmrg
544444c061aSmrgXrmResourceList* _XtCreateIndirectionTable (
545444c061aSmrg    XtResourceList  resources,
546444c061aSmrg    Cardinal	    num_resources)
547444c061aSmrg{
548444c061aSmrg    register Cardinal idx;
549444c061aSmrg    XrmResourceList* table;
550444c061aSmrg
551444c061aSmrg    table = (XrmResourceList*)__XtMalloc(num_resources * sizeof(XrmResourceList));
552444c061aSmrg    for (idx = 0; idx < num_resources; idx++)
553444c061aSmrg        table[idx] = (XrmResourceList)(&(resources[idx]));
554444c061aSmrg    return table;
555444c061aSmrg}
556444c061aSmrg
557444c061aSmrgstatic XtCacheRef *GetResources(
558444c061aSmrg    Widget	    widget,	    /* Widget resources are associated with */
559444c061aSmrg    char*	    base,	    /* Base address of memory to write to   */
560444c061aSmrg    XrmNameList     names,	    /* Full inheritance name of widget      */
561444c061aSmrg    XrmClassList    classes,	    /* Full inheritance class of widget     */
562444c061aSmrg    XrmResourceList*  table,	    /* The list of resources required.      */
563444c061aSmrg    unsigned	    num_resources,  /* number of items in resource list     */
564444c061aSmrg    XrmQuarkList    quark_args,     /* Arg names quarkified		    */
565444c061aSmrg    ArgList	    args,	    /* ArgList to override resources	    */
566444c061aSmrg    unsigned	    num_args,       /* number of items in arg list	    */
567444c061aSmrg    XtTypedArgList  typed_args,	    /* Typed arg list to override resources */
568444c061aSmrg    Cardinal*	    pNumTypedArgs,  /* number of items in typed arg list    */
569444c061aSmrg    Boolean	    tm_hack)	    /* do baseTranslations		    */
570444c061aSmrg{
571444c061aSmrg/*
572444c061aSmrg * assert: *pNumTypedArgs == 0 if num_args > 0
573444c061aSmrg * assert: num_args == 0 if *pNumTypedArgs > 0
574444c061aSmrg */
575444c061aSmrg#define SEARCHLISTLEN 100
576444c061aSmrg#define MAXRESOURCES  400
577444c061aSmrg
578444c061aSmrg    XrmValue	    value;
579444c061aSmrg    XrmQuark	    rawType;
580444c061aSmrg    XrmValue	    convValue;
581444c061aSmrg    XrmHashTable    stackSearchList[SEARCHLISTLEN];
582444c061aSmrg    XrmHashTable    *searchList = stackSearchList;
583444c061aSmrg    unsigned int    searchListSize = SEARCHLISTLEN;
584444c061aSmrg    Boolean	    found[MAXRESOURCES];
585444c061aSmrg    int		    typed[MAXRESOURCES];
586444c061aSmrg    XtCacheRef	    cache_ref[MAXRESOURCES];
587444c061aSmrg    XtCacheRef      *cache_ptr, *cache_base;
588444c061aSmrg    Boolean	    persistent_resources = True;
589444c061aSmrg    Boolean	    found_persistence = False;
590444c061aSmrg    int		    num_typed_args = *pNumTypedArgs;
591444c061aSmrg    XrmDatabase     db;
592444c061aSmrg    Boolean	    do_tm_hack = False;
593444c061aSmrg
594444c061aSmrg    if ((args == NULL) && (num_args != 0)) {
595444c061aSmrg    	XtAppWarningMsg(XtWidgetToApplicationContext(widget),
596444c061aSmrg		"invalidArgCount","getResources",XtCXtToolkitError,
597444c061aSmrg                 "argument count > 0 on NULL argument list",
598444c061aSmrg                   (String *)NULL, (Cardinal *)NULL);
599444c061aSmrg	num_args = 0;
600444c061aSmrg    }
601444c061aSmrg    if (num_resources == 0) {
602444c061aSmrg	return NULL;
603444c061aSmrg    } else if (num_resources >= MAXRESOURCES) {
604444c061aSmrg    	XtAppWarningMsg(XtWidgetToApplicationContext(widget),
605444c061aSmrg		"invalidResourceCount","getResources",XtCXtToolkitError,
606444c061aSmrg              "too many resources",
607444c061aSmrg	      (String *)NULL, (Cardinal *)NULL);
608444c061aSmrg	return NULL;
609444c061aSmrg    } else if (table == NULL) {
610444c061aSmrg    	XtAppWarningMsg(XtWidgetToApplicationContext(widget),
611444c061aSmrg		"invalidResourceCount","getResources",XtCXtToolkitError,
612444c061aSmrg              "resource count > 0 on NULL resource list",
613444c061aSmrg	      (String *)NULL, (Cardinal *)NULL);
614444c061aSmrg	return NULL;
615444c061aSmrg    }
616444c061aSmrg
617444c061aSmrg    /* Mark each resource as not found on arg list */
618444c061aSmrg    bzero((char *) found, (int) (num_resources * sizeof(Boolean)));
619444c061aSmrg    bzero((char *) typed, (int) (num_resources * sizeof(int)));
620444c061aSmrg
621444c061aSmrg    /* Copy the args into the resources, mark each as found */
622444c061aSmrg    {
623444c061aSmrg	register ArgList	    arg;
624444c061aSmrg	register XtTypedArgList	    typed_arg;
625444c061aSmrg	register XrmName	    argName;
626444c061aSmrg	register Cardinal	    j;
627444c061aSmrg	register int	    i;
628444c061aSmrg	register XrmResourceList rx;
629444c061aSmrg	register XrmResourceList *res;
630444c061aSmrg	for (arg = args, i = 0; (Cardinal)i < num_args; i++, arg++) {
631444c061aSmrg	    argName = quark_args[i];
632444c061aSmrg	    if (argName == QinitialResourcesPersistent) {
633444c061aSmrg		persistent_resources = (Boolean)arg->value;
634444c061aSmrg		found_persistence = True;
635444c061aSmrg		continue;
636444c061aSmrg	    }
637444c061aSmrg	    for (j = 0, res = table; j < num_resources; j++, res++) {
638444c061aSmrg		rx = *res;
639444c061aSmrg		if (argName == rx->xrm_name) {
640444c061aSmrg		    _XtCopyFromArg(
641444c061aSmrg			arg->value,
642444c061aSmrg			base - rx->xrm_offset - 1,
643444c061aSmrg			rx->xrm_size);
644444c061aSmrg		    found[j] = TRUE;
645444c061aSmrg		    break;
646444c061aSmrg		}
647444c061aSmrg	    }
648444c061aSmrg	}
649444c061aSmrg	for (typed_arg = typed_args, i = 0; i < num_typed_args;
650444c061aSmrg	     i++, typed_arg++) {
651444c061aSmrg	    register XrmRepresentation argType;
652444c061aSmrg	    argName = quark_args[i];
653444c061aSmrg	    argType = (typed_arg->type == NULL) ? NULLQUARK
654444c061aSmrg		: XrmStringToRepresentation(typed_arg->type);
655444c061aSmrg	    if (argName == QinitialResourcesPersistent) {
656444c061aSmrg		persistent_resources = (Boolean)typed_arg->value;
657444c061aSmrg		found_persistence = True;
658444c061aSmrg		break;
659444c061aSmrg	    }
660444c061aSmrg	    for (j = 0, res = table; j < num_resources; j++, res++) {
661444c061aSmrg		rx = *res;
662444c061aSmrg		if (argName == rx->xrm_name) {
663444c061aSmrg		    if (argType != NULLQUARK && argType != rx->xrm_type) {
664444c061aSmrg			typed[j] = i + 1;
665444c061aSmrg		    } else {
666444c061aSmrg			_XtCopyFromArg(
667444c061aSmrg				       typed_arg->value,
668444c061aSmrg				       base - rx->xrm_offset - 1,
669444c061aSmrg				       rx->xrm_size);
670444c061aSmrg		    }
671444c061aSmrg		    found[j] = TRUE;
672444c061aSmrg		    break;
673444c061aSmrg		}
674444c061aSmrg	    }
675444c061aSmrg	}
676444c061aSmrg    }
677444c061aSmrg
678444c061aSmrg    /* Ask resource manager for a list of database levels that we can
679444c061aSmrg       do a single-level search on each resource */
680444c061aSmrg
681444c061aSmrg    db = XtScreenDatabase(XtScreenOfObject(widget));
682444c061aSmrg    while (!XrmQGetSearchList(db, names, classes,
683444c061aSmrg			      searchList, searchListSize)) {
684444c061aSmrg	if (searchList == stackSearchList)
685444c061aSmrg	    searchList = NULL;
686444c061aSmrg	searchList = (XrmHashTable*)XtRealloc((char*)searchList,
687444c061aSmrg					      sizeof(XrmHashTable) *
688444c061aSmrg					      (searchListSize *= 2));
689444c061aSmrg    }
690444c061aSmrg
691444c061aSmrg    if (persistent_resources)
692444c061aSmrg	cache_base = NULL;
693444c061aSmrg    else
694444c061aSmrg	cache_base = cache_ref;
695444c061aSmrg    /* geez, this is an ugly mess */
696444c061aSmrg    if (XtIsShell(widget)) {
697444c061aSmrg	register XrmResourceList  *res;
698444c061aSmrg	register Cardinal	  j;
699444c061aSmrg	Screen *oldscreen = widget->core.screen;
700444c061aSmrg
701444c061aSmrg	/* look up screen resource first, since real rdb depends on it */
702444c061aSmrg	for (res = table, j = 0; j < num_resources; j++, res++) {
703444c061aSmrg	    if ((*res)->xrm_name != Qscreen)
704444c061aSmrg		continue;
705444c061aSmrg	    if (typed[j]) {
706444c061aSmrg		register XtTypedArg* arg = typed_args + typed[j] - 1;
707444c061aSmrg		XrmQuark from_type;
708444c061aSmrg		XrmValue from_val, to_val;
709444c061aSmrg
710444c061aSmrg		from_type = StringToQuark(arg->type);
711444c061aSmrg		from_val.size = arg->size;
712444c061aSmrg		if ((from_type == QString) || ((unsigned) arg->size > sizeof(XtArgVal)))
713444c061aSmrg		    from_val.addr = (XPointer)arg->value;
714444c061aSmrg		else
715444c061aSmrg		    from_val.addr = (XPointer)&arg->value;
716444c061aSmrg		to_val.size = sizeof(Screen*);
717444c061aSmrg		to_val.addr = (XPointer)&widget->core.screen;
718444c061aSmrg		found[j] = _XtConvert(widget, from_type, &from_val,
719444c061aSmrg				      QScreen, &to_val, cache_base);
720444c061aSmrg		if (cache_base && *cache_base)
721444c061aSmrg		    cache_base++;
722444c061aSmrg	    }
723444c061aSmrg	    if (!found[j]) {
724444c061aSmrg		if (XrmQGetSearchResource(searchList, Qscreen, QScreen,
725444c061aSmrg				      &rawType, &value)) {
726444c061aSmrg		    if (rawType != QScreen) {
727444c061aSmrg			convValue.size = sizeof(Screen*);
728444c061aSmrg			convValue.addr = (XPointer)&widget->core.screen;
729444c061aSmrg			(void)_XtConvert(widget, rawType, &value,
730444c061aSmrg					 QScreen, &convValue, cache_base);
731444c061aSmrg			if (cache_base && *cache_base)
732444c061aSmrg			    cache_base++;
733444c061aSmrg		    } else {
734444c061aSmrg			widget->core.screen = *((Screen **)value.addr);
735444c061aSmrg		    }
736444c061aSmrg		}
737444c061aSmrg	    }
738444c061aSmrg	    break;
739444c061aSmrg	}
740444c061aSmrg	/* now get the database to use for the rest of the resources */
741444c061aSmrg	if (widget->core.screen != oldscreen) {
742444c061aSmrg	    db = XtScreenDatabase(widget->core.screen);
743444c061aSmrg	    while (!XrmQGetSearchList(db, names, classes,
744444c061aSmrg				      searchList, searchListSize)) {
745444c061aSmrg		if (searchList == stackSearchList)
746444c061aSmrg		    searchList = NULL;
747444c061aSmrg		searchList = (XrmHashTable*)XtRealloc((char*)searchList,
748444c061aSmrg						      sizeof(XrmHashTable) *
749444c061aSmrg						      (searchListSize *= 2));
750444c061aSmrg	    }
751444c061aSmrg	}
752444c061aSmrg    }
753444c061aSmrg
754444c061aSmrg    /* go to the resource manager for those resources not found yet */
755444c061aSmrg    /* if it's not in the resource database use the default value   */
756444c061aSmrg
757444c061aSmrg    {
758444c061aSmrg	register XrmResourceList  rx;
759444c061aSmrg	register XrmResourceList  *res;
760444c061aSmrg	register Cardinal	  j;
761444c061aSmrg	register XrmRepresentation xrm_type;
762444c061aSmrg	register XrmRepresentation xrm_default_type;
763444c061aSmrg	char	char_val;
764444c061aSmrg	short	short_val;
765444c061aSmrg	int	int_val;
766444c061aSmrg	long	long_val;
767444c061aSmrg	char*	char_ptr;
768444c061aSmrg
769444c061aSmrg	if (!found_persistence) {
770444c061aSmrg	    if (XrmQGetSearchResource(searchList, QinitialResourcesPersistent,
771444c061aSmrg			QInitialResourcesPersistent, &rawType, &value)) {
772444c061aSmrg		if (rawType != QBoolean) {
773444c061aSmrg		    convValue.size = sizeof(Boolean);
774444c061aSmrg		    convValue.addr = (XPointer)&persistent_resources;
775444c061aSmrg		    (void)_XtConvert(widget, rawType, &value, QBoolean,
776444c061aSmrg				     &convValue, NULL);
777444c061aSmrg		}
778444c061aSmrg		else
779444c061aSmrg		    persistent_resources = *(Boolean*)value.addr;
780444c061aSmrg	    }
781444c061aSmrg	}
782444c061aSmrg	if (persistent_resources)
783444c061aSmrg	    cache_ptr = NULL;
784444c061aSmrg	else if (cache_base)
785444c061aSmrg	    cache_ptr = cache_base;
786444c061aSmrg	else
787444c061aSmrg	    cache_ptr = cache_ref;
788444c061aSmrg
789444c061aSmrg	for (res = table, j = 0; j < num_resources; j++, res++) {
790444c061aSmrg	    rx = *res;
791444c061aSmrg	    xrm_type = rx->xrm_type;
792444c061aSmrg	    if (typed[j]) {
793444c061aSmrg		register XtTypedArg* arg = typed_args + typed[j] - 1;
794444c061aSmrg
795444c061aSmrg		/*
796444c061aSmrg                 * This resource value has been specified as a typed arg and
797444c061aSmrg		 * has to be converted. Typed arg conversions are done here
798444c061aSmrg		 * to correctly interpose them with normal resource conversions.
799444c061aSmrg                 */
800444c061aSmrg		XrmQuark	    from_type;
801444c061aSmrg		XrmValue            from_val, to_val;
802444c061aSmrg		Boolean		    converted;
803444c061aSmrg
804444c061aSmrg		from_type = StringToQuark(arg->type);
805444c061aSmrg    		from_val.size = arg->size;
806444c061aSmrg		if ((from_type == QString) || ((unsigned) arg->size > sizeof(XtArgVal)))
807444c061aSmrg        	    from_val.addr = (XPointer)arg->value;
808444c061aSmrg	        else
809444c061aSmrg            	    from_val.addr = (XPointer)&arg->value;
810444c061aSmrg		to_val.size = rx->xrm_size;
811444c061aSmrg		to_val.addr = base - rx->xrm_offset - 1;
812444c061aSmrg		converted = _XtConvert(widget, from_type, &from_val,
813444c061aSmrg				       xrm_type, &to_val, cache_ptr);
814444c061aSmrg		if (converted) {
815444c061aSmrg
816444c061aSmrg		    /* Copy the converted value back into the typed argument.
817444c061aSmrg		     * normally the data should be <= sizeof(XtArgVal) and
818444c061aSmrg		     * is stored directly into the 'value' field .... BUT
819444c061aSmrg		     * if the resource size is greater than sizeof(XtArgVal)
820444c061aSmrg		     * then we dynamically alloc a block of store to hold the
821444c061aSmrg		     * data and zap a copy in there !!! .... freeing it later
822444c061aSmrg		     * the size field in the typed arg is negated to indicate
823444c061aSmrg		     * that the store pointed to by the value field is
824444c061aSmrg		     * dynamic .......
825444c061aSmrg		     * "freeing" happens in the case of _XtCreate after the
826444c061aSmrg		     * CallInitialize ..... other clients of GetResources
827444c061aSmrg		     * using typed args should be aware of the need to free
828444c061aSmrg		     * this store .....
829444c061aSmrg		     */
830444c061aSmrg
831444c061aSmrg		    if(rx->xrm_size > sizeof(XtArgVal)) {
832444c061aSmrg			arg->value = (XtArgVal) __XtMalloc(rx->xrm_size);
833444c061aSmrg			arg->size = -(arg->size);
834444c061aSmrg		    } else { /* will fit - copy directly into value field */
835444c061aSmrg			arg->value = (XtArgVal) NULL;
836444c061aSmrg		    }
837444c061aSmrg		    CopyToArg((char *)(base - rx->xrm_offset - 1),
838444c061aSmrg				 &arg->value, rx->xrm_size);
839444c061aSmrg
840444c061aSmrg		} else {
841444c061aSmrg		   /* Conversion failed. Get default value. */
842444c061aSmrg		   found[j] = False;
843444c061aSmrg		}
844444c061aSmrg
845444c061aSmrg		if (cache_ptr && *cache_ptr)
846444c061aSmrg		    cache_ptr++;
847444c061aSmrg	    }
848444c061aSmrg
849444c061aSmrg	    if (!found[j]) {
850444c061aSmrg		Boolean	already_copied = False;
851444c061aSmrg		Boolean have_value = False;
852444c061aSmrg
853444c061aSmrg		if (XrmQGetSearchResource(searchList,
854444c061aSmrg			rx->xrm_name, rx->xrm_class, &rawType, &value)) {
855444c061aSmrg		    if (rawType != xrm_type) {
856444c061aSmrg			convValue.size = rx->xrm_size;
857444c061aSmrg			convValue.addr = (XPointer)(base - rx->xrm_offset - 1);
858444c061aSmrg			already_copied = have_value =
859444c061aSmrg			    _XtConvert(widget, rawType, &value,
860444c061aSmrg				       xrm_type, &convValue, cache_ptr);
861444c061aSmrg			if (cache_ptr && *cache_ptr)
862444c061aSmrg			    cache_ptr++;
863444c061aSmrg		    } else have_value = True;
864444c061aSmrg		    if (have_value && rx->xrm_name == Qtranslations)
865444c061aSmrg			do_tm_hack = True;
866444c061aSmrg		}
867444c061aSmrg		LOCK_PROCESS;
868444c061aSmrg		if (!have_value
869444c061aSmrg		    && ((rx->xrm_default_type == QImmediate)
870444c061aSmrg			|| (rx->xrm_default_type == xrm_type)
871444c061aSmrg			|| (rx->xrm_default_addr != NULL))) {
872444c061aSmrg		    /* Convert default value to proper type */
873444c061aSmrg		    xrm_default_type = rx->xrm_default_type;
874444c061aSmrg		    if (xrm_default_type == QCallProc) {
875444c061aSmrg#ifdef CRAY
876444c061aSmrg 			if ( (int) Cjumpp != (int) Cjump)
877444c061aSmrg 			    (*(XtResourceDefaultProc)
878444c061aSmrg			      (((int)(rx->xrm_default_addr))<<2))(
879444c061aSmrg 				 widget,-(rx->xrm_offset+1), &value);
880444c061aSmrg			else
881444c061aSmrg#endif
882444c061aSmrg			(*(XtResourceDefaultProc)(rx->xrm_default_addr))(
883444c061aSmrg			      widget,-(rx->xrm_offset+1), &value);
884444c061aSmrg
885444c061aSmrg		    } else if (xrm_default_type == QImmediate) {
886444c061aSmrg			/* XtRImmediate == XtRString for type XtRString */
887444c061aSmrg			if (xrm_type == QString) {
888444c061aSmrg			    value.addr = rx->xrm_default_addr;
889444c061aSmrg			} else if (rx->xrm_size == sizeof(int)) {
890444c061aSmrg			    int_val = (int)(long)rx->xrm_default_addr;
891444c061aSmrg			    value.addr = (XPointer) &int_val;
892444c061aSmrg			} else if (rx->xrm_size == sizeof(short)) {
893444c061aSmrg			    short_val = (short)(long)rx->xrm_default_addr;
894444c061aSmrg			    value.addr = (XPointer) &short_val;
895444c061aSmrg			} else if (rx->xrm_size == sizeof(char)) {
896444c061aSmrg			    char_val = (char)(long)rx->xrm_default_addr;
897444c061aSmrg			    value.addr = (XPointer) &char_val;
898444c061aSmrg			} else if (rx->xrm_size == sizeof(long)) {
899444c061aSmrg			    long_val = (long)rx->xrm_default_addr;
900444c061aSmrg			    value.addr = (XPointer) &long_val;
901444c061aSmrg			} else if (rx->xrm_size == sizeof(char*)) {
902444c061aSmrg			    char_ptr = (char*)rx->xrm_default_addr;
903444c061aSmrg			    value.addr = (XPointer) &char_ptr;
904444c061aSmrg			} else {
905444c061aSmrg			    value.addr = (XPointer) &(rx->xrm_default_addr);
906444c061aSmrg			}
907444c061aSmrg		    } else if (xrm_default_type == xrm_type) {
908444c061aSmrg			value.addr = rx->xrm_default_addr;
909444c061aSmrg		    } else {
910444c061aSmrg			value.addr = rx->xrm_default_addr;
911444c061aSmrg			if (xrm_default_type == QString) {
912444c061aSmrg			    value.size = strlen((char *)value.addr) + 1;
913444c061aSmrg			} else {
914444c061aSmrg			    value.size = sizeof(XtPointer);
915444c061aSmrg			}
916444c061aSmrg			convValue.size = rx->xrm_size;
917444c061aSmrg			convValue.addr = (XPointer)(base - rx->xrm_offset - 1);
918444c061aSmrg			already_copied =
919444c061aSmrg			    _XtConvert(widget, xrm_default_type, &value,
920444c061aSmrg				       xrm_type, &convValue, cache_ptr);
921444c061aSmrg			if (!already_copied)
922444c061aSmrg			    value.addr = NULL;
923444c061aSmrg			if (cache_ptr && *cache_ptr)
924444c061aSmrg			    cache_ptr++;
925444c061aSmrg		    }
926444c061aSmrg		}
927444c061aSmrg		if (!already_copied) {
928444c061aSmrg		    if (xrm_type == QString) {
929444c061aSmrg			*((String*)(base - rx->xrm_offset - 1)) = value.addr;
930444c061aSmrg		    } else {
931444c061aSmrg			if (value.addr != NULL) {
932444c061aSmrg			    XtMemmove(base - rx->xrm_offset - 1,
933444c061aSmrg				      value.addr, rx->xrm_size);
934444c061aSmrg			} else {
935444c061aSmrg			    /* didn't get value, initialize to NULL... */
936444c061aSmrg			    XtBZero(base - rx->xrm_offset - 1, rx->xrm_size);
937444c061aSmrg			}
938444c061aSmrg		    }
939444c061aSmrg		}
940444c061aSmrg		UNLOCK_PROCESS;
941444c061aSmrg
942444c061aSmrg		if (typed[j]) {
943444c061aSmrg		    /*
944444c061aSmrg		     * This resource value was specified as a typed arg.
945444c061aSmrg		     * However, the default value is being used here since
946444c061aSmrg		     * type type conversion failed, so we compress the list.
947444c061aSmrg		     */
948444c061aSmrg		    register XtTypedArg* arg = typed_args + typed[j] - 1;
949444c061aSmrg		    register int i;
950444c061aSmrg
951444c061aSmrg		    for (i = num_typed_args - typed[j]; i; i--, arg++) {
952444c061aSmrg			*arg = *(arg+1);
953444c061aSmrg		    }
954444c061aSmrg		    num_typed_args--;
955444c061aSmrg		}
956444c061aSmrg	    }
957444c061aSmrg	}
958444c061aSmrg	if (tm_hack)
959444c061aSmrg	    widget->core.tm.current_state = NULL;
960444c061aSmrg	if (tm_hack &&
961444c061aSmrg	    (!widget->core.tm.translations ||
962444c061aSmrg	     (do_tm_hack &&
963444c061aSmrg	      widget->core.tm.translations->operation != XtTableReplace)) &&
964444c061aSmrg	    XrmQGetSearchResource(searchList, QbaseTranslations,
965444c061aSmrg				  QTranslations, &rawType, &value)) {
966444c061aSmrg	    if (rawType != QTranslationTable) {
967444c061aSmrg		convValue.size = sizeof(XtTranslations);
968444c061aSmrg		convValue.addr = (XPointer)&widget->core.tm.current_state;
969444c061aSmrg		(void)_XtConvert(widget, rawType, &value,
970444c061aSmrg				 QTranslationTable, &convValue, cache_ptr);
971444c061aSmrg		if (cache_ptr && *cache_ptr)
972444c061aSmrg		    cache_ptr++;
973444c061aSmrg	    } else {
974444c061aSmrg		*((XtTranslations *)&widget->core.tm.current_state) =
975444c061aSmrg		    *((XtTranslations *)value.addr);
976444c061aSmrg	    }
977444c061aSmrg	}
978444c061aSmrg    }
979444c061aSmrg    if ((Cardinal)num_typed_args != *pNumTypedArgs) *pNumTypedArgs = num_typed_args;
980444c061aSmrg    if (searchList != stackSearchList) XtFree((char*)searchList);
981444c061aSmrg    if (!cache_ptr)
982444c061aSmrg	cache_ptr = cache_base;
983444c061aSmrg    if (cache_ptr && cache_ptr != cache_ref) {
984444c061aSmrg	int cache_ref_size = cache_ptr - cache_ref;
985444c061aSmrg	XtCacheRef *refs = (XtCacheRef*)
986444c061aSmrg	    __XtMalloc((unsigned)sizeof(XtCacheRef)*(cache_ref_size + 1));
987444c061aSmrg	(void) memmove(refs, cache_ref, sizeof(XtCacheRef)*cache_ref_size );
988444c061aSmrg	refs[cache_ref_size] = NULL;
989444c061aSmrg	return refs;
990444c061aSmrg    }
991444c061aSmrg    return (XtCacheRef*)NULL;
992444c061aSmrg}
993444c061aSmrg
994444c061aSmrg
995444c061aSmrg
996444c061aSmrgstatic void CacheArgs(
997444c061aSmrg    ArgList	    args,
998444c061aSmrg    Cardinal	    num_args,
999444c061aSmrg    XtTypedArgList  typed_args,
1000444c061aSmrg    Cardinal	    num_typed_args,
1001444c061aSmrg    XrmQuarkList    quark_cache,
1002444c061aSmrg    Cardinal	    num_quarks,
1003444c061aSmrg    XrmQuarkList    *pQuarks)       /* RETURN */
1004444c061aSmrg{
1005444c061aSmrg    register XrmQuarkList   quarks;
1006444c061aSmrg    register Cardinal       i;
1007444c061aSmrg    register Cardinal       count;
1008444c061aSmrg
1009444c061aSmrg    count = (args != NULL) ? num_args : num_typed_args;
1010444c061aSmrg
1011444c061aSmrg    if (num_quarks < count) {
1012444c061aSmrg	quarks = (XrmQuarkList) __XtMalloc(count * sizeof(XrmQuark));
1013444c061aSmrg    } else {
1014444c061aSmrg	quarks = quark_cache;
1015444c061aSmrg    }
1016444c061aSmrg    *pQuarks = quarks;
1017444c061aSmrg
1018444c061aSmrg    if (args != NULL) {
1019444c061aSmrg	for (i = count; i; i--)
1020444c061aSmrg	    *quarks++ = StringToQuark((args++)->name);
1021444c061aSmrg    }
1022444c061aSmrg    else {
1023444c061aSmrg	for (i = count; i; i--)
1024444c061aSmrg	    *quarks++ = StringToQuark((typed_args++)->name);
1025444c061aSmrg    }
1026444c061aSmrg}
1027444c061aSmrg
1028444c061aSmrg#define FreeCache(cache, pointer) \
1029444c061aSmrg	  if (cache != pointer) XtFree((char *)pointer)
1030444c061aSmrg
1031444c061aSmrg
1032444c061aSmrgXtCacheRef *_XtGetResources(
1033444c061aSmrg    register 	Widget	  	w,
1034444c061aSmrg    		ArgList	  	args,
1035444c061aSmrg    		Cardinal  	num_args,
1036444c061aSmrg		XtTypedArgList	typed_args,
1037444c061aSmrg		Cardinal*	num_typed_args)
1038444c061aSmrg{
1039444c061aSmrg    XrmName	    *names, names_s[50];
1040444c061aSmrg    XrmClass	    *classes, classes_s[50];
1041444c061aSmrg    XrmQuark	    quark_cache[100];
1042444c061aSmrg    XrmQuarkList    quark_args;
1043444c061aSmrg    WidgetClass     wc;
1044444c061aSmrg    ConstraintWidgetClass   cwc;
1045444c061aSmrg    XtCacheRef	    *cache_refs, *cache_refs_core;
1046444c061aSmrg    Cardinal	    count;
1047444c061aSmrg
1048444c061aSmrg    wc = XtClass(w);
1049444c061aSmrg
1050444c061aSmrg    count = CountTreeDepth(w);
1051444c061aSmrg    names = (XrmName*) XtStackAlloc (count * sizeof(XrmName), names_s);
1052444c061aSmrg    classes = (XrmClass*) XtStackAlloc (count * sizeof(XrmClass), classes_s);
1053444c061aSmrg    if (names == NULL || classes == NULL) _XtAllocError(NULL);
1054444c061aSmrg
1055444c061aSmrg    /* Get names, classes for widget and ancestors */
1056444c061aSmrg    GetNamesAndClasses(w, names, classes);
1057444c061aSmrg
1058444c061aSmrg    /* Compile arg list into quarks */
1059444c061aSmrg    CacheArgs(args, num_args, typed_args, *num_typed_args, quark_cache,
1060444c061aSmrg	      XtNumber(quark_cache), &quark_args);
1061444c061aSmrg
1062444c061aSmrg    /* Get normal resources */
1063444c061aSmrg    LOCK_PROCESS;
1064444c061aSmrg    cache_refs = GetResources(w, (char*)w, names, classes,
1065444c061aSmrg	(XrmResourceList *) wc->core_class.resources,
1066444c061aSmrg	wc->core_class.num_resources, quark_args, args, num_args,
1067444c061aSmrg	typed_args, num_typed_args, XtIsWidget(w));
1068444c061aSmrg
1069444c061aSmrg    if (w->core.constraints != NULL) {
1070444c061aSmrg	cwc = (ConstraintWidgetClass) XtClass(w->core.parent);
1071444c061aSmrg	cache_refs_core =
1072444c061aSmrg	    GetResources(w, (char*)w->core.constraints, names, classes,
1073444c061aSmrg	    (XrmResourceList *) cwc->constraint_class.resources,
1074444c061aSmrg	    cwc->constraint_class.num_resources,
1075444c061aSmrg	    quark_args, args, num_args, typed_args, num_typed_args, False);
1076444c061aSmrg	if (cache_refs_core) {
1077444c061aSmrg	    XtFree((char *)cache_refs_core);
1078444c061aSmrg	}
1079444c061aSmrg    }
1080444c061aSmrg    FreeCache(quark_cache, quark_args);
1081444c061aSmrg    UNLOCK_PROCESS;
1082444c061aSmrg    XtStackFree((XtPointer)names, names_s);
1083444c061aSmrg    XtStackFree((XtPointer)classes, classes_s);
1084444c061aSmrg    return cache_refs;
1085444c061aSmrg} /* _XtGetResources */
1086444c061aSmrg
1087444c061aSmrg
1088444c061aSmrgvoid _XtGetSubresources (
1089444c061aSmrg    Widget	  w,			/* Widget "parent" of subobject   */
1090444c061aSmrg    XtPointer	  base,			/* Base address to write to       */
1091444c061aSmrg    const char*   name,			/* name of subobject		    */
1092444c061aSmrg    const char*   class,		/* class of subobject		    */
1093444c061aSmrg    XtResourceList resources,		/* resource list for subobject    */
1094444c061aSmrg    Cardinal	  num_resources,
1095444c061aSmrg    ArgList	  args,			/* arg list to override resources */
1096444c061aSmrg    Cardinal	  num_args,
1097444c061aSmrg    XtTypedArgList typed_args,
1098444c061aSmrg    Cardinal      num_typed_args)
1099444c061aSmrg{
1100444c061aSmrg    XrmName	  *names, names_s[50];
1101444c061aSmrg    XrmClass	  *classes, classes_s[50];
1102444c061aSmrg    XrmQuark	  quark_cache[100];
1103444c061aSmrg    XrmQuarkList  quark_args;
1104444c061aSmrg    XrmResourceList* table;
1105444c061aSmrg    Cardinal	  count, ntyped_args = num_typed_args;
1106444c061aSmrg    XtCacheRef    *Resrc = NULL;
1107444c061aSmrg    WIDGET_TO_APPCON(w);
1108444c061aSmrg
1109444c061aSmrg    if (num_resources == 0) return;
1110444c061aSmrg
1111444c061aSmrg    LOCK_APP(app);
1112444c061aSmrg    count = CountTreeDepth(w);
1113444c061aSmrg    count++;	/* make sure there's enough room for name and class */
1114444c061aSmrg    names = (XrmName*) XtStackAlloc(count * sizeof(XrmName), names_s);
1115444c061aSmrg    classes = (XrmClass*) XtStackAlloc(count * sizeof(XrmClass), classes_s);
1116444c061aSmrg    if (names == NULL || classes == NULL) _XtAllocError(NULL);
1117444c061aSmrg
1118444c061aSmrg    /* Get full name, class of subobject */
1119444c061aSmrg    GetNamesAndClasses(w, names, classes);
1120444c061aSmrg    count -= 2;
1121444c061aSmrg    names[count] = StringToName(name);
1122444c061aSmrg    classes[count] = StringToClass(class);
1123444c061aSmrg    count++;
1124444c061aSmrg    names[count] = NULLQUARK;
1125444c061aSmrg    classes[count] = NULLQUARK;
1126444c061aSmrg
1127444c061aSmrg    /* Compile arg list into quarks */
1128444c061aSmrg    CacheArgs(args, num_args, typed_args, num_typed_args,
1129444c061aSmrg	      quark_cache, XtNumber(quark_cache), &quark_args);
1130444c061aSmrg
1131444c061aSmrg    /* Compile resource list if needed */
1132444c061aSmrg    if (((int) resources->resource_offset) >= 0) {
1133444c061aSmrg	XrmCompileResourceListEphem(resources, num_resources);
1134444c061aSmrg    }
1135444c061aSmrg    table = _XtCreateIndirectionTable(resources, num_resources);
1136444c061aSmrg    Resrc = GetResources(w, (char*)base, names, classes, table, num_resources,
1137444c061aSmrg			quark_args, args, num_args,
1138444c061aSmrg			typed_args, &ntyped_args, False);
1139444c061aSmrg    FreeCache(quark_cache, quark_args);
1140444c061aSmrg    XtFree((char *)table);
1141444c061aSmrg    XtFree((char *)Resrc);
1142444c061aSmrg    XtStackFree((XtPointer)names, names_s);
1143444c061aSmrg    XtStackFree((XtPointer)classes, classes_s);
1144444c061aSmrg    UNLOCK_APP(app);
1145444c061aSmrg}
1146444c061aSmrg
1147444c061aSmrgvoid XtGetSubresources (
1148444c061aSmrg    Widget	  w,			/* Widget "parent" of subobject   */
1149444c061aSmrg    XtPointer	  base,			/* Base address to write to       */
1150444c061aSmrg    _Xconst char* name,			/* name of subobject		    */
1151444c061aSmrg    _Xconst char* class,		/* class of subobject		    */
1152444c061aSmrg    XtResourceList resources,		/* resource list for subobject    */
1153444c061aSmrg    Cardinal	  num_resources,
1154444c061aSmrg    ArgList	  args,			/* arg list to override resources */
1155444c061aSmrg    Cardinal	  num_args)
1156444c061aSmrg{
1157444c061aSmrg    _XtGetSubresources (w, base, name, class, resources, num_resources, args, num_args, NULL, 0);
1158444c061aSmrg}
1159444c061aSmrg
1160444c061aSmrg
1161444c061aSmrgvoid _XtGetApplicationResources (
1162444c061aSmrg    Widget	    w,		  /* Application shell widget       */
1163444c061aSmrg    XtPointer	    base,	  /* Base address to write to       */
1164444c061aSmrg    XtResourceList  resources,	  /* resource list for subobject    */
1165444c061aSmrg    Cardinal	    num_resources,
1166444c061aSmrg    ArgList	    args,	  /* arg list to override resources */
1167444c061aSmrg    Cardinal	    num_args,
1168444c061aSmrg    XtTypedArgList  typed_args,
1169444c061aSmrg    Cardinal	    num_typed_args)
1170444c061aSmrg{
1171444c061aSmrg    XrmName	    *names, names_s[50];
1172444c061aSmrg    XrmClass	    *classes, classes_s[50];
1173444c061aSmrg    XrmQuark	    quark_cache[100];
1174444c061aSmrg    XrmQuarkList    quark_args;
1175444c061aSmrg    XrmResourceList* table;
1176444c061aSmrg    Cardinal        count, ntyped_args = num_typed_args;
1177444c061aSmrg#ifdef XTHREADS
1178444c061aSmrg    XtAppContext    app;
1179444c061aSmrg#endif
1180444c061aSmrg    XtCacheRef	    *Resrc = NULL;
1181444c061aSmrg
1182444c061aSmrg    if (num_resources == 0) return;
1183444c061aSmrg
1184444c061aSmrg#ifdef XTHREADS
1185444c061aSmrg    if (w == NULL) app = _XtDefaultAppContext();
1186444c061aSmrg    else app = XtWidgetToApplicationContext(w);
1187444c061aSmrg#endif
1188444c061aSmrg
1189444c061aSmrg    LOCK_APP(app);
1190444c061aSmrg    /* Get full name, class of application */
1191444c061aSmrg    if (w == NULL) {
1192444c061aSmrg	/* hack for R2 compatibility */
1193444c061aSmrg	XtPerDisplay pd = _XtGetPerDisplay(_XtDefaultAppContext()->list[0]);
1194444c061aSmrg	names = (XrmName*) XtStackAlloc (2 * sizeof(XrmName), names_s);
1195444c061aSmrg	classes = (XrmClass*) XtStackAlloc (2 * sizeof(XrmClass), classes_s);
1196444c061aSmrg	names[0] = pd->name;
1197444c061aSmrg	names[1] = NULLQUARK;
1198444c061aSmrg	classes[0] = pd->class;
1199444c061aSmrg	classes[1] = NULLQUARK;
1200444c061aSmrg    }
1201444c061aSmrg    else {
1202444c061aSmrg	count = CountTreeDepth(w);
1203444c061aSmrg        names = (XrmName*) XtStackAlloc(count * sizeof(XrmName), names_s);
1204444c061aSmrg        classes = (XrmClass*) XtStackAlloc(count * sizeof(XrmClass), classes_s);
1205444c061aSmrg	if (names == NULL || classes == NULL) _XtAllocError(NULL);
1206444c061aSmrg	GetNamesAndClasses(w, names, classes);
1207444c061aSmrg    }
1208444c061aSmrg
1209444c061aSmrg    /* Compile arg list into quarks */
1210444c061aSmrg    CacheArgs(args, num_args, typed_args, num_typed_args,  quark_cache,
1211444c061aSmrg	XtNumber(quark_cache), &quark_args);
1212444c061aSmrg    /* Compile resource list if needed */
1213444c061aSmrg    if (((int) resources->resource_offset) >= 0) {
1214444c061aSmrg#ifdef	CRAY2
1215444c061aSmrg 	if (base == 0) {	/* this client is non-portable, but... */
1216444c061aSmrg 	    int count;
1217444c061aSmrg	    XtResourceList  res = resources;
1218444c061aSmrg	    for (count = 0; count < num_resources; res++, count++) {
1219444c061aSmrg 		res->resource_offset *= sizeof(long);
1220444c061aSmrg 	    }
1221444c061aSmrg 	}
1222444c061aSmrg#endif	/* CRAY2 */
1223444c061aSmrg	XrmCompileResourceListEphem(resources, num_resources);
1224444c061aSmrg    }
1225444c061aSmrg    table = _XtCreateIndirectionTable(resources,num_resources);
1226444c061aSmrg
1227444c061aSmrg    Resrc = GetResources(w, (char*)base, names, classes, table, num_resources,
1228444c061aSmrg			quark_args, args, num_args,
1229444c061aSmrg			typed_args, &ntyped_args, False);
1230444c061aSmrg    FreeCache(quark_cache, quark_args);
1231444c061aSmrg    XtFree((char *)table);
1232444c061aSmrg    XtFree((char *)Resrc);
1233444c061aSmrg    if (w != NULL) {
1234444c061aSmrg	XtStackFree((XtPointer)names, names_s);
1235444c061aSmrg	XtStackFree((XtPointer)classes, classes_s);
1236444c061aSmrg    }
1237444c061aSmrg    UNLOCK_APP(app);
1238444c061aSmrg}
1239444c061aSmrg
1240444c061aSmrgvoid XtGetApplicationResources (
1241444c061aSmrg    Widget	    w,		  /* Application shell widget       */
1242444c061aSmrg    XtPointer	    base,	  /* Base address to write to       */
1243444c061aSmrg    XtResourceList  resources,	  /* resource list for subobject    */
1244444c061aSmrg    Cardinal	    num_resources,
1245444c061aSmrg    ArgList	    args,	  /* arg list to override resources */
1246444c061aSmrg    Cardinal	    num_args)
1247444c061aSmrg{
1248444c061aSmrg    _XtGetApplicationResources(w, base, resources, num_resources, args, num_args, NULL, 0);
1249444c061aSmrg}
1250444c061aSmrg
1251444c061aSmrgstatic Boolean initialized = FALSE;
1252444c061aSmrg
1253444c061aSmrgvoid _XtResourceListInitialize(void)
1254444c061aSmrg{
1255444c061aSmrg    LOCK_PROCESS;
1256444c061aSmrg    if (initialized) {
1257444c061aSmrg	XtWarningMsg("initializationError","xtInitialize",XtCXtToolkitError,
1258444c061aSmrg                  "Initializing Resource Lists twice",
1259444c061aSmrg		  (String *)NULL, (Cardinal *)NULL);
1260444c061aSmrg	UNLOCK_PROCESS;
1261444c061aSmrg    	return;
1262444c061aSmrg    }
1263444c061aSmrg    initialized = TRUE;
1264444c061aSmrg    UNLOCK_PROCESS;
1265444c061aSmrg
1266444c061aSmrg    QBoolean = XrmPermStringToQuark(XtCBoolean);
1267444c061aSmrg    QString = XrmPermStringToQuark(XtCString);
1268444c061aSmrg    QCallProc = XrmPermStringToQuark(XtRCallProc);
1269444c061aSmrg    QImmediate = XrmPermStringToQuark(XtRImmediate);
1270444c061aSmrg    QinitialResourcesPersistent = XrmPermStringToQuark(XtNinitialResourcesPersistent);
1271444c061aSmrg    QInitialResourcesPersistent = XrmPermStringToQuark(XtCInitialResourcesPersistent);
1272444c061aSmrg    Qtranslations = XrmPermStringToQuark(XtNtranslations);
1273444c061aSmrg    QbaseTranslations = XrmPermStringToQuark("baseTranslations");
1274444c061aSmrg    QTranslations = XrmPermStringToQuark(XtCTranslations);
1275444c061aSmrg    QTranslationTable = XrmPermStringToQuark(XtRTranslationTable);
1276444c061aSmrg    Qscreen = XrmPermStringToQuark(XtNscreen);
1277444c061aSmrg    QScreen = XrmPermStringToQuark(XtCScreen);
1278444c061aSmrg}
1279