Change 18247 by jhi@lyta on 2002/12/06 13:40:10

        More comments and robustness in pp_ucfirst() and pp_lcfirst().

Affected files ...

.... //depot/maint-5.8/perl/pp.c#4 edit

Differences ...

==== //depot/maint-5.8/perl/pp.c#4 (text) ====
Index: perl/pp.c
--- perl/pp.c#3~18126~  Sat Nov  9 11:00:47 2002
+++ perl/pp.c   Fri Dec  6 05:40:10 2002
@@ -3325,7 +3325,9 @@
     STRLEN slen;
 
     SvGETMAGIC(sv);
-    if (DO_UTF8(sv) && (s = (U8*)SvPV_nomg(sv, slen)) && slen && UTF8_IS_START(*s)) {
+    if (DO_UTF8(sv) &&
+       (s = (U8*)SvPV_nomg(sv, slen)) && slen &&
+       UTF8_IS_START(*s)) {
        U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
        STRLEN ulen;
        STRLEN tculen;
@@ -3336,8 +3338,16 @@
 
        if (!SvPADTMP(sv) || SvREADONLY(sv)) {
            dTARGET;
+           /* slen is the byte length of the whole SV.
+            * ulen is the byte length of the original Unicode character
+            * stored as UTF-8 at s.
+            * tculen is the byte length of the freshly titlecased
+            * Unicode character stored as UTF-8 at tmpbuf.
+            * We first set the result to be the titlecased character,
+            * and then append the rest of the SV data. */
            sv_setpvn(TARG, (char*)tmpbuf, tculen);
-           sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
+           if (slen > ulen)
+               sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
            SvUTF8_on(TARG);
            SETs(TARG);
        }
@@ -3377,7 +3387,9 @@
     STRLEN slen;
 
     SvGETMAGIC(sv);
-    if (DO_UTF8(sv) && (s = (U8*)SvPV_nomg(sv, slen)) && slen && UTF8_IS_START(*s)) {
+    if (DO_UTF8(sv) &&
+       (s = (U8*)SvPV_nomg(sv, slen)) && slen &&
+       UTF8_IS_START(*s)) {
        STRLEN ulen;
        U8 tmpbuf[UTF8_MAXLEN_UCLC+1];
        U8 *tend;
@@ -3390,7 +3402,8 @@
        if (!SvPADTMP(sv) || (STRLEN)(tend - tmpbuf) != ulen || SvREADONLY(sv)) {
            dTARGET;
            sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
-           sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
+           if (slen > ulen)
+               sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
            SvUTF8_on(TARG);
            SETs(TARG);
        }
End of Patch.

Reply via email to