/**
* Copyright © 2016-2019 Xavier G. <xavier@kindwolf.org>
* This work is free. You can redistribute it and/or modify it under the
* terms of the Do What The Fuck You Want To Public License, Version 2,
* as published by Sam Hocevar. See the COPYING file for more details.
*/
/**
* This file is a skeleton intended to test a sorting algorithm.
* To use it, create foobar.c with the following contents:
* void array_sort(unsigned int **array, unsigned int count) {
* do_stuff_here();
* }
* #define ARRAY_SORT 1
* #include "common.c"
* Then compile it by running: gcc foobar.c -o foobar
* Executing foobar will run your sorting function to sort an array of
* integers.
*/
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
unsigned int *array;
int verbose;
#define VERBOSE(level, format, ...) \
if (verbose >= level) fprintf(stdout, format, __VA_ARGS__);
void array_fill(unsigned int *array, unsigned int count, unsigned int max) {
if (!array || !count) return;
if (!max) max = RAND_MAX;
for (unsigned int i = 0; i < count; ++ i) {
array[i] = rand() % max;
}
}
void array_display(unsigned int *array, unsigned int count, const char *prefix, const char *suffix) {
if (!array) return;
if (prefix) printf(prefix);
printf("[");
for (unsigned int i = 0; i < count; ++ i) {
printf(i ? ", %d" : "%d", array[i]);
}
printf("]");
if (suffix) printf(suffix);
}
int usage(char *program_name) {
fprintf(stderr, "Usage: %s [count]\n", program_name);
exit(EXIT_FAILURE);
}
int main(int argc, char **argv, char **envp) {
int count_arg;
char *endptr, *verbose_ve;
struct timeval before_start, after_end, diff;
unsigned int count;
unsigned int max;
/* By default, generate an array of 100 integers between 0 and 10000: */
count = 100;
max = 10000;
verbose = -1;
/* Accept a single, optional command-line argument to override count: */
if (argc > 2) {
usage(argv[0]);
}
/* Attempt to parse that argument as a positive integer: */
if (argc == 2) {
errno = 0;
count_arg = strtol(argv[1], &endptr, 10);
/* Check endptr to ensure some digits were found: */
if (!errno && endptr != argv[1] && count_arg >= 0) {
count = count_arg;
}
else {
usage(argv[0]);
}
}
/* Allow overriding verbosity through an environment variable: */
if ((verbose_ve = getenv("SORTING_VERBOSE"))) {
verbose = strtol(verbose_ve, NULL, 10);
}
/* Require memory for an array of integers, fill it with random crap: */
array = malloc(sizeof(unsigned int) * count);
srand(time(NULL));
array_fill(array, count, max);
array_display(array, count, "Before: ", "\n\n");
/* Look at our watch, do the work, look at our watch again: */
printf("=> About to sort %u items\n", count);
gettimeofday(&before_start, NULL);
#ifdef ARRAY_SORT
array_sort(&array, count);
#endif
gettimeofday(&after_end, NULL);
/* Compute how much time the work took and display the results: */
timersub(&after_end, &before_start, &diff);
printf("<= Sorted %u items in %ld.%06lds\n\n", count, diff.tv_sec, diff.tv_usec);
array_display(array, count, "After: ", "\n");
return 0;
}