Die Copyrighthinweise zu folgendem Code befinden sich als Kommentare an den Dateiköpfen.

Datei reference.php:

<html>
<head>
<title>Parser-Referenz</title>
<link rel="stylesheet" type="text/css" href="units/style.css">
</head>
<body>
<?php

   
####################################################################################
   # Dies ist die Datei 'reference.php'                                               #
   #                                                                                  #
   # Sie enth"alt Funktions- und "ahnliche Definitionen des Parser/Plotter-Projekts   #
   #                                                                                  #
   # Diese Datei darf frei als Ganzes oder in Teilen f"ur jegliche nicht-             #
   # kommerzielle Zwecke verwandt werden, solange folgede Bedingungen erf"ullt        #
   # werden:                                                                          #
   #    - Dieser Blockkommentar mit den Nutzungsbedingungen muss unver"andert         #
   #      in allen Nachfolgedateien / -ver"offentlichungen am Datei- / Textkopf       #
   #      verwandt werden                                                             #
   #    - Der Quellcode des muss jedem Benutzer von allen Programmen, die ihn         #
   #      verwenden, einsehbar gemacht werden                                         #
   #                                                                                  #
   # Sollten Sie diesen Code, in Teilen oder als Ganzes, auch portiert in             #
   # andere Programmiersprachen oder unter blo"ser Verwendung des Algorithmus         #
   # oder von Teilen von verwandten Algorithmen, f"ur kommerzielle Zwecke nutzen      #
   # wollen, so kontaktieren Sie mich bitte.                                          #
   #                                                                                  #
   # Ich habe den vorliegenden Code von Grund auf selbst programmiert und mich        #
   # dabei auf keine anderen als Standardalgorithmen gest"utzt. Insbesondere den      #
   # Tokenizer, der Parser und die Schrittweitensteurerung habe ich von Grund         #
   # auf und ohne Zuhilfenahme anderer Quellen selbst programmiert. Sollte ich        #
   # mit dem vorliegenden Code bestehende Copyrights oder Patente verletzen oder      #
   # den Urheber geistigen Eigentums vorenthalten, so geschieht dies                  #
   # unabsichtlich. Bitte kontaktieren Sie mich mittels untenstehender E-Mail-        #
   # Adresse oder "uber den Sysadmin.                                                 #
   #                                                                                  #
   # Der Autor "ubernimmt keine Haftung f"ur eventuelle durch die Nutzung dieses      #
   # entstehende oder entstandene mittelbare oder unmittelbare Sch"aden jedweder Art. #
   # Nutzung auf eigene Gefahr.                                                       #
   #                                                                                  #
   # Bitte schicken Sie mir keine E-Mails mit Bitte um die Erkl"arung der             #
   # Funktionsweise des Codes oder von Teilen des Codes; ich habe mich bem"uht,       #
   # den Code so gut wie m"oglich zu kommentieren und habe leider nicht genug         #
   # Zeit, um E-Mails "uber technische Details zu beantworten.                        #
   #                                                                                  #
   # (c) Jan Olligs, 2004                                                             #
   # Alle Rechte vorbehalten                                                          #
   #                                                                                  #
   # Jan.Olligs@gmx.net                                                               #
   ####################################################################################

   
include("units/mathdef.php");

   function 
table_row($array$item$title) {
      if (
array_key_exists($item$array) and (!is_array($array[$item]) or != count($array[$item]))) {
         print 
"   <tr>\n";
         print 
"      <td><b>$title:</b></td>\n";
         if (
is_array($array[$item])) {
            print 
"      <td>" implode(', 'array_map('htmlspecialchars'$array[$item])) . "</td>\n";
         } else {
            print 
"      <td>" htmlspecialchars($array[$item]) . "</td>\n";
         }
         print 
"   </tr>\n";
      }
   }
?>
Die folgenden <i><b>Funktionen (un&auml;re Operatoren)</b></i> werden unterst&uuml;tzt:<br>
<?php
   
