| Index: class-dump/src/CDMultiFileVisitor.m
|
| ===================================================================
|
| --- class-dump/src/CDMultiFileVisitor.m (revision 0)
|
| +++ class-dump/src/CDMultiFileVisitor.m (revision 0)
|
| @@ -0,0 +1,240 @@
|
| +// -*- mode: ObjC -*-
|
| +
|
| +// 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-2010 Steve Nygard.
|
| +
|
| +#import "CDMultiFileVisitor.h"
|
| +
|
| +#import "NSArray-Extensions.h"
|
| +#import "CDClassDump.h"
|
| +#import "CDClassFrameworkVisitor.h"
|
| +#import "CDSymbolReferences.h"
|
| +#import "CDOCClass.h"
|
| +#import "CDOCProtocol.h"
|
| +#import "CDOCIvar.h"
|
| +#import "CDTypeController.h"
|
| +
|
| +@implementation CDMultiFileVisitor
|
| +
|
| +- (id)init;
|
| +{
|
| + if ([super init] == nil)
|
| + return nil;
|
| +
|
| + outputPath = nil;
|
| +
|
| + return self;
|
| +}
|
| +
|
| +- (void)dealloc;
|
| +{
|
| + [outputPath release];
|
| +
|
| + [super dealloc];
|
| +}
|
| +
|
| +- (NSString *)outputPath;
|
| +{
|
| + return outputPath;
|
| +}
|
| +
|
| +- (void)setOutputPath:(NSString *)newOutputPath;
|
| +{
|
| + if (newOutputPath == outputPath)
|
| + return;
|
| +
|
| + [outputPath release];
|
| + outputPath = [newOutputPath retain];
|
| +}
|
| +
|
| +- (void)createOutputPathIfNecessary;
|
| +{
|
| + if (outputPath != nil) {
|
| + NSFileManager *fileManager;
|
| + BOOL isDirectory;
|
| +
|
| + fileManager = [NSFileManager defaultManager];
|
| + if ([fileManager fileExistsAtPath:outputPath isDirectory:&isDirectory] == NO) {
|
| + BOOL result;
|
| +
|
| + result = [fileManager createDirectoryAtPath:outputPath attributes:nil];
|
| + if (result == NO) {
|
| + NSLog(@"Error: Couldn't create output directory: %@", outputPath);
|
| + return;
|
| + }
|
| + } else if (isDirectory == NO) {
|
| + NSLog(@"Error: File exists at output path: %@", outputPath);
|
| + return;
|
| + }
|
| + }
|
| +}
|
| +
|
| +- (void)buildClassFrameworks;
|
| +{
|
| + CDClassFrameworkVisitor *visitor;
|
| +
|
| + visitor = [[CDClassFrameworkVisitor alloc] init];
|
| + [visitor setClassDump:classDump];
|
| + [classDump recursivelyVisit:visitor];
|
| + [symbolReferences setFrameworkNamesByClassName:[visitor frameworkNamesByClassName]];
|
| + [symbolReferences setFrameworkNamesByProtocolName:[visitor frameworkNamesByProtocolName]];
|
| + [visitor release];
|
| +}
|
| +
|
| +- (void)generateStructureHeader;
|
| +{
|
| + NSString *filename;
|
| + NSString *referenceString;
|
| +
|
| + [resultString setString:@""];
|
| + [classDump appendHeaderToString:resultString];
|
| +
|
| + [symbolReferences removeAllReferences];
|
| + referenceIndex = [resultString length];
|
| +
|
| + [[classDump typeController] appendStructuresToString:resultString symbolReferences:symbolReferences];
|
| +
|
| + referenceString = [symbolReferences referenceString];
|
| + if (referenceString != nil)
|
| + [resultString insertString:referenceString atIndex:referenceIndex];
|
| +
|
| + filename = @"CDStructures.h";
|
| + if (outputPath != nil)
|
| + filename = [outputPath stringByAppendingPathComponent:filename];
|
| +
|
| + [[resultString dataUsingEncoding:NSUTF8StringEncoding] writeToFile:filename atomically:YES];
|
| +}
|
| +
|
| +- (void)willBeginVisiting;
|
| +{
|
| + [super willBeginVisiting];
|
| +
|
| + [classDump appendHeaderToString:resultString];
|
| +
|
| + if ([classDump containsObjectiveCData] || [classDump hasEncryptedFiles]) {
|
| + [self buildClassFrameworks];
|
| + [self createOutputPathIfNecessary];
|
| + [self generateStructureHeader];
|
| + } else {
|
| + // TODO (2007-06-14): Make sure this generates no output files in this case.
|
| + NSLog(@"Warning: This file does not contain any Objective-C runtime information.");
|
| + }
|
| +}
|
| +
|
| +- (void)willVisitClass:(CDOCClass *)aClass;
|
| +{
|
| + NSString *str;
|
| +
|
| + // First, we set up some context...
|
| + [resultString setString:@""];
|
| + [classDump appendHeaderToString:resultString];
|
| +
|
| + [symbolReferences removeAllReferences];
|
| + str = [symbolReferences importStringForClassName:[aClass superClassName]];
|
| + if (str != nil) {
|
| + [resultString appendString:str];
|
| + [resultString appendString:@"\n"];
|
| + }
|
| +
|
| + referenceIndex = [resultString length];
|
| +
|
| + // And then generate the regular output
|
| + [super willVisitClass:aClass];
|
| +}
|
| +
|
| +- (void)didVisitClass:(CDOCClass *)aClass;
|
| +{
|
| + NSString *referenceString;
|
| + NSString *filename;
|
| +
|
| + // Generate the regular output
|
| + [super didVisitClass:aClass];
|
| +
|
| + // Then insert the imports and write the file.
|
| + [symbolReferences removeClassName:[aClass name]];
|
| + [symbolReferences removeClassName:[aClass superClassName]];
|
| + referenceString = [symbolReferences referenceString];
|
| + if (referenceString != nil)
|
| + [resultString insertString:referenceString atIndex:referenceIndex];
|
| +
|
| + filename = [NSString stringWithFormat:@"%@.h", [aClass name]];
|
| + if (outputPath != nil)
|
| + filename = [outputPath stringByAppendingPathComponent:filename];
|
| +
|
| + [[resultString dataUsingEncoding:NSUTF8StringEncoding] writeToFile:filename atomically:YES];
|
| +}
|
| +
|
| +- (void)willVisitCategory:(CDOCCategory *)aCategory;
|
| +{
|
| + NSString *str;
|
| +
|
| + // First, we set up some context...
|
| + [resultString setString:@""];
|
| + [classDump appendHeaderToString:resultString];
|
| +
|
| + [symbolReferences removeAllReferences];
|
| + str = [symbolReferences importStringForClassName:[aCategory className]];
|
| + if (str != nil) {
|
| + [resultString appendString:str];
|
| + [resultString appendString:@"\n"];
|
| + }
|
| + referenceIndex = [resultString length];
|
| +
|
| + // And then generate the regular output
|
| + [super willVisitCategory:aCategory];
|
| +}
|
| +
|
| +- (void)didVisitCategory:(CDOCCategory *)aCategory;
|
| +{
|
| + NSString *referenceString;
|
| + NSString *filename;
|
| +
|
| + // Generate the regular output
|
| + [super didVisitCategory:aCategory];
|
| +
|
| + // Then insert the imports and write the file.
|
| + [symbolReferences removeClassName:[aCategory className]];
|
| + referenceString = [symbolReferences referenceString];
|
| + if (referenceString != nil)
|
| + [resultString insertString:referenceString atIndex:referenceIndex];
|
| +
|
| + filename = [NSString stringWithFormat:@"%@-%@.h", [aCategory className], [aCategory name]];
|
| + if (outputPath != nil)
|
| + filename = [outputPath stringByAppendingPathComponent:filename];
|
| +
|
| + [[resultString dataUsingEncoding:NSUTF8StringEncoding] writeToFile:filename atomically:YES];
|
| +}
|
| +
|
| +- (void)willVisitProtocol:(CDOCProtocol *)aProtocol;
|
| +{
|
| + [resultString setString:@""];
|
| + [classDump appendHeaderToString:resultString];
|
| +
|
| + [symbolReferences removeAllReferences];
|
| + referenceIndex = [resultString length];
|
| +
|
| + // And then generate the regular output
|
| + [super willVisitProtocol:aProtocol];
|
| +}
|
| +
|
| +- (void)didVisitProtocol:(CDOCProtocol *)aProtocol;
|
| +{
|
| + NSString *referenceString;
|
| + NSString *filename;
|
| +
|
| + // Generate the regular output
|
| + [super didVisitProtocol:aProtocol];
|
| +
|
| + // Then insert the imports and write the file.
|
| + referenceString = [symbolReferences referenceString];
|
| + if (referenceString != nil)
|
| + [resultString insertString:referenceString atIndex:referenceIndex];
|
| +
|
| + filename = [NSString stringWithFormat:@"%@-Protocol.h", [aProtocol name]];
|
| + if (outputPath != nil)
|
| + filename = [outputPath stringByAppendingPathComponent:filename];
|
| +
|
| + [[resultString dataUsingEncoding:NSUTF8StringEncoding] writeToFile:filename atomically:YES];
|
| +}
|
| +
|
| +@end
|
|
|
| Property changes on: class-dump/src/CDMultiFileVisitor.m
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|