adium 3181:daa5538570b4: Note the number of resolved addresses w...
commits at adium.im
commits at adium.im
Thu Apr 29 19:36:32 UTC 2010
details: http://hg.adium.im/adium/rev/daa5538570b4
revision: 3181:daa5538570b4
author: Evan Schoenberg
date: Thu Apr 29 14:35:29 2010 -0500
Note the number of resolved addresses when doing a dns lookup. Refs #12632
Subject: adium 3182:e67d69a74a48: Merge
details: http://hg.adium.im/adium/rev/e67d69a74a48
revision: 3182:e67d69a74a48
author: Evan Schoenberg
date: Thu Apr 29 14:36:21 2010 -0500
Merge
diffs (truncated from 2002 to 1000 lines):
diff -r bd12f98a66c3 -r e67d69a74a48 Frameworks/AutoHyperlinks Framework/AutoHyperlinks.framework.xcodeproj/project.pbxproj
--- a/Frameworks/AutoHyperlinks Framework/AutoHyperlinks.framework.xcodeproj/project.pbxproj Tue Apr 27 11:09:33 2010 -0500
+++ b/Frameworks/AutoHyperlinks Framework/AutoHyperlinks.framework.xcodeproj/project.pbxproj Thu Apr 29 14:36:21 2010 -0500
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 45;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -68,6 +68,10 @@
3496A82007CE69270055BBAB /* AHHyperlinkScanner.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = AHHyperlinkScanner.m; path = Source/AHHyperlinkScanner.m; sourceTree = "<group>"; };
3496A82107CE69270055BBAB /* AHHyperlinkScanner.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = AHHyperlinkScanner.h; path = Source/AHHyperlinkScanner.h; sourceTree = "<group>"; };
3496A82207CE69270055BBAB /* AHMarkedHyperlink.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = AHMarkedHyperlink.m; path = Source/AHMarkedHyperlink.m; sourceTree = "<group>"; };
+ 7E0CF1AF11769E6100EDC305 /* AutoHyperlinks.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = AutoHyperlinks.xcconfig; path = xcconfigs/AutoHyperlinks.xcconfig; sourceTree = "<group>"; };
+ 7E0CF30C11769F4C00EDC305 /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = xcconfigs/Debug.xcconfig; sourceTree = "<group>"; };
+ 7E0CF31811769FBD00EDC305 /* Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = xcconfigs/Release.xcconfig; sourceTree = "<group>"; };
+ 7E0CF31B11769FE700EDC305 /* Release-Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "Release-Debug.xcconfig"; path = "xcconfigs/Release-Debug.xcconfig"; sourceTree = "<group>"; };
7E4C24320DD20C0100DF1359 /* NegativeURLTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NegativeURLTest.h; path = UnitTests/NegativeURLTest.h; sourceTree = "<group>"; };
7E4C24330DD20C0100DF1359 /* NegativeURLTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NegativeURLTest.m; path = UnitTests/NegativeURLTest.m; sourceTree = "<group>"; };
7E4C24360DD20C9900DF1359 /* HyperlinkContextTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HyperlinkContextTest.h; path = UnitTests/HyperlinkContextTest.h; sourceTree = "<group>"; };
@@ -169,6 +173,7 @@
089C1665FE841158C02AAC07 /* Resources */,
0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */,
034768DFFF38A50411DB9C8B /* Products */,
+ 7E0CF1A011769DE400EDC305 /* xcconfigs */,
);
name = AIHyperlinks.framework;
sourceTree = "<group>";
@@ -241,6 +246,17 @@
name = "Other Sources";
sourceTree = "<group>";
};
+ 7E0CF1A011769DE400EDC305 /* xcconfigs */ = {
+ isa = PBXGroup;
+ children = (
+ 7E0CF31B11769FE700EDC305 /* Release-Debug.xcconfig */,
+ 7E0CF1AF11769E6100EDC305 /* AutoHyperlinks.xcconfig */,
+ 7E0CF30C11769F4C00EDC305 /* Debug.xcconfig */,
+ 7E0CF31811769FBD00EDC305 /* Release.xcconfig */,
+ );
+ name = xcconfigs;
+ sourceTree = "<group>";
+ };
7EA3B03C0DD1150E002A18D1 /* UnitTests */ = {
isa = PBXGroup;
children = (
@@ -381,10 +397,10 @@
0867D690FE84028FC02AAC07 /* Project object */ = {
isa = PBXProject;
attributes = {
- BuildIndependentTargetsInParallel = NO;
+ BuildIndependentTargetsInParallel = YES;
};
buildConfigurationList = DA8A8087085549EE00F24BB3 /* Build configuration list for PBXProject "AutoHyperlinks.framework" */;
- compatibilityVersion = "Xcode 3.1";
+ compatibilityVersion = "Xcode 3.2";
hasScannedForEncodings = 1;
mainGroup = 0867D691FE84028FC02AAC07 /* AIHyperlinks.framework */;
productRefGroup = 034768DFFF38A50411DB9C8B /* Products */;
@@ -520,7 +536,6 @@
GCC_PREPROCESSOR_DEFINITIONS = "TEST_URIS_FILE_PATHNAME=\"\\\"$(SRCROOT)/TestURIs.txt\\\"\"";
INSTALL_PATH = /usr/local/bin;
LD_RUNPATH_SEARCH_PATHS = "$(DEVELOPER_FRAMEWORKS_DIR)";
- LEX = "$(SRCROOT)/Utilities/usr/bin/flex";
OTHER_LDFLAGS = (
"-framework",
Foundation,
@@ -529,7 +544,6 @@
);
PREBINDING = NO;
PRODUCT_NAME = AHStressTester;
- SDKROOT = macosx10.5;
};
name = Debug;
};
@@ -548,7 +562,6 @@
GCC_PREPROCESSOR_DEFINITIONS = "TEST_URIS_FILE_PATHNAME=\"\\\"$(SRCROOT)/TestURIs.txt\\\"\"";
INSTALL_PATH = /usr/local/bin;
LD_RUNPATH_SEARCH_PATHS = "$(DEVELOPER_FRAMEWORKS_DIR)";
- LEX = "$(SRCROOT)/Utilities/usr/bin/flex";
MACOSX_DEPLOYMENT_TARGET = 10.5;
OTHER_LDFLAGS = (
"-framework",
@@ -558,7 +571,6 @@
);
PREBINDING = NO;
PRODUCT_NAME = AHStressTester;
- SDKROOT = macosx10.5;
};
name = Release;
};
@@ -576,7 +588,6 @@
GCC_PREPROCESSOR_DEFINITIONS = "TEST_URIS_FILE_PATHNAME=\"\\\"$(SRCROOT)/TestURIs.txt\\\"\"";
INSTALL_PATH = /usr/local/bin;
LD_RUNPATH_SEARCH_PATHS = "$(DEVELOPER_FRAMEWORKS_DIR)";
- LEX = "$(SRCROOT)/Utilities/usr/bin/flex";
OTHER_LDFLAGS = (
"-framework",
Foundation,
@@ -585,13 +596,13 @@
);
PREBINDING = NO;
PRODUCT_NAME = AHStressTester;
- SDKROOT = macosx10.5;
};
name = "Release-Debug";
};
34C57363093E5E6E00829508 /* Release-Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
COPY_PHASE_STRIP = NO;
DEPLOYMENT_POSTPROCESSING = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -603,8 +614,6 @@
GCC_PREFIX_HEADER = AutoHyperlinks.framework_Prefix.pch;
INFOPLIST_FILE = Resources/Info.plist;
INSTALL_PATH = "@executable_path/../Frameworks";
- LEX = "$(SRCROOT)/Utilities/usr/bin/flex";
- LIBRARY_STYLE = DYNAMIC;
MACH_O_TYPE = mh_dylib;
PREBINDING = NO;
PRODUCT_NAME = AutoHyperlinks;
@@ -616,20 +625,8 @@
};
34C57364093E5E6E00829508 /* Release-Debug */ = {
isa = XCBuildConfiguration;
+ baseConfigurationReference = 7E0CF31B11769FE700EDC305 /* Release-Debug.xcconfig */;
buildSettings = {
- APPLY_RULES_IN_COPY_FILES = YES;
- ARCHS = (
- x86_64,
- i386,
- ppc,
- );
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_VERSION = 4.2;
- INFOPLIST_OUTPUT_FORMAT = binary;
- LD_DYLIB_INSTALL_NAME = "@rpath/AutoHyperlinks.framework/Versions/A/AutoHyperlinks";
- PLIST_FILE_OUTPUT_FORMAT = binary;
- SDKROOT = macosx10.5;
- SYMROOT = ../../build;
};
name = "Release-Debug";
};
@@ -637,7 +634,6 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
COPY_PHASE_STRIP = NO;
FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
GCC_DYNAMIC_NO_PIC = NO;
@@ -649,7 +645,6 @@
GCC_PREPROCESSOR_DEFINITIONS = "TEST_URIS_FILE_PATHNAME=\"\\\"$(SRCROOT)/TestURIs.txt\\\"\"";
INFOPLIST_FILE = "Resources/Test-Info.plist";
INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
- LEX = "$(SRCROOT)/Utilities/usr/bin/flex";
OTHER_LDFLAGS = (
"-framework",
Cocoa,
@@ -666,7 +661,6 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
COPY_PHASE_STRIP = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
@@ -677,7 +671,6 @@
GCC_PREPROCESSOR_DEFINITIONS = "TEST_URIS_FILE_PATHNAME=\"\\\"$(SRCROOT)/TestURIs.txt\\\"\"";
INFOPLIST_FILE = "Resources/Test-Info.plist";
INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
- LEX = "$(SRCROOT)/Utilities/usr/bin/flex";
OTHER_LDFLAGS = (
"-framework",
Cocoa,
@@ -694,7 +687,6 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = "$(ARCHS_STANDARD_32_BIT)";
FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
@@ -703,7 +695,6 @@
GCC_PREPROCESSOR_DEFINITIONS = "TEST_URIS_FILE_PATHNAME=\"\\\"$(SRCROOT)/TestURIs.txt\\\"\"";
INFOPLIST_FILE = "Resources/Test-Info.plist";
INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
- LEX = "$(SRCROOT)/Utilities/usr/bin/flex";
OTHER_LDFLAGS = (
"-framework",
Cocoa,
@@ -727,7 +718,6 @@
GCC_PREFIX_HEADER = LinkDriver/LinkDriver.pch;
INFOPLIST_FILE = "LinkDriver/LinkDriver-Info.plist";
INSTALL_PATH = "$(HOME)/Applications";
- LEX = "$(SRCROOT)/Utilities/usr/bin/flex";
OTHER_LDFLAGS = (
"-framework",
Foundation,
@@ -749,7 +739,6 @@
GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
INFOPLIST_FILE = "LinkDriver/LinkDriver-Info.plist";
INSTALL_PATH = "$(HOME)/Applications";
- LEX = "$(SRCROOT)/Utilities/usr/bin/flex";
OTHER_LDFLAGS = (
"-framework",
Foundation,
@@ -770,7 +759,6 @@
GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
INFOPLIST_FILE = "LinkDriver/LinkDriver-Info.plist";
INSTALL_PATH = "$(HOME)/Applications";
- LEX = "$(SRCROOT)/Utilities/usr/bin/flex";
OTHER_LDFLAGS = (
"-framework",
Foundation,
@@ -800,7 +788,6 @@
GCC_PREPROCESSOR_DEFINITIONS = "TEST_URIS_FILE_PATHNAME=\"\\\"$(SRCROOT)/TestURIs.txt\\\"\"";
INSTALL_PATH = /usr/local/bin;
LD_RUNPATH_SEARCH_PATHS = "$(DEVELOPER_FRAMEWORKS_DIR)";
- LEX = "$(SRCROOT)/Utilities/usr/bin/flex";
OTHER_LDFLAGS = (
"-framework",
Foundation,
@@ -809,7 +796,6 @@
);
PREBINDING = NO;
PRODUCT_NAME = AHThreadedStressTester;
- SDKROOT = macosx10.5;
};
name = Debug;
};
@@ -828,7 +814,6 @@
GCC_PREPROCESSOR_DEFINITIONS = "TEST_URIS_FILE_PATHNAME=\"\\\"$(SRCROOT)/TestURIs.txt\\\"\"";
INSTALL_PATH = /usr/local/bin;
LD_RUNPATH_SEARCH_PATHS = "$(DEVELOPER_FRAMEWORKS_DIR)";
- LEX = "$(SRCROOT)/Utilities/usr/bin/flex";
MACOSX_DEPLOYMENT_TARGET = 10.5;
OTHER_LDFLAGS = (
"-framework",
@@ -838,7 +823,6 @@
);
PREBINDING = NO;
PRODUCT_NAME = AHThreadedStressTester;
- SDKROOT = macosx10.5;
};
name = Release;
};
@@ -856,7 +840,6 @@
GCC_PREPROCESSOR_DEFINITIONS = "TEST_URIS_FILE_PATHNAME=\"\\\"$(SRCROOT)/TestURIs.txt\\\"\"";
INSTALL_PATH = /usr/local/bin;
LD_RUNPATH_SEARCH_PATHS = "$(DEVELOPER_FRAMEWORKS_DIR)";
- LEX = "$(SRCROOT)/Utilities/usr/bin/flex";
OTHER_LDFLAGS = (
"-framework",
Foundation,
@@ -865,7 +848,6 @@
);
PREBINDING = NO;
PRODUCT_NAME = AHThreadedStressTester;
- SDKROOT = macosx10.5;
};
name = "Release-Debug";
};
@@ -883,10 +865,7 @@
GCC_PREFIX_HEADER = AutoHyperlinks.framework_Prefix.pch;
INFOPLIST_FILE = Resources/Info.plist;
INSTALL_PATH = "@executable_path/../Frameworks";
- LEX = "$(SRCROOT)/Utilities/usr/bin/flex";
- LIBRARY_STYLE = DYNAMIC;
MACH_O_TYPE = mh_dylib;
- ONLY_ACTIVE_ARCH = YES;
PREBINDING = NO;
PRODUCT_NAME = AutoHyperlinks;
SKIP_INSTALL = YES;
@@ -898,6 +877,7 @@
DA8A8085085549EE00F24BB3 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
COPY_PHASE_STRIP = YES;
DEPLOYMENT_POSTPROCESSING = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -909,8 +889,6 @@
GCC_PREFIX_HEADER = AutoHyperlinks.framework_Prefix.pch;
INFOPLIST_FILE = Resources/Info.plist;
INSTALL_PATH = "@executable_path/../Frameworks";
- LEX = "$(SRCROOT)/Utilities/usr/bin/flex";
- LIBRARY_STYLE = DYNAMIC;
MACH_O_TYPE = mh_dylib;
PREBINDING = NO;
PRODUCT_NAME = AutoHyperlinks;
@@ -923,33 +901,15 @@
};
DA8A8088085549EE00F24BB3 /* Debug */ = {
isa = XCBuildConfiguration;
+ baseConfigurationReference = 7E0CF30C11769F4C00EDC305 /* Debug.xcconfig */;
buildSettings = {
- ARCHS = "$(NATIVE_ARCH_ACTUAL)";
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_VERSION = 4.2;
- LD_DYLIB_INSTALL_NAME = "@rpath/AutoHyperlinks.framework/Versions/A/AutoHyperlinks";
- ONLY_ACTIVE_ARCH = YES;
- SDKROOT = macosx10.5;
- SYMROOT = ../../build;
};
name = Debug;
};
DA8A8089085549EE00F24BB3 /* Release */ = {
isa = XCBuildConfiguration;
+ baseConfigurationReference = 7E0CF31811769FBD00EDC305 /* Release.xcconfig */;
buildSettings = {
- APPLY_RULES_IN_COPY_FILES = YES;
- ARCHS = (
- x86_64,
- i386,
- ppc,
- );
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_VERSION = 4.2;
- INFOPLIST_OUTPUT_FORMAT = binary;
- LD_DYLIB_INSTALL_NAME = "@rpath/AutoHyperlinks.framework/Versions/A/AutoHyperlinks";
- PLIST_FILE_OUTPUT_FORMAT = binary;
- SDKROOT = macosx10.5;
- SYMROOT = ../../build;
};
name = Release;
};
diff -r bd12f98a66c3 -r e67d69a74a48 Frameworks/AutoHyperlinks Framework/License.txt
--- a/Frameworks/AutoHyperlinks Framework/License.txt Tue Apr 27 11:09:33 2010 -0500
+++ b/Frameworks/AutoHyperlinks Framework/License.txt Thu Apr 29 14:36:21 2010 -0500
@@ -2,7 +2,7 @@
* The AutoHyperlinks Framework is the legal property of its developers (DEVELOPERS), whose names are listed in the
* copyright file included with this source distribution.
*
- * Copyright (c) 2004-2008
+ * Copyright (c) 2004-2010
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff -r bd12f98a66c3 -r e67d69a74a48 Frameworks/AutoHyperlinks Framework/LinkDriver/LinkDriverWindowController.m
--- a/Frameworks/AutoHyperlinks Framework/LinkDriver/LinkDriverWindowController.m Tue Apr 27 11:09:33 2010 -0500
+++ b/Frameworks/AutoHyperlinks Framework/LinkDriver/LinkDriverWindowController.m Thu Apr 29 14:36:21 2010 -0500
@@ -11,6 +11,14 @@
#define VIEW_KEY @"linkView"
@implementation LinkDriverWindowController
+-(void) performLinkification:(NSTextView *)inView
+{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ AHHyperlinkScanner *scanner = [AHHyperlinkScanner hyperlinkScannerWithAttributedString:[inView textStorage]];
+ [[inView textStorage] setAttributedString:[scanner linkifiedString]];
+ [pool release];
+}
+
-(IBAction) linkifyTextView:(id)sender {
[NSThread detachNewThreadSelector:@selector(performLinkification:)
toTarget:self
@@ -19,16 +27,4 @@
toTarget:self
withObject:otherView];
}
-
--(void) performLinkification:(NSTextView *)inView
-{
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- AHHyperlinkScanner *scanner = [AHHyperlinkScanner hyperlinkScannerWithAttributedString:[inView textStorage]];
- NSAttributedString *attributedString = [scanner linkifiedString];
-
- [[inView textStorage] performSelectorOnMainThread:@selector(setAttributedString:)
- withObject:attributedString
- waitUntilDone:NO];
- [pool release];
-}
@end
diff -r bd12f98a66c3 -r e67d69a74a48 Frameworks/AutoHyperlinks Framework/Source/AHHyperlinkScanner.h
--- a/Frameworks/AutoHyperlinks Framework/Source/AHHyperlinkScanner.h Tue Apr 27 11:09:33 2010 -0500
+++ b/Frameworks/AutoHyperlinks Framework/Source/AHHyperlinkScanner.h Thu Apr 29 14:36:21 2010 -0500
@@ -29,11 +29,12 @@
typedef void* yyscan_t;
-extern long AHlex( yyscan_t yyscanner );
-extern long AHlex_init( yyscan_t * ptr_yy_globals );
-extern long AHlex_destroy ( yyscan_t yyscanner );
-extern long AHget_leng ( yyscan_t scanner );
-extern void AHset_in ( FILE * in_str , yyscan_t scanner );
+extern long AHlex( yyscan_t yyscanner );
+extern long AHlex_init( yyscan_t * ptr_yy_globals );
+extern long AHlex_destroy ( yyscan_t yyscanner );
+extern long AHget_leng ( yyscan_t scanner );
+extern void AHset_in ( FILE * in_str , yyscan_t scanner );
+extern YY_EXTRA_TYPE AHget_extra ( yyscan_t scanner );
typedef struct AH_buffer_state *AH_BUFFER_STATE;
extern void AH_switch_to_buffer(AH_BUFFER_STATE, yyscan_t scanner);
@@ -46,8 +47,12 @@
{
NSDictionary *m_urlSchemes;
NSString *m_scanString;
+#ifdef TARGET_OS_IPHONE
+ NSString *m_linkifiedString
+#else
NSAttributedString *m_scanAttrString;
NSAttributedString *m_linkifiedString;
+#endif
BOOL m_strictChecking;
unsigned long m_scanLocation;
unsigned long m_scanStringLength;
@@ -72,6 +77,7 @@
*/
+ (id)strictHyperlinkScannerWithString:(NSString *)inString;
+#ifndef TARGET_OS_IPHONE
/*!
* @brief Allocs and inits a new lax AHHyperlinkScanner with the given attributed string
*
@@ -87,6 +93,7 @@
* @return a new AHHyperlinkScanner
*/
+ (id)strictHyperlinkScannerWithAttributedString:(NSAttributedString *)inString;
+#endif
/*!
* @brief Determine the validity of a given string with a custom strictness
@@ -96,7 +103,7 @@
* @param index a pointer to the index the string starts at, for easy incrementing.
* @return Boolean
*/
-+ (BOOL)isStringValidURI:(NSString *)inString usingStrict:(BOOL)useStrictChecking fromIndex:(unsigned long *)index withStatus:(AH_URI_VERIFICATION_STATUS *)validStatus;
++ (BOOL)isStringValidURI:(NSString *)inString usingStrict:(BOOL)useStrictChecking fromIndex:(unsigned long *)index withStatus:(AH_URI_VERIFICATION_STATUS *)validStatus schemeLength:(unsigned long *)schemeLength;
/*!
* @brief Init
@@ -109,6 +116,7 @@
*/
- (id)initWithString:(NSString *)inString usingStrictChecking:(BOOL)flag;
+#ifndef TARGET_OS_IPHONE
/*!
* @brief Init
*
@@ -118,8 +126,8 @@
* @param flag Sets strict checking preference.
* @return A new AHHyperlinkScanner.
*/
- - (id)initWithAttributedString:(NSAttributedString *)inString usingStrictChecking:(BOOL)flag;
-
+- (id)initWithAttributedString:(NSAttributedString *)inString usingStrictChecking:(BOOL)flag;
+#endif
/*!
* @brief Determine the validity of the scanner's string using the set strictness
@@ -142,11 +150,18 @@
*/
- (NSArray *)allURIs;
+#ifdef TARGET_OS_IPHONE
/*!
- * @brief Scans an attributed string for URIs then adds the link attribs and objects.
- * @param inString The NSAttributedString to be linkified
+ * @brief Scans the stored string for URIs then adds the link attribs and objects.
+ * @return An autoreleased NSString.
+ */
+- (NSString *)linkifiedString;
+#else
+/*!
+ * @brief Scans the stored string for URIs then adds the link attribs and objects.
* @return An autoreleased NSAttributedString.
*/
- (NSAttributedString *)linkifiedString;
+#endif
@end
diff -r bd12f98a66c3 -r e67d69a74a48 Frameworks/AutoHyperlinks Framework/Source/AHHyperlinkScanner.m
--- a/Frameworks/AutoHyperlinks Framework/Source/AHHyperlinkScanner.m Tue Apr 27 11:09:33 2010 -0500
+++ b/Frameworks/AutoHyperlinks Framework/Source/AHHyperlinkScanner.m Thu Apr 29 14:36:21 2010 -0500
@@ -30,13 +30,17 @@
#import "AHMarkedHyperlink.h"
#import <libkern/OSAtomic.h>
-#define DEFAULT_URL_SCHEME @"http://"
+#define DEFAULT_URL_SCHEME @"http://"
#define ENC_INDEX_KEY @"encIndex"
#define ENC_CHAR_KEY @"encChar"
@interface AHHyperlinkScanner (PRIVATE)
- (AHMarkedHyperlink *)nextURIFromLocation:(unsigned long *)_scanLocation;
+#ifdef TARGET_OS_IPHONE
+- (NSString *)_createLinkifiedString;
+#else
- (NSAttributedString *)_createLinkifiedString;
+#endif
- (NSRange)_longestBalancedEnclosureInRange:(NSRange)inRange;
- (BOOL)_scanString:(NSString *)inString upToCharactersFromSet:(NSCharacterSet *)inCharSet intoRange:(NSRange *)outRangeRef fromIndex:(unsigned long *)idx;
- (BOOL)_scanString:(NSString *)inString charactersFromSet:(NSCharacterSet *)inCharSet intoRange:(NSRange *)outRangeRef fromIndex:(unsigned long *)idx;
@@ -57,6 +61,35 @@
@synthesize scanLocation = m_scanLocation;
@dynamic linkifiedString;
+#pragma mark runtime initialization
++ (void)initialize
+{
+ if (self == [AHHyperlinkScanner class]){
+ NSMutableCharacterSet *mutableSkipSet = [[NSMutableCharacterSet alloc] init];
+ [mutableSkipSet formUnionWithCharacterSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
+ [mutableSkipSet formUnionWithCharacterSet:[NSCharacterSet illegalCharacterSet]];
+ [mutableSkipSet formUnionWithCharacterSet:[NSCharacterSet controlCharacterSet]];
+ [mutableSkipSet formUnionWithCharacterSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
+ skipSet = [[NSCharacterSet characterSetWithBitmapRepresentation:[mutableSkipSet bitmapRepresentation]] retain];
+ [mutableSkipSet release];
+
+ endSet = [[NSCharacterSet characterSetWithCharactersInString:@"\"',:;>)]}.?!@"] retain];
+
+ NSMutableCharacterSet *mutableStartSet = [[NSMutableCharacterSet alloc] init];
+ [mutableStartSet formUnionWithCharacterSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
+ [mutableStartSet formUnionWithCharacterSet:[NSCharacterSet characterSetWithCharactersInString:[NSString stringWithFormat:@"\"'.,:;<?!-@%C%C", 0x2014, 0x2013]]];
+ startSet = [[NSCharacterSet characterSetWithBitmapRepresentation:[mutableStartSet bitmapRepresentation]] retain];
+ [mutableStartSet release];
+
+ puncSet = [[NSCharacterSet characterSetWithCharactersInString:@"\"'.,:;<?!"] retain];
+ hostnameComponentSeparatorSet = [[NSCharacterSet characterSetWithCharactersInString:@"./"] retain];
+ enclosureStartArray = [[NSArray arrayWithObjects:@"(",@"[",@"{",nil] retain];
+ enclosureSet = [[NSCharacterSet characterSetWithCharactersInString:@"()[]{}"] retain];
+ enclosureStopArray = [[NSArray arrayWithObjects:@")",@"]",@"}",nil] retain];
+ encKeys = [[NSArray arrayWithObjects:ENC_INDEX_KEY, ENC_CHAR_KEY, nil] retain];
+ }
+}
+
#pragma mark Class Methods
+ (id)hyperlinkScannerWithString:(NSString *)inString
{
@@ -68,6 +101,7 @@
return [[[[self class] alloc] initWithString:inString usingStrictChecking:YES] autorelease];
}
+#ifndef TARGET_OS_IPHONE
+ (id)hyperlinkScannerWithAttributedString:(NSAttributedString *)inString
{
return [[[[self class] alloc] initWithAttributedString:inString usingStrictChecking:NO] autorelease];
@@ -77,58 +111,7 @@
{
return [[[[self class] alloc] initWithAttributedString:inString usingStrictChecking:NO] autorelease];
}
-
-#pragma mark Initialization
-+ (void)initialize
-{
- if ((self == [AHHyperlinkScanner class])) {
- if (!skipSet) {
- NSMutableCharacterSet *mutableSkipSet = [[NSMutableCharacterSet alloc] init];
- [mutableSkipSet formUnionWithCharacterSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
- [mutableSkipSet formUnionWithCharacterSet:[NSCharacterSet illegalCharacterSet]];
- [mutableSkipSet formUnionWithCharacterSet:[NSCharacterSet controlCharacterSet]];
- [mutableSkipSet formUnionWithCharacterSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
- skipSet = [[NSCharacterSet characterSetWithBitmapRepresentation:[mutableSkipSet bitmapRepresentation]] retain];
- [mutableSkipSet release];
- }
-
- if (!endSet) {
- endSet = [[NSCharacterSet characterSetWithCharactersInString:@"\"',:;>)]}.?!@"] retain];
- }
-
- if (!startSet) {
- NSMutableCharacterSet *mutableStartSet = [[NSMutableCharacterSet alloc] init];
- [mutableStartSet formUnionWithCharacterSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
- [mutableStartSet formUnionWithCharacterSet:[NSCharacterSet characterSetWithCharactersInString:[NSString stringWithFormat:@"\"'.,:;<?!-@%C%C", 0x2014, 0x2013]]];
- startSet = [[NSCharacterSet characterSetWithBitmapRepresentation:[mutableStartSet bitmapRepresentation]] retain];
- [mutableStartSet release];
- }
-
- if (!puncSet) {
- puncSet = [[NSCharacterSet characterSetWithCharactersInString:@"\"'.,:;<?!"] retain];
- }
-
- if (!hostnameComponentSeparatorSet) {
- hostnameComponentSeparatorSet = [[NSCharacterSet characterSetWithCharactersInString:@"./"] retain];
- }
-
- if(!enclosureStartArray){
- enclosureStartArray = [[NSArray arrayWithObjects:@"(",@"[",@"{",nil] retain];
- }
-
- if(!enclosureSet){
- enclosureSet = [[NSCharacterSet characterSetWithCharactersInString:@"()[]{}"] retain];
- }
-
- if(!enclosureStopArray){
- enclosureStopArray = [[NSArray arrayWithObjects:@")",@"]",@"}",nil] retain];
- }
-
- if(!encKeys){
- encKeys = [[NSArray arrayWithObjects:ENC_INDEX_KEY, ENC_CHAR_KEY, nil] retain];
- }
- }
-}
+#endif
#pragma mark Init/Dealloc
- (id)init
@@ -136,37 +119,41 @@
if((self = [super init])){
self.scanLocation = 0;
m_linkifiedString = nil;
+#ifndef TARGET_OS_IPHONE
+ m_scanAttrString = nil;
+#endif
}
return self;
}
- (id)initWithString:(NSString *)inString usingStrictChecking:(BOOL)flag
{
- if((self = [self init])){
+ if((self = [super init])){
m_scanString = [inString retain];
- m_scanAttrString = nil;
m_urlSchemes = [[NSDictionary alloc] initWithObjectsAndKeys:
- @"ftp://", @"ftp",
- nil];
+ @"ftp://", @"ftp",
+ nil];
m_strictChecking = flag;
m_scanStringLength = [m_scanString length];
}
return self;
}
+#ifndef TARGET_OS_IPHONE
- (id)initWithAttributedString:(NSAttributedString *)inString usingStrictChecking:(BOOL)flag
{
- if((self = [self init])){
+ if((self = [super init])){
m_scanString = [[inString string] retain];
m_scanAttrString = [inString retain];
m_urlSchemes = [[NSDictionary alloc] initWithObjectsAndKeys:
- @"ftp://", @"ftp",
- nil];
+ @"ftp://", @"ftp",
+ nil];
m_strictChecking = flag;
m_scanStringLength = [m_scanString length];
}
return self;
}
+#endif
- (void)dealloc
{
@@ -182,15 +169,15 @@
- (BOOL)isValidURI
{
- return [AHHyperlinkScanner isStringValidURI:m_scanString usingStrict:m_strictChecking fromIndex:nil withStatus:nil];
+ return [AHHyperlinkScanner isStringValidURI:m_scanString usingStrict:m_strictChecking fromIndex:nil withStatus:nil schemeLength:nil];
}
-+ (BOOL)isStringValidURI:(NSString *)inString usingStrict:(BOOL)useStrictChecking fromIndex:(unsigned long *)index withStatus:(AH_URI_VERIFICATION_STATUS *)validStatus
++ (BOOL)isStringValidURI:(NSString *)inString usingStrict:(BOOL)useStrictChecking fromIndex:(unsigned long *)sIndex withStatus:(AH_URI_VERIFICATION_STATUS *)validStatus schemeLength:(unsigned long *)schemeLength
{
- AH_BUFFER_STATE buf; // buffer for flex to scan from
+ AH_BUFFER_STATE buf; // buffer for flex to scan from
yyscan_t scanner; // pointer to the flex scanner opaque type
const char *inStringEnc;
- unsigned long encodedLength;
+ unsigned long encodedLength;
if(!validStatus){
AH_URI_VERIFICATION_STATUS newStatus = AH_URL_INVALID;
@@ -210,69 +197,62 @@
encodedLength = strlen(inStringEnc); // length of the string in utf-8
-
+
// initialize the buffer (flex automatically switches to the buffer in this function)
AHlex_init(&scanner);
- buf = AH_scan_string(inStringEnc, scanner);
+ buf = AH_scan_string(inStringEnc, scanner);
- // call flex to parse the input
- *validStatus = AHlex(scanner);
- if(index) *index += AHget_leng(scanner);
+ // call flex to parse the input
+ *validStatus = (AH_URI_VERIFICATION_STATUS)AHlex(scanner);
+ if(sIndex) *sIndex += AHget_leng(scanner);
+ if(schemeLength) *schemeLength = AHget_extra(scanner).schemeLength;
- // condition for valid URI's
- if(*validStatus == AH_URL_VALID || *validStatus == AH_MAILTO_VALID || *validStatus == AH_FILE_VALID){
- AH_delete_buffer(buf, scanner); //remove the buffer from flex.
- buf = NULL; //null the buffer pointer for safty's sake.
-
- // check that the whole string was matched by flex.
- // this prevents silly things like "blah...com" from being seen as links
- if(AHget_leng(scanner) == encodedLength){
+ // condition for valid URI's
+ if(*validStatus == AH_URL_VALID || *validStatus == AH_MAILTO_VALID || *validStatus == AH_FILE_VALID){
+ AH_delete_buffer(buf, scanner); //remove the buffer from flex.
+ buf = NULL; //null the buffer pointer for safty's sake.
+
+ // check that the whole string was matched by flex.
+ // this prevents silly things like "blah...com" from being seen as links
+ if(AHget_leng(scanner) == encodedLength){
AHlex_destroy(scanner);
- return YES;
- }
- // condition for degenerate URL's (A.K.A. URI's sans specifiers), requres strict checking to be NO.
- }else if((*validStatus == AH_URL_DEGENERATE || *validStatus == AH_MAILTO_DEGENERATE) && !useStrictChecking){
- AH_delete_buffer(buf, scanner);
- buf = NULL;
- if(AHget_leng(scanner) == encodedLength){
+ return YES;
+ }
+ // condition for degenerate URL's (A.K.A. URI's sans specifiers), requres strict checking to be NO.
+ }else if((*validStatus == AH_URL_DEGENERATE || *validStatus == AH_MAILTO_DEGENERATE || *validStatus == AH_URL_TENTATIVE) && !useStrictChecking){
+ AH_delete_buffer(buf, scanner);
+ buf = NULL;
+ if(AHget_leng(scanner) == encodedLength){
AHlex_destroy(scanner);
- return YES;
- }
- // if it ain't vaild, and it ain't degenerate, then it's invalid.
- }else{
- AH_delete_buffer(buf, scanner);
- buf = NULL;
+ return YES;
+ }
+ // if it ain't vaild, and it ain't degenerate, then it's invalid.
+ }else{
+ AH_delete_buffer(buf, scanner);
+ buf = NULL;
AHlex_destroy(scanner);
- return NO;
- }
- // default case, if the range checking above fails.
+ return NO;
+ }
+ // default case, if the range checking above fails.
AHlex_destroy(scanner);
- return NO;
+ return NO;
}
#pragma mark Accessors
-- (AHMarkedHyperlink *)nextURIFromLocation:(unsigned long * const)_scanLocation
+- (AHMarkedHyperlink *)nextURI
{
- NSRange scannedRange = NSMakeRange(0, 0);
- unsigned long scannedLocation = *_scanLocation;
+ NSRange scannedRange;
+ unsigned long scannedLocation = m_scanLocation;
- // scan upto the next whitespace char so that we don't unnecessarity confuse flex
- // otherwise we end up validating urls that look like this "http://www.adium.im/ <--cool"
+ // scan upto the next whitespace char so that we don't unnecessarity confuse flex
+ // otherwise we end up validating urls that look like this "http://www.adium.im/ <--cool"
[self _scanString:m_scanString charactersFromSet:startSet intoRange:nil fromIndex:&scannedLocation];
// main scanning loop
while([self _scanString:m_scanString upToCharactersFromSet:skipSet intoRange:&scannedRange fromIndex:&scannedLocation]) {
- // back off if the last character is puncuation.
- unichar s_char = [m_scanString characterAtIndex:(scannedRange.location + scannedRange.length - 1)];
- if(4 < scannedRange.length && [puncSet characterIsMember:s_char]) {
- scannedRange.length--;
- }
-
- BOOL foundUnpairedEnclosureCharacter = NO;
-
- // Check for and filter enclosures. We can't add (, [, etc. to the skipSet as they may be in a URI
+ // Check for and filter enclosures. We can't add (, [, etc. to the skipSet as they may be in a URI
if([enclosureSet characterIsMember:[m_scanString characterAtIndex:scannedRange.location]]){
unsigned long encIdx = [enclosureStartArray indexOfObject:[m_scanString substringWithRange:NSMakeRange(scannedRange.location, 1)]];
NSRange encRange;
@@ -280,8 +260,6 @@
encRange = [m_scanString rangeOfString:[enclosureStopArray objectAtIndex:encIdx] options:NSBackwardsSearch range:scannedRange];
if(NSNotFound != encRange.location){
scannedRange.location++; scannedRange.length -= 2;
- }else{
- foundUnpairedEnclosureCharacter = YES;
}
}
}
@@ -292,100 +270,133 @@
while (scannedRange.length > 2 && [endSet characterIsMember:[m_scanString characterAtIndex:(scannedRange.location + scannedRange.length - 1)]]) {
if((longestEnclosure.location + longestEnclosure.length) < scannedRange.length){
scannedRange.length--;
- foundUnpairedEnclosureCharacter = NO;
}else break;
}
- // if we have a valid URL then save the scanned string, and make a SHMarkedHyperlink out of it.
- // this way, we can preserve things like the matched string (to be converted to a NSURL),
- // parent string, its validation status (valid, file, degenerate, etc), and its range in the parent string
+ // if we have a valid URL then save the scanned string, and make a SHMarkedHyperlink out of it.
+ // this way, we can preserve things like the matched string (to be converted to a NSURL),
+ // parent string, its validation status (valid, file, degenerate, etc), and its range in the parent string
AH_URI_VERIFICATION_STATUS validStatus;
NSString *_scanString = nil;
+ unsigned long schemeLength = 0;
if(3 < scannedRange.length) _scanString = [m_scanString substringWithRange:scannedRange];
-
- if((3 < scannedRange.length) && [[self class] isStringValidURI:_scanString usingStrict:m_strictChecking fromIndex:_scanLocation withStatus:&validStatus]){
- AHMarkedHyperlink *markedLink;
-
- //insert typical specifiers if the URL is degenerate
- switch(validStatus){
- case AH_URL_DEGENERATE:
- {
- NSString *scheme = DEFAULT_URL_SCHEME;
- unsigned long i = 0;
-
- NSRange firstComponent;
- [self _scanString:_scanString
- upToCharactersFromSet:hostnameComponentSeparatorSet
- intoRange:&firstComponent
- fromIndex:&i];
-
- if(NSNotFound != firstComponent.location) {
- NSString *hostnameScheme = [m_urlSchemes objectForKey:[_scanString substringWithRange:firstComponent]];
- if(hostnameScheme) scheme = hostnameScheme;
+ if((3 < scannedRange.length) && [[self class] isStringValidURI:_scanString usingStrict:m_strictChecking fromIndex:&m_scanLocation withStatus:&validStatus schemeLength:&schemeLength]){
+ AHMarkedHyperlink *markedLink;
+ BOOL makeLink = TRUE;
+ //insert typical specifiers if the URL is degenerate
+ switch(validStatus){
+ case AH_URL_DEGENERATE:
+ {
+ NSString *scheme = DEFAULT_URL_SCHEME;
+ unsigned long i = 0;
+
+ NSRange firstComponent;
+ [self _scanString:_scanString
+ upToCharactersFromSet:hostnameComponentSeparatorSet
+ intoRange:&firstComponent
+ fromIndex:&i];
+
+ if(NSNotFound != firstComponent.location) {
+ NSString *hostnameScheme = [m_urlSchemes objectForKey:[_scanString substringWithRange:firstComponent]];
+ if(hostnameScheme) scheme = hostnameScheme;
+ }
+
+ _scanString = [scheme stringByAppendingString:_scanString];
+
+ break;
+ }
+
+ case AH_MAILTO_DEGENERATE:
+ _scanString = [@"mailto:" stringByAppendingString:_scanString];
+ break;
+ case AH_URL_TENTATIVE:
+ {
+ NSString *scheme = [_scanString substringToIndex:schemeLength];
+ NSString *app = (NSString *)LSCopyDefaultHandlerForURLScheme((CFStringRef)scheme);
+
+ if(!app)
+ makeLink = FALSE;
+ [app release];
+ break;
}
-
- _scanString = [scheme stringByAppendingString:_scanString];
-
- break;
- }
-
- case AH_MAILTO_DEGENERATE:
- _scanString = [@"mailto:" stringByAppendingString:_scanString];
- break;
- default:
- break;
+ default:
+ break;
+ }
+
+ if(makeLink){
+ //make a marked link
+ markedLink = [[AHMarkedHyperlink alloc] initWithString:_scanString
+ withValidationStatus:validStatus
+ parentString:m_scanString
+ andRange:scannedRange];
+ return [markedLink autorelease];
}
-
- //make a marked link
- markedLink = [AHMarkedHyperlink hyperlinkWithString:_scanString
- withValidationStatus:validStatus
- parentString:m_scanString
- andRange:scannedRange];
- return [markedLink URL]? markedLink : nil;
- }
+ }
//step location after scanning a string
- if (foundUnpairedEnclosureCharacter){
- (*_scanLocation)++;
- }else{
- NSRange startRange = [m_scanString rangeOfCharacterFromSet:puncSet options:NSLiteralSearch range:scannedRange];
- if (startRange.location != NSNotFound)
- *_scanLocation = startRange.location + startRange.length;
- else
- *_scanLocation += scannedRange.length;
- }
+ NSRange startRange = [m_scanString rangeOfCharacterFromSet:puncSet options:NSLiteralSearch range:scannedRange];
+ if (startRange.location != NSNotFound)
+ m_scanLocation = startRange.location + startRange.length;
+ else
+ m_scanLocation += scannedRange.length;
- scannedLocation = *_scanLocation;
- }
+ scannedLocation = m_scanLocation;
+ }
- // if we're here, then NSScanner hit the end of the string
- // set AHStringOffset to the string length here so we avoid potential infinite looping with many trailing spaces.
- *_scanLocation = m_scanStringLength;
- return nil;
-}
-
-- (AHMarkedHyperlink *)nextURI
-{
- AHMarkedHyperlink *link = nil;
- @synchronized(self) {
- link = [self nextURIFromLocation:&m_scanLocation];
- }
- return link;
+ // if we're here, then NSScanner hit the end of the string
+ // set AHStringOffset to the string length here so we avoid potential infinite looping with many trailing spaces.
+ m_scanLocation = m_scanStringLength;
+ return nil;
}
-(NSArray *)allURIs
{
- NSMutableArray *rangeArray = [NSMutableArray array];
- AHMarkedHyperlink *markedLink;
- unsigned long offset = 0;
-
- //build an array of marked links.
- while((markedLink = [self nextURIFromLocation:&offset])){
+ NSMutableArray *rangeArray = [NSMutableArray array];
+ AHMarkedHyperlink *markedLink;
+ unsigned long _holdOffset = m_scanLocation; // store location for later restoration;
+ m_scanLocation = 0; //set the offset to 0.
+
+ //build an array of marked links.
+ while((markedLink = [self nextURI])){
[rangeArray addObject:markedLink];
}
+ m_scanLocation = _holdOffset; // reset scanLocation
return rangeArray;
}
+#ifdef TARGET_OS_IPHONE
+-(NSString *)_createLinkifiedString
+{
+ NSMutableString *_linkifiedString;
+ AHMarkedHyperlink *markedLink;
+ unsigned long _scanLocationCache = self.scanLocation;
+ NSEnumerator *linkEnumerator = [[self allURIs] reverseObjectEnumerator];
+
+ _linkifiedString = [[[NSMutableString alloc] initWithString:m_scanString] autorelease];
+
+ while ((markedLink = [linkEnumerator nextObject])) {
+ [_linkifiedString replaceCharactersInRange:markedLink.range
+ withString:[NSString stringWithFormat:@"<a href=\"%@\">%@</a>",
+ markedLink.URL,
+ [m_scanString substringWithRange:markedLink.range]]];
+ }
+
+ self.scanLocation = _scanLocationCache;
+ return [[_linkifiedString copy] autorelease];
+}
+
+-(NSString *)linkifiedString
+{
+ if(!m_linkifiedString){
+ NSString *newLinkifiedString = [self _createLinkifiedString];
+ // compare the old object to nil, and swap in the new value if they match.
+ // if the old object (m_linkifiedString) already has a value, release the duplicated new object
+ if(OSAtomicCompareAndSwapPtrBarrier(nil, newLinkifiedString, (void *)&m_linkifiedString))
+ [m_linkifiedString retain];
+ }
+ return m_linkifiedString;
+}
+#else
-(NSAttributedString *)_createLinkifiedString
{
NSMutableAttributedString *_linkifiedString;
@@ -398,21 +409,21 @@
} else {
_linkifiedString = [[[NSMutableAttributedString alloc] initWithString:m_scanString] autorelease];
}
More information about the commits
mailing list