mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-03-22 14:39:24 -05:00
Pull out parsing of ^C style strings from the terminal answerback code to
its own function, since I'll be wanting it for `terminal-modes'. [originally from svn r5646]
This commit is contained in:
parent
62a3389981
commit
3d012d9bd0
36
misc.c
36
misc.c
@ -43,6 +43,42 @@ unsigned long parse_blocksize(const char *bs)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parse a ^C style character specification.
|
||||||
|
* Returns NULL in `next' if we didn't recognise it as a control character,
|
||||||
|
* in which case `c' should be ignored.
|
||||||
|
* The precise current parsing is an oddity inherited from the terminal
|
||||||
|
* answerback-string parsing code. All sequences are two characters,
|
||||||
|
* starting with '^'. The ones that are worth keeping are probably:
|
||||||
|
* ^? 127
|
||||||
|
* ^@A-Z[\]^_ 0-31
|
||||||
|
* a-z 1-26
|
||||||
|
* ~ ^ escape
|
||||||
|
*/
|
||||||
|
char ctrlparse(char *s, char **next)
|
||||||
|
{
|
||||||
|
char c = 0;
|
||||||
|
if (*s != '^') {
|
||||||
|
*next = NULL;
|
||||||
|
return c;
|
||||||
|
} else {
|
||||||
|
s++;
|
||||||
|
if (*s == '\0') {
|
||||||
|
*next = NULL;
|
||||||
|
return c;
|
||||||
|
} else if (*s >= 'a' && *s <= 'z') {
|
||||||
|
c = (*s - ('a' - 1));
|
||||||
|
} else if ((*s >= '@' && *s <= '_') || *s == '?' || (*s & 0x80)) {
|
||||||
|
c = ('@' ^ *s);
|
||||||
|
} else if (*s == '~') {
|
||||||
|
c = '^';
|
||||||
|
}
|
||||||
|
s++;
|
||||||
|
*next = s;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
* String handling routines.
|
* String handling routines.
|
||||||
*/
|
*/
|
||||||
|
1
misc.h
1
misc.h
@ -18,6 +18,7 @@ typedef struct Filename Filename;
|
|||||||
typedef struct FontSpec FontSpec;
|
typedef struct FontSpec FontSpec;
|
||||||
|
|
||||||
unsigned long parse_blocksize(const char *bs);
|
unsigned long parse_blocksize(const char *bs);
|
||||||
|
char ctrlparse(char *s, char **next);
|
||||||
|
|
||||||
char *dupstr(const char *s);
|
char *dupstr(const char *s);
|
||||||
char *dupcat(const char *s1, ...);
|
char *dupcat(const char *s1, ...);
|
||||||
|
26
terminal.c
26
terminal.c
@ -2677,22 +2677,16 @@ static void term_out(Terminal *term)
|
|||||||
*/
|
*/
|
||||||
compatibility(ANSIMIN);
|
compatibility(ANSIMIN);
|
||||||
if (term->ldisc) {
|
if (term->ldisc) {
|
||||||
char abuf[256], *s, *d;
|
char abuf[lenof(term->cfg.answerback)], *s, *d;
|
||||||
int state = 0;
|
for (s = term->cfg.answerback, d = abuf; *s;) {
|
||||||
for (s = term->cfg.answerback, d = abuf; *s; s++) {
|
char *n;
|
||||||
if (state) {
|
char c = ctrlparse(s, &n);
|
||||||
if (*s >= 'a' && *s <= 'z')
|
if (n) {
|
||||||
*d++ = (*s - ('a' - 1));
|
*d++ = c;
|
||||||
else if ((*s >= '@' && *s <= '_') ||
|
s = n;
|
||||||
*s == '?' || (*s & 0x80))
|
} else {
|
||||||
*d++ = ('@' ^ *s);
|
*d++ = *s++;
|
||||||
else if (*s == '~')
|
}
|
||||||
*d++ = '^';
|
|
||||||
state = 0;
|
|
||||||
} else if (*s == '^') {
|
|
||||||
state = 1;
|
|
||||||
} else
|
|
||||||
*d++ = *s;
|
|
||||||
}
|
}
|
||||||
lpage_send(term->ldisc, DEFAULT_CODEPAGE,
|
lpage_send(term->ldisc, DEFAULT_CODEPAGE,
|
||||||
abuf, d - abuf, 0);
|
abuf, d - abuf, 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user