%include <typemaps.i>

// FIXME: We need to port more typemaps from Python

//===----------------------------------------------------------------------===//

// In Lua 5.3 and beyond the VM supports integers, so we need to remap
// SWIG's internal handling of integers.


%define LLDB_NUMBER_TYPEMAP(TYPE)

// Primitive integer mapping
%typemap(in,checkfn="lua_isinteger") TYPE
%{ $1 = ($type)lua_tointeger(L, $input); %}
%typemap(in,checkfn="lua_isinteger") const TYPE&($basetype temp)
%{ temp=($basetype)lua_tointeger(L,$input); $1=&temp;%}
%typemap(out) TYPE
%{ lua_pushinteger(L, (lua_Integer) $1); SWIG_arg++;%}
%typemap(out) const TYPE&
%{ lua_pushinteger(L, (lua_Integer) $1); SWIG_arg++;%}

// Pointer and reference mapping
%typemap(in,checkfn="lua_isinteger") TYPE *INPUT($*ltype temp), TYPE &INPUT($*ltype temp)
%{ temp = ($*ltype)lua_tointeger(L,$input);
   $1 = &temp; %}
%typemap(in, numinputs=0) TYPE *OUTPUT ($*ltype temp)
%{ $1 = &temp; %}
%typemap(argout) TYPE *OUTPUT
%{  lua_pushinteger(L, (lua_Integer) *$1); SWIG_arg++;%}
%typemap(in) TYPE *INOUT = TYPE *INPUT;
%typemap(argout) TYPE *INOUT = TYPE *OUTPUT;
%typemap(in) TYPE &OUTPUT = TYPE *OUTPUT;
%typemap(argout) TYPE &OUTPUT = TYPE *OUTPUT;
%typemap(in) TYPE &INOUT = TYPE *INPUT;
%typemap(argout) TYPE &INOUT = TYPE *OUTPUT;
%typemap(in,checkfn="lua_isinteger") const TYPE *INPUT($*ltype temp)
%{ temp = ($*ltype)lua_tointeger(L,$input);
   $1 = &temp; %}

%enddef // LLDB_NUMBER_TYPEMAP

LLDB_NUMBER_TYPEMAP(unsigned char);
LLDB_NUMBER_TYPEMAP(signed char);
LLDB_NUMBER_TYPEMAP(short);
LLDB_NUMBER_TYPEMAP(unsigned short);
LLDB_NUMBER_TYPEMAP(signed short);
LLDB_NUMBER_TYPEMAP(int);
LLDB_NUMBER_TYPEMAP(unsigned int);
LLDB_NUMBER_TYPEMAP(signed int);
LLDB_NUMBER_TYPEMAP(long);
LLDB_NUMBER_TYPEMAP(unsigned long);
LLDB_NUMBER_TYPEMAP(signed long);
LLDB_NUMBER_TYPEMAP(long long);
LLDB_NUMBER_TYPEMAP(unsigned long long);
LLDB_NUMBER_TYPEMAP(signed long long);
LLDB_NUMBER_TYPEMAP(enum SWIGTYPE);

%apply unsigned long { size_t };
%apply const unsigned long & { const size_t & };
%apply long { ssize_t };
%apply const long & { const ssize_t & };

//===----------------------------------------------------------------------===//

// FIXME:
//  Ideally all the typemaps should be revisited in a future SB API revision.
//  Typemaps, usually, modifies the function signatures and might spawn
//  different LLDB APIs across languages (C++, Python, Lua...).
//  Historically, typemaps have been used to replace SWIG's deficiencies,
//  but SWIG itself evolved and some API design choices are now redundant.

//===----------------------------------------------------------------------===//

// Typemap definitions to allow SWIG to properly handle char buffer.

// typemap for a char buffer
%typemap(in) (char *dst, size_t dst_len) {
  $2 = luaL_checkinteger(L, $input);
  if ($2 <= 0) {
    return luaL_error(L, "Positive integer expected");
  }
  $1 = (char *)malloc($2);
}

