summaryrefslogtreecommitdiff
path: root/ext/PerlIO
diff options
context:
space:
mode:
authorGurusamy Sarathy <gsar@cpan.org>2002-12-18 02:08:12 +0000
committerGurusamy Sarathy <gsar@cpan.org>2002-12-18 02:08:12 +0000
commit4a9d61009ab1e3df94ef4ecfcc453c9ce73010a4 (patch)
tree5bb486e54adfa3de89ac2448576a0f0d61f72722 /ext/PerlIO
parent87755fa7011638e8ad4f4be9619e28e676b74d12 (diff)
downloadperl-4a9d61009ab1e3df94ef4ecfcc453c9ce73010a4.tar.gz
windows: support for large files
note that this change will break binary compatibility with the default 5.8.0 build options; nevertheless I think it is worth having in 5.8.1 (people who want the compatibility can disable the option in the makefile) p4raw-id: //depot/perl@18327
Diffstat (limited to 'ext/PerlIO')
-rw-r--r--ext/PerlIO/scalar/scalar.xs10
-rw-r--r--ext/PerlIO/via/via.xs7
2 files changed, 10 insertions, 7 deletions
diff --git a/ext/PerlIO/scalar/scalar.xs b/ext/PerlIO/scalar/scalar.xs
index 7bcee5774e..d92ef83aa2 100644
--- a/ext/PerlIO/scalar/scalar.xs
+++ b/ext/PerlIO/scalar/scalar.xs
@@ -105,10 +105,10 @@ SSize_t
PerlIOScalar_unread(pTHX_ PerlIO * f, const void *vbuf, Size_t count)
{
PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
- char *dst = SvGROW(s->var, s->posn + count);
+ char *dst = SvGROW(s->var, (STRLEN)s->posn + count);
Move(vbuf, dst + s->posn, count, char);
s->posn += count;
- SvCUR_set(s->var, s->posn);
+ SvCUR_set(s->var, (STRLEN)s->posn);
SvPOK_on(s->var);
return count;
}
@@ -128,7 +128,7 @@ PerlIOScalar_write(pTHX_ PerlIO * f, const void *vbuf, Size_t count)
}
else {
if ((s->posn + count) > SvCUR(sv))
- dst = SvGROW(sv, s->posn + count);
+ dst = SvGROW(sv, (STRLEN)s->posn + count);
else
dst = SvPV_nolen(sv);
offset = s->posn;
@@ -136,7 +136,7 @@ PerlIOScalar_write(pTHX_ PerlIO * f, const void *vbuf, Size_t count)
}
Move(vbuf, dst + offset, count, char);
if ((STRLEN) s->posn > SvCUR(sv))
- SvCUR_set(sv, s->posn);
+ SvCUR_set(sv, (STRLEN)s->posn);
SvPOK_on(s->var);
return count;
}
@@ -182,7 +182,7 @@ PerlIOScalar_get_cnt(pTHX_ PerlIO * f)
if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
if (SvCUR(s->var) > (STRLEN) s->posn)
- return SvCUR(s->var) - s->posn;
+ return SvCUR(s->var) - (STRLEN)s->posn;
else
return 0;
}
diff --git a/ext/PerlIO/via/via.xs b/ext/PerlIO/via/via.xs
index d4546781e6..524d24a69c 100644
--- a/ext/PerlIO/via/via.xs
+++ b/ext/PerlIO/via/via.xs
@@ -350,7 +350,8 @@ IV
PerlIOVia_seek(pTHX_ PerlIO * f, Off_t offset, int whence)
{
PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
- SV *offsv = sv_2mortal(newSViv(offset));
+ SV *offsv = sv_2mortal(sizeof(Off_t) > sizeof(IV)
+ ? newSVnv((NV)offset) : newSViv((IV)offset));
SV *whsv = sv_2mortal(newSViv(whence));
SV *result =
PerlIOVia_method(aTHX_ f, MYMethod(SEEK), G_SCALAR, offsv, whsv,
@@ -364,7 +365,9 @@ PerlIOVia_tell(pTHX_ PerlIO * f)
PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
SV *result =
PerlIOVia_method(aTHX_ f, MYMethod(TELL), G_SCALAR, Nullsv);
- return (result) ? (Off_t) SvIV(result) : (Off_t) - 1;
+ return (result)
+ ? (SvNOK(result) ? (Off_t)SvNV(result) : (Off_t)SvIV(result))
+ : (Off_t) - 1;
}
SSize_t