mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-08 04:27:37 +00:00
296 lines
6.8 KiB
C++
296 lines
6.8 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
* for the specific language governing rights and limitations under the
|
|
* License.
|
|
*
|
|
* The Original Code is Mozilla Communicator client code.
|
|
*
|
|
* The Initial Developer of the Original Code is
|
|
* Netscape Communications Corporation.
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
* use your version of this file under the terms of the MPL, indicate your
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
* the provisions above, a recipient may use your version of this file under
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
*
|
|
* ***** END LICENSE BLOCK ***** */
|
|
|
|
|
|
#include "nsUCConstructors.h"
|
|
#include "nsUnicodeToLangBoxArabic8.h"
|
|
|
|
#include "nsISupports.h"
|
|
|
|
static const unsigned char uni2lbox [] =
|
|
{
|
|
0xC1, /* FE80 */
|
|
0xC2 ,
|
|
0xC2 ,
|
|
0xC3 ,
|
|
0xC3 ,
|
|
0xC4 ,
|
|
0xC4 ,
|
|
0xC5 ,
|
|
0xC5 ,
|
|
0x9F ,
|
|
0xC6 ,
|
|
0xC0 ,
|
|
0xC0 ,
|
|
0xC7 ,
|
|
0xC7 ,
|
|
0xC8 ,
|
|
0xC8 , /* FE90 */
|
|
0xEB ,
|
|
0xEB ,
|
|
0xC9 ,
|
|
0x8E , /* START TAA MARBUTA FINAL */
|
|
0xCA ,
|
|
0xCA ,
|
|
0xEC ,
|
|
0xEC ,
|
|
0xCB ,
|
|
0xCB ,
|
|
0xED ,
|
|
0xED ,
|
|
0xCC ,
|
|
0xCC ,
|
|
0xEE ,
|
|
0xEE ,
|
|
0xCD ,
|
|
0xCD ,
|
|
0xEF ,
|
|
0xEF ,
|
|
0xCE ,
|
|
0xCE ,
|
|
0xF0 ,
|
|
0xF0 ,
|
|
0xCF ,
|
|
0xCF ,
|
|
0xD0 ,
|
|
0xD0 ,
|
|
0xD1 ,
|
|
0xD1 ,
|
|
0xD2 ,
|
|
0xD2 ,
|
|
0xD3 ,
|
|
0x8F ,
|
|
0xF1 ,
|
|
0xF1 ,
|
|
0xD4 ,
|
|
0x90 ,
|
|
0xF2 ,
|
|
0xF2 ,
|
|
0xD5 ,
|
|
0x91 ,
|
|
0xF3 ,
|
|
0xF3 ,
|
|
0xD6 ,
|
|
0x92 ,
|
|
0xF4 ,
|
|
0xF4 ,
|
|
0xD7 ,
|
|
0xD7 ,
|
|
0x93 ,
|
|
0x93 ,
|
|
0xD8 ,
|
|
0xD8 ,
|
|
0x94 ,
|
|
0x94 ,
|
|
0xD9 ,
|
|
0x96 ,
|
|
0xF5 ,
|
|
0x95 ,
|
|
0xDA ,
|
|
0x98 ,
|
|
0xF6 ,
|
|
0x97 ,
|
|
0xE1 ,
|
|
0xE1 ,
|
|
0xF7 ,
|
|
0x99 ,
|
|
0xE2 ,
|
|
0xE2 ,
|
|
0xF8 ,
|
|
0x9A ,
|
|
0xE3 ,
|
|
0xE3 ,
|
|
0xF9 ,
|
|
0x9B ,
|
|
0xE4 ,
|
|
0xE4 ,
|
|
0xFA ,
|
|
0xFA ,
|
|
0xE5 ,
|
|
0xE5 ,
|
|
0xFB ,
|
|
0xFB ,
|
|
0xE6 ,
|
|
0xE6 ,
|
|
0xFC ,
|
|
0xFC ,
|
|
0xE7 ,
|
|
0x9D ,
|
|
0xFD ,
|
|
0x9C ,
|
|
0xE8 ,
|
|
0xE8 ,
|
|
0x8D ,
|
|
0xE9 ,
|
|
0x9E ,
|
|
0xEA ,
|
|
0xFE ,
|
|
0xFE /* FEF4 */
|
|
};
|
|
|
|
/**
|
|
* The following are the Unicode Lam-Alef ligatures:
|
|
*
|
|
* FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
|
|
* FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
|
|
* FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
|
|
* FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
|
|
* FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
|
|
* FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
|
|
* FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
|
|
* FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM
|
|
*
|
|
* In the Langbox 8x encoding, they have to be split into separate glyphs:
|
|
*
|
|
* 0xA1 ARABIC LIGATURE ALEF OF LAM ALEF
|
|
* 0xA2 ARABIC LIGATURE MADDA ON ALEF OF LAM ALEF
|
|
* 0xA3 ARABIC LIGATURE HAMZA ON ALEF OF LAM ALEF
|
|
* 0xA4 ARABIC LIGATURE HAMZA UNDER ALEF OF LAM ALEF
|
|
* 0xA5 ARABIC LIGATURE LAM OF LAM ALEF INITIAL FORM
|
|
* 0xA6 ARABIC LIGATURE LAM OF LAM ALEF MEDIAL FORM
|
|
*/
|
|
|
|
static const unsigned char lboxAlefs[] =
|
|
{
|
|
0xA2,
|
|
0xA3,
|
|
0xA4,
|
|
0xA1
|
|
};
|
|
|
|
static const unsigned char lboxLams[] =
|
|
{
|
|
0xA5,
|
|
0xA6
|
|
};
|
|
|
|
NS_IMETHODIMP nsUnicodeToLangBoxArabic8::Convert(
|
|
const PRUnichar * aSrc, PRInt32 * aSrcLength,
|
|
char * aDest, PRInt32 * aDestLength)
|
|
{
|
|
char* dest = aDest;
|
|
PRInt32 inlen = 0;
|
|
|
|
while (inlen < *aSrcLength) {
|
|
PRUnichar aChar = aSrc[inlen];
|
|
|
|
if((aChar >= 0x0660) && (aChar <=0x0669)) { /* Hindu Numerals */
|
|
*dest++ = (char)(aChar - 0x0660 + 0xB0);
|
|
} else if ((aChar >= 0x064B) && (aChar <= 0x0652)) {
|
|
*dest++ = (char)(aChar - 0x64B + 0xA8);
|
|
} else if(0x060C == aChar) {
|
|
*dest++ = (char)0xBA;
|
|
} else if(0x061B == aChar) {
|
|
*dest++ = (char)0xBB;
|
|
} else if(0x061F == aChar) {
|
|
*dest++ = (char)0xBF;
|
|
} else if(0x0640 == aChar) {
|
|
*dest++ = (char)0xE0;
|
|
} else if ((aChar>=0xFE80) && (aChar <= 0xFEF4)) {
|
|
*dest++ = uni2lbox[aChar-0xFE80];
|
|
} else if ((aChar >=0xFEF5) && (aChar <= 0xFEFC)) {
|
|
PRUint8 lamAlefType = aChar - 0xFEF5; // first map to 0-7 range,
|
|
PRUint8 alefType = (lamAlefType & 6) >> 1; // then the high 2 bits give us the type of alef
|
|
PRUint8 lamType = lamAlefType & 1; // and the low bits give us the type of lam
|
|
|
|
*dest++ = lboxAlefs[alefType];
|
|
*dest++ = lboxLams[lamType];
|
|
} else if ((aChar >=0x0001) && (aChar <= 0x007F)) {
|
|
*dest++ = (char) (aChar & 0x7F);
|
|
} else {
|
|
// do nothing
|
|
}
|
|
inlen++;
|
|
}
|
|
|
|
*aDestLength = dest - aDest;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP nsUnicodeToLangBoxArabic8::GetMaxLength(
|
|
const PRUnichar * aSrc, PRInt32 aSrcLength,
|
|
PRInt32 * aDestLength)
|
|
{
|
|
*aDestLength = 2*aSrcLength;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP nsUnicodeToLangBoxArabic8::Finish(
|
|
char * aDest, PRInt32 * aDestLength)
|
|
{
|
|
*aDestLength=0;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP nsUnicodeToLangBoxArabic8::Reset()
|
|
{
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP nsUnicodeToLangBoxArabic8::SetOutputErrorBehavior(
|
|
PRInt32 aBehavior,
|
|
nsIUnicharEncoder * aEncoder, PRUnichar aChar)
|
|
{
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
}
|
|
|
|
|
|
NS_IMETHODIMP nsUnicodeToLangBoxArabic8::FillInfo(PRUint32* aInfo)
|
|
{
|
|
PRUnichar i;
|
|
|
|
SET_REPRESENTABLE(aInfo, 0x060c);
|
|
SET_REPRESENTABLE(aInfo, 0x061b);
|
|
SET_REPRESENTABLE(aInfo, 0x061f);
|
|
for(i=0x0621;i<=0x063a;i++)
|
|
SET_REPRESENTABLE(aInfo, i);
|
|
for(i=0x0640;i<=0x0652;i++)
|
|
SET_REPRESENTABLE(aInfo, i);
|
|
for(i=0x0660;i<=0x0669;i++)
|
|
SET_REPRESENTABLE(aInfo, i);
|
|
|
|
// Arabic Pres Form-B
|
|
for(i=0xFE80; i < 0xFEFD;i++)
|
|
SET_REPRESENTABLE(aInfo, i);
|
|
|
|
// ASCII range
|
|
for(i=0x0000; i < 0x007f;i++)
|
|
SET_REPRESENTABLE(aInfo, i);
|
|
|
|
return NS_OK;
|
|
}
|