Darwin-Streaming-Server/CommonUtilitiesLib/StringParser.h

190 lines
6.5 KiB
C
Raw Normal View History

/*
*
* @APPLE_LICENSE_HEADER_START@
*
* Copyright (c) 1999-2008 Apple 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 0
class 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 sEOLWhitespaceQueryMask[]; // 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; }
//Expect:
//These functions consume the given token/word if it is in the stream.
//If not, they return false.
//In all other situations, true is returned.
//NOTE: if these functions return an error, the object goes into a state where
//it cannot be guarenteed to function correctly.
Bool16 Expect(char stopChar);
Bool16 ExpectEOL();
//Returns the next word
void ConsumeWord(StrPtrLen* outString = NULL)
{ ConsumeUntil(outString, sNonWordMask); }
//Returns all the data before inStopChar
void ConsumeUntil(StrPtrLen* outString, char inStopChar);
//Returns whatever integer is currently in the stream
UInt32 ConsumeInteger(StrPtrLen* outString = NULL);
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__