diff options
author | Stefan Kost <ensonic@users.sf.net> | 2010-09-20 10:55:20 +0300 |
---|---|---|
committer | Stefan Kost <ensonic@users.sf.net> | 2010-09-20 10:57:00 +0300 |
commit | 460e72183338efad84b08e5069176920a92a3f1e (patch) | |
tree | 9d45263f7290cc4df415e57991a680cffd2bc1f3 /gtkdoc-scan.in | |
parent | 7810dcbf594a4debd8d414ff7dccc2399ea6b529 (diff) | |
download | gtk-doc-460e72183338efad84b08e5069176920a92a3f1e.tar.gz |
scan: attempt to handle skipping redeclarations of symbols
This unfortunately does not work yet. If a header has multiple different
declarations of a symbol, we would like to only use the first.
Diffstat (limited to 'gtkdoc-scan.in')
-rwxr-xr-x | gtkdoc-scan.in | 74 |
1 files changed, 44 insertions, 30 deletions
diff --git a/gtkdoc-scan.in b/gtkdoc-scan.in index da1111d..523daa8 100755 --- a/gtkdoc-scan.in +++ b/gtkdoc-scan.in @@ -354,7 +354,7 @@ sub ScanHeader { } } - # set global that affects AddSymbolToList + # set global that is used later when we do AddSymbolToList if ($deprecated_conditional_nest > 0) { $deprecated = "<DEPRECATED/>\n"; } else { @@ -480,8 +480,9 @@ sub ScanHeader { # will override this. my $structsym = uc $1; #print "DEBUG: $structsym typedef: $2\n"; - &AddSymbolToList (\$list, $2); - print DECL "<$structsym>\n<NAME>$2</NAME>\n$deprecated</$structsym>\n"; + if (&AddSymbolToList (\$list, $2)) { + print DECL "<$structsym>\n<NAME>$2</NAME>\n$deprecated</$structsym>\n"; + } } elsif (m/^\s*(?:struct|union)\s+_(\w+)\s*;/) { # Skip private structs/unions. @@ -493,8 +494,9 @@ sub ScanHeader { # can differentiate it from a typedef. my $structsym = uc $1; #print "DEBUG: $structsym: $2\n"; - &AddSymbolToList (\$list, $2); - print DECL "<$structsym>\n<NAME>$2</NAME>\n$_$deprecated</$structsym>\n"; + if (&AddSymbolToList (\$list, $2)) { + print DECL "<$structsym>\n<NAME>$2</NAME>\n$_$deprecated</$structsym>\n"; + } } elsif (m/^\s*typedef\s+(struct|union)\s*\w*\s*{/) { $symbol = ""; @@ -507,14 +509,16 @@ sub ScanHeader { } elsif (m/^\s*typedef\s+(?:struct|union)\s+\w+[\s\*]+(\w+)\s*;/) { #print "DEBUG: Found struct/union(*) typedef $1: $_"; - &AddSymbolToList (\$list, $1); - print DECL "<TYPEDEF>\n<NAME>$1</NAME>\n$deprecated$_</TYPEDEF>\n"; + if (&AddSymbolToList (\$list, $1)) { + print DECL "<TYPEDEF>\n<NAME>$1</NAME>\n$deprecated$_</TYPEDEF>\n"; + } } elsif (m/^\s*(G_GNUC_EXTENSION\s+)?typedef\s+(.+[\s\*])(\w+)(\s*\[[^\]]+\])*\s*;/) { if ($2 !~ m/^struct\s/ && $2 !~ m/^union\s/) { #print "DEBUG: Found typedef: $_"; - &AddSymbolToList (\$list, $3); - print DECL "<TYPEDEF>\n<NAME>$3</NAME>\n$deprecated$_</TYPEDEF>\n"; + if (&AddSymbolToList (\$list, $3)) { + print DECL "<TYPEDEF>\n<NAME>$3</NAME>\n$deprecated$_</TYPEDEF>\n"; + } } } elsif (m/^\s*typedef\s+/) { #print "DEBUG: Skipping typedef: $_"; @@ -526,8 +530,9 @@ sub ScanHeader { $symbol = $5; s/^\s*([A-Za-z_]+VAR)\b/extern/; #print "DEBUG: Possible extern: $_"; - &AddSymbolToList (\$list, $symbol); - print DECL "<VARIABLE>\n<NAME>$symbol</NAME>\n$deprecated$_</VARIABLE>\n"; + if (&AddSymbolToList (\$list, $symbol)) { + print DECL "<VARIABLE>\n<NAME>$symbol</NAME>\n$deprecated$_</VARIABLE>\n"; + } # FUNCTIONS @@ -706,13 +711,14 @@ sub ScanHeader { $decl =~ s/\s*\n\s*/ /gs; # consolidate whitespace at start # and end of lines. $ret_type =~ s%/\*.*?\*/%%g; # remove comments in ret type. - &AddSymbolToList (\$list, $symbol); - print DECL "<FUNCTION>\n<NAME>$symbol</NAME>\n$deprecated<RETURNS>$ret_type</RETURNS>\n$decl\n</FUNCTION>\n"; - if ($REBUILD_TYPES) { - # check if this looks like a get_type function and if so remember - if (($symbol =~ m/_get_type$/) && ($ret_type =~ m/GType/) && ($decl =~ m/(void|)/)) { - #print "Adding get-type: [$ret_type] [$symbol] [$decl]\tfrom $input_file\n"; - push (@get_types, $symbol); + if (&AddSymbolToList (\$list, $symbol)) { + print DECL "<FUNCTION>\n<NAME>$symbol</NAME>\n$deprecated<RETURNS>$ret_type</RETURNS>\n$decl\n</FUNCTION>\n"; + if ($REBUILD_TYPES) { + # check if this looks like a get_type function and if so remember + if (($symbol =~ m/_get_type$/) && ($ret_type =~ m/GType/) && ($decl =~ m/(void|)/)) { + #print "Adding get-type: [$ret_type] [$symbol] [$decl]\tfrom $input_file\n"; + push (@get_types, $symbol); + } } } } else { @@ -725,8 +731,9 @@ sub ScanHeader { if ($in_declaration eq 'user_function') { if ($decl =~ s/\).*$//) { - &AddSymbolToList (\$list, $symbol); - print DECL "<USER_FUNCTION>\n<NAME>$symbol</NAME>\n$deprecated<RETURNS>$ret_type</RETURNS>\n$decl</USER_FUNCTION>\n"; + if (&AddSymbolToList (\$list, $symbol)) { + print DECL "<USER_FUNCTION>\n<NAME>$symbol</NAME>\n$deprecated<RETURNS>$ret_type</RETURNS>\n$decl</USER_FUNCTION>\n"; + } $in_declaration = ""; } } @@ -734,8 +741,9 @@ sub ScanHeader { if ($in_declaration eq 'macro') { if ($decl !~ m/\\\s*$/) { if ($internal == 0) { - &AddSymbolToList (\$list, $symbol); - print DECL "<MACRO>\n<NAME>$symbol</NAME>\n$deprecated$decl</MACRO>\n"; + if (&AddSymbolToList (\$list, $symbol)) { + print DECL "<MACRO>\n<NAME>$symbol</NAME>\n$deprecated$decl</MACRO>\n"; + } } else { $internal = 0; } @@ -748,8 +756,9 @@ sub ScanHeader { if ($symbol eq "") { $symbol = $1; } - &AddSymbolToList (\$list, $symbol); - print DECL "<ENUM>\n<NAME>$symbol</NAME>\n$deprecated$decl</ENUM>\n"; + if (&AddSymbolToList (\$list, $symbol)) { + print DECL "<ENUM>\n<NAME>$symbol</NAME>\n$deprecated$decl</ENUM>\n"; + } $in_declaration = ""; } } @@ -769,10 +778,10 @@ sub ScanHeader { push (@objects, $objectname); } #print "Store struct: $symbol\n"; - &AddSymbolToList (\$list, $symbol); - - my $structsym = uc $in_declaration; - print DECL "<$structsym>\n<NAME>$symbol</NAME>\n$deprecated$decl</$structsym>\n"; + if (&AddSymbolToList (\$list, $symbol)) { + my $structsym = uc $in_declaration; + print DECL "<$structsym>\n<NAME>$symbol</NAME>\n$deprecated$decl</$structsym>\n"; + } $in_declaration = ""; } else { # We use tr to count the brackets in the line, and adjust @@ -841,8 +850,13 @@ sub AddSymbolToList { my ($list, $symbol) = @_; if ($$list =~ m/\b\Q$symbol\E\b/) { -# print "Symbol $symbol already in list. skipping\n"; - return; + #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; } $$list .= "$symbol\n"; + return 1; } |