mirror of
git://git.code.sf.net/p/dhcpd-pools/code
synced 2025-12-18 00:37:01 +00:00
all files: replace global variables with runtime config state structure
Earlier variables magically appeared to scope of functions that took void as argument. One could figure out perhaps they were globals, but programs that do that are unnessarily hard to follow. Signed-off-by: Sami Kerola <kerolasa@iki.fi>
This commit is contained in:
parent
adda925c1e
commit
1875a13733
12 changed files with 551 additions and 626 deletions
55
src/sort.c
55
src/sort.c
|
|
@ -47,6 +47,7 @@
|
|||
#include "error.h"
|
||||
#include "progname.h"
|
||||
#include "quote.h"
|
||||
#include "xalloc.h"
|
||||
|
||||
#include "dhcpd-pools.h"
|
||||
|
||||
|
|
@ -239,7 +240,6 @@ comparer_t field_selector(char c)
|
|||
default:
|
||||
{
|
||||
char str[2] = { c, '\0' };
|
||||
clean_up();
|
||||
error(EXIT_FAILURE, 0, "field_selector: unknown sort order: %s", quote(str));
|
||||
}
|
||||
}
|
||||
|
|
@ -251,12 +251,13 @@ comparer_t field_selector(char c)
|
|||
* \param right The right side of the merge sort.
|
||||
* \return Relevant for merge sort decision.
|
||||
*/
|
||||
static int merge(struct range_t *restrict left, struct range_t *restrict right)
|
||||
int merge(struct conf_t *state, struct range_t *restrict left,
|
||||
struct range_t *restrict right)
|
||||
{
|
||||
struct output_sort *p;
|
||||
int ret;
|
||||
|
||||
for (p = config.sorts; p; p = p->next) {
|
||||
for (p = state->sorts; p; p = p->next) {
|
||||
if (p->func == NULL) {
|
||||
/* String sorting is special. */
|
||||
ret = strcmp(left->shared_net->name, right->shared_net->name);
|
||||
|
|
@ -274,43 +275,46 @@ static int merge(struct range_t *restrict left, struct range_t *restrict right)
|
|||
}
|
||||
|
||||
/*! \brief Mergesort for range table.
|
||||
* \param orig Pointer to range that is requested to be sorted.
|
||||
* \param size Number of ranges to be sorted.
|
||||
* \param temp Temporary memory space, needed when a values has to be
|
||||
* flipped.
|
||||
*/
|
||||
void mergesort_ranges(struct range_t *restrict orig, int size, struct range_t *restrict temp)
|
||||
void mergesort_ranges(struct conf_t *state, struct range_t *restrict orig, unsigned int size,
|
||||
struct range_t *restrict temp, const int root_call)
|
||||
{
|
||||
int left, right, i;
|
||||
unsigned int left, i, u_right;
|
||||
int s_right;
|
||||
struct range_t hold;
|
||||
|
||||
if (temp == NULL)
|
||||
temp = xmalloc(sizeof(struct range_t) * size);
|
||||
|
||||
/* Merge sort split size */
|
||||
static const int MIN_MERGE_SIZE = 8;
|
||||
static const unsigned int MIN_MERGE_SIZE = 8;
|
||||
|
||||
if (size < MIN_MERGE_SIZE) {
|
||||
for (left = 0; left < size; left++) {
|
||||
hold = *(orig + left);
|
||||
for (right = left - 1; 0 <= right; right--) {
|
||||
if (merge((orig + right), &hold))
|
||||
for (s_right = left - 1; 0 <= s_right; s_right--) {
|
||||
if (merge(state, (orig + s_right), &hold))
|
||||
break;
|
||||
*(orig + right + 1) = *(orig + right);
|
||||
*(orig + s_right + 1) = *(orig + s_right);
|
||||
}
|
||||
*(orig + right + 1) = hold;
|
||||
*(orig + s_right + 1) = hold;
|
||||
}
|
||||
if (root_call)
|
||||
free(temp);
|
||||
return;
|
||||
}
|
||||
mergesort_ranges(orig, size / 2, temp);
|
||||
mergesort_ranges(orig + size / 2, size - size / 2, temp);
|
||||
mergesort_ranges(state, orig, size / 2, temp, 0);
|
||||
mergesort_ranges(state, orig + size / 2, size - size / 2, temp, 0);
|
||||
left = 0;
|
||||
right = size / 2;
|
||||
u_right = size / 2;
|
||||
i = 0;
|
||||
while (left < size / 2 && right < size) {
|
||||
if (merge((orig + left), (orig + right))) {
|
||||
while (left < size / 2 && u_right < size) {
|
||||
if (merge(state, (orig + left), (orig + u_right))) {
|
||||
*(temp + i) = *(orig + left);
|
||||
left++;
|
||||
} else {
|
||||
*(temp + i) = *(orig + right);
|
||||
right++;
|
||||
*(temp + i) = *(orig + u_right);
|
||||
u_right++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
|
@ -319,10 +323,13 @@ void mergesort_ranges(struct range_t *restrict orig, int size, struct range_t *r
|
|||
left++;
|
||||
i++;
|
||||
}
|
||||
while (right < size) {
|
||||
*(temp + i) = *(orig + right);
|
||||
right++;
|
||||
while (u_right < size) {
|
||||
*(temp + i) = *(orig + u_right);
|
||||
u_right++;
|
||||
i++;
|
||||
}
|
||||
memcpy(orig, temp, size * sizeof(struct range_t));
|
||||
|
||||
if (root_call)
|
||||
free(temp);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue