#define SWIG_Error(code, msg) Rf_warning(msg); return Rf_ScalarLogical(NA_LOGICAL)

#define SWIG_fail return Rf_ScalarLogical(NA_LOGICAL)

/* for raw pointers */
#define SWIG_ConvertPtr(oc, ptr, ty, flags)             SWIG_R_ConvertPtr(oc, ptr, ty, flags)
#define SWIG_ConvertFunctionPtr(oc, ptr, ty)            SWIG_R_ConvertPtr(oc, ptr, ty, 0)
#define SWIG_NewPointerObj(ptr, ty, flags)              SWIG_R_NewPointerObj(ptr, ty, flags)
#define SWIG_NewFunctionPtrObj(ptr, ty)                 SWIG_R_NewPointerObj(ptr, ty, 0)

/* for raw packed data */
#define SWIG_ConvertPacked(obj, ptr, sz, ty)            SWIG_R_ConvertPacked(obj, ptr, sz, ty)
#define SWIG_NewPackedObj(ptr, sz, ty)                  SWIG_R_NewPackedObj(ptr, sz, ty)

/* for class or struct pointers */
#define SWIG_ConvertInstance(obj, pptr, ty, flags)      SWIG_ConvertPtr(obj, pptr, ty, flags)
#define SWIG_NewInstanceObj(ptr, ty, flags)             SWIG_NewPointerObj(ptr, ty, flags)

/* for C++ member pointers, ie, member methods */
#define SWIG_ConvertMember(obj, ptr, sz, ty)            SWIG_R_ConvertPacked(obj, ptr, sz, ty)
#define SWIG_NewMemberObj(ptr, sz, ty)                  SWIG_R_NewPackedObj(ptr, sz, ty)


/* Runtime API */

#define SWIG_GetModule(clientdata)                      SWIG_R_GetModule()
#define SWIG_SetModule(clientdata, pointer)             SWIG_R_SetModule(pointer)

%fragment(SWIG_From_frag(long),"header") {
SWIGINTERNINLINE SEXP
SWIG_From_dec(long)(long value)
{
	return Rf_ScalarInteger((int)value);
}
}

%fragment(SWIG_AsVal_frag(long),"header") {
SWIGINTERNINLINE  int
SWIG_AsVal_dec(long)(SEXP obj, long *val)
{
   if (val) *val = Rf_asInteger(obj);
   return SWIG_OK;
}
}


%fragment(SWIG_From_frag(long long),"header") {
SWIGINTERNINLINE SEXP
SWIG_From_dec(long long)(long long value)
{
	return Rf_ScalarInteger((int)value);
}
}

%fragment(SWIG_AsVal_frag(long long),"header") {
SWIGINTERNINLINE  int
SWIG_AsVal_dec(long long)(SEXP obj, long long *val)
{
   if (val) *val = Rf_asInteger(obj);
   return SWIG_OK;
}
}

%fragment(SWIG_From_frag(unsigned long),"header") {
SWIGINTERNINLINE SEXP
SWIG_From_dec(unsigned long)(unsigned long value)
{
	return Rf_ScalarInteger((int)value);
}
}


%fragment(SWIG_AsVal_frag(unsigned long),"header") {
SWIGINTERNINLINE  int
SWIG_AsVal_dec(unsigned long)(SEXP obj, unsigned long *val)
{
   if (val) *val = Rf_asInteger(obj);
   return SWIG_OK;
}
}


%fragment(SWIG_From_frag(unsigned long long),"header") {
SWIGINTERNINLINE SEXP
SWIG_From_dec(unsigned long long)(unsigned long long value)
{
	return Rf_ScalarInteger((int)value);
}
}


%fragment(SWIG_AsVal_frag(unsigned long long),"header") {
SWIGINTERNINLINE  int
SWIG_AsVal_dec(unsigned long long)(SEXP obj, unsigned long long *val)
{
   if (val) *val = Rf_asInteger(obj);
   return SWIG_OK;
}
}

%fragment(SWIG_From_frag(double),"header") {
SWIGINTERNINLINE SEXP
SWIG_From_dec(double)(double value)
{
	return Rf_ScalarReal(value);
}
}


%fragment(SWIG_AsVal_frag(double),"header") {
SWIGINTERNINLINE  int
SWIG_AsVal_dec(double)(SEXP obj, double *val)
{
   if (val) *val = Rf_asReal(obj);
   return SWIG_OK;
}
}

%fragment("SWIG_AsCharPtrAndSize", "header") 
{
SWIGINTERN int
SWIG_AsCharPtrAndSize(SEXP obj, char** cptr, size_t* psize, int *alloc)
{
  if (cptr && Rf_isString(obj)) {
    const char *cstr = CHAR(STRING_ELT(obj, 0));
    int len = strlen(cstr);

    if (alloc) {
      if (*alloc == SWIG_NEWOBJ) {
        *cptr = %new_copy_array(cstr, len + 1, char);
        *alloc = SWIG_NEWOBJ;
      } else {
        *cptr = %reinterpret_cast(malloc(len + 1), char *);
        *cptr = strcpy(*cptr, cstr);
        *alloc = SWIG_OLDOBJ;
      }
    } else {
      *cptr = %reinterpret_cast(malloc(len + 1), char *);
      *cptr = strcpy(*cptr, cstr);
    }
    if (psize) *psize = len + 1;
    return SWIG_OK;
  }
  return SWIG_TypeError;
}
}

%fragment("SWIG_strdup","header") 
{
SWIGINTERN char *
SWIG_strdup(const char *str)
{
  char *newstr = %reinterpret_cast(malloc(strlen(str) + 1), char *);
  return strcpy(newstr, str);
}
}

# This is modified from the R header files

%fragment("SWIG_FromCharPtrAndSize","header") 
{
SWIGINTERN SEXP
SWIG_FromCharPtrAndSize(const char* carray, size_t size) 
{
  SEXP t, c;
  if (!carray) return R_NilValue;
  Rf_protect(t = Rf_allocVector(STRSXP, 1));
  c = Rf_allocVector(CHARSXP, size);
  strncpy((char *)CHAR(c), carray, size);
  SET_STRING_ELT(t, 0, c);
  Rf_unprotect(1);
  return t;
}
}
