aboutsummarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharlie Waters2018-02-06 22:43:55 -0500
committerAntony Kellermann2018-02-09 11:11:29 -0500
commit4ab1d13ceb04fdb4a1af04ffa654d8031f32a9aa (patch)
tree51c25461abf18f87c68da0a73009726bf70064b0
parent3081075b11f0541e593be22e676996a58aabd5bb (diff)
downloadaur-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.c126
1 files changed, 100 insertions, 26 deletions
diff --git a/main.c b/main.c
index 4b5b0a38356f..cc765d3e0fc3 100644
--- a/main.c
+++ b/main.c
@@ -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);