Skip to content

Commit 4077b33

Browse files
committed
patch 7.4.1620
Problem: Emoji characters are not considered as a kind of word character. Solution: Give emoji characters a word class number. (Yasuhiro Matsumoto)
1 parent 364fa5c commit 4077b33

2 files changed

Lines changed: 149 additions & 144 deletions

File tree

src/mbyte.c

Lines changed: 147 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,7 +1181,6 @@ struct interval
11811181
long first;
11821182
long last;
11831183
};
1184-
static int intable(struct interval *table, size_t size, int c);
11851184

11861185
/*
11871186
* Return TRUE if "c" is in "table[size / sizeof(struct interval)]".
@@ -1211,6 +1210,148 @@ intable(struct interval *table, size_t size, int c)
12111210
return FALSE;
12121211
}
12131212

1213+
/* Sorted list of non-overlapping intervals of Emoji characters,
1214+
* based on http://unicode.org/emoji/charts/emoji-list.html */
1215+
static struct interval emoji_tab[] =
1216+
{
1217+
{0x203c, 0x203c},
1218+
{0x2049, 0x2049},
1219+
{0x2122, 0x2122},
1220+
{0x2139, 0x2139},
1221+
{0x2194, 0x2199},
1222+
{0x21a9, 0x21aa},
1223+
{0x231a, 0x231b},
1224+
{0x2328, 0x2328},
1225+
{0x23cf, 0x23cf},
1226+
{0x23e9, 0x23f3},
1227+
{0x24c2, 0x24c2},
1228+
{0x25aa, 0x25ab},
1229+
{0x25b6, 0x25b6},
1230+
{0x25c0, 0x25c0},
1231+
{0x25fb, 0x25fe},
1232+
{0x2600, 0x2604},
1233+
{0x260e, 0x260e},
1234+
{0x2611, 0x2611},
1235+
{0x2614, 0x2615},
1236+
{0x2618, 0x2618},
1237+
{0x261d, 0x261d},
1238+
{0x2620, 0x2620},
1239+
{0x2622, 0x2623},
1240+
{0x2626, 0x2626},
1241+
{0x262a, 0x262a},
1242+
{0x262e, 0x262f},
1243+
{0x2638, 0x263a},
1244+
{0x2648, 0x2653},
1245+
{0x2660, 0x2660},
1246+
{0x2663, 0x2663},
1247+
{0x2665, 0x2666},
1248+
{0x2668, 0x2668},
1249+
{0x267b, 0x267b},
1250+
{0x267f, 0x267f},
1251+
{0x2692, 0x2694},
1252+
{0x2696, 0x2697},
1253+
{0x2699, 0x2699},
1254+
{0x269b, 0x269c},
1255+
{0x26a0, 0x26a1},
1256+
{0x26aa, 0x26ab},
1257+
{0x26b0, 0x26b1},
1258+
{0x26bd, 0x26be},
1259+
{0x26c4, 0x26c5},
1260+
{0x26c8, 0x26c8},
1261+
{0x26ce, 0x26ce},
1262+
{0x26cf, 0x26cf},
1263+
{0x26d1, 0x26d1},
1264+
{0x26d3, 0x26d4},
1265+
{0x26e9, 0x26ea},
1266+
{0x26f0, 0x26f5},
1267+
{0x26f7, 0x26fa},
1268+
{0x26fd, 0x26fd},
1269+
{0x2702, 0x2702},
1270+
{0x2705, 0x2705},
1271+
{0x2708, 0x2709},
1272+
{0x270a, 0x270b},
1273+
{0x270c, 0x270d},
1274+
{0x270f, 0x270f},
1275+
{0x2712, 0x2712},
1276+
{0x2714, 0x2714},
1277+
{0x2716, 0x2716},
1278+
{0x271d, 0x271d},
1279+
{0x2721, 0x2721},
1280+
{0x2728, 0x2728},
1281+
{0x2733, 0x2734},
1282+
{0x2744, 0x2744},
1283+
{0x2747, 0x2747},
1284+
{0x274c, 0x274c},
1285+
{0x274e, 0x274e},
1286+
{0x2753, 0x2755},
1287+
{0x2757, 0x2757},
1288+
{0x2763, 0x2764},
1289+
{0x2795, 0x2797},
1290+
{0x27a1, 0x27a1},
1291+
{0x27b0, 0x27b0},
1292+
{0x27bf, 0x27bf},
1293+
{0x2934, 0x2935},
1294+
{0x2b05, 0x2b07},
1295+
{0x2b1b, 0x2b1c},
1296+
{0x2b50, 0x2b50},
1297+
{0x2b55, 0x2b55},
1298+
{0x3030, 0x3030},
1299+
{0x303d, 0x303d},
1300+
{0x3297, 0x3297},
1301+
{0x3299, 0x3299},
1302+
{0x1f004, 0x1f004},
1303+
{0x1f0cf, 0x1f0cf},
1304+
{0x1f170, 0x1f171},
1305+
{0x1f17e, 0x1f17e},
1306+
{0x1f17f, 0x1f17f},
1307+
{0x1f18e, 0x1f18e},
1308+
{0x1f191, 0x1f19a},
1309+
{0x1f1e6, 0x1f1ff},
1310+
{0x1f201, 0x1f202},
1311+
{0x1f21a, 0x1f21a},
1312+
{0x1f22f, 0x1f22f},
1313+
{0x1f232, 0x1f23a},
1314+
{0x1f250, 0x1f251},
1315+
{0x1f300, 0x1f320},
1316+
{0x1f330, 0x1f335},
1317+
{0x1f337, 0x1f37c},
1318+
{0x1f380, 0x1f393},
1319+
{0x1f3a0, 0x1f3c4},
1320+
{0x1f3c6, 0x1f3ca},
1321+
{0x1f3e0, 0x1f3f0},
1322+
{0x1f400, 0x1f43e},
1323+
{0x1f440, 0x1f440},
1324+
{0x1f442, 0x1f4f7},
1325+
{0x1f4f9, 0x1f4fc},
1326+
{0x1f500, 0x1f53d},
1327+
{0x1f550, 0x1f567},
1328+
{0x1f5fb, 0x1f5ff},
1329+
{0x1f600, 0x1f600},
1330+
{0x1f601, 0x1f610},
1331+
{0x1f611, 0x1f611},
1332+
{0x1f612, 0x1f614},
1333+
{0x1f615, 0x1f615},
1334+
{0x1f616, 0x1f616},
1335+
{0x1f617, 0x1f617},
1336+
{0x1f618, 0x1f618},
1337+
{0x1f619, 0x1f619},
1338+
{0x1f61a, 0x1f61a},
1339+
{0x1f61b, 0x1f61b},
1340+
{0x1f61c, 0x1f61e},
1341+
{0x1f61f, 0x1f61f},
1342+
{0x1f620, 0x1f625},
1343+
{0x1f626, 0x1f627},
1344+
{0x1f628, 0x1f62b},
1345+
{0x1f62c, 0x1f62c},
1346+
{0x1f62d, 0x1f62d},
1347+
{0x1f62e, 0x1f62f},
1348+
{0x1f630, 0x1f633},
1349+
{0x1f634, 0x1f634},
1350+
{0x1f635, 0x1f640},
1351+
{0x1f645, 0x1f64f},
1352+
{0x1f680, 0x1f6c5}
1353+
};
1354+
12141355
/*
12151356
* For UTF-8 character "c" return 2 for a double-width character, 1 for others.
12161357
* Returns 4 or 6 for an unprintable character.
@@ -1436,148 +1577,6 @@ utf_char2cells(int c)
14361577
{0x100000, 0x10fffd}
14371578
};
14381579

1439-
/* Sorted list of non-overlapping intervals of Emoji characters,
1440-
* based on http://unicode.org/emoji/charts/emoji-list.html */
1441-
static struct interval emoji[] =
1442-
{
1443-
{0x203c, 0x203c},
1444-
{0x2049, 0x2049},
1445-
{0x2122, 0x2122},
1446-
{0x2139, 0x2139},
1447-
{0x2194, 0x2199},
1448-
{0x21a9, 0x21aa},
1449-
{0x231a, 0x231b},
1450-
{0x2328, 0x2328},
1451-
{0x23cf, 0x23cf},
1452-
{0x23e9, 0x23f3},
1453-
{0x24c2, 0x24c2},
1454-
{0x25aa, 0x25ab},
1455-
{0x25b6, 0x25b6},
1456-
{0x25c0, 0x25c0},
1457-
{0x25fb, 0x25fe},
1458-
{0x2600, 0x2604},
1459-
{0x260e, 0x260e},
1460-
{0x2611, 0x2611},
1461-
{0x2614, 0x2615},
1462-
{0x2618, 0x2618},
1463-
{0x261d, 0x261d},
1464-
{0x2620, 0x2620},
1465-
{0x2622, 0x2623},
1466-
{0x2626, 0x2626},
1467-
{0x262a, 0x262a},
1468-
{0x262e, 0x262f},
1469-
{0x2638, 0x263a},
1470-
{0x2648, 0x2653},
1471-
{0x2660, 0x2660},
1472-
{0x2663, 0x2663},
1473-
{0x2665, 0x2666},
1474-
{0x2668, 0x2668},
1475-
{0x267b, 0x267b},
1476-
{0x267f, 0x267f},
1477-
{0x2692, 0x2694},
1478-
{0x2696, 0x2697},
1479-
{0x2699, 0x2699},
1480-
{0x269b, 0x269c},
1481-
{0x26a0, 0x26a1},
1482-
{0x26aa, 0x26ab},
1483-
{0x26b0, 0x26b1},
1484-
{0x26bd, 0x26be},
1485-
{0x26c4, 0x26c5},
1486-
{0x26c8, 0x26c8},
1487-
{0x26ce, 0x26ce},
1488-
{0x26cf, 0x26cf},
1489-
{0x26d1, 0x26d1},
1490-
{0x26d3, 0x26d4},
1491-
{0x26e9, 0x26ea},
1492-
{0x26f0, 0x26f5},
1493-
{0x26f7, 0x26fa},
1494-
{0x26fd, 0x26fd},
1495-
{0x2702, 0x2702},
1496-
{0x2705, 0x2705},
1497-
{0x2708, 0x2709},
1498-
{0x270a, 0x270b},
1499-
{0x270c, 0x270d},
1500-
{0x270f, 0x270f},
1501-
{0x2712, 0x2712},
1502-
{0x2714, 0x2714},
1503-
{0x2716, 0x2716},
1504-
{0x271d, 0x271d},
1505-
{0x2721, 0x2721},
1506-
{0x2728, 0x2728},
1507-
{0x2733, 0x2734},
1508-
{0x2744, 0x2744},
1509-
{0x2747, 0x2747},
1510-
{0x274c, 0x274c},
1511-
{0x274e, 0x274e},
1512-
{0x2753, 0x2755},
1513-
{0x2757, 0x2757},
1514-
{0x2763, 0x2764},
1515-
{0x2795, 0x2797},
1516-
{0x27a1, 0x27a1},
1517-
{0x27b0, 0x27b0},
1518-
{0x27bf, 0x27bf},
1519-
{0x2934, 0x2935},
1520-
{0x2b05, 0x2b07},
1521-
{0x2b1b, 0x2b1c},
1522-
{0x2b50, 0x2b50},
1523-
{0x2b55, 0x2b55},
1524-
{0x3030, 0x3030},
1525-
{0x303d, 0x303d},
1526-
{0x3297, 0x3297},
1527-
{0x3299, 0x3299},
1528-
{0x1f004, 0x1f004},
1529-
{0x1f0cf, 0x1f0cf},
1530-
{0x1f170, 0x1f171},
1531-
{0x1f17e, 0x1f17e},
1532-
{0x1f17f, 0x1f17f},
1533-
{0x1f18e, 0x1f18e},
1534-
{0x1f191, 0x1f19a},
1535-
{0x1f1e6, 0x1f1ff},
1536-
{0x1f201, 0x1f202},
1537-
{0x1f21a, 0x1f21a},
1538-
{0x1f22f, 0x1f22f},
1539-
{0x1f232, 0x1f23a},
1540-
{0x1f250, 0x1f251},
1541-
{0x1f300, 0x1f320},
1542-
{0x1f330, 0x1f335},
1543-
{0x1f337, 0x1f37c},
1544-
{0x1f380, 0x1f393},
1545-
{0x1f3a0, 0x1f3c4},
1546-
{0x1f3c6, 0x1f3ca},
1547-
{0x1f3e0, 0x1f3f0},
1548-
{0x1f400, 0x1f43e},
1549-
{0x1f440, 0x1f440},
1550-
{0x1f442, 0x1f4f7},
1551-
{0x1f4f9, 0x1f4fc},
1552-
{0x1f500, 0x1f53d},
1553-
{0x1f550, 0x1f567},
1554-
{0x1f5fb, 0x1f5ff},
1555-
{0x1f600, 0x1f600},
1556-
{0x1f601, 0x1f610},
1557-
{0x1f611, 0x1f611},
1558-
{0x1f612, 0x1f614},
1559-
{0x1f615, 0x1f615},
1560-
{0x1f616, 0x1f616},
1561-
{0x1f617, 0x1f617},
1562-
{0x1f618, 0x1f618},
1563-
{0x1f619, 0x1f619},
1564-
{0x1f61a, 0x1f61a},
1565-
{0x1f61b, 0x1f61b},
1566-
{0x1f61c, 0x1f61e},
1567-
{0x1f61f, 0x1f61f},
1568-
{0x1f620, 0x1f625},
1569-
{0x1f626, 0x1f627},
1570-
{0x1f628, 0x1f62b},
1571-
{0x1f62c, 0x1f62c},
1572-
{0x1f62d, 0x1f62d},
1573-
{0x1f62e, 0x1f62f},
1574-
{0x1f630, 0x1f633},
1575-
{0x1f634, 0x1f634},
1576-
{0x1f635, 0x1f640},
1577-
{0x1f645, 0x1f64f},
1578-
{0x1f680, 0x1f6c5}
1579-
};
1580-
15811580
if (c >= 0x100)
15821581
{
15831582
#ifdef USE_WCHAR_FUNCTIONS
@@ -1597,7 +1596,7 @@ utf_char2cells(int c)
15971596
if (intable(doublewidth, sizeof(doublewidth), c))
15981597
return 2;
15991598
#endif
1600-
if (p_emoji && intable(emoji, sizeof(emoji), c))
1599+
if (p_emoji && intable(emoji_tab, sizeof(emoji_tab), c))
16011600
return 2;
16021601
}
16031602

@@ -2701,6 +2700,10 @@ utf_class(int c)
27012700
return (int)classes[mid].class;
27022701
}
27032702

2703+
/* emoji */
2704+
if (intable(emoji_tab, sizeof(emoji_tab), c))
2705+
return 3;
2706+
27042707
/* most other characters are "word" characters */
27052708
return 2;
27062709
}

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,8 @@ static char *(features[]) =
748748

749749
static int included_patches[] =
750750
{ /* Add new patch number below this line */
751+
/**/
752+
1620,
751753
/**/
752754
1619,
753755
/**/

0 commit comments

Comments
 (0)