Blame src/StrToWidg.c

Packit cd2a55
/*
Packit cd2a55
Packit cd2a55
Copyright 1994, 1998  The Open Group
Packit cd2a55
Packit cd2a55
Permission to use, copy, modify, distribute, and sell this software and its
Packit cd2a55
documentation for any purpose is hereby granted without fee, provided that
Packit cd2a55
the above copyright notice appear in all copies and that both that
Packit cd2a55
copyright notice and this permission notice appear in supporting
Packit cd2a55
documentation.
Packit cd2a55
Packit cd2a55
The above copyright notice and this permission notice shall be included in
Packit cd2a55
all copies or substantial portions of the Software.
Packit cd2a55
Packit cd2a55
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit cd2a55
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit cd2a55
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit cd2a55
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
Packit cd2a55
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit cd2a55
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit cd2a55
Packit cd2a55
Except as contained in this notice, the name of The Open Group shall not be
Packit cd2a55
used in advertising or otherwise to promote the sale, use or other dealings
Packit cd2a55
in this Software without prior written authorization from The Open Group.
Packit cd2a55
Packit cd2a55
*/
Packit cd2a55
Packit cd2a55
/*
Packit cd2a55
 * XmuCvtStringToWidget
Packit cd2a55
 *
Packit cd2a55
 * static XtConvertArgRec parentCvtArgs[] = {
Packit cd2a55
 *   {XtBaseOffset, (XtPointer)XtOffset(Widget, core.parent), sizeof(Widget)},
Packit cd2a55
 * };
Packit cd2a55
 *
Packit cd2a55
 * matches the string against the name of the immediate children (normal
Packit cd2a55
 * or popup) of the parent.  If none match, compares string to classname
Packit cd2a55
 * & returns first match.  Case is significant.
Packit cd2a55
 */
