-diff -ur mksh-40.org//eval.c mksh-40/eval.c
---- mksh-40.org//eval.c 2011-06-12 16:45:57.000000000 +0200
-+++ mksh-40/eval.c 2011-07-07 18:27:58.891492090 +0200
-@@ -887,6 +887,7 @@
- switch (c) {
- case '[':
- case '!':
-+ case NOT2:
- case '-':
- case ']':
+diff -ur mksh-56.orig/eval.c mksh-56/eval.c
+--- mksh-56.orig/eval.c 2017-08-12 22:10:26.321676398 +0200
++++ mksh-56/eval.c 2017-08-12 22:40:32.672676143 +0200
+@@ -1005,6 +1005,7 @@
+ switch (ord(c)) {
+ case ORD('['):
+ case ORD('!'):
++ case ORD(NOT2):
+ case ORD('-'):
+ case ORD(']'):
/*
-diff -ur mksh-40.org//misc.c mksh-40/misc.c
---- mksh-40.org//misc.c 2011-06-12 16:45:58.000000000 +0200
-+++ mksh-40/misc.c 2011-07-07 18:28:39.015826686 +0200
-@@ -652,7 +652,7 @@
- if (!in_bracket) {
- saw_glob = true;
- in_bracket = true;
-- if (ISMAGIC(p[1]) && p[2] == '!')
-+ if (ISMAGIC(p[1]) && (p[2] == '!' || p[2] == NOT2))
- p += 2;
- if (ISMAGIC(p[1]) && p[2] == ']')
- p += 2;
-@@ -831,7 +831,7 @@
- int c, d, notp, found = 0;
- const unsigned char *orig_p = p;
+diff -ur mksh-56.orig/misc.c mksh-56/misc.c
+--- mksh-56.orig/misc.c 2017-08-12 22:10:26.321676398 +0200
++++ mksh-56/misc.c 2017-08-12 22:40:32.672676143 +0200
+@@ -966,7 +966,7 @@
+ char *subp;
-- if ((notp = (ISMAGIC(*p) && *++p == '!')))
-+ if ((notp = (ISMAGIC(*p) && (*++p == '!' || *p == NOT2))))
- p++;
- do {
- c = *p++;
-diff -ur mksh-40.org//sh.h mksh-40/sh.h
---- mksh-40.org//sh.h 2011-06-12 16:59:09.000000000 +0200
-+++ mksh-40/sh.h 2011-07-07 18:29:16.346761511 +0200
-@@ -380,5 +380,6 @@
- #define MAGIC (7) /* prefix for *?[!{,} during expand */
- #define ISMAGIC(c) ((unsigned char)(c) == MAGIC)
+ /* 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 -ur mksh-56.orig/sh.h mksh-56/sh.h
+--- mksh-56.orig/sh.h 2017-08-12 22:10:26.325009789 +0200
++++ mksh-56/sh.h 2017-08-12 22:40:32.696009488 +0200
+@@ -550,6 +550,7 @@
+ */
+ #define MAGIC KSH_BEL /* prefix for *?[!{,} during expand */
+ #define ISMAGIC(c) (ord(c) == ORD(MAGIC))
+#define NOT2 '^'
- #define LINE 4096 /* input line size */
+ EXTERN const char *safe_prompt; /* safe prompt if PS1 substitution fails */
-diff -ur mksh-40.org//tree.c mksh-40/tree.c
---- mksh-40.org//tree.c 2011-05-29 04:19:21.000000000 +0200
-+++ mksh-40/tree.c 2011-07-07 18:30:12.088149284 +0200
-@@ -289,7 +289,7 @@
- case CHAR:
- c = *wp++;
- if ((opmode & WDS_MAGIC) &&
-- (ISMAGIC(c) || c == '[' || c == '!' ||
-+ (ISMAGIC(c) || c == '[' || c == '!' || c == NOT2 ||
- c == '-' || c == ']' || c == '*' || c == '?'))
- shf_putc(MAGIC, shf);
- shf_putc(c, shf);
+diff -ur mksh-56.orig/check.t mksh-56/check.t
+--- mksh-56.orig/check.t 2017-08-12 22:10:26.321676398 +0200
++++ mksh-56/check.t 2017-08-12 22:41:46.886083258 +0200
+@@ -2438,7 +2438,7 @@
+ !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
+ ---