--- AsciiSrc.c.orig	Sat Jan 11 18:14:41 1997
+++ AsciiSrc.c	Sat Jul 25 13:02:47 1998
@@ -27,6 +27,8 @@
 
 */
 
+/* $XFree86: xc/lib/Xaw/AsciiSrc.c,v 1.1.1.2.4.2 1998/05/16 09:05:19 dawes Exp $ */
+
 /*
  * AsciiSrc.c - AsciiSrc object. (For use with the text widget).
  *
@@ -1293,15 +1295,21 @@
     XtQEfile   = XrmPermStringToQuark(XtEfile);
   }
 
+  if (strlen((char *) fromVal->addr) >= sizeof(lowerName)) {
+    XtStringConversionWarning((char *) fromVal->addr, XtRAsciiType);
+    return;
+  }
   XmuCopyISOLatin1Lowered(lowerName, (char *) fromVal->addr);
   q = XrmStringToQuark(lowerName);
 
   if (q == XtQEstring) type = XawAsciiString;
   if (q == XtQEfile)  type = XawAsciiFile;
-
-  (*toVal).size = sizeof(XawAsciiType);
-  (*toVal).addr = (XPointer) &type;
-  return;
+  if (q == XtQEstring || q == XtQEfile) {
+    (*toVal).size = sizeof(XawAsciiType);
+    (*toVal).addr = (XPointer) &type;
+    return;
+  }
+  XtStringConversionWarning((char *) fromVal->addr, XtRAsciiType);
 }
 
 #if (defined(ASCII_STRING) || defined(ASCII_DISK))
--- AsciiSrcP.h.orig	Sat Jan 11 18:14:41 1997
+++ AsciiSrcP.h	Sat Jul 25 13:02:47 1998
@@ -50,6 +50,7 @@
 SOFTWARE.
 
 ******************************************************************/
+/* $XFree86: xc/lib/Xaw/AsciiSrcP.h,v 1.1.1.1.12.1 1998/05/19 07:31:43 dawes Exp $ */
 
 /*
  * AsciiSrcP.h - Private Header for Ascii Text Source.
@@ -85,7 +86,11 @@
 #ifdef L_tmpnam
 #define TMPSIZ L_tmpnam
 #else
-#define TMPSIZ 32		/* bytes to allocate for tmpnam */
+#ifdef PATH_MAX
+#define TMPSIZ PATH_MAX
+#else
+#define TMPSIZ 1024		/* bytes to allocate for tmpnam */
+#endif
 #endif
 
 #define MAGIC_VALUE ((XawTextPosition) -1) /* Magic value. */
--- Form.c.orig	Sat Jan 11 18:14:41 1997
+++ Form.c	Sat Jul 25 13:02:47 1998
@@ -48,6 +48,8 @@
 
 ******************************************************************/
 
+/* $XFree86: xc/lib/Xaw/Form.c,v 1.1.1.1.12.2 1998/05/16 09:05:19 dawes Exp $ */
+
 #include <X11/IntrinsicP.h>
 #include <X11/StringDefs.h>
 #include <X11/Xmu/Converters.h>
@@ -196,6 +198,10 @@
     XrmQuark q;
     char lowerName[1000];
 
