Move CRLF input processing into ttywrite
This also allows us to remove the crlf field from the Key struct, since the only difference it made was converting "\r" to "\r\n" (which is now done automatically in ttywrite). In addition, MODE_CRLF is no longer referenced from x.c. Signed-off-by: Devin J. Pohly <djpohly@gmail.com>
This commit is contained in:
32
st.c
32
st.c
@ -108,6 +108,7 @@ typedef struct {
|
||||
static void execsh(char **);
|
||||
static void stty(char **);
|
||||
static void sigchld(int);
|
||||
static void ttywriteraw(const char *, size_t);
|
||||
|
||||
static void csidump(void);
|
||||
static void csihandle(void);
|
||||
@ -786,13 +787,38 @@ ttyread(void)
|
||||
void
|
||||
ttywrite(const char *s, size_t n, int may_echo)
|
||||
{
|
||||
fd_set wfd, rfd;
|
||||
ssize_t r;
|
||||
size_t lim = 256;
|
||||
const char *next;
|
||||
|
||||
if (may_echo && IS_SET(MODE_ECHO))
|
||||
twrite(s, n, 1);
|
||||
|
||||
if (!IS_SET(MODE_CRLF)) {
|
||||
ttywriteraw(s, n);
|
||||
return;
|
||||
}
|
||||
|
||||
/* This is similar to how the kernel handles ONLCR for ttys */
|
||||
while (n > 0) {
|
||||
if (*s == '\r') {
|
||||
next = s + 1;
|
||||
ttywriteraw("\r\n", 2);
|
||||
} else {
|
||||
next = memchr(s, '\r', n);
|
||||
DEFAULT(next, s + n);
|
||||
ttywriteraw(s, next - s);
|
||||
}
|
||||
n -= next - s;
|
||||
s = next;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ttywriteraw(const char *s, size_t n)
|
||||
{
|
||||
fd_set wfd, rfd;
|
||||
ssize_t r;
|
||||
size_t lim = 256;
|
||||
|
||||
/*
|
||||
* Remember that we are using a pty, which might be a modem line.
|
||||
* Writing too much will clog the line. That's why we are doing this
|
||||
|
Reference in New Issue
Block a user