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:
parent
52d6fb1ab1
commit
33201ac65f
3 changed files with 240 additions and 221 deletions
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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue