Remove `dprintf()` usage.
This commit is contained in:
parent
6e8fd91103
commit
f9238f7e26
|
@ -12,7 +12,7 @@ this notice are preserved. This file is offered as-is, without any warranty.
|
||||||
|
|
||||||
This is the recommended way to use this library.
|
This is the recommended way to use this library.
|
||||||
|
|
||||||
Copy [ctlseqs.h](src/ctlseqs.h) and [ctlseqs.c](src/ctlseqs.c) to your project and build it alongside with other code. Requires an ISO C99 and POSIX.1-2008 compliant C implementation.
|
Copy [ctlseqs.h](src/ctlseqs.h) and [ctlseqs.c](src/ctlseqs.c) to your project and build it alongside with other code. Requires an ISO C99 and POSIX.1-2001 compliant C implementation.
|
||||||
|
|
||||||
## Build and Install From Source
|
## Build and Install From Source
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ AC_TYPE_SIZE_T
|
||||||
AC_TYPE_SSIZE_T
|
AC_TYPE_SSIZE_T
|
||||||
|
|
||||||
# Checks for library functions.
|
# Checks for library functions.
|
||||||
AC_CHECK_FUNCS([dprintf memset strtoul])
|
AC_CHECK_FUNCS([memset strtoul])
|
||||||
|
|
||||||
# Specify libtool library version.
|
# Specify libtool library version.
|
||||||
m4_define([CTLSEQS_LT_CURRENT], [0])
|
m4_define([CTLSEQS_LT_CURRENT], [0])
|
||||||
|
@ -49,8 +49,5 @@ m4_define([CTLSEQS_LT_REVISION], [0])
|
||||||
m4_define([CTLSEQS_LT_AGE], [0])
|
m4_define([CTLSEQS_LT_AGE], [0])
|
||||||
AC_SUBST([CTLSEQS_LT_VERSION], [CTLSEQS_LT_CURRENT:CTLSEQS_LT_REVISION:CTLSEQS_LT_AGE])
|
AC_SUBST([CTLSEQS_LT_VERSION], [CTLSEQS_LT_CURRENT:CTLSEQS_LT_REVISION:CTLSEQS_LT_AGE])
|
||||||
|
|
||||||
# Assume that POSIX.1-2008 is supported.
|
|
||||||
AC_DEFINE([_POSIX_C_SOURCE], [200809L], [Feature test macro for POSIX.1-2008])
|
|
||||||
|
|
||||||
AC_CONFIG_FILES([Makefile doc/Makefile man/Makefile src/Makefile tests/Makefile examples/Makefile])
|
AC_CONFIG_FILES([Makefile doc/Makefile man/Makefile src/Makefile tests/Makefile examples/Makefile])
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
|
@ -63,6 +63,8 @@ struct sixdraw_ctx {
|
||||||
struct termios termios;
|
struct termios termios;
|
||||||
union ctlseqs_value result[64];
|
union ctlseqs_value result[64];
|
||||||
char const *prog_name;
|
char const *prog_name;
|
||||||
|
FILE* out_file;
|
||||||
|
FILE* err_file;
|
||||||
struct ctlseqs_matcher *matcher;
|
struct ctlseqs_matcher *matcher;
|
||||||
struct ctlseqs_reader *reader;
|
struct ctlseqs_reader *reader;
|
||||||
bool has_termios;
|
bool has_termios;
|
||||||
|
@ -90,7 +92,7 @@ print_error(struct sixdraw_ctx const *ctx, char const *format, ...)
|
||||||
va_start(args, format);
|
va_start(args, format);
|
||||||
vsnprintf(msg, 1024, format, args);
|
vsnprintf(msg, 1024, format, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
dprintf(ctx->out_fd, "%s: [error] %s.\n", ctx->prog_name, msg);
|
fprintf(ctx->err_file, "%s: [error] %s.\n", ctx->prog_name, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -101,20 +103,20 @@ terminate(struct sixdraw_ctx *ctx)
|
||||||
|
|
||||||
// Restore cursor status.
|
// Restore cursor status.
|
||||||
if (ctx->hide_cursor) {
|
if (ctx->hide_cursor) {
|
||||||
dprintf(ctx->out_fd, CTLSEQS_DECSET("%d"), DECTCEM);
|
fprintf(ctx->out_file, CTLSEQS_DECSET("%d"), DECTCEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore normal screen buffer.
|
// Restore normal screen buffer.
|
||||||
if (ctx->alt_scrbuf) {
|
if (ctx->alt_scrbuf) {
|
||||||
dprintf(ctx->out_fd, CTLSEQS_DECRST("%d"), ALT_SCRBUF);
|
fprintf(ctx->out_file, CTLSEQS_DECRST("%d"), ALT_SCRBUF);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore original mouse modes.
|
// Restore original mouse modes.
|
||||||
if (ctx->btnev_tracking) {
|
if (ctx->btnev_tracking) {
|
||||||
dprintf(ctx->out_fd, CTLSEQS_DECRST("%d"), BTN_EVENT_TRACKING);
|
fprintf(ctx->out_file, CTLSEQS_DECRST("%d"), BTN_EVENT_TRACKING);
|
||||||
}
|
}
|
||||||
if (ctx->sgr_pixelmode) {
|
if (ctx->sgr_pixelmode) {
|
||||||
dprintf(ctx->out_fd, CTLSEQS_DECRST("%d"), SGR_MOUSE_PIXELMODE);
|
fprintf(ctx->out_file, CTLSEQS_DECRST("%d"), SGR_MOUSE_PIXELMODE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore original terminal modes.
|
// Restore original terminal modes.
|
||||||
|
@ -148,7 +150,7 @@ decrqm(struct sixdraw_ctx *ctx, unsigned mode, char const *name)
|
||||||
{
|
{
|
||||||
ssize_t retval;
|
ssize_t retval;
|
||||||
union ctlseqs_value *result = ctx->result;
|
union ctlseqs_value *result = ctx->result;
|
||||||
dprintf(ctx->out_fd, CTLSEQS_DECRQM("%d"), mode);
|
fprintf(ctx->out_file, CTLSEQS_DECRQM("%d"), mode);
|
||||||
do {
|
do {
|
||||||
retval = ctlseqs_read(ctx->reader, ctx->matcher, ctx->timeout);
|
retval = ctlseqs_read(ctx->reader, ctx->matcher, ctx->timeout);
|
||||||
} while (retval == CTLSEQS_PARTIAL);
|
} while (retval == CTLSEQS_PARTIAL);
|
||||||
|
@ -173,7 +175,7 @@ print_sixel_dot(struct sixdraw_ctx *ctx, unsigned x, unsigned y)
|
||||||
// Move cursor.
|
// Move cursor.
|
||||||
unsigned row = y / ctx->ch_height + 1;
|
unsigned row = y / ctx->ch_height + 1;
|
||||||
unsigned col = x / ctx->ch_width + 1;
|
unsigned col = x / ctx->ch_width + 1;
|
||||||
dprintf(ctx->out_fd, CTLSEQS_CUP("%d", "%d"), row, col);
|
fprintf(ctx->out_file, CTLSEQS_CUP("%d", "%d"), row, col);
|
||||||
|
|
||||||
// Build sixel sequence.
|
// Build sixel sequence.
|
||||||
row = y % ctx->ch_height;
|
row = y % ctx->ch_height;
|
||||||
|
@ -182,13 +184,7 @@ print_sixel_dot(struct sixdraw_ctx *ctx, unsigned x, unsigned y)
|
||||||
seq_size += sprintf(sixel_seq + seq_size, "%.*s!%u?%c" CTLSEQS_ST,
|
seq_size += sprintf(sixel_seq + seq_size, "%.*s!%u?%c" CTLSEQS_ST,
|
||||||
row / 6, "------------------------", col, (1 << row % 6) + 0x3F);
|
row / 6, "------------------------", col, (1 << row % 6) + 0x3F);
|
||||||
|
|
||||||
// Output sixel sequence.
|
fwrite(sixel_seq, seq_size, 1, ctx->out_file);
|
||||||
for (ssize_t nbytes; seq_size > 0; seq_size -= nbytes) {
|
|
||||||
nbytes = write(ctx->out_fd, sixel_seq, seq_size);
|
|
||||||
if (nbytes < 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
@ -196,6 +192,8 @@ init(struct sixdraw_ctx *ctx, int argc, char **argv)
|
||||||
{
|
{
|
||||||
*ctx = (struct sixdraw_ctx) {
|
*ctx = (struct sixdraw_ctx) {
|
||||||
.prog_name = argc > 0 ? argv[0] : "sixdraw",
|
.prog_name = argc > 0 ? argv[0] : "sixdraw",
|
||||||
|
.out_file = stdout,
|
||||||
|
.err_file = stderr,
|
||||||
.in_fd = STDIN_FILENO,
|
.in_fd = STDIN_FILENO,
|
||||||
.out_fd = STDOUT_FILENO,
|
.out_fd = STDOUT_FILENO,
|
||||||
.timeout = DEFAULT_TIMEOUT_MILLIS,
|
.timeout = DEFAULT_TIMEOUT_MILLIS,
|
||||||
|
@ -281,7 +279,7 @@ prepare(struct sixdraw_ctx *ctx)
|
||||||
}
|
}
|
||||||
ctx->has_termios = true;
|
ctx->has_termios = true;
|
||||||
|
|
||||||
// Set STDIN flags to nonblocking.
|
// Set STDIN flags to nonblocking, and disable output buffering.
|
||||||
int flags = fcntl(ctx->in_fd, F_GETFL);
|
int flags = fcntl(ctx->in_fd, F_GETFL);
|
||||||
if (flags == -1) {
|
if (flags == -1) {
|
||||||
print_error(ctx, "failed to get file status flags");
|
print_error(ctx, "failed to get file status flags");
|
||||||
|
@ -291,6 +289,10 @@ prepare(struct sixdraw_ctx *ctx)
|
||||||
print_error(ctx, "failed to set file status flags");
|
print_error(ctx, "failed to set file status flags");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (setvbuf(stdout, NULL, _IONBF, 0) != 0) {
|
||||||
|
print_error(ctx, "failed to disable output buffering");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Get initial terminal window size.
|
// Get initial terminal window size.
|
||||||
if (!get_winsize(ctx)) {
|
if (!get_winsize(ctx)) {
|
||||||
|
@ -298,7 +300,7 @@ prepare(struct sixdraw_ctx *ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check terminal support for sixel graphics and DEC locator.
|
// Check terminal support for sixel graphics and DEC locator.
|
||||||
dprintf(ctx->out_fd, CTLSEQS_PRIMARY_DA());
|
fprintf(ctx->out_file, CTLSEQS_PRIMARY_DA());
|
||||||
ssize_t retval;
|
ssize_t retval;
|
||||||
do {
|
do {
|
||||||
retval = ctlseqs_read(ctx->reader, ctx->matcher, ctx->timeout);
|
retval = ctlseqs_read(ctx->reader, ctx->matcher, ctx->timeout);
|
||||||
|
@ -325,16 +327,7 @@ prepare(struct sixdraw_ctx *ctx)
|
||||||
}
|
}
|
||||||
ctx->hide_cursor = result[1].num == DECRQM_SET;
|
ctx->hide_cursor = result[1].num == DECRQM_SET;
|
||||||
if (ctx->hide_cursor) {
|
if (ctx->hide_cursor) {
|
||||||
dprintf(ctx->out_fd, CTLSEQS_DECRST("%d"), DECTCEM);
|
fprintf(ctx->out_file, CTLSEQS_DECRST("%d"), DECTCEM);
|
||||||
}
|
|
||||||
|
|
||||||
// Switch to alternate screen buffer.
|
|
||||||
if (!decrqm(ctx, ALT_SCRBUF, "screen buffer")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
ctx->alt_scrbuf = result[1].num == DECRQM_RST;
|
|
||||||
if (ctx->alt_scrbuf) {
|
|
||||||
dprintf(ctx->out_fd, CTLSEQS_DECSET("%d"), ALT_SCRBUF);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable button event tracking mode.
|
// Enable button event tracking mode.
|
||||||
|
@ -343,7 +336,7 @@ prepare(struct sixdraw_ctx *ctx)
|
||||||
}
|
}
|
||||||
ctx->btnev_tracking = result[1].num == DECRQM_RST;
|
ctx->btnev_tracking = result[1].num == DECRQM_RST;
|
||||||
if (ctx->btnev_tracking) {
|
if (ctx->btnev_tracking) {
|
||||||
dprintf(ctx->out_fd, CTLSEQS_DECSET("%d"), BTN_EVENT_TRACKING);
|
fprintf(ctx->out_file, CTLSEQS_DECSET("%d"), BTN_EVENT_TRACKING);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable SGR mouse pixel mode.
|
// Enable SGR mouse pixel mode.
|
||||||
|
@ -352,7 +345,16 @@ prepare(struct sixdraw_ctx *ctx)
|
||||||
}
|
}
|
||||||
ctx->sgr_pixelmode = result[1].num == DECRQM_RST;
|
ctx->sgr_pixelmode = result[1].num == DECRQM_RST;
|
||||||
if (ctx->sgr_pixelmode) {
|
if (ctx->sgr_pixelmode) {
|
||||||
dprintf(ctx->out_fd, CTLSEQS_DECSET("%d"), SGR_MOUSE_PIXELMODE);
|
fprintf(ctx->out_file, CTLSEQS_DECSET("%d"), SGR_MOUSE_PIXELMODE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Switch to alternate screen buffer.
|
||||||
|
if (!decrqm(ctx, ALT_SCRBUF, "screen buffer")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ctx->alt_scrbuf = result[1].num == DECRQM_RST;
|
||||||
|
if (ctx->alt_scrbuf) {
|
||||||
|
fprintf(ctx->out_file, CTLSEQS_DECSET("%d"), ALT_SCRBUF);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build the immutable part of sixel sequence.
|
// Build the immutable part of sixel sequence.
|
||||||
|
@ -367,9 +369,9 @@ prepare(struct sixdraw_ctx *ctx)
|
||||||
static bool
|
static bool
|
||||||
draw(struct sixdraw_ctx *ctx)
|
draw(struct sixdraw_ctx *ctx)
|
||||||
{
|
{
|
||||||
dprintf(ctx->out_fd, CTLSEQS_CUP("%d", "1") "Canvas size: %ux%u. Line color: #%06X.",
|
fprintf(ctx->out_file, CTLSEQS_CUP("%d", "1") "Canvas size: %ux%u. Line color: #%06X.",
|
||||||
ctx->rows - 1, ctx->canvas_width, ctx->canvas_height, ctx->line_color);
|
ctx->rows - 1, ctx->canvas_width, ctx->canvas_height, ctx->line_color);
|
||||||
dprintf(ctx->out_fd, CTLSEQS_CUP("%d", "1") "Usage: Draw with mouse. Press Ctrl+C to exit.", ctx->rows);
|
fprintf(ctx->out_file, CTLSEQS_CUP("%d", "1") "Usage: Draw with mouse. Press Ctrl+C to exit.", ctx->rows);
|
||||||
|
|
||||||
union ctlseqs_value *result = ctx->result;
|
union ctlseqs_value *result = ctx->result;
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
|
@ -73,7 +73,7 @@ struct tcsgrep_ctx {
|
||||||
static inline void
|
static inline void
|
||||||
print_error(struct tcsgrep_ctx const *ctx, char const *msg)
|
print_error(struct tcsgrep_ctx const *ctx, char const *msg)
|
||||||
{
|
{
|
||||||
dprintf(STDERR_FILENO, "%s: [error] %s.\n", ctx->prog_name, msg);
|
fprintf(stderr, "%s: [error] %s.\n", ctx->prog_name, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
|
|
Loading…
Reference in New Issue