+    if (strlen((char*)fromVal->addr) >= sizeof(lowerName)) {
+	XtStringConversionWarning(fromVal->addr, "edgeType");
+	return;
+    }
     XmuCopyISOLatin1Lowered (lowerName, (char*)fromVal->addr);
     q = XrmStringToQuark(lowerName);
     if (q == XtQChainLeft) {
--- MenuButton.c.orig	Sat Jan 11 18:14:42 1997
+++ MenuButton.c	Sat Jul 25 13:03:56 1998
@@ -28,6 +28,7 @@
  *
  */
 
+/* $XFree86: xc/lib/Xaw/MenuButton.c,v 3.0.6.2 1998/05/20 05:06:17 dawes Exp $ */
 
 /***********************************************************************
  *
@@ -55,6 +56,8 @@
 #include <X11/neXtaw/XawInit.h>
 #include <X11/neXtaw/MenuButtoP.h>
 
+#include "XawAlloc.h"
+
 static void ClassInitialize(), Initialize();
 static void PopupMenu();
 static void Redisplay();
@@ -308,9 +311,16 @@
 
   if (menu == NULL) {
     char error_buf[BUFSIZ];
-    (void) sprintf(error_buf, "MenuButton: %s %s.",
-	    "Could not find menu widget named", mbw->menu_button.menu_name);
-    XtAppWarning(XtWidgetToApplicationContext(w), error_buf);
+    char *err1 = "MenuButton: Could not find menu widget named ";
+    char *perr;
+    int len;
+
+    len = strlen(err1) + strlen(mbw->menu_button.menu_name) + 1 + 1;
+    perr = XtStackAlloc(len, error_buf);
+    if (perr == NULL) return;
+    sprintf(perr, "%s%s.", err1, mbw->menu_button.menu_name);
+    XtAppWarning(XtWidgetToApplicationContext(w), perr);
+    XtStackFree(perr, error_buf);
     return;
   }
   if (!XtIsRealized(menu))
--- MultiSrc.c.orig	Sat Jan 11 18:14:42 1997
+++ MultiSrc.c	Sat Jul 25 13:02:48 1998
@@ -1440,13 +1440,19 @@
     XtQEfile   = XrmPermStringToQuark(XtEfile);
   }
 
+  if (strlen((char *) fromVal->addr) >= sizeof(lowerName)) {
+    XtStringConversionWarning((char *) fromVal->addr, XtRAsciiType);
+    return;
+  }
   XmuCopyISOLatin1Lowered(lowerName, (char *) fromVal->addr);
   q = XrmStringToQuark(lowerName);
 
   if (q == XtQEstring) type = XawAsciiString;
   if (q == XtQEfile)  type = XawAsciiFile;
-
-  (*toVal).size = sizeof(XawAsciiType);
-  (*toVal).addr = (XPointer) &type;
-  return;
+  if (q == XtQEstring || q == XtQEfile) {
+    (*toVal).size = sizeof(XawAsciiType);
+    (*toVal).addr = (XPointer) &type;
+    return;
+  }
+  XtStringConversionWarning((char *) fromVal->addr, XtRAsciiType);
 }
--- MultiSrcP.h.orig	Sat Jan 11 18:14:42 1997
+++ MultiSrcP.h	Sat Jul 25 13:02:48 1998
@@ -72,6 +72,7 @@
 SOFTWARE.
 
 ******************************************************************/
+/* $XFree86: xc/lib/Xaw/MultiSrcP.h,v 1.1.1.1.12.2 1998/05/19 14:36:47 dawes Exp $ */
 
 /*
  * MultiSrcP.h - Private Header for Multi Text Source.
@@ -113,7 +114,11 @@
 #ifdef L_tmpnam
 #define TMPSIZ L_tmpnam
 #else
-#define TMPSIZ 32		/* bytes to allocate for tmpnam */
+#ifdef PATH_MAX
+#define TMPSIZ PATH_MAX
+#else
+#define TMPSIZ 1024		/* bytes to allocate for tmpnam */
+#endif
 #endif
 
 #define MAGIC_VALUE ((XawTextPosition) -1) /* Magic value. */
--- Simple.c.orig	Sat Jan 11 18:14:42 1997
+++ Simple.c	Sat Jul 25 13:02:48 1998
@@ -48,6 +48,8 @@
 
 ******************************************************************/
 
+/* $XFree86: xc/lib/Xaw/Simple.c,v 1.1.1.1.12.2 1998/05/18 14:08:41 dawes Exp $ */
+
 #include <stdio.h>
 #include <X11/IntrinsicP.h>
 #include <X11/StringDefs.h>
@@ -55,6 +57,8 @@
 #include <X11/neXtaw/SimpleP.h>
 #include <X11/Xmu/Drawing.h>
 
+#include "XawAlloc.h"
+
 #define offset(field) XtOffsetOf(SimpleRec, simple.field)
 
 static XtResource resources[] = {
@@ -144,11 +148,17 @@
 
     if (c->simple_class.change_sensitive == NULL) {
 	char buf[BUFSIZ];
-
-	(void) sprintf(buf,
-		"%s Widget: The Simple Widget class method 'change_sensitive' is undefined.\nA function must be defined or inherited.",
-		c->core_class.class_name);
-	XtWarning(buf);
+	char *pbuf;
+	char *msg1 = " Widget: The Simple Widget class method 'change_sensitive' is undefined.\nA function must be defined or inherited.";
+	int len;
+
+	len = strlen(msg1) + strlen(c->core_class.class_name) + 1;
+	pbuf = XtStackAlloc(len, buf);
+	if (pbuf != NULL) {
+	    sprintf(pbuf, "%s%s", c->core_class.class_name, msg1);
+	    XtWarning(pbuf);
+	    XtStackFree(pbuf, buf);
+	}
 	c->simple_class.change_sensitive = ChangeSensitive;
     }
 
--- SimpleMenu.c.orig	Sat Jan 11 18:14:43 1997
+++ SimpleMenu.c	Sat Jul 25 13:02:48 1998
@@ -28,6 +28,8 @@
 in this Software without prior written authorization from the X Consortium.
  */
 
+/* $XFree86: xc/lib/Xaw/SimpleMenu.c,v 3.1.6.3 1998/05/20 05:06:17 dawes Exp $ */
+
 /*
  * SimpleMenu.c - Source code file for SimpleMenu widget.
  *
@@ -52,6 +54,8 @@
 #include <X11/Xmu/Initer.h>
 #include <X11/Xmu/CharSet.h>
 
+#include "XawAlloc.h"
+
 #define streq(a, b)        ( strcmp((a), (b)) == 0 )
 
 #define offset(field) XtOffsetOf(SimpleMenuRec, simple_menu.field)
@@ -725,9 +729,17 @@
 
   if ( (menu = FindMenu(w, params[0])) == NULL) {
     char error_buf[BUFSIZ];
-    (void) sprintf(error_buf, "%s '%s'",
-	    "Xaw - SimpleMenuWidget: could not find menu named: ", params[0]);
-    XtAppWarning(XtWidgetToApplicationContext(w), error_buf);
+    char *err1 = "Xaw - SimpleMenuWidget: could not find menu named: ";
+    char *perr;
+    int len;
+
+    len = strlen(err1) + strlen(params[0]) + 2 + 1;
+    perr = XtStackAlloc(len, error_buf);
+    if (perr == NULL)
+	return;
+    sprintf(perr, "%s'%s'", err1, params[0]);
+    XtAppWarning(XtWidgetToApplicationContext(w), perr);
+    XtStackFree(perr, error_buf);
     return;
   }
   
--- SmeBSB.c.orig	Sat Jan 11 18:14:43 1997
+++ SmeBSB.c	Sat Jul 25 13:02:49 1998
@@ -26,6 +26,8 @@
 in this Software without prior written authorization from the X Consortium.
  */
 
+/* $XFree86: xc/lib/Xaw/SmeBSB.c,v 1.1.1.2.2.3 1998/05/20 05:06:18 dawes Exp $ */
+
 /*
  * SmeBSB.c - Source code file for BSB Menu Entry object.
  *
@@ -56,6 +58,8 @@
 
 #include <stdio.h>
 
+#include "XawAlloc.h"
+
 #define ONE_HUNDRED 100
 
 #define offset(field) XtOffsetOf(SmeBSBRec, sme_bsb.field)
@@ -609,22 +613,31 @@
     int x, y;
     unsigned int width, height;
     char buf[BUFSIZ];
+    char *pbuf;
+    int len;
     
     if (is_left) {
 	if (entry->sme_bsb.left_bitmap != None) {
 	    if (!XGetGeometry(XtDisplayOfObject(w), 
 			      entry->sme_bsb.left_bitmap, &root, 
 			      &x, &y, &width, &height, &bw, &depth)) {
-		(void) sprintf(buf, "Xaw SmeBSB Object: %s %s \"%s\".", "Could not",
-			"get Left Bitmap geometry information for menu entry ",
-			XtName(w));
-		XtAppError(XtWidgetToApplicationContext(w), buf);
+		char *err1 = "Xaw SmeBSB Object: Could not get Left Bitmap geometry information for menu entry ";
+		len = strlen(err1) + strlen(XtName(w)) + 3 + 1;
+		pbuf = XtStackAlloc(len, buf);
+		if (pbuf == NULL) return;
+		sprintf(pbuf, "%s\"%s\".", err1, XtName(w));
+		XtAppError(XtWidgetToApplicationContext(w), pbuf);
+		XtStackFree(pbuf, buf);
 	    }
 	    if (depth != 1) {
-		(void) sprintf(buf, "Xaw SmeBSB Object: %s \"%s\"%s.", 
-			"Left Bitmap of entry ", 
-			XtName(w), " is not one bit deep.");
-		XtAppError(XtWidgetToApplicationContext(w), buf);
+		char *err1 = "Xaw SmeBSB Object: Left Bitmap of entry ";
+		char *err2 = " is not one bit deep.";
+		len = strlen(err1) + strlen(err2) + strlen(XtName(w)) + 2 + 1;
+		pbuf = XtStackAlloc(len, buf);
+		if (pbuf == NULL) return;
+		sprintf(pbuf, "%s\"%s\"%s", err1, XtName(w), err2);
+		XtAppError(XtWidgetToApplicationContext(w), pbuf);
+		XtStackFree(pbuf, buf);
 	    }
 	    entry->sme_bsb.left_bitmap_width = (Dimension) width; 
 	    entry->sme_bsb.left_bitmap_height = (Dimension) height;
@@ -634,16 +647,23 @@
 	if (!XGetGeometry(XtDisplayOfObject(w),
 			  entry->sme_bsb.right_bitmap, &root,
 			  &x, &y, &width, &height, &bw, &depth)) {
-	    (void) sprintf(buf, "Xaw SmeBSB Object: %s %s \"%s\".", "Could not",
-		    "get Right Bitmap geometry information for menu entry ",
-		    XtName(w));
-	    XtAppError(XtWidgetToApplicationContext(w), buf);
+	    char *err1 = "Xaw SmeBSB Object: Could not get Right Bitmap geometry information for menu entry ";
+	    len = strlen(err1) + strlen(XtName(w)) + 3 + 1;
+	    pbuf = XtStackAlloc(len, buf);
+	    if (pbuf == NULL) return;
+	    sprintf(pbuf, "%s\"%s\".", err1, XtName(w));
+	    XtAppError(XtWidgetToApplicationContext(w), pbuf);
+	    XtStackFree(pbuf, buf);
 	}
 	if (depth != 1) {
-	    (void) sprintf(buf, "Xaw SmeBSB Object: %s \"%s\"%s.", 
-		    "Right Bitmap of entry ", XtName(w),
-		    " is not one bit deep.");
-	    XtAppError(XtWidgetToApplicationContext(w), buf);
+	    char *err1 = "Xaw SmeBSB Object: Right Bitmap of entry ";
+	    char *err2 = " is not one bit deep.";
+	    len = strlen(err1) + strlen(err2) + strlen(XtName(w)) + 2 + 1;
+	    pbuf = XtStackAlloc(len, buf);
+	    if (pbuf == NULL) return;
+	    sprintf(pbuf, "%s\"%s\"%s", err1, XtName(w), err2);
+	    XtAppError(XtWidgetToApplicationContext(w), pbuf);
+	    XtStackFree(pbuf, buf);
 	}
 	entry->sme_bsb.right_bitmap_width = (Dimension) width; 
 	entry->sme_bsb.right_bitmap_height = (Dimension) height;
--- Text.c.orig	Sat Jan 11 18:14:43 1997
+++ Text.c	Sat Jul 25 13:06:12 1998
@@ -49,6 +49,8 @@
 
 ******************************************************************/
 
+/* $XFree86: xc/lib/Xaw/Text.c,v 3.2.4.2 1998/05/16 09:05:21 dawes Exp $ */
+
 #include <X11/IntrinsicP.h>
 #include <X11/StringDefs.h>
 #include <X11/Shell.h>
@@ -74,6 +76,8 @@
 #include <X11/Xfuncs.h>
 #include <ctype.h>		/* for isprint() */
 
+#include "XawAlloc.h"
+
 #ifndef MAX_LEN_CT
 #define MAX_LEN_CT 6		/* for sequence: ESC $ ( A \xx \xx */
 #endif
@@ -205,6 +209,10 @@
     inited = TRUE;
   }
 
+  if (strlen((char *)fromVal->addr) >= sizeof(lowerName)) {
+    XtStringConversionWarning((char *) fromVal->addr, XtRScrollMode);
+    return;
+  }
   XmuCopyISOLatin1Lowered (lowerName, (char *)fromVal->addr);
   q = XrmStringToQuark(lowerName);
 
@@ -212,7 +220,7 @@
   else if (q == QScrollWhenNeeded)     scrollMode = XawtextScrollWhenNeeded;
   else if (q == QScrollAlways)         scrollMode = XawtextScrollAlways;
   else {
-    done(NULL, 0);
+    XtStringConversionWarning((char *) fromVal->addr, XtRScrollMode);
     return;
   }
   done(&scrollMode, XawTextScrollMode);
@@ -240,6 +248,10 @@
     inited = TRUE;
   }
 
