亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

StringParser詳解

2019-11-14 09:14:10
字體:
來源:轉載
供稿:網友

static char* string1 = "RTSP 200 OK/r/nContent-Type: MeowMix/r/n/t   /n3450";		StrPtrLen theString(string1, strlen(string1));		StringParser victim(&theString);		StrPtrLen rtsp;		SInt32 theInt = victim.ConsumeInteger();		if (theInt != 0)			return false;		victim.ConsumeWord(&rtsp);		if ((rtsp.Len != 4) && (strncmp(rtsp.Ptr, "RTSP", 4) != 0))			return false;		victim.ConsumeWhitespace();		theInt = victim.ConsumeInteger();		if (theInt != 200)			return false;		return true;
/* * * @APPLE_LICENSE_HEADER_START@ *  * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved. *  * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this * file. *  * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. *  * @APPLE_LICENSE_HEADER_END@ * *//*    File:       StringParser.h    Contains:   A couple of handy utilities for parsing a stream.                          */#ifndef __STRINGPARSER_H__#define __STRINGPARSER_H__#include "StrPtrLen.h"#include "MyAssert.h"#define STRINGPARSERTESTING 0class StringParser{    public:                StringParser(StrPtrLen *inStream)            :   fStartGet(inStream == NULL ? NULL : inStream->Ptr),                fEndGet(inStream == NULL ? NULL : inStream->Ptr + inStream->Len),                fCurLineNumber(1),                fStream(inStream) {}        ~StringParser() {}                // Built-in masks for common stop conditions        static UInt8 sDigitMask[];      // stop when you hit a digit        static UInt8 sWordMask[];       // stop when you hit a word        static UInt8 SEOLMask[];        // stop when you hit an eol        static UInt8 sEOLWhitespaceMask[]; // stop when you hit an EOL or whitespace        static UInt8 sWhitespaceMask[]; // skip over whitespace        //GetBuffer:        //Returns a pointer to the string object        StrPtrLen*      GetStream() { return fStream; }        		//判斷當前字符是否是stopChar,如果是,則向后跳過一個字符        Bool16          Expect(char stopChar);		//如果當前字符是/r (alone), /n (alone), /r/n,跳過        Bool16          ExpectEOL();                //Returns the next word        void            ConsumeWord(StrPtrLen* outString = NULL)                            { ConsumeUntil(outString, sNonWordMask); }		//判斷當前字符是否是inStopChar,如果不是則向后跳過一個字符,直到等于inStopChar為止,		//截取跳過的這段字符賦值給outString(不為空時)。        void            ConsumeUntil(StrPtrLen* outString, char inStopChar);		//截取當前位置的整數保存到outString,函數返回整數值		//跳過當前字符開始的數字保存到outString(判斷當前字符是否是數字,是則判斷下一個字符,直到不是為止,		//將其保存到outString)函數返回該數字        UInt32          ConsumeInteger(StrPtrLen* outString = NULL);		//取當前位置的float保存到outString,函數返回float        Float32         ConsumeFloat();        Float32         ConsumeNPT();        //Keeps on going until non-whitespace        void            ConsumeWhitespace()                            { ConsumeUntil(NULL, sWhitespaceMask); }                //Assumes 'stop' is a 255-char array of booleans. Set this array        //to a mask of what the stop characters are. true means stop character.        //You may also pass in one of the many prepackaged masks defined above.        void            ConsumeUntil(StrPtrLen* spl, UInt8 *stop);        //+ rt 8.19.99        //returns whatever is avaliable until non-whitespace        void            ConsumeUntilWhitespace(StrPtrLen* spl = NULL)                            { ConsumeUntil( spl, sEOLWhitespaceMask); }        void            ConsumeUntilDigit(StrPtrLen* spl = NULL)                            { ConsumeUntil( spl, sDigitMask); }		void			ConsumeLength(StrPtrLen* spl, SInt32 numBytes);		void			ConsumeEOL(StrPtrLen* outString);        //GetThru:        //Works very similar to ConsumeUntil except that it moves past the stop token,        //and if it can't find the stop token it returns false        inline Bool16       GetThru(StrPtrLen* spl, char stop);        inline Bool16       GetThruEOL(StrPtrLen* spl);        inline Bool16       ParserIsEmpty(StrPtrLen* outString);        //Returns the current character, doesn't move past it.        inline char     PeekFast() { if (fStartGet) return *fStartGet; else return '/0'; }        char Operator[](int i) { Assert((fStartGet+i) < fEndGet);return fStartGet[i]; }                //Returns some info about the stream        UInt32          GetDataParsedLen()             { Assert(fStartGet >= fStream->Ptr); return (UInt32)(fStartGet - fStream->Ptr); }        UInt32          GetDataReceivedLen()            { Assert(fEndGet >= fStream->Ptr); return (UInt32)(fEndGet - fStream->Ptr); }        UInt32          GetDataRemaining()            { Assert(fEndGet >= fStartGet); return (UInt32)(fEndGet - fStartGet); }        char*           GetCurrentPosition() { return fStartGet; }        int         GetCurrentLineNumber() { return fCurLineNumber; }                // A utility for extracting quotes from the start and end of a parsed        // string. (Warning: Do not call this method if you allocated your own          // pointer for the Ptr field of the StrPtrLen class.) - [sfu]        //         // Not sure why this utility is here and not in the StrPtrLen class - [jm]        static void UnQuote(StrPtrLen* outString);#if STRINGPARSERTESTING        static Bool16       Test();#endif    private:		//向前移動一個字符        void        AdvanceMark();                //built in masks for some common stop conditions        static UInt8 sNonWordMask[];        char*       fStartGet;        char*       fEndGet;        int         fCurLineNumber;        StrPtrLen*  fStream;        };Bool16 StringParser::GetThru(StrPtrLen* outString, char inStopChar){    ConsumeUntil(outString, inStopChar);    return Expect(inStopChar);}Bool16 StringParser::GetThruEOL(StrPtrLen* outString){    ConsumeUntil(outString, sEOLMask);    return ExpectEOL();}Bool16 StringParser::ParserIsEmpty(StrPtrLen* outString){    if (NULL == fStartGet || NULL == fEndGet)    {        if (NULL != outString)        {   outString->Ptr = NULL;            outString->Len = 0;        }                return true;    }        Assert(fStartGet <= fEndGet);        return false; // parser ok to parse}#endif // __STRINGPARSER_H__

