Skip to content

Commit 0f74322

Browse files
committed
Add repodata_lookup_count function
This is currently internal only. It will be used to compare the numbers of track_features entries in conda.
1 parent 30e95f4 commit 0f74322

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

src/repodata.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -841,6 +841,57 @@ repodata_lookup_binary(Repodata *data, Id solvid, Id keyname, int *lenp)
841841
return dp;
842842
}
843843

844+
unsigned int
845+
repodata_lookup_count(Repodata *data, Id solvid, Id keyname)
846+
{
847+
unsigned char *dp;
848+
Repokey *key;
849+
unsigned int cnt = 0;
850+
851+
dp = find_key_data(data, solvid, keyname, &key);
852+
if (!dp)
853+
return 0;
854+
switch (key->type)
855+
{
856+
case REPOKEY_TYPE_IDARRAY:
857+
case REPOKEY_TYPE_REL_IDARRAY:
858+
for (cnt = 1; (*dp & 0xc0) != 0; dp++)
859+
if ((*dp & 0xc0) == 0x40)
860+
cnt++;
861+
return cnt;
862+
case REPOKEY_TYPE_FIXARRAY:
863+
case REPOKEY_TYPE_FLEXARRAY:
864+
data_read_id(dp, (int *)&cnt);
865+
return cnt;
866+
case REPOKEY_TYPE_DIRSTRARRAY:
867+
for (;;)
868+
{
869+
cnt++;
870+
while (*dp & 0x80)
871+
dp++;
872+
if (!(*dp++ & 0x40))
873+
return cnt;
874+
dp += strlen((const char *)dp) + 1;
875+
}
876+
case REPOKEY_TYPE_DIRNUMNUMARRAY:
877+
for (;;)
878+
{
879+
cnt++;
880+
while (*dp++ & 0x80)
881+
;
882+
while (*dp++ & 0x80)
883+
;
884+
while (*dp & 0x80)
885+
dp++;
886+
if (!(*dp++ & 0x40))
887+
return cnt;
888+
}
889+
default:
890+
break;
891+
}
892+
return 1;
893+
}
894+
844895
/* highly specialized function to speed up fileprovides adding.
845896
* - repodata must be available
846897
* - solvid must be >= data->start and < data->end

src/repodata.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ int repodata_lookup_void(Repodata *data, Id solvid, Id keyname);
229229
const unsigned char *repodata_lookup_bin_checksum(Repodata *data, Id solvid, Id keyname, Id *typep);
230230
int repodata_lookup_idarray(Repodata *data, Id solvid, Id keyname, Queue *q);
231231
const void *repodata_lookup_binary(Repodata *data, Id solvid, Id keyname, int *lenp);
232+
unsigned int repodata_lookup_count(Repodata *data, Id solvid, Id keyname); /* internal */
232233

233234
/* internal, used in fileprovides code */
234235
const unsigned char *repodata_lookup_packed_dirstrarray(Repodata *data, Id solvid, Id keyname);

0 commit comments

Comments
 (0)