Skip to content

Commit 06d30d4

Browse files
author
Tammo Freese
committed
Experiment: partially changed to using regex to improve performance
1 parent d566862 commit 06d30d4

File tree

3 files changed

+43
-79
lines changed

3 files changed

+43
-79
lines changed

Core/Source/DTLocalizableStringAggregator.m

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ - (void)addEntryToTables:(DTLocalizableStringEntry *)entry;
2222
@implementation DTLocalizableStringAggregator
2323
{
2424
NSDictionary *_validMacros;
25+
NSRegularExpression *_validMacrosRegex;
2526
NSMutableDictionary *_stringTables;
2627

2728
NSOperationQueue *_processingQueue;
@@ -108,14 +109,30 @@ - (NSDictionary *)validMacros
108109
return _validMacros;
109110
}
110111

112+
- (NSRegularExpression *)validMacrosRegex
113+
{
114+
if (!_validMacrosRegex)
115+
{
116+
NSDictionary *validMacros = [self validMacros];
117+
118+
NSString *innerPatternPart = [[validMacros allKeys] componentsJoinedByString:@"|"];
119+
NSString *pattern = [NSString stringWithFormat:@"\\b(%@)\\b", innerPatternPart];
120+
_validMacrosRegex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:NULL];
121+
}
122+
123+
return _validMacrosRegex;
124+
}
125+
126+
111127
#define QUOTE @"\""
112128

