From: John Peacock Date: Wed, 9 Jul 2003 01:05:38 +0000 (-0700) Subject: Re: [REPATCH] was Re: [perl #16010] v-strings left of a => don't get quoted. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=f333445c29f1556015c4df0c417df8e1a742d36d;p=p5sagit%2Fp5-mst-13.2.git Re: [REPATCH] was Re: [perl #16010] v-strings left of a => don't get quoted. Message-ID: <3F0BCCD2.1020009@rowman.com> p4raw-id: //depot/perl@20084 --- diff --git a/embed.fnc b/embed.fnc index 704f8d5..d6ebec7 100644 --- a/embed.fnc +++ b/embed.fnc @@ -533,7 +533,7 @@ Ap |OP* |newWHILEOP |I32 flags|I32 debuggable|LOOP* loop \ |I32 whileline|OP* expr|OP* block|OP* cont Ap |PERL_SI*|new_stackinfo|I32 stitems|I32 cxitems -Apd |char* |scan_vstring |char *vstr|SV *sv +Ap |char* |scan_vstring |char *vstr|SV *sv Apd |char* |scan_version |char *vstr|SV *sv Apd |SV* |new_version |SV *ver Apd |SV* |upg_version |SV *ver diff --git a/pod/perlapi.pod b/pod/perlapi.pod index 93d1cfb..ba00769 100644 --- a/pod/perlapi.pod +++ b/pod/perlapi.pod @@ -1716,6 +1716,41 @@ Fill the sv with current working directory =for hackers Found in file util.c +=item new_version + +Returns a new version object based on the passed in SV: + + SV *sv = new_version(SV *ver); + +Does not alter the passed in ver SV. See "upg_version" if you +want to upgrade the SV. + + SV* new_version(SV *ver) + +=for hackers +Found in file util.c + +=item scan_version + +Returns a pointer to the next character after the parsed +version string, as well as upgrading the passed in SV to +an RV. + +Function must be called with an already existing SV like + + sv = NEWSV(92,0); + s = scan_version(s,sv); + +Performs some preprocessing to the string to ensure that +it has the correct characteristics of a version. Flags the +object if it contains an underscore (which denotes this +is a beta version). + + char* scan_version(char *vstr, SV *sv) + +=for hackers +Found in file util.c + =item strEQ Test two strings to see if they are equal. Returns true or false. @@ -1797,6 +1832,92 @@ wrapper for C). =for hackers Found in file handy.h +=item sv_nolocking + +Dummy routine which "locks" an SV when there is no locking module present. +Exists to avoid test for a NULL function pointer and because it could potentially warn under +some level of strict-ness. + + void sv_nolocking(SV *) + +=for hackers +Found in file util.c + +=item sv_nosharing + +Dummy routine which "shares" an SV when there is no sharing module present. +Exists to avoid test for a NULL function pointer and because it could potentially warn under +some level of strict-ness. + + void sv_nosharing(SV *) + +=for hackers +Found in file util.c + +=item sv_nounlocking + +Dummy routine which "unlocks" an SV when there is no locking module present. +Exists to avoid test for a NULL function pointer and because it could potentially warn under +some level of strict-ness. + + void sv_nounlocking(SV *) + +=for hackers +Found in file util.c + +=item upg_version + +In-place upgrade of the supplied SV to a version object. + + SV *sv = upg_version(SV *sv); + +Returns a pointer to the upgraded SV. + + SV* upg_version(SV *ver) + +=for hackers +Found in file util.c + +=item vcmp + +Version object aware cmp. Both operands must already have been +converted into version objects. + + int vcmp(SV *lvs, SV *rvs) + +=for hackers +Found in file util.c + +=item vnumify + +Accepts a version object and returns the normalized floating +point representation. Call like: + + sv = vnumify(rv); + +NOTE: you can pass either the object directly or the SV +contained within the RV. + + SV* vnumify(SV *vs) + +=for hackers +Found in file util.c + +=item vstringify + +Accepts a version object and returns the normalized string +representation. Call like: + + sv = vstringify(rv); + +NOTE: you can pass either the object directly or the SV +contained within the RV. + + SV* vstringify(SV *vs) + +=for hackers +Found in file util.c + =back @@ -2595,59 +2716,6 @@ The reference count for the SV is set to 1. =for hackers Found in file sv.c -=item new_version - -Returns a new version object based on the passed in SV: - - SV *sv = new_version(SV *ver); - -Does not alter the passed in ver SV. See "upg_version" if you -want to upgrade the SV. - - SV* new_version(SV *ver) - -=for hackers -Found in file util.c - -=item scan_version - -Returns a pointer to the next character after the parsed -version string, as well as upgrading the passed in SV to -an RV. - -Function must be called with an already existing SV like - - sv = NEWSV(92,0); - s = scan_version(s,sv); - -Performs some preprocessing to the string to ensure that -it has the correct characteristics of a version. Flags the -object if it contains an underscore (which denotes this -is a beta version). - - char* scan_version(char *vstr, SV *sv) - -=for hackers -Found in file util.c - -=item scan_vstring - -Returns a pointer to the next character after the parsed -vstring, as well as updating the passed in sv. - -Function must be called like - - sv = NEWSV(92,5); - s = scan_vstring(s,sv); - -The sv should already be large enough to store the vstring -passed in, for performance reasons. - - char* scan_vstring(char *vstr, SV *sv) - -=for hackers -Found in file util.c - =item SvCUR Returns the length of the string which is in the SV. See C. @@ -3986,39 +4054,6 @@ instead. =for hackers Found in file sv.c -=item sv_nolocking - -Dummy routine which "locks" an SV when there is no locking module present. -Exists to avoid test for a NULL function pointer and because it could potentially warn under -some level of strict-ness. - - void sv_nolocking(SV *) - -=for hackers -Found in file util.c - -=item sv_nosharing - -Dummy routine which "shares" an SV when there is no sharing module present. -Exists to avoid test for a NULL function pointer and because it could potentially warn under -some level of strict-ness. - - void sv_nosharing(SV *) - -=for hackers -Found in file util.c - -=item sv_nounlocking - -Dummy routine which "unlocks" an SV when there is no locking module present. -Exists to avoid test for a NULL function pointer and because it could potentially warn under -some level of strict-ness. - - void sv_nounlocking(SV *) - -=for hackers -Found in file util.c - =item sv_nv A private implementation of the C macro for compilers which can't @@ -4687,59 +4722,6 @@ Usually used via one of its frontends C and C. =for hackers Found in file sv.c -=item upg_version - -In-place upgrade of the supplied SV to a version object. - - SV *sv = upg_version(SV *sv); - -Returns a pointer to the upgraded SV. - - SV* upg_version(SV *ver) - -=for hackers -Found in file util.c - -=item vcmp - -Version object aware cmp. Both operands must already have been -converted into version objects. - - int vcmp(SV *lvs, SV *rvs) - -=for hackers -Found in file util.c - -=item vnumify - -Accepts a version object and returns the normalized floating -point representation. Call like: - - sv = vnumify(rv); - -NOTE: you can pass either the object directly or the SV -contained within the RV. - - SV* vnumify(SV *vs) - -=for hackers -Found in file util.c - -=item vstringify - -Accepts a version object and returns the normalized string -representation. Call like: - - sv = vstringify(rv); - -NOTE: you can pass either the object directly or the SV -contained within the RV. - - SV* vstringify(SV *vs) - -=for hackers -Found in file util.c - =back diff --git a/toke.c b/toke.c index bac0380..4c8fbe5 100644 --- a/toke.c +++ b/toke.c @@ -7958,3 +7958,90 @@ utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen) } #endif +/* +Returns a pointer to the next character after the parsed +vstring, as well as updating the passed in sv. + +Function must be called like + + sv = NEWSV(92,5); + s = scan_vstring(s,sv); + +The sv should already be large enough to store the vstring +passed in, for performance reasons. + +*/ + +char * +Perl_scan_vstring(pTHX_ char *s, SV *sv) +{ + char *pos = s; + char *start = s; + if (*pos == 'v') pos++; /* get past 'v' */ + while (isDIGIT(*pos) || *pos == '_') + pos++; + if ( *pos != '.') { + /* this may not be a v-string if followed by => */ + start = pos; + if (isSPACE(*start)) + start = skipspace(start); + if ( *start == '=' && start[1] == '>' ) + { + /* return string not v-string */ + sv_setpvn(sv,(char *)s,pos-s); + return pos; + } + } + + if (!isALPHA(*pos)) { + UV rev; + U8 tmpbuf[UTF8_MAXLEN+1]; + U8 *tmpend; + + if (*s == 'v') s++; /* get past 'v' */ + + sv_setpvn(sv, "", 0); + + for (;;) { + rev = 0; + { + /* this is atoi() that tolerates underscores */ + char *end = pos; + UV mult = 1; + while (--end >= s) { + UV orev; + if (*end == '_') + continue; + orev = rev; + rev += (*end - '0') * mult; + mult *= 10; + if (orev > rev && ckWARN_d(WARN_OVERFLOW)) + Perl_warner(aTHX_ packWARN(WARN_OVERFLOW), + "Integer overflow in decimal number"); + } + } +#ifdef EBCDIC + if (rev > 0x7FFFFFFF) + Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647"); +#endif + /* Append native character for the rev point */ + tmpend = uvchr_to_utf8(tmpbuf, rev); + sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf); + if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev))) + SvUTF8_on(sv); + if (*pos == '.' && isDIGIT(pos[1])) + s = ++pos; + else { + s = pos; + break; + } + while (isDIGIT(*pos) || *pos == '_') + pos++; + } + SvPOK_on(sv); + sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start); + SvRMAGICAL_on(sv); + } + return s; +} + diff --git a/util.c b/util.c index 48f9058..80af155 100644 --- a/util.c +++ b/util.c @@ -3634,85 +3634,6 @@ Perl_getcwd_sv(pTHX_ register SV *sv) } /* -=head1 SV Manipulation Functions - -=for apidoc scan_vstring - -Returns a pointer to the next character after the parsed -vstring, as well as updating the passed in sv. - -Function must be called like - - sv = NEWSV(92,5); - s = scan_vstring(s,sv); - -The sv should already be large enough to store the vstring -passed in, for performance reasons. - -=cut -*/ - -char * -Perl_scan_vstring(pTHX_ char *s, SV *sv) -{ - char *pos = s; - char *start = s; - if (*pos == 'v') pos++; /* get past 'v' */ - while (isDIGIT(*pos) || *pos == '_') - pos++; - if (!isALPHA(*pos)) { - UV rev; - U8 tmpbuf[UTF8_MAXLEN+1]; - U8 *tmpend; - - if (*s == 'v') s++; /* get past 'v' */ - - sv_setpvn(sv, "", 0); - - for (;;) { - rev = 0; - { - /* this is atoi() that tolerates underscores */ - char *end = pos; - UV mult = 1; - while (--end >= s) { - UV orev; - if (*end == '_') - continue; - orev = rev; - rev += (*end - '0') * mult; - mult *= 10; - if (orev > rev && ckWARN_d(WARN_OVERFLOW)) - Perl_warner(aTHX_ packWARN(WARN_OVERFLOW), - "Integer overflow in decimal number"); - } - } -#ifdef EBCDIC - if (rev > 0x7FFFFFFF) - Perl_croak(aTHX_ "In EBCDIC the v-string components cannot exceed 2147483647"); -#endif - /* Append native character for the rev point */ - tmpend = uvchr_to_utf8(tmpbuf, rev); - sv_catpvn(sv, (const char*)tmpbuf, tmpend - tmpbuf); - if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev))) - SvUTF8_on(sv); - if (*pos == '.' && isDIGIT(pos[1])) - s = ++pos; - else { - s = pos; - break; - } - while (isDIGIT(*pos) || *pos == '_') - pos++; - } - SvPOK_on(sv); - sv_magic(sv,NULL,PERL_MAGIC_vstring,(const char*)start, pos-start); - SvRMAGICAL_on(sv); - } - return s; -} - -/* =for apidoc scan_version Returns a pointer to the next character after the parsed