/*
 * Original version:
 *  - Modify: 2005-10-12 01:03:31.000000000 +0300
 *  - Change: 2008-09-19 20:54:40.000000000 +0300
 *
 * Why was this created? There's a bug. This was fixed
 * at 2015-08-10 17:41 +0300.
 */

#include <stdio.h>
#include <stdlib.h>



typedef struct {
	int id;
	char *string;
} element_t;



static void
free_list(element_t **list, size_t nmemb)
{
	int i;
	for (i = 0; i < nmemb; i++) {
		free(list[i]->string);
		free(list[i]);
	}
	free(list);
}



static int
element_compare(const void *a, const void *b)
{
	element_t *ea, *eb;
	/*
	 * original version
	 * ea = (element_t *) a;
	 * eb = (element_t *) b;
	 */
	ea = *((element_t **) a);
	eb = *((element_t **) b);
	if (ea->id < eb->id) {
		return -1;
	} else if (ea->id > eb->id) {
		return 1;
	} else {
		return 0;
	}
}



static void
print_list(element_t **list, size_t nmemb)
{
	int i;

	for (i = 0; i < nmemb; i++) {
		printf("%d: %s\n", list[i]->id, list[i]->string);
	}
}



int main(int argc, char **argv)
{
	element_t **elements;
	int size;
	int i;

	if (argc != 2) {
		printf("Usage: %s NUM\n", argv[0]);
		return 0;
	}

	size = atoi(argv[1]);
	if (size == 0) {
		size = 16;
	}

	elements = (element_t **) malloc(sizeof(element_t *) * size);
	if (elements == NULL) {
		return -1;
	}

	for (i = 0; i < size; i++) {
		int len;
		int j;

		elements[i] = (element_t *) malloc(sizeof(element_t));
		if (elements[i] == NULL) {
			free_list(elements, i);
			return -1;
		}

		elements[i]->id = rand() & 0xff;
		len = (rand() & 0xf) + 2;
		elements[i]->string = (char *) malloc(sizeof(char) * len);
		if (elements[i]->string == NULL) {
			free(elements[i]);
			free_list(elements, i);
			return -1;
		}
		for (j = 0; j < len - 1; j++) {
			elements[i]->string[j] = 'a' + (rand() & 0xf);
		}
		elements[i]->string[j] = '\0';
	}


	print_list(elements, size);
	printf("--\n");

	qsort(elements, size, sizeof(element_t *), element_compare);
	print_list(elements, size);

	free_list(elements, size);

	return 0;
}
