/* global debug var -- set with swish_init() */
extern int SWISH_DEBUG;
#define CONFIG_CLASS "SWISH::3::Config"
#define CONFIG_CLASS_KEY "sp_config_class"
#define ANALYZER_CLASS "SWISH::3::Analyzer"
#define ANALYZER_CLASS_KEY "sp_analyzer_class"
#define PARSER_CLASS "SWISH::3::Parser"
#define PARSER_CLASS_KEY "sp_parser_class"
#define DATA_CLASS "SWISH::3::Data"
#define DATA_CLASS_KEY "sp_data_class"
#define TOKEN_CLASS "SWISH::3::Token"
#define TOKENITERATOR_CLASS "SWISH::3::TokenIterator"
#define DOC_CLASS "SWISH::3::Doc"
#define PROPERTY_CLASS "SWISH::3::Property"
#define METANAME_CLASS "SWISH::3::MetaName"
#define PROPERTY_HASH_CLASS "SWISH::3::PropertyHash"
#define METANAME_HASH_CLASS "SWISH::3::MetaNameHash"
#define XML2_HASH_CLASS "SWISH::3::xml2Hash"
#define SELF_KEY "sp_self"
#define CONFIG_KEY "sp_config"
#define ANALYZER_KEY "sp_analyzer"
#define HANDLER_KEY "sp_handler"
#define TOKENIZER_KEY "sp_tokenizer"
#define PARSER_KEY "sp_parser"
#define SELF_CLASS_KEY "sp_self_class"
/* some nice XS macros from KS - thanks Marvin! */
#define START_SET_OR_GET_SWITCH \
RETVAL = &PL_sv_undef; \
I32 gimme = GIMME_V; \
/* if called as a setter, make sure the extra arg is there */ \
if (ix % 2 == 1) { \
if (items < 2) \
croak("usage: $object->set_xxxxxx($val)"); \
\
if (!SvTRUE(ST(1))) \
croak("usage: requires true value"); \
} \
else { \
if (items > 2) \
croak("usage: $object->get_xxxxx()"); \
} \
switch (ix) {
#define END_SET_OR_GET_SWITCH \
default: croak("Internal error. ix: %d", (int)ix); \
break; /* probably unreachable */ \
} \
if (ix % 2 == 0) { \
/* warn("refcnt of object %s == %d\n", SvPV(RETVAL, PL_na), SvREFCNT(RETVAL)); */ \
XPUSHs( RETVAL ); \
XSRETURN(1); \
} \
else { \
XSRETURN(0); \
}