aboutsummaryrefslogtreecommitdiff
path: root/time/strftime.c
diff options
context:
space:
mode:
Diffstat (limited to 'time/strftime.c')
-rw-r--r--time/strftime.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/time/strftime.c b/time/strftime.c
index 898bd6c98c..4cb6c9e260 100644
--- a/time/strftime.c
+++ b/time/strftime.c
@@ -175,6 +175,7 @@ localtime_r (t, tp)
/* Some systems lack the `memset' function and we don't want to
introduce additional dependencies. */
static const char spaces[16] = " ";
+static const char zeroes[16] = "0000000000000000";
# define memset_space(P, Len) \
do { \
@@ -189,11 +190,26 @@ static const char spaces[16] = " ";
} \
while (_len > 0); \
} while (0)
+
+# define memset_zero(P, Len) \
+ do { \
+ int _len = (Len); \
+ \
+ do \
+ { \
+ int _this = _len > 16 ? 16 : _len; \
+ memcpy ((P), zeroes, _this); \
+ (P) += _this; \
+ _len -= _this; \
+ } \
+ while (_len > 0); \
+ } while (0)
#else
# define memset_space(P, Len) (memset ((P), ' ', (Len)), (P) += (Len))
+# define memset_zero(P, Len) (memset ((P), '0', (Len)), (P) += (Len))
#endif
-#define add(n, f) \
+#define add(n, f) \
do \
{ \
int _n = (n); \
@@ -204,7 +220,12 @@ static const char spaces[16] = " ";
if (p) \
{ \
if (_delta > 0) \
- memset_space (p, _delta); \
+ { \
+ if (pad == '0') \
+ memset_zero (p, _delta); \
+ else \
+ memset_space (p, _delta); \
+ } \
f; \
p += _n; \
} \