This is Variable.m in view mode; [Download] [Up]
/* Variable.m created by ovidiu on Sun 30-Mar-1997 */ #include <stdio.h> #import <Foundation/NSString.h> #import <Foundation/NSArray.h> #import <Foundation/NSValue.h> #import "GdbDisplayController.h" #import "Frame.h" #import "Variable.h" #define ASSIGN(variable, value) \ [value retain]; \ [variable release]; \ variable = value; @implementation Variable - (void)setName:(NSString*)aString { ASSIGN(name, aString); } - (NSString*)name { return name; } - copyWithZone:(NSZone*)zone { return self; } - (void)setValue:(Value*)aValue { ASSIGN(value, aValue); [value setGdbDisplayController:gdbController]; } - (void)setGdbDisplayController:(GdbDisplayController*)anObject { gdbController = anObject; [value setGdbDisplayController:gdbController]; } - (void)dealloc { [name release]; [value release]; [super dealloc]; } - (NSString*)description { return [NSString stringWithFormat:@"%@ = %@", name, value]; } /* GdbDisplayValue protocol's methods */ - (NSString*)title { return name; } - (NSString*)stringValue { return [value stringValue]; } - (NSString*)additionalDescription { return nil; } - (Value*)value { return value; } - (NSArray*)indirectedComponents { return [value indirectedComponents]; } - (BOOL)indirectedComponentsAreKnown { return [value indirectedComponentsAreKnown]; } - (void)getIndirectedComponentsFromGDB { [value getIndirectedComponentsFromGDB]; } @end /* Variable */ @implementation Type - (void)setTypeName:(NSMutableString*)typeName { ASSIGN(name, typeName); } - (void)setScalarTypeKind:(tScalarTypeKind)type { scalarKind = type; } - (NSMutableString*)typeName { return name; } - (tTypeKind)typeKind { return kind; } - (tScalarTypeKind)scalarTypeKind { return scalarKind; } - (NSString*)description { return name; } - (void)setTypeKind:(tTypeKind)type { if (kind == kScalar && scalarKind == kChar && type == kPointer) kind = kCString; else if (kind == kVoid && type == kPointer) kind = kVoidPointer; else kind = type; } - (Class)valueClass { switch (kind) { case kVoid: return [VoidValue class]; case kScalar: return [SimpleValue class]; case kEnum: return [EnumerationValue class]; case kStructure: return [StructureValue class]; case kClass: return [ClassValue class]; case kUnion: return [UnionValue class]; case kArray: return [ArrayValue class]; case kCString: case kVoidPointer: case kPointer: return [PointerValue class]; default: return nil; } } - (void)dealloc { [name release]; [super dealloc]; } @end /* Type */ @implementation Value - (void)setType:(Type*)aType { ASSIGN(type, aType); } - (Type*)type { return type; } - (void)setStringValue:(NSString*)value {} - (void)setGdbDisplayController:(GdbDisplayController*)anObject { gdbController = anObject; } - (void)dealloc { [type release]; [super dealloc]; } - copyWithZone:(NSZone*)zone { return [self retain]; } /* GdbDisplayValue protocol's methods */ - (NSString*)title { return @""; } - (NSString*)stringValue { return @""; } - (NSString*)additionalDescription { return nil; } - (Value*)value { return self; } - (NSArray*)indirectedComponents { return nil; } - (BOOL)indirectedComponentsAreKnown { return YES; } - (void)getIndirectedComponentsFromGDB {} @end /* Value */ @implementation VoidValue - (NSString*)description { return @"void "; } @end @implementation SimpleValue + (SimpleValue*)numberWithString:(NSString*)string { SimpleValue* value = [[[self alloc] init] autorelease]; value->stringNumber = [string copy]; return value; } - (void)dealloc { [stringNumber release]; [description release]; [super dealloc]; } - (void)setStringValue:(NSString*)value { ASSIGN(stringNumber, value); } - (void)setDescription:(NSString*)str { ASSIGN(description, str); } - (NSString*)additionalDescription { return description; } - (NSString*)stringValue { return stringNumber; } - (NSString*)description { if (description) return [NSString stringWithFormat:@"(%@) %@ %@", type, stringNumber, description]; else return [NSString stringWithFormat:@"(%@) %@", type, stringNumber]; } @end /* SimpleValue */ @implementation EnumerationValue - (void)setStringValue:(NSString*)val { ASSIGN(value, val); } - (NSString*)stringValue { return value; } - (void)dealloc { [value release]; [super dealloc]; } - (NSString*)description { return [NSString stringWithFormat:@"(%@) %@", type, value]; } @end @implementation AggregateValue - (BOOL)isStructure { return NO; } - (BOOL)isClass { return NO; } - (BOOL)isUnion { return NO; } - (BOOL)isArray { return NO; } - (NSArray*)indirectedComponents { return componentValues; } - (void)setArrayValue:(NSMutableArray*)value { int i, count = [value count]; ASSIGN(componentValues, value); for (i = 0; i < count; i++) [[componentValues objectAtIndex:i] setGdbDisplayController:gdbController]; } - (void)dealloc { [componentValues release]; [super dealloc]; } - (NSString*)description { NSMutableString* description = [NSMutableString string]; int i, count = [componentValues count]; BOOL firstSeen = NO; [description appendFormat:@"(%@) {\n", type]; for (i = 0; i < count; i++) { if (firstSeen) [description appendString:@",\n"]; else firstSeen = YES; [description appendString:[[componentValues objectAtIndex:i] description]]; } [description appendString:@"}\n"]; return description; } @end /* AggregateValue */ @implementation StructureValue - (BOOL)isStructure { return YES; } @end @implementation ClassValue - (BOOL)isClass { return YES; } @end @implementation UnionValue - (BOOL)isUnion { return YES; } @end @implementation ArrayValue - (BOOL)isArray { return YES; } @end @implementation PointerValue + (PointerValue*)pointerWithAddress:(NSString*)address { PointerValue* value = [[[self alloc] init] autorelease]; value->addressString = [address copy]; return value; } - (void)setStringValue:(NSString*)val { ASSIGN(addressString, val); } - (void)setDescription:(NSString*)str { ASSIGN(description, str); } /* GdbDisplayValue protocol's methods */ - (id)stringValue { return addressString; } - (NSString*)additionalDescription { return description; } - (NSArray*)indirectedComponents { if (indirectedValue) { if ([indirectedValue isKindOfClass:[NSArray class]]) return indirectedValue; else return [NSArray arrayWithObject:indirectedValue]; } else return nil; } - (BOOL)indirectedComponentsAreKnown { return indirectedValue != nil; } - (void)getIndirectedComponentsFromGDB { NSString* command; /* Avoid recursivity in the case of a parse error in the GDB output */ if (printCommandExecuted) return; command = [NSString stringWithFormat:@"print-typed *(%@)%@", [self type], [self stringValue]]; // NSLog (@"execute '%@'", command); [gdbController executeGDBCommand:command annotate:NO notifyObject:self selector:@selector(indirectedValue:type:)]; } - (void)indirectedValue:(NSString*)gdbOutput type:(GdbOutputType)gdbOutputType { NSArray* array; if (gdbOutputType != GDB_OUTPUT_ANNOTATION) return; // NSLog (@"received '%@'", gdbOutput); printCommandExecuted = YES; [indirectedValue release]; array = [Variable variablesFromDescription:gdbOutput]; indirectedValue = [[array objectAtIndex:0] value]; /* If the value is a structure then indirect it */ if ((array = [indirectedValue indirectedComponents])) indirectedValue = array; [indirectedValue retain]; [indirectedValue setGdbDisplayController:gdbController]; [gdbController updateCurrentFrame]; } @end /* PointerValue */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.