+  if (strlen((char *)fromVal->addr) >= sizeof(lowerName)) {
+    XtStringConversionWarning((char *) fromVal->addr, XtRWrapMode);
+    return;
+  }
   XmuCopyISOLatin1Lowered (lowerName, (char *)fromVal->addr);
   q = XrmStringToQuark(lowerName);
 
@@ -247,7 +259,7 @@
   else if (q == QWrapLine)      wrapMode = XawtextWrapLine;
   else if (q == QWrapWord)      wrapMode = XawtextWrapWord;
   else {
-    done(NULL, 0);
+    XtStringConversionWarning((char *) fromVal->addr, XtRWrapMode);
     return;
   }
   done(&wrapMode, XawTextWrapMode);
@@ -276,6 +288,10 @@
     inited = TRUE;
   }
 
+  if (strlen((char *)fromVal->addr) >= sizeof(lowerName)) {
+    XtStringConversionWarning((char *) fromVal->addr, XtRResizeMode);
+    return;
+  }
   XmuCopyISOLatin1Lowered (lowerName, (char *)fromVal->addr);
   q = XrmStringToQuark(lowerName);
 
@@ -284,7 +300,7 @@
   else if (q == QResizeHeight)         resizeMode = XawtextResizeHeight;
   else if (q == QResizeBoth)           resizeMode = XawtextResizeBoth;
   else {
-    done(NULL, 0);
+    XtStringConversionWarning((char *) fromVal->addr, XtRResizeMode);
     return;
   }
   done(&resizeMode, XawTextResizeMode);
