xref: /minix3/minix/llvm/include/common/util/stdlib.h (revision 3e457fe321c6af238c180a2b4a0f010f8b4f8c31)
1*3e457fe3SDavid van Moolenbroek #ifndef _UTIL_STDLIB_H
2*3e457fe3SDavid van Moolenbroek #define _UTIL_STDLIB_H
3*3e457fe3SDavid van Moolenbroek 
4*3e457fe3SDavid van Moolenbroek #include "util_def.h"
5*3e457fe3SDavid van Moolenbroek 
6*3e457fe3SDavid van Moolenbroek #include <string.h>
7*3e457fe3SDavid van Moolenbroek 
8*3e457fe3SDavid van Moolenbroek typedef struct util_stdlib_s {
9*3e457fe3SDavid van Moolenbroek     int id;
10*3e457fe3SDavid van Moolenbroek     char *name;
11*3e457fe3SDavid van Moolenbroek     unsigned long flags;
12*3e457fe3SDavid van Moolenbroek } util_stdlib_t;
13*3e457fe3SDavid van Moolenbroek 
14*3e457fe3SDavid van Moolenbroek typedef enum util_stdlib_id_e {
15*3e457fe3SDavid van Moolenbroek     STDLIB_ACCEPT = 0,
16*3e457fe3SDavid van Moolenbroek     STDLIB_ACCEPT4,
17*3e457fe3SDavid van Moolenbroek     STDLIB_BIND,
18*3e457fe3SDavid van Moolenbroek     STDLIB_BRK,
19*3e457fe3SDavid van Moolenbroek     STDLIB_CALLOC,
20*3e457fe3SDavid van Moolenbroek     STDLIB_EPOLL_CREATE,
21*3e457fe3SDavid van Moolenbroek     STDLIB_EPOLL_CREATE1,
22*3e457fe3SDavid van Moolenbroek     STDLIB_EPOLL_WAIT,
23*3e457fe3SDavid van Moolenbroek     STDLIB_FREE,
24*3e457fe3SDavid van Moolenbroek     STDLIB_GETSOCKOPT,
25*3e457fe3SDavid van Moolenbroek     STDLIB_KILL,
26*3e457fe3SDavid van Moolenbroek     STDLIB_LISTEN,
27*3e457fe3SDavid van Moolenbroek     STDLIB_MALLOC,
28*3e457fe3SDavid van Moolenbroek     STDLIB_MEMALIGN,
29*3e457fe3SDavid van Moolenbroek     STDLIB_MMAP,
30*3e457fe3SDavid van Moolenbroek     STDLIB_MMAP64,
31*3e457fe3SDavid van Moolenbroek     STDLIB_MUNMAP,
32*3e457fe3SDavid van Moolenbroek     STDLIB_POLL,
33*3e457fe3SDavid van Moolenbroek     STDLIB_POSIX_MEMALIGN,
34*3e457fe3SDavid van Moolenbroek     STDLIB_PPOLL,
35*3e457fe3SDavid van Moolenbroek     STDLIB_PTHREAD_COND_WAIT,
36*3e457fe3SDavid van Moolenbroek     STDLIB_PTHREAD_COND_TIMEDWAIT,
37*3e457fe3SDavid van Moolenbroek     STDLIB_PTHREAD_JOIN,
38*3e457fe3SDavid van Moolenbroek     STDLIB_READ,
39*3e457fe3SDavid van Moolenbroek     STDLIB_REALLOC,
40*3e457fe3SDavid van Moolenbroek     STDLIB_RECV,
41*3e457fe3SDavid van Moolenbroek     STDLIB_RECVFROM,
42*3e457fe3SDavid van Moolenbroek     STDLIB_RECVMSG,
43*3e457fe3SDavid van Moolenbroek     STDLIB_SBRK,
44*3e457fe3SDavid van Moolenbroek     STDLIB_SELECT,
45*3e457fe3SDavid van Moolenbroek     STDLIB_SEMOP,
46*3e457fe3SDavid van Moolenbroek     STDLIB_SEMTIMEDOP,
47*3e457fe3SDavid van Moolenbroek     STDLIB_SETSOCKOPT,
48*3e457fe3SDavid van Moolenbroek     STDLIB_SHMAT,
49*3e457fe3SDavid van Moolenbroek     STDLIB_SHMDT,
50*3e457fe3SDavid van Moolenbroek     STDLIB_SIGSUSPEND,
51*3e457fe3SDavid van Moolenbroek     STDLIB_SIGTIMEDWAIT,
52*3e457fe3SDavid van Moolenbroek     STDLIB_SIGWAITINFO,
53*3e457fe3SDavid van Moolenbroek     STDLIB_SLEEP,
54*3e457fe3SDavid van Moolenbroek     STDLIB_SOCKET,
55*3e457fe3SDavid van Moolenbroek     STDLIB_USLEEP,
56*3e457fe3SDavid van Moolenbroek     STDLIB_VALLOC,
57*3e457fe3SDavid van Moolenbroek     STDLIB_WAITPID,
58*3e457fe3SDavid van Moolenbroek     __NUM_STDLIBS_IDS
59*3e457fe3SDavid van Moolenbroek } util_stdlib_id_t;
60*3e457fe3SDavid van Moolenbroek 
61*3e457fe3SDavid van Moolenbroek typedef enum util_stdlib_flag_e {
62*3e457fe3SDavid van Moolenbroek     STLIB_BLOCK_EXT = 0,
63*3e457fe3SDavid van Moolenbroek     STLIB_BLOCK_INT,
64*3e457fe3SDavid van Moolenbroek     __NUM_STDLIBS_FLAGS
65*3e457fe3SDavid van Moolenbroek } util_stdlib_flag_t;
66*3e457fe3SDavid van Moolenbroek #define _UTIL_STLIB_FLAGS_STR    "ei"
67*3e457fe3SDavid van Moolenbroek 
68*3e457fe3SDavid van Moolenbroek #define _UTIL_STLIB_FLAG(F) (1 << (F))
69*3e457fe3SDavid van Moolenbroek #define _UTIL_STLIB_BLOCK_MASK \
70*3e457fe3SDavid van Moolenbroek     (_UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)|_UTIL_STLIB_FLAG(STLIB_BLOCK_INT))
71*3e457fe3SDavid van Moolenbroek 
72*3e457fe3SDavid van Moolenbroek #define _UTIL_STLIB_FLAGS_STR_BUFF_SIZE (__NUM_STDLIBS_FLAGS+1)
73*3e457fe3SDavid van Moolenbroek #define _UTIL_STLIB_FLAG_C(F, E) \
74*3e457fe3SDavid van Moolenbroek     (((F) & _UTIL_STLIB_FLAG(E)) ? _UTIL_STLIB_FLAGS_STR[E] : '-')
75*3e457fe3SDavid van Moolenbroek 
76*3e457fe3SDavid van Moolenbroek #define _UTIL_STDLIB_DEF(ID, N, F) { (ID), (N), (F) }
77*3e457fe3SDavid van Moolenbroek #define _UTIL_STDLIBS_INITIALIZER { \
78*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_ACCEPT,                 "accept",                 _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
79*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_ACCEPT4,                "accept4",                _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
80*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_BIND,                   "bind",                   0), \
81*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_BRK,                    "brk",                    0), \
82*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_CALLOC,                 "calloc",                 0), \
83*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_EPOLL_CREATE,           "epoll_create",           0), \
84*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_EPOLL_CREATE1,          "epoll_create1",          0), \
85*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_EPOLL_WAIT,             "epoll_wait",             _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
86*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_FREE,                   "free",                   0), \
87*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_GETSOCKOPT,             "getsockopt",             0), \
88*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_KILL,                   "kill",                   0), \
89*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_LISTEN,                 "listen",                 0), \
90*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_MALLOC,                 "malloc",                 0), \
91*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_MEMALIGN,               "memalign",               0), \
92*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_MMAP,                   "mmap",                   0), \
93*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_MMAP64,                 "mmap64",                 0), \
94*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_MUNMAP,                 "munmap",                 0), \
95*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_POLL,                   "poll",                   _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
96*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_POSIX_MEMALIGN,         "posix_memalign",         0), \
97*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_PPOLL,                  "ppoll",                  _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
98*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_PTHREAD_COND_WAIT,      "pthread_cond_wait",      _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
99*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_PTHREAD_COND_TIMEDWAIT, "pthread_cond_timedwait", _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
100*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_PTHREAD_JOIN,           "pthread_join",           _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
101*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_READ,                   "read",                   _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
102*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_REALLOC,                "realloc",                0), \
103*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_RECV,                   "recv",                   _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
104*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_RECVFROM,               "recvfrom",               _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
105*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_RECVMSG,                "recvsmg",                _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
106*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_SBRK,                   "sbrk",                   0), \
107*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_SELECT,                 "select",                 _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
108*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_SEMOP,                  "semop",                  _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
109*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_SEMTIMEDOP,             "semtimedop",             _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
110*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_SETSOCKOPT,             "setsockopt",             0), \
111*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_SHMAT,                  "shmat",                  0), \
112*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_SHMDT,                  "shmdt",                  0), \
113*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_SIGSUSPEND,             "sigsuspend",             _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
114*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_SIGTIMEDWAIT,           "sigtimedwait",           _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
115*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_SIGWAITINFO,            "sigwaitinfo",            _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
116*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_SLEEP,                  "sleep",                  _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
117*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_SOCKET,                 "socket",                 0), \
118*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_USLEEP,                 "usleep",                 _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
119*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_VALLOC,                 "valloc",                 0), \
120*3e457fe3SDavid van Moolenbroek     _UTIL_STDLIB_DEF(STDLIB_WAITPID,                "waitpid",                _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)) \
121*3e457fe3SDavid van Moolenbroek }
122*3e457fe3SDavid van Moolenbroek 
util_stdlib_lookup_by_name(const char * name,util_stdlib_t * stlib_arr)123*3e457fe3SDavid van Moolenbroek static inline util_stdlib_t* util_stdlib_lookup_by_name(const char *name, util_stdlib_t *stlib_arr)
124*3e457fe3SDavid van Moolenbroek {
125*3e457fe3SDavid van Moolenbroek     int i;
126*3e457fe3SDavid van Moolenbroek     for (i=0;i<__NUM_STDLIBS_IDS;i++) {
127*3e457fe3SDavid van Moolenbroek         if (!strcmp(name, stlib_arr[i].name)) {
128*3e457fe3SDavid van Moolenbroek             return &stlib_arr[i];
129*3e457fe3SDavid van Moolenbroek         }
130*3e457fe3SDavid van Moolenbroek     }
131*3e457fe3SDavid van Moolenbroek 
132*3e457fe3SDavid van Moolenbroek     return NULL;
133*3e457fe3SDavid van Moolenbroek }
134*3e457fe3SDavid van Moolenbroek 
util_stdlib_flags_to_str(unsigned long flags,char * buffer)135*3e457fe3SDavid van Moolenbroek static inline char* util_stdlib_flags_to_str(unsigned long flags,
136*3e457fe3SDavid van Moolenbroek     char* buffer)
137*3e457fe3SDavid van Moolenbroek {
138*3e457fe3SDavid van Moolenbroek     int i;
139*3e457fe3SDavid van Moolenbroek     for(i=0;i<__NUM_STDLIBS_FLAGS;i++) {
140*3e457fe3SDavid van Moolenbroek         buffer[i] = _UTIL_STLIB_FLAG_C(flags, i);
141*3e457fe3SDavid van Moolenbroek     }
142*3e457fe3SDavid van Moolenbroek     buffer[i] = '\0';
143*3e457fe3SDavid van Moolenbroek 
144*3e457fe3SDavid van Moolenbroek     return buffer;
145*3e457fe3SDavid van Moolenbroek }
146*3e457fe3SDavid van Moolenbroek 
147*3e457fe3SDavid van Moolenbroek #endif /* _UTIL_STDLIB_H */
148*3e457fe3SDavid van Moolenbroek 
149