X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=nss%2Fsearch.c;fp=nss%2Fsearch.c;h=d4f71068003e88c487f4b0c909b441e43330217e;hb=92afde4e875a96e1ab865e29b9f0d11b08d7db1c;hp=0000000000000000000000000000000000000000;hpb=748846b9a65726fd19d43b45a4db68ef4c2e77f4;p=nsscash%2Fnsscash.git diff --git a/nss/search.c b/nss/search.c new file mode 100644 index 0000000..d4f7106 --- /dev/null +++ b/nss/search.c @@ -0,0 +1,55 @@ +/* + * Search entries in nsscash files by using indices and binary search + * + * Copyright (C) 2019 Simon Ruderich + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include "search.h" + +#include +#include + + +static int bsearch_callback(const void *x, const void *y) { + const struct search_key *key = x; + + uint64_t offset = *(const uint64_t *)y; + const void *member = (const char *)key->data + offset + key->offset; + + // Lookup by name + if (key->name != NULL) { + const char *name = member; + return strcmp(key->name, name); + + // Lookup by ID + } else if (key->id != NULL) { + const uint64_t *id = member; + if (*key->id < *id) { + return -1; + } else if (*key->id == *id) { + return 0; + } else { + return +1; + } + + } else { + abort(); + } +} + +uint64_t *search(struct search_key *key, const void *index, uint64_t count) { + return bsearch(key, index, count, sizeof(uint64_t), bsearch_callback); +}