fix: corner cases when printing large content through term interface
[lunaix-os.git] / lunaix-os / includes / lunaix / ds / ldga.h
1 /**
2  * @file ldga.h
3  * @author Lunaixsky (lunaxisky@qq.com)
4  * @brief Linker generated array definition
5  * @version 0.1
6  * @date 2023-08-18
7  *
8  * @copyright Copyright (c) 2023
9  *
10  */
11 #ifndef __LUNAIX_LDGA_H
12 #define __LUNAIX_LDGA_H
13
14 #include <lunaix/types.h>
15 #include <lunaix/compiler.h>
16
17 #define ldga_el_id(ga_name, el_name) __lga_##ga_name##_##el_name
18 #define ldga_section(ga_name) __attribute__((section(".lga." ga_name)))
19
20 #define export_ldga_el(ga_name, el_name, type, val)                            \
21     type ldga_section(#ga_name) must_emit ldga_el_id(ga_name, el_name) = (type)(val)
22
23 #define export_ldga_el_sfx(ga_name, el_name, type, val, suffix)                \
24     type ldga_section(#ga_name "." #suffix) must_emit ldga_el_id(ga_name, el_name) =     \
25       (type)(val)
26
27 #define export_ldga_el_idx(ga_name, i, type, val)                              \
28     export_ldga_el(ga_name, i, type, val)
29 #define export_ldga_el_anon(ga_name, type, val)                                \
30     export_ldga_el_idx(ga_name, __COUNTER__, type, val)
31
32 #define ldga_foreach(ga_name, el_type, index, el)                              \
33     extern el_type __lga_##ga_name##_start[], __lga_##ga_name##_end;           \
34     for (index = 0, el = __lga_##ga_name##_start[index];                       \
35          (ptr_t)&__lga_##ga_name##_start[index] <                              \
36          (ptr_t)&__lga_##ga_name##_end;                                        \
37          el = __lga_##ga_name##_start[++index])
38
39 /**
40  * @brief Invoke all elements in the array named `ga_name` of parameterless
41  * function pointers
42  *
43  */
44 #define ldga_invoke_fn0(ga_name)                                               \
45     ({                                                                         \
46         int i = 0;                                                             \
47         ptr_t fn0;                                                             \
48         ldga_foreach(ga_name, ptr_t, i, fn0)                                   \
49         {                                                                      \
50             ((void (*)())fn0)();                                               \
51         }                                                                      \
52     })
53
54 #endif /* __LUNAIX_LDGA_H */