#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"

#include "ffi_pl_lang_cpp_demangle.h"

MODULE = FFI::Platypus::Lang::CPP::Demangle::XS   PACKAGE = FFI::Platypus::Lang::CPP::Demangle::XS

void
demangle(c_symbol)
    SV *c_symbol
  PREINIT:
    const char *demangled;
  CODE:
    if(!SvOK(c_symbol))
    {
      ffi_pl_lang_cpp_demangle(NULL);
      XSRETURN_EMPTY;
    }
  
    demangled = ffi_pl_lang_cpp_demangle((const char *)SvPV_nolen(c_symbol));
    
    if(demangled == NULL)
    {
      switch(ffi_pl_lang_cpp_demangle_status)
      {
        case 0:
          croak("oops shouldn't get here");
          break;
        case -1:
          croak("C++ ABI API memory allocation failure\n");
          break;
        case -2:
          XSRETURN_EMPTY;
          break;
        case -3:
          croak("C++ ABI API invalid arguments\n");
          break;
        default:
          croak("C++ ABI API unknown error\n");
          break;
      }
    }
    
    XSRETURN_PV(demangled);