//  This file is part of class-dump, a utility for examining the Objective-C segment of Mach-O files.
//  Copyright (C) 1997-1998, 2000-2001, 2004-2006  Steve Nygard

#import "CDOCModule.h"

#import <Foundation/Foundation.h>
#import "CDObjCSegmentProcessor.h"
#import "CDOCSymtab.h"

@implementation CDOCModule

- (id)init;
{
    if ([super init] == nil)
        return nil;

    version = 0;
    name = nil;
    symtab = nil;

    return self;
}

- (void)dealloc;
{
    [name release];
    [symtab release];

    [super dealloc];
}

- (unsigned long)version;
{
    return version;
}

- (void)setVersion:(unsigned long)aVersion;
{
    version = aVersion;
}

- (NSString *)name;
{
    return name;
}

- (void)setName:(NSString *)newName;
{
    if (newName == name)
        return;

    [name release];
    name = [newName retain];
}

- (CDOCSymtab *)symtab;
{
    return symtab;
}

- (void)setSymtab:(CDOCSymtab *)newSymtab;
{
    if (newSymtab == symtab)
        return;

    [symtab release];
    symtab = [newSymtab retain];
}

- (NSString *)description;
{
    return [NSString stringWithFormat:@"[%@] name: %@, version: %d, symtab: %@", NSStringFromClass([self class]), name, version, symtab];
}

- (NSString *)formattedString;
{
    return [NSString stringWithFormat:@"/*\n * %@\n */\n", name];
}

- (void)appendToString:(NSMutableString *)resultString classDump:(CDClassDump *)aClassDump;
{
    [resultString appendFormat:@"/*\n * %@\n */\n\n", name];
    [symtab appendToString:resultString classDump:aClassDump];
}

- (void)registerClassesWithObject:(NSMutableDictionary *)aDictionary frameworkName:(NSString *)aFrameworkName;
{
    [symtab registerClassesWithObject:aDictionary frameworkName:aFrameworkName];
}

- (void)generateSeparateHeadersClassDump:(CDClassDump *)aClassDump;
{
    [symtab generateSeparateHeadersClassDump:aClassDump];
}

@end
