summaryrefslogtreecommitdiff
path: root/minix/llvm/include/common/util/stdlib.h
blob: 19a3c6d81210aae23c30b373c61abee5760131ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#ifndef _UTIL_STDLIB_H
#define _UTIL_STDLIB_H

#include "util_def.h"

#include <string.h>

typedef struct util_stdlib_s {
    int id;
    char *name;
    unsigned long flags;
} util_stdlib_t;

typedef enum util_stdlib_id_e {
    STDLIB_ACCEPT = 0,
    STDLIB_ACCEPT4,
    STDLIB_BIND,
    STDLIB_BRK,
    STDLIB_CALLOC,
    STDLIB_EPOLL_CREATE,
    STDLIB_EPOLL_CREATE1,
    STDLIB_EPOLL_WAIT,
    STDLIB_FREE,
    STDLIB_GETSOCKOPT,
    STDLIB_KILL,
    STDLIB_LISTEN,
    STDLIB_MALLOC,
    STDLIB_MEMALIGN,
    STDLIB_MMAP,
    STDLIB_MMAP64,
    STDLIB_MUNMAP,
    STDLIB_POLL,
    STDLIB_POSIX_MEMALIGN,
    STDLIB_PPOLL,
    STDLIB_PTHREAD_COND_WAIT,
    STDLIB_PTHREAD_COND_TIMEDWAIT,
    STDLIB_PTHREAD_JOIN,
    STDLIB_READ,
    STDLIB_REALLOC,
    STDLIB_RECV,
    STDLIB_RECVFROM,
    STDLIB_RECVMSG,
    STDLIB_SBRK,
    STDLIB_SELECT,
    STDLIB_SEMOP,
    STDLIB_SEMTIMEDOP,
    STDLIB_SETSOCKOPT,
    STDLIB_SHMAT,
    STDLIB_SHMDT,
    STDLIB_SIGSUSPEND,
    STDLIB_SIGTIMEDWAIT,
    STDLIB_SIGWAITINFO,
    STDLIB_SLEEP,
    STDLIB_SOCKET,
    STDLIB_USLEEP,
    STDLIB_VALLOC,
    STDLIB_WAITPID,
    __NUM_STDLIBS_IDS
} util_stdlib_id_t;

typedef enum util_stdlib_flag_e {
    STLIB_BLOCK_EXT = 0,
    STLIB_BLOCK_INT,
    __NUM_STDLIBS_FLAGS
} util_stdlib_flag_t;
#define _UTIL_STLIB_FLAGS_STR    "ei"

#define _UTIL_STLIB_FLAG(F) (1 << (F))
#define _UTIL_STLIB_BLOCK_MASK \
    (_UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)|_UTIL_STLIB_FLAG(STLIB_BLOCK_INT))

#define _UTIL_STLIB_FLAGS_STR_BUFF_SIZE (__NUM_STDLIBS_FLAGS+1)
#define _UTIL_STLIB_FLAG_C(F, E) \
    (((F) & _UTIL_STLIB_FLAG(E)) ? _UTIL_STLIB_FLAGS_STR[E] : '-')