Packit cd2a55
#ifdef HAVE_CONFIG_H
Packit cd2a55
#include <config.h>
Packit cd2a55
#endif
Packit cd2a55
#include <X11/IntrinsicP.h>
Packit cd2a55
#include <X11/StringDefs.h>
Packit cd2a55
#include <X11/ObjectP.h>
Packit cd2a55
#include <X11/Xmu/Converters.h>
Packit cd2a55
Packit cd2a55
#define	done(address, type) \
Packit cd2a55
{						\
Packit cd2a55
  toVal->size = sizeof(type);			\
Packit cd2a55
  toVal->addr = (XPointer)address;		\
Packit cd2a55
	  return; \
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*ARGSUSED*/
Packit cd2a55
void
Packit cd2a55
XmuCvtStringToWidget(XrmValuePtr args, Cardinal *num_args,
Packit cd2a55
                     XrmValuePtr fromVal, XrmValuePtr toVal)
Packit cd2a55
{
Packit cd2a55
    static Widget widget, *widgetP, parent;
Packit cd2a55
    XrmName name = XrmStringToName(fromVal->addr);
Packit cd2a55
    Cardinal i;
Packit cd2a55
Packit cd2a55
    if (*num_args != 1) {
Packit cd2a55
        i = 0;
Packit cd2a55
        XtErrorMsg("wrongParameters", "cvtStringToWidget", "xtToolkitError",
Packit cd2a55
                   "StringToWidget conversion needs parent arg", NULL, &i);
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    parent = *(Widget *) args[0].addr;
Packit cd2a55
    /* try to match names of normal children */
Packit cd2a55
    if (XtIsComposite(parent)) {
Packit cd2a55
        i = ((CompositeWidget) parent)->composite.num_children;
Packit cd2a55
        for (widgetP = ((CompositeWidget) parent)->composite.children;
Packit cd2a55
             i; i--, widgetP++) {
Packit cd2a55
            if ((*widgetP)->core.xrm_name == name) {
Packit cd2a55
                widget = *widgetP;
Packit cd2a55
                done(&widget, Widget);
Packit cd2a55
            }
Packit cd2a55
        }
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    /* try to match names of popup children */
Packit cd2a55
    i = parent->core.num_popups;
Packit cd2a55
    for (widgetP = parent->core.popup_list; i; i--, widgetP++) {
Packit cd2a55
        if ((*widgetP)->core.xrm_name == name) {
Packit cd2a55
            widget = *widgetP;
Packit cd2a55
            done(&widget, Widget);
Packit cd2a55
        }
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    /* try to match classes of normal children */
Packit cd2a55
    if (XtIsComposite(parent)) {
Packit cd2a55
        i = ((CompositeWidget) parent)->composite.num_children;
Packit cd2a55
        for (widgetP = ((CompositeWidget) parent)->composite.children;
Packit cd2a55
             i; i--, widgetP++) {
Packit cd2a55
            if ((*widgetP)->core.widget_class->core_class.xrm_class == name) {
Packit cd2a55
                widget = *widgetP;
Packit cd2a55
                done(&widget, Widget);
Packit cd2a55
            }
Packit cd2a55
        }
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    /* try to match classes of popup children */
Packit cd2a55
    i = parent->core.num_popups;
Packit cd2a55
    for (widgetP = parent->core.popup_list; i; i--, widgetP++) {
Packit cd2a55
        if ((*widgetP)->core.widget_class->core_class.xrm_class == name) {
Packit cd2a55
            widget = *widgetP;
Packit cd2a55
            done(&widget, Widget);
Packit cd2a55
        }
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    XtStringConversionWarning(fromVal->addr, XtRWidget);
Packit cd2a55
    toVal->addr = NULL;
Packit cd2a55
    toVal->size = 0;
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
#undef done
Packit cd2a55
Packit cd2a55
#define newDone(type, value) \
Packit cd2a55
        {                                                       \
Packit cd2a55
            if (toVal->addr != NULL) {                          \
Packit cd2a55
                if (toVal->size < sizeof(type)) {               \
Packit cd2a55
                    toVal->size = sizeof(type);                 \
Packit cd2a55
                    return False;                               \
Packit cd2a55
                }                                               \
Packit cd2a55
                *(type*)(toVal->addr) = (value);                \
Packit cd2a55
            }                                                   \
Packit cd2a55
            else {                                              \
Packit cd2a55
                static type static_val;                         \
Packit cd2a55
                static_val = (value);                           \
Packit cd2a55
                toVal->addr = (XtPointer)&static_val;           \
Packit cd2a55
            }                                                   \
Packit cd2a55
            toVal->size = sizeof(type);                         \
Packit cd2a55
            return True;                                        \
Packit cd2a55
        }
Packit cd2a55
Packit cd2a55
Packit cd2a55
/*ARGSUSED*/
Packit cd2a55
Boolean
Packit cd2a55
XmuNewCvtStringToWidget(Display *dpy, XrmValue *args, Cardinal *num_args,
Packit cd2a55
                        XrmValue *fromVal, XrmValue *toVal,
Packit cd2a55
                        XtPointer *converter_data)
Packit cd2a55
{
Packit cd2a55
    Widget *widgetP, parent;
Packit cd2a55
    XrmName name = XrmStringToName(fromVal->addr);
Packit cd2a55
    int i;
Packit cd2a55
Packit cd2a55
    if (*num_args != 1)
Packit cd2a55
        XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
Packit cd2a55
                        "wrongParameters", "cvtStringToWidget",
Packit cd2a55
                        "xtToolkitError",
Packit cd2a55
                        "String To Widget conversion needs parent argument",
Packit cd2a55
                        (String *) NULL, (Cardinal *) NULL);
Packit cd2a55
Packit cd2a55
    parent = *(Widget *) args[0].addr;
Packit cd2a55
    /* try to match names of normal children */
Packit cd2a55
    if (XtIsComposite(parent)) {
Packit cd2a55
        i = ((CompositeWidget) parent)->composite.num_children;
Packit cd2a55
        for (widgetP = ((CompositeWidget) parent)->composite.children;
Packit cd2a55
             i; i--, widgetP++) {
Packit cd2a55
            if ((*widgetP)->core.xrm_name == name)
Packit cd2a55
                newDone(Widget, *widgetP);
Packit cd2a55
        }
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    /* try to match names of popup children */
Packit cd2a55
    i = parent->core.num_popups;
Packit cd2a55
    for (widgetP = parent->core.popup_list; i; i--, widgetP++) {
Packit cd2a55
        if ((*widgetP)->core.xrm_name == name)
Packit cd2a55
            newDone(Widget, *widgetP);
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    /* try to match classes of normal children */
Packit cd2a55
    if (XtIsComposite(parent)) {
Packit cd2a55
        i = ((CompositeWidget) parent)->composite.num_children;
Packit cd2a55
        for (widgetP = ((CompositeWidget) parent)->composite.children;
Packit cd2a55
             i; i--, widgetP++) {
Packit cd2a55
            if ((*widgetP)->core.widget_class->core_class.xrm_class == name)
Packit cd2a55
                newDone(Widget, *widgetP);
Packit cd2a55
        }
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    /* try to match classes of popup children */
Packit cd2a55
    i = parent->core.num_popups;
Packit cd2a55
    for (widgetP = parent->core.popup_list; i; i--, widgetP++) {
Packit cd2a55
        if ((*widgetP)->core.widget_class->core_class.xrm_class == name)
Packit cd2a55
            newDone(Widget, *widgetP);
Packit cd2a55
    }
Packit cd2a55
Packit cd2a55
    XtDisplayStringConversionWarning(dpy, (String) fromVal->addr, XtRWidget);
Packit cd2a55
    return (False);
Packit cd2a55
}
Packit cd2a55
Packit cd2a55
/*ARGSUSED*/
Packit cd2a55
Boolean
Packit cd2a55
XmuCvtWidgetToString(Display *dpy, XrmValuePtr args, Cardinal *num_args,
Packit cd2a55
                     XrmValuePtr fromVal, XrmValuePtr toVal, XtPointer *data)
Packit cd2a55
{
Packit cd2a55
    static String buffer;
Packit cd2a55
    Cardinal size;
Packit cd2a55
    Widget widget;
Packit cd2a55
Packit cd2a55
    widget = *(Widget *) fromVal->addr;
Packit cd2a55
Packit cd2a55
    if (widget)
Packit cd2a55
        buffer = XrmQuarkToString(widget->core.xrm_name);
Packit cd2a55
    else
Packit cd2a55
        buffer = "(null)";
Packit cd2a55
Packit cd2a55
    size = strlen(buffer) + 1;
Packit cd2a55
    if (toVal->addr != NULL) {
Packit cd2a55
        if (toVal->size < size) {
Packit cd2a55
            toVal->size = size;
Packit cd2a55
            return (False);
Packit cd2a55
        }
Packit cd2a55
        strcpy((char *) toVal->addr, buffer);
Packit cd2a55
    }
Packit cd2a55
    else {
Packit cd2a55
        toVal->addr = (XPointer) buffer;
Packit cd2a55
    }
Packit cd2a55
    toVal->size = sizeof(String);
Packit cd2a55
Packit cd2a55
    return (True);
Packit cd2a55
}