#include <stdlib.h>
#include <stdio.h>
typedef struct Cheapmap Cheapmap;
struct Cheapmap {
unsigned count;
void *table[256];
};
void insert(Cheapmap *chm, void *p)
{
unsigned char *u = p;
if (chm->table[*u] == NULL) {
chm->table[*u] = p;
chm->count++;
}
}
void **keys(Cheapmap *chm)
{
void **k
= calloc(chm
->count
+ 1, sizeof(*k
)); void **p = k;
unsigned i;
for (i = 0; i < 256; i++) {
if (chm->table[i]) *p++ = chm->table[i];
}
return k;
}
int main()
{
Cheapmap chm = {0};
insert(&chm, "banana");
insert(&chm, "strawberry");
insert(&chm, "apple");
insert(&chm, "papaya");
void **k = keys(&chm);
unsigned i = 0;
while (k[i]) {
i++;
}
return 0;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCnR5cGVkZWYgc3RydWN0IENoZWFwbWFwIENoZWFwbWFwOwoKc3RydWN0IENoZWFwbWFwIHsKICAgIHVuc2lnbmVkIGNvdW50OwogICAgdm9pZCAqdGFibGVbMjU2XTsKfTsKCnZvaWQgaW5zZXJ0KENoZWFwbWFwICpjaG0sIHZvaWQgKnApCnsKICAgIHVuc2lnbmVkIGNoYXIgKnUgPSBwOwogICAgCiAgICBpZiAoY2htLT50YWJsZVsqdV0gPT0gTlVMTCkgewogICAgICAgIGNobS0+dGFibGVbKnVdID0gcDsKICAgICAgICBjaG0tPmNvdW50Kys7CiAgICB9Cn0KCnZvaWQgKiprZXlzKENoZWFwbWFwICpjaG0pCnsKICAgIHZvaWQgKiprID0gY2FsbG9jKGNobS0+Y291bnQgKyAxLCBzaXplb2YoKmspKTsKICAgIHZvaWQgKipwID0gazsKICAgIAogICAgdW5zaWduZWQgaTsKICAgIAogICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CiAgICAgICAgaWYgKGNobS0+dGFibGVbaV0pICpwKysgPSBjaG0tPnRhYmxlW2ldOwogICAgfQogICAgCiAgICByZXR1cm4gazsKfQoKCmludCBtYWluKCkKewogICAgQ2hlYXBtYXAgY2htID0gezB9OwogICAgCiAgICBpbnNlcnQoJmNobSwgImJhbmFuYSIpOwogICAgaW5zZXJ0KCZjaG0sICJzdHJhd2JlcnJ5Iik7CiAgICBpbnNlcnQoJmNobSwgImFwcGxlIik7CiAgICBpbnNlcnQoJmNobSwgInBhcGF5YSIpOwogICAgCiAgICB2b2lkICoqayA9IGtleXMoJmNobSk7CiAgICB1bnNpZ25lZCBpID0gMDsKICAgIAogICAgd2hpbGUgKGtbaV0pIHsKICAgICAgICBwdXRzKGtbaV0pOwogICAgICAgIGkrKzsKICAgIH0KICAgIAogICAgZnJlZShrKTsKICAgIAogICAgcmV0dXJuIDA7Cn0K