aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2015-05-23 12:33:24 -0400
committerFranklin Wei <git@fwei.tk>2015-05-23 12:33:24 -0400
commit62d053bbf4dead25afb11b688b60e26b1a91fa0a (patch)
treeca88ed3ae8033f91aacd963eb54aad772fbc4c71 /src
parent437c81289e70e16b5058b085c8050cf855f8698e (diff)
downloadmarket-sim-62d053bbf4dead25afb11b688b60e26b1a91fa0a.zip
market-sim-62d053bbf4dead25afb11b688b60e26b1a91fa0a.tar.gz
market-sim-62d053bbf4dead25afb11b688b60e26b1a91fa0a.tar.bz2
market-sim-62d053bbf4dead25afb11b688b60e26b1a91fa0a.tar.xz
enable operation without ncurses
Diffstat (limited to 'src')
-rw-r--r--src/globals.h11
-rw-r--r--src/help.c1
-rw-r--r--src/main.c5
-rw-r--r--src/util.c111
4 files changed, 93 insertions, 35 deletions
diff --git a/src/globals.h b/src/globals.h
index e9814da..4900c67 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -22,6 +22,7 @@
#define ARG_LOADED (1<<0)
#define ARG_FAILURE (1<<1)
#define ARG_VERBOSE (1<<2)
+#define ARG_NOCURSES (1<<3)
/* don't change this, it will corrupt existing saves */
#define EPOCH_YEAR 2000
@@ -92,12 +93,12 @@ 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**);
-char *read_string(void);
+char *(*read_string)(void);
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[], char**);
+uint parse_args(int argc, char *argv[], char**);
uint16_t to_be16(uint16_t);
uint16_t to_sys16(uint16_t);
uint32_t to_be32(uint32_t);
@@ -109,14 +110,16 @@ void add_hist(struct stock_t*, enum history_action, ullong count);
void all_lower(char*);
void all_upper(char*);
void cleanup(void);
+void curses_init(void);
void load_portfolio(struct player_t*, const char*);
void print_history(struct stock_t*);
void print_usage(int argc, char *argv[]);
void print_version(void);
void sig_handler(int);
extern int (*output)(const char*, ...);
-void heading(const char *text, ...);
-void horiz_line(void);
+extern void (*heading)(const char *text, ...);
+extern void (*horiz_line)(void);
+
#define COL_NORM 0
#define COL_RED 1
#define COL_GREEN 2
diff --git a/src/help.c b/src/help.c
index c362bc4..b071fa0 100644
--- a/src/help.c
+++ b/src/help.c
@@ -9,6 +9,7 @@ void print_usage(int argc, char *argv[])
output("Options:\n");
output(" -h, --help\tShow this help and exit\n");
+ output(" --nocurses\tOperate without curses\n");
output(" -v, --verbose\tEnable verbose operation\n");
output(" --version\tOutput version information and exit\n");
}
diff --git a/src/main.c b/src/main.c
index 13c656a..9f0b92b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -18,9 +18,10 @@ int main(int argc, char *argv[])
char *save_file;
char **save_file_p = &save_file;
- uint args_status = parse_args(player, argc, argv, save_file_p);
+ uint args_status = parse_args(argc, argv, save_file_p);
- curses_init();
+ if(!(args_status & ARG_NOCURSES))
+ curses_init();
atexit(cleanup);
diff --git a/src/util.c b/src/util.c
index 145535a..05273f1 100644
--- a/src/util.c
+++ b/src/util.c
@@ -225,7 +225,7 @@ void print_handler(struct player_t *player)
output("Total capital: $%llu.%02llu\n", total / 100, total % 100);
}
-char *read_string(void)
+static char *read_string_curses(void)
{
char *ret = malloc(1);
size_t len = 1;
@@ -247,6 +247,19 @@ char *read_string(void)
return ret;
}
+static char *read_string_nocurses(void)
+{
+ char *ret = NULL;
+ size_t len = 0;
+
+ len = getline(&ret, &len, stdin);
+ if(len)
+ ret[len - 1] = '\0';
+ return ret;
+}
+
+char* (*read_string)(void) = read_string_nocurses;
+
char *read_ticker(void)
{
char *str = read_string();
@@ -279,7 +292,7 @@ void update_handler(struct player_t *player)
}
}
-uint parse_args(struct player_t *player, int argc, char *argv[], char **port_file)
+uint parse_args(int argc, char *argv[], char **port_file)
{
uint ret = 0;
@@ -297,6 +310,10 @@ uint parse_args(struct player_t *player, int argc, char *argv[], char **port_fil
ret |= ARG_FAILURE;
break;
}
+ else if(strcmp(arg, "--nocurses") == 0)
+ {
+ ret |= ARG_NOCURSES;
+ }
else if(strcmp(arg, "-v") == 0 ||
strcmp(arg, "--verbose") == 0)
{
@@ -351,7 +368,7 @@ void fail(const char *fmt, ...)
exit(EXIT_FAILURE);
}
-int curses_printf(const char *fmt, ...)
+static int curses_printf(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
@@ -367,41 +384,23 @@ int curses_printf(const char *fmt, ...)
int (*output)(const char*, ...) = printf;
-void curses_init(void)
+void horiz_line_curses(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
+ for(int i = 0; i < getmaxx(stdscr); ++i)
{
- have_color = false;
+ output("=");
}
}
-void horiz_line(void)
+void horiz_line_nocurses(void)
{
- for(int i = 0; i < getmaxx(stdscr); ++i)
- {
+ for(int i = 0; i < 80; ++i)
output("=");
- }
}
-void heading(const char *fmt, ...)
+void (*horiz_line)(void) = horiz_line_nocurses;
+
+void heading_curses(const char *fmt, ...)
{
char text[128];
va_list ap;
@@ -424,6 +423,31 @@ void heading(const char *fmt, ...)
output("=");
}
+void heading_nocurses(const char *fmt, ...)
+{
+ char text[128];
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(text, sizeof(text), fmt, ap);
+ va_end(ap);
+
+ int len = strlen(text) / 2;
+ int beg_x = 40 - len;
+ int d = 0;
+ if(strlen(text) & 1)
+ d++;
+
+ for(int i = 0; i < beg_x - 1; ++i)
+ output("=");
+ output(" ");
+ output(text);
+ output(" ");
+ for(int i = 0; i < 40 - len - 1 - d; ++i)
+ output("=");
+}
+
+void (*heading)(const char*, ...) = heading_nocurses;
+
bool have_color = false;
void use_color(int col)
@@ -441,3 +465,32 @@ void stop_color(int col)
attroff(COLOR_PAIR(col));
}
}
+
+void curses_init(void)
+{
+ initscr();
+ echo();
+ nocbreak();
+ nl();
+ scrollok(stdscr, true);
+ output = curses_printf;
+ read_string = read_string_curses;
+ horiz_line = horiz_line_curses;
+ heading = heading_curses;
+
+ 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;
+ }
+}