diff --git a/Tools/AGSOutput.h b/Tools/AGSOutput.h index f657aa3d1..2322700ec 100644 --- a/Tools/AGSOutput.h +++ b/Tools/AGSOutput.h @@ -39,9 +39,7 @@ to: (unsigned)end maxSize: (unsigned)limit output: (NSMutableString*)buf; -- (BOOL) output: (NSDictionary*)d - file: (NSString*)name - directory: (NSString*)dest; +- (NSArray*) output: (NSDictionary*)d; - (void) outputDecl: (NSDictionary*)d kind: (NSString*)kind to: (NSMutableString*)str; diff --git a/Tools/AGSOutput.m b/Tools/AGSOutput.m index fc1f62bd1..54d99ee83 100644 --- a/Tools/AGSOutput.m +++ b/Tools/AGSOutput.m @@ -23,9 +23,8 @@ #include "AGSOutput.h" @interface AGSOutput (Private) -- (BOOL) mergeMarkup: (NSString*)markup - ofKind: (NSString*)kind - directory: (NSString*)dest; +- (NSString*) mergeMarkup: (NSString*)markup + ofKind: (NSString*)kind; @end static NSString *escapeType(NSString *str) @@ -198,12 +197,10 @@ static BOOL snuggleStart(NSString *t) } /** - * Return a string containing a gsdoc document generated from d (the - * parse tree) + * Return an array containing the names of any files modified as + * a result of outputing the specified data structure. */ -- (BOOL) output: (NSDictionary*)d - file: (NSString*)name - directory: (NSString*)dest +- (NSArray*) output: (NSDictionary*)d { NSMutableString *str = [NSMutableString stringWithCapacity: 10240]; NSDictionary *classes; @@ -213,11 +210,28 @@ static BOOL snuggleStart(NSString *t) NSDictionary *types; NSDictionary *variables; NSDictionary *constants; + NSMutableArray *files; NSArray *authors; + NSString *base; NSString *tmp; + NSString *file; + NSString *dest; unsigned chapters = 0; + files = [NSMutableArray arrayWithCapacity: 5]; + info = d; + base = [info objectForKey: @"base"]; + file = base; + if ([[file pathExtension] isEqualToString: @"gsdoc"] == NO) + { + file = [file stringByAppendingPathExtension: @"gsdoc"]; + } + dest = [info objectForKey: @"directory"]; + if ([dest length] > 0 && [file isAbsolutePath] == NO) + { + file = [dest stringByAppendingPathComponent: file]; + } classes = [info objectForKey: @"Classes"]; categories = [info objectForKey: @"Categories"]; @@ -233,11 +247,10 @@ static BOOL snuggleStart(NSString *t) [str appendString: @"\"http://www.gnustep.org/gsdoc-0_6_7.xml\">\n"]; [str appendFormat: @"\n"]; - [m appendString: @" Types\n"]; + [m appendFormat: @" %@ types\n", base]; [m appendString: @"

\n"]; - chapters++; names = [types allKeys]; names = [names sortedArrayUsingSelector: @selector(compare:)]; for (i = 0; i < c; i++) @@ -436,11 +448,16 @@ static BOOL snuggleStart(NSString *t) [m appendString: @" \n"]; - if ([self mergeMarkup: m ofKind: @"Typedefs" directory: dest] == NO) + tmp = [self mergeMarkup: m ofKind: @"Typedefs"]; + if (tmp == nil) { [str appendString: m]; chapters++; } + else + { + [files addObject: tmp]; + } RELEASE(m); } @@ -452,10 +469,9 @@ static BOOL snuggleStart(NSString *t) unsigned c = [constants count]; [m appendString: @" \n"]; - [m appendString: @" Constants\n"]; + [m appendFormat: @" %@ constants\n", base]; [m appendString: @"

\n"]; - chapters++; names = [constants allKeys]; names = [names sortedArrayUsingSelector: @selector(compare:)]; for (i = 0; i < c; i++) @@ -468,11 +484,16 @@ static BOOL snuggleStart(NSString *t) [m appendString: @"
\n"]; - if ([self mergeMarkup: m ofKind: @"Constants" directory: dest] == NO) + tmp = [self mergeMarkup: m ofKind: @"Constants"]; + if (tmp == nil) { [str appendString: m]; chapters++; } + else + { + [files addObject: tmp]; + } RELEASE(m); } @@ -484,10 +505,9 @@ static BOOL snuggleStart(NSString *t) unsigned c = [variables count]; [m appendString: @" \n"]; - [m appendString: @" Variables\n"]; + [m appendFormat: @" %@ variables\n", base]; [m appendString: @"

\n"]; - chapters++; names = [variables allKeys]; names = [names sortedArrayUsingSelector: @selector(compare:)]; for (i = 0; i < c; i++) @@ -500,11 +520,16 @@ static BOOL snuggleStart(NSString *t) [m appendString: @"
\n"]; - if ([self mergeMarkup: m ofKind: @"Variables" directory: dest] == NO) + tmp = [self mergeMarkup: m ofKind: @"Variables"]; + if (tmp == nil) { [str appendString: m]; chapters++; } + else + { + [files addObject: tmp]; + } RELEASE(m); } @@ -516,7 +541,7 @@ static BOOL snuggleStart(NSString *t) unsigned c = [functions count]; [m appendString: @" \n"]; - [m appendString: @" Functions\n"]; + [m appendFormat: @" %@ functions\n", base]; [m appendString: @"