// SBProcess::ReadCStringFromMemory() uses a void*, but needs to be treated
// as char data instead of byte data.
%typemap(in) (void *char_buf, size_t size) = (char *dst, size_t dst_len);

// Also SBProcess::ReadMemory.
%typemap(in) (void *buf, size_t size) = (char *dst, size_t dst_len);

// Return the char buffer.  Discarding any previous return result
%typemap(argout) (char *dst, size_t dst_len) {
  lua_pop(L, 1); // Blow away the previous result
  if ($result == 0) {
    lua_pushliteral(L, "");
  } else {
    lua_pushlstring(L, (const char *)$1, $result);
  }
  free($1);
  // SWIG_arg was already incremented
}

// SBProcess::ReadCStringFromMemory() uses a void*, but needs to be treated
// as char data instead of byte data.
%typemap(argout) (void *char_buf, size_t size) = (char *dst, size_t dst_len);

// Also SBProcess::ReadMemory.
%typemap(argout) (void *buf, size_t size) = (char *dst, size_t dst_len);

//===----------------------------------------------------------------------===//

// Typemap for handling a snprintf-like API like SBThread::GetStopDescription.

%typemap(in) (char *dst_or_null, size_t dst_len) {
  $2 = luaL_checkinteger(L, $input);
  if ($2 <= 0) {
    return luaL_error(L, "Positive integer expected");
  }
  $1 = (char *)malloc($2);
}

%typemap(argout) (char *dst_or_null, size_t dst_len) {
  lua_pop(L, 1); // Blow away the previous result
  lua_pushlstring(L, (const char *)$1, $result);
  free($1);
  // SWIG_arg was already incremented
}

//===----------------------------------------------------------------------===//

// Typemap for handling SBModule::GetVersion

%typemap(in) (uint32_t *versions, uint32_t num_versions) {
  $2 = 99;
  $1 = (uint32_t *)malloc(sizeof(uint32_t) * $2);
}

%typemap(argout) (uint32_t *versions, uint32_t num_versions) {
  uint32_t count = result;
  if (count >= $2)
    count = $2;
  lua_newtable(L);
  int i = 0;
  while (i++ < count) {
    lua_pushinteger(L, $1[i - 1]);
    lua_seti(L, -2, i);
  }
  SWIG_arg++;
  free($1);
}

//===----------------------------------------------------------------------===//

// Typemap for handling SBDebugger::SetLoggingCallback

%typemap(in) (lldb::LogOutputCallback log_callback, void *baton) {
  $1 = LLDBSwigLuaCallLuaLogOutputCallback;
  $2 = (void *)L;

  luaL_checktype(L, 2, LUA_TFUNCTION);
  lua_settop(L, 2);

  lua_pushlightuserdata(L, (void *)&LLDBSwigLuaCallLuaLogOutputCallback);
  lua_insert(L, 2);
  lua_settable(L, LUA_REGISTRYINDEX);
}

//===----------------------------------------------------------------------===//

// Typemap for handling SBEvent::SBEvent(uint32_t event, const char *cstr, uint32_t cstr_len)

%typemap(in) (const char *cstr, uint32_t cstr_len) {
  $1 = (char *)luaL_checklstring(L, $input, (size_t *)&$2);
}

// Typemap for handling SBProcess::PutSTDIN

%typemap(in) (const char *src, size_t src_len) {
  $1 = (char *)luaL_checklstring(L, $input, &$2);
}

// Typemap for handling SBProcess::WriteMemory, SBTarget::GetInstructions...

%typemap(in) (const void *buf, size_t size),
             (const void *data, size_t data_len) {
  $1 = (void *)luaL_checklstring(L, $input, &$2);
}

//===----------------------------------------------------------------------===//

// Typemap for handling char ** in SBTarget::LaunchSimple, SBTarget::Launch...

// It should accept a Lua table of strings, for stuff like "argv" and "envp".

