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

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.  *    bidipararules.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.  *------------------------------------------------------------------------------
  61.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  62.  *============================================================================
  63.  *****************************************************************************/
  64. /*
  65.  * Copyright Notice
  66.  * ?2002 - 2003, Pixtel Communications, Inc., 1489 43rd Ave. W.,
  67.  * Vancouver, B.C. V6M 4K8 Canada. All Rights Reserved.
  68.  *  (It is illegal to remove this copyright notice from this software or any
  69.  *  portion of it)
  70.  */
  71. /**************************************************************
  72.    FILENAME : BIDIParaRules.c
  73.    PURPOSE     : Main functions of Rule L1 to L4 of BIDI Algorithm
  74.    REMARKS     : nil
  75.    AUTHOR      : Vijay/Bilal
  76.    DATE     : Aug-23-2004
  77. **************************************************************/
  78. #include "BidiDef.h"
  79. #include "BidiProt.h"
  80. /* START TARUN PMT 20041015 */
  81. extern U8 input_types[];    /* source array for storing the direction codes of the input string */
  82. extern U8 input_levels[];   /* This global contains all the embedding levels */
  83. extern U8 dest_levels[];    /* destitnation array for processed levels */
  84. extern U8 dest_types[];     /* Destination array for storing the direction codes of the input string */
  85. //END TARUN PMT
  86. //START Added by Yogesh 20050831
  87. #ifdef __BIDI_CONSOLE__
  88. #include "CommonProts.h"
  89. #else /* __BIDI_CONSOLE__ */ 
  90. #include "Unicodexdcl.h"
  91. #include "DebugInitDef.h"
  92. #endif /* __BIDI_CONSOLE__ */ 
  93. /* END Added by Yogesh 20050831 */
  94. /*********************************************************************
  95.    This function will take the unicode character array as input,
  96.    outputs the directional code array and returns the string len.
  97. ********************************************************************/
  98. /*****************************************************************************
  99.  * FUNCTION
  100.  *  get_direction_codes
  101.  * DESCRIPTION
  102.  *  
  103.  * PARAMETERS
  104.  *  inputTypes      [?]         
  105.  *  inputString     [?]         
  106.  *  sLen            [IN]        
  107.  * RETURNS
  108.  *  
  109.  *****************************************************************************/
  110. U16 get_direction_codes(U8 *inputTypes, U8 *inputString, S16 sLen)
  111. {
  112.     /*----------------------------------------------------------------*/
  113.     /* Local Variables                                                */
  114.     /*----------------------------------------------------------------*/
  115.     S16 iCount = 0;
  116.     /* START Added by Yogesh 20050831 */
  117.     U16 charInput = 0;
  118.     /*----------------------------------------------------------------*/
  119.     /* Code Body                                                      */
  120.     /*----------------------------------------------------------------*/
  121.     pfnEncodingSchemeToUnicode((U16*) & charInput, (U8*) (&inputString[iCount * BIDI_ENCODING_LENGTH]));
  122.     /* END Added by Yogesh 20050831 */
  123.     /* START Added by Yogesh 20041224 */
  124.     if (sLen)
  125.         //START Changed by Yogesh 20050831
  126.         //      while( inputString[iCount*BIDI_ENCODING_LENGTH] !=0 && iCount<sLen )
  127.         while (charInput != 0 && iCount < sLen)
  128.             /* END Changed by Yogesh 20050831 */
  129.         {
  130.             bidi_get_char_type(&inputString[iCount * BIDI_ENCODING_LENGTH], &inputTypes[iCount]);
  131.             iCount++;
  132.             /* START Added by Yogesh 20050831 */
  133.             pfnEncodingSchemeToUnicode((U16*) & charInput, (U8*) (&inputString[iCount * BIDI_ENCODING_LENGTH]));
  134.             /* END Added by Yogesh 20050831 */
  135.         }
  136.     else
  137.         //END Added by Yogesh 20041224
  138.         //START Changed by Yogesh 20050831
  139.         //      while( inputString[iCount*BIDI_ENCODING_LENGTH] !=0)
  140.         while (charInput != 0)
  141.             /* END Changed by Yogesh 20050831 */
  142.         {
  143.             bidi_get_char_type(&inputString[iCount * BIDI_ENCODING_LENGTH], &inputTypes[iCount]);
  144.             iCount++;
  145.             /* START Added by Yogesh 20050831 */
  146.             pfnEncodingSchemeToUnicode((U16*) & charInput, (U8*) (&inputString[iCount * BIDI_ENCODING_LENGTH]));
  147.             /* END Added by Yogesh 20050831 */
  148.         }
  149.     return iCount;
  150. }
  151. /************************************************************************
  152. This routine will take the given stream of charcaters as input and break
  153. them in to diffrent paragraphs by taking only the text between paragraph 
  154. seperator directional code 'B'.it returns the revised character count.
  155. *************************************************************************/
  156. /*****************************************************************************
  157.  * FUNCTION
  158.  *  identify_paragraphs
  159.  * DESCRIPTION
  160.  *  
  161.  * PARAMETERS
  162.  *  inputTypes      [?]         
  163.  *  inputLen        [IN]        
  164.  *  bFlag           [?]         
  165.  * RETURNS
  166.  *  
  167.  *****************************************************************************/
  168. U16 identify_paragraphs(U8 *inputTypes, U16 inputLen, pBOOL *bFlag)
  169. {
  170.     /*----------------------------------------------------------------*/
  171.     /* Local Variables                                                */
  172.     /*----------------------------------------------------------------*/
  173.     S16 iCount;
  174.     /*----------------------------------------------------------------*/
  175.     /* Code Body                                                      */
  176.     /*----------------------------------------------------------------*/
  177.     //START Changed by Yogesh 20041224 : Function Body Changed
  178.     //Loop till you get paragraph seperator
  179.     for (iCount = 0; ((iCount < inputLen) && (inputTypes[iCount] != BIDI_B)); iCount++);
  180.     if (iCount < inputLen && inputTypes[iCount] == BIDI_B)
  181.     {
  182.         *bFlag = TRUE;
  183.         /* START TARUN PMT 20050202 */
  184.         if (inputTypes[iCount + 1] == BIDI_B)
  185.         {
  186.             iCount++;
  187.         }
  188.         //END TARUN PMT 20050202
  189.         //inputTypes[iCount++] = 0;
  190.     }
  191.     //END Changed by Yogesh 20041224 : Function Body Changed
  192.     //START Commented by YOGESH 20041224 : Added above lines so not required now
  193.     return iCount;
  194. }
  195. /***********************************************************************
  196. This function looks for the first token of any strong type
  197. ie AL , BIDI_L and BIDI_R , then sets the parahraph embedding level depending
  198. upon the strong type. paragraph embedding level is 0  by default ,0
  199. if first strong type is BIDI_L and 1 if first strong type is AL or BIDI_R.
  200. *************************************************************************/
  201. /*****************************************************************************
  202.  * FUNCTION
  203.  *  get_para_embedding_level
  204.  * DESCRIPTION
  205.  *  
  206.  * PARAMETERS
  207.  *  inputTypes      [?]         
  208.  *  inputLen        [IN]        
  209.  * RETURNS
  210.  *  
  211.  *****************************************************************************/
  212. U8 get_para_embedding_level(U8 *inputTypes, U16 inputLen)
  213. {
  214.     /*----------------------------------------------------------------*/
  215.     /* Local Variables                                                */
  216.     /*----------------------------------------------------------------*/
  217.     U16 strongCharType = 0xffff;    /* This will store the first strong character in the */
  218.     /* given input string */
  219.     S16 iCount;
  220.     /*----------------------------------------------------------------*/
  221.     /* Code Body                                                      */
  222.     /*----------------------------------------------------------------*/
  223.     for (iCount = 0; iCount < inputLen; ++iCount)
  224.     {
  225.         U8 token = inputTypes[iCount];
  226.         if (token == AL || token == BIDI_L || token == BIDI_R)
  227.         {
  228.             strongCharType = token;
  229.             break;
  230.         }
  231.     }
  232.     /* return the embedding level depending upon the strong character Type */
  233.     switch (strongCharType)
  234.     {
  235.         case -1:
  236.         case BIDI_L:
  237.         default:
  238.             return 0;
  239.             break;
  240.         case AL:
  241.         case BIDI_R:
  242.             return 1;
  243.             break;
  244.     }
  245. }
  246. /* Returns the least odd level corresponding to the given input level */
  247. /*****************************************************************************
  248.  * FUNCTION
  249.  *  getLeastOddEmbeddingLevel
  250.  * DESCRIPTION
  251.  *  
  252.  * PARAMETERS
  253.  *  pEmbeddinglevel     [IN]        
  254.  * RETURNS
  255.  *  
  256.  *****************************************************************************/
  257. U8 getLeastOddEmbeddingLevel(U8 pEmbeddinglevel)
  258. {
  259.     /*----------------------------------------------------------------*/
  260.     /* Local Variables                                                */
  261.     /*----------------------------------------------------------------*/
  262.     /*----------------------------------------------------------------*/
  263.     /* Code Body                                                      */
  264.     /*----------------------------------------------------------------*/
  265.     return ODD(pEmbeddinglevel) ? pEmbeddinglevel + 2 : pEmbeddinglevel + 1;
  266. }
  267. /* Returns the least odd level corresponding to the given input level */
  268. /*****************************************************************************
  269.  * FUNCTION
  270.  *  getLeastEvenEmbeddingLevel
  271.  * DESCRIPTION
  272.  *  
  273.  * PARAMETERS
  274.  *  pEmbeddinglevel     [IN]        
  275.  * RETURNS
  276.  *  
  277.  *****************************************************************************/
  278. U8 getLeastEvenEmbeddingLevel(U8 pEmbeddinglevel)
  279. {
  280.     /*----------------------------------------------------------------*/
  281.     /* Local Variables                                                */
  282.     /*----------------------------------------------------------------*/
  283.     /*----------------------------------------------------------------*/
  284.     /* Code Body                                                      */
  285.     /*----------------------------------------------------------------*/
  286.     return ODD(pEmbeddinglevel) ? pEmbeddinglevel + 1 : pEmbeddinglevel + 2;
  287. }
  288. /* This function is to determine all explicit embedding levels and directions.
  289.    if any directional type of RLE ,LRE,LRO or RLO appears */
  290. //START Changed by Yogesh 20041224 : Function definition changed
  291. //Get all explicit embedding level
  292. //START TARUN PMT 20041015
  293. //void resolve_explicit_embedding_levels(U8* inputTypes,U16 inputLen,U8 paraEmbeddingLevel,U8* all_embeddings_level)
  294. //void resolve_explicit_embedding_levels(U16 inputLen,U8 paraEmbeddingLevel/*,U8* all_embeddings_level*/)
  295. //END TARUN PMT
  296. /*****************************************************************************
  297.  * FUNCTION
  298.  *  resolve_explicit_embedding_levels
  299.  * DESCRIPTION
  300.  *  
  301.  * PARAMETERS
  302.  *  inputTypes              [?]         
  303.  *  inputLen                [IN]        
  304.  *  paraEmbeddingLevel      [IN]        
  305.  * RETURNS
  306.  *  void
  307.  *****************************************************************************/
  308. void resolve_explicit_embedding_levels(U8 *inputTypes, U16 inputLen, U8 paraEmbeddingLevel)    /* ,U8* all_embeddings_level) */
  309. /* END Changed by Yogesh 20041224 */
  310. {
  311.     /*----------------------------------------------------------------*/
  312.     /* Local Variables                                                */
  313.     /*----------------------------------------------------------------*/
  314.     //all the local variables used for stack operations
  315.     //keeps track of stack full/empty status 
  316.     U16 stackFullIndicator = 0;
  317.     //This is to keep track for the invalid embedding level in the case 
  318.     //when RLE ,LRE , RLO or LRO happens at level 60
  319.     U16 stackAboutToFullIndicator = 0;
  320.     /* used as an index to the embedding levels stack */
  321.     U16 stackIndex = 0;
  322.     /* For storing the updated value of embedding level */
  323.     U8 newEmbeddingLevel;
  324.     /* This array is used to store all the embedding levels encountered */
  325.     U8 pushedEmbeddingValues[MAX_LEVEL_EMBEDDING];
  326.     U8 token;
  327.     U8 presentEmbeddingLevel = paraEmbeddingLevel;
  328.     U8 presentEmbeddingValue = paraEmbeddingLevel;
  329.     S16 iCount = 0; /* Loop Counter */
  330.     /*----------------------------------------------------------------*/
  331.     /* Code Body                                                      */
  332.     /*----------------------------------------------------------------*/
  333.     while (iCount < inputLen)
  334.     {
  335.         input_levels[iCount] = presentEmbeddingValue;
  336.         //START Changed by Yogesh 20041224 : Revert back Tarun Changes as function def changed
  337.         //START TARUN PMT 20041015
  338.         token = inputTypes[iCount];
  339.         //token = input_types[iCount];
  340.         //END TARUN PMT
  341.         //END Changed by Yogesh 20041224 : Revert back Tarun Changes as function def changed
  342.         //process if RLE ,LRE ,RLO ,LRO are there
  343.         if (token == RLE || token == LRE || token == LRO || token == RLO)
  344.         {
  345.             /* proceed only when current level is valid */
  346.             if (stackFullIndicator == 0)
  347.             {
  348.                 if (token == RLE || token == RLO)
  349.                 {
  350.                     /* Get the least odd embedding level */
  351.                     newEmbeddingLevel = getLeastOddEmbeddingLevel(presentEmbeddingLevel);
  352.                 }
  353.                 else
  354.                 {
  355.                     /* Get the least even embedding level */
  356.                     newEmbeddingLevel = getLeastEvenEmbeddingLevel(presentEmbeddingLevel);
  357.                 }
  358.                 /*
  359.                  * If this updated embedding level does not cross the boundry of
  360.                  * MAX_LEVEL_EMBEDDING remember this embedding level by pushing in to the stack
  361.                  */
  362.                 if (newEmbeddingLevel < MAX_LEVEL_EMBEDDING)
  363.                 {
  364.                     pushedEmbeddingValues[stackIndex] = newEmbeddingLevel;
  365.                     stackIndex++;
  366.                     presentEmbeddingLevel = newEmbeddingLevel;
  367.                     if (token == LRO || token == RLO)
  368.                     {
  369.                         presentEmbeddingValue = (presentEmbeddingLevel | 0x80);
  370.                     }
  371.                     else
  372.                     {
  373.                         presentEmbeddingValue = presentEmbeddingLevel;
  374.                     }
  375.                     /* Now push this embedding in to the stack */
  376.                     pushedEmbeddingValues[stackIndex] = presentEmbeddingValue;
  377.                 }
  378.                 if (presentEmbeddingValue == MAX_LEVEL_EMBEDDING - 1)
  379.                 {
  380.                     stackAboutToFullIndicator++;
  381.                 }
  382.             }   /* if (stackFullIndicator == 0) */
  383.             stackFullIndicator++;
  384.         }       /* if RLE ,LRE , LRO , RLO */
  385.         else
  386.         {
  387.             if (token == PDF)
  388.             {
  389.                 /*
  390.                  * This is just like an end brace '}' and we have to find start brace'{' 
  391.                  * corresponding to each PDF stack is already full , decrement it 
  392.                  * since we are going to pop one embedding level
  393.                  */
  394.                 if ((stackAboutToFullIndicator > 0) && (presentEmbeddingLevel != MAX_LEVEL_EMBEDDING))
  395.                 {
  396.                     stackAboutToFullIndicator--;
  397.                 }
  398.                 else
  399.                 {
  400.                     stackIndex--;
  401.                 }
  402.                 /* pop up the embedding value from the stack */
  403.                 presentEmbeddingValue = pushedEmbeddingValues[stackIndex];
  404.                 /* get the overriding status */
  405.                 presentEmbeddingLevel = presentEmbeddingValue & 0x7f;
  406.             }   /* if( token == PDF ) */
  407.             else
  408.             {
  409.                 if (token == BIDI_B)
  410.                 {
  411.                     /* Reset all the variables as 'BIDI_B' is the last token processed */
  412.                     presentEmbeddingLevel = paraEmbeddingLevel;
  413.                     presentEmbeddingValue = paraEmbeddingLevel;
  414.                     stackIndex = 0;
  415.                     stackAboutToFullIndicator = 0;
  416.                     pushedEmbeddingValues[iCount] = paraEmbeddingLevel;
  417.                 }   /* if(token==BIDI_B) */
  418.             }       /* if( token == PDF ) */
  419.         }
  420.         iCount++;
  421.     }   /* End of while loop */
  422. }
  423. /*****************************************************************************
  424.  * FUNCTION
  425.  *  set_dest_levels
  426.  * DESCRIPTION
  427.  *  
  428.  * PARAMETERS
  429.  *  nSCount             [IN]        
  430.  *  nECount             [IN]        
  431.  *  paraEmbedLevel      [IN]        
  432.  *  pDestLevels         [?]         
  433.  * RETURNS
  434.  *  void
  435.  *****************************************************************************/
  436. void set_dest_levels(U16 nSCount, U16 nECount, U8 paraEmbedLevel, U8 *pDestLevels)
  437. {
  438.     /*----------------------------------------------------------------*/
  439.     /* Local Variables                                                */
  440.     /*----------------------------------------------------------------*/
  441.     /*----------------------------------------------------------------*/
  442.     /* Code Body                                                      */
  443.     /*----------------------------------------------------------------*/
  444.     //      while (startCount<=endCount)
  445.     //              dest_levels[startCount++] = paraEmbedLevel;
  446.     while (nSCount < nECount)
  447.     {
  448.         pDestLevels[nSCount++] = paraEmbedLevel;
  449.     }
  450. }
  451. /*****************************************************************************
  452.  * FUNCTION
  453.  *  copy_direction_codes
  454.  * DESCRIPTION
  455.  *  
  456.  * PARAMETERS
  457.  *  dTypes      [?]         
  458.  *  sTypes      [?]         
  459.  *  nCount      [IN]        
  460.  * RETURNS
  461.  *  void
  462.  *****************************************************************************/
  463. void copy_direction_codes(U8 *dTypes, U8 *sTypes, U16 nCount)
  464. {
  465.     /*----------------------------------------------------------------*/
  466.     /* Local Variables                                                */
  467.     /*----------------------------------------------------------------*/
  468.     S16 iCount;
  469.     /*----------------------------------------------------------------*/
  470.     /* Code Body                                                      */
  471.     /*----------------------------------------------------------------*/
  472.     for (iCount = 0; iCount < nCount; iCount++)
  473.     {
  474.         dTypes[iCount] = sTypes[iCount];
  475.     }
  476. }