=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/awk/lex.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- src/usr.bin/awk/lex.c 2023/09/10 14:59:00 1.30 +++ src/usr.bin/awk/lex.c 2023/09/17 14:49:44 1.31 @@ -1,4 +1,4 @@ -/* $OpenBSD: lex.c,v 1.30 2023/09/10 14:59:00 millert Exp $ */ +/* $OpenBSD: lex.c,v 1.31 2023/09/17 14:49:44 millert Exp $ */ /**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved @@ -379,6 +379,8 @@ } } +extern int runetochar(char *str, int c); + int string(void) { int c, n; @@ -426,7 +428,7 @@ *bp++ = n; break; - case 'x': /* hex \x0-9a-fA-F + */ + case 'x': /* hex \x0-9a-fA-F (exactly two) */ { int i; @@ -449,6 +451,27 @@ *bp++ = n; else unput(c); + break; + } + + case 'u': /* utf \u0-9a-fA-F (1..8) */ + { + int i; + + n = 0; + for (i = 0; i < 8; i++) { + c = input(); + if (!isxdigit(c) || c == 0) + break; + c = tolower(c); + n *= 16; + if (isdigit(c)) + n += (c - '0'); + else + n += 10 + (c - 'a'); + } + unput(c); + bp += runetochar(bp, n); break; }