#define NEED_sv_2pv_flags
#define NEED_newSVpvn_share
#include "ppport.h"
#ifdef __CYGWIN__
# define _alloca(size) __builtin_alloca(size)
# if defined(_WIN64) && !defined(WIN64)
# define WIN64
# endif
# define stricmp strcasecmp
# define strnicmp strncasecmp
#endif
#include <malloc.h>
#ifdef _MSC_VER
#define DISABLE_T_L_CALLS STMT_START {if(!DisableThreadLibraryCalls(hinstDLL)) return FALSE;} STMT_END
#else
#define DISABLE_T_L_CALLS STMT_START { 0; } STMT_END
#endif
#ifdef __GNUC__
# define PORTALIGN(x) __attribute__((aligned(x)))
#elif defined(_MSC_VER)
# if _MSC_VER > 1200
# define PORTALIGN(x) __declspec(align(x))
# else
# define PORTALIGN(x)
# endif
#else
# error unknown compiler
#endif
#ifdef WIN32_API_DEBUG
# define WIN32_API_DEBUGM(x) x
#else
# define WIN32_API_DEBUGM(x)
#endif
#ifdef WIN32_API_PROF
# define WIN32_API_PROFF(x) x
#else
# define WIN32_API_PROFF(x)
#endif
#ifdef WIN32_API_PROF
LARGE_INTEGER my_freq = {0};
LARGE_INTEGER start = {0};
LARGE_INTEGER loopprep = {0};
LARGE_INTEGER loopstart = {0};
LARGE_INTEGER Call_asm_b4 = {0};
LARGE_INTEGER Call_asm_after = {0};
LARGE_INTEGER return_time = {0};
LARGE_INTEGER return_time2 = {0};
LARGE_INTEGER start_loopprep = {0};
LARGE_INTEGER loopprep_loopstart = {0};
LARGE_INTEGER loopstart_Call_asm_b4 = {0};
LARGE_INTEGER Call_asm_b4_Call_asm_after = {0};
LARGE_INTEGER Call_asm_after_return_time = {0};
# ifndef WIN64
__declspec
(
naked
) unsigned
__int64
rdtsc () {
__asm
{
mov eax, 80000000h
push ebx
cpuid
_emit 0xf
_emit 0x31
pop ebx
retn
}
}
# define W32A_Prof_GT(x) ((x)->QuadPart = rdtsc())
# else
# define W32A_Prof_GT(x) (QueryPerformanceCounter(x))
# endif
#endif
#ifdef _WIN64
typedef
long
long
long_ptr;
typedef
unsigned
long
long
ulong_ptr;
#else
typedef
long
long_ptr;
typedef
unsigned
long
ulong_ptr;
#endif
#if defined(_MSC_VER) && _MSC_VER < 1300
typedef
DWORD
DWORD_PTR
;
#endif
#define T_VOID 0
#define T_NUMBER 1
#define T_INTEGER 2
#define T_SHORT 3
#define T_CHAR 4
#define T_NUMCHAR 5
#define T_POINTER 6
#define T_STRUCTURE 7
#define T_POINTERPOINTER 8
#define T_CODE 9
#define T_FLOAT 10
#define T_DOUBLE 11
#ifndef _WIN64
# define T_QUAD 12
# if ! (IVSIZE == 8)
# define USEMI64
# endif
#endif
#define T_FLAG_UNSIGNED (0x80)
#define T_FLAG_NUMERIC (0x40)
typedef
char
*ApiPointer(
void
);
typedef
long
ApiNumber(
void
);
typedef
float
ApiFloat(
void
);
typedef
double
ApiDouble(
void
);
typedef
void
ApiVoid(
void
);
typedef
int
ApiInteger(
void
);
typedef
short
ApiShort(
void
);
#ifdef T_QUAD
typedef
__int64
ApiQuad(
void
);
#endif
typedef
struct
{
union
{
LPBYTE
b;
char
c;
short
s;
char
*p;
long_ptr l;
ulong_ptr ul;
float
f;
double
d;
#ifdef T_QUAD
__int64
q;
#endif
};
unsigned
char
t;
unsigned
char
unused1;
unsigned
short
unused2;
unsigned
short
idx0;
unsigned
short
idx1;
} APIPARAM;
typedef
struct
{
union
{
LPBYTE
b;
char
c;
short
s;
char
*p;
long_ptr l;
ulong_ptr ul;
float
f;
double
d;
#ifdef T_QUAD
__int64
q;
#endif
};
} APIPARAM_U;
typedef
struct
{
SV* object;
int
size;
} APISTRUCT;
typedef
struct
{
SV* object;
} APICALLBACK;
#define CTRL_IS_MORE 0x10
#define CTRL_HAS_PROTO 0x20
typedef
struct
{
union
{
struct
{
unsigned
int
convention: 3;
unsigned
int
UseMI64: 1;
unsigned
int
is_more: 1;
unsigned
int
has_proto: 1;
#ifndef _WIN64
unsigned
int
reserved: 2;
unsigned
int
stackunwind: 16;
#else
unsigned
int
reserved: 18;
#endif
unsigned
int
out: 8;
};
U32 whole_bf;
};
U32 inparamlen;
FARPROC ApiFunction;
SV * api;
AV * intypes;
#if defined(_MSC_VER) && _MSC_VER <= 1200
U32 padding1;
U32 padding2;
#endif
PORTALIGN(16) APIPARAM param;
} APICONTROL;
#define APICONTROL_CC_STD 0
#define APICONTROL_CC_C 1
#define STATIC_ASSERT(expr) ((void)sizeof(char[1 - 2*!!!(expr)]))
#pragma pack(push)
#pragma pack(push, 1)
typedef
struct
{
wchar_t
null1;
wchar_t
null2;
LARGE_INTEGER counter;
} SENTINAL_STRUCT;
#pragma pack(pop)
#pragma pack(pop)
#ifndef mPUSHs
# define mPUSHs(s) PUSHs(sv_2mortal(s))
#endif
#ifndef mXPUSHs
# define mXPUSHs(s) XPUSHs(sv_2mortal(s))
#endif
#define W32APUSHMARK(p) \
STMT_START { \
++PL_markstack_ptr; \
*PL_markstack_ptr = (I32)((p) - PL_stack_base); \
} STMT_END
#define CALL_PL_ST_EXTEND 3
#if PERL_BCDVERSION >= 0x5007001
# define PREP_SV_SET(sv) if(SvTHINKFIRST((sv))) sv_force_normal_flags((sv), SV_COW_DROP_PV)
#else
# define PREP_SV_SET(sv) if(SvTHINKFIRST((sv))) sv_force_normal((sv))
#endif
#define W32AC_T HV
#define W32ACIATP_T HV
#undef ERROR
#ifndef WC_NO_BEST_FIT_CHARS
# define WC_NO_BEST_FIT_CHARS 0x00000400
#endif
#ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE
#define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params)
STATIC
void
S_croak_xs_usage(pTHX_
const
CV *
const
cv,
const
char
*
const
params);
STATIC
void
S_croak_xs_usage(pTHX_
const
CV *
const
cv,
const
char
*
const
params)
{
const
GV *
const
gv = CvGV(cv);
PERL_ARGS_ASSERT_CROAK_XS_USAGE;
if
(gv) {
const
char
*
const
gvname = GvNAME(gv);
const
HV *
const
stash = GvSTASH(gv);
const
char
*
const
hvname = stash ? HvNAME(stash) : NULL;
if
(hvname)
Perl_croak_nocontext(
"Usage: %s::%s(%s)"
, hvname, gvname, params);
else
Perl_croak_nocontext(
"Usage: %s(%s)"
, gvname, params);
}
else
{
Perl_croak_nocontext(
"Usage: CODE(0x%"
UVxf
")(%s)"
, PTR2UV(cv), params);
}
}
#ifdef PERL_IMPLICIT_CONTEXT
#define croak_xs_usage(a,b) S_croak_xs_usage(aTHX_ a,b)
#else
#define croak_xs_usage S_croak_xs_usage
#endif
#endif
#define PERL_VERSION_LE(R, V, S) (PERL_REVISION < (R) || \
(PERL_REVISION == (R) && (PERL_VERSION < (V) ||\
(PERL_VERSION == (V) && (PERL_SUBVERSION <= (S))))))
#if PERL_VERSION_LE(5, 13, 8)
STATIC MAGIC * my_find_mg(SV * sv,
int
type,
const
MGVTBL *vtbl){
MAGIC *mg;
for
(mg = SvMAGIC (sv); mg; mg = mg->mg_moremagic) {
if
(mg->mg_type == type && mg->mg_virtual == vtbl)
return
mg;
}
return
NULL;
}
#define mg_findext(a,b,c) my_find_mg(a,b,c)
#endif
#if PERL_VERSION_LE(5, 7, 2)
STATIC MAGIC *
my_sv_magicext(pTHX_ SV* sv, SV* obj,
int
how, MGVTBL *vtable,
const
char
* name, I32 namlen)
{
MAGIC* mg;
if
(SvTYPE(sv) < SVt_PVMG) {
(
void
)SvUPGRADE(sv, SVt_PVMG);
}
Newz(702,mg, 1, MAGIC);
mg->mg_moremagic = SvMAGIC(sv);
SvMAGIC(sv) = mg;
if
(!obj || obj == sv ||
how == PERL_MAGIC_arylen ||
how == PERL_MAGIC_qr ||
(SvTYPE(obj) == SVt_PVGV &&
(GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
GvFORM(obj) == (CV*)sv)))
{
mg->mg_obj = obj;
}
else
{
mg->mg_obj = SvREFCNT_inc(obj);
mg->mg_flags |= MGf_REFCOUNTED;
}
mg->mg_type = how;
mg->mg_len = namlen;
if
(name) {
if
(namlen > 0)
mg->mg_ptr = savepvn(name, namlen);
else
if
(namlen == HEf_SVKEY)
mg->mg_ptr = (
char
*)SvREFCNT_inc((SV*)name);
else
mg->mg_ptr = (
char
*) name;
}
mg->mg_virtual = vtable;
mg_magical(sv);
if
(SvGMAGICAL(sv))
SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
return
mg;
}
# ifdef PERL_IMPLICIT_CONTEXT
# define sv_magicext(a,b,c,d,e,f) my_sv_magicext(aTHX_ a,b,c,d,e,f)
# else
# define sv_magicext my_sv_magicext
# endif
#endif
#ifndef SVt_MASK
# define SVt_MASK SVTYPEMASK
#endif