summaryrefslogtreecommitdiff
path: root/editors/ex/patches/patch-printf_c
diff options
context:
space:
mode:
Diffstat (limited to 'editors/ex/patches/patch-printf_c')
-rw-r--r--editors/ex/patches/patch-printf_c205
1 files changed, 205 insertions, 0 deletions
diff --git a/editors/ex/patches/patch-printf_c b/editors/ex/patches/patch-printf_c
new file mode 100644
index 00000000000..bbddb4b5035
--- /dev/null
+++ b/editors/ex/patches/patch-printf_c
@@ -0,0 +1,205 @@
+$NetBSD: patch-printf_c,v 1.1 2012/12/28 03:03:09 dholland Exp $
+
+- use standard headers
+ (this is supposed to substitute for libc's printf, so it *must*
+ match stdio.h)
+- use own headers
+- declare local functions static
+- avoid implicit int
+- return values from non-void functions
+- use const for string constants
+- remove/replace code that intentionally uses signed overflow
+
+--- printf.c.orig 2012-12-27 21:57:52.000000000 +0000
++++ printf.c
+@@ -82,6 +82,8 @@ static char sccsid[] = "@(#)printf.c 1.1
+ /* The pwb version this is based on */
+ /* from printf.c:2.2 6/5/79 */
+
++#include <stdio.h>
++
+ #ifndef __STDC__
+ #include "varargs.h"
+ #else
+@@ -95,6 +97,8 @@ extern nl_catd catd;
+ #define catgets(a, b, c, d) (d)
+ #endif
+
++#include "ex.h"
++#include "ex_proto.h"
+ #include "config.h"
+
+ /*
+@@ -115,15 +119,13 @@ extern nl_catd catd;
+
+ static int width, sign, fill;
+
+-extern int putchar __P((int));
+-
+-char *p_dconv __P((long, char *));
+-int p_emit __P((char *, char *));
++static void p_emit __P((const char *, const char *));
+
+ #ifdef __STDC__
+ int vprintf(const char *fmt, va_list ap);
+ #endif
+
++int
+ #ifndef __STDC__
+ printf(va_alist)
+ va_dcl
+@@ -155,14 +157,17 @@ printf(const char *fmt, ...)
+ return ret;
+ }
+
++int
+ vprintf(const char *fmt, va_list ap)
+ {
+ char fcode;
+ int prec;
+ int length,mask1,nbits,n;
+ long int mask2, num;
+- register char *bptr;
+- char *ptr;
++ unsigned long unum;
++ register const char *bptr;
++ register char *vbptr;
++ const char *ptr;
+ char buf[134];
+ #endif /* __STDC__ */
+
+@@ -171,7 +176,7 @@ vprintf(const char *fmt, va_list ap)
+ while ((fcode = *fmt++)!='%') {
+ /* ordinary (non-%) character */
+ if (fcode=='\0')
+- return;
++ return 0;
+ putchar(fcode);
+ }
+ /* length modifier: -1 for h, 1 for l, 0 for none */
+@@ -288,18 +293,18 @@ vprintf(const char *fmt, va_list ap)
+ nbits = 4;
+ }
+ n = (num!=0);
+- bptr = buf + MAXOCT + 3;
++ vbptr = buf + MAXOCT + 3;
+ /* shift and mask for speed */
+ do
+ if (((int) num & mask1) < 10)
+- *--bptr = ((int) num & mask1) + 060;
++ *--vbptr = ((int) num & mask1) + 060;
+ else
+- *--bptr = ((int) num & mask1) + 0127;
+- while (num = (num >> nbits) & mask2);
++ *--vbptr = ((int) num & mask1) + 0127;
++ while ((num = (num >> nbits) & mask2) != 0);
+
+ if (fcode=='o') {
+ if (n)
+- *--bptr = '0';
++ *--vbptr = '0';
+ }
+ else
+ if (!sign && fill <= 0) {
+@@ -308,9 +313,10 @@ vprintf(const char *fmt, va_list ap)
+ width -= 2;
+ }
+ else {
+- *--bptr = fcode;
+- *--bptr = '0';
++ *--vbptr = fcode;
++ *--vbptr = '0';
+ }
++ bptr = vbptr;
+ ptr = buf + MAXOCT + 3;
+ break;
+ case 'D':
+@@ -331,14 +337,20 @@ vprintf(const char *fmt, va_list ap)
+ else
+ num = (long) n;
+ }
+- if (n = (fcode != 'u' && num < 0))
+- num = -num;
++ if ((n = (fcode != 'u' && num < 0)) != 0) {
++ /* avoid overflow on -LONG_MAX */
++ unum = ((unsigned long)-(num + 1)) + 1;
++ }
++ else {
++ unum = (unsigned long) num;
++ }
+ /* now convert to digits */
+- bptr = p_dconv(num, buf);
++ vbptr = p_dconv(unum, buf);
+ if (n)
+- *--bptr = '-';
++ *--vbptr = '-';
+ if (fill == 0)
+ fill = -1;
++ bptr = vbptr;
+ ptr = buf + MAXDIGS + 1;
+ break;
+ default:
+@@ -369,13 +381,15 @@ vprintf(const char *fmt, va_list ap)
+ */
+ char *
+ p_dconv(value, buffer)
+- long value;
++ unsigned long value;
+ char *buffer;
+ {
+ register char *bp;
+- register int svalue;
++ register unsigned int svalue;
++#if 0
+ int n;
+ long lval;
++#endif
+
+ bp = buffer;
+
+@@ -386,6 +400,7 @@ p_dconv(value, buffer)
+ return(bp);
+ }
+
++#if 0 /* original code, undefined behavior */
+ /* develop the leading digit of the value in "n" */
+ n = 0;
+ while (value < 0) {
+@@ -399,6 +414,7 @@ p_dconv(value, buffer)
+
+ /* stash it in buffer[1] to allow for a sign */
+ bp[1] = n + '0';
++#endif
+ /*
+ * Now develop the rest of the digits. Since speed counts here,
+ * we do it in two loops. The first gets "value" down until it
+@@ -417,13 +433,15 @@ p_dconv(value, buffer)
+ *--bp = (svalue % 10) + '0';
+ svalue /= 10;
+ }
+-
++
++#if 0
+ /* fill in intermediate zeroes if needed */
+ if (buffer[1] != '0') {
+ while (bp > buffer + 2)
+ *--bp = '0';
+ --bp;
+ }
++#endif
+ return(bp);
+ }
+
+@@ -439,9 +457,10 @@ p_dconv(value, buffer)
+ * any padding in right-justification (to avoid printing "-3" as
+ * "000-3" where "-0003" was intended).
+ */
++static void
+ p_emit(s, send)
+- register char *s;
+- char *send;
++ register const char *s;
++ const char *send;
+ {
+ char cfill;
+ register int alen;