diff --git a/examples/sixdraw.c b/examples/sixdraw.c index dbfb314..a442140 100644 --- a/examples/sixdraw.c +++ b/examples/sixdraw.c @@ -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); } diff --git a/tests/tcsgrep.c b/tests/tcsgrep.c index ee9099a..5b8fa3c 100644 --- a/tests/tcsgrep.c +++ b/tests/tcsgrep.c @@ -19,6 +19,13 @@ #include "ctlseqs.h" +#include +#include +#include +#include +#include +#include + #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; }