cApiBuilder
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:14k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #!/usr/bin/perl
  2. # ====================================================================
  3. # The Vovida Software License, Version 1.0 
  4. # Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5. # Redistribution and use in source and binary forms, with or without
  6. # modification, are permitted provided that the following conditions
  7. # are met:
  8. # 1. Redistributions of source code must retain the above copyright
  9. #    notice, this list of conditions and the following disclaimer.
  10. # 2. Redistributions in binary form must reproduce the above copyright
  11. #    notice, this list of conditions and the following disclaimer in
  12. #    the documentation and/or other materials provided with the
  13. #    distribution.
  14. # 3. The names "VOCAL", "Vovida Open Communication Application Library",
  15. #    and "Vovida Open Communication Application Library (VOCAL)" must
  16. #    not be used to endorse or promote products derived from this
  17. #    software without prior written permission. For written
  18. #    permission, please contact vocal@vovida.org.
  19. # 4. Products derived from this software may not be called "VOCAL", nor
  20. #    may "VOCAL" appear in their name, without prior written
  21. #    permission of Vovida Networks, Inc.
  22. # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  23. # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  24. # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  25. # NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  26. # NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  27. # IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  28. # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  29. # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  30. # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  31. # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  32. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  33. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  34. # DAMAGE.
  35. # ====================================================================
  36. # This software consists of voluntary contributions made by Vovida
  37. # Networks, Inc. and many individuals on behalf of Vovida Networks,
  38. # Inc.  For more information on Vovida Networks, Inc., please see
  39. # <http://www.vovida.org/>.
  40. #  $Id: cApiBuilder,v 1.11 2000/08/12 01:24:57 bogawa Exp $
  41. use strict 'subs';
  42. #use strict 'getopts.pl';
  43. @functions = ( ); # main data structure that holds all info about all functions
  44. $doCode = 1; # flag to generate CXX file, otherwise do header file 
  45. @inclues = {}; # holds allfiles to be included in generated output 
  46. # parse the heasder information
  47. for $arg ( @ARGV ) {
  48.   &debug(" arg=",$arg,"n");
  49.   
  50.   if ( $arg =~ /^-c/ ) { 
  51.     $doCode = 1; 
  52.   }
  53.   
  54.   if ( $arg =~ /^-h/ ) { 
  55.     $doCode = 0; 
  56.   }
  57.   if ( $arg =~ /^-d/ ) { 
  58.     $debugCode = 1; 
  59.   }
  60.   
  61.   if ( $arg =~ /^-i/ ) { 
  62.     # an file to include 
  63.     $arg =~ s/^-i//;
  64.     push @includes, $arg;
  65.   }
  66. }
  67. #generate the file header info 
  68. print <<EOP;
  69. /* 
  70.     This file was generated using cApiBuilder.  This filemust be
  71.     considered a derivative work of the files from which this file was
  72.     generated.
  73. */
  74. EOP
  75. # parse the input file 
  76. while ( <STDIN> ) {
  77.   # still need to deal with C style comments 
  78.   if ( s/^#include/#include/g > 0 ) {
  79.     print $_ if $doCode;
  80.   } 
  81.   else {
  82.     chomp;
  83.     $ignore = 1 if(/// API:ignore begin/) ;
  84.     $ignore = 0 if(/// API:ignore end/) ;
  85.     next if($ignore);
  86.     s/:/ : /g;
  87.     s/,/ , /g;
  88.     s/(/ ( /g;
  89.     s/)/ ) /g;
  90.     s/{/ { /g;
  91.     s/}/ } /g;
  92.     s/;/ ; /g;
  93.     s///.*$/ /g;
  94.     s/#.*$/ /g;
  95.     s/^t/ /g;
  96.     s/const/ /g;
  97.     s/virtual/ /g;
  98.     
  99.     $data .= $_ . " ";
  100.   }
  101. }
  102. # remvoe C Style comments
  103. $data =~ s//*.*?*///gm; 
  104. # tokenize the data
  105. @data = split( " " , $data );
  106. $inClass = 0;
  107. $inPublic = 0;
  108. for( $i=0; $i < $#data; $i++ ) {
  109.   if ( $data[$i] eq "class" ) {
  110.     $className = $data[$i+1];
  111.     if ( $data[$i+2] ne ";" ) {
  112.       while ( $data[$i] ne "{" ) { $i++; } 
  113.       $i++;
  114.       $inClass = 1;
  115.       $inPublic = 0;
  116.       &debug("# in class " , $className , "n");
  117.     }
  118.   }
  119.    
  120.   if ( $data[$i] eq "}" ) {
  121.     $inClass = 0;
  122.   }
  123.   if ( ($data[$i] eq "public") and $inClass ) {
  124.     while ( $data[$i] ne ":" ) { $i++; } 
  125.     $i++;
  126.     $inPublic = 1;
  127.     &debug("# in public of " , $className , "n");
  128.   }
  129.   if ( ($data[$i] eq "private") or ($data[$i] eq "protected") ) {
  130.     while ( $data[$i] ne ":" ) { $i++; } 
  131.     $i++;
  132.     $inPublic = 0;
  133.   }
  134.     
  135.   if ( ($data[$i] eq "(" ) and $inClass and $inPublic ) {
  136.     #found a function 
  137.     $functionName = $data[$i-1];
  138.     if ( $functionName eq $className ) {
  139.       $returnType = $className . "*";
  140.       $functionName = "constructor";
  141.     } 
  142.     elsif ( $functionName eq ( "~" . $className ) ) {
  143.       $returnType = "void";
  144.       $functionName = "destructor";
  145.     } 
  146.     else {
  147.       $staticFunction = ( $data[$i-3] eq "static");
  148.       $returnType = $data[$i-2];
  149.       $returnType = "int" if ($returnType eq ";");  
  150.       $returnType = "int" if ($returnType eq ":");  
  151.       $returnType = "int" if ($returnType eq "{");  
  152.     }
  153.     $i++;
  154.     $rec = { };
  155.     $rec->{name} = $functionName;
  156.     $rec->{isStatic} = $staticFunction;
  157.     $rec->{class} = $className;
  158.     $rec->{return} = $returnType;
  159.     &debug("#func ",$returnType," ",$className,"::",$functionName,"n");
  160.     $numParam = 0;
  161.     # get the parameters
  162.     PARAM: while ( 1 ) {
  163. last PARAM if ( $data[$i] eq ")" );
  164. #for ( $t=$i; $t<$i+3; $t++) { print "data[",$t,"]=",$data[$t],"n"; }
  165. $type = $data[$i];
  166. $name = $data[$i+1];
  167. $name =~ s/=.*//g; # kill default paramters
  168. &debug("#    param ",$numParam," ",$type," ",$name,"n");
  169. $rec->{"paramName",$numParam} = $name;
  170. $rec->{"paramType",$numParam} = $type;
  171. $numParam++;
  172. $rec->{numParam} = $numParam;
  173. $i = $i+2;
  174. &debug("data is ",$data[$i],"n");
  175. last PARAM if ( $data[$i] eq ")" );
  176. if ( $data[$i] eq "," ) {
  177.   $i++;
  178.   next PARAM;
  179. }
  180. print STDERR "VERY CONFUSEDn";
  181. print "VERY CONFUSEDn";
  182. for ( $j = $i-10; $j < $i+10; $j++ ) {
  183.   print $data[$j]," ";
  184. }
  185. print "n";
  186. last PARAM;
  187.       }
  188.     push @functions, $rec;
  189.     # eat rest of function
  190.     INLINEFUNC: while ( ($data[$i] ne ";") ) {
  191. if (($data[$i] eq "{") ) {
  192.   #Deal with inline function
  193.   $i++;
  194.   $depth = 1;
  195.   while ( $depth > 0 ) {
  196.     $depth++ if ($data[$i] eq "{");
  197.     $depth-- if ($data[$i] eq "}");
  198.     $i++;
  199.   }
  200.   
  201.   last INLINEFUNC;
  202. }
  203. $i++;
  204.       }
  205.   }    
  206.   &debug($i,": ",$data[$i] , "n");
  207. }
  208. # print the functions
  209. if (0) {
  210.   for $func ( @functions ) {
  211.     print "static " if $func->{isStatic};
  212.     print $func->{return}," ", $func->{class},"::",$func->{name},"(";
  213.     for( $t=0; $t < $func->{numParam}; $t++) {
  214.       print "," if ( $t != 0 );
  215.       print $func->{"paramType",$t}," ",$func->{"paramName",$t};
  216.     }
  217.     print ");n";
  218.   }
  219. }
  220. %definedTypes = ( "void" => 1, 
  221.   "bool" => 1,
  222.   "char" => 1,
  223.   "int" => 1,
  224.   "long" => 1,
  225.   "float" => 1,
  226.   "double" => 1,
  227.   "string" => 1,
  228.   "String" => 1,
  229.                   "RtpSeqNumber" => 1,
  230.                   "RtcpHeader" => 1,
  231.                   "RtcpReport" => 1,
  232.                   "RtcpSDESItem" => 1,
  233.                   "RtcpSDESType" => 1,
  234.                   "RtcpSender" => 1,
  235.                   "RtcpType" => 1,
  236.                   "RtpHeader" => 1,
  237.                   "RtpPayloadType" => 1,
  238.                   "RtpSource" => 1,
  239.                   "RtpTime" => 1,
  240.                   "RtpSrc" => 1,
  241.                   "u_int32_t" => 1
  242. );
  243. sub addType ( $ ) {
  244.   my $type = shift;
  245.   &debug("adding type ",$type," -> ",&mapTypeToC($type),"n");
  246.   $_ = $type;
  247.   s/&//g;
  248.   s/*//g;
  249.   $_ = "builtin" if ( $definedTypes{$_} );
  250.   $type = $_;
  251.   $types{$type} = $type unless ( $type eq "builtin" );
  252. }
  253. sub mapTypeToC ( $ ) {
  254.   $_ = shift;
  255.   s/string&/char*/g;
  256.   s/string/char*/g;
  257.   s/&/*/g;
  258.   s/bool/int/g;
  259.   my $type = $_;
  260.   # try to fix template classes
  261.   s/<(w*)>/_Tmpl_$1_/;
  262.   $type =~ s/<(w*)>/_Tmpl_$1_/;
  263.   s/Ptr$/*/;
  264.   s/**//g;
  265.   &debug("check defined for " , $_ , "n");
  266.   if ( $definedTypes{$_} ) {
  267.     &debug("is definedn");
  268.     #$type .= "_isCDefined";
  269.   }
  270.   else {
  271.    &debug("is not definedn");
  272.    $type =~ s/*/Ptr/; # needs work for builtin types
  273. #   $type .= "Ptr"; # needs work for builtin types
  274.   }
  275.   # try to fix template classes
  276.   s/<(w*)>/_Tmpl_$1_/;
  277. #  s/^intPtr/int*/;
  278. #  s/^longPtr/long*/;
  279. #  s/^charPtr/char*/;
  280. #  s/^shortPtr/short*/;
  281. #  s/^floatPtr/float*/;
  282. #  s/^doublePtr/double*/;
  283. #  s/^voidPtr/void*/;
  284.  
  285.  $mapTypeToC = $type;
  286. }
  287. # compute all the type lookups 
  288. for $func ( @functions ) {
  289.   &addType( $func->{class} );
  290.   &addType( $func->{return} );
  291.   for( $t=0; $t < $func->{numParam}; $t++) {
  292.     &addType( $func->{"paramType",$t} );
  293.   }
  294. }
  295. # generate the file 
  296. if (1) {
  297. #  print "n#include <cassert>nn" if $doCode;
  298.   print "n#include <assert.h>nn" if $doCode;
  299.   for $include ( @includes ) {
  300.     print "#include "$include" n";
  301.   }
  302.   print "n#ifdef __cplusplusnextern "C" n{n#endifn";
  303.   print "nn";
  304.   print " /* This file uses the types : n";
  305.   # build the type declarations 
  306.   for $type ( sort keys %types ) {
  307.     $type =~ s/<(w*)>/_Tmpl_$1_/;
  308.     print "typedef void* ",$type,"Ptr;n";
  309.   }
  310.   print " */ n ";
  311.   print "nn";
  312.   print "/* these function return a string describibg any */ n";
  313.   print "/* errors or NULL if there was no error */ nn";
  314.   # build the prototypes 
  315.   for $func ( @functions ) {
  316.     if ( $func->{class} ne $prevClass ) {
  317.       print "n" ;
  318.       $constructorCount=0;
  319.     }
  320.     $prevClass = $func->{class};
  321.     
  322.     if ( $func->{name} eq  "constructor" ) {
  323.       if (1) {
  324. $constructorCount++;
  325. if ( $doCode ) {
  326.   print "n/// See ",$func->{class},"::",$func->{class},"n";
  327. }
  328. print "int ";
  329. print "n" if $doCode;
  330. print $func->{class},"_create",$constructorCount;
  331. print "( ",&mapTypeToC($func->{class} . "*"),"* objPtr";
  332. for( $t=0; $t < $func->{numParam}; $t++) {
  333.   print ", ",&mapTypeToC($func->{"paramType",$t});
  334.   print " ",$func->{"paramName",$t};
  335. }
  336. print ")";
  337. print ";" unless $doCode;
  338. print "n"; 
  339. if ( $doCode ) {
  340.   print "{n";
  341.   print "   int retValue=0;n";
  342.   print "   ",$func->{class},"* obj = NULL; n";
  343.   print "   tryn";
  344.   print "   {n";
  345.   print "       ";
  346.   print "obj = new ",$func->{class},"(";
  347.   for( $t=0; $t < $func->{numParam}; $t++) {
  348.     print "," if ( $t != 0 );
  349.     $type = $func->{"paramType",$t};
  350.     
  351.     if ( $type eq "string" ) {
  352.       print "string";
  353.       print "(",$func->{"paramName",$t},")";
  354.     }
  355.     elsif ( $type eq "string&" ) {
  356.       print "string";
  357.       print "(",$func->{"paramName",$t},")";
  358.     }
  359.     elsif ( $type =~ /.*&$/ ) {
  360.       # deal with a feverence type 
  361.       $type =~ s/&$//;
  362.       print "*static_cast<",$type,"*>";
  363.       print "(",$func->{"paramName",$t},")";
  364.     }
  365.     else {
  366.       print "static_cast<",$type,">";
  367.       print "(",$func->{"paramName",$t},")";
  368.     }
  369.   }
  370.   print ")";
  371.   print ";n";
  372.   print "       assert(objPtr); n";
  373.   print "       *objPtr = static_cast<",&mapTypeToC($func->{class} . "*"),">(obj); n";
  374.   print "   }n";
  375.   print "   catch (...)n";
  376.   print "   {n";
  377.   print "       retValue=-1; n";
  378.   print "   }n";
  379.   print "   n";
  380.   print "   return retValue;n";
  381.   print "}nn";
  382. }
  383.       }
  384.     }
  385.     elsif( $func->{name} eq "destructor" ) {
  386.       if (1) {
  387. if ( $doCode ) {
  388.   print "n/// See ",$func->{class},"::~",$func->{class},"n";
  389. }
  390. print "void ";
  391. print "n" if $doCode;
  392. print $func->{class},"_free";
  393. print "( ",&mapTypeToC($func->{class} . "*")," objPtr";
  394. print ")";
  395. if ( $doCode ) {
  396.   print "n{n";
  397.   print "   assert(objPtr);n";
  398.   print "   ",$func->{class},"* obj = ";
  399.   print "static_cast<",$func->{class},"*>(objPtr);n";
  400.   print "   delete obj;n";
  401.   print "}n";
  402. }
  403. else {
  404.   print ";n";
  405. }
  406.       }
  407.     }
  408.     else { 
  409.       if (1) {
  410. if ( $doCode ) {
  411.   print "n/// See ",$func->{class},"::",$func->{name},"n";
  412. }
  413. print "int ";
  414. print "n" if $doCode;
  415. # deal with overloaded function names 
  416. $cName = $func->{class} . "_" . $func->{name};
  417. $count = 1;
  418. while ( $usedName{$cName} ) {
  419.   $count++;
  420.   $cName =  $func->{class} . "_" . $func->{name} . $count;
  421. }
  422. $usedName{$cName} = 1;
  423. print $cName;
  424. print "( ";
  425. # do the this pointer part 
  426. print &mapTypeToC($func->{class} . "*")," objPtr" unless $func->{isStatic};
  427. print ", " unless $func->{isStatic} or ( ($func->{numParam}==0) and (($func->{return} eq "void")) );
  428. # do the parametes 
  429. for( $t=0; $t < $func->{numParam}; $t++) {
  430.   print ", " unless ( $t == 0 );
  431.   print &mapTypeToC($func->{"paramType",$t});
  432.   print " ",$func->{"paramName",$t};
  433. }
  434. print ", " unless ($func->{return} eq "void")or($func->{numParam}==0);
  435. # do return value part 
  436. if ( $func->{return} ne "void" ) {
  437.   print &mapTypeToC($func->{return} . "*")," returnValue";
  438. # end the first line 
  439. print ")";
  440. print ";" unless $doCode;
  441. print "n"; 
  442. if ( $doCode ) {
  443.   print "{n";
  444.   print "   int retValue=0;n";
  445.    if ( !($func->{isStatic}) ) {
  446.      print "   ",$func->{class},"* obj = ";
  447.      print "static_cast<",$func->{class},"*>(objPtr);n";
  448.   }
  449.   print "   tryn";
  450.   print "   {n";
  451.   print "       ";
  452.   # deal with the return type here 
  453.   if (  $func->{return} ne "void" ) {
  454.     print "*reinterpret_cast<",$func->{return},"*>(returnValue) = ";
  455.   }
  456.     
  457.   if ( $func->{isStatic} ) {
  458.     print "$func->{class}::";
  459.   }
  460.   else {
  461.     print "obj->";
  462.   }
  463.   print $func->{name},"(";
  464.   for( $t=0; $t < $func->{numParam}; $t++) {
  465.     print "," if ( $t != 0 );
  466.     $type = $func->{"paramType",$t};
  467.     
  468.     if ( $type eq "string" ) {
  469.       print "string";
  470.       print "(",$func->{"paramName",$t},")";
  471.     }
  472.     elsif ( $type eq "string&" ) {
  473.       print "string";
  474.       print "(",$func->{"paramName",$t},")";
  475.     }
  476.     elsif ( $type =~ /.*&$/ ) {
  477.       # deal with a reference type 
  478.       $type =~ s/&$//;
  479.       print "*static_cast<",$type,"*>";
  480.       print "(",$func->{"paramName",$t},")";
  481.     }
  482.     else {
  483.       print "static_cast<",$type,">";
  484.       print "(",$func->{"paramName",$t},")";
  485.     }
  486.   }
  487.   print ")";
  488.   print ";n";
  489.   print "   }n";
  490.   print "   catch (...)n";
  491.   print "   {n";
  492.   print "       retValue=-1; n";
  493.   print "   }n";
  494.   print "   n";
  495.   print "   return retValue;n";
  496.   print "}nn";
  497. }
  498.       }
  499.     }
  500.   }
  501.   print "n#ifdef __cplusplusn} /*close extern C*/ n#endifn";
  502. }
  503. sub debug {
  504.     if($debugCode) {
  505. print STDERR @_;
  506.     }
  507. }