diff --git a/src/conio/conio.c b/src/conio/conio.c
index 0ecb89f73af28662bdb949d93f3fcfe511c5f7a2..59ac46eaed1aec074a75b4c6222aad4505b2846d 100644
--- a/src/conio/conio.c
+++ b/src/conio/conio.c
@@ -461,19 +461,34 @@ void insline(void)
 int cprintf(char *fmat, ...)
 {
     va_list argptr;
-	char	str[4097];
 	int		pos;
 	int		ret;
+#ifdef _WIN32			/* Can't figure out a way to allocate a "big enough" buffer for Win32. */
+	char	str[16384];
+#else
+	char	*str;
+#endif
 
 	if(!initialized)
 		initciowrap(3);
     va_start(argptr,fmat);
-    ret=vsprintf(str,fmat,argptr);
+#ifdef WIN32
+	ret=vnsprintf(str,sizeof(str)-1,fmat,argptr);
+#else
+    ret=vsnprintf(NULL,0,fmat,argptr);
+	str=(char *)malloc(ret+1);
+	if(str==NULL)
+		return(EOF);
+	ret=vsprintf(str,fmat,argptr);
+#endif
     va_end(argptr);
 	if(ret>=0)
 		cputs(str);
 	else
 		ret=EOF;
+#ifndef WIN32
+	free(str);
+#endif
     return(ret);
 }