/** * tcsgrep.c - match input against terminal control sequence patterns * * Copyright (C) 2020 CismonX * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "ctlseqs.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) #define TCSGREP_CONCAT_1_(a1) a1 #define TCSGREP_CONCAT_2_(a1, a2) a1 a2 #define TCSGREP_CONCAT_3_(a1, a2, a3) a1 a2 a3 #define TCSGREP_CONCAT_4_(a1, a2, a3, a4) a1 a2 a3 a4 #define TCSGREP_CONCAT_5_(a1, a2, a3, a4, a5) a1 a2 a3 a4 a5 #define TCSGREP_CONCAT_6_(a1, a2, a3, a4, a5, a6) a1 a2 a3 a4 a5 a6 #define TCSGREP_CONCAT_7_(a1, a2, a3, a4, a5, a6, a7) a1 a2 a3 a4 a5 a6 a7 #define TCSGREP_CONCAT_8_(a1, a2, a3, a4, a5, a6, a7, a8) a1 a2 a3 a4 a5 a6 a7 a8 #define TCSGREP_CONCAT_(nargs) TCSGREP_CONCAT_##nargs##_ #define TCSGREP_DEFARGS_(nargs, ...) TCSGREP_CONCAT_(nargs)(__VA_ARGS__) #define TCSGREP_DEFSEQ_NOARGS(name) { #name, CTLSEQS_##name(), "" } #define TCSGREP_DEFSEQ(name, ...) \ { #name, CTLSEQS_##name(__VA_ARGS__), TCSGREP_DEFARGS_(TCSGREP_COUNT_ARGS_(__VA_ARGS__), __VA_ARGS__) } struct tcsgrep_sequence { char const *name; char const *pattern; char const args[8]; }; int main(int argc, char **argv) { static struct tcsgrep_sequence seqs[] = { TCSGREP_DEFSEQ_NOARGS(S7C1T), TCSGREP_DEFSEQ_NOARGS(S8C1T), TCSGREP_DEFSEQ_NOARGS(DECDHL_TOP), TCSGREP_DEFSEQ_NOARGS(DECDHL_BOTOM), TCSGREP_DEFSEQ_NOARGS(DECSWL), TCSGREP_DEFSEQ_NOARGS(DECDWL), TCSGREP_DEFSEQ_NOARGS(DECALN), TCSGREP_DEFSEQ_NOARGS(DECBI), TCSGREP_DEFSEQ_NOARGS(DECSC), TCSGREP_DEFSEQ_NOARGS(DECRC), TCSGREP_DEFSEQ_NOARGS(DECFI), TCSGREP_DEFSEQ_NOARGS(DECKPAM), TCSGREP_DEFSEQ_NOARGS(DECKPNM), TCSGREP_DEFSEQ_NOARGS(RIS), TCSGREP_DEFSEQ(DECUDK, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUMS), TCSGREP_DEFSEQ(DECRQSS, CTLSEQS_PH_STR), TCSGREP_DEFSEQ(DECRSPS, CTLSEQS_PH_NUM, CTLSEQS_PH_STR), TCSGREP_DEFSEQ(XTGETXRES, CTLSEQS_PH_STR), TCSGREP_DEFSEQ(XTSETTCAP, CTLSEQS_PH_STR), TCSGREP_DEFSEQ(XTGETTCAP, CTLSEQS_PH_STR), TCSGREP_DEFSEQ(ICH, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(SL, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(CUU, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(CUD, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(CUF, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(CUB, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(CNL, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(CPL, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(CHA, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(CUP, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(CHT, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(ED, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(DECSED, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(EL, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(DECSEL, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(IL, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(DL, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(DCH, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(SU, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(XTSMGRAPHICS, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUMS), TCSGREP_DEFSEQ(SD, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(XTHIMOUSE, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(XTRMTITLE, CTLSEQS_PH_STR), TCSGREP_DEFSEQ(ECH, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(CBT, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(HPA, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(HPR, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ(REP, CTLSEQS_PH_NUM), TCSGREP_DEFSEQ_NOARGS(PRIMARY_DA), TCSGREP_DEFSEQ_NOARGS(TERTIARY_DA), TCSGREP_DEFSEQ_NOARGS(SECONDARY_DA), }; }