Update tcsgrep.
This commit is contained in:
parent
5029af1fa8
commit
d5f5bad6f6
|
@ -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);
|
||||
}
|
||||
|
|
187
tests/tcsgrep.c
187
tests/tcsgrep.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue