*** empty log message ***
[gnulib.git] / lib / strftime.c
index 95e55cb..a8c9072 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc.
+/* Copyright (C) 1991-1999, 2000 Free Software Foundation, Inc.
 
    NOTE: The canonical source of this file is maintained with the GNU C Library.
    Bugs can be reported to bug-glibc@prep.ai.mit.edu.
@@ -98,8 +98,8 @@ extern char *tzname[];
 # define L_(Str) L##Str
 # define NLW(Sym) _NL_W##Sym
 
-# define MEMCPY(d, s, n) wmemcpy (d, s, n)
-# define STRLEN(s) wcslen (s)
+# define MEMCPY(d, s, n) __wmemcpy (d, s, n)
+# define STRLEN(s) __wcslen (s)
 
 #else
 # define CHAR_T char
@@ -457,8 +457,7 @@ static CHAR_T const month_name[][10] =
     return _strftime_copytm (s, maxsize, format, &tmcopy ut_argument);
   }
 # undef my_strftime
-# define my_strftime(S, Maxsize, Format, Tp) \
-  _strftime_copytm (S, Maxsize, Format, Tp)
+# define my_strftime _strftime_copytm
 #endif
 
 
@@ -516,6 +515,9 @@ my_strftime (s, maxsize, format, tp ut_argument)
   size_t i = 0;
   CHAR_T *p = s;
   const CHAR_T *f;
+#if DO_MULTIBYTE && !defined COMPILE_WIDE
+  const char *format_end = NULL;
+#endif
 
   zone = NULL;
 #if HAVE_TM_ZONE
@@ -608,10 +610,15 @@ my_strftime (s, maxsize, format, tp ut_argument)
          {
            mbstate_t mbstate = mbstate_zero;
            size_t len = 0;
+           size_t fsize;
+
+           if (! format_end)
+             format_end = f + strlen (f) + 1;
+           fsize = format_end - f;
 
            do
              {
-               size_t bytes = mbrlen (f + len, (size_t) -1, &mbstate);
+               size_t bytes = mbrlen (f + len, fsize - len, &mbstate);
 
                if (bytes == 0)
                  break;
@@ -752,6 +759,11 @@ my_strftime (s, maxsize, format, tp ut_argument)
 
        case L_('b'):
        case L_('h'):           /* POSIX.2 extension.  */
+         if (change_case)
+           {
+             to_uppcase = 1;
+             to_lowcase = 0;
+           }
          if (modifier != 0)
            goto bad_format;
 #if defined _NL_CURRENT || !HAVE_STRFTIME
@@ -796,8 +808,10 @@ my_strftime (s, maxsize, format, tp ut_argument)
        subformat:
          {
            CHAR_T *old_start = p;
-           size_t len = my_strftime (NULL, (size_t) -1, subfmt, tp);
-           add (len, my_strftime (p, maxsize - i, subfmt, tp));
+           size_t len = my_strftime (NULL, (size_t) -1, subfmt,
+                                     tp ut_argument);
+           add (len, my_strftime (p, maxsize - i, subfmt,
+                                  tp ut_argument));
 
            if (to_uppcase)
              while (old_start < p)
@@ -817,6 +831,14 @@ my_strftime (s, maxsize, format, tp ut_argument)
            char *u = ufmt;
            char ubuf[1024]; /* enough for any single format in practice */
            size_t len;
+           /* Make sure we're calling the actual underlying strftime.
+              In some cases, config.h contains something like
+              "#define strftime rpl_strftime".  */
+# ifdef strftime
+#  undef strftime
+           size_t strftime ();
+# endif
+
            *u++ = '%';
            if (modifier != 0)
              *u++ = modifier;
@@ -840,7 +862,7 @@ my_strftime (s, maxsize, format, tp ut_argument)
              if (era)
                {
 # ifdef COMPILE_WIDE
-                 size_t len = wcslen (era->era_wname);
+                 size_t len = __wcslen (era->era_wname);
                  cpy (len, era->era_wname);
 # else
                  size_t len = strlen (era->era_name);