X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsn_network.c;h=b490de404cd5f6915aa5efce725e20f3d0c9cb60;hb=f3635d61e91198d4a40126bab3e4a3c1b1e49724;hp=8462020e38bc3d909541e609f79fcbd1dfc7b287;hpb=927c3f062bda3494fbbd5803c5d08c3552138b89;p=sort-networks.git diff --git a/src/sn_network.c b/src/sn_network.c index 8462020..b490de4 100644 --- a/src/sn_network.c +++ b/src/sn_network.c @@ -1,6 +1,6 @@ /** - * collectd - src/sn_network.c - * Copyright (C) 2008,2009 Florian octo Forster + * libsortnetwork - src/sn_network.c + * Copyright (C) 2008-2010 Florian octo Forster * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,7 +16,7 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Authors: - * Florian octo Forster + * Florian octo Forster **/ #ifndef _ISOC99_SOURCE @@ -38,6 +38,7 @@ #include #include #include +#include #include "sn_network.h" #include "sn_random.h" @@ -138,6 +139,9 @@ int sn_network_stage_add (sn_network_t *n, sn_stage_t *s) /* {{{ */ { sn_stage_t **temp; + if ((n == NULL) || (s == NULL)) + return (EINVAL); + temp = (sn_stage_t **) realloc (n->stages, (n->stages_num + 1) * sizeof (sn_stage_t *)); if (temp == NULL) @@ -156,7 +160,8 @@ int sn_network_stage_remove (sn_network_t *n, int s_num) /* {{{ */ int nmemb = n->stages_num - (s_num + 1); sn_stage_t **temp; - assert (s_num < n->stages_num); + if ((n == NULL) || (s_num >= n->stages_num)) + return (EINVAL); sn_stage_destroy (n->stages[s_num]); n->stages[s_num] = NULL; @@ -225,7 +230,7 @@ int sn_network_comparator_add (sn_network_t *n, /* {{{ */ sn_stage_t *s; if ((n == NULL) || (c == NULL)) - return (-1); + return (EINVAL); if (n->stages_num > 0) { @@ -274,6 +279,9 @@ int sn_network_invert (sn_network_t *n) /* {{{ */ { int i; + if (n == NULL) + return (EINVAL); + for (i = 0; i < n->stages_num; i++) sn_stage_invert (n->stages[i]); @@ -284,6 +292,12 @@ int sn_network_shift (sn_network_t *n, int sw) /* {{{ */ { int i; + if ((n == NULL) || (sw < 0)) + return (EINVAL); + + if (sw == 0) + return (0); + for (i = 0; i < n->stages_num; i++) sn_stage_shift (n->stages[i], sw, SN_NETWORK_INPUT_NUM (n)); @@ -658,11 +672,11 @@ static sn_network_t *sn_network_combine_bitonic_shift (sn_network_t *n0, /* {{{ return (n); } /* }}} sn_network_t *sn_network_combine_bitonic_shift */ -sn_network_t *sn_network_combine_bitonic (sn_network_t *n0, /* {{{ */ +sn_network_t *sn_network_combine_bitonic_merge (sn_network_t *n0, /* {{{ */ sn_network_t *n1) { return (sn_network_combine_bitonic_shift (n0, n1, /* do_shift = */ 0)); -} /* }}} sn_network_t *sn_network_combine_bitonic */ +} /* }}} sn_network_t *sn_network_combine_bitonic_merge */ sn_network_t *sn_network_combine_odd_even_merge (sn_network_t *n0, /* {{{ */ sn_network_t *n1) @@ -697,27 +711,12 @@ sn_network_t *sn_network_combine_odd_even_merge (sn_network_t *n0, /* {{{ */ sn_network_compress (n); return (n); -} /* }}} sn_network_t *sn_network_combine */ +} /* }}} sn_network_t *sn_network_combine_odd_even_merge */ sn_network_t *sn_network_combine (sn_network_t *n0, /* {{{ */ - sn_network_t *n1, int is_power_of_two) + sn_network_t *n1) { - sn_network_t *n; - - if ((is_power_of_two != 0) && (sn_bounded_random (0, 9) == 0)) - { - DPRINTF ("sn_network_combine: Using the bitonic merger.\n"); - n = sn_network_combine_bitonic_shift (n0, n1, /* do_shift = */ 1); - } - else - { - DPRINTF ("sn_network_combine: Using the odd-even merger.\n"); - n = sn_network_combine_odd_even_merge (n0, n1); - } - - sn_network_compress (n); - - return (n); + return (sn_network_combine_odd_even_merge (n0, n1)); } /* }}} sn_network_t *sn_network_combine */ int sn_network_sort (sn_network_t *n, int *values) /* {{{ */ @@ -912,7 +911,7 @@ int sn_network_serialize (sn_network_t *n, char **ret_buffer, /* {{{ */ #define SNPRINTF_OR_FAIL(...) \ status = snprintf (buffer, buffer_size, __VA_ARGS__); \ - if ((status < 1) || (status >= buffer_size)) \ + if ((status < 1) || (((size_t) status) >= buffer_size)) \ return (-1); \ buffer += status; \ buffer_size -= status;