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