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 0 != 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äre Operatoren)</b></i> werden unterstü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äre Operatoren)</b></i> werden unterstützt:<br>
<?php
$i = 0;
foreach ($global_binary_operators as $prec) {
++$i;
print "<u>Prä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ßerdem sind folgende <i><b>Klammern</i></b> verfügbar:<br>
<?php
foreach ($global_parens as $pair) {
print "öffnet als '$pair[0]', schließt als '$pair[1]'<br>\n";
}
?>
<br><br><br>
<a href="source.php">© 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ö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