@@ -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}
0 commit comments