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

struct mystruct {
  char *label;
  unsigned a, b, c;
};


struct mystruct data[] = 
{ { "First ", 1, 2, 3},
  { "Second", 2, 3, 1},
  { "Third ", 3, 1, 2}
};

static int order = 1;           /* ascending */
int compare_structs(const void *, const void *);


int
main(int argc, char **argv) {
  unsigned field;
  char *field_addr;
  unsigned i;

  if (argc != 2) return 1;
  order = argv[1][0] == '-' ? -1 : 1;
  

  printf("I will sort by field 3 in %s order.\n", 
         order >= 0 ? "ascending" : "descending");

  qsort(data,                   /* base */
        sizeof(data)/sizeof(data[0]), /* nmemb */
        sizeof(data[0]),        /* size */
        compare_structs);

  for (i=0; i < sizeof(data)/sizeof(data[0]); i++) {
    struct mystruct d = data[i];
    printf("%u: { %s, %u, %u, %u }\n", i,
           d.label, d.a, d.b, d.c);
  }
  return 0;
}

int
compare_structs(const void *s1, const void *s2)
{
  return order * (((struct mystruct *)s1)->c - ((struct mystruct *) s2)->c);
}

