Kernel - Instruction tracing support
[tpg/acess2.git] / Modules / Filesystems / InitRD / GenerateInitRD.php
index d89d6e9..ab6eb60 100644 (file)
@@ -1,10 +1,21 @@
+<?php
+$lGenDate = date("Y-m-d H:i");
+$gOutput = <<<EOF
 /*
  * Acess2 InitRD
  * InitRD Data
- * Generated <?php echo date("Y-m-d H:i"),"\n"; ?>
+ * Generated $lGenDate
  */
 #include "initrd.h"
-<?php
+
+EOF;
+
+$gInputFile = $argv[1];
+$gOutputFile = $argv[2];
+$gDepFile = ($argc > 3 ? $argv[3] : false);
+
+$gDependencies = array();
+
 $lines = file($argv[1]);
 
 $lDepth = 0;
@@ -29,33 +40,45 @@ foreach($lines as $line)
        if(preg_match('/^File\s+"([^"]+)"\s+"([^"]+)"$/', $line, $matches))
        {
                $lStack[$lDepth][1][] = array($matches[1], $matches[2]);
+               $gDependencies[] = $matches[2];
                continue;
        }
+       echo "ERROR: $line\n";
+       exit(0);
 }
 
 function hd($fp)
+{
+       //return "0x".str_pad( dechex(ord(fgetc($fp))), 8, "0", STR_PAD_LEFT );
+       $val = unpack("I", fread($fp, 4));
+       //print_r($val);        exit -1;
+       return "0x".dechex($val[1]);
+}
+
+function hd8($fp)
 {
        return "0x".str_pad( dechex(ord(fgetc($fp))), 2, "0", STR_PAD_LEFT );
 }
 
 function ProcessFolder($prefix, $items)
 {
+       global  $gOutput;
        foreach($items as $i=>$item)
        {
-               if(is_array($item[1])) {
-                       
+               if(is_array($item[1]))
+               {
                        ProcessFolder("{$prefix}_{$i}", $item[1]);
                        
-                       echo "tInitRD_File {$prefix}_{$i}_entries[] = {\n";
+                       $gOutput .= "tInitRD_File {$prefix}_{$i}_entries[] = {\n";
                        foreach($item[1] as $j=>$child)
                        {
-                               if($j)  echo ",\n";
-                               echo "\t{\"".addslashes($child[0])."\",&{$prefix}_{$i}_{$j}}";
+                               if($j)  $gOutput .= ",\n";
+                               $gOutput .= "\t{\"".addslashes($child[0])."\",&{$prefix}_{$i}_{$j}}";
                        }
-                       echo "\n};\n";
+                       $gOutput .= "\n};\n";
                        
                        $size = count($item[1]);
-                       echo <<<EOF
+                       $gOutput .= <<<EOF
 tVFS_Node {$prefix}_{$i} = {
        .NumACLs = 1,
        .ACLs = &gVFS_ACL_EveryoneRX,
@@ -69,31 +92,60 @@ tVFS_Node {$prefix}_{$i} = {
 EOF;
                }
                else {
+                       if(!file_exists($item[1])) {
+                               echo "ERROR: '{$item[1]}' does not exist\n", 
+                               exit(1);
+                       }
                        $size = filesize($item[1]);
                        
-                       echo "Uint8 {$prefix}_{$i}_data[] = {\n";
                        $fp = fopen($item[1], "rb");
-                       for( $j = 0; $j + 16 < $size; $j += 16 )
+                       if(0)
                        {
-                               echo "\t";
-                               echo hd($fp),",",hd($fp),",";
-                               echo hd($fp),",",hd($fp),",";
-                               echo hd($fp),",",hd($fp),",";
-                               echo hd($fp),",",hd($fp),",";
-                               echo hd($fp),",",hd($fp),",";
-                               echo hd($fp),",",hd($fp),",";
-                               echo hd($fp),",",hd($fp),",";
-                               echo hd($fp),",",hd($fp),",\n";
+                               $gOutput .= "Uint32 {$prefix}_{$i}_data[] = {\n";
+                               for( $j = 0; $j + 16 < $size; $j += 16 )
+                               {
+                                       $gOutput .= "\t";
+                                       $gOutput .= hd($fp).",".hd($fp).",";
+                                       $gOutput .= hd($fp).",".hd($fp).",\n";
+                               }
+                               $gOutput .= "\t";
+                               for( ; $j+3 < $size; $j += 4 )
+                               {
+                                       if( $j & 15 )   $gOutput .= ",";
+                                       $gOutput .= hd($fp);
+                               }
+                               if($j < $size) {
+                                       $tmp = "";
+                                       while($j ++ < $size)
+                                               $tmp .= fgetc($fp);
+                                       $tmp .= "\0\0\0";
+                                               $tmp = unpack("I", $tmp);
+                                       $gOutput .= "0x".dechex($tmp[1]);
+                               }
                        }
-                       echo "\t";
-                       for( ; $j < $size; $j ++ )
+                       else
                        {
-                               if( $j & 15 )   echo ",";
-                               echo hd($fp);
+                               $gOutput .= "Uint8 {$prefix}_{$i}_data[] = {\n";
+                               for( $j = 0; $j + 16 < $size; $j += 16 ) {
+                                       $gOutput .= "\t";
+                                       $gOutput .= hd8($fp).",".hd8($fp).",";
+                                       $gOutput .= hd8($fp).",".hd8($fp).",";
+                                       $gOutput .= hd8($fp).",".hd8($fp).",";
+                                       $gOutput .= hd8($fp).",".hd8($fp).",";
+                                       $gOutput .= hd8($fp).",".hd8($fp).",";
+                                       $gOutput .= hd8($fp).",".hd8($fp).",";
+                                       $gOutput .= hd8($fp).",".hd8($fp).",";
+                                       $gOutput .= hd8($fp).",".hd8($fp).",\n";
+                               }
+                               $gOutput .= "\t";
+                               for( ; $j < $size; $j ++ ) {
+                                       if( $j & 15 )   $gOutput .= ",";
+                                       $gOutput .= hd8($fp);
+                               }
                        }
                        fclose($fp);
-                       echo "\n};\n";
-                       echo <<<EOF
+                       $gOutput .= "\n};\n";
+                       $gOutput .= <<<EOF
 tVFS_Node {$prefix}_{$i} = {
        .NumACLs = 1,
        .ACLs = &gVFS_ACL_EveryoneRX,
@@ -108,22 +160,42 @@ EOF;
        }
 }
 
+//print_r($lStack);
+//exit(1);
+
 ProcessFolder("gInitRD_Files", $lStack[0][1]);
 
-echo "tInitRD_File gInitRD_Root_Files[] = {\n";
+$gOutput .= "tInitRD_File gInitRD_Root_Files[] = {\n";
 foreach($lStack[0][1] as $j=>$child)
 {
-       if($j)  echo ",\n";
-       echo "\t{\"".addslashes($child[0])."\",&gInitRD_Files_{$j}}";
+       if($j)  $gOutput .= ",\n";
+       $gOutput .= "\t{\"".addslashes($child[0])."\",&gInitRD_Files_{$j}}";
 }
-echo "\n};\n";
-?>
+$gOutput .= "\n};\n";
+$nRootFiles = count($lStack[0][1]);
+$gOutput .= <<<EOF
 tVFS_Node gInitRD_RootNode = {
        .NumACLs = 1,
        .ACLs = &gVFS_ACL_EveryoneRX,
        .Flags = VFS_FFLAG_DIRECTORY,
-       .Size = <?php echo count($lStack[0][1]);?>,
+       .Size = $nRootFiles,
        .ImplPtr = gInitRD_Root_Files,
        .ReadDir = InitRD_ReadDir,
        .FindDir = InitRD_FindDir
 };
+EOF;
+
+$fp = fopen($gOutputFile, "w");
+fputs($fp, $gOutput);
+fclose($fp);
+
+
+if($gDepFile !== false)
+{
+       $fp = fopen($gDepFile, "w");
+       $line = $gOutputFile.":\t".implode(" ", $gDependencies);
+       fputs($fp, $line);
+       fclose($fp);
+}
+
+?>

UCC git Repository :: git.ucc.asn.au