--- libsafe-2.0-16-orig/src/intercept.c	2003-03-15 16:02:12.000000000 +0100
+++ libsafe-2.0-16/src/intercept.c	2003-03-15 16:12:22.000000000 +0100
@@ -165,7 +165,8 @@
  */
 char *strcpy(char *dest, const char *src)
 {
-    size_t max_size, len;
+    uint max_size;
+    size_t len;
 
     if (!real_memcpy)
 	real_memcpy = (memcpy_t) getLibraryFunction("memcpy");
@@ -196,7 +197,8 @@
 
 char *strncpy(char *dest, const char *src, size_t n)
 {
-    size_t max_size, len;
+    uint max_size;
+    size_t len;
 
     if (!real_strncpy)
 	real_strncpy = (strncpy_t) getLibraryFunction("strncpy");
@@ -219,7 +221,8 @@
 
 char *stpcpy(char *dest, const char *src)
 {
-    size_t max_size, len;
+    uint max_size;
+    size_t len;
 
     if (!real_memcpy)
 	real_memcpy = (memcpy_t) getLibraryFunction("memcpy");
@@ -251,7 +254,8 @@
 #ifndef MISSING_WCSNLEN
 wchar_t *wcscpy(wchar_t *dest, const wchar_t *src)
 {
-    size_t max_bytes, max_wchars, len;
+    size_t max_wchars, len;
+    uint max_bytes;
 
     if (!real_wcscpy)
 	real_wcscpy = (wcscpy_t) getLibraryFunction("wcscpy");
@@ -291,7 +295,8 @@
 
 wchar_t *wcpcpy(wchar_t *dest, const wchar_t *src)
 {
-    size_t max_bytes, max_wchars, len;
+    size_t max_wchars, len;
+    uint max_bytes;
 
     if (!real_wcpcpy)
 	real_wcpcpy = (wcpcpy_t) getLibraryFunction("wcpcpy");
@@ -333,9 +338,15 @@
 /*
  * This is needed!  See the strcpy() for the reason. -ab.
  */
-void *memcpy(void *dest, const void *src, size_t n)
+void *memcpy(void *dest, const void *src, size_t hack)
 {
-    size_t max_size;
+    /*
+     * a size_t IS an unsigned long everywhere, though it sometimes
+     * doesn't state so, making printf misinterpret it.
+     */
+    unsigned long n = hack;
+    uint max_size;
+
 
     if (!real_memcpy)
 	real_memcpy = (memcpy_t) getLibraryFunction("memcpy");
@@ -344,11 +355,11 @@
 	return real_memcpy(dest, src, n);
 
     if ((max_size = _libsafe_stackVariableP(dest)) == 0) {
-	LOG(5, "memcpy(<heap var> , <src>, %d)\n", n);
+	LOG(5, "memcpy(<heap var> , <src>, %ld)\n", n);
 	return real_memcpy(dest, src, n);
     }
 
-    LOG(4, "memcpy(<stack var> , <src>, %d) stack limit=%d)\n", n, max_size);
+    LOG(4, "memcpy(<stack var> , <src>, %ld) stack limit=%d)\n", n, max_size);
     if (n > max_size)
 	_libsafe_die("Overflow caused by memcpy()");
     return real_memcpy(dest, src, n);
@@ -357,7 +368,7 @@
 
 char *strcat(char *dest, const char *src)
 {
-    size_t max_size;
+    uint max_size;
     uint dest_len, src_len;
 
     if (!real_memcpy)
@@ -388,7 +399,7 @@
 
 char *strncat(char *dest, const char *src, size_t n)
 {
-    size_t max_size;
+    uint max_size;
     uint dest_len, src_len;
 
     if (!real_strncat)
@@ -1008,12 +1019,31 @@
 	    if (is_printf_convspec[(int)*p]) {
 		caddr_t addr;
 		c++;
+#if 0 
+		/*
+		 * cannot add va_list (ap here) with a number on alpha.
+		 * this is faster than the other method, and might be
+		 * a good idea to enable this on !alpha arch.
+		 */
 		if (pnum) {
 		    addr = *((caddr_t*)(ap + (atoi(pnum)-1)*sizeof(char*)));
 		}
 		else {
 		    addr = *((caddr_t*)(ap + c*sizeof(char*)));
 		}
+#else
+		{
+		    va_list apc;
+	    	    uint nb = c + 1;
+
+    		    va_copy(apc, ap);
+		    if (pnum)
+			nb = atoi(pnum);
+		    addr = NULL;
+		    while (nb--)
+			addr = va_arg(apc, caddr_t);
+ 		}
+#endif
 		if (*p == 'n') {
 		    if (_libsafe_raVariableP((void *)(addr))) {
 			_libsafe_die("printf(\"%%n\")");
@@ -1172,12 +1202,32 @@
 	    if (is_printf_convspec[(int)*p]) {
 		caddr_t addr;
 		c++;
+#if 0
+		/*
+		 * cannot add va_list (ap here) with a number on alpha.
+		 * this is faster than the other method, and might be
+		 * a good idea to enable this on !alpha arch.
+		 */
+
 		if (pnum) {
 		    addr = *((caddr_t*)(ap + (atoi(pnum)-1)*sizeof(char*)));
 		}
 		else {
 		    addr = *((caddr_t*)(ap + c*sizeof(char*)));
 		}
+#else
+		{
+		    va_list apc;
+	    	    uint nb = c + 1;
+
+    		    va_copy(apc, ap);
+		    if (pnum)
+			nb = atoi(pnum);
+		    addr = NULL;
+		    while (nb--)
+		      addr = va_arg(apc, caddr_t);
+ 		}
+#endif
 		if (*p == 'n') {
 		    if (_libsafe_raVariableP((void *)(addr))) {
 			_libsafe_die("printf(\"%%n\")");
@@ -1194,7 +1244,7 @@
 
 int sprintf(char *str, const char *format, ...)
 {
-    size_t max_size;
+    uint max_size;
     va_list ap;
     int res;
 
@@ -1242,7 +1292,7 @@
 
 int snprintf(char *str, size_t size, const char *format, ...)
 {
-    size_t max_size;
+    uint max_size;
     va_list ap;
     int res;
 
@@ -1288,7 +1338,7 @@
 
 int vsprintf(char *str, const char *format, va_list ap)
 {
-    size_t max_size;
+    uint max_size;
     int res;
 
     if (!real_vsprintf)
@@ -1325,7 +1375,7 @@
 
 int vsnprintf(char *str, size_t size, const char *format, va_list ap)
 {
-    size_t max_size;
+    uint max_size;
     int res;
 
     if (!real_vsnprintf)
@@ -1360,7 +1410,7 @@
 
 char *getwd(char *buf)
 {
-    size_t max_size;
+    uint max_size;
     char *res;
 
     if (!real_getwd)
@@ -1384,7 +1434,8 @@
 
 char *gets(char *s)
 {
-    size_t max_size, len;
+    uint max_size;
+    size_t len;
 
     if (!real_gets)
 	real_gets = (gets_t) getLibraryFunction("gets");
@@ -1409,7 +1460,8 @@
 
 char *realpath(char *path, char resolved_path[])
 {
-    size_t max_size, len;
+    uint max_size;
+    size_t len;
     char *res;
     char buf[MAXPATHLEN + 1];
 
