mirror of
https://github.com/tio/tio.git
synced 2026-05-01 14:57:59 +02:00
Merge branch 'allow_strip_esc_key' of https://github.com/nh26223/tio into nh26223-allow_strip_esc_key
This commit is contained in:
commit
256d6b4fc2
6 changed files with 99 additions and 2 deletions
|
|
@ -47,6 +47,7 @@ The command-line interface is straightforward as reflected in the output from
|
||||||
-L, --list-devices List available serial devices
|
-L, --list-devices List available serial devices
|
||||||
-l, --log Enable log to file
|
-l, --log Enable log to file
|
||||||
--log-file <filename> Set log filename
|
--log-file <filename> Set log filename
|
||||||
|
--log-strip Strip control characters and escape sequences
|
||||||
-m, --map <flags> Map special characters
|
-m, --map <flags> Map special characters
|
||||||
-c, --color 0..255|none|list Colorize tio text (default: 15)
|
-c, --color 0..255|none|list Colorize tio text (default: 15)
|
||||||
-S, --socket <socket> Listen on socket
|
-S, --socket <socket> Listen on socket
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,11 @@ Enable log to file. If no filename is provided the filename will be automaticall
|
||||||
|
|
||||||
Set log filename.
|
Set log filename.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.BR " \-\-log-strip
|
||||||
|
|
||||||
|
Strip control characters and escape sequences from log.
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.BR \-m ", " "\-\-map " \fI<flags>
|
.BR \-m ", " "\-\-map " \fI<flags>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ _tio()
|
||||||
-n --no-autoconnect \
|
-n --no-autoconnect \
|
||||||
-l --log \
|
-l --log \
|
||||||
--log-file \
|
--log-file \
|
||||||
|
--log-strip \
|
||||||
-m --map \
|
-m --map \
|
||||||
-t --timestamp \
|
-t --timestamp \
|
||||||
--timestamp-format \
|
--timestamp-format \
|
||||||
|
|
@ -72,6 +73,10 @@ _tio()
|
||||||
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
|
-l | --log-strip)
|
||||||
|
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
-m | --map)
|
-m | --map)
|
||||||
COMPREPLY=( $(compgen -W "ICRNL IGNCR INLCR INLCRNL OCRNL ODELBS ONLCRNL" -- ${cur}) )
|
COMPREPLY=( $(compgen -W "ICRNL IGNCR INLCR INLCRNL OCRNL ODELBS ONLCRNL" -- ${cur}) )
|
||||||
return 0
|
return 0
|
||||||
|
|
|
||||||
79
src/log.c
79
src/log.c
|
|
@ -31,6 +31,10 @@
|
||||||
#include "print.h"
|
#include "print.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
|
|
||||||
|
#define IS_ESC_CSI_INTERMEDIATE_CHAR(c) ((c >= 0x20) && (c <= 0x3F))
|
||||||
|
#define IS_ESC_END_CHAR(c) ((c >= 0x30) && (c <= 0x7E))
|
||||||
|
#define IS_CTRL_CHAR(c) ((c >= 0x00) && (c <= 0x1F))
|
||||||
|
|
||||||
static FILE *fp;
|
static FILE *fp;
|
||||||
static bool log_error = false;
|
static bool log_error = false;
|
||||||
|
|
||||||
|
|
@ -70,11 +74,84 @@ void log_open(const char *filename)
|
||||||
setvbuf(fp, NULL, _IONBF, 0);
|
setvbuf(fp, NULL, _IONBF, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool log_strip(char c)
|
||||||
|
{
|
||||||
|
static char previous_char = 0;
|
||||||
|
static bool esc_sequence = false;
|
||||||
|
bool strip = false;
|
||||||
|
|
||||||
|
/* Detect if character should be stripped or not */
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case 0x8:
|
||||||
|
/* Backspace */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xa:
|
||||||
|
/* Line feed */
|
||||||
|
/* Reset ESC sequence just in case something went wrong with the
|
||||||
|
* escape sequence parsing. */
|
||||||
|
esc_sequence = false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x1b:
|
||||||
|
/* Escape */
|
||||||
|
strip = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x5b:
|
||||||
|
/* Left bracket */
|
||||||
|
if (previous_char == 0x1b)
|
||||||
|
{
|
||||||
|
// Start of ESC sequence
|
||||||
|
esc_sequence = true;
|
||||||
|
strip = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (IS_CTRL_CHAR(c))
|
||||||
|
{
|
||||||
|
/* Strip ASCII control characters */
|
||||||
|
strip = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if ((esc_sequence) && (IS_ESC_CSI_INTERMEDIATE_CHAR(c)))
|
||||||
|
{
|
||||||
|
strip = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if ((esc_sequence) && (IS_ESC_END_CHAR(c)))
|
||||||
|
{
|
||||||
|
esc_sequence = false;
|
||||||
|
strip = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
previous_char = c;
|
||||||
|
|
||||||
|
return strip;
|
||||||
|
}
|
||||||
|
|
||||||
void log_write(char c)
|
void log_write(char c)
|
||||||
{
|
{
|
||||||
if (fp != NULL)
|
if (fp != NULL)
|
||||||
{
|
{
|
||||||
fputc(c, fp);
|
if (option.log_strip)
|
||||||
|
{
|
||||||
|
if (!log_strip(c))
|
||||||
|
{
|
||||||
|
fputc(c, fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fputc(c, fp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ enum opt_t
|
||||||
OPT_NONE,
|
OPT_NONE,
|
||||||
OPT_TIMESTAMP_FORMAT,
|
OPT_TIMESTAMP_FORMAT,
|
||||||
OPT_LOG_FILE,
|
OPT_LOG_FILE,
|
||||||
|
OPT_LOG_STRIP,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Default options */
|
/* Default options */
|
||||||
|
|
@ -55,9 +56,10 @@ struct option_t option =
|
||||||
.output_delay = 0,
|
.output_delay = 0,
|
||||||
.no_autoconnect = false,
|
.no_autoconnect = false,
|
||||||
.log = false,
|
.log = false,
|
||||||
|
.log_filename = NULL,
|
||||||
|
.log_strip = false,
|
||||||
.local_echo = false,
|
.local_echo = false,
|
||||||
.timestamp = TIMESTAMP_NONE,
|
.timestamp = TIMESTAMP_NONE,
|
||||||
.log_filename = NULL,
|
|
||||||
.socket = NULL,
|
.socket = NULL,
|
||||||
.map = "",
|
.map = "",
|
||||||
.color = 15,
|
.color = 15,
|
||||||
|
|
@ -82,6 +84,7 @@ void print_help(char *argv[])
|
||||||
printf(" -L, --list-devices List available serial devices\n");
|
printf(" -L, --list-devices List available serial devices\n");
|
||||||
printf(" -l, --log Enable log to file\n");
|
printf(" -l, --log Enable log to file\n");
|
||||||
printf(" --log-file <filename> Set log filename\n");
|
printf(" --log-file <filename> Set log filename\n");
|
||||||
|
printf(" --log-strip Strip control characters and escape sequences\n");
|
||||||
printf(" -m, --map <flags> Map special characters\n");
|
printf(" -m, --map <flags> Map special characters\n");
|
||||||
printf(" -c, --color 0..255|none|list Colorize tio text (default: 15)\n");
|
printf(" -c, --color 0..255|none|list Colorize tio text (default: 15)\n");
|
||||||
printf(" -S, --socket <socket> Listen on socket\n");
|
printf(" -S, --socket <socket> Listen on socket\n");
|
||||||
|
|
@ -192,6 +195,7 @@ void options_parse(int argc, char *argv[])
|
||||||
{"list-devices", no_argument, 0, 'L' },
|
{"list-devices", no_argument, 0, 'L' },
|
||||||
{"log", no_argument, 0, 'l' },
|
{"log", no_argument, 0, 'l' },
|
||||||
{"log-file", required_argument, 0, OPT_LOG_FILE },
|
{"log-file", required_argument, 0, OPT_LOG_FILE },
|
||||||
|
{"log-strip", no_argument, 0, OPT_LOG_STRIP },
|
||||||
{"socket", required_argument, 0, 'S' },
|
{"socket", required_argument, 0, 'S' },
|
||||||
{"map", required_argument, 0, 'm' },
|
{"map", required_argument, 0, 'm' },
|
||||||
{"color", required_argument, 0, 'c' },
|
{"color", required_argument, 0, 'c' },
|
||||||
|
|
@ -276,6 +280,10 @@ void options_parse(int argc, char *argv[])
|
||||||
option.log_filename = optarg;
|
option.log_filename = optarg;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OPT_LOG_STRIP:
|
||||||
|
option.log_strip = true;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'S':
|
case 'S':
|
||||||
option.socket = optarg;
|
option.socket = optarg;
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,7 @@ struct option_t
|
||||||
int output_delay;
|
int output_delay;
|
||||||
bool no_autoconnect;
|
bool no_autoconnect;
|
||||||
bool log;
|
bool log;
|
||||||
|
bool log_strip;
|
||||||
bool local_echo;
|
bool local_echo;
|
||||||
enum timestamp_t timestamp;
|
enum timestamp_t timestamp;
|
||||||
const char *log_filename;
|
const char *log_filename;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue