dougm 01/03/04 19:48:15
Added: xs modperl_xs_util.h
Log:
utilties for extensions
Revision Changes Path
1.1 modperl-2.0/xs/modperl_xs_util.h
Index: modperl_xs_util.h
===================================================================
#ifndef MODPERL_XS_H
#define MODPERL_XS_H
#ifndef dAX
# define dAX I32 ax = mark - PL_stack_base + 1
#endif
#ifndef dITEMS
# define dITEMS I32 items = SP - MARK
#endif
#define mpxs_sv_grow(sv, len) \
(void)SvUPGRADE(sv, SVt_PV); \
SvGROW(sv, len+1)
#define mpxs_sv_cur_set(sv, len) \
SvCUR_set(sv, len); \
*SvEND(sv) = '\0'; \
SvPOK_only(sv)
#define mpxs_set_targ(func, arg) \
STMT_START { \
dXSTARG; \
XSprePUSH; \
func(aTHX_ TARG, arg); \
PUSHTARG; \
XSRETURN(1); \
} STMT_END
#define mpxs_cv_name() \
HvNAME(GvSTASH(CvGV(cv))), GvNAME(CvGV(cv))
#define mpxs_sv_is_object(sv) \
(SvROK(sv) && (SvTYPE(SvRV(sv)) == SVt_PVMG))
#define mpxs_sv_object_deref(sv) \
(mpxs_sv_is_object(sv) ? SvIV((SV*)SvRV(sv)) : NULL)
#define mpxs_sv2_obj(obj, sv) \
(obj = mp_xs_sv2_##obj(sv))
#define mpxs_usage_items_1(arg) \
if (items != 1) { \
Perl_croak(aTHX_ "usage: %s::%s(%s)", \
mpxs_cv_name(), arg); \
}
#define mpxs_usage_va(i, obj, msg) \
if ((items < i) || !(mpxs_sv2_obj(obj, *MARK))) \
croak("usage: %s", msg); \
MARK++
#define mpxs_usage_va_1(obj, msg) mpxs_usage_va(1, obj, msg)
#define mpxs_usage_va_2(obj, arg, msg) \
mpxs_usage_va(2, obj, msg); \
arg = *MARK++
#endif /* MODPERL_XS_H */