/* * * @APPLE_LICENSE_HEADER_START@ *  * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved. *  * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this * file. *  * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. *  * @APPLE_LICENSE_HEADER_END@ * *//*    File:       StringParser.cpp    Contains:   Implementation of StringParser class.                              */#include "StringParser.h"UInt8 StringParser::sNonWordMask[] ={    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //0-9     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //10-19     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //20-29    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //30-39     1, 1, 1, 1, 1, 0, 1, 1, 1, 1, //40-49 - is a word    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //50-59    1, 1, 1, 1, 1, 0, 0, 0, 0, 0, //60-69 //stop on every character except a letter    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //70-79    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //80-89    0, 1, 1, 1, 1, 0, 1, 0, 0, 0, //90-99 _ is a word    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //100-109    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //110-119    0, 0, 0, 1, 1, 1, 1, 1, 1, 1, //120-129    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //130-139    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //140-149    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //150-159    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //160-169    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //170-179    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //180-189    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //190-199    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //200-209    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //210-219    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //220-229    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //230-239    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //240-249    1, 1, 1, 1, 1, 1             //250-255};UInt8 StringParser::sWordMask[] ={    // Inverse of the above    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0-9     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //10-19     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //20-29    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //30-39     0, 0, 0, 0, 0, 1, 0, 0, 0, 0, //40-49 - is a word    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //50-59    0, 0, 0, 0, 0, 1, 1, 1, 1, 1, //60-69 //stop on every character except a letter    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //70-79    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //80-89    1, 0, 0, 0, 0, 1, 0, 1, 1, 1, //90-99 _ is a word    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //100-109    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //110-119    1, 1, 1, 0, 0, 0, 0, 0, 0, 0, //120-129    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //130-139    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //140-149    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //150-159    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //160-169    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //170-179    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //180-189    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //190-199    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //200-209    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //210-219    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //220-229    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //230-239    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //240-249    0, 0, 0, 0, 0, 0             //250-255};UInt8 StringParser::sDigitMask[] ={    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0-9    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //10-19     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //20-29    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //30-39    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, //40-49 //stop on every character except a number    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, //50-59    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //60-69     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //70-79    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //80-89    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //90-99    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //100-109    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //110-119    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //120-129    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //130-139    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //140-149    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //150-159    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //160-169    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //170-179    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //180-189    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //190-199    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //200-209    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //210-219    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //220-229    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //230-239    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //240-249    0, 0, 0, 0, 0, 0             //250-255};UInt8 StringParser::sEOLMask[] ={    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0-9       1, 0, 0, 1, 0, 0, 0, 0, 0, 0, //10-19    //'/r' & '/n' are stop conditions    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //20-29    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //30-39     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //40-49    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //50-59    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //60-69      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //70-79    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //80-89    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //90-99    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //100-109    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //110-119    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //120-129    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //130-139    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //140-149    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //150-159    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //160-169    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //170-179    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //180-189    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //190-199    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //200-209    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //210-219    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //220-229    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //230-239    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //240-249    0, 0, 0, 0, 0, 0             //250-255};UInt8 StringParser::sWhitespaceMask[] ={    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, //0-9      // stop on '/t'    0, 0, 0, 0, 1, 1, 1, 1, 1, 1, //10-19    // '/r', /v', '/f' & '/n'    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //20-29    1, 1, 0, 1, 1, 1, 1, 1, 1, 1, //30-39   //  ' '    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //40-49    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //50-59    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //60-69    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //70-79    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //80-89    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //90-99    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //100-109    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //110-119    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //120-129    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //130-139    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //140-149    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //150-159    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //160-169    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //170-179    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //180-189    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //190-199    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //200-209    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //210-219    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //220-229    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //230-239    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //240-249    1, 1, 1, 1, 1, 1             //250-255};UInt8 StringParser::sEOLWhitespaceMask[] ={    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, //0-9     // /t is a stop    1, 1, 1, 1, 0, 0, 0, 0, 0, 0, //10-19    //'/r' & '/n' are stop conditions    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //20-29    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, //30-39   ' '  is a stop    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //40-49    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //50-59    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //60-69      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //70-79    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //80-89    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //90-99    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //100-109    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //110-119    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //120-129    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //130-139    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //140-149    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //150-159    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //160-169    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //170-179    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //180-189    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //190-199    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //200-209    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //210-219    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //220-229    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //230-239    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //240-249    0, 0, 0, 0, 0, 0             //250-255};void StringParser::ConsumeUntil(StrPtrLen* outString, char inStop){    if (this->ParserIsEmpty(outString))        return;    char *originalStartGet = fStartGet;    while ((fStartGet < fEndGet) && (*fStartGet != inStop))        AdvanceMark();            if (outString != NULL)    {        outString->Ptr = originalStartGet;        outString->Len = fStartGet - originalStartGet;    }}void StringParser::ConsumeUntil(StrPtrLen* outString, UInt8 *inMask){    if (this->ParserIsEmpty(outString))        return;            char *originalStartGet = fStartGet;    while ((fStartGet < fEndGet) && (!inMask[(unsigned char) (*fStartGet)]))        AdvanceMark();    if (outString != NULL)    {        outString->Ptr = originalStartGet;        outString->Len = fStartGet - originalStartGet;    }}void StringParser::ConsumeLength(StrPtrLen* spl, SInt32 inLength){    if (this->ParserIsEmpty(spl))        return;    //sanity check to make sure we aren't being told to run off the end of the    //buffer    if ((fEndGet - fStartGet) < inLength)        inLength = fEndGet - fStartGet;        if (spl != NULL)    {        spl->Ptr = fStartGet;        spl->Len = inLength;    }    if (inLength > 0)    {        for (short i=0; i<inLength; i++)            AdvanceMark();    }    else        fStartGet += inLength;  // ***may mess up line number if we back up too much}UInt32 StringParser::ConsumeInteger(StrPtrLen* outString){    if (this->ParserIsEmpty(outString))        return 0;    UInt32 theValue = 0;    char *originalStartGet = fStartGet;        while ((fStartGet < fEndGet) && (*fStartGet >= '0') && (*fStartGet <= '9'))    {        theValue = (theValue * 10) + (*fStartGet - '0');        AdvanceMark();    }    if (outString != NULL)    {        outString->Ptr = originalStartGet;        outString->Len = fStartGet - originalStartGet;    }    return theValue;}Float32 StringParser::ConsumeFloat(){    if (this->ParserIsEmpty(NULL))        return 0.0;    Float32 theFloat = 0;    while ((fStartGet < fEndGet) && (*fStartGet >= '0') && (*fStartGet <= '9'))    {        theFloat = (theFloat * 10) + (*fStartGet - '0');        AdvanceMark();    }    if ((fStartGet < fEndGet) && (*fStartGet == '.'))        AdvanceMark();    Float32 multiplier = (Float32) .1;    while ((fStartGet < fEndGet) && (*fStartGet >= '0') && (*fStartGet <= '9'))    {        theFloat += (multiplier * (*fStartGet - '0'));        multiplier *= (Float32).1;        AdvanceMark();    }    return theFloat;}Float32 StringParser::ConsumeNPT(){    if (this->ParserIsEmpty(NULL))	    return 0.0;    Float32 valArray[4] = {0, 0, 0, 0};    Float32 divArray[4] = {1, 1, 1, 1};    UInt32 valType = 0; // 0 == npt-sec, 1 == npt-hhmmss    UInt32 index;        for (index = 0; index < 4; index ++)    {        while ((fStartGet < fEndGet) && (*fStartGet >= '0') && (*fStartGet <= '9'))        {            valArray[index] = (valArray[index] * 10) + (*fStartGet - '0');            divArray[index] *= 10;            AdvanceMark();        }                if (fStartGet >= fEndGet || valType == 0 && index >= 1)            break;                    if (*fStartGet == '.' && valType == 0 && index == 0)            ;        else if (*fStartGet == ':' && index < 2)            valType = 1;        else if (*fStartGet == '.' && index == 2)            ;        else            break;        AdvanceMark();    }        if (valType == 0)        return valArray[0] + (valArray[1] / divArray[1]);    else        return (valArray[0] * 3600) + (valArray[1] * 60) + valArray[2] + (valArray[3] / divArray[3]);}Bool16  StringParser::Expect(char stopChar){    if (this->ParserIsEmpty(NULL))        return false;    if (fStartGet >= fEndGet)        return false;    if(*fStartGet != stopChar)        return false;    else    {        AdvanceMark();        return true;    }}Bool16 StringParser::ExpectEOL(){    if (this->ParserIsEmpty(NULL))        return false;    //This function processes all legal forms of HTTP / RTSP eols.    //They are: /r (alone), /n (alone), /r/n    Bool16 retVal = false;    if ((fStartGet < fEndGet) && ((*fStartGet == '/r') || (*fStartGet == '/n')))    {        retVal = true;        AdvanceMark();        //check for a /r/n, which is the most common EOL sequence.        if ((fStartGet < fEndGet) && ((*(fStartGet - 1) == '/r') && (*fStartGet == '/n')))            AdvanceMark();    }    return retVal;}void StringParser::ConsumeEOL(StrPtrLen* outString){    if (this->ParserIsEmpty(outString))        return;	//This function processes all legal forms of HTTP / RTSP eols.	//They are: /r (alone), /n (alone), /r/n	char *originalStartGet = fStartGet;		if ((fStartGet < fEndGet) && ((*fStartGet == '/r') || (*fStartGet == '/n')))	{		AdvanceMark();		//check for a /r/n, which is the most common EOL sequence.		if ((fStartGet < fEndGet) && ((*(fStartGet - 1) == '/r') && (*fStartGet == '/n')))			AdvanceMark();	}	if (outString != NULL)	{		outString->Ptr = originalStartGet;		outString->Len = fStartGet - originalStartGet;	}}void StringParser::UnQuote(StrPtrLen* outString){    // If a string is contained within double or single quotes     // then UnQuote() will remove them. - [sfu]        // sanity check    if (outString->Ptr == NULL || outString->Len < 2)        return;            // remove begining quote if it's there.    if (outString->Ptr[0] == '"' || outString->Ptr[0] == '/'')    {        outString->Ptr++; outString->Len--;    }    // remove ending quote if it's there.    if ( outString->Ptr[outString->Len-1] == '"' ||          outString->Ptr[outString->Len-1] == '/'' )    {        outString->Len--;    }}void StringParser::AdvanceMark(){     if (this->ParserIsEmpty(NULL))        return;   if ((*fStartGet == '/n') || ((*fStartGet == '/r') && (fStartGet[1] != '/n')))    {        // we are progressing beyond a line boundary (don't count /r/n twice)        fCurLineNumber++;    }    fStartGet++;}#if STRINGPARSERTESTINGBool16 StringParser::Test(){    static char* string1 = "RTSP 200 OK/r/nContent-Type: MeowMix/r/n/t   /n3450";        StrPtrLen theString(string1, strlen(string1));        StringParser victim(&theString);        StrPtrLen rtsp;    SInt32 theInt = victim.ConsumeInteger();    if (theInt != 0)        return false;    victim.ConsumeWord(&rtsp);    if ((rtsp.len != 4) && (strncmp(rtsp.Ptr, "RTSP", 4) != 0))        return false;            victim.ConsumeWhiteSpace();    theInt = victim.ConsumeInteger();    if (theInt != 200)        return false;            return true;}#endif


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜欧美大片免费观看| 亚洲成人激情视频| 成人网中文字幕| 日韩中文字幕网址| 久久久久久久久久久人体| 95av在线视频| 亚洲精选中文字幕| 欧美国产日韩中文字幕在线| 国产精品成人在线| 国产精品wwwwww| 精品久久久久久久大神国产| 国产精彩精品视频| 日韩av中文字幕在线播放| 国产精品入口日韩视频大尺度| 国产日韩欧美电影在线观看| 久久久久亚洲精品国产| 亚洲欧美日韩爽爽影院| 国产成人精品视频| 久久久精品国产网站| 亚洲韩国青草视频| 久久久精品久久久久| 欧美久久精品一级黑人c片| 亚洲男人第一网站| 一区三区二区视频| 亚洲大尺度美女在线| 久久青草福利网站| 国产拍精品一二三| 久久国产精品久久久久久久久久| 亚洲第一中文字幕在线观看| 91色在线视频| 日韩中文字幕在线视频播放| 美女久久久久久久久久久| 亚洲免费中文字幕| 日韩免费黄色av| 国产成人精品视频在线| 在线观看成人黄色| 神马久久久久久| 色www亚洲国产张柏芝| 久久影院在线观看| 福利一区视频在线观看| 日韩第一页在线| 国产精品免费一区二区三区都可以| 九九热在线精品视频| 亚洲美女动态图120秒| 国产精品一区二区三区成人| 精品一区二区三区四区在线| 97在线观看视频| 欧美激情视频免费观看| 国产精品久久久久久久av大片| 136fldh精品导航福利| 亚洲欧美中文字幕在线一区| 夜夜躁日日躁狠狠久久88av| 亚洲国产欧美一区二区丝袜黑人| 亚洲第一级黄色片| 欧美黄色片在线观看| 久久久久一本一区二区青青蜜月| 亚洲最新中文字幕| 成人欧美一区二区三区在线| 国产高清视频一区三区| 久热精品视频在线观看| 91精品久久久久久久久久入口| 欧美电影免费观看网站| 亚洲www视频| 亚洲人成电影网站| 久久不射热爱视频精品| 亚洲韩国欧洲国产日产av| 欧美精品免费播放| 欧美日韩福利在线观看| 精品久久久香蕉免费精品视频| 性色av一区二区三区红粉影视| 国产精品视频男人的天堂| 国内精品一区二区三区四区| 永久免费看mv网站入口亚洲| 日韩av免费在线播放| 欧美日韩免费区域视频在线观看| 国产精品成人品| 91久久在线播放| 欧美怡红院视频一区二区三区| 日韩精品中文字幕有码专区| 日韩在线观看你懂的| 中文字幕日韩欧美| 日韩精品在线看| 欧美激情视频一区二区三区不卡| 亚洲视频在线看| 一区二区亚洲欧洲国产日韩| 亚洲精品国产综合区久久久久久久| 午夜精品久久久久久久久久久久| 精品国产拍在线观看| 欧美日韩国产va另类| 高清在线视频日韩欧美| 欧美激情亚洲视频| 国产视频精品一区二区三区| 日韩在线免费视频| 日本一区二区三区四区视频| 成人有码视频在线播放| 日本aⅴ大伊香蕉精品视频| 欧美性猛交xxxx乱大交3| 国产精品久久av| 日韩av中文字幕在线| 亚洲a区在线视频| 欧美xxxx做受欧美.88| 国产精品久久久久影院日本| 欧美日韩美女在线观看| 亚洲专区中文字幕| 97国产一区二区精品久久呦| 色偷偷av一区二区三区| 欧美午夜宅男影院在线观看| 欧美肥臀大乳一区二区免费视频| 欧美精品免费在线观看| 欧美电影免费在线观看| 亚洲天堂第一页| 亚洲第一区第一页| 国产一区二区三区在线观看视频| 久久久久久久久久婷婷| 国产精品久久久精品| 国产精品久久中文| 日韩禁在线播放| 26uuu另类亚洲欧美日本一| 欧美激情第三页| 日韩在线观看免费| 日韩电影在线观看中文字幕| 91精品久久久久久久久久| 久久频这里精品99香蕉| 日韩在线免费av| 国产精品久久9| 热99在线视频| 欧美亚洲激情在线| 亚洲第一综合天堂另类专| 91精品久久久久久久久久另类| 国产精品高潮呻吟久久av野狼| 亚洲第一男人av| 26uuu另类亚洲欧美日本老年| 国产91精品久久久久| 欧美电影《睫毛膏》| 欧美中文在线视频| 国产不卡av在线免费观看| 国产精品视频资源| 日韩av黄色在线观看| 国产精品成人av在线| 国产精品都在这里| 97超碰色婷婷| 亚洲精品美女在线观看播放| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产欧美日韩中文| 国产精品久久久久aaaa九色| 成人黄色av网站| 亚洲视频一区二区| 一区二区三区久久精品| 久久999免费视频| 久久久久久亚洲精品中文字幕| 搡老女人一区二区三区视频tv| 91av在线播放视频| 日韩不卡在线观看| 国产精品免费久久久久久| 国产日韩中文字幕| 日本韩国欧美精品大片卡二| 国产精品久久久久久久久久| 欧美日韩国产一区二区三区| 久久国产精品久久久久久久久久| 日韩高清人体午夜| 91高潮在线观看| 成人h视频在线观看播放| 欧美精品一二区| 美女黄色丝袜一区|