hholzgra                Sat Jan 21 15:55:10 2006 UTC

  Modified files:              
    /phpdoc/scripts     zendapi_protos.php 
  Log:
  will now also identify convenience wrapper macros wrapping api functions
  
  
http://cvs.php.net/viewcvs.cgi/phpdoc/scripts/zendapi_protos.php?r1=1.21&r2=1.22&diff_format=u
Index: phpdoc/scripts/zendapi_protos.php
diff -u phpdoc/scripts/zendapi_protos.php:1.21 
phpdoc/scripts/zendapi_protos.php:1.22
--- phpdoc/scripts/zendapi_protos.php:1.21      Sun Jan 15 00:45:43 2006
+++ phpdoc/scripts/zendapi_protos.php   Sat Jan 21 15:55:10 2006
@@ -1,5 +1,5 @@
 <?php
-$overwrite = false;
+$overwrite = true;
 
 $zend_include_dir = "../../php-src/Zend";
 
@@ -18,6 +18,10 @@
                        "TSRM"=>"../en/internals/tsrm/functions",
                        "CWD" =>"../en/internals/tsrm/functions",);
 
+
+$functions = array();
+$wrappers  = array();
+
 foreach ($zend_include_files as $infile) {
     echo "processing $zend_include_dir/$infile\n";
 
@@ -32,83 +36,140 @@
         // TODO a prototype may span more than one line?
         $line = trim(fgets($in));
 
-        // we look for prototypes marked with ZEND_API 
-        // TODO prototypes may be indented by whitespace?
-        if (preg_match('/^(ZEND|TSRM|CWD)_API\s+(\S+)\s+(\S+)\((.*)\);$/U', 
$line, $matches)) {
+        // first we look for prototypes marked with ZEND_API 
+        if (preg_match('/^\s*(ZEND|TSRM|CWD)_API\s+(\S+)\s+(\S+)\((.*)\);$/U', 
$line, $matches)) {
             // parse prototypes, step #1
           
             // extract return type and function name 
             $api_type    = $matches[1];
             $return_type = $matches[2];
             $function    = $matches[3];
-            
+            $param_list  = $matches[4];
+
             // the pointer '*' is usually next to the function name, not the 
type 
             // TODO what if there is whitespace on both sides of the '*'?
             while ($function[0] == '*') {
                 $return_type.= "*";
                 $function = substr($function, 1);
             }
+
+            // the parameters are spearated by commas
+            // TODO find a better way to handle TSRMLS_D and TSRMLS_DC
+            // TODO handle ...
+            $params = array();
+            foreach (explode(",", $param_list) as $param) {
+              $new_param = array();
+              
+              $tokens = preg_split("/\s+/", trim($param));
+              $name   = array_pop($tokens);
+              if (preg_match("|_DC$|", $name)) {
+                $magic = $name;
+                $name  = array_pop($tokens);
+              } else {
+                $magic = "";
+              }
+              $type   = implode(" ", $tokens);
+              
+              if (empty($name)) {
+                $new_param['type'] = "magic";
+                $new_param['name'] = $type;
+              } else {
+                while ($name[0] == '*') {
+                  $type.= "*";
+                  $name = substr($name, 1);
+                }
+                $new_param['type'] = $type;
+                $new_param['name'] = $name;
+              }
+              $params[$name] = $new_param;
+              
+              if ($magic) {
+                $params[$magic] = array("type"=>"magic", "name"=>$magic);
+              }
+            }
             
-            // now generate the doc filename for this function
-            $filename = $functions_dir[$api_type]."/".$function.".xml";
+            $functions[$function] = array("name"        => $function,
+                                          "return_type" => $return_type, 
+                                          "params"      => $params,
+                                          "api_type"    => $api_type,
+                                                                               
  "infile"      => $infile
+                                                                               
  );
+        }        
+
+        // next we look for macros that seem to be just wrappers around 
existing functions
+        // TODO catch multiline definitions
+        if (preg_match('|^#define\s+([a-z0-9_]+)\((.*)\)\s+(\w+)\(|U', $line, 
$matches)) {
+          $wrapper    = $matches[1];
+          $param_list = $matches[2]; 
+          $function   = $matches[3];
+
+          $wrappers[$wrapper] = array("function"   => $function, 
+                                      "wrapper"    => $wrapper, 
+                                      "param_list" => $param_list,
+                                                                         
"infile"     => $infile
+                                                                         );
+        }
+    }
+}
+
+
+foreach ($wrappers  as $name => $wrapper) {
+  if (isset($functions[$wrapper["function"]])) {
+    $function = $functions[$wrapper["function"]];
+    $params   = array();
+    foreach (explode(",", $wrapper["param_list"]) as $param) {
+      $param = preg_replace('|\s*_*(\w+)\s*|', '${1}', $param); // trim and 
strip leading _s
+      if (isset($function["params"][$param])) {
+        $param_type = $function["params"][$param]["type"];
+      } else {
+        $param_type = "...";
+      }
+      $params[$param] = array("type"=>$param_type, "name"=>$param);
+    }
+
+    $functions[$name] = array("name"        => $name,
+                                                         "return_type" => 
$function["return_type"], 
+                                                         "params"      => 
$params,
+                                                         "api_type"    => 
$function["api_type"],
+                                                         "infile"      => 
$wrapper["infile"]
+                                                         );
+  }
+}
+
+
+foreach ($functions as $name => $function) {
+  create_page($name, $function["return_type"], $function["params"], 
$function["api_type"], $function["infile"]); 
+}
+
+
+function create_page($function, $return_type, $params, $api_type, $infile)
+{
+  global $overwrite, $functions_dir;
+
+  // now generate the doc filename for this function
+  $filename = $functions_dir[$api_type]."/".$function.".xml";
             
-            // only proceed it fhe file doesn't exist yet (no overwrites)
-            // and do not expose functions staring with '_'
-            if (($function[0] != '_') && ($overwrite || 
!file_exists($filename))) {
-                // now write the template file to 
phpdoc/en/internals/zendapi/functions
-                ob_start();
+  // only proceed it fhe file doesn't exist yet (no overwrites)
+  // and do not expose functions staring with '_'
+  if (($function[0] != '_') && ($overwrite || !file_exists($filename))) {
+    // now write the template file to phpdoc/en/internals/zendapi/functions
+    ob_start();
                 
-                echo '<?xml version="1.0" encoding="iso-8859-1"?>'."\n";
+    echo '<?xml version="1.0" encoding="iso-8859-1"?>'."\n";
                 
-                // take revision from existing file 
-                if (!$overwrite || !file_exists($filename)) {
-                    echo "<!-- $"."Revision: 1.1 $ -->\n";
-                } else {
-                    foreach (file($filename) as $line) {
-                        if (strstr($line, 'Revision: ')) {
-                            echo $line;
-                            break;
-                        }
-                    }
-                }
-
-                // the parameters are spearated by commas
-                // TODO find a better way to handle TSRMLS_D and TSRMLS_DC
-                // TODO handle ...
-                $params = array();
-                foreach (explode(",", trim($matches[4])) as $param) {
-                    $new_param = array();
-                      
-                    $tokens = preg_split("/\s+/", trim($param));
-                    $name   = array_pop($tokens);
-                    if (preg_match("|_DC$|", $name)) {
-                        $magic = $name;
-                        $name  = array_pop($tokens);
-                    } else {
-                        $magic = "";
-                    }
-                    $type   = implode(" ", $tokens);
-                    
-                    if (empty($name)) {
-                        $new_param['type'] = "magic";
-                        $new_param['name'] = $type;
-                    } else {
-                        while ($name[0] == '*') {
-                            $type.= "*";
-                            $name = substr($name, 1);
-                        }
-                        $new_param['type'] = $type;
-                        $new_param['name'] = $name;
-                    }
-                    $params[] = $new_param;
-
-                    if ($magic) {
-                        $params[] = array("type"=>"magic", "name"=>$magic);
-                    }
-                }
-
+    // take revision from existing file 
+    if (!$overwrite || !file_exists($filename)) {
+      echo "<!-- $"."Revision: 1.1 $ -->\n";
+    } else {
+      foreach (file($filename) as $line) {
+        if (strstr($line, 'Revision: ')) {
+          echo $line;
+          break;
+        }
+      }
+    }
 
-?>
+    ?>
 <refentry id="zend-api.<?php echo str_replace("_","-",$function); ?>">
  <refnamediv>
   <refname><?php echo $function; ?></refname>
@@ -120,21 +181,21 @@
   <literallayout>#include &lt;<?php echo basename($infile); 
?>&gt;</literallayout>
   <methodsynopsis>
 <?php 
-                if ($return_type == "void") {
-                    echo "   <void/>";
-                } else {
-                    echo "   <type>$return_type</type>";
-                }
-                echo "<methodname>$function</methodname>";
-                if (count($params)) {
-                    echo "\n";
-                    foreach($params as $param) {
-                        echo "    
<methodparam><type>$param[type]</type><parameter>$param[name]</parameter></methodparam>\n";
-                    }  
-                } else {
-                    echo "<void/>\n";
-                }
-?>
+    if ($return_type == "void") {
+      echo "   <void/>";
+    } else {
+      echo "   <type>$return_type</type>";
+    }
+    echo "<methodname>$function</methodname>";
+    if (count($params)) {
+      echo "\n";
+      foreach($params as $param) {
+        echo "    
<methodparam><type>$param[type]</type><parameter>$param[name]</parameter></methodparam>\n";
+      }  
+    } else {
+      echo "<void/>\n";
+    }
+    ?>
   </methodsynopsis>
   <para>
    ...
@@ -146,7 +207,7 @@
   <para>
    <variablelist>
 <?php
-                foreach($params as $param) {
+     foreach($params as $param) {
 ?>
     <varlistentry>
      <term><parameter><?php echo $param["name"]; ?></parameter></term>
@@ -157,7 +218,7 @@
      </listitem>
     </varlistentry>
 <?php
-                }
+     }
 ?>
    </variablelist>
   </para>
@@ -194,9 +255,7 @@
 -->
 <?php
        
-                file_put_contents($filename, ob_get_clean());                
-            }   
-        }                                           
-    }
+    file_put_contents($filename, ob_get_clean());                
+  }   
 }
 ?>

Reply via email to