SDL: wikiheaders.pl: Try to handle functions with multiple declarations better.

From 55f60847cbb70af926c83b2fb69af0b51e14c26f Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Fri, 8 Oct 2021 20:49:51 -0400
Subject: [PATCH] wikiheaders.pl: Try to handle functions with multiple
 declarations better.

---
 build-scripts/wikiheaders.pl | 35 +++++++++++++++++++++++++++--------
 1 file changed, 27 insertions(+), 8 deletions(-)

diff --git a/build-scripts/wikiheaders.pl b/build-scripts/wikiheaders.pl
index 7c2411ad5d..0cb945a14b 100755
--- a/build-scripts/wikiheaders.pl
+++ b/build-scripts/wikiheaders.pl
@@ -402,14 +402,33 @@ sub usage {
 
         #print("$fn:\n$str\n\n");
 
-        $headerfuncs{$fn} = $str;
-        $headerdecls{$fn} = $decl;
-        $headerfuncslocation{$fn} = $dent;
-        $headerfuncschunk{$fn} = scalar(@contents);
-        $headerfuncshasdoxygen{$fn} = $has_doxygen;
-
-        push @contents, join("\n", @templines);
-        push @contents, join("\n", @decllines);
+        # There might be multiple declarations of a function due to #ifdefs,
+        #  and only one of them will have documentation. If we hit an
+        #  undocumented one before, delete the placeholder line we left for
+        #  it so it doesn't accumulate a new blank line on each run.
+        my $skipfn = 0;
+        if (defined $headerfuncshasdoxygen{$fn}) {
+            if ($headerfuncshasdoxygen{$fn} == 0) {  # An undocumented declaration already exists, nuke its placeholder line.
+                delete $contents[$headerfuncschunk{$fn}];  # delete DOES NOT RENUMBER existing elements!
+            } else {  # documented function already existed?
+                $skipfn = 1;  # don't add this copy to the list of functions.
+                if ($has_doxygen) {
+                    print STDERR "WARNING: Function '$fn' appears to be documented in multiple locations. Only keeping the first one we saw!\n";
+                }
+                push @contents, join("\n", @decllines);  # just put the existing declation in as-is.
+            }
+        }
+
+        if (!$skipfn) {
+            $headerfuncs{$fn} = $str;
+            $headerdecls{$fn} = $decl;
+            $headerfuncslocation{$fn} = $dent;
+            $headerfuncschunk{$fn} = scalar(@contents);
+            $headerfuncshasdoxygen{$fn} = $has_doxygen;
+            push @contents, join("\n", @templines);
+            push @contents, join("\n", @decllines);
+        }
+
     }
     close(FH);