diff -urNp -x '*.orig' mksh-59c.org/check.t mksh-59c/check.t --- mksh-59c.org/check.t 2020-10-31 04:53:30.000000000 +0100 +++ mksh-59c/check.t 2021-03-20 19:53:40.714261839 +0100 @@ -2484,7 +2484,7 @@ expected-stdout: !bc +bc ,bc 0bc 1bc ^bc cbc !bc +bc ,bc -bc 0bc 1bc ^bc cbc abc bbc - ^bc abc bbc + !bc +bc ,bc -bc 0bc 1bc ^bc cbc +bc ,bc -bc -bc 0bc 1bc --- diff -urNp -x '*.orig' mksh-59c.org/eval.c mksh-59c/eval.c --- mksh-59c.org/eval.c 2020-05-05 23:34:54.000000000 +0200 +++ mksh-59c/eval.c 2021-03-20 19:53:40.717595272 +0100 @@ -1108,6 +1108,7 @@ expand( switch (ord(c)) { case ORD('['): case ORD('!'): + case ORD(NOT2): case ORD('-'): case ORD(']'): /* diff -urNp -x '*.orig' mksh-59c.org/misc.c mksh-59c/misc.c --- mksh-59c.org/misc.c 2020-08-27 21:53:12.000000000 +0200 +++ mksh-59c/misc.c 2021-03-20 19:53:40.717595272 +0100 @@ -1018,7 +1018,7 @@ gmatch_cclass(const unsigned char *pat, char *subp; /* check for negation */ - if (ISMAGIC(p[0]) && ord(p[1]) == ORD('!')) { + if (ISMAGIC(p[0]) && (ord(p[1]) == ORD('!') || ord(p[1]) == ORD(NOT2))) { p += 2; negated = true; } diff -urNp -x '*.orig' mksh-59c.org/sh.h mksh-59c/sh.h --- mksh-59c.org/sh.h 2020-10-31 04:53:33.000000000 +0100 +++ mksh-59c/sh.h 2021-03-20 19:53:40.717595272 +0100 @@ -580,6 +580,7 @@ extern int __cdecl setegid(gid_t); */ #define MAGIC KSH_BEL /* prefix for *?[!{,} during expand */ #define ISMAGIC(c) (ord(c) == ORD(MAGIC)) +#define NOT2 '^' EXTERN const char *safe_prompt; /* safe prompt if PS1 substitution fails */