return pool->tmpspacebuf[n];
}
+static char *
+pool_alloctmpspace_free(Pool *pool, const char *space, int len)
+{
+ if (space)
+ {
+ int n, oldn;
+ n = oldn = pool->tmpspacen;
+ for (;;)
+ {
+ if (!n--)
+ n = POOL_TMPSPACEBUF - 1;
+ if (n == oldn)
+ break;
+ if (pool->tmpspacebuf[n] != space)
+ continue;
+ if (len > pool->tmpspacelen[n])
+ {
+ pool->tmpspacebuf[n] = sat_realloc(pool->tmpspacebuf[n], len + 32);
+ pool->tmpspacelen[n] = len + 32;
+ }
+ return pool->tmpspacebuf[n];
+ }
+ }
+ return 0;
+}
+
+void
+pool_freetmpspace(Pool *pool, const char *space)
+{
+ int n = pool->tmpspacen;
+ if (!space)
+ return;
+ n = (n + (POOL_TMPSPACEBUF - 1)) % POOL_TMPSPACEBUF;
+ if (pool->tmpspacebuf[n] == space)
+ pool->tmpspacen = n;
+}
+
char *
pool_tmpjoin(Pool *pool, const char *str1, const char *str2, const char *str3)
{
return str;
}
+char *
+pool_tmpappend(Pool *pool, const char *str1, const char *str2, const char *str3)
+{
+ int l1, l2, l3;
+ char *s, *str;
+
+ l1 = str1 ? strlen(str1) : 0;
+ l2 = str2 ? strlen(str2) : 0;
+ l3 = str3 ? strlen(str3) : 0;
+ str = pool_alloctmpspace_free(pool, str1, l1 + l2 + l3 + 1);
+ if (str)
+ str1 = str;
+ else
+ str = pool_alloctmpspace(pool, l1 + l2 + l3 + 1);
+ s = str;
+ if (l1)
+ {
+ if (s != str1)
+ strcpy(s, str1);
+ s += l1;
+ }
+ if (l2)
+ {
+ strcpy(s, str2);
+ s += l2;
+ }
+ if (l3)
+ {
+ strcpy(s, str3);
+ s += l3;
+ }
+ *s = 0;
+ return str;
+}
+
+const char *
+pool_bin2hex(Pool *pool, const unsigned char *buf, int len)
+{
+ char *s;
+ if (!len)
+ return "";
+ s = pool_alloctmpspace(pool, 2 * len + 1);
+ sat_bin2hex(buf, len, s);
+ return s;
+}
/*******************************************************************/
extern void pool_debug(Pool *pool, int type, const char *format, ...) __attribute__((format(printf, 3, 4)));
extern char *pool_alloctmpspace(Pool *pool, int len);
+extern void pool_freetmpspace(Pool *pool, const char *space);
extern char *pool_tmpjoin(Pool *pool, const char *str1, const char *str2, const char *str3);
+extern char *pool_tmpappend(Pool *pool, const char *str1, const char *str2, const char *str3);
+extern const char *pool_bin2hex(Pool *pool, const unsigned char *buf, int len);
extern void pool_set_installed(Pool *pool, struct _Repo *repo);
data->attrdatalen += l;
}
-static int
-hexstr2bytes(unsigned char *buf, const char *str, int buflen)
-{
- int i;
- for (i = 0; i < buflen; i++)
- {
-#define c2h(c) (((c)>='0' && (c)<='9') ? ((c)-'0') \
- : ((c)>='a' && (c)<='f') ? ((c)-('a'-10)) \
- : ((c)>='A' && (c)<='F') ? ((c)-('A'-10)) \
- : -1)
- int v = c2h(*str);
- str++;
- if (v < 0)
- return 0;
- buf[i] = v;
- v = c2h(*str);
- str++;
- if (v < 0)
- return 0;
- buf[i] = (buf[i] << 4) | v;
-#undef c2h
- }
- return buflen;
-}
-
void
repodata_set_checksum(Repodata *data, Id solvid, Id keyname, Id type,
const char *str)
if (!(l = sat_chksum_len(type)))
return;
- if (hexstr2bytes(buf, str, l) != l)
+ if (l > sizeof(buf) || sat_hex2bin(&str, buf, l) != l)
return;
repodata_set_bin_checksum(data, solvid, keyname, type, buf);
}
const char *
repodata_chk2str(Repodata *data, Id type, const unsigned char *buf)
{
- int i, l;
- char *str, *s;
+ int l;
if (!(l = sat_chksum_len(type)))
return "";
- s = str = pool_alloctmpspace(data->repo->pool, 2 * l + 1);
- for (i = 0; i < l; i++)
- {
- unsigned char v = buf[i];
- unsigned char w = v >> 4;
- *s++ = w >= 10 ? w + ('a' - 10) : w + '0';
- w = v & 15;
- *s++ = w >= 10 ? w + ('a' - 10) : w + '0';
- }
- *s = 0;
- return str;
+ return pool_bin2hex(data->repo->pool, buf, l);
}
/* rpm filenames don't contain the epoch, so strip it */
#include "pool.h"
#include "repo.h"
#include "util.h"
+#include "chksum.h"
const char *
solvable2str(Pool *pool, Solvable *s)
solvable_lookup_checksum(Solvable *s, Id keyname, Id *typep)
{
const unsigned char *chk = solvable_lookup_bin_checksum(s, keyname, typep);
- /* we need the repodata just as a reference for a pool */
- return chk ? repodata_chk2str(s->repo->repodata, *typep, chk) : 0;
+ return chk ? pool_bin2hex(s->repo->pool, chk, sat_chksum_len(*typep)) : 0;
}
static inline const char *
if (select == SOLVER_SOLVABLE_ONE_OF)
{
Id p;
- char *b2;
- b = "";
+ b = 0;
while ((p = pool->whatprovidesdata[what++]) != 0)
{
s = solvid2str(pool, p);
- b2 = pool_alloctmpspace(pool, strlen(b) + strlen(s) + 3);
- sprintf(b2, "%s, %s", b, s);
- b = b2;
+ if (b)
+ b = pool_tmpappend(pool, b, ", ", s);
+ else
+ b = pool_tmpjoin(pool, s, 0, 0);
+ pool_freetmpspace(pool, s);
}
- return *b ? b + 2 : "nothing";
+ return b ? b : "nothing";
}
if (select == SOLVER_SOLVABLE_REPO)
{
*s = 0;
return str;
}
+
+char *
+sat_dupappend(const char *str1, const char *str2, const char *str3)
+{
+ char *str = sat_dupjoin(str1, str2, str3);
+ sat_free((void *)str1);
+ return str;
+}
+
+int
+sat_hex2bin(const char **strp, unsigned char *buf, int bufl)
+{
+ const char *str = *strp;
+ int i;
+
+ for (i = 0; i < bufl; i++)
+ {
+ int c = *str;
+ int d;
+ if (c >= '0' && c <= '9')
+ d = c - '0';
+ else if (c >= 'a' && c <= 'f')
+ d = c - ('a' - 10);
+ else if (c >= 'A' && c <= 'F')
+ d = c - ('A' - 10);
+ else
+ break;
+ c = *++str;
+ d <<= 4;
+ if (c >= '0' && c <= '9')
+ d |= c - '0';
+ else if (c >= 'a' && c <= 'f')
+ d |= c - ('a' - 10);
+ else if (c >= 'A' && c <= 'F')
+ d |= c - ('A' - 10);
+ else
+ break;
+ buf[i] = d;
+ ++str;
+ }
+ *strp = str;
+ return i;
+}
+
+char *
+sat_bin2hex(const unsigned char *buf, int l, char *str)
+{
+ int i;
+ for (i = 0; i < l; i++, buf++)
+ {
+ int c = *buf >> 4;
+ *str++ = c < 10 ? c + '0' : c + ('a' - 10);
+ c = *buf & 15;
+ *str++ = c < 10 ? c + '0' : c + ('a' - 10);
+ }
+ *str = 0;
+ return str;
+}
+
+
extern unsigned int sat_timems(unsigned int subtract);
extern void sat_sort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *, void *), void *compard);
extern char *sat_dupjoin(const char *str1, const char *str2, const char *str3);
+extern char *sat_dupappend(const char *str1, const char *str2, const char *str3);
+extern int sat_hex2bin(const char **strp, unsigned char *buf, int bufl);
+extern char *sat_bin2hex(const unsigned char *buf, int l, char *str);
+
static inline void *sat_extend(void *buf, size_t len, size_t nmemb, size_t size, size_t block)
{