/*
 use_qsort.c
 Sort command line arguments
 RJM Programming - July, 2015
 Note: when reading from input file relies on records being different always
*/

#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 myinteractive=0;  // 0 for no prompting (nor reading file) and 1 for prompting (or reading file) (via /p switch)
 int j=1, jj=(argc - 1), k=1, m=argc;
 char msg[201]="Please use use_qsort.exe [[/reverse] [/numerical] [/prompt_or_readfile]] [[sortingarg1] [sortingarg2] ... ]\0", entry[201]="x\0", cmd[20001]="use_qsort.exe \0";
 if (argv[0]) {
  if (argc > 1) jj = 1;
  sprintf(msg, "Please use %s [[/reverse] [/numerical] [/prompt_or_readfile]] [[sortingarg1] [sortingarg2] ... ]\0", argv[0]);
  sprintf(cmd, "%s ", argv[0]);
 }
 while (*(argv[jj] + 0) == '/' && j < (argc - 0)) {
  m--;
  if (*(argv[j] + 1) == 'r' || *(argv[j] + 1) == 'R') myway = 2;
  if (*(argv[j] + 1) == 'n' || *(argv[j] + 1) == 'N') mymode = 1;
  if (*(argv[j] + 1) == 'p' || *(argv[j] + 1) == 'P') {
   myinteractive = 1;
  } else {
   strcat(cmd, argv[j]);
   strcat(cmd, " ");
  }
  j++;
  if (j < (argc - 1)) jj++;
  k++;
 }
 for (j=0; j<k; ++j) {
  argv++;
  argc--;
 }
 if (myinteractive != 0) {
  for (j=0; j<argc; j++) {
    strcat(cmd, argv[j]);
    strcat(cmd, " ");
    m--;
  }
 }
 if (m <= 1) {
  if (myinteractive != 0) {
   while (strcmp(entry, msg) != 0 && *entry >= 32 && entry) {
    strcpy(msg, entry);
    gets(entry);  // prompt for entry or get it from input file
    if (strcmp(entry, msg) != 0 && *entry >= 32 && entry) {
      strcat(cmd, entry);
      strcat(cmd, " ");
     }
   }
   system(cmd); // make it a command line scenario
  } else {
   perror(msg);
  }
 } else {
  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)]);
  }
 }
}

