Implement locale-independent strftime function.
* include/mailutils/util.h (mu_c_streamftime): New prototype. * libmailutils/base/date.c (mu_c_streamftime): New function. * libmailutils/tests/.gitignore: Update. * libmailutils/tests/strftime.at: New test script. * libmailutils/tests/strftime.c: New test program. * libmailutils/tests/Makefile.am (noinst_PROGRAMS): Add strftime. (TESTSUITE_AT): Add strftime.at. * libmailutils/tests/testsuite.at: Include strftime.at.
Showing
7 changed files
with
122 additions
and
0 deletions
... | @@ -70,6 +70,9 @@ time_t mu_utc_offset (void); | ... | @@ -70,6 +70,9 @@ time_t mu_utc_offset (void); |
70 | time_t mu_tm2time (struct tm *timeptr, mu_timezone *tz); | 70 | time_t mu_tm2time (struct tm *timeptr, mu_timezone *tz); |
71 | size_t mu_strftime (char *s, size_t max, const char *format, | 71 | size_t mu_strftime (char *s, size_t max, const char *format, |
72 | const struct tm *tm); | 72 | const struct tm *tm); |
73 | |||
74 | int mu_c_streamftime (mu_stream_t str, const char *fmt, struct tm *tm, | ||
75 | struct mu_timezone *tz); | ||
73 | 76 | ||
74 | /* ----------------------- */ | 77 | /* ----------------------- */ |
75 | /* File & path names. */ | 78 | /* File & path names. */ | ... | ... |
This diff is collapsed.
Click to expand it.
... | @@ -51,6 +51,7 @@ noinst_PROGRAMS = \ | ... | @@ -51,6 +51,7 @@ noinst_PROGRAMS = \ |
51 | listop\ | 51 | listop\ |
52 | mailcap\ | 52 | mailcap\ |
53 | prop\ | 53 | prop\ |
54 | strftime\ | ||
54 | tempfile\ | 55 | tempfile\ |
55 | url-comp\ | 56 | url-comp\ |
56 | url-parse\ | 57 | url-parse\ |
... | @@ -81,6 +82,7 @@ TESTSUITE_AT = \ | ... | @@ -81,6 +82,7 @@ TESTSUITE_AT = \ |
81 | list.at\ | 82 | list.at\ |
82 | mailcap.at\ | 83 | mailcap.at\ |
83 | prop.at\ | 84 | prop.at\ |
85 | strftime.at\ | ||
84 | testsuite.at\ | 86 | testsuite.at\ |
85 | url.at\ | 87 | url.at\ |
86 | url-comp.at\ | 88 | url-comp.at\ | ... | ... |
libmailutils/tests/strftime.at
0 → 100644
This diff is collapsed.
Click to expand it.
libmailutils/tests/strftime.c
0 → 100644
1 | /* GNU Mailutils -- a suite of utilities for electronic mail | ||
2 | Copyright (C) 1999, 2000, 2001, 2007, 2009, 2010, 2011 Free Software | ||
3 | Foundation, Inc. | ||
4 | |||
5 | GNU Mailutils is free software; you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 3, or (at your option) | ||
8 | any later version. | ||
9 | |||
10 | GNU Mailutils is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with GNU Mailutils. If not, see <http://www.gnu.org/licenses/>. */ | ||
17 | |||
18 | #ifdef HAVE_CONFIG_H | ||
19 | # include <config.h> | ||
20 | #endif | ||
21 | #include <stdlib.h> | ||
22 | #include <stdio.h> | ||
23 | #include <string.h> | ||
24 | #include <mailutils/error.h> | ||
25 | #include <mailutils/errno.h> | ||
26 | #include <mailutils/util.h> | ||
27 | #include <mailutils/stream.h> | ||
28 | #include <mailutils/cctype.h> | ||
29 | #include <mailutils/cstr.h> | ||
30 | #include <mailutils/stdstream.h> | ||
31 | |||
32 | void | ||
33 | usage () | ||
34 | { | ||
35 | mu_stream_printf (mu_strout, "usage: %s [-format=FMT] [-tz=TZ]\n", | ||
36 | mu_program_name); | ||
37 | exit (0); | ||
38 | } | ||
39 | |||
40 | int | ||
41 | main (int argc, char **argv) | ||
42 | { | ||
43 | int rc, i; | ||
44 | char *format = "%c"; | ||
45 | char *buf = NULL; | ||
46 | size_t size = 0; | ||
47 | size_t n; | ||
48 | struct mu_timezone tz, *tzp = NULL; | ||
49 | |||
50 | mu_set_program_name (argv[0]); | ||
51 | mu_stdstream_setup (MU_STDSTREAM_RESET_NONE); | ||
52 | |||
53 | memset (&tz, 0, sizeof tz); | ||
54 | for (i = 1; i < argc; i++) | ||
55 | { | ||
56 | char *opt = argv[i]; | ||
57 | |||
58 | if (strncmp (opt, "-format=", 8) == 0) | ||
59 | format = opt + 8; | ||
60 | else if (strncmp (opt, "-tz=", 4) == 0) | ||
61 | { | ||
62 | int sign; | ||
63 | int n = atoi (opt + 4); | ||
64 | if (n < 0) | ||
65 | { | ||
66 | sign = -1; | ||
67 | n = - n; | ||
68 | } | ||
69 | else | ||
70 | sign = 1; | ||
71 | tz.utc_offset = sign * ((n / 100 * 60) + n % 100) * 60; | ||
72 | tzp = &tz; | ||
73 | } | ||
74 | else if (strcmp (opt, "-h") == 0) | ||
75 | usage (); | ||
76 | else | ||
77 | { | ||
78 | mu_error ("%s: unrecognized argument", opt); | ||
79 | exit (1); | ||
80 | } | ||
81 | } | ||
82 | |||
83 | while ((rc = mu_stream_getline (mu_strin, &buf, &size, &n)) == 0 && n > 0) | ||
84 | { | ||
85 | char *p; | ||
86 | struct tm *tm; | ||
87 | time_t t; | ||
88 | |||
89 | mu_rtrim_class (buf, MU_CTYPE_ENDLN); | ||
90 | |||
91 | if (*buf == ';') | ||
92 | { | ||
93 | mu_printf ("%s\n", buf); | ||
94 | continue; | ||
95 | } | ||
96 | t = strtoul (buf, &p, 10); | ||
97 | if (*p) | ||
98 | { | ||
99 | mu_error ("bad input line near %s", p); | ||
100 | continue; | ||
101 | } | ||
102 | |||
103 | tm = gmtime (&t); | ||
104 | mu_c_streamftime (mu_strout, format, tm, tzp); | ||
105 | mu_printf ("\n"); | ||
106 | } | ||
107 | |||
108 | if (rc) | ||
109 | { | ||
110 | mu_error ("%s", mu_strerror (rc)); | ||
111 | return 1; | ||
112 | } | ||
113 | return 0; | ||
114 | } |
... | @@ -83,4 +83,6 @@ m4_include([debugspec.at]) | ... | @@ -83,4 +83,6 @@ m4_include([debugspec.at]) |
83 | AT_BANNER([IMAP IO]) | 83 | AT_BANNER([IMAP IO]) |
84 | m4_include([imapio.at]) | 84 | m4_include([imapio.at]) |
85 | 85 | ||
86 | m4_include([strftime.at]) | ||
87 | |||
86 | m4_include([fsaf.at]) | 88 | m4_include([fsaf.at]) |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or sign in to post a comment