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 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 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 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 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