2 * collectd - src/sn_stage.c
3 * Copyright (C) 2008 Florian octo Forster
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; only version 2 of the License is applicable.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 * Florian octo Forster <octo at verplant.org>
26 #include "sn_comparator.h"
29 sn_stage_t *sn_stage_create (int depth)
33 s = (sn_stage_t *) malloc (sizeof (sn_stage_t));
36 memset (s, '\0', sizeof (sn_stage_t));
41 } /* sn_stage_t *sn_stage_create */
43 void sn_stage_destroy (sn_stage_t *s)
47 if (s->comparators != NULL)
48 free (s->comparators);
50 } /* void sn_stage_destroy */
52 int sn_stage_comparator_add (sn_stage_t *s, const sn_comparator_t *c)
54 sn_comparator_t *temp;
57 temp = (sn_comparator_t *) realloc (s->comparators,
58 (s->comparators_num + 1) * sizeof (sn_comparator_t));
61 s->comparators = temp;
64 for (i = 0; i < s->comparators_num; i++)
65 if (sn_comparator_compare (c, s->comparators + i) <= 0)
68 /* Insert the elements in ascending order */
69 assert (i <= s->comparators_num);
70 if (i < s->comparators_num)
72 int nmemb = s->comparators_num - i;
73 memmove (s->comparators + (i + 1), s->comparators + i,
74 nmemb * sizeof (sn_comparator_t));
76 memcpy (s->comparators + i, c, sizeof (sn_comparator_t));
80 } /* int sn_stage_comparator_add */
82 int sn_stage_comparator_remove (sn_stage_t *s, int c_num)
84 int nmemb = s->comparators_num - (c_num + 1);
85 sn_comparator_t *temp;
87 assert (c_num < s->comparators_num);
91 memmove (s->comparators + c_num, s->comparators + (c_num + 1),
92 nmemb * sizeof (sn_comparator_t));
95 /* Free the unused memory */
96 if (s->comparators_num == 0)
98 free (s->comparators);
99 s->comparators = NULL;
103 temp = (sn_comparator_t *) realloc (s->comparators,
104 s->comparators_num * sizeof (sn_comparator_t));
107 s->comparators = temp;
111 } /* int sn_stage_comparator_remove */
113 sn_stage_t *sn_stage_clone (const sn_stage_t *s)
117 s_copy = sn_stage_create (s->depth);
121 s_copy->comparators = (sn_comparator_t *) malloc (s->comparators_num
122 * sizeof (sn_comparator_t));
123 if (s_copy->comparators == NULL)
129 memcpy (s_copy->comparators, s->comparators,
130 s->comparators_num * sizeof (sn_comparator_t));
131 s_copy->comparators_num = s->comparators_num;
134 } /* sn_stage_t *sn_stage_clone */
136 int sn_stage_comparator_check_conflict (sn_stage_t *s, const sn_comparator_t *c0)
140 for (i = 0; i < s->comparators_num; i++)
142 sn_comparator_t *c1 = s->comparators + i;
143 if ((SN_COMP_MIN(c0) == SN_COMP_MIN(c1))
144 || (SN_COMP_MIN(c0) == SN_COMP_MAX(c1))
145 || (SN_COMP_MAX(c0) == SN_COMP_MIN(c1))
146 || (SN_COMP_MAX(c0) == SN_COMP_MAX(c1)))
148 if ((SN_COMP_MIN(c0) == SN_COMP_MIN(c1))
149 && (SN_COMP_MAX(c0) == SN_COMP_MAX(c1)))
157 } /* int sn_stage_comparator_check_conflict */
159 int sn_stage_show (sn_stage_t *s)
161 int lines[s->comparators_num];
162 int right[s->comparators_num];
169 for (i = 0; i < s->comparators_num; i++)
175 for (i = 0; i < s->comparators_num; i++)
178 sn_comparator_t *c = s->comparators + i;
180 for (j = 0; j < lines_used; j++)
181 if (SN_COMP_LEFT (c) > right[j])
185 right[j] = SN_COMP_RIGHT (c);
190 for (i = 0; i < lines_used; i++)
192 printf ("%3i: ", s->depth);
194 for (j = 0; j <= right[i]; j++)
199 for (k = 0; k < s->comparators_num; k++)
201 sn_comparator_t *c = s->comparators + k;
203 /* Check if this comparator is displayed on another line */
207 if (j == SN_COMP_MIN (c))
209 else if (j == SN_COMP_MAX (c))
212 if ((j >= SN_COMP_LEFT (c)) && (j < SN_COMP_RIGHT (c)))
215 if ((on_elem != 0) || (line_after != 0))
226 else if (on_elem == -1)
240 } /* for (columns) */
246 } /* int sn_stage_show */
248 int sn_stage_invert (sn_stage_t *s)
252 for (i = 0; i < s->comparators_num; i++)
253 sn_comparator_invert (s->comparators + i);
256 } /* int sn_stage_invert */
258 int sn_stage_swap (sn_stage_t *s, int con0, int con1)
262 for (i = 0; i < s->comparators_num; i++)
263 sn_comparator_swap (s->comparators + i, con0, con1);
266 } /* int sn_stage_swap */
268 int sn_stage_cut_at (sn_stage_t *s, int input, enum sn_network_cut_dir_e dir)
270 int new_position = input;
273 for (i = 0; i < s->comparators_num; i++)
275 sn_comparator_t *c = s->comparators + i;
277 if ((SN_COMP_MIN (c) != input) && (SN_COMP_MAX (c) != input))
280 if ((dir == DIR_MIN) && (SN_COMP_MAX (c) == input))
282 new_position = SN_COMP_MIN (c);
284 else if ((dir == DIR_MAX) && (SN_COMP_MIN (c) == input))
286 new_position = SN_COMP_MAX (c);
292 if (i < s->comparators_num)
293 sn_stage_comparator_remove (s, i);
296 return (new_position);
297 } /* int sn_stage_cut_at */
299 int sn_stage_remove_input (sn_stage_t *s, int input)
303 for (i = 0; i < s->comparators_num; i++)
305 sn_comparator_t *c = s->comparators + i;
307 if ((SN_COMP_MIN (c) == input) || (SN_COMP_MAX (c) == input))
309 sn_stage_comparator_remove (s, i);
314 if (SN_COMP_MIN (c) > input)
315 SN_COMP_MIN (c) = SN_COMP_MIN (c) - 1;
316 if (SN_COMP_MAX (c) > input)
317 SN_COMP_MAX (c) = SN_COMP_MAX (c) - 1;
323 sn_stage_t *sn_stage_read (FILE *fh)
329 s = sn_stage_create (0);
333 while (fgets (buffer, sizeof (buffer), fh) != NULL)
338 if ((buffer[0] == '\0') || (buffer[0] == '\n') || (buffer[0] == '\r'))
343 c.min = (int) strtol (buffer_ptr, &endptr, 0);
344 if (buffer_ptr == endptr)
349 c.max = (int) strtol (buffer_ptr, &endptr, 0);
350 if (buffer_ptr == endptr)
353 sn_stage_comparator_add (s, &c);
356 if (s->comparators_num == 0)
358 sn_stage_destroy (s);
363 } /* sn_stage_t *sn_stage_read */
365 int sn_stage_write (sn_stage_t *s, FILE *fh)
369 if (s->comparators_num <= 0)
372 for (i = 0; i < s->comparators_num; i++)
373 fprintf (fh, "%i %i\n",
374 SN_COMP_MIN (s->comparators + i),
375 SN_COMP_MAX (s->comparators + i));
379 } /* int sn_stage_write */
381 /* vim: set shiftwidth=2 softtabstop=2 : */