/*
 use_qsort.c
 Sort command line arguments
 RJM Programming - July, 2015
*/

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

int isbigger(char **g1, char **g2) {
 return strcmp(*g1, *g2);
}

int isnumericallybigger(char **g1, char **g2) {
 double dg1, dg2;
 sscanf(*g1, "%lf", &dg1);
 sscanf(*g2, "%lf", &dg2);
 if (dg1 == dg2) return 0;
 if (dg1 < dg2) return -1;
 return 1;
}

main(int argc, char **argv) {
 int (*funcArr[2])(char **, char **) = {&isbigger, &isnumericallybigger}; // declare sort function pointer array
 int myway=0;  // 0 for increasing and 2 for decreasing (via /r switch)
 int mymode=0; // 0 for alphabetical and 1 for numerical sort (via /n switch)
 int j=1, k=1;
 while (*(argv[j] + 0) == '/') {
  if (*(argv[j] + 1) == 'r' || *(argv[j] + 1) == 'R') myway = 2;
  if (*(argv[j] + 1) == 'n' || *(argv[j] + 1) == 'N') mymode = 1;
  j++;
  k++;
 }
 for (j=0; j<k; ++j) {
  argv++;
  argc--;
 }
 qsort((void *)argv, (size_t)argc, sizeof(char *), &(*(int (*)(void const *, void const *))funcArr[mymode]));
 for (j=0; j<argc; ++j) {
   printf("%s\n", argv[((argc - 1)*(myway / 2) + (1 - myway)*j)]);
 }
}

