mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-09 17:38:00 +00:00
Introduce and use strbuf_chomp.
Those chomp operations in wincons.c and uxcons.c looked ugly, and I'm not totally convinced they couldn't underrun the buffer by 1 byte in weird circumstances. strbuf_chomp is neater.
This commit is contained in:
parent
cd6bc14f04
commit
7590d0625b
1
misc.h
1
misc.h
@ -79,6 +79,7 @@ char *strbuf_to_str(strbuf *buf); /* does free buf, but you must free result */
|
||||
void strbuf_catf(strbuf *buf, const char *fmt, ...);
|
||||
void strbuf_catfv(strbuf *buf, const char *fmt, va_list ap);
|
||||
static inline void strbuf_clear(strbuf *buf) { strbuf_shrink_to(buf, 0); }
|
||||
bool strbuf_chomp(strbuf *buf, char char_to_remove);
|
||||
|
||||
strbuf *strbuf_new_for_agent_query(void);
|
||||
void strbuf_finalise_agent_query(strbuf *buf);
|
||||
|
@ -1095,7 +1095,7 @@ static void scp_sink_coroutine(ScpSink *scp)
|
||||
/*
|
||||
* Parse the command.
|
||||
*/
|
||||
strbuf_shrink_by(scp->command, 1); /* chomp the newline */
|
||||
strbuf_chomp(scp->command, '\n');
|
||||
scp->command_chr = scp->command->len > 0 ? scp->command->s[0] : '\0';
|
||||
if (scp->command_chr == 'T') {
|
||||
unsigned long dummy1, dummy2;
|
||||
|
@ -592,10 +592,8 @@ int console_get_userpass_input(prompts_t *p)
|
||||
}
|
||||
|
||||
strbuf_shrink_to(pr->result, prev_result_len + ret);
|
||||
if (pr->result->s[pr->result->len - 1] == '\n') {
|
||||
strbuf_shrink_by(pr->result, 1);
|
||||
if (strbuf_chomp(pr->result, '\n'))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
tcsetattr(infd, TCSANOW, &oldmode);
|
||||
|
9
utils.c
9
utils.c
@ -443,6 +443,15 @@ void strbuf_shrink_by(strbuf *buf, size_t amount_to_remove)
|
||||
buf->s[buf->len] = '\0';
|
||||
}
|
||||
|
||||
bool strbuf_chomp(strbuf *buf, char char_to_remove)
|
||||
{
|
||||
if (buf->len > 0 && buf->s[buf->len-1] == char_to_remove) {
|
||||
strbuf_shrink_by(buf, 1);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static void strbuf_BinarySink_write(
|
||||
BinarySink *bs, const void *data, size_t len)
|
||||
{
|
||||
|
@ -515,10 +515,8 @@ int console_get_userpass_input(prompts_t *p)
|
||||
}
|
||||
|
||||
strbuf_shrink_to(pr->result, prev_result_len + ret);
|
||||
if (pr->result->s[pr->result->len - 1] == '\n') {
|
||||
strbuf_shrink_by(pr->result, 1);
|
||||
if (pr->result->s[pr->result->len - 1] == '\r')
|
||||
strbuf_shrink_by(pr->result, 1);
|
||||
if (strbuf_chomp(pr->result, '\n')) {
|
||||
strbuf_chomp(pr->result, '\r');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user