C Fundamentals
Algorithms · data structures · cryptography · systems — pure C11, zero deps
Loading...
Searching...
No Matches
algorithms/sorting/main.c
Go to the documentation of this file.
1/**
2 * @file main.c
3 * @brief Sorting CLI — pick an algorithm, sort either argv or stdin.
4 *
5 * Usage:
6 * sorting [--algo=NAME] [words ...]
7 * echo -e "banana\napple\ncherry" | sorting [--algo=NAME]
8 *
9 * NAME ∈ {selection, insertion, bubble, quick, merge}. Default: selection.
10 */
11
12#include "sorts.h"
13#include <stdio.h>
14#include <stdlib.h>
15#include <string.h>
16
17#define MAX_WORDS 1024
18#define MAX_WORD_LEN 256
19
20typedef void (*string_sort_fn)(char **, size_t);
21
22static string_sort_fn algo_from_name(const char *name) {
23 if (strcmp(name, "selection") == 0) return selection_sort_strings;
24 if (strcmp(name, "insertion") == 0) return insertion_sort_strings;
25 if (strcmp(name, "bubble") == 0) return bubble_sort_strings;
26 if (strcmp(name, "quick") == 0) return quicksort_strings;
27 if (strcmp(name, "merge") == 0) return merge_sort_strings;
28 if (strcmp(name, "heap") == 0) return heap_sort_strings;
29 /* radix is integers-only — not exposed via this string-sort CLI. */
30 return NULL;
31}
32
33static void print_usage(const char *prog) {
34 printf("Usage: %s [--algo=NAME] [words...]\n", prog);
35 printf("\nAlgorithms: selection · insertion · bubble · quick · merge · heap\n");
36 printf("Default: selection. Radix is integers-only and not exposed here.\n\n");
37 printf("Examples:\n");
38 printf(" %s banana apple cherry\n", prog);
39 printf(" %s --algo=quick zebra ant mouse cat\n", prog);
40 printf(" echo -e 'foo\\nbar\\nbaz' | %s --algo=merge\n", prog);
41}
42
43static void print_array(char **arr, size_t n, const char *label) {
44 printf("%s: [", label);
45 for (size_t i = 0; i < n; i++) {
46 printf("\"%s\"", arr[i]);
47 if (i + 1 < n) printf(", ");
48 }
49 printf("]\n");
50}
51
52int main(int argc, char *argv[]) {
54 const char *algo_name = "selection";
55
56 /* Parse leading --algo=NAME flag. */
57 int first_word = 1;
58 if (argc > 1 && strncmp(argv[1], "--algo=", 7) == 0) {
59 algo_name = argv[1] + 7;
60 sort = algo_from_name(algo_name);
61 if (!sort) {
62 fprintf(stderr, "unknown algorithm: %s\n", algo_name);
63 print_usage(argv[0]);
64 return EXIT_FAILURE;
65 }
66 first_word = 2;
67 } else if (argc > 1 && (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0)) {
68 print_usage(argv[0]);
69 return EXIT_SUCCESS;
70 }
71
72 /* Source 1: command-line arguments after the optional flag. */
73 if (argc > first_word) {
74 char **words = &argv[first_word];
75 size_t n = (size_t)(argc - first_word);
76 print_array(words, n, "Before");
77 sort(words, n);
78 print_array(words, n, "After ");
79 printf("Algorithm: %s\n", algo_name);
80 return EXIT_SUCCESS;
81 }
82
83 /* Source 2: stdin (one word per line). */
84 char *words[MAX_WORDS];
85 size_t count = 0;
86 char buffer[MAX_WORD_LEN];
87
88 while (count < MAX_WORDS && fgets(buffer, sizeof(buffer), stdin)) {
89 buffer[strcspn(buffer, "\n")] = '\0';
90 if (buffer[0] == '\0') continue;
91 words[count] = strdup(buffer);
92 if (!words[count]) {
93 fprintf(stderr, "Memory allocation failed\n");
94 return EXIT_FAILURE;
95 }
96 count++;
97 }
98
99 if (count == 0) {
100 print_usage(argv[0]);
101 return EXIT_SUCCESS;
102 }
103
104 print_array(words, count, "Before");
105 sort(words, count);
106 print_array(words, count, "After ");
107 printf("Algorithm: %s\n", algo_name);
108
109 for (size_t i = 0; i < count; i++) free(words[i]);
110 return EXIT_SUCCESS;
111}
static void print_array(char **arr, size_t n, const char *label)
static string_sort_fn algo_from_name(const char *name)
static void print_usage(const char *prog)
void(* string_sort_fn)(char **, size_t)
#define MAX_WORDS
#define MAX_WORD_LEN
int main(void)
Definition benchmark.c:50
void bubble_sort_strings(char **arr, size_t n)
Definition bubble_sort.c:14
void heap_sort_strings(char **arr, size_t n)
Definition heap_sort.c:48
void insertion_sort_strings(char **arr, size_t n)
void merge_sort_strings(char **arr, size_t n)
Definition merge_sort.c:36
void quicksort_strings(char **arr, size_t n)
Definition quicksort.c:42
void selection_sort_strings(char **arr, size_t n)
Unified header for all sorting algorithms.