foreach ($global_unary_operators as $name => $properties) {
      if (!
is_array($properties)) {
         continue; 
# ACHTUNG: Das w"are ein Implementierungsfehler
      
}
      print 
"<table>\n";
      print 
"   <tr>\n";
      print 
"      <td><b>Funktion:</b></td>\n";
      print 
"      <td><i>" htmlspecialchars($name) . "</i></td>\n";
      print 
"   </tr>\n";
      
table_row($properties'name',    'Name');
      
table_row($properties'others',  'Varianten');
      
table_row($properties'info',    'Information');
      
table_row($properties'example''Beispiel(e)');
      print 
"</table>\n";
      print 
"<br>\n\n";
   }
?>
<br>
Die folgenden <i><b>Operatoren (bin&auml;re Operatoren)</b></i> werden unterst&uuml;tzt:<br>
<?php
   $i 
0;
   foreach (
$global_binary_operators as $prec) {
      ++
$i;
      print 
"<u>Pr&auml;zedenz $i</u>:\n";
      foreach (
$prec as $name => $properties) {
         if (!
is_array($properties)) {
            continue; 
# ACHTUNG: Das w"are ein Implementierungsfehler
         
}
         print 
"<table>\n";
         print 
"   <tr>\n";
         print 
"      <td><b>Operator:</b></td>\n";
         print 
"      <td><i>" htmlspecialchars($name) . "</i></td>\n";
         print 
"   </tr>\n";
         
table_row($properties'name',    'Name');
         
table_row($properties'info',    'Information');
         
table_row($properties'example''Beispiel(e)');
         print 
"</table>\n";
         print 
"<br>\n\n";
      }
   }
?>
<br><br>
Die folgenden <i><b>Konstanten</i></b> sind definiert:<br>
<?php
   
foreach ($global_constants as $const => $value) {
      print 
"$const = $value<br>\n";
   }
?>
<br><br>
Au&szlig;erdem sind folgende <i><b>Klammern</i></b> verf&uuml;gbar:<br>
<?php
   
foreach ($global_parens as $pair) {
      print 
"&ouml;ffnet als '$pair[0]', schlie&szlig;t als '$pair[1]'<br>\n";
   }
?>
<br><br><br>
<a href="source.php">&copy; Jan Olligs, 2004</a>
</body>
</html>

Datei source.php:

<html>
<head>
<title>Funktionsparser Quellcode</title>
</head>
<body>
Die Copyrighthinweise zu folgendem Code befinden sich als Kommentare an den
Dateik&ouml;pfen.
<?php

   
####################################################################################
   # Dies ist die Datei 'source.php'                                                  #
   #                                                                                  #
   # Sie enth"alt Funktions- und "ahnliche Definitionen des Parser/Plotter-Projekts   #
   #                                                                                  #
   # Diese Datei darf frei als Ganzes oder in Teilen f"ur jegliche nicht-             #
   # kommerzielle Zwecke verwandt werden, solange folgede Bedingungen erf"ullt        #
   # werden:                                                                          #
   #    - Dieser Blockkommentar mit den Nutzungsbedingungen muss unver"andert         #
   #      in allen Nachfolgedateien / -ver"offentlichungen am Datei- / Textkopf       #
   #      verwandt werden                                                             #
   #    - Der Quellcode des muss jedem Benutzer von allen Programmen, die ihn         #
   #      verwenden, einsehbar gemacht werden                                         #
   #                                                                                  #
   # Sollten Sie diesen Code, in Teilen oder als Ganzes, auch portiert in             #
   # andere Programmiersprachen oder unter blo"ser Verwendung des Algorithmus         #
   # oder von Teilen von verwandten Algorithmen, f"ur kommerzielle Zwecke nutzen      #
   # wollen, so kontaktieren Sie mich bitte.                                          #
   #                                                                                  #
   # Ich habe den vorliegenden Code von Grund auf selbst programmiert und mich        #
   # dabei auf keine anderen als Standardalgorithmen gest"utzt. Insbesondere den      #
   # Tokenizer, der Parser und die Schrittweitensteurerung habe ich von Grund         #
   # auf und ohne Zuhilfenahme anderer Quellen selbst programmiert. Sollte ich        #
   # mit dem vorliegenden Code bestehende Copyrights oder Patente verletzen oder      #
   # den Urheber geistigen Eigentums vorenthalten, so geschieht dies                  #
   # unabsichtlich. Bitte kontaktieren Sie mich mittels untenstehender E-Mail-        #
   # Adresse oder "uber den Sysadmin.                                                 #
   #                                                                                  #
   # Der Autor "ubernimmt keine Haftung f"ur eventuelle durch die Nutzung dieses      #
   # entstehende oder entstandene mittelbare oder unmittelbare Sch"aden jedweder Art. #
   # Nutzung auf eigene Gefahr.                                                       #
   #                                                                                  #
   # Bitte schicken Sie mir keine E-Mails mit Bitte um die Erkl"arung der             #
   # Funktionsweise des Codes oder von Teilen des Codes; ich habe mich bem"uht,       #
   # den Code so gut wie m"oglich zu kommentieren und habe leider nicht genug         #
   # Zeit, um E-Mails "uber technische Details zu beantworten.                        #
   #                                                                                  #
   # (c) Jan Olligs, 2004                                                             #
   # Alle Rechte vorbehalten                                                          #
   #                                                                                  #
   # Jan.Olligs@gmx.net                                                               #
   ####################################################################################

   
