diff --git a/src/modules/sprintf/sprintf.c b/src/modules/sprintf/sprintf.c
index 12e4b63349105cef8133417e07e468e47772f127..4ca6a0102e44bf0595d5a8ee00c6bc538fbca4b9 100644
--- a/src/modules/sprintf/sprintf.c
+++ b/src/modules/sprintf/sprintf.c
@@ -99,7 +99,7 @@
 */
 
 #include "global.h"
-RCSID("$Id: sprintf.c,v 1.38 1999/06/17 20:31:52 noring Exp $");
+RCSID("$Id: sprintf.c,v 1.39 1999/06/30 18:34:54 hubbe Exp $");
 #include "error.h"
 #include "array.h"
 #include "svalue.h"
@@ -964,17 +964,28 @@ static void low_pike_sprintf(struct string_builder *r,
         INT32 l,tmp;
 	char *x;
         DO_OP();
-        l=1;
-        if(fsp->width > 0) l=fsp->width;
-	x=(char *)alloca(l);
-	fsp->b=MKPCHARP(x,0);
-	fsp->len=l;
-	GET_INT(tmp);
-        while(--l>=0)
-        {
-          x[l]=tmp & 0xff;
-          tmp>>=8;
-        }
+	if(fsp->width == SPRINTF_UNDECIDED)
+	{
+	  GET_INT(tmp);
+	  x=(char *)alloca(4);
+	  if(tmp<256) fsp->b=MKPCHARP(x,0);
+	  else if(tmp<65536) fsp->b=MKPCHARP(x,1);
+	  else  fsp->b=MKPCHARP(x,2);
+	  SET_INDEX_PCHARP(fsp->b,0,tmp);
+	  fsp->len=1;
+	}else{
+	  l=1;
+	  if(fsp->width > 0) l=fsp->width;
+	  x=(char *)alloca(l);
+	  fsp->b=MKPCHARP(x,0);
+	  fsp->len=l;
+	  GET_INT(tmp);
+	  while(--l>=0)
+	  {
+	    x[l]=tmp & 0xff;
+	    tmp>>=8;
+	  }
+	}
 	break;
       }