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