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 */
  
  
  

Reply via email to