diff --git a/.gitattributes b/.gitattributes
index ad31564ef9c0e15ada179c068e6e2441e3e9dad5..aca7d1921547166d18a8a0738ec32a4a70bd55c7 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -274,7 +274,6 @@ testfont binary
 /src/compilation.h foreign_ident
 /src/constants.c foreign_ident
 /src/constants.h foreign_ident
-/src/cpp.c foreign_ident
 /src/cpp.h foreign_ident
 /src/crypt.c foreign_ident
 /src/cyclic.c foreign_ident
diff --git a/src/cpp.c b/src/cpp.c
index 1606004a1377a94be2dd569fcff5fc51e821ff47..776d34e19d746c28454527c52e65e6f853328202 100644
--- a/src/cpp.c
+++ b/src/cpp.c
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: cpp.c,v 1.179 2010/09/18 11:56:50 marcus Exp $
+|| $Id$
 */
 
 #include "global.h"
@@ -241,18 +241,19 @@ static void cpp_handle_exception(struct cpp *this,
 
 static void cpp_warning(struct cpp *this, const char *cpp_warn_fmt, ...)
 {
-  char msg[8192];
+  struct string_builder sb;
   va_list args;
 
+  init_string_builder (&sb, 0);
   va_start(args, cpp_warn_fmt);
-  Pike_vsnprintf(msg, sizeof(msg), cpp_warn_fmt, args);
+  string_builder_vsprintf (&sb, cpp_warn_fmt, args);
   va_end(args);
 
   if((this->handler && this->handler->prog) || get_master())
   {
     ref_push_string(this->current_file);
     push_int(this->current_line);
-    push_text(msg);
+    push_string (finish_string_builder (&sb));
     low_safe_apply_handler("compile_warning", this->handler,
 			   this->compat_handler, 3);
     pop_stack();
@@ -260,8 +261,9 @@ static void cpp_warning(struct cpp *this, const char *cpp_warn_fmt, ...)
     (void)fprintf(stderr, "%s:%ld: %s\n",
 		  this->current_file->str,
 		  (long)this->current_line,
-		  msg);
+		  sb.s->str);
     fflush(stderr);
+    free_string_builder (&sb);
   }
 }
 
diff --git a/src/error.c b/src/error.c
index 46b26667f301e31e93e279c8fa25cb9de7719ca4..9925f1a0cddc9aacf8845ee5d34119dc2b19961f 100644
--- a/src/error.c
+++ b/src/error.c
@@ -251,117 +251,6 @@ PMOD_EXPORT DECLSPEC(noreturn) void low_error(const char *buf) ATTRIBUTE((noretu
   pike_throw();  /* Hope someone is catching, or we will be out of balls. */
 }
 
-PMOD_EXPORT void Pike_vsnprintf(char *str, size_t size,
-				const char *fmt, va_list args)
-{
-  size--;
-
-  do {
-    if(fmt[0]=='%') {
-
-      fmt++;
-
-      switch( fmt++[0] ) {
-
-      case 'O':
-	{
-	  dynamic_buffer buf;
-	  dynbuf_string s;
-	  char *ostr;
-	  struct svalue t = va_arg(args, struct svalue);
-	  init_buf(&buf);
-	  describe_svalue(&t,0,0);
-	  s=complex_free_buf(&buf);
-	  ostr=s.str;
-
-	  while( --size>0 && (s.len--)>0 )
-	    str++[0]=s.str++[0];
-
-	  free(ostr);
-	}
-	break;
-
-      case 'S':
-	{
-	  dynamic_buffer buf;
-	  dynbuf_string s;
-	  char *ostr;
-	  struct svalue t;
-
-	  t.type = PIKE_T_STRING;
-	  t.u.string = va_arg(args, struct pike_string *);
-
-	  init_buf(&buf);
-	  describe_svalue(&t,0,0);
-	  s=complex_free_buf(&buf);
-	  ostr=s.str;
-
-	  while( --size>0 && (s.len--)>0 )
-	    str++[0]=s.str++[0];
-
-	  free(ostr);
-	}
-	break;
-
-      case 's':
-	{
-	  char *from = va_arg(args, char *);
-	  while( --size>0 && from[0]!=0 )
-	    str++[0]=from++[0];
-	}
-	break;
-
-      case 'c':
-	{
-	  int c = (char)va_arg(args, int);
-	  sprintf(str, "%c", c);
-	  str++;
-	  size--;
-	}
-	break;
-
-      case 'd':
-	{
-	  char buf[12];
-	  int pos=0;
-	  sprintf(buf, "%d", va_arg(args, int));
-	  while( --size>0 && buf[pos]!=0 )
-	    str++[0]=buf[pos++];
-	}
-	break;
-
-      case 'x':
-	{
-	  char buf[12];
-	  int pos=0;
-	  sprintf(buf, "%x", va_arg(args, int));
-	  while( --size>0 && buf[pos]!=0 )
-	    str++[0]=buf[pos++];
-	}
-	break;
-
-      case '%':
-	str++[0]='%';
-	size--;
-	break;
-
-      default:
-	Pike_fatal("Unknown Pike_vsnprintf formatting char '%c'.\n",
-		   (fmt-1)[0]);
-      }
-    }
-    else {
-      str++[0]=fmt++[0];
-      size--;
-    }
-
-  } while(fmt[0] && size>0);
-
-  str[0]=0;
-  va_end(args);
-}
-
-
 PMOD_EXPORT void va_make_error (const char *fmt, va_list args)
 {
   struct string_builder s;
diff --git a/src/pike_error.h b/src/pike_error.h
index adf606d202b0e6c8e04734fa091a5a0e858d14f0..5461c6065ff27ceb2568828880e409333a72d120 100644
--- a/src/pike_error.h
+++ b/src/pike_error.h
@@ -254,7 +254,6 @@ PMOD_EXPORT JMP_BUF *init_recovery(JMP_BUF *r, size_t stack_pop_levels DEBUG_INI
 PMOD_EXPORT DECLSPEC(noreturn) void pike_throw(void) ATTRIBUTE((noreturn));
 PMOD_EXPORT void push_error(const char *description);
 PMOD_EXPORT DECLSPEC(noreturn) void low_error(const char *buf) ATTRIBUTE((noreturn));
-PMOD_EXPORT void Pike_vsnprintf(char *str, size_t size, const char *fmt, va_list ap);
 PMOD_EXPORT void va_make_error (const char *fmt, va_list args);
 PMOD_EXPORT void DECLSPEC(noreturn) va_error(const char *fmt, va_list args) ATTRIBUTE((noreturn));
 PMOD_EXPORT void make_error (const char *fmt, ...);