$files = array(
      
'reference.php',
      
'source.php',
      
'graph.php',
      
'plotter.php',
      
'tabs/error.php',
      
'tabs/functions.php',
      
'tabs/general.php',
      
'tabs/graph.php',
      
'units/mathdef.php',
      
'units/parser.php',
      
'units/graphics.php',
      
'units/plotter_constants.php',
      
'units/various.php'
   
);

   foreach (
$files as $name) {
      print 
"<h1>Datei <i>" htmlspecialchars($name) . "</i>:</h1>\n";
      
show_source($name);
   }

?>
</body>
</html>

Datei graph.php:

<?php



   
####################################################################################

   # Dies ist die Datei 'graph.php'                                                   #

   #                                                                                  #

   # Sie enth"alt den eigentlichen Plotter des Parser/Plotter-Projekts                #

   #                                                                                  #

   # Diese Datei darf frei als Ganzes oder in Teilen f"ur jegliche nicht-             #

   # kommerzielle Zwecke verwandt werden, solange folgede Bedingungen erf"ullt        #

   # werden:                                                                          #

   #    - Dieser Blockkommentar mit den Nutzungsbedingungen muss unver"andert         #

   #      in allen Nachfolgedateien / -ver"offentlichungen am Datei- / Textkopf       #

   #      verwandt werden                                                             #

   #    - Der Quellcode des muss jedem Benutzer von allen Programmen, die ihn         #

   #      verwenden, einsehbar gemacht werden                                         #

   #                                                                                  #

   # Sollten Sie diesen Code, in Teilen oder als Ganzes, auch portiert in             #

   # andere Programmiersprachen oder unter blo"ser Verwendung des Algorithmus         #

   # oder von Teilen von verwandten Algorithmen, f"ur kommerzielle Zwecke nutzen      #

   # wollen, so kontaktieren Sie mich bitte.                                          #

   #                                                                                  #

   # Ich habe den vorliegenden Code von Grund auf selbst programmiert und mich        #

   # dabei auf keine anderen als Standardalgorithmen gest"utzt. Insbesondere den      #

   # Tokenizer, der Parser und die Schrittweitensteurerung habe ich von Grund         #

   # auf und ohne Zuhilfenahme anderer Quellen selbst programmiert. Sollte ich        #

   # mit dem vorliegenden Code bestehende Copyrights oder Patente verletzen oder      #

   # den Urheber geistigen Eigentums vorenthalten, so geschieht dies                  #

   # unabsichtlich. Bitte kontaktieren Sie mich mittels untenstehender E-Mail-        #

   # Adresse oder "uber den Sysadmin.                                                 #

   #                                                                                  #

   # Der Autor "ubernimmt keine Haftung f"ur eventuelle durch die Nutzung dieses      #

   # entstehende oder entstandene mittelbare oder unmittelbare Sch"aden jedweder Art. #

   # Nutzung auf eigene Gefahr.                                                       #

   #                                                                                  #

   # Bitte schicken Sie mir keine E-Mails mit Bitte um die Erkl"arung der             #

   # Funktionsweise des Codes oder von Teilen des Codes; ich habe mich bem"uht,       #

   # den Code so gut wie m"oglich zu kommentieren und habe leider nicht genug         #

   # Zeit, um E-Mails "uber technische Details zu beantworten.                        #

   #                                                                                  #

   # (c) Jan Olligs, 2004                                                             #

   # Alle Rechte vorbehalten                                                          #

   #                                                                                  #

   # Jan.Olligs@gmx.net                                                               #

   ####################################################################################



   
