diff options
| author | Thorsten Töpper <atsutane@freethoughts.de> | 2025-09-11 21:58:03 +0200 |
|---|---|---|
| committer | Thorsten Töpper <atsutane@freethoughts.de> | 2025-09-11 21:58:03 +0200 |
| commit | ae3b1829f9731662b5e2b626655a619733101209 (patch) | |
| tree | 32af93ec8facd3e7d96764b1ececffabd7d0dc9a | |
| parent | 3d4e2fc261d3471eac5e68c5905ab5980f0ff89f (diff) | |
| download | small-utils-ae3b1829f9731662b5e2b626655a619733101209.tar.gz small-utils-ae3b1829f9731662b5e2b626655a619733101209.tar.bz2 | |
Example code for libc qsort and bsearch
| -rw-r--r-- | Makefile | 22 | ||||
| -rw-r--r-- | src/sort_example.c | 61 |
2 files changed, 81 insertions, 2 deletions
@@ -14,6 +14,8 @@ CFLAGS += -I include all: \ out/custom_uniq \ out/mem_internal_check \ + out/remove_existing_lines \ + out/sort_example \ out/split_for_sort \ out/tree_based_check @@ -21,6 +23,8 @@ all: \ debug: \ out/debug/custom_uniq \ out/debug/mem_internal_check \ + out/debug/remove_existing_lines \ + out/debug/sort_example \ out/debug/split_for_sort \ out/debug/tree_based_check @@ -47,13 +51,27 @@ out/debug/custom_uniq: out/debug src/custom_uniq.c include/trace_macros.h ${CC} -o $@ ${CFLAGS} ${DEBUG_CFLAGS} src/custom_uniq.c out/mem_internal_check: out src/mem_internal_check.c \ - include/trace_macros.h include/hex_conversion.h + include/trace_macros.h include/hex_conversion.h include/time_utils.h ${CC} -o $@ ${CFLAGS} ${PROD_CFLAGS} src/mem_internal_check.c out/debug/mem_internal_check: out/debug src/mem_internal_check.c \ - include/trace_macros.h include/hex_conversion.h + include/trace_macros.h include/hex_conversion.h include/time_utils.h ${CC} -o $@ ${CFLAGS} ${DEBUG_CFLAGS} src/mem_internal_check.c +out/remove_existing_lines: out src/remove_existing_lines.c \ + include/trace_macros.h include/time_utils.h + ${CC} -o $@ ${CFLAGS} ${PROD_CFLAGS} src/remove_existing_lines.c + +out/debug/remove_existing_lines: out/debug src/mem_internal_check.c \ + include/trace_macros.h include/hex_conversion.h + ${CC} -o $@ ${CFLAGS} ${DEBUG_CFLAGS} src/remove_existing_lines.c + +out/sort_example: out src/sort_example.c + ${CC} -o $@ ${CFLAGS} ${PROD_CFLAGS} src/sort_example.c + +out/debug/sort_example: out src/sort_example.c + ${CC} -o $@ ${CFLAGS} ${DEBUG_CFLAGS} src/sort_example.c + out/split_for_sort: out src/split_for_sort.c include/trace_macros.h ${CC} -o $@ ${CFLAGS} ${PROD_CFLAGS} src/split_for_sort.c diff --git a/src/sort_example.c b/src/sort_example.c new file mode 100644 index 0000000..7506cde --- /dev/null +++ b/src/sort_example.c @@ -0,0 +1,61 @@ + +/* + * vim:ts=4:sw=4:expandtab + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <stdbool.h> +#include <stdint.h> + +int sort_comp(const void *a, const void *b) { + /* casting is dark magic */ + char * const *A = a; + char * const *B = b; + return strcmp(*A,*B); +} + +bool search_in_array(char *str, char *array[], size_t items) { + char *cptr = NULL; + + printf (" ==> Search for '%s'\n", str); + cptr = bsearch(&str, array, items, sizeof(char*), sort_comp); + + return (cptr==NULL) ? false : true ; +} + +int main(void) { + char *array[] = { + "some", "example", "test", "data", "for", "sort", + "and", "search", "duplicate", "data" }; + size_t items = sizeof(array)/sizeof(char*) ; + size_t i = 0; + + printf(" ==> raw test data\n"); + for (i=0; i<items; i++) { + printf("\t%2lu - %s\n", i, array[i]); + } + + printf(" ==> qsort call\n"); + qsort(array, items, sizeof(char*), sort_comp); + + printf(" ==> sorted test data\n"); + for (i=0; i<items; i++) { + printf("\t%2lu - %s\n", i, array[i]); + } + + if (search_in_array("data", array, items)) { + printf("\t-> positive hit\n"); + } else { + printf("\t-> not found\n"); + } + + if (search_in_array("non-existing", array, items)) { + printf("\t-> positive hit\n"); + } else { + printf("\t-> not found\n"); + } + + return EXIT_SUCCESS; +} |
