2 * Copyright (c) 2007, Novell Inc.
4 * This program is licensed under the BSD license, read LICENSE.BSD
5 * for further information
19 solv_oom(size_t num, size_t len)
22 fprintf(stderr, "Out of memory allocating %zu*%zu bytes!\n", num, len);
24 fprintf(stderr, "Out of memory allocating %zu bytes!\n", len);
30 solv_malloc(size_t len)
32 void *r = malloc(len ? len : 1);
39 solv_malloc2(size_t num, size_t len)
41 if (len && (num * len) / len != num)
43 return solv_malloc(num * len);
47 solv_realloc(void *old, size_t len)
50 old = malloc(len ? len : 1);
52 old = realloc(old, len ? len : 1);
59 solv_realloc2(void *old, size_t num, size_t len)
61 if (len && (num * len) / len != num)
63 return solv_realloc(old, num * len);
67 solv_calloc(size_t num, size_t len)
70 if (num == 0 || len == 0)
88 solv_strdup(const char *s)
95 solv_oom(0, strlen(s));
100 solv_timems(unsigned int subtract)
105 if (gettimeofday(&tv, 0))
107 r = (((unsigned int)tv.tv_sec >> 16) * 1000) << 16;
108 r += ((unsigned int)tv.tv_sec & 0xffff) * 1000;
109 r += (unsigned int)tv.tv_usec / 1000;
113 /* bsd's qsort_r has different arguments, so we define our
114 own version in case we need to do some clever mapping
116 see also: http://sources.redhat.com/ml/libc-alpha/2008-12/msg00003.html
118 #if defined(__GLIBC__) && (defined(HAVE_QSORT_R) || defined(HAVE___QSORT_R))
121 solv_sort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *, void *), void *compard)
123 # if defined(HAVE_QSORT_R)
124 qsort_r(base, nmemb, size, compar, compard);
126 /* backported for SLE10-SP2 */
127 __qsort_r(base, nmemb, size, compar, compard);
132 #elif defined(HAVE_QSORT_R) /* not glibc, but has qsort_r() */
134 struct solv_sort_data {
135 int (*compar)(const void *, const void *, void *);
140 solv_sort_helper(void *compard, const void *a, const void *b)
142 struct solv_sort_data *d = compard;
143 return (*d->compar)(a, b, d->compard);
147 solv_sort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *, void *), void *compard)
149 struct solv_sort_data d;
152 qsort_r(base, nmemb, size, &d, solv_sort_helper);
155 #else /* not glibc and no qsort_r() */
156 /* use own version of qsort if none available */
161 solv_dupjoin(const char *str1, const char *str2, const char *str3)
165 l1 = str1 ? strlen(str1) : 0;
166 l2 = str2 ? strlen(str2) : 0;
167 l3 = str3 ? strlen(str3) : 0;
168 s = str = solv_malloc(l1 + l2 + l3 + 1);
189 solv_dupappend(const char *str1, const char *str2, const char *str3)
191 char *str = solv_dupjoin(str1, str2, str3);
192 solv_free((void *)str1);
197 solv_hex2bin(const char **strp, unsigned char *buf, int bufl)
199 const char *str = *strp;
202 for (i = 0; i < bufl; i++)
206 if (c >= '0' && c <= '9')
208 else if (c >= 'a' && c <= 'f')
210 else if (c >= 'A' && c <= 'F')
216 if (c >= '0' && c <= '9')
218 else if (c >= 'a' && c <= 'f')
220 else if (c >= 'A' && c <= 'F')
232 solv_bin2hex(const unsigned char *buf, int l, char *str)
235 for (i = 0; i < l; i++, buf++)
238 *str++ = c < 10 ? c + '0' : c + ('a' - 10);
240 *str++ = c < 10 ? c + '0' : c + ('a' - 10);