From 5ef8dbdee5252e5a13d7aeb1a5dc416672035f62 Mon Sep 17 00:00:00 2001 From: Om Raheja Date: Tue, 27 Aug 2024 18:12:46 -0400 Subject: [PATCH] added some opt args, adding weighted ranking feature. ready to ship though --- rank.h | 13 +++++ weightedrank | Bin 34096 -> 0 bytes weightedrank.c | 135 +++++++++++++++++++++++++++++++++++++------------ 3 files changed, 117 insertions(+), 31 deletions(-) delete mode 100755 weightedrank diff --git a/rank.h b/rank.h index 931cc25..1577af4 100644 --- a/rank.h +++ b/rank.h @@ -17,5 +17,18 @@ struct RankList int rank_count; }; +struct Weighted +{ + char opt1[M_STR_LEN]; + float opt1_w; + char opt2[M_STR_LEN]; + float opt2_w; + char opt3[M_STR_LEN]; + float opt3_w; +}; + +void isort(char [][M_STR], struct Rank[], int); +void rank(struct RankList *); +void print_ranklist(struct RankList *); #endif diff --git a/weightedrank b/weightedrank deleted file mode 100755 index d77595d2d187ec96bf4ae861e59a8e098480aa06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34096 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 diff --git a/weightedrank.c b/weightedrank.c index 79249ed..198112a 100644 --- a/weightedrank.c +++ b/weightedrank.c @@ -4,6 +4,7 @@ * This file is public domain. */ +#include #include #include #include @@ -11,10 +12,18 @@ #include "color.h" #include "rank.h" -void isort(char [][M_STR], struct Rank[], int); +void usage(void); + +static struct option long_options[] = { + {"help", no_argument, NULL, 'h'}, + {"no-color", no_argument, NULL, 'n'}, + {"weighted", no_argument, NULL, 'w'}, + {"log-file", required_argument, NULL, 'l'}, + {NULL, 0, NULL, 0 } +}; int -main(void) +main(int argc, char *argv[]) { // allocate memory for Rank struct RankList *items = malloc(sizeof(struct RankList)); @@ -23,7 +32,83 @@ main(void) printf(BOLDRED "Error: out of memory\n" RESET); return 1; } + + // get options + char ch; + char weighted = 0; + while ((ch = getopt_long(argc, argv, "hnwl:", long_options, NULL)) != -1) { + switch (ch) { + case 'h': + usage(); + break; + case 'n': + //TODO: disable_color(); + puts("Not implemented yet"); + break; + case 'w': + weighted = 1; + break; + case 'l': + //TODO: set_log_file(optarg); + puts("Not implemented yet"); + break; + default: + usage(); + break; + } + } + rank(items); + + if (!weighted) { + // print the rank list + print_ranklist(items); + } else { + struct Weighted *weighted = malloc(sizeof(struct Weighted)); + // move the top 3 items from the ranklist here + weighted->opt1 = items->rank_sorted[0].name; + weighted->opt2 = items->rank_sorted[1].name; + weighted->opt3 = items->rank_sorted[2].name; + + // leave if any are null + if (!weighted->opt1 || !weighted->opt2 || !weighted->opt3) { + puts(BOLDRED "Error: not enough weights.\n" RESET); + goto end; + } +end: + free(weighted); + } + + free(items); + return 0; +} + +void +isort(char matrix[][M_STR], struct Rank to_sort[], int len) { + // sort by value, modify key accordingly + for (int i = 1; i < len; i++) { + int key = to_sort[i].score; + + char str_key[M_STR_LEN]; + strncpy(str_key, to_sort[i].name, M_STR_LEN); + + int j = i - 1; + + while (j >= 0 && (to_sort[j].score < key || matrix[i][j]) ) { + to_sort[j + 1].score = to_sort[j].score; + strncpy(to_sort[j + 1].name, to_sort[j].name, M_STR_LEN); + + j--; + } + to_sort[++j].score = key; + strncpy(to_sort[j].name, str_key, M_STR_LEN); + } + + return; +} + +void +rank(struct RankList *items) { // read strings printf(BOLDWHITE "Enter a ranking (empty line when done) \n" RESET); @@ -47,9 +132,9 @@ main(void) // construct matrix of comparisons // NOTE: it doesn't actually store the "reason", // it just forces the user to type something out lol - char matrix[i][i]; + char matrix[M_STR][M_STR]; - // memcpy(3) with null bytes + // memset(3) with null bytes memset(matrix, 0, sizeof(matrix)); // compare all of the elements @@ -83,40 +168,28 @@ main(void) memcpy(items->rank_sorted, items->rank, sizeof(struct Rank) * M_STR); + items->rank_count = i; + // insertion sort: the array **should be** nearly sorted isort(matrix, items->rank_sorted, i); +} +void +print_ranklist(struct RankList *items) { printf(BOLDRED "Original: " RESET " | " BOLDGREEN "Sorted: " RESET "\n\n"); - for (int j = 0; j < i; j++) { + for (int j = 0; j < items->rank_count; j++) { printf("%s: %d | %s: %d\n", items->rank[j].name, items->rank[j].score, items->rank_sorted[j].name, items->rank_sorted[j].score); } +} - free(items); - return 0; -} - -void -isort(char matrix[][M_STR], struct Rank to_sort[], int len) { - // sort by value, modify key accordingly - for (int i = 1; i < len; i++) { - int key = to_sort[i].score; - - char str_key[M_STR_LEN]; - strncpy(str_key, to_sort[i].name, M_STR_LEN); - - int j = i - 1; - - while (j >= 0 && (to_sort[j].score < key || matrix[i][j]) ) { - to_sort[j + 1].score = to_sort[j].score; - strncpy(to_sort[j + 1].name, to_sort[j].name, M_STR_LEN); - - j--; - } - to_sort[++j].score = key; - strncpy(to_sort[j].name, str_key, M_STR_LEN); - } - - return; +void +usage(void) { + puts(BOLDWHITE "Usage: weightedrank [options]\n" + "Options:\n" RESET + " -h, --help display this help and exit\n" + " -n, --no-color disable colors\n" + " -w, --weighted use weighted rankings\n" + " -l, --log-file FILE write log to FILE\n"); }