summaryrefslogtreecommitdiff
path: root/cpan/Time-Piece/Piece.xs
diff options
context:
space:
mode:
authorCraig A. Berry <craigberry@mac.com>2010-06-29 07:14:39 -0500
committerCraig A. Berry <craigberry@mac.com>2010-06-29 07:14:39 -0500
commitded2eedcb4ea5645092eea71df32e0f737b89d90 (patch)
tree4db8fe398cde72505f0de0e4bc90dd0d784b8830 /cpan/Time-Piece/Piece.xs
parent86b22379fed2b21897f767d5f96d76a24dd46436 (diff)
downloadperl-ded2eedcb4ea5645092eea71df32e0f737b89d90.tar.gz
Remove alloca() use from Time::Piece for portability.
In 1.17, T::P started using its own strptime (almost) everywhere, and this _strptime contains a single reference to alloca(). The Linux and BSD man pages recommend against using alloca(), the function doesn't exist on HP-UX or VMS, and it's impossible to error check it. So replace it here with malloc(). If getting three or four bytes from the heap instead of the stack is considered a problem, an alternative would be researching the maximum length of a timezone name and using an automatic variable to hold it.
Diffstat (limited to 'cpan/Time-Piece/Piece.xs')
-rw-r--r--cpan/Time-Piece/Piece.xs23
1 files changed, 7 insertions, 16 deletions
diff --git a/cpan/Time-Piece/Piece.xs b/cpan/Time-Piece/Piece.xs
index 0bbefd3a9d..5d3f992c9a 100644
--- a/cpan/Time-Piece/Piece.xs
+++ b/cpan/Time-Piece/Piece.xs
@@ -307,19 +307,6 @@ my_mini_mktime(struct tm *ptm)
# define strncasecmp(x,y,n) strnicmp(x,y,n)
# endif
-#if defined(WIN32)
-#if defined(__BORLANDC__)
-void * __cdecl _EXPFUNC alloca(_SIZE_T __size);
-#else
-#define alloca _alloca
-#endif
-#else
-#if defined(_SGIAPI) || defined( __sgi ) || ( defined (__SVR4) && defined (__sun) )
-/* required for IRIX and Solaris */
-#include <alloca.h>
-#endif
-#endif
-
/* strptime copied from freebsd with the following copyright: */
/*
* Copyright (c) 1994 Powerdog Industries. All rights reserved.
@@ -916,15 +903,19 @@ label:
for (cp = buf; *cp && isupper((unsigned char)*cp); ++cp)
{/*empty*/}
if (cp - buf) {
- zonestr = (char *)alloca(cp - buf + 1);
+ zonestr = malloc(cp - buf + 1);
+ if (!zonestr) {
+ errno = ENOMEM;
+ return 0;
+ }
strncpy(zonestr, buf, cp - buf);
zonestr[cp - buf] = '\0';
my_tzset(aTHX);
if (0 == strcmp(zonestr, "GMT")) {
got_GMT = 1;
- } else {
- return 0;
}
+ free(zonestr);
+ if (!got_GMT) return 0;
buf += cp - buf;
}
}