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

流媒体/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 281421,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 CharDataParser_cxx_Version =
  51.     "$Id: CharDataParser.cxx,v 1.5 2001/05/15 20:26:12 bko Exp $";
  52. #include <stdio.h>
  53. #include <assert.h>
  54. #include "CharDataParser.hxx"
  55. u_int8_t CharDataParser::myMaskNonWord[] =
  56. {
  57. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //0-9 
  58. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //10-19 
  59. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //20-29
  60. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //30-39 
  61. 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, //40-49 '-' consider  a word
  62. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //50-59
  63. 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, //60-69 65-90 are word
  64. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //70-79
  65. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //80-89
  66. 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, //90-99 '_' consider a word, 97-122 are word
  67. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //100-109
  68. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //110-119
  69. 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, //120-129
  70. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //130-139
  71. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //140-149
  72. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //150-159
  73. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //160-169
  74. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //170-179
  75. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //180-189
  76. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //190-199
  77. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //200-209
  78. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //210-219
  79. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //220-229
  80. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //230-239
  81. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //240-249
  82. 1, 1, 1, 1, 1, 1    //250-255
  83. };
  84. u_int8_t CharDataParser::myMaskDigit[] =
  85. {
  86. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0-9
  87. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //10-19 
  88. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //20-29
  89. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //30-39
  90. 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, //40-49 48-57 are digit
  91. 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, //50-59
  92. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //60-69 
  93. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //70-79
  94. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //80-89
  95. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //90-99
  96. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //100-109
  97. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //110-119
  98. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //120-129
  99. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //130-139
  100. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //140-149
  101. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //150-159
  102. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //160-169
  103. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //170-179
  104. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //180-189
  105. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //190-199
  106. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //200-209
  107. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //210-219
  108. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //220-229
  109. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //230-239
  110. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //240-249
  111. 0, 0, 0, 0, 0, 0   //250-255
  112. };
  113. u_int8_t CharDataParser::myMaskNonSpace[] =
  114. {
  115. 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, //0-9      't' is space
  116. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //10-19  
  117. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //20-29
  118. 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, //30-39    ' ' is space 
  119. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //40-49
  120. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //50-59
  121. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //60-69
  122. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //70-79
  123. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //80-89
  124. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //90-99
  125. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //100-109
  126. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //110-119
  127. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //120-129
  128. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //130-139
  129. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //140-149
  130. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //150-159
  131. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //160-169
  132. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //170-179
  133. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //180-189
  134. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //190-199
  135. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //200-209
  136. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //210-219
  137. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //220-229
  138. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //230-239
  139. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //240-249
  140. 1, 1, 1, 1, 1, 1    //250-255
  141. };
  142. u_int8_t CharDataParser::myMaskEol[] =
  143. {
  144. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0-9   
  145. 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, //10-19  'r' & 'n' are EOL
  146. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //20-29
  147. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //30-39 
  148. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //40-49
  149. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //50-59
  150. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //60-69  
  151. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //70-79
  152. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //80-89
  153. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //90-99
  154. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //100-109
  155. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //110-119
  156. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //120-129
  157. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //130-139
  158. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //140-149
  159. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //150-159
  160. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //160-169
  161. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //170-179
  162. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //180-189
  163. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //190-199
  164. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //200-209
  165. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //210-219
  166. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //220-229
  167. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //230-239
  168. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //240-249
  169. 0, 0, 0, 0, 0, 0    //250-255
  170. };
  171. u_int8_t CharDataParser::myMaskEolSpace[] =
  172. {
  173. 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, //0-9    't' is space
  174. 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, //10-19   'r' & 'n' are EOL
  175. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //20-29
  176. 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, //30-39  ' '  is space
  177. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //40-49
  178. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //50-59
  179. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //60-69  
  180. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //70-79
  181. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //80-89
  182. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //90-99
  183. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //100-109
  184. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //110-119
  185. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //120-129
  186. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //130-139
  187. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //140-149
  188. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //150-159
  189. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //160-169
  190. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //170-179
  191. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //180-189
  192. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //190-199
  193. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //200-209
  194. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //210-219
  195. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //220-229
  196. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //230-239
  197. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //240-249
  198. 0, 0, 0, 0, 0, 0    //250-255
  199. };
  200. int
  201. CharDataParser::parseUntil(CharData* outbuf, char stopChar)
  202. {
  203. assert(myCurPtr != NULL);
  204. assert(myEndPtr != NULL);
  205. assert(myCurPtr <= myEndPtr);
  206. const char* startSave = myCurPtr;
  207. while ((myCurPtr < myEndPtr) && (*myCurPtr != stopChar))
  208. myCurPtr++;
  209. if (outbuf != NULL)
  210. {
  211. outbuf->set(startSave, myCurPtr - startSave);
  212. }
  213.     if (myCurPtr == myEndPtr)
  214.         return 0;
  215.     return 1;
  216. }
  217. int
  218. CharDataParser::parseUntil(CharData* outbuf, u_int8_t* mask)
  219. {
  220. assert(myCurPtr != NULL);
  221. assert(myEndPtr != NULL);
  222. assert(myCurPtr <= myEndPtr);
  223. const char* startSave = myCurPtr;
  224. while ((myCurPtr < myEndPtr) && (!mask[*myCurPtr]))
  225. myCurPtr++;
  226. if (outbuf != NULL)
  227. {
  228. outbuf->set(startSave, myCurPtr - startSave);
  229. }
  230.     if (myCurPtr == myEndPtr)
  231.         return 0;
  232.     return 1;
  233. }
  234. int
  235. CharDataParser::parseThru(CharData* outbuf, char stopChar)
  236. {
  237.     if ( parseUntil(outbuf, stopChar) )
  238.     {
  239.         myCurPtr++;
  240.         if (outbuf)
  241.             outbuf->setLen(outbuf->getLen() + 1);
  242.         return 1;
  243.     }
  244.     return 0;
  245. }
  246. int
  247. CharDataParser::parseThru(CharData* outbuf, u_int8_t* mask)
  248. {
  249. assert(myCurPtr != NULL);
  250. assert(myEndPtr != NULL);
  251. assert(myCurPtr <= myEndPtr);
  252. const char* startSave = myCurPtr;
  253. while ((myCurPtr < myEndPtr) && (mask[*myCurPtr]))
  254. myCurPtr++;
  255. if (outbuf != NULL)
  256. {
  257. outbuf->set(startSave, myCurPtr - startSave);
  258. }
  259.     if (myCurPtr == startSave)
  260.         return 0;
  261.     return 1;
  262. }
  263. int 
  264. CharDataParser::getNextLine(CharData* outbuf)
  265. {
  266. int retVal = 0;
  267.     if ( parseUntil(outbuf, myMaskEol) )
  268.     {
  269.     if ((*myCurPtr == 'r') || (*myCurPtr == 'n'))
  270.     {
  271.     retVal = 1;
  272.     myCurPtr++;
  273.             if (outbuf)
  274.                 outbuf->setLen(outbuf->getLen() + 1);
  275.     //check for a rn
  276.     if ((myCurPtr < myEndPtr) && ((*(myCurPtr - 1) == 'r') 
  277.                 && (*myCurPtr == 'n')))
  278.             {
  279.     myCurPtr++;
  280.                 if (outbuf)
  281.                     outbuf->setLen(outbuf->getLen() + 1);
  282.             }
  283.     }
  284.     }
  285. return retVal;
  286. }
  287. int
  288. CharDataParser::getNextInteger(u_int32_t& num)
  289. {
  290.     CharData numberChar;
  291.     if ( parseThru(&numberChar, myMaskDigit) )
  292.     {
  293.     u_int32_t value = 0;
  294.         for (u_int32_t i = 0; i < numberChar.getLen(); i++)
  295.         {
  296.             value = (value * 10) + (numberChar[i] - '0');
  297.         }
  298.     num = value;
  299.         return 1;
  300.     }
  301.     return 0;
  302. }
  303. int
  304. CharDataParser::getNextDouble(double& doubleNum)
  305. {
  306.     doubleNum = 0.0;
  307.     u_int32_t decimal;
  308.     if (getNextInteger(decimal))
  309.     {
  310.         doubleNum = decimal;
  311.         if (*myCurPtr == '.')
  312.             myCurPtr++;
  313.     }
  314.     else
  315.     {
  316.         if (*myCurPtr == '.')
  317.             myCurPtr++;
  318.         else
  319.             return 0;
  320.     }
  321.     double multip = .1;
  322.     CharData fractChar;
  323.     if ( parseThru(&fractChar, myMaskDigit) )
  324.     {
  325.         for (u_int32_t i = 0; i < fractChar.getLen(); i++)
  326.         {
  327.             doubleNum += (multip * (fractChar[i] - '0'));
  328.             multip *= .1;
  329.         }
  330.     }
  331.     return 1;
  332. }
  333. int
  334. CharDataParser::getThruLength(CharData* outbuf, int length)
  335. {
  336.     assert(myCurPtr != NULL);
  337.     assert(myEndPtr != NULL);
  338.     assert(myCurPtr <= myEndPtr);
  339.     int ret = 1;
  340.     if ((myEndPtr - myCurPtr) < length)
  341.     {
  342.         length = myEndPtr - myCurPtr;
  343.         ret = 0;
  344.     }
  345.     if (outbuf != NULL)
  346.     {
  347.         outbuf->set(myCurPtr, length);
  348.     }
  349.     myCurPtr += length;
  350.     return ret;
  351. }
  352. /* Local Variables: */
  353. /* c-file-style: "stroustrup" */
  354. /* indent-tabs-mode: nil */
  355. /* c-file-offsets: ((access-label . -) (inclass . ++)) */
  356. /* c-basic-offset: 4 */
  357. /* End: */