<HTML><HEAD><TITLE>Konfigurationsverwaltung: Schlsselwort-Suche
</TITLE></HEAD>
<BODY><H1>Operation: Inhaltsverzeichnis</H1>
<P>
Diese Funktion liefert eine Komplettbersicht des Baums in einer Ebenen-Darstellung.
 Sie hlt Links zu allen Verzeichnissen des Baums bereit.
</P>
<HR>
<H1>Standort-Information:</H1>
<FORM METHOD="POST" ACTION="/cgi-bin/cm1/toc.pl">
<P>Projekt: <SELECT NAME="Project:">
<OPTION>            hesi
<OPTION>           pca
<OPTION>          irac
<OPTION SELECTED> cirs
</SELECT></P>
<P> Geben Sie den Namen des Zweigs aus der hchsten Ebene ein.
Beispiel: Die hchste Ebene fr den Baum mit den Zeichnungen ist
blicherweise "ZEICHNUNGEN". Bei CIRS knnte der Zweig als
Optiken/RefInterferometer bezeichnet werden, um die Suche
einzuschrnken, da dieser Zweig unterhalb der hchsten Ebene liegt.
Ist der Zweig leer, startet die Suche von der hchsten Ebene des Baums aus.</P>
<P>Zweig-Name: <INPUT NAME="Dir"> </P>
<HR>
<H1>Und nun?</H1>
<P><INPUT TYPE="submit" VALUE="TOC"><INPUT TYPE="reset" VALUE="Felder zurcksetzen"></P>
</BODY></HTML>

#!/usr/bin/perl
require "/usr/local/lib/perl5/ipc.ph";
require "/usr/local/lib/perl5/shm.ph";


Perl-Routinen zur Manipulation von CGI-Eingaben
S.E.Brenner@bioc.cam.ac.uk
$Header: /people/seb1005/http/cgi-bin/RCS/cgi-lib.pl,v 1.2 10.1.94 15:05:40 seb1005 Exp $

Copyright 1993 Steven E. Brenner  
Unverffentlichte Arbeit.
Erlaubnis zur Nutzung und nderung dieser Bibliothek gewhrt,
sofern das obenstehende Copyright gewhrleistet ist, Modifikationen dokumentiert sind
und Zahlung fr die Benutzung der Bibliothek gewhrleistet ist.

ReadParse
Liest GET- oder POST-Daten ein, konvertiert sie zu unescaped Text und setzt key=value in jeden Eintrag der Liste. "@in" erstellt ebenfalls Schlssel/Wert-Paare in %in. Dabei wird '\0' zum Separieren mehrfacher Auswahlen verwendet.
Wenn ein variabler Glob-Parameter (z.B. *cgi_input) an ReadParse weitergeleitet wurde, ist die information eher dort als in $in, @in und %in gespeichert.

sub ReadParse {
  if (@_) {
    local (*in) = @_;
  }
  local (%inPos, $count);
  local ($i, $loc, $key, $newKey, $val);

  # Liest Text ein
  if ($ENV{'REQUEST_METHOD'} eq "GET") {
    $in = $ENV{'QUERY_STRING'};
  } elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
    for ($i = 0; $i < $ENV{'CONTENT_LENGTH'}; $i++) {
      $in .= getc;
    }
  } 

  @in = split(/&/,$in);

  foreach $i (0 .. $#in) {

    # Wandle Pluszeichen in Leerzeichen um
    $in[$i] =~ s/\+/ /g;

    # Wandle %XX von hexadezimalen Zahlen in alphanumerische Zeichen um
    $in[$i] =~ s/%(..)/pack("c",hex($1))/ge;

    # Splitte in Schlssel und Wert.
    $loc = index($in[$i],"=");
    $key = substr($in[$i],0,$loc);
    $val = substr($in[$i],$loc+1);

    $in{$key} .= '\0' if (defined($in{$key})); # \0 ist der mehrfache Separator
    $in{$key} .= $val;
  }

   # Erstelle die Titelzeile
   print "<H2>Erstelltes Inhaltsverzeichnis:</H2>";
   &WriteData (%in );
}

sub GetTreeKey {
   local ($project) = @_;
   local ($serverRoot);

      $serverRoot = "./";
      open ( FILE, "$serverRoot/cgi-bin/treeKey.cfg" );
      while (<FILE>) {
         ($p, $key) = split (/:/, $_);
         $project =~ tr/A-Z/a-z/;
         if ( $p eq $project ) {
            return $key;
         }
      }   
}


