Revision: 2847
          http://skim-app.svn.sourceforge.net/skim-app/?rev=2847&view=rev
Author:   hofman
Date:     2007-09-08 07:07:22 -0700 (Sat, 08 Sep 2007)

Log Message:
-----------
Add file ID to FDF file. 

Add data category to find a pattern. 

Add license info.

Modified Paths:
--------------
    trunk/SKDocument.m
    trunk/SKFDFParser.h
    trunk/SKFDFParser.m
    trunk/Skim.xcodeproj/project.pbxproj

Added Paths:
-----------
    trunk/NSData_SKExtensions.h
    trunk/NSData_SKExtensions.m

Added: trunk/NSData_SKExtensions.h
===================================================================
--- trunk/NSData_SKExtensions.h                         (rev 0)
+++ trunk/NSData_SKExtensions.h 2007-09-08 14:07:22 UTC (rev 2847)
@@ -0,0 +1,46 @@
+//
+//  NSData_SKExtensions.h
+//  Skim
+//
+//  Created by Christiaan Hofman on 9/8/07.
+/*
+ This software is Copyright (c) 2007
+ Christiaan Hofman. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the
+    distribution.
+
+ - Neither the name of Christiaan Hofman nor the names of any
+    contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import <Cocoa/Cocoa.h>
+
+
[EMAIL PROTECTED] NSData (SKExtensions)
+- (unsigned)indexOfBytes:(const void *)patternBytes length:(unsigned 
int)patternLength;
+- (unsigned)indexOfBytes:(const void *)patternBytes length:(unsigned 
int)patternLength options:(int)mask;
+- (unsigned)indexOfBytes:(const void *)patternBytes length:(unsigned 
int)patternLength options:(int)mask range:(NSRange)searchRange;
[EMAIL PROTECTED]

Added: trunk/NSData_SKExtensions.m
===================================================================
--- trunk/NSData_SKExtensions.m                         (rev 0)
+++ trunk/NSData_SKExtensions.m 2007-09-08 14:07:22 UTC (rev 2847)
@@ -0,0 +1,101 @@
+//
+//  NSData_SKExtensions.m
+//  Skim
+//
+//  Created by Christiaan Hofman on 9/8/07.
+/*
+ This software is Copyright (c) 2007
+ Christiaan Hofman. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the
+    distribution.
+
+ - Neither the name of Christiaan Hofman nor the names of any
+    contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "NSData_SKExtensions.h"
+
+
[EMAIL PROTECTED] NSData (SKExtensions)
+
+- (unsigned)indexOfBytes:(const void *)patternBytes length:(unsigned 
int)patternLength {
+    return [self indexOfBytes:patternBytes length:patternLength options:0 
range:NSMakeRange(0, [self length])];
+}
+
+- (unsigned)indexOfBytes:(const void *)patternBytes length:(unsigned 
int)patternLength options:(int)mask {
+    return [self indexOfBytes:patternBytes length:patternLength options:mask 
range:NSMakeRange(0, [self length])];
+}
+
+- (unsigned)indexOfBytes:(const void *)patternBytes length:(unsigned 
int)patternLength options:(int)mask range:(NSRange)searchRange {
+    unsigned const char *selfBufferStart, *selfPtr, *selfPtrEnd, *selfPtrMax;
+    unsigned const char firstPatternByte = *(const char *)patternBytes;
+    unsigned int selfLength;
+    BOOL backward = (mask & NSBackwardsSearch) != 0;
+    
+    selfLength = [self length];
+    if (searchRange.location > selfLength || NSMaxRange(searchRange) > 
selfLength)
+        [NSException raise:NSRangeException format:@"Range {%u,%u} exceeds 
length %u", searchRange.location, searchRange.length, selfLength];
+
+    if (patternLength == 0)
+        return searchRange.location;
+    if (patternLength > searchRange.length) {
+        // This test is a nice shortcut, but it's also necessary to avoid 
crashing: zero-length CFDatas will sometimes(?) return NULL for their bytes 
pointer, and the resulting pointer arithmetic can underflow.
+        return NSNotFound;
+    }
+    
+    selfBufferStart = [self bytes];
+    selfPtrMax = selfBufferStart + NSMaxRange(searchRange) + 1 - patternLength;
+    if (backward) {
+        selfPtr = selfPtrMax - 1;
+        selfPtrEnd = selfBufferStart + searchRange.location - 1;
+    } else {
+        selfPtr = selfBufferStart + searchRange.location;
+        selfPtrEnd = selfPtrMax;
+    }
+    
+    for (;;) {
+        if (memcmp(selfPtr, patternBytes, patternLength) == 0)
+            return (selfPtr - selfBufferStart);
+        
+        if (backward) {
+            do {
+                selfPtr--;
+            } while (*selfPtr != firstPatternByte && selfPtr > selfPtrEnd);
+            if (*selfPtr != firstPatternByte)
+                break;
+        } else {
+            selfPtr++;
+            if (selfPtr == selfPtrEnd)
+                break;
+            selfPtr = memchr(selfPtr, firstPatternByte, (selfPtrMax - 
selfPtr));
+            if (selfPtr == NULL)
+                break;
+        }
+    }
+    return NSNotFound;
+}
+
[EMAIL PROTECTED]

Modified: trunk/SKDocument.m
===================================================================
--- trunk/SKDocument.m  2007-09-08 12:36:53 UTC (rev 2846)
+++ trunk/SKDocument.m  2007-09-08 14:07:22 UTC (rev 2847)
@@ -62,6 +62,7 @@
 #import "Files_SKExtensions.h"
 #import "NSTask_SKExtensions.h"
 #import "SKFDFParser.h"
+#import "NSData_SKExtensions.h"
 
 #define BUNDLE_DATA_FILENAME @"data"
 
@@ -1055,25 +1056,11 @@
             unsigned long long startPos = fileEnd < 1024 ? 0 : fileEnd - 1024;
             [fh seekToFileOffset:startPos];
             NSData *trailerData = [fh readDataToEndOfFile];
-            
-            // done with the filehandle and offsets; now we have the trailer 
as NSData, so try to find the marker pattern in it
             const char *pattern = "%%EOF";
             unsigned patternLength = strlen(pattern);
-            unsigned trailerLength = [trailerData length];
-            BOOL foundTrailer = NO;
+            unsigned trailerIndex = [trailerData indexOfBytes:pattern 
length:patternLength options:NSBackwardsSearch];
             
-            int i, startIndex = trailerLength - patternLength;
-            const char *buffer = [trailerData bytes];
-            
-            // Adobe says to search from the end, so we get the last %%EOF
-            for (i = startIndex; i >= 0 && NO == foundTrailer; i -= 1) {
-                
-                // don't bother comparing if the first byte doesn't match
-                if (buffer[i] == pattern[0])
-                    foundTrailer = (bcmp(&buffer[i], pattern, patternLength) 
== 0);
-            }
-            
-            if (foundTrailer) {
+            if (trailerIndex != NSNotFound) {
                 if (autoUpdate && [self isDocumentEdited] == NO) {
                     // tried queuing this with a delayed perform/cancel 
previous, but revert takes long enough that the cancel was never used
                     [self fileUpdateAlertDidEnd:nil 
returnCode:NSAlertDefaultReturn contextInfo:NULL];
@@ -1322,8 +1309,54 @@
     return data;
 }
 
+- (NSString *)fileIDString; {
+    if (pdfData == nil)
+        return nil;
+    const char *EOFPattern = "%%EOF";
+    const char *trailerPattern = "trailer";
+    const char *IDPattern = "/ID";
+    const char *startArrayPattern = "[";
+    const char *endArrayPattern = "]";
+    unsigned patternLength = strlen(EOFPattern);
+    NSRange range = NSMakeRange([pdfData length] - 1024, 1024);
+    if (range.location < 0)
+        range = NSMakeRange(0, [pdfData length]);
+    unsigned EOFIndex = [pdfData indexOfBytes:EOFPattern length:patternLength 
options:NSBackwardsSearch range:range];
+    unsigned trailerIndex, IDIndex, startArrayIndex, endArrayIndex;
+    NSData *fileIDData;
+    
+    if (EOFIndex != NSNotFound) {
+        range = NSMakeRange(EOFIndex - 2048, 2048);
+        if (range.location < 0)
+            range = NSMakeRange(0, EOFIndex);
+        patternLength = strlen(trailerPattern);
+        trailerIndex = [pdfData indexOfBytes:trailerPattern 
length:patternLength options:NSBackwardsSearch range:range];
+        if (trailerIndex != NSNotFound) {
+            range = NSMakeRange(trailerIndex + patternLength, EOFIndex - 
trailerIndex - patternLength);
+            patternLength = strlen(IDPattern);
+            IDIndex = [pdfData indexOfBytes:IDPattern length:patternLength 
options:0 range:range];
+            if (IDIndex != NSNotFound) {
+                range = NSMakeRange(IDIndex + patternLength, EOFIndex - 
IDIndex - patternLength);
+                patternLength = strlen(startArrayPattern);
+                startArrayIndex = [pdfData indexOfBytes:startArrayPattern 
length:patternLength options:0 range:range];
+                if (startArrayIndex != NSNotFound) {
+                    range = NSMakeRange(startArrayIndex + patternLength, 
EOFIndex - startArrayIndex - patternLength);
+                    patternLength = strlen(endArrayPattern);
+                    endArrayIndex = [pdfData indexOfBytes:endArrayPattern 
length:patternLength options:0 range:range];
+                    if (endArrayIndex != NSNotFound) {
+                        fileIDData = [pdfData 
subdataWithRange:NSMakeRange(startArrayIndex + 1, endArrayIndex - 
startArrayIndex - 1)];
+                        return [[[NSString alloc] initWithData:fileIDData 
encoding:NSISOLatin1StringEncoding] autorelease];
+                    }
+                }
+            }
+        }
+    }
+    return nil;
+}
+
 - (NSString *)notesFDFString {
     NSString *filename = [[[self fileURL] path] lastPathComponent];
+    NSString *fileIDString = [self fileIDString];
     int i, count = [[self notes] count];
     NSMutableString *string = [NSMutableString 
stringWithFormat:@"%%FDF-1.2\n%%%C%C%C%C\n1 0 obj<</FDF<<", 0xe2, 0xe3, 0xcf, 
0xd3];
     [string appendString:@"/Annots["];
@@ -1335,7 +1368,10 @@
         if (index != NSNotFound)
             filename = [filename stringByAppendingPathComponent:[files 
objectAtIndex:index]];
     }
-    [string appendFormat:@"]/F(%@)>>\nendobj\n", filename ? [filename 
stringByEscapingParenthesis] : @""];
+    [string appendFormat:@"]/F(%@)", filename ? [filename 
stringByEscapingParenthesis] : @""];
+    if (fileIDString)
+        [string appendFormat:@"/[EMAIL PROTECTED]", fileIDString];
+    [string appendString:@">>\nendobj\n"];
     for (i = 0; i < count; i++)
         [string appendFormat:@"obj %i 0<<%@>>\nendobj\n", i + 2, [[[self 
notes] objectAtIndex:i] fdfString]];
     [string appendString:@"trailer\n<</Root 1 0 R>>\n%%EOF\n"];

Modified: trunk/SKFDFParser.h
===================================================================
--- trunk/SKFDFParser.h 2007-09-08 12:36:53 UTC (rev 2846)
+++ trunk/SKFDFParser.h 2007-09-08 14:07:22 UTC (rev 2847)
@@ -2,10 +2,40 @@
 //  SKFDFParser.h
 //  Skim
 //
-//  Created by Christiaan Hofman on 6/9/07.
-//  Copyright 2007 Christiaan Hofman. All rights reserved.
-//
+//  Created by Christiaan Hofman on 9/6/07.
+/*
+ This software is Copyright (c) 2007
+ Christiaan Hofman. All rights reserved.
 
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the
+    distribution.
+
+ - Neither the name of Christiaan Hofman nor the names of any
+    contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
 #import <Cocoa/Cocoa.h>
 
 

Modified: trunk/SKFDFParser.m
===================================================================
--- trunk/SKFDFParser.m 2007-09-08 12:36:53 UTC (rev 2846)
+++ trunk/SKFDFParser.m 2007-09-08 14:07:22 UTC (rev 2847)
@@ -2,10 +2,40 @@
 //  SKFDFParser.m
 //  Skim
 //
-//  Created by Christiaan Hofman on 6/9/07.
-//  Copyright 2007 Christiaan Hofman. All rights reserved.
-//
+//  Created by Christiaan Hofman on 9/6/07.
+/*
+ This software is Copyright (c) 2007
+ Christiaan Hofman. All rights reserved.
 
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the
+    distribution.
+
+ - Neither the name of Christiaan Hofman nor the names of any
+    contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
 #import "SKFDFParser.h"
 #import <Quartz/Quartz.h>
 #import "NSScanner_SKExtensions.h"

Modified: trunk/Skim.xcodeproj/project.pbxproj
===================================================================
--- trunk/Skim.xcodeproj/project.pbxproj        2007-09-08 12:36:53 UTC (rev 
2846)
+++ trunk/Skim.xcodeproj/project.pbxproj        2007-09-08 14:07:22 UTC (rev 
2847)
@@ -149,6 +149,7 @@
                CE9A87930C0C9E9A004F1F97 /* ProgressSheet.nib in Resources */ = 
{isa = PBXBuildFile; fileRef = CE9A878D0C0C9E9A004F1F97 /* ProgressSheet.nib 
*/; };
                CE9C423C0B8B5633004AD8CF /* PreferenceWindow.nib in Resources 
*/ = {isa = PBXBuildFile; fileRef = CE9C42360B8B5633004AD8CF /* 
PreferenceWindow.nib */; };
                CE9DC2EA0B9F131900D64F28 /* ToolbarHighlightNote.tiff in 
Resources */ = {isa = PBXBuildFile; fileRef = CE9DC2E80B9F131800D64F28 /* 
ToolbarHighlightNote.tiff */; };
+               CEA182280C92E3300061A6D4 /* NSData_SKExtensions.m in Sources */ 
= {isa = PBXBuildFile; fileRef = CEA182260C92E3300061A6D4 /* 
NSData_SKExtensions.m */; };
                CEA575CE0B9206E60003D2E7 /* SKNoteOutlineView.m in Sources */ = 
{isa = PBXBuildFile; fileRef = CEA575CD0B9206E60003D2E7 /* SKNoteOutlineView.m 
*/; };
                CEA575E50B9207B80003D2E7 /* SKThumbnailTableView.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = CEA575E40B9207B80003D2E7 /* 
SKThumbnailTableView.m */; };
                CEA575FD0B9208B60003D2E7 /* SKTocOutlineView.m in Sources */ = 
{isa = PBXBuildFile; fileRef = CEA575FC0B9208B60003D2E7 /* SKTocOutlineView.m 
*/; };
@@ -528,6 +529,8 @@
                CE9A87970C0C9EA7004F1F97 /* Italian */ = {isa = 
PBXFileReference; lastKnownFileType = wrapper.nib; name = Italian; path = 
Italian.lproj/ProgressSheet.nib; sourceTree = "<group>"; };
                CE9C42370B8B5633004AD8CF /* English */ = {isa = 
PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = 
English.lproj/PreferenceWindow.nib; sourceTree = "<group>"; };
                CE9DC2E80B9F131800D64F28 /* ToolbarHighlightNote.tiff */ = {isa 
= PBXFileReference; lastKnownFileType = image.tiff; name = 
ToolbarHighlightNote.tiff; path = Images/ToolbarHighlightNote.tiff; sourceTree 
= "<group>"; };
+               CEA182250C92E3300061A6D4 /* NSData_SKExtensions.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
NSData_SKExtensions.h; sourceTree = "<group>"; };
+               CEA182260C92E3300061A6D4 /* NSData_SKExtensions.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= NSData_SKExtensions.m; sourceTree = "<group>"; };
                CEA575CC0B9206E60003D2E7 /* SKNoteOutlineView.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
SKNoteOutlineView.h; sourceTree = "<group>"; };
                CEA575CD0B9206E60003D2E7 /* SKNoteOutlineView.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= SKNoteOutlineView.m; sourceTree = "<group>"; };
                CEA575E30B9207B80003D2E7 /* SKThumbnailTableView.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
SKThumbnailTableView.h; sourceTree = "<group>"; };
@@ -806,6 +809,8 @@
                                CE7C204E0C259A5D0059E08C /* 
NSColor_SKExtensions.m */,
                                CE2DE4EC0B85DB6300D0DA12 /* 
NSCursor_SKExtensions.h */,
                                CE2DE4ED0B85DB6300D0DA12 /* 
NSCursor_SKExtensions.m */,
+                               CEA182250C92E3300061A6D4 /* 
NSData_SKExtensions.h */,
+                               CEA182260C92E3300061A6D4 /* 
NSData_SKExtensions.m */,
                                CE5487BA0B35A20A00F8AFB6 /* 
NSFileManager_ExtendedAttributes.h */,
                                CE5487BB0B35A20A00F8AFB6 /* 
NSFileManager_ExtendedAttributes.m */,
                                CEF839B00C77742A00A3AD51 /* 
Files_SKExtensions.h */,
@@ -1506,6 +1511,7 @@
                                CE820A220C8A0E310020E6B0 /* 
NSTask_SKExtensions.m in Sources */,
                                CE5F71560C8CDF9A008BE480 /* 
NSCell_SKExtensions.m in Sources */,
                                CE5FA1680C909886008BE480 /* SKFDFParser.m in 
Sources */,
+                               CEA182280C92E3300061A6D4 /* 
NSData_SKExtensions.m in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };


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