Revision: 2860
http://skim-app.svn.sourceforge.net/skim-app/?rev=2860&view=rev
Author: hofman
Date: 2007-09-09 09:54:30 -0700 (Sun, 09 Sep 2007)
Log Message:
-----------
Skip whitespace and newline in FDF parsing, except for strings and names. Scan
booleans. Scan and ignore comments.
Modified Paths:
--------------
trunk/SKFDFParser.m
Modified: trunk/SKFDFParser.m
===================================================================
--- trunk/SKFDFParser.m 2007-09-09 14:31:30 UTC (rev 2859)
+++ trunk/SKFDFParser.m 2007-09-09 16:54:30 UTC (rev 2860)
@@ -49,7 +49,9 @@
- (BOOL)scanFDFHexString:(NSString **)string;
- (BOOL)scanFDFName:(NSString **)string;
- (BOOL)scanFDFNumber:(NSNumber **)number;
+- (BOOL)scanFDFBoolean:(id *)boolNumber;
- (BOOL)scanFDFIndirectObject:(id *)object;
+- (BOOL)scanFDFComment:(NSString **)comment;
@end
#pragma mark -
@@ -320,67 +322,63 @@
NSScanner *scanner = [NSScanner scannerWithString:string];
- [scanner setCharactersToBeSkipped:nil];
-
// Scan the FDF header
[scanner scanString:@"%FDF-1.2" intoString:NULL];
- [scanner scanCharactersFromSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet] intoString:NULL];
- if ([scanner scanString:@"%" intoString:NULL])
- [scanner scanUpToCharactersFromSet:[NSCharacterSet
newlineCharacterSet] intoString:NULL];
- [scanner scanCharactersFromSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet] intoString:NULL];
+ while ([scanner scanFDFComment:NULL]);
// Scan the FDF body
while (success && [scanner scanInt:&objNumber]) {
- [scanner scanCharactersFromSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet] intoString:NULL];
+ while ([scanner scanFDFComment:NULL]);
if (success = [scanner scanInt:&genNumber]) {
- [scanner scanCharactersFromSet:[NSCharacterSet
whitespaceCharacterSet] intoString:NULL];
+ while ([scanner scanFDFComment:NULL]);
if ([scanner scanString:@"obj" intoString:NULL]) {
- [scanner scanCharactersFromSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet] intoString:NULL];
if (success = [scanner scanFDFObject:&object]) {
- [scanner scanCharactersFromSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet] intoString:NULL];
-
- if ([object isKindOfClass:[NSDictionary class]] &&
[scanner scanString:@"stream" intoString:NULL]) {
- object = @"";
- [scanner scanString:@"\n" intoString:NULL] || [scanner
scanString:@"\r\n" intoString:NULL];
-
- if ([scanner scanUpToString:@"endstream"
intoString:&object]) {
- int end = [object length];
- unichar ch = end ? [object characterAtIndex:end -
1] : 0;
- if ([[NSCharacterSet newlineCharacterSet]
characterIsMember:ch]) {
- end--;
- if (end && ch == '\n' && [object
characterAtIndex:end - 1] == '\r')
+ if ([object isKindOfClass:[NSDictionary class]]) {
+ while ([scanner scanFDFComment:NULL]);
+ if ([scanner scanString:@"stream" intoString:NULL]) {
+ object = @"";
+ [scanner scanString:@"\n" intoString:NULL] ||
[scanner scanString:@"\r\n" intoString:NULL];
+
+ if ([scanner scanUpToString:@"endstream"
intoString:&object]) {
+ int end = [object length];
+ unichar ch = end ? [object
characterAtIndex:end - 1] : 0;
+ if ([[NSCharacterSet newlineCharacterSet]
characterIsMember:ch]) {
end--;
- object = [object substringToIndex:end];
+ if (end && ch == '\n' && [object
characterAtIndex:end - 1] == '\r')
+ end--;
+ object = [object substringToIndex:end];
+ }
}
+ [scanner scanString:@"endstream" intoString:NULL];
}
- [scanner scanString:@"endstream" intoString:NULL];
+ [fdfDict setObject:object forKey:[SKIndirectObject
indirectObjectWithNumber:objNumber generation:genNumber]];
+ while ([scanner scanFDFComment:NULL]);
+ success = [scanner scanString:@"endobj"
intoString:NULL];
+ while ([scanner scanFDFComment:NULL]);
}
- [fdfDict setObject:object forKey:[SKIndirectObject
indirectObjectWithNumber:objNumber generation:genNumber]];
- [scanner scanCharactersFromSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet] intoString:NULL];
- success = [scanner scanString:@"endobj" intoString:NULL];
- [scanner scanCharactersFromSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet] intoString:NULL];
}
}
}
}
// Scan the FDF cross reference table, if present
- while (success && [scanner scanString:@"xref" intoString:NULL]) {
- [scanner scanUpToCharactersFromSet:[NSCharacterSet
newlineCharacterSet] intoString:NULL];
- [scanner scanCharactersFromSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet] intoString:NULL];
- while ([scanner scanInt:NULL]) {
- [scanner scanUpToCharactersFromSet:[NSCharacterSet
newlineCharacterSet] intoString:NULL];
- [scanner scanCharactersFromSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet] intoString:NULL];
+ if (success) {
+ while ([scanner scanString:@"xref" intoString:NULL]) {
+ while ([scanner scanFDFComment:NULL]);
+ while ([scanner scanInt:NULL]) {
+ while ([scanner scanFDFComment:NULL]);
+ }
}
}
// Scan the FDF trailer
if (success = success && [scanner scanString:@"trailer" intoString:NULL]) {
- [scanner scanCharactersFromSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet] intoString:NULL];
- if (success = [scanner scanFDFDictionary:&dictionary] &&
- [scanner scanCharactersFromSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet] intoString:NULL] &&
- [scanner scanString:@"%%EOF" intoString:NULL])
+ while ([scanner scanFDFComment:NULL]);
+ if (success = [scanner scanFDFDictionary:&dictionary]) {
+ while ([scanner scanFDFComment:NULL]);
[fdfDict setObject:dictionary forKey:@"trailer"];
+ [scanner scanString:@"%%EOF" intoString:NULL];
+ }
}
return success ? fdfDict : nil;
@@ -394,15 +392,20 @@
- (BOOL)scanFDFObject:(id *)object {
id tmpObject = nil;
- BOOL success = [self scanFDFName:&tmpObject] ||
- [self scanFDFArray:&tmpObject] ||
- [self scanFDFDictionary:&tmpObject] ||
- [self scanFDFString:&tmpObject] ||
- [self scanFDFHexString:&tmpObject] ||
- [self scanFDFIndirectObject:&tmpObject] ||
- [self scanFDFNumber:&tmpObject] ||
- [self scanString:@"null" intoString:NULL];
+ BOOL success = YES;
+ do {
+ success = [self scanFDFName:&tmpObject] ||
+ [self scanFDFArray:&tmpObject] ||
+ [self scanFDFDictionary:&tmpObject] ||
+ [self scanFDFString:&tmpObject] ||
+ [self scanFDFHexString:&tmpObject] ||
+ [self scanFDFIndirectObject:&tmpObject] ||
+ [self scanFDFNumber:&tmpObject] ||
+ [self scanFDFBoolean:&tmpObject] ||
+ [self scanString:@"null" intoString:NULL];
+ } while (success == NO && [self isAtEnd] == NO && [self
scanFDFComment:NULL]);
+
if (success && object)
*object = tmpObject;
@@ -474,55 +477,63 @@
NSMutableString *tmpString = [NSMutableString string];
NSString *s;
unichar ch;
- BOOL success = [self scanString:@"(" intoString:NULL];
+ BOOL success;
- while (success) {
- if ([self scanUpToCharactersFromSet:specialCharSet intoString:&s])
- [tmpString appendString:s];
- if ([self scanCharacter:&ch]) {
- if (ch == ')') {
- break;
- } else if (ch == '\\') {
- if ([self scanCharacter:&ch]) {
- if (ch == 'n') {
- [tmpString appendString:@"\n"];
- } else if (ch == 'r') {
- [tmpString appendString:@"\r"];
- } else if (ch == 't') {
- [tmpString appendString:@"\r"];
- } else if (ch == 'b') {
- [tmpString appendString:@"\b"];
- } else if (ch == 'f') {
- [tmpString appendString:@"\f"];
- } else if (ch == '(') {
- [tmpString appendString:@"("];
- } else if (ch == ')') {
- [tmpString appendString:@")"];
- } else if (ch == '\\') {
- [tmpString appendString:@"\\"];
- } else if ([octalCharSet characterIsMember:ch]) {
- char octal = ch;
- if ([self peekCharacter:&ch] && [octalCharSet
characterIsMember:ch]) {
- [self scanCharacter:NULL];
- octal = 8 * octal + ch;
+ if (success = [self scanString:@"(" intoString:NULL]) {
+ NSCharacterSet *skipChars = [[self charactersToBeSkipped] retain];
+ [self setCharactersToBeSkipped:nil];
+
+ while (success) {
+ if ([self scanUpToCharactersFromSet:specialCharSet intoString:&s])
+ [tmpString appendString:s];
+ if ([self scanCharacter:&ch]) {
+ if (ch == ')') {
+ break;
+ } else if (ch == '\\') {
+ if ([self scanCharacter:&ch]) {
+ if (ch == 'n') {
+ [tmpString appendString:@"\n"];
+ } else if (ch == 'r') {
+ [tmpString appendString:@"\r"];
+ } else if (ch == 't') {
+ [tmpString appendString:@"\r"];
+ } else if (ch == 'b') {
+ [tmpString appendString:@"\b"];
+ } else if (ch == 'f') {
+ [tmpString appendString:@"\f"];
+ } else if (ch == '(') {
+ [tmpString appendString:@"("];
+ } else if (ch == ')') {
+ [tmpString appendString:@")"];
+ } else if (ch == '\\') {
+ [tmpString appendString:@"\\"];
+ } else if ([octalCharSet characterIsMember:ch]) {
+ char octal = ch;
if ([self peekCharacter:&ch] && [octalCharSet
characterIsMember:ch]) {
[self scanCharacter:NULL];
octal = 8 * octal + ch;
+ if ([self peekCharacter:&ch] && [octalCharSet
characterIsMember:ch]) {
+ [self scanCharacter:NULL];
+ octal = 8 * octal + ch;
+ }
}
- }
- NSString *s = [[NSString alloc] initWithBytes:&octal
length:1 encoding:NSISOLatin1StringEncoding];
- if (success = s != nil)
- [tmpString appendString:s];
- [s release];
- } else
+ NSString *s = [[NSString alloc]
initWithBytes:&octal length:1 encoding:NSISOLatin1StringEncoding];
+ if (success = s != nil)
+ [tmpString appendString:s];
+ [s release];
+ } else
+ success = NO;
+ } else {
success = NO;
- } else {
- success = NO;
+ }
}
+ } else {
+ success = NO;
}
- } else {
- success = NO;
}
+
+ [self setCharactersToBeSkipped:skipChars];
+ [skipChars release];
}
if (success && string)
@@ -603,7 +614,18 @@
whitespaceOrDelimiterCharSet = [tmpSet copy];
[tmpSet release];
}
- return [self scanString:@"/" intoString:NULL] && [self
scanUpToCharactersFromSet:whitespaceOrDelimiterCharSet intoString:string];
+
+ BOOL success;
+
+ if (success = [self scanString:@"/" intoString:NULL]) {
+ NSCharacterSet *skipChars = [[self charactersToBeSkipped] retain];
+ [self setCharactersToBeSkipped:nil];
+ success = [self
scanUpToCharactersFromSet:whitespaceOrDelimiterCharSet intoString:string];
+ [self setCharactersToBeSkipped:skipChars];
+ [skipChars release];
+ }
+
+ return success;
}
- (BOOL)scanFDFNumber:(NSNumber **)number {
@@ -616,19 +638,32 @@
return success;
}
+- (BOOL)scanFDFBoolean:(id *)boolNumber {
+ NSNumber *tmpBoolNumber = nil;
+ BOOL success;
+
+ if (success = [self scanString:@"true" intoString:NULL])
+ tmpBoolNumber = [NSNumber numberWithBool:YES];
+ else if (success = [self scanString:@"false" intoString:NULL])
+ tmpBoolNumber = [NSNumber numberWithBool:NO];
+
+ if (success && boolNumber)
+ *boolNumber = tmpBoolNumber;
+
+ return success;
+}
+
- (BOOL)scanFDFIndirectObject:(id *)object {
int rewindLoc = [self scanLocation];
id tmpObject;
int objNumber, genNumber;
BOOL success;
- if (success = [self scanInt:&objNumber] && [self
scanCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString:NULL]
&&
- [self scanInt:&genNumber] && [self
scanCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString:NULL]
&&
- [self scanString:@"R" intoString:NULL])
+ if (success = [self scanInt:&objNumber] && [self scanInt:&genNumber] &&
[self scanString:@"R" intoString:NULL]) {
tmpObject = [SKIndirectObject indirectObjectWithNumber:objNumber
generation:genNumber];
-
- if (success == NO)
+ } else {
[self setScanLocation:rewindLoc];
+ }
if (success && object)
*object = tmpObject;
@@ -636,6 +671,24 @@
return success;
}
+- (BOOL)scanFDFComment:(NSString **)comment {
+ NSString *tmpComment = @"";
+ BOOL success;
+
+ if (success = [self scanString:@"%" intoString:NULL]) {
+ NSCharacterSet *skipChars = [[self charactersToBeSkipped] retain];
+ [self setCharactersToBeSkipped:[NSCharacterSet
whitespaceCharacterSet]];
+ [self scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet]
intoString:&tmpComment];
+ [self setCharactersToBeSkipped:skipChars];
+ [skipChars release];
+ }
+
+ if (success && comment)
+ *comment = tmpComment;
+
+ return success;
+}
+
@end
#pragma mark -
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit