Skip to content
Snippets Groups Projects
Commit d58596e4 authored by George Nachman's avatar George Nachman
Browse files

optimize reverse search for long lines, which used to beachball. Fix crash...

optimize reverse search for long lines, which used to beachball. Fix crash when closing a window that is doing a search.
parent 58d685bc
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -104,5 +104,6 @@
- (void)findString:(NSString*)string;
 
- (void)setDelegate:(id<FindViewControllerDelegate>)delegate;
- (id<FindViewControllerDelegate>)delegate;
 
@end
Loading
Loading
@@ -376,4 +376,9 @@ static const float FINDVIEW_DURATION = 0.075;
delegate_ = delegate;
}
 
- (id<FindViewControllerDelegate>)delegate
{
return delegate_;
}
@end
Loading
Loading
@@ -541,7 +541,19 @@ static int Search(NSString* needle,
end,
&charHaystack,
&deltas);
// screen_char_t[i + deltas[i]] begins its run at charHaystack[i]
int result = CoreSearch(needle, rawline, raw_line_length, start, end, options, resultLength,
haystack, charHaystack, deltas, deltas[0]);
free(deltas);
free(charHaystack);
return result;
}
int CoreSearch(NSString* needle, screen_char_t* rawline, int raw_line_length, int start, int end,
int options, int* resultLength, NSString* haystack, unichar* charHaystack,
int* deltas, int deltaOffset)
{
int apiOptions = 0;
NSRange range;
BOOL regex;
Loading
Loading
@@ -645,14 +657,12 @@ static int Search(NSString* needle,
if (range.location != NSNotFound) {
int adjustedLocation;
int adjustedLength;
adjustedLocation = range.location + deltas[range.location];
adjustedLocation = range.location + deltas[range.location] + deltaOffset;
adjustedLength = range.length + deltas[range.location + range.length] -
deltas[range.location];
(deltas[range.location] + deltaOffset);
*resultLength = adjustedLength;
result = adjustedLocation + start;
}
free(deltas);
free(charHaystack);
return result;
}
 
Loading
Loading
@@ -715,10 +725,26 @@ static int Search(NSString* needle,
int limit = raw_line_length;
int tempResultLength;
int tempPosition;
NSString* haystack;
unichar* charHaystack;
int* deltas;
haystack = ScreenCharArrayToString(rawline,
0,
limit,
&charHaystack,
&deltas);
int numUnichars = [haystack length];
do {
tempPosition = Search(needle, rawline, raw_line_length, 0, limit,
options, &tempResultLength);
haystack = CharArrayToString(charHaystack, numUnichars);
tempPosition = CoreSearch(needle, rawline, raw_line_length, 0, limit, options,
&tempResultLength, haystack, charHaystack, deltas, 0);
limit = tempPosition + tempResultLength - 1;
// find i so that i-deltas[i] == limit
while (numUnichars >= 0 && numUnichars + deltas[numUnichars] > limit) {
--numUnichars;
}
if (tempPosition != -1 && tempPosition <= skip) {
ResultRange* r = [[[ResultRange alloc] init] autorelease];
r->position = tempPosition;
Loading
Loading
@@ -726,6 +752,8 @@ static int Search(NSString* needle,
[results addObject:r];
}
} while (tempPosition != -1 && (multipleResults || tempPosition > skip));
free(deltas);
free(charHaystack);
} else {
// Search forward
// TODO: test this
Loading
Loading
Loading
Loading
@@ -552,6 +552,9 @@ static NSString* SESSION_ARRANGEMENT_WORKING_DIRECTORY = @"Working Directory";
[SCREEN setSession:nil];
[SCREEN setTerminal:nil];
[TERMINAL setScreen:nil];
if ([[view findViewController] delegate] == self) {
[[view findViewController] setDelegate:nil];
}
 
[updateTimer invalidate];
[updateTimer release];
Loading
Loading
Loading
Loading
@@ -229,3 +229,6 @@ int EffectiveLineLength(screen_char_t* theLine, int totalLength);
 
NSString* ScreenCharArrayToStringDebug(screen_char_t* screenChars,
int lineLength);
// Convert an array of chars to a string, quickly.
NSString* CharArrayToString(unichar* charHaystack, int o);
Loading
Loading
@@ -269,8 +269,8 @@ NSString* ScreenCharArrayToString(screen_char_t* screenChars,
// 'i' into an index in the screenChars 'r' is:
// r = i + deltas[i]
//
// Original string with some double-width characters, where DWC_RIGHT is
// shown as '-':
// Array of screen_char_t with some double-width characters, where DWC_RIGHT is
// shown as '-', and d & f have combining marks/surrogate pairs (not shown here):
// 0123456789
// ab-c-de-fg
//
Loading
Loading
@@ -293,6 +293,9 @@ NSString* ScreenCharArrayToString(screen_char_t* screenChars,
// A -> 9 (g@A->g@9) -1
//
// Note that delta is just the difference of the indices.
//
// screen_char_t[i + deltas[i]] begins its run at charHaystack[i]
// CharHaystackIndexToScreenCharTIndex(i) : i + deltas[i]
int delta = 0;
int o = 0;
for (int i = start; i < end; ++i) {
Loading
Loading
@@ -309,6 +312,12 @@ NSString* ScreenCharArrayToString(screen_char_t* screenChars,
}
}
deltas[o] = delta;
return CharArrayToString(charHaystack, o);
}
NSString* CharArrayToString(unichar* charHaystack, int o)
{
// I have no idea why NSUnicodeStringEncoding doesn't work, but it has
// the wrong endianness on x86. Perhaps it's a relic of PPC days? Anyway,
// LittleEndian seems to work on my x86, and BigEndian works under Rosetta
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment