/*
* 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; // from index
const void *member = (const char *)key->data + offset + key->offset;
// Lookup by name (char *)
if (key->name != NULL) {
const char *name = member;
return strcmp(key->name, name);
// Lookup by ID (uint64_t)
} 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();
}
}
// search performs a binary search on an index, described by key and index.
uint64_t *search(const struct search_key *key, const void *index, uint64_t count) {
return bsearch(key, index, count, sizeof(uint64_t), bsearch_callback);
}