David van Moolenbroek 3e457fe321 Import magic pass from llvm-apps
Change-Id: I19535b913b50f2ff24aeb80ddefc92e305c31fe8
2015-09-17 13:57:53 +00:00

149 lines
6.4 KiB
C

#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 */