Index: src/OFCharacterSet.h ================================================================== --- src/OFCharacterSet.h +++ src/OFCharacterSet.h @@ -24,10 +24,14 @@ * @class OFCharacterSet OFCharacterSet.h ObjFW/OFCharacterSet.h * * @brief A class cluster representing a character set. */ @interface OFCharacterSet: OFObject +#ifdef OF_HAVE_CLASS_PROPERTIES +@property (class, readonly, nonatomic) OFCharacterSet *whitespaceCharacterSet; +#endif + /*! * @brief The inverted set, containing only the characters that do not exist in * the receiver. */ @property (readonly, nonatomic) OFCharacterSet *invertedSet; @@ -48,10 +52,16 @@ * @param range The range of characters for the character set * @return A new OFCharacterSet */ + (instancetype)characterSetWithRange: (of_range_t)range; +/*! + * @brief A character set containing all Unicode characters in the category + * `Zs` plus CHARACTER TABULATION (U+0009). + */ ++ (OFCharacterSet *)whitespaceCharacterSet; + /*! * @brief Initializes an already allocated character set with the characters of * the specified string. * * @param characters The characters for the character set Index: src/OFCharacterSet.m ================================================================== --- src/OFCharacterSet.m +++ src/OFCharacterSet.m @@ -23,13 +23,19 @@ #import "OFCharacterSet_range.h" static struct { Class isa; } placeholder; + +static OFCharacterSet *whitespaceCharacterSet = nil; @interface OFCharacterSet_placeholder: OFCharacterSet @end + +@interface OFCharacterSet_whitespace: OFCharacterSet +- (instancetype)of_init; +@end @implementation OFCharacterSet_placeholder - (instancetype)init { return (id)[[OFCharacterSet_bitset alloc] init]; @@ -91,10 +97,15 @@ + (instancetype)characterSetWithRange: (of_range_t)range { return [[[self alloc] initWithRange: range] autorelease]; } + ++ (OFCharacterSet *)whitespaceCharacterSet +{ + return [OFCharacterSet_whitespace whitespaceCharacterSet]; +} - (instancetype)init { if ([self isMemberOfClass: [OFCharacterSet class]]) { @try { @@ -127,7 +138,78 @@ - (OFCharacterSet *)invertedSet { return [[[OFCharacterSet_invertedSet alloc] of_initWithCharacterSet: self] autorelease]; +} +@end + +@implementation OFCharacterSet_whitespace ++ (void)initialize +{ + if (self != [OFCharacterSet_whitespace class]) + return; + + whitespaceCharacterSet = [[OFCharacterSet_whitespace alloc] of_init]; +} + ++ (OFCharacterSet *)whitespaceCharacterSet +{ + return whitespaceCharacterSet; +} + +- (instancetype)init +{ + OF_INVALID_INIT_METHOD +} + +- (instancetype)of_init +{ + return [super init]; +} + +- (instancetype)autorelease +{ + return self; +} + +- (instancetype)retain +{ + return self; +} + +- (void)release +{ +} + +- (unsigned int)retainCount +{ + return OF_RETAIN_COUNT_MAX; +} + +- (bool)characterIsMember: (of_unichar_t)character +{ + switch (character) { + case 0x0009: + case 0x0020: + case 0x00A0: + case 0x1680: + case 0x2000: + case 0x2001: + case 0x2002: + case 0x2003: + case 0x2004: + case 0x2005: + case 0x2006: + case 0x2007: + case 0x2008: + case 0x2009: + case 0x200A: + case 0x202F: + case 0x205F: + case 0x3000: + return true; + default: + return false; + } } @end