mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-23 00:41:02 +00:00
Fix pointer to handler
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@7555 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
e2fb1b2e62
commit
e4cb214fc2
1 changed files with 100 additions and 17 deletions
117
Source/GSXML.m
117
Source/GSXML.m
|
@ -45,7 +45,9 @@ extern int xmlGetWarningsDefaultValue;
|
|||
*/
|
||||
static Class NSString_class;
|
||||
static IMP csImp;
|
||||
static IMP cslImp;
|
||||
static SEL csSel = @selector(stringWithCString:);
|
||||
static SEL cslSel = @selector(stringWithCString:length:);
|
||||
|
||||
static BOOL cacheDone = NO;
|
||||
|
||||
|
@ -57,6 +59,7 @@ setupCache()
|
|||
cacheDone = YES;
|
||||
NSString_class = [NSString class];
|
||||
csImp = [NSString_class methodForSelector: csSel];
|
||||
cslImp = [NSString_class methodForSelector: cslSel];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -808,6 +811,8 @@ static NSMapTable *nodeNames = 0;
|
|||
|
||||
@implementation GSXMLParser : NSObject
|
||||
|
||||
static NSString *endMarker = @"At end of incremental parse";
|
||||
|
||||
+ (void) initialize
|
||||
{
|
||||
if (cacheDone == NO)
|
||||
|
@ -898,28 +903,44 @@ static NSMapTable *nodeNames = 0;
|
|||
else if ([source isKindOfClass: NSString_class])
|
||||
{
|
||||
}
|
||||
else if ([source isKindOfClass: [NSURL class]])
|
||||
{
|
||||
NSLog(@"NSURL source not currently implemented");
|
||||
RELEASE(self);
|
||||
return nil;
|
||||
}
|
||||
else if ([source isKindOfClass: [NSURL class]])
|
||||
{
|
||||
NSLog(@"NSURL source not currently implemented");
|
||||
}
|
||||
else
|
||||
{
|
||||
NSLog(@"source must be NSString, NSData or NSURL type");
|
||||
NSLog(@"source must be NSString, NSData, NSURL or nil");
|
||||
RELEASE(self);
|
||||
return nil;
|
||||
}
|
||||
src = [source copy];
|
||||
saxHandler = handler;
|
||||
}
|
||||
else
|
||||
{
|
||||
NSLog(@"Can't create GSXMLParser");
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (BOOL) parse
|
||||
{
|
||||
if (lib != NULL)
|
||||
id tmp;
|
||||
|
||||
if (src == endMarker)
|
||||
{
|
||||
xmlFreeDoc(((xmlParserCtxtPtr)lib)->myDoc);
|
||||
xmlClearParserCtxt(lib);
|
||||
NSLog(@"GSXMLParser -parse called on object that is already parsed");
|
||||
return NO;
|
||||
}
|
||||
if (src == nil)
|
||||
{
|
||||
NSLog(@"GSXMLParser -parse called on object with no source");
|
||||
return NO;
|
||||
}
|
||||
|
||||
if ([src isKindOfClass: [NSData class]])
|
||||
{
|
||||
lib = (void*)xmlCreateMemoryParserCtxt((void*)[src bytes],
|
||||
|
@ -948,7 +969,7 @@ static NSMapTable *nodeNames = 0;
|
|||
}
|
||||
else
|
||||
{
|
||||
NSLog(@"source must be NSString, NSData or NSURL type");
|
||||
NSLog(@"source for [-parse] must be NSString, NSData or NSURL type");
|
||||
return NO;
|
||||
}
|
||||
|
||||
|
@ -961,7 +982,10 @@ static NSMapTable *nodeNames = 0;
|
|||
[saxHandler parser: self];
|
||||
}
|
||||
|
||||
tmp = RETAIN(src);
|
||||
ASSIGN(src, endMarker);
|
||||
xmlParseDocument(lib);
|
||||
RELEASE(tmp);
|
||||
|
||||
if (((xmlParserCtxtPtr)lib)->wellFormed)
|
||||
return YES;
|
||||
|
@ -969,6 +993,66 @@ static NSMapTable *nodeNames = 0;
|
|||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL) parse: (NSData*)data
|
||||
{
|
||||
/*
|
||||
* Permit start of new parse after completed one.
|
||||
*/
|
||||
if (src == endMarker)
|
||||
{
|
||||
xmlFreeDoc(((xmlParserCtxtPtr)lib)->myDoc);
|
||||
xmlClearParserCtxt(lib);
|
||||
lib = NULL;
|
||||
src = nil;
|
||||
}
|
||||
|
||||
if (src != nil)
|
||||
{
|
||||
NSLog(@"XMLParser -parse: called for parser not initialised with nil");
|
||||
return NO;
|
||||
}
|
||||
|
||||
if (data == nil || [data length] == 0)
|
||||
{
|
||||
/*
|
||||
* At end of incremental parse.
|
||||
*/
|
||||
if (lib != NULL)
|
||||
{
|
||||
xmlParseChunk(lib, 0, 0, 1);
|
||||
src = endMarker;
|
||||
if (((xmlParserCtxtPtr)lib)->wellFormed)
|
||||
return YES;
|
||||
else
|
||||
return NO;
|
||||
}
|
||||
else
|
||||
{
|
||||
NSLog(@"GSXMLParser -parse: terminated with no data");
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (lib == NULL)
|
||||
{
|
||||
NSAssert([saxHandler parser] == nil, NSGenericException);
|
||||
[saxHandler parser: self];
|
||||
lib = (void*)xmlCreatePushParserCtxt([saxHandler lib], saxHandler,
|
||||
[data bytes], [data length], "incremental");
|
||||
if (lib == NULL)
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
xmlParseChunk(lib, [data bytes], [data length], 0);
|
||||
}
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
|
||||
- (GSXMLDocument*) doc
|
||||
{
|
||||
return [GSXMLDocument documentFrom: ((xmlParserCtxtPtr)lib)->myDoc];
|
||||
|
@ -1029,7 +1113,7 @@ static NSMapTable *nodeNames = 0;
|
|||
setupCache();
|
||||
}
|
||||
|
||||
#define HANDLER (GSSAXHandler*)(((xmlParserCtxtPtr)ctx)->userData)
|
||||
#define HANDLER (GSSAXHandler*)(ctx)
|
||||
|
||||
void
|
||||
startDocumentFunction(void *ctx)
|
||||
|
@ -1169,8 +1253,7 @@ void endElementFunction(void *ctx, const char *name)
|
|||
void
|
||||
charactersFunction(void *ctx, const char *ch, int len)
|
||||
{
|
||||
[HANDLER characters: [NSString_class stringWithCString: ch length: len]
|
||||
length: len];
|
||||
[HANDLER characters: (*cslImp)(NSString_class, cslSel, ch, len)];
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1182,7 +1265,7 @@ referenceFunction(void *ctx, const char *name)
|
|||
void
|
||||
ignorableWhitespaceFunction(void *ctx, const char *ch, int len)
|
||||
{
|
||||
[HANDLER ignoreWhitespace: (*csImp)(NSString_class, csSel, ch) length: len];
|
||||
[HANDLER ignoreWhitespace: (*cslImp)(NSString_class, cslSel, ch, len)];
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1195,7 +1278,7 @@ processInstructionFunction(void *ctx, const char *target, const char *data)
|
|||
void
|
||||
cdataBlockFunction(void *ctx, const char *value, int len)
|
||||
{
|
||||
[HANDLER cdataBlock: (*csImp)(NSString_class, csSel, value) length: len];
|
||||
[HANDLER cdataBlock: (*cslImp)(NSString_class, cslSel, value, len)];
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1337,11 +1420,11 @@ fatalErrorFunction(void *ctx, const char *msg, ...)
|
|||
{
|
||||
}
|
||||
|
||||
- (void) characters: (NSString*) name length: (int)len
|
||||
- (void) characters: (NSString*) name
|
||||
{
|
||||
}
|
||||
|
||||
- (void) ignoreWhitespace: (NSString*) ch length: (int)len
|
||||
- (void) ignoreWhitespace: (NSString*) ch
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -1353,7 +1436,7 @@ fatalErrorFunction(void *ctx, const char *msg, ...)
|
|||
{
|
||||
}
|
||||
|
||||
- (void) cdataBlock: (NSString*)value length: (int)len
|
||||
- (void) cdataBlock: (NSString*)value
|
||||
{
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue