#!/usr/bin/perl -w # Simple DirectMedia Layer # Copyright (C) 1997-2022 Sam Lantinga # # This software is provided 'as-is', without any express or implied # warranty. In no event will the authors be held liable for any damages # arising from the use of this software. # # Permission is granted to anyone to use this software for any purpose, # including commercial applications, and to alter it and redistribute it # freely, subject to the following restrictions: # # 1. The origin of this software must not be misrepresented; you must not # claim that you wrote the original software. If you use this software # in a product, an acknowledgment in the product documentation would be # appreciated but is not required. # 2. Altered source versions must be plainly marked as such, and must not be # misrepresented as being the original software. # 3. This notice may not be removed or altered from any source distribution. # WHAT IS THIS? # When you add a public API to SDL, please run this script, make sure the # output looks sane (git diff, it adds to existing files), and commit it. # It keeps the dynamic API jump table operating correctly. # If you wanted this to be readable, you shouldn't have used perl. use warnings; use strict; use File::Basename; chdir(dirname(__FILE__) . '/../..'); my $sdl_dynapi_procs_h = "src/dynapi/SDL_dynapi_procs.h"; my $sdl_dynapi_overrides_h = "src/dynapi/SDL_dynapi_overrides.h"; my $sdl2_exports = "src/dynapi/SDL2.exports"; my %existing = (); if (-f $sdl_dynapi_procs_h) { open(SDL_DYNAPI_PROCS_H, '<', $sdl_dynapi_procs_h) or die("Can't open $sdl_dynapi_procs_h: $!\n"); while () { if (/\ASDL_DYNAPI_PROC\(.*?,(.*?),/) { $existing{$1} = 1; } } close(SDL_DYNAPI_PROCS_H) } open(SDL_DYNAPI_PROCS_H, '>>', $sdl_dynapi_procs_h) or die("Can't open $sdl_dynapi_procs_h: $!\n"); open(SDL_DYNAPI_OVERRIDES_H, '>>', $sdl_dynapi_overrides_h) or die("Can't open $sdl_dynapi_overrides_h: $!\n"); open(SDL2_EXPORTS, '>>', $sdl2_exports) or die("Can't open $sdl2_exports: $!\n"); opendir(HEADERS, 'include') or die("Can't open include dir: $!\n"); while (my $d = readdir(HEADERS)) { next if not $d =~ /\.h\Z/; my $header = "include/$d"; open(HEADER, '<', $header) or die("Can't open $header: $!\n"); while (
) { chomp; next if not /\A\s*extern\s+(SDL_DEPRECATED\s+|)DECLSPEC/; my $decl = "$_ "; if (not $decl =~ /\)\s*;/) { while (
) { chomp; s/\A\s+//; s/\s+\Z//; $decl .= "$_ "; last if /\)\s*;/; } } $decl =~ s/\s+\Z//; #print("DECL: [$decl]\n"); 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(',', $7); #print("rc == '$rc', fn == '$fn', params == '$params'\n"); my $retstr = ($rc eq 'void') ? '' : 'return'; my $paramstr = '('; my $argstr = '('; my $i = 0; foreach (@params) { my $str = $_; $str =~ s/\A\s+//; $str =~ s/\s+\Z//; #print("1PARAM: $str\n"); if ($str eq 'void') { $paramstr .= 'void'; } elsif ($str eq '...') { if ($i > 0) { $paramstr .= ', '; } $paramstr .= $str; } elsif ($str =~ /\A\s*((const\s+|)(unsigned\s+|)([a-zA-Z0-9_]*)\s*([\*\s]*))\s*(.*?)\Z/) { #print("PARSED: [$1], [$2], [$3], [$4], [$5]\n"); my $type = $1; my $var = $6; $type =~ s/\A\s+//; $type =~ s/\s+\Z//; $var =~ s/\A\s+//; $var =~ s/\s+\Z//; $type =~ s/\s*\*\Z/*/g; $type =~ s/\s*(\*+)\Z/ $1/; #print("SPLIT: ($type, $var)\n"); my $var_array_suffix = ""; # parse array suffix if ($var =~ /\A.*(\[.*\])\Z/) { #print("PARSED ARRAY SUFFIX: [$1] of '$var'\n"); $var_array_suffix = $1; } my $name = chr(ord('a') + $i); if ($i > 0) { $paramstr .= ', '; $argstr .= ','; } my $spc = ($type =~ /\*\Z/) ? '' : ' '; $paramstr .= "$type$spc$name$var_array_suffix"; $argstr .= "$name"; } $i++; } $paramstr = '(void' if ($i == 0); # Just to make this consistent. $paramstr .= ')'; $argstr .= ')'; print("NEW: $decl\n"); print SDL_DYNAPI_PROCS_H "SDL_DYNAPI_PROC($rc,$fn,$paramstr,$argstr,$retstr)\n"; print SDL_DYNAPI_OVERRIDES_H "#define $fn ${fn}_REAL\n"; print SDL2_EXPORTS "++'_${fn}'.'SDL2.dll'.'${fn}'\n"; } else { print("Failed to parse decl [$decl]!\n"); } } close(HEADER); } closedir(HEADERS); close(SDL_DYNAPI_PROCS_H); close(SDL_DYNAPI_OVERRIDES_H); close(SDL2_EXPORTS); # vi: set ts=4 sw=4 expandtab: