musl - musl - an implementation of the standard library for Linux-based systems

index : musl
musl - an implementation of the standard library for Linux-based systems
summary refs log tree commit diff
path: root/src/time/strftime.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2013年08月22日 22:36:19 -0400
committerRich Felker <dalias@aerifal.cx>2013年08月22日 22:36:19 -0400
commitfc48ceee773e851d8be675f25be4f476646aa99e (patch)
tree477baeae7456a65fefdf6f9bb0720f3562cbbb53 /src/time/strftime.c
parent33413cdd25c58f0e57061e0a3cb7a29d492ba785 (diff)
downloadmusl-fc48ceee773e851d8be675f25be4f476646aa99e.tar.gz
add strftime and wcsftime field widths
at present, since POSIX requires %F to behave as %+4Y-%m-%d and ISO C requires %F to behave as %Y-%m-%d, the default behavior for %Y has been changed to match %+4Y. this seems to be the only way to conform to the requirements of both standards, and it does not affect years prior to the year 10000. depending on the outcome of interpretations from the standards bodies, this may be adjusted at some point.
Diffstat (limited to 'src/time/strftime.c')
-rw-r--r--src/time/strftime.c 35
1 files changed, 32 insertions, 3 deletions
diff --git a/src/time/strftime.c b/src/time/strftime.c
index 19ffdbca..6b8a33f5 100644
--- a/src/time/strftime.c
+++ b/src/time/strftime.c
@@ -157,7 +157,11 @@ const char *__strftime_fmt_1(char (*s)[100], size_t *l, int f, const struct tm *
val = tm->tm_year % 100;
goto number;
case 'Y':
- val = tm->tm_year + 1900LL;
+ val = tm->tm_year + 1900;
+ if (val >= 10000) {
+ *l = snprintf(*s, sizeof *s, "+%lld", val);
+ return *s;
+ }
width = 4;
goto number;
case 'z':
@@ -193,7 +197,10 @@ size_t __strftime_l(char *restrict s, size_t n, const char *restrict f, const st
{
size_t l, k;
char buf[100];
+ char *p;
const char *t;
+ int plus;
+ unsigned long width;
for (l=0; l+1<n; f++) {
if (!*f) {
s[l] = 0;
@@ -204,10 +211,32 @@ size_t __strftime_l(char *restrict s, size_t n, const char *restrict f, const st
continue;
}
f++;
+ if ((plus = (*f == '+'))) f++;
+ width = strtoul(f, &p, 10);
+ if (*p == 'C' || *p == 'F' || *p == 'G' || *p == 'Y') {
+ if (!width && p!=f) width = 1;
+ if (width >= n-l) return 0;
+ } else {
+ width = 0;
+ }
+ f = p;
if (*f == 'E' || *f == 'O') f++;
t = __strftime_fmt_1(&buf, &k, *f, tm, loc);
- if (!t || k >= n-l)
- return 0;
+ if (!t) return 0;
+ if (width) {
+ for (; *t=='+' || *t=='-' || (*t=='0'&&t[1]); t++, k--);
+ width--;
+ if (plus && tm->tm_year >= 10000-1900)
+ s[l++] = '+';
+ else if (tm->tm_year < -1900)
+ s[l++] = '-';
+ else
+ width++;
+ if (width >= n-l) return 0;
+ for (; width > k; width--)
+ s[l++] = '0';
+ }
+ if (k >= n-l) return 0;
memcpy(s+l, t, k);
l += k;
}
generated by cgit v1.2.1 (git 2.18.0) at 2025年09月15日 20:17:59 +0000

AltStyle によって変換されたページ (->オリジナル) /