sub UnpackShmData {
   local ($key, $size, $count, $nodeOffset) = @_;
   local ($tmp, $len, $permissions, $start);
   local ($name,$link,$child,$sibling,$parent,$protected,$offset);


      # das Segment aus dem gemeinsamen Speicher holen
      $permissions=0600;
      $len = $count * $size;
      $shmid = shmget ( $key, $len, $permissions|&IPC_EXCL );

      if ( !$shmid ) { return; }

      # Setze den Index woher gelesen werden soll
      $start = $size * $nodeOffset;

      # aus dem Segment lesen
      shmread ($shmid, $name, $start+0, 13);
      $name =~ s/\0.*$//;
      shmread ($shmid, $link, $start+13 , 180);
      $link =~ s/\0.*$//;
      shmread ($shmid, $tmp, $start+196, 4);
      $child = unpack ('i*', $tmp );
      shmread ($shmid, $tmp, $start+200, 4);
      $sibling = unpack ('i*', $tmp );
      shmread ($shmid, $tmp, $start+204, 4);
      $parent = unpack ('i*', $tmp );
      shmread ($shmid, $tmp, $start+208, 4);
      $protected = unpack ('i*', $tmp );
      shmread ($shmid, $tmp, $start+212, 4);
      $offset = unpack ('i*', $tmp );

      return ( $name, $link, $child, $sibling, $parent, $protected, $offset );
}


sub ProcessTree {
   local ($key, $start, $size, $count) = @_;
   local ($name,$link,$child,$sibling,$parent,$protected,$offset);


      # den spezifizierten Node im Form suchen
      ($name, $link, $child, $sibling, $parent, $protected, $offset) = 
            &UnpackShmData ( $key, $size, $count, $start );

        print "<A HREF=\"" . $link . "\">" . $name . "</A>";

      if ( $child != -1 ) {
         print "<UL>";
         print "<LI>";
        &ProcessTree ( $key, $child, $size, $count );
         print "</LI>";
         print "</UL>";

      }  

      # logisch rekursiv ausfhren durch den Baum
      if ( $sibling != -1 ) {
         print "<LI>";
        &ProcessTree ( $key, $sibling, $size, $count );
         print "</LI>";
      }  


}

sub WriteData  {
   local ( %in ) = @_;
   local ( $start, $count, $size, $dataPath );
   local ( $key, $name, $link, $child, $sibling, $parent, $protected, $offset);

      # die Gre des Baums aus der HTML-Datei holen
      $project = $in{"Project:"};
      $key = &GetTreeKey($project);
      $nameIn = $in{"Dir"};

      # ffne die HTML-Datei
      $dataPath = "./";
      open ( FILE, "$dataPath/projects/$project/$project.html" );

      while ( <FILE> ) {

         if ( /SIZE/ ) {
            ($keyword, $size) = split (/=/, $_ );
            ($keyword, $size, $rest) = split (/"/, $size );
         }

         if ( /COUNT/ ) {
            ($keyword, $count) = split (/=/, $_ );
            ($keyword, $count, $rest) = split (/"/, $count );
         }
      }

      # die Startposition aus dem Baum holen
      $start = 0;

      # Extrahiere den Node-Namen, von wo aus gestartet werden soll
      if ( $nameIn ne "" ) {

           # den spezifizierten Node in der Form suchen
           ($name, $link, $child, $sibling, $parent, $protected, $offset)   
                  = &UnpackShmData ( $key, $size, $count, $start );

         # Weiter, solange mehr Nodes existieren
         while ( $name ne "" ) {
 
            # nachsehen, ob dieser Node der Eingabe entspricht
              if ($name eq $nameIn ) { 
               last;
              }

            $start++;
              ($name, $link, $child, $sibling, $parent, $protected, $offset)   
                  = &UnpackShmData ( $key, $size, $count, $start );

         } 
      }

      &ProcessTree ( $key, $start, $size, $count );
}

# den HTML-Header ausgeben
   print "Content-type: text/html\n\n";
   print "<HTML>\n";
   print "<HEAD><TITLE>Berichtsliste</TITLE></HEAD>\n";
   print "<BODY><H1>Ergebnisbericht:</H1>\n";

# die Variablen-Liste ausgeben
   &ReadParse();

# den HTML-Nachspann ausgeben
   print "</BODY>";
   print "</HTML>\n";

