}
#endif
-/* XXX struct tm on some systems (SunOS4/BSD) contains extra (non POSIX)
- * fields for which we don't have Configure support yet:
- * char *tm_zone; -- abbreviation of timezone name
- * long tm_gmtoff; -- offset from GMT in seconds
- * To workaround core dumps from the uninitialised tm_zone we get the
+/* To workaround core dumps from the uninitialised tm_zone we get the
* system to give us a reasonable struct to copy. This fix means that
* strftime uses the tm_zone and tm_gmtoff values returned by
* localtime(time()). That should give the desired result most of the
* time. But probably not always!
*
- * This is a temporary workaround to be removed once Configure
- * support is added and NETaa14816 is considered in full.
- * It does not address tzname aspects of NETaa14816.
+ * This does not address tzname aspects of NETaa14816.
+ *
*/
+
#ifdef HAS_GNULIBC
# ifndef STRUCT_TM_HASZONE
# define STRUCT_TM_HASZONE
# endif
#endif
+#ifdef STRUCT_TM_HASZONE /* Backward compat */
+# ifndef HAS_TM_TM_ZONE
+# define HAS_TM_TM_ZONE
+# endif
+#endif
+
void
Perl_init_tm(pTHX_ struct tm *ptm) /* see mktime, strftime and asctime */
{
-#ifdef STRUCT_TM_HASZONE
+#ifdef HAS_TM_TM_ZONE
Time_t now;
(void)time(&now);
Copy(localtime(&now), ptm, 1, struct tm);
while (sbyte < ebyte) {
if (sutf >= eutf)
return 1; /* utf one shorter */
- if (*sbyte < 128) {
+ if (NATIVE_IS_INVARIANT(*sbyte)) {
if (*sbyte != *sutf)
return *sbyte - *sutf;
sbyte++; sutf++; /* CONTINUE */
- } else if ((*sutf & 0x3F) == (*sbyte >> 6)) { /* byte 0xFF: 0xC3 BF */
- if ((sutf[1] & 0x3F) != (*sbyte & 0x3F))
- return (*sbyte & 0x3F) - (*sutf & 0x3F);
+ } else if ((*sutf & UTF_CONTINUATION_MASK) ==
+ (*sbyte >> UTF_ACCUMULATION_SHIFT)) {
+ if ((sutf[1] & UTF_CONTINUATION_MASK) !=
+ (*sbyte & UTF_CONTINUATION_MASK))
+ return (*sbyte & UTF_CONTINUATION_MASK) -
+ (*sutf & UTF_CONTINUATION_MASK);
sbyte++, sutf += 2; /* CONTINUE */
} else
- return (*sbyte >> 6) - (*sutf & 0x3F);
+ return (*sbyte >> UTF_ACCUMULATION_SHIFT) -
+ (*sutf & UTF_CONTINUATION_MASK);
}
if (sutf >= eutf)
return 0;