diff options
author | chai <chaifix@163.com> | 2019-05-11 22:54:56 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-05-11 22:54:56 +0800 |
commit | 9645be0af1b1d5cb0ad5892d5464e1b23c51b550 (patch) | |
tree | 129c716bed8e93312421c3adb2f8e7c4f811602d /source/3rd-party/SDL2/src/dynapi/gendynapi.pl |
Diffstat (limited to 'source/3rd-party/SDL2/src/dynapi/gendynapi.pl')
-rw-r--r-- | source/3rd-party/SDL2/src/dynapi/gendynapi.pl | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/source/3rd-party/SDL2/src/dynapi/gendynapi.pl b/source/3rd-party/SDL2/src/dynapi/gendynapi.pl new file mode 100644 index 0000000..721241b --- /dev/null +++ b/source/3rd-party/SDL2/src/dynapi/gendynapi.pl @@ -0,0 +1,141 @@ +#!/usr/bin/perl -w + +# Simple DirectMedia Layer +# Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org> +# +# 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 (hg 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 %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 (<SDL_DYNAPI_PROCS_H>) { + 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"); + +opendir(HEADERS, 'include') or die("Can't open include dir: $!\n"); +while (readdir(HEADERS)) { + next if not /\.h\Z/; + my $header = "include/$_"; + open(HEADER, '<', $header) or die("Can't open $header: $!\n"); + while (<HEADER>) { + chomp; + next if not /\A\s*extern\s+DECLSPEC/; + my $decl = "$_ "; + if (not $decl =~ /\)\s*;/) { + while (<HEADER>) { + 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+DECLSPEC\s+(const\s+|)(unsigned\s+|)(.*?)\s*(\*?)\s*SDLCALL\s+(.*?)\s*\((.*?)\);/) { + my $rc = "$1$2$3$4"; + my $fn = $5; + + next if $existing{$fn}; # already slotted into the jump table. + + my @params = split(',', $6); + + #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 $name = chr(ord('a') + $i); + if ($i > 0) { + $paramstr .= ', '; + $argstr .= ','; + } + my $spc = ($type =~ /\*\Z/) ? '' : ' '; + $paramstr .= "$type$spc$name"; + $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"; + } else { + print("Failed to parse decl [$decl]!\n"); + } + } + close(HEADER); +} +closedir(HEADERS); + +close(SDL_DYNAPI_PROCS_H); +close(SDL_DYNAPI_OVERRIDES_H); + +# vi: set ts=4 sw=4 expandtab: |