Skip to content

Commit

Permalink
[libposix] achieve simple c reflection
Browse files Browse the repository at this point in the history
  • Loading branch information
gozfree committed May 27, 2023
1 parent 508b06c commit 5a97d29
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 16 deletions.
33 changes: 17 additions & 16 deletions build/cmake_env.inc
Original file line number Diff line number Diff line change
Expand Up @@ -7,29 +7,30 @@ SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/build/bin)
SET(TD_TESTS_OUTPUT_DIR ${PROJECT_BINARY_DIR}/test)

MESSAGE(STATUS "============= Compile Env ============= ")
MESSAGE(STATUS " CPU Info: " ${CMAKE_SYSTEM_PROCESSOR})
MESSAGE(STATUS " OS Info: " ${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_VERSION})
MESSAGE(STATUS "Host Info: " ${CMAKE_HOST_SYSTEM_NAME})
MESSAGE(STATUS "C COMPILER: " ${CMAKE_C_COMPILER_ID}-${CMAKE_C_COMPILER_VERSION})
MESSAGE(STATUS "============= Compile Env ============= ")

MESSAGE(STATUS "============= Project Info ============= ")
MESSAGE(STATUS "src directory: " ${PROJECT_SOURCE_DIR})
MESSAGE(STATUS "binary output path: " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "executable output path: " ${EXECUTABLE_OUTPUT_PATH})
MESSAGE(STATUS "library output path: " ${LIBRARY_OUTPUT_PATH})
MESSAGE(STATUS "============= Project Info ============= ")
MESSAGE(STATUS " CPU Info: " ${CMAKE_SYSTEM_PROCESSOR})
MESSAGE(STATUS " Host OS: " ${CMAKE_HOST_SYSTEM_NAME}-${CMAKE_SYSTEM_VERSION})
MESSAGE(STATUS " CMake VER: " ${CMAKE_MAJOR_VERSION}-${CMAKE_MINOR_VERSION}-${CMAKE_PATCH_VERSION})
MESSAGE(STATUS "C COMPILER: " ${CMAKE_C_COMPILER_ID}-${CMAKE_C_COMPILER_VERSION})

IF ("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
SET(OS_LINUX TRUE)
MESSAGE(STATUS "env is OS_LINUX")
MESSAGE(STATUS " Target OS: LINUX")
ELSEIF ("${CMAKE_SYSTEM_NAME}" MATCHES "Windows")
SET(OS_WINDOWS TRUE)
MESSAGE(STATUS "env is OS_WINDOWS")
MESSAGE(STATUS " Target OS: WINDOWS")
ELSEIF (("${CMAKE_SYSTEM_NAME}" MATCHES "MSYS") OR ("${CMAKE_SYSTEM_NAME}" MATCHES "MINGW32"))
SET(OS_WINDOWS TRUE)
SET(ENV_MINGW TRUE)
MESSAGE(STATUS "env is OS_WINDOWS with MINGW")
MESSAGE(STATUS " Target OS: WINDOWS with MINGW")
ELSE ()
MESSAGE(STATUS "check env unknown ${CMAKE_SYSTEM_NAME}")
MESSAGE(STATUS " Target OS: unknown ${CMAKE_SYSTEM_NAME}")
EXIT ()
ENDIF ()
MESSAGE(STATUS "======================================= ")

MESSAGE(STATUS "============= Project Info ============= ")
MESSAGE(STATUS " src path: " ${PROJECT_SOURCE_DIR})
MESSAGE(STATUS "bin output path: " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "exe output path: " ${EXECUTABLE_OUTPUT_PATH})
MESSAGE(STATUS "lib output path: " ${LIBRARY_OUTPUT_PATH})
MESSAGE(STATUS "======================================== ")
25 changes: 25 additions & 0 deletions gear-lib/libposix/libposix.h
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,31 @@ GEAR_API size_t wcs_to_utf8_ptr(const wchar_t *str, size_t len, char **pstr);
GEAR_API size_t utf8_to_mbs_ptr(const char *str, size_t len, char **pstr);
GEAR_API size_t mbs_to_utf8_ptr(const char *str, size_t len, char **pstr);

/*
* simple reflection c version realization
*/
typedef void (*void_fn)(void);
struct reflect {
void_fn fn;
const char* name;
};
struct reflect __start_reflect;
struct reflect __stop_reflect;

#define REFLECT_DEF(x) __attribute__((section("reflect"), aligned(sizeof(void*)))) \
struct reflect __##x = {(void_fn)x, #x};

#define REFLECT_CALL(type, x, ...) \
do { \
struct reflect *_r = NULL; \
for (_r = &__start_reflect; _r < &__stop_reflect; _r++) { \
if (strcmp(_r->name, x) == 0) { \
type __fn = (type)_r->fn; \
__fn(__VA_ARGS__); \
} \
} \
} while (0)

#ifdef __cplusplus
}
#endif
Expand Down
22 changes: 22 additions & 0 deletions gear-lib/libposix/test_libposix.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,31 @@
******************************************************************************/
#include "libposix.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#include <sys/stat.h>

typedef int (*add2_fn)(char* a, char* b);
typedef int (*add3_fn)(char* a, char* b, char *c);

int add2(char* a, char* b)
{
printf("%d+%d=%d\n", atoi(a), atoi(b), atoi(a) + atoi(b));
return atoi(a) + atoi(b);
}
REFLECT_DEF(add2);

int add3(char* a, char* b, char *c)
{
printf("%d+%d+%d=%d\n", atoi(a), atoi(b), atoi(c), atoi(a) + atoi(b) + atoi(c));
return atoi(a) + atoi(b) + atoi(c);
}
REFLECT_DEF(add3);

static void *thread_func(void *arg)
{
printf("this is thread\n");
Expand Down Expand Up @@ -69,5 +87,9 @@ void foo()
int main(int argc, char **argv)
{
foo();

REFLECT_CALL(add2_fn, "add2", "4", "2");
REFLECT_CALL(add3_fn, "add3", "1", "4", "2");

return 0;
}

0 comments on commit 5a97d29

Please sign in to comment.