include("units/mathdef.php");

   include(
"units/parser.php");

   include(
"units/graphics.php");

   include(
"units/plotter_constants.php");

   include(
"units/various.php");



   
####################################################################################

   # Inhalte des $_REQUEST-Arrays, die f"ur den Plotter relevant sind:                #

   #    'img_type'              - Ausgabeformat, siehe 'plotter_constants.php'        #

   #    'const'                 - Konstanten in der Form "[name]=[term]\n[name]..."   #

   #    'function_[\d]_[...]'   - Funktionen, siehe 'plotter_constants.php'           #

   #    'asymptote_[\d]_[...]'  - Asymptoten, siehe 'plotter_constants.php'           #

   #    'x_min'                 - kleinster dargestellter x-Wert                      #

   #    'x_max'                 - gr"o"ster dargestellter x-Wert                      #

   #    'x_grid'                - x-Gitterweite                                       #

   #    'y_min'                 - kleinster dargestellter y-Wert                      #

   #    'y_max'                 - gr"o"ster dargestellter y-Wert                      #

   #    'y_grid'                - y-Gitterweite                                       #

   #    'width'                 - Bildbreite in Pixel                                 #

   #    'height'                - Bildh"ohe in Pixel                                  #

   #    'step'                  - Schrittweite der Punkte (delta_x)                   #

   #    'auto_step'             - automatische Schrittweitensteuerung an ('true')     #

   #                              oder aus ('false')                                  #

   #    'bg_col'                - Hintergrundfarbe, siehe 'plotter_constants.php'     #

   #    'pl_col'                - Standardfunktionsfarbe, s. 'plotter_constants.php'  #

   #    'ax_col'                - Achsenfarbe, siehe 'plotter_constants.php'          #

   #    'gr_col'                - Gitterfarbe, siehe 'plotter_constants.php'          #

   #    's_min'                 - kleinster schattierter x-Wert                       #

   #    's_max'                 - gr"o"ster schattierter x-Wert                       #

   #    'sh_col'                - Schattenfarbe, siehe 'plotter_constants.php'        #

   #    's_trans'               - Schattentransparenz in Prozent                      #

   #    's_f1'                  - den Schatten einschlie"sende Funktion 1             #

   #    's_f2'                  - den Schatten einschlie"sende Funktion 2             #

   #    'sf_col'                - Farbe der einschlie"senden Funktionen, s. ...       #

   #    'do_shade'              - Schattieren an oder aus (s.o.)                      #

   ####################################################################################



   # F"ur aufwendige Graphen deaktivieren wir l"astige Zeitbegrenzungen ...



   # set_time_limit(0);



   # F"ur das Einf"ugen von Malzeichen



   
$poss_for_mult array_merge(range('a''z'), range('A''Z'));

   foreach (
$global_parens as $pair) {

      
array_push($poss_for_mult$pair[0]);

   }



   
