Revision: 2856
          http://skim-app.svn.sourceforge.net/skim-app/?rev=2856&view=rev
Author:   hofman
Date:     2007-09-09 06:26:40 -0700 (Sun, 09 Sep 2007)

Log Message:
-----------
Fix bugs in FDF parser.

Modified Paths:
--------------
    trunk/SKFDFParser.m

Modified: trunk/SKFDFParser.m
===================================================================
--- trunk/SKFDFParser.m 2007-09-09 13:25:28 UTC (rev 2855)
+++ trunk/SKFDFParser.m 2007-09-09 13:26:40 UTC (rev 2856)
@@ -86,6 +86,13 @@
         
         if ([key isEqualToString:@"Type"]) {
             if (value = [self value:value ofClass:[NSString class] 
lookup:lookup]) {
+                if ([value isEqualToString:@"Annot"] == NO)
+                    success = NO;
+            } else {
+                success = NO;
+            }
+        } else if ([key isEqualToString:@"Subtype"]) {
+            if (value = [self value:value ofClass:[NSString class] 
lookup:lookup]) {
                 if ([value isEqualToString:@"Text"])
                     value = @"Note";
                 if ([validTypes containsObject:value])
@@ -114,8 +121,8 @@
         } else if ([key isEqualToString:@"Page"]) {
             if (value = [self value:value ofClass:[NSNumber class] 
lookup:lookup])
                 [dictionary setObject:value forKey:@"pageIndex"];
-            else
-                success = NO;
+            else{
+                success = NO;}
         } else if ([key isEqualToString:@"C"]) {
             if ((value = [self value:value ofClass:[NSArray class] 
lookup:lookup]) && [value count] == 3) {
                 float r, g, b;
@@ -269,15 +276,19 @@
     NSDictionary *trailer;
     SKIndirectObject *root;
     NSDictionary *rootDict;
+    NSDictionary *rootFDFDict;
     NSArray *annots;
     
     if ((fdfDict = [self fdfObjectsFromFDFString:string]) &&
         (trailer = [fdfDict objectForKey:@"trailer"]) &&
         ([trailer isKindOfClass:[NSDictionary class]]) &&
         (root = [trailer objectForKey:@"Root"]) &&
+        ([root isKindOfClass:[SKIndirectObject class]]) &&
         (rootDict = [fdfDict objectForKey:root]) &&
         ([rootDict isKindOfClass:[NSDictionary class]]) &&
-        (annots = [trailer objectForKey:@"Annots"]) &&
+        (rootFDFDict = [rootDict objectForKey:@"FDF"]) &&
+        ([rootFDFDict isKindOfClass:[NSDictionary class]]) &&
+        (annots = [rootFDFDict objectForKey:@"Annots"]) &&
         ([annots isKindOfClass:[NSArray class]])) {
     
         NSEnumerator *annotEnum = [annots objectEnumerator];
@@ -317,36 +328,37 @@
     [scanner scanCharactersFromSet:[NSCharacterSet 
whitespaceAndNewlineCharacterSet] intoString:NULL];
     
     // Scan the FDF body
-    while (success = success && [scanner scanInt:&objNumber] &&
-                    [scanner scanCharactersFromSet:[NSCharacterSet 
whitespaceAndNewlineCharacterSet] intoString:NULL] &&
-                    [scanner scanInt:&genNumber] &&
-                    [scanner scanCharactersFromSet:[NSCharacterSet 
whitespaceCharacterSet] intoString:NULL] &&
-                    [scanner scanString:@"obj" intoString:NULL]) {
-        
+    while (success && [scanner scanInt:&objNumber]) {
         [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')
-                            end--;
-                        object = [object substringToIndex:end];
+        if (success = [scanner scanInt:&genNumber]) {
+            [scanner scanCharactersFromSet:[NSCharacterSet 
whitespaceCharacterSet] intoString: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')
+                                    end--;
+                                object = [object substringToIndex:end];
+                            }
+                        }
+                        [scanner scanString:@"endstream" intoString: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];
                 }
-                [scanner scanString:@"endstream" intoString:NULL];
-                [scanner scanCharactersFromSet:[NSCharacterSet 
whitespaceAndNewlineCharacterSet] intoString:NULL];
             }
-            [fdfDict setObject:object forKey:[SKIndirectObject 
indirectObjectWithNumber:objNumber generation:genNumber]];
-            success = [scanner scanString:@"endobj" intoString:NULL];
-            [scanner scanCharactersFromSet:[NSCharacterSet 
whitespaceAndNewlineCharacterSet] intoString:NULL];
         }
     }
     
@@ -381,12 +393,12 @@
 - (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 scanFDFArray:&tmpObject] || 
-        [self scanFDFDictionary:&tmpObject] || 
-        [self scanFDFIndirectObject:&tmpObject] || 
         [self scanString:@"null" intoString:NULL];
     
     if (success && object)
@@ -408,10 +420,13 @@
             success = NO;
             break;
         }
-        if (ch == ']')
+        if (ch == ']') {
+            [self scanCharacter:NULL];
             break;
-        else if ((success = [self scanFDFObject:&object]) && object)
-            [tmpArray addObject:object];
+        } else if (success = [self scanFDFObject:&object]) {
+           if (object)
+                [tmpArray addObject:object];
+        }
     }
     
     if (success && array)
@@ -422,18 +437,11 @@
 
 - (BOOL)scanFDFDictionary:(NSDictionary **)dictionary {
     NSMutableDictionary *tmpDict = [NSMutableDictionary dictionary];
-    unichar ch;
     NSString *key;
     id object;
     BOOL success = [self scanString:@"<<" intoString:NULL];
     
     while (success) {
-        [self scanCharactersFromSet:[NSCharacterSet 
whitespaceAndNewlineCharacterSet] intoString:NULL];
-        
-        if ([self peekCharacter:&ch] == NO) {
-            success = NO;
-            break;
-        }
         if ([self scanFDFName:&key]) {
             [self scanCharactersFromSet:[NSCharacterSet 
whitespaceAndNewlineCharacterSet] intoString:NULL];
             if ((success = [self scanFDFObject:&object]) && object)
@@ -443,6 +451,7 @@
         } else {
             success = NO;
         }
+        [self scanCharactersFromSet:[NSCharacterSet 
whitespaceAndNewlineCharacterSet] intoString:NULL];
     }
     
     if (success && dictionary)
@@ -589,7 +598,7 @@
     if (whitespaceOrDelimiterCharSet == nil) {
         NSMutableCharacterSet *tmpSet = [[NSCharacterSet 
whitespaceAndNewlineCharacterSet] mutableCopy];
         [tmpSet addCharactersInString:@"()<>[]{}/%"];
-        whitespaceOrDelimiterCharSet = [[tmpSet invertedSet] copy];
+        whitespaceOrDelimiterCharSet = [tmpSet copy];
         [tmpSet release];
     }
     return [self scanString:@"/" intoString:NULL] && [self 
scanUpToCharactersFromSet:whitespaceOrDelimiterCharSet intoString:string];
@@ -647,6 +656,10 @@
     return [self retain];
 }
 
+- (NSString *)description {
+    return [NSString stringWithFormat:@"<%@: %i %i>",[self class], 
objectNumber, generationNumber];
+}
+
 - (BOOL)isEqual:(id)other {
     return [self isMemberOfClass:[other class]] && [self objectNumber] == 
[other objectNumber] && [self generationNumber] == [other generationNumber];
 }


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

Reply via email to