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