Snap for 9456165 from 4262890247be3aa9917a2d3f4edaa1fc9129e070 to udc-d1-release

Change-Id: Ie887ff6317eed3fcb683194e7b7e7b28b340775d
diff --git a/FIXES b/FIXES
index fdf782e..53c7841 100644
--- a/FIXES
+++ b/FIXES
@@ -25,6 +25,12 @@
 This file lists all bug fixes, changes, etc., made since the AWK book
 was sent to the printers in August 1987.
 
+Dec 15, 2022:
+	Force hex escapes in strings to be no more than two characters,
+	as they already are in regular expressions. This brings internal
+	consistency, as well as consistency with gawk. Thanks to
+	Arnold Robbins.
+
 Sep 12, 2022:
 	adjbuf minlen error (cannot be 0) in cat, resulting in NULL pbuf.
 	discovered by todd miller. also use-after-free issue with
diff --git a/METADATA b/METADATA
index fc82b16..58b7076 100644
--- a/METADATA
+++ b/METADATA
@@ -1,3 +1,7 @@
+# This project was upgraded with external_updater.
+# Usage: tools/external_updater/updater.sh update one-true-awk
+# For more info, check https://cs.android.com/android/platform/superproject/+/master:tools/external_updater/README.md
+
 name: "one-true-awk"
 description: "This is the version of awk described in \'The AWK Programming Language\', by Al Aho, Brian Kernighan, and Peter Weinberger (Addison-Wesley, 1988, ISBN 0-201-07981-X)."
 third_party {
@@ -5,11 +9,11 @@
     type: GIT
     value: "https://github.com/onetrueawk/awk.git"
   }
-  version: "9e248c317b88470fc86aa7c988919dc49452c88c"
+  version: "5e49ea4d1f71d9134734011f2151cae4dbec5e5f"
   license_type: NOTICE
   last_upgrade_date {
     year: 2022
-    month: 9
-    day: 12
+    month: 12
+    day: 16
   }
 }
diff --git a/lex.c b/lex.c
index c162a70..a5feff4 100644
--- a/lex.c
+++ b/lex.c
@@ -416,19 +416,28 @@
 				break;
 
 			case 'x':	/* hex  \x0-9a-fA-F + */
-			    {	char xbuf[100], *px;
-				for (px = xbuf; (c = input()) != 0 && px-xbuf < 100-2; ) {
-					if (isdigit(c)
-					 || (c >= 'a' && c <= 'f')
-					 || (c >= 'A' && c <= 'F'))
-						*px++ = c;
-					else
+			    {
+				int i;
+
+				n = 0;
+				for (i = 1; i <= 2; i++) {
+					c = input();
+					if (c == 0)
+						break;
+					if (isxdigit(c)) {
+						c = tolower(c);
+						n *= 16;
+						if (isdigit(c))
+							n += (c - '0');
+						else
+							n += 10 + (c - 'a');
+					} else
 						break;
 				}
-				*px = 0;
-				unput(c);
-	  			sscanf(xbuf, "%x", (unsigned int *) &n);
-				*bp++ = n;
+				if (n)
+					*bp++ = n;
+				else
+					unput(c);
 				break;
 			    }
 
diff --git a/main.c b/main.c
index f0b8608..2ec513c 100644
--- a/main.c
+++ b/main.c
@@ -22,7 +22,7 @@
 THIS SOFTWARE.
 ****************************************************************/
 
-const char	*version = "version 20220912";
+const char	*version = "version 20221215";
 
 #define DEBUG
 #include <stdio.h>