]> Sergey Matveev's repositories - st.git/commitdiff
Do not print emojis
authorSergey Matveev <stargrave@stargrave.org>
Mon, 14 Apr 2025 09:37:38 +0000 (12:37 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Mon, 14 Apr 2025 09:38:48 +0000 (12:38 +0300)
list-emojis [new file with mode: 0755]
list-emojis.pl [new file with mode: 0755]
st.c

diff --git a/list-emojis b/list-emojis
new file mode 100755 (executable)
index 0000000..c2aace0
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh -e
+
+echo "static const uint32_t emojis[] = {";
+./list-emojis.pl <data/emoji-data.txt | grep -v 0x0000 | sort | uniq
+echo "};"
diff --git a/list-emojis.pl b/list-emojis.pl
new file mode 100755 (executable)
index 0000000..daad7e9
--- /dev/null
@@ -0,0 +1,15 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+while (<>) {
+    next if /^#/ or /^$/;
+    my @range = split " ";
+    @range = split /\.\./, $range[0];
+    my $i = hex $range[0];
+    my $end = ($#range > 0) ? hex($range[1]) : $i;
+    for (; $i <= $end; $i++) {
+        printf "\t0x%06x,\n", $i;
+    };
+};
diff --git a/st.c b/st.c
index 03b9bc88b1b8335bd82c9a98c630abd99fd642db..db0fee4ca963c923f2c6b756b209a26feed0ffbc 100644 (file)
--- a/st.c
+++ b/st.c
@@ -4,11 +4,12 @@
 #include <fcntl.h>
 #include <limits.h>
 #include <pwd.h>
+#include <signal.h>
 #include <stdarg.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <signal.h>
 #include <sys/ioctl.h>
 #include <sys/select.h>
 #include <sys/types.h>
@@ -339,10 +340,31 @@ utf8encodebyte(Rune u, size_t i)
        return utfbyte[i] | (u & ~utfmask[i]);
 }
 
+// ./list-emojis <libgrapheme/data/emoji-data.txt >emojis.c.in
+#include "emojis.c.in"
+
+static int
+uint32comparator(const void *a, const void *b)
+{
+    return *(uint32_t *)a - *(uint32_t *)b;
+}
+
+int
+isEmoji(const Rune u)
+{
+    const uint32_t want = (uint32_t)u;
+    return bsearch(
+        &want,
+        emojis,
+        (sizeof emojis)/sizeof(uint32_t),
+        sizeof(uint32_t),
+        uint32comparator) != NULL;
+}
+
 size_t
 utf8validate(Rune *u, size_t i)
 {
-       if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF))
+       if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF) || isEmoji(*u))
                *u = UTF_INVALID;
        for (i = 1; *u > utfmax[i]; ++i)
                ;