mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-02 01:40:13 -05:00
dcs: decrqss: use a custom put() handler
Only buffer up to two bytes, as that’s the largest DECRQSS request we support.
This commit is contained in:
parent
8f06436985
commit
af88c19561
1 changed files with 36 additions and 22 deletions
58
dcs.c
58
dcs.c
|
|
@ -10,6 +10,26 @@
|
||||||
#include "vt.h"
|
#include "vt.h"
|
||||||
#include "xmalloc.h"
|
#include "xmalloc.h"
|
||||||
|
|
||||||
|
static bool
|
||||||
|
ensure_size(struct terminal *term, size_t required_size)
|
||||||
|
{
|
||||||
|
if (required_size <= term->vt.dcs.size)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
size_t new_size = (required_size + 127) / 128 * 128;
|
||||||
|
xassert(new_size > 0);
|
||||||
|
|
||||||
|
uint8_t *new_data = realloc(term->vt.dcs.data, new_size);
|
||||||
|
if (new_data == NULL) {
|
||||||
|
LOG_ERRNO("failed to increase size of DCS buffer");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
term->vt.dcs.data = new_data;
|
||||||
|
term->vt.dcs.size = new_size;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/* Decode hex-encoded string *inline*. NULL terminates */
|
/* Decode hex-encoded string *inline*. NULL terminates */
|
||||||
static char *
|
static char *
|
||||||
hex_decode(const char *s, size_t len)
|
hex_decode(const char *s, size_t len)
|
||||||
|
|
@ -200,7 +220,20 @@ append_sgr_attr_n(char **reply, size_t *len, const char *attr, size_t n)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
decrqss(struct terminal *term)
|
decrqss_put(struct terminal *term, uint8_t c)
|
||||||
|
{
|
||||||
|
/* Largest request we support is two bytes */
|
||||||
|
if (!ensure_size(term, 2))
|
||||||
|
return;
|
||||||
|
|
||||||
|
struct vt *vt = &term->vt;
|
||||||
|
if (vt->dcs.idx > 2)
|
||||||
|
return;
|
||||||
|
vt->dcs.data[vt->dcs.idx++] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
decrqss_unhook(struct terminal *term)
|
||||||
{
|
{
|
||||||
const uint8_t *query = term->vt.dcs.data;
|
const uint8_t *query = term->vt.dcs.data;
|
||||||
const size_t n = term->vt.dcs.idx;
|
const size_t n = term->vt.dcs.idx;
|
||||||
|
|
@ -387,7 +420,8 @@ dcs_hook(struct terminal *term, uint8_t final)
|
||||||
case '$':
|
case '$':
|
||||||
switch (final) {
|
switch (final) {
|
||||||
case 'q':
|
case 'q':
|
||||||
term->vt.dcs.unhook_handler = &decrqss;
|
term->vt.dcs.put_handler = &decrqss_put;
|
||||||
|
term->vt.dcs.unhook_handler = &decrqss_unhook;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -418,26 +452,6 @@ dcs_hook(struct terminal *term, uint8_t final)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
|
||||||
ensure_size(struct terminal *term, size_t required_size)
|
|
||||||
{
|
|
||||||
if (required_size <= term->vt.dcs.size)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
size_t new_size = (required_size + 127) / 128 * 128;
|
|
||||||
xassert(new_size > 0);
|
|
||||||
|
|
||||||
uint8_t *new_data = realloc(term->vt.dcs.data, new_size);
|
|
||||||
if (new_data == NULL) {
|
|
||||||
LOG_ERRNO("failed to increase size of DCS buffer");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
term->vt.dcs.data = new_data;
|
|
||||||
term->vt.dcs.size = new_size;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
dcs_put(struct terminal *term, uint8_t c)
|
dcs_put(struct terminal *term, uint8_t c)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue