diff options
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/sort.c | 44 | ||||
-rw-r--r-- | src/common/sort.h | 18 |
2 files changed, 62 insertions, 0 deletions
diff --git a/src/common/sort.c b/src/common/sort.c new file mode 100644 index 0000000..3e24706 --- /dev/null +++ b/src/common/sort.c @@ -0,0 +1,44 @@ +/* + * blogc: A blog compiler. + * Copyright (C) 2014-2019 Rafael G. Martins <rafael@rafaelmartins.eng.br> + * + * This program can be distributed under the terms of the BSD License. + * See the file LICENSE. + */ + +#include <stdbool.h> +#include "utils.h" +#include "sort.h" + + +bc_slist_t* +bc_slist_sort(bc_slist_t *l, bc_sort_func_t cmp) +{ + if (l == NULL) { + return NULL; + } + + bool swapped = false; + bc_slist_t *lptr = NULL; + bc_slist_t *rptr = NULL; + + do { + swapped = false; + lptr = l; + + while (lptr->next != rptr) { + if (0 < cmp(lptr->data, lptr->next->data)) { + void *tmp = lptr->data; + lptr->data = lptr->next->data; + lptr->next->data = tmp; + swapped = true; + } + + lptr = lptr->next; + } + + rptr = lptr; + } while(swapped); + + return l; +} diff --git a/src/common/sort.h b/src/common/sort.h new file mode 100644 index 0000000..9f4dda2 --- /dev/null +++ b/src/common/sort.h @@ -0,0 +1,18 @@ +/* + * blogc: A blog compiler. + * Copyright (C) 2014-2019 Rafael G. Martins <rafael@rafaelmartins.eng.br> + * + * This program can be distributed under the terms of the BSD License. + * See the file LICENSE. + */ + +#ifndef _SORT_H +#define _SORT_H + +#include "utils.h" + +typedef int (*bc_sort_func_t) (const void *a, const void *b); + +bc_slist_t* bc_slist_sort(bc_slist_t *l, bc_sort_func_t cmp); + +#endif /* _SORT_H */ |