Invent a way of specifying control characters numerically in ctrlparse():
authorjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Tue, 19 Apr 2005 19:18:14 +0000 (19:18 +0000)
committerjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Tue, 19 Apr 2005 19:18:14 +0000 (19:18 +0000)
^<27>, ^<0x1B>, ^<033>. (This doesn't tread on any syntax that already had a
non-null behaviour.)

git-svn-id: svn://svn.tartarus.org/sgt/putty@5647 cda61777-01e9-0310-a592-d414129be87e

misc.c

diff --git a/misc.c b/misc.c
index 1beab5e..9d71a8d 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -48,11 +48,12 @@ unsigned long parse_blocksize(const char *bs)
  * 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:
+ * answerback-string parsing code. All sequences start with ^; all except
+ * ^<123> are two characters. The ones that are worth keeping are probably:
  *   ^?                    127
  *   ^@A-Z[\]^_            0-31
  *   a-z           1-26
+ *   <num>         specified by number (decimal, 0octal, 0xHEX)
  *   ~             ^ escape
  */
 char ctrlparse(char *s, char **next)
@@ -60,23 +61,30 @@ 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 == '<') {
+           s++;
+           c = (char)strtol(s, next, 0);
+           if ((*next == s) || (**next != '>')) {
+               c = 0;
+               *next = NULL;
+           } else
+               (*next)++;
        } else if (*s >= 'a' && *s <= 'z') {
            c = (*s - ('a' - 1));
+           *next = s+1;
        } else if ((*s >= '@' && *s <= '_') || *s == '?' || (*s & 0x80)) {
            c = ('@' ^ *s);
+           *next = s+1;
        } else if (*s == '~') {
            c = '^';
+           *next = s+1;
        }
-       s++;
-       *next = s;
-       return c;
     }
+    return c;
 }
 
 /* ----------------------------------------------------------------------