BIDI.c
上传用户:lqx1163
上传日期:2014-08-13
资源大小:9183k
文件大小:23k
源码类别:

MTK

开发平台:

C/C++

  1. /*****************************************************************************
  2. *  Copyright Statement:
  3. *  --------------------
  4. *  This software is protected by Copyright and the information contained
  5. *  herein is confidential. The software may not be copied and the information
  6. *  contained herein may not be used or disclosed except with the written
  7. *  permission of MediaTek Inc. (C) 2005
  8. *
  9. *  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  10. *  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  11. *  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  12. *  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  13. *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  14. *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  15. *  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  16. *  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  17. *  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  18. *  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  19. *  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  20. *  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  21. *
  22. *  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  23. *  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  24. *  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  25. *  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  26. *  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  27. *
  28. *  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  29. *  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  30. *  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  31. *  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  32. *  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  33. *
  34. *****************************************************************************/
  35. /*****************************************************************************
  36.  *
  37.  * Filename:
  38.  * ---------
  39.  *    bidi.c
  40.  *
  41.  * Project:
  42.  * --------
  43.  *   Maui_Software
  44.  *
  45.  * Description:
  46.  * ------------
  47.  *   bidirectional algorithm engine
  48.  *
  49.  *
  50.  * Author:
  51.  * -------
  52.  * -------
  53.  *
  54.  *============================================================================
  55.  *             HISTORY
  56.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  57.  *------------------------------------------------------------------------------
  58.  * removed!
  59.  *
  60.  * removed!
  61.  * removed!
  62.  * removed!
  63.  *
  64.  * removed!
  65.  * removed!
  66.  * removed!
  67.  *
  68.  *------------------------------------------------------------------------------
  69.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  70.  *============================================================================
  71.  ****************************************************************************/
  72. /*
  73.  * Copyright Notice
  74.  * ?2002 - 2003, Pixtel Communications, Inc., 1489 43rd Ave. W.,
  75.  * Vancouver, B.C. V6M 4K8 Canada. All Rights Reserved.
  76.  *  (It is illegal to remove this copyright notice from this software or any
  77.  *  portion of it)
  78.  */
  79. /**************************************************************
  80.    FILENAME : BIDI.c
  81.    PURPOSE     : Main functions of BIDI Algorithm
  82.    REMARKS     : nil
  83.    AUTHOR      : Yogesh
  84.    DATE     : Aug-23-2004
  85. **************************************************************/
  86. #ifndef __BIDI_CONSOLE__
  87. #include "MMI_features.h"
  88. #endif 
  89. #define __MMI_BIDI__    /* To be placed in MMI_features.h later */
  90. #ifdef __MMI_BIDI__
  91. #include "stdC.h"
  92. #include "BidiProt.h"
  93. #include "BidiDef.h"
  94. #ifdef __BIDI_CONSOLE__
  95. #include "CommonProts.h"
  96. #else /* __BIDI_CONSOLE__ */ 
  97. #include "Unicodexdcl.h"
  98. #include "DebugInitDef.h"
  99. #endif /* __BIDI_CONSOLE__ */ 
  100. #define BIDI_CONSIDER_DIFF_INPUT_METHOD_BEHAVIOR 0
  101. U8 input_types[MAX_TEXT_LENGTH * BIDI_ENCODING_LENGTH]; /* source array for storing the direction codes of the input string */
  102. U8 input_levels[MAX_LEVEL_EMBEDDING];                   /* This global contains all the embedding levels */
  103. U8 dest_levels[MAX_TEXT_LENGTH * BIDI_ENCODING_LENGTH]; /* destitnation array for processed levels */
  104. U8 dest_types[MAX_TEXT_LENGTH * BIDI_ENCODING_LENGTH];  /* Destination array for storing the direction codes of the input string */
  105. U8 localLogicalBuffer[MAX_TEXT_LENGTH * BIDI_ENCODING_LENGTH];
  106. /* START PMTFARHAD 20050224 */
  107. /* PMT START PERSIAN */
  108. #if defined __MMI_LANG_HINDI__ && (defined __MMI_LANG_ARABIC__ || defined __MMI_LANG_PERSIAN__)
  109. /* PMT END PERSIAN */
  110. extern S32 ARABIC_PRESENT;
  111. extern BOOL cancelWidth;
  112. #endif /* defined __MMI_LANG_HINDI__ && (defined __MMI_LANG_ARABIC__ || defined __MMI_LANG_PERSIAN__) */ 
  113. /* END PMTFARHAD 20050224 */
  114. /*****************************************************************************
  115.  * FUNCTION
  116.  *  bidi_main
  117.  * DESCRIPTION
  118.  *  fill the string buffer to bidirectional algorithm
  119.  * PARAMETERS
  120.  *  logicalStr              [IN]        Input string for bidi
  121.  *  logicalStrLen           [IN]        String length of input string
  122.  *  logicalCurPos           [IN]        Current cursor position of input string
  123.  *  visualStr               [OUT]       Final output string from bidi algorithm
  124.  *  visualStrLen            [OUT]       String length of final output string
  125.  *  visualCurPos            [OUT]       Cursor position of final output string
  126.  *  fSwap                   [IN]        If true, then reserse the string after apply bidi algorithm
  127.  *  inputMode               [IN]        
  128.  *  logicalHilightStart     [IN]        Word hilight start position of input string
  129.  *  logicalHilightEnd       [IN]        Word hilight end position of input string
  130.  *  visualHilightStart      [OUT]       Word hilight start position of output string
  131.  *  visualHilightEnd        [OUT]       Word hilight end position of output string
  132.  * RETURNS
  133.  *  void
  134.  *****************************************************************************/
  135. void bidi_main(
  136.         U8 *logicalStr,
  137.         U16 logicalStrLen,
  138.         U16 logicalCurPos,
  139.         U8 *visualStr,
  140.         U16 *visualStrLen,
  141.         U16 *visualCurPos,
  142.         pBOOL fSwap,
  143.         U8 inputMode,
  144.         U16 logicalHilightStart,
  145.         U16 logicalHilightEnd,
  146.         U16 *visualHilightStart,
  147.         U16 *visualHilightEnd)
  148. {
  149.     /*----------------------------------------------------------------*/
  150.     /* Local Variables                                                */
  151.     /*----------------------------------------------------------------*/
  152.     U8 paragraphEmbeddingLevel = 0;
  153. #if BIDI_CONSIDER_DIFF_INPUT_METHOD_BEHAVIOR
  154.     U8 lastType;
  155.     pBOOL flag = FALSE;
  156. #endif /* BIDI_CONSIDER_DIFF_INPUT_METHOD_BEHAVIOR */ 
  157.     pBOOL bCheckFlag;
  158.     S16 iCount, nParaCount = 0;
  159.     U8 *pInputType = input_types;
  160.     U8 *pInputLevels = input_levels;
  161.     U8 *pDestLevels = dest_levels;
  162.     U8 *pDestTypes = dest_types;
  163.     U8 *pLogicalBuffer = localLogicalBuffer;
  164.     U8 *pVisualBuffer = visualStr;
  165.     U16 mark;
  166.     /* START TARUN PMT 20050202 */
  167.     U8 newLineflag = 0;
  168.     /* END TARUN PMT 20050202 */
  169.     U8 testHilighOneCharFlag = 0;
  170.     /*----------------------------------------------------------------*/
  171.     /* Code Body                                                      */
  172.     /*----------------------------------------------------------------*/
  173.     memset(input_types, sizeof(input_types), 0);
  174.     memset(input_levels, sizeof(input_levels), 0);
  175.     memset(dest_levels, sizeof(dest_levels), 0);
  176.     memset(dest_types, sizeof(dest_types), 0);
  177.     memset(localLogicalBuffer, sizeof(localLogicalBuffer), 0);
  178.     if (logicalStrLen == 0)
  179.     {
  180.         /* *visualCurPos = 0; */
  181.         *visualCurPos = 0xFFFF;
  182.         *visualStr = 0;
  183.         *(visualStr + 1) = 0;
  184.         *visualStrLen = 0;
  185.         *visualHilightStart = 0;
  186.         *visualHilightEnd = 0;
  187.         return;
  188.     }
  189.     if (logicalCurPos != 0xFFFF)
  190.     {
  191.         if (logicalCurPos < logicalHilightEnd)
  192.         {
  193.             logicalCurPos = logicalHilightEnd;
  194.         }
  195.         if (logicalHilightStart > logicalHilightEnd)
  196.         {
  197.             logicalHilightStart = logicalHilightEnd;
  198.         }
  199.     }
  200. #if 0
  201. /* under construction !*/
  202. /* under construction !*/
  203. /* under construction !*/
  204. /* under construction !*/
  205. /* under construction !*/
  206. /* under construction !*/
  207. /* under construction !*/
  208. #if defined __MMI_LANG_HINDI__  && defined __MMI_LANG_ARABIC__
  209. /* under construction !*/
  210. /* under construction !*/
  211.          #endif
  212. /* under construction !*/
  213. /* under construction !*/
  214. /* under construction !*/
  215. /* under construction !*/
  216. /* under construction !*/
  217. /* under construction !*/
  218. /* under construction !*/
  219. /* under construction !*/
  220. /* under construction !*/
  221. /* under construction !*/
  222. /* under construction !*/
  223. /* under construction !*/
  224. /* under construction !*/
  225. /* under construction !*/
  226. /* under construction !*/
  227. #endif /* 0 */ 
  228.     pfnUnicodeStrncpy((S8*) localLogicalBuffer, (const S8*)logicalStr, (U32) logicalStrLen);
  229. #if BIDI_CONSIDER_DIFF_INPUT_METHOD_BEHAVIOR
  230.     if (inputMode == BIDI_R)
  231.     {
  232.         bidi_get_char_type((U8*) & localLogicalBuffer[(logicalStrLen - 1) * BIDI_ENCODING_LENGTH], (U8*) & lastType);
  233.         if (lastType == WS)
  234.         {
  235.             localLogicalBuffer[(logicalStrLen - 1) * BIDI_ENCODING_LENGTH] = 0;
  236.             localLogicalBuffer[(logicalStrLen - 1) * BIDI_ENCODING_LENGTH + 1] = 0;
  237.             if (logicalCurPos == logicalStrLen)
  238.             {
  239.                 flag = TRUE;
  240.                 logicalCurPos--;
  241.             }
  242.             logicalStrLen--;
  243.         }
  244.         set_bidi_cursor_pos((U8*) localLogicalBuffer, logicalCurPos, (U16) CURSOR_MARK);
  245.         logicalStrLen = (U16) pfnUnicodeStrlen((const S8*)localLogicalBuffer);
  246.         set_bidi_cursor_pos((U8*) localLogicalBuffer, logicalStrLen, (U16) LAST_MARK);
  247.     }
  248.     else
  249. #endif /* BIDI_CONSIDER_DIFF_INPUT_METHOD_BEHAVIOR */ 
  250.     {
  251.         if (logicalCurPos != 0xFFFF)
  252.         {
  253.             set_bidi_cursor_pos((U8*) localLogicalBuffer, logicalCurPos, (U16) CURSOR_MARK);
  254.         }
  255.     }
  256.     set_bidi_cursor_pos((U8*) localLogicalBuffer, logicalHilightEnd, (U16) SECOND_HIGHLT);
  257.     set_bidi_cursor_pos((U8*) localLogicalBuffer, (U16) (logicalHilightStart), (U16) FIRST_HIGHLT);
  258.     pfnUnicodeStrcpy((S8*) visualStr, (const S8*)localLogicalBuffer);
  259.     logicalStrLen = get_direction_codes((U8*) input_types, (U8*) localLogicalBuffer, 0);
  260.     iCount = 0;
  261.     while (iCount < logicalStrLen)
  262.     {
  263.         bCheckFlag = FALSE;
  264.         nParaCount = identify_paragraphs(pInputType, (U16) (logicalStrLen - iCount), &bCheckFlag);
  265.         if (logicalCurPos < nParaCount)
  266.         {
  267.             newLineflag = 1;
  268.         }
  269.         copy_direction_codes(pDestTypes, pInputType, (U16) nParaCount);
  270.         if (bCheckFlag)
  271.         {
  272.             pDestTypes[nParaCount] = 0;
  273.             pInputType[nParaCount] = 0;
  274.             if (pInputType[nParaCount - 1] == BIDI_B)
  275.             {
  276.                 pDestTypes[nParaCount - 1] = 0;
  277.                 pInputType[nParaCount - 1] = 0;
  278.             }
  279.         }
  280.         paragraphEmbeddingLevel = get_para_embedding_level(pInputType, nParaCount);
  281.         set_dest_levels(0, nParaCount, paragraphEmbeddingLevel, pDestLevels);
  282.         get_run_level(nParaCount, paragraphEmbeddingLevel, pDestLevels, pDestTypes);
  283.         resolve_lines(paragraphEmbeddingLevel, pVisualBuffer, nParaCount, TRUE, pDestTypes, pDestLevels);
  284.         if (bCheckFlag)
  285.         {
  286.             nParaCount++;
  287.         }
  288.         pInputType += nParaCount;
  289.         pInputLevels += nParaCount;
  290.         pDestLevels += nParaCount;
  291.         pDestTypes += nParaCount;
  292.         pLogicalBuffer += nParaCount * 2;
  293.         pVisualBuffer += nParaCount * 2;
  294.         iCount += nParaCount;
  295.     }
  296.     *visualStrLen = (U16) pfnUnicodeStrlen((const S8*)visualStr);
  297.     if (fSwap)
  298.     {
  299.         bidi_reverse((U8*) visualStr, *visualStrLen);
  300.     }
  301.     *visualCurPos = 0xFFFF;
  302.     /* START Changed by YOGESH PMT 20050912 */
  303.     while (find_mark(visualStr, *visualStrLen, &mark, (U16*) & iCount))
  304.         /* END YOGESH PMT 20050912 */
  305.     {
  306.         switch (mark)
  307.         {
  308.             case LAST_MARK:
  309.             case CURSOR_MARK:
  310.         #if BIDI_CONSIDER_DIFF_INPUT_METHOD_BEHAVIOR
  311.                 if (inputMode == BIDI_R)
  312.                 {
  313.                     *visualCurPos = get_bidi_cursor_pos(visualStr, (U16) LAST_MARK);
  314.                     if (lastType == WS)
  315.                     {
  316.                         set_bidi_cursor_pos(visualStr, *visualCurPos, (U16) (0x0020));
  317.                     }
  318.                     *visualCurPos = get_bidi_cursor_pos(visualStr, (U16) CURSOR_MARK);
  319.                 }
  320.                 else
  321.         #endif /* BIDI_CONSIDER_DIFF_INPUT_METHOD_BEHAVIOR */ 
  322.                 {
  323.                     *visualCurPos = get_bidi_cursor_pos(visualStr, (U16) CURSOR_MARK);
  324.                 }
  325.                 testHilighOneCharFlag = 1;
  326.                 break;
  327.             case SECOND_HIGHLT:
  328.                 *visualHilightEnd = get_bidi_cursor_pos(visualStr, (U16) SECOND_HIGHLT);
  329.                 testHilighOneCharFlag = 0;
  330.                 break;
  331.             case FIRST_HIGHLT:
  332.                 *visualHilightStart = get_bidi_cursor_pos(visualStr, (U16) FIRST_HIGHLT);
  333.                 testHilighOneCharFlag = 0;
  334.                 break;
  335.         }
  336.     }
  337.     if (testHilighOneCharFlag == 0 && *visualHilightEnd == *visualHilightStart)
  338.     {
  339.         *visualHilightEnd = *visualHilightStart = *visualCurPos + 1;
  340.     }
  341.     if ((logicalHilightStart == 0) && (logicalHilightEnd == 0))
  342.     {
  343.         *visualHilightEnd = 0;
  344.         *visualHilightStart = 0;
  345.     }
  346.     if ((*visualHilightEnd <
  347.          /*=*/ *visualHilightStart) /* && (!(*visualHilightStart == 0 && *visualHilightEnd == 0)) */ )
  348.     {
  349.         (*visualHilightEnd)++;
  350.         (*visualHilightStart)++;
  351.     }
  352.     *visualStrLen = (U16) pfnUnicodeStrlen((const S8*)visualStr);
  353. }
  354. /*****************************************************************************
  355.  * FUNCTION
  356.  *  set_bidi_cursor_pos
  357.  * DESCRIPTION
  358.  *  
  359.  * PARAMETERS
  360.  *  input_str       [?]         
  361.  *  cursor_pos      [IN]        
  362.  *  cursor_mark     [IN]        
  363.  * RETURNS
  364.  *  
  365.  *****************************************************************************/
  366. pBOOL set_bidi_cursor_pos(U8 *input_str, U16 cursor_pos, U16 cursor_mark)
  367. {
  368.     /*----------------------------------------------------------------*/
  369.     /* Local Variables                                                */
  370.     /*----------------------------------------------------------------*/
  371.     U16 sLen, iCount;
  372.     U8 cTemp[2];
  373.     /*----------------------------------------------------------------*/
  374.     /* Code Body                                                      */
  375.     /*----------------------------------------------------------------*/
  376.     pfnUnicodeToEncodingScheme(cursor_mark, (U8*) & sLen, cTemp);
  377.     sLen = (U16) pfnUnicodeStrlen((const S8*)input_str);
  378.     if (sLen < cursor_pos)
  379.     {
  380.         return FALSE;
  381.     }
  382.     for (iCount = cursor_pos; iCount <= sLen; iCount++)
  383.     {
  384.         U8 cTempSwap;
  385.         cTempSwap = input_str[iCount * BIDI_ENCODING_LENGTH];
  386.         input_str[iCount * BIDI_ENCODING_LENGTH] = cTemp[0];
  387.         cTemp[0] = cTempSwap;
  388.         cTempSwap = input_str[iCount * BIDI_ENCODING_LENGTH + 1];
  389.         input_str[iCount * BIDI_ENCODING_LENGTH + 1] = cTemp[1];
  390.         cTemp[1] = cTempSwap;
  391.     }
  392.     input_str[iCount * BIDI_ENCODING_LENGTH] = cTemp[0];
  393.     input_str[iCount * BIDI_ENCODING_LENGTH + 1] = cTemp[1];
  394.     return TRUE;
  395. }
  396. /* START Changed by YOGESH PMT 20050912 */
  397. /*****************************************************************************
  398.  * FUNCTION
  399.  *  find_mark
  400.  * DESCRIPTION
  401.  *  
  402.  * PARAMETERS
  403.  *  input_str           [?]         
  404.  *  input_strLen        [IN]        
  405.  *  cur_mark            [?]         
  406.  *  cur_pos             [?]         
  407.  * RETURNS
  408.  *  
  409.  *****************************************************************************/
  410. pBOOL find_mark(U8 *input_str, U16 input_strLen, U16 *cur_mark, U16 *cur_pos)
  411. {
  412.     /*----------------------------------------------------------------*/
  413.     /* Local Variables                                                */
  414.     /*----------------------------------------------------------------*/
  415.     U16 sLen, iCount = 0;
  416.     U8 cTemp[2];
  417.     /*----------------------------------------------------------------*/
  418.     /* Code Body                                                      */
  419.     /*----------------------------------------------------------------*/
  420.     while (!((input_str[iCount * 2] == 0) && (input_str[iCount * 2 + 1] == 0)) && iCount <= input_strLen)
  421.         /* END YOGESH PMT 20050912 */
  422.     {
  423.         pfnUnicodeToEncodingScheme(LAST_MARK, (U8*) & sLen, cTemp);
  424.         if ((input_str[iCount * BIDI_ENCODING_LENGTH] == cTemp[0]) &&
  425.             (input_str[iCount * BIDI_ENCODING_LENGTH + 1] == cTemp[1]))
  426.         {
  427.             *cur_mark = LAST_MARK;
  428.             *cur_pos = iCount;
  429.             return TRUE;
  430.         }
  431.         pfnUnicodeToEncodingScheme(CURSOR_MARK, (U8*) & sLen, cTemp);
  432.         if ((input_str[iCount * BIDI_ENCODING_LENGTH] == cTemp[0]) &&
  433.             (input_str[iCount * BIDI_ENCODING_LENGTH + 1] == cTemp[1]))
  434.         {
  435.             *cur_mark = CURSOR_MARK;
  436.             *cur_pos = iCount;
  437.             return TRUE;
  438.         }
  439.         pfnUnicodeToEncodingScheme(SECOND_HIGHLT, (U8*) & sLen, cTemp);
  440.         if ((input_str[iCount * BIDI_ENCODING_LENGTH] == cTemp[0]) &&
  441.             (input_str[iCount * BIDI_ENCODING_LENGTH + 1] == cTemp[1]))
  442.         {
  443.             *cur_mark = SECOND_HIGHLT;
  444.             *cur_pos = iCount;
  445.             return TRUE;
  446.         }
  447.         pfnUnicodeToEncodingScheme(FIRST_HIGHLT, (U8*) & sLen, cTemp);
  448.         if ((input_str[iCount * BIDI_ENCODING_LENGTH] == cTemp[0]) &&
  449.             (input_str[iCount * BIDI_ENCODING_LENGTH + 1] == cTemp[1]))
  450.         {
  451.             *cur_mark = FIRST_HIGHLT;
  452.             *cur_pos = iCount;
  453.             return TRUE;
  454.         }
  455.         iCount++;
  456.     }
  457.     return FALSE;
  458. }
  459. /*****************************************************************************
  460.  * FUNCTION
  461.  *  get_bidi_cursor_pos
  462.  * DESCRIPTION
  463.  *  
  464.  * PARAMETERS
  465.  *  input_str       [?]         
  466.  *  cursor_mark     [IN]        
  467.  * RETURNS
  468.  *  
  469.  *****************************************************************************/
  470. U16 get_bidi_cursor_pos(U8 *input_str, U16 cursor_mark)
  471. {
  472.     /*----------------------------------------------------------------*/
  473.     /* Local Variables                                                */
  474.     /*----------------------------------------------------------------*/
  475.     U16 sLen, iCount = 0;
  476.     U8 cTemp[2];
  477.     S16 cur_pos = -1;
  478.     /*----------------------------------------------------------------*/
  479.     /* Code Body                                                      */
  480.     /*----------------------------------------------------------------*/
  481.     pfnUnicodeToEncodingScheme(cursor_mark, (U8*) & sLen, cTemp);
  482.     /* while((input_str[iCount*BIDI_ENCODING_LENGTH]!=0)&&(input_str[iCount*BIDI_ENCODING_LENGTH+1]!=0)) */
  483.     while (!((input_str[iCount * 2] == 0) && (input_str[iCount * 2 + 1] == 0)))
  484.     {
  485.         if ((input_str[iCount * BIDI_ENCODING_LENGTH] == cTemp[0]) &&
  486.             (input_str[iCount * BIDI_ENCODING_LENGTH + 1] == cTemp[1]))
  487.         {
  488.             cur_pos = iCount;
  489.         }
  490.         if (cur_pos != -1)
  491.         {
  492.             input_str[iCount * BIDI_ENCODING_LENGTH] = input_str[(iCount + 1) * BIDI_ENCODING_LENGTH];
  493.             input_str[iCount * BIDI_ENCODING_LENGTH + 1] = input_str[(iCount + 1) * BIDI_ENCODING_LENGTH + 1];
  494.         }
  495.         iCount++;
  496.     }
  497.     return (U16) ((cur_pos == -1) ? 0 : cur_pos);
  498. }
  499. /*****************************************************************************
  500.  * FUNCTION
  501.  *  bidi_get_char_type
  502.  * DESCRIPTION
  503.  *  
  504.  * PARAMETERS
  505.  *  input_char      [?]     
  506.  *  charType        [?]     
  507.  * RETURNS
  508.  *  
  509.  *****************************************************************************/
  510. pBOOL bidi_get_char_type(U8 *input_char, U8 *charType)
  511. {
  512.     /*----------------------------------------------------------------*/
  513.     /* Local Variables                                                */
  514.     /*----------------------------------------------------------------*/
  515.     S32 nFirst = 0;
  516.     S32 nLast = nMaxIndexBidiTypeMap;
  517.     S32 nMid;
  518.     U16 charInput = 0;
  519.     /*----------------------------------------------------------------*/
  520.     /* Code Body                                                      */
  521.     /*----------------------------------------------------------------*/
  522. #ifdef __ASCII
  523.     charInput = (U16) (*input_char);
  524. #endif 
  525. #ifdef __UCS2_ENCODING
  526.     pfnEncodingSchemeToUnicode((U16*) & charInput, (U8*) (input_char));
  527. #endif 
  528.     while (nLast >= nFirst)
  529.     {
  530.         nMid = (nFirst + nLast) / 2;
  531.         //START YOGESH PMT 20041108
  532.         //              if((bidiCharTypeMap[nMid].sIndex<= charInput)&&((bidiCharTypeMap[nMid].sIndex+ (U16)bidiCharTypeMap[nMid].nCount)>= charInput))
  533.         if ((bidiCharTypeMap[nMid].sIndex <= charInput) &&
  534.             ((bidiCharTypeMap[nMid].sIndex + (U16) bidiCharTypeMap[nMid].nCount) > charInput))
  535.             /* END YOGESH PMT 20041108 */
  536.         {
  537.             *charType = bidiCharTypeMap[nMid].type;
  538.             return TRUE;
  539.         }
  540.         //START YOGESH PMT 20041108
  541.         //              if (charInput>(bidiCharTypeMap[nMid].sIndex+ (U16)bidiCharTypeMap[nMid].nCount))
  542.         if (charInput >= (bidiCharTypeMap[nMid].sIndex + (U16) bidiCharTypeMap[nMid].nCount))
  543.         {
  544.             /* END YOGESH PMT 20041108 */
  545.             nFirst = nMid + 1;
  546.         }
  547.         else
  548.         {
  549.             if (charInput < bidiCharTypeMap[nMid].sIndex)
  550.             {
  551.                 nLast = nMid - 1;
  552.             }
  553.             else
  554.             {
  555.                 nLast = nMid;
  556.             }
  557.         }
  558.     }
  559.     *charType = BIDI_L; /* Default Type */
  560.     return FALSE;
  561. }
  562. /*****************************************************************************
  563.  * FUNCTION
  564.  *  bidi_get_para_direction
  565.  * DESCRIPTION
  566.  *  
  567.  * PARAMETERS
  568.  *  input_str       [?]     
  569.  * RETURNS
  570.  *  
  571.  *****************************************************************************/
  572. U8 bidi_get_para_direction(U8 *input_str)
  573. {
  574.     /*----------------------------------------------------------------*/
  575.     /* Local Variables                                                */
  576.     /*----------------------------------------------------------------*/
  577.     /* U8 input_types[MAX_TEXT_LENGTH*BIDI_ENCODING_LENGTH];//source array for storing the direction codes of the input string */
  578.     U16 sLen;
  579.     /*----------------------------------------------------------------*/
  580.     /* Code Body                                                      */
  581.     /*----------------------------------------------------------------*/
  582.     //START CHANGED by Yogesh 20041224
  583.     //   sLen=get_direction_codes(input_types,input_str);
  584.     sLen = get_direction_codes(input_types, input_str, 0);
  585.     /* END CHANGED by Yogesh 20041224 */
  586.     return (get_para_embedding_level(input_types, sLen)) ? BIDI_R : BIDI_L;
  587. }
  588. #endif /* __MMI_BIDI__ */