diff options
author | Charlie Waters | 2018-02-06 22:43:55 -0500 |
---|---|---|
committer | Antony Kellermann | 2018-02-09 11:11:29 -0500 |
commit | 4ab1d13ceb04fdb4a1af04ffa654d8031f32a9aa (patch) | |
tree | 51c25461abf18f87c68da0a73009726bf70064b0 | |
parent | 3081075b11f0541e593be22e676996a58aabd5bb (diff) | |
download | aur-4ab1d13ceb04fdb4a1af04ffa654d8031f32a9aa.tar.gz |
mostly rewrite main.c, fix some segfaults on missing arguments, add
support for adding shares by unit price "[USD$[EA]]"
(cherry picked from commit bbf194f2e9b05a0d5cd18cd1260d28f857e7c764)
-rw-r--r-- | main.c | 126 |
1 files changed, 100 insertions, 26 deletions
@@ -2,52 +2,126 @@ #include "api.h" #include "portfolio.h" +void strtolower(char* str) { + for (int i = 0; str[i] != '\0'; i++) + str[i] = (char) tolower(str[i]); +} + +void strtoupper(char* str) { + for (int i = 0; str[i] != '\0'; i++) + str[i] = (char) toupper(str[i]); +} + int main(int argc, char* argv[]) { - if (argc == 3 && strcmp(argv[1], "news") == 0) { - if (strlen(argv[2]) <= 32 && strlen(argv[2]) > 1) - news_print_top_three(argv[2]); - else printf("Input invalid length.\n"); - return 0; - } - if (argc == 1 || argc == 4 || argc > 5) { + if (argc < 2) { printf("Invalid arguments. Type \"man tick\" for help.\n"); return 0; } + char cmd[strlen(argv[1]) + 1]; + strcpy(cmd, argv[1]); + strtolower(cmd); + + // Init/open portfolio portfolio_file_init(); FILE* fp = fopen(portfolio_file, "a+"); if (fp == NULL) { printf("Could not open portfolio file\n"); - fclose(fp); free((void*) portfolio_file); return 0; } + + //Convert legacy porfolio if (argc == 2 && strcmp(argv[1], "convert") == 0){ portfolio_legacy_convert(); free((void*) portfolio_file); fclose(fp); return 0; } - for (int i = 0; argv[2][i] != '\0'; i++) - argv[2][i] = (char) toupper(argv[2][i]); - if (argc == 5) { - if (strlen(argv[2]) > 16) + + // Portfolio modify operation + int modop = -1; + + // News + if (strcmp(cmd, "news") == 0) { + if (argc == 3 && strlen(argv[2]) <= 32 && strlen(argv[2]) > 1) + news_print_top_three(argv[2]); + else + printf("Invalid symbol.\n"); + } + + // Check + else if (strcmp(cmd, "check") == 0) { + if (argc < 3) { + portfolio_print_all(fp); + } else { + char sym[strlen(argv[2]) + 1]; + strcpy(sym, argv[2]); + strtoupper(sym); + if (strcmp(sym, "ALL") == 0) + portfolio_print_all(fp); + else + free(portfolio_print_stock(sym, fp, NULL)); + } + } + + // Portfolio + else if (strcmp(cmd, "add") == 0) + modop = ADD; + else if (strcmp(cmd, "rm") == 0) + modop = REMOVE; + else if (strcmp(cmd, "set") == 0) + modop = SET; + + else { + printf("Invalid arguments. Type \"man tick\" for help.\n"); + } + + // Portfolio Operations + if (modop > -1) { + if (argc != 5) + printf("Invalid arguments. Type \"man tick\" for help.\n"); + else if (strlen(argv[2]) > 16) printf("Invalid symbol.\n"); else if (strlen(argv[3]) > 16 || strlen(argv[4]) > 16) printf("Value too large.\n"); - else if (strcmp(argv[1], "add") == 0) - portfolio_modify(argv[2], strtod(argv[3], NULL), strtod(argv[4], NULL), fp, ADD); - else if (strcmp(argv[1], "rm") == 0) - portfolio_modify(argv[2], strtod(argv[3], NULL), strtod(argv[4], NULL), fp, REMOVE); - else if (strcmp(argv[1], "set") == 0) - portfolio_modify(argv[2], strtod(argv[3], NULL), strtod(argv[4], NULL), fp, SET); - else - printf("Invalid argument.\n"); - } else { - if (argc == 3 && strcmp(argv[1], "check") == 0) { - if (strcmp(argv[2], "ALL") == 0) - portfolio_print_all(fp); - else free(portfolio_print_stock(argv[2], fp, NULL)); - } else printf("Invalid arguments.\n"); + else { + char sym[strlen(argv[2]) + 1]; + strcpy(sym, argv[2]); + strtoupper(sym); + + double qty = strtod(argv[3], NULL); + + size_t ulen = strlen(argv[4]); + char susd[ulen + 1]; + strcpy(susd, argv[4]); + strtoupper(susd); + + // If last two characters of price are "EA", calculate + // total price with number of units + char ea = 0; + if (susd[ulen - 2] == 'E' && susd[ulen - 1] == 'A') { + ea = 1; + susd[ulen - 2] = '\0'; + } + + double usd = strtod(susd, NULL); + if (ea) + usd *= qty; + + switch (modop) { + case ADD: + portfolio_modify(sym, qty, usd, fp, ADD); + break; + case REMOVE: + portfolio_modify(sym, qty, usd, fp, REMOVE); + break; + case SET: + portfolio_modify(sym, qty, usd, fp, SET); + break; + default: + break; + } + } } free((void*) portfolio_file); fclose(fp); |