head 1.1; access; symbols pkgsrc-2026Q1:1.1.0.108 pkgsrc-2026Q1-base:1.1 pkgsrc-2025Q4:1.1.0.106 pkgsrc-2025Q4-base:1.1 pkgsrc-2025Q3:1.1.0.104 pkgsrc-2025Q3-base:1.1 pkgsrc-2025Q2:1.1.0.102 pkgsrc-2025Q2-base:1.1 pkgsrc-2025Q1:1.1.0.100 pkgsrc-2025Q1-base:1.1 pkgsrc-2024Q4:1.1.0.98 pkgsrc-2024Q4-base:1.1 pkgsrc-2024Q3:1.1.0.96 pkgsrc-2024Q3-base:1.1 pkgsrc-2024Q2:1.1.0.94 pkgsrc-2024Q2-base:1.1 pkgsrc-2024Q1:1.1.0.92 pkgsrc-2024Q1-base:1.1 pkgsrc-2023Q4:1.1.0.90 pkgsrc-2023Q4-base:1.1 pkgsrc-2023Q3:1.1.0.88 pkgsrc-2023Q3-base:1.1 pkgsrc-2023Q2:1.1.0.86 pkgsrc-2023Q2-base:1.1 pkgsrc-2023Q1:1.1.0.84 pkgsrc-2023Q1-base:1.1 pkgsrc-2022Q4:1.1.0.82 pkgsrc-2022Q4-base:1.1 pkgsrc-2022Q3:1.1.0.80 pkgsrc-2022Q3-base:1.1 pkgsrc-2022Q2:1.1.0.78 pkgsrc-2022Q2-base:1.1 pkgsrc-2022Q1:1.1.0.76 pkgsrc-2022Q1-base:1.1 pkgsrc-2021Q4:1.1.0.74 pkgsrc-2021Q4-base:1.1 pkgsrc-2021Q3:1.1.0.72 pkgsrc-2021Q3-base:1.1 pkgsrc-2021Q2:1.1.0.70 pkgsrc-2021Q2-base:1.1 pkgsrc-2021Q1:1.1.0.68 pkgsrc-2021Q1-base:1.1 pkgsrc-2020Q4:1.1.0.66 pkgsrc-2020Q4-base:1.1 pkgsrc-2020Q3:1.1.0.64 pkgsrc-2020Q3-base:1.1 pkgsrc-2020Q2:1.1.0.60 pkgsrc-2020Q2-base:1.1 pkgsrc-2020Q1:1.1.0.40 pkgsrc-2020Q1-base:1.1 pkgsrc-2019Q4:1.1.0.62 pkgsrc-2019Q4-base:1.1 pkgsrc-2019Q3:1.1.0.58 pkgsrc-2019Q3-base:1.1 pkgsrc-2019Q2:1.1.0.56 pkgsrc-2019Q2-base:1.1 pkgsrc-2019Q1:1.1.0.54 pkgsrc-2019Q1-base:1.1 pkgsrc-2018Q4:1.1.0.52 pkgsrc-2018Q4-base:1.1 pkgsrc-2018Q3:1.1.0.50 pkgsrc-2018Q3-base:1.1 pkgsrc-2018Q2:1.1.0.48 pkgsrc-2018Q2-base:1.1 pkgsrc-2018Q1:1.1.0.46 pkgsrc-2018Q1-base:1.1 pkgsrc-2017Q4:1.1.0.44 pkgsrc-2017Q4-base:1.1 pkgsrc-2017Q3:1.1.0.42 pkgsrc-2017Q3-base:1.1 pkgsrc-2017Q2:1.1.0.38 pkgsrc-2017Q2-base:1.1 pkgsrc-2017Q1:1.1.0.36 pkgsrc-2017Q1-base:1.1 pkgsrc-2016Q4:1.1.0.34 pkgsrc-2016Q4-base:1.1 pkgsrc-2016Q3:1.1.0.32 pkgsrc-2016Q3-base:1.1 pkgsrc-2016Q2:1.1.0.30 pkgsrc-2016Q2-base:1.1 pkgsrc-2016Q1:1.1.0.28 pkgsrc-2016Q1-base:1.1 pkgsrc-2015Q4:1.1.0.26 pkgsrc-2015Q4-base:1.1 pkgsrc-2015Q3:1.1.0.24 pkgsrc-2015Q3-base:1.1 pkgsrc-2015Q2:1.1.0.22 pkgsrc-2015Q2-base:1.1 pkgsrc-2015Q1:1.1.0.20 pkgsrc-2015Q1-base:1.1 pkgsrc-2014Q4:1.1.0.18 pkgsrc-2014Q4-base:1.1 pkgsrc-2014Q3:1.1.0.16 pkgsrc-2014Q3-base:1.1 pkgsrc-2014Q2:1.1.0.14 pkgsrc-2014Q2-base:1.1 pkgsrc-2014Q1:1.1.0.12 pkgsrc-2014Q1-base:1.1 pkgsrc-2013Q4:1.1.0.10 pkgsrc-2013Q4-base:1.1 pkgsrc-2013Q3:1.1.0.8 pkgsrc-2013Q3-base:1.1 pkgsrc-2013Q2:1.1.0.6 pkgsrc-2013Q2-base:1.1 pkgsrc-2013Q1:1.1.0.4 pkgsrc-2013Q1-base:1.1 pkgsrc-2012Q4:1.1.0.2 pkgsrc-2012Q4-base:1.1; locks; strict; comment @# @; 1.1 date 2012.12.28.03.03.09; author dholland; state Exp; branches; next ; desc @@ 1.1 log @Fix legacy C. Pass -Wall -W -Wmissing-declarations -Wwrite-strings on gcc45. - avoid implicit int, declare void functions void - return values from non-void functions - put most external declarations properly in header files - use some static and const - fix up a big mess with function pointer casting - use standard includes, don't provide own decls of standard functions - use types matching libc when providing own malloc, printf, and putchar - use functions correctly - silence assorted compiler warnings - fix some bugs exposed by compiler warnings - don't intentionally exercise signed overflow - remove some unused items - add patch comments to other patch (patch-aa) As this includes several fixes and removes some undefined behavior on a commonly reachable code path, bump PKGREVISION. @ text @$NetBSD$ - 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 + #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; @