/* handy macros for RETVAL */

#define get_set_PVp(thing,p) \
    RETVAL = (char*)thing; \
    if(items > 1) \
        thing = (char*)(SvOK(ST(1)) ? pstrdup(p, SvPV(ST(1),na)) : NULL)

#define get_set_PV(thing) \
    get_set_PVp(thing,r->pool)

#define get_set_IV(thing) \
    RETVAL = thing; \
    if(items > 1) \
        thing = (int)SvIV(ST(1))

#define TABLE_GET_SET(table, do_taint) \
if(key == NULL) { \
    ST(0) = table ? mod_perl_tie_table(table) : &sv_undef; \
    XSRETURN(1); \
} \
else { \
    char *val; \
    if(table && (val = (char *)table_get(table, key))) \
	RETVAL = newSVpv(val, 0); \
    else \
        RETVAL = newSV(0); \
    if(do_taint) SvTAINTED_on(RETVAL); \
    if(table && (items > 2)) { \
	if(ST(2) == &sv_undef) \
	    table_unset(table, key); \
	else \
	    table_set(table, key, SvPV(ST(2),na)); \
    } \
}

#define MP_CHECK_REQ(r,f) \
    if(!r) croak("`%s' called without setting Apache->request!", f)

/* for Apache::fork, should no longer need */
#ifdef Apache__fork
extern listen_rec *listeners;
extern int mod_perl_socketexitoption;
extern int mod_perl_weareaforkedchild;   
#define Apache_exit_is_done(sts) \
 ((sts == DONE) || (mod_perl_weareaforkedchild && (mod_perl_socketexitoption > 1)))  
#else 
#define Apache_exit_is_done(sts) (sts == DONE)
#endif

