Skip to content

Commit 5a97d29

Browse files
committed
[libposix] achieve simple c reflection
1 parent 508b06c commit 5a97d29

File tree

3 files changed

+64
-16
lines changed

3 files changed

+64
-16
lines changed

build/cmake_env.inc

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,30 @@ SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/build/bin)
77
SET(TD_TESTS_OUTPUT_DIR ${PROJECT_BINARY_DIR}/test)
88

99
MESSAGE(STATUS "============= Compile Env ============= ")
10-
MESSAGE(STATUS " CPU Info: " ${CMAKE_SYSTEM_PROCESSOR})
11-
MESSAGE(STATUS " OS Info: " ${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_VERSION})
12-
MESSAGE(STATUS "Host Info: " ${CMAKE_HOST_SYSTEM_NAME})
13-
MESSAGE(STATUS "C COMPILER: " ${CMAKE_C_COMPILER_ID}-${CMAKE_C_COMPILER_VERSION})
14-
MESSAGE(STATUS "============= Compile Env ============= ")
15-
16-
MESSAGE(STATUS "============= Project Info ============= ")
17-
MESSAGE(STATUS "src directory: " ${PROJECT_SOURCE_DIR})
18-
MESSAGE(STATUS "binary output path: " ${PROJECT_BINARY_DIR})
19-
MESSAGE(STATUS "executable output path: " ${EXECUTABLE_OUTPUT_PATH})
20-
MESSAGE(STATUS "library output path: " ${LIBRARY_OUTPUT_PATH})
21-
MESSAGE(STATUS "============= Project Info ============= ")
10+
MESSAGE(STATUS " CPU Info: " ${CMAKE_SYSTEM_PROCESSOR})
11+
MESSAGE(STATUS " Host OS: " ${CMAKE_HOST_SYSTEM_NAME}-${CMAKE_SYSTEM_VERSION})
12+
MESSAGE(STATUS " CMake VER: " ${CMAKE_MAJOR_VERSION}-${CMAKE_MINOR_VERSION}-${CMAKE_PATCH_VERSION})
13+
MESSAGE(STATUS "C COMPILER: " ${CMAKE_C_COMPILER_ID}-${CMAKE_C_COMPILER_VERSION})
2214

2315
IF ("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
2416
SET(OS_LINUX TRUE)
25-
MESSAGE(STATUS "env is OS_LINUX")
17+
MESSAGE(STATUS " Target OS: LINUX")
2618
ELSEIF ("${CMAKE_SYSTEM_NAME}" MATCHES "Windows")
2719
SET(OS_WINDOWS TRUE)
28-
MESSAGE(STATUS "env is OS_WINDOWS")
20+
MESSAGE(STATUS " Target OS: WINDOWS")
2921
ELSEIF (("${CMAKE_SYSTEM_NAME}" MATCHES "MSYS") OR ("${CMAKE_SYSTEM_NAME}" MATCHES "MINGW32"))
3022
SET(OS_WINDOWS TRUE)
3123
SET(ENV_MINGW TRUE)
32-
MESSAGE(STATUS "env is OS_WINDOWS with MINGW")
24+
MESSAGE(STATUS " Target OS: WINDOWS with MINGW")
3325
ELSE ()
34-
MESSAGE(STATUS "check env unknown ${CMAKE_SYSTEM_NAME}")
26+
MESSAGE(STATUS " Target OS: unknown ${CMAKE_SYSTEM_NAME}")
27+
EXIT ()
3528
ENDIF ()
29+
MESSAGE(STATUS "======================================= ")
30+
31+
MESSAGE(STATUS "============= Project Info ============= ")
32+
MESSAGE(STATUS " src path: " ${PROJECT_SOURCE_DIR})
33+
MESSAGE(STATUS "bin output path: " ${PROJECT_BINARY_DIR})
34+
MESSAGE(STATUS "exe output path: " ${EXECUTABLE_OUTPUT_PATH})
35+
MESSAGE(STATUS "lib output path: " ${LIBRARY_OUTPUT_PATH})
36+
MESSAGE(STATUS "======================================== ")

gear-lib/libposix/libposix.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,31 @@ GEAR_API size_t wcs_to_utf8_ptr(const wchar_t *str, size_t len, char **pstr);
260260
GEAR_API size_t utf8_to_mbs_ptr(const char *str, size_t len, char **pstr);
261261
GEAR_API size_t mbs_to_utf8_ptr(const char *str, size_t len, char **pstr);
262262

263+
/*
264+
* simple reflection c version realization
265+
*/
266+
typedef void (*void_fn)(void);
267+
struct reflect {
268+
void_fn fn;
269+
const char* name;
270+
};
271+
struct reflect __start_reflect;
272+
struct reflect __stop_reflect;
273+
274+
#define REFLECT_DEF(x) __attribute__((section("reflect"), aligned(sizeof(void*)))) \
275+
struct reflect __##x = {(void_fn)x, #x};
276+
277+
#define REFLECT_CALL(type, x, ...) \
278+
do { \
279+
struct reflect *_r = NULL; \
280+
for (_r = &__start_reflect; _r < &__stop_reflect; _r++) { \
281+
if (strcmp(_r->name, x) == 0) { \
282+
type __fn = (type)_r->fn; \
283+
__fn(__VA_ARGS__); \
284+
} \
285+
} \
286+
} while (0)
287+
263288
#ifdef __cplusplus
264289
}
265290
#endif

gear-lib/libposix/test_libposix.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,31 @@
2121
******************************************************************************/
2222
#include "libposix.h"
2323
#include <stdio.h>
24+
#include <stdlib.h>
2425
#include <unistd.h>
2526
#include <pthread.h>
2627
#include <errno.h>
2728
#define __STDC_FORMAT_MACROS
2829
#include <inttypes.h>
2930
#include <sys/stat.h>
3031

32+
typedef int (*add2_fn)(char* a, char* b);
33+
typedef int (*add3_fn)(char* a, char* b, char *c);
34+
35+
int add2(char* a, char* b)
36+
{
37+
printf("%d+%d=%d\n", atoi(a), atoi(b), atoi(a) + atoi(b));
38+
return atoi(a) + atoi(b);
39+
}
40+
REFLECT_DEF(add2);
41+
42+
int add3(char* a, char* b, char *c)
43+
{
44+
printf("%d+%d+%d=%d\n", atoi(a), atoi(b), atoi(c), atoi(a) + atoi(b) + atoi(c));
45+
return atoi(a) + atoi(b) + atoi(c);
46+
}
47+
REFLECT_DEF(add3);
48+
3149
static void *thread_func(void *arg)
3250
{
3351
printf("this is thread\n");
@@ -69,5 +87,9 @@ void foo()
6987
int main(int argc, char **argv)
7088
{
7189
foo();
90+
91+
REFLECT_CALL(add2_fn, "add2", "4", "2");
92+
REFLECT_CALL(add3_fn, "add3", "1", "4", "2");
93+
7294
return 0;
7395
}

0 commit comments

Comments
 (0)