1 # Make prototypes from .c files
17 my $private_func_re = "^_";
24 getopts
('x:m:o:p:dqE:R:P:') || die "foo";
42 $private_func_re = $opt_R;
45 'multiline-proto' => 1,
47 'function-blocking' => 0,
48 'gnuc-attribute' => 1,
52 foreach $i (split(/,/, $opt_m)) {
54 $flags{"multiline-proto"} = 0;
56 $flags{"function-blocking"} = 0;
57 $flags{"gnuc-attribute"} = 0;
60 if(substr($i, 0, 3) eq "no-") {
61 $flags{substr($i, 3)} = 0;
72 open(EXP
, '<', $opt_x) || die "open ${opt_x}";
73 my $obj = JSON
->new->utf8->decode(<EXP
>);
76 foreach my $x (keys %$obj) {
77 if (defined $obj->{$x}->{"export"}) {
78 $exported{$x} = $obj->{$x};
80 if (defined $obj->{$x}->{"deprecated"}) {
81 $deprecated{$x} = $obj->{$x}->{"deprecated"};
87 print $brace, " ", $_ if($debug);
92 if ( s@
/\
*\
*(.*)@@
) { $comment = 1; $doxygen = 1; $funcdoc = $1;
93 } elsif ( s@
/\
*.*@@
) { $comment = 1;
94 } elsif ($comment && s@
.*\
*/@@
) { $comment = 0; $doxygen = 0;
95 } elsif ($doxygen) { $funcdoc .= $_; next;
96 } elsif ($comment) { next; }
101 if($if_0 && /^\#endif/) {
124 if(!/^static/ && !/^PRIVATE/){
126 if(m/(.*)(__attribute__\s?\(.*\))/) {
130 if(m/(.*)\s(\w+DEPRECATED_FUNCTION)\s?(\(.*\))(.*)/) {
131 $depfunction{$2} = 1;
135 if(m/(.*)\s(\w+DEPRECATED)(.*)/) {
139 if(m/(.*)\s(HEIMDAL_\w+_ATTRIBUTE)\s?(\(.*\))?(.*)/) {
147 while(s/\(([^()]*),(.*)\)/($1\$$2)/g){}
148 s/\<\s*void\s*\>/<>/;
149 # remove parameter names
150 if($opt_P eq "remove") {
151 s/(\s*)([a-zA-Z0-9_]+)([,>])/$3/g;
153 s/\(\*(\s*)([a-zA-Z0-9_]+)\)/(*)/g;
154 } elsif($opt_P eq "comment") {
155 s/([a-zA-Z0-9_]+)([,>])/\/\
*$1\
*\
/$2/g;
156 s/\(\*([a-zA-Z0-9_]+)\)/(*\/\
*$1\
*\
/)/g;
159 # add newlines before parameters
160 if($flags{"multiline-proto"}) {
167 # match function name
168 /([a-zA-Z0-9_]+)\s*\</;
177 # only add newline if more than one parameter
178 if($flags{"multiline-proto"} && /,/){
184 # insert newline before function name
185 if($flags{"multiline-proto"}) {
186 s/(.*)\s([a-zA-Z0-9_]+ \Q$LP\E)/$1\n$2/;
192 $documentation{$f} = $funcdoc;
195 if ($apple && exists $exported{$f}) {
196 $ios = $exported{$f}{ios
};
197 $ios = "NA" if (!defined $ios);
198 $mac = $exported{$f}{macos
};
199 $mac = "NA" if (!defined $mac);
200 die "$f neither" if ($mac eq "NA" and $ios eq "NA");
201 $_ = $_ . " __OSX_AVAILABLE_STARTING(__MAC_${mac}, __IPHONE_${ios})";
203 if (exists $deprecated{$f}) {
204 $_ = $_ . " GSSAPI_DEPRECATED_FUNCTION(\"$deprecated{$f}\")";
205 $depfunction{GSSAPI_DEPRECATED_FUNCTION
} = 1;
220 $line = $line . " " . $_;
224 die "reached end of code and still in doxygen comment" if ($doxygen);
225 die "reached end of code and still in comment" if ($comment);
237 open(OUT
, ">${opt_o}.new");
238 $block = &foo
($opt_o);
240 $block = "__public_h__";
244 open(PRIV
, ">${opt_p}.new");
245 $private = &foo
($opt_p);
247 $private = "__private_h__";
253 $public_h_header .= "/* This is a generated file */
259 $public_h_header .= "#ifdef __STDC__
272 $public_h_header .= "#include <stdarg.h>
276 $public_h_trailer = "";
278 $private_h_header = "/* This is a generated file */
284 $private_h_header .= "#ifdef __STDC__
297 $private_h_header .= "#include <stdarg.h>
301 $private_h_trailer = "";
304 foreach(sort keys %funcs){
305 if(/^(DllMain|main)$/) { next }
306 if ($funcs{$_} =~ /\^/) {
307 $beginblock = "#ifdef __BLOCKS__\n";
308 $endblock = "#endif /* __BLOCKS__ */\n";
310 $beginblock = $endblock = "";
312 # if we have an export table and doesn't have content, or matches private RE
313 if((scalar(keys(%exported)) ne 0 && !exists $exported{$_} ) || /$private_func_re/) {
314 $private_h .= $beginblock;
315 # if ($apple and not /$private_func_re/) {
316 # $private_h .= "#define $_ __ApplePrivate_${_}\n";
318 $private_h .= $funcs{$_} . "\n" ;
319 $private_h .= $endblock . "\n";
320 if($funcs{$_} =~ /__attribute__/) {
321 $private_attribute_seen = 1;
324 if($documentation{$_}) {
325 $public_h .= "/**\n";
326 $public_h .= "$documentation{$_}";
327 $public_h .= " */\n\n";
329 if($flags{"function-blocking"}) {
331 if($exported{$_} =~ /proto/) {
332 $public_h .= "#if !defined(HAVE_$fupper) || defined(NEED_${fupper}_PROTO)\n";
334 $public_h .= "#ifndef HAVE_$fupper\n";
337 $public_h .= $beginblock . $funcs{$_} . "\n" . $endblock;
338 if($funcs{$_} =~ /__attribute__/) {
339 $public_attribute_seen = 1;
341 if($flags{"function-blocking"}) {
342 $public_h .= "#endif\n";
348 if($flags{"gnuc-attribute"}) {
349 if ($public_attribute_seen) {
350 $public_h_header .= "#if !defined(__GNUC__) && !defined(__attribute__)
351 #define __attribute__(x)
357 if ($private_attribute_seen) {
358 $private_h_header .= "#if !defined(__GNUC__) && !defined(__attribute__)
359 #define __attribute__(x)
368 foreach (keys %depfunction) {
369 $depstr .= "#ifndef $_
370 #ifndef __has_extension
371 #define __has_extension(x) 0
372 #define ${_}has_extension 1
374 #if __has_extension(attribute_deprecated_with_message)
375 #define $_(x) __attribute__((__deprecated__(x)))
376 #elif defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1 )))
377 #define $_(X) __attribute__((__deprecated__))
381 #ifdef ${_}has_extension
382 #undef __has_extension
383 #undef ${_}has_extension
389 $public_h_trailer .= "#undef $_
392 $private_h_trailer .= "#undef $_
398 $public_h_header .= $depstr;
399 $private_h_header .= $depstr;
403 $public_h_header .= "#ifdef __cplusplus
408 $public_h_trailer = "#ifdef __cplusplus
412 " . $public_h_trailer;
416 $public_h_header .= "#ifndef $opt_E
417 #ifndef ${opt_E}_FUNCTION
419 #define ${opt_E}_FUNCTION __declspec(dllimport)
420 #define ${opt_E}_CALL __stdcall
421 #define ${opt_E}_VARIABLE __declspec(dllimport)
423 #define ${opt_E}_FUNCTION
424 #define ${opt_E}_CALL
425 #define ${opt_E}_VARIABLE
431 $private_h_header .= "#ifndef $opt_E
432 #ifndef ${opt_E}_FUNCTION
434 #define ${opt_E}_FUNCTION __declspec(dllimport)
435 #define ${opt_E}_CALL __stdcall
436 #define ${opt_E}_VARIABLE __declspec(dllimport)
438 #define ${opt_E}_FUNCTION
439 #define ${opt_E}_CALL
440 #define ${opt_E}_VARIABLE
448 $public_h_trailer .= $undepstr;
449 $private_h_trailer .= $undepstr;
451 if ($public_h ne "" && $flags{"header"}) {
452 $public_h = $public_h_header . $public_h .
453 $public_h_trailer . "#endif /* $block */\n";
455 if ($private_h ne "" && $flags{"header"}) {
456 $private_h = $private_h_header . $private_h .
457 $private_h_trailer . "#endif /* $private */\n";
464 print PRIV
$private_h;
472 if (compare
("${opt_o}.new", ${opt_o
}) != 0) {
473 printf("updating ${opt_o}\n");
474 rename("${opt_o}.new", ${opt_o
});
476 unlink("${opt_o}.new");
481 if (compare
("${opt_p}.new", ${opt_p
}) != 0) {
482 printf("updating ${opt_p}\n");
483 rename("${opt_p}.new", ${opt_p
});
485 unlink("${opt_p}.new");