/* use_qsort.c Sort command line arguments RJM Programming - July, 2015 Note: when reading from input file relies on records being different always */ #include #include #include 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= 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