From: Sergey Matveev Date: Mon, 14 Apr 2025 09:37:38 +0000 (+0300) Subject: Do not print emojis X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=ce2ec0586ff0c4d4e4ca95cf0dde70c00b4c108e;p=st.git Do not print emojis --- diff --git a/list-emojis b/list-emojis new file mode 100755 index 0000000..c2aace0 --- /dev/null +++ b/list-emojis @@ -0,0 +1,5 @@ +#!/bin/sh -e + +echo "static const uint32_t emojis[] = {"; +./list-emojis.pl ) { + 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 03b9bc8..db0fee4 100644 --- a/st.c +++ b/st.c @@ -4,11 +4,12 @@ #include #include #include +#include #include +#include #include #include #include -#include #include #include #include @@ -339,10 +340,31 @@ utf8encodebyte(Rune u, size_t i) return utfbyte[i] | (u & ~utfmask[i]); } +// ./list-emojis 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) ;