home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / MacPerl 5.1.3 / Mac_Perl_513_src / perl5.002 / pp.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-14  |  6.2 KB  |  205 lines  |  [TEXT/MPS ]

  1. /*    pp.h
  2.  *
  3.  *    Copyright (c) 1991-1994, Larry Wall
  4.  *
  5.  *    You may distribute under the terms of either the GNU General Public
  6.  *    License or the Artistic License, as specified in the README file.
  7.  *
  8.  */
  9.  
  10. #define ARGS
  11. #define ARGSproto void
  12. #define dARGS
  13. #define PP(s) OP* s(ARGS) dARGS
  14.  
  15. #define SP sp
  16. #define MARK mark
  17. #define TARG targ
  18.  
  19. #define PUSHMARK(p) if (++markstack_ptr == markstack_max)    \
  20.             markstack_grow();            \
  21.             *markstack_ptr = (p) - stack_base
  22.  
  23. #define TOPMARK        (*markstack_ptr)
  24. #define POPMARK        (*markstack_ptr--)
  25.  
  26. #define dSP        register SV **sp = stack_sp
  27. #define dMARK        register SV **mark = stack_base + POPMARK
  28. #define dORIGMARK    I32 origmark = mark - stack_base
  29. #define SETORIGMARK    origmark = mark - stack_base
  30. #define ORIGMARK    (stack_base + origmark)
  31.  
  32. #define SPAGAIN        sp = stack_sp
  33. #define MSPAGAIN    sp = stack_sp; mark = ORIGMARK
  34.  
  35. #define GETTARGETSTACKED targ = (op->op_flags & OPf_STACKED ? POPs : PAD_SV(op->op_targ))
  36. #define dTARGETSTACKED SV * GETTARGETSTACKED
  37.  
  38. #define GETTARGET targ = PAD_SV(op->op_targ)
  39. #define dTARGET SV * GETTARGET
  40.  
  41. #define GETATARGET targ = (op->op_flags & OPf_STACKED ? sp[-1] : PAD_SV(op->op_targ))
  42. #define dATARGET SV * GETATARGET
  43.  
  44. #define dTARG SV *targ
  45.  
  46. #define NORMAL op->op_next
  47. #define DIE return die
  48.  
  49. #define PUTBACK        stack_sp = sp
  50. #define RETURN        return PUTBACK, NORMAL
  51. #define RETURNOP(o)    return PUTBACK, o
  52. #define RETURNX(x)    return x, PUTBACK, NORMAL
  53.  
  54. #define POPs        (*sp--)
  55. #define POPp        (SvPVx(POPs, na))
  56. #define POPn        (SvNVx(POPs))
  57. #define POPi        ((IV)SvIVx(POPs))
  58. #define POPl        ((long)SvIVx(POPs))
  59. #ifdef macintosh
  60. #define POPu        SvUVx(POPs)
  61. #endif
  62.  
  63. #define TOPs        (*sp)
  64. #define TOPp        (SvPV(TOPs, na))
  65. #define TOPn        (SvNV(TOPs))
  66. #define TOPi        ((IV)SvIV(TOPs))
  67. #define TOPl        ((long)SvIV(TOPs))
  68. #ifdef macintosh
  69. #define TOPu        SvUV(TOPs)
  70. #endif
  71.  
  72. /* Go to some pains in the rare event that we must extend the stack. */
  73. #define EXTEND(p,n)    STMT_START { if (stack_max - p < (n)) {                  \
  74.                 sp = stack_grow(sp,p, (int) (n));            \
  75.             } } STMT_END
  76.  
  77. /* Same thing, but update mark register too. */
  78. #define MEXTEND(p,n)    STMT_START {if (stack_max - p < (n)) {                \
  79.                 int markoff = mark - stack_base;            \
  80.                 sp = stack_grow(sp,p,(int) (n));            \
  81.                 mark = stack_base + markoff;            \
  82.             } } STMT_END
  83.  
  84. #define PUSHs(s)    (*++sp = (s))
  85. #define PUSHTARG    STMT_START { SvSETMAGIC(TARG); PUSHs(TARG); } STMT_END
  86. #define PUSHp(p,l)    STMT_START { sv_setpvn(TARG, (p), (l)); PUSHTARG; } STMT_END
  87. #define PUSHn(n)    STMT_START { sv_setnv(TARG, (double)(n)); PUSHTARG; } STMT_END
  88. #define PUSHi(i)    STMT_START { sv_setiv(TARG, (IV)(i)); PUSHTARG; } STMT_END
  89.  
  90. #define XPUSHs(s)    STMT_START { EXTEND(sp,1); (*++sp = (s)); } STMT_END
  91. #define XPUSHTARG    STMT_START { SvSETMAGIC(TARG); XPUSHs(TARG); } STMT_END
  92. #define XPUSHp(p,l)    STMT_START { sv_setpvn(TARG, (p), (l)); XPUSHTARG; } STMT_END
  93. #define XPUSHn(n)    STMT_START { sv_setnv(TARG, (double)(n)); XPUSHTARG; } STMT_END
  94. #define XPUSHi(i)    STMT_START { sv_setiv(TARG, (IV)(i)); XPUSHTARG; } STMT_END
  95.  
  96. #define SETs(s)        (*sp = s)
  97. #define SETTARG        STMT_START { SvSETMAGIC(TARG); SETs(TARG); } STMT_END
  98. #define SETp(p,l)    STMT_START { sv_setpvn(TARG, (p), (l)); SETTARG; } STMT_END
  99. #define SETn(n)        STMT_START { sv_setnv(TARG, (double)(n)); SETTARG; } STMT_END
  100. #define SETi(i)        STMT_START { sv_setiv(TARG, (IV)(i)); SETTARG; } STMT_END
  101.  
  102. #ifdef OVERLOAD
  103. #define SETsv(sv)    STMT_START { sv_setsv(TARG, (sv)); SETTARG; } STMT_END
  104. #endif /* OVERLOAD */
  105.  
  106. #define dTOPss        SV *sv = TOPs
  107. #define dPOPss        SV *sv = POPs
  108. #define dTOPnv        double value = TOPn
  109. #define dPOPnv        double value = POPn
  110. #define dTOPiv        IV value = TOPi
  111. #define dPOPiv        IV value = POPi
  112.  
  113. #define dPOPPOPssrl    SV *right = POPs; SV *left = POPs
  114. #define dPOPPOPnnrl    double right = POPn; double left = POPn
  115. #define dPOPPOPiirl    IV right = POPi; IV left = POPi
  116.  
  117. #define dPOPTOPssrl    SV *right = POPs; SV *left = TOPs
  118. #define dPOPTOPnnrl    double right = POPn; double left = TOPn
  119. #define dPOPTOPiirl    IV right = POPi; IV left = TOPi
  120. #ifdef macintosh
  121. #define dPOPTOPuurl    IV right = (IV)POPu; IV left = (IV)TOPu
  122. #else
  123. #define dPOPTOPuurl    dPOPTOPiirl
  124. #endif
  125.  
  126. #define RETPUSHYES    RETURNX(PUSHs(&sv_yes))
  127. #define RETPUSHNO    RETURNX(PUSHs(&sv_no))
  128. #define RETPUSHUNDEF    RETURNX(PUSHs(&sv_undef))
  129.  
  130. #define RETSETYES    RETURNX(SETs(&sv_yes))
  131. #define RETSETNO    RETURNX(SETs(&sv_no))
  132. #define RETSETUNDEF    RETURNX(SETs(&sv_undef))
  133.  
  134. #define ARGTARG        op->op_targ
  135. #define MAXARG        op->op_private
  136.  
  137. #define SWITCHSTACK(f,t)    AvFILL(f) = sp - stack_base;        \
  138.                 stack_base = AvARRAY(t);        \
  139.                 stack_max = stack_base + AvMAX(t);    \
  140.                 sp = stack_sp = stack_base + AvFILL(t);    \
  141.                 stack = t;
  142.  
  143. #ifdef OVERLOAD
  144.  
  145. #define AMGf_noright    1
  146. #define AMGf_noleft    2
  147. #define AMGf_assign    4
  148. #define AMGf_unary    8
  149.  
  150. #define tryAMAGICbinW(meth,assign,set) STMT_START { \
  151.           if (amagic_generation) { \
  152.         SV* tmpsv; \
  153.         SV* right= *(sp); SV* left= *(sp-1);\
  154.         if ((SvAMAGIC(left)||SvAMAGIC(right))&&\
  155.         (tmpsv=amagic_call(left, \
  156.                    right, \
  157.                    CAT2(meth,_amg), \
  158.                    (assign)? AMGf_assign: 0))) {\
  159.            SPAGAIN;    \
  160.            (void)POPs; set(tmpsv); RETURN; } \
  161.       } \
  162.     } STMT_END
  163.  
  164. #define tryAMAGICbin(meth,assign) tryAMAGICbinW(meth,assign,SETsv)
  165. #define tryAMAGICbinSET(meth,assign) tryAMAGICbinW(meth,assign,SETs)
  166.  
  167. #define AMG_CALLun(sv,meth) amagic_call(sv,&sv_undef,  \
  168.                     CAT2(meth,_amg),AMGf_noright | AMGf_unary)
  169. #define AMG_CALLbinL(left,right,meth) \
  170.             amagic_call(left,right,CAT2(meth,_amg),AMGf_noright)
  171.  
  172. #define tryAMAGICunW(meth,set) STMT_START { \
  173.           if (amagic_generation) { \
  174.         SV* tmpsv; \
  175.         SV* arg= *(sp); \
  176.         if ((SvAMAGIC(arg))&&\
  177.         (tmpsv=AMG_CALLun(arg,meth))) {\
  178.            SPAGAIN;    \
  179.            set(tmpsv); RETURN; } \
  180.       } \
  181.     } STMT_END
  182.  
  183. #define tryAMAGICun(meth) tryAMAGICunW(meth,SETsv)
  184. #define tryAMAGICunSET(meth) tryAMAGICunW(meth,SETs)
  185.  
  186. #define opASSIGN (op->op_flags & OPf_STACKED)
  187.  
  188. /* newSVsv does not behave as advertised, so we copy missing
  189.  * information by hand */
  190.  
  191.  
  192. #define RvDEEPCP(rv) STMT_START { SV* ref=SvRV(rv);      \
  193.   if (SvREFCNT(ref)>1) {                 \
  194.     SvREFCNT_dec(ref);                   \
  195.     SvRV(rv)=AMG_CALLun(rv,copy);        \
  196.   } } STMT_END
  197. #else
  198.  
  199. #define tryAMAGICbin(a,b)
  200. #define tryAMAGICbinSET(a,b)
  201. #define tryAMAGICun(a)
  202. #define tryAMAGICunSET(a)
  203.  
  204. #endif /* OVERLOAD */
  205.