#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "../../ppport.h" #include "token.h" #undef MIN #define MIN(x,y) ((x)<(y)?(x):(y)) typedef enum { VALUE_TYPE_UNDEF, VALUE_TYPE_INT, VALUE_TYPE_DOUBLE, VALUE_TYPE_BOOL, VALUE_TYPE_STR, VALUE_TYPE_ARRAY, VALUE_TYPE_HASH, VALUE_TYPE_CODE, VALUE_TYPE_RANGE, VALUE_TYPE_REGEXP, VALUE_TYPE_REGEXP_MATCHED, VALUE_TYPE_EXCEPTION, VALUE_TYPE_FILE_PACKAGE, VALUE_TYPE_PERL_PACKAGE, VALUE_TYPE_PERL_OBJECT, VALUE_TYPE_CLASS, VALUE_TYPE_OBJECT } value_type_t; value_type_t tora_detect_value_type(SV *v) { if (!SvOK(v)) { return VALUE_TYPE_UNDEF; } else if (sv_isobject(v)) { #define FOO(x, y) do { if (sv_isa(v, x)) { return y; } } while (0) FOO("Nana::Translator::Perl::Range", VALUE_TYPE_RANGE); FOO("Nana::Translator::Perl::Object", VALUE_TYPE_OBJECT); FOO("Nana::Translator::Perl::Class", VALUE_TYPE_CLASS); FOO("Nana::Translator::Perl::Regexp", VALUE_TYPE_REGEXP); FOO("Nana::Translator::Perl::RegexpMatched", VALUE_TYPE_REGEXP_MATCHED); FOO("Nana::Translator::Perl::Exception", VALUE_TYPE_EXCEPTION); FOO("Nana::Translator::Perl::FilePackage", VALUE_TYPE_FILE_PACKAGE); FOO("Nana::Translator::Perl::PerlPackage", VALUE_TYPE_PERL_PACKAGE); FOO("Nana::Translator::Perl::PerlObject", VALUE_TYPE_PERL_OBJECT); FOO("JSON::XS::Boolean", VALUE_TYPE_BOOL); #undef FOO } else if (SvROK(v)) { SV *body = SvRV(v); switch (SvTYPE(body)) { case SVt_PVAV: return VALUE_TYPE_ARRAY; case SVt_PVHV: return VALUE_TYPE_HASH; case SVt_PVCV: return VALUE_TYPE_CODE; default: sv_dump(v); croak("[BUG] Unknown type"); } } else { if (SvIOK(v) && !SvPOK(v)) { return VALUE_TYPE_INT; } if (SvNOK(v) && !SvPOK(v)) { return VALUE_TYPE_DOUBLE; } return VALUE_TYPE_STR; } sv_dump(v); croak("[BUG] Unknown type"); } static int skip_ws(char *src, size_t len, int *found_end, int *lineno_inc) { int seen_nl = 0; char *end = src+len; char *p = src; *found_end = 0; while (p