Hi, folks,

It turns out that the GNU extension '-' in their strftime(3) implementation
is somewhat popular in several applications.  The patch in the last part of
this e-mail will add a simulate implementation for it.

My question is:
        (1) Am I doing things cleanly and correctly? I have attempted to
            keep the code style consistent with the old one and style(9)
            but maybe I have missed something else, or did not do it
            sufficently?
        (2) Is the way of implementing it clean enough?

Thanks for any comments!

Index: strftime.3
===================================================================
RCS file: /home/fcvs/src/lib/libc/stdtime/strftime.3,v
retrieving revision 1.34
diff -u -r1.34 strftime.3
--- strftime.3  2 Jul 2004 23:52:12 -0000       1.34
+++ strftime.3  16 Oct 2004 17:13:08 -0000
@@ -36,7 +36,7 @@
 .\"     @(#)strftime.3 8.1 (Berkeley) 6/4/93
 .\" $FreeBSD: src/lib/libc/stdtime/strftime.3,v 1.34 2004/07/02 23:52:12 ru Exp $
 .\"
-.Dd January 4, 2003
+.Dd October 17, 2004
 .Dt STRFTIME 3
 .Os
 .Sh NAME
@@ -216,6 +216,8 @@
 is replaced by national representation of the date and time
 (the format is similar to that produced by
 .Xr date 1 ) .
+.It Cm %-*
+GLIBC extensions.  Do not do padding when making output.
 .It Cm %%
 is replaced by
 .Ql % .
Index: strftime.c
===================================================================
RCS file: /home/fcvs/src/lib/libc/stdtime/strftime.c,v
retrieving revision 1.40
diff -u -r1.40 strftime.c
--- strftime.c  14 Jun 2004 10:31:52 -0000      1.40
+++ strftime.c  16 Oct 2004 17:14:24 -0000
@@ -59,6 +59,13 @@
 #define IN_THIS        2
 #define IN_ALL 3
 
+#define PAD_DEFAULT    0
+#define PAD_LESS       1
+#if 0          /* XXX NOT IMPLEMENTED YET */
+#define PAD_SPACE      2
+#define PAD_ZERO       3
+#endif
+
 size_t
 strftime(char * __restrict s, size_t maxsize, const char * __restrict format,
     const struct tm * __restrict t)
