diff options
| author | Franklin Wei <git@fwei.tk> | 2015-05-23 12:10:05 -0400 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2015-05-23 12:10:05 -0400 |
| commit | 437c81289e70e16b5058b085c8050cf855f8698e (patch) | |
| tree | 19a117dcdd44f46beea3bf47775db03d9be6c8ed /src | |
| parent | 4c7dd079360cebc8cf483907fb5e7175833109a8 (diff) | |
| download | market-sim-437c81289e70e16b5058b085c8050cf855f8698e.zip market-sim-437c81289e70e16b5058b085c8050cf855f8698e.tar.gz market-sim-437c81289e70e16b5058b085c8050cf855f8698e.tar.bz2 market-sim-437c81289e70e16b5058b085c8050cf855f8698e.tar.xz | |
ncurses stuff
Diffstat (limited to 'src')
| -rw-r--r-- | src/globals.h | 11 | ||||
| -rw-r--r-- | src/history.c | 14 | ||||
| -rw-r--r-- | src/main.c | 26 | ||||
| -rw-r--r-- | src/util.c | 59 |
4 files changed, 83 insertions, 27 deletions
diff --git a/src/globals.h b/src/globals.h index 0f96992..e9814da 100644 --- a/src/globals.h +++ b/src/globals.h @@ -87,6 +87,8 @@ struct command_t { /*** prototypes ***/ +extern bool have_color; + void do_menu(struct player_t*, const struct command_t*, uint len, const char *prompt); bool get_stock_info(char *sym, struct money_t*, char **name); char *csv_read(char**); @@ -95,7 +97,7 @@ char *read_ticker(void); int compare_stocks(const void*, const void*); void fail(const char*, ...);; struct stock_t *find_stock(struct player_t*, char*); -uint parse_args(struct player_t*, int argc, char *argv[]); +uint parse_args(struct player_t*, int argc, char *argv[], char**); uint16_t to_be16(uint16_t); uint16_t to_sys16(uint16_t); uint32_t to_be32(uint32_t); @@ -112,10 +114,15 @@ void print_history(struct stock_t*); void print_usage(int argc, char *argv[]); void print_version(void); void sig_handler(int); -int output(const char*, ...); +extern int (*output)(const char*, ...); void heading(const char *text, ...); void horiz_line(void); +#define COL_NORM 0 +#define COL_RED 1 +#define COL_GREEN 2 +void use_color(int); +void stop_color(int); void buy_handler(struct player_t*); void info_handler(struct player_t*); diff --git a/src/history.c b/src/history.c index c7aa1be..3f4b039 100644 --- a/src/history.c +++ b/src/history.c @@ -55,12 +55,18 @@ void print_history(struct stock_t *stock) switch(hist->action) { case BUY: - output("[BUY] %llu shares for $%llu.%02llu each (+$%llu.%02llu).\n", hist->count, hist->price.cents / 100, hist->price.cents % 100, - total / 100, total % 100); + output("[BUY] %llu shares for $%llu.%02llu each (", hist->count, hist->price.cents / 100, hist->price.cents % 100); + use_color(COL_GREEN); + output("+$%llu.%02llu", total / 100, total % 100); + stop_color(COL_GREEN); + output(").\n"); break; case SELL: - output("[SELL] %llu shares for $%llu.%02llu each (-$%llu.%02llu).\n", hist->count, hist->price.cents / 100, hist->price.cents % 100, - total / 100, total % 100); + output("[SELL] %llu shares for $%llu.%02llu each (", hist->count, hist->price.cents / 100, hist->price.cents % 100); + use_color(COL_RED); + output("-$%llu.%02llu", total / 100, total % 100); + stop_color(COL_RED); + output(").\n"); break; default: output("unknown history enum (%d).\n", hist->action); @@ -10,18 +10,19 @@ void quit_handler(struct player_t *player) int main(int argc, char *argv[]) { - curl_global_init(CURL_GLOBAL_DEFAULT); - initscr(); - echo(); - nocbreak(); - nl(); - scrollok(stdscr, true); + struct player_t *player = malloc(sizeof(struct player_t)); + memset(player, 0, sizeof(struct player_t)); + + char *save_file; + char **save_file_p = &save_file; - atexit(cleanup); + uint args_status = parse_args(player, argc, argv, save_file_p); - heading("Market Simulator " PROGRAM_VERSION); + curses_init(); + + atexit(cleanup); const struct sigaction handler = { .sa_handler = sig_handler @@ -29,15 +30,14 @@ int main(int argc, char *argv[]) sigaction(SIGINT, &handler, NULL); - struct player_t *player = malloc(sizeof(struct player_t)); - memset(player, 0, sizeof(struct player_t)); - - uint args_status = parse_args(player, argc, argv); + heading("Market Simulator " PROGRAM_VERSION); if(args_status & ARG_FAILURE) return EXIT_FAILURE; - if(!args_status & ARG_LOADED) + if(args_status & ARG_LOADED) + load_portfolio(player, save_file); + else player->cash.cents = 1000 * 100; while(1) @@ -279,10 +279,9 @@ void update_handler(struct player_t *player) } } -uint parse_args(struct player_t *player, int argc, char *argv[]) +uint parse_args(struct player_t *player, int argc, char *argv[], char **port_file) { uint ret = 0; - char *port_file = NULL; for(int i = 1; i < argc; ++i) { @@ -318,7 +317,7 @@ uint parse_args(struct player_t *player, int argc, char *argv[]) { if(!(ret & ARG_LOADED)) { - port_file = arg; + *port_file = arg; ret |= ARG_LOADED; } else @@ -335,9 +334,6 @@ uint parse_args(struct player_t *player, int argc, char *argv[]) if(ret & ARG_FAILURE) return ret; - if(port_file) - load_portfolio(player, port_file); - return ret; } @@ -348,13 +344,14 @@ void fail(const char *fmt, ...) char buf[256]; vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); + cleanup(); - output("FATAL: %s\n", buf); + fprintf(stdout, "FATAL: %s\n", buf); exit(EXIT_FAILURE); } -int output(const char *fmt, ...) +int curses_printf(const char *fmt, ...) { va_list ap; va_start(ap, fmt); @@ -368,6 +365,34 @@ int output(const char *fmt, ...) return ret; } +int (*output)(const char*, ...) = printf; + +void curses_init(void) +{ + initscr(); + echo(); + nocbreak(); + nl(); + scrollok(stdscr, true); + output = curses_printf; + + if(has_colors()) + { + have_color = true; + start_color(); + attron(A_BOLD); + init_color(COLOR_WHITE, 1000, 1000, 1000); + init_pair(0, COLOR_WHITE, COLOR_BLACK); + init_pair(1, COLOR_RED, COLOR_BLACK); + init_pair(2, COLOR_GREEN, COLOR_BLACK); + use_color(COL_NORM); + } + else + { + have_color = false; + } +} + void horiz_line(void) { for(int i = 0; i < getmaxx(stdscr); ++i) @@ -398,3 +423,21 @@ void heading(const char *fmt, ...) for(int i = 0; i < getmaxx(stdscr) - getmaxx(stdscr) / 2 - len - 1 - d; ++i) output("="); } + +bool have_color = false; + +void use_color(int col) +{ + if(have_color) + { + attron(COLOR_PAIR(col)); + } +} + +void stop_color(int col) +{ + if(have_color) + { + attroff(COLOR_PAIR(col)); + } +} |