blob: 6576719015eec6e4ca0db3e657370cc08447e7be [file] [log] [blame]
/* { 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;
}
}