From 5a58b3d97ad756776ad35112398b548f4fe6a0ee Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Thu, 11 Apr 2024 00:36:10 -0400 Subject: [PATCH] wikiheaders: Bridge basic typedefs to the wiki! --- build-scripts/wikiheaders.pl | 60 +++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 11 deletions(-) diff --git a/build-scripts/wikiheaders.pl b/build-scripts/wikiheaders.pl index 24e2cc6e9..47a923e9c 100755 --- a/build-scripts/wikiheaders.pl +++ b/build-scripts/wikiheaders.pl @@ -535,7 +535,7 @@ my %headerdecls = (); my %headersymslocation = (); # $headersymslocation{"SDL_OpenAudio"} -> name of header holding SDL_OpenAudio define ("SDL_audio.h" in this case). my %headersymschunk = (); # $headersymschunk{"SDL_OpenAudio"} -> offset in array in %headers that should be replaced for this symbol. my %headersymshasdoxygen = (); # $headersymshasdoxygen{"SDL_OpenAudio"} -> 1 if there was no existing doxygen for this function. -my %headersymstype = (); # $headersymstype{"SDL_OpenAudio"} -> 1 (function), 2 (macro), 3 (struct), 4 (enum) +my %headersymstype = (); # $headersymstype{"SDL_OpenAudio"} -> 1 (function), 2 (macro), 3 (struct), 4 (enum), 5 (other typedef) my %wikitypes = (); # contains string of wiki page extension, like $wikitypes{"SDL_OpenAudio"} == 'mediawiki' my %wikisyms = (); # contains references to hash of strings, each string being the full contents of a section of a wiki page, like $wikisyms{"SDL_OpenAudio"}{"Remarks"}. @@ -651,6 +651,8 @@ while (my $d = readdir(DH)) { $symtype = 3; # struct or union } elsif ($decl =~ /\A\s*(typedef\s+|)enum/) { $symtype = 4; # enum + } elsif ($decl =~ /\A\s*typedef\s+.*;\Z/) { + $symtype = 5; # other typedef } else { #print "Found doxygen but no function sig:\n$str\n\n"; foreach (@templines) { @@ -788,6 +790,34 @@ while (my $d = readdir(DH)) { } # this currently assumes the struct/union/enum ends on the line with the final bracket. I'm not writing a C parser here, fix the header! } + } elsif ($symtype == 5) { # other typedef + if ($decl =~ /\A\s*typedef\s+(.*);\Z/) { + my $tdstr = $1; + #my $datatype; + if ($tdstr =~ /\A(.*?)\s*\((.*?)\s*\*\s*(.*?)\)\s*\((.*?)\)\s*\Z/) { # a function pointer type + $sym = $3; + #$datatype = "$1 ($2 *$sym)($4)"; + } elsif ($tdstr =~ /\A(.*[\s\*]+)(.*?)\s*\Z/) { + $sym = $2; + #$datatype = $1; + } else { + die("Failed to parse typedef '$tdstr' in $incpath/$dent!\n"); # I'm hitting a C grammar nail with a regexp hammer here, y'all. + } + + $sym =~ s/\A\s+//; + $sym =~ s/\s+\Z//; + #$datatype =~ s/\A\s+//; + #$datatype =~ s/\s+\Z//; + } else { + #print "Found doxygen but no datatype:\n$str\n\n"; + foreach (@templines) { + push @contents, $_; + } + foreach (@decllines) { + push @contents, $_; + } + next; + } } else { die("Unexpected symtype $symtype"); } @@ -831,10 +861,6 @@ while (my $d = readdir(DH)) { } closedir(DH); - -# !!! FIXME: we need to parse enums and typedefs and structs and defines and and and and and... -# !!! FIXME: (but functions are good enough for now.) - opendir(DH, $wikipath) or die("Can't opendir '$wikipath': $!\n"); while (my $d = readdir(DH)) { my $dent = $d; @@ -1008,7 +1034,7 @@ if ($copy_direction == 1) { # --copy-to-headers my $params = undef; my $paramstr = undef; - if ($symtype == 1) { + if (($symtype == 1) && (($symtype == 5))) { # we'll assume a typedef (5) with a \param is a function pointer typedef. $params = $sectionsref->{'Function Parameters'}; $paramstr = '\param'; } elsif ($symtype == 2) { @@ -1518,6 +1544,8 @@ if ($copy_direction == 1) { # --copy-to-headers $symtypename = 'Struct'; } elsif ($symtype == 4) { $symtypename = 'Enum'; + } elsif ($symtype == 5) { + $symtypename = 'Datatype'; } else { die("Unexpected symbol type $symtype!"); } @@ -1567,7 +1595,7 @@ if ($copy_direction == 1) { # --copy-to-headers } else { my $sectname = $sect; if ($sectname eq 'Function Parameters') { # We use this same table for different things depending on what we're documenting, so rename it now. - if ($symtype == 1) { # function + if (($symtype == 1) || ($symtype == 5)) { # function (or typedef, in case it's a function pointer type). } elsif ($symtype == 2) { # macro $sectname = 'Macro Parameters'; } elsif ($symtype == 3) { # struct/union @@ -1775,7 +1803,7 @@ if ($copy_direction == 1) { # --copy-to-headers } if (defined $params) { - if ($symtype == 1) { + if (($symtype == 1) || ($symtype == 5)) { $str .= ".SH FUNCTION PARAMETERS\n"; } elsif ($symtype == 2) { # macro $str .= ".SH MACRO PARAMETERS\n"; @@ -1899,11 +1927,21 @@ if ($copy_direction == 1) { # --copy-to-headers $str .= ".UE\n"; } - my $path = "$manpath/$_.3.tmp"; - open(FH, '>', $path) or die("Can't open '$path': $!\n"); + my $mansection; + if (($symtype == 1) || ($symtype == 2)) { # functions or macros + $mansection = '3'; + } elsif (($symtype >= 3) && ($symtype <= 5)) { # struct/union/enum/typedef + $mansection = '3type'; + } else { + die("Unexpected symtype $symtype"); + } + + my $path = "$manpath/$_.$mansection"; + my $tmppath = "$path.tmp"; + open(FH, '>', $tmppath) or die("Can't open '$tmppath': $!\n"); print FH $str; close(FH); - rename($path, "$manpath/$_.3") or die("Can't rename '$path' to '$manpath/$_.3': $!\n"); + rename($tmppath, $path) or die("Can't rename '$tmppath' to '$path': $!\n"); } }