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