devdraw: accept 5- and 6-byte Unicode hex values

Alt X 1234 for U+1234
Alt X X 12345 for U+12345
Alt X X X 103456 for U+103456.
This commit is contained in:
Russ Cox 2020-05-29 21:19:32 -04:00
parent 2c70acc3ab
commit 3850e6e177
2 changed files with 45 additions and 15 deletions

View file

@ -58,7 +58,7 @@ The up arrow scrolls backward.
.PP .PP
Characters in Plan 9 are runes (see Characters in Plan 9 are runes (see
.IR utf (7)). .IR utf (7)).
Any 16-bit rune can be typed using a compose key followed by several Any rune can be typed using a compose key followed by several
other keys. other keys.
The compose key is also generally near the lower right of the main key area: The compose key is also generally near the lower right of the main key area:
the the
@ -72,14 +72,21 @@ key on the SLC, the
key on the Magnum, and either key on the Magnum, and either
.B Alt .B Alt
key on the PC. key on the PC.
After typing the compose key, type a capital To type a single rune with the value specified by
.L X a given four-digit hexadecimal number,
and exactly four hexadecimal characters (digits and type the compose key,
then a capital
.LR X ,
and then the four hexadecimal digits (decimal digits and
.L a .L a
to to
.LR f ) .LR f ).
to type a single rune with the value represented by For a longer rune, type
the typed number. .L X
twice followed by five digits,
or type
.L X
three times followed by six digits.
There are shorthands for many characters, comprising There are shorthands for many characters, comprising
the compose key followed by a two- or three-character sequence. the compose key followed by a two- or three-character sequence.
The full list is too long to repeat here, but is contained in the file The full list is too long to repeat here, but is contained in the file

View file

@ -17,16 +17,15 @@ static struct cvlist
}; };
/* /*
* Given 5 characters k[0]..k[4], find the rune or return -1 for failure. * Given 5 characters k[0]..k[n], find the rune or return -1 for failure.
*/ */
static long static long
unicode(Rune *k) unicode(Rune *k, int n)
{ {
long i, c; long i, c;
k++; /* skip 'X' */
c = 0; c = 0;
for(i=0; i<4; i++,k++){ for(i=0; i<n; i++,k++){
c <<= 4; c <<= 4;
if('0'<=*k && *k<='9') if('0'<=*k && *k<='9')
c += *k-'0'; c += *k-'0';
@ -36,6 +35,8 @@ unicode(Rune *k)
c += 10 + *k-'A'; c += 10 + *k-'A';
else else
return -1; return -1;
if(c > Runemax)
return -1;
} }
return c; return c;
} }
@ -53,10 +54,32 @@ latin1(Rune *k, int n)
char* p; char* p;
if(k[0] == 'X'){ if(k[0] == 'X'){
if(n>=5) if(n < 2)
return unicode(k); return -2;
else if(k[1] == 'X') {
return -5; if(n < 3)
return -3;
if(k[2] == 'X') {
if(n < 9) {
if(unicode(k+3, n-3) < 0)
return -1;
return -(n+1);
}
return unicode(k+3, 6);
}
if(n < 7) {
if(unicode(k+2, n-2) < 0)
return -1;
return -(n+1);
}
return unicode(k+2, 5);
}
if(n < 5) {
if(unicode(k+1, n-1) < 0)
return -1;
return -(n+1);
}
return unicode(k+1, 4);
} }
for(l=latintab; l->ld!=0; l++) for(l=latintab; l->ld!=0; l++)