vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
libutf.c
(1251B)
1 /* libutf8 © 2012-2015 Connor Lane Smith <cls@lubutu.com> */
2 #include "libutf.h"
3 #include "util.h"
4
5 int
6 runelen(Rune r)
7 {
8 if(r <= 0x7F)
9 return 1;
10 else if(r <= 0x07FF)
11 return 2;
12 else if(r <= 0xD7FF)
13 return 3;
14 else if(r <= 0xDFFF)
15 return 0; /* surrogate character */
16 else if(r <= 0xFFFD)
17 return 3;
18 else if(r <= 0xFFFF)
19 return 0; /* illegal character */
20 else if(r <= Runemax)
21 return 4;
22 else
23 return 0; /* rune too large */
24 }
25
26 int
27 runetochar(char *s, const Rune *p)
28 {
29 Rune r = *p;
30
31 switch(runelen(r)) {
32 case 1: /* 0aaaaaaa */
33 s[0] = r;
34 return 1;
35 case 2: /* 00000aaa aabbbbbb */
36 s[0] = 0xC0 | ((r & 0x0007C0) >> 6); /* 110aaaaa */
37 s[1] = 0x80 | (r & 0x00003F); /* 10bbbbbb */
38 return 2;
39 case 3: /* aaaabbbb bbcccccc */
40 s[0] = 0xE0 | ((r & 0x00F000) >> 12); /* 1110aaaa */
41 s[1] = 0x80 | ((r & 0x000FC0) >> 6); /* 10bbbbbb */
42 s[2] = 0x80 | (r & 0x00003F); /* 10cccccc */
43 return 3;
44 case 4: /* 000aaabb bbbbcccc ccdddddd */
45 s[0] = 0xF0 | ((r & 0x1C0000) >> 18); /* 11110aaa */
46 s[1] = 0x80 | ((r & 0x03F000) >> 12); /* 10bbbbbb */
47 s[2] = 0x80 | ((r & 0x000FC0) >> 6); /* 10cccccc */
48 s[3] = 0x80 | (r & 0x00003F); /* 10dddddd */
49 return 4;
50 default:
51 return 0; /* error */
52 }
53 }