Moved function pointer params to typedefs, etc, for latest wikiheaders.

This commit is contained in:
Ryan C. Gordon 2024-06-12 18:36:59 -04:00
parent 477c718744
commit b2b2369414
No known key found for this signature in database
GPG key ID: FA148B892AB48044
10 changed files with 305 additions and 96 deletions

View file

@ -623,6 +623,8 @@ my %headersymshasdoxygen = (); # $headersymshasdoxygen{"SDL_OpenAudio"} -> 1 i
my %headersymstype = (); # $headersymstype{"SDL_OpenAudio"} -> 1 (function), 2 (macro), 3 (struct), 4 (enum), 5 (other typedef) my %headersymstype = (); # $headersymstype{"SDL_OpenAudio"} -> 1 (function), 2 (macro), 3 (struct), 4 (enum), 5 (other typedef)
my %headersymscategory = (); # $headersymscategory{"SDL_OpenAudio"} -> 'Audio' ... this is set with a `/* WIKI CATEGEORY: Audio */` comment in the headers that sets it on all symbols until a new comment changes it. So usually, once at the top of the header file. my %headersymscategory = (); # $headersymscategory{"SDL_OpenAudio"} -> 'Audio' ... this is set with a `/* WIKI CATEGEORY: Audio */` comment in the headers that sets it on all symbols until a new comment changes it. So usually, once at the top of the header file.
my %headercategorydocs = (); # $headercategorydocs{"Audio"} -> (fake) symbol for this category's documentation. Undefined if not documented. my %headercategorydocs = (); # $headercategorydocs{"Audio"} -> (fake) symbol for this category's documentation. Undefined if not documented.
my %headersymsparaminfo = (); # $headersymsparaminfo{"SDL_OpenAudio"} -> reference to array of parameters, pushed by name, then C type string, repeating. Undef'd if void params, or not a function.
my %headersymsrettype = (); # $headersymsrettype{"SDL_OpenAudio"} -> string of C datatype of return value. Undef'd if not a function.
my %wikitypes = (); # contains string of wiki page extension, like $wikitypes{"SDL_OpenAudio"} == 'mediawiki' 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"}. 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"}.
my %wikisectionorder = (); # contains references to array, each array item being a key to a wikipage section in the correct order, like $wikisectionorder{"SDL_OpenAudio"}[2] == 'Remarks' my %wikisectionorder = (); # contains references to array, each array item being a key to a wikipage section in the correct order, like $wikisectionorder{"SDL_OpenAudio"}[2] == 'Remarks'
@ -679,6 +681,26 @@ sub print_undocumented_section {
} }
} }
sub strip_fn_declaration_metadata {
my $decl = shift;
$decl =~ s/SDL_(PRINTF|SCANF)_FORMAT_STRING\s*//; # don't want this metadata as part of the documentation.
$decl =~ s/SDL_ALLOC_SIZE2?\(.*?\)\s*//; # don't want this metadata as part of the documentation.
$decl =~ s/SDL_MALLOC\s*//; # don't want this metadata as part of the documentation.
$decl =~ s/SDL_(IN|OUT|INOUT)_.*?CAP\s*\(.*?\)\s*//g; # don't want this metadata as part of the documentation.
$decl =~ s/\)(\s*SDL_[a-zA-Z_]+(\(.*?\)|))*;/);/; # don't want this metadata as part of the documentation.
return $decl;
}
sub sanitize_c_typename {
my $str = shift;
$str =~ s/\A\s+//;
$str =~ s/\s+\Z//;
$str =~ s/const\s*(\*+)/const $1/g; # one space between `const` and pointer stars: `char const* const *` becomes `char const * const *`.
$str =~ s/\*\s+\*/**/g; # drop spaces between pointers: `void * *` becomes `void **`.
$str =~ s/\s*(\*+)\Z/ $1/; # one space between pointer stars and what it points to: `void**` becomes `void **`.
return $str;
}
my $incpath = "$srcpath"; my $incpath = "$srcpath";
$incpath .= "/$incsubdir" if $incsubdir ne ''; $incpath .= "/$incsubdir" if $incsubdir ne '';
@ -746,7 +768,7 @@ while (my $d = readdir(DH)) {
#print("CATEGORY FOR '$dent' CHANGED TO " . (defined($current_wiki_category) ? "'$current_wiki_category'" : '(undef)') . "\n"); #print("CATEGORY FOR '$dent' CHANGED TO " . (defined($current_wiki_category) ? "'$current_wiki_category'" : '(undef)') . "\n");
push @contents, $_; push @contents, $_;
next; next;
} elsif (/\A\s*extern\s+(SDL_DEPRECATED\s+|)(SDLMAIN_)?DECLSPEC/) { # a function declaration without a doxygen comment? } elsif (/\A\s*extern\s+(SDL_DEPRECATED\s+|)(SDLMAIN_|SDL_)?DECLSPEC/) { # a function declaration without a doxygen comment?
$symtype = 1; # function declaration $symtype = 1; # function declaration
@templines = (); @templines = ();
$decl = $_; $decl = $_;
@ -819,7 +841,7 @@ while (my $d = readdir(DH)) {
$lineno++ if defined $decl; $lineno++ if defined $decl;
$decl = '' if not defined $decl; $decl = '' if not defined $decl;
chomp($decl); chomp($decl);
if ($decl =~ /\A\s*extern\s+(SDL_DEPRECATED\s+|)(SDLMAIN_)?DECLSPEC/) { if ($decl =~ /\A\s*extern\s+(SDL_DEPRECATED\s+|)(SDLMAIN_|SDL_)?DECLSPEC/) {
$symtype = 1; # function declaration $symtype = 1; # function declaration
} elsif ($decl =~ /\A\s*SDL_FORCE_INLINE/) { } elsif ($decl =~ /\A\s*SDL_FORCE_INLINE/) {
$symtype = 1; # (forced-inline) function declaration $symtype = 1; # (forced-inline) function declaration
@ -844,6 +866,8 @@ while (my $d = readdir(DH)) {
} }
} }
my @paraminfo = ();
my $rettype = undef;
my @decllines = ( $decl ); my @decllines = ( $decl );
my $sym = ''; my $sym = '';
@ -872,7 +896,7 @@ while (my $d = readdir(DH)) {
} }
$decl =~ s/\s*\)\s*(\{.*|)\s*\Z/);/; $decl =~ s/\s*\)\s*(\{.*|)\s*\Z/);/;
} else { } else {
if (not $decl =~ /\)\s*;/) { if (not $decl =~ /;/) {
while (<FH>) { while (<FH>) {
chomp; chomp;
$lineno++; $lineno++;
@ -880,19 +904,27 @@ while (my $d = readdir(DH)) {
s/\A\s+//; s/\A\s+//;
s/\s+\Z//; s/\s+\Z//;
$decl .= " $_"; $decl .= " $_";
last if /\)\s*;/; last if /;/;
} }
} }
$decl =~ s/\s+\);\Z/);/; $decl =~ s/\s+\);\Z/);/;
$decl =~ s/\s+;\Z/;/;
} }
$decl =~ s/\s+\Z//; $decl =~ s/\s+\Z//;
if (!$is_forced_inline && $decl =~ /\A\s*extern\s+(SDL_DEPRECATED\s+|)(SDLMAIN_)?DECLSPEC\s+(const\s+|)(unsigned\s+|)(.*?)\s*(\*?)\s*SDLCALL\s+(.*?)\s*\((.*?)\);/) { $decl = strip_fn_declaration_metadata($decl);
$sym = $7;
#$decl =~ s/\A\s*extern\s+DECLSPEC\s+(.*?)\s+SDLCALL/$1/; my $paramsstr = undef;
if (!$is_forced_inline && $decl =~ /\A\s*extern\s+(SDL_DEPRECATED\s+|)(SDLMAIN_|SDL_)?DECLSPEC\s+(const\s+|)(unsigned\s+|)(.*?)([\*\s]+)(\*?)\s*SDLCALL\s+(.*?)\s*\((.*?)\);/) {
$sym = $8;
$rettype = "$3$4$5$6";
$paramsstr = $9;
} elsif ($is_forced_inline && $decl =~ /\A\s*SDL_FORCE_INLINE\s+(SDL_DEPRECATED\s+|)(const\s+|)(unsigned\s+|)(.*?)([\*\s]+)(.*?)\s*\((.*?)\);/) { } elsif ($is_forced_inline && $decl =~ /\A\s*SDL_FORCE_INLINE\s+(SDL_DEPRECATED\s+|)(const\s+|)(unsigned\s+|)(.*?)([\*\s]+)(.*?)\s*\((.*?)\);/) {
$sym = $6; $sym = $6;
$rettype = "$2$3$4$5";
$paramsstr = $7;
} else { } else {
#print "Found doxygen but no function sig:\n$str\n\n"; #print "Found doxygen but no function sig:\n$str\n\n";
foreach (@templines) { foreach (@templines) {
@ -904,22 +936,68 @@ while (my $d = readdir(DH)) {
next; next;
} }
if (!$is_forced_inline) { # !!! FIXME: maybe we need to do this for forced-inline stuff too? $rettype = sanitize_c_typename($rettype);
$decl = ''; # build this with the line breaks, since it looks better for syntax highlighting.
if ($paramsstr =~ /\(/) {
die("\n\n$0 FAILURE!\n" .
"There's a '(' in the parameters for function '$sym' '$incpath/$dent'.\n" .
"This usually means there's a parameter that's a function pointer type.\n" .
"This causes problems for wikiheaders.pl and is less readable, too.\n" .
"Please put that function pointer into a typedef,\n" .
"and use the new type in this function's signature instead!\n\n");
}
my @params = split(/,/, $paramsstr);
my $dotdotdot = 0;
foreach (@params) {
my $p = $_;
$p =~ s/\A\s+//;
$p =~ s/\s+\Z//;
if (($p eq 'void') || ($p eq '')) {
die("Void parameter in a function with multiple params?! ('$sym' in '$incpath/$dent')") if (scalar(@params) != 1);
} elsif ($p eq '...') {
die("Mutiple '...' params?! ('$sym' in '$incpath/$dent')") if ($dotdotdot);
$dotdotdot = 1;
push @paraminfo, '...';
push @paraminfo, '...';
} elsif ($p =~ /\A(.*)\s+([a-zA-Z0-9_\*\[\]]+)\Z/) {
die("Parameter after '...' param?! ('$sym' in '$incpath/$dent')") if ($dotdotdot);
my $t = $1;
my $n = $2;
if ($n =~ s/\A(\*+)//) {
$t .= $1; # move any `*` that stuck to the name over.
}
if ($n =~ s/\[\]\Z//) {
$t = "$t*"; # move any `[]` that stuck to the name over, as a pointer.
}
$t = sanitize_c_typename($t);
#print("$t\n");
#print("$n\n");
push @paraminfo, $n;
push @paraminfo, $t;
} else {
die("Unexpected parameter '$p' in function '$sym' in '$incpath/$dent'!");
}
}
if (!$is_forced_inline) { # don't do with forced-inline because we don't want the implementation inserted in the wiki.
$decl = ''; # rebuild this with the line breaks, since it looks better for syntax highlighting.
foreach (@decllines) { foreach (@decllines) {
if ($decl eq '') { if ($decl eq '') {
$decl = $_; $decl = $_;
$decl =~ s/\Aextern\s+(SDL_DEPRECATED\s+|)(SDLMAIN_)?DECLSPEC\s+(.*?)\s+(\*?)SDLCALL\s+/$3$4 /; $decl =~ s/\Aextern\s+(SDL_DEPRECATED\s+|)(SDLMAIN_|SDL_)?DECLSPEC\s+(.*?)\s+(\*?)SDLCALL\s+/$3$4 /;
} else { } else {
my $trimmed = $_; my $trimmed = $_;
# !!! FIXME: trim space for SDL_DEPRECATED if it was used, too. # !!! 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 " $trimmed =~ s/\A\s{28}//; # 28 for shrinking to match the removed "extern SDL_DECLSPEC SDLCALL "
$decl .= $trimmed; $decl .= $trimmed;
} }
$decl .= "\n"; $decl .= "\n";
} }
} }
$decl = strip_fn_declaration_metadata($decl);
# !!! FIXME: code duplication with typedef processing, below. # !!! FIXME: code duplication with typedef processing, below.
# We assume any `#define`s directly after the function are related to it: probably bitflags for an integer typedef. # We assume any `#define`s directly after the function are related to it: probably bitflags for an integer typedef.
# We'll also allow some other basic preprocessor lines. # We'll also allow some other basic preprocessor lines.
@ -974,7 +1052,6 @@ while (my $d = readdir(DH)) {
} elsif ($symtype == 2) { # a macro } elsif ($symtype == 2) { # a macro
if ($decl =~ /\A\s*\#\s*define\s+(.*?)(\(.*?\)|)\s+/) { if ($decl =~ /\A\s*\#\s*define\s+(.*?)(\(.*?\)|)\s+/) {
$sym = $1; $sym = $1;
#$decl =~ s/\A\s*extern\s+DECLSPEC\s+(.*?)\s+SDLCALL/$1/;
} else { } else {
#print "Found doxygen but no macro:\n$str\n\n"; #print "Found doxygen but no macro:\n$str\n\n";
foreach (@templines) { foreach (@templines) {
@ -1176,6 +1253,8 @@ while (my $d = readdir(DH)) {
$headersymschunk{$sym} = scalar(@contents); $headersymschunk{$sym} = scalar(@contents);
$headersymshasdoxygen{$sym} = $has_doxygen; $headersymshasdoxygen{$sym} = $has_doxygen;
$headersymstype{$sym} = $symtype; $headersymstype{$sym} = $symtype;
$headersymsparaminfo{$sym} = \@paraminfo if (scalar(@paraminfo) > 0);
$headersymsrettype{$sym} = $rettype if (defined($rettype));
push @contents, join("\n", @templines); push @contents, join("\n", @templines);
push @contents, join("\n", @decllines) if (scalar(@decllines) > 0); push @contents, join("\n", @decllines) if (scalar(@decllines) > 0);
} }
@ -1187,6 +1266,7 @@ while (my $d = readdir(DH)) {
} }
closedir(DH); closedir(DH);
opendir(DH, $wikipath) or die("Can't opendir '$wikipath': $!\n"); opendir(DH, $wikipath) or die("Can't opendir '$wikipath': $!\n");
while (my $d = readdir(DH)) { while (my $d = readdir(DH)) {
my $dent = $d; my $dent = $d;
@ -1354,14 +1434,14 @@ if ($warn_about_missing) {
foreach (keys %wikisyms) { foreach (keys %wikisyms) {
my $sym = $_; my $sym = $_;
if (not defined $headersyms{$sym}) { if (not defined $headersyms{$sym}) {
print("WARNING: $sym defined in the wiki but not the headers!\n"); print STDERR "WARNING: $sym defined in the wiki but not the headers!\n";
} }
} }
foreach (keys %headersyms) { foreach (keys %headersyms) {
my $sym = $_; my $sym = $_;
if (not defined $wikisyms{$sym}) { if (not defined $wikisyms{$sym}) {
print("WARNING: $sym defined in the headers but not the wiki!\n"); print STDERR "WARNING: $sym defined in the headers but not the wiki!\n";
} }
} }
} }
@ -1451,15 +1531,26 @@ if ($copy_direction == 1) { # --copy-to-headers
if ($wikitype eq 'mediawiki') { if ($wikitype eq 'mediawiki') {
die("Unexpected data parsing MediaWiki table") if (shift @lines ne '{|'); # Dump the '{|' start die("Unexpected data parsing MediaWiki table") if (shift @lines ne '{|'); # Dump the '{|' start
while (scalar(@lines) >= 3) { while (scalar(@lines) >= 3) {
my $c_datatype = shift @lines;
my $name = shift @lines; my $name = shift @lines;
my $desc = shift @lines; my $desc = shift @lines;
my $terminator = shift @lines; # the '|-' or '|}' line. my $terminator; # the '|-' or '|}' line.
if (($desc eq '|-') or ($desc eq '|}') or (not $desc =~ /\A\|/)) { # we seem to be out of cells, which means there was no datatype column on this one.
$terminator = $desc;
$desc = $name;
$name = $c_datatype;
$c_datatype = '';
} else {
$terminator = shift @lines;
}
last if ($terminator ne '|-') and ($terminator ne '|}'); # we seem to have run out of table. last if ($terminator ne '|-') and ($terminator ne '|}'); # we seem to have run out of table.
$name =~ s/\A\|\s*//; $name =~ s/\A\|\s*//;
$name =~ s/\A\*\*(.*?)\*\*/$1/; $name =~ s/\A\*\*(.*?)\*\*/$1/;
$name =~ s/\A\'\'\'(.*?)\'\'\'/$1/; $name =~ s/\A\'\'\'(.*?)\'\'\'/$1/;
$desc =~ s/\A\|\s*//; $desc =~ s/\A\|\s*//;
#print STDERR "SYM: $sym NAME: $name DESC: $desc TERM: $terminator\n"; #print STDERR "SYM: $sym CDATATYPE: $c_datatype NAME: $name DESC: $desc TERM: $terminator\n";
my $whitespacelen = length($name) + 8; my $whitespacelen = length($name) + 8;
my $whitespace = ' ' x $whitespacelen; my $whitespace = ' ' x $whitespacelen;
$desc = wordwrap($desc, -$whitespacelen); $desc = wordwrap($desc, -$whitespacelen);
@ -1473,14 +1564,24 @@ if ($copy_direction == 1) { # --copy-to-headers
} elsif ($wikitype eq 'md') { } elsif ($wikitype eq 'md') {
my $l; my $l;
$l = shift @lines; $l = shift @lines;
die("Unexpected data parsing Markdown table") if (not $l =~ /\A\s*\|\s*\|\s*\|\s*\Z/); die("Unexpected data parsing Markdown table") if (not $l =~ /\A(\s*\|)?\s*\|\s*\|\s*\|\s*\Z/);
$l = shift @lines; $l = shift @lines;
die("Unexpected data parsing Markdown table") if (not $l =~ /\A\s*\|\s*\-*\s*\|\s*\-*\s*\|\s*\Z/); die("Unexpected data parsing Markdown table") if (not $l =~ /\A\s*(\|\s*\-*\s*)?\|\s*\-*\s*\|\s*\-*\s*\|\s*\Z/);
while (scalar(@lines) >= 1) { while (scalar(@lines) >= 1) {
$l = shift @lines; $l = shift @lines;
if ($l =~ /\A\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\|\s*\Z/) { my $name;
my $name = $1; my $desc;
my $desc = $2; if ($l =~ /\A\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\|\s*\Z/) {
# c datatype is $1, but we don't care about it here.
$name = $2;
$desc = $3;
} elsif ($l =~ /\A\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\|\s*\Z/) {
$name = $1;
$desc = $2;
} else {
last; # we seem to have run out of table.
}
$name =~ s/\A\*\*(.*?)\*\*/$1/; $name =~ s/\A\*\*(.*?)\*\*/$1/;
$name =~ s/\A\'\'\'(.*?)\'\'\'/$1/; $name =~ s/\A\'\'\'(.*?)\'\'\'/$1/;
#print STDERR "SYM: $sym NAME: $name DESC: $desc\n"; #print STDERR "SYM: $sym NAME: $name DESC: $desc\n";
@ -1493,9 +1594,6 @@ if ($copy_direction == 1) { # --copy-to-headers
foreach (@desclines) { foreach (@desclines) {
$str .= "${whitespace}$_\n"; $str .= "${whitespace}$_\n";
} }
} else {
last; # we seem to have run out of table.
}
} }
} else { } else {
die("write me"); die("write me");
@ -1505,8 +1603,9 @@ if ($copy_direction == 1) { # --copy-to-headers
if (defined $returns) { if (defined $returns) {
$str .= "\n" if $addblank; $addblank = 1; $str .= "\n" if $addblank; $addblank = 1;
my $r = dewikify($wikitype, $returns); my $r = dewikify($wikitype, $returns);
$r =~ s/\A\(.*?\)\s*//; # Chop datatype in parentheses off the front.
my $retstr = "\\returns"; my $retstr = "\\returns";
if ($r =~ s/\AReturn(s?) //) { if ($r =~ s/\AReturn(s?)\s+//) {
$retstr = "\\return$1"; $retstr = "\\return$1";
} }
@ -1697,13 +1796,12 @@ if ($copy_direction == 1) { # --copy-to-headers
$remarks =~ s/\s*\Z//; $remarks =~ s/\s*\Z//;
my $decl = $headerdecls{$sym}; my $decl = $headerdecls{$sym};
#$decl =~ s/\*\s+SDLCALL/ *SDLCALL/; # Try to make "void * Function" become "void *Function"
#$decl =~ s/\A\s*extern\s+(SDL_DEPRECATED\s+|)DECLSPEC\s+(.*?)\s+(\*?)SDLCALL/$2$3/;
my $syntax = ''; my $syntax = '';
if ($wikitype eq 'mediawiki') { if ($wikitype eq 'mediawiki') {
$syntax = "<syntaxhighlight lang='c'>\n$decl</syntaxhighlight>\n"; $syntax = "<syntaxhighlight lang='c'>\n$decl</syntaxhighlight>\n";
} elsif ($wikitype eq 'md') { } elsif ($wikitype eq 'md') {
$decl =~ s/\n+\Z//;
$syntax = "```c\n$decl\n```\n"; $syntax = "```c\n$decl\n```\n";
} else { die("Expected wikitype '$wikitype'"); } } else { die("Expected wikitype '$wikitype'"); }
@ -1712,7 +1810,9 @@ if ($copy_direction == 1) { # --copy-to-headers
$sections{'Remarks'} = "$remarks\n" if $remarks ne ''; $sections{'Remarks'} = "$remarks\n" if $remarks ne '';
$sections{'Syntax'} = $syntax; $sections{'Syntax'} = $syntax;
my @params = (); # have to parse these and build up the wiki tables after, since Markdown needs to know the length of the largest string. :/ my %params = (); # have to parse these and build up the wiki tables after, since Markdown needs to know the length of the largest string. :/
my @paramsorder = ();
my $fnsigparams = $headersymsparaminfo{$sym};
while (@doxygenlines) { while (@doxygenlines) {
my $l = shift @doxygenlines; my $l = shift @doxygenlines;
@ -1734,10 +1834,24 @@ if ($copy_direction == 1) { # --copy-to-headers
$desc =~ s/[\s\n]+\Z//ms; $desc =~ s/[\s\n]+\Z//ms;
# Validate this param.
if (defined($params{$arg})) {
print STDERR "WARNING: Symbol '$sym' has multiple '\\param $arg' declarations! Only keeping the first one!\n";
} elsif (defined $fnsigparams) {
my $found = 0;
for (my $i = 0; $i < scalar(@$fnsigparams); $i += 2) {
$found = 1, last if (@$fnsigparams[$i] eq $arg);
}
if (!$found) {
print STDERR "WARNING: Symbol '$sym' has a '\\param $arg' for a param that doesn't exist. It will be removed!\n";
}
}
# We need to know the length of the longest string to make Markdown tables, so we just store these off until everything is parsed. # We need to know the length of the longest string to make Markdown tables, so we just store these off until everything is parsed.
push @params, $arg; $params{$arg} = $desc;
push @params, $desc; push @paramsorder, $arg;
} elsif ($l =~ /\A\\r(eturns?)\s+(.*)\Z/) { } elsif ($l =~ /\A\\r(eturns?)\s+(.*)\Z/) {
# !!! FIXME: complain if this isn't a function or macro.
my $retstr = "R$1"; # "Return" or "Returns" my $retstr = "R$1"; # "Return" or "Returns"
my $desc = $2; my $desc = $2;
while (@doxygenlines) { while (@doxygenlines) {
@ -1752,7 +1866,20 @@ if ($copy_direction == 1) { # --copy-to-headers
} }
} }
$desc =~ s/[\s\n]+\Z//ms; $desc =~ s/[\s\n]+\Z//ms;
$sections{'Return Value'} = wordwrap("$retstr " . wikify($wikitype, $desc)) . "\n";
# Make sure the \returns info is valid.
my $rettype = $headersymsrettype{$sym};
die("Don't have a rettype for '$sym' for some reason!") if (($symtype == 1) && (not defined($rettype)));
if (defined($sections{'Return Value'})) {
print STDERR "WARNING: Symbol '$sym' has multiple '\\return' declarations! Only keeping the first one!\n";
} elsif (($symtype != 1) && ($symtype != 2) && ($symtype != 5)) { # !!! FIXME: if 5, make sure it's a function pointer typedef!
print STDERR "WARNING: Symbol '$sym' has a '\\return' declaration but isn't a function or macro! Removing it!\n";
} elsif (($symtype == 1) && ($headersymsrettype{$sym} eq 'void')) {
print STDERR "WARNING: Function '$sym' has a '\\returns' declaration but function returns void! Removing it!\n";
} else {
my $rettypestr = defined($rettype) ? ('(' . wikify($wikitype, $rettype) . ') ') : '';
$sections{'Return Value'} = wordwrap("$rettypestr$retstr ". wikify($wikitype, $desc)) . "\n";
}
} elsif ($l =~ /\A\\deprecated\s+(.*)\Z/) { } elsif ($l =~ /\A\\deprecated\s+(.*)\Z/) {
my $desc = $1; my $desc = $1;
while (@doxygenlines) { while (@doxygenlines) {
@ -1810,6 +1937,35 @@ if ($copy_direction == 1) { # --copy-to-headers
} }
} }
# Make sure %params is in the same order as the actual function signature and add C datatypes...
my $params_has_c_datatype = 0;
my @final_params = ();
if (($symtype == 1) && (defined($headersymsparaminfo{$sym}))) { # is a function and we have param info for it...
my $fnsigparams = $headersymsparaminfo{$sym};
for (my $i = 0; $i < scalar(@$fnsigparams); $i += 2) {
my $paramname = @$fnsigparams[$i];
my $paramdesc = $params{$paramname};
if (defined($paramdesc)) {
push @final_params, $paramname; # name
push @final_params, @$fnsigparams[$i+1]; # C datatype
push @final_params, $paramdesc; # description
$params_has_c_datatype = 1 if (defined(@$fnsigparams[$i+1]));
} else {
print STDERR "WARNING: Symbol '$sym' is missing a '\\param $paramname' declaration!\n";
}
}
} else {
foreach (@paramsorder) {
my $paramname = $_;
my $paramdesc = $params{$paramname};
if (defined($paramdesc)) {
push @final_params, $_;
push @final_params, undef;
push @final_params, $paramdesc;
}
}
}
my $hfiletext = $wikiheaderfiletext; my $hfiletext = $wikiheaderfiletext;
$hfiletext =~ s/\%fname\%/$headersymslocation{$sym}/g; $hfiletext =~ s/\%fname\%/$headersymslocation{$sym}/g;
$sections{'Header File'} = "$hfiletext\n"; $sections{'Header File'} = "$hfiletext\n";
@ -1840,26 +1996,36 @@ if ($copy_direction == 1) { # --copy-to-headers
} }
# We can build the wiki table now that we have all the data. # We can build the wiki table now that we have all the data.
if (scalar(@params) > 0) { if (scalar(@final_params) > 0) {
my $str = ''; my $str = '';
if ($wikitype eq 'mediawiki') { if ($wikitype eq 'mediawiki') {
while (scalar(@params) > 0) { while (scalar(@final_params) > 0) {
my $arg = shift @params; my $arg = shift @final_params;
my $desc = wikify($wikitype, shift @params); my $c_datatype = shift @final_params;
my $desc = wikify($wikitype, shift @final_params);
$c_datatype = '' if not defined $c_datatype;
$str .= ($str eq '') ? "{|\n" : "|-\n"; $str .= ($str eq '') ? "{|\n" : "|-\n";
$str .= "|$c_datatype\n" if $params_has_c_datatype;
$str .= "|'''$arg'''\n"; $str .= "|'''$arg'''\n";
$str .= "|$desc\n"; $str .= "|$desc\n";
} }
$str .= "|}\n"; $str .= "|}\n";
} elsif ($wikitype eq 'md') { } elsif ($wikitype eq 'md') {
my $longest_arg = 0; my $longest_arg = 0;
my $longest_c_datatype = 0;
my $longest_desc = 0; my $longest_desc = 0;
my $which = 0; my $which = 0;
foreach (@params) { foreach (@final_params) {
if ($which == 0) { if ($which == 0) {
my $len = length($_) + 4; my $len = length($_);
$longest_arg = $len if ($len > $longest_arg); $longest_arg = $len if ($len > $longest_arg);
$which = 1; $which = 1;
} elsif ($which == 1) {
if (defined($_)) {
my $len = length(wikify($wikitype, $_));
$longest_c_datatype = $len if ($len > $longest_c_datatype);
}
$which = 2;
} else { } else {
my $len = length(wikify($wikitype, $_)); my $len = length(wikify($wikitype, $_));
$longest_desc = $len if ($len > $longest_desc); $longest_desc = $len if ($len > $longest_desc);
@ -1868,13 +2034,22 @@ if ($copy_direction == 1) { # --copy-to-headers
} }
# Markdown tables are sort of obnoxious. # Markdown tables are sort of obnoxious.
$str .= '| ' . (' ' x ($longest_arg+4)) . ' | ' . (' ' x $longest_desc) . " |\n"; my $c_datatype_cell;
$str .= '| ' . ('-' x ($longest_arg+4)) . ' | ' . ('-' x $longest_desc) . " |\n"; $c_datatype_cell = ($longest_c_datatype > 0) ? ('| ' . (' ' x ($longest_c_datatype)) . ' ') : '';
$str .= $c_datatype_cell . '| ' . (' ' x ($longest_arg+4)) . ' | ' . (' ' x $longest_desc) . " |\n";
$c_datatype_cell = ($longest_c_datatype > 0) ? ('| ' . ('-' x ($longest_c_datatype)) . ' ') : '';
$str .= $c_datatype_cell . '| ' . ('-' x ($longest_arg+4)) . ' | ' . ('-' x $longest_desc) . " |\n";
while (@params) { while (@final_params) {
my $arg = shift @params; my $arg = shift @final_params;
my $desc = wikify($wikitype, shift @params); my $c_datatype = shift @final_params;
$str .= "| **$arg** " . (' ' x ($longest_arg - length($arg))) . "| $desc" . (' ' x ($longest_desc - length($desc))) . " |\n"; $c_datatype_cell = '';
if ($params_has_c_datatype) {
$c_datatype = defined($c_datatype) ? wikify($wikitype, $c_datatype) : '';
$c_datatype_cell = ($longest_c_datatype > 0) ? ("| $c_datatype " . (' ' x ($longest_c_datatype - length($c_datatype)))) : '';
}
my $desc = wikify($wikitype, shift @final_params);
$str .= $c_datatype_cell . "| **$arg** " . (' ' x ($longest_arg - length($arg))) . "| $desc" . (' ' x ($longest_desc - length($desc))) . " |\n";
} }
} else { } else {
die("Unexpected wikitype!"); # should have checked this elsewhere. die("Unexpected wikitype!"); # should have checked this elsewhere.
@ -2311,16 +2486,27 @@ __EOF__
if ($wikitype eq 'mediawiki') { if ($wikitype eq 'mediawiki') {
die("Unexpected data parsing MediaWiki table") if (shift @lines ne '{|'); # Dump the '{|' start die("Unexpected data parsing MediaWiki table") if (shift @lines ne '{|'); # Dump the '{|' start
while (scalar(@lines) >= 3) { while (scalar(@lines) >= 3) {
my $c_datatype = shift @lines;
my $name = shift @lines; my $name = shift @lines;
my $desc = shift @lines; my $desc = shift @lines;
my $terminator = shift @lines; # the '|-' or '|}' line. my $terminator; # the '|-' or '|}' line.
if (($desc eq '|-') or ($desc eq '|}') or (not $desc =~ /\A\|/)) { # we seem to be out of cells, which means there was no datatype column on this one.
$terminator = $desc;
$desc = $name;
$name = $c_datatype;
$c_datatype = '';
} else {
$terminator = shift @lines;
}
last if ($terminator ne '|-') and ($terminator ne '|}'); # we seem to have run out of table. last if ($terminator ne '|-') and ($terminator ne '|}'); # we seem to have run out of table.
$name =~ s/\A\|\s*//; $name =~ s/\A\|\s*//;
$name =~ s/\A\*\*(.*?)\*\*/$1/; $name =~ s/\A\*\*(.*?)\*\*/$1/;
$name =~ s/\A\'\'\'(.*?)\'\'\'/$1/; $name =~ s/\A\'\'\'(.*?)\'\'\'/$1/;
$desc =~ s/\A\|\s*//; $desc =~ s/\A\|\s*//;
$desc = dewikify($wikitype, $desc); $desc = dewikify($wikitype, $desc);
#print STDERR "FN: $sym NAME: $name DESC: $desc TERM: $terminator\n"; #print STDERR "SYM: $sym CDATATYPE: $c_datatype NAME: $name DESC: $desc TERM: $terminator\n";
$str .= ".TP\n"; $str .= ".TP\n";
$str .= ".I $name\n"; $str .= ".I $name\n";
@ -2329,14 +2515,24 @@ __EOF__
} elsif ($wikitype eq 'md') { } elsif ($wikitype eq 'md') {
my $l; my $l;
$l = shift @lines; $l = shift @lines;
die("Unexpected data parsing Markdown table") if (not $l =~ /\A\s*\|\s*\|\s*\|\s*\Z/); die("Unexpected data parsing Markdown table") if (not $l =~ /\A(\s*\|)?\s*\|\s*\|\s*\|\s*\Z/);
$l = shift @lines; $l = shift @lines;
die("Unexpected data parsing Markdown table") if (not $l =~ /\A\s*\|\s*\-*\s*\|\s*\-*\s*\|\s*\Z/); die("Unexpected data parsing Markdown table") if (not $l =~ /\A\s*(\|\s*\-*\s*)?\|\s*\-*\s*\|\s*\-*\s*\|\s*\Z/);
while (scalar(@lines) >= 1) { while (scalar(@lines) >= 1) {
$l = shift @lines; $l = shift @lines;
if ($l =~ /\A\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\|\s*\Z/) { my $name;
my $name = $1; my $desc;
my $desc = $2; if ($l =~ /\A\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\|\s*\Z/) {
# c datatype is $1, but we don't care about it here.
$name = $2;
$desc = $3;
} elsif ($l =~ /\A\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\|\s*\Z/) {
$name = $1;
$desc = $2;
} else {
last; # we seem to have run out of table.
}
$name =~ s/\A\*\*(.*?)\*\*/$1/; $name =~ s/\A\*\*(.*?)\*\*/$1/;
$name =~ s/\A\'\'\'(.*?)\'\'\'/$1/; $name =~ s/\A\'\'\'(.*?)\'\'\'/$1/;
$desc = dewikify($wikitype, $desc); $desc = dewikify($wikitype, $desc);
@ -2344,9 +2540,6 @@ __EOF__
$str .= ".TP\n"; $str .= ".TP\n";
$str .= ".I $name\n"; $str .= ".I $name\n";
$str .= "$desc\n"; $str .= "$desc\n";
} else {
last; # we seem to have run out of table.
}
} }
} else { } else {
die("write me"); die("write me");
@ -2354,8 +2547,10 @@ __EOF__
} }
if (defined $returns) { if (defined $returns) {
$returns = dewikify($wikitype, $returns);
$returns =~ s/\A\(.*?\)\s*//; # Chop datatype in parentheses off the front.
$str .= ".SH RETURN VALUE\n"; $str .= ".SH RETURN VALUE\n";
$str .= dewikify($wikitype, $returns) . "\n"; $str .= "$returns\n";
} }
if (defined $examples) { if (defined $examples) {
@ -2626,6 +2821,7 @@ __EOF__
$str .= " \\begin{tabular}{ | l | p{0.75\\textwidth} |}\n"; $str .= " \\begin{tabular}{ | l | p{0.75\\textwidth} |}\n";
$str .= " \\hline\n"; $str .= " \\hline\n";
# !!! FIXME: this table parsing has gotten complicated and is pasted three times in this file; move it to a subroutine!
my @lines = split /\n/, $params; my @lines = split /\n/, $params;
if ($wikitype eq 'mediawiki') { if ($wikitype eq 'mediawiki') {
die("Unexpected data parsing MediaWiki table") if (shift @lines ne '{|'); # Dump the '{|' start die("Unexpected data parsing MediaWiki table") if (shift @lines ne '{|'); # Dump the '{|' start
@ -2646,22 +2842,29 @@ __EOF__
} elsif ($wikitype eq 'md') { } elsif ($wikitype eq 'md') {
my $l; my $l;
$l = shift @lines; $l = shift @lines;
die("Unexpected data parsing Markdown table") if (not $l =~ /\A\s*\|\s*\|\s*\|\s*\Z/); die("Unexpected data parsing Markdown table") if (not $l =~ /\A(\s*\|)?\s*\|\s*\|\s*\|\s*\Z/);
$l = shift @lines; $l = shift @lines;
die("Unexpected data parsing Markdown table") if (not $l =~ /\A\s*\|\s*\-*\s*\|\s*\-*\s*\|\s*\Z/); die("Unexpected data parsing Markdown table") if (not $l =~ /\A\s*(\|\s*\-*\s*)?\|\s*\-*\s*\|\s*\-*\s*\|\s*\Z/);
while (scalar(@lines) >= 1) { while (scalar(@lines) >= 1) {
$l = shift @lines; $l = shift @lines;
if ($l =~ /\A\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\|\s*\Z/) { my $name;
my $name = $1; my $desc;
my $desc = $2; if ($l =~ /\A\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\|\s*\Z/) {
# c datatype is $1, but we don't care about it here.
$name = $2;
$desc = $3;
} elsif ($l =~ /\A\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\|\s*\Z/) {
$name = $1;
$desc = $2;
} else {
last; # we seem to have run out of table.
}
$name =~ s/\A\*\*(.*?)\*\*/$1/; $name =~ s/\A\*\*(.*?)\*\*/$1/;
$name =~ s/\A\'\'\'(.*?)\'\'\'/$1/; $name =~ s/\A\'\'\'(.*?)\'\'\'/$1/;
$name = escLaTeX($name); $name = escLaTeX($name);
$desc = dewikify($wikitype, $desc); $desc = dewikify($wikitype, $desc);
$str .= " \\textbf{$name} & $desc \\\\ \\hline\n"; $str .= " \\textbf{$name} & $desc \\\\ \\hline\n";
} else {
last; # we seem to have run out of table.
}
} }
} else { } else {
die("write me"); die("write me");
@ -2672,8 +2875,10 @@ __EOF__
} }
if (defined $returns) { if (defined $returns) {
$returns = dewikify($wikitype, $returns);
$returns =~ s/\A\(.*?\)\s*//; # Chop datatype in parentheses off the front.
$str .= "\\subsection{Return Value}\n\n"; $str .= "\\subsection{Return Value}\n\n";
$str .= dewikify($wikitype, $returns) . "\n"; $str .= "$returns\n";
} }
if (defined $remarks) { if (defined $remarks) {

View file

@ -257,7 +257,7 @@ Game Center
Game Center integration might require that you break up your main loop in order to yield control back to the system. In other words, instead of running an endless main loop, you run each frame in a callback function, using: Game Center integration might require that you break up your main loop in order to yield control back to the system. In other words, instead of running an endless main loop, you run each frame in a callback function, using:
int SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, void (*callback)(void*), void *callbackParam); int SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, SDL_iOSAnimationCallback callback, void *callbackParam);
This will set up the given function to be called back on the animation callback, and then you have to return from main() to let the Cocoa event loop run. This will set up the given function to be called back on the animation callback, and then you have to return from main() to let the Cocoa event loop run.

View file

@ -232,7 +232,7 @@ extern DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open(unsigned short vendor_id,
* *
* \since This function is available since SDL 2.0.18. * \since This function is available since SDL 2.0.18.
*/ */
extern DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open_path(const char *path, int bExclusive /* = false */); extern DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open_path(const char *path, int bExclusive);
/** /**
* Write an Output report to a HID device. * Write an Output report to a HID device.

View file

@ -500,8 +500,9 @@ extern DECLSPEC int SDLCALL SDL_GetNumAllocations(void);
extern DECLSPEC char *SDLCALL SDL_getenv(const char *name); extern DECLSPEC char *SDLCALL SDL_getenv(const char *name);
extern DECLSPEC int SDLCALL SDL_setenv(const char *name, const char *value, int overwrite); extern DECLSPEC int SDLCALL SDL_setenv(const char *name, const char *value, int overwrite);
extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, int (SDLCALL *compare) (const void *, const void *)); typedef int (SDLCALL *SDL_CompareCallback)(const void *, const void *);
extern DECLSPEC void * SDLCALL SDL_bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (SDLCALL *compare) (const void *, const void *)); extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, SDL_CompareCallback compare);
extern DECLSPEC void * SDLCALL SDL_bsearch(const void *key, const void *base, size_t nmemb, size_t size, SDL_CompareCallback compare);
extern DECLSPEC int SDLCALL SDL_abs(int x); extern DECLSPEC int SDLCALL SDL_abs(int x);

View file

@ -188,6 +188,8 @@ extern DECLSPEC int SDLCALL SDL_LinuxSetThreadPriorityAndPolicy(Sint64 threadID,
/* Platform specific functions for iOS */ /* Platform specific functions for iOS */
#ifdef __IPHONEOS__ #ifdef __IPHONEOS__
typedef void (SDLCALL *SDL_iOSAnimationCallback)(void*);
/** /**
* Use this function to set the animation callback on Apple iOS. * Use this function to set the animation callback on Apple iOS.
* *
@ -220,7 +222,7 @@ extern DECLSPEC int SDLCALL SDL_LinuxSetThreadPriorityAndPolicy(Sint64 threadID,
* *
* \sa SDL_iPhoneSetEventPump * \sa SDL_iPhoneSetEventPump
*/ */
extern DECLSPEC int SDLCALL SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, void (SDLCALL *callback)(void*), void *callbackParam); extern DECLSPEC int SDLCALL SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, SDL_iOSAnimationCallback callback, void *callbackParam);
#define SDL_iOSSetAnimationCallback(window, interval, callback, callbackParam) SDL_iPhoneSetAnimationCallback(window, interval, callback, callbackParam) #define SDL_iOSSetAnimationCallback(window, interval, callback, callbackParam) SDL_iPhoneSetAnimationCallback(window, interval, callback, callbackParam)

View file

@ -423,6 +423,8 @@ extern DECLSPEC SDL_TLSID SDLCALL SDL_TLSCreate(void);
*/ */
extern DECLSPEC void * SDLCALL SDL_TLSGet(SDL_TLSID id); extern DECLSPEC void * SDLCALL SDL_TLSGet(SDL_TLSID id);
typedef void (SDLCALL *SDL_TLSDestructorCallback)(void*);
/** /**
* Set the current thread's value associated with a thread local storage ID. * Set the current thread's value associated with a thread local storage ID.
* *
@ -446,7 +448,7 @@ extern DECLSPEC void * SDLCALL SDL_TLSGet(SDL_TLSID id);
* \sa SDL_TLSCreate * \sa SDL_TLSCreate
* \sa SDL_TLSGet * \sa SDL_TLSGet
*/ */
extern DECLSPEC int SDLCALL SDL_TLSSet(SDL_TLSID id, const void *value, void (SDLCALL *destructor)(void*)); extern DECLSPEC int SDLCALL SDL_TLSSet(SDL_TLSID id, const void *value, SDL_TLSDestructorCallback destructor);
/** /**
* Cleanup all TLS data for this thread. * Cleanup all TLS data for this thread.

View file

@ -73,7 +73,7 @@ SDL_DYNAPI_PROC(IDirect3DDevice9*,SDL_RenderGetD3D9Device,(SDL_Renderer *a),(a),
#endif #endif
#ifdef __IPHONEOS__ #ifdef __IPHONEOS__
SDL_DYNAPI_PROC(int,SDL_iPhoneSetAnimationCallback,(SDL_Window *a, int b, void (SDLCALL *c)(void *), void *d),(a,b,c,d),return) SDL_DYNAPI_PROC(int,SDL_iPhoneSetAnimationCallback,(SDL_Window *a, int b, SDL_iOSAnimationCallback c, void *d),(a,b,c,d),return)
SDL_DYNAPI_PROC(void,SDL_iPhoneSetEventPump,(SDL_bool a),(a),) SDL_DYNAPI_PROC(void,SDL_iPhoneSetEventPump,(SDL_bool a),(a),)
#endif #endif
@ -411,7 +411,7 @@ SDL_DYNAPI_PROC(void*,SDL_realloc,(void *a, size_t b),(a,b),return)
SDL_DYNAPI_PROC(void,SDL_free,(void *a),(a),) SDL_DYNAPI_PROC(void,SDL_free,(void *a),(a),)
SDL_DYNAPI_PROC(char*,SDL_getenv,(const char *a),(a),return) SDL_DYNAPI_PROC(char*,SDL_getenv,(const char *a),(a),return)
SDL_DYNAPI_PROC(int,SDL_setenv,(const char *a, const char *b, int c),(a,b,c),return) SDL_DYNAPI_PROC(int,SDL_setenv,(const char *a, const char *b, int c),(a,b,c),return)
SDL_DYNAPI_PROC(void,SDL_qsort,(void *a, size_t b, size_t c, int (SDLCALL *d)(const void *, const void *)),(a,b,c,d),) SDL_DYNAPI_PROC(void,SDL_qsort,(void *a, size_t b, size_t c, SDL_CompareCallback d),(a,b,c,d),)
SDL_DYNAPI_PROC(int,SDL_abs,(int a),(a),return) SDL_DYNAPI_PROC(int,SDL_abs,(int a),(a),return)
SDL_DYNAPI_PROC(int,SDL_isdigit,(int a),(a),return) SDL_DYNAPI_PROC(int,SDL_isdigit,(int a),(a),return)
SDL_DYNAPI_PROC(int,SDL_isspace,(int a),(a),return) SDL_DYNAPI_PROC(int,SDL_isspace,(int a),(a),return)
@ -511,7 +511,7 @@ SDL_DYNAPI_PROC(void,SDL_WaitThread,(SDL_Thread *a, int *b),(a,b),)
SDL_DYNAPI_PROC(void,SDL_DetachThread,(SDL_Thread *a),(a),) SDL_DYNAPI_PROC(void,SDL_DetachThread,(SDL_Thread *a),(a),)
SDL_DYNAPI_PROC(SDL_TLSID,SDL_TLSCreate,(void),(),return) SDL_DYNAPI_PROC(SDL_TLSID,SDL_TLSCreate,(void),(),return)
SDL_DYNAPI_PROC(void*,SDL_TLSGet,(SDL_TLSID a),(a),return) SDL_DYNAPI_PROC(void*,SDL_TLSGet,(SDL_TLSID a),(a),return)
SDL_DYNAPI_PROC(int,SDL_TLSSet,(SDL_TLSID a, const void *b, void (SDLCALL *c)(void*)),(a,b,c),return) SDL_DYNAPI_PROC(int,SDL_TLSSet,(SDL_TLSID a, const void *b, SDL_TLSDestructorCallback c),(a,b,c),return)
SDL_DYNAPI_PROC(Uint32,SDL_GetTicks,(void),(),return) SDL_DYNAPI_PROC(Uint32,SDL_GetTicks,(void),(),return)
SDL_DYNAPI_PROC(Uint64,SDL_GetPerformanceCounter,(void),(),return) SDL_DYNAPI_PROC(Uint64,SDL_GetPerformanceCounter,(void),(),return)
SDL_DYNAPI_PROC(Uint64,SDL_GetPerformanceFrequency,(void),(),return) SDL_DYNAPI_PROC(Uint64,SDL_GetPerformanceFrequency,(void),(),return)
@ -939,7 +939,7 @@ SDL_DYNAPI_PROC(void,SDL_UnionFRect,(const SDL_FRect *a, const SDL_FRect *b, SDL
SDL_DYNAPI_PROC(SDL_bool,SDL_EncloseFPoints,(const SDL_FPoint *a, int b, const SDL_FRect *c, SDL_FRect *d),(a,b,c,d),return) SDL_DYNAPI_PROC(SDL_bool,SDL_EncloseFPoints,(const SDL_FPoint *a, int b, const SDL_FRect *c, SDL_FRect *d),(a,b,c,d),return)
SDL_DYNAPI_PROC(SDL_bool,SDL_IntersectFRectAndLine,(const SDL_FRect *a, float *b, float *c, float *d, float *e),(a,b,c,d,e),return) SDL_DYNAPI_PROC(SDL_bool,SDL_IntersectFRectAndLine,(const SDL_FRect *a, float *b, float *c, float *d, float *e),(a,b,c,d,e),return)
SDL_DYNAPI_PROC(SDL_Window*,SDL_RenderGetWindow,(SDL_Renderer *a),(a),return) SDL_DYNAPI_PROC(SDL_Window*,SDL_RenderGetWindow,(SDL_Renderer *a),(a),return)
SDL_DYNAPI_PROC(void*,SDL_bsearch,(const void *a, const void *b, size_t c, size_t d, int (SDLCALL *e)(const void *, const void *)),(a,b,c,d,e),return) SDL_DYNAPI_PROC(void*,SDL_bsearch,(const void *a, const void *b, size_t c, size_t d, SDL_CompareCallback e),(a,b,c,d,e),return)
SDL_DYNAPI_PROC(const char*,SDL_GameControllerPathForIndex,(int a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_GameControllerPathForIndex,(int a),(a),return)
SDL_DYNAPI_PROC(const char*,SDL_GameControllerPath,(SDL_GameController *a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_GameControllerPath,(SDL_GameController *a),(a),return)
SDL_DYNAPI_PROC(const char*,SDL_JoystickPathForIndex,(int a),(a),return) SDL_DYNAPI_PROC(const char*,SDL_JoystickPathForIndex,(int a),(a),return)

View file

@ -28,7 +28,7 @@
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#if defined(HAVE_QSORT) #if defined(HAVE_QSORT)
void SDL_qsort(void *base, size_t nmemb, size_t size, int (*compare) (const void *, const void *)) void SDL_qsort(void *base, size_t nmemb, size_t size, SDL_CompareCallback compare)
{ {
if (!base) { if (!base) {
return; return;
@ -522,8 +522,7 @@ fprintf(stderr, "after partitioning first=#%lu last=#%lu\n", (first-(char*)base)
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
extern void qsortG(void *base, size_t nmemb, size_t size, extern void qsortG(void *base, size_t nmemb, size_t size, SDL_CompareCallback compare) {
int (*compare)(const void *, const void *)) {
if (nmemb<=1) return; if (nmemb<=1) return;
if (((size_t)base|size)&(WORD_BYTES-1)) if (((size_t)base|size)&(WORD_BYTES-1))
@ -536,7 +535,7 @@ extern void qsortG(void *base, size_t nmemb, size_t size,
#endif /* HAVE_QSORT */ #endif /* HAVE_QSORT */
void *SDL_bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compare)(const void *, const void *)) void *SDL_bsearch(const void *key, const void *base, size_t nmemb, size_t size, SDL_CompareCallback compare)
{ {
#if defined(HAVE_BSEARCH) #if defined(HAVE_BSEARCH)
return bsearch(key, base, nmemb, size, compare); return bsearch(key, base, nmemb, size, compare);

View file

@ -45,7 +45,7 @@ void *SDL_TLSGet(SDL_TLSID id)
return storage->array[id - 1].data; return storage->array[id - 1].data;
} }
int SDL_TLSSet(SDL_TLSID id, const void *value, void(SDLCALL *destructor)(void *)) int SDL_TLSSet(SDL_TLSID id, const void *value, SDL_TLSDestructorCallback destructor)
{ {
SDL_TLSData *storage; SDL_TLSData *storage;

View file

@ -476,7 +476,7 @@ NSUInteger UIKit_GetSupportedOrientations(SDL_Window * window)
} }
#endif /* !TARGET_OS_TV */ #endif /* !TARGET_OS_TV */
int SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, void (*callback)(void*), void *callbackParam) int SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, SDL_iOSAnimationCallback callback, void *callbackParam)
{ {
if (!window || !window->driverdata) { if (!window || !window->driverdata) {
return SDL_SetError("Invalid window"); return SDL_SetError("Invalid window");