summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorPaul "LeoNerd" Evans <leonerd@leonerd.org.uk>2012-02-08 16:24:35 +0000
committerÆvar Arnfjörð Bjarmason <avar@cpan.org>2012-02-11 22:22:25 +0000
commit423a1dfc8c367cb58e7dcef73a81b4ec7a8b8810 (patch)
tree029be25d45ad3e1dc4a0eb2c540ad57ac0975671 /ext
parentb3b7a49817e88df27cfeb631f252cef5d4f81b71 (diff)
downloadperl-423a1dfc8c367cb58e7dcef73a81b4ec7a8b8810.tar.gz
More obvious variable names and neater code in strptime()
Diffstat (limited to 'ext')
-rw-r--r--ext/POSIX/POSIX.xs32
1 files changed, 19 insertions, 13 deletions
diff --git a/ext/POSIX/POSIX.xs b/ext/POSIX/POSIX.xs
index 131cc7b2b5..89d543e5cb 100644
--- a/ext/POSIX/POSIX.xs
+++ b/ext/POSIX/POSIX.xs
@@ -1860,8 +1860,9 @@ strptime(str, fmt, sec=-1, min=-1, hour=-1, mday=-1, mon=-1, year=-1, wday=-1, y
PPCODE:
{
const char *str_c;
- const U8 *orig_bytes;
- SV *strref = NULL;
+ int returning_pos = 0; /* true if caller wants us to set pos() marker on str */
+ SV *orig_str = NULL; /* caller's original SV* if we have had to regrade it */
+ const U8 *orig_bytes; /* SvPV of orig_str */
MAGIC *posmg = NULL;
STRLEN str_offset = 0;
struct tm tm;
@@ -1879,15 +1880,16 @@ strptime(str, fmt, sec=-1, min=-1, hour=-1, mday=-1, mon=-1, year=-1, wday=-1, y
tm.tm_isdst = isdst;
if(SvROK(str) && !SvOBJECT(SvRV(str))) {
- strref = SvRV(str);
+ SV *ref = SvRV(str);
- if(SvTYPE(strref) > SVt_PVMG || SvREADONLY(strref))
+ if(SvTYPE(ref) > SVt_PVMG || SvREADONLY(ref))
croak("str is not a reference to a mutable scalar");
- str = strref;
+ str = ref;
+ returning_pos = 1;
- if(SvTYPE(strref) >= SVt_PVMG && SvMAGIC(strref))
- posmg = mg_find(strref, PERL_MAGIC_regex_global);
+ if(SvTYPE(str) >= SVt_PVMG && SvMAGIC(str))
+ posmg = mg_find(str, PERL_MAGIC_regex_global);
if(posmg)
str_offset = posmg->mg_len;
@@ -1900,6 +1902,7 @@ strptime(str, fmt, sec=-1, min=-1, hour=-1, mday=-1, mon=-1, year=-1, wday=-1, y
* of and regrade it to match fmt, taking care to update the
* offset in both cases. */
if(!SvUTF8(str) && SvUTF8(fmt)) {
+ orig_str = str;
str = sv_mortalcopy(str);
sv_utf8_upgrade_nomg(str);
@@ -1910,6 +1913,7 @@ strptime(str, fmt, sec=-1, min=-1, hour=-1, mday=-1, mon=-1, year=-1, wday=-1, y
}
}
else if(SvUTF8(str) && !SvUTF8(fmt)) {
+ orig_str = str;
str = sv_mortalcopy(str);
/* If downgrade fails then str must have contained characters
* that could not possibly be matched by fmt */
@@ -1919,7 +1923,7 @@ strptime(str, fmt, sec=-1, min=-1, hour=-1, mday=-1, mon=-1, year=-1, wday=-1, y
str_c = SvPV_nolen(str);
if(str_offset) {
- orig_bytes = SvPV_nolen(strref);
+ orig_bytes = SvPV_nolen(orig_str);
str_offset = utf8_distance(orig_bytes + str_offset, orig_bytes);
}
}
@@ -1933,24 +1937,26 @@ strptime(str, fmt, sec=-1, min=-1, hour=-1, mday=-1, mon=-1, year=-1, wday=-1, y
if(!remains)
/* failed parse */
XSRETURN(0);
- if(remains[0] && !strref)
+ if(remains[0] && !returning_pos)
/* leftovers - without ref we can't signal this so this is a failure */
XSRETURN(0);
- if(strref) {
- if(str != strref) {
+ if(returning_pos) {
+ if(orig_str) {
if(SvUTF8(str))
/* str is a UTF-8 upgraded copy of the original non-UTF-8
- * string the caller referred us to in strref */
+ * string the caller referred us to in orig_str */
str_offset = utf8_distance(remains, str_c);
else
str_offset = utf8_hop(orig_bytes, remains - str_c) - orig_bytes;
+
+ str = orig_str;
}
else {
str_offset = remains - str_c;
}
if(!posmg)
- posmg = sv_magicext(strref, NULL, PERL_MAGIC_regex_global,
+ posmg = sv_magicext(str, NULL, PERL_MAGIC_regex_global,
&PL_vtbl_mglob, NULL, 0);
posmg->mg_len = str_offset;
}