Revision: 2496 http://skim-app.svn.sourceforge.net/skim-app/?rev=2496&view=rev Author: hofman Date: 2007-07-13 11:20:19 -0700 (Fri, 13 Jul 2007)
Log Message: ----------- Escape special shell characters in file path passed to shell for pdfsync. Modified Paths: -------------- trunk/NSString_SKExtensions.h trunk/NSString_SKExtensions.m trunk/SKDocument.m Modified: trunk/NSString_SKExtensions.h =================================================================== --- trunk/NSString_SKExtensions.h 2007-07-13 16:39:31 UTC (rev 2495) +++ trunk/NSString_SKExtensions.h 2007-07-13 18:20:19 UTC (rev 2496) @@ -47,6 +47,7 @@ - (NSString *)stringByReplacingPathExtension:(NSString *)ext; +- (NSString *)stringByEscapingShellChars; - (NSArray *)shellScriptArgumentsArray; - (NSRange)rangeOfLeadingEmptyLine; Modified: trunk/NSString_SKExtensions.m =================================================================== --- trunk/NSString_SKExtensions.m 2007-07-13 16:39:31 UTC (rev 2495) +++ trunk/NSString_SKExtensions.m 2007-07-13 18:20:19 UTC (rev 2496) @@ -117,6 +117,25 @@ return [[self stringByDeletingPathExtension] stringByAppendingPathExtension:ext]; } +// Escape those characters that are special, to the shell, inside a "quoted" string +- (NSString *)stringByEscapingShellChars { + static NSCharacterSet *shellSpecialChars = nil; + if (shellSpecialChars == nil) + shellSpecialChars = [[NSCharacterSet characterSetWithCharactersInString:@"$\"`\\"] retain]; + + NSMutableString *result = [self mutableCopy]; + unsigned int i = 0; + while (i < [result length]) { + i = [result rangeOfCharacterFromSet:shellSpecialChars options:0 range:NSMakeRange(i, [result length] - i)].location; + if (i != NSNotFound) { + [result insertString:@"\\" atIndex: i]; + i += 2; + } + } + + return [result autorelease]; +} + // parses a space separated list of shell script argments // allows quoting parts of an argument and escaped characters outside quotes, according to shell rules - (NSArray *)shellScriptArgumentsArray; Modified: trunk/SKDocument.m =================================================================== --- trunk/SKDocument.m 2007-07-13 16:39:31 UTC (rev 2495) +++ trunk/SKDocument.m 2007-07-13 18:20:19 UTC (rev 2496) @@ -877,8 +877,30 @@ } } - [cmdString replaceOccurrencesOfString:@"%file" withString:file options:NSLiteralSearch range: NSMakeRange(0, [cmdString length] )]; - [cmdString replaceOccurrencesOfString:@"%line" withString:[NSString stringWithFormat:@"%d", line] options:NSLiteralSearch range:NSMakeRange(0, [cmdString length])]; + NSRange range = NSMakeRange(0, 0); + unichar prevChar, nextChar; + while (NSMaxRange(range) < [cmdString length]) { + range = [cmdString rangeOfString:@"%file" options:NSLiteralSearch range:NSMakeRange(NSMaxRange(range), [cmdString length] - NSMaxRange(range))]; + if (range.location == NSNotFound) + break; + prevChar = range.location > 0 ? [cmdString characterAtIndex:range.location - 1] : 0; + nextChar = NSMaxRange(range) < [cmdString length] ? [cmdString characterAtIndex:NSMaxRange(range)] : 0; + if (prevChar == '\'' && nextChar == '\'') + [cmdString replaceCharactersInRange:range withString:file]; + else if ([[NSCharacterSet letterCharacterSet] characterIsMember:nextChar] == NO) + [cmdString replaceCharactersInRange:range withString:[file stringByEscapingShellChars]]; + } + + range = NSMakeRange(0, 0); + while (NSMaxRange(range) < [cmdString length]) { + range = [cmdString rangeOfString:@"%line" options:NSLiteralSearch range:NSMakeRange(NSMaxRange(range), [cmdString length] - NSMaxRange(range))]; + if (range.location == NSNotFound) + break; + nextChar = NSMaxRange(range) < [cmdString length] ? [cmdString characterAtIndex:NSMaxRange(range)] : 0; + if ([[NSCharacterSet letterCharacterSet] characterIsMember:nextChar] == NO) + [cmdString replaceCharactersInRange:range withString:[NSString stringWithFormat:@"%d", line]]; + } + [cmdString insertString:@"\" " atIndex:0]; [cmdString insertString:editorCmd atIndex:0]; [cmdString insertString:@"\"" atIndex: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 DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ Skim-app-commit mailing list Skim-app-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/skim-app-commit