From abdd8b49291e48ccd3e495c54e95dccf8ebc99b1 Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Fri, 16 Aug 2024 23:45:14 -0400
Subject: [PATCH] wikiheaders: generate wiki redirect pages for individual
enumerators.
---
build-scripts/wikiheaders.pl | 30 ++++++++++++++++++++++++++++--
1 file changed, 28 insertions(+), 2 deletions(-)
diff --git a/build-scripts/wikiheaders.pl b/build-scripts/wikiheaders.pl
index f3b83df3583d6..aee4dbc70ffb0 100755
--- a/build-scripts/wikiheaders.pl
+++ b/build-scripts/wikiheaders.pl
@@ -1128,14 +1128,16 @@ sub sanitize_c_typename {
}
# This block attempts to find the whole struct/union/enum definition by counting matching brackets. Kind of yucky.
+ # It also "parses" enums enough to find out the elements of it.
if ($has_definition) {
my $started = 0;
my $brackets = 0;
my $pending = $decl;
+ my $skipping_comment = 0;
$decl = '';
while (!$started || ($brackets != 0)) {
- foreach my $seg (split(/([{}])/, $pending)) {
+ foreach my $seg (split(/([{}])/, $pending)) { # (this will pick up brackets in comments! Be careful!)
$decl .= $seg;
if ($seg eq '{') {
$started = 1;
@@ -1146,6 +1148,25 @@ sub sanitize_c_typename {
}
}
+ if ($skipping_comment) {
+ if ($pending =~ s/\A.*?\*\///) {
+ $skipping_comment = 0;
+ }
+ }
+
+ if (!$skipping_comment && $started && ($symtype == 4)) { # Pick out elements of an enum.
+ my $stripped = "$pending";
+ $stripped =~ s/\/\*.*?\*\///g; # dump /* comments */ that exist fully on one line.
+ if ($stripped =~ /\/\*/) { # uhoh, a /* comment */ that crosses newlines.
+ $skipping_comment = 1;
+ } elsif ($stripped =~ /\A\s*([a-zA-Z0-9_]+)(.*)\Z/) { #\s*(\=\s*.*?|)\s*,?(.*?)\Z/) {
+ if ($1 ne 'typedef') { # make sure we didn't just eat the first line by accident. :/
+ #print("ENUM [$1] $incpath/$dent:$lineno\n");
+ $referenceonly{$1} = $sym;
+ }
+ }
+ }
+
if (!$started || ($brackets != 0)) {
$pending = <FH>;
die("EOF/error reading $incpath/$dent while parsing $sym\n") if not $pending;
@@ -2271,9 +2292,14 @@ sub sanitize_c_typename {
print FH "###### $wikified_preamble\n";
}
+ my $category = 'CategoryAPIMacro';
+ if ($headersymstype{$refersto} == 4) {
+ $category = 'CategoryAPIEnumerators'; # NOT CategoryAPIEnum!
+ }
+
print FH "# $sym\n\nPlease refer to [$refersto]($refersto) for details.\n\n";
print FH "----\n";
- print FH "[CategoryAPI](CategoryAPI), [CategoryAPIMacro](CategoryAPIMacro)\n\n";
+ print FH "[CategoryAPI](CategoryAPI), [$category]($category)\n\n";
close(FH);
}