diff options
author | Stefan Kost <ensonic@users.sf.net> | 2010-09-20 12:05:13 +0300 |
---|---|---|
committer | Stefan Kost <ensonic@users.sf.net> | 2010-09-20 12:05:13 +0300 |
commit | 6689f85421d54949effafb1164f18257927234c1 (patch) | |
tree | acc20a6e015cec0267eeba1fbc7e441e2fe27fca /gtkdoc-scan.in | |
parent | 2761bb733487415e277fa18e4ea1d9cce6bdaeb0 (diff) | |
download | gtk-doc-6689f85421d54949effafb1164f18257927234c1.tar.gz |
scan: track forward decls and thus allow skipping duplicate symbols
Diffstat (limited to 'gtkdoc-scan.in')
-rwxr-xr-x | gtkdoc-scan.in | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/gtkdoc-scan.in b/gtkdoc-scan.in index 5a16f94..4052b8d 100755 --- a/gtkdoc-scan.in +++ b/gtkdoc-scan.in @@ -273,6 +273,9 @@ sub ScanHeader { # subclasses, which we remove from the list. my ($internal) = 0; # Set to 1 for internal symbols, we need to # fully parse, but don't add them to docs + my %forward_decls = (); # hashtable of forward declarations, we skip + # them if we find the real declaration + # later. my $file_basename; @@ -481,9 +484,7 @@ sub ScanHeader { # will override this. my $structsym = uc $1; #print "DEBUG: $structsym typedef: $2\n"; - if (&AddSymbolToList (\$list, $2)) { - print DECL "<$structsym>\n<NAME>$2</NAME>\n$deprecated</$structsym>\n"; - } + $forward_decls{$2} = "<$structsym>\n<NAME>$2</NAME>\n$deprecated</$structsym>\n" } elsif (m/^\s*(?:struct|union)\s+_(\w+)\s*;/) { # Skip private structs/unions. @@ -495,9 +496,7 @@ sub ScanHeader { # can differentiate it from a typedef. my $structsym = uc $1; #print "DEBUG: $structsym: $2\n"; - if (&AddSymbolToList (\$list, $2)) { - print DECL "<$structsym>\n<NAME>$2</NAME>\n$_$deprecated</$structsym>\n"; - } + $forward_decls{$2} = "<$structsym>\n<NAME>$2</NAME>\n$_$deprecated</$structsym>\n"; } elsif (m/^\s*typedef\s+(struct|union)\s*\w*\s*{/) { $symbol = ""; @@ -782,6 +781,9 @@ sub ScanHeader { if (&AddSymbolToList (\$list, $symbol)) { my $structsym = uc $in_declaration; print DECL "<$structsym>\n<NAME>$symbol</NAME>\n$deprecated$decl</$structsym>\n"; + if (defined($forward_decls{$symbol})) { + undef($forward_decls{$symbol}); + } } $in_declaration = ""; } else { @@ -798,6 +800,14 @@ sub ScanHeader { } close(INPUT); + # print remaining forward declarations + foreach $symbol (keys %forward_decls) { + if (defined($forward_decls{$symbol})) { + &AddSymbolToList (\$list, $symbol); + print DECL $forward_decls{$symbol}; + } + } + #print "DEBUG: Scanning $input_file done\n\n\n"; @@ -852,11 +862,10 @@ sub AddSymbolToList { if ($$list =~ m/\b\Q$symbol\E\b/) { #print "Symbol $symbol already in list. skipping\n"; - # FIXME: ideally we would like to return 0 to skip outputting another - # entry to -decl.txt to avoid redeclarations (e.g. in conditional - # sections). Unfortunately this does not work, because of forward - # declarations - return 1; + # we return 0 to skip outputting another entry to -decl.txt + # this is to avoid redeclarations (e.g. in conditional + # sections). + return 0; } $$list .= "$symbol\n"; return 1; |