hxparse.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:17k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: hxparse.cpp,v 1.6.32.3 2004/07/09 01:48:15 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "hlxclib/stdlib.h"
  50. //#include "hlxclib/stdio.h"
  51. #include "hlxclib/ctype.h"
  52. #include "hxtypes.h"
  53. #include "hxresult.h"
  54. #include "hxcom.h"
  55. #include "chxxtype.h"
  56. #include "hxwintyp.h"
  57. #include "hxstring.h"
  58. #include "hxstrutl.h"
  59. #include "hxparse.h"
  60. #include "hxheap.h"
  61. #ifdef _DEBUG
  62. #undef HX_THIS_FILE
  63. static const char HX_THIS_FILE[] = __FILE__;
  64. #endif
  65. /*
  66.  * our smil/html color string table
  67.  */
  68. static const struct smilColorTable
  69. {
  70.     const char* m_pColorName;
  71.     UINT8 m_ucRed;
  72.     UINT8 m_ucGreen;
  73.     UINT8 m_ucBlue;
  74. } SmilColorTable[] =
  75. {
  76.     {"black",  0x00, 0x00, 0x00},
  77.     {"silver",  0xc0, 0xc0, 0xc0},
  78.     {"gray",   0x80, 0x80, 0x80},
  79.     {"white",  0xff, 0xff, 0xff},
  80.     {"maroon", 0x80, 0x00, 0x00},
  81.     {"red",    0xff, 0x00, 0x00},
  82.     {"purple", 0x80, 0x00, 0x80},
  83.     {"fuchsia", 0xff, 0x00, 0xff},
  84.     {"green", 0x00, 0x80, 0x00},
  85.     {"lime", 0x00, 0xff, 0x00},
  86.     {"olive", 0x80, 0x80, 0x00},
  87.     {"yellow", 0xff, 0xff, 0x00},
  88.     {"navy", 0x00, 0x00, 0x80},
  89.     {"blue", 0x00, 0x00, 0xff},
  90.     {"teal", 0x00, 0x80, 0x80},
  91.     {"aqua", 0x00, 0xff, 0xff},
  92.     {0, 0x00, 0x00, 0x00}
  93. };
  94. /****************************************************************************
  95.  *  getColorElement
  96.  *
  97.  *  parses a hex value from the string passed in.
  98.  */
  99. UINT8
  100. getColorElement(const char* pColorFrag, int len)
  101. {
  102.     UINT8 ucValue = 0;
  103.     char* pTmpBuf = new char[len+1];
  104.     strncpy(pTmpBuf, pColorFrag, len); /* Flawfinder: ignore */
  105.     pTmpBuf[len] = 0;
  106.     ucValue = (UINT8)strtol(pTmpBuf, 0, 16);
  107.     delete[] pTmpBuf;
  108.     return ucValue;
  109. }
  110. /****************************************************************************
  111.  *  HXParseColor
  112.  *
  113.  *  Parses a smil/html color string and returns its HXxColor value.  The
  114.  *  string should be in one of the following formats: "#RGB", "#RRGGBB",
  115.  *  or one of the pre-defined strings in the table at the top of this file.
  116.  */
  117. HX_RESULT
  118. HXParseColor(const char* pColorString, REF(HXxColor) theColor)
  119. {
  120.     HX_RESULT theErr = HXR_INVALID_PARAMETER;
  121.     theColor = 0;
  122.     UINT8 ucRed = 0;
  123.     UINT8 ucGreen = 0;
  124.     UINT8 ucBlue = 0;
  125.     if(pColorString[0] == '#')
  126.     {
  127. if(strlen(pColorString) == 4)
  128. {
  129.     /* #rgb, duplicate the numbers */
  130.     char tmpBuf[6]; /* Flawfinder: ignore */
  131.     tmpBuf[0] = tmpBuf[1] = pColorString[1];
  132.     tmpBuf[2] = tmpBuf[3] = pColorString[2];
  133.     tmpBuf[4] = tmpBuf[5] = pColorString[3];
  134.     ucRed = getColorElement(&tmpBuf[0], 2);
  135.     ucGreen = getColorElement(&tmpBuf[2], 2);
  136.     ucBlue = getColorElement(&tmpBuf[4], 2);
  137.     theErr = HXR_OK;
  138. }
  139. else if(strlen(pColorString) == 7)
  140. {
  141.     /* #rrggbb */
  142.     ucRed = getColorElement(&pColorString[1], 2);
  143.     ucGreen = getColorElement(&pColorString[3], 2);
  144.     ucBlue = getColorElement(&pColorString[5], 2);
  145.     theErr = HXR_OK;
  146. }
  147.     }
  148.     else if (!strncmp(pColorString, "rgb(", 4))
  149.     {
  150.         // This color is in the form rgb(0,128,255) or
  151.         // in the form rgb(0%,50%,100%)
  152.         //
  153.         // Make a copy of the string, since strtok
  154.         // is destructive
  155.         char* pCopy = new char [strlen(pColorString) + 1];
  156.         if (pCopy)
  157.         {
  158.             strcpy(pCopy, pColorString); /* Flawfinder: ignore */
  159.             // Get past the "rgb("
  160.             UINT32 ulTmp = 0;
  161.             char*  pStr  = strtok(pCopy, "(,)");
  162.             // Get the red string
  163.             pStr = strtok(NULL, "(,)");
  164.             if (pStr)
  165.             {
  166.                 // Use HXParseOpacity to parse the red component
  167.                 theErr = HXParseOpacity((const char*) pStr, ulTmp);
  168.                 if (SUCCEEDED(theErr))
  169.                 {
  170.                     // Assign the red component
  171.                     ucRed = (BYTE) ulTmp;
  172.                     // Get the green string
  173.                     pStr = strtok(NULL, "(,)");
  174.                     if (pStr)
  175.                     {
  176.                         // Use HXParseOpacity to parse the green component
  177.                         theErr = HXParseOpacity((const char*) pStr, ulTmp);
  178.                         if (SUCCEEDED(theErr))
  179.                         {
  180.                             // Assign the green component
  181.                             ucGreen = (BYTE) ulTmp;
  182.                             // Get the blue string
  183.                             pStr = strtok(NULL, "(,)");
  184.                             if (pStr)
  185.                             {
  186.                                 // Use HXParseOpacity to parse the blue component
  187.                                 theErr = HXParseOpacity((const char*) pStr, ulTmp);
  188.                                 if (SUCCEEDED(theErr))
  189.                                 {
  190.                                     // Assign the blue string
  191.                                     ucBlue = (BYTE) ulTmp;
  192.                                 }
  193.                             }
  194.                             else
  195.                             {
  196.                                 theErr = HXR_INVALID_PARAMETER;
  197.                             }
  198.                         }
  199.                     }
  200.                     else
  201.                     {
  202.                         theErr = HXR_INVALID_PARAMETER;
  203.                     }
  204.                 }
  205.             }
  206.         }
  207.         HX_VECTOR_DELETE(pCopy);
  208.     }
  209.     else
  210.     {
  211. // string, try to get it from the color table
  212. int i = 0;
  213. const char* pColorName = SmilColorTable[i].m_pColorName;
  214. while(pColorName)
  215. {
  216.     if(strcmp(pColorName, pColorString) == 0)
  217.     {
  218. ucRed = SmilColorTable[i].m_ucRed;
  219. ucBlue = SmilColorTable[i].m_ucBlue;
  220. ucGreen = SmilColorTable[i].m_ucGreen;
  221. theErr = HXR_OK;
  222. break;
  223.     }
  224.     pColorName = SmilColorTable[++i].m_pColorName;
  225. }
  226.     }
  227.     // Check and see if it's a system color definition.
  228.     // See http://www.w3.org/TR/REC-CSS2/ui.html#system-colors
  229.     // for more info about these.
  230. #ifdef _WINDOWS
  231.     if (FAILED(theErr))
  232.     {
  233.         BOOL  bMatch = FALSE;
  234.         INT32 lIndex = 0;
  235.         if (!strcasecmp(pColorString, "ActiveBorder"))
  236.         {
  237.             lIndex = COLOR_ACTIVEBORDER;
  238.             bMatch = TRUE;
  239.         }
  240.         else if (!strcasecmp(pColorString, "ActiveCaption"))
  241.         {
  242.             lIndex = COLOR_ACTIVECAPTION;
  243.             bMatch = TRUE;
  244.         }
  245.         else if (!strcasecmp(pColorString, "AppWorkspace"))
  246.         {
  247.             lIndex = COLOR_APPWORKSPACE;
  248.             bMatch = TRUE;
  249.         }
  250.         else if (!strcasecmp(pColorString, "Background"))
  251.         {
  252.             lIndex = COLOR_BACKGROUND;
  253.             bMatch = TRUE;
  254.         }
  255.         else if (!strcasecmp(pColorString, "ButtonFace"))
  256.         {
  257.             lIndex = COLOR_BTNFACE;
  258.             bMatch = TRUE;
  259.         }
  260.         else if (!strcasecmp(pColorString, "ButtonHighlight"))
  261.         {
  262.             lIndex = COLOR_BTNHILIGHT;
  263.             bMatch = TRUE;
  264.         }
  265.         else if (!strcasecmp(pColorString, "ButtonShadow"))
  266.         {
  267.             lIndex = COLOR_BTNSHADOW;
  268.             bMatch = TRUE;
  269.         }
  270.         else if (!strcasecmp(pColorString, "ButtonText"))
  271.         {
  272.             lIndex = COLOR_BTNTEXT;
  273.             bMatch = TRUE;
  274.         }
  275.         else if (!strcasecmp(pColorString, "CaptionText"))
  276.         {
  277.             lIndex = COLOR_CAPTIONTEXT;
  278.             bMatch = TRUE;
  279.         }
  280.         else if (!strcasecmp(pColorString, "GrayText"))
  281.         {
  282.             lIndex = COLOR_GRAYTEXT;
  283.             bMatch = TRUE;
  284.         }
  285.         else if (!strcasecmp(pColorString, "Highlight"))
  286.         {
  287.             lIndex = COLOR_HIGHLIGHT;
  288.             bMatch = TRUE;
  289.         }
  290.         else if (!strcasecmp(pColorString, "HighlightText"))
  291.         {
  292.             lIndex = COLOR_HIGHLIGHTTEXT;
  293.             bMatch = TRUE;
  294.         }
  295.         else if (!strcasecmp(pColorString, "InactiveBorder"))
  296.         {
  297.             lIndex = COLOR_INACTIVEBORDER;
  298.             bMatch = TRUE;
  299.         }
  300.         else if (!strcasecmp(pColorString, "InactiveCaption"))
  301.         {
  302.             lIndex = COLOR_INACTIVECAPTION;
  303.             bMatch = TRUE;
  304.         }
  305.         else if (!strcasecmp(pColorString, "InactiveCaptionText"))
  306.         {
  307.             lIndex = COLOR_INACTIVECAPTIONTEXT;
  308.             bMatch = TRUE;
  309.         }
  310.         else if (!strcasecmp(pColorString, "InfoBackground"))
  311.         {
  312.             lIndex = COLOR_INFOBK;
  313.             bMatch = TRUE;
  314.         }
  315.         else if (!strcasecmp(pColorString, "InfoText"))
  316.         {
  317.             lIndex = COLOR_INFOTEXT;
  318.             bMatch = TRUE;
  319.         }
  320.         else if (!strcasecmp(pColorString, "Menu"))
  321.         {
  322.             lIndex = COLOR_MENU;
  323.             bMatch = TRUE;
  324.         }
  325.         else if (!strcasecmp(pColorString, "MenuText"))
  326.         {
  327.             lIndex = COLOR_MENUTEXT;
  328.             bMatch = TRUE;
  329.         }
  330.         else if (!strcasecmp(pColorString, "Scrollbar"))
  331.         {
  332.             lIndex = COLOR_SCROLLBAR;
  333.             bMatch = TRUE;
  334.         }
  335.         else if (!strcasecmp(pColorString, "ThreeDDarkShadow"))
  336.         {
  337.             lIndex = COLOR_3DDKSHADOW;
  338.             bMatch = TRUE;
  339.         }
  340.         else if (!strcasecmp(pColorString, "ThreeDFace"))
  341.         {
  342.             lIndex = COLOR_3DFACE;
  343.             bMatch = TRUE;
  344.         }
  345.         else if (!strcasecmp(pColorString, "ThreeDHighlight"))
  346.         {
  347.             lIndex = COLOR_3DHILIGHT;
  348.             bMatch = TRUE;
  349.         }
  350.         else if (!strcasecmp(pColorString, "ThreeDLightShadow"))
  351.         {
  352.             lIndex = COLOR_3DLIGHT;
  353.             bMatch = TRUE;
  354.         }
  355.         else if (!strcasecmp(pColorString, "ThreeDShadow"))
  356.         {
  357.             lIndex = COLOR_3DSHADOW;
  358.             bMatch = TRUE;
  359.         }
  360.         else if (!strcasecmp(pColorString, "Window"))
  361.         {
  362.             lIndex = COLOR_WINDOW;
  363.             bMatch = TRUE;
  364.         }
  365.         else if (!strcasecmp(pColorString, "WindowFrame"))
  366.         {
  367.             lIndex = COLOR_WINDOWFRAME;
  368.             bMatch = TRUE;
  369.         }
  370.         else if (!strcasecmp(pColorString, "WindowText"))
  371.         {
  372.             lIndex = COLOR_WINDOWTEXT;
  373.             bMatch = TRUE;
  374.         }
  375.         if (bMatch)
  376.         {
  377.             UINT32 ulColor = GetSysColor(lIndex);
  378.             ucRed          = GetRValue(ulColor);
  379.             ucGreen        = GetGValue(ulColor);
  380.             ucBlue         = GetBValue(ulColor);
  381.             theErr         = HXR_OK;
  382.         }
  383.     }
  384. #endif
  385. #ifdef _WINDOWS
  386.     theColor = (HXxColor)(RGB(ucRed, ucGreen, ucBlue));
  387. #else
  388.     theColor = (HXxColor)
  389.     (ucRed << 16 |
  390.     ucGreen << 8 |
  391.     ucBlue);
  392. #endif
  393.     return theErr;
  394. }
  395. HX_RESULT
  396. HXParseDigit(const char* pDigitString, REF(INT32) ulOut)
  397. {
  398.     // validate it first. ([whitespace][sign]digits)
  399.     HX_RESULT ret = HXR_OK;
  400.     const char* pBuf = pDigitString;
  401.     
  402.     // clear white space.
  403.     while (*pBuf && isspace(*pBuf))
  404.     {
  405. ++pBuf;
  406.     }
  407.     // check for sign
  408.     if (*pBuf == '+' || *pBuf == '-')
  409.     {
  410. ++pBuf;
  411.     }
  412.     // validate all else is a digit
  413.     while (*pBuf)
  414.     {
  415. if (!isdigit(*pBuf))
  416. {
  417.     ret = HXR_FAIL;
  418.     break;
  419. }
  420. ++pBuf;
  421.     }
  422.     // run the conversion anyway... just in case the user wants
  423.     // to ignor the error.
  424.     ulOut = atol(pDigitString);
  425.     return ret;
  426. }
  427. HX_RESULT
  428. HXParseDouble(const char* pDoubleString, REF(double) dOut)
  429. {
  430.     // validate it first. 
  431.     // ([whitespace][sign][digits][.digits][{d|D|e|E}[sign]digits])
  432.     HX_RESULT ret = HXR_OK;
  433.     const char* pBuf = pDoubleString;
  434.     // clear white space.
  435.     while (*pBuf && isspace(*pBuf))
  436.     {
  437. ++pBuf;
  438.     }
  439.     // check for sign
  440.     if (*pBuf == '+' || *pBuf == '-')
  441.     {
  442. ++pBuf;
  443.     }
  444.     while (isdigit(*pBuf))
  445.     {
  446. ++pBuf;
  447.     }
  448.     if (*pBuf == '.')
  449.     {
  450. ++pBuf;
  451.     }
  452.     while (isdigit(*pBuf))
  453.     {
  454. ++pBuf;
  455.     }
  456.     if (*pBuf == 'd' || *pBuf == 'D' || *pBuf == 'e' || *pBuf == 'E')
  457.     {
  458. ++pBuf;
  459. if (*pBuf == '+' || *pBuf == '-')
  460. {
  461.     ++pBuf;
  462. }
  463. while (isdigit(*pBuf))
  464. {
  465.     ++pBuf;
  466. }
  467.     }
  468.     
  469.     // we will allow whitespace at the end of the buffer,
  470.     while (isspace(*pBuf))
  471.     {
  472. ++pBuf;
  473.     }
  474.     // now if we are not at the NULL termination something is wrong with the
  475.     // string.
  476.     if (*pBuf != '')
  477.     {
  478. ret = HXR_INVALID_PARAMETER;
  479.     }
  480.     // run the conversion anyway...  The string might simply have junk at 
  481.     // the end of it, in which case the error *might* want to be ignored.
  482.     dOut = atof(pDoubleString);
  483.     return ret;
  484. }
  485. HX_RESULT HXParseColorUINT32(const char* pszStr, REF(UINT32) rulValue)
  486. {
  487.     HX_RESULT retVal = HXR_OK;
  488.     if (pszStr)
  489.     {
  490.         HXxColor cColor;
  491.         retVal = HXParseColor(pszStr, cColor);
  492.         if (SUCCEEDED(retVal))
  493.         {
  494.             rulValue = (UINT32) cColor;
  495. #if defined(_WINDOWS)
  496.             // HXParseColor produces 0x00BBGGRR on Windows - 
  497.             // do the swap back to 0x00RRGGBB
  498.             rulValue = ((rulValue & 0x00FF0000) >> 16)  |
  499.                         (rulValue & 0x0000FF00)         |
  500.                        ((rulValue & 0x000000FF) << 16);
  501. #endif
  502.         }
  503.     }
  504.     else
  505.     {
  506.         retVal = HXR_FAIL;
  507.     }
  508.     return retVal;
  509. }
  510. HX_RESULT HXParsePercent(const char* pszStr, REF(double) rdValue)
  511. {
  512.     HX_RESULT retVal = HXR_FAIL;
  513.     if (pszStr)
  514.     {
  515.         char*  pEndPtr = NULL;
  516.         double dVal    = strtod(pszStr, &pEndPtr);
  517.         if (pEndPtr && *pEndPtr == '%')
  518.         {
  519.             rdValue = dVal;
  520.             retVal  = HXR_OK;
  521.         }
  522.     }
  523.     return retVal;
  524. }
  525. HX_RESULT HXParseUINT32(const char* pszStr, REF(UINT32) rulValue)
  526. {
  527.     HX_RESULT retVal = HXR_OK;
  528.     if (pszStr)
  529.     {
  530.         INT32 lVal = 0;
  531.         retVal     = HXParseDigit(pszStr, lVal);
  532.         if (SUCCEEDED(retVal))
  533.         {
  534.             if (lVal >= 0)
  535.             {
  536.                 rulValue = (UINT32) lVal;
  537.             }
  538.             else
  539.             {
  540.                 retVal = HXR_FAIL;
  541.             }
  542.         }
  543.     }
  544.     else
  545.     {
  546.         retVal = HXR_FAIL;
  547.     }
  548.     return retVal;
  549. }
  550. HX_RESULT HXParseOpacity(const char* pszStr, REF(UINT32) rulValue)
  551. {
  552.     HX_RESULT retVal = HXR_OK;
  553.     if (pszStr)
  554.     {
  555.         // First attempt to parse as a percent
  556.         INT32  lValue   = 0;
  557.         double dPercent = 0.0;
  558.         retVal = HXParsePercent(pszStr, dPercent);
  559.         if (SUCCEEDED(retVal))
  560.         {
  561.             // Scale from 0-100% to 0-255 with rounding
  562.             lValue = (INT32) (dPercent * 255.0 / 100.0 + 0.5);
  563.         }
  564.         else
  565.         {
  566.             // It wasn't a percent, so try and parse as digits
  567.             retVal = HXParseDigit(pszStr, lValue);
  568.         }
  569.         if (SUCCEEDED(retVal))
  570.         {
  571.             // Clamp to 0-255
  572.             if (lValue < 0)   lValue = 0;
  573.             if (lValue > 255) lValue = 255;
  574.             // Assign the out parameter
  575.             rulValue = (UINT32) lValue;
  576.         }
  577.     }
  578.     else
  579.     {
  580.         retVal = HXR_FAIL;
  581.     }
  582.     return retVal;
  583. }