Add option to save matched sequences.
This commit is contained in:
parent
08cd45653e
commit
2cdb088697
|
@ -107,6 +107,9 @@ call returns
|
||||||
or
|
or
|
||||||
.BR CTLSEQS_NOMEM ,
|
.BR CTLSEQS_NOMEM ,
|
||||||
the length of the entire string followed by the string itself will be stored into the buffer.
|
the length of the entire string followed by the string itself will be stored into the buffer.
|
||||||
|
The same is true for a successful match when option
|
||||||
|
.B CTLSEQS_READER_SAVE_MATCHED_SEQS
|
||||||
|
is enabled, inserting these two values before the extracted ones.
|
||||||
.SS Flags
|
.SS Flags
|
||||||
Flags are boolean switches which can be combined as a bitmask for the
|
Flags are boolean switches which can be combined as a bitmask for the
|
||||||
.I flags
|
.I flags
|
||||||
|
@ -124,6 +127,11 @@ before
|
||||||
You may want this option enabled if
|
You may want this option enabled if
|
||||||
.I fd
|
.I fd
|
||||||
is maintained in an event loop.
|
is maintained in an event loop.
|
||||||
|
.TP
|
||||||
|
.B CTLSEQS_READER_SAVE_MATCHED_SEQS
|
||||||
|
When a sequence is successfully matched against a pattern during
|
||||||
|
.BR ctlseqs_read (),
|
||||||
|
save the original sequence to buffer alongside the extracted values.
|
||||||
.
|
.
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
.TP
|
.TP
|
||||||
|
|
|
@ -142,6 +142,7 @@ struct ctlseqs_reader {
|
||||||
size_t last_idx;
|
size_t last_idx;
|
||||||
enum ctlseqs_state state;
|
enum ctlseqs_state state;
|
||||||
bool no_poll;
|
bool no_poll;
|
||||||
|
bool save_matched;
|
||||||
};
|
};
|
||||||
|
|
||||||
CTLSEQS_HOT static inline int
|
CTLSEQS_HOT static inline int
|
||||||
|
@ -282,7 +283,7 @@ ctlseqs_match_pattern(struct ctlseqs_reader *reader, struct ctlseqs_matcher cons
|
||||||
struct ctlseqs_match_ctx match_ctx = {
|
struct ctlseqs_match_ctx match_ctx = {
|
||||||
.node = matcher == NULL ? &empty_node : &matcher->root,
|
.node = matcher == NULL ? &empty_node : &matcher->root,
|
||||||
.rbuf = reader->rbuf + reader->buf_start + 1,
|
.rbuf = reader->rbuf + reader->buf_start + 1,
|
||||||
.result = reader->buffer,
|
.result = reader->buffer + (reader->save_matched ? 2 : 0),
|
||||||
};
|
};
|
||||||
ssize_t match_stack_top = -1;
|
ssize_t match_stack_top = -1;
|
||||||
while (true) {
|
while (true) {
|
||||||
|
@ -348,7 +349,7 @@ ctlseqs_match(struct ctlseqs_reader *reader, struct ctlseqs_matcher const *match
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (retval < 0) {
|
if (retval < 0 || reader->save_matched) {
|
||||||
reader->buffer[0].num = idx;
|
reader->buffer[0].num = idx;
|
||||||
reader->buffer[1].str = buf;
|
reader->buffer[1].str = buf;
|
||||||
}
|
}
|
||||||
|
@ -496,6 +497,7 @@ ctlseqs_reader_config(struct ctlseqs_reader *reader, struct ctlseqs_reader_optio
|
||||||
reader->buffer = options->buffer;
|
reader->buffer = options->buffer;
|
||||||
reader->pollfd.fd = options->fd;
|
reader->pollfd.fd = options->fd;
|
||||||
reader->no_poll = options->flags & CTLSEQS_READER_NO_POLL;
|
reader->no_poll = options->flags & CTLSEQS_READER_NO_POLL;
|
||||||
|
reader->save_matched = options->flags & CTLSEQS_READER_SAVE_MATCHED_SEQS;
|
||||||
return CTLSEQS_OK;
|
return CTLSEQS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -345,7 +345,7 @@
|
||||||
/* Placeholders */
|
/* Placeholders */
|
||||||
|
|
||||||
#define CTLSEQS_PH_NUM "\x0e" // CSI Parameter Bytes, numbers only
|
#define CTLSEQS_PH_NUM "\x0e" // CSI Parameter Bytes, numbers only
|
||||||
#define CTLSEQS_PH_NUMS "\x0f" // CSI Parameter Bytes, multiple numbers separated by semicolon
|
#define CTLSEQS_PH_NUMS "\x0f" // CSI Parameter Bytes, multiple numbers separated by semicolon
|
||||||
#define CTLSEQS_PH_STR "\x10" // String, printable characters only
|
#define CTLSEQS_PH_STR "\x10" // String, printable characters only
|
||||||
#define CTLSEQS_PH_CMDSTR "\x11" // Command String
|
#define CTLSEQS_PH_CMDSTR "\x11" // Command String
|
||||||
#define CTLSEQS_PH_CSI_PARAM "\x12" // CSI Parameter Bytes
|
#define CTLSEQS_PH_CSI_PARAM "\x12" // CSI Parameter Bytes
|
||||||
|
@ -355,7 +355,8 @@
|
||||||
|
|
||||||
/* Reader option flags */
|
/* Reader option flags */
|
||||||
|
|
||||||
#define CTLSEQS_READER_NO_POLL (1 << 0) // Do not poll() before read()
|
#define CTLSEQS_READER_NO_POLL (1 << 0) // Do not poll() before read()
|
||||||
|
#define CTLSEQS_READER_SAVE_MATCHED_SEQS (1 << 1) // Save successfully matched sequence to buffer
|
||||||
|
|
||||||
/* Function return status codes */
|
/* Function return status codes */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue