Converters.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
27444c061aSmrgPermission to use, copy, modify, and distribute this software and its
28444c061aSmrgdocumentation for any purpose and without fee is hereby granted,
29444c061aSmrgprovided that the above copyright notice appear in all copies and that
30444c061aSmrgboth 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
33444c061aSmrgsoftware 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/* Conversion.c - implementations of resource type conversion procs */
73444c061aSmrg
74444c061aSmrg#ifdef HAVE_CONFIG_H
75444c061aSmrg#include <config.h>
76444c061aSmrg#endif
77444c061aSmrg#include	"IntrinsicI.h"
78444c061aSmrg#include	"StringDefs.h"
79444c061aSmrg#include	"Shell.h"
80444c061aSmrg#include	<stdio.h>
81444c061aSmrg#include        <X11/cursorfont.h>
82444c061aSmrg#include	<X11/keysym.h>
83444c061aSmrg#include	<X11/Xlocale.h>
84444c061aSmrg#include	<errno.h>	/* for StringToDirectoryString */
85444c061aSmrg
86444c061aSmrg#ifdef __UNIXOS2__
87444c061aSmrg#define IsNewline(str) ((str) == '\n' || (str) == '\r')
88444c061aSmrg#define IsWhitespace(str) ((str)== ' ' || (str) == '\t' || (str) == '\r')
89444c061aSmrg#else
90444c061aSmrg#define IsNewline(str) ((str) == '\n')
91444c061aSmrg#define IsWhitespace(str) ((str)== ' ' || (str) == '\t')
92444c061aSmrg#endif
93444c061aSmrg
94444c061aSmrgstatic const String XtNwrongParameters = "wrongParameters";
95444c061aSmrgstatic const String XtNconversionError = "conversionError";
96444c061aSmrgstatic const String XtNmissingCharsetList = "missingCharsetList";
97444c061aSmrg
98444c061aSmrg/* Representation types */
99444c061aSmrg
100444c061aSmrg#define XtQAtom			XrmPermStringToQuark(XtRAtom)
101444c061aSmrg#define XtQCommandArgArray	XrmPermStringToQuark(XtRCommandArgArray)
102444c061aSmrg#define XtQCursor		XrmPermStringToQuark(XtRCursor)
103444c061aSmrg#define XtQDirectoryString	XrmPermStringToQuark(XtRDirectoryString)
104444c061aSmrg#define XtQDisplay		XrmPermStringToQuark(XtRDisplay)
105444c061aSmrg#define XtQFile			XrmPermStringToQuark(XtRFile)
106444c061aSmrg#define XtQFloat		XrmPermStringToQuark(XtRFloat)
107444c061aSmrg#define XtQInitialState		XrmPermStringToQuark(XtRInitialState)
108444c061aSmrg#define XtQPixmap		XrmPermStringToQuark(XtRPixmap)
109444c061aSmrg#define XtQRestartStyle 	XrmPermStringToQuark(XtRRestartStyle)
110444c061aSmrg#define XtQShort		XrmPermStringToQuark(XtRShort)
111444c061aSmrg#define XtQUnsignedChar		XrmPermStringToQuark(XtRUnsignedChar)
112444c061aSmrg#define XtQVisual		XrmPermStringToQuark(XtRVisual)
113444c061aSmrg
114444c061aSmrgstatic XrmQuark  XtQBool;
115444c061aSmrgstatic XrmQuark  XtQBoolean;
116444c061aSmrgstatic XrmQuark  XtQColor;
117444c061aSmrgstatic XrmQuark  XtQDimension;
118444c061aSmrgstatic XrmQuark  XtQFont;
119444c061aSmrgstatic XrmQuark  XtQFontSet;
120444c061aSmrgstatic XrmQuark  XtQFontStruct;
121444c061aSmrgstatic XrmQuark  XtQGravity;
122444c061aSmrgstatic XrmQuark  XtQInt;
123444c061aSmrgstatic XrmQuark  XtQPixel;
124444c061aSmrgstatic XrmQuark  XtQPosition;
125444c061aSmrg#ifdef __UNIXOS2__
126444c061aSmrgXrmQuark  _XtQString = 0;
127444c061aSmrg#else
128444c061aSmrgXrmQuark  _XtQString;
129444c061aSmrg#endif
130444c061aSmrg
131444c061aSmrgvoid _XtConvertInitialize(void)
132444c061aSmrg{
133444c061aSmrg    XtQBool		= XrmPermStringToQuark(XtRBool);
134444c061aSmrg    XtQBoolean		= XrmPermStringToQuark(XtRBoolean);
135444c061aSmrg    XtQColor		= XrmPermStringToQuark(XtRColor);
136444c061aSmrg    XtQDimension	= XrmPermStringToQuark(XtRDimension);
137444c061aSmrg    XtQFont		= XrmPermStringToQuark(XtRFont);
138444c061aSmrg    XtQFontSet		= XrmPermStringToQuark(XtRFontSet);
139444c061aSmrg    XtQFontStruct	= XrmPermStringToQuark(XtRFontStruct);
140444c061aSmrg    XtQGravity		= XrmPermStringToQuark(XtRGravity);
141444c061aSmrg    XtQInt		= XrmPermStringToQuark(XtRInt);
142444c061aSmrg    XtQPixel		= XrmPermStringToQuark(XtRPixel);
143444c061aSmrg    XtQPosition		= XrmPermStringToQuark(XtRPosition);
144444c061aSmrg    _XtQString		= XrmPermStringToQuark(XtRString);
145444c061aSmrg}
146444c061aSmrg
147444c061aSmrg#define	donestr(type, value, tstr) \
148444c061aSmrg	{							\
149444c061aSmrg	    if (toVal->addr != NULL) {				\
150444c061aSmrg		if (toVal->size < sizeof(type)) {		\
151444c061aSmrg		    toVal->size = sizeof(type);			\
152444c061aSmrg		    XtDisplayStringConversionWarning(dpy, 	\
153444c061aSmrg			(char*) fromVal->addr, tstr);		\
154444c061aSmrg		    return False;				\
155444c061aSmrg		}						\
156444c061aSmrg		*(type*)(toVal->addr) = (value);		\
157444c061aSmrg	    }							\
158444c061aSmrg	    else {						\
159444c061aSmrg		static type static_val;				\
160444c061aSmrg		static_val = (value);				\
161444c061aSmrg		toVal->addr = (XPointer)&static_val;		\
162444c061aSmrg	    }							\
163444c061aSmrg	    toVal->size = sizeof(type);				\
164444c061aSmrg	    return True;					\
165444c061aSmrg	}
166444c061aSmrg
167444c061aSmrg#define	done(type, value) \
168444c061aSmrg	{							\
169444c061aSmrg	    if (toVal->addr != NULL) {				\
170444c061aSmrg		if (toVal->size < sizeof(type)) {		\
171444c061aSmrg		    toVal->size = sizeof(type);			\
172444c061aSmrg		    return False;				\
173444c061aSmrg		}						\
174444c061aSmrg		*(type*)(toVal->addr) = (value);		\
175444c061aSmrg	    }							\
176444c061aSmrg	    else {						\
177444c061aSmrg		static type static_val;				\
178444c061aSmrg		static_val = (value);				\
179444c061aSmrg		toVal->addr = (XPointer)&static_val;		\
180444c061aSmrg	    }							\
181444c061aSmrg	    toVal->size = sizeof(type);				\
182444c061aSmrg	    return True;					\
183444c061aSmrg	}
184444c061aSmrg
185444c061aSmrgvoid XtDisplayStringConversionWarning(
186444c061aSmrg    Display* dpy,
187444c061aSmrg    _Xconst char* from,
188444c061aSmrg    _Xconst char* toType
189444c061aSmrg    )
190444c061aSmrg{
191444c061aSmrg#ifndef NO_MIT_HACKS
192444c061aSmrg    /* Allow suppression of conversion warnings. %%%  Not specified. */
193444c061aSmrg
194444c061aSmrg    static enum {Check, Report, Ignore} report_it = Check;
195444c061aSmrg    XtAppContext app = XtDisplayToApplicationContext(dpy);
196444c061aSmrg
197444c061aSmrg    LOCK_APP(app);
198444c061aSmrg    LOCK_PROCESS;
199444c061aSmrg    if (report_it == Check) {
200444c061aSmrg	XrmDatabase rdb = XtDatabase(dpy);
201444c061aSmrg	XrmName xrm_name[2];
202444c061aSmrg	XrmClass xrm_class[2];
203444c061aSmrg	XrmRepresentation rep_type;
204444c061aSmrg	XrmValue value;
205444c061aSmrg	xrm_name[0] = XrmPermStringToQuark( "stringConversionWarnings" );
206444c061aSmrg	xrm_name[1] = 0;
207444c061aSmrg	xrm_class[0] = XrmPermStringToQuark( "StringConversionWarnings" );
208444c061aSmrg	xrm_class[1] = 0;
209444c061aSmrg	if (XrmQGetResource( rdb, xrm_name, xrm_class,
210444c061aSmrg			     &rep_type, &value ))
211444c061aSmrg	{
212444c061aSmrg	    if (rep_type == XtQBoolean)
213444c061aSmrg		report_it = *(Boolean*)value.addr ? Report : Ignore;
214444c061aSmrg	    else if (rep_type == _XtQString) {
215444c061aSmrg		XrmValue toVal;
216444c061aSmrg		Boolean report;
217444c061aSmrg		toVal.addr = (XPointer)&report;
218444c061aSmrg		toVal.size = sizeof(Boolean);
219444c061aSmrg		if (XtCallConverter(dpy, XtCvtStringToBoolean, (XrmValuePtr)NULL,
220444c061aSmrg				    (Cardinal)0, &value, &toVal,
221444c061aSmrg				    (XtCacheRef*)NULL))
222444c061aSmrg		    report_it = report ? Report : Ignore;
223444c061aSmrg	    }
224444c061aSmrg	    else report_it = Report;
225444c061aSmrg	}
226444c061aSmrg	else report_it = Report;
227444c061aSmrg    }
228444c061aSmrg
229444c061aSmrg    if (report_it == Report) {
230444c061aSmrg#endif /* ifndef NO_MIT_HACKS */
231444c061aSmrg	String params[2];
232444c061aSmrg	Cardinal num_params = 2;
233444c061aSmrg	params[0] = (String)from;
234444c061aSmrg	params[1] = (String)toType;
235444c061aSmrg	XtAppWarningMsg(app,
236444c061aSmrg		   XtNconversionError,"string",XtCXtToolkitError,
237444c061aSmrg		   "Cannot convert string \"%s\" to type %s",
238444c061aSmrg		    params,&num_params);
239444c061aSmrg#ifndef NO_MIT_HACKS
240444c061aSmrg    }
241444c061aSmrg#endif /* ifndef NO_MIT_HACKS */
242444c061aSmrg    UNLOCK_PROCESS;
243444c061aSmrg    UNLOCK_APP(app);
244444c061aSmrg}
245444c061aSmrg
246444c061aSmrgvoid XtStringConversionWarning(
247444c061aSmrg    _Xconst char* from,
248444c061aSmrg    _Xconst char* toType
249444c061aSmrg    )
250444c061aSmrg{
251444c061aSmrg	String params[2];
252444c061aSmrg	Cardinal num_params = 2;
253444c061aSmrg	params[0] = (String)from;
254444c061aSmrg	params[1] = (String)toType;
255444c061aSmrg	XtWarningMsg(XtNconversionError,"string",XtCXtToolkitError,
256444c061aSmrg		   "Cannot convert string \"%s\" to type %s",
257444c061aSmrg		    params,&num_params);
258444c061aSmrg}
259444c061aSmrg
260444c061aSmrgstatic int CompareISOLatin1(char *, char *);
261444c061aSmrg
262444c061aSmrg
263444c061aSmrgstatic Boolean IsInteger(
264444c061aSmrg    String string,
265444c061aSmrg    int *value)
266444c061aSmrg{
267444c061aSmrg    Boolean foundDigit = False;
268444c061aSmrg    Boolean isNegative = False;
269444c061aSmrg    Boolean isPositive = False;
270444c061aSmrg    int val = 0;
271444c061aSmrg    char ch;
272444c061aSmrg    /* skip leading whitespace */
273444c061aSmrg#ifndef __UNIXOS2__
274444c061aSmrg    while ((ch = *string) == ' ' || ch == '\t') string++;
275444c061aSmrg#else
276444c061aSmrg    while ((ch = *string) == ' ' || ch == '\t' || ch == '\r') string++;
277444c061aSmrg#endif
278444c061aSmrg    while ((ch = *string++)) {
279444c061aSmrg	if (ch >= '0' && ch <= '9') {
280444c061aSmrg	    val *= 10;
281444c061aSmrg	    val += ch - '0';
282444c061aSmrg	    foundDigit = True;
283444c061aSmrg	    continue;
284444c061aSmrg	}
285444c061aSmrg	if (IsWhitespace(ch)) {
286444c061aSmrg	    if (!foundDigit) return False;
287444c061aSmrg	    /* make sure only trailing whitespace */
288444c061aSmrg	    while ((ch = *string++)) {
289444c061aSmrg		if (!IsWhitespace(ch))
290444c061aSmrg		    return False;
291444c061aSmrg	    }
292444c061aSmrg	    break;
293444c061aSmrg	}
294444c061aSmrg	if (ch == '-' && !foundDigit && !isNegative && !isPositive) {
295444c061aSmrg	    isNegative = True;
296444c061aSmrg	    continue;
297444c061aSmrg	}
298444c061aSmrg	if (ch == '+' && !foundDigit && !isNegative && !isPositive) {
299444c061aSmrg	    isPositive = True;
300444c061aSmrg	    continue;
301444c061aSmrg	}
302444c061aSmrg	return False;
303444c061aSmrg    }
304444c061aSmrg    if (ch == '\0') {
305444c061aSmrg	if (isNegative)
306444c061aSmrg	    *value = -val;
307444c061aSmrg	else
308444c061aSmrg	    *value = val;
309444c061aSmrg	return True;
310444c061aSmrg    }
311444c061aSmrg    return False;
312444c061aSmrg}
313444c061aSmrg
314444c061aSmrg
315444c061aSmrg/*ARGSUSED*/
316444c061aSmrgBoolean XtCvtIntToBoolean(
317444c061aSmrg    Display*	dpy,
318444c061aSmrg    XrmValuePtr args,
319444c061aSmrg    Cardinal    *num_args,
320444c061aSmrg    XrmValuePtr	fromVal,
321444c061aSmrg    XrmValuePtr	toVal,
322444c061aSmrg    XtPointer	*closure_ret)
323444c061aSmrg{
324444c061aSmrg    if (*num_args != 0)
325444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
326444c061aSmrg		  XtNwrongParameters,"cvtIntToBoolean",XtCXtToolkitError,
327444c061aSmrg                  "Integer to Boolean conversion needs no extra arguments",
328444c061aSmrg                   (String *)NULL, (Cardinal *)NULL);
329444c061aSmrg    done(Boolean, (*(int *)fromVal->addr != 0));
330444c061aSmrg}
331444c061aSmrg
332444c061aSmrg
333444c061aSmrg/*ARGSUSED*/
334444c061aSmrgBoolean XtCvtIntToShort(
335444c061aSmrg    Display*	dpy,
336444c061aSmrg    XrmValuePtr args,
337444c061aSmrg    Cardinal    *num_args,
338444c061aSmrg    XrmValuePtr	fromVal,
339444c061aSmrg    XrmValuePtr	toVal,
340444c061aSmrg    XtPointer	*closure_ret)
341444c061aSmrg{
342444c061aSmrg    if (*num_args != 0)
343444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
344444c061aSmrg		  XtNwrongParameters,"cvtIntToShort",XtCXtToolkitError,
345444c061aSmrg                  "Integer to Short conversion needs no extra arguments",
346444c061aSmrg                   (String *)NULL, (Cardinal *)NULL);
347444c061aSmrg    done(short, (*(int *)fromVal->addr));
348444c061aSmrg}
349444c061aSmrg
350444c061aSmrg
351444c061aSmrg/*ARGSUSED*/
352444c061aSmrgBoolean XtCvtStringToBoolean(
353444c061aSmrg    Display*	dpy,
354444c061aSmrg    XrmValuePtr args,
355444c061aSmrg    Cardinal    *num_args,
356444c061aSmrg    XrmValuePtr	fromVal,
357444c061aSmrg    XrmValuePtr	toVal,
358444c061aSmrg    XtPointer	*closure_ret)
359444c061aSmrg{
360444c061aSmrg    String str = (String)fromVal->addr;
361444c061aSmrg    if (*num_args != 0)
362444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
363444c061aSmrg		  XtNwrongParameters,"cvtStringToBoolean",XtCXtToolkitError,
364444c061aSmrg                  "String to Boolean conversion needs no extra arguments",
365444c061aSmrg                   (String *)NULL, (Cardinal *)NULL);
366444c061aSmrg
367444c061aSmrg    if (   (CompareISOLatin1(str, "true") == 0)
368444c061aSmrg	|| (CompareISOLatin1(str, "yes") == 0)
369444c061aSmrg	|| (CompareISOLatin1(str, "on") == 0)
370444c061aSmrg	|| (CompareISOLatin1(str, "1") == 0))	donestr( Boolean, True, XtRBoolean );
371444c061aSmrg
372444c061aSmrg    if (   (CompareISOLatin1(str, "false") == 0)
373444c061aSmrg	|| (CompareISOLatin1(str, "no") == 0)
374444c061aSmrg	|| (CompareISOLatin1(str, "off") == 0)
375444c061aSmrg	|| (CompareISOLatin1(str, "0") == 0))	donestr( Boolean, False, XtRBoolean );
376444c061aSmrg
377444c061aSmrg    XtDisplayStringConversionWarning(dpy, str, XtRBoolean);
378444c061aSmrg    return False;
379444c061aSmrg}
380444c061aSmrg
381444c061aSmrg
382444c061aSmrg/*ARGSUSED*/
383444c061aSmrgBoolean XtCvtIntToBool(
384444c061aSmrg    Display*	dpy,
385444c061aSmrg    XrmValuePtr args,
386444c061aSmrg    Cardinal    *num_args,
387444c061aSmrg    XrmValuePtr	fromVal,
388444c061aSmrg    XrmValuePtr	toVal,
389444c061aSmrg    XtPointer	*closure_ret)
390444c061aSmrg{
391444c061aSmrg    if (*num_args != 0)
392444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
393444c061aSmrg		  XtNwrongParameters,"cvtIntToBool",XtCXtToolkitError,
394444c061aSmrg                  "Integer to Bool conversion needs no extra arguments",
395444c061aSmrg                   (String *)NULL, (Cardinal *)NULL);
396444c061aSmrg    done(Bool, (*(int *)fromVal->addr != 0));
397444c061aSmrg}
398444c061aSmrg
399444c061aSmrg
400444c061aSmrg/*ARGSUSED*/
401444c061aSmrgBoolean XtCvtStringToBool(
402444c061aSmrg    Display*	dpy,
403444c061aSmrg    XrmValuePtr args,
404444c061aSmrg    Cardinal    *num_args,
405444c061aSmrg    XrmValuePtr	fromVal,
406444c061aSmrg    XrmValuePtr	toVal,
407444c061aSmrg    XtPointer	*closure_ret)
408444c061aSmrg{
409444c061aSmrg    String str = (String)fromVal->addr;
410444c061aSmrg    if (*num_args != 0)
411444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
412444c061aSmrg		XtNwrongParameters,"cvtStringToBool",
413444c061aSmrg		XtCXtToolkitError,
414444c061aSmrg                 "String to Bool conversion needs no extra arguments",
415444c061aSmrg                  (String *)NULL, (Cardinal *)NULL);
416444c061aSmrg
417444c061aSmrg    if (   (CompareISOLatin1(str, "true") == 0)
418444c061aSmrg	|| (CompareISOLatin1(str, "yes") == 0)
419444c061aSmrg	|| (CompareISOLatin1(str, "on") == 0)
420444c061aSmrg	|| (CompareISOLatin1(str, "1") == 0))	donestr( Bool, True, XtRBool );
421444c061aSmrg
422444c061aSmrg    if (   (CompareISOLatin1(str, "false") == 0)
423444c061aSmrg	|| (CompareISOLatin1(str, "no") == 0)
424444c061aSmrg	|| (CompareISOLatin1(str, "off") == 0)
425444c061aSmrg	|| (CompareISOLatin1(str, "0") == 0))	donestr( Bool, False, XtRBool );
426444c061aSmrg
427444c061aSmrg    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRBool);
428444c061aSmrg    return False;
429444c061aSmrg}
430444c061aSmrg
431444c061aSmrgXtConvertArgRec const colorConvertArgs[] = {
432444c061aSmrg    {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen),
433444c061aSmrg     sizeof(Screen *)},
434444c061aSmrg    {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.colormap),
435444c061aSmrg     sizeof(Colormap)}
436444c061aSmrg};
437444c061aSmrg
438444c061aSmrg
439444c061aSmrg/* ARGSUSED */
440444c061aSmrgBoolean XtCvtIntToColor(
441444c061aSmrg    Display*	dpy,
442444c061aSmrg    XrmValuePtr args,
443444c061aSmrg    Cardinal    *num_args,
444444c061aSmrg    XrmValuePtr	fromVal,
445444c061aSmrg    XrmValuePtr	toVal,
446444c061aSmrg    XtPointer	*closure_ret)
447444c061aSmrg{
448444c061aSmrg    XColor	c;
449444c061aSmrg    Screen	*screen;
450444c061aSmrg    Colormap	colormap;
451444c061aSmrg
452444c061aSmrg    if (*num_args != 2) {
453444c061aSmrg      XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
454444c061aSmrg	 XtNwrongParameters,"cvtIntOrPixelToXColor",XtCXtToolkitError,
455444c061aSmrg         "Pixel to color conversion needs screen and colormap arguments",
456444c061aSmrg          (String *)NULL, (Cardinal *)NULL);
457444c061aSmrg      return False;
458444c061aSmrg    }
459444c061aSmrg    screen = *((Screen **) args[0].addr);
460444c061aSmrg    colormap = *((Colormap *) args[1].addr);
461444c061aSmrg    c.pixel = *(int *)fromVal->addr;
462444c061aSmrg
463444c061aSmrg    XQueryColor(DisplayOfScreen(screen), colormap, &c);
464444c061aSmrg    done(XColor, c);
465444c061aSmrg}
466444c061aSmrg
467444c061aSmrg
468444c061aSmrgBoolean XtCvtStringToPixel(
469444c061aSmrg    Display*	dpy,
470444c061aSmrg    XrmValuePtr args,
471444c061aSmrg    Cardinal    *num_args,
472444c061aSmrg    XrmValuePtr	fromVal,
473444c061aSmrg    XrmValuePtr	toVal,
474444c061aSmrg    XtPointer	*closure_ret)
475444c061aSmrg{
476444c061aSmrg    String	    str = (String)fromVal->addr;
477444c061aSmrg    XColor	    screenColor;
478444c061aSmrg    XColor	    exactColor;
479444c061aSmrg    Screen	    *screen;
480444c061aSmrg    XtPerDisplay    pd = _XtGetPerDisplay(dpy);
481444c061aSmrg    Colormap	    colormap;
482444c061aSmrg    Status	    status;
483444c061aSmrg    String          params[1];
484444c061aSmrg    Cardinal	    num_params=1;
485444c061aSmrg
486444c061aSmrg    if (*num_args != 2) {
487444c061aSmrg     XtAppWarningMsg(pd->appContext, XtNwrongParameters, "cvtStringToPixel",
488444c061aSmrg		     XtCXtToolkitError,
489444c061aSmrg	"String to pixel conversion needs screen and colormap arguments",
490444c061aSmrg        (String *)NULL, (Cardinal *)NULL);
491444c061aSmrg     return False;
492444c061aSmrg    }
493444c061aSmrg
494444c061aSmrg    screen = *((Screen **) args[0].addr);
495444c061aSmrg    colormap = *((Colormap *) args[1].addr);
496444c061aSmrg
497444c061aSmrg    if (CompareISOLatin1(str, XtDefaultBackground) == 0) {
4982265a131Smrg	*closure_ret = NULL;
499444c061aSmrg	if (pd->rv) donestr(Pixel, BlackPixelOfScreen(screen), XtRPixel)
500444c061aSmrg	else	    donestr(Pixel, WhitePixelOfScreen(screen), XtRPixel);
501444c061aSmrg    }
502444c061aSmrg    if (CompareISOLatin1(str, XtDefaultForeground) == 0) {
5032265a131Smrg	*closure_ret = NULL;
504444c061aSmrg	if (pd->rv) donestr(Pixel, WhitePixelOfScreen(screen), XtRPixel)
505444c061aSmrg        else	    donestr(Pixel, BlackPixelOfScreen(screen), XtRPixel);
506444c061aSmrg    }
507444c061aSmrg
508444c061aSmrg    status = XAllocNamedColor(DisplayOfScreen(screen), colormap,
509444c061aSmrg			      (char*)str, &screenColor, &exactColor);
510444c061aSmrg    if (status == 0) {
511444c061aSmrg	String msg, type;
512444c061aSmrg	params[0] = str;
513444c061aSmrg	/* Server returns a specific error code but Xlib discards it.  Ugh */
514444c061aSmrg	if (XLookupColor(DisplayOfScreen(screen), colormap, (char*)str,
515444c061aSmrg			 &exactColor, &screenColor)) {
516444c061aSmrg	    type = "noColormap";
517444c061aSmrg	    msg = "Cannot allocate colormap entry for \"%s\"";
518444c061aSmrg	}
519444c061aSmrg	else {
520444c061aSmrg	    type = "badValue";
521444c061aSmrg	    msg = "Color name \"%s\" is not defined";
522444c061aSmrg	}
523444c061aSmrg
524444c061aSmrg	XtAppWarningMsg(pd->appContext, type, "cvtStringToPixel",
525444c061aSmrg			XtCXtToolkitError, msg, params, &num_params);
5262265a131Smrg	*closure_ret = NULL;
527444c061aSmrg	return False;
528444c061aSmrg    } else {
529444c061aSmrg	*closure_ret = (char*)True;
530444c061aSmrg        donestr(Pixel, screenColor.pixel, XtRPixel);
531444c061aSmrg    }
532444c061aSmrg}
533444c061aSmrg
534444c061aSmrg/* ARGSUSED */
535444c061aSmrgstatic void FreePixel(
536444c061aSmrg    XtAppContext app,
537444c061aSmrg    XrmValuePtr	toVal,
538444c061aSmrg    XtPointer	closure,
539444c061aSmrg    XrmValuePtr	args,
540444c061aSmrg    Cardinal	*num_args)
541444c061aSmrg{
542444c061aSmrg    Screen	    *screen;
543444c061aSmrg    Colormap	    colormap;
544444c061aSmrg
545444c061aSmrg    if (*num_args != 2) {
546444c061aSmrg     XtAppWarningMsg(app, XtNwrongParameters,"freePixel",XtCXtToolkitError,
547444c061aSmrg	"Freeing a pixel requires screen and colormap arguments",
548444c061aSmrg        (String *)NULL, (Cardinal *)NULL);
549444c061aSmrg     return;
550444c061aSmrg    }
551444c061aSmrg
552444c061aSmrg    screen = *((Screen **) args[0].addr);
553444c061aSmrg    colormap = *((Colormap *) args[1].addr);
554444c061aSmrg
555444c061aSmrg    if (closure) {
556444c061aSmrg	XFreeColors( DisplayOfScreen(screen), colormap,
557444c061aSmrg		     (unsigned long*)toVal->addr, 1, (unsigned long)0
558444c061aSmrg		    );
559444c061aSmrg    }
560444c061aSmrg}
561444c061aSmrg
562444c061aSmrg
563444c061aSmrg/* no longer used by Xt, but it's in the spec */
564444c061aSmrgXtConvertArgRec const screenConvertArg[] = {
565444c061aSmrg    {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen),
566444c061aSmrg     sizeof(Screen *)}
567444c061aSmrg};
568444c061aSmrg
569444c061aSmrg/*ARGSUSED*/
570444c061aSmrgstatic void FetchDisplayArg(
571444c061aSmrg    Widget widget,
572444c061aSmrg    Cardinal *size,
573444c061aSmrg    XrmValue* value)
574444c061aSmrg{
575444c061aSmrg    if (widget == NULL)
576444c061aSmrg	XtErrorMsg("missingWidget", "fetchDisplayArg", XtCXtToolkitError,
577444c061aSmrg		   "FetchDisplayArg called without a widget to reference",
578444c061aSmrg		   (String*)NULL, (Cardinal*)NULL);
579444c061aSmrg        /* can't return any useful Display and caller will de-ref NULL,
580444c061aSmrg	   so aborting is the only useful option */
581444c061aSmrg
582444c061aSmrg    value->size = sizeof(Display*);
583444c061aSmrg    value->addr = (XPointer)&DisplayOfScreen(XtScreenOfObject(widget));
584444c061aSmrg}
585444c061aSmrg
586444c061aSmrgstatic XtConvertArgRec const displayConvertArg[] = {
587444c061aSmrg    {XtProcedureArg, (XtPointer)FetchDisplayArg, 0},
588444c061aSmrg};
589444c061aSmrg
590444c061aSmrg/*ARGSUSED*/
591444c061aSmrgBoolean XtCvtStringToCursor(
592444c061aSmrg    Display*	dpy,
593444c061aSmrg    XrmValuePtr args,
594444c061aSmrg    Cardinal    *num_args,
595444c061aSmrg    XrmValuePtr	fromVal,
596444c061aSmrg    XrmValuePtr	toVal,
597444c061aSmrg    XtPointer	*closure_ret)
598444c061aSmrg{
599444c061aSmrg    static const struct _CursorName {
600444c061aSmrg	const char	*name;
601444c061aSmrg	unsigned int	shape;
602444c061aSmrg    } cursor_names[] = {
603444c061aSmrg			{"X_cursor",		XC_X_cursor},
604444c061aSmrg			{"arrow",		XC_arrow},
605444c061aSmrg			{"based_arrow_down",	XC_based_arrow_down},
606444c061aSmrg			{"based_arrow_up",	XC_based_arrow_up},
607444c061aSmrg			{"boat",		XC_boat},
608444c061aSmrg			{"bogosity",		XC_bogosity},
609444c061aSmrg			{"bottom_left_corner",	XC_bottom_left_corner},
610444c061aSmrg			{"bottom_right_corner",	XC_bottom_right_corner},
611444c061aSmrg			{"bottom_side",		XC_bottom_side},
612444c061aSmrg			{"bottom_tee",		XC_bottom_tee},
613444c061aSmrg			{"box_spiral",		XC_box_spiral},
614444c061aSmrg			{"center_ptr",		XC_center_ptr},
615444c061aSmrg			{"circle",		XC_circle},
616444c061aSmrg			{"clock",		XC_clock},
617444c061aSmrg			{"coffee_mug",		XC_coffee_mug},
618444c061aSmrg			{"cross",		XC_cross},
619444c061aSmrg			{"cross_reverse",	XC_cross_reverse},
620444c061aSmrg			{"crosshair",		XC_crosshair},
621444c061aSmrg			{"diamond_cross",	XC_diamond_cross},
622444c061aSmrg			{"dot",			XC_dot},
623444c061aSmrg			{"dotbox",		XC_dotbox},
624444c061aSmrg			{"double_arrow",	XC_double_arrow},
625444c061aSmrg			{"draft_large",		XC_draft_large},
626444c061aSmrg			{"draft_small",		XC_draft_small},
627444c061aSmrg			{"draped_box",		XC_draped_box},
628444c061aSmrg			{"exchange",		XC_exchange},
629444c061aSmrg			{"fleur",		XC_fleur},
630444c061aSmrg			{"gobbler",		XC_gobbler},
631444c061aSmrg			{"gumby",		XC_gumby},
632444c061aSmrg			{"hand1",		XC_hand1},
633444c061aSmrg			{"hand2",		XC_hand2},
634444c061aSmrg			{"heart",		XC_heart},
635444c061aSmrg			{"icon",		XC_icon},
636444c061aSmrg			{"iron_cross",		XC_iron_cross},
637444c061aSmrg			{"left_ptr",		XC_left_ptr},
638444c061aSmrg			{"left_side",		XC_left_side},
639444c061aSmrg			{"left_tee",		XC_left_tee},
640444c061aSmrg			{"leftbutton",		XC_leftbutton},
641444c061aSmrg			{"ll_angle",		XC_ll_angle},
642444c061aSmrg			{"lr_angle",		XC_lr_angle},
643444c061aSmrg			{"man",			XC_man},
644444c061aSmrg			{"middlebutton",	XC_middlebutton},
645444c061aSmrg			{"mouse",		XC_mouse},
646444c061aSmrg			{"pencil",		XC_pencil},
647444c061aSmrg			{"pirate",		XC_pirate},
648444c061aSmrg			{"plus",		XC_plus},
649444c061aSmrg			{"question_arrow",	XC_question_arrow},
650444c061aSmrg			{"right_ptr",		XC_right_ptr},
651444c061aSmrg			{"right_side",		XC_right_side},
652444c061aSmrg			{"right_tee",		XC_right_tee},
653444c061aSmrg			{"rightbutton",		XC_rightbutton},
654444c061aSmrg			{"rtl_logo",		XC_rtl_logo},
655444c061aSmrg			{"sailboat",		XC_sailboat},
656444c061aSmrg			{"sb_down_arrow",	XC_sb_down_arrow},
657444c061aSmrg			{"sb_h_double_arrow",	XC_sb_h_double_arrow},
658444c061aSmrg			{"sb_left_arrow",	XC_sb_left_arrow},
659444c061aSmrg			{"sb_right_arrow",	XC_sb_right_arrow},
660444c061aSmrg			{"sb_up_arrow",		XC_sb_up_arrow},
661444c061aSmrg			{"sb_v_double_arrow",	XC_sb_v_double_arrow},
662444c061aSmrg			{"shuttle",		XC_shuttle},
663444c061aSmrg			{"sizing",		XC_sizing},
664444c061aSmrg			{"spider",		XC_spider},
665444c061aSmrg			{"spraycan",		XC_spraycan},
666444c061aSmrg			{"star",		XC_star},
667444c061aSmrg			{"target",		XC_target},
668444c061aSmrg			{"tcross",		XC_tcross},
669444c061aSmrg			{"top_left_arrow",	XC_top_left_arrow},
670444c061aSmrg			{"top_left_corner",	XC_top_left_corner},
671444c061aSmrg			{"top_right_corner",	XC_top_right_corner},
672444c061aSmrg			{"top_side",		XC_top_side},
673444c061aSmrg			{"top_tee",		XC_top_tee},
674444c061aSmrg			{"trek",		XC_trek},
675444c061aSmrg			{"ul_angle",		XC_ul_angle},
676444c061aSmrg			{"umbrella",		XC_umbrella},
677444c061aSmrg			{"ur_angle",		XC_ur_angle},
678444c061aSmrg			{"watch",		XC_watch},
679444c061aSmrg			{"xterm",		XC_xterm},
680444c061aSmrg    };
681444c061aSmrg    const struct _CursorName *nP;
682444c061aSmrg    char *name = (char *)fromVal->addr;
683444c061aSmrg    register Cardinal i;
684444c061aSmrg
685444c061aSmrg    if (*num_args != 1) {
686444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
687444c061aSmrg	     XtNwrongParameters,"cvtStringToCursor",XtCXtToolkitError,
688444c061aSmrg             "String to cursor conversion needs display argument",
689444c061aSmrg              (String *)NULL, (Cardinal *)NULL);
690444c061aSmrg	return False;
691444c061aSmrg    }
692444c061aSmrg
693444c061aSmrg    for (i=0, nP=cursor_names; i < XtNumber(cursor_names); i++, nP++ ) {
694444c061aSmrg	if (strcmp(name, nP->name) == 0) {
695444c061aSmrg	    Display *display = *(Display**)args[0].addr;
696444c061aSmrg	    Cursor cursor = XCreateFontCursor(display, nP->shape );
697444c061aSmrg	    donestr(Cursor, cursor, XtRCursor);
698444c061aSmrg	}
699444c061aSmrg    }
700444c061aSmrg    XtDisplayStringConversionWarning(dpy, name, XtRCursor);
701444c061aSmrg    return False;
702444c061aSmrg}
703444c061aSmrg
704444c061aSmrg/* ARGSUSED */
705444c061aSmrgstatic void FreeCursor(
706444c061aSmrg    XtAppContext app,
707444c061aSmrg    XrmValuePtr	toVal,
708444c061aSmrg    XtPointer	closure,	/* unused */
709444c061aSmrg    XrmValuePtr	args,
710444c061aSmrg    Cardinal	*num_args)
711444c061aSmrg{
712444c061aSmrg    Display*	display;
713444c061aSmrg
714444c061aSmrg    if (*num_args != 1) {
715444c061aSmrg     XtAppWarningMsg(app,
716444c061aSmrg	     XtNwrongParameters,"freeCursor",XtCXtToolkitError,
717444c061aSmrg             "Free Cursor requires display argument",
718444c061aSmrg              (String *)NULL, (Cardinal *)NULL);
719444c061aSmrg     return;
720444c061aSmrg    }
721444c061aSmrg
722444c061aSmrg    display = *(Display**)args[0].addr;
723444c061aSmrg    XFreeCursor( display, *(Cursor*)toVal->addr );
724444c061aSmrg}
725444c061aSmrg
726444c061aSmrg/*ARGSUSED*/
727444c061aSmrgBoolean XtCvtStringToDisplay(
728444c061aSmrg    Display*	dpy,
729444c061aSmrg    XrmValuePtr args,
730444c061aSmrg    Cardinal    *num_args,
731444c061aSmrg    XrmValuePtr	fromVal,
732444c061aSmrg    XrmValuePtr	toVal,
733444c061aSmrg    XtPointer	*closure_ret)
734444c061aSmrg{
735444c061aSmrg    Display	*d;
736444c061aSmrg
737444c061aSmrg    if (*num_args != 0)
738444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
739444c061aSmrg		  XtNwrongParameters,"cvtStringToDisplay",XtCXtToolkitError,
740444c061aSmrg                  "String to Display conversion needs no extra arguments",
741444c061aSmrg                   (String *)NULL, (Cardinal *)NULL);
742444c061aSmrg
743444c061aSmrg    d = XOpenDisplay((char *)fromVal->addr);
744444c061aSmrg    if (d != NULL)
745444c061aSmrg	donestr(Display*, d, XtRDisplay);
746444c061aSmrg
747444c061aSmrg    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRDisplay);
748444c061aSmrg    return False;
749444c061aSmrg}
750444c061aSmrg
751444c061aSmrg
752444c061aSmrg/*ARGSUSED*/
753444c061aSmrgBoolean XtCvtStringToFile(
754444c061aSmrg    Display*	dpy,
755444c061aSmrg    XrmValuePtr args,
756444c061aSmrg    Cardinal    *num_args,
757444c061aSmrg    XrmValuePtr	fromVal,
758444c061aSmrg    XrmValuePtr	toVal,
759444c061aSmrg    XtPointer	*closure_ret)
760444c061aSmrg{
761444c061aSmrg    FILE *f;
762444c061aSmrg
763444c061aSmrg    if (*num_args != 0)
764444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
765444c061aSmrg		 XtNwrongParameters,"cvtStringToFile",XtCXtToolkitError,
766444c061aSmrg                 "String to File conversion needs no extra arguments",
767444c061aSmrg                 (String *) NULL, (Cardinal *)NULL);
768444c061aSmrg
769444c061aSmrg    f = fopen((char *)fromVal->addr, "r");
770444c061aSmrg    if (f != NULL)
771444c061aSmrg	donestr(FILE*, f, XtRFile);
772444c061aSmrg
773444c061aSmrg    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRFile);
774444c061aSmrg    return False;
775444c061aSmrg}
776444c061aSmrg
777444c061aSmrg/* ARGSUSED */
778444c061aSmrgstatic void FreeFile(
779444c061aSmrg    XtAppContext app,
780444c061aSmrg    XrmValuePtr	toVal,
781444c061aSmrg    XtPointer	closure,	/* unused */
782444c061aSmrg    XrmValuePtr	args,		/* unused */
783444c061aSmrg    Cardinal	*num_args)
784444c061aSmrg{
785444c061aSmrg    if (*num_args != 0)
786444c061aSmrg	XtAppWarningMsg(app,
787444c061aSmrg		 XtNwrongParameters,"freeFile",XtCXtToolkitError,
788444c061aSmrg                 "Free File requires no extra arguments",
789444c061aSmrg                 (String *) NULL, (Cardinal *)NULL);
790444c061aSmrg
791444c061aSmrg    fclose( *(FILE**)toVal->addr );
792444c061aSmrg}
793444c061aSmrg
794444c061aSmrg/*ARGSUSED*/
795444c061aSmrgBoolean XtCvtIntToFloat(
796444c061aSmrg    Display*	dpy,
797444c061aSmrg    XrmValuePtr args,
798444c061aSmrg    Cardinal    *num_args,
799444c061aSmrg    XrmValuePtr	fromVal,
800444c061aSmrg    XrmValuePtr	toVal,
801444c061aSmrg    XtPointer	*closure_ret)
802444c061aSmrg{
803444c061aSmrg    if (*num_args != 0)
804444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
805444c061aSmrg		  XtNwrongParameters,"cvtIntToFloat",XtCXtToolkitError,
806444c061aSmrg                  "Integer to Float conversion needs no extra arguments",
807444c061aSmrg                   (String *)NULL, (Cardinal *)NULL);
808444c061aSmrg    done(float, (*(int *)fromVal->addr));
809444c061aSmrg}
810444c061aSmrg
811444c061aSmrg/*ARGSUSED*/
812444c061aSmrgBoolean XtCvtStringToFloat(
813444c061aSmrg    Display*	dpy,
814444c061aSmrg    XrmValuePtr args,
815444c061aSmrg    Cardinal    *num_args,
816444c061aSmrg    XrmValuePtr	fromVal,
817444c061aSmrg    XrmValuePtr	toVal,
818444c061aSmrg    XtPointer	*closure_ret)
819444c061aSmrg{
820444c061aSmrg    int ret;
821444c061aSmrg    float f, nan;
822444c061aSmrg
823444c061aSmrg#ifndef ISC /* On ISC this generates a core dump :-( at least with gs */
824444c061aSmrg    /* depending on the system this may or may not do anything useful */
825444c061aSmrg    (void) sscanf ("NaNS", "%g",
826444c061aSmrg		   toVal->addr != NULL ? (float*) toVal->addr : &nan);
827444c061aSmrg#endif
828444c061aSmrg
829444c061aSmrg    if (*num_args != 0)
830444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
831444c061aSmrg		 XtNwrongParameters,"cvtStringToFloat",XtCXtToolkitError,
832444c061aSmrg                 "String to Float conversion needs no extra arguments",
833444c061aSmrg                 (String *) NULL, (Cardinal *)NULL);
834444c061aSmrg
835444c061aSmrg    ret = sscanf (fromVal->addr, "%g", &f);
836444c061aSmrg    if (ret == 0) {
837444c061aSmrg	if (toVal->addr != NULL && toVal->size == sizeof nan)
838444c061aSmrg	    *(float*)toVal->addr = nan;
839444c061aSmrg	XtDisplayStringConversionWarning (dpy, (char*) fromVal->addr, XtRFloat);
840444c061aSmrg	return False;
841444c061aSmrg    }
842444c061aSmrg    donestr(float, f, XtRFloat);
843444c061aSmrg}
844444c061aSmrg
845444c061aSmrg/*ARGSUSED*/
846444c061aSmrgBoolean XtCvtStringToFont(
847444c061aSmrg    Display*	dpy,
848444c061aSmrg    XrmValuePtr args,
849444c061aSmrg    Cardinal    *num_args,
850444c061aSmrg    XrmValuePtr	fromVal,
851444c061aSmrg    XrmValuePtr	toVal,
852444c061aSmrg    XtPointer	*closure_ret)
853444c061aSmrg{
854444c061aSmrg    Font	f;
855444c061aSmrg    Display*	display;
856444c061aSmrg
857444c061aSmrg    if (*num_args != 1) {
858444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
859444c061aSmrg	     XtNwrongParameters,"cvtStringToFont",XtCXtToolkitError,
860444c061aSmrg             "String to font conversion needs display argument",
861444c061aSmrg              (String *) NULL, (Cardinal *)NULL);
862444c061aSmrg	return False;
863444c061aSmrg    }
864444c061aSmrg
865444c061aSmrg    display = *(Display**)args[0].addr;
866444c061aSmrg
867444c061aSmrg    if (CompareISOLatin1((String)fromVal->addr, XtDefaultFont) != 0) {
868444c061aSmrg	f = XLoadFont(display, (char *)fromVal->addr);
869444c061aSmrg	if (f != 0) {
870444c061aSmrg  Done:	    donestr( Font, f, XtRFont );
871444c061aSmrg	}
872444c061aSmrg	XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRFont);
873444c061aSmrg    }
874444c061aSmrg    /* try and get the default font */
875444c061aSmrg
876444c061aSmrg    {
877444c061aSmrg	XrmName xrm_name[2];
878444c061aSmrg	XrmClass xrm_class[2];
879444c061aSmrg	XrmRepresentation rep_type;
880444c061aSmrg	XrmValue value;
881444c061aSmrg
882444c061aSmrg	xrm_name[0] = XrmPermStringToQuark ("xtDefaultFont");
883444c061aSmrg	xrm_name[1] = 0;
884444c061aSmrg	xrm_class[0] = XrmPermStringToQuark ("XtDefaultFont");
885444c061aSmrg	xrm_class[1] = 0;
886444c061aSmrg	if (XrmQGetResource(XtDatabase(display), xrm_name, xrm_class,
887444c061aSmrg			    &rep_type, &value)) {
888444c061aSmrg	    if (rep_type == _XtQString) {
889444c061aSmrg		f = XLoadFont(display, (char *)value.addr);
890444c061aSmrg		if (f != 0)
891444c061aSmrg		    goto Done;
892444c061aSmrg		else
893444c061aSmrg		    XtDisplayStringConversionWarning(dpy, (char *)value.addr,
894444c061aSmrg						     XtRFont);
895444c061aSmrg	    } else if (rep_type == XtQFont) {
896444c061aSmrg		f = *(Font*)value.addr;
897444c061aSmrg		goto Done;
898444c061aSmrg	    } else if (rep_type == XtQFontStruct) {
899444c061aSmrg		f = ((XFontStruct*)value.addr)->fid;
900444c061aSmrg		goto Done;
901444c061aSmrg	    }
902444c061aSmrg	}
903444c061aSmrg    }
904444c061aSmrg    /* Should really do XListFonts, but most servers support this */
905444c061aSmrg    f = XLoadFont(display, "-*-*-*-R-*-*-*-120-*-*-*-*-ISO8859-*");
906444c061aSmrg    if (f != 0)
907444c061aSmrg	goto Done;
908444c061aSmrg
909444c061aSmrg    XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
910444c061aSmrg		    "noFont","cvtStringToFont",XtCXtToolkitError,
911444c061aSmrg		    "Unable to load any usable ISO8859 font",
912444c061aSmrg		    (String *) NULL, (Cardinal *)NULL);
913444c061aSmrg
914444c061aSmrg    return False;
915444c061aSmrg}
916444c061aSmrg
917444c061aSmrg/* ARGSUSED */
918444c061aSmrgstatic void FreeFont(
919444c061aSmrg    XtAppContext app,
920444c061aSmrg    XrmValuePtr	toVal,
921444c061aSmrg    XtPointer	closure,	/* unused */
922444c061aSmrg    XrmValuePtr	args,
923444c061aSmrg    Cardinal	*num_args)
924444c061aSmrg{
925444c061aSmrg    Display *display;
926444c061aSmrg    if (*num_args != 1) {
927444c061aSmrg	XtAppWarningMsg(app,
928444c061aSmrg	     XtNwrongParameters,"freeFont",XtCXtToolkitError,
929444c061aSmrg             "Free Font needs display argument",
930444c061aSmrg              (String *) NULL, (Cardinal *)NULL);
931444c061aSmrg	return;
932444c061aSmrg    }
933444c061aSmrg
934444c061aSmrg    display = *(Display**)args[0].addr;
935444c061aSmrg    XUnloadFont( display, *(Font*)toVal->addr );
936444c061aSmrg}
937444c061aSmrg
938444c061aSmrg/*ARGSUSED*/
939444c061aSmrgBoolean XtCvtIntToFont(
940444c061aSmrg    Display*	dpy,
941444c061aSmrg    XrmValuePtr args,
942444c061aSmrg    Cardinal    *num_args,
943444c061aSmrg    XrmValuePtr	fromVal,
944444c061aSmrg    XrmValuePtr	toVal,
945444c061aSmrg    XtPointer	*closure_ret)
946444c061aSmrg{
947444c061aSmrg    if (*num_args != 0)
948444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
949444c061aSmrg	   XtNwrongParameters,"cvtIntToFont",XtCXtToolkitError,
950444c061aSmrg           "Integer to Font conversion needs no extra arguments",
951444c061aSmrg            (String *) NULL, (Cardinal *)NULL);
952444c061aSmrg    done(Font, *(int*)fromVal->addr);
953444c061aSmrg}
954444c061aSmrg
955444c061aSmrg/*ARGSUSED*/
956444c061aSmrgBoolean XtCvtStringToFontSet(
957444c061aSmrg    Display*    dpy,
958444c061aSmrg    XrmValuePtr args,
959444c061aSmrg    Cardinal    *num_args,
960444c061aSmrg    XrmValuePtr fromVal,
961444c061aSmrg    XrmValuePtr toVal,
962444c061aSmrg    XtPointer   *closure_ret)
963444c061aSmrg{
964444c061aSmrg    XFontSet  f;
965444c061aSmrg    Display*  display;
966444c061aSmrg    char**    missing_charset_list;
967444c061aSmrg    int       missing_charset_count;
968444c061aSmrg    char*     def_string;
969444c061aSmrg
970444c061aSmrg    if (*num_args != 2) {
971444c061aSmrg      XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
972444c061aSmrg           XtNwrongParameters,"cvtStringToFontSet",XtCXtToolkitError,
973444c061aSmrg             "String to FontSet conversion needs display and locale arguments",
974444c061aSmrg              (String *) NULL, (Cardinal *)NULL);
975444c061aSmrg      return False;
976444c061aSmrg    }
977444c061aSmrg
978444c061aSmrg    display = *(Display**)args[0].addr;
979444c061aSmrg
980444c061aSmrg    if (CompareISOLatin1((String)fromVal->addr, XtDefaultFontSet) != 0) {
981444c061aSmrg      f = XCreateFontSet(display, (char *)fromVal->addr,
982444c061aSmrg              &missing_charset_list, &missing_charset_count, &def_string);
983444c061aSmrg        /* Free any returned missing charset list */
984444c061aSmrg      if (missing_charset_count) {
985444c061aSmrg          XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
986444c061aSmrg                 XtNmissingCharsetList,"cvtStringToFontSet",XtCXtToolkitError,
987444c061aSmrg                 "Missing charsets in String to FontSet conversion",
988444c061aSmrg                 (String *) NULL, (Cardinal *)NULL);
989444c061aSmrg            XFreeStringList(missing_charset_list);
990444c061aSmrg      }
991444c061aSmrg      if (f != NULL) {
992444c061aSmrg  Done:           donestr( XFontSet, f, XtRFontSet );
993444c061aSmrg      }
994444c061aSmrg      XtDisplayStringConversionWarning(dpy, (char *)fromVal->addr, XtRFontSet);
995444c061aSmrg    }
996444c061aSmrg    /* try and get the default fontset */
997444c061aSmrg
998444c061aSmrg    {
999444c061aSmrg      XrmName xrm_name[2];
1000444c061aSmrg      XrmClass xrm_class[2];
1001444c061aSmrg      XrmRepresentation rep_type;
1002444c061aSmrg      XrmValue value;
1003444c061aSmrg
1004444c061aSmrg      xrm_name[0] = XrmPermStringToQuark ("xtDefaultFontSet");
1005444c061aSmrg      xrm_name[1] = 0;
1006444c061aSmrg      xrm_class[0] = XrmPermStringToQuark ("XtDefaultFontSet");
1007444c061aSmrg      xrm_class[1] = 0;
1008444c061aSmrg      if (XrmQGetResource(XtDatabase(display), xrm_name, xrm_class,
1009444c061aSmrg                          &rep_type, &value)) {
1010444c061aSmrg          if (rep_type == _XtQString) {
1011444c061aSmrg
1012444c061aSmrg              f = XCreateFontSet(display, (char *)value.addr,
1013444c061aSmrg				 &missing_charset_list, &missing_charset_count,
1014444c061aSmrg				 &def_string);
1015444c061aSmrg                /* Free any returned missing charset list */
1016444c061aSmrg              if (missing_charset_count) {
1017444c061aSmrg                  XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1018444c061aSmrg			 XtNmissingCharsetList,"cvtStringToFontSet",
1019444c061aSmrg			 XtCXtToolkitError,
1020444c061aSmrg			 "Missing charsets in String to FontSet conversion",
1021444c061aSmrg                         (String *) NULL, (Cardinal *)NULL);
1022444c061aSmrg		  XFreeStringList(missing_charset_list);
1023444c061aSmrg              }
1024444c061aSmrg              if (f != NULL)
1025444c061aSmrg                  goto Done;
1026444c061aSmrg              else
1027444c061aSmrg                  XtDisplayStringConversionWarning(dpy, (char *)value.addr,
1028444c061aSmrg                                                   XtRFontSet);
1029444c061aSmrg          } else if (rep_type == XtQFontSet) {
1030444c061aSmrg              f = *(XFontSet*)value.addr;
1031444c061aSmrg              goto Done;
1032444c061aSmrg          }
1033444c061aSmrg      }
1034444c061aSmrg  }
1035444c061aSmrg
1036444c061aSmrg    /* Should really do XListFonts, but most servers support this */
1037444c061aSmrg    f = XCreateFontSet(display, "-*-*-*-R-*-*-*-120-*-*-*-*,*",
1038444c061aSmrg          &missing_charset_list, &missing_charset_count, &def_string);
1039444c061aSmrg
1040444c061aSmrg    /* Free any returned missing charset list */
1041444c061aSmrg    if (missing_charset_count) {
1042444c061aSmrg      XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1043444c061aSmrg             XtNmissingCharsetList,"cvtStringToFontSet",XtCXtToolkitError,
1044444c061aSmrg             "Missing charsets in String to FontSet conversion",
1045444c061aSmrg             (String *) NULL, (Cardinal *)NULL);
1046444c061aSmrg        XFreeStringList(missing_charset_list);
1047444c061aSmrg    }
1048444c061aSmrg    if (f != NULL)
1049444c061aSmrg      goto Done;
1050444c061aSmrg
1051444c061aSmrg    XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1052444c061aSmrg           "noFont","cvtStringToFontSet",XtCXtToolkitError,
1053444c061aSmrg             "Unable to load any usable fontset",
1054444c061aSmrg              (String *) NULL, (Cardinal *)NULL);
1055444c061aSmrg
1056444c061aSmrg    return False;
1057444c061aSmrg}
1058444c061aSmrg
1059444c061aSmrg/*ARGSUSED*/
1060444c061aSmrgstatic void FreeFontSet(
1061444c061aSmrg    XtAppContext	app,
1062444c061aSmrg    XrmValuePtr		toVal,
1063444c061aSmrg    XtPointer		closure,        /* unused */
1064444c061aSmrg    XrmValuePtr		args,
1065444c061aSmrg    Cardinal		*num_args)
1066444c061aSmrg{
1067444c061aSmrg    Display *display;
1068444c061aSmrg    if (*num_args != 2) {
1069444c061aSmrg      XtAppWarningMsg(app,
1070444c061aSmrg           XtNwrongParameters,"freeFontSet",XtCXtToolkitError,
1071444c061aSmrg             "FreeFontSet needs display and locale arguments",
1072444c061aSmrg              (String *) NULL, (Cardinal *)NULL);
1073444c061aSmrg      return;
1074444c061aSmrg    }
1075444c061aSmrg
1076444c061aSmrg    display = *(Display**)args[0].addr;
1077444c061aSmrg    XFreeFontSet( display, *(XFontSet*)toVal->addr );
1078444c061aSmrg}
1079444c061aSmrg
1080444c061aSmrg/*ARGSUSED*/
1081444c061aSmrgstatic void FetchLocaleArg(
1082444c061aSmrg    Widget widget,	/* unused */
1083444c061aSmrg    Cardinal *size,	/* unused */
1084444c061aSmrg    XrmValue *value)
1085444c061aSmrg{
1086444c061aSmrg    static XrmString locale;
1087444c061aSmrg
1088444c061aSmrg    locale = XrmQuarkToString(XrmStringToQuark
1089444c061aSmrg			      (setlocale(LC_CTYPE, (char*)NULL)));
1090444c061aSmrg    value->size = sizeof(XrmString);
1091444c061aSmrg    value->addr = (XPointer)&locale;
1092444c061aSmrg}
1093444c061aSmrg
1094444c061aSmrgstatic XtConvertArgRec const localeDisplayConvertArgs[] = {
1095444c061aSmrg    {XtProcedureArg, (XtPointer)FetchDisplayArg, 0},
1096444c061aSmrg    {XtProcedureArg, (XtPointer)FetchLocaleArg, 0},
1097444c061aSmrg};
1098444c061aSmrg
1099444c061aSmrg
1100444c061aSmrg/*ARGSUSED*/
1101444c061aSmrgBoolean
1102444c061aSmrgXtCvtStringToFontStruct(
1103444c061aSmrg    Display*	dpy,
1104444c061aSmrg    XrmValuePtr args,
1105444c061aSmrg    Cardinal    *num_args,
1106444c061aSmrg    XrmValuePtr	fromVal,
1107444c061aSmrg    XrmValuePtr	toVal,
1108444c061aSmrg    XtPointer	*closure_ret)
1109444c061aSmrg{
1110444c061aSmrg    XFontStruct	    *f;
1111444c061aSmrg    Display*	display;
1112444c061aSmrg
1113444c061aSmrg    if (*num_args != 1) {
1114444c061aSmrg     XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1115444c061aSmrg	     XtNwrongParameters,"cvtStringToFontStruct",XtCXtToolkitError,
1116444c061aSmrg             "String to font conversion needs display argument",
1117444c061aSmrg              (String *) NULL, (Cardinal *)NULL);
1118444c061aSmrg     return False;
1119444c061aSmrg    }
1120444c061aSmrg
1121444c061aSmrg    display = *(Display**)args[0].addr;
1122444c061aSmrg
1123444c061aSmrg    if (CompareISOLatin1((String)fromVal->addr, XtDefaultFont) != 0) {
1124444c061aSmrg	f = XLoadQueryFont(display, (char *)fromVal->addr);
1125444c061aSmrg	if (f != NULL) {
1126444c061aSmrg  Done:	    donestr( XFontStruct*, f, XtRFontStruct);
1127444c061aSmrg	}
1128444c061aSmrg
1129444c061aSmrg	XtDisplayStringConversionWarning(dpy, (char*)fromVal->addr,
1130444c061aSmrg					 XtRFontStruct);
1131444c061aSmrg    }
1132444c061aSmrg
1133444c061aSmrg    /* try and get the default font */
1134444c061aSmrg
1135444c061aSmrg    {
1136444c061aSmrg	XrmName xrm_name[2];
1137444c061aSmrg	XrmClass xrm_class[2];
1138444c061aSmrg	XrmRepresentation rep_type;
1139444c061aSmrg	XrmValue value;
1140444c061aSmrg
1141444c061aSmrg	xrm_name[0] = XrmPermStringToQuark ("xtDefaultFont");
1142444c061aSmrg	xrm_name[1] = 0;
1143444c061aSmrg	xrm_class[0] = XrmPermStringToQuark ("XtDefaultFont");
1144444c061aSmrg	xrm_class[1] = 0;
1145444c061aSmrg	if (XrmQGetResource(XtDatabase(display), xrm_name, xrm_class,
1146444c061aSmrg			    &rep_type, &value)) {
1147444c061aSmrg	    if (rep_type == _XtQString) {
1148444c061aSmrg		f = XLoadQueryFont(display, (char*)value.addr);
1149444c061aSmrg		if (f != NULL)
1150444c061aSmrg		    goto Done;
1151444c061aSmrg		else
1152444c061aSmrg		    XtDisplayStringConversionWarning(dpy, (char*)value.addr,
1153444c061aSmrg						     XtRFontStruct);
1154444c061aSmrg	    } else if (rep_type == XtQFont) {
1155444c061aSmrg		f = XQueryFont(display, *(Font*)value.addr );
1156444c061aSmrg		if (f != NULL) goto Done;
1157444c061aSmrg	    } else if (rep_type == XtQFontStruct) {
1158444c061aSmrg		f = (XFontStruct*)value.addr;
1159444c061aSmrg		goto Done;
1160444c061aSmrg	    }
1161444c061aSmrg	}
1162444c061aSmrg    }
1163444c061aSmrg    /* Should really do XListFonts, but most servers support this */
1164444c061aSmrg    f = XLoadQueryFont(display, "-*-*-*-R-*-*-*-120-*-*-*-*-ISO8859-*");
1165444c061aSmrg    if (f != NULL)
1166444c061aSmrg	goto Done;
1167444c061aSmrg
1168444c061aSmrg    XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1169444c061aSmrg	     "noFont","cvtStringToFontStruct",XtCXtToolkitError,
1170444c061aSmrg             "Unable to load any usable ISO8859 font",
1171444c061aSmrg              (String *) NULL, (Cardinal *)NULL);
1172444c061aSmrg
1173444c061aSmrg    return False;
1174444c061aSmrg}
1175444c061aSmrg
1176444c061aSmrg/* ARGSUSED */
1177444c061aSmrgstatic void FreeFontStruct(
1178444c061aSmrg    XtAppContext app,
1179444c061aSmrg    XrmValuePtr	toVal,
1180444c061aSmrg    XtPointer	closure,	/* unused */
1181444c061aSmrg    XrmValuePtr	args,
1182444c061aSmrg    Cardinal	*num_args)
1183444c061aSmrg{
1184444c061aSmrg    Display *display;
1185444c061aSmrg    if (*num_args != 1) {
1186444c061aSmrg     XtAppWarningMsg(app,
1187444c061aSmrg	     XtNwrongParameters,"freeFontStruct",XtCXtToolkitError,
1188444c061aSmrg             "Free FontStruct requires display argument",
1189444c061aSmrg              (String *) NULL, (Cardinal *)NULL);
1190444c061aSmrg     return;
1191444c061aSmrg    }
1192444c061aSmrg
1193444c061aSmrg    display = *(Display**)args[0].addr;
1194444c061aSmrg    XFreeFont( display, *(XFontStruct**)toVal->addr );
1195444c061aSmrg}
1196444c061aSmrg
1197444c061aSmrg/*ARGSUSED*/
1198444c061aSmrgBoolean XtCvtStringToInt(
1199444c061aSmrg    Display*	dpy,
1200444c061aSmrg    XrmValuePtr args,
1201444c061aSmrg    Cardinal    *num_args,
1202444c061aSmrg    XrmValuePtr	fromVal,
1203444c061aSmrg    XrmValuePtr	toVal,
1204444c061aSmrg    XtPointer	*closure_ret)
1205444c061aSmrg{
1206444c061aSmrg    int	i;
1207444c061aSmrg
1208444c061aSmrg    if (*num_args != 0)
1209444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1210444c061aSmrg		  XtNwrongParameters,"cvtStringToInt",XtCXtToolkitError,
1211444c061aSmrg                  "String to Integer conversion needs no extra arguments",
1212444c061aSmrg                  (String *) NULL, (Cardinal *)NULL);
1213444c061aSmrg    if (IsInteger((String)fromVal->addr, &i))
1214444c061aSmrg	donestr(int, i, XtRInt);
1215444c061aSmrg
1216444c061aSmrg    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRInt);
1217444c061aSmrg    return False;
1218444c061aSmrg}
1219444c061aSmrg
1220444c061aSmrg/*ARGSUSED*/
1221444c061aSmrgBoolean XtCvtStringToShort(
1222444c061aSmrg    Display*	dpy,
1223444c061aSmrg    XrmValuePtr args,
1224444c061aSmrg    Cardinal    *num_args,
1225444c061aSmrg    XrmValuePtr fromVal,
1226444c061aSmrg    XrmValuePtr toVal,
1227444c061aSmrg    XtPointer	*closure_ret)
1228444c061aSmrg{
1229444c061aSmrg    int i;
1230444c061aSmrg
1231444c061aSmrg    if (*num_args != 0)
1232444c061aSmrg        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1233444c061aSmrg	  XtNwrongParameters,"cvtStringToShort",XtCXtToolkitError,
1234444c061aSmrg          "String to Integer conversion needs no extra arguments",
1235444c061aSmrg           (String *) NULL, (Cardinal *)NULL);
1236444c061aSmrg    if (IsInteger((String)fromVal->addr, &i))
1237444c061aSmrg        donestr(short, (short)i, XtRShort);
1238444c061aSmrg
1239444c061aSmrg    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRShort);
1240444c061aSmrg    return False;
1241444c061aSmrg}
1242444c061aSmrg
1243444c061aSmrg/*ARGSUSED*/
1244444c061aSmrgBoolean XtCvtStringToDimension(
1245444c061aSmrg    Display*	dpy,
1246444c061aSmrg    XrmValuePtr args,
1247444c061aSmrg    Cardinal    *num_args,
1248444c061aSmrg    XrmValuePtr fromVal,
1249444c061aSmrg    XrmValuePtr toVal,
1250444c061aSmrg    XtPointer	*closure_ret)
1251444c061aSmrg{
1252444c061aSmrg    int i;
1253444c061aSmrg
1254444c061aSmrg    if (*num_args != 0)
1255444c061aSmrg        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1256444c061aSmrg	  XtNwrongParameters,"cvtStringToDimension",XtCXtToolkitError,
1257444c061aSmrg          "String to Dimension conversion needs no extra arguments",
1258444c061aSmrg           (String *) NULL, (Cardinal *)NULL);
1259444c061aSmrg    if (IsInteger((String)fromVal->addr, &i)) {
1260444c061aSmrg        if ( i < 0 )
1261444c061aSmrg            XtDisplayStringConversionWarning(dpy, (char*)fromVal->addr,
1262444c061aSmrg					     XtRDimension);
1263444c061aSmrg        donestr(Dimension, (Dimension)i, XtRDimension);
1264444c061aSmrg    }
1265444c061aSmrg    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr, XtRDimension);
1266444c061aSmrg    return False;
1267444c061aSmrg}
1268444c061aSmrg
1269444c061aSmrg/*ARGSUSED*/
1270444c061aSmrgBoolean XtCvtIntToUnsignedChar(
1271444c061aSmrg    Display*	dpy,
1272444c061aSmrg    XrmValuePtr args,
1273444c061aSmrg    Cardinal    *num_args,
1274444c061aSmrg    XrmValuePtr	fromVal,
1275444c061aSmrg    XrmValuePtr	toVal,
1276444c061aSmrg    XtPointer	*closure_ret)
1277444c061aSmrg{
1278444c061aSmrg    if (*num_args != 0)
1279444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1280444c061aSmrg		  XtNwrongParameters,"cvtIntToUnsignedChar",XtCXtToolkitError,
1281444c061aSmrg                  "Integer to UnsignedChar conversion needs no extra arguments",
1282444c061aSmrg                   (String *)NULL, (Cardinal *)NULL);
1283444c061aSmrg    done(unsigned char, (*(int *)fromVal->addr));
1284444c061aSmrg}
1285444c061aSmrg
1286444c061aSmrg
1287444c061aSmrg/*ARGSUSED*/
1288444c061aSmrgBoolean XtCvtStringToUnsignedChar(
1289444c061aSmrg    Display*	dpy,
1290444c061aSmrg    XrmValuePtr args,
1291444c061aSmrg    Cardinal    *num_args,
1292444c061aSmrg    XrmValuePtr fromVal,
1293444c061aSmrg    XrmValuePtr toVal,
1294444c061aSmrg    XtPointer	*closure_ret)
1295444c061aSmrg{
1296444c061aSmrg    int i;
1297444c061aSmrg
1298444c061aSmrg    if (*num_args != 0)
1299444c061aSmrg        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1300444c061aSmrg		  XtNwrongParameters,"cvtStringToUnsignedChar",XtCXtToolkitError,
1301444c061aSmrg                  "String to Integer conversion needs no extra arguments",
1302444c061aSmrg                   (String *) NULL, (Cardinal *)NULL);
1303444c061aSmrg    if (IsInteger((String)fromVal->addr, &i)) {
1304444c061aSmrg        if ( i < 0 || i > 255 )
1305444c061aSmrg            XtDisplayStringConversionWarning(dpy, (char*)fromVal->addr,
1306444c061aSmrg					     XtRUnsignedChar);
1307444c061aSmrg        donestr(unsigned char, i, XtRUnsignedChar);
1308444c061aSmrg    }
1309444c061aSmrg    XtDisplayStringConversionWarning(dpy, (char*)fromVal->addr,
1310444c061aSmrg				     XtRUnsignedChar);
1311444c061aSmrg    return False;
1312444c061aSmrg}
1313444c061aSmrg
1314444c061aSmrg
1315444c061aSmrg/*ARGSUSED*/
1316444c061aSmrgBoolean XtCvtColorToPixel(
1317444c061aSmrg    Display*	dpy,
1318444c061aSmrg    XrmValuePtr args,
1319444c061aSmrg    Cardinal    *num_args,
1320444c061aSmrg    XrmValuePtr	fromVal,
1321444c061aSmrg    XrmValuePtr	toVal,
1322444c061aSmrg    XtPointer	*closure_ret)
1323444c061aSmrg{
1324444c061aSmrg    if (*num_args != 0)
1325444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1326444c061aSmrg		  XtNwrongParameters,"cvtXColorToPixel",XtCXtToolkitError,
1327444c061aSmrg                  "Color to Pixel conversion needs no extra arguments",
1328444c061aSmrg                   (String *) NULL, (Cardinal *)NULL);
1329444c061aSmrg    done(Pixel, ((XColor *)fromVal->addr)->pixel);
1330444c061aSmrg}
1331444c061aSmrg
1332444c061aSmrg/*ARGSUSED*/
1333444c061aSmrgBoolean XtCvtIntToPixel(
1334444c061aSmrg    Display*	dpy,
1335444c061aSmrg    XrmValuePtr args,
1336444c061aSmrg    Cardinal    *num_args,
1337444c061aSmrg    XrmValuePtr	fromVal,
1338444c061aSmrg    XrmValuePtr	toVal,
1339444c061aSmrg    XtPointer	*closure_ret)
1340444c061aSmrg{
1341444c061aSmrg    if (*num_args != 0)
1342444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1343444c061aSmrg		  XtNwrongParameters,"cvtIntToPixel",XtCXtToolkitError,
1344444c061aSmrg                  "Integer to Pixel conversion needs no extra arguments",
1345444c061aSmrg                   (String *) NULL, (Cardinal *)NULL);
1346444c061aSmrg    done(Pixel, *(int*)fromVal->addr);
1347444c061aSmrg}
1348444c061aSmrg
1349444c061aSmrg/*ARGSUSED*/
1350444c061aSmrgBoolean XtCvtIntToPixmap(
1351444c061aSmrg    Display*	dpy,
1352444c061aSmrg    XrmValuePtr args,
1353444c061aSmrg    Cardinal    *num_args,
1354444c061aSmrg    XrmValuePtr fromVal,
1355444c061aSmrg    XrmValuePtr toVal,
1356444c061aSmrg    XtPointer	*closure_ret)
1357444c061aSmrg{
1358444c061aSmrg    if (*num_args != 0)
1359444c061aSmrg        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1360444c061aSmrg		  XtNwrongParameters,"cvtIntToPixmap",XtCXtToolkitError,
1361444c061aSmrg                  "Integer to Pixmap conversion needs no extra arguments",
1362444c061aSmrg                   (String *) NULL, (Cardinal *)NULL);
1363444c061aSmrg    done(Pixmap, *(Pixmap*)fromVal->addr);
1364444c061aSmrg}
1365444c061aSmrg
1366444c061aSmrg#ifdef MOTIFBC
1367444c061aSmrgvoid LowerCase(register char  *source, register *dest)
1368444c061aSmrg{
1369444c061aSmrg    register char ch;
1370444c061aSmrg    int i;
1371444c061aSmrg
1372444c061aSmrg    for (i = 0; (ch = *source) != 0 && i < 999; source++, dest++, i++) {
1373444c061aSmrg    	if ('A' <= ch && ch <= 'Z')
1374444c061aSmrg	    *dest = ch - 'A' + 'a';
1375444c061aSmrg	else
1376444c061aSmrg	    *dest = ch;
1377444c061aSmrg    }
1378444c061aSmrg    *dest = 0;
1379444c061aSmrg}
1380444c061aSmrg#endif
1381444c061aSmrg
1382444c061aSmrgstatic int CompareISOLatin1 (char *first, char *second)
1383444c061aSmrg{
1384444c061aSmrg    register unsigned char *ap, *bp;
1385444c061aSmrg
1386444c061aSmrg    for (ap = (unsigned char *) first, bp = (unsigned char *) second;
1387444c061aSmrg	 *ap && *bp; ap++, bp++) {
1388444c061aSmrg	register unsigned char a, b;
1389444c061aSmrg
1390444c061aSmrg	if ((a = *ap) != (b = *bp)) {
1391444c061aSmrg	    /* try lowercasing and try again */
1392444c061aSmrg
1393444c061aSmrg	    if ((a >= XK_A) && (a <= XK_Z))
1394444c061aSmrg	      a += (XK_a - XK_A);
1395444c061aSmrg	    else if ((a >= XK_Agrave) && (a <= XK_Odiaeresis))
1396444c061aSmrg	      a += (XK_agrave - XK_Agrave);
1397444c061aSmrg	    else if ((a >= XK_Ooblique) && (a <= XK_Thorn))
1398444c061aSmrg	      a += (XK_oslash - XK_Ooblique);
1399444c061aSmrg
1400444c061aSmrg	    if ((b >= XK_A) && (b <= XK_Z))
1401444c061aSmrg	      b += (XK_a - XK_A);
1402444c061aSmrg	    else if ((b >= XK_Agrave) && (b <= XK_Odiaeresis))
1403444c061aSmrg	      b += (XK_agrave - XK_Agrave);
1404444c061aSmrg	    else if ((b >= XK_Ooblique) && (b <= XK_Thorn))
1405444c061aSmrg	      b += (XK_oslash - XK_Ooblique);
1406444c061aSmrg
1407444c061aSmrg	    if (a != b) break;
1408444c061aSmrg	}
1409444c061aSmrg    }
1410444c061aSmrg    return (((int) *bp) - ((int) *ap));
1411444c061aSmrg}
1412444c061aSmrg
1413444c061aSmrgstatic void CopyISOLatin1Lowered(char *dst, char *src)
1414444c061aSmrg{
1415444c061aSmrg    unsigned char *dest, *source;
1416444c061aSmrg
1417444c061aSmrg    dest = (unsigned char *) dst; source = (unsigned char *) src;
1418444c061aSmrg
1419444c061aSmrg    for ( ; *source; source++, dest++) {
1420444c061aSmrg	if (*source >= XK_A  && *source <= XK_Z)
1421444c061aSmrg	    *dest = *source + (XK_a - XK_A);
1422444c061aSmrg	else if (*source >= XK_Agrave && *source <= XK_Odiaeresis)
1423444c061aSmrg	    *dest = *source + (XK_agrave - XK_Agrave);
1424444c061aSmrg	else if (*source >= XK_Ooblique && *source <= XK_Thorn)
1425444c061aSmrg	    *dest = *source + (XK_oslash - XK_Ooblique);
1426444c061aSmrg	else
1427444c061aSmrg	    *dest = *source;
1428444c061aSmrg    }
1429444c061aSmrg    *dest = '\0';
1430444c061aSmrg}
1431444c061aSmrg
1432444c061aSmrg/*ARGSUSED*/
1433444c061aSmrgBoolean
1434444c061aSmrgXtCvtStringToInitialState(
1435444c061aSmrg    Display*	dpy,
1436444c061aSmrg    XrmValuePtr args,
1437444c061aSmrg    Cardinal    *num_args,
1438444c061aSmrg    XrmValuePtr	fromVal,
1439444c061aSmrg    XrmValuePtr	toVal,
1440444c061aSmrg    XtPointer	*closure_ret)
1441444c061aSmrg{
1442444c061aSmrg    String str = (String)fromVal->addr;
1443444c061aSmrg    if (*num_args != 0)
1444444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1445444c061aSmrg		  XtNwrongParameters,"cvtStringToInitialState",XtCXtToolkitError,
1446444c061aSmrg                  "String to InitialState conversion needs no extra arguments",
1447444c061aSmrg                   (String *) NULL, (Cardinal *)NULL);
1448444c061aSmrg
1449444c061aSmrg    if (CompareISOLatin1(str, "NormalState") == 0) donestr(int, NormalState, XtRInitialState);
1450444c061aSmrg    if (CompareISOLatin1(str, "IconicState") == 0) donestr(int, IconicState, XtRInitialState);
1451444c061aSmrg    {
1452444c061aSmrg	int val;
1453444c061aSmrg	if (IsInteger(str, &val)) donestr( int, val, XtRInitialState );
1454444c061aSmrg    }
1455444c061aSmrg    XtDisplayStringConversionWarning(dpy, str, XtRInitialState);
1456444c061aSmrg    return False;
1457444c061aSmrg}
1458444c061aSmrg
1459444c061aSmrgstatic XtConvertArgRec const visualConvertArgs[] = {
1460444c061aSmrg    {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen),
1461444c061aSmrg     sizeof(Screen *)},
1462444c061aSmrg    {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.depth),
1463444c061aSmrg     sizeof(Cardinal)}
1464444c061aSmrg};
1465444c061aSmrg
1466444c061aSmrg/*ARGSUSED*/
1467444c061aSmrgBoolean XtCvtStringToVisual(
1468444c061aSmrg    Display*	dpy,
1469444c061aSmrg    XrmValuePtr args,		/* Screen, depth */
1470444c061aSmrg    Cardinal    *num_args,	/* 2 */
1471444c061aSmrg    XrmValuePtr	fromVal,
1472444c061aSmrg    XrmValuePtr	toVal,
1473444c061aSmrg    XtPointer	*closure_ret)	/* unused */
1474444c061aSmrg{
1475444c061aSmrg    String str = (String)fromVal->addr;
1476444c061aSmrg    int vc;
1477444c061aSmrg    XVisualInfo vinfo;
1478444c061aSmrg    if (*num_args != 2) {
1479444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1480444c061aSmrg		  XtNwrongParameters,"cvtStringToVisual",XtCXtToolkitError,
1481444c061aSmrg                  "String to Visual conversion needs screen and depth arguments",
1482444c061aSmrg                   (String *) NULL, (Cardinal *)NULL);
1483444c061aSmrg	return False;
1484444c061aSmrg    }
1485444c061aSmrg
1486444c061aSmrg         if (CompareISOLatin1(str, "StaticGray") == 0)	vc = StaticGray;
1487444c061aSmrg    else if (CompareISOLatin1(str, "StaticColor") == 0)	vc = StaticColor;
1488444c061aSmrg    else if (CompareISOLatin1(str, "TrueColor") == 0)	vc = TrueColor;
1489444c061aSmrg    else if (CompareISOLatin1(str, "GrayScale") == 0)	vc = GrayScale;
1490444c061aSmrg    else if (CompareISOLatin1(str, "PseudoColor") == 0)	vc = PseudoColor;
1491444c061aSmrg    else if (CompareISOLatin1(str, "DirectColor") == 0)	vc = DirectColor;
1492444c061aSmrg    else if (!IsInteger(str, &vc)) {
1493444c061aSmrg	XtDisplayStringConversionWarning(dpy, str, "Visual class name");
1494444c061aSmrg	return False;
1495444c061aSmrg    }
1496444c061aSmrg
1497444c061aSmrg    if (XMatchVisualInfo( XDisplayOfScreen((Screen*)*(Screen**)args[0].addr),
1498444c061aSmrg		     XScreenNumberOfScreen((Screen*)*(Screen**)args[0].addr),
1499444c061aSmrg		     (int)*(int*)args[1].addr,
1500444c061aSmrg		     vc,
1501444c061aSmrg		     &vinfo) ) {
1502444c061aSmrg	donestr( Visual*, vinfo.visual, XtRVisual );
1503444c061aSmrg    }
1504444c061aSmrg    else {
1505444c061aSmrg	String params[2];
1506444c061aSmrg	Cardinal num_params = 2;
1507444c061aSmrg	params[0] = str;
1508444c061aSmrg	params[1] =
1509444c061aSmrg	    DisplayString(XDisplayOfScreen((Screen*)*(Screen**)args[0].addr));
1510444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1511444c061aSmrg		  XtNconversionError, "stringToVisual", XtCXtToolkitError,
1512444c061aSmrg                  "Cannot find Visual of class %s for display %s",
1513444c061aSmrg		  params, &num_params );
1514444c061aSmrg	return False;
1515444c061aSmrg    }
1516444c061aSmrg}
1517444c061aSmrg
1518444c061aSmrg
1519444c061aSmrg/*ARGSUSED*/
1520444c061aSmrgBoolean XtCvtStringToAtom(
1521444c061aSmrg    Display*	dpy,
1522444c061aSmrg    XrmValuePtr args,
1523444c061aSmrg    Cardinal    *num_args,
1524444c061aSmrg    XrmValuePtr	fromVal,
1525444c061aSmrg    XrmValuePtr	toVal,
1526444c061aSmrg    XtPointer	*closure_ret)
1527444c061aSmrg{
1528444c061aSmrg    Atom atom;
1529444c061aSmrg    if (*num_args != 1) {
1530444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1531444c061aSmrg		  XtNwrongParameters,"cvtStringToAtom",XtCXtToolkitError,
1532444c061aSmrg                  "String to Atom conversion needs Display argument",
1533444c061aSmrg                   (String *) NULL, (Cardinal *)NULL);
1534444c061aSmrg	return False;
1535444c061aSmrg    }
1536444c061aSmrg
1537444c061aSmrg    atom =  XInternAtom( *(Display**)args->addr, (char*)fromVal->addr, False );
1538444c061aSmrg    donestr(Atom, atom, XtRAtom);
1539444c061aSmrg}
1540444c061aSmrg
1541444c061aSmrg/*ARGSUSED*/
1542444c061aSmrgBoolean XtCvtStringToDirectoryString(
1543444c061aSmrg    Display	*dpy,
1544444c061aSmrg    XrmValuePtr args,
1545444c061aSmrg    Cardinal    *num_args,
1546444c061aSmrg    XrmValuePtr fromVal,
1547444c061aSmrg    XrmValuePtr toVal,
1548444c061aSmrg    XtPointer	*closure_ret)
1549444c061aSmrg{
1550444c061aSmrg    String str;
1551444c061aSmrg    char directory[PATH_MAX+1];
1552444c061aSmrg
1553444c061aSmrg    if (*num_args != 0)
1554444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1555444c061aSmrg           XtNwrongParameters,"cvtStringToDirectoryString",XtCXtToolkitError,
1556444c061aSmrg           "String to DirectoryString conversion needs no extra arguments",
1557444c061aSmrg           (String *)NULL, (Cardinal *)NULL);
1558444c061aSmrg
1559444c061aSmrg    str = (String)fromVal->addr;
1560444c061aSmrg    if (CompareISOLatin1(str, "XtCurrentDirectory") == 0) {
1561444c061aSmrg	/* uglier, but does not depend on compiler knowing return type */
1562444c061aSmrg#if !defined(X_NOT_POSIX) || defined(SYSV) || defined(WIN32)
1563444c061aSmrg	if (getcwd(directory, PATH_MAX + 1))
1564444c061aSmrg	    str = directory;
1565444c061aSmrg#else
1566444c061aSmrg	if (getwd(directory))
1567444c061aSmrg	    str = directory;
1568444c061aSmrg#endif
1569444c061aSmrg	if (!str) {
1570444c061aSmrg	    if (errno == EACCES)
1571444c061aSmrg		errno = 0;	    /* reset errno */
1572444c061aSmrg	    XtDisplayStringConversionWarning(dpy, (char *) fromVal->addr,
1573444c061aSmrg					     XtRDirectoryString);
1574444c061aSmrg	    return False;
1575444c061aSmrg	}
1576444c061aSmrg    }
1577444c061aSmrg
1578444c061aSmrg    /* Since memory from the resource database or from static buffers of
1579444c061aSmrg     * system libraries may be freed or overwritten, allocate memory.
1580444c061aSmrg     * The memory is freed when all cache references are released.
1581444c061aSmrg     */
1582444c061aSmrg    str = XtNewString(str);
1583444c061aSmrg    donestr(String, str, XtRDirectoryString);
1584444c061aSmrg}
1585444c061aSmrg
1586444c061aSmrg/*ARGSUSED*/
1587444c061aSmrgstatic void FreeDirectoryString(
1588444c061aSmrg    XtAppContext app,
1589444c061aSmrg    XrmValuePtr	toVal,
1590444c061aSmrg    XtPointer	closure,	/* unused */
1591444c061aSmrg    XrmValuePtr	args,
1592444c061aSmrg    Cardinal	*num_args)
1593444c061aSmrg{
1594444c061aSmrg    if (*num_args != 0)
1595444c061aSmrg	XtAppWarningMsg(app,
1596444c061aSmrg		 XtNwrongParameters,"freeDirectoryString",XtCXtToolkitError,
1597444c061aSmrg		 "Free Directory String requires no extra arguments",
1598444c061aSmrg                 (String *) NULL, (Cardinal *) NULL);
1599444c061aSmrg
1600444c061aSmrg    XtFree((char *) toVal->addr);
1601444c061aSmrg}
1602444c061aSmrg
1603444c061aSmrg/*ARGSUSED*/
1604444c061aSmrgBoolean XtCvtStringToRestartStyle(
1605444c061aSmrg    Display	*dpy,
1606444c061aSmrg    XrmValuePtr args,
1607444c061aSmrg    Cardinal    *num_args,
1608444c061aSmrg    XrmValuePtr fromVal,
1609444c061aSmrg    XrmValuePtr toVal,
1610444c061aSmrg    XtPointer	*closure_ret)
1611444c061aSmrg{
1612444c061aSmrg    String str = (String)fromVal->addr;
1613444c061aSmrg    if (*num_args != 0)
1614444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1615444c061aSmrg	      XtNwrongParameters,"cvtStringToRestartStyle",XtCXtToolkitError,
1616444c061aSmrg              "String to RestartStyle conversion needs no extra arguments",
1617444c061aSmrg              (String *)NULL, (Cardinal *)NULL);
1618444c061aSmrg
1619444c061aSmrg    if (CompareISOLatin1(str, "RestartIfRunning") == 0)
1620444c061aSmrg	donestr(unsigned char, SmRestartIfRunning, XtRRestartStyle);
1621444c061aSmrg    if (CompareISOLatin1(str, "RestartAnyway") == 0)
1622444c061aSmrg	donestr(unsigned char, SmRestartAnyway, XtRRestartStyle);
1623444c061aSmrg    if (CompareISOLatin1(str, "RestartImmediately") == 0)
1624444c061aSmrg	donestr(unsigned char, SmRestartImmediately, XtRRestartStyle);
1625444c061aSmrg    if (CompareISOLatin1(str, "RestartNever") == 0)
1626444c061aSmrg	donestr(unsigned char, SmRestartNever, XtRRestartStyle);
1627444c061aSmrg    XtDisplayStringConversionWarning(dpy, str, XtRRestartStyle);
1628444c061aSmrg    return False;
1629444c061aSmrg}
1630444c061aSmrg
1631444c061aSmrg/*ARGSUSED*/
1632444c061aSmrgBoolean XtCvtStringToCommandArgArray(
1633444c061aSmrg    Display	*dpy,
1634444c061aSmrg    XrmValuePtr args,
1635444c061aSmrg    Cardinal    *num_args,
1636444c061aSmrg    XrmValuePtr fromVal,
1637444c061aSmrg    XrmValuePtr toVal,
1638444c061aSmrg    XtPointer	*closure_ret)
1639444c061aSmrg{
1640444c061aSmrg    String *strarray, *ptr;
1641444c061aSmrg    char *src;
1642444c061aSmrg    char *dst, *dst_str;
1643444c061aSmrg    char *start;
1644444c061aSmrg    int tokens, len;
1645444c061aSmrg
1646444c061aSmrg    if (*num_args != 0)
1647444c061aSmrg	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
1648444c061aSmrg            XtNwrongParameters,"cvtStringToCommandArgArray",XtCXtToolkitError,
1649444c061aSmrg            "String to CommandArgArray conversion needs no extra arguments",
1650444c061aSmrg            (String *)NULL, (Cardinal *)NULL);
1651444c061aSmrg
1652444c061aSmrg    src = fromVal->addr;
1653444c061aSmrg    dst = dst_str = __XtMalloc((unsigned) strlen(src) + 1);
1654444c061aSmrg    tokens = 0;
1655444c061aSmrg
1656444c061aSmrg    while (*src != '\0') {
1657444c061aSmrg	/* skip whitespace */
1658444c061aSmrg	while (IsWhitespace(*src) || IsNewline(*src))
1659444c061aSmrg	    src++;
1660444c061aSmrg	/* test for end of string */
1661444c061aSmrg	if (*src == '\0')
1662444c061aSmrg	    break;
1663444c061aSmrg
1664444c061aSmrg	/* start new token */
1665444c061aSmrg	tokens++;
1666444c061aSmrg	start = src;
1667444c061aSmrg	while (*src != '\0' && !IsWhitespace(*src) && !IsNewline(*src)) {
1668444c061aSmrg	    if (*src == '\\' &&
1669444c061aSmrg		(IsWhitespace(*(src+1)) || IsNewline(*(src+1)))) {
1670444c061aSmrg		len = src - start;
1671444c061aSmrg		if (len) {
1672444c061aSmrg		    /* copy preceeding part of token */
1673444c061aSmrg		    memcpy(dst, start, len);
1674444c061aSmrg		    dst += len;
1675444c061aSmrg		}
1676444c061aSmrg		/* skip backslash */
1677444c061aSmrg		src++;
1678444c061aSmrg		/* next part of token starts at whitespace */
1679444c061aSmrg		start = src;
1680444c061aSmrg	    }
1681444c061aSmrg	    src++;
1682444c061aSmrg	}
1683444c061aSmrg	len = src - start;
1684444c061aSmrg	if (len) {
1685444c061aSmrg	    /* copy last part of token */
1686444c061aSmrg	    memcpy(dst, start, len);
1687444c061aSmrg	    dst += len;
1688444c061aSmrg	}
1689444c061aSmrg	*dst = '\0';
1690444c061aSmrg	if (*src != '\0')
1691444c061aSmrg	    dst++;
1692444c061aSmrg    }
1693444c061aSmrg
1694444c061aSmrg    ptr = strarray = (String*) __XtMalloc((Cardinal)(tokens+1) * sizeof(String));
1695444c061aSmrg    src = dst_str;
1696444c061aSmrg    while (--tokens >= 0) {
1697444c061aSmrg	*ptr = src;
1698444c061aSmrg	ptr++;
1699444c061aSmrg	if (tokens) {
1700444c061aSmrg	    len = strlen(src);
1701444c061aSmrg	    src = src + len + 1;
1702444c061aSmrg	}
1703444c061aSmrg    }
1704444c061aSmrg    *ptr = NULL;
1705444c061aSmrg
1706444c061aSmrg    *closure_ret = (XtPointer) strarray;
1707444c061aSmrg    donestr(char**, strarray, XtRCommandArgArray)
1708444c061aSmrg}
1709444c061aSmrg
1710444c061aSmrg/*ARGSUSED*/
1711444c061aSmrgstatic void ArgArrayDestructor(
1712444c061aSmrg    XtAppContext app,
1713444c061aSmrg    XrmValuePtr	toVal,
1714444c061aSmrg    XtPointer	closure,
1715444c061aSmrg    XrmValuePtr	args,
1716444c061aSmrg    Cardinal	*num_args)
1717444c061aSmrg{
1718444c061aSmrg    String *strarray;
1719444c061aSmrg
1720444c061aSmrg    if (closure) {
1721444c061aSmrg	strarray = (String*) closure;
1722444c061aSmrg	XtFree(*strarray);
1723444c061aSmrg	XtFree((char *) strarray);
1724444c061aSmrg    }
1725444c061aSmrg}
1726444c061aSmrg
1727444c061aSmrg/*ARGSUSED*/
1728444c061aSmrgBoolean XtCvtStringToGravity (
1729444c061aSmrg    Display* dpy,
1730444c061aSmrg    XrmValuePtr args,
1731444c061aSmrg    Cardinal    *num_args,
1732444c061aSmrg    XrmValuePtr fromVal,
1733444c061aSmrg    XrmValuePtr toVal,
1734444c061aSmrg    XtPointer	*closure_ret)
1735444c061aSmrg{
1736444c061aSmrg    static struct _namepair {
1737444c061aSmrg	XrmQuark quark;
1738444c061aSmrg	char *name;
1739444c061aSmrg	int gravity;
1740444c061aSmrg    } names[] = {
1741444c061aSmrg	{ NULLQUARK, "forget",		ForgetGravity },
1742444c061aSmrg	{ NULLQUARK, "northwest",	NorthWestGravity },
1743444c061aSmrg	{ NULLQUARK, "north",		NorthGravity },
1744444c061aSmrg	{ NULLQUARK, "northeast",	NorthEastGravity },
1745444c061aSmrg	{ NULLQUARK, "west",		WestGravity },
1746444c061aSmrg	{ NULLQUARK, "center",		CenterGravity },
1747444c061aSmrg	{ NULLQUARK, "east",		EastGravity },
1748444c061aSmrg	{ NULLQUARK, "southwest",	SouthWestGravity },
1749444c061aSmrg	{ NULLQUARK, "south",		SouthGravity },
1750444c061aSmrg	{ NULLQUARK, "southeast",	SouthEastGravity },
1751444c061aSmrg	{ NULLQUARK, "static",		StaticGravity },
1752444c061aSmrg	{ NULLQUARK, "unmap",		UnmapGravity },
1753444c061aSmrg	{ NULLQUARK, "0",		ForgetGravity },
1754444c061aSmrg	{ NULLQUARK, "1",		NorthWestGravity },
1755444c061aSmrg	{ NULLQUARK, "2",		NorthGravity },
1756444c061aSmrg	{ NULLQUARK, "3",		NorthEastGravity },
1757444c061aSmrg	{ NULLQUARK, "4",		WestGravity },
1758444c061aSmrg	{ NULLQUARK, "5",		CenterGravity },
1759444c061aSmrg	{ NULLQUARK, "6",		EastGravity },
1760444c061aSmrg	{ NULLQUARK, "7",		SouthWestGravity },
1761444c061aSmrg	{ NULLQUARK, "8",		SouthGravity },
1762444c061aSmrg	{ NULLQUARK, "9",		SouthEastGravity },
1763444c061aSmrg	{ NULLQUARK, "10",		StaticGravity },
1764444c061aSmrg	{ NULLQUARK, NULL,		ForgetGravity }
1765444c061aSmrg    };
1766444c061aSmrg    static Boolean haveQuarks = FALSE;
1767444c061aSmrg    char lowerName[40];
1768444c061aSmrg    XrmQuark q;
1769444c061aSmrg    char *s;
1770444c061aSmrg    struct _namepair *np;
1771444c061aSmrg
1772444c061aSmrg    if (*num_args != 0) {
1773444c061aSmrg        XtAppWarningMsg(XtDisplayToApplicationContext (dpy),
1774444c061aSmrg			"wrongParameters","cvtStringToGravity","XtToolkitError",
1775444c061aSmrg			"String to Gravity conversion needs no extra arguments",
1776444c061aSmrg			(String *) NULL, (Cardinal *)NULL);
1777444c061aSmrg	return False;
1778444c061aSmrg    }
1779444c061aSmrg    if (!haveQuarks) {
1780444c061aSmrg	for (np = names; np->name; np++) {
1781444c061aSmrg	    np->quark = XrmPermStringToQuark (np->name);
1782444c061aSmrg	}
1783444c061aSmrg	haveQuarks = TRUE;
1784444c061aSmrg    }
1785444c061aSmrg    s = (char *) fromVal->addr;
1786444c061aSmrg    if (strlen(s) < sizeof lowerName) {
1787444c061aSmrg	CopyISOLatin1Lowered (lowerName, s);
1788444c061aSmrg	q = XrmStringToQuark (lowerName);
1789444c061aSmrg	for (np = names; np->name; np++)
1790444c061aSmrg	    if (np->quark == q) donestr(int, np->gravity, XtRGravity);
1791444c061aSmrg    }
1792444c061aSmrg    XtDisplayStringConversionWarning(dpy, (char *)fromVal->addr, XtRGravity);
1793444c061aSmrg    return False;
1794444c061aSmrg}
1795444c061aSmrg
1796444c061aSmrgvoid _XtAddDefaultConverters(
1797444c061aSmrg    ConverterTable table)
1798444c061aSmrg{
1799444c061aSmrg#define Add(from, to, proc, convert_args, num_args, cache) \
1800444c061aSmrg    _XtTableAddConverter(table, from, to, proc, \
1801444c061aSmrg	    (XtConvertArgList) convert_args, (Cardinal)num_args, \
1802444c061aSmrg	    True, cache, (XtDestructor)NULL, True)
1803444c061aSmrg
1804444c061aSmrg#define Add2(from, to, proc, convert_args, num_args, cache, destructor) \
1805444c061aSmrg    _XtTableAddConverter(table, from, to, proc, \
1806444c061aSmrg	    (XtConvertArgList) convert_args, (Cardinal)num_args, \
1807444c061aSmrg	    True, cache, destructor, True)
1808444c061aSmrg
1809444c061aSmrg    Add(XtQColor, XtQPixel,       XtCvtColorToPixel,   NULL, 0, XtCacheNone);
1810444c061aSmrg
1811444c061aSmrg    Add(XtQInt,   XtQBool,	  XtCvtIntToBool,      NULL, 0, XtCacheNone);
1812444c061aSmrg    Add(XtQInt,   XtQBoolean,     XtCvtIntToBoolean,   NULL, 0, XtCacheNone);
1813444c061aSmrg    Add(XtQInt,   XtQColor,	  XtCvtIntToColor,
1814444c061aSmrg	colorConvertArgs, XtNumber(colorConvertArgs), XtCacheByDisplay);
1815444c061aSmrg    Add(XtQInt,   XtQDimension,   XtCvtIntToShort,     NULL, 0, XtCacheNone);
1816444c061aSmrg    Add(XtQInt,   XtQFloat,       XtCvtIntToFloat,     NULL, 0, XtCacheNone);
1817444c061aSmrg    Add(XtQInt,   XtQFont,        XtCvtIntToFont,      NULL, 0, XtCacheNone);
1818444c061aSmrg    Add(XtQInt,   XtQPixel,       XtCvtIntToPixel,     NULL, 0, XtCacheNone);
1819444c061aSmrg    Add(XtQInt,   XtQPixmap,      XtCvtIntToPixmap,    NULL, 0, XtCacheNone);
1820444c061aSmrg    Add(XtQInt,   XtQPosition,    XtCvtIntToShort,     NULL, 0, XtCacheNone);
1821444c061aSmrg    Add(XtQInt,   XtQShort,       XtCvtIntToShort,     NULL, 0, XtCacheNone);
1822444c061aSmrg    Add(XtQInt,   XtQUnsignedChar,XtCvtIntToUnsignedChar,NULL, 0, XtCacheNone);
1823444c061aSmrg
1824444c061aSmrg    Add(XtQPixel, XtQColor,	  XtCvtIntToColor,
1825444c061aSmrg	colorConvertArgs, XtNumber(colorConvertArgs), XtCacheByDisplay);
1826444c061aSmrg
1827444c061aSmrg    Add(_XtQString, XtQAtom,      XtCvtStringToAtom,
1828444c061aSmrg	displayConvertArg, XtNumber(displayConvertArg), XtCacheNone);
1829444c061aSmrg    Add(_XtQString, XtQBool,      XtCvtStringToBool,    NULL, 0, XtCacheNone);
1830444c061aSmrg    Add(_XtQString, XtQBoolean,   XtCvtStringToBoolean, NULL, 0, XtCacheNone);
1831444c061aSmrg   Add2(_XtQString, XtQCommandArgArray,  XtCvtStringToCommandArgArray,
1832444c061aSmrg	NULL, 0, XtCacheNone | XtCacheRefCount, ArgArrayDestructor);
1833444c061aSmrg   Add2(_XtQString, XtQCursor,    XtCvtStringToCursor,
1834444c061aSmrg	displayConvertArg, XtNumber(displayConvertArg),
1835444c061aSmrg	XtCacheByDisplay, FreeCursor);
1836444c061aSmrg    Add(_XtQString, XtQDimension, XtCvtStringToDimension,NULL, 0, XtCacheNone);
1837444c061aSmrg   Add2(_XtQString, XtQDirectoryString, XtCvtStringToDirectoryString, NULL, 0,
1838444c061aSmrg	XtCacheNone | XtCacheRefCount, FreeDirectoryString);
1839444c061aSmrg    Add(_XtQString, XtQDisplay,   XtCvtStringToDisplay, NULL, 0, XtCacheAll);
1840444c061aSmrg   Add2(_XtQString, XtQFile,      XtCvtStringToFile,    NULL, 0,
1841444c061aSmrg	XtCacheAll | XtCacheRefCount, FreeFile);
1842444c061aSmrg    Add(_XtQString, XtQFloat,     XtCvtStringToFloat,   NULL, 0, XtCacheNone);
1843444c061aSmrg
1844444c061aSmrg   Add2(_XtQString, XtQFont,      XtCvtStringToFont,
1845444c061aSmrg	displayConvertArg, XtNumber(displayConvertArg),
1846444c061aSmrg	XtCacheByDisplay, FreeFont);
1847444c061aSmrg   Add2(_XtQString, XtQFontSet,   XtCvtStringToFontSet,
1848444c061aSmrg	localeDisplayConvertArgs, XtNumber(localeDisplayConvertArgs),
1849444c061aSmrg	XtCacheByDisplay, FreeFontSet);
1850444c061aSmrg   Add2(_XtQString, XtQFontStruct,XtCvtStringToFontStruct,
1851444c061aSmrg	displayConvertArg, XtNumber(displayConvertArg),
1852444c061aSmrg	XtCacheByDisplay, FreeFontStruct);
1853444c061aSmrg
1854444c061aSmrg    Add(_XtQString, XtQGravity,   XtCvtStringToGravity, NULL, 0, XtCacheNone);
1855444c061aSmrg    Add(_XtQString, XtQInitialState, XtCvtStringToInitialState, NULL, 0,
1856444c061aSmrg	XtCacheNone);
1857444c061aSmrg    Add(_XtQString, XtQInt,	     XtCvtStringToInt,    NULL, 0, XtCacheAll);
1858444c061aSmrg   Add2(_XtQString, XtQPixel,        XtCvtStringToPixel,
1859444c061aSmrg	colorConvertArgs, XtNumber(colorConvertArgs),
1860444c061aSmrg	XtCacheByDisplay, FreePixel);
1861444c061aSmrg    Add(_XtQString, XtQPosition,     XtCvtStringToShort,  NULL, 0, XtCacheAll);
1862444c061aSmrg    Add(_XtQString, XtQRestartStyle, XtCvtStringToRestartStyle, NULL, 0,
1863444c061aSmrg	XtCacheNone);
1864444c061aSmrg    Add(_XtQString, XtQShort,        XtCvtStringToShort,  NULL, 0, XtCacheAll);
1865444c061aSmrg    Add(_XtQString, XtQUnsignedChar, XtCvtStringToUnsignedChar,
1866444c061aSmrg	NULL, 0, XtCacheAll);
1867444c061aSmrg   Add2(_XtQString, XtQVisual,       XtCvtStringToVisual,
1868444c061aSmrg	visualConvertArgs, XtNumber(visualConvertArgs),
1869444c061aSmrg	XtCacheByDisplay, NULL);
1870444c061aSmrg
1871444c061aSmrg   _XtAddTMConverters(table);
1872444c061aSmrg}
1873