#define _UTIL_STDLIB_DEF(ID, N, F) { (ID), (N), (F) }
#define _UTIL_STDLIBS_INITIALIZER { \
    _UTIL_STDLIB_DEF(STDLIB_ACCEPT,                 "accept",                 _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
    _UTIL_STDLIB_DEF(STDLIB_ACCEPT4,                "accept4",                _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
    _UTIL_STDLIB_DEF(STDLIB_BIND,                   "bind",                   0), \
    _UTIL_STDLIB_DEF(STDLIB_BRK,                    "brk",                    0), \
    _UTIL_STDLIB_DEF(STDLIB_CALLOC,                 "calloc",                 0), \
    _UTIL_STDLIB_DEF(STDLIB_EPOLL_CREATE,           "epoll_create",           0), \
    _UTIL_STDLIB_DEF(STDLIB_EPOLL_CREATE1,          "epoll_create1",          0), \
    _UTIL_STDLIB_DEF(STDLIB_EPOLL_WAIT,             "epoll_wait",             _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
    _UTIL_STDLIB_DEF(STDLIB_FREE,                   "free",                   0), \
    _UTIL_STDLIB_DEF(STDLIB_GETSOCKOPT,             "getsockopt",             0), \
    _UTIL_STDLIB_DEF(STDLIB_KILL,                   "kill",                   0), \
    _UTIL_STDLIB_DEF(STDLIB_LISTEN,                 "listen",                 0), \
    _UTIL_STDLIB_DEF(STDLIB_MALLOC,                 "malloc",                 0), \
    _UTIL_STDLIB_DEF(STDLIB_MEMALIGN,               "memalign",               0), \
    _UTIL_STDLIB_DEF(STDLIB_MMAP,                   "mmap",                   0), \
    _UTIL_STDLIB_DEF(STDLIB_MMAP64,                 "mmap64",                 0), \
    _UTIL_STDLIB_DEF(STDLIB_MUNMAP,                 "munmap",                 0), \
    _UTIL_STDLIB_DEF(STDLIB_POLL,                   "poll",                   _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
    _UTIL_STDLIB_DEF(STDLIB_POSIX_MEMALIGN,         "posix_memalign",         0), \
    _UTIL_STDLIB_DEF(STDLIB_PPOLL,                  "ppoll",                  _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
    _UTIL_STDLIB_DEF(STDLIB_PTHREAD_COND_WAIT,      "pthread_cond_wait",      _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
    _UTIL_STDLIB_DEF(STDLIB_PTHREAD_COND_TIMEDWAIT, "pthread_cond_timedwait", _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
    _UTIL_STDLIB_DEF(STDLIB_PTHREAD_JOIN,           "pthread_join",           _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
    _UTIL_STDLIB_DEF(STDLIB_READ,                   "read",                   _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
    _UTIL_STDLIB_DEF(STDLIB_REALLOC,                "realloc",                0), \
    _UTIL_STDLIB_DEF(STDLIB_RECV,                   "recv",                   _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
    _UTIL_STDLIB_DEF(STDLIB_RECVFROM,               "recvfrom",               _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
    _UTIL_STDLIB_DEF(STDLIB_RECVMSG,                "recvsmg",                _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
    _UTIL_STDLIB_DEF(STDLIB_SBRK,                   "sbrk",                   0), \
    _UTIL_STDLIB_DEF(STDLIB_SELECT,                 "select",                 _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
    _UTIL_STDLIB_DEF(STDLIB_SEMOP,                  "semop",                  _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
    _UTIL_STDLIB_DEF(STDLIB_SEMTIMEDOP,             "semtimedop",             _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
    _UTIL_STDLIB_DEF(STDLIB_SETSOCKOPT,             "setsockopt",             0), \
    _UTIL_STDLIB_DEF(STDLIB_SHMAT,                  "shmat",                  0), \
    _UTIL_STDLIB_DEF(STDLIB_SHMDT,                  "shmdt",                  0), \
    _UTIL_STDLIB_DEF(STDLIB_SIGSUSPEND,             "sigsuspend",             _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
    _UTIL_STDLIB_DEF(STDLIB_SIGTIMEDWAIT,           "sigtimedwait",           _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
    _UTIL_STDLIB_DEF(STDLIB_SIGWAITINFO,            "sigwaitinfo",            _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)), \
    _UTIL_STDLIB_DEF(STDLIB_SLEEP,                  "sleep",                  _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
    _UTIL_STDLIB_DEF(STDLIB_SOCKET,                 "socket",                 0), \
    _UTIL_STDLIB_DEF(STDLIB_USLEEP,                 "usleep",                 _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)), \
    _UTIL_STDLIB_DEF(STDLIB_VALLOC,                 "valloc",                 0), \
    _UTIL_STDLIB_DEF(STDLIB_WAITPID,                "waitpid",                _UTIL_STLIB_FLAG(STLIB_BLOCK_INT)) \
}

static inline util_stdlib_t* util_stdlib_lookup_by_name(const char *name, util_stdlib_t *stlib_arr)
{
    int i;
    for (i=0;i<__NUM_STDLIBS_IDS;i++) {
        if (!strcmp(name, stlib_arr[i].name)) {
            return &stlib_arr[i];
        }
    }

    return NULL;
}

static inline char* util_stdlib_flags_to_str(unsigned long flags,
    char* buffer)
{
    int i;
    for(i=0;i<__NUM_STDLIBS_FLAGS;i++) {
        buffer[i] = _UTIL_STLIB_FLAG_C(flags, i);
    }
    buffer[i] = '\0';

    return buffer;
}

#endif /* _UTIL_STDLIB_H */