# Fehlercheck f"angt hier an



   
$image_type $_REQUEST['img_type'];

   if (!(
imagetypes() & $plotter_standards{'img_types'}[1][$image_type][1])) {

      
$image_type 0;

   }

   while (!(
imagetypes() & $plotter_standards{'img_types'}[1][$image_type][1])) {

      if (
$image_type >= count($plotter_standards{'img_types'})) {

         die;

      }

      ++
$image_type;

   }



   
# Zuerst parsen wir die Konstanten, da sie bei allen Termen ben"otigt werden



   
$constants = array();

   
$temp preg_split('/\n/'$_REQUEST['const']);

   foreach (
$temp as $t) {

      
$t preg_split('/=/'$t);

      if (!
is_array($t) or count ($t) != 2) {

         continue;

      }

      
$t[0] = ltrim(rtrim($t[0]));

      
$t[1] = ltrim(rtrim($t[1]));



      if (
check_parens($value$global_parens) > -1) {

         continue;

      }

      
$t[1] = check_minus($t[1], $global_parens);

      if (
$t[1][1] != $global_error_names['NOERROR']) {

         continue;

      }

      
$t[1] = $t[1][0];

      
$t[1] = add_times($t[1], $poss_for_mult'*');

      if (
$t[1][1] != $global_error_names['NOERROR']) {

         continue;

      }

      
$t[1] = $t[1][0];

      
$t[1] = tokenize($t[1], $global_parens$global_unary_operators,

                       
$global_binary_operators);

      if (
$t[1][1] != $global_error_names['NOERROR']) {

         continue;

      }

      
$t[1] = $t[1][0];

      
$t[1] = substitute($t[1], $global_constants);

      if (
$t[1][1] != $global_error_names['NOERROR']) {

         continue;

      }

      
$t[1] = $t[1][0];

      
$t[1] = build_tree($t[1], $global_parens$global_unary_operators$global_binary_operators);

      if (
$t[1][1] != $global_error_names['NOERROR']) {

         continue;

      }

      
$t[1] = $t[1][0][0];

      
$t[1] = build_stack($t[1]);

      if (
$t[1][1] != $global_error_names['NOERROR']) {

         continue;

      }

      
$t[1] = $t[1][0];

      
$t[1] = process_stack($t[1], $global_unary_operators$global_binary_operators);

      if (
$t[1][1] != $global_error_names['NOERROR']) {

         continue;

      }



      
$constants[$t[0]] = $t[1][0]; # Wenn bis hier noch kein Fehler aufgetreten

   
}                                # ist, speichern wir die Konstante



   
$constants array_merge($constants$global_constants);

      
# und f"uhren sie mit den Standardkonstanten zusammen



   # Jetzt holen wir uns die Funktionen und parsen die Terme in die Stacks



   
$functions unpack_function_terms($_REQUEST);



   foreach (
$functions as $key => $values) {

      if (
check_parens($values['term'], $global_parens) > -1) {

         unset(
$functions[$key]);

         continue;

      }

      
$values['stack'] = check_minus($values['term'], $global_parens);

      if (
$values['stack'][1] != $global_error_names['NOERROR']) {

         unset(
$functions[$key]);

         continue;

      }

      
$values['stack'] = $values['stack'][0];

      
$values['stack'] = add_times($values['stack'], $poss_for_mult'*');

      if (
$values['stack'][1] != $global_error_names['NOERROR']) {

         unset(
$functions[$key]);

         continue;

      }

      
$values['stack'] = $values['stack'][0];

      
$values['stack'] = tokenize($values['stack'], $global_parens$global_unary_operators,

                       
$global_binary_operators);

      if (
$values['stack'][1] != $global_error_names['NOERROR']) {

         unset(
$functions[$key]);

         continue;

      }

      
$values['stack'] = $values['stack'][0];

      
$values['stack'] = substitute($values['stack'], $constants);

      if (
$values['stack'][1] != $global_error_names['NOERROR']) {

         unset(
$functions[$key]);

         continue;

      }

      
$values['stack'] = $values['stack'][0];

      
$values['stack'] = build_tree($values['stack'], $global_parens$global_unary_operators$global_binary_operators);

      if (
$values['stack'][1] != $global_error_names['NOERROR']) {

         unset(
$functions[$key]);

         continue;

      }

      
$values['stack'] = $values['stack'][0][0];

      
$values['stack'] = build_stack($values['stack']);

      if (
$values['stack'][1] != $global_error_names['NOERROR']) {

         unset(
$functions[$key]);

         continue;

      }

      
$values['stack'] = $values['stack'][0];



      
$functions[$key] = $values;

      
$functions[$key]['param']['from'] = check_error($values['param']['from'], 'e'false'0');

      
$functions[$key]['param']['to'] = check_error($values['param']['to'], 'e'false'0');

      
$functions[$key]['param']['step'] = check_error($values['param']['step'], 'e'false'0');



      if (
$functions[$key]['param']['from'] > $functions[$key]['param']['to']) {

         
$temp                             $functions[$key]['param']['from'];

         
$functions[$key]['param']['from'] = $functions[$key]['param']['to'];

         
$functions[$key]['param']['to']   = $temp;

      }

   }



   
