In perl.git, the branch blead has been updated <http://perl5.git.perl.org/perl.git/commitdiff/f80c2205cb723cd2cf47ce4d256d279c74a46325?hp=a932d541326b1fef3943a730adb350592857f19a>
- Log ----------------------------------------------------------------- commit f80c2205cb723cd2cf47ce4d256d279c74a46325 Author: Nicholas Clark <n...@ccl4.org> Date: Mon Nov 29 11:41:21 2010 +0000 Break out code from Perl_sv_gets() which is self contained and exits directly. Previously the code for handling fixed length records, and appending from a non-UTF-8 handle to a UTF-8 scalar, was handled in two blocks in Perl_sv_gets() which exited via a goto to the last statement of Perl_sv_gets(). By breaking them out into separate static functions, the control flow becomes clearer. ----------------------------------------------------------------------- Summary of changes: sv.c | 93 ++++++++++++++++++++++++++++++++++++----------------------------- 1 files changed, 51 insertions(+), 42 deletions(-) diff --git a/sv.c b/sv.c index 92634e1..5adefc6 100644 --- a/sv.c +++ b/sv.c @@ -7367,6 +7367,55 @@ Perl_sv_collxfrm_flags(pTHX_ SV *const sv, STRLEN *const nxp, const I32 flags) #endif /* USE_LOCALE_COLLATE */ +static char * +S_sv_gets_append_to_utf8(pTHX_ SV *const sv, PerlIO *const fp, I32 append) +{ + SV * const tsv = newSV(0); + ENTER; + SAVEFREESV(tsv); + sv_gets(tsv, fp, 0); + sv_utf8_upgrade_nomg(tsv); + SvCUR_set(sv,append); + sv_catsv(sv,tsv); + LEAVE; + return (SvCUR(sv) - append) ? SvPVX(sv) : NULL; +} + +static char * +S_sv_gets_read_record(pTHX_ SV *const sv, PerlIO *const fp, I32 append) +{ + I32 bytesread; + const U32 recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */ + /* Grab the size of the record we're getting */ + char *const buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append; +#ifdef VMS + int fd; +#endif + + /* Go yank in */ +#ifdef VMS + /* VMS wants read instead of fread, because fread doesn't respect */ + /* RMS record boundaries. This is not necessarily a good thing to be */ + /* doing, but we've got no other real choice - except avoid stdio + as implementation - perhaps write a :vms layer ? + */ + fd = PerlIO_fileno(fp); + if (fd != -1) { + bytesread = PerlLIO_read(fd, buffer, recsize); + } + else /* in-memory file from PerlIO::Scalar */ +#endif + { + bytesread = PerlIO_read(fp, buffer, recsize); + } + + if (bytesread < 0) + bytesread = 0; + SvCUR_set(sv, bytesread + append); + buffer[bytesread] = '\0'; + return (SvCUR(sv) - append) ? SvPVX(sv) : NULL; +} + /* =for apidoc sv_gets @@ -7408,15 +7457,7 @@ Perl_sv_gets(pTHX_ register SV *const sv, register PerlIO *const fp, I32 append) sv_pos_u2b(sv,&append,0); } } else if (SvUTF8(sv)) { - SV * const tsv = newSV(0); - ENTER; - SAVEFREESV(tsv); - sv_gets(tsv, fp, 0); - sv_utf8_upgrade_nomg(tsv); - SvCUR_set(sv,append); - sv_catsv(sv,tsv); - LEAVE; - goto return_string_or_null; + return S_sv_gets_append_to_utf8(aTHX_ sv, fp, append); } } @@ -7449,38 +7490,7 @@ Perl_sv_gets(pTHX_ register SV *const sv, register PerlIO *const fp, I32 append) rslen = 0; } else if (RsRECORD(PL_rs)) { - I32 bytesread; - char *buffer; - U32 recsize; -#ifdef VMS - int fd; -#endif - - /* Grab the size of the record we're getting */ - recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */ - buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append; - /* Go yank in */ -#ifdef VMS - /* VMS wants read instead of fread, because fread doesn't respect */ - /* RMS record boundaries. This is not necessarily a good thing to be */ - /* doing, but we've got no other real choice - except avoid stdio - as implementation - perhaps write a :vms layer ? - */ - fd = PerlIO_fileno(fp); - if (fd == -1) { /* in-memory file from PerlIO::Scalar */ - bytesread = PerlIO_read(fp, buffer, recsize); - } - else { - bytesread = PerlLIO_read(fd, buffer, recsize); - } -#else - bytesread = PerlIO_read(fp, buffer, recsize); -#endif - if (bytesread < 0) - bytesread = 0; - SvCUR_set(sv, bytesread + append); - buffer[bytesread] = '\0'; - goto return_string_or_null; + return S_sv_gets_read_record(aTHX_ sv, fp, append); } else if (RsPARA(PL_rs)) { rsptr = "\n\n"; @@ -7735,7 +7745,6 @@ screamer2: } } -return_string_or_null: return (SvCUR(sv) - append) ? SvPVX(sv) : NULL; } -- Perl5 Master Repository