void Clipboard_close( Handle self) { PClipboardFormatReg text, utf8; if ( var-> openCount <= 0) { var-> openCount = 0; return; } var-> openCount--; if ( var-> openCount > 0) return; text = formats + cfText; utf8 = formats + cfUTF8; /* automatically downgrade UTF8 to TEXT */ if ( utf8-> written && !text-> written) { SV *utf8_sv, *text_sv; if (( utf8_sv = utf8-> server( self, utf8, cefFetch, nilSV))) { STRLEN bytelen, charlen, bytecount; U8 * src; src = ( U8 *) SvPV( utf8_sv, bytelen); bytecount = bytelen; text_sv = newSVpvn("", 0); while ( bytecount > 0) { register UV u = #if PERL_PATCHLEVEL >= 16 utf8_to_uvchr_buf( src, src + bytelen, &charlen) #else utf8_to_uvchr( src, &charlen) #endif ; char c = ( u < 0x7f) ? u : '?'; src += charlen; bytecount -= charlen; sv_catpvn( text_sv, &c, 1); if ( charlen == 0 ) break; } text-> server( self, text, cefFetch, text_sv); sv_free( text_sv); } } apc_clipboard_close( self); }
STATIC I32 S_do_trans_complex(pTHX_ SV *sv) { U8 *s; U8 *send; U8 *d; U8 *dstart; I32 isutf8; I32 matches = 0; I32 grows = PL_op->op_private & OPpTRANS_GROWS; I32 complement = PL_op->op_private & OPpTRANS_COMPLEMENT; I32 del = PL_op->op_private & OPpTRANS_DELETE; STRLEN len, rlen = 0; short *tbl; I32 ch; tbl = (short*)cPVOP->op_pv; if (!tbl) Perl_croak(aTHX_ "panic: do_trans_complex line %d",__LINE__); s = (U8*)SvPV(sv, len); isutf8 = SvUTF8(sv); send = s + len; if (!isutf8) { dstart = d = s; if (PL_op->op_private & OPpTRANS_SQUASH) { U8* p = send; while (s < send) { if ((ch = tbl[*s]) >= 0) { *d = (U8)ch; matches++; if (p != d - 1 || *p != *d) p = d++; } else if (ch == -1) /* -1 is unmapped character */ *d++ = *s; else if (ch == -2) /* -2 is delete character */ matches++; s++; } } else { while (s < send) { if ((ch = tbl[*s]) >= 0) { matches++; *d++ = (U8)ch; } else if (ch == -1) /* -1 is unmapped character */ *d++ = *s; else if (ch == -2) /* -2 is delete character */ matches++; s++; } } *d = '\0'; SvCUR_set(sv, d - dstart); } else { /* isutf8 */ if (grows) New(0, d, len*2+1, U8); else d = s; dstart = d; if (complement && !del) rlen = tbl[0x100]; #ifdef MACOS_TRADITIONAL #define comp CoMP /* "comp" is a keyword in some compilers ... */ #endif if (PL_op->op_private & OPpTRANS_SQUASH) { UV pch = 0xfeedface; while (s < send) { STRLEN len; UV comp = utf8_to_uvchr(s, &len); if (comp > 0xff) { if (!complement) { Copy(s, d, len, U8); d += len; } else { matches++; if (!del) { ch = (rlen == 0) ? comp : (comp - 0x100 < rlen) ? tbl[comp+1] : tbl[0x100+rlen]; if ((UV)ch != pch) { d = uvchr_to_utf8(d, ch); pch = (UV)ch; } s += len; continue; } } } else if ((ch = tbl[comp]) >= 0) { matches++; if ((UV)ch != pch) { d = uvchr_to_utf8(d, ch); pch = (UV)ch; } s += len; continue; } else if (ch == -1) { /* -1 is unmapped character */ Copy(s, d, len, U8); d += len; } else if (ch == -2) /* -2 is delete character */ matches++; s += len; pch = 0xfeedface; } } else { while (s < send) { STRLEN len; UV comp = utf8_to_uvchr(s, &len); if (comp > 0xff) { if (!complement) { Move(s, d, len, U8); d += len; } else { matches++; if (!del) { if (comp - 0x100 < rlen) d = uvchr_to_utf8(d, tbl[comp+1]); else d = uvchr_to_utf8(d, tbl[0x100+rlen]); } } } else if ((ch = tbl[comp]) >= 0) { d = uvchr_to_utf8(d, ch); matches++; } else if (ch == -1) { /* -1 is unmapped character */ Copy(s, d, len, U8); d += len; } else if (ch == -2) /* -2 is delete character */ matches++; s += len; } } if (grows) { sv_setpvn(sv, (char*)dstart, d - dstart); Safefree(dstart); } else { *d = '\0'; SvCUR_set(sv, d - dstart); } SvUTF8_on(sv); } SvSETMAGIC(sv); return matches; }