make-proto.pl revision 55682
11553Srgrimes# Make prototypes from .c files 21553Srgrimes# $Id: make-proto.pl,v 1.11 1999/04/15 12:37:54 joda Exp $ 31553Srgrimes 41863Swollman##use Getopt::Std; 51553Srgrimesrequire 'getopts.pl'; 61553Srgrimes 7$brace = 0; 8$line = ""; 9$debug = 0; 10 11do Getopts('o:p:d') || die "foo"; 12 13if($opt_d) { 14 $debug = 1; 15} 16 17while(<>) { 18 print $brace, " ", $_ if($debug); 19 if(/^\#if 0/) { 20 $if_0 = 1; 21 } 22 if($if_0 && /^\#endif/) { 23 $if_0 = 0; 24 } 25 if($if_0) { next } 26 if(/^\s*\#/) { 27 next; 28 } 29 if(/^\s*$/) { 30 $line = ""; 31 next; 32 } 33 if(/\{/){ 34 $_ = $line; 35 while(s/\*\//\ca/){ 36 s/\/\*(.|\n)*\ca//; 37 } 38 s/^\s*//; 39 s/\s$//; 40 s/\s+/ /g; 41 if($line =~ /\)\s$/){ 42 if(!/^static/ && !/^PRIVATE/){ 43 if(/(.*)(__attribute__\s?\(.*\))/) { 44 $attr = $2; 45 $_ = $1; 46 } else { 47 $attr = ""; 48 } 49 # remove outer () 50 s/\s*\(/@/; 51 s/\)\s?$/@/; 52 # remove , within () 53 while(s/\(([^()]*),(.*)\)/($1\$$2)/g){} 54 s/,\s*/,\n\t/g; 55 # fix removed , 56 s/\$/,/g; 57 # match function name 58 /([a-zA-Z0-9_]+)\s*@/; 59 $f = $1; 60 # only add newline if more than one parameter 61 $LP = "(("; # XXX workaround for indentation bug in emacs 62 $RP = "))"; 63 $P = "__P(("; 64 if(/,/){ 65 s/@/ __P$LP\n\t/; 66 }else{ 67 s/@/ __P$LP/; 68 } 69 s/@/$RP/; 70 # insert newline before function name 71 s/(.*)\s([a-zA-Z0-9_]+ __P)/$1\n$2/; 72 if($attr ne "") { 73 $_ .= "\n $attr"; 74 } 75 $_ = $_ . ";"; 76 $funcs{$f} = $_; 77 } 78 } 79 $line = ""; 80 $brace++; 81 } 82 if(/\}/){ 83 $brace--; 84 } 85 if(/^\}/){ 86 $brace = 0; 87 } 88 if($brace == 0) { 89 $line = $line . " " . $_; 90 } 91} 92 93sub foo { 94 local ($arg) = @_; 95 $_ = $arg; 96 s/.*\/([^\/]*)/$1/; 97 s/[^a-zA-Z0-9]/_/g; 98 "__" . $_ . "__"; 99} 100 101if($opt_o) { 102 open(OUT, ">$opt_o"); 103 $block = &foo($opt_o); 104} else { 105 $block = "__public_h__"; 106} 107 108if($opt_p) { 109 open(PRIV, ">$opt_p"); 110 $private = &foo($opt_p); 111} else { 112 $private = "__private_h__"; 113} 114 115$public_h = ""; 116$private_h = ""; 117 118$public_h_header = "/* This is a generated file */ 119#ifndef $block 120#define $block 121 122#ifdef __STDC__ 123#include <stdarg.h> 124#ifndef __P 125#define __P(x) x 126#endif 127#else 128#ifndef __P 129#define __P(x) () 130#endif 131#endif 132 133"; 134 135$private_h_header = "/* This is a generated file */ 136#ifndef $private 137#define $private 138 139#ifdef __STDC__ 140#include <stdarg.h> 141#ifndef __P 142#define __P(x) x 143#endif 144#else 145#ifndef __P 146#define __P(x) () 147#endif 148#endif 149 150"; 151 152foreach(sort keys %funcs){ 153 if(/^(main)$/) { next } 154 if(/^_/) { 155 $private_h .= $funcs{$_} . "\n\n"; 156 if($funcs{$_} =~ /__attribute__/) { 157 $private_attribute_seen = 1; 158 } 159 } else { 160 $public_h .= $funcs{$_} . "\n\n"; 161 if($funcs{$_} =~ /__attribute__/) { 162 $public_attribute_seen = 1; 163 } 164 } 165} 166 167if ($public_attribute_seen) { 168 $public_h_header .= "#if !defined(__GNUC__) && !defined(__attribute__) 169#define __attribute__(x) 170#endif 171 172"; 173} 174 175if ($private_attribute_seen) { 176 $private_h_header .= "#if !defined(__GNUC__) && !defined(__attribute__) 177#define __attribute__(x) 178#endif 179 180"; 181} 182 183 184if ($public_h ne "") { 185 $public_h = $public_h_header . $public_h . "#endif /* $block */\n"; 186} 187if ($private_h ne "") { 188 $private_h = $private_h_header . $private_h . "#endif /* $private */\n"; 189} 190 191if($opt_o) { 192 print OUT $public_h; 193} 194if($opt_p) { 195 print PRIV $private_h; 196} 197 198close OUT; 199close PRIV; 200