113-
- (void)beginProcessingFile:(NSURL *)fileURL
129+
- (void)beginProcessingFile:(NSURL *)fileURL
114130
{
115131

116132
NSDictionary *validMacros = [self validMacros];
133+
NSRegularExpression *validMacrosRegex = [self validMacrosRegex];
117134

118-
DTLocalizableStringScanner *scanner = [[DTLocalizableStringScanner alloc] initWithContentsOfURL:fileURL encoding:_inputEncoding validMacros:validMacros];
135+
DTLocalizableStringScanner *scanner = [[DTLocalizableStringScanner alloc] initWithContentsOfURL:fileURL encoding:_inputEncoding validMacros:validMacros validMacroRegex:validMacrosRegex];
119136

120137
[scanner setEntryFoundCallback:^(DTLocalizableStringEntry *entry)
121138
{

Core/Source/DTLocalizableStringScanner.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ typedef void(^DTLocalizableStringEntryFoundCallback)(DTLocalizableStringEntry *)
1414

1515
@interface DTLocalizableStringScanner : NSOperation
1616

17-
- (id)initWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)encoding validMacros:(NSDictionary *)validMacros;
17+
- (id)initWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)encoding validMacros:(NSDictionary *)validMacros validMacroRegex:(NSRegularExpression *)validMacroRegex;
1818

1919
@property (nonatomic, copy) DTLocalizableStringEntryFoundCallback entryFoundCallback;
2020

Core/Source/DTLocalizableStringScanner.m

Lines changed: 23 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -12,68 +12,47 @@
1212

1313
@interface DTLocalizableStringScanner ()
1414

15-
- (BOOL)_scanMacro;
15+
- (BOOL)_processMacroAtRange:(NSRange)range;
1616

1717
@end
1818

1919
@implementation DTLocalizableStringScanner
2020
{
2121
NSURL *_url;
2222
NSDictionary *_validMacros;
23-
NSCharacterSet *_validMacroCharacters;
24-
25-
NSUInteger _minMacroNameLength;
26-
NSUInteger _maxMacroNameLength;
23+
NSRegularExpression *_validMacroRegex;
2724

2825
unichar *_characters;
26+
NSString *_charactersAsString;
2927
NSUInteger _stringLength;
3028
NSUInteger _currentIndex;
3129
}
3230

3331
@synthesize entryFoundCallback=_entryFoundCallback;
3432

35-
- (id)initWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)encoding validMacros:(NSDictionary *)validMacros
33+
- (id)initWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)encoding validMacros:(NSDictionary *)validMacros validMacroRegex:(NSRegularExpression *)validMacroRegex
34+
3635
{
3736
self = [super init];
3837

3938
if (self)
4039
{
41-
NSString *string = [[NSString alloc] initWithContentsOfURL:url encoding:encoding error:NULL];
40+
_charactersAsString = [[NSString alloc] initWithContentsOfURL:url encoding:encoding error:NULL];
4241

43-
if (!string)
42+
if (!_charactersAsString)
4443
{
4544
return nil;
4645
}
4746

48-
_stringLength = [string length];
47+
_stringLength = [_charactersAsString length];
4948
_characters = calloc(_stringLength, sizeof(unichar));
50-
[string getCharacters:_characters range:NSMakeRange(0, _stringLength)];
49+
[_charactersAsString getCharacters:_characters range:NSMakeRange(0, _stringLength)];
5150
_currentIndex = 0;
5251

5352
_url = [url copy]; // to have a reference later
5453
_validMacros = validMacros;
55-
56-
// prebuild the valid characters
57-
NSString *allChars = [[_validMacros allKeys] componentsJoinedByString:@""];
58-
_validMacroCharacters = [NSCharacterSet characterSetWithCharactersInString:allChars];
59-
60-
// get longest and shortest macro name
61-
_minMacroNameLength = NSIntegerMax;
62-
_maxMacroNameLength = 0;
63-
64-
for (NSString *oneMacro in [_validMacros allKeys])
65-
{
66-
NSUInteger l = [oneMacro length];
67-
68-
if (l<_minMacroNameLength)
69-
{
70-
_minMacroNameLength = l;
71-
}
72-
else if (l>_maxMacroNameLength)
73-
{
74-
_maxMacroNameLength = l;
75-
}
76-
}
54+
_validMacroRegex = validMacroRegex;
55+
7756
}
7857

7958
return self;
@@ -91,24 +70,10 @@ - (void)main
9170
{
9271
@autoreleasepool
9372
{
94-
while (_currentIndex < _stringLength)
95-
{
96-
unichar character = _characters[_currentIndex];
97-
if ([_validMacroCharacters characterIsMember:character])
98-
{
99-
100-
NSUInteger macroStartIndex = _currentIndex;
101-
if (![self _scanMacro])
102-
{
103-
_currentIndex = macroStartIndex + 1;
104-
}
105-
}
106-
else
107-
{
108-
// not a character that can be part of a macro name; keep going
109-
_currentIndex++;
110-
}
111-
}
73+
[_validMacroRegex enumerateMatchesInString:_charactersAsString options:0 range:NSMakeRange(0, [_charactersAsString length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
74+
NSRange matchRange = [match range];
75+
[self _processMacroAtRange:matchRange];
76+
}];
11277
}
11378
}
11479

@@ -224,33 +189,15 @@ - (NSString *)_scanParameter
224189
return [[NSString alloc] initWithCharacters:(_characters+parameterStartIndex) length:length];
225190
}
226191

227-
- (BOOL)_scanMacro
192+
- (BOOL)_processMacroAtRange:(NSRange)range
228193
{
229-
NSUInteger macroStartIndex = _currentIndex;
230-
231-
// read as much of the macroName as possible
232-
while ([_validMacroCharacters characterIsMember:_characters[_currentIndex]])
233-
{
234-
_currentIndex++;
235-
}
236-
237-
NSUInteger macroNameLength = _currentIndex - macroStartIndex;
238-
239-
if (macroNameLength < _minMacroNameLength || macroNameLength > _maxMacroNameLength)
240-
{
241-
// too short or too long to be one of our macros
242-
return NO;
243-
}
244-
245-
// pull out the macroName:
246-
NSString *macroName = [[NSString alloc] initWithCharactersNoCopy:(_characters+macroStartIndex) length:macroNameLength freeWhenDone:NO];
247-
248-
if ([_validMacros objectForKey:macroName])
249-
{
250-
// we found a macro name!
251-
194+
NSString *macroName = [_charactersAsString substringWithRange:range];
195+
196+
_currentIndex = range.location + range.length;
197+
252198
NSMutableArray *parameters = [[NSMutableArray alloc] initWithCapacity:10];
253199

200+
254201
// skip any whitespace between here and the (
255202
[self _scanWhitespace];
256203

@@ -321,9 +268,9 @@ - (BOOL)_scanMacro
321268
}
322269

323270
return YES;
271+
} else {
272+
NSLog(@"mismaatch");
324273
}
325-
326-
}
327274

328275
return NO;
329276
}

0 commit comments

Comments
 (0)