@@ -99,13 +106,14 @@
 const char * const     ptlim;
 int *                  warnp;
 {
-       int Ealternative, Oalternative;
+       int Ealternative, Oalternative, Palternative;
        struct lc_time_T *tptr = __get_current_time_locale();
 
        for ( ; *format; ++format) {
                if (*format == '%') {
                        Ealternative = 0;
                        Oalternative = 0;
+                       Palternative = PAD_DEFAULT;
 label:
                        switch (*++format) {
                        case '\0':
@@ -188,21 +196,27 @@
                                Oalternative++;
                                goto label;
                        case 'e':
-                               pt = _conv(t->tm_mday, "%2d", pt, ptlim);
+                               pt = _conv(t->tm_mday, (Palternative == PAD_LESS) ?
+                                       "%d" : "%2d",
+                                       pt, ptlim);
                                continue;
                        case 'F':
                                pt = _fmt("%Y-%m-%d", t, pt, ptlim, warnp);
                                continue;
                        case 'H':
-                               pt = _conv(t->tm_hour, "%02d", pt, ptlim);
+                               pt = _conv(t->tm_hour, (Palternative == PAD_LESS) ?
+                                       "%d" : "%02d",
+                                       pt, ptlim);
                                continue;
                        case 'I':
                                pt = _conv((t->tm_hour % 12) ?
-                                       (t->tm_hour % 12) : 12,
-                                       "%02d", pt, ptlim);
+                                       (t->tm_hour % 12) : 12, (Palternative == 
PAD_LESS) ?
+                                       "%d" : "%02d",
+                                       pt, ptlim);
                                continue;
                        case 'j':
-                               pt = _conv(t->tm_yday + 1, "%03d", pt, ptlim);
+                               pt = _conv(t->tm_yday + 1, (Palternative == PAD_LESS) ?
+                                       "%d" : "%03d", pt, ptlim);
                                continue;
                        case 'k':
                                /*
@@ -215,7 +229,9 @@
                                ** "%l" have been swapped.
                                ** (ado, 1993-05-24)
                                */
-                               pt = _conv(t->tm_hour, "%2d", pt, ptlim);
+                               pt = _conv(t->tm_hour, (Palternative == PAD_LESS) ?
+                                       "%d": "%2d",
+                                       pt, ptlim);
                                continue;
 #ifdef KITCHEN_SINK
                        case 'K':
@@ -236,14 +252,19 @@
                                ** (ado, 1993-05-24)
                                */
                                pt = _conv((t->tm_hour % 12) ?
-                                       (t->tm_hour % 12) : 12,
-                                       "%2d", pt, ptlim);
+                                       (t->tm_hour % 12) : 12, (Palternative == 
PAD_LESS) ?
+                                       "%d" : "%2d",
+                                       pt, ptlim);
                                continue;
                        case 'M':
-                               pt = _conv(t->tm_min, "%02d", pt, ptlim);
+                               pt = _conv(t->tm_min, (Palternative == PAD_LESS) ?
+                                       "%d" : "%02d",
+                                       pt, ptlim);
                                continue;
                        case 'm':
-                               pt = _conv(t->tm_mon + 1, "%02d", pt, ptlim);
+                               pt = _conv(t->tm_mon + 1, (Palternative == PAD_LESS) ?
+                                       "%d" : "%02d",
+                                       pt, ptlim);
                                continue;
                        case 'n':
                                pt = _add("\n", pt, ptlim);
@@ -262,7 +283,9 @@
                                        warnp);
                                continue;
                        case 'S':
-                               pt = _conv(t->tm_sec, "%02d", pt, ptlim);
+                               pt = _conv(t->tm_sec, (Palternative == PAD_LESS) ?
+                                       "%d" : "%02d",
+                                       pt, ptlim);
                                continue;
                        case 's':
                                {
@@ -289,8 +312,8 @@
                                continue;
                        case 'U':
                                pt = _conv((t->tm_yday + DAYSPERWEEK -
-                                       t->tm_wday) / DAYSPERWEEK,
-                                       "%02d", pt, ptlim);
+                                       t->tm_wday) / DAYSPERWEEK, (Palternative == 
PAD_LESS) ?
+                                       "%d" : "%02d", pt, ptlim);
                                continue;
                        case 'u':
                                /*
@@ -423,11 +446,13 @@
                                continue;
                        case 'y':
                                *warnp = IN_ALL;
-                               pt = _conv((t->tm_year + TM_YEAR_BASE) % 100,
-                                       "%02d", pt, ptlim);
+                               pt = _conv((t->tm_year + TM_YEAR_BASE) % 100, 
(Palternative == PAD_LESS) ?
+                                       "%d" : "%02d",
+                                       pt, ptlim);
                                continue;
                        case 'Y':
-                               pt = _conv(t->tm_year + TM_YEAR_BASE, "%04d",
+                               pt = _conv(t->tm_year + TM_YEAR_BASE, (Palternative == 
PAD_LESS) ?
+                                       "%d" : "%04d",
                                        pt, ptlim);
                                continue;
                        case 'Z':
@@ -501,6 +526,23 @@
                                pt = _fmt(tptr->date_fmt, t, pt, ptlim,
                                        warnp);
                                continue;
+                       case '-':
+                               if (Palternative != PAD_DEFAULT)
+                                       break;
+                               Palternative = PAD_LESS;
+                               goto label;
+#if 0          /* XXX NOT IMPLEMENTED YET */
+                       case '_':
+                               if (Palternative != PAD_DEFAULT)
+                                       break;
+                               Palternative = PAD_SPACE;
+                               goto label;
+                       case '0':
+                               if (Palternative != PAD_DEFAULT)
+                                       break;
+                               Palternative = PAD_ZERO;
+                               goto label;
+#endif
                        case '%':
                        /*
                        ** X311J/88-090 (4.12.3.5): if conversion char is

-- 
Xin LI <delphij frontfree net>  http://www.delphij.net/
See complete headers for GPG key and other information.

Attachment: pgp588RdkMRxl.pgp
Description: PGP signature

Reply via email to