2 #*****************************************************************************
3 #* vlc-api.pl: VLC API maintenance script
4 #*****************************************************************************
5 #* Copyright (C) 2005 the VideoLAN team
8 #* Authors: RĂ©mi Denis-Courmont <rem # videolan.org>
10 #* This program is free software; you can redistribute it and/or modify
11 #* it under the terms of the GNU General Public License as published by
12 #* the Free Software Foundation; either version 2 of the License, or
13 #* (at your option) any later version.
15 #* This program is distributed in the hope that it will be useful,
16 #* but WITHOUT ANY WARRANTY; without even the implied warranty of
17 #* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 #* GNU General Public License for more details.
20 #* You should have received a copy of the GNU General Public License
21 #* along with this program; if not, write to the Free Software
22 #* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
23 #*****************************************************************************/
27 my $srcdir = $ENV{'top_srcdir'};
30 # Reads to-be exported APIs
36 if (/VLC_EXPORT\(\s*(\w.*\S)\s*,\s*(\w*)\s*,\s*\(\s*(\w.*\S)\s*\)\s*\)[^)]*$/)
38 $new_APIs{$2} = [ ( $1, $3 ) ];
43 # Write header's header
45 open my $new_sym, '> vlc_symbols.h.new' or die "$!";
48 " * This file is automatically generated. DO NOT EDIT!\n".
49 " * You can force an update with \"make stamp-api\".\n".
52 "#ifndef __VLC_SYMBOLS_H\n".
53 "# define __VLC_SYMBOLS_H\n".
55 "# ifdef HAVE_SHARED_LIBVLC\n".
57 " * In an ideal world, plugins would include all the headers they need.\n".
58 " * But of course, many, if not all, of them don't, so we have to make sure\n".
59 " * the whole libvlc API is defined here in any case when included from a\n".
62 "# ifdef __PLUGIN__\n".
63 "# ifdef __cplusplus\n".
67 foreach (keys %new_APIs)
70 $new_APIs{$_}[0]." $_ (".$new_APIs{$_}[1].");\n";
74 "# ifdef __cplusplus\n".
77 "# endif /* __PLUGIN__ */\n".
78 "# else /* HAVE_LIBVLC_SHARED */\n".
80 " * This is the big VLC API structure for plugins :\n".
81 " * Changing its layout breaks plugin's binary compatibility,\n".
82 " * so DO NOT DO THAT.\n".
83 " * In case of conflict with SVN, add your uncommited APIs\n".
84 " * at the *end* of the structure so they don't mess the other's\n".
85 " * offset in the structure.\n".
87 "struct module_symbols_t\n".
93 # Compares new APIs with currently exported APIs
99 open my $oldfd, "< $srcdir/include/vlc_symbols.h";
103 if (/^struct module_symbols_t/)
110 elsif (/^ void \*(\w*)_deprecated;$/)
112 if (defined $new_APIs{$1})
114 print "[info] $1 was RESTORED!\n";
116 " ".$new_APIs{$1}[0]." (*$1_inner) (".$new_APIs{$1}[1].");\n";
117 delete $new_APIs{$1};
123 print { $new_sym } $_;
124 push (@deprecated_API, $1);
127 elsif (/^\s*(\w.*\S)\s*\(\*\s*(\w*)_inner\)\s*\(\s*(\w.*\S)\s*\)\s*;\s*$/)
129 if (!defined $new_APIs{$2})
131 print "[warn] $2 was REMOVED!\n";
132 print { $new_sym } " void *$2_deprecated;\n";
133 push (@deprecated_API, $2);
136 elsif (($new_APIs{$2}[0] ne $1)
137 || ($new_APIs{$2}[1] ne $3))
140 "[warn] $2 was CHANGED!\n".
141 " Old argument(s) : \"$3\"\n".
142 " New argument(s) : \"".$new_APIs{$2}[1]."\"\n".
143 " Old return type : \"$1\"\n".
144 " New return type : \"".$new_APIs{$2}[0]."\"\n";
147 " ".$new_APIs{$2}[0]." (*$2_inner) (".$new_APIs{$2}[1].");\n";
148 delete $new_APIs{$2};
154 print { $new_sym } " $1 (*$2_inner) ($3);\n";
156 delete $new_APIs{$2};
163 # Adds brand-new APIs
165 foreach (keys %new_APIs)
167 print "[info] $_ was ADDED!\n";
169 " ".$new_APIs{$_}[0]." (*${_}_inner) (".$new_APIs{$_}[1].");\n";
179 "# if defined (__PLUGIN__)\n";
183 print { $new_sym } "# define $_ (p_symbols)->${_}_inner\n";
187 "# elif defined (HAVE_DYNAMIC_PLUGINS) && !defined (__BUILTIN__)\n".
188 "/******************************************************************\n".
189 " * STORE_SYMBOLS: store VLC APIs into p_symbols for plugin access.\n".
190 " ******************************************************************/\n".
191 "# define STORE_SYMBOLS( p_symbols ) \\\n";
195 print { $new_sym } " ((p_symbols)->${_}_inner) = $_; \\\n";
197 foreach (@deprecated_API)
199 print { $new_sym } " (p_symbols)->${_}_deprecated = NULL; \\\n";
204 "# endif /* __PLUGIN__ */\n".
205 "# endif /* HAVE_SHARED_LIBVLC */\n".
206 "#endif /* __VLC_SYMBOLS_H */\n";
210 # Replace headers if needed
214 rename 'vlc_symbols.h.new', "$srcdir/include/vlc_symbols.h";
215 print "$changes API(s) changed.\n";
219 unlink 'vlc_symbols.h.new';