Update tcsgrep.

This commit is contained in:
CismonX 2020-12-01 19:42:13 +08:00
parent 5029af1fa8
commit d5f5bad6f6
Signed by: cismonx
GPG Key ID: 3094873E29A482FB
2 changed files with 189 additions and 2 deletions

View File

@ -44,7 +44,7 @@
struct sixdraw_ctx {
struct termios termios;
union ctlseqs_value buffer[10];
char *prog_name;
char const *prog_name;
struct ctlseqs_matcher *matcher;
struct ctlseqs_reader *reader;
bool has_termios;
@ -59,7 +59,7 @@ struct sixdraw_ctx {
};
static inline void
sixdraw_print_error(struct sixdraw_ctx *ctx, char const *msg)
sixdraw_print_error(struct sixdraw_ctx const *ctx, char const *msg)
{
dprintf(ctx->out_fd, "%s: [error] %s.\n", ctx->prog_name, msg);
}

View File

@ -19,6 +19,13 @@
#include "ctlseqs.h"
#include <errno.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define TCSGREP_NINTH_ARG_(a1, a2, a3, a4, a5, a6, a7, a8, a9, ...) a9
#define TCSGREP_COUNT_ARGS_(...) TCSGREP_NINTH_ARG_(__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1, 0)
@ -44,6 +51,54 @@ struct tcsgrep_sequence {
char const args[8];
};
struct tcsgrep_ctx {
char const *prog_name;
int timeout;
int limit;
};
static inline void
print_error(struct tcsgrep_ctx const *ctx, char const *msg)
{
dprintf(STDERR_FILENO, "%s: [error] %s.\n", ctx->prog_name, msg);
}
static inline bool
parse_int(char const *str, int *dest) {
errno = 0;
long result = strtol(str, NULL, 10);
if (errno || result < -1 || result > INT_MAX) {
return false;
}
*dest = result;
return true;
}
static bool
parse_options(struct tcsgrep_ctx *ctx, int argc, char **argv) {
while (true) {
int result = getopt(argc, argv, "t:l:");
switch (result) {
case 't':
if (!parse_int(optarg, &ctx->timeout)) {
print_error(ctx, "invalid timeout option");
return false;
}
break;
case 'l':
if (!parse_int(optarg, &ctx->limit)) {
print_error(ctx, "invalid limit option");
return false;
}
break;
case '?':
default:
return false;
}
}
return true;
}
int
main(int argc, char **argv)
{
@ -99,5 +154,137 @@ main(int argc, char **argv)
TCSGREP_DEFSEQ_NOARGS(PRIMARY_DA),
TCSGREP_DEFSEQ_NOARGS(TERTIARY_DA),
TCSGREP_DEFSEQ_NOARGS(SECONDARY_DA),
TCSGREP_DEFSEQ(VPA, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(VPR, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(HVP, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(TBC, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(SM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECSET, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(MC, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(MC_DEC, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(RM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECRST, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(SGR, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(XTMODKEYS, CTLSEQS_PH_NUMS),
TCSGREP_DEFSEQ(DSR, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(XTMODKEYS_DISABLE, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DSR_DEC, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(XTSMPOINTER, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ_NOARGS(DECSTR),
TCSGREP_DEFSEQ(DECSCL, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECRQM_ANSI, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECRQM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ_NOARGS(XTVERSION),
TCSGREP_DEFSEQ(DECLL, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECSCUSR, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECSCA, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECSTBM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(XTRESTORE, CTLSEQS_PH_NUMS),
TCSGREP_DEFSEQ(DECCARA, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ_NOARGS(SCOSC),
TCSGREP_DEFSEQ(DECSLRM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(XTSAVE, CTLSEQS_PH_NUMS),
TCSGREP_DEFSEQ(XTWINOPS, CTLSEQS_PH_NUMS),
TCSGREP_DEFSEQ(XTSMTITLE, CTLSEQS_PH_NUMS),
TCSGREP_DEFSEQ(DECSWBV, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECRARA, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ_NOARGS(SCORC),
TCSGREP_DEFSEQ(DECSMBV, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECCRA, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM,
CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECRQPSR, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECEFR, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECREQTPARM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECEFR, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECREQTPARM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECSACE, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECFRA, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(XTCHECKSUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECRQCRA, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM,
CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECELR, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECERA, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECSLE, CTLSEQS_PH_NUMS),
TCSGREP_DEFSEQ(XTPUSHSGR, CTLSEQS_PH_NUMS),
TCSGREP_DEFSEQ(DECSERA, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(XTREPORTSGR, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECSCPP, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ_NOARGS(DECRQLP),
TCSGREP_DEFSEQ(DECSNLS, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ_NOARGS(XTPOPSGR),
TCSGREP_DEFSEQ(DECIC, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(DECDC, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(OSC_SEQ, CTLSEQS_PH_NUM, CTLSEQS_PH_STR),
TCSGREP_DEFSEQ(RESP_DECRQSS, CTLSEQS_PH_NUM, CTLSEQS_PH_STR),
TCSGREP_DEFSEQ(RESP_XTGETXRES, CTLSEQS_PH_NUM, CTLSEQS_PH_STR),
TCSGREP_DEFSEQ(RESP_XTGETTCAP, CTLSEQS_PH_NUM, CTLSEQS_PH_STR),
TCSGREP_DEFSEQ(RESP_PRIMARY_DA, CTLSEQS_PH_NUMS),
TCSGREP_DEFSEQ(RESP_SECONDARY_DA, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(RESP_DECXCPR, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(RESP_DSR, CTLSEQS_PH_NUMS),
TCSGREP_DEFSEQ(RESP_DECRQM_ANSI, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(RESP_DECRQM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ(RESP_XTVERSION, CTLSEQS_PH_STR),
TCSGREP_DEFSEQ(RESP_DECCIR, CTLSEQS_PH_STR),
TCSGREP_DEFSEQ(RESP_DECTABSR, CTLSEQS_PH_STR),
TCSGREP_DEFSEQ(RESP_DECRQCRA, CTLSEQS_PH_NUM, CTLSEQS_PH_STR),
TCSGREP_DEFSEQ(RESP_DECRQLP, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM),
TCSGREP_DEFSEQ_NOARGS(KEY_UP),
TCSGREP_DEFSEQ_NOARGS(KEY_DOWN),
TCSGREP_DEFSEQ_NOARGS(KEY_RIGHT),
TCSGREP_DEFSEQ_NOARGS(KEY_LEFT),
TCSGREP_DEFSEQ_NOARGS(KEY_HOME),
TCSGREP_DEFSEQ_NOARGS(KEY_END),
TCSGREP_DEFSEQ_NOARGS(KEY_INSERT),
TCSGREP_DEFSEQ_NOARGS(KEY_DELETE),
TCSGREP_DEFSEQ_NOARGS(KEY_PGUP),
TCSGREP_DEFSEQ_NOARGS(KEY_PGDN),
TCSGREP_DEFSEQ_NOARGS(KEY_F1),
TCSGREP_DEFSEQ_NOARGS(KEY_F2),
TCSGREP_DEFSEQ_NOARGS(KEY_F3),
TCSGREP_DEFSEQ_NOARGS(KEY_F4),
TCSGREP_DEFSEQ_NOARGS(KEY_F5),
TCSGREP_DEFSEQ_NOARGS(KEY_F6),
TCSGREP_DEFSEQ_NOARGS(KEY_F7),
TCSGREP_DEFSEQ_NOARGS(KEY_F8),
TCSGREP_DEFSEQ_NOARGS(KEY_F9),
TCSGREP_DEFSEQ_NOARGS(KEY_F10),
TCSGREP_DEFSEQ_NOARGS(KEY_F11),
TCSGREP_DEFSEQ_NOARGS(KEY_F12),
};
struct tcsgrep_ctx ctx = {
.prog_name = argv[0],
.timeout = -1,
.limit = -1,
};
if (!parse_options(&ctx, argc, argv)) {
return 1;
}
struct ctlseqs_matcher *matcher = ctlseqs_matcher_init();
if (matcher == NULL) {
print_error(&ctx, "failed to initialize matcher");
return 1;
}
size_t npatterns = sizeof(seqs) / sizeof(struct tcsgrep_sequence);
char const **patterns = malloc(sizeof(char const *) * npatterns);
if (patterns == NULL) {
print_error(&ctx, "failed to allocate memory");
return 1;
}
for (size_t idx = 0; idx < npatterns; ++idx) {
patterns[idx] = seqs[idx].pattern;
}
struct ctlseqs_matcher_opts matcher_opts = {
.patterns = patterns,
.npatterns = npatterns,
};
if (!ctlseqs_matcher_setopt(matcher, &matcher_opts)) {
print_error(&ctx, "matcher setopt failed");
return 1;
}
struct ctlseqs_reader *reader = ctlseqs_reader_init();
if (reader == NULL) {
print_error(&ctx, "failed to initialize reader");
}
return 0;
}