%typemap(in) char ** {
  if (lua_istable(L, $input)) {
    size_t size = lua_rawlen(L, $input);
    $1 = (char **)malloc((size + 1) * sizeof(char *));
    int i = 0, j = 0;
    while (i++ < size) {
      lua_rawgeti(L, $input, i);
      if (!lua_isstring(L, -1)) {
        // if current element cannot be converted to string, raise an error
        lua_pop(L, 1);
        return luaL_error(L, "List should only contain strings");
      }
      $1[j++] = (char *)lua_tostring(L, -1);
      lua_pop(L, 1);
    }
    $1[j] = 0;
  } else if (lua_isnil(L, $input)) {
    // "nil" is also acceptable, equivalent as an empty table
    $1 = NULL;
  } else {
    return luaL_error(L, "A list of strings expected");
  }
}

%typemap(freearg) char ** {
  free((char *) $1);
}

%typecheck(SWIG_TYPECHECK_STRING_ARRAY) char ** {
  $1 = (lua_istable(L, $input) || lua_isnil(L, $input));
}

//===----------------------------------------------------------------------===//

// Typemap for file handles (e.g. used in SBDebugger::SetOutputFile)

%typemap(in) lldb::FileSP {
  luaL_Stream *p = (luaL_Stream *)luaL_checkudata(L, $input, LUA_FILEHANDLE);
  lldb::FileSP file_sp;
  file_sp = std::make_shared<lldb_private::NativeFile>(p->f, false);
  if (!file_sp->IsValid())
    return luaL_error(L, "Invalid file");
  $1 = file_sp;
}

%typecheck(SWIG_TYPECHECK_POINTER) lldb::FileSP {
  $1 = (lua_isuserdata(L, $input)) &&
       (luaL_testudata(L, $input, LUA_FILEHANDLE) != nullptr);
}

// Typemap for file handles (e.g. used in SBDebugger::GetOutputFileHandle)

%typemap(out) lldb::FileSP {
  lldb::FileSP &sp = $1;
  if (sp && sp->IsValid()) {
    luaL_Stream *p = (luaL_Stream *)lua_newuserdata(L, sizeof(luaL_Stream));
    p->closef = &LLDBSwigLuaCloseFileHandle;
    p->f = sp->GetStream();
    luaL_setmetatable(L, LUA_FILEHANDLE);
    SWIG_arg++;
  }
}

//===----------------------------------------------------------------------===//

// Typemap for SBData::CreateDataFromUInt64Array, SBData::SetDataFromUInt64Array ...

%typemap(in) (uint64_t* array, size_t array_len),
             (uint32_t* array, size_t array_len),
             (int64_t* array, size_t array_len),
             (int32_t* array, size_t array_len),
             (double* array, size_t array_len) {
  if (lua_istable(L, $input)) {
    // It should accept a table of numbers.
    $2 = lua_rawlen(L, $input);
    $1 = ($1_ltype)malloc(($2) * sizeof($*1_type));
    int i = 0, j = 0;
    while (i++ < $2) {
      lua_rawgeti(L, $input, i);
      if (!lua_isnumber(L, -1)) {
        // if current element cannot be converted to number, raise an error
        lua_pop(L, 1);
        return luaL_error(L, "List should only contain numbers");
      }
      $1[j++] = ($*1_ltype) lua_tonumber(L, -1);
      lua_pop(L, 1);
    }
  } else if (lua_isnil(L, $input)) {
    // "nil" is also acceptable, equivalent as an empty table
    $1 = NULL;
    $2 = 0;
  } else {
    // else raise an error
    return luaL_error(L, "A list of numbers expected.");
  }
}

%typemap(freearg) (uint64_t* array, size_t array_len),
             (uint32_t* array, size_t array_len),
             (int64_t* array, size_t array_len),
             (int32_t* array, size_t array_len),
             (double* array, size_t array_len) {
  free($1);
}

//===----------------------------------------------------------------------===//

// Typemap for SBCommandReturnObject::PutCString

%typemap(in) (const char *string, int len) {
  if (lua_isnil(L, $input)) {
    $1 = NULL;
    $2 = 0;
  } else {
    $1 = (char *)luaL_checklstring(L, $input, (size_t *)&$2);
  }
}

//===----------------------------------------------------------------------===//
