X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsn_stage.c;h=56512eaea6c10b0abc42124282bf03d9a5e9eb11;hb=c83e7d24774acd90700ae7201ae6c7610dc052d6;hp=bbc311cc279fa9f4e272252bfed479323551832a;hpb=8e4a1e11b964e446370df12fbc2d072eb31a7fda;p=sort-networks.git diff --git a/src/sn_stage.c b/src/sn_stage.c index bbc311c..56512ea 100644 --- a/src/sn_stage.c +++ b/src/sn_stage.c @@ -1,6 +1,6 @@ /** - * collectd - src/sn_stage.c - * Copyright (C) 2008 Florian octo Forster + * libsortnetwork - src/sn_stage.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,9 +16,16 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Authors: - * Florian octo Forster + * Florian octo Forster **/ +#ifndef _ISOC99_SOURCE +# define _ISOC99_SOURCE +#endif +#ifndef _POSIX_C_SOURCE +# define _POSIX_C_SOURCE 200112L +#endif + #include #include #include @@ -49,6 +56,27 @@ void sn_stage_destroy (sn_stage_t *s) free (s); } /* void sn_stage_destroy */ +int sn_stage_sort (sn_stage_t *s, int *values) +{ + sn_comparator_t *c; + int i; + + for (i = 0; i < s->comparators_num; i++) + { + c = s->comparators + i; + if (values[c->min] > values[c->max]) + { + int temp; + + temp = values[c->min]; + values[c->min] = values[c->max]; + values[c->max] = temp; + } + } + + return (0); +} /* int sn_stage_sort */ + int sn_stage_comparator_add (sn_stage_t *s, const sn_comparator_t *c) { sn_comparator_t *temp; @@ -165,7 +193,6 @@ int sn_stage_show (sn_stage_t *s) int j; int k; - for (i = 0; i < s->comparators_num; i++) { lines[i] = -1; @@ -255,6 +282,16 @@ int sn_stage_invert (sn_stage_t *s) return (0); } /* int sn_stage_invert */ +int sn_stage_shift (sn_stage_t *s, int sw, int inputs_num) +{ + int i; + + for (i = 0; i < s->comparators_num; i++) + sn_comparator_shift (s->comparators + i, sw, inputs_num); + + return (0); +} /* int sn_stage_shift */ + int sn_stage_swap (sn_stage_t *s, int con0, int con1) { int i; @@ -378,4 +415,122 @@ int sn_stage_write (sn_stage_t *s, FILE *fh) return (0); } /* int sn_stage_write */ -/* vim: set shiftwidth=2 softtabstop=2 : */ +int sn_stage_serialize (sn_stage_t *s, + char **ret_buffer, size_t *ret_buffer_size) +{ + char *buffer; + size_t buffer_size; + int status; + int i; + + if (s->comparators_num <= 0) + return (0); + + buffer = *ret_buffer; + buffer_size = *ret_buffer_size; + +#define SNPRINTF_OR_FAIL(...) \ + status = snprintf (buffer, buffer_size, __VA_ARGS__); \ + if ((status < 1) || (((size_t) status) >= buffer_size)) \ + return (-1); \ + buffer += status; \ + buffer_size -= status; + + for (i = 0; i < s->comparators_num; i++) + { + SNPRINTF_OR_FAIL ("%i %i\r\n", + SN_COMP_MIN (s->comparators + i), + SN_COMP_MAX (s->comparators + i)); + } + + SNPRINTF_OR_FAIL ("\r\n"); + + *ret_buffer = buffer; + *ret_buffer_size = buffer_size; + return (0); +} /* int sn_stage_serialize */ + +sn_stage_t *sn_stage_unserialize (char **ret_buffer, size_t *ret_buffer_size) +{ + sn_stage_t *s; + char *buffer; + size_t buffer_size; + int status; + + buffer = *ret_buffer; + buffer_size = *ret_buffer_size; + + if (buffer_size == 0) + return (NULL); + + s = sn_stage_create (0); + if (s == NULL) + return (NULL); + + status = 0; + while (buffer_size > 0) + { + sn_comparator_t c; + char *endptr; + char *substr; + size_t substr_length; + + endptr = strchr (buffer, '\n'); + if (endptr == NULL) + { + status = -1; + break; + } + + *endptr = 0; + endptr++; + + substr = buffer; + substr_length = strlen (buffer); + buffer = endptr; + buffer_size -= (substr_length + 1); + + if ((substr_length > 0) && (substr[substr_length - 1] == '\r')) + { + substr[substr_length - 1] = 0; + substr_length--; + } + + if (substr_length == 0) + { + status = 0; + break; + } + + endptr = NULL; + c.min = (int) strtol (substr, &endptr, 0); + if (substr == endptr) + { + status = -1; + break; + } + + substr = endptr; + endptr = NULL; + c.max = (int) strtol (substr, &endptr, 0); + if (substr == endptr) + { + status = -1; + break; + } + + sn_stage_comparator_add (s, &c); + } /* while (buffer_size > 0) */ + + if ((status != 0) || (s->comparators_num == 0)) + { + sn_stage_destroy (s); + return (NULL); + } + + *ret_buffer = buffer; + *ret_buffer_size = buffer_size; + return (s); +} /* sn_stage_t *sn_stage_unserialize */ + +/* vim: set shiftwidth=2 softtabstop=2 expandtab : */