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