/* sort3.c: Sort structures */

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

#define NELEMS 4

struct person
{
    char last[16];
    char first[11];
    char phone[13];
    int age;
};

static int name_comp(const void *, const void *);
static int age_comp(const void *, const void *);

main()
{
    size_t i;
    static struct person some_people[NELEMS] =
      {{"Lincoln","Abraham","555-1865",161},
       {"Ford","Henry","555-1903",98},
       {"Ford","Edsel","555-1965",53},
       {"Trump","Donald","555-1988",49}};

    qsort(some_people, NELEMS, sizeof some_people[0], name_comp);

    puts("By name:");
    for (i = 0; i < NELEMS; ++i)
        printf("%s, %s, %s %d\n",
          some_people[i].last,
          some_people[i].first,
          some_people[i].phone,
          some_people[i].age);

    qsort(some_people, NELEMS, sizeof some_people[0], age_comp);

    puts("\nBy age:");
    for (i = 0; i < NELEMS; ++i)
        printf("%s, %s, %s %d\n",
          some_people[i].last,
          some_people[i].first,
          some_people[i].phone,
          some_people[i].age);
    return 0;
}

static int name_comp(const void *p1, const void *p2)
{
    struct person *sp1 = (struct person *) p1;
    struct person *sp2 = (struct person *) p2;
    int order = strcmp(sp1->last,sp2->last);

    if (order == 0)
       order = strcmp(sp1->first,sp2->first);
    return order;
}

static int age_comp(const void *p1, const void *p2)
{
    struct person *sp1 = (struct person *) p1;
    struct person *sp2 = (struct person *) p2;

    return sp1->age - sp2->age;
}

/* Output:
By name:
Ford, Edsel, 555-1965 53
Ford, Henry, 555-1903 98
Lincoln, Abraham, 555-1865 161
Trump, Donald, 555-1988 49

By age:
Trump, Donald, 555-1988 49
Ford, Edsel, 555-1965 53
Ford, Henry, 555-1903 98
Lincoln, Abraham, 555-1865 161
*/
