techo compares signed char to '\x20'. Any character with code less then
'\x20' is treated as control character.  This way characters with MSB
set to 1 are considered control characters too.
Also this patch makes techo display DEL character as ^?.
To reprocuce the bug, enable echo mode using printf '\e[12l',
then type DEL character or any non-ASCII character.
        for(; len > 0; buf++, len--) {
                char c = *buf;
 
-               if(c < '\x20') { /* control code */
+               if(c < 0x20 || c == 0177) { /* control code */
                        if(c != '\n' && c != '\r' && c != '\t') {
-                               c |= '\x40';
+                               c ^= '\x40';
                                tputc("^", 1);
                        }
                        tputc(&c, 1);