1 /* Arabic joining type of Unicode characters. 2 Copyright (C) 2011-2021 Free Software Foundation, Inc. 3 Written by Bruno Haible <bruno@clisp.org>, 2011. 4 5 This file is free software: you can redistribute it and/or modify 6 it under the terms of the GNU Lesser General Public License as 7 published by the Free Software Foundation; either version 2.1 of the 8 License, or (at your option) any later version. 9 10 This file is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public License 16 along with this program. If not, see <https://www.gnu.org/licenses/>. */ 17 18 #include <config.h> 19 20 /* Specification. */ 21 #include "unictype.h" 22 23 /* Define u_joining_type table. */ 24 #include "joiningtype_of.h" 25 26 int uc_joining_type(ucs4_t uc)27uc_joining_type (ucs4_t uc) 28 { 29 unsigned int index1 = uc >> joining_type_header_0; 30 if (index1 < joining_type_header_1) 31 { 32 int lookup1 = u_joining_type.level1[index1]; 33 if (lookup1 >= 0) 34 { 35 unsigned int index2 = (uc >> joining_type_header_2) & joining_type_header_3; 36 int lookup2 = u_joining_type.level2[lookup1 + index2]; 37 if (lookup2 >= 0) 38 { 39 unsigned int index3 = (uc & joining_type_header_4) + lookup2; 40 /* level3 contains 4-bit values. */ 41 unsigned int lookup3 = 42 (u_joining_type.level3[index3>>1] >> ((index3 % 2) * 4)) 43 & 0x0f; 44 45 if (lookup3 != 0x0f) 46 return lookup3; 47 } 48 } 49 } 50 if (uc_is_general_category_withtable 51 (uc, UC_CATEGORY_MASK_Mn | UC_CATEGORY_MASK_Me | UC_CATEGORY_MASK_Cf)) 52 return UC_JOINING_TYPE_T; 53 return UC_JOINING_TYPE_U; 54 } 55