\n"]; names = [functions allKeys]; @@ -530,34 +555,40 @@ static BOOL snuggleStart(NSString *t) } [m appendString: @"
\n"]; - if ([self mergeMarkup: m ofKind: @"Functions" directory: dest] == NO) + tmp = [self mergeMarkup: m ofKind: @"Functions"]; + if (tmp == nil) { [str appendString: m]; chapters++; } + else + { + [files addObject: tmp]; + } RELEASE(m); } - if (chapters == 0) + if (chapters > 0) { - // We must have at least one chapter! - [str appendString: @" \n"]; - [str appendString: - @" No contents found by autogsdoc\n"]; - [str appendString: @"

\n"]; - [str appendString: @"
\n"]; - } + // Output document appendix if available. + tmp = [info objectForKey: @"back"]; + if (tmp != nil) + { + [self reformat: tmp withIndent: 4 to: str]; + } - // Output document appendix if available. - tmp = [info objectForKey: @"back"]; - if (tmp != nil) - { - [self reformat: tmp withIndent: 4 to: str]; + [str appendString: @" \n"]; + [str appendString: @"\n"]; + if ([str writeToFile: file atomically: YES] == YES) + { + [files addObject: file]; + } + else + { + files = nil; + } } - - [str appendString: @" \n"]; - [str appendString: @"\n"]; - return [str writeToFile: name atomically: YES]; + return files; } /** @@ -1882,9 +1913,8 @@ static BOOL snuggleStart(NSString *t) @implementation AGSOutput (Private) -- (BOOL) mergeMarkup: (NSString*)markup - ofKind: (NSString*)kind - directory: (NSString*)dest +- (NSString*) mergeMarkup: (NSString*)markup + ofKind: (NSString*)kind { NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; NSString *key = [kind stringByAppendingString: @"Template"]; @@ -1897,14 +1927,16 @@ static BOOL snuggleStart(NSString *t) NSRange range; NSRange start; NSRange end; + NSString *dest; + dest = [info objectForKey: @"directory"]; if ([name length] == 0) { - return NO; // No common document. + return nil; // No common document. } file = [name stringByAppendingPathExtension: @"gsdoc"]; - if (dest != nil && [file isAbsolutePath] == NO) + if ([dest length] > 0 && [file isAbsolutePath] == NO) { file = [dest stringByAppendingPathComponent: file]; } @@ -1944,7 +1976,7 @@ static BOOL snuggleStart(NSString *t) [str appendString: @" \n"]; [str appendString: @" "]; [str appendString: kind]; - [str appendString: @"<\title>\n"]; + [str appendString: @"\n"]; tmp = [NSString stringWithFormat: @"Generated by %@", NSUserName()]; [str appendString: @" ", kind]; + tmp = [NSString stringWithFormat: @"\n", kind]; start = [str rangeOfString: tmp]; if (start.length == 0) { @@ -1972,7 +2004,7 @@ static BOOL snuggleStart(NSString *t) [str insertString: tmp atIndex: start.location]; start.length = [tmp length]; } - tmp = [NSString stringWithFormat: @"", kind]; + tmp = [NSString stringWithFormat: @"\n", kind]; end = [str rangeOfString: tmp]; if (end.length == 0) { @@ -1989,7 +2021,7 @@ static BOOL snuggleStart(NSString *t) /* * Now locate start and end points for markup for this file. */ - tmp = [NSString stringWithFormat: @"", base, kind]; + tmp = [NSString stringWithFormat: @"\n", base, kind]; start = [str rangeOfString: tmp]; if (start.length == 0) { @@ -1997,7 +2029,7 @@ static BOOL snuggleStart(NSString *t) start.length = [tmp length]; [str insertString: tmp atIndex: end.location]; } - tmp = [NSString stringWithFormat: @"", base, kind]; + tmp = [NSString stringWithFormat: @"\n", base, kind]; end = [str rangeOfString: tmp]; if (end.length == 0) { @@ -2012,8 +2044,9 @@ static BOOL snuggleStart(NSString *t) if ([str writeToFile: file atomically: YES] == NO) { NSLog(@"Unable to write %@ markup to %@", kind, file); + return nil; } - return YES; + return file; } @end diff --git a/Tools/autogsdoc.m b/Tools/autogsdoc.m index df0e0b06c..cacafa772 100644 --- a/Tools/autogsdoc.m +++ b/Tools/autogsdoc.m @@ -591,6 +591,8 @@ main(int argc, char **argv, char **env) if (gDate == nil || [sDate earlierDate: gDate] == gDate) { + NSArray *modified; + if (showDependencies == YES) { NSLog(@"%@: source %@, gsdoc %@ ==> regenerate", @@ -639,6 +641,8 @@ main(int argc, char **argv, char **env) * Set up linkage for this file. */ [[parser info] setObject: file forKey: @"base"]; + [[parser info] setObject: documentationDirectory + forKey: @"directory"]; /* * Only produce linkage if the up link is not empty. @@ -649,18 +653,35 @@ main(int argc, char **argv, char **env) [[parser info] setObject: up forKey: @"up"]; } - if ([output output: [parser info] - file: gsdocfile - directory: documentationDirectory] == NO) + modified = [output output: [parser info]]; + if (modified == nil) { NSLog(@"Sorry unable to write %@", gsdocfile); } + else + { + unsigned c = [modified count]; + + while (c-- > 0) + { + NSString *f; + + f = [[modified objectAtIndex: c] lastPathComponent]; + if ([gFiles containsObject: f] == NO) + { + [gFiles addObject: f]; + } + } + } + } + else + { + /* + * Add the gsdoc file corresponding to the .h file to the list of + * those to process. + */ + [gFiles addObject: [gsdocfile lastPathComponent]]; } - /* - * Add the gsdoc file corresponding to the .h file to the list of - * those to process. - */ - [gFiles addObject: [gsdocfile lastPathComponent]]; } DESTROY(pool); DESTROY(parser);