diff options
-rw-r--r-- | .gitmodules | 3 | ||||
-rw-r--r-- | CMakeLists.txt | 5 | ||||
m--------- | cmake/erlang | 0 | ||||
-rw-r--r-- | src/CMakeLists.txt | 10 | ||||
-rw-r--r-- | test/CMakeLists.txt | 9 | ||||
-rw-r--r-- | vapi/erl_interface.vapi | 162 |
6 files changed, 179 insertions, 10 deletions
diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..565d4bc --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "cmake/erlang"] + path = cmake/erlang + url = git://git.universe-factory.net/cmake-erlang diff --git a/CMakeLists.txt b/CMakeLists.txt index 844570d..e3d1e8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ project("eva" C) cmake_minimum_required(VERSION 2.6) -list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/vala) +list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/erlang ${CMAKE_SOURCE_DIR}/cmake/vala) include(ValaPrecompile) include(ValaVersion) @@ -8,12 +8,13 @@ include(ValaVersion) find_package(Vala REQUIRED) ensure_vala_version("0.8" MINIMUM) +find_package(Erlang REQUIRED) +erl_check_library(EI REQUIRED erl_interface) find_package(PkgConfig) pkg_check_modules(GEE REQUIRED gee-1.0) pkg_check_modules(GIO REQUIRED gio-2.0) pkg_check_modules(GIO_UNIX REQUIRED gio-unix-2.0) -pkg_check_modules(ERL REQUIRED erl_interface) add_subdirectory(src) add_subdirectory(test) diff --git a/cmake/erlang b/cmake/erlang new file mode 160000 +Subproject ecc44209d33f59c7c653b1527253a5cfd7227ce diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f6208a6..0a431a6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,7 @@ -add_definitions(${GEE_CFLAGS} ${GEE_CFLAGS_OTHER} ${GIO_CFLAGS} ${GIO_CFLAGS_OTHER} ${ERL_CFLAGS} ${ERL_CFLAGS_OTHER}) -link_libraries(${GEE_LIBRARIES} ${GIO_LIBRARIES} ${ERL_LIBRARIES}) -link_directories(${GEE_LIBRARY_DIRS} ${GIO_LIBRARY_DIRS} ${ERL_LIBRARY_DIRS}) +add_definitions(${GEE_CFLAGS} ${GEE_CFLAGS_OTHER} ${GIO_CFLAGS} ${GIO_CFLAGS_OTHER}) +include_directories(${EI_INCLUDE_DIR}) +link_libraries(${GEE_LIBRARIES} ${GIO_LIBRARIES} "${EI_LIBRARY_DIR}/libei.a") +link_directories(${GEE_LIBRARY_DIRS} ${GIO_LIBRARY_DIRS}) vala_precompile(EVA_C Atom.vala @@ -20,10 +21,11 @@ vala_precompile(EVA_C UInt.vala Util.vala Var.vala +CUSTOM_VAPIS + ${eva_SOURCE_DIR}/vapi/erl_interface.vapi PACKAGES gee-1.0 gio-2.0 - erl_interface GENERATE_VAPI eva ) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index bad2b58..810a90d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,6 +1,7 @@ -add_definitions(${GEE_CFLAGS} ${GEE_CFLAGS_OTHER} ${GIO_CFLAGS} ${GIO_CFLAGS_OTHER} ${GIO_UNIX_CFLAGS} ${GIO_UNIX_CFLAGS_OTHER} ${ERL_CFLAGS} ${ERL_CFLAGS_OTHER}) -link_libraries(${GEE_LIBRARIES} ${GIO_LIBRARIES} ${GIO_UNIX_LIBRARIES} ${ERL_LIBRARIES}) -link_directories(${GEE_LIBRARY_DIRS} ${GIO_LIBRARY_DIRS} ${GIO_UNIX_LIBRARY_DIRS} ${ERL_LIBRARY_DIRS}) +add_definitions(${GEE_CFLAGS} ${GEE_CFLAGS_OTHER} ${GIO_CFLAGS} ${GIO_CFLAGS_OTHER} ${GIO_UNIX_CFLAGS} ${GIO_UNIX_CFLAGS_OTHER}) +include_directories(${EI_INCLUDE_DIR}) +link_libraries(${GEE_LIBRARIES} ${GIO_LIBRARIES} ${GIO_UNIX_LIBRARIES}) +link_directories(${GEE_LIBRARY_DIRS} ${GIO_LIBRARY_DIRS} ${GIO_UNIX_LIBRARY_DIRS}) vala_precompile(TEST_C Test.vala @@ -8,8 +9,8 @@ PACKAGES gee-1.0 gio-2.0 gio-unix-2.0 - erl_interface CUSTOM_VAPIS + ${eva_SOURCE_DIR}/vapi/erl_interface.vapi ${eva_BINARY_DIR}/src/eva.vapi ) diff --git a/vapi/erl_interface.vapi b/vapi/erl_interface.vapi new file mode 100644 index 0000000..55b89c2 --- /dev/null +++ b/vapi/erl_interface.vapi @@ -0,0 +1,162 @@ +[CCode (cheader_filename = "ei.h", cprefix = "ei_", lower_case_cprefix = "ei_")] +namespace Erl { + /*public int errno; + + [CCode (cname = "ei_cnode")] + [Compact] + public struct Node { + [CCode (cname = "ei_connect_init")] + public Node(string this_node_name, string cookie, short creation); + + public Connection connect(string nodename); + + public Pid* self(); + } + + [CCode (cname="int", cprefix="ERL_")] + public enum ReceiveType { + ERROR, TICK, MSG + } + [CCode (cname="int", cprefix="E")] + public enum Error { + TIMEDOUT + } + + [CCode (cname = "int")] + [Compact] + public struct Connection : int { + public bool is_valid() { + return (this >= 0); + } + + private ReceiveType xreceive_msg_tmo(Msg msg, Buffer buffer, uint timeout); + + [CCode (cname = "erl_receive_vala")] + public ReceiveType receive(out Buffer buffer, uint timeout = 0) { + buffer = Buffer(); + Msg msg; + ReceiveType ret = xreceive_msg_tmo(msg, buffer, timeout); + return ret; + } + }*/ + + + [CCode (cname="MAXATOMLEN")] + public const int MAXATOMLEN; + + [CCode (cname="char")] + public enum TermType { + [CCode (cname="ERL_SMALL_INTEGER_EXT")] + SMALL_INTEGER, + [CCode (cname="ERL_INTEGER_EXT")] + INTEGER, + [CCode (cname="ERL_FLOAT_EXT")] + FLOAT, + [CCode (cname="ERL_ATOM_EXT")] + ATOM, + [CCode (cname="ERL_REFERENCE_EXT")] + REFERENCE, + [CCode (cname="ERL_NEW_REFERENCE_EXT")] + NEW_REFERENCE, + [CCode (cname="ERL_PORT_EXT")] + PORT, + [CCode (cname="ERL_PID_EXT")] + PID, + [CCode (cname="ERL_SMALL_TUPLE_EXT")] + SMALL_TUPLE, + [CCode (cname="ERL_LARGE_TUPLE_EXT")] + LARGE_TUPLE, + [CCode (cname="ERL_NIL_EXT")] + NIL, + [CCode (cname="ERL_STRING_EXT")] + STRING, + [CCode (cname="ERL_LIST_EXT")] + LIST, + [CCode (cname="ERL_BINARY_EXT")] + BINARY, + [CCode (cname="ERL_SMALL_BIG_EXT")] + SMALL_BIG, + [CCode (cname="ERL_LARGE_BIG_EXT")] + LARGE_BIG, + [CCode (cname="ERL_NEW_FUN_EXT")] + NEW_FUN, + [CCode (cname="ERL_FUN_EXT")] + FUN + } + + public int get_type(char *buf, ref int index, out int type, out int size); + + public int decode_version(char *buf, ref int index, out int version); + public int decode_char(char *buf, ref int index, out char value); + public int decode_long(char *buf, ref int index, out long value); + public int decode_double(char *buf, ref int index, out double value); + public int decode_atom(char *buf, ref int index, char *p); + public int decode_tuple_header(char *buf, ref int index, out int arity); + public int decode_list_header(char *buf, ref int index, out int arity); + public int decode_string(char *buf, ref int index, char *p); + public int decode_binary(char *buf, ref int index, char *p, out long len); + public int decode_pid(char *buf, ref int index, out Pid pid); + public int decode_port(char *buf, ref int index, out Port port); + public int decode_ref(char *buf, ref int index, out Ref reference); + + + [CCode (cname = "ei_x_buff", cprefix = "ei_x_", destroy_function = "ei_x_free")] + [Compact] + public struct Buffer { + [CCode (array_length_cname = "index", array_length_type = "int")] + public char[] buff; + + [CCode (cname = "ei_x_new")] + public Buffer(); + + [CCode (cname = "ei_x_new_with_version")] + public Buffer.with_version(); + + public int encode_long(long p); + public int encode_ulong(ulong p); + public int encode_double(double p); + [CCode (cname = "ei_x_encode_atom_len")] + public int encode_atom(char[] p); + public int encode_tuple_header(int arity); + public int encode_list_header(int arity); + public int encode_empty_list(); + [CCode (cname = "ei_x_encode_string_len")] + public int encode_string(char[] p); + public int encode_binary(char* p, long len); + public int encode_pid(Pid pid); + public int encode_port(Port port); + public int encode_ref(Ref reference); + } + + [CCode (cname = "erlang_pid", destroy_function = "")] + [Compact] + public struct Pid { + public char[] node; + public uint num; + public uint serial; + public uint creation; + } + + [CCode (cname = "erlang_port", destroy_function = "")] + [Compact] + public struct Port { + public char[] node; + public uint id; + public uint creation; + } + + [CCode (cname = "erlang_ref", destroy_function = "")] + [Compact] + public struct Ref { + public char[] node; + public int len; + public uint* n; + public uint creation; + } + + /*[CCode (cname = "erlang_msg", destroy_function = "")] + [Compact] + private struct Msg { + public Pid from; + }*/ +} |