diff options
author | Rafael G. Martins <rafael@rafaelmartins.eng.br> | 2019-04-26 19:18:11 +0200 |
---|---|---|
committer | Rafael G. Martins <rafael@rafaelmartins.eng.br> | 2019-04-28 21:57:58 +0200 |
commit | ab4685070515230c9aa64f9e69eec7fc061ee8d7 (patch) | |
tree | a051dd2237119d9094dff919bff6548536e67db6 /src/common/sort.c | |
parent | f09e36acfe2db50e0452ba1e19b13f4395a8d704 (diff) | |
download | blogc-ab4685070515230c9aa64f9e69eec7fc061ee8d7.tar.gz blogc-ab4685070515230c9aa64f9e69eec7fc061ee8d7.tar.bz2 blogc-ab4685070515230c9aa64f9e69eec7fc061ee8d7.zip |
common: added bc_slist_sort
Diffstat (limited to 'src/common/sort.c')
-rw-r--r-- | src/common/sort.c | 44 |
1 files changed, 44 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; +} |