1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ****************************************************************************** 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 4fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * Copyright (C) 2000-2014, International Business Machines 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Corporation and others. All Rights Reserved. 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ****************************************************************************** 8103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * file name: ushape.cpp 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * encoding: US-ASCII 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * tab size: 8 (not used) 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * indentation:4 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * created on: 2000jun29 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * created by: Markus W. Scherer 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Arabic letter shaping implemented by Ayman Roshdy 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ushape.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "putilimp.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ustr_imp.h" 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ubidi_props.h" 27103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "uassert.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 29103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) 30103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 31103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/* 32103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * This implementation is designed for 16-bit Unicode strings. 33103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * The main assumption is that the Arabic characters and their 34103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * presentation forms each fit into a single UChar. 35103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * With UTF-8, they occupy 2 or 3 bytes, and more than the ASCII 36103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * characters. 37103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ### TODO in general for letter shaping: 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * - the letter shaping code is UTF-16-unaware; needs update 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * + especially invertBuffer()?! 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * - needs to handle the "Arabic Tail" that is used in some legacy codepages 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * as a glyph fragment of wide-glyph letters 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * + IBM Unicode conversion tables map it to U+200B (ZWSP) 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * + IBM Egypt has proposed to encode the tail in Unicode among Arabic Presentation Forms 478393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * + Unicode 3.2 added U+FE73 ARABIC TAIL FRAGMENT 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* definitions for Arabic letter shaping ------------------------------------ */ 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define IRRELEVANT 4 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LAMTYPE 16 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define ALEFTYPE 32 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LINKR 1 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LINKL 2 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define APRESENT 8 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define SHADDA 64 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CSHADDA 128 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define COMBINE (SHADDA+CSHADDA) 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 62b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define HAMZAFE_CHAR 0xfe80 63b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define HAMZA06_CHAR 0x0621 64b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define YEH_HAMZA_CHAR 0x0626 65b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define YEH_HAMZAFE_CHAR 0xFE89 66b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define LAMALEF_SPACE_SUB 0xFFFF 67b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define TASHKEEL_SPACE_SUB 0xFFFE 68b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define NEW_TAIL_CHAR 0xFE73 69b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define OLD_TAIL_CHAR 0x200B 70b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define LAM_CHAR 0x0644 71b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define SPACE_CHAR 0x0020 72b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define SHADDA_CHAR 0xFE7C 73b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define TATWEEL_CHAR 0x0640 74b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define SHADDA_TATWEEL_CHAR 0xFE7D 7554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#define SHADDA06_CHAR 0x0651 76b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 77b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define SHAPE_MODE 0 78b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define DESHAPE_MODE 1 79b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 8054dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstruct uShapeVariables { 8154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UChar tailChar; 8254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius uint32_t uShapeLamalefBegin; 8354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius uint32_t uShapeLamalefEnd; 8454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius uint32_t uShapeTashkeelBegin; 8554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius uint32_t uShapeTashkeelEnd; 8654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int spacesRelativeToTextBeginEnd; 8754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}; 88b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 89b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const uint8_t tailFamilyIsolatedFinal[] = { 90b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FEB1 */ 1, 91b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FEB2 */ 1, 92b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FEB3 */ 0, 93b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FEB4 */ 0, 94b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FEB5 */ 1, 95b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FEB6 */ 1, 96b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FEB7 */ 0, 97b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FEB8 */ 0, 98b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FEB9 */ 1, 99b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FEBA */ 1, 100b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FEBB */ 0, 101b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FEBC */ 0, 102b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FEBD */ 1, 103b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FEBE */ 1 104b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}; 105b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 106b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const uint8_t tashkeelMedial[] = { 107b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FE70 */ 0, 108b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FE71 */ 1, 109b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FE72 */ 0, 110b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FE73 */ 0, 111b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FE74 */ 0, 112b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FE75 */ 0, 113b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FE76 */ 0, 114b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FE77 */ 1, 115b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FE78 */ 0, 116b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FE79 */ 1, 117b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FE7A */ 0, 118b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FE7B */ 1, 119b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FE7C */ 0, 120b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FE7D */ 1, 121b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FE7E */ 0, 122b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* FE7F */ 1 123b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}; 124b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 125b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar yehHamzaToYeh[] = 126b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{ 127b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* isolated*/ 0xFEEF, 128b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* final */ 0xFEF0 129b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}; 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 131c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic const uint8_t IrrelevantPos[] = { 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0, 0x2, 0x4, 0x6, 133b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0x8, 0xA, 0xC, 0xE 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 136b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar convertLamAlef[] = 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEF5*/ 0x0622, 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEF6*/ 0x0622, 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEF7*/ 0x0623, 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEF8*/ 0x0623, 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEF9*/ 0x0625, 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEFA*/ 0x0625, 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEFB*/ 0x0627, 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEFC*/ 0x0627 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar araLink[178]= 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 32 + 256 * 0x11,/*0x0622*/ 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 32 + 256 * 0x13,/*0x0623*/ 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 256 * 0x15,/*0x0624*/ 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 32 + 256 * 0x17,/*0x0625*/ 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x19,/*0x0626*/ 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 32 + 256 * 0x1D,/*0x0627*/ 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x1F,/*0x0628*/ 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 256 * 0x23,/*0x0629*/ 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x25,/*0x062A*/ 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x29,/*0x062B*/ 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x2D,/*0x062C*/ 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x31,/*0x062D*/ 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x35,/*0x062E*/ 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 256 * 0x39,/*0x062F*/ 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 256 * 0x3B,/*0x0630*/ 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 256 * 0x3D,/*0x0631*/ 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 256 * 0x3F,/*0x0632*/ 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x41,/*0x0633*/ 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x45,/*0x0634*/ 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x49,/*0x0635*/ 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x4D,/*0x0636*/ 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x51,/*0x0637*/ 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x55,/*0x0638*/ 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x59,/*0x0639*/ 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x5D,/*0x063A*/ 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 0, 0, 0, 0, /*0x063B-0x063F*/ 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2, /*0x0640*/ 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x61,/*0x0641*/ 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x65,/*0x0642*/ 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x69,/*0x0643*/ 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 16 + 256 * 0x6D,/*0x0644*/ 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x71,/*0x0645*/ 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x75,/*0x0646*/ 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x79,/*0x0647*/ 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 256 * 0x7D,/*0x0648*/ 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 256 * 0x7F,/*0x0649*/ 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 2 + 256 * 0x81,/*0x064A*/ 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4 + 256 * 1, /*0x064B*/ 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4 + 128 + 256 * 1, /*0x064C*/ 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4 + 128 + 256 * 1, /*0x064D*/ 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4 + 128 + 256 * 1, /*0x064E*/ 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4 + 128 + 256 * 1, /*0x064F*/ 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4 + 128 + 256 * 1, /*0x0650*/ 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4 + 64 + 256 * 3, /*0x0651*/ 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4 + 256 * 1, /*0x0652*/ 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4 + 256 * 7, /*0x0653*/ 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4 + 256 * 8, /*0x0654*/ 198103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 4 + 256 * 8, /*0x0655*/ 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4 + 256 * 1, /*0x0656*/ 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 0, 0, 0, 0, /*0x0657-0x065B*/ 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 256 * 0x85,/*0x065C*/ 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 256 * 0x87,/*0x065D*/ 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 256 * 0x89,/*0x065E*/ 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 256 * 0x8B,/*0x065F*/ 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 0, 0, 0, 0, /*0x0660-0x0664*/ 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 0, 0, 0, 0, /*0x0665-0x0669*/ 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 0, 0, 0, 0, 0, /*0x066A-0x066F*/ 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4 + 256 * 6, /*0x0670*/ 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 8 + 256 * 0x00,/*0x0671*/ 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 32, /*0x0672*/ 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 32, /*0x0673*/ 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, /*0x0674*/ 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1 + 32, /*0x0675*/ 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1, 1, /*0x0676-0x0677*/ 21559d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 2, /*0x0678*/ 21659d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 2 + 8 + 256 * 0x16,/*0x0679*/ 21759d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 2 + 8 + 256 * 0x0E,/*0x067A*/ 21859d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 2 + 8 + 256 * 0x02,/*0x067B*/ 21959d709d503bab6e2b61931737e662dd293b40578ccornelius 1+2, 1+2, /*0x67C-0x067D*/ 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1+2+8+256 * 0x06, 1+2, 1+2, 1+2, 1+2, 1+2, /*0x067E-0x0683*/ 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1+2, 1+2, 1+2+8+256 * 0x2A, 1+2, /*0x0684-0x0687*/ 22259d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 8 + 256 * 0x38,/*0x0688*/ 22359d709d503bab6e2b61931737e662dd293b40578ccornelius 1, 1, 1, /*0x0689-0x068B*/ 22459d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 8 + 256 * 0x34,/*0x068C*/ 22559d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 8 + 256 * 0x32,/*0x068D*/ 22659d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 8 + 256 * 0x36,/*0x068E*/ 22759d709d503bab6e2b61931737e662dd293b40578ccornelius 1, 1, /*0x068F-0x0690*/ 22859d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 8 + 256 * 0x3C,/*0x0691*/ 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1, 1, 1, 1, 1, 1, 1+8+256 * 0x3A, 1, /*0x0692-0x0699*/ 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1+2, 1+2, 1+2, 1+2, 1+2, 1+2, /*0x069A-0x06A3*/ 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1+2, 1+2, 1+2, 1+2, /*0x069A-0x06A3*/ 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1+2, 1+2, 1+2, 1+2, 1+2, 1+2+8+256 * 0x3E, /*0x06A4-0x06AD*/ 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1+2, 1+2, 1+2, 1+2, /*0x06A4-0x06AD*/ 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1+2, 1+2+8+256 * 0x42, 1+2, 1+2, 1+2, 1+2, /*0x06AE-0x06B7*/ 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1+2, 1+2, 1+2, 1+2, /*0x06AE-0x06B7*/ 23659d709d503bab6e2b61931737e662dd293b40578ccornelius 1+2, 1+2, /*0x06B8-0x06B9*/ 23759d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 8 + 256 * 0x4E,/*0x06BA*/ 23859d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 2 + 8 + 256 * 0x50,/*0x06BB*/ 23959d709d503bab6e2b61931737e662dd293b40578ccornelius 1+2, 1+2, /*0x06BC-0x06BD*/ 24059d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 2 + 8 + 256 * 0x5A,/*0x06BE*/ 24159d709d503bab6e2b61931737e662dd293b40578ccornelius 1+2, /*0x06BF*/ 24259d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 8 + 256 * 0x54,/*0x06C0*/ 24359d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 2 + 8 + 256 * 0x56,/*0x06C1*/ 24459d709d503bab6e2b61931737e662dd293b40578ccornelius 1, 1, 1, /*0x06C2-0x06C4*/ 24559d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 8 + 256 * 0x90,/*0x06C5*/ 24659d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 8 + 256 * 0x89,/*0x06C6*/ 24759d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 8 + 256 * 0x87,/*0x06C7*/ 24859d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 8 + 256 * 0x8B,/*0x06C8*/ 24959d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 8 + 256 * 0x92,/*0x06C9*/ 25059d709d503bab6e2b61931737e662dd293b40578ccornelius 1, /*0x06CA*/ 25159d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 8 + 256 * 0x8E,/*0x06CB*/ 25259d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 2 + 8 + 256 * 0xAC,/*0x06CC*/ 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1, /*0x06CD*/ 25459d709d503bab6e2b61931737e662dd293b40578ccornelius 1+2, 1+2, /*0x06CE-0x06CF*/ 25559d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 2 + 8 + 256 * 0x94,/*0x06D0*/ 25659d709d503bab6e2b61931737e662dd293b40578ccornelius 1+2, /*0x06D1*/ 25759d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 8 + 256 * 0x5E,/*0x06D2*/ 25859d709d503bab6e2b61931737e662dd293b40578ccornelius 1 + 8 + 256 * 0x60 /*0x06D3*/ 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 261c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic const uint8_t presALink[] = { 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/***********0*****1*****2*****3*****4*****5*****6*****7*****8*****9*****A*****B*****C*****D*****E*****F*/ 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FB5*/ 0, 1, 0, 0, 0, 0, 0, 1, 2,1 + 2, 0, 0, 0, 0, 0, 0, 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FB6*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FB7*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,1 + 2, 0, 0, 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FB8*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FB9*/ 2,1 + 2, 0, 1, 2,1 + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FBA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FBB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FBC*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FBD*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FBE*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FBF*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,1 + 2, 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FC0*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FC1*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FC2*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FC3*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FC4*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FC5*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FC6*/ 4, 4, 4 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 283c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic const uint8_t presBLink[]= 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/***********0*****1*****2*****3*****4*****5*****6*****7*****8*****9*****A*****B*****C*****D*****E*****F*/ 286103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*FE7*/1 + 2,1 + 2,1 + 2, 0,1 + 2, 0,1 + 2,1 + 2,1 + 2,1 + 2,1 + 2,1 + 2,1 + 2,1 + 2,1 + 2,1 + 2, 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FE8*/ 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2,1 + 2, 0, 1, 0, 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FE9*/ 1, 2,1 + 2, 0, 1, 0, 1, 2,1 + 2, 0, 1, 2,1 + 2, 0, 1, 2, 289103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*FEA*/1 + 2, 0, 1, 2,1 + 2, 0, 1, 2,1 + 2, 0, 1, 0, 1, 0, 1, 0, 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEB*/ 1, 0, 1, 2,1 + 2, 0, 1, 2,1 + 2, 0, 1, 2,1 + 2, 0, 1, 2, 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEC*/1 + 2, 0, 1, 2,1 + 2, 0, 1, 2,1 + 2, 0, 1, 2,1 + 2, 0, 1, 2, 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FED*/1 + 2, 0, 1, 2,1 + 2, 0, 1, 2,1 + 2, 0, 1, 2,1 + 2, 0, 1, 2, 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEE*/1 + 2, 0, 1, 2,1 + 2, 0, 1, 2,1 + 2, 0, 1, 2,1 + 2, 0, 1, 0, 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEF*/ 1, 0, 1, 2,1 + 2, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar convertFBto06[] = 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/***********0******1******2******3******4******5******6******7******8******9******A******B******C******D******E******F***/ 30059d709d503bab6e2b61931737e662dd293b40578ccornelius/*FB5*/ 0x671, 0x671, 0x67B, 0x67B, 0x67B, 0x67B, 0x67E, 0x67E, 0x67E, 0x67E, 0, 0, 0, 0, 0x67A, 0x67A, 30159d709d503bab6e2b61931737e662dd293b40578ccornelius/*FB6*/ 0x67A, 0x67A, 0, 0, 0, 0, 0x679, 0x679, 0x679, 0x679, 0, 0, 0, 0, 0, 0, 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FB7*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x686, 0x686, 0x686, 0x686, 0, 0, 30359d709d503bab6e2b61931737e662dd293b40578ccornelius/*FB8*/ 0, 0, 0x68D, 0x68D, 0x68C, 0x68C, 0x68E, 0x68E, 0x688, 0x688, 0x698, 0x698, 0x691, 0x691, 0x6A9, 0x6A9, 30459d709d503bab6e2b61931737e662dd293b40578ccornelius/*FB9*/ 0x6A9, 0x6A9, 0x6AF, 0x6AF, 0x6AF, 0x6AF, 0, 0, 0, 0, 0, 0, 0, 0, 0x6BA, 0x6BA, 30559d709d503bab6e2b61931737e662dd293b40578ccornelius/*FBA*/ 0x6BB, 0x6BB, 0x6BB, 0x6BB, 0x6C0, 0x6C0, 0x6C1, 0x6C1, 0x6C1, 0x6C1, 0x6BE, 0x6BE, 0x6BE, 0x6BE, 0x6d2, 0x6D2, 30659d709d503bab6e2b61931737e662dd293b40578ccornelius/*FBB*/ 0x6D3, 0x6D3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FBC*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30859d709d503bab6e2b61931737e662dd293b40578ccornelius/*FBD*/ 0, 0, 0, 0, 0, 0, 0, 0x6C7, 0x6C7, 0x6C6, 0x6C6, 0x6C8, 0x6C8, 0, 0x6CB, 0x6CB, 30959d709d503bab6e2b61931737e662dd293b40578ccornelius/*FBE*/ 0x6C5, 0x6C5, 0x6C9, 0x6C9, 0x6D0, 0x6D0, 0x6D0, 0x6D0, 0, 0, 0, 0, 0, 0, 0, 0, 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FBF*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x6CC, 0x6CC, 0x6CC, 0x6CC 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar convertFEto06[] = 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/***********0******1******2******3******4******5******6******7******8******9******A******B******C******D******E******F***/ 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FE7*/ 0x64B, 0x64B, 0x64C, 0x64C, 0x64D, 0x64D, 0x64E, 0x64E, 0x64F, 0x64F, 0x650, 0x650, 0x651, 0x651, 0x652, 0x652, 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FE8*/ 0x621, 0x622, 0x622, 0x623, 0x623, 0x624, 0x624, 0x625, 0x625, 0x626, 0x626, 0x626, 0x626, 0x627, 0x627, 0x628, 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FE9*/ 0x628, 0x628, 0x628, 0x629, 0x629, 0x62A, 0x62A, 0x62A, 0x62A, 0x62B, 0x62B, 0x62B, 0x62B, 0x62C, 0x62C, 0x62C, 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEA*/ 0x62C, 0x62D, 0x62D, 0x62D, 0x62D, 0x62E, 0x62E, 0x62E, 0x62E, 0x62F, 0x62F, 0x630, 0x630, 0x631, 0x631, 0x632, 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEB*/ 0x632, 0x633, 0x633, 0x633, 0x633, 0x634, 0x634, 0x634, 0x634, 0x635, 0x635, 0x635, 0x635, 0x636, 0x636, 0x636, 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEC*/ 0x636, 0x637, 0x637, 0x637, 0x637, 0x638, 0x638, 0x638, 0x638, 0x639, 0x639, 0x639, 0x639, 0x63A, 0x63A, 0x63A, 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FED*/ 0x63A, 0x641, 0x641, 0x641, 0x641, 0x642, 0x642, 0x642, 0x642, 0x643, 0x643, 0x643, 0x643, 0x644, 0x644, 0x644, 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEE*/ 0x644, 0x645, 0x645, 0x645, 0x645, 0x646, 0x646, 0x646, 0x646, 0x647, 0x647, 0x647, 0x647, 0x648, 0x648, 0x649, 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*FEF*/ 0x649, 0x64A, 0x64A, 0x64A, 0x64A, 0x65C, 0x65C, 0x65D, 0x65D, 0x65E, 0x65E, 0x65F, 0x65F 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 327c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic const uint8_t shapeTable[4][4][4]= 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { {0,0,0,0}, {0,0,0,0}, {0,1,0,3}, {0,1,0,1} }, 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { {0,0,2,2}, {0,0,1,2}, {0,1,1,2}, {0,1,1,3} }, 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { {0,0,0,0}, {0,0,0,0}, {0,1,0,3}, {0,1,0,3} }, 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { {0,0,1,2}, {0,0,1,2}, {0,1,1,2}, {0,1,1,3} } 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This function shapes European digits to Arabic-Indic digits 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * in-place, writing over the input characters. 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Since we know that we are only looking for BMP code points, 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * we can safely just work with code units (again, at least UTF-16). 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_shapeToArabicDigitsWithContext(UChar *s, int32_t length, 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar digitBase, 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool isLogical, UBool lastStrongWasAL) { 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UBiDiProps *bdp; 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar c; 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 34927f654740f2a26ad62a5c155af9199af9e69b889claireho bdp=ubidi_getSingleton(); 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru digitBase-=0x30; 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* the iteration direction depends on the type of input */ 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(isLogical) { 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<length; ++i) { 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c=s[i]; 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch(ubidi_getClass(bdp, c)) { 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_LEFT_TO_RIGHT: /* L */ 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_RIGHT_TO_LEFT: /* R */ 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lastStrongWasAL=FALSE; 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_RIGHT_TO_LEFT_ARABIC: /* AL */ 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lastStrongWasAL=TRUE; 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_EUROPEAN_NUMBER: /* EN */ 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(lastStrongWasAL && (uint32_t)(c-0x30)<10) { 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s[i]=(UChar)(digitBase+c); /* digitBase+(c-0x30) - digitBase was modified above */ 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default : 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=length; i>0; /* pre-decrement in the body */) { 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c=s[--i]; 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch(ubidi_getClass(bdp, c)) { 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_LEFT_TO_RIGHT: /* L */ 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_RIGHT_TO_LEFT: /* R */ 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lastStrongWasAL=FALSE; 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_RIGHT_TO_LEFT_ARABIC: /* AL */ 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lastStrongWasAL=TRUE; 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_EUROPEAN_NUMBER: /* EN */ 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(lastStrongWasAL && (uint32_t)(c-0x30)<10) { 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s[i]=(UChar)(digitBase+c); /* digitBase+(c-0x30) - digitBase was modified above */ 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default : 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Name : invertBuffer 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Function : This function inverts the buffer, it's used 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * in case the user specifies the buffer to be 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * U_SHAPE_TEXT_DIRECTION_LOGICAL 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 40227f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void 403103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusinvertBuffer(UChar *buffer, int32_t size, uint32_t /*options*/, int32_t lowlimit, int32_t highlimit) { 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar temp; 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i=0,j=0; 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=lowlimit,j=size-highlimit-1;i<j;i++,j--) { 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp = buffer[i]; 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[i] = buffer[j]; 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[j] = temp; 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Name : changeLamAlef 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Function : Converts the Alef characters into an equivalent 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * LamAlef location in the 0x06xx Range, this is an 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * intermediate stage in the operation of the program 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * later it'll be converted into the 0xFExx LamAlefs 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * in the shaping function. 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 421103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic inline UChar 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruchangeLamAlef(UChar ch) { 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch(ch) { 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x0622 : 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0x065C; 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x0623 : 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0x065D; 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x0625 : 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0x065E; 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x0627 : 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0x065F; 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Name : getLink 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Function : Resolves the link between the characters as 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Arabic characters have four forms : 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Isolated, Initial, Middle and Final Form 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UChar 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerugetLink(UChar ch) { 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ch >= 0x0622 && ch <= 0x06D3) { 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return(araLink[ch-0x0622]); 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(ch == 0x200D) { 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return(3); 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(ch >= 0x206D && ch <= 0x206F) { 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return(4); 450b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else if(ch >= 0xFB50 && ch <= 0xFC62) { 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return(presALink[ch-0xFB50]); 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(ch >= 0xFE70 && ch <= 0xFEFC) { 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return(presBLink[ch-0xFE70]); 454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else { 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return(0); 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Name : countSpaces 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Function : Counts the number of spaces 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * at each end of the logical buffer 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 465103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliuscountSpaces(UChar *dest, int32_t size, uint32_t /*options*/, int32_t *spacesCountl, int32_t *spacesCountr) { 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t countl = 0,countr = 0; 468103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius while((dest[i] == SPACE_CHAR) && (countl < size)) { 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru countl++; 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i++; 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 472103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (countl < size) { /* the entire buffer is not all space */ 473103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius while(dest[size-1] == SPACE_CHAR) { 474103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius countr++; 475103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius size--; 476103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *spacesCountl = countl; 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *spacesCountr = countr; 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Name : isTashkeelChar 484b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *Function : Returns 1 for Tashkeel characters in 06 range else return 0 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 486103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic inline int32_t 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruisTashkeelChar(UChar ch) { 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (int32_t)( ch>=0x064B && ch<= 0x0652 ); 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 492b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *Name : isTashkeelCharFE 493b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *Function : Returns 1 for Tashkeel characters in FE range else return 0 494b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 495103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic inline int32_t 496b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruisTashkeelCharFE(UChar ch) { 497b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return (int32_t)( ch>=0xFE70 && ch<= 0xFE7F ); 498b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 499b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 500b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Name : isAlefChar 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Function : Returns 1 for Alef characters else return 0 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 504103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic inline int32_t 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruisAlefChar(UChar ch) { 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (int32_t)( (ch==0x0622)||(ch==0x0623)||(ch==0x0625)||(ch==0x0627) ); 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Name : isLamAlefChar 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Function : Returns 1 for LamAlef characters else return 0 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 513103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic inline int32_t 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruisLamAlefChar(UChar ch) { 515b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return (int32_t)((ch>=0xFEF5)&&(ch<=0xFEFC) ); 516b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 517b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 518b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/*BIDI 519b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *Name : isTailChar 520103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius *Function : returns 1 if the character matches one of the tail characters (0xfe73 or 0x200b) otherwise returns 0 521b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 522b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 523103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic inline int32_t 524b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruisTailChar(UChar ch) { 525b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(ch == OLD_TAIL_CHAR || ch == NEW_TAIL_CHAR){ 526b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 1; 527b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else{ 528b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 0; 529b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 530b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 531b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 532b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/*BIDI 533b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *Name : isSeenTailFamilyChar 534103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius *Function : returns 1 if the character is a seen family isolated character 535b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * in the FE range otherwise returns 0 536b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 537b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 538103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic inline int32_t 539b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruisSeenTailFamilyChar(UChar ch) { 540b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(ch >= 0xfeb1 && ch < 0xfebf){ 541b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return tailFamilyIsolatedFinal [ch - 0xFEB1]; 542b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else{ 543b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 0; 544b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 545b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 546b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 547b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* Name : isSeenFamilyChar 548b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Function : returns 1 if the character is a seen family character in the Unicode 549b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * 06 range otherwise returns 0 550b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 552103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic inline int32_t 553b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruisSeenFamilyChar(UChar ch){ 554b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(ch >= 0x633 && ch <= 0x636){ 555b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 1; 556b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else { 557b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 0; 558b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 561b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/*Start of BIDI*/ 562b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* 563b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *Name : isAlefMaksouraChar 564103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius *Function : returns 1 if the character is a Alef Maksoura Final or isolated 565103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * otherwise returns 0 566b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 567103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic inline int32_t 568b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruisAlefMaksouraChar(UChar ch) { 569b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return (int32_t)( (ch == 0xFEEF) || ( ch == 0xFEF0) || (ch == 0x0649)); 570103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 571b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 572b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* 573b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Name : isYehHamzaChar 574b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Function : returns 1 if the character is a yehHamza isolated or yehhamza 575103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * final is found otherwise returns 0 576b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 577103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic inline int32_t 578b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruisYehHamzaChar(UChar ch) { 579b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if((ch==0xFE89)||(ch==0xFE8A)){ 580b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 1; 581b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else{ 582b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 0; 583b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 584103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 585b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 586103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* 587b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Name: isTashkeelOnTatweelChar 588103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Function: Checks if the Tashkeel Character is on Tatweel or not,if the 589103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Tashkeel on tatweel (FE range), it returns 1 else if the 590103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Tashkeel with shadda on tatweel (FC range)return 2 otherwise 591b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * returns 0 592b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 593103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic inline int32_t 594b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruisTashkeelOnTatweelChar(UChar ch){ 595b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(ch >= 0xfe70 && ch <= 0xfe7f && ch != NEW_TAIL_CHAR && ch != 0xFE75 && ch != SHADDA_TATWEEL_CHAR) 596b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { 597b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return tashkeelMedial [ch - 0xFE70]; 598b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else if( (ch >= 0xfcf2 && ch <= 0xfcf4) || (ch == SHADDA_TATWEEL_CHAR)) { 599b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 2; 600b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else{ 601b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 0; 602b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 603b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 604b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 605b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* 606b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Name: isIsolatedTashkeelChar 607103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Function: Checks if the Tashkeel Character is in the isolated form 608103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * (i.e. Unicode FE range) returns 1 else if the Tashkeel 609b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * with shadda is in the isolated form (i.e. Unicode FC range) 610b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * returns 2 otherwise returns 0 611b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 612103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic inline int32_t 613b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruisIsolatedTashkeelChar(UChar ch){ 614b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(ch >= 0xfe70 && ch <= 0xfe7f && ch != NEW_TAIL_CHAR && ch != 0xFE75){ 615b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return (1 - tashkeelMedial [ch - 0xFE70]); 616b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else if(ch >= 0xfc5e && ch <= 0xfc63){ 617b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 1; 618b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else{ 619b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 0; 620b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 621b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 622b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 623b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 624b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 625b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Name : calculateSize 628103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius *Function : This function calculates the destSize to be used in preflighting 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * when the destSize is equal to 0 630103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * It is used also to calculate the new destsize in case the 631b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * destination buffer will be resized. 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 633b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerucalculateSize(const UChar *source, int32_t sourceLength, 636103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusint32_t destSize,uint32_t options) { 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 638103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 639b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int lamAlefOption = 0; 640b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int tashkeelOption = 0; 641b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize = sourceLength; 643103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 644b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (((options&U_SHAPE_LETTERS_MASK) == U_SHAPE_LETTERS_SHAPE || 645b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ((options&U_SHAPE_LETTERS_MASK) == U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED )) && 646b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ((options&U_SHAPE_LAMALEF_MASK) == U_SHAPE_LAMALEF_RESIZE )){ 647b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru lamAlefOption = 1; 648b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 649b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if((options&U_SHAPE_LETTERS_MASK) == U_SHAPE_LETTERS_SHAPE && 650b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ((options&U_SHAPE_TASHKEEL_MASK) == U_SHAPE_TASHKEEL_RESIZE ) ){ 651b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tashkeelOption = 1; 652b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 653103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 654b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(lamAlefOption || tashkeelOption){ 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((options&U_SHAPE_TEXT_DIRECTION_MASK)==U_SHAPE_TEXT_DIRECTION_VISUAL_LTR) { 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0;i<sourceLength;i++) { 657b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if( ((isAlefChar(source[i]))&& (i<(sourceLength-1)) &&(source[i+1] == LAM_CHAR)) || (isTashkeelCharFE(source[i])) ) { 658b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru destSize--; 659b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 661b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else if((options&U_SHAPE_TEXT_DIRECTION_MASK)==U_SHAPE_TEXT_DIRECTION_LOGICAL) { 662b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i=0;i<sourceLength;i++) { 663b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if( ( (source[i] == LAM_CHAR) && (i<(sourceLength-1)) && (isAlefChar(source[i+1]))) || (isTashkeelCharFE(source[i])) ) { 664b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru destSize--; 665b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 669103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 670b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ((options&U_SHAPE_LETTERS_MASK) == U_SHAPE_LETTERS_UNSHAPE){ 671b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( (options&U_SHAPE_LAMALEF_MASK) == U_SHAPE_LAMALEF_RESIZE){ 672b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i=0;i<sourceLength;i++) { 673b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(isLamAlefChar(source[i])) 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize++; 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return destSize; 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 683b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *Name : handleTashkeelWithTatweel 684103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius *Function : Replaces Tashkeel as following: 685103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Case 1 :if the Tashkeel on tatweel, replace it with Tatweel. 686103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Case 2 :if the Tashkeel aggregated with Shadda on Tatweel, replace 687b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * it with Shadda on Tatweel. 688b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Case 3: if the Tashkeel is isolated replace it with Space. 689b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * 690b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 691b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic int32_t 692b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruhandleTashkeelWithTatweel(UChar *dest, int32_t sourceLength, 693103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t /*destSize*/, uint32_t /*options*/, 694103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UErrorCode * /*pErrorCode*/) { 695b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int i; 696b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i = 0; i < sourceLength; i++){ 697b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if((isTashkeelOnTatweelChar(dest[i]) == 1)){ 698b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru dest[i] = TATWEEL_CHAR; 699b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else if((isTashkeelOnTatweelChar(dest[i]) == 2)){ 700b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru dest[i] = SHADDA_TATWEEL_CHAR; 701b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else if(isIsolatedTashkeelChar(dest[i]) && dest[i] != SHADDA_CHAR){ 702b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru dest[i] = SPACE_CHAR; 703b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 704b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 705b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return sourceLength; 706b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 707b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 708b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 709b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 710b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* 711b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *Name : handleGeneratedSpaces 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Function : The shapeUnicode function converts Lam + Alef into LamAlef + space, 713103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * and Tashkeel to space. 714103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * handleGeneratedSpaces function puts these generated spaces 715b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * according to the options the user specifies. LamAlef and Tashkeel 716103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * spaces can be replaced at begin, at end, at near or decrease the 717b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * buffer size. 718b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * 719b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * There is also Auto option for LamAlef and tashkeel, which will put 720103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * the spaces at end of the buffer (or end of text if the user used 721b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * the option U_SHAPE_SPACES_RELATIVE_TO_TEXT_BEGIN_END). 722b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * 723103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * If the text type was visual_LTR and the option 724103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * U_SHAPE_SPACES_RELATIVE_TO_TEXT_BEGIN_END was selected the END 725b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * option will place the space at the beginning of the buffer and 726103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * BEGIN will place the space at the end of the buffer. 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 728b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t 730b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruhandleGeneratedSpaces(UChar *dest, int32_t sourceLength, 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destSize, 73259d709d503bab6e2b61931737e662dd293b40578ccornelius uint32_t options, 73354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode *pErrorCode,struct uShapeVariables shapeVars ) { 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0, j = 0; 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t count = 0; 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *tempbuffer=NULL; 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 739b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int lamAlefOption = 0; 740b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int tashkeelOption = 0; 741b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int shapingMode = SHAPE_MODE; 742b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 743b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (shapingMode == 0){ 744b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( (options&U_SHAPE_LAMALEF_MASK) == U_SHAPE_LAMALEF_RESIZE ){ 745b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru lamAlefOption = 1; 746b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 747b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( (options&U_SHAPE_TASHKEEL_MASK) == U_SHAPE_TASHKEEL_RESIZE ){ 748b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tashkeelOption = 1; 749b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 750b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 751b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 75254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius tempbuffer = (UChar *)uprv_malloc((sourceLength+1)*U_SIZEOF_UCHAR); 75354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* Test for NULL */ 75454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(tempbuffer == NULL) { 75554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *pErrorCode = U_MEMORY_ALLOCATION_ERROR; 75654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return 0; 75754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 75954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 76054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (lamAlefOption || tashkeelOption){ 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memset(tempbuffer, 0, (sourceLength+1)*U_SIZEOF_UCHAR); 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 763b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru i = j = 0; count = 0; 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(i < sourceLength) { 765b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( (lamAlefOption && dest[i] == LAMALEF_SPACE_SUB) || 766103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius (tashkeelOption && dest[i] == TASHKEEL_SPACE_SUB) ){ 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru j--; 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count++; 769b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempbuffer[j] = dest[i]; 771b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i++; 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru j++; 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(count >= 0) { 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempbuffer[i] = 0x0000; 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i--; 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count--; 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcpy(dest, tempbuffer, sourceLength*U_SIZEOF_UCHAR); 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize = u_strlen(dest); 784b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 786b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru lamAlefOption = 0; 787b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 788b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (shapingMode == 0){ 78959d709d503bab6e2b61931737e662dd293b40578ccornelius if ( (options&U_SHAPE_LAMALEF_MASK) == U_SHAPE_LAMALEF_NEAR ){ 790b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru lamAlefOption = 1; 791b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 792b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 793103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 794b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (lamAlefOption){ 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Lam+Alef is already shaped into LamAlef + FFFF */ 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i = 0; 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(i < sourceLength) { 798b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(lamAlefOption&&dest[i] == LAMALEF_SPACE_SUB){ 799b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru dest[i] = SPACE_CHAR; 800b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i++; 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize = sourceLength; 804b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 805b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru lamAlefOption = 0; 806b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tashkeelOption = 0; 807b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 808b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (shapingMode == 0) { 80954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ( ((options&U_SHAPE_LAMALEF_MASK) == shapeVars.uShapeLamalefBegin) || 810b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (((options&U_SHAPE_LAMALEF_MASK) == U_SHAPE_LAMALEF_AUTO ) 81154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius && (shapeVars.spacesRelativeToTextBeginEnd==1)) ) { 812b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru lamAlefOption = 1; 813b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 81454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ( (options&U_SHAPE_TASHKEEL_MASK) == shapeVars.uShapeTashkeelBegin ) { 815b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tashkeelOption = 1; 816b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 817b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 819b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(lamAlefOption || tashkeelOption){ 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memset(tempbuffer, 0, (sourceLength+1)*U_SIZEOF_UCHAR); 82154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 822b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru i = j = sourceLength; count = 0; 82354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(i >= 0) { 825b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( (lamAlefOption && dest[i] == LAMALEF_SPACE_SUB) || 826b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (tashkeelOption && dest[i] == TASHKEEL_SPACE_SUB) ){ 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru j++; 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count++; 829b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else { 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempbuffer[j] = dest[i]; 831b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i--; 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru j--; 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 835103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 836b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i=0 ;i < count; i++){ 837b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tempbuffer[i] = SPACE_CHAR; 838b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 839103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcpy(dest, tempbuffer, sourceLength*U_SIZEOF_UCHAR); 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize = sourceLength; 842b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 84427f654740f2a26ad62a5c155af9199af9e69b889claireho 84527f654740f2a26ad62a5c155af9199af9e69b889claireho 846b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru lamAlefOption = 0; 847b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tashkeelOption = 0; 848b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 849b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (shapingMode == 0) { 85054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ( ((options&U_SHAPE_LAMALEF_MASK) == shapeVars.uShapeLamalefEnd) || 851b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (((options&U_SHAPE_LAMALEF_MASK) == U_SHAPE_LAMALEF_AUTO ) 85254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius && (shapeVars.spacesRelativeToTextBeginEnd==0)) ) { 853b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru lamAlefOption = 1; 854b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 85554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ( (options&U_SHAPE_TASHKEEL_MASK) == shapeVars.uShapeTashkeelEnd ){ 856b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tashkeelOption = 1; 857b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 858b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 859103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 860b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(lamAlefOption || tashkeelOption){ 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memset(tempbuffer, 0, (sourceLength+1)*U_SIZEOF_UCHAR); 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 863b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru i = j = 0; count = 0; 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(i < sourceLength) { 865b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( (lamAlefOption && dest[i] == LAMALEF_SPACE_SUB) || 866b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (tashkeelOption && dest[i] == TASHKEEL_SPACE_SUB) ){ 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru j--; 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count++; 869b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else { 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempbuffer[j] = dest[i]; 871b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i++; 873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru j++; 874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(count >= 0) { 877b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tempbuffer[i] = SPACE_CHAR; 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i--; 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count--; 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcpy(dest,tempbuffer, sourceLength*U_SIZEOF_UCHAR); 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize = sourceLength; 884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 886103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 887b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(tempbuffer){ 888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(tempbuffer); 889b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return destSize; 892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 895b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *Name :expandCompositCharAtBegin 896b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *Function :Expands the LamAlef character to Lam and Alef consuming the required 897103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * space from beginning of the buffer. If the text type was visual_LTR 898b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * and the option U_SHAPE_SPACES_RELATIVE_TO_TEXT_BEGIN_END was selected 899b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * the spaces will be located at end of buffer. 900b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * If there are no spaces to expand the LamAlef, an error 901103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * will be set to U_NO_SPACE_AVAILABLE as defined in utypes.h 902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 904b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic int32_t 905b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruexpandCompositCharAtBegin(UChar *dest, int32_t sourceLength, int32_t destSize,UErrorCode *pErrorCode) { 906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0,j = 0; 907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t countl = 0; 908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *tempbuffer=NULL; 909103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 910b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tempbuffer = (UChar *)uprv_malloc((sourceLength+1)*U_SIZEOF_UCHAR); 911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 912b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* Test for NULL */ 913b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(tempbuffer == NULL) { 914b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *pErrorCode = U_MEMORY_ALLOCATION_ERROR; 915b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 0; 916b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memset(tempbuffer, 0, (sourceLength+1)*U_SIZEOF_UCHAR); 919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i = 0; 921b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru while(dest[i] == SPACE_CHAR) { 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru countl++; 923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i++; 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i = j = sourceLength-1; 927103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(i >= 0 && j >= 0) { 929b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if( countl>0 && isLamAlefChar(dest[i])) { 930b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tempbuffer[j] = LAM_CHAR; 931103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* to ensure the array index is within the range */ 932103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius U_ASSERT(dest[i] >= 0xFEF5u 933103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius && dest[i]-0xFEF5u < sizeof(convertLamAlef)/sizeof(convertLamAlef[0])); 934b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tempbuffer[j-1] = convertLamAlef[ dest[i] - 0xFEF5 ]; 935b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru j--; 936b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru countl--; 937b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else { 938b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if( countl == 0 && isLamAlefChar(dest[i]) ) { 939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pErrorCode=U_NO_SPACE_AVAILABLE; 940b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempbuffer[j] = dest[i]; 942b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 943b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru i--; 944b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru j--; 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcpy(dest, tempbuffer, sourceLength*U_SIZEOF_UCHAR); 947103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 948b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uprv_free(tempbuffer); 949103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destSize = sourceLength; 951b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return destSize; 952b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 954b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* 955b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *Name : expandCompositCharAtEnd 956103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius *Function : Expands the LamAlef character to Lam and Alef consuming the 957b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * required space from end of the buffer. If the text type was 958b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Visual LTR and the option U_SHAPE_SPACES_RELATIVE_TO_TEXT_BEGIN_END 959103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * was used, the spaces will be consumed from begin of buffer. If 960b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * there are no spaces to expand the LamAlef, an error 961103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * will be set to U_NO_SPACE_AVAILABLE as defined in utypes.h 962b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 964b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic int32_t 965b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruexpandCompositCharAtEnd(UChar *dest, int32_t sourceLength, int32_t destSize,UErrorCode *pErrorCode) { 966b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t i = 0,j = 0; 967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 968b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t countr = 0; 969b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t inpsize = sourceLength; 970b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 971b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar *tempbuffer=NULL; 972b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tempbuffer = (UChar *)uprv_malloc((sourceLength+1)*U_SIZEOF_UCHAR); 973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 974b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* Test for NULL */ 975b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(tempbuffer == NULL) { 976b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *pErrorCode = U_MEMORY_ALLOCATION_ERROR; 977b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 0; 978b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 979103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 980b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uprv_memset(tempbuffer, 0, (sourceLength+1)*U_SIZEOF_UCHAR); 981103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 982b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru while(dest[inpsize-1] == SPACE_CHAR) { 983b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru countr++; 984b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru inpsize--; 985b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 986103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 987b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru i = sourceLength - countr - 1; 988b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru j = sourceLength - 1; 989103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 990b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru while(i >= 0 && j >= 0) { 991b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if( countr>0 && isLamAlefChar(dest[i]) ) { 992b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tempbuffer[j] = LAM_CHAR; 993b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tempbuffer[j-1] = convertLamAlef[ dest[i] - 0xFEF5 ]; 994b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru j--; 995b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru countr--; 996b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else { 997b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ((countr == 0) && isLamAlefChar(dest[i]) ) { 998b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *pErrorCode=U_NO_SPACE_AVAILABLE; 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1000b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tempbuffer[j] = dest[i]; 1001b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1002b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru i--; 1003b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru j--; 1004b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1005103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1006b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(countr > 0) { 1007b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uprv_memmove(tempbuffer, tempbuffer+countr, sourceLength*U_SIZEOF_UCHAR); 1008b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(u_strlen(tempbuffer) < sourceLength) { 1009b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i=sourceLength-1;i>=sourceLength-countr;i--) { 1010b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tempbuffer[i] = SPACE_CHAR; 1011b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1012b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1013b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1014b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uprv_memcpy(dest, tempbuffer, sourceLength*U_SIZEOF_UCHAR); 1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1016b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uprv_free(tempbuffer); 1017103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1018b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru destSize = sourceLength; 1019b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return destSize; 1020b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 1021b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1022b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* 1023b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *Name : expandCompositCharAtNear 1024b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *Function : Expands the LamAlef character into Lam + Alef, YehHamza character 1025103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * into Yeh + Hamza, SeenFamily character into SeenFamily character 1026103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * + Tail, while consuming the space next to the character. 1027b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * If there are no spaces next to the character, an error 1028103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * will be set to U_NO_SPACE_AVAILABLE as defined in utypes.h 1029b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 1030b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1031b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic int32_t 1032b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruexpandCompositCharAtNear(UChar *dest, int32_t sourceLength, int32_t destSize,UErrorCode *pErrorCode, 103354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int yehHamzaOption, int seenTailOption, int lamAlefOption, struct uShapeVariables shapeVars) { 1034b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t i = 0; 1035b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1036b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1037b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar lamalefChar, yehhamzaChar; 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1039b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i = 0 ;i<=sourceLength-1;i++) { 1040b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (seenTailOption && isSeenTailFamilyChar(dest[i])) { 1041b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ((i>0) && (dest[i-1] == SPACE_CHAR) ) { 104254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius dest[i-1] = shapeVars.tailChar; 1043b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else { 1044b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *pErrorCode=U_NO_SPACE_AVAILABLE; 1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1046b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else if(yehHamzaOption && (isYehHamzaChar(dest[i])) ) { 1047b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ((i>0) && (dest[i-1] == SPACE_CHAR) ) { 1048b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru yehhamzaChar = dest[i]; 1049b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru dest[i] = yehHamzaToYeh[yehhamzaChar - YEH_HAMZAFE_CHAR]; 1050b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru dest[i-1] = HAMZAFE_CHAR; 1051b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else { 1052103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1053b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *pErrorCode=U_NO_SPACE_AVAILABLE; 1054b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1055b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else if(lamAlefOption && isLamAlefChar(dest[i+1])) { 1056b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(dest[i] == SPACE_CHAR){ 1057b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru lamalefChar = dest[i+1]; 1058b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru dest[i+1] = LAM_CHAR; 1059b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru dest[i] = convertLamAlef[ lamalefChar - 0xFEF5 ]; 1060b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else { 1061b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *pErrorCode=U_NO_SPACE_AVAILABLE; 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1064b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1065b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru destSize = sourceLength; 1066b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return destSize; 1067b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 1068103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* 1069b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Name : expandCompositChar 1070103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Function : LamAlef, need special handling, since it expands from one 1071103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * character into two characters while shaping or deshaping. 1072b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * In order to expand it, near or far spaces according to the 1073b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * options user specifies. Also buffer size can be increased. 1074b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * 1075b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * For SeenFamily characters and YehHamza only the near option is 1076b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * supported, while for LamAlef we can take spaces from begin, end, 1077b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * near or even increase the buffer size. 1078103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * There is also the Auto option for LamAlef only, which will first 1079b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * search for a space at end, begin then near, respectively. 1080103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * If there are no spaces to expand these characters, an error will be set to 1081103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * U_NO_SPACE_AVAILABLE as defined in utypes.h 1082b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 1083103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1084b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic int32_t 1085b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruexpandCompositChar(UChar *dest, int32_t sourceLength, 1086103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t destSize,uint32_t options, 108754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode *pErrorCode, int shapingMode,struct uShapeVariables shapeVars) { 1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1089b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t i = 0,j = 0; 1090b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1091b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar *tempbuffer=NULL; 1092b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int yehHamzaOption = 0; 1093b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int seenTailOption = 0; 1094b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int lamAlefOption = 0; 1095103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1096b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (shapingMode == 1){ 1097b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( (options&U_SHAPE_LAMALEF_MASK) == U_SHAPE_LAMALEF_AUTO){ 1098103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 109954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(shapeVars.spacesRelativeToTextBeginEnd == 0) { 1100b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru destSize = expandCompositCharAtEnd(dest, sourceLength, destSize, pErrorCode); 1101103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1102b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(*pErrorCode == U_NO_SPACE_AVAILABLE) { 1103b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *pErrorCode = U_ZERO_ERROR; 1104b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru destSize = expandCompositCharAtBegin(dest, sourceLength, destSize, pErrorCode); 1105b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1106b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else { 1107b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru destSize = expandCompositCharAtBegin(dest, sourceLength, destSize, pErrorCode); 1108103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1109b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(*pErrorCode == U_NO_SPACE_AVAILABLE) { 1110b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *pErrorCode = U_ZERO_ERROR; 1111b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru destSize = expandCompositCharAtEnd(dest, sourceLength, destSize, pErrorCode); 1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1114103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1115b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(*pErrorCode == U_NO_SPACE_AVAILABLE) { 1116b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *pErrorCode = U_ZERO_ERROR; 1117103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius destSize = expandCompositCharAtNear(dest, sourceLength, destSize, pErrorCode, yehHamzaOption, 111854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius seenTailOption, 1,shapeVars); 1119b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1120b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1121b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1123b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (shapingMode == 1){ 112454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ( (options&U_SHAPE_LAMALEF_MASK) == shapeVars.uShapeLamalefEnd){ 1125b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru destSize = expandCompositCharAtEnd(dest, sourceLength, destSize, pErrorCode); 1126b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1127b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1129b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (shapingMode == 1){ 113054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ( (options&U_SHAPE_LAMALEF_MASK) == shapeVars.uShapeLamalefBegin){ 1131b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru destSize = expandCompositCharAtBegin(dest, sourceLength, destSize, pErrorCode); 1132b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1133b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1134103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (shapingMode == 0){ 1136b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ((options&U_SHAPE_YEHHAMZA_MASK) == U_SHAPE_YEHHAMZA_TWOCELL_NEAR){ 1137b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru yehHamzaOption = 1; 1138b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1139b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ((options&U_SHAPE_SEEN_MASK) == U_SHAPE_SEEN_TWOCELL_NEAR){ 1140b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru seenTailOption = 1; 1141b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1143b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (shapingMode == 1) { 1144b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( (options&U_SHAPE_LAMALEF_MASK) == U_SHAPE_LAMALEF_NEAR) { 1145b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru lamAlefOption = 1; 1146b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1150b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (yehHamzaOption || seenTailOption || lamAlefOption){ 1151103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius destSize = expandCompositCharAtNear(dest, sourceLength, destSize, pErrorCode, yehHamzaOption, 115254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius seenTailOption,lamAlefOption,shapeVars); 1153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1154103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1155103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1156b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (shapingMode == 1){ 1157b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( (options&U_SHAPE_LAMALEF_MASK) == U_SHAPE_LAMALEF_RESIZE){ 1158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru destSize = calculateSize(dest,sourceLength,destSize,options); 1159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tempbuffer = (UChar *)uprv_malloc((destSize+1)*U_SIZEOF_UCHAR); 1160103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* Test for NULL */ 1162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(tempbuffer == NULL) { 1163b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *pErrorCode = U_MEMORY_ALLOCATION_ERROR; 1164b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 0; 1165b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1166103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1167b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uprv_memset(tempbuffer, 0, (destSize+1)*U_SIZEOF_UCHAR); 1168103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1169b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru i = j = 0; 1170b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru while(i < destSize && j < destSize) { 1171b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(isLamAlefChar(dest[i]) ) { 1172b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tempbuffer[j] = convertLamAlef[ dest[i] - 0xFEF5 ]; 1173b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tempbuffer[j+1] = LAM_CHAR; 1174b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru j++; 1175b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else { 1176b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tempbuffer[j] = dest[i]; 1177b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1178b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru i++; 1179b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru j++; 1180b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1181103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1182b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uprv_memcpy(dest, tempbuffer, destSize*U_SIZEOF_UCHAR); 1183b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1184b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1185103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1186b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(tempbuffer) { 1187b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uprv_free(tempbuffer); 1188b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return destSize; 1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Name : shapeUnicode 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Function : Converts an Arabic Unicode buffer in 06xx Range into a shaped 1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * arabic Unicode buffer in FExx Range 1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t 1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerushapeUnicode(UChar *dest, int32_t sourceLength, 1199103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t destSize,uint32_t options, 1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *pErrorCode, 120154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int tashkeelFlag, struct uShapeVariables shapeVars) { 1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, iend; 1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t step; 1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t lastPos,Nx, Nw; 1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru unsigned int Shape; 1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t lamalef_found = 0; 1208b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t seenfamFound = 0, yehhamzaFound =0, tashkeelFound = 0; 1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar prevLink = 0, lastLink = 0, currLink, nextLink = 0; 1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar wLamalef; 1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Converts the input buffer from FExx Range into 06xx Range 1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * to make sure that all characters are in the 06xx range 1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * even the lamalef is converted to the special region in 1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the 06xx range 1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((options & U_SHAPE_PRESERVE_PRESENTATION_MASK) == U_SHAPE_PRESERVE_PRESENTATION_NOOP) { 1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < sourceLength; i++) { 1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar inputChar = dest[i]; 1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( (inputChar >= 0xFB50) && (inputChar <= 0xFBFF)) { 1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar c = convertFBto06 [ (inputChar - 0xFB50) ]; 1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c != 0) 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[i] = c; 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if ( (inputChar >= 0xFE70) && (inputChar <= 0xFEFC)) { 1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[i] = convertFEto06 [ (inputChar - 0xFE70) ] ; 1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[i] = inputChar ; 1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* sets the index to the end of the buffer, together with the step point to -1 */ 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i = sourceLength - 1; 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iend = -1; 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru step = -1; 1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This function resolves the link between the characters . 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Arabic characters have four forms : 1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Isolated Form, Initial Form, Middle Form and Final Form 1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru currLink = getLink(dest[i]); 1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lastPos = i; 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Nx = -2, Nw = 0; 1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (i != iend) { 1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* If high byte of currLink > 0 then more than one shape */ 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((currLink & 0xFF00) > 0 || (getLink(dest[i]) & IRRELEVANT) != 0) { 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Nw = i + step; 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (Nx < 0) { /* we need to know about next char */ 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(Nw == iend) { 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nextLink = 0; 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Nx = 3000; 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nextLink = getLink(dest[Nw]); 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((nextLink & IRRELEVANT) == 0) { 1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Nx = Nw; 1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Nw = Nw + step; 1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( ((currLink & ALEFTYPE) > 0) && ((lastLink & LAMTYPE) > 0) ) { 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lamalef_found = 1; 1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wLamalef = changeLamAlef(dest[i]); /*get from 0x065C-0x065f */ 1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( wLamalef != 0) { 1271b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru dest[i] = LAMALEF_SPACE_SUB; /* The default case is to drop the Alef and replace */ 1272b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru dest[lastPos] =wLamalef; /* it by LAMALEF_SPACE_SUB which is the last character in the */ 1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i=lastPos; /* unicode private use area, this is done to make */ 1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } /* sure that removeLamAlefSpaces() handles only the */ 1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lastLink = prevLink; /* spaces generated during lamalef generation. */ 1276b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru currLink = getLink(wLamalef); /* LAMALEF_SPACE_SUB is added here and is replaced by spaces */ 1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } /* in removeLamAlefSpaces() */ 1278103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 127954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ((i > 0) && (dest[i-1] == SPACE_CHAR)){ 128054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ( isSeenFamilyChar(dest[i])) { 1281b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru seenfamFound = 1; 1282b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else if (dest[i] == YEH_HAMZA_CHAR) { 1283b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru yehhamzaFound = 1; 1284b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 128554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 128654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius else if(i==0){ 128754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ( isSeenFamilyChar(dest[i])){ 1288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru seenfamFound = 1; 1289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else if (dest[i] == YEH_HAMZA_CHAR) { 1290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru yehhamzaFound = 1; 1291b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 129254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 1293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1294103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* 1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * get the proper shape according to link ability of neighbors 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and of character; depends on the order of the shapes 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (isolated, initial, middle, final) in the compatibility area 1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Shape = shapeTable[nextLink & (LINKR + LINKL)] 1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru [lastLink & (LINKR + LINKL)] 1301103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius [currLink & (LINKR + LINKL)]; 1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((currLink & (LINKR+LINKL)) == 1) { 1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Shape &= 1; 1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(isTashkeelChar(dest[i])) { 1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( (lastLink & LINKL) && (nextLink & LINKR) && (tashkeelFlag == 1) && 1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[i] != 0x064C && dest[i] != 0x064D ) 1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1309103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius Shape = 1; 1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( (nextLink&ALEFTYPE) == ALEFTYPE && (lastLink&LAMTYPE) == LAMTYPE ) { 1311103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius Shape = 0; 1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 131354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(tashkeelFlag == 2 && dest[i] == SHADDA06_CHAR){ 131454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius Shape = 1; 131554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Shape = 0; 1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((dest[i] ^ 0x0600) < 0x100) { 1320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( isTashkeelChar(dest[i]) ){ 132154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (tashkeelFlag == 2 && dest[i] != SHADDA06_CHAR){ 1322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru dest[i] = TASHKEEL_SPACE_SUB; 1323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tashkeelFound = 1; 1324103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 1325103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* to ensure the array index is within the range */ 1326103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius U_ASSERT(dest[i] >= 0x064Bu 1327103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius && dest[i]-0x064Bu < sizeof(IrrelevantPos)/sizeof(IrrelevantPos[0])); 1328103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius dest[i] = 0xFE70 + IrrelevantPos[(dest[i] - 0x064B)] + Shape; 1329b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1330b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else if ((currLink & APRESENT) > 0) { 1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[i] = (UChar)(0xFB50 + (currLink >> 8) + Shape); 1332b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else if ((currLink >> 8) > 0 && (currLink & IRRELEVANT) == 0) { 1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[i] = (UChar)(0xFE70 + (currLink >> 8) + Shape); 1334b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* move one notch forward */ 1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((currLink & IRRELEVANT) == 0) { 1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prevLink = lastLink; 1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lastLink = currLink; 1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lastPos = i; 1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i = i + step; 1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i == Nx) { 1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru currLink = nextLink; 1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Nx = -2; 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(i != iend) { 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru currLink = getLink(dest[i]); 1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1353b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru destSize = sourceLength; 1354b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( (lamalef_found != 0 ) || (tashkeelFound != 0) ){ 135554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius destSize = handleGeneratedSpaces(dest,sourceLength,destSize,options,pErrorCode, shapeVars); 1356b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1358b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( (seenfamFound != 0) || (yehhamzaFound != 0) ) { 135954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius destSize = expandCompositChar(dest, sourceLength,destSize,options,pErrorCode, SHAPE_MODE,shapeVars); 1360b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return destSize; 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Name : deShapeUnicode 1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *Function : Converts an Arabic Unicode buffer in FExx Range into unshaped 1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * arabic Unicode buffer in 06xx Range 1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t 1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudeShapeUnicode(UChar *dest, int32_t sourceLength, 1371103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t destSize,uint32_t options, 137254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode *pErrorCode, struct uShapeVariables shapeVars) { 1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t lamalef_found = 0; 1375b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t yehHamzaComposeEnabled = 0; 1376b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t seenComposeEnabled = 0; 1377b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1378b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru yehHamzaComposeEnabled = ((options&U_SHAPE_YEHHAMZA_MASK) == U_SHAPE_YEHHAMZA_TWOCELL_NEAR) ? 1 : 0; 1379b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru seenComposeEnabled = ((options&U_SHAPE_SEEN_MASK) == U_SHAPE_SEEN_TWOCELL_NEAR)? 1 : 0; 1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *This for loop changes the buffer from the Unicode FE range to 1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *the Unicode 06 range 1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1385103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < sourceLength; i++) { 1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar inputChar = dest[i]; 1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( (inputChar >= 0xFB50) && (inputChar <= 0xFBFF)) { /* FBxx Arabic range */ 1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar c = convertFBto06 [ (inputChar - 0xFB50) ]; 1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c != 0) 1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[i] = c; 1392103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if( (yehHamzaComposeEnabled == 1) && ((inputChar == HAMZA06_CHAR) || (inputChar == HAMZAFE_CHAR)) 1393b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru && (i < (sourceLength - 1)) && isAlefMaksouraChar(dest[i+1] )) { 1394b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru dest[i] = SPACE_CHAR; 1395b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru dest[i+1] = YEH_HAMZA_CHAR; 1396103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if ( (seenComposeEnabled == 1) && (isTailChar(inputChar)) && (i< (sourceLength - 1)) 1397b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru && (isSeenTailFamilyChar(dest[i+1])) ) { 1398b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru dest[i] = SPACE_CHAR; 1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (( inputChar >= 0xFE70) && (inputChar <= 0xFEF4 )) { /* FExx Arabic range */ 1400b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru dest[i] = convertFEto06 [ (inputChar - 0xFE70) ]; 1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[i] = inputChar ; 1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1404b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( isLamAlefChar(dest[i]) ) 1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lamalef_found = 1; 1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1408103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1409b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru destSize = sourceLength; 1410b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (lamalef_found != 0){ 141154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius destSize = expandCompositChar(dest,sourceLength,destSize,options,pErrorCode,DESHAPE_MODE, shapeVars); 1412b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1413b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return destSize; 1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1416103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/* 1417b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru **************************************** 1418b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * u_shapeArabic 1419b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru **************************************** 1420103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 1421b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_shapeArabic(const UChar *source, int32_t sourceLength, 1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *dest, int32_t destCapacity, 142559d709d503bab6e2b61931737e662dd293b40578ccornelius uint32_t options, 142627f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *pErrorCode) { 1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destLength; 142954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius struct uShapeVariables shapeVars = { OLD_TAIL_CHAR,U_SHAPE_LAMALEF_BEGIN,U_SHAPE_LAMALEF_END,U_SHAPE_TASHKEEL_BEGIN,U_SHAPE_TASHKEEL_END,0}; 1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* usual error checking */ 1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { 1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* make sure that no reserved options values are used; allow dest==NULL only for preflighting */ 1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( source==NULL || sourceLength<-1 || (dest==NULL && destCapacity!=0) || destCapacity<0 || 1438b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (((options&U_SHAPE_TASHKEEL_MASK) > 0) && 1439b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ((options&U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED) == U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED) ) || 1440b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (((options&U_SHAPE_TASHKEEL_MASK) > 0) && 1441b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ((options&U_SHAPE_LETTERS_MASK) == U_SHAPE_LETTERS_UNSHAPE)) || 1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (options&U_SHAPE_DIGIT_TYPE_RESERVED)==U_SHAPE_DIGIT_TYPE_RESERVED || 1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (options&U_SHAPE_DIGITS_MASK)==U_SHAPE_DIGITS_RESERVED || 1444b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ((options&U_SHAPE_LAMALEF_MASK) != U_SHAPE_LAMALEF_RESIZE && 1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (options&U_SHAPE_AGGREGATE_TASHKEEL_MASK) != 0) || 1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((options&U_SHAPE_AGGREGATE_TASHKEEL_MASK) == U_SHAPE_AGGREGATE_TASHKEEL && 1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (options&U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED) != U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED) 1448103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ) 1449b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { 1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; 1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 145354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* Validate lamalef options */ 145454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(((options&U_SHAPE_LAMALEF_MASK) > 0)&& 1455b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru !(((options & U_SHAPE_LAMALEF_MASK)==U_SHAPE_LAMALEF_BEGIN) || 1456b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ((options & U_SHAPE_LAMALEF_MASK)==U_SHAPE_LAMALEF_END ) || 1457b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ((options & U_SHAPE_LAMALEF_MASK)==U_SHAPE_LAMALEF_RESIZE )|| 1458b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ((options & U_SHAPE_LAMALEF_MASK)==U_SHAPE_LAMALEF_AUTO) || 1459b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ((options & U_SHAPE_LAMALEF_MASK)==U_SHAPE_LAMALEF_NEAR))) 146054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius { 146154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; 1462b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 0; 146354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 146454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* Validate Tashkeel options */ 146554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(((options&U_SHAPE_TASHKEEL_MASK) > 0)&& 1466b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru !(((options & U_SHAPE_TASHKEEL_MASK)==U_SHAPE_TASHKEEL_BEGIN) || 1467b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ((options & U_SHAPE_TASHKEEL_MASK)==U_SHAPE_TASHKEEL_END ) 1468b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ||((options & U_SHAPE_TASHKEEL_MASK)==U_SHAPE_TASHKEEL_RESIZE )|| 146954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ((options & U_SHAPE_TASHKEEL_MASK)==U_SHAPE_TASHKEEL_REPLACE_BY_TATWEEL))) 147054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius { 147154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; 1472b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 0; 147354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* determine the source length */ 1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(sourceLength==-1) { 1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sourceLength=u_strlen(source); 1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(sourceLength<=0) { 1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return u_terminateUChars(dest, destCapacity, 0, pErrorCode); 1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check that source and destination do not overlap */ 1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( dest!=NULL && 1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((source<=dest && dest<source+sourceLength) || 1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (dest<=source && source<dest+destCapacity))) { 1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; 1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1489103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1490b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* Does Options contain the new Seen Tail Unicode code point option */ 1491b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( (options&U_SHAPE_TAIL_TYPE_MASK) == U_SHAPE_TAIL_NEW_UNICODE){ 149254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius shapeVars.tailChar = NEW_TAIL_CHAR; 1493b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else { 149454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius shapeVars.tailChar = OLD_TAIL_CHAR; 1495b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((options&U_SHAPE_LETTERS_MASK)!=U_SHAPE_LETTERS_NOOP) { 1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer[300]; 1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *tempbuffer, *tempsource = NULL; 1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t outputSize, spacesCountl=0, spacesCountr=0; 1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((options&U_SHAPE_AGGREGATE_TASHKEEL_MASK)>0) { 1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t logical_order = (options&U_SHAPE_TEXT_DIRECTION_MASK) == U_SHAPE_TEXT_DIRECTION_LOGICAL; 1504103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t aggregate_tashkeel = 1505103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius (options&(U_SHAPE_AGGREGATE_TASHKEEL_MASK+U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED)) == 1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (U_SHAPE_AGGREGATE_TASHKEEL+U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED); 1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int step=logical_order?1:-1; 1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int j=logical_order?-1:2*sourceLength; 1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i=logical_order?-1:sourceLength; 1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int end=logical_order?sourceLength:-1; 1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int aggregation_possible = 1; 1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar prev = 0; 1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar prevLink, currLink = 0; 1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int newSourceLength = 0; 1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempsource = (UChar *)uprv_malloc(2*sourceLength*U_SIZEOF_UCHAR); 1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(tempsource == NULL) { 1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pErrorCode = U_MEMORY_ALLOCATION_ERROR; 1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while ((i+=step) != end) { 1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prevLink = currLink; 1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru currLink = getLink(source[i]); 1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (aggregate_tashkeel && ((prevLink|currLink)&COMBINE) == COMBINE && aggregation_possible) { 1525103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius aggregation_possible = 0; 1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempsource[j] = (prev<source[i]?prev:source[i])-0x064C+0xFC5E; 1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru currLink = getLink(tempsource[j]); 1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aggregation_possible = 1; 1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempsource[j+=step] = source[i]; 1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prev = source[i]; 1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru newSourceLength++; 1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source = tempsource+(logical_order?0:j); 1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sourceLength = newSourceLength; 1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* calculate destination size */ 1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* TODO: do we ever need to do this pure preflighting? */ 1541103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(((options&U_SHAPE_LAMALEF_MASK)==U_SHAPE_LAMALEF_RESIZE) || 1542b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ((options&U_SHAPE_TASHKEEL_MASK)==U_SHAPE_TASHKEEL_RESIZE)) { 1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru outputSize=calculateSize(source,sourceLength,destCapacity,options); 1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru outputSize=sourceLength; 1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1547b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(outputSize>destCapacity) { 1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pErrorCode=U_BUFFER_OVERFLOW_ERROR; 1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tempsource != NULL) uprv_free(tempsource); 1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return outputSize; 1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * need a temporary buffer of size max(outputSize, sourceLength) 1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * because at first we copy source->temp 1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(sourceLength>outputSize) { 1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru outputSize=sourceLength; 1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Start of Arabic letter shaping part */ 1563103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(outputSize<=LENGTHOF(buffer)) { 1564103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius outputSize=LENGTHOF(buffer); 1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempbuffer=buffer; 1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempbuffer = (UChar *)uprv_malloc(outputSize*U_SIZEOF_UCHAR); 1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*Test for NULL*/ 1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(tempbuffer == NULL) { 1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pErrorCode = U_MEMORY_ALLOCATION_ERROR; 1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tempsource != NULL) uprv_free(tempsource); 1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcpy(tempbuffer, source, sourceLength*U_SIZEOF_UCHAR); 1577b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (tempsource != NULL){ 1578b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uprv_free(tempsource); 1579b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1580b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(sourceLength<outputSize) { 1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memset(tempbuffer+sourceLength, 0, (outputSize-sourceLength)*U_SIZEOF_UCHAR); 1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((options&U_SHAPE_TEXT_DIRECTION_MASK) == U_SHAPE_TEXT_DIRECTION_LOGICAL) { 1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru countSpaces(tempbuffer,sourceLength,options,&spacesCountl,&spacesCountr); 1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru invertBuffer(tempbuffer,sourceLength,options,spacesCountl,spacesCountr); 1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1590b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if((options&U_SHAPE_TEXT_DIRECTION_MASK) == U_SHAPE_TEXT_DIRECTION_VISUAL_LTR) { 1591b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if((options&U_SHAPE_SPACES_RELATIVE_TO_TEXT_MASK) == U_SHAPE_SPACES_RELATIVE_TO_TEXT_BEGIN_END) { 159254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius shapeVars.spacesRelativeToTextBeginEnd = 1; 159354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius shapeVars.uShapeLamalefBegin = U_SHAPE_LAMALEF_END; 159454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius shapeVars.uShapeLamalefEnd = U_SHAPE_LAMALEF_BEGIN; 159554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius shapeVars.uShapeTashkeelBegin = U_SHAPE_TASHKEEL_END; 159654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius shapeVars.uShapeTashkeelEnd = U_SHAPE_TASHKEEL_BEGIN; 1597b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1598b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1599b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch(options&U_SHAPE_LETTERS_MASK) { 1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_SHAPE_LETTERS_SHAPE : 1602103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if( (options&U_SHAPE_TASHKEEL_MASK)> 0 1603b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru && ((options&U_SHAPE_TASHKEEL_MASK) !=U_SHAPE_TASHKEEL_REPLACE_BY_TATWEEL)) { 1604b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* Call the shaping function with tashkeel flag == 2 for removal of tashkeel */ 160554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius destLength = shapeUnicode(tempbuffer,sourceLength,destCapacity,options,pErrorCode,2,shapeVars); 1606b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }else { 1607b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* default Call the shaping function with tashkeel flag == 1 */ 160854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius destLength = shapeUnicode(tempbuffer,sourceLength,destCapacity,options,pErrorCode,1,shapeVars); 1609b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1610b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /*After shaping text check if user wants to remove tashkeel and replace it with tatweel*/ 1611b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if( (options&U_SHAPE_TASHKEEL_MASK) == U_SHAPE_TASHKEEL_REPLACE_BY_TATWEEL){ 1612b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru destLength = handleTashkeelWithTatweel(tempbuffer,destLength,destCapacity,options,pErrorCode); 1613b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1614b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED : 1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Call the shaping function with tashkeel flag == 0 */ 161854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius destLength = shapeUnicode(tempbuffer,sourceLength,destCapacity,options,pErrorCode,0,shapeVars); 1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1620b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_SHAPE_LETTERS_UNSHAPE : 1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Call the deshaping function */ 162354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius destLength = deShapeUnicode(tempbuffer,sourceLength,destCapacity,options,pErrorCode,shapeVars); 1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default : 1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* will never occur because of validity checks above */ 1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength = 0; 1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * TODO: (markus 2002aug01) 1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * For as long as we always preflight the outputSize above 1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * we should U_ASSERT(outputSize==destLength) 1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * except for the adjustment above before the tempbuffer allocation 1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((options&U_SHAPE_TEXT_DIRECTION_MASK) == U_SHAPE_TEXT_DIRECTION_LOGICAL) { 1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru countSpaces(tempbuffer,destLength,options,&spacesCountl,&spacesCountr); 1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru invertBuffer(tempbuffer,destLength,options,spacesCountl,spacesCountr); 1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcpy(dest, tempbuffer, uprv_min(destLength, destCapacity)*U_SIZEOF_UCHAR); 1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(tempbuffer!=buffer) { 1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(tempbuffer); 1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(destLength>destCapacity) { 1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pErrorCode=U_BUFFER_OVERFLOW_ERROR; 1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return destLength; 1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* End of Arabic letter shaping part */ 1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * No letter shaping: 1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * just make sure the destination is large enough and copy the string. 1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(destCapacity<sourceLength) { 1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* this catches preflighting, too */ 1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pErrorCode=U_BUFFER_OVERFLOW_ERROR; 1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return sourceLength; 1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcpy(dest, source, sourceLength*U_SIZEOF_UCHAR); 1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=sourceLength; 1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Perform number shaping. 1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * With UTF-16 or UTF-32, the length of the string is constant. 1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The easiest way to do this is to operate on the destination and 1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * "shape" the digits in-place. 1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((options&U_SHAPE_DIGITS_MASK)!=U_SHAPE_DIGITS_NOOP) { 1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar digitBase; 1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* select the requested digit group */ 1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch(options&U_SHAPE_DIGIT_TYPE_MASK) { 1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_SHAPE_DIGIT_TYPE_AN: 1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru digitBase=0x660; /* Unicode: "Arabic-Indic digits" */ 1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_SHAPE_DIGIT_TYPE_AN_EXTENDED: 1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru digitBase=0x6f0; /* Unicode: "Eastern Arabic-Indic digits (Persian and Urdu)" */ 1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* will never occur because of validity checks above */ 1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru digitBase=0; 1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* perform the requested operation */ 1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch(options&U_SHAPE_DIGITS_MASK) { 1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_SHAPE_DIGITS_EN2AN: 1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* add (digitBase-'0') to each European (ASCII) digit code point */ 1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru digitBase-=0x30; 1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<destLength; ++i) { 1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(((uint32_t)dest[i]-0x30)<10) { 1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[i]+=digitBase; 1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_SHAPE_DIGITS_AN2EN: 1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* subtract (digitBase-'0') from each Arabic digit code point */ 1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i<destLength; ++i) { 1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(((uint32_t)dest[i]-(uint32_t)digitBase)<10) { 1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[i]-=digitBase-0x30; 1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_SHAPE_DIGITS_ALEN2AN_INIT_LR: 1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _shapeToArabicDigitsWithContext(dest, destLength, 1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru digitBase, 1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (UBool)((options&U_SHAPE_TEXT_DIRECTION_MASK)==U_SHAPE_TEXT_DIRECTION_LOGICAL), 1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FALSE); 1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_SHAPE_DIGITS_ALEN2AN_INIT_AL: 1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _shapeToArabicDigitsWithContext(dest, destLength, 1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru digitBase, 1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (UBool)((options&U_SHAPE_TEXT_DIRECTION_MASK)==U_SHAPE_TEXT_DIRECTION_LOGICAL), 1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TRUE); 1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* will never occur because of validity checks above */ 1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return u_terminateUChars(dest, destCapacity, destLength, pErrorCode); 1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1731