# Wir wollen mindestens eine Funktion haben, also ...



   
if (count($functions) == 0) {

      
array_push($functions, array(

         
'term'  => $plotter_standards{'func'}[1],

         
'color' => $plotter_standards{'PL_color'}[1],

         
'param' => array(

            
'name' => 'NOPARAM',

            
'from' => 0,

            
'to'   => 0,

            
'step' => 1

         
)

      ));

      
$key 0;

      
$values $functions[0];

         if (
check_parens($values['term'], $global_parens) > -1) {

            unset(
$functions[$key]);

            break;

         }

         
$values['stack'] = check_minus($values['term'], $global_parens);

         if (
$values['stack'][1] != $global_error_names['NOERROR']) {

            unset(
$functions[$key]);

            break;

         }

         
$values['stack'] = $values['stack'][0];

         
$values['stack'] = add_times($values['stack'], $poss_for_mult'*');

         if (
$values['stack'][1] != $global_error_names['NOERROR']) {

            unset(
$functions[$key]);

            break;

         }

         
$values['stack'] = $values['stack'][0];

         
$values['stack'] = tokenize($values['stack'], $global_parens$global_unary_operators,

                          
$global_binary_operators);

         if (
$values['stack'][1] != $global_error_names['NOERROR']) {

            unset(
$functions[$key]);

            break;

         }

         
$values['stack'] = $values['stack'][0];

         
$values['stack'] = substitute($values['stack'], $constants);

         if (
$values['stack'][1] != $global_error_names['NOERROR']) {

            unset(
$functions[$key]);

            break;

         }

         
$values['stack'] = $values['stack'][0];

         
$values['stack'] = build_tree($values['stack'], $global_parens$global_unary_operators$global_binary_operators);

         if (
$values['stack'][1] != $global_error_names['NOERROR']) {

            unset(
$functions[$key]);

            break;

         }

         
$values['stack'] = $values['stack'][0][0];

         
$values['stack'] = build_stack($values['stack']);

         if (
$values['stack'][1] != $global_error_names['NOERROR']) {

            unset(
$functions[$key]);

            break;

         }

         
$values['stack'] = $values['stack'][0];



      
$functions[$key] = $values;

      
$functions[$key]['param']['from'] = check_error($values['param']['from'], 'e'false'0');

      
$functions[$key]['param']['to'] = check_error($values['param']['to'], 'e'false'0');

      
$functions[$key]['param']['step'] = check_error($values['param']['step'], 'e'false'0');

   }



   
# Das gleiche Procedere f"ur die Asymptoten, aber ohne Stacks ...



   
$asymptotes unpack_asymptote_terms($_REQUEST);

   foreach (
$asymptotes as $key => $values) {

      
$asymptotes[$key]['p1_x']   = check_error($values['p1_x'],   'e'false$plotter_standards{'asym_px1'}[1], $constants);

      
$asymptotes[$key]['p1_y']   = check_error($values['p1_y'],   'e'false$plotter_standards{'asym_py1'}[1], $constants);

      
$asymptotes