1*3d40d63aSnicm /* $OpenBSD: utf8-combined.c,v 1.4 2025/01/01 15:17:36 nicm Exp $ */
2ecd3a22eSnicm
3ecd3a22eSnicm /*
4ecd3a22eSnicm * Copyright (c) 2023 Nicholas Marriott <nicholas.marriott@gmail.com>
5ecd3a22eSnicm *
6ecd3a22eSnicm * Permission to use, copy, modify, and distribute this software for any
7ecd3a22eSnicm * purpose with or without fee is hereby granted, provided that the above
8ecd3a22eSnicm * copyright notice and this permission notice appear in all copies.
9ecd3a22eSnicm *
10ecd3a22eSnicm * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11ecd3a22eSnicm * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12ecd3a22eSnicm * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13ecd3a22eSnicm * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14ecd3a22eSnicm * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15ecd3a22eSnicm * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16ecd3a22eSnicm * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17ecd3a22eSnicm */
18ecd3a22eSnicm
19ecd3a22eSnicm #include <sys/types.h>
20ecd3a22eSnicm
21ecd3a22eSnicm #include <stdlib.h>
22ecd3a22eSnicm #include <string.h>
23ecd3a22eSnicm #include <wchar.h>
24ecd3a22eSnicm
25ecd3a22eSnicm #include "tmux.h"
26ecd3a22eSnicm
272af49740Snicm /* Has this got a zero width joiner at the end? */
282af49740Snicm int
utf8_has_zwj(const struct utf8_data * ud)292af49740Snicm utf8_has_zwj(const struct utf8_data *ud)
30ecd3a22eSnicm {
312af49740Snicm if (ud->size < 3)
322af49740Snicm return (0);
332af49740Snicm return (memcmp(ud->data + ud->size - 3, "\342\200\215", 3) == 0);
34ecd3a22eSnicm }
35ecd3a22eSnicm
362af49740Snicm /* Is this a zero width joiner? */
372af49740Snicm int
utf8_is_zwj(const struct utf8_data * ud)38ecd3a22eSnicm utf8_is_zwj(const struct utf8_data *ud)
39ecd3a22eSnicm {
402af49740Snicm if (ud->size != 3)
412af49740Snicm return (0);
422af49740Snicm return (memcmp(ud->data, "\342\200\215", 3) == 0);
43ecd3a22eSnicm }
44ecd3a22eSnicm
452af49740Snicm /* Is this a variation selector? */
46ecd3a22eSnicm int
utf8_is_vs(const struct utf8_data * ud)472af49740Snicm utf8_is_vs(const struct utf8_data *ud)
48ecd3a22eSnicm {
492af49740Snicm if (ud->size != 3)
502af49740Snicm return (0);
512af49740Snicm return (memcmp(ud->data, "\357\270\217", 3) == 0);
52ecd3a22eSnicm }
53ecd3a22eSnicm
542af49740Snicm /* Is this in the modifier table? */
552af49740Snicm int
utf8_is_modifier(const struct utf8_data * ud)562af49740Snicm utf8_is_modifier(const struct utf8_data *ud)
572af49740Snicm {
582af49740Snicm wchar_t wc;
59ecd3a22eSnicm
602af49740Snicm if (utf8_towc(ud, &wc) != UTF8_DONE)
612af49740Snicm return (0);
62*3d40d63aSnicm switch (wc) {
63*3d40d63aSnicm case 0x1F1E6:
64*3d40d63aSnicm case 0x1F1E7:
65*3d40d63aSnicm case 0x1F1E8:
66*3d40d63aSnicm case 0x1F1E9:
67*3d40d63aSnicm case 0x1F1EA:
68*3d40d63aSnicm case 0x1F1EB:
69*3d40d63aSnicm case 0x1F1EC:
70*3d40d63aSnicm case 0x1F1ED:
71*3d40d63aSnicm case 0x1F1EE:
72*3d40d63aSnicm case 0x1F1EF:
73*3d40d63aSnicm case 0x1F1F0:
74*3d40d63aSnicm case 0x1F1F1:
75*3d40d63aSnicm case 0x1F1F2:
76*3d40d63aSnicm case 0x1F1F3:
77*3d40d63aSnicm case 0x1F1F4:
78*3d40d63aSnicm case 0x1F1F5:
79*3d40d63aSnicm case 0x1F1F6:
80*3d40d63aSnicm case 0x1F1F7:
81*3d40d63aSnicm case 0x1F1F8:
82*3d40d63aSnicm case 0x1F1F9:
83*3d40d63aSnicm case 0x1F1FA:
84*3d40d63aSnicm case 0x1F1FB:
85*3d40d63aSnicm case 0x1F1FC:
86*3d40d63aSnicm case 0x1F1FD:
87*3d40d63aSnicm case 0x1F1FE:
88*3d40d63aSnicm case 0x1F1FF:
89*3d40d63aSnicm case 0x1F3FB:
90*3d40d63aSnicm case 0x1F3FC:
91*3d40d63aSnicm case 0x1F3FD:
92*3d40d63aSnicm case 0x1F3FE:
93*3d40d63aSnicm case 0x1F3FF:
942af49740Snicm return (1);
95ecd3a22eSnicm }
96*3d40d63aSnicm return (0);
97*3d40d63aSnicm }
98