Reorganize code
This commit is contained in:
parent
06bff9cb8f
commit
ff64e45988
114
json-rpc-shell.c
114
json-rpc-shell.c
@ -59,6 +59,13 @@
|
|||||||
#include <curses.h>
|
#include <curses.h>
|
||||||
#include <term.h>
|
#include <term.h>
|
||||||
|
|
||||||
|
/// Shorthand to set an error and return failure from the function
|
||||||
|
#define FAIL(...) \
|
||||||
|
BLOCK_START \
|
||||||
|
error_set (e, __VA_ARGS__); \
|
||||||
|
return false; \
|
||||||
|
BLOCK_END
|
||||||
|
|
||||||
// --- Configuration (application-specific) ------------------------------------
|
// --- Configuration (application-specific) ------------------------------------
|
||||||
|
|
||||||
static struct config_item g_config_table[] =
|
static struct config_item g_config_table[] =
|
||||||
@ -76,6 +83,56 @@ static struct config_item g_config_table[] =
|
|||||||
{ NULL, NULL, NULL }
|
{ NULL, NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// --- Terminal ----------------------------------------------------------------
|
||||||
|
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
bool initialized; ///< Terminal is available
|
||||||
|
bool stdout_is_tty; ///< `stdout' is a terminal
|
||||||
|
bool stderr_is_tty; ///< `stderr' is a terminal
|
||||||
|
|
||||||
|
char *color_set[8]; ///< Codes to set the foreground colour
|
||||||
|
}
|
||||||
|
g_terminal;
|
||||||
|
|
||||||
|
static bool
|
||||||
|
init_terminal (void)
|
||||||
|
{
|
||||||
|
int tty_fd = -1;
|
||||||
|
if ((g_terminal.stderr_is_tty = isatty (STDERR_FILENO)))
|
||||||
|
tty_fd = STDERR_FILENO;
|
||||||
|
if ((g_terminal.stdout_is_tty = isatty (STDOUT_FILENO)))
|
||||||
|
tty_fd = STDOUT_FILENO;
|
||||||
|
|
||||||
|
int err;
|
||||||
|
if (tty_fd == -1 || setupterm (NULL, tty_fd, &err) == ERR)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Make sure all terminal features used by us are supported
|
||||||
|
if (!set_a_foreground || !enter_bold_mode || !exit_attribute_mode)
|
||||||
|
{
|
||||||
|
del_curterm (cur_term);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < N_ELEMENTS (g_terminal.color_set); i++)
|
||||||
|
g_terminal.color_set[i] = xstrdup (tparm (set_a_foreground,
|
||||||
|
i, 0, 0, 0, 0, 0, 0, 0, 0));
|
||||||
|
|
||||||
|
return g_terminal.initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_terminal (void)
|
||||||
|
{
|
||||||
|
if (!g_terminal.initialized)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < N_ELEMENTS (g_terminal.color_set); i++)
|
||||||
|
free (g_terminal.color_set[i]);
|
||||||
|
del_curterm (cur_term);
|
||||||
|
}
|
||||||
|
|
||||||
// --- Main program ------------------------------------------------------------
|
// --- Main program ------------------------------------------------------------
|
||||||
|
|
||||||
// HTTP/S and WS/S require significantly different handling. While for HTTP we
|
// HTTP/S and WS/S require significantly different handling. While for HTTP we
|
||||||
@ -108,13 +165,6 @@ struct backend_iface
|
|||||||
void (*destroy) (struct app_context *ctx);
|
void (*destroy) (struct app_context *ctx);
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Shorthand to set an error and return failure from the function
|
|
||||||
#define FAIL(...) \
|
|
||||||
BLOCK_START \
|
|
||||||
error_set (e, __VA_ARGS__); \
|
|
||||||
return false; \
|
|
||||||
BLOCK_END
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
enum ws_handler_state
|
enum ws_handler_state
|
||||||
@ -234,56 +284,6 @@ g_ctx;
|
|||||||
|
|
||||||
// --- Attributed output -------------------------------------------------------
|
// --- Attributed output -------------------------------------------------------
|
||||||
|
|
||||||
static struct
|
|
||||||
{
|
|
||||||
bool initialized; ///< Terminal is available
|
|
||||||
bool stdout_is_tty; ///< `stdout' is a terminal
|
|
||||||
bool stderr_is_tty; ///< `stderr' is a terminal
|
|
||||||
|
|
||||||
char *color_set[8]; ///< Codes to set the foreground colour
|
|
||||||
}
|
|
||||||
g_terminal;
|
|
||||||
|
|
||||||
static bool
|
|
||||||
init_terminal (void)
|
|
||||||
{
|
|
||||||
int tty_fd = -1;
|
|
||||||
if ((g_terminal.stderr_is_tty = isatty (STDERR_FILENO)))
|
|
||||||
tty_fd = STDERR_FILENO;
|
|
||||||
if ((g_terminal.stdout_is_tty = isatty (STDOUT_FILENO)))
|
|
||||||
tty_fd = STDOUT_FILENO;
|
|
||||||
|
|
||||||
int err;
|
|
||||||
if (tty_fd == -1 || setupterm (NULL, tty_fd, &err) == ERR)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Make sure all terminal features used by us are supported
|
|
||||||
if (!set_a_foreground || !enter_bold_mode || !exit_attribute_mode)
|
|
||||||
{
|
|
||||||
del_curterm (cur_term);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t i = 0; i < N_ELEMENTS (g_terminal.color_set); i++)
|
|
||||||
g_terminal.color_set[i] = xstrdup (tparm (set_a_foreground,
|
|
||||||
i, 0, 0, 0, 0, 0, 0, 0, 0));
|
|
||||||
|
|
||||||
return g_terminal.initialized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
free_terminal (void)
|
|
||||||
{
|
|
||||||
if (!g_terminal.initialized)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < N_ELEMENTS (g_terminal.color_set); i++)
|
|
||||||
free (g_terminal.color_set[i]);
|
|
||||||
del_curterm (cur_term);
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
|
|
||||||
typedef int (*terminal_printer_fn) (int);
|
typedef int (*terminal_printer_fn) (int);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
Loading…
Reference in New Issue
Block a user