%module native_directive

%{
#include <ctype.h>
int alpha_count(const char *instring) {
  int count = 0;
  const char *s = instring;
  while (s && *s) {
    if (isalpha((int)*s))
      count++;
    s++;
  };
  return count;
}
%}

%inline %{
int CountAlphas(const char *instring) {
  return alpha_count(instring);
}
%}

// Languages that support %native should code up language specific implementations below

#if defined(SWIGJAVA)
%native(CountAlphaCharacters) int alpha_count(const char *inputString);
%{
extern "C" JNIEXPORT jint JNICALL Java_native_1directive_native_1directiveJNI_CountAlphaCharacters(JNIEnv *jenv, jclass jcls, jstring instring) {
  jint jresult = 0 ;
  (void)jcls;

  if (instring) {
    const char *s = (char *)jenv->GetStringUTFChars(instring, 0);
    if (s) {
      jresult = (jint)alpha_count(s);
      jenv->ReleaseStringUTFChars(instring, s);
    }
  }
  return jresult;
}
%}
#endif


// TODO: C#
// TODO: Python


#ifdef SWIGJAVASCRIPT
%native(CountAlphaCharacters) void JavaScript_alpha_count();
#if defined(SWIG_JAVASCRIPT_NAPI)      /* engine = napi */
%{

static Napi::Value JavaScript_alpha_count(const Napi::CallbackInfo &info) {
  Napi::Env env = info.Env();
  Napi::EscapableHandleScope scope(env);

  Napi::Value jsresult;
  char *arg1 = (char *)0;
  int res1;
  char *buf1 = 0;
  int alloc1 = 0;
  int result;
  if (info.Length() != 1) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for _wrap_alpha_count.");
  res1 = SWIG_AsCharPtrAndSize(info[0], &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1))
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "alpha_count" "', argument " "1"" of type '" "char const *""'");
  arg1 = reinterpret_cast< char * >(buf1);
  result = (int)alpha_count((char const *)arg1);
  jsresult = SWIG_From_int(env, static_cast< int >(result));
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return scope.Escape(jsresult);
fail:
  return Napi::Value();
}

%}
#elif defined(SWIG_JAVASCRIPT_V8) /* engine = node || v8 */
%{

static SwigV8ReturnValue JavaScript_alpha_count(const SwigV8Arguments &args) {
  SWIGV8_HANDLESCOPE();
  SWIGV8_VALUE jsresult;
  char *arg1 = (char *)0;
  int res1;
  char *buf1 = 0;
  int alloc1 = 0;
  int result;
  if(args.Length() != 1) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for _wrap_alpha_count.");
  res1 = SWIG_AsCharPtrAndSize(args[0], &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1))
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "alpha_count" "', argument " "1"" of type '" "char const *""'");
  arg1 = reinterpret_cast< char * >(buf1);
  result = (int)alpha_count((char const *)arg1);
  jsresult = SWIG_From_int(static_cast< int >(result));
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  SWIGV8_RETURN(jsresult);
fail:
  SWIGV8_RETURN(SWIGV8_UNDEFINED());
}

%}
#elif defined(SWIG_JAVASCRIPT_JSC) /* engine = jsc */
%{

static JSValueRef JavaScript_alpha_count(JSContextRef context, JSObjectRef function,
  JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception)
{
  char *arg1 = (char *)0;
  int res1;
  char *buf1 = 0;
  int alloc1 = 0;
  int result;
  JSValueRef jsresult;
  if (argc != 1) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments.");
  res1 = SWIG_JSC_AsCharPtrAndSize(context, argv[0], &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1))
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "alpha_count" "', argument " "1"" of type '" "char const *""'");
  arg1 = reinterpret_cast< char * >(buf1);
  result = (int)alpha_count((char const *)arg1);
  jsresult = SWIG_From_int  SWIG_JSC_FROM_CALL_ARGS(static_cast< int >(result));
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return jsresult;
fail:
  return JSValueMakeUndefined(context);
}

%}
#else
%{
#error No valid JS engine configured
%}
#endif /* engine */
#endif /* SWIGJAVASCRIPT */

