summaryrefslogtreecommitdiff
path: root/sv.c
diff options
context:
space:
mode:
authorPerl 5 Porters <perl5-porters@africa.nicoh.com>1997-02-18 13:22:00 +1200
committerChip Salzenberg <chip@atlantic.net>1997-02-18 13:22:00 +1200
commitff0cee690d2ef6ba882e59dd4baaa0c944adb7a2 (patch)
tree91b3d734c5c24df3e5127c9974064d91ec428678 /sv.c
parentf65adc383296c14b415f0ade0cf7fc4a27049a24 (diff)
downloadperl-ff0cee690d2ef6ba882e59dd4baaa0c944adb7a2.tar.gz
[inseparable changes from patch from perl5.003_26 to perl5.003_27]
BUILD PROCESS Subject: Fix eval "" in Configure Date: Fri, 14 Feb 1997 13:09:53 -0500 From: John L. Allen <allen@gateway.grumman.com> Files: Configure Subject: Re: Configure problem on IRIX - me dumb p5p-msgid: <9702141809.AA17001@gateway.grumman.com> Subject: Don't link with -lsfio if sfio is not requested From: Chip Salzenberg <chip@perl.com> Files: Configure Subject: perl5.003_26 Configure change "win" for AIX 4 Date: Fri, 14 Feb 1997 13:59:02 -0600 (CST) From: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu> Files: Configure p5p-msgid: <Pine.OSF.3.95.970214135751.32654A-100000@dogbert.cc.ndsu.NoDak.edu> private-msgid: <Pine.OSF.3.95.970214135751.32654A-100000@dogbert.cc.ndsu.NoD CORE LANGUAGE CHANGES Subject: Better looks_like_number() function [sv.c] Date: Fri, 14 Feb 1997 18:08:52 +0100 From: Gisle Aas <aas@bergen.sn.no> Files: sv.c Msg-ID: <199702141708.SAA17546@bergen.sn.no> (applied based on p5p patch as commit 8dbaa58ee2aba7cc22d84199a674c58bbf108b46) Subject: Remove redundant functions UNIVERSAL::{class,is_instance} Date: 14 Feb 1997 15:52:21 +0000 From: Gisle Aas <aas@bergen.sn.no> Files: pod/perldelta.pod pod/perlobj.pod t/op/universal.t universal.c Msg-ID: <hwwsbpeq2.fsf@bergen.sn.no> (applied based on p5p patch as commit 77bb9b23081b62119e8fbe9f5655b8802e4537ae) Subject: Allow C<setpgrp $$> Date: 16 Feb 1997 23:19:12 -0500 From: Roderick Schertler <roderick@gate.net> Files: pp_sys.c Msg-ID: <pzraigyshr.fsf@eeyore.ibcinc.com> (applied based on p5p patch as commit 3d2573a84a1aa655d5da58c57b3fc20e04d40f9f) Subject: Fix syntax error on C<&$1> From: Chip Salzenberg <chip@perl.com> Files: toke.c Subject: Fix grep() with refs in array context From: Chip Salzenberg <chip@perl.com> Files: pp.c CORE PORTABILITY Subject: Eliminate $^S; add C<use vmsish qw(status exit time)> Date: Mon, 17 Feb 1997 02:45:26 -0500 (EST) From: Charles Bailey <bailey@HMIVAX.HUMGEN.UPENN.EDU> Files: MANIFEST gv.c lib/English.pm lib/ExtUtils/MM_VMS.pm lib/ExtUtils/Mksymlists.pm lib/ExtUtils/xsubpp mg.c op.c perl.c perl.h pod/perldelta.pod pod/perlmod.pod pod/perlvar.pod pp_ctl.c pp_sys.c utils/perldoc.PL vms/Makefile vms/config.vms vms/descrip.mms vms/ext/Stdio/Stdio.pm vms/ext/Stdio/Stdio.xs vms/ext/XSSymSet.pm vms/ext/vmsish.pm vms/vms.c vms/vmsish.h win32/makedef.pl private-msgid: <01IFI9CFKL0S004R2V@hmivax.humgen.upenn.edu> LIBRARY AND EXTENSIONS Subject: Remove Fatal.pm From: Chip Salzenberg <chip@perl.com> Files: MANIFEST lib/Fatal.pm pod/perldelta.pod pod/perlmod.pod pod/roffitall t/lib/fatal.t Subject: Refresh MakeMaker to 5.40 From: Andy Dougherty <doughera@lafcol.lafayette.edu> Files: lib/ExtUtils/Liblist.pm lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MakeMaker.pm lib/ExtUtils/Mksymlists.pm OTHER CORE CHANGES Subject: Fix core dump when embedding From: Chip Salzenberg <chip@perl.com> Files: perl.c Subject: Re: Fragile signals Date: Thu, 13 Feb 1997 01:44:39 -0500 (EST) From: Ilya Zakharevich <ilya@math.ohio-state.edu> Files: mg.c Msg-ID: <199702130644.BAA07572@monk.mps.ohio-state.edu> (applied based on p5p patch as commit 09df8c7df7dfc9853902f1fdd8a6d95f53be66fc) Subject: Make format strings correspond exactly to parameters Date: 13 Feb 1997 17:24:31 -0500 From: Roderick Schertler <roderick@gate.net> Files: doio.c ext/DB_File/DB_File.xs ext/Opcode/Opcode.xs gv.c op.c perl.c pp_ctl.c pp_sys.c regcomp.c toke.c Msg-ID: <pz7mkc1h0g.fsf@eeyore.ibcinc.com> (applied based on p5p patch as commit bf81aadd817bdea29720b072eef945df2da8463b) Subject: Don't try to attach 'o' magic to read-only values From: Chip Salzenberg <chip@perl.com> Files: sv.c Subject: Fix carriage-return message From: Chip Salzenberg <chip@perl.com> Files: toke.c Subject: In <=>, test for equality first From: Chip Salzenberg <chip@perl.com> Files: pp.c Subject: Don't mark sv_{true,false} PADTMP From: Chip Salzenberg <chip@perl.com> Files: op.c
Diffstat (limited to 'sv.c')
-rw-r--r--sv.c69
1 files changed, 49 insertions, 20 deletions
diff --git a/sv.c b/sv.c
index 528afd988c..65d7d30e09 100644
--- a/sv.c
+++ b/sv.c
@@ -1504,7 +1504,7 @@ SV *sv;
register char *s;
register char *send;
register char *sbegin;
- I32 numtype = 1;
+ I32 numtype;
STRLEN len;
if (SvPOK(sv)) {
@@ -1520,31 +1520,53 @@ SV *sv;
s = sbegin;
while (isSPACE(*s))
s++;
- if (s >= send)
- return 0;
if (*s == '+' || *s == '-')
s++;
- while (isDIGIT(*s))
- s++;
- if (s == send)
- return numtype;
- if (*s == '.') {
- numtype = 1;
- s++;
+
+ /* next must be digit or '.' */
+ if (isDIGIT(*s)) {
+ do {
+ s++;
+ } while (isDIGIT(*s));
+ if (*s == '.') {
+ s++;
+ while (isDIGIT(*s)) /* optional digits after "." */
+ s++;
+ }
}
- else if (s == SvPVX(sv))
- return 0;
- while (isDIGIT(*s))
- s++;
- if (s == send)
- return numtype;
+ else if (*s == '.') {
+ s++;
+ /* no digits before '.' means we need digits after it */
+ if (isDIGIT(*s)) {
+ do {
+ s++;
+ } while (isDIGIT(*s));
+ }
+ else
+ return 0;
+ }
+ else
+ return 0;
+
+ /*
+ * we return 1 if the number can be converted to _integer_ with atol()
+ * and 2 if you need (int)atof().
+ */
+ numtype = 1;
+
+ /* we can have an optional exponent part */
if (*s == 'e' || *s == 'E') {
numtype = 2;
s++;
if (*s == '+' || *s == '-')
s++;
- while (isDIGIT(*s))
- s++;
+ if (isDIGIT(*s)) {
+ do {
+ s++;
+ } while (isDIGIT(*s));
+ }
+ else
+ return 0;
}
while (isSPACE(*s))
s++;
@@ -2929,6 +2951,11 @@ sv_collxfrm(sv, nxp)
Safefree(mg->mg_ptr);
s = SvPV(sv, len);
if ((xf = mem_collxfrm(s, len, &xlen))) {
+ if (SvREADONLY(sv)) {
+ SAVEFREEPV(xf);
+ *nxp = xlen;
+ return xf;
+ }
if (! mg) {
sv_magic(sv, 0, 'o', 0, 0);
mg = mg_find(sv, 'o');
@@ -2938,8 +2965,10 @@ sv_collxfrm(sv, nxp)
mg->mg_len = xlen;
}
else {
- mg->mg_ptr = NULL;
- mg->mg_len = -1;
+ if (mg) {
+ mg->mg_ptr = NULL;
+ mg->mg_len = -1;
+ }
}
}
if (mg && mg->mg_ptr) {