| /* { dg-do compile } */ |
| |
| typedef __SIZE_TYPE__ size_t; |
| typedef unsigned long UV; |
| typedef size_t STRLEN; |
| typedef struct sv SV; |
| typedef struct magic MAGIC; |
| typedef struct xpv XPV; |
| typedef unsigned char U8; |
| typedef int I32; |
| typedef unsigned int U32; |
| struct sv { |
| void* sv_any; |
| U32 sv_flags; |
| }; |
| struct xpv { |
| char * xpv_pv; |
| STRLEN xpv_cur; |
| }; |
| struct magic { |
| char* mg_ptr; |
| }; |
| extern const unsigned char PL_utf8skip[]; |
| char *Perl_sv_2pv_flags (STRLEN *); |
| void Perl_utf8n_to_uvuni (U8 *); |
| void Perl_sv_magic (SV *); |
| void Perl_sv_pos_b2u( register SV* sv, I32* offsetp, MAGIC *mg) |
| { |
| U8* s; |
| STRLEN len; |
| s = (U8*)(((sv)->sv_flags & (0x00040000)) == 0x00040000 |
| ? ((len = ((XPV*) (sv)->sv_any)->xpv_cur), ((XPV*) (sv)->sv_any)->xpv_pv) |
| : Perl_sv_2pv_flags(&len)); |
| if ((I32)len < *offsetp) |
| ; |
| else |
| { |
| STRLEN *cache = ((void *)0); |
| if (((sv)->sv_flags & (0x00002000|0x00004000|0x00008000)) |
| && !((sv)->sv_flags & 0x00800000)) |
| { |
| if (mg && mg->mg_ptr) |
| { |
| cache = (STRLEN *) mg->mg_ptr; |
| STRLEN forw = *offsetp; |
| STRLEN backw = cache[1] - *offsetp; |
| if (!(forw < 2 * backw)) |
| { |
| U8 *p = s + cache[1]; |
| STRLEN ubackw = 0; |
| cache[1] -= backw; |
| while (backw--) |
| { |
| p--; |
| while ((((U8)*p) >= 0x80 && (((U8)*p) <= 0xbf))) |
| { |
| p--; |
| backw--; |
| } |
| ubackw++; |
| } |
| cache[0] -= ubackw; |
| *offsetp = cache[0]; |
| cache[2] = 0; |
| cache[3] = 0; |
| return; |
| } |
| } |
| if (!(((UV)(*s)) < 0x80)) |
| Perl_utf8n_to_uvuni(s); |
| } |
| if (!((sv)->sv_flags & 0x00800000)) |
| { |
| if (!mg) |
| Perl_sv_magic(sv); |
| cache[0] = len; |
| cache[1] = *offsetp; |
| } |
| *offsetp = len; |
| } |
| } |