@@ -498,6 +514,8 @@
 {
   TextWidget ctx = (TextWidget) new;
   char error_buf[BUFSIZ];
+  char *perr;
+  int len;
   int s;
 
   ctx->text.threeD=XtVaCreateWidget("threeD",threeDWidgetClass,new,
@@ -547,10 +565,17 @@
   if (ctx->text.scroll_vert != XawtextScrollNever) 
     if ( (ctx->text.resize == XawtextResizeHeight) ||
      	 (ctx->text.resize == XawtextResizeBoth) ) {
-      (void) sprintf(error_buf, "Xaw Text Widget %s:\n %s %s.", ctx->core.name,
-	      "Vertical scrolling not allowed with height resize.\n",
-	      "Vertical scrolling has been DEACTIVATED.");
-      XtAppWarning(XtWidgetToApplicationContext(new), error_buf);
+      char *err1 = "Xaw Text Widget ";
+      char *err2 = ":\nVertical scrolling not allowed with height resize.\n";
+      char *err3 = "Vertical scrolling has been DEACTIVATED.";
+      len = strlen(err1) + strlen(err2) + strlen(err3) +
+		strlen(ctx->core.name) + 1;
+      perr = XtStackAlloc(len, error_buf);
+      if (perr != NULL) {
+	(void) sprintf(perr, "%s%s%s%s", err1, ctx->core.name, err2, err3);
+	XtAppWarning(XtWidgetToApplicationContext(new), perr);
+	XtStackFree(perr, error_buf);
+      }
       ctx->text.scroll_vert = XawtextScrollNever;
     }
     else if (ctx->text.scroll_vert == XawtextScrollAlways)
@@ -558,18 +583,32 @@
 
   if (ctx->text.scroll_horiz != XawtextScrollNever) 
     if (ctx->text.wrap != XawtextWrapNever) {
-      (void) sprintf(error_buf, "Xaw Text Widget %s:\n %s %s.", ctx->core.name,
-	      "Horizontal scrolling not allowed with wrapping active.\n",
-	      "Horizontal scrolling has been DEACTIVATED.");
-      XtAppWarning(XtWidgetToApplicationContext(new), error_buf);
+      char *err1 = "Xaw Text Widget ";
+      char *err2 = ":\nHorizontal scrolling not allowed with wrapping active.";
+      char *err3 = "\nHorizontal scrolling has been DEACTIVATED.";
+      len = strlen(err1) + strlen(err2) + strlen(err3) +
+		strlen(ctx->core.name) + 1;
+      perr = XtStackAlloc(len, error_buf);
+      if (perr != NULL) {
+	(void) sprintf(perr, "%s%s%s%s", err1, ctx->core.name, err2, err3);
+	XtAppWarning(XtWidgetToApplicationContext(new), perr);
+	XtStackFree(perr, error_buf);
+      }
       ctx->text.scroll_horiz = XawtextScrollNever;
     }
     else if ( (ctx->text.resize == XawtextResizeWidth) ||
 	      (ctx->text.resize == XawtextResizeBoth) ) {
-      (void) sprintf(error_buf, "Xaw Text Widget %s:\n %s %s.", ctx->core.name,
-	      "Horizontal scrolling not allowed with width resize.\n",
-	      "Horizontal scrolling has been DEACTIVATED.");
-      XtAppWarning(XtWidgetToApplicationContext(new), error_buf);
+      char *err1 = "Xaw Text Widget ";
+      char *err2 = ":\nHorizontal scrolling not allowed with width resize.\n";
+      char *err3 = "Horizontal scrolling has been DEACTIVATED.";
+      len = strlen(err1) + strlen(err2) + strlen(err3) +
+		strlen(ctx->core.name) + 1;
+      perr = XtStackAlloc(len, error_buf);
+      if (perr != NULL) {
+	(void) sprintf(perr, "%s%s%s%s", err1, ctx->core.name, err2, err3);
+	XtAppWarning(XtWidgetToApplicationContext(new), perr);
+	XtStackFree(perr, error_buf);
+      }
       ctx->text.scroll_horiz = XawtextScrollNever;
     }
     else if (ctx->text.scroll_horiz == XawtextScrollAlways)
--- TextPop.c.orig	Sat Jan 11 18:14:44 1997
+++ TextPop.c	Sat Jul 25 13:02:50 1998
@@ -27,6 +27,8 @@
 
 */
 
+/* $XFree86: xc/lib/Xaw/TextPop.c,v 1.1.1.2.4.2 1998/05/18 14:08:43 dawes Exp $ */
+
 /************************************************************
  *
  * This file is broken up into three sections one dealing with
@@ -64,6 +66,8 @@
 #include <X11/Xos.h>		/* for O_RDONLY */
 #include <errno.h>
 
+#include "XawAlloc.h"
+
 #ifdef X_NOT_STDC_ENV
 extern int errno;
 #endif
@@ -805,6 +809,8 @@
 struct SearchAndReplace * search;
 {
   char msg[BUFSIZ];
+  char *pmsg;
+  int len;
   Widget tw = XtParent(search->search_popup);
   XawTextPosition pos;
   XawTextScanDirection dir;
@@ -828,9 +834,20 @@
    /* The Raw string in find.ptr may be WC I can't use here, so I re - call 
    GetString to get a tame version. */
 
-  if (pos == XawTextSearchError) 
-    (void) sprintf( msg, "Could not find string ``%s''.", GetString( search->search_text ) );
-  else {
+  if (pos == XawTextSearchError) {
+    char *msg1 = "Could not find string ``";
+    char *msg2 = "''.";
+    len = strlen(msg1) + strlen(msg2) +
+		strlen(GetString( search->search_text )) + 1;
+    pmsg = XtStackAlloc(len, msg);
+    if (pmsg != NULL) {
+      (void) sprintf( pmsg, "%s%s%s", msg1, GetString( search->search_text ),
+			msg2);
+    } else {
+      pmsg = msg;
+      (void) sprintf( pmsg, "Could not find string");
+    }
+  } else {
     if (dir == XawsdRight)
       XawTextSetInsertionPoint( tw, pos + text.length);
     else
@@ -842,7 +859,8 @@
   }
   
   XawTextUnsetSelection(tw);
-  SetSearchLabels(search, msg, "", TRUE);
+  SetSearchLabels(search, pmsg, "", TRUE);
+  XtStackFree(pmsg, msg);
   return(FALSE);
 }
 
@@ -969,13 +987,26 @@
       if ( (new_pos == XawTextSearchError) ) {
 	if (count == 0) {
 	  char msg[BUFSIZ];
+	  char *pmsg;
+	  int len;
+	  char *msg1 = "*** Error: Could not find string ``";
+	  char *msg2 = "''. ***";
 
              /* The Raw string in find.ptr may be WC I can't use here, 
 		so I call GetString to get a tame version.*/
 
-	  (void) sprintf( msg, "%s %s %s", "*** Error: Could not find string ``",
-		  GetString( search->search_text ), "''. ***");
-	  SetSearchLabels(search, msg, "", TRUE);
+	  len = strlen(msg1) + strlen(msg2) +
+		strlen(GetString( search->search_text )) + 1;
+	  pmsg = XtStackAlloc(len, msg);
+	  if (pmsg != NULL) {
+	    (void) sprintf( pmsg, "%s%s%s", msg1,
+				GetString( search->search_text ), msg2);
+	  } else {
+	    pmsg = msg;
+	    (void) sprintf(pmsg, "*** Error: Could not find string ***");
+	  }
+	  SetSearchLabels(search, pmsg, "", TRUE);
+	  XtStackFree(pmsg, msg);
 	  return(FALSE);
 	}
 	else
@@ -998,9 +1029,22 @@
 
     if (XawTextReplace(tw, pos, end_pos, &replace) != XawEditDone) {
       char msg[BUFSIZ];
-      
-      (void) sprintf( msg, "'%s' with '%s'. ***", find.ptr, replace.ptr);
+      char *pmsg;
+      int len;
+      char *msg1 = "' with '";
+      char *msg2 = "'. ***";
+
+      len = 1 + strlen(msg1) + strlen(msg2) + strlen(find.ptr) +
+		strlen(replace.ptr) + 1;
+      pmsg = XtStackAlloc(len, msg);
+      if (pmsg != NULL) {
+	(void) sprintf( pmsg, "`%s%s%s%s", find.ptr, msg1, replace.ptr, msg2);
+      } else {
+	pmsg = msg;
+	(void) sprintf(pmsg, "string ***");
+      }
       SetSearchLabels(search, "*** Error while replacing", msg, TRUE);
+      XtStackFree(pmsg, msg);
       return(FALSE);
     }      
 
@@ -1151,13 +1195,20 @@
 {
   Widget temp_widget;
   char buf[BUFSIZ];
+  char *pbuf;
+  int len;
 
-  (void) sprintf(buf, "%s.%s", FORM_NAME, name);
+  len = strlen(FORM_NAME) + strlen(name) + 2;
+  pbuf = XtStackAlloc(len, buf);
+  if (pbuf == NULL) return FALSE;
+  (void) sprintf(pbuf, "%s.%s", FORM_NAME, name);
 
-  if ( (temp_widget = XtNameToWidget(shell, buf)) != NULL) {
+  if ( (temp_widget = XtNameToWidget(shell, pbuf)) != NULL) {
     SetResource(temp_widget, res_name, value);
+    XtStackFree(pbuf, buf);
     return(TRUE);
   }
+  XtStackFree(pbuf, buf);
   return(FALSE);
 }
 
--- TextSrc.c.orig	Sat Jan 11 18:14:44 1997
+++ TextSrc.c	Sat Jul 25 13:02:50 1998
@@ -26,6 +26,8 @@
 
 */
 
+/* $XFree86: xc/lib/Xaw/TextSrc.c,v 1.1.1.1.12.2 1998/05/16 09:05:22 dawes Exp $ */
+
 /*
  * Author:  Chris Peterson, MIT X Consortium.
  * Much code taken from X11R3 String and Disk Sources.
@@ -323,6 +325,10 @@
     inited = TRUE;
   }
 
+  if (strlen((char *)fromVal->addr) >= sizeof(lowerName)) {
+    XtStringConversionWarning((char *) fromVal->addr, XtREditMode);
+    return;
+  }
   XmuCopyISOLatin1Lowered (lowerName, (char *)fromVal->addr);
   q = XrmStringToQuark(lowerName);
 
@@ -330,7 +336,7 @@
   else if (q == QAppend)         editType = XawtextAppend;
   else if (q == QEdit)           editType = XawtextEdit;
   else {
-    done(NULL, 0);
+    XtStringConversionWarning((char *) fromVal->addr, XtREditMode);
     return;
   }
   done(&editType, XawTextEditType);
--- XawAlloc.h.orig	Sat Jul 25 13:02:50 1998
+++ XawAlloc.h	Sat Jul 25 13:02:50 1998
@@ -0,0 +1,10 @@
+/* $XFree86: xc/lib/Xaw/XawAlloc.h,v 1.1.2.1 1998/05/16 09:05:23 dawes Exp $ */
+
+#define XtStackAlloc(size, stack_cache_array)     \
+    ((size) <= sizeof(stack_cache_array)          \
+    ?  (XtPointer)(stack_cache_array)             \
+    :  XtMalloc((unsigned)(size)))
+     
+#define XtStackFree(pointer, stack_cache_array) \
+    if ((pointer) != ((XtPointer)(stack_cache_array))) XtFree(pointer); else
+
--- XawIm.c.orig	Sat Jul 25 13:02:03 1998
+++ XawIm.c	Sat Jul 25 13:02:50 1998
@@ -53,7 +53,6 @@
 in this Software without prior written authorization from the X Consortium.
 
 */
-/* $XFree86: xc/lib/Xaw/XawIm.c,v 1.1.1.4.2.1 1998/05/01 04:02:42 dawes Exp $ */
 
 #include <X11/IntrinsicP.h>
 #include <X11/StringDefs.h>
@@ -225,22 +224,6 @@
     return(ve->ic.input_style);
 }
 
-static XIMStyle GetInputStyleOfIM( p )
-    String	p;
-{
-    if (!p || !*p)
-	return((XIMStyle)0);
-    if (!strcmp(p, "OverTheSpot")) {
-	return((XIMPreeditPosition | XIMStatusArea));
-    } else if (!strcmp(p, "OffTheSpot")) {
-	return((XIMPreeditArea | XIMStatusArea));
-    } else if (!strcmp(p, "Root")) {
-	return((XIMPreeditNothing | XIMStatusNothing));
-    } else {
-	return((XIMStyle)0);
-    }
-}
-
 static void ConfigureCB( w, closure, event )
     Widget	w;
     XtPointer	closure;
@@ -378,14 +361,6 @@
 	if (contextErrData) XtFree((char *)contextErrData);
     }
     XDeleteContext(XtDisplay(vw), (Window)vw, extContext);
-    if (ve->im.im_list) {
-        XtFree((char *)ve->im.im_list[0]);
-        XtFree((char *)ve->im.im_list);
-    }
-    if (ve->ic.ic_list) {
-        XtFree((char *)ve->ic.ic_list[0]);
-        XtFree((char *)ve->ic.ic_list);
-    }
     if (ve->ic.shared_ic_table)
         XtFree((char *)ve->ic.shared_ic_table);
     if (ve->im.resources) XtFree((char *)ve->im.resources);
@@ -414,25 +389,51 @@
 static void OpenIM(ve)
     XawVendorShellExtPart * ve;
 {
-    char	*p, modifiers[32];
+    int		i;
+    char	*p, *s, *ns, *end, *pbuf, buf[32];
     XIM		xim = NULL;
     XIMStyles	*xim_styles;
-    XIMStyle	input_style;
-    int		i, j;
+    XIMStyle	input_style = 0;
+    Boolean	found;
 
     if (ve->im.open_im == False) return;
     ve->im.xim = NULL;
-    if (ve->im.im_list_num <= 0) {
+    if (ve->im.input_method == NULL) {
 	if ((p = XSetLocaleModifiers("@im=none")) != NULL && *p)
 	    xim = XOpenIM(XtDisplay(ve->parent), NULL, NULL, NULL);
     } else {
-	for (i = 0; i < ve->im.im_list_num; i++) {
-	    strcpy(modifiers, "@im=");
-	    strncat(modifiers, ve->im.im_list[i], sizeof(modifiers) - 5/*strlen("@im=")*/);
-	    if ((p = XSetLocaleModifiers(modifiers)) != NULL && *p &&
-		(xim = XOpenIM(XtDisplay(ve->parent), NULL, NULL, NULL)) != NULL)
+	/* no fragment can be longer than the whole string */
+	int	len = strlen (ve->im.input_method) + 5;
+
+	if (len < sizeof buf) pbuf = buf;
+	else pbuf = XtMalloc (len);
+
+	if (pbuf == NULL) return;
+
+	for(ns=s=ve->im.input_method; ns && *s;) {
+	    /* skip any leading blanks */
+	    while (*s && isspace(*s)) s++;
+	    if (!*s) break;
+	    if ((ns = end = strchr(s, ',')) == NULL)
+		end = s + strlen(s);
+	    /* If there is a spurious comma end can be the same as s */
+	    if (end > s) {
+		/* strip any trailing blanks */
+		while (isspace(*(end - 1))) end--;
+
+		strcpy (pbuf, "@im=");
+		strncat (pbuf, s, end - s);
+		pbuf[end - s + 4] = '\0';
+	    }
+
+	    if ((p = XSetLocaleModifiers(pbuf)) != NULL && *p
+		&& (xim = XOpenIM(XtDisplay(ve->parent), NULL, NULL, NULL)) != NULL)
 		break;
+
+	    s = ns + 1;
 	}
+
+	if (pbuf != buf) XtFree (pbuf);
     }
     if (xim == NULL) {
 	if ((p = XSetLocaleModifiers("")) != NULL) {
@@ -451,24 +452,42 @@
 	XCloseIM(xim);
 	return;
     }
-    for (j = 0; j < ve->ic.ic_list_num; j++) {
-	input_style = GetInputStyleOfIM(ve->ic.ic_list[j]);
-	if (input_style == (XIMStyle)0) continue;
-	for (i = 0; (unsigned short)i < xim_styles->count_styles; i++) {
+    found = False;
+    for(ns = s = ve->im.preedit_type; s && !found;) {
+	while (*s && isspace(*s)) s++;
+	if (!*s) break;
+	if ((ns = end = strchr(s, ',')) == NULL)
+	    end = s + strlen(s);
+	else
+	    ns++;
+	if (end > s)
+	    while (isspace(*(end - 1))) end--;
+
+	if (!strncmp(s, "OverTheSpot", end - s)) {
+	    input_style = (XIMPreeditPosition | XIMStatusArea);
+	} else if (!strncmp(s, "OffTheSpot", end - s)) {
+	    input_style = (XIMPreeditArea | XIMStatusArea);
+	} else if (!strncmp(s, "Root", end - s)) {
+	    input_style = (XIMPreeditNothing | XIMStatusNothing);
+	}
+	for (i = 0; (unsigned short)i < xim_styles->count_styles; i++)
 	    if (input_style == xim_styles->supported_styles[i]) {
 		ve->ic.input_style = input_style;
 		SetErrCnxt(ve->parent, xim);
-/*		_XipSetIOErrorHandler(IOErrorHandler); */
 		ve->im.xim = xim;
-		XFree(xim_styles);
-		return;
+		found = True;
+		break;
 	    }
-	}
+
+	s = ns;
     }
-    XCloseIM(xim);
-    XtAppWarning(XtWidgetToApplicationContext(ve->parent),
-	"input method doesn't support my input style");
     XFree(xim_styles);
+
+    if (!found) {
+	XCloseIM(xim);
+	XtAppWarning(XtWidgetToApplicationContext(ve->parent),
+		     "input method doesn't support my input style");
+    }
 }
 
 static Boolean ResizeVendorShell_Core(vw, ve, p)
@@ -1314,48 +1333,6 @@
 #undef xrmres
 }
 
-
-static char** ParseIMNameList(p, num)
-    char* p;
-    int* num;
-{
-    char	*s, *save_s, *ss, *list[32], **lp, *end;
-    int		i = 0;
-
-    *num = 0;
-    if (!p || !*p) return ((char **)NULL);
-    while (*p && isspace(*p)) p++;
-    if (!*p) return ((char **)NULL);
-    if ((s = XtMalloc(strlen(p) + 1)) == NULL) return((char **)NULL);
-    strcpy(s, p);
-    save_s = s;
-
-    while(i < (sizeof(list) / sizeof(list[0]))) {
-	list[i] = s;
-	ss = index(s, ',');
-	if (!ss) {
-	    end = s + strlen(s);
-	} else {
-	    end = ss;
-	}
-	while (isspace(*end)) end--;
-	*end = '\0';
-	i++;
-	if (!ss) break;
-	s = ss + 1;
-	while (*s && isspace(*s)) p++;
-	if (!*s) break;
-    }
-    if ((lp = (char **)XtMalloc(sizeof(char *) * (i + 1))) == NULL) {
-	XtFree(save_s);
-	return((char **)NULL);
-    }
-    memcpy((char *)lp, (char *)list, sizeof(char *) * i);
-    *(lp + i) = NULL;
-    *num = i;
-    return(lp);
-}
-
 static Boolean Initialize( vw, ve )
     VendorShellWidget vw;
     XawVendorShellExtPart* ve;
@@ -1376,10 +1353,6 @@
 	return(FALSE);
     ve->ic.current_ic_table = NULL;
     ve->ic.ic_table = NULL;
-    ve->im.im_list = ParseIMNameList(ve->im.input_method, &i);
-    ve->im.im_list_num = i;
-    ve->ic.ic_list = ParseIMNameList(ve->im.preedit_type, &i);
-    ve->ic.ic_list_num = i;
     return(TRUE);
 }
 
--- XawImP.h.orig	Sat Jan 11 18:14:45 1997
+++ XawImP.h	Sat Jul 25 13:02:50 1998
@@ -85,8 +85,6 @@
     Dimension		area_height;
     String		input_method;
     String		preedit_type;
-    String		*im_list;
-    Cardinal		im_list_num;
 } XawImPart;
 
 typedef struct _XawIcTablePart
@@ -109,8 +107,6 @@
 
 typedef	struct _XawIcPart
 {
-    String		*ic_list;
-    Cardinal		ic_list_num;
     XIMStyle		input_style;
     Boolean		shared_ic;
     XawIcTableList	shared_ic_table;
