aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2015-05-23 12:10:05 -0400
committerFranklin Wei <git@fwei.tk>2015-05-23 12:10:05 -0400
commit437c81289e70e16b5058b085c8050cf855f8698e (patch)
tree19a117dcdd44f46beea3bf47775db03d9be6c8ed /src
parent4c7dd079360cebc8cf483907fb5e7175833109a8 (diff)
downloadmarket-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.h11
-rw-r--r--src/history.c14
-rw-r--r--src/main.c26
-rw-r--r--src/util.c59
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);
diff --git a/src/main.c b/src/main.c
index bf1394a..13c656a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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)
diff --git a/src/util.c b/src/util.c
index a3b84ed..145535a 100644
--- a/src/util.c
+++ b/src/util.c
@@ -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));
+ }
+}