1 /* 2 * Copyright (c) 2007, Novell Inc. 3 * 4 * This program is licensed under the BSD license, read LICENSE.BSD 5 * for further information 6 */ 7 8 /* 9 * util.h 10 * 11 */ 12 13 #ifndef LIBSOLV_UTIL_H 14 #define LIBSOLV_UTIL_H 15 16 #include <stddef.h> 17 #include <string.h> 18 19 #ifdef __cplusplus 20 extern "C" { 21 #endif 22 23 /** 24 * malloc 25 * exits with error message on error 26 */ 27 extern void *solv_malloc(size_t); 28 extern void *solv_malloc2(size_t, size_t); 29 extern void *solv_calloc(size_t, size_t); 30 extern void *solv_realloc(void *, size_t); 31 extern void *solv_realloc2(void *, size_t, size_t); 32 extern void *solv_free(void *); 33 extern char *solv_strdup(const char *); 34 extern void solv_oom(size_t, size_t); 35 extern unsigned int solv_timems(unsigned int subtract); 36 extern void solv_sort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *, void *), void *compard); 37 extern char *solv_dupjoin(const char *str1, const char *str2, const char *str3); 38 extern char *solv_dupappend(const char *str1, const char *str2, const char *str3); 39 extern int solv_hex2bin(const char **strp, unsigned char *buf, int bufl); 40 extern char *solv_bin2hex(const unsigned char *buf, int l, char *str); 41 42 43 static inline void *solv_extend(void *buf, size_t len, size_t nmemb, size_t size, size_t block) 44 { 45 if (nmemb == 1) 46 { 47 if ((len & block) == 0) 48 buf = solv_realloc2(buf, len + (1 + block), size); 49 } 50 else 51 { 52 if (((len - 1) | block) != ((len + nmemb - 1) | block)) 53 buf = solv_realloc2(buf, (len + (nmemb + block)) & ~block, size); 54 } 55 return buf; 56 } 57 58 /** 59 * extend an array by reallocation and zero's the new section 60 * buf old pointer 61 * len current size 62 * nmbemb number of elements to add 63 * size size of each element 64 * block block size used to allocate the elements 65 */ 66 static inline void *solv_zextend(void *buf, size_t len, size_t nmemb, size_t size, size_t block) 67 { 68 buf = solv_extend(buf, len, nmemb, size, block); 69 memset((char *)buf + len * size, 0, nmemb * size); 70 return buf; 71 } 72 73 static inline void *solv_extend_resize(void *buf, size_t len, size_t size, size_t block) 74 { 75 if (len) 76 buf = solv_realloc2(buf, (len + block) & ~block, size); 77 return buf; 78 } 79 80 static inline void *solv_calloc_block(size_t len, size_t size, size_t block) 81 { 82 void *buf; 83 if (!len) 84 return 0; 85 buf = solv_malloc2((len + block) & ~block, size); 86 memset(buf, 0, ((len + block) & ~block) * size); 87 return buf; 88 } 89 90 #ifdef __cplusplus 91 } 92 #endif 93 94 #endif /* LIBSOLV_UTIL_H */ 95