summaryrefslogtreecommitdiff
path: root/openbsd-compat/bsd-snprintf.c
diff options
context:
space:
mode:
authorDarren Tucker <dtucker@zip.com.au>2007-01-24 00:07:29 +1100
committerDarren Tucker <dtucker@zip.com.au>2007-01-24 00:07:29 +1100
commit07877ca68066593473fbe29dd309dcdc61b6d629 (patch)
treec56aa3788d8aa6592c21173a93ff52c55966820a /openbsd-compat/bsd-snprintf.c
parent9f7410528945a433f9f640c67677916623f3d7cf (diff)
- (dtucker) [openbsd-compat/bsd-snprintf.c] Static declarations for public
library interfaces aren't very helpful. Fix up the DOPR_OUTCH macro so it works properly and modify its callers so that they don't pre or post decrement arguments that are conditionally evaluated. While there, put SNPRINTF_CONST back as it prevents build failures in some configurations. ok djm@ (for most of it)
Diffstat (limited to 'openbsd-compat/bsd-snprintf.c')
-rw-r--r--openbsd-compat/bsd-snprintf.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/openbsd-compat/bsd-snprintf.c b/openbsd-compat/bsd-snprintf.c
index cefb1d1a..41d2be23 100644
--- a/openbsd-compat/bsd-snprintf.c
+++ b/openbsd-compat/bsd-snprintf.c
@@ -168,12 +168,13 @@
#define DOPR_OUTCH(buf, pos, buflen, thechar) \
do { \
- if (++pos >= INT_MAX) { \
+ if (pos + 1 >= INT_MAX) { \
errno = ERANGE; \
return -1; \
+ } \
if (pos < buflen) \
buf[pos] = thechar; \
- } \
+ (pos)++; \
} while (0)
static int dopr(char *buffer, size_t maxlen, const char *format,
@@ -494,7 +495,8 @@ fmtstr(char *buffer, size_t *currlen, size_t maxlen,
++cnt;
}
while (*value && (cnt < max)) {
- DOPR_OUTCH(buffer, *currlen, maxlen, *value++);
+ DOPR_OUTCH(buffer, *currlen, maxlen, *value);
+ *value++;
++cnt;
}
while ((padlen < 0) && (cnt < max)) {
@@ -582,8 +584,10 @@ fmtint(char *buffer, size_t *currlen, size_t maxlen,
}
/* Digits */
- while (place > 0)
- DOPR_OUTCH(buffer, *currlen, maxlen, convert[--place]);
+ while (place > 0) {
+ --place;
+ DOPR_OUTCH(buffer, *currlen, maxlen, convert[place]);
+ }
/* Left Justified spaces */
while (spadlen < 0) {
@@ -788,8 +792,10 @@ fmtfp (char *buffer, size_t *currlen, size_t maxlen,
if (signvalue)
DOPR_OUTCH(buffer, *currlen, maxlen, signvalue);
- while (iplace > 0)
- DOPR_OUTCH(buffer, *currlen, maxlen, iconvert[--iplace]);
+ while (iplace > 0) {
+ --iplace;
+ DOPR_OUTCH(buffer, *currlen, maxlen, iconvert[iplace]);
+ }
#ifdef DEBUG_SNPRINTF
printf("fmtfp: fplace=%d zpadlen=%d\n", fplace, zpadlen);
@@ -807,9 +813,10 @@ fmtfp (char *buffer, size_t *currlen, size_t maxlen,
--zpadlen;
}
- while (fplace > 0)
- DOPR_OUTCH(buffer, *currlen, maxlen,
- fconvert[--fplace]);
+ while (fplace > 0) {
+ --fplace;
+ DOPR_OUTCH(buffer, *currlen, maxlen, fconvert[fplace]);
+ }
}
while (padlen < 0) {
@@ -821,7 +828,7 @@ fmtfp (char *buffer, size_t *currlen, size_t maxlen,
#endif /* !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF) */
#if !defined(HAVE_VSNPRINTF)
-static int
+int
vsnprintf (char *str, size_t count, const char *fmt, va_list args)
{
return dopr(str, count, fmt, args);
@@ -829,8 +836,8 @@ vsnprintf (char *str, size_t count, const char *fmt, va_list args)
#endif
#if !defined(HAVE_SNPRINTF)
-static int
-snprintf(char *str, size_t count, const char *fmt, ...)
+int
+snprintf(char *str, size_t count, SNPRINTF_CONST char *fmt, ...)
{
size_t ret;
va_list ap;