improve gdb parser to understand information in {} as a sub-dictionary and look-ahead for it

This commit is contained in:
Riccardo Mottola 2021-06-22 01:19:38 +02:00
parent 82c6aa3162
commit 6ab80ec17d

View file

@ -156,6 +156,46 @@
[tView setNeedsDisplay:YES];
}
/*
parse subpart of the MI reply which may look like this:
bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x0804872c",func="main",file="main.m",fullname="/home/multix/code/gnustep-svc/DirectoryTest/main.m",line="23",thread-groups=["i1"],times="1",original-location="main.m:23"}
*/
- (NSDictionary *) parseKeyValueString: (NSString *)stringInput
{
if (nil != stringInput)
{
NSMutableDictionary *mdict;
NSScanner *stringScanner;
NSString *key = NULL;
NSString *value = NULL;
mdict = [[NSMutableDictionary alloc] init];
stringScanner = [NSScanner scannerWithString: stringInput];
while([stringScanner isAtEnd] == NO)
{
[stringScanner scanUpToString: @"=" intoString: &key];
[stringScanner scanString: @"=" intoString: NULL];
[stringScanner scanString: @"\"" intoString: NULL];
[stringScanner scanUpToString: @"\"" intoString: &value];
[stringScanner scanString: @"\"" intoString: NULL];
[stringScanner scanString: @"," intoString: NULL];
// we fail to parse if the value is in []
// NSLog(@"parse KVS: key %@ value %@", key, value);
if (key != nil && value != nil)
[mdict setObject:value forKey:key];
}
return [mdict autorelease];
}
return nil;
}
/*
Parses a line coming from the debugger. It could be eiher a stanard outpu or it may come from the machine
interface of gdb.
*/
- (PCDebuggerOutputTypes) parseStringLine: (NSString *)stringInput
{
NSScanner *stringScanner;
@ -183,6 +223,8 @@
if(prefix != nil)
{
NSString *dictionaryName = NULL;
NSLog(@"scanning MI |%@|", stringInput);
[stringScanner scanUpToString: @"," intoString: &dictionaryName];
@ -194,16 +236,27 @@
if(dictionaryName != nil)
{
NSString *key = NULL;
NSString *value = NULL;
id value = nil;
while([stringScanner isAtEnd] == NO)
{
[stringScanner scanString: @"," intoString: NULL];
[stringScanner scanUpToString: @"=" intoString: &key];
[stringScanner scanString: @"=" intoString: NULL];
[stringScanner scanString: @"\"" intoString: NULL];
[stringScanner scanUpToString: @"\"" intoString: &value];
[stringScanner scanString: @"\"" intoString: NULL];
if ([stringInput characterAtIndex:[stringScanner scanLocation]] == '{')
{
[stringScanner scanString: @"{" intoString: NULL];
[stringScanner scanUpToString: @"}" intoString: &value];
[stringScanner scanString: @"}" intoString: NULL];
value = [self parseKeyValueString: value];
}
else
{
[stringScanner scanString: @"\"" intoString: NULL];
[stringScanner scanUpToString: @"\"" intoString: &value];
[stringScanner scanString: @"\"" intoString: NULL];
}
NSLog(@"key %@ value %@", key, value);
if([key isEqualToString:@"pid"] &&
[dictionaryName isEqualToString: @"thread-group-started"])