/* sort4.c: Sort structures via pointers */

#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}};
    struct person *some_ptrs[NELEMS] =
      {some_people,some_people+1,some_people+2,some_people+3};

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

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

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

    puts("\nBy age:");
    for (i = 0; i < NELEMS; ++i)
        printf("%s, %s, %s %d\n",
          some_ptrs[i]->last,
          some_ptrs[i]->first,
          some_ptrs[i]->phone,
          some_ptrs[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;
}

