return usebase ? basestr : 0;
}
+static Id *
+pool_lookup_languagecache_row(Pool *pool, Id keyname)
+{
+ int cols = pool->nlanguages + 1;
+ Id *row;
+ if (!pool->languagecache)
+ {
+ pool->languagecache = solv_calloc(ID_NUM_INTERNAL + cols + 1, sizeof(Id));
+ pool->languagecache[0] = ID_NUM_INTERNAL; /* current size */
+ }
+ if (keyname > 0 && keyname < ID_NUM_INTERNAL)
+ {
+ if (cols == 2)
+ return pool->languagecache + keyname; /* special case for just one language */
+ if (pool->languagecache[keyname])
+ return pool->languagecache + pool->languagecache[keyname];
+ }
+ else
+ {
+ /* find our row, terminate if we reach the trailing zero */
+ for (row = pool->languagecache + ID_NUM_INTERNAL; *row; row += cols)
+ if (*row == keyname)
+ return row + 1;
+ }
+ /* we need to add a new row (plus the trailing zero) */
+ if (pool->languagecache[0] + cols + 1 >= SOLV_MAX_INDEX)
+ solv_ovfl("languagecache size overflow");
+ pool->languagecache = solv_realloc2(pool->languagecache, pool->languagecache[0] + cols + 1, sizeof(Id));
+ if (keyname < ID_NUM_INTERNAL)
+ pool->languagecache[keyname] = pool->languagecache[0] + 1;
+ row = pool->languagecache + pool->languagecache[0];
+ pool->languagecache[0] += cols;
+ memset(row, 0, (cols + 1) * sizeof(Id)); /* +1 for the trailing zero */
+ *row = keyname;
+ return row + 1;
+}
+
const char *
solvable_lookup_str_poollang(Solvable *s, Id keyname)
{
Pool *pool;
- int i, cols;
+ int i;
const char *str;
Id *row;
if (!s->repo)
return 0;
pool = s->repo->pool;
- if (!pool->nlanguages)
+ if (!pool->nlanguages || !keyname)
return solvable_lookup_str(s, keyname);
- cols = pool->nlanguages + 1;
- if (!pool->languagecache)
- {
- pool->languagecache = solv_calloc(ID_NUM_INTERNAL, cols * sizeof(Id));
- pool->languagecacheother = 0;
- }
- if (keyname >= ID_NUM_INTERNAL)
- {
- row = pool->languagecache + ID_NUM_INTERNAL * cols;
- for (i = 0; i < pool->languagecacheother; i++, row += cols)
- if (*row == keyname)
- break;
- if (i >= pool->languagecacheother)
- {
- pool->languagecache = solv_realloc2(pool->languagecache, pool->languagecacheother + 1, cols * sizeof(Id));
- row = pool->languagecache + cols * (ID_NUM_INTERNAL + pool->languagecacheother++);
- *row = keyname;
- }
- }
- else
- row = pool->languagecache + keyname * cols;
- row++; /* skip keyname */
+ /* the languagecache caches the pool_id2langid result for all configured languages */
+ row = pool_lookup_languagecache_row(pool, keyname);
for (i = 0; i < pool->nlanguages; i++, row++)
{
if (!*row)