+ switch (**start) {
+ case '3':
+ case 'B':
+ gly = ESCAPE_FONTBOLD;
+ break;
+ case '2':
+ case 'I':
+ gly = ESCAPE_FONTITALIC;
+ break;
+ case 'P':
+ gly = ESCAPE_FONTPREV;
+ break;
+ case '1':
+ case 'R':
+ gly = ESCAPE_FONTROMAN;
+ break;
+ }
+ break;
+ case ESCAPE_SPECIAL:
+ if (1 == *sz && 'c' == **start)
+ gly = ESCAPE_NOSPACE;
+ /*
+ * Unicode escapes are defined in groff as \[u0000]
+ * to \[u10FFFF], where the contained value must be
+ * a valid Unicode codepoint. Here, however, only
+ * check the length and range.
+ */
+ if (**start != 'u' || *sz < 5 || *sz > 7)
+ break;
+ if (*sz == 7 && ((*start)[1] != '1' || (*start)[2] != '0'))
+ break;
+ if (*sz == 6 && (*start)[1] == '0')
+ break;
+ if (*sz == 5 && (*start)[1] == 'D' &&
+ strchr("89ABCDEF", (*start)[2]) != NULL)
+ break;
+ if ((int)strspn(*start + 1, "0123456789ABCDEFabcdef")
+ + 1 == *sz)
+ gly = ESCAPE_UNICODE;
+ break;
+ default:
+ break;