190 lines
6.5 KiB
C
190 lines
6.5 KiB
C
|
/*
|
||
|
*
|
||
|
* @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__
|