SDL: wikiheaders.pl: Add support for deprecated functions.

From d9d8f51eece6b117f02b9f71a82b24836f6acc93 Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Sat, 23 Oct 2021 14:37:47 -0400
Subject: [PATCH] wikiheaders.pl: Add support for deprecated functions.

---
 build-scripts/wikiheaders.pl | 45 +++++++++++++++++++++++++++++++-----
 src/dynapi/gendynapi.pl      | 10 ++++----
 2 files changed, 44 insertions(+), 11 deletions(-)

diff --git a/build-scripts/wikiheaders.pl b/build-scripts/wikiheaders.pl
index 0cb945a14b..209a0d5fff 100755
--- a/build-scripts/wikiheaders.pl
+++ b/build-scripts/wikiheaders.pl
@@ -270,6 +270,7 @@ sub usage {
 my @standard_wiki_sections = (
     'Draft',
     '[Brief]',
+    'Deprecated',
     'Syntax',
     'Function Parameters',
     'Return Value',
@@ -309,7 +310,7 @@ sub usage {
         my @templines;
         my $str;
         my $has_doxygen = 1;
-        if (/\A\s*extern\s+DECLSPEC/) {  # a function declaration without a doxygen comment?
+        if (/\A\s*extern\s+(SDL_DEPRECATED\s+|)DECLSPEC/) {  # a function declaration without a doxygen comment?
             @templines = ();
             $decl = $_;
             $str = '';
@@ -345,7 +346,7 @@ sub usage {
             $decl = <FH>;
             $decl = '' if not defined $decl;
             chomp($decl);
-            if (not $decl =~ /\A\s*extern\s+DECLSPEC/) {
+            if (not $decl =~ /\A\s*extern\s+(SDL_DEPRECATED\s+|)DECLSPEC/) {
                 #print "Found doxygen but no function sig:\n$str\n\n";
                 foreach (@templines) {
                     push @contents, $_;
@@ -373,8 +374,8 @@ sub usage {
         #print("DECL: [$decl]\n");
 
         my $fn = '';
-        if ($decl =~ /\A\s*extern\s+DECLSPEC\s+(const\s+|)(unsigned\s+|)(.*?)\s*(\*?)\s*SDLCALL\s+(.*?)\s*\((.*?)\);/) {
-            $fn = $5;
+        if ($decl =~ /\A\s*extern\s+(SDL_DEPRECATED\s+|)DECLSPEC\s+(const\s+|)(unsigned\s+|)(.*?)\s*(\*?)\s*SDLCALL\s+(.*?)\s*\((.*?)\);/) {
+            $fn = $6;
             #$decl =~ s/\A\s*extern\s+DECLSPEC\s+(.*?)\s+SDLCALL/$1/;
         } else {
             #print "Found doxygen but no function sig:\n$str\n\n";
@@ -391,9 +392,10 @@ sub usage {
         foreach (@decllines) {
             if ($decl eq '') {
                 $decl = $_;
-                $decl =~ s/\Aextern\s+DECLSPEC\s+(.*?)\s+(\*?)SDLCALL\s+/$1$2 /;
+                $decl =~ s/\Aextern\s+(SDL_DEPRECATED\s+|)DECLSPEC\s+(.*?)\s+(\*?)SDLCALL\s+/$2$3 /;
             } else {
                 my $trimmed = $_;
+                # !!! FIXME: trim space for SDL_DEPRECATED if it was used, too.
                 $trimmed =~ s/\A\s{24}//;  # 24 for shrinking to match the removed "extern DECLSPEC SDLCALL "
                 $decl .= $trimmed;
             }
@@ -561,6 +563,7 @@ sub usage {
         my $returns = %$sectionsref{'Return Value'};
         my $version = %$sectionsref{'Version'};
         my $related = %$sectionsref{'Related Functions'};
+        my $deprecated = %$sectionsref{'Deprecated'};
         my $brief = %$sectionsref{'[Brief]'};
         my $addblank = 0;
         my $str = '';
@@ -586,6 +589,21 @@ sub usage {
             $str .= wordwrap($remarks) . "\n";
         }
 
+        if (defined $deprecated) {
+            # !!! FIXME: lots of code duplication in all of these.
+            $str .= "\n" if $addblank; $addblank = 1;
+            my $v = dewikify($wikitype, $deprecated);
+            my $whitespacelen = length("\\deprecated") + 1;
+            my $whitespace = ' ' x $whitespacelen;
+            $v = wordwrap($v, -$whitespacelen);
+            my @desclines = split /\n/, $v;
+            my $firstline = shift @desclines;
+            $str .= "\\deprecated $firstline\n";
+            foreach (@desclines) {
+                $str .= "${whitespace}$_\n";
+            }
+        }
+
         if (defined $params) {
             $str .= "\n" if $addblank; $addblank = (defined $returns) ? 0 : 1;
             my @lines = split /\n/, dewikify($wikitype, $params);
@@ -775,7 +793,7 @@ sub usage {
 
         my $decl = $headerdecls{$fn};
         #$decl =~ s/\*\s+SDLCALL/ *SDLCALL/;  # Try to make "void * Function" become "void *Function"
-        #$decl =~ s/\A\s*extern\s+DECLSPEC\s+(.*?)\s+(\*?)SDLCALL/$1$2/;
+        #$decl =~ s/\A\s*extern\s+(SDL_DEPRECATED\s+|)DECLSPEC\s+(.*?)\s+(\*?)SDLCALL/$2$3/;
 
         my $syntax = '';
         if ($wikitype eq 'mediawiki') {
@@ -829,6 +847,21 @@ sub usage {
                 }
                 $desc =~ s/[\s\n]+\Z//ms;
                 $sections{'Return Value'} = wordwrap("$retstr " . wikify($wikitype, $desc)) . "\n";
+            } elsif ($l =~ /\A\\deprecated\s+(.*)\Z/) {
+                my $desc = $1;
+                while (@doxygenlines) {
+                    my $subline = $doxygenlines[0];
+                    $subline =~ s/\A\s*//;
+                    last if $subline =~ /\A\\/;  # some sort of doxygen command, assume we're past this thing.
+                    shift @doxygenlines;  # dump this line from the array; we're using it.
+                    if ($subline eq '') {  # empty line, make sure it keeps the newline char.
+                        $desc .= "\n";
+                    } else {
+                        $desc .= " $subline";
+                    }
+                }
+                $desc =~ s/[\s\n]+\Z//ms;
+                $sections{'Deprecated'} = wordwrap(wikify($wikitype, $desc)) . "\n";
             } elsif ($l =~ /\A\\since\s+(.*)\Z/) {
                 my $desc = $1;
                 while (@doxygenlines) {
diff --git a/src/dynapi/gendynapi.pl b/src/dynapi/gendynapi.pl
index dc1d22ca68..419415b26e 100755
--- a/src/dynapi/gendynapi.pl
+++ b/src/dynapi/gendynapi.pl
@@ -55,7 +55,7 @@
     open(HEADER, '<', $header) or die("Can't open $header: $!\n");
     while (<HEADER>) {
         chomp;
-        next if not /\A\s*extern\s+DECLSPEC/;
+        next if not /\A\s*extern\s+(SDL_DEPRECATED\s+|)DECLSPEC/;
         my $decl = "$_ ";
         if (not $decl =~ /\)\s*;/) {
             while (<HEADER>) {
@@ -70,13 +70,13 @@
         $decl =~ s/\s+\Z//;
         #print("DECL: [$decl]\n");
 
-        if ($decl =~ /\A\s*extern\s+DECLSPEC\s+(const\s+|)(unsigned\s+|)(.*?)\s*(\*?)\s*SDLCALL\s+(.*?)\s*\((.*?)\);/) {
-            my $rc = "$1$2$3$4";
-            my $fn = $5;
+        if ($decl =~ /\A\s*extern\s+(SDL_DEPRECATED\s+|)DECLSPEC\s+(const\s+|)(unsigned\s+|)(.*?)\s*(\*?)\s*SDLCALL\s+(.*?)\s*\((.*?)\);/) {
+            my $rc = "$2$3$4$5";
+            my $fn = $6;
 
             next if $existing{$fn};   # already slotted into the jump table.
 
-            my @params = split(',', $6);
+            my @params = split(',', $7);
 
             #print("rc == '$rc', fn == '$fn', params == '$params'\n");