19 #define _RPMSET_INTERNAL
56 assert(c >= 0 && c <= 61);
60 *base62++ = c - 10 +
'a';
62 *base62++ = c - 36 +
'A';
69 char *base62_start = base62;
74 num6b |= (*bitv++ << bits6++);
75 if (bits6 + bits2 < 6)
114 return base62 - base62_start;
130 #define C1(c, b) [c] = c - b
131 #define C2(c, b) C1(c, b), C1(c + 1, b)
132 #define C5(c, b) C1(c, b), C2(c + 1, b), C2(c + 3, b)
133 #define C10(c, b) C5(c, b), C5(c + 5, b)
135 #define C26(c, b) C1(c, b), C5(c + 1, b), C10(c + 6, b), C10(c + 16, b)
143 *bitv++ = (c >> 0) & 1;
144 *bitv++ = (c >> 1) & 1;
145 *bitv++ = (c >> 2) & 1;
146 *bitv++ = (c >> 3) & 1;
147 *bitv++ = (c >> 4) & 1;
148 *bitv++ = (c >> 5) & 1;
153 *bitv++ = (c >> 0) & 1;
154 *bitv++ = (c >> 1) & 1;
155 *bitv++ = (c >> 2) & 1;
156 *bitv++ = (c >> 3) & 1;
163 char *bitv_start = bitv;
165 long c = (
unsigned char) *base62++;
169 c = (
unsigned char) *base62++;
177 c = (
unsigned char) *base62++;
183 switch (num4b & (16 + 32)) {
200 return bitv - bitv_start;
205 void test_base62(
void)
207 const char rnd_bitv[] = {
208 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1,
209 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1,
210 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0,
211 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0,
213 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
215 const int rnd_bitc =
sizeof rnd_bitv;
220 assert(len == (
int)strlen(base62));
221 fprintf(stderr,
"len=%d base62=%s\n", len, base62);
223 assert(len >= rnd_bitc / 6);
225 assert(len <= rnd_bitc / 2 / 4 + rnd_bitc / 2 / 6 + 1);
229 fprintf(stderr,
"rnd_bitc=%d bitc=%d\n", rnd_bitc, bitc);
230 assert(bitc >= rnd_bitc);
233 for (i = 0; i < rnd_bitc; i++)
234 assert(rnd_bitv[i] == bitv[i]);
236 for (i = rnd_bitc; i < bitc; i++)
237 assert(bitv[i] == 0);
238 fprintf(stderr,
"%s: base62 test OK\n", __FILE__);
279 int Mshift = bpp -
log2i(c) - 1;
285 assert(Mshift < bpp);
297 return Mshift * 2 * c + 16;
304 char *bitv_start = bitv;
305 const unsigned mask = (1 << Mshift) - 1;
311 unsigned q = v0 >> Mshift;
312 for (i = 0; i < (int)q; i++)
316 unsigned r = v0 & mask;
317 for (i = 0; i < Mshift; i++)
318 *bitv++ = (r >> i) & 1;
320 return bitv - bitv_start;
331 return bitc / (Mshift + 1);
338 unsigned *v_start =
v;
353 if (bitc == 0 && bit == 0) {
365 for (i = 0; i < Mshift; i++) {
371 *v++ = (q << Mshift) | r;
378 void test_golomb(
void)
380 const unsigned rnd_v[] = {
386 const int rnd_c =
sizeof rnd_v /
sizeof *rnd_v;
389 fprintf(stderr,
"rnd_c=%d bpp=%d Mshift=%d\n", rnd_c, bpp, Mshift);
391 assert(Mshift < bpp);
394 assert(alloc_bitc > rnd_c);
395 char bitv[alloc_bitc];
397 fprintf(stderr,
"alloc_bitc=%d bitc=%d\n", alloc_bitc, bitc);
398 assert(bitc > rnd_c);
399 assert(bitc <= alloc_bitc);
402 assert(alloc_c >= rnd_c);
405 fprintf(stderr,
"rnd_c=%d alloc_c=%d c=%d\n", rnd_c, alloc_c, c);
406 assert(alloc_c >= c);
410 for (i = 0; i < c; i++)
411 assert(rnd_v[i] == v[i]);
413 int golomb_bpp = bitc / c;
414 fprintf(stderr,
"bpp=%d golomb_bpp=%d\n", bpp, golomb_bpp);
415 assert(golomb_bpp < bpp);
416 fprintf(stderr,
"%s: golomb test OK\n", __FILE__);
443 #if BYTE_ORDER && BYTE_ORDER == LITTLE_ENDIAN
444 #define CCI(c1, c2) ((c1) | ((c2) << 8))
445 #elif BYTE_ORDER && BYTE_ORDER == BIG_ENDIAN
446 #define CCI(c1, c2) ((c2) | ((c1) << 8))
448 #error "unknown byte order"
454 [0 ... 65535] =
W_EE,
455 #define AA1(c1, c2, b1, b2) [CCI(c1, c2)] = (c1 - b1) | ((c2 - b2) << 6)
456 #define AA1x2(c1, c2, b1, b2) AA1(c1, c2, b1, b2), AA1(c1, c2 + 1, b1, b2)
457 #define AA1x3(c1, c2, b1, b2) AA1(c1, c2, b1, b2), AA1x2(c1, c2 + 1, b1, b2)
458 #define AA1x5(c1, c2, b1, b2) AA1x2(c1, c2, b1, b2), AA1x3(c1, c2 + 2, b1, b2)
459 #define AA1x10(c1, c2, b1, b2) AA1x5(c1, c2, b1, b2), AA1x5(c1, c2 + 5, b1, b2)
460 #define AA1x20(c1, c2, b1, b2) AA1x10(c1, c2, b1, b2), AA1x10(c1, c2 + 10, b1, b2)
461 #define AA1x25(c1, c2, b1, b2) AA1x5(c1, c2, b1, b2), AA1x20(c1, c2 + 5, b1, b2)
462 #define AA2x1(c1, c2, b1, b2) AA1(c1, c2, b1, b2), AA1(c1 + 1, c2, b1, b2)
463 #define AA3x1(c1, c2, b1, b2) AA1(c1, c2, b1, b2), AA2x1(c1 + 1, c2, b1, b2)
464 #define AA5x1(c1, c2, b1, b2) AA2x1(c1, c2, b1, b2), AA3x1(c1 + 2, c2, b1, b2)
465 #define AA10x1(c1, c2, b1, b2) AA5x1(c1, c2, b1, b2), AA5x1(c1 + 5, c2, b1, b2)
466 #define AA20x1(c1, c2, b1, b2) AA10x1(c1, c2, b1, b2), AA10x1(c1 + 10, c2, b1, b2)
467 #define AA25x1(c1, c2, b1, b2) AA5x1(c1, c2, b1, b2), AA20x1(c1 + 5, c2, b1, b2)
468 #define AA26x1(c1, c2, b1, b2) AA1(c1, c2, b1, b2), AA25x1(c1 + 1, c2, b1, b2)
469 #define AA2x5(c1, c2, b1, b2) AA1x5(c1, c2, b1, b2), AA1x5(c1 + 1, c2, b1, b2)
470 #define AA3x5(c1, c2, b1, b2) AA1x5(c1, c2, b1, b2), AA2x5(c1 + 1, c2, b1, b2)
471 #define AA5x5(c1, c2, b1, b2) AA2x5(c1, c2, b1, b2), AA3x5(c1 + 2, c2, b1, b2)
472 #define AA5x10(c1, c2, b1, b2) AA5x5(c1, c2, b1, b2), AA5x5(c1, c2 + 5, b1, b2)
473 #define AA10x5(c1, c2, b1, b2) AA5x5(c1, c2, b1, b2), AA5x5(c1 + 5, c2, b1, b2)
474 #define AA20x5(c1, c2, b1, b2) AA10x5(c1, c2, b1, b2), AA10x5(c1 + 10, c2, b1, b2)
475 #define AA25x5(c1, c2, b1, b2) AA5x5(c1, c2, b1, b2), AA20x5(c1 + 5, c2, b1, b2)
476 #define AA10x10(c1, c2, b1, b2) AA5x10(c1, c2, b1, b2), AA5x10(c1 + 5, c2, b1, b2)
477 #define AA10x20(c1, c2, b1, b2) AA10x10(c1, c2, b1, b2), AA10x10(c1, c2 + 10, b1, b2)
478 #define AA10x25(c1, c2, b1, b2) AA10x5(c1, c2, b1, b2), AA10x20(c1, c2 + 5, b1, b2)
479 #define AA10x26(c1, c2, b1, b2) AA10x1(c1, c2, b1, b2), AA10x25(c1, c2 + 1, b1, b2)
480 #define AA20x10(c1, c2, b1, b2) AA10x10(c1, c2, b1, b2), AA10x10(c1 + 10, c2, b1, b2)
481 #define AA25x10(c1, c2, b1, b2) AA5x10(c1, c2, b1, b2), AA20x10(c1 + 5, c2, b1, b2)
482 #define AA26x10(c1, c2, b1, b2) AA1x10(c1, c2, b1, b2), AA25x10(c1 + 1, c2, b1, b2)
483 #define AA25x20(c1, c2, b1, b2) AA25x10(c1, c2, b1, b2), AA25x10(c1, c2 + 10, b1, b2)
484 #define AA25x25(c1, c2, b1, b2) AA25x5(c1, c2, b1, b2), AA25x20(c1, c2 + 5, b1, b2)
485 #define AA25x26(c1, c2, b1, b2) AA25x1(c1, c2, b1, b2), AA25x25(c1, c2 + 1, b1, b2)
486 #define AA26x25(c1, c2, b1, b2) AA1x25(c1, c2, b1, b2), AA25x25(c1 + 1, c2, b1, b2)
487 #define AA26x26(c1, c2, b1, b2) AA26x1(c1, c2, b1, b2), AA26x25(c1, c2 + 1, b1, b2)
489 AA10x26(
'0',
'a',
'0',
'a' + 10),
490 AA10x25(
'0',
'A',
'0',
'A' + 36),
491 AA26x10(
'a',
'0',
'a' + 10,
'0'),
492 AA25x10(
'A',
'0',
'A' + 36,
'0'),
493 AA26x26(
'a',
'a',
'a' + 10,
'a' + 10),
494 AA26x25(
'a',
'A',
'a' + 10,
'A' + 36),
495 AA25x26(
'A',
'a',
'A' + 36,
'a' + 10),
496 AA25x25(
'A',
'A',
'A' + 36,
'A' + 36),
497 #define AZ1(c, b) [CCI(c, 'Z')] = (c - b) | W_AZ
498 #define AZ2(c, b) AZ1(c, b), AZ1(c + 1, b)
499 #define AZ5(c, b) AZ1(c, b), AZ2(c + 1, b), AZ2(c + 3, b)
500 #define AZ10(c, b) AZ5(c, b), AZ5(c + 5, b)
501 #define AZ25(c, b) AZ5(c, b), AZ10(c + 5, b), AZ10(c + 15, b)
502 #define AZ26(c, b) AZ1(c, b), AZ25(c + 1, b)
506 #define ZA1(c, b) [CCI('Z', c)] = (61 + ((c - b) >> 4)) | (((c - b) & 0xf) << 6) | W_ZA
507 #define ZA2(c, b) ZA1(c, b), ZA1(c + 1, b)
508 #define ZA5(c, b) ZA1(c, b), ZA2(c + 1, b), ZA2(c + 3, b)
509 #define ZA10(c, b) ZA5(c, b), ZA5(c + 5, b)
510 #define ZA25(c, b) ZA5(c, b), ZA10(c + 5, b), ZA10(c + 15, b)
511 #define ZA26(c, b) ZA1(c, b), ZA25(c + 1, b)
515 #define A01(c, b) [CCI(c, 0)] = (c - b) | W_A0
516 #define A02(c, b) A01(c, b), A01(c + 1, b)
517 #define A05(c, b) A01(c, b), A02(c + 1, b), A02(c + 3, b)
518 #define A010(c, b) A05(c, b), A05(c + 5, b)
519 #define A025(c, b) A05(c, b), A010(c + 5, b), A010(c + 15, b)
520 #define A026(c, b) A01(c, b), A025(c + 1, b)
524 #define OX(c) [CCI(0, c)] = W_0X
525 #define OX4(c) OX(c), OX(c + 1), OX(c + 2), OX(c + 3)
526 #define OX16(c) OX4(c), OX4(c + 4), OX4(c + 8), OX4(c + 12)
527 #define OX64(c) OX16(c), OX16(c + 16), OX16(c + 32), OX16(c + 48)
528 #define OX256(c) OX64(c), OX64(c + 64), OX64(c + 128), OX64(c + 192)
536 unsigned *v_start =
v;
537 unsigned mask = (1 << Mshift) - 1;
543 unsigned bits, morebits;
545 if (1 & (
long) base62) {
546 c = (
unsigned char) *base62++;
561 w = *(unsigned short *) base62; \
563 bits = word_to_num[w]; \
564 if (bits >= 0x1000) \
566 w = *(unsigned short *) base62; \
568 morebits = word_to_num[w]; \
569 if (morebits >= 0x1000) \
571 bits |= (morebits << 12); \
576 switch (bits & 0xf000) { \
579 goto put6 ## X ## _AZ; \
582 goto put10 ## X ## _ZA; \
585 goto put6 ## X ## _A0; \
601 c = (unsigned char) *base62++; \
602 morebits = char_to_num[c]; \
603 if (morebits == 0xff) \
605 if (morebits == 0xee) \
607 switch (morebits & (16 + 32)) { \
621 bits |= (morebits << 6); \
622 goto put10 ## X ## _esc1
624 c = (unsigned char) *base62++; \
625 bits = char_to_num[c]; \
627 goto put6 ## X ## _esc2; \
645 r |= (bits << rfill); \
648 left = rfill - Mshift; \
652 *v++ = (q << Mshift) | r; \
661 vbits = __builtin_ffs(bits); \
668 #define Put24Q(Get) \
670 QMake(Get); RMake(Get); \
671 QMake(Get); RMake(Get); \
672 QMake(Get); RMake(Get); \
674 #define Put24R(Get) \
677 QMake(Get); RMake(Get); \
678 QMake(Get); RMake(Get); \
679 QMake(Get); goto Get ## r
680 #define Put12Q(Get) \
682 QMake(Get); RMake(Get); \
683 QMake(Get); goto Get ## r
684 #define Put12R(Get) \
687 QMake(Get); RMake(Get); \
688 QMake(Get); goto Get ## r
689 #define Put10Q(Get) \
691 QMake(Get); RMake(Get); \
692 QMake(Get); goto Get ## r
693 #define Put10R(Get) \
696 QMake(Get); RMake(Get); \
697 QMake(Get); goto Get ## r
700 QMake(Get); goto Get ## r
704 QMake(Get); goto Get ## r
711 put6q_esc2:
Put6Q(get24);
712 put6r_esc2:
Put6R(get24);
713 put6q_AZ:
Put6Q(esc1);
714 put6r_AZ:
Put6R(esc1);
715 put10q_esc1:
Put10Q(esc2);
716 put10r_esc1:
Put10R(esc2);
719 put6q_A0:
Put6Q(eol);
720 put6r_A0:
Put6R(eol);
732 void test_word_table(
void)
735 for (i = 0; i < 256; i++)
736 for (j = 0; j < 256; j++) {
738 unsigned short ix = *(
unsigned short *) u;
739 int w = word_to_num[ix];
745 fprintf(stderr,
"%s: word table test OK\n", __FILE__);
749 void test_base62_golomb(
void)
751 const char str[] =
"set:hdf7q2P5VZwtLGr9TKxhrEM1";
752 const char *base62 = str + 4 + 2;
757 unsigned v1[32], v2[32];
764 for (i = 0; i < c1; i++)
765 assert(v1[i] == v2[i]);
766 fprintf(stderr,
"%s: base62_golomb test OK\n", __FILE__);
779 unsigned *v_end = v + c;
791 unsigned *v_end = v + c;
801 void test_delta(
void)
817 fprintf(stderr,
"%s: delta test OK\n", __FILE__);
856 if (bpp < 10 || bpp > 32)
858 *base62++ = bpp - 7 +
'a';
860 if (Mshift < 7 || Mshift > 31)
862 *base62++ = Mshift - 7 +
'a';
883 int bpp = *str++ + 7 -
'a';
884 if (bpp < 10 || bpp > 32)
887 int Mshift = *str++ + 7 -
'a';
888 if (Mshift < 7 || Mshift > 31)
910 const char *base62 = str + 2;
914 int len = strlen(base62);
946 #define CACHE_SIZE 256
947 #define PIVOT_SIZE 243
954 struct cache_ent *ent;
955 unsigned hash = str[0] | (str[2] << 8) | (str[3] << 16);
956 for (hp = hv; hp < hv + hc; hp++) {
960 if (memcmp(str, ent->str, ent->len + 1) == 0) {
963 memmove(hv + 1, hv, i *
sizeof(hv[0]));
964 memmove(ev + 1, ev, i *
sizeof(ev[0]));
974 int len = strlen(str);
977 ent = malloc(
sizeof(*ent) + len + 1 + (c +
SENTINELS) *
sizeof(
unsigned));
986 ent->str = (
char *)(ent->v + c +
SENTINELS);
987 memcpy(ent->str, str, len + 1);
997 memmove(hv + i + 1, hv + i, (
CACHE_SIZE - i - 1) *
sizeof(hv[0]));
998 memmove(ev + i + 1, ev + i, (
CACHE_SIZE - i - 1) *
sizeof(ev[0]));
1010 unsigned mask = (1 << bpp) - 1;
1015 int i = (l + u) / 2;
1022 const unsigned *w_start =
w;
1023 const unsigned *v1 = v + 0, *v1end = v + u;
1024 const unsigned *v2 = v + u, *v2end = v + c;
1026 if (v1 < v1end && v2 < v2end) {
1027 unsigned v1val = *v1;
1028 unsigned v2val = *v2 & mask;
1030 if (v1val < v2val) {
1037 else if (v2val < v1val) {
1061 *w++ = *v2++ & mask;
1069 unsigned rnd_v[] = {
1070 0x020a, 0x07e5, 0x3305, 0x35f5,
1071 0x4980, 0x4c4f, 0x74ef, 0x7739,
1072 0x82ae, 0x8415, 0xa3e7, 0xb07e,
1073 0xb584, 0xb89f, 0xbb40, 0xf39e,
1075 int rnd_c =
sizeof rnd_v /
sizeof *rnd_v;
1080 int len =
encode_set(rnd_c, rnd_v, bpp, base62);
1082 fprintf(stderr,
"len=%d set=%s\n", len, base62);
1089 assert(Mshift < bpp);
1093 const unsigned *v = vbuf;
1099 for (i = 0; i < c; i++)
1100 assert(v[i] == rnd_v[i]);
1105 for (i = 0; i < c; i++)
1106 assert(v[i] == rnd_v[i]);
1107 fprintf(stderr,
"%s: set test OK\n", __FILE__);
1117 if (strncmp(str1,
"set:", 4) == 0)
1119 if (strncmp(str2,
"set:", 4) == 0)
1128 fprintf(stderr,
"<-- %s(%s,%s) rc %d\n", __FUNCTION__, str1, str2, rc);
1134 fprintf(stderr,
"<-- %s(%s,%s) rc %d\n", __FUNCTION__, str1, str2, rc);
1139 const unsigned *v1 = NULL;
1144 fprintf(stderr,
"<-- %s(%s,%s) rc %d\n", __FUNCTION__, str1, str2, rc);
1147 unsigned v1bufA[c1 + 1];
1148 unsigned v1bufB[c1 + 1];
1151 int len2 = strlen(str2);
1153 unsigned v2bufA[c2];
1154 unsigned v2bufB[c2];
1155 const unsigned *v2 = v2bufA;
1160 fprintf(stderr,
"<-- %s(%s,%s) rc %d\n", __FUNCTION__, str1, str2, rc);
1166 while (bpp1 > bpp2) {
1167 unsigned *v1buf = v1bufA;
1173 v1buf[c1 + i] = ~0u;
1176 while (bpp2 > bpp1) {
1177 unsigned *v2buf = v2bufA;
1188 const unsigned *v1end = v1 + c1;
1189 const unsigned *v2end = v2 + c2;
1191 assert(v1end[i] == ~0u);
1192 unsigned v2val = *v2;
1196 if (*v1 < v2val) { \
1199 while (*v1 < v2val) \
1212 if (*v1 < v2val) { \
1215 while (*v1 < v2val) \
1232 if (*v1 == v2val) { \
1250 if (c1 >= 16 * c2) {
1271 fprintf(stderr,
"<-- %s(%s,%s) rc %d\n", __FUNCTION__, str1, str2, rc);
1277 fprintf(stderr,
"<-- %s(%s,%s) rc %d\n", __FUNCTION__, str1, str2, rc);
1283 fprintf(stderr,
"<-- %s(%s,%s) rc %d\n", __FUNCTION__, str1, str2, rc);
1288 fprintf(stderr,
"<-- %s(%s,%s) rc %d\n", __FUNCTION__, str1, str2, rc);
1302 for (i = 0; i < set->c; i++)
1303 set->sv[i].s =
_free(set->sv[i].s);
1304 set->sv =
_free(set->sv);
1317 if (_rpmsetPool == NULL) {
1323 memset(((
char *)set)+
sizeof(set->_item), 0,
sizeof(*set)-
sizeof(set->_item));
1336 const int delta = 1024;
1337 if ((set->c & (delta - 1)) == 0)
1338 set->sv =
xrealloc(set->sv,
sizeof(*set->sv) * (set->c + delta));
1339 set->sv[set->c].s =
xstrdup(sym);
1340 set->sv[set->c].v = 0;
1348 unsigned int hash = 0x9e3779b9;
1349 const unsigned char *p = (
const unsigned char *) str;
1352 hash += (hash << 10);
1353 hash ^= (hash >> 6);
1355 hash += (hash << 3);
1356 hash ^= (hash >> 11);
1357 hash += (hash << 15);
1363 int cmp(
const void *arg1,
const void *arg2)
1365 struct sv *sv1 = (
struct sv *) arg1;
1366 struct sv *sv2 = (
struct sv *) arg2;
1367 if (sv1->v > sv2->v)
1369 if (sv2->v > sv1->v)
1378 for (i = 0, j = 0; i < c; i++) {
1379 while (i + 1 < c && v[i] == v[i+1])
1391 if (set->c < 1 || bpp < 10 || bpp > 32) {
1393 fprintf(stderr,
"<-- %s(%p,%d) rc %s\n", __FUNCTION__, set, bpp, t);
1396 unsigned mask = (bpp < 32) ? (1u << bpp) - 1 : ~0u;
1400 for (i = 0; i < set->c; i++)
1401 set->sv[i].v =
hash(set->sv[i].s) & mask;
1403 qsort(set->sv, set->c,
sizeof *set->sv,
cmp);
1406 for (i = 0; i < set->c - 1; i++) {
1407 if (set->sv[i].v != set->sv[i+1].v)
1409 if (strcmp(set->sv[i].s, set->sv[i+1].s) == 0)
1411 fprintf(stderr,
"warning: hash collision: %s %s\n",
1412 set->sv[i].s, set->sv[i+1].s);
1417 for (i = 0; i < set->c; i++)
1418 v[i] = set->sv[i].v;
1419 int c =
uniqv(set->c, v);
1426 fprintf(stderr,
"<-- %s(%p,%d) rc %s\n", __FUNCTION__, set, bpp, t);
1439 fprintf(stderr,
"set10=%s\n", str10);
1446 fprintf(stderr,
"set20=%s\n", str20);
1452 fprintf(stderr,
"set21=%s\n", str21);
1468 str10 =
_free(str10);
1469 str11 =
_free(str11);
1470 str20 =
_free(str20);
1471 str21 =
_free(str21);
1472 str22 =
_free(str22);
1474 fprintf(stderr,
"%s: api test OK\n", __FILE__);
1480 static struct poptOption rpmsetOptionsTable[] = {
1481 {
"debug",
'd', POPT_ARG_VAL, &
_rpmset_debug, -1, NULL, NULL },
1484 N_(
"Common options for all rpmio executables:"), NULL },
1491 int main(
int argc,
char *argv[])
1493 poptContext con =
rpmioInit(argc, argv, rpmsetOptionsTable);
1499 test_base62_golomb();
static int encode_set(int c, unsigned *v, int bpp, char *base62)
poptContext rpmioInit(int argc, char *const argv[], struct poptOption *optionsTable)
Initialize most everything needed by an rpmio executable context.
static int decode_base62_size(int len)
const char const char size_t len
#define AA10x25(c1, c2, b1, b2)
static void rpmsetFini(void *_set)
static int encode_base62(int bitc, const char *bitv, char *base62)
char * xstrdup(const char *str)
static int decode_set_size(int len, int Mshift)
static void decode_delta(int c, unsigned *v)
int main(int argc, const char **argv, char **envp)
static int encode_golomb_size(int c, int Mshift)
int rpmsetCmp(const char *str1, const char *str2)
static int cache_decode_set(const char *str, int Mshift, const unsigned **pv)
static int decode_base62(const char *base62, char *bitv)
static int encode_set_size(int c, int bpp)
static int encode_base62_size(int bitc)
void rpmsetAdd(rpmset set, const char *sym)
Add new symbol to set.
const char const bson_bool_t v
#define AA26x10(c1, c2, b1, b2)
rpmioItem rpmioGetPool(rpmioPool pool, size_t size)
Get unused item from pool, or alloc a new item.
#define AA26x26(c1, c2, b1, b2)
static void put6bits(char *bitv, int c)
rpmset rpmsetFree(rpmset set)
Destroy a set wrapper.
#define AA25x26(c1, c2, b1, b2)
static int encode_golomb(int c, const unsigned *v, int Mshift, char *bitv)
static int uniqv(int c, unsigned *v)
static unsigned int hash(const char *str)
rpmset rpmsetNew(const char *fn, int flags)
Create and load a set wrapper.
static int decode_golomb_size(int bitc, int Mshift)
#define AA10x10(c1, c2, b1, b2)
#define AA26x25(c1, c2, b1, b2)
const char const bson int mongo_write_concern int flags
static const unsigned short word_to_num[65536]
static const int char_to_num[256]
static void encode_delta(int c, unsigned *v)
static rpmset rpmsetGetPool(rpmioPool pool)
static void set(char *t, NODE *ip)
static int cmp(const void *arg1, const void *arg2)
rpmioPool rpmioNewPool(const char *name, size_t size, int limit, int flags, char *(*dbg)(void *item), void(*init)(void *item), void(*fini)(void *item))
Create a memory pool.
static void put4bits(char *bitv, int c)
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
rpmset rpmsetLink(rpmset set)
Reference a set wrapper instance.
static int downsample_set(int c, const unsigned *v, unsigned *w, int bpp)
const char * rpmsetFinish(rpmset set, int bpp)
Make set-version.
static int decode_base62_golomb(const char *base62, int Mshift, unsigned *v)
static int decode_set_init(const char *str, int *pbpp, int *pMshift)
struct poptOption rpmioAllPoptTable[]
Popt option table for options shared by all modes and executables.
poptContext rpmioFini(poptContext optCon)
Destroy most everything needed by an rpm CLI executable context.
#define AA25x10(c1, c2, b1, b2)
static int decode_golomb(int bitc, const char *bitv, int Mshift, unsigned *v)
#define AA25x25(c1, c2, b1, b2)
static int decode_set(const char *str, int Mshift, unsigned *v)
__attribute__((visibility("hidden"))) int mayAddToFilesAwaitingFiletriggers(const char *rootDir
static void put_digit(char *base62, int c)
#define AA10x26(c1, c2, b1, b2)
static int encode_golomb_Mshift(int c, int bpp)