// Created by Peter Hosey on 2005-10-14. // Copyright 2005 Peter Hosey. All rights reserved. LMXParsedCompletely = 0, //Element stack reached zero depth, and there was no more XML to parse LMXParsedIncomplete = -1, //Element stack is not empty; more data is wanted LMXParsedCompletelyWithExtraData = -2, //Element stack reached zero depth, but there's still XML to parse extern NSString *LMXStringFromParseResult(enum LMXParseResult result); extern enum LMXParseResult LMXParseResultFromString(NSString *result); @interface LMXParser : NSObject { NSMutableData *dataToParse; NSMutableArray *elementStack; NSMutableString *characters; NSMutableString *currentToken; NSMutableString *entityName; NSMutableString *comment; NSMutableDictionary *overrideDict; //Stores any entities that we're using our own values instead of the DTD's values for NSMutableDictionary *cacheDict; //Caches entity values NSMutableDictionary *attributes; NSString *attributeValue; off_t charactersRunStartIndex, tokenRunStartIndex, entityNameRunStartIndex, commentRunStartIndex; //Start of a comment: <!-- unsigned hasBang:1; //With has{First,Second}Hyphen, indicates a comment may be about to start (if a < is encountered) unsigned hasSecondHyphen:1; //With hasGreaterThan and hasFirstHyphen, part of the start of a comment unsigned hasFirstHyphen:1; //With hasGreaterThan, 1/3 of the end of a comment; else, 1/3 of the start of a comment unsigned hasEqualSign:1; //An attribute value has been recorded, and a = encountered unsigned couldBeEndTag:1; //A / has been encountered unsigned isEmptyTag:1; //A / was encountered immediately after a > unsigned inEntity:1; //In between & and ; unsigned hasHashMark:1; //A # was just encountered (if this is 1 when the & is encountered, it's a numeric entity; otherwise, the entity ends) unsigned noNonWhitespaceSinceTagEnd:1; //Used by / to check for a <blah/> tag unsigned inTag:1; //In between < and > unsigned parsing:1; //Set to 0 by -pause char attributeQuoteChar; //One of '"', '\'', or '\0' //How to get an autoreleased parser in only one message instead of three: - initWithData:(NSData *)data; - (void)setSystemID:(NSString *)sysID; - (void)overrideEntityNamed:(NSString *)name withValue:(NSData *)val; - (void)setOverriddenEntities:(NSDictionary *)entityDict; - (NSData *)dataForEntityNamed:(NSString *)name; - (enum LMXParseResult)parseChunk:(NSData *)data; - (void)addData:(NSData *)data; //Add more data (in front of the existing data) without parsing - (enum LMXParseResult)parse; //Begin/resume parsing without adding more data //Either or both of these can be called by the delegate. - (enum LMXParseResult)resume; //Synonym for -parse //Calling -reset leaves the parser in the same state it was in (more or less) after it was inited. //*Don't* call this from the delegate. - setDelegate:newDelegate; //Returns old delegate. - (void)setContextInfo:(void *)newContextInfo; @interface LMXParser (LMXCompatibilityWithNSXMLParser) - initWithData:(NSData *)data; //Same as -init, -addData: - (void)abortParsing; //Compatibility synonym for -pause @interface NSObject (LMXParserDelegate) - (void)parserDidStartDocument:(LMXParser *)parser; - (void)parser:(LMXParser *)parser elementEnded:(NSString *)elementName; //Returns one or two UTF-16 code units, or nil. - (NSData *)parser:(LMXParser *)parser resolveExternalEntityName:(NSString *)entityName systemID:(NSString *)systemID; - (void)parser:(LMXParser *)parser foundCharacters:(NSString *)string; - (void)parser:(LMXParser *)parser elementStarted:(NSString *)elementName attributes:(NSDictionary *)attributes; - (void)parserDidEndDocument:(LMXParser *)parser; - (void)parser:(LMXParser *)parser finishedParsingChunk:(NSData *)chunkData withResult:(enum LMXParseResult)result;