NewData.cxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:14k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* ====================================================================
  2.  * The Vovida Software License, Version 1.0 
  3.  * 
  4.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  * 
  18.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  19.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  20.  *    not be used to endorse or promote products derived from this
  21.  *    software without prior written permission. For written
  22.  *    permission, please contact vocal@vovida.org.
  23.  *
  24.  * 4. Products derived from this software may not be called "VOCAL", nor
  25.  *    may "VOCAL" appear in their name, without prior written
  26.  *    permission of Vovida Networks, Inc.
  27.  * 
  28.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  29.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  31.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  32.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  33.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  34.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  35.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  36.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  37.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  39.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  40.  * DAMAGE.
  41.  * 
  42.  * ====================================================================
  43.  * 
  44.  * This software consists of voluntary contributions made by Vovida
  45.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  46.  * Inc.  For more information on Vovida Networks, Inc., please see
  47.  * <http://www.vovida.org/>.
  48.  *
  49.  */
  50. static const char* const NewData_cxx_Version =
  51.     "$Id: NewData.cxx,v 1.16 2001/06/29 03:56:00 bko Exp $";
  52. //Authors: Sunitha Kumar, Cullen Jennings
  53. //#include <cstdio>
  54. //#include <ctype.h>
  55. #include "cpLog.h"
  56. #include "NewData.hxx"
  57. #include "DataException.hxx"
  58. #if USE_HASH_MAP
  59. #if (defined(__GNUC__) && (__GNUC__ < 3))
  60. #include <hash_map>
  61. #else
  62. #if defined(__GNUC__)
  63. #include <ext/hash_map>
  64. #endif
  65. #endif
  66. #endif
  67. NewData::NewData()
  68. {
  69.     const char* str = "";
  70.     buflen = boundary(strlen(str) + 1);
  71.     buf = new char[buflen];
  72.     strcpy(buf, str);
  73. }
  74. NewData::NewData( const char* str, int length )
  75. {
  76.     str = str ? str : "";
  77.     buflen = boundary(strlen(str) + 1);
  78.     buf = new char[buflen];
  79.     strcpy(buf, str);
  80. }
  81. NewData::NewData( const char* str )
  82. {
  83.     str = str ? str : "";
  84.     buflen = boundary(strlen(str) + 1);
  85.     buf = new char[buflen];
  86.     strcpy(buf, str);
  87. }
  88. NewData::NewData( const string& str)
  89. {
  90.     buflen = boundary(str.length() + 1);
  91.     buf = new char[buflen];
  92.     strcpy(buf, str.c_str());
  93. }
  94. NewData::NewData( const mstring& mstr)
  95. {
  96.     buflen = boundary(mstr.length() + 1);
  97.     buf = new char[buflen];
  98.     strcpy(buf, mstr.c_str());
  99. }
  100. NewData::NewData( int value)
  101. {
  102.     char str[256];
  103.     sprintf(str, "%d", value);
  104.     buflen = boundary(strlen(str) + 1);
  105.     buf = new char[buflen];
  106.     strcpy(buf, str);
  107. }
  108. NewData::NewData( const NewData& data )
  109. {
  110.     buflen = boundary(strlen(data.buf) + 1);
  111.     buf = new char[buflen];
  112.     strcpy(buf, data.buf);
  113. }
  114. NewData&
  115. NewData::operator=( const char* str )
  116. {
  117.     int reqlen = strlen(str) + 1;
  118.     if (reqlen < buflen)
  119.     {
  120.         strcpy(buf, str);
  121.     }
  122.     else
  123.     {
  124.         buflen = boundary(reqlen);
  125.         delete [] buf;
  126.         buf = new char[buflen];
  127.         strcpy(buf, str);
  128.     }
  129.     return (*this);
  130. }
  131. NewData&
  132. NewData::operator=( const NewData& data )
  133. {
  134.     if (this != &data)
  135.     {
  136.         int reqlen = strlen(data.buf) + 1;
  137.         if (reqlen < buflen)
  138.         {
  139.             strcpy(buf, data.buf);
  140.         }
  141.         else
  142.         {
  143.             buflen = boundary(reqlen);
  144.             delete [] buf;
  145.             buf = new char[buflen];
  146.             strcpy(buf, data.buf);
  147.         }
  148.     }
  149.     return (*this);
  150. }
  151. const char*
  152. NewData::getData() const
  153. {
  154.     return buf;
  155. }
  156. const char*
  157. NewData::getDataBuf() const
  158. {
  159.     return buf;
  160. }
  161. int
  162. NewData::boundary(int len) const
  163. {
  164.     const int step = 64;
  165.     int res = (len / step);
  166.     if (res == 0)
  167.         return step;
  168.     if (res > 0)
  169.     {
  170.         int count = 1;
  171.         do
  172.         {
  173.             count = count * 2;
  174.             if (res < count)
  175.                 return (count * step);
  176.         }
  177.         while (res >= count);
  178.         return step;
  179.     }
  180.     return step;
  181. }
  182. char
  183. NewData::getChar(int i) const
  184. {
  185.     if (( i < 0 ) || (i > static_cast < int > (strlen(buf)) ) )
  186.     {
  187.         cpLog(LOG_ERR, "NewData:getchar: i is out of range.");
  188.         throw DataException(
  189.             "i is out of range",
  190.             __FILE__,
  191.             __LINE__
  192.         );
  193.         return '';
  194.     }
  195.     return buf[i];
  196. }
  197. void NewData::setchar(int i, char c)
  198. {
  199.     if (( i < 0) || (i > static_cast < int > (strlen(buf)) ) )
  200.     {
  201.         cpLog(LOG_ERR, "NewData:setchar: i is out of range.");
  202.         throw DataException(
  203.             "i is out of range",
  204.             __FILE__,
  205.             __LINE__
  206.         );
  207.     }
  208.     else
  209.     {
  210.         buf[i] = c;
  211.     }
  212. }
  213. char
  214. NewData::operator[](int i)
  215. {
  216.     char ch;
  217.     ch = buf[i];
  218.     return ch;
  219. }
  220. int
  221. NewData::length() const
  222. {
  223.     return strlen(buf);
  224. }
  225. bool NewData::operator==(const char* str) const
  226. {
  227. #if 0
  228.     char* ptr = bitsPtr;
  229.     int leftSize = size;
  230.     while (leftSize && rightSize)
  231.     {
  232.         if (*ptr < *str)
  233.         {
  234.             return -1;
  235.         }
  236.         if (*ptr > *str)
  237.         {
  238.             return 1;
  239.         }
  240.         leftSize--;
  241.         rightSize--;
  242.         ptr++;
  243.         str++;
  244.     }
  245.     if (leftSize < rightSize)
  246.     {
  247.         return -1;
  248.     }
  249.     else if (leftSize > rightSize)
  250.     {
  251.         return 1;
  252.     }
  253.     else
  254.     {
  255.         return 0;
  256.     }
  257. #endif
  258.     return (strcmp(buf, str) == 0);
  259. }
  260. bool NewData::operator==( const NewData& data) const
  261. {
  262.     int comparison = strcmp(buf, data.buf);
  263. #if 1 
  264.     return ( comparison == 0 );
  265. #else
  266.     if (data.hashfn() == hashfn())
  267.     {
  268.         return ( comparison == 0 );
  269.     }
  270.     else
  271.     {
  272.         return false;
  273.     }
  274. #endif
  275. }
  276. bool NewData::operator!=(const char* str) const
  277. {
  278.     int comparison = strcmp(buf, str);
  279.     return ( comparison != 0 );
  280. }
  281. bool NewData::operator!=(const NewData& data) const
  282. {
  283.     int comparison = strcmp(buf, data.buf);
  284.     return ( comparison != 0 );
  285. #if 0
  286.     if (data.hashfn() == hashfn())
  287.     {
  288.         return ( comparison != 0 );
  289.     }
  290.     else
  291.     {
  292.         return true;
  293.     }
  294. #endif
  295. }
  296. bool
  297. NewData::operator>(const NewData& data) const
  298. {
  299.     int comparison = strcmp(buf, data.buf);
  300.     return ( comparison > 0 );
  301. }
  302. bool
  303. NewData::operator<(const NewData& data) const
  304. {
  305.     int comparison = strcmp(buf, data.buf);
  306.     return ( comparison < 0 );
  307. }
  308. NewData
  309. NewData::operator+(const NewData& data) const
  310. {
  311.   //char newbuf[1];
  312.     
  313.     char* newbuf = new char[strlen(buf) + strlen(data.buf) + 1];
  314.     strcpy(newbuf, buf);
  315.     strcat(newbuf, data.buf);
  316.     NewData temp(newbuf);
  317.     delete [] newbuf;
  318.     return temp;
  319. }
  320. NewData
  321. NewData::operator+(const char* str) const
  322. {
  323.     char* newbuf = new char[strlen(buf) + strlen(str) + 1];
  324.     strcpy(newbuf, buf);
  325.     strcat(newbuf, str);
  326.     NewData temp(newbuf);
  327.     delete [] newbuf;
  328.     return temp;
  329. }
  330. /*
  331. void
  332. Data::replace(int startpos, int replaceLen, const char* replaceStr)
  333. {
  334.     char* newbuf = new char[strlen(buf) + 1];
  335.     string str = string(buf);
  336.     str.replace(startpos, replaceLen, replaceStr);
  337.     strcpy (newbuf, str.c_str());
  338.     delete [] buf;
  339.     buf = newbuf;
  340. }
  341. */
  342. void
  343. NewData::replace(int startpos, int endpos, const NewData& replaceStr)
  344. {
  345.     string str = string(buf);
  346.     str.string::replace(startpos, endpos, replaceStr.operator string());
  347.     int reqlen = str.length() + 1;
  348.     if (reqlen < buflen)
  349.     {
  350.         strcpy(buf, str.c_str());
  351.     }
  352.     else
  353.     {
  354.         buflen = boundary(reqlen);
  355.         char* newbuf = new char[buflen];
  356.         strcpy (newbuf, str.c_str());
  357.         delete [] buf;
  358.         buf = newbuf;
  359.     }
  360. }
  361. void
  362. NewData::operator+=(const NewData& data)
  363. {
  364.     *this = *this + data;
  365. }
  366. void
  367. NewData::operator+=(const char* str)
  368. {
  369.     *this = *this + str;
  370. }
  371. NewData::~NewData()
  372. {
  373.     delete [] buf;
  374. }
  375. void
  376. NewData::erase()
  377. {
  378.     strcpy (buf, "");
  379. }
  380. NewData::operator string() const
  381. {
  382.     return string(buf);
  383. }
  384. NewData::operator const char*() const
  385. {
  386.     return buf;
  387. }
  388. NewData::operator mstring() const
  389. {
  390.     return mstring(buf);
  391. }
  392. NewData::operator int() const
  393. {
  394.     return atoi( buf );
  395. }
  396. int NewData::match( const char* match, 
  397.     NewData* retModifiedNewData, 
  398.     bool doReplace, 
  399.     NewData replaceWith)
  400. {
  401. #if 1
  402.     int retVal;
  403.     string::size_type pos = (string(buf)).find(match);
  404.     if (pos == string::npos)
  405.     {
  406.         cpLog(LOG_DEBUG_STACK, "Match not found");
  407.         return NOT_FOUND;
  408.     }
  409.     string::size_type replacePos = pos + strlen(match);
  410.     retVal = FIRST;
  411.     if (retModifiedNewData)
  412.     {
  413.         (*retModifiedNewData) = (string(buf)).substr(0, pos);
  414.         if (retModifiedNewData->length()) retVal = FOUND;
  415.     }
  416.     if (doReplace)
  417.     {
  418.         if (replacePos <= strlen(buf) )
  419.         {
  420.             replace(0, replacePos, replaceWith.getData());
  421.         }
  422.         else
  423.         {
  424.             printf("buf =<%s> match =<%s>n", buf , match );
  425.             printf("pos=%d  match.len=%d replacePos=%d  buf.size()= %dn",
  426.                    pos,
  427.                    strlen(match),
  428.                    replacePos,
  429.                    strlen(buf) );
  430.         }
  431.     }
  432.     return retVal;
  433. #else
  434.     int pos = static_cast < int > ((string(buf)).find(match.getData()));
  435.     if (pos == static_cast < int > (string::npos))
  436.     {
  437.         cpLog(LOG_DEBUG_STACK, "Match not found");
  438.         pos = NOT_FOUND;
  439.     }
  440.     else
  441.     {
  442.         if (data)
  443.         {
  444.             (*data) = (string(buf)).substr(0, pos);
  445.         }
  446.         if (doReplace)
  447.         {
  448.             replace(0, (pos + match.length()), replaceWith.getData());
  449.         }
  450.         else
  451.         {
  452.         }
  453.         if ( (data->length() == 0) && (pos != ( (int) string::npos) ) )
  454.         {
  455.             //the match string is the first item.
  456.             pos = -2;
  457.             pos = FIRST;
  458.         }
  459.     }
  460.     if ( (pos != NOT_FOUND) && (pos != FIRST) )
  461.     {
  462.         pos = FOUND;
  463.     }
  464.     return pos;
  465. #endif
  466. }
  467. /*
  468.  
  469. int  Data::match( const Data& match, Data* retModifiedData, bool doReplace, const Data& replaceWith)
  470. {
  471.     int retVal;
  472.     string::size_type pos = buf.find(match.getData());
  473.     
  474.     if (pos == string::npos)
  475.     {
  476.         cpLog(LOG_DEBUG_STACK, "Match not found");
  477.         return NOT_FOUND;
  478.     }
  479.  
  480.     string::size_type replacePos = pos + match.length();
  481.     retVal = FIRST;
  482.  
  483.     if (retModifiedData)
  484.     {
  485.         (*retModifiedData) = buf.substr(0, pos);
  486. if(retModifiedData->length()) retVal = FOUND;
  487.     }
  488.  
  489.     if (doReplace)
  490.     {
  491.         newbuf = new char[strlen(buf) + 1];
  492.         strcpy(newbuf, replaceWith.buf);
  493.         strcat(newbuf, buf);
  494.         strcpy(
  495.         buf.replace(0, replacePos, replaceWith.getData());
  496.     }
  497.  
  498.     return retVal;
  499. }
  500.  
  501. */
  502. bool isEqualNoCase( const NewData& leftData, const NewData& rightData )
  503. {
  504.     string leftbuf(leftData.buf);
  505.     string rightbuf(rightData.buf);
  506.     string::const_iterator leftIter = leftbuf.begin();
  507.     string::const_iterator rightIter = rightbuf.begin();
  508.     while ( (leftIter != leftbuf.end()) && (rightIter != rightbuf.end()) )
  509.     {
  510.         if (toupper(*leftIter) != toupper(*rightIter))
  511.         {
  512.             return false;
  513.         }
  514.         ++leftIter;
  515.         ++rightIter;
  516.     }
  517.     if ( (leftIter != leftbuf.end()) || (rightIter != rightbuf.end()) )
  518.     {
  519.         // since both aren't the same length, they're not equal
  520.         return false;
  521.     }
  522.     return true;
  523. }
  524. void NewData::removeSpaces()
  525. {
  526.     //removes spaces before and after the characters.
  527.     //Leaves the embedded spaces as is.
  528.     if (strlen(buf) == 0)
  529.     {
  530.         return ;
  531.     }
  532.     char space = SPACE[0];
  533.     char ch = buf[0];
  534.     do
  535.     {
  536.         if (strlen(buf) == 0)
  537.             break;
  538.         if ( ch == space)
  539.         {
  540.             replace(0, strlen(SPACE), "");
  541.             ch = buf[0];
  542.         }
  543.         else
  544.         {
  545.             break;
  546.         }
  547.     }
  548.     while (ch == space);
  549.     ch = buf[strlen(buf) - 1];
  550.     do
  551.     {
  552.         if (strlen(buf) == 0)
  553.             break;
  554.         //if there are chars after val, discard .
  555.         if (ch == space)
  556.         {
  557.             replace(strlen(buf) - 1, (strlen(buf) - 1) + strlen(SPACE) , "");
  558.             ch = buf[strlen(buf) - 1];
  559.         }
  560.         else
  561.         {
  562.             break;
  563.         }
  564.     }
  565.     while (ch == space);
  566. }
  567. void
  568. NewData::expand(NewData startFrom, NewData findstr, NewData replstr, NewData delimiter)
  569. {
  570.     string::size_type startPos = (string(buf)).find(startFrom.getData());
  571.     if (startPos < string::npos)
  572.     {
  573.         string::size_type delimPos = (string(buf)).find(delimiter.getData(), startPos);
  574.         string::size_type findPos = (string(buf)).find( findstr.getData(), startPos);
  575.         while (findPos < delimPos)
  576.         {
  577.             //found replstr, replace
  578.             replace( findPos, strlen(findstr.getData()), replstr.getData());
  579.             //find next.
  580.             //delimPos = buf.find( delimiter.getData(), findPos);
  581.             delimPos = (string(buf)).find( delimiter.getData(), findPos + static_cast < string > (replstr.getData()).size() );
  582.             findPos = (string(buf)).find( findstr.getData(), findPos);
  583.         }
  584.     }
  585. }