summaryrefslogtreecommitdiff
path: root/src/StrToBS.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/StrToBS.c')
-rw-r--r--src/StrToBS.c136
1 files changed, 100 insertions, 36 deletions
diff --git a/src/StrToBS.c b/src/StrToBS.c
index 63b5d77..a459011 100644
--- a/src/StrToBS.c
+++ b/src/StrToBS.c
@@ -26,57 +26,121 @@ in this Software without prior written authorization from The Open Group.
*/
+/* $XFree86: xc/lib/Xmu/StrToBS.c,v 1.7 2001/12/14 19:55:50 dawes Exp $ */
+
#include <X11/Intrinsic.h>
#include "Converters.h"
#include "CharSet.h"
-#define done(address, type) \
- { (*toVal).size = sizeof(type); (*toVal).addr = (XPointer) address; }
+/*
+ * Prototypes
+ */
+static void InitializeQuarks(void);
+
+/*
+ * Initialization
+ */
+static XrmQuark QnotUseful, QwhenMapped, Qalways, Qdefault;
+static Boolean haveQuarks;
-/* ARGSUSED */
+/*
+ * Implementation
+ */
+static void
+InitializeQuarks(void)
+{
+ if (!haveQuarks)
+ {
+ char name[11];
+
+ XmuNCopyISOLatin1Lowered(name, XtEnotUseful, sizeof(name));
+ QnotUseful = XrmStringToQuark(name);
+ XmuNCopyISOLatin1Lowered(name, XtEwhenMapped, sizeof(name));
+ QwhenMapped = XrmStringToQuark(name);
+ XmuNCopyISOLatin1Lowered(name, XtEalways, sizeof(name));
+ Qalways = XrmStringToQuark(name);
+ XmuNCopyISOLatin1Lowered(name, XtEdefault, sizeof(name));
+ Qdefault = XrmStringToQuark(name);
+ haveQuarks = True;
+ }
+}
+
+/*ARGSUSED*/
void
-XmuCvtStringToBackingStore (args, num_args, fromVal, toVal)
- XrmValue *args; /* unused */
- Cardinal *num_args; /* unused */
- XrmValuePtr fromVal;
- XrmValuePtr toVal;
+XmuCvtStringToBackingStore(XrmValue *args, Cardinal *num_args,
+ XrmValuePtr fromVal, XrmValuePtr toVal)
{
- char lowerString[40];
XrmQuark q;
+ char name[11];
static int backingStoreType;
- static XrmQuark XtQEnotUseful, XtQEwhenMapped, XtQEalways, XtQEdefault;
- static int haveQuarks = 0;
if (*num_args != 0)
XtWarning("String to BackingStore conversion needs no extra arguments");
- if (!haveQuarks) {
- XmuCopyISOLatin1Lowered (lowerString, XtEnotUseful);
- XtQEnotUseful = XrmStringToQuark(lowerString);
- XmuCopyISOLatin1Lowered (lowerString, XtEwhenMapped);
- XtQEwhenMapped = XrmStringToQuark(lowerString);
- XmuCopyISOLatin1Lowered (lowerString, XtEalways);
- XtQEalways = XrmStringToQuark(lowerString);
- XmuCopyISOLatin1Lowered (lowerString, XtEdefault);
- XtQEdefault = XrmStringToQuark(lowerString);
- haveQuarks = 1;
- }
- if (strlen ((char*)fromVal->addr) >= sizeof lowerString)
- XtStringConversionWarning((char *) fromVal->addr, "BackingStore");
- XmuCopyISOLatin1Lowered (lowerString, (char *) fromVal->addr);
- q = XrmStringToQuark (lowerString);
- if (q == XtQEnotUseful) {
+
+ InitializeQuarks();
+ XmuNCopyISOLatin1Lowered(name, (char *)fromVal->addr, sizeof(name));
+
+ q = XrmStringToQuark (name);
+ if (q == QnotUseful)
backingStoreType = NotUseful;
- done (&backingStoreType, int);
- } else if (q == XtQEwhenMapped) {
+ else if (q == QwhenMapped)
backingStoreType = WhenMapped;
- done (&backingStoreType, int);
- } else if (q == XtQEalways) {
+ else if (q == Qalways)
backingStoreType = Always;
- done (&backingStoreType, int);
- } else if (q == XtQEdefault) {
+ else if (q == Qdefault)
backingStoreType = Always + WhenMapped + NotUseful;
- done (&backingStoreType, int);
- } else {
- XtStringConversionWarning((char *) fromVal->addr, "BackingStore");
+ else
+ {
+ XtStringConversionWarning((char *)fromVal->addr, XtRBackingStore);
+ return;
}
+ toVal->size = sizeof(int);
+ toVal->addr = (XPointer)&backingStoreType;
+}
+
+/*ARGSUSED*/
+Boolean
+XmuCvtBackingStoreToString(Display *dpy, XrmValuePtr args, Cardinal *num_args,
+ XrmValuePtr fromVal, XrmValuePtr toVal,
+ XtPointer *data)
+{
+ static String buffer;
+ Cardinal size;
+
+ switch (*(int *)fromVal->addr)
+ {
+ case NotUseful:
+ buffer = XtEnotUseful;
+ break;
+ case WhenMapped:
+ buffer = XtEwhenMapped;
+ break;
+ case Always:
+ buffer = XtEalways;
+ break;
+ case (Always + WhenMapped + NotUseful):
+ buffer = XtEdefault;
+ break;
+ default:
+ XtWarning("Cannot convert BackingStore to String");
+ toVal->addr = NULL;
+ toVal->size = 0;
+ return (False);
+ }
+
+ size = strlen(buffer) + 1;
+ if (toVal->addr != NULL)
+ {
+ if (toVal->size < size)
+ {
+ toVal->size = size;
+ return (False);
+ }
+ strcpy((char *)toVal->addr, buffer);
+ }
+ else
+ toVal->addr = (XPointer)buffer;
+ toVal->size = sizeof(String);
+
+ return (True);
}