Remove old web site files.
@ -1 +0,0 @@
|
||||
RewriteEngine Off
|
653
www/account.php
@ -1,653 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// "$Id$"
|
||||
//
|
||||
// Account management page...
|
||||
//
|
||||
|
||||
//
|
||||
// Include necessary headers...
|
||||
//
|
||||
|
||||
include_once "phplib/html.php";
|
||||
include_once "phplib/common.php";
|
||||
include_once "phplib/str.php";
|
||||
|
||||
|
||||
//
|
||||
// Access levels...
|
||||
//
|
||||
|
||||
$levels = array(
|
||||
AUTH_USER => "User",
|
||||
AUTH_DEVEL => "Devel",
|
||||
AUTH_ADMIN => "Admin"
|
||||
);
|
||||
|
||||
|
||||
//
|
||||
// 'account_header()' - Show standard account page header...
|
||||
//
|
||||
|
||||
function
|
||||
account_header($title)
|
||||
{
|
||||
global $PHP_SELF, $LOGIN_USER, $LOGIN_LEVEL;
|
||||
|
||||
html_header("$title");
|
||||
|
||||
html_start_links(1);
|
||||
html_link("$LOGIN_USER", "$PHP_SELF");
|
||||
html_link("Change Password", "$PHP_SELF?P");
|
||||
if ($LOGIN_LEVEL == AUTH_ADMIN)
|
||||
html_link("Manage Accounts", "$PHP_SELF?A");
|
||||
if ($LOGIN_LEVEL > AUTH_USER)
|
||||
html_link("New/Pending", "$PHP_SELF?L");
|
||||
html_link("Logout", "$PHP_SELF?X");
|
||||
html_end_links();
|
||||
}
|
||||
|
||||
|
||||
if ($argc == 1 && $argv[0] == "X")
|
||||
auth_logout();
|
||||
|
||||
if ($LOGIN_USER == "")
|
||||
{
|
||||
header("Location: login.php");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if ($argc >= 1)
|
||||
{
|
||||
$op = $argv[0][0];
|
||||
$data = substr($argv[0], 1);
|
||||
}
|
||||
else
|
||||
$op = "";
|
||||
|
||||
switch ($op)
|
||||
{
|
||||
case 'A' :
|
||||
// Manage accounts...
|
||||
if ($LOGIN_LEVEL < AUTH_ADMIN)
|
||||
{
|
||||
header("Location: $PHP_SELF");
|
||||
exit();
|
||||
}
|
||||
|
||||
if ($data == "add")
|
||||
{
|
||||
if ($REQUEST_METHOD == "POST")
|
||||
{
|
||||
// Get data from form...
|
||||
if (array_key_exists("IS_PUBLISHED", $_POST))
|
||||
$is_published = (int)$_POST["IS_PUBLISHED"];
|
||||
else
|
||||
$is_published = 1;
|
||||
|
||||
if (array_key_exists("NAME", $_POST))
|
||||
$name = $_POST["NAME"];
|
||||
else
|
||||
$name = "";
|
||||
|
||||
if (array_key_exists("EMAIL", $_POST))
|
||||
$email = $_POST["EMAIL"];
|
||||
else
|
||||
$email = "";
|
||||
|
||||
if (array_key_exists("PASSWORD", $_POST))
|
||||
$password = $_POST["PASSWORD"];
|
||||
else
|
||||
$password = "";
|
||||
|
||||
if (array_key_exists("PASSWORD2", $_POST))
|
||||
$password2 = $_POST["PASSWORD2"];
|
||||
else
|
||||
$password2 = "";
|
||||
|
||||
if (array_key_exists("LEVEL", $_POST))
|
||||
$level = (int)$_POST["LEVEL"];
|
||||
else
|
||||
$level = AUTH_USER;
|
||||
|
||||
if ($name != "" && $email != "" &&
|
||||
(($password == "" && $password2 == "") ||
|
||||
$password == $password2))
|
||||
$havedata = 1;
|
||||
else
|
||||
$havedata = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Use blank account info...
|
||||
$name = "";
|
||||
$is_published = 0;
|
||||
$email = $row["email"];
|
||||
$level = $row["level"];
|
||||
$password = "";
|
||||
$password2 = "";
|
||||
$havedata = 0;
|
||||
}
|
||||
|
||||
account_header("Add Account");
|
||||
|
||||
if ($havedata)
|
||||
{
|
||||
// Store new data...
|
||||
$hash = md5("$name:$password");
|
||||
$name = db_escape($name);
|
||||
$email = db_escape($email);
|
||||
$date = time();
|
||||
|
||||
db_query("INSERT INTO users VALUES(NULL,$is_published,"
|
||||
."'$name','$email','$hash',$level,$date,'$LOGIN_USER',"
|
||||
."$date,'$LOGIN_USER')");
|
||||
|
||||
print("<p>Account added successfully!</p>\n");
|
||||
|
||||
html_start_links(1);
|
||||
html_link("Return to Manage Accounts", "$PHP_SELF?A");
|
||||
html_end_links();
|
||||
}
|
||||
else
|
||||
{
|
||||
$name = htmlspecialchars($name, ENT_QUOTES);
|
||||
$email = htmlspecialchars($email, ENT_QUOTES);
|
||||
|
||||
print("<form method='POST' action='$PHP_SELF?Aadd'>"
|
||||
."<table width='100%'>\n"
|
||||
."<tr><th align='right'>Published:</th>"
|
||||
."<td>");
|
||||
select_is_published($is_published);
|
||||
print("</td></tr>\n"
|
||||
."<tr><th align='right'>Username:</th>"
|
||||
."<td><input type='text' name='NAME' size='40' "
|
||||
."maxsize='255' value='$name'></td></tr>\n"
|
||||
."<tr><th align='right'>EMail:</th>"
|
||||
."<td><input type='text' name='EMAIL' size='40' "
|
||||
."maxsize='255' value='$email'></td></tr>\n"
|
||||
."<tr><th align='right'>Access Level:</th>"
|
||||
."<td><select name='LEVEL'>");
|
||||
|
||||
reset($levels);
|
||||
while (list($key, $val) = each($levels))
|
||||
{
|
||||
if ($level == $key)
|
||||
print("<option value='$key' selected>$val</option>");
|
||||
else
|
||||
print("<option value='$key'>$val</option>");
|
||||
}
|
||||
|
||||
print("</select></td></tr>\n"
|
||||
."<tr><th align='right'>Password:</th>"
|
||||
."<td><input type='password' name='PASSWORD' size='16' "
|
||||
."maxsize='255'></td></tr>\n"
|
||||
."<tr><th align='right'>Password Again:</th>"
|
||||
."<td><input type='password' name='PASSWORD2' size='16' "
|
||||
."maxsize='255'></td></tr>\n"
|
||||
."<tr><th></th><td><input type='submit' value='Add Account'>"
|
||||
."</td></tr>\n"
|
||||
."</table></form>\n");
|
||||
}
|
||||
|
||||
html_footer();
|
||||
}
|
||||
else if ($data == "batch")
|
||||
{
|
||||
// Disable/enable/expire/etc. accounts...
|
||||
if ($REQUEST_METHOD == "POST" && array_key_exists("OP", $_POST))
|
||||
{
|
||||
$op = $_POST["OP"];
|
||||
|
||||
db_query("BEGIN TRANSACTION");
|
||||
|
||||
reset($_POST);
|
||||
while (list($key, $val) = each($_POST))
|
||||
if (substr($key, 0, 3) == "ID_")
|
||||
{
|
||||
$id = (int)substr($key, 3);
|
||||
|
||||
if ($op == "disable")
|
||||
db_query("UPDATE users SET is_published = 0 WHERE id = $id");
|
||||
else if ($op == "enable")
|
||||
db_query("UPDATE users SET is_published = 1 WHERE id = $id");
|
||||
}
|
||||
|
||||
db_query("COMMIT TRANSACTION");
|
||||
}
|
||||
|
||||
header("Location: $PHP_SELF?A");
|
||||
}
|
||||
else if ($data == "modify")
|
||||
{
|
||||
// Modify account...
|
||||
if ($argc != 2 || $argv[1] == "")
|
||||
{
|
||||
header("Location: $PHP_SELF?A");
|
||||
exit();
|
||||
}
|
||||
|
||||
$name = $argv[1];
|
||||
|
||||
if ($REQUEST_METHOD == "POST")
|
||||
{
|
||||
// Get data from form...
|
||||
if (array_key_exists("IS_PUBLISHED", $_POST))
|
||||
$is_published = (int)$_POST["IS_PUBLISHED"];
|
||||
else
|
||||
$is_published = 1;
|
||||
|
||||
if (array_key_exists("EMAIL", $_POST))
|
||||
$email = $_POST["EMAIL"];
|
||||
else
|
||||
$email = "";
|
||||
|
||||
if (array_key_exists("PASSWORD", $_POST))
|
||||
$password = $_POST["PASSWORD"];
|
||||
else
|
||||
$password = "";
|
||||
|
||||
if (array_key_exists("PASSWORD2", $_POST))
|
||||
$password2 = $_POST["PASSWORD2"];
|
||||
else
|
||||
$password2 = "";
|
||||
|
||||
if (array_key_exists("LEVEL", $_POST))
|
||||
$level = (int)$_POST["LEVEL"];
|
||||
else
|
||||
$level = AUTH_USER;
|
||||
|
||||
if ($email != "" &&
|
||||
(($password == "" && $password2 == "") ||
|
||||
$password == $password2))
|
||||
$havedata = 1;
|
||||
else
|
||||
$havedata = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Get data from existing account...
|
||||
$result = db_query("SELECT * FROM users WHERE "
|
||||
."name='" . db_escape($name) ."'");
|
||||
if (db_count($result) != 1)
|
||||
{
|
||||
header("Location: $PHP_SELF?A");
|
||||
exit();
|
||||
}
|
||||
|
||||
$row = db_next($result);
|
||||
$is_published = $row["is_published"];
|
||||
$email = $row["email"];
|
||||
$level = $row["level"];
|
||||
$password = "";
|
||||
$password2 = "";
|
||||
$havedata = 0;
|
||||
|
||||
db_free($result);
|
||||
}
|
||||
|
||||
account_header("Modify $name");
|
||||
|
||||
if ($havedata)
|
||||
{
|
||||
// Store new data...
|
||||
if ($password != "")
|
||||
$hash = ", hash='" . md5("$name:$password") . "'";
|
||||
else
|
||||
$hash = "";
|
||||
|
||||
$name = db_escape($name);
|
||||
$email = db_escape($email);
|
||||
$date = time();
|
||||
|
||||
db_query("UPDATE users SET "
|
||||
."email='$email'$hash, level='$level', "
|
||||
."is_published=$is_published, modify_user='$LOGIN_USER', "
|
||||
."modify_date = $date WHERE name='$name'");
|
||||
|
||||
print("<p>Account modified successfully!</p>\n");
|
||||
|
||||
html_start_links(1);
|
||||
html_link("Return to Manage Accounts", "$PHP_SELF?A");
|
||||
html_end_links();
|
||||
}
|
||||
else
|
||||
{
|
||||
$name = htmlspecialchars($name, ENT_QUOTES);
|
||||
$email = htmlspecialchars($email, ENT_QUOTES);
|
||||
|
||||
print("<form method='POST' action='$PHP_SELF?Amodify+$name'>"
|
||||
."<table width='100%'>\n"
|
||||
."<tr><th align='right'>Published:</th>"
|
||||
."<td>");
|
||||
select_is_published($is_published);
|
||||
print("</td></tr>\n"
|
||||
."<tr><th align='right'>Username:</th>"
|
||||
."<td>$name</td></tr>\n"
|
||||
."<tr><th align='right'>EMail:</th>"
|
||||
."<td><input type='text' name='EMAIL' size='40' "
|
||||
."maxsize='255' value='$email'></td></tr>\n"
|
||||
."<tr><th align='right'>Access Level:</th>"
|
||||
."<td>");
|
||||
|
||||
if ($LOGIN_USER == $name)
|
||||
print("<input type='hidden' name='LEVEL' value='$level'>"
|
||||
. $levels[$level]);
|
||||
else
|
||||
{
|
||||
print("<select name='LEVEL'>");
|
||||
|
||||
reset($levels);
|
||||
while (list($key, $val) = each($levels))
|
||||
{
|
||||
if ($level == $key)
|
||||
print("<option value='$key' selected>$val</option>");
|
||||
else
|
||||
print("<option value='$key'>$val</option>");
|
||||
}
|
||||
|
||||
print("</select>");
|
||||
}
|
||||
|
||||
print("</td></tr>\n"
|
||||
."<tr><th align='right'>Password:</th>"
|
||||
."<td><input type='password' name='PASSWORD' size='16' "
|
||||
."maxsize='255'></td></tr>\n"
|
||||
."<tr><th align='right'>Password Again:</th>"
|
||||
."<td><input type='password' name='PASSWORD2' size='16' "
|
||||
."maxsize='255'></td></tr>\n"
|
||||
."<tr><th></th><td><input type='submit' value='Modify Account'>"
|
||||
."</td></tr>\n"
|
||||
."</table></form>\n");
|
||||
}
|
||||
|
||||
html_footer();
|
||||
}
|
||||
else
|
||||
{
|
||||
// List accounts...
|
||||
account_header("Manage Accounts");
|
||||
|
||||
$result = db_query("SELECT * FROM users ORDER BY name");
|
||||
|
||||
print("<form method='POST' action='$PHP_SELF?Abatch'>\n");
|
||||
|
||||
html_start_table(array("Username", "EMail", "Level"));
|
||||
|
||||
while ($row = db_next($result))
|
||||
{
|
||||
$name = htmlspecialchars($row["name"], ENT_QUOTES);
|
||||
$email = htmlspecialchars($row["email"], ENT_QUOTES);
|
||||
$level = $levels[$row["level"]];
|
||||
|
||||
if ($row["is_published"] == 0)
|
||||
$email .= " <img src='images/private.gif' width='16' height='16' "
|
||||
."border='0' align='middle' alt='Private'>";
|
||||
|
||||
html_start_row();
|
||||
print("<td nowrap><input type='checkbox' name='ID_$row[id]'>"
|
||||
."<a href='$PHP_SELF?Amodify+$name'>$name</a></td>"
|
||||
."<td align='center'><a href='$PHP_SELF?Amodify+$name'>"
|
||||
."$email</a></td>"
|
||||
."<td align='center'><a href='$PHP_SELF?Amodify+$name'>"
|
||||
."$level</a></td>");
|
||||
html_end_row();
|
||||
}
|
||||
|
||||
html_end_table();
|
||||
|
||||
print("<p align='center'><select name='OP'>"
|
||||
."<option value='disable'>Disable</option>"
|
||||
."<option value='enable'>Enable</option>"
|
||||
."</select>"
|
||||
."<input type='submit' value='Checked Accounts'></p>");
|
||||
|
||||
html_start_links(1);
|
||||
html_link("Add Account", "$PHP_SELF?Aadd");
|
||||
html_end_links();
|
||||
|
||||
html_footer();
|
||||
}
|
||||
break;
|
||||
|
||||
case 'L' :
|
||||
// List
|
||||
if ($LOGIN_LEVEL < AUTH_DEVEL)
|
||||
{
|
||||
header("Location: $PHP_SELF");
|
||||
exit();
|
||||
}
|
||||
|
||||
account_header("New/Pending");
|
||||
|
||||
$email = db_escape($_COOKIE["FROM"]);
|
||||
|
||||
print("<h2>New/Pending Articles:</h2>\n");
|
||||
|
||||
$result = db_query("SELECT * FROM article WHERE is_published = 0 "
|
||||
."ORDER BY modify_date");
|
||||
$count = db_count($result);
|
||||
|
||||
if ($count == 0)
|
||||
print("<p>No new/pending articles found.</p>\n");
|
||||
else
|
||||
{
|
||||
html_start_table(array("Id", "Title", "Last Updated"));
|
||||
|
||||
while ($row = db_next($result))
|
||||
{
|
||||
$id = $row['id'];
|
||||
$title = htmlspecialchars($row['title'], ENT_QUOTES) .
|
||||
" <img src='images/private.gif' width='16' height='16' "
|
||||
."border='0' align='middle' alt='Private'>";
|
||||
$abstract = htmlspecialchars($row['abstract'], ENT_QUOTES);
|
||||
$date = date("M d, Y", $row['modify_date']);
|
||||
|
||||
html_start_row();
|
||||
|
||||
print("<td align='center' nowrap><a "
|
||||
."href='articles.php?L$id$options'>$id</a></td>"
|
||||
."<td width='67%' align='center'><a "
|
||||
."href='articles.php?L$id$options'>$title</a></td>"
|
||||
."<td align='center'><a "
|
||||
."href='articles.php?L$id$options'>$date</a></td>");
|
||||
|
||||
html_end_row();
|
||||
|
||||
html_start_row();
|
||||
|
||||
print("<td></td><td colspan='2'>$abstract</td>");
|
||||
|
||||
html_end_row();
|
||||
}
|
||||
|
||||
html_end_table();
|
||||
}
|
||||
|
||||
db_free($result);
|
||||
|
||||
print("<h2>New/Pending Links:</h2>\n");
|
||||
|
||||
$result = db_query("SELECT * FROM link WHERE is_published = 0 "
|
||||
."ORDER BY modify_date");
|
||||
$count = db_count($result);
|
||||
|
||||
if ($count == 0)
|
||||
print("<p>No new/pending links found.</p>\n");
|
||||
else
|
||||
{
|
||||
html_start_table(array("Id", "Name/Version", "Last Updated"));
|
||||
|
||||
while ($row = db_next($result))
|
||||
{
|
||||
$id = $row['id'];
|
||||
$title = htmlspecialchars($row['name'], ENT_QUOTES) . " " .
|
||||
htmlspecialchars($row['version'], ENT_QUOTES) .
|
||||
" <img src='images/private.gif' width='16' height='16' "
|
||||
."border='0' align='middle' alt='Private'>";
|
||||
$date = date("M d, Y", $row['modify_date']);
|
||||
|
||||
if ($row["is_category"])
|
||||
$link = "<a href='links.php?UC$id'>";
|
||||
else
|
||||
$link = "<a href='links.php?UL$id'>";
|
||||
|
||||
html_start_row();
|
||||
|
||||
print("<td align='center' nowrap>$link$id</a></td>"
|
||||
."<td width='67%' align='center'>$link$title</a></td>"
|
||||
."<td align='center'>$link$date</a></td>");
|
||||
|
||||
html_end_row();
|
||||
}
|
||||
|
||||
html_end_table();
|
||||
}
|
||||
|
||||
db_free($result);
|
||||
|
||||
print("<h2>New/Pending STRs:</h2>\n");
|
||||
|
||||
$result = db_query("SELECT * FROM str WHERE status >= $STR_STATUS_PENDING "
|
||||
."AND (manager_email == '' OR manager_email = '$email') "
|
||||
."ORDER BY status DESC, priority DESC, scope DESC, "
|
||||
."modify_date");
|
||||
$count = db_count($result);
|
||||
|
||||
if ($count == 0)
|
||||
print("<p>No new/pending STRs found.</p>\n");
|
||||
else
|
||||
{
|
||||
html_start_table(array("Id", "Priority", "Status", "Scope",
|
||||
"Summary", "Version", "Last Updated",
|
||||
"Assigned To"));
|
||||
|
||||
while ($row = db_next($result))
|
||||
{
|
||||
$date = date("M d, Y", $row['modify_date']);
|
||||
$summary = htmlspecialchars($row['summary'], ENT_QUOTES);
|
||||
$summabbr = htmlspecialchars(abbreviate($row['summary'], 80), ENT_QUOTES);
|
||||
$prtext = $priority_text[$row['priority']];
|
||||
$sttext = $status_text[$row['status']];
|
||||
$sctext = $scope_text[$row['scope']];
|
||||
|
||||
if ($row['is_published'] == 0)
|
||||
$summabbr .= " <img src='images/private.gif' width='16' height='16' "
|
||||
."border='0' align='middle' alt='Private'>";
|
||||
|
||||
html_start_row();
|
||||
|
||||
print("<td nowrap>"
|
||||
."<a href='str.php?L$row[id]$options' alt='STR #$row[id]: $summary'>"
|
||||
."$row[id]</a></td>"
|
||||
."<td align='center'>$prtext</td>"
|
||||
."<td align='center'>$sttext</td>"
|
||||
."<td align='center'>$sctext</td>"
|
||||
."<td align='center'><a href='str.php?L$row[id]$options' "
|
||||
."alt='STR #$row[id]: $summary'>$summabbr</a></td>"
|
||||
."<td align='center'>$row[str_version]</td>"
|
||||
."<td align='center'>$date</td>");
|
||||
|
||||
if ($row['manager_email'] != "")
|
||||
$email = sanitize_email($row['manager_email']);
|
||||
else
|
||||
$email = "<i>Unassigned</i>";
|
||||
|
||||
print("<td align='center'>$email</td>");
|
||||
|
||||
html_end_row();
|
||||
}
|
||||
|
||||
html_end_table();
|
||||
}
|
||||
|
||||
db_free($result);
|
||||
|
||||
// Show hidden comments...
|
||||
print("<h2>Hidden Comments:</h2>\n");
|
||||
|
||||
$result = db_query("SELECT * FROM comment WHERE status = 0 ORDER BY id");
|
||||
|
||||
if (db_count($result) == 0)
|
||||
print("<p>No hidden comments.</p>\n");
|
||||
else
|
||||
{
|
||||
print("<ul>\n");
|
||||
|
||||
while ($row = db_next($result))
|
||||
{
|
||||
$create_date = date("M d, Y", $row['create_date']);
|
||||
$create_user = sanitize_email($row['create_user']);
|
||||
$contents = sanitize_text($row['contents']);
|
||||
$location = str_replace("_", "?", $row['url']);
|
||||
|
||||
print("<li><a href='$location'>$row[url]</a> "
|
||||
." by $create_user on $create_date "
|
||||
."<a href='comment.php?e$row[id]+p$row[url]'>Edit</a> "
|
||||
."· <a href='comment.php?d$row[id]+p$row[url]'>Delete</a>"
|
||||
."<br><tt>$contents</tt></li>\n");
|
||||
}
|
||||
|
||||
print("</ul>\n");
|
||||
}
|
||||
|
||||
db_free($result);
|
||||
|
||||
html_footer();
|
||||
break;
|
||||
|
||||
case 'P' :
|
||||
// Change password
|
||||
account_header("Change Password");
|
||||
|
||||
if ($REQUEST_METHOD == "POST" &&
|
||||
array_key_exists("PASSWORD", $_POST) &&
|
||||
array_key_exists("PASSWORD2", $_POST) &&
|
||||
$_POST["PASSWORD"] == $_POST["PASSWORD2"])
|
||||
{
|
||||
// Store new password and re-login...
|
||||
print("<p>Password changed successfully!</p>\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
print("<form method='POST' action='$PHP_SELF?P'>"
|
||||
."<table width='100%'>\n"
|
||||
."<tr><th align='right'>Password:</th>"
|
||||
."<td><input type='password' name='PASSWORD' size='16' "
|
||||
."maxsize='255'></td></tr>\n"
|
||||
."<tr><th align='right'>Password Again:</th>"
|
||||
."<td><input type='password' name='PASSWORD2' size='16' "
|
||||
."maxsize='255'></td></tr>\n"
|
||||
."<tr><th></th><td><input type='submit' value='Change Password'>"
|
||||
."</td></tr>\n"
|
||||
."</table></form>\n");
|
||||
}
|
||||
|
||||
html_footer();
|
||||
break;
|
||||
|
||||
default :
|
||||
// Show account info...
|
||||
account_header($LOGIN_USER);
|
||||
|
||||
if (array_key_exists("FROM", $_COOKIE))
|
||||
$email = htmlspecialchars($_COOKIE["FROM"]);
|
||||
else
|
||||
$email = "<i>unknown</i>";
|
||||
|
||||
print("<center><table border='0'>\n"
|
||||
."<tr><th align='right'>Username:</th><td>$LOGIN_USER</td></tr>\n"
|
||||
."<tr><th align='right'>EMail:</th><td>$email</td></tr>\n"
|
||||
."<tr><th align='right'>Access Level:</th>"
|
||||
."<td>$levels[$LOGIN_LEVEL]</td></tr>\n"
|
||||
."</table></center>\n");
|
||||
|
||||
html_footer();
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// End of "$Id$".
|
||||
//
|
||||
?>
|
857
www/articles.php
@ -1,857 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// "$Id$"
|
||||
//
|
||||
// Web form for the article table...
|
||||
//
|
||||
// Contents:
|
||||
//
|
||||
// notify_users() - Notify users of new/updated articles...
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
// Include necessary headers...
|
||||
//
|
||||
|
||||
include_once "phplib/html.php";
|
||||
include_once "phplib/common.php";
|
||||
|
||||
|
||||
//
|
||||
// 'notify_users()' - Notify users of new/updated articles...
|
||||
//
|
||||
|
||||
function
|
||||
notify_users($id, // I - Article #
|
||||
$what = "created") // I - Reason for notification
|
||||
{
|
||||
global $PHP_URL, $PROJECT_EMAIL, $PROJECT_NAME;
|
||||
|
||||
|
||||
$result = db_query("SELECT * FROM article WHERE id = $id");
|
||||
if (db_count($result) == 1)
|
||||
{
|
||||
$row = db_next($result);
|
||||
|
||||
mail($PROJECT_EMAIL, "$PROJECT_NAME Article #$id $what",
|
||||
wordwrap("$row[create_user] has $what an article titled, "
|
||||
."'$row[title]' with the following abstract:\n\n"
|
||||
." $row[abstract]\n\n"
|
||||
."Please approve or delete this article via the following "
|
||||
."page:\n\n"
|
||||
." $PHP_URL?L$id\n"),
|
||||
"From: $PROJECT_EMAIL\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Get command-line options...
|
||||
//
|
||||
// Usage: article.php [operation] [options]
|
||||
//
|
||||
// Operations:
|
||||
//
|
||||
// B - Batch update selected articles
|
||||
// D# - Delete article
|
||||
// L = List all
|
||||
// L# = List article #
|
||||
// M# = Modify article #
|
||||
// N = Create new article
|
||||
//
|
||||
// Options:
|
||||
//
|
||||
// I# = Set first article
|
||||
// Qtext = Set search text
|
||||
|
||||
$search = "";
|
||||
$index = 0;
|
||||
|
||||
if ($argc)
|
||||
{
|
||||
$op = $argv[0][0];
|
||||
$id = (int)substr($argv[0], 1);
|
||||
|
||||
if ($op != 'D' && $op != 'L' && $op != 'M' && $op != 'N' && $op != 'B')
|
||||
{
|
||||
html_header("Article Error");
|
||||
print("<p>Bad command '$op'!\n");
|
||||
html_footer();
|
||||
exit();
|
||||
}
|
||||
|
||||
if ($op != 'L' && $LOGIN_USER == "")
|
||||
{
|
||||
header("Location: login.php");
|
||||
exit();
|
||||
}
|
||||
|
||||
if (($op == 'D' || $op == 'M') && !$id)
|
||||
{
|
||||
html_header("Article Error");
|
||||
print("<p>Command '$op' requires an ID!\n");
|
||||
html_footer();
|
||||
exit();
|
||||
}
|
||||
|
||||
if ($op == 'B' && $LOGIN_LEVEL < AUTH_DEVEL)
|
||||
{
|
||||
html_header("Article Error");
|
||||
print("<p>You don't have permission to use command '$op'!\n");
|
||||
html_footer();
|
||||
exit();
|
||||
}
|
||||
|
||||
if (($op == 'D' || $op == 'M') && $LOGIN_LEVEL < AUTH_DEVEL)
|
||||
{
|
||||
$result = db_query("SELECT * FROM article WHERE id = $id");
|
||||
if (db_count($result) != 1)
|
||||
{
|
||||
db_free($result);
|
||||
|
||||
html_header("Article Error");
|
||||
print("<p>Article #$id does not exist!\n");
|
||||
html_footer();
|
||||
exit();
|
||||
}
|
||||
|
||||
$row = db_next($result);
|
||||
|
||||
if ($row['create_user'] != $LOGIN_USER &&
|
||||
$row['create_user'] != $LOGIN_EMAIL)
|
||||
{
|
||||
db_free($result);
|
||||
|
||||
html_header("Article Error");
|
||||
print("<p>You don't have permission to use command '$op'!\n");
|
||||
html_footer();
|
||||
exit();
|
||||
}
|
||||
|
||||
db_free($result);
|
||||
}
|
||||
|
||||
if ($op == 'N' && $id)
|
||||
{
|
||||
html_header("Article Error");
|
||||
print("<p>Command '$op' may not have an ID!\n");
|
||||
html_footer();
|
||||
exit();
|
||||
}
|
||||
|
||||
for ($i = 1; $i < $argc; $i ++)
|
||||
{
|
||||
$option = substr($argv[$i], 1);
|
||||
|
||||
switch ($argv[$i][0])
|
||||
{
|
||||
case 'Q' : // Set search text
|
||||
$search = urldecode($option);
|
||||
$i ++;
|
||||
while ($i < $argc)
|
||||
{
|
||||
$search .= urldecode(" $argv[$i]");
|
||||
$i ++;
|
||||
}
|
||||
break;
|
||||
case 'I' : // Set first STR
|
||||
$index = (int)$option;
|
||||
if ($index < 0)
|
||||
$index = 0;
|
||||
break;
|
||||
default :
|
||||
html_header("Article Error");
|
||||
print("<p>Bad option '$argv[$i]'!</p>\n");
|
||||
html_footer();
|
||||
exit();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$op = 'L';
|
||||
$id = 0;
|
||||
}
|
||||
|
||||
if ($REQUEST_METHOD == "POST")
|
||||
{
|
||||
if (array_key_exists("SEARCH", $_POST))
|
||||
$search = $_POST["SEARCH"];
|
||||
}
|
||||
|
||||
$options = "+I$index+Q" . urlencode($search);
|
||||
|
||||
switch ($op)
|
||||
{
|
||||
case 'B' : // Batch update selected articles
|
||||
if ($REQUEST_METHOD != "POST")
|
||||
{
|
||||
header("Location: $PHP_SELF?L$options");
|
||||
break;
|
||||
}
|
||||
|
||||
if (array_key_exists("IS_PUBLISHED", $_POST) &&
|
||||
$_POST["IS_PUBLISHED"] != "")
|
||||
{
|
||||
$modify_date = time();
|
||||
$modify_user = db_escape($LOGIN_USER);
|
||||
$is_published = (int)$_POST["IS_PUBLISHED"];
|
||||
|
||||
$query = "is_published = $is_published, modify_date = $modify_date, "
|
||||
."modify_user = '$modify_user'";
|
||||
|
||||
db_query("BEGIN TRANSACTION");
|
||||
|
||||
reset($_POST);
|
||||
while (list($key, $val) = each($_POST))
|
||||
if (substr($key, 0, 3) == "ID_")
|
||||
{
|
||||
$id = (int)substr($key, 3);
|
||||
|
||||
db_query("UPDATE article SET $query WHERE id = $id");
|
||||
}
|
||||
|
||||
db_query("COMMIT TRANSACTION");
|
||||
}
|
||||
|
||||
header("Location: $PHP_SELF?L$options");
|
||||
break;
|
||||
|
||||
case 'D' : // Delete Article
|
||||
if ($REQUEST_METHOD == "POST")
|
||||
{
|
||||
db_query("DELETE FROM article WHERE id = $id");
|
||||
|
||||
header("Location: $PHP_SELF?L$options");
|
||||
}
|
||||
else
|
||||
{
|
||||
$result = db_query("SELECT * FROM article WHERE id = $id");
|
||||
if (db_count($result) != 1)
|
||||
{
|
||||
print("<p><b>Error:</b> Article #$id was not found!</p>\n");
|
||||
html_footer();
|
||||
exit();
|
||||
}
|
||||
|
||||
$row = db_next($result);
|
||||
|
||||
html_header("Delete Article #$id");
|
||||
|
||||
html_start_links(1);
|
||||
html_link("Return to Articles", "$PHP_SELF?L$options");
|
||||
html_link("View Article #$id", "$PHP_SELF?L$id$options");
|
||||
html_link("Modify Article #$id", "$PHP_SELF?M$id$options");
|
||||
html_end_links();
|
||||
|
||||
print("<form method='post' action='$PHP_SELF?D$id'>"
|
||||
."<table width='100%' cellpadding='5' cellspacing='0' border='0'>\n");
|
||||
|
||||
if (!$row['is_published'])
|
||||
print("<tr><th align='center' colspan='2'>This article is "
|
||||
."currently hidden from public view.</td></tr>\n");
|
||||
|
||||
$temp = htmlspecialchars($row["title"]);
|
||||
print("<tr><th align='right'>Title:</th><td class='left'>$temp</td></tr>\n");
|
||||
|
||||
$temp = htmlspecialchars($row["abstract"]);
|
||||
print("<tr><th align='right'>Abstract:</th><td class='left'>$temp</td></tr>\n");
|
||||
|
||||
$temp = format_text($row["contents"]);
|
||||
print("<tr><th align='right'>Contents:</th><td class='left'>$temp</td></tr>\n");
|
||||
|
||||
print("<tr><th colspan='2'>"
|
||||
."<input type='submit' value='Confirm Delete Article'></th></tr>\n");
|
||||
print("</table></form>\n");
|
||||
|
||||
html_footer();
|
||||
}
|
||||
break;
|
||||
|
||||
case 'L' : // List (all) Article(s)
|
||||
if ($id)
|
||||
{
|
||||
$result = db_query("SELECT * FROM article WHERE id = $id");
|
||||
if (db_count($result) != 1)
|
||||
{
|
||||
html_header("Article Error");
|
||||
print("<p><b>Error:</b> Article #$id was not found!</p>\n");
|
||||
html_footer();
|
||||
exit();
|
||||
}
|
||||
|
||||
$row = db_next($result);
|
||||
$title = htmlspecialchars($row['title']);
|
||||
$abstract = htmlspecialchars($row['abstract']);
|
||||
$contents = format_text($row['contents']);
|
||||
$create_user = sanitize_email($row['create_user']);
|
||||
$date = date("H:i M d, Y", $row['modify_date']);
|
||||
|
||||
html_header("Article #$id: $title");
|
||||
|
||||
html_start_links(1);
|
||||
html_link("Return to Articles", "$PHP_SELF?L$options");
|
||||
html_link("Show Comments", "#_USER_COMMENTS");
|
||||
html_link("Submit Comment", "comment.php?r0+particles.php_L$id");
|
||||
|
||||
if ($LOGIN_LEVEL >= AUTH_DEVEL ||
|
||||
$row['create_user'] == $LOGIN_USER)
|
||||
{
|
||||
html_link("Modify Article", "$PHP_SELF?M$id$options");
|
||||
html_link("Delete Article", "$PHP_SELF?D$id$options");
|
||||
}
|
||||
html_end_links();
|
||||
|
||||
if (!$row['is_published'])
|
||||
print("<p align='center'><b>This article is currently hidden from "
|
||||
."public view.</b></p>\n");
|
||||
|
||||
print("<p><i>$date by $create_user</i><br>$abstract</p>\n"
|
||||
."$contents\n"
|
||||
."<h1><a name='_USER_COMMENTS'>Comments</a></h1>\n");
|
||||
|
||||
html_start_links();
|
||||
html_link("Submit Comment", "comment.php?r0+particles.php_L$id");
|
||||
html_end_links();
|
||||
|
||||
show_comments("articles.php_L$id");
|
||||
|
||||
db_free($result);
|
||||
}
|
||||
else
|
||||
{
|
||||
html_header("Articles");
|
||||
|
||||
html_start_links(1);
|
||||
html_link("Submit Article", "$PHP_SELF?N$options");
|
||||
html_end_links();
|
||||
|
||||
$htmlsearch = htmlspecialchars($search, ENT_QUOTES);
|
||||
|
||||
print("<form method='POST' action='$PHP_SELF'><p align='center'>"
|
||||
."Search Words: <input type='text' size='60' "
|
||||
."name='SEARCH' value='$htmlsearch'>"
|
||||
."<input type='submit' value='Search Articles'></p></form>\n");
|
||||
|
||||
$query = "";
|
||||
$prefix = "WHERE ";
|
||||
|
||||
if ($LOGIN_LEVEL < AUTH_DEVEL)
|
||||
{
|
||||
$query .= "${prefix}(is_published = 1 OR create_user = '"
|
||||
. db_escape($LOGIN_USER) . "')";
|
||||
$prefix = " AND ";
|
||||
}
|
||||
|
||||
if ($search)
|
||||
{
|
||||
$search_string = str_replace("'", " ", $search);
|
||||
$search_string = str_replace("\"", " ", $search_string);
|
||||
$search_string = str_replace("\\", " ", $search_string);
|
||||
$search_string = str_replace("%20", " ", $search_string);
|
||||
$search_string = str_replace("%27", " ", $search_string);
|
||||
$search_string = str_replace(" ", " ", $search_string);
|
||||
$search_words = explode(' ', $search_string);
|
||||
|
||||
// Loop through the array of words, adding them to the
|
||||
$query .= "${prefix}(";
|
||||
$prefix = "";
|
||||
$next = " OR";
|
||||
$logic = "";
|
||||
|
||||
reset($search_words);
|
||||
while ($keyword = current($search_words))
|
||||
{
|
||||
next($search_words);
|
||||
$keyword = db_escape(ltrim(rtrim($keyword)));
|
||||
|
||||
if (strcasecmp($keyword, 'or') == 0)
|
||||
{
|
||||
$next = ' OR';
|
||||
if ($prefix != '')
|
||||
$prefix = ' OR';
|
||||
}
|
||||
else if (strcasecmp($keyword, 'and') == 0)
|
||||
{
|
||||
$next = ' AND';
|
||||
if ($prefix != '')
|
||||
$prefix = ' AND';
|
||||
}
|
||||
else if (strcasecmp($keyword, 'not') == 0)
|
||||
{
|
||||
$logic = ' NOT';
|
||||
}
|
||||
else
|
||||
{
|
||||
$keyword = db_escape($keyword);
|
||||
|
||||
if ($keyword == (int)$keyword)
|
||||
$idsearch = " OR id = " . (int)$keyword;
|
||||
else
|
||||
$idsearch = "";
|
||||
|
||||
$query .= "$prefix$logic (title LIKE \"%$keyword%\"$idsearch"
|
||||
." OR abstract LIKE \"%$keyword%\""
|
||||
." OR contents LIKE \"%$keyword%\")";
|
||||
$prefix = $next;
|
||||
$logic = '';
|
||||
}
|
||||
}
|
||||
|
||||
$query .= ")";
|
||||
}
|
||||
|
||||
$result = db_query("SELECT * FROM article $query "
|
||||
."ORDER BY modify_date DESC");
|
||||
$count = db_count($result);
|
||||
|
||||
if ($count == 0)
|
||||
{
|
||||
print("<p>No Articles found.</p>\n");
|
||||
|
||||
html_footer();
|
||||
exit();
|
||||
}
|
||||
|
||||
if ($index >= $count)
|
||||
$index = $count - ($count % $PAGE_MAX);
|
||||
if ($index < 0)
|
||||
$index = 0;
|
||||
|
||||
$start = $index + 1;
|
||||
$end = $index + $PAGE_MAX;
|
||||
if ($end > $count)
|
||||
$end = $count;
|
||||
|
||||
$prev = $index - $PAGE_MAX;
|
||||
if ($prev < 0)
|
||||
$prev = 0;
|
||||
$next = $index + $PAGE_MAX;
|
||||
|
||||
print("<p>$count article(s) found, showing $start to $end:</p>\n");
|
||||
|
||||
if ($LOGIN_LEVEL >= AUTH_DEVEL)
|
||||
print("<form method='POST' action='$PHP_SELF?B$options'>\n");
|
||||
|
||||
if ($count > $PAGE_MAX)
|
||||
{
|
||||
print("<table border='0' cellspacing='0' cellpadding='0' "
|
||||
."width='100%'>\n");
|
||||
|
||||
print("<tr><td>");
|
||||
if ($index > 0)
|
||||
print("<a href='$PHP_SELF?L+I$prev+Q" . urlencode($search)
|
||||
."'>Previous $PAGE_MAX</a>");
|
||||
print("</td><td align='right'>");
|
||||
if ($end < $count)
|
||||
{
|
||||
$next_count = min($PAGE_MAX, $count - $end);
|
||||
print("<a href='$PHP_SELF?L+I$next+Q" . urlencode($search)
|
||||
."'>Next $next_count</a>");
|
||||
}
|
||||
print("</td></tr>\n");
|
||||
print("</table>\n");
|
||||
}
|
||||
|
||||
html_start_table(array("ID","Title","Last Modified", "Comment(s)"));
|
||||
|
||||
db_seek($result, $index);
|
||||
for ($i = 0; $i < $PAGE_MAX && $row = db_next($result); $i ++)
|
||||
{
|
||||
html_start_row();
|
||||
|
||||
$id = $row['id'];
|
||||
$link = "<a href='$PHP_SELF?L$id$options' alt='Article #$id'>";
|
||||
|
||||
print("<td nowrap>");
|
||||
if ($LOGIN_LEVEL >= AUTH_DEVEL)
|
||||
print("<input type='checkbox' name='ID_$row[id]'>");
|
||||
print("$link$id</a></td>");
|
||||
|
||||
$temp = htmlspecialchars($row['title']);
|
||||
if ($row['is_published'] == 0)
|
||||
$temp .= " <img src='images/private.gif' width='16' height='16' "
|
||||
."border='0' align='absmiddle' alt='Private'>";
|
||||
|
||||
print("<td align='center' width='67%'>$link$temp</a></td>");
|
||||
|
||||
$temp = date("M d, Y", $row['modify_date']);
|
||||
print("<td align='center'>$link$temp</a></td>");
|
||||
|
||||
$ccount = count_comments("articles.php_L$id");
|
||||
print("<td align='center'>$link$ccount</a></td>");
|
||||
|
||||
html_end_row();
|
||||
|
||||
html_start_row();
|
||||
$temp = htmlspecialchars($row['abstract']);
|
||||
print("<td></td><td colspan='3'>$temp</td>");
|
||||
html_end_row();
|
||||
}
|
||||
|
||||
html_end_table();
|
||||
|
||||
if ($LOGIN_LEVEL > 0)
|
||||
{
|
||||
print("<p>Published: ");
|
||||
select_is_published();
|
||||
print("<input type='submit' value='Modify Selected Articles'></p>\n");
|
||||
}
|
||||
|
||||
if ($count > $PAGE_MAX)
|
||||
{
|
||||
print("<table border='0' cellspacing='0' cellpadding='0' "
|
||||
."width='100%'>\n");
|
||||
|
||||
print("<tr><td>");
|
||||
if ($index > 0)
|
||||
print("<a href='$PHP_SELF?L+I$prev+Q" . urlencode($search)
|
||||
."'>Previous $PAGE_MAX</a>");
|
||||
print("</td><td align='right'>");
|
||||
if ($end < $count)
|
||||
{
|
||||
$next_count = min($PAGE_MAX, $count - $end);
|
||||
print("<a href='$PHP_SELF?L+I$next+Q" . urlencode($search)
|
||||
."'>Next $next_count</a>");
|
||||
}
|
||||
print("</td></tr>\n");
|
||||
print("</table>\n");
|
||||
}
|
||||
|
||||
print("<p><img src='images/private.gif' width='16' height='16' "
|
||||
."align='absmiddle' alt='private'> = hidden from public view</p>\n");
|
||||
}
|
||||
|
||||
html_footer();
|
||||
break;
|
||||
|
||||
case 'M' : // Modify Article
|
||||
if ($REQUEST_METHOD == "POST")
|
||||
{
|
||||
if ($LOGIN_LEVEL < AUTH_DEVEL)
|
||||
$is_published = 0;
|
||||
else if (array_key_exists("IS_PUBLISHED", $_POST))
|
||||
$is_published = (int)$_POST["IS_PUBLISHED"];
|
||||
else
|
||||
$is_published = 0;
|
||||
|
||||
if (array_key_exists("TITLE", $_POST))
|
||||
$title = $_POST["TITLE"];
|
||||
else
|
||||
$title = "";
|
||||
|
||||
if (array_key_exists("ABSTRACT", $_POST))
|
||||
$abstract = $_POST["ABSTRACT"];
|
||||
else
|
||||
$abstract = "";
|
||||
|
||||
if (array_key_exists("CONTENTS", $_POST))
|
||||
$contents = $_POST["CONTENTS"];
|
||||
else
|
||||
$contents = "";
|
||||
|
||||
if (($is_published == 0 || $LOGIN_LEVEL >= AUTH_DEVEL) &&
|
||||
$title != "" && $abstract != "" && $contents != "")
|
||||
$havedata = 1;
|
||||
else
|
||||
$havedata = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
$result = db_query("SELECT * FROM article WHERE id = $id");
|
||||
if (db_count($result) != 1)
|
||||
{
|
||||
print("<p><b>Error:</b> Article #$id was not found!</p>\n");
|
||||
html_footer();
|
||||
exit();
|
||||
}
|
||||
|
||||
$row = db_next($result);
|
||||
|
||||
$is_published = $row["is_published"];
|
||||
$title = $row["title"];
|
||||
$abstract = $row["abstract"];
|
||||
$contents = $row["contents"];
|
||||
|
||||
db_free($row);
|
||||
|
||||
$havedata = 0;
|
||||
}
|
||||
|
||||
if ($havedata)
|
||||
{
|
||||
$title = db_escape($title);
|
||||
$abstract = db_escape($abstract);
|
||||
$contents = db_escape($contents);
|
||||
$modify_date = time();
|
||||
|
||||
db_query("UPDATE article SET "
|
||||
."is_published = $is_published, "
|
||||
."title = '$title', "
|
||||
."abstract = '$abstract', "
|
||||
."contents = '$contents', "
|
||||
."modify_date = $modify_date, "
|
||||
."modify_user = '$LOGIN_USER' "
|
||||
."WHERE id = $id");
|
||||
|
||||
if (!$is_published)
|
||||
notify_users($id, "modified");
|
||||
|
||||
header("Location: $PHP_SELF?L$id$options");
|
||||
}
|
||||
else
|
||||
{
|
||||
html_header("Modify Article #$id");
|
||||
|
||||
html_start_links(1);
|
||||
html_link("Return to Articles", "$PHP_SELF?L$options");
|
||||
html_link("Article #$id", "$PHP_SELF?L$id$options");
|
||||
html_end_links();
|
||||
|
||||
if ($REQUEST_METHOD == "POST")
|
||||
{
|
||||
print("<p><b>Error:</b> Please fill in the fields marked in "
|
||||
."<b><font color='red'>bold red</font></b> below and resubmit "
|
||||
."your article.</p>\n");
|
||||
|
||||
$hstart = "<font color='red'>";
|
||||
$hend = "</font>";
|
||||
}
|
||||
else
|
||||
{
|
||||
$hstart = "";
|
||||
$hend = "";
|
||||
}
|
||||
|
||||
print("<form method='post' action='$PHP_SELF?M$id$options'>"
|
||||
."<table width='100%' cellpadding='5' cellspacing='0' border='0'>\n");
|
||||
|
||||
if ($LOGIN_LEVEL >= AUTH_DEVEL)
|
||||
{
|
||||
print("<tr><th align='right'>Published:</th><td>");
|
||||
select_is_published($is_published);
|
||||
print("</td></tr>\n");
|
||||
}
|
||||
else
|
||||
print("<input type='hidden' name='IS_PUBLISHED' value='0'>\n");
|
||||
|
||||
$title = htmlspecialchars($title, ENT_QUOTES);
|
||||
|
||||
if ($title == "")
|
||||
print("<tr><th align='right'>${hstart}Title:${hend}</th>");
|
||||
else
|
||||
print("<tr><th align='right'>Title:</th>");
|
||||
print("<td><input type='text' name='TITLE' "
|
||||
."size='80' value='$title'></td></tr>\n");
|
||||
|
||||
$abstract = htmlspecialchars($abstract, ENT_QUOTES);
|
||||
|
||||
if ($abstract == "")
|
||||
print("<tr><th align='right'>${hstart}Abstract:${hend}</th>");
|
||||
else
|
||||
print("<tr><th align='right'>Abstract:</th>");
|
||||
print("<td><input type='text' name='ABSTRACT' "
|
||||
."size='80' value='$abstract'></td></tr>\n");
|
||||
|
||||
$contents = htmlspecialchars($contents, ENT_QUOTES);
|
||||
|
||||
if ($contents == "")
|
||||
print("<tr><th align='right' valign='top'>${hstart}Contents:${hend}</th>");
|
||||
else
|
||||
print("<tr><th align='right' valign='top'>Contents:</th>");
|
||||
print("<td><textarea name='CONTENTS' "
|
||||
."cols='72' rows='12' wrap='virtual'>"
|
||||
."$contents</textarea>\n"
|
||||
."<p>The contents of the article may contain the following "
|
||||
."HTML elements: <tt>A</tt>, <tt>B</tt>, <tt>BLOCKQUOTE</tt>, "
|
||||
."<tt>CODE</tt>, <tt>EM</tt>, <tt>H1</tt>, <tt>H2</tt>, "
|
||||
."<tt>H3</tt>, <tt>H4</tt>, <tt>H5</tt>, <tt>H6</tt>, <tt>I</tt>, "
|
||||
."<tt>IMG</tt>, <tt>LI</tt>, <tt>OL</tt>, <tt>P</tt>, <tt>PRE</tt>, "
|
||||
."<tt>TT</tt>, <tt>U</tt>, <tt>UL</tt></p></td></tr>\n");
|
||||
|
||||
print("<tr><th colspan='2'>"
|
||||
."<input type='submit' value='Motify Article'></th></tr>\n");
|
||||
print("</table></form>\n");
|
||||
|
||||
html_footer();
|
||||
}
|
||||
break;
|
||||
|
||||
case 'N' : // Post new Article
|
||||
if ($REQUEST_METHOD == "POST")
|
||||
{
|
||||
if ($LOGIN_LEVEL < AUTH_DEVEL)
|
||||
$is_published = 0;
|
||||
else if (array_key_exists("IS_PUBLISHED", $_POST))
|
||||
$is_published = (int)$_POST["IS_PUBLISHED"];
|
||||
else
|
||||
$is_published = 0;
|
||||
|
||||
if (array_key_exists("TITLE", $_POST))
|
||||
$title = $_POST["TITLE"];
|
||||
else
|
||||
$title = "";
|
||||
|
||||
if (array_key_exists("ABSTRACT", $_POST))
|
||||
$abstract = $_POST["ABSTRACT"];
|
||||
else
|
||||
$abstract = "";
|
||||
|
||||
if (array_key_exists("CONTENTS", $_POST))
|
||||
$contents = $_POST["CONTENTS"];
|
||||
else
|
||||
$contents = "";
|
||||
|
||||
if ($LOGIN_USER != "" && $LOGIN_LEVEL < AUTH_DEVEL)
|
||||
$create_user = $LOGIN_USER;
|
||||
else if (array_key_exists("CREATE_USER", $_POST))
|
||||
$create_user = $_POST["CREATE_USER"];
|
||||
else
|
||||
$create_user = "";
|
||||
|
||||
if (($is_published == 0 || $LOGIN_LEVEL >= AUTH_DEVEL) &&
|
||||
$title != "" && $abstract != "" && $contents != "" &&
|
||||
$create_user != "")
|
||||
$havedata = 1;
|
||||
else
|
||||
$havedata = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
$is_published = 0;
|
||||
$title = "";
|
||||
$abstract = "";
|
||||
$contents = "";
|
||||
|
||||
if ($LOGIN_USER != "")
|
||||
$create_user = $LOGIN_USER;
|
||||
else if (array_key_exists("FROM", $_COOKIE))
|
||||
$create_user = $_COOKIE["FROM"];
|
||||
else
|
||||
$create_user = "";
|
||||
|
||||
$havedata = 0;
|
||||
}
|
||||
|
||||
if ($havedata)
|
||||
{
|
||||
$title = db_escape($title);
|
||||
$abstract = db_escape($abstract);
|
||||
$contents = db_escape($contents);
|
||||
$create_date = time();
|
||||
$create_user = db_escape($create_user);
|
||||
|
||||
db_query("INSERT INTO article VALUES(NULL,"
|
||||
."$is_published,'$title','$abstract','$contents',"
|
||||
."$create_date,'$create_user',$create_date,'$create_user')");
|
||||
|
||||
$id = db_insert_id();
|
||||
|
||||
if (!$is_published)
|
||||
notify_users($id);
|
||||
|
||||
header("Location: $PHP_SELF?L$id$options");
|
||||
break;
|
||||
}
|
||||
|
||||
html_header("Submit Article");
|
||||
|
||||
html_start_links(1);
|
||||
html_link("Return to Articles", "$PHP_SELF?L$options");
|
||||
html_end_links();
|
||||
|
||||
if ($REQUEST_METHOD == "POST")
|
||||
{
|
||||
print("<p><b>Error:</b> Please fill in the fields marked in "
|
||||
."<b><font color='red'>bold red</font></b> below and resubmit "
|
||||
."your article.</p>\n");
|
||||
|
||||
$hstart = "<font color='red'>";
|
||||
$hend = "</font>";
|
||||
}
|
||||
else
|
||||
{
|
||||
print("<p>Please use this form to post announcements, how-to's, "
|
||||
."examples, and case studies showing how you use $PROJECT_NAME. "
|
||||
."We will proofread your article, and if we determine it is "
|
||||
."appropriate for the site, we will make the article public "
|
||||
."on the site. <i>Thank you</i> for supporting $PROJECT_NAME!</p>\n");
|
||||
|
||||
$hstart = "";
|
||||
$hend = "";
|
||||
}
|
||||
|
||||
print("<form method='post' action='$PHP_SELF?N$options'>"
|
||||
."<table width='100%' cellpadding='5' cellspacing='0' border='0'>\n");
|
||||
|
||||
if ($LOGIN_LEVEL >= AUTH_DEVEL)
|
||||
{
|
||||
print("<tr><th align='right'>Published:</th><td>");
|
||||
select_is_published($is_published);
|
||||
print("</td></tr>\n");
|
||||
}
|
||||
else
|
||||
print("<input type='hidden' name='IS_PUBLISHED' value='0'>\n");
|
||||
|
||||
$title = htmlspecialchars($title, ENT_QUOTES);
|
||||
|
||||
if ($title == "")
|
||||
print("<tr><th align='right'>${hstart}Title:${hend}</th>");
|
||||
else
|
||||
print("<tr><th align='right'>Title:</th>");
|
||||
print("<td><input type='text' name='TITLE' "
|
||||
."size='80' value='$title'></td></tr>\n");
|
||||
|
||||
$abstract = htmlspecialchars($abstract, ENT_QUOTES);
|
||||
|
||||
if ($abstract == "")
|
||||
print("<tr><th align='right'>${hstart}Abstract:${hend}</th>");
|
||||
else
|
||||
print("<tr><th align='right'>Abstract:</th>");
|
||||
print("<td><input type='text' name='ABSTRACT' "
|
||||
."size='80' value='$abstract'></td></tr>\n");
|
||||
|
||||
$create_user = htmlspecialchars($create_user, ENT_QUOTES);
|
||||
|
||||
if ($create_user == "")
|
||||
print("<tr><th align='right'>${hstart}Author:${hend}</th>");
|
||||
else
|
||||
print("<tr><th align='right'>Author:</th>");
|
||||
|
||||
if ($LOGIN_USER != "" && $LOGIN_LEVEL < AUTH_DEVEL)
|
||||
print("<td><input type='hidden' name='CREATE_USER' "
|
||||
."value='$create_user'>$create_user</td></tr>\n");
|
||||
else
|
||||
print("<td><input type='text' name='CREATE_USER' "
|
||||
."size='40' value='$create_user'></td></tr>\n");
|
||||
|
||||
$contents = htmlspecialchars($contents, ENT_QUOTES);
|
||||
|
||||
if ($contents == "")
|
||||
print("<tr><th align='right' valign='top'>${hstart}Contents:${hend}</th>");
|
||||
else
|
||||
print("<tr><th align='right' valign='top'>Contents:</th>");
|
||||
print("<td><textarea name='CONTENTS' "
|
||||
."cols='72' rows='12' wrap='virtual'>"
|
||||
."$contents</textarea>\n"
|
||||
."<p>The contents of the article may contain the following "
|
||||
."HTML elements: <tt>A</tt>, <tt>B</tt>, <tt>BLOCKQUOTE</tt>, "
|
||||
."<tt>CODE</tt>, <tt>EM</tt>, <tt>H1</tt>, <tt>H2</tt>, "
|
||||
."<tt>H3</tt>, <tt>H4</tt>, <tt>H5</tt>, <tt>H6</tt>, <tt>I</tt>, "
|
||||
."<tt>IMG</tt>, <tt>LI</tt>, <tt>OL</tt>, <tt>P</tt>, <tt>PRE</tt>, "
|
||||
."<tt>TT</tt>, <tt>U</tt>, <tt>UL</tt></p></td></tr>\n");
|
||||
|
||||
print("<tr><th colspan='2'>"
|
||||
."<input type='submit' value='Submit Article'></th></tr>\n");
|
||||
print("</table></form>\n");
|
||||
|
||||
html_footer();
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// End of "$Id$".
|
||||
//
|
||||
?>
|
377
www/comment.php
@ -1,377 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// "$Id$"
|
||||
//
|
||||
// Comment and moderation interface for PHP pages...
|
||||
//
|
||||
|
||||
//
|
||||
// Include necessary headers...
|
||||
//
|
||||
|
||||
include_once "phplib/html.php";
|
||||
include_once "phplib/common.php";
|
||||
|
||||
|
||||
//
|
||||
// Parse arguments...
|
||||
//
|
||||
|
||||
$op = "";
|
||||
$path = "";
|
||||
$refer_id = 0;
|
||||
$id = 0;
|
||||
|
||||
for ($i = 0; $i < $argc; $i ++)
|
||||
{
|
||||
switch ($argv[$i][0])
|
||||
{
|
||||
case 'L' : // List all comments...
|
||||
case 'l' : // List unapproved comments...
|
||||
$op = $argv[$i][0];
|
||||
$listpath = substr($argv[$i], 1);
|
||||
break;
|
||||
|
||||
case 'r' : // Respond/add comment
|
||||
$op = "r";
|
||||
$refer_id = (int)substr($argv[$i], 1);
|
||||
break;
|
||||
|
||||
case 'd' : // Delete comment
|
||||
case 'D' : // Delete comment (confirmed)
|
||||
case 'e' : // Edit comment
|
||||
$op = $argv[$i][0];
|
||||
$id = (int)substr($argv[$i], 1);
|
||||
break;
|
||||
|
||||
case 'm' : // Moderate comment
|
||||
$op = "m";
|
||||
$dir = $argv[$i][1];
|
||||
$id = (int)substr($argv[$i], 2);
|
||||
break;
|
||||
|
||||
case 'p' : // Set path
|
||||
$path = urldecode(substr($argv[$i], 1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($op == "" || ($path == "" && $op != "l" && $op != "L") ||
|
||||
(($op == 'd' || $op == 'D' || $op == 'l') && $LOGIN_LEVEL < AUTH_DEVEL))
|
||||
{
|
||||
header("Location: index.php");
|
||||
}
|
||||
else
|
||||
{
|
||||
switch ($op)
|
||||
{
|
||||
case 'd' : // Delete comment
|
||||
html_header("Delete Comment #$id");
|
||||
print("<p>Click the button below to confirm the deletion.</p>\n"
|
||||
."<form method='POST' action='$PHP_SELF?D$id+p$path'>"
|
||||
."<center><input type='submit' value='Delete Comment'></center>"
|
||||
."</form>\n");
|
||||
html_footer();
|
||||
break;
|
||||
|
||||
case 'D' : // Delete comment (confirmed)
|
||||
db_query("DELETE FROM comment WHERE id = $id");
|
||||
header("Location: $PHP_SELF");
|
||||
break;
|
||||
|
||||
case 'e' : // Edit comment
|
||||
case 'r' : // New comment
|
||||
if ($LOGIN_USER == "")
|
||||
{
|
||||
header("Location: login.php?PAGE=comment.php?$op$id+p" .
|
||||
urlencode($path));
|
||||
return;
|
||||
}
|
||||
|
||||
$havedata = 0;
|
||||
|
||||
if ($REQUEST_METHOD == "POST")
|
||||
{
|
||||
if ($LOGIN_USER != "" && $LOGIN_LEVEL < AUTH_DEVEL)
|
||||
$create_user = $LOGIN_USER;
|
||||
else if (array_key_exists("AUTHOR", $_POST))
|
||||
$create_user = trim($_POST["AUTHOR"]);
|
||||
else
|
||||
$create_user = "";
|
||||
|
||||
if (array_key_exists("FILE", $_POST))
|
||||
$file = $_POST["FILE"];
|
||||
else
|
||||
$file = "";
|
||||
|
||||
if (array_key_exists("STATUS", $_POST))
|
||||
$status = (int)$_POST["STATUS"];
|
||||
else
|
||||
$status = 2;
|
||||
|
||||
if (array_key_exists("MESSAGE", $_POST))
|
||||
$contents = trim($_POST["MESSAGE"]);
|
||||
else
|
||||
$contents = "";
|
||||
|
||||
if (strpos($contents, "http:") === FALSE &&
|
||||
strpos($contents, "https:") === FALSE &&
|
||||
strpos($contents, "ftp:") === FALSE &&
|
||||
strpos($contents, "mailto:") === FALSE &&
|
||||
$contents != "" && $create_user != "" && $file != "")
|
||||
$havedata = 1;
|
||||
|
||||
if ($create_user != "" && $id == 0 && !$LOGIN_USER)
|
||||
setcookie("FROM", $create_user, time() + 90 * 86400, "/");
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($id)
|
||||
{
|
||||
$result = db_query("SELECT * FROM comment WHERE id = $id");
|
||||
if (db_count($result) > 0)
|
||||
{
|
||||
$row = db_next($result);
|
||||
$create_user = $row['create_user'];
|
||||
$contents = $row['contents'];
|
||||
$status = $row['status'];
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($LOGIN_USER != "")
|
||||
$create_user = $LOGIN_USER;
|
||||
else if (array_key_exists("FROM", $_COOKIE))
|
||||
$create_user = $_COOKIE["FROM"];
|
||||
else
|
||||
$create_user = "Anonymous <anonymous@easysw.com>";
|
||||
|
||||
$contents = "";
|
||||
$status = 2;
|
||||
}
|
||||
|
||||
db_free($result);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($LOGIN_USER != "")
|
||||
$create_user = $LOGIN_USER;
|
||||
else if (array_key_exists("FROM", $_COOKIE))
|
||||
$create_user = $_COOKIE["FROM"];
|
||||
else
|
||||
$create_user = "Anonymous <anonymous@easysw.com>";
|
||||
|
||||
$contents = "";
|
||||
$status = 2;
|
||||
}
|
||||
}
|
||||
|
||||
if ($havedata)
|
||||
{
|
||||
$create_user = db_escape($create_user);
|
||||
$file = db_escape($file);
|
||||
$contents = db_escape($contents);
|
||||
|
||||
if ($id)
|
||||
{
|
||||
// Update existing record.
|
||||
db_query("UPDATE comment SET create_user='$create_user',url='$file',"
|
||||
."status=$status,contents='$contents' WHERE id = $id");
|
||||
}
|
||||
else
|
||||
{
|
||||
// Add new record.
|
||||
$create_date = time();
|
||||
db_query("INSERT INTO comment VALUES(NULL,$refer_id,2,'$file',"
|
||||
."'$contents',$create_date,'$create_user')");
|
||||
$id = db_insert_id();
|
||||
}
|
||||
|
||||
$location = str_replace("_", "?", $path);
|
||||
header("Location: $location#_USER_COMMENT_$id");
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($id)
|
||||
html_header("Edit Comment");
|
||||
else
|
||||
html_header("Add Comment");
|
||||
|
||||
if ($REQUEST_METHOD == "POST")
|
||||
{
|
||||
print("<p>Your comment posting is missing required information. "
|
||||
."Please fill in all fields marked in "
|
||||
."<font color='red'>red</font> and resubmit your comments.</p>\n");
|
||||
$hstart = "<font color='red'>";
|
||||
$hend = "</font>";
|
||||
}
|
||||
else
|
||||
{
|
||||
$hstart = "";
|
||||
$hend = "";
|
||||
}
|
||||
|
||||
if ($op == "e")
|
||||
print("<form method='POST' action='$PHP_SELF?e$id+p$path'>\n"
|
||||
."<center><table border='0'>\n");
|
||||
else
|
||||
print("<form method='POST' action='$PHP_SELF?r$refer_id+p$path'>\n"
|
||||
."<center><table border='0'>\n");
|
||||
|
||||
$create_user = htmlspecialchars($create_user);
|
||||
if ($create_user == "")
|
||||
print("<tr><th align='right'>${hstart}Author:${hend}</th>"
|
||||
."<td><input type='text' name='AUTHOR' value='$create_user' "
|
||||
."size='40'></td></tr>\n");
|
||||
else
|
||||
print("<tr><th align='right'>Author:</th>"
|
||||
."<td><input type='text' name='AUTHOR' value='$create_user' "
|
||||
."size='40'></td></tr>\n");
|
||||
|
||||
$contents = htmlspecialchars($contents);
|
||||
if ($contents == "")
|
||||
print("<tr><th align='right' valign='top'>${hstart}Message:${hend}</th>"
|
||||
."<td><textarea name='MESSAGE' cols='70' rows='8' "
|
||||
."wrap='virtual'>$contents</textarea>");
|
||||
else
|
||||
print("<tr><th align='right' valign='top'>Message:</th>"
|
||||
."<td><textarea name='MESSAGE' cols='70' rows='8' "
|
||||
."wrap='virtual'>$contents</textarea>");
|
||||
|
||||
print("<p>Comments may contain the following "
|
||||
."HTML elements: <tt>A</tt>, <tt>B</tt>, <tt>BLOCKQUOTE</tt>, "
|
||||
."<tt>CODE</tt>, <tt>EM</tt>, <tt>H1</tt>, <tt>H2</tt>, "
|
||||
."<tt>H3</tt>, <tt>H4</tt>, <tt>H5</tt>, <tt>H6</tt>, <tt>I</tt>, "
|
||||
."<tt>IMG</tt>, <tt>LI</tt>, <tt>OL</tt>, <tt>P</tt>, <tt>PRE</tt>, "
|
||||
."<tt>TT</tt>, <tt>U</tt>, <tt>UL</tt></p></td></tr>\n");
|
||||
|
||||
if ($LOGIN_LEVEL >= AUTH_DEVEL)
|
||||
{
|
||||
print("<tr><th align='right' nowrap>File Path:</th>"
|
||||
."<td><input type='text' name='FILE' value='$path' "
|
||||
."size='40'></td></tr>\n");
|
||||
print("<tr><th align='right'>Score:</th>"
|
||||
."<td><select name='STATUS'>");
|
||||
for ($i = 0; $i <= 5; $i ++)
|
||||
if ($i == $status)
|
||||
print("<option value='$i' selected>$i</option>");
|
||||
else
|
||||
print("<option value='$i'>$i</option>");
|
||||
print("</select></td></tr>\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
print("<input type='hidden' name='FILE' value='$path'>\n");
|
||||
print("<input type='hidden' name='STATUS' value='2'>\n");
|
||||
}
|
||||
|
||||
if ($id)
|
||||
print("<tr><th></th><td><input type='submit' value='Update Comment'></td></tr>\n");
|
||||
else
|
||||
print("<tr><th></th><td><input type='submit' value='Add Comment'></td></tr>\n");
|
||||
|
||||
print("</table></center>\n"
|
||||
."</form>\n");
|
||||
|
||||
html_footer();
|
||||
}
|
||||
break;
|
||||
|
||||
case 'L' : // List all comments...
|
||||
case 'l' : // List unapproved comments...
|
||||
html_header("Comments");
|
||||
|
||||
if ($LOGIN_LEVEL < AUTH_DEVEL)
|
||||
{
|
||||
$result = db_query("SELECT * FROM comment WHERE status = 1 AND "
|
||||
."url LIKE '${listpath}%' ORDER BY id");
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($op == 'L')
|
||||
{
|
||||
$result = db_query("SELECT * FROM comment WHERE "
|
||||
."url LIKE '${listpath}%' ORDER BY id");
|
||||
print("<p><a href='$PHP_SELF?l'>Show Hidden Comments</a></p>\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
$result = db_query("SELECT * FROM comment WHERE status = 0 AND "
|
||||
."url LIKE '${listpath}%' ORDER BY id");
|
||||
print("<p><a href='$PHP_SELF?L'>Show All Comments</a></p>\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (db_count($result) == 0)
|
||||
{
|
||||
if ($LOGIN_LEVEL >= AUTH_DEVEL && $op == 'l')
|
||||
print("<p>No hidden comments.</p>\n");
|
||||
else
|
||||
print("<p>No visible comments.</p>\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
print("<ul>\n");
|
||||
|
||||
while ($row = db_next($result))
|
||||
{
|
||||
$create_date = date("M d, Y", $row['create_date']);
|
||||
$create_user = sanitize_email($row['create_user']);
|
||||
$contents = sanitize_text($row['contents']);
|
||||
$location = str_replace("_", "?", $row['url']);
|
||||
|
||||
print("<li><a href='$location'>$row[url]</a> "
|
||||
." by $create_user on $create_date "
|
||||
."<a href='$PHP_SELF?e$row[id]+p$row[url]'>Edit</a> "
|
||||
."· <a href='$PHP_SELF?d$row[id]+p$row[url]'>Delete</a>"
|
||||
."<br><tt>$contents</tt></li>\n");
|
||||
}
|
||||
|
||||
print("</ul>\n");
|
||||
}
|
||||
|
||||
db_free($result);
|
||||
|
||||
html_footer();
|
||||
break;
|
||||
|
||||
case 'm' : // Moderate
|
||||
if (array_key_exists("MODPOINTS", $_COOKIE))
|
||||
$modpoints = $_COOKIE["MODPOINTS"];
|
||||
else
|
||||
$modpoints = 5;
|
||||
|
||||
if ($modpoints > 0)
|
||||
{
|
||||
$modpoints --;
|
||||
|
||||
setcookie("MODPOINTS", $modpoints, time() + 2 * 86400, "/");
|
||||
|
||||
$result = db_query("SELECT status FROM comment WHERE id=$id");
|
||||
$row = db_next($result);
|
||||
|
||||
if ($dir == 'd')
|
||||
{
|
||||
// Moderate down...
|
||||
if ($row['status'] > 0)
|
||||
db_query("UPDATE comment SET status = status - 1 WHERE id=$id");
|
||||
}
|
||||
else
|
||||
{
|
||||
// Moderate down...
|
||||
if ($row['status'] < 5)
|
||||
db_query("UPDATE comment SET status = status + 1 WHERE id=$id");
|
||||
}
|
||||
|
||||
db_free($result);
|
||||
}
|
||||
|
||||
$location = str_replace("_", "?", $path);
|
||||
header("Location: $location#_USER_COMMENT_$id");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// End of "$Id$".
|
||||
//
|
||||
?>
|
@ -1,3 +0,0 @@
|
||||
Order deny,allow
|
||||
Allow from none
|
||||
|
@ -1,598 +0,0 @@
|
||||
#!/usr/bin/php -q
|
||||
<?php
|
||||
|
||||
// Make sure that the module is loaded...
|
||||
if (!extension_loaded("sqlite"))
|
||||
{
|
||||
dl("sqlite.so");
|
||||
}
|
||||
|
||||
|
||||
// Validate args...
|
||||
global $_SERVER;
|
||||
|
||||
$argc = $_SERVER["argc"];
|
||||
$argv = $_SERVER["argv"];
|
||||
|
||||
if ($argc != 4)
|
||||
{
|
||||
$fp = fopen("php://stderr", "w");
|
||||
fwrite($fp, "Usage: ./make-form.php filename.db tablename \"Table Name\"\n");
|
||||
exit();
|
||||
}
|
||||
|
||||
// Open the database connection...
|
||||
$db = sqlite_open($argv[1]);
|
||||
$table = $argv[2];
|
||||
$tname = $argv[3];
|
||||
|
||||
$result = sqlite_query($db, "PRAGMA table_info('$table')");
|
||||
|
||||
//sqlite_seek($result, 0);
|
||||
//while ($row = sqlite_fetch_array($result))
|
||||
// print_r($row);
|
||||
//exit();
|
||||
|
||||
print("<?php\n");
|
||||
print("//\n");
|
||||
print("// \"\$Id\$\"\n");
|
||||
print("//\n");
|
||||
print("// Web form for the $table table...\n");
|
||||
print("//\n");
|
||||
print("\n");
|
||||
print("\n");
|
||||
print("//\n");
|
||||
print("// Include necessary headers...\n");
|
||||
print("//\n");
|
||||
print("\n");
|
||||
print("include_once \"phplib/html.php\";\n");
|
||||
print("include_once \"phplib/common.php\";\n");
|
||||
print("\n");
|
||||
print("\n");
|
||||
print("// Get command-line options...\n");
|
||||
print("//\n");
|
||||
print("// Usage: $table.php [operation]\n");
|
||||
print("//\n");
|
||||
print("// Operations:\n");
|
||||
print("//\n");
|
||||
print("// D# - Delete $tname\n");
|
||||
print("// L = List all $tnames\n");
|
||||
print("// L# = List $tname #\n");
|
||||
print("// M# = Modify $tname #\n");
|
||||
print("// N = Create new $tname\n");
|
||||
print("\n");
|
||||
print("\n");
|
||||
print("if (\$argc)\n");
|
||||
print("{\n");
|
||||
print(" \$op = \$argv[0][0];\n");
|
||||
print(" \$id = (int)substr(\$argv[0], 1);\n");
|
||||
print("\n");
|
||||
print(" if (\$op != 'D' && \$op != 'L' && \$op != 'M' && \$op != 'N')\n");
|
||||
print(" {\n");
|
||||
print(" html_header(\"$tname Error\");\n");
|
||||
print(" print(\"<p>Bad command '\$op'!\\n\");\n");
|
||||
print(" html_footer();\n");
|
||||
print(" exit();\n");
|
||||
print(" }\n");
|
||||
print("\n");
|
||||
print(" if ((\$op == 'D' || \$op == 'M') && !\$id)\n");
|
||||
print(" {\n");
|
||||
print(" html_header(\"$tname Error\");\n");
|
||||
print(" print(\"<p>Command '\$op' requires an ID!\\n\");\n");
|
||||
print(" html_footer();\n");
|
||||
print(" exit();\n");
|
||||
print(" }\n");
|
||||
print("\n");
|
||||
print(" if ((\$op == 'D' || \$op == 'M') && \$LOGIN_USER == \"\")\n");
|
||||
print(" {\n");
|
||||
print(" html_header(\"$tname Error\");\n");
|
||||
print(" print(\"<p>Command '\$op' requires a login!\\n\");\n");
|
||||
print(" html_footer();\n");
|
||||
print(" exit();\n");
|
||||
print(" }\n");
|
||||
print("\n");
|
||||
print(" if (\$op == 'N' && \$id)\n");
|
||||
print(" {\n");
|
||||
print(" html_header(\"$tname Error\");\n");
|
||||
print(" print(\"<p>Command '\$op' may not have an ID!\\n\");\n");
|
||||
print(" html_footer();\n");
|
||||
print(" exit();\n");
|
||||
print(" }\n");
|
||||
print("}\n");
|
||||
print("else\n");
|
||||
print("{\n");
|
||||
print(" \$op = 'L';\n");
|
||||
print(" \$id = 0;\n");
|
||||
print("}\n");
|
||||
print("\n");
|
||||
print("switch (\$op)\n");
|
||||
print("{\n");
|
||||
print(" case 'D' : // Delete $tname\n");
|
||||
print(" if (\$REQUEST_METHOD == \"POST\")\n");
|
||||
print(" {\n");
|
||||
print(" db_query(\"DELETE FROM $table WHERE id = \$id\");\n");
|
||||
print("\n");
|
||||
print(" header(\"Location: \$PHP_SELF?L\");\n");
|
||||
print(" }\n");
|
||||
print(" else\n");
|
||||
print(" {\n");
|
||||
print(" \$result = db_query(\"SELECT * FROM $table WHERE id = \$id\");\n");
|
||||
print(" if (db_count(\$result) != 1)\n");
|
||||
print(" {\n");
|
||||
print(" print(\"<p><b>Error:</b> $tname #\$id was not found!</p>\\n\");\n");
|
||||
print(" html_footer();\n");
|
||||
print(" exit();\n");
|
||||
print(" }\n");
|
||||
print("\n");
|
||||
print(" \$row = db_next(\$result);\n");
|
||||
print("\n");
|
||||
print(" html_header(\"Delete $tname #\$id\");\n");
|
||||
print("\n");
|
||||
print(" html_start_links(1);\n");
|
||||
print(" html_link(\"Return to $tname List\", \"\$PHP_SELF?L\");\n");
|
||||
print(" html_link(\"View $tname #\$id</A>\", \"\$PHP_SELF?L\$id\");\n");
|
||||
print(" html_link(\"Modify $tname #\$id</A>\", \"\$PHP_SELF?M\$id\");\n");
|
||||
print(" html_end_links();\n");
|
||||
print("\n");
|
||||
print(" print(\"<h1>Delete $tname #\$id</h1>\\n\");\n");
|
||||
print(" print(\"<form method='post' action='\$PHP_SELF?D\$id'>\"\n");
|
||||
print(" .\"<p><table width='100%' cellpadding='5' cellspacing='0' border='0'>\\n\");\n");
|
||||
print("\n");
|
||||
|
||||
print(" if (!\$row['is_published'])\n");
|
||||
print(" print(\"<tr><th align='center' colspan='2'>This $tname is \"\n");
|
||||
print(" .\"currently hidden from public view.</td></tr>\\n\");\n");
|
||||
print("\n");
|
||||
|
||||
sqlite_seek($result, 0);
|
||||
while ($row = sqlite_fetch_array($result))
|
||||
{
|
||||
switch ($row['name'])
|
||||
{
|
||||
case "id" :
|
||||
case "create_date" :
|
||||
case "create_user" :
|
||||
case "modify_date" :
|
||||
case "modify_user" :
|
||||
case "is_published" :
|
||||
break;
|
||||
|
||||
default :
|
||||
$name = ucwords(str_replace('_', ' ', $row['name']));
|
||||
|
||||
print(" \$temp = htmlspecialchars(\$row[\"$row[name]\"]);\n");
|
||||
print(" print(\"<tr><th align='right'>$name:</th>"
|
||||
."<td class='left'>\$temp</td></tr>\\n\");\n");
|
||||
print("\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
print(" print(\"<tr><th colspan='2'>\"\n");
|
||||
print(" .\"<input type='submit' value='Confirm Delete $tname'></th></tr>\\n\");\n");
|
||||
print(" print(\"</table></p></form>\\n\");\n");
|
||||
print("\n");
|
||||
print(" html_footer();\n");
|
||||
print(" }\n");
|
||||
print(" break;\n");
|
||||
print("\n");
|
||||
print(" case 'L' : // List (all) $tname(s)\n");
|
||||
print(" if (\$id)\n");
|
||||
print(" {\n");
|
||||
print(" html_header(\"$tname #\$id\");\n");
|
||||
print("\n");
|
||||
print(" \$result = db_query(\"SELECT * FROM $table WHERE id = \$id\");\n");
|
||||
print(" if (db_count(\$result) != 1)\n");
|
||||
print(" {\n");
|
||||
print(" print(\"<p><b>Error:</b> $tname #\$id was not found!</p>\\n\");\n");
|
||||
print(" html_footer();\n");
|
||||
print(" exit();\n");
|
||||
print(" }\n");
|
||||
print("\n");
|
||||
print(" \$row = db_next(\$result);\n");
|
||||
print("\n");
|
||||
print(" html_start_links(1);\n");
|
||||
print(" html_link(\"Return to $tname List\", \"\$PHP_SELF?L\");\n");
|
||||
print(" html_link(\"Modify $tname</A>\", \"\$PHP_SELF?M\$id\");\n");
|
||||
print(" html_link(\"Delete $tname #\$id</A>\", \"\$PHP_SELF?D\$id\");\n");
|
||||
print(" html_end_links();\n");
|
||||
print("\n");
|
||||
print(" print(\"<h1>$tname #\$id</h1>\\n\");\n");
|
||||
print(" print(\"<p><table width='100%' cellpadding='5' cellspacing='0' \"\n");
|
||||
print(" .\"border='0'>\\n\");\n");
|
||||
print("\n");
|
||||
print(" if (!\$row['is_published'])\n");
|
||||
print(" print(\"<tr><th align='center' colspan='2'>This $tname is \"\n");
|
||||
print(" .\"currently hidden from public view.</td></tr>\\n\");\n");
|
||||
print("\n");
|
||||
|
||||
sqlite_seek($result, 0);
|
||||
while ($row = sqlite_fetch_array($result))
|
||||
{
|
||||
switch ($row['name'])
|
||||
{
|
||||
case "id" :
|
||||
case "create_date" :
|
||||
case "create_user" :
|
||||
case "modify_date" :
|
||||
case "modify_user" :
|
||||
case "is_published" :
|
||||
break;
|
||||
|
||||
default :
|
||||
$name = ucwords(str_replace('_', ' ', $row['name']));
|
||||
|
||||
if ($row['type'] == "TEXT")
|
||||
print(" \$temp = format_text(\$row['$row[name]']);\n");
|
||||
else
|
||||
print(" \$temp = htmlspecialchars(\$row['$row[name]']);\n");
|
||||
print(" print(\"<tr><th align='right' valign='top'>$name:</th>"
|
||||
."<td class='left'>\$temp</td></tr>\\n\");\n");
|
||||
print("\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
print(" print(\"</table></p>\\n\");\n");
|
||||
print(" db_free(\$result);\n");
|
||||
print(" }\n");
|
||||
print(" else\n");
|
||||
print(" {\n");
|
||||
print(" html_header(\"$tname List\");\n");
|
||||
print("\n");
|
||||
print(" html_start_links(1);\n");
|
||||
print(" html_link(\"New $tname\", \"\$PHP_SELF?N\");\n");
|
||||
print(" html_end_links();\n");
|
||||
print("\n");
|
||||
print(" \$result = db_query(\"SELECT * FROM $table\");\n");
|
||||
print(" \$count = db_count(\$result);\n");
|
||||
print("\n");
|
||||
print(" print(\"<h1>$tname List</h1>\\n\");\n");
|
||||
print(" if (\$count == 0)\n");
|
||||
print(" {\n");
|
||||
print(" print(\"<p>No ${tname}s found.</p>\\n\");\n");
|
||||
print("\n");
|
||||
print(" html_footer();\n");
|
||||
print(" exit();\n");
|
||||
print(" }\n");
|
||||
print("\n");
|
||||
print(" html_start_table(array(\"ID\"");
|
||||
|
||||
sqlite_seek($result, 0);
|
||||
|
||||
$list_columns = 0;
|
||||
while ($row = sqlite_fetch_array($result))
|
||||
switch ($row['name'])
|
||||
{
|
||||
case "id" :
|
||||
case "create_date" :
|
||||
case "create_user" :
|
||||
case "modify_user" :
|
||||
case "is_published" :
|
||||
case "abstract" :
|
||||
case "contents" :
|
||||
break;
|
||||
|
||||
case "modify_date" :
|
||||
print(",\"Last Modified\"");
|
||||
$list_columns ++;
|
||||
break;
|
||||
|
||||
default :
|
||||
$name = ucwords(str_replace('_', ' ', $row['name']));
|
||||
print(",\"$name\"");
|
||||
$list_columns ++;
|
||||
break;
|
||||
}
|
||||
|
||||
print("));\n");
|
||||
print("\n");
|
||||
print(" while (\$row = db_next(\$result))\n");
|
||||
print(" {\n");
|
||||
print(" html_start_row();\n");
|
||||
print("\n");
|
||||
|
||||
sqlite_seek($result, 0);
|
||||
while ($row = sqlite_fetch_array($result))
|
||||
switch ($row['name'])
|
||||
{
|
||||
case "id" :
|
||||
print(" \$id = \$row['id'];\n\n");
|
||||
print(" print(\"<td align='center'><a href='\$PHP_SELF?L\$id' \"\n");
|
||||
print(" .\"alt='$tname #\$id'>\"\n");
|
||||
print(" .\"\$id</a></td>\");\n");
|
||||
print("\n");
|
||||
break;
|
||||
|
||||
case "modify_date" :
|
||||
print(" \$temp = date(\"M d, Y\", \$row['modify_date']);\n");
|
||||
print(" print(\"<td align='center'><a href='\$PHP_SELF?L\$id' \"\n");
|
||||
print(" .\"alt='$tname #\$id'>\"\n");
|
||||
print(" .\"\$temp</a></td>\");\n");
|
||||
print("\n");
|
||||
break;
|
||||
|
||||
case "create_date" :
|
||||
case "create_user" :
|
||||
case "modify_user" :
|
||||
case "is_published" :
|
||||
case "contents" :
|
||||
case "abstract" :
|
||||
break;
|
||||
|
||||
default :
|
||||
print(" \$temp = htmlspecialchars(\$row['$row[name]']);\n");
|
||||
print(" print(\"<td align='center'><a href='\$PHP_SELF?L\$id' \"\n");
|
||||
print(" .\"alt='$tname #\$id'>\"\n");
|
||||
print(" .\"\$temp</a></td>\");\n");
|
||||
print("\n");
|
||||
break;
|
||||
}
|
||||
|
||||
print(" html_end_row();\n");
|
||||
|
||||
sqlite_seek($result, 0);
|
||||
while ($row = sqlite_fetch_array($result))
|
||||
if ($row['name'] == "abstract")
|
||||
{
|
||||
print("\n");
|
||||
print(" html_start_row();\n");
|
||||
print(" \$temp = htmlspecialchars(\$row['abstract']);\n");
|
||||
print(" print(\"<td></td><td colspan='$list_columns'>\$temp</td>\");\n");
|
||||
print(" html_end_row();\n");
|
||||
}
|
||||
|
||||
print(" }\n");
|
||||
print("\n");
|
||||
print(" html_end_table();\n");
|
||||
print(" }\n");
|
||||
print("\n");
|
||||
print(" html_footer();\n");
|
||||
print(" break;\n");
|
||||
print("\n");
|
||||
|
||||
print(" case 'M' : // Modify $tname\n");
|
||||
print(" if (\$REQUEST_METHOD == \"POST\")\n");
|
||||
print(" {\n");
|
||||
print(" \$date = time();\n");
|
||||
|
||||
sqlite_seek($result, 0);
|
||||
while ($row = sqlite_fetch_array($result))
|
||||
switch ($row['name'])
|
||||
{
|
||||
case "id" :
|
||||
case "create_date" :
|
||||
case "create_user" :
|
||||
case "modify_date" :
|
||||
case "modify_user" :
|
||||
break;
|
||||
|
||||
default :
|
||||
$form = strtoupper($row['name']);
|
||||
|
||||
print(" \$$row[name] = db_escape(\$_POST[\"$form\"]);\n");
|
||||
break;
|
||||
}
|
||||
|
||||
print("\n");
|
||||
print(" db_query(\"UPDATE $table SET \"\n");
|
||||
|
||||
sqlite_seek($result, 0);
|
||||
while ($row = sqlite_fetch_array($result))
|
||||
switch ($row['name'])
|
||||
{
|
||||
case "id" :
|
||||
case "create_date" :
|
||||
case "create_user" :
|
||||
case "modify_date" :
|
||||
case "modify_user" :
|
||||
break;
|
||||
|
||||
default :
|
||||
if ($row['type'] == "INTEGER")
|
||||
print(" .\"$row[name] = \$$row[name], \"\n");
|
||||
else
|
||||
print(" .\"$row[name] = '\$$row[name]', \"\n");
|
||||
break;
|
||||
}
|
||||
|
||||
print(" .\"modify_date = \$date, \"\n");
|
||||
print(" .\"modify_user = '\$LOGIN_USER' \"\n");
|
||||
print(" .\"WHERE id = \$id\");\n");
|
||||
print("\n");
|
||||
print(" header(\"Location: \$PHP_SELF?L\$id\");\n");
|
||||
print(" }\n");
|
||||
print(" else\n");
|
||||
print(" {\n");
|
||||
print(" html_header(\"Modify $tname #\$id\");\n");
|
||||
print("\n");
|
||||
print(" html_start_links(1);\n");
|
||||
print(" html_link(\"Return to $tname List\", \"\$PHP_SELF?L\");\n");
|
||||
print(" html_link(\"$tname #\$id\", \"\$PHP_SELF?L\$id\");\n");
|
||||
print(" html_end_links();\n");
|
||||
print("\n");
|
||||
print(" print(\"<h1>Modify $tname #\$id</h1>\\n\");\n");
|
||||
print(" \$result = db_query(\"SELECT * FROM $table WHERE id = \$id\");\n");
|
||||
print(" if (db_count(\$result) != 1)\n");
|
||||
print(" {\n");
|
||||
print(" print(\"<p><b>Error:</b> $tname #\$id was not found!</p>\\n\");\n");
|
||||
print(" html_footer();\n");
|
||||
print(" exit();\n");
|
||||
print(" }\n");
|
||||
print("\n");
|
||||
print(" \$row = db_next(\$result);\n");
|
||||
print("\n");
|
||||
print(" print(\"<form method='post' action='\$PHP_SELF?M\$id'>\"\n");
|
||||
print(" .\"<p><table width='100%' cellpadding='5' cellspacing='0' border='0'>\\n\");\n");
|
||||
print("\n");
|
||||
print(" print(\"<tr><th align='right'>Published:</th><td>\");\n");
|
||||
print(" select_is_published(\$row['is_published']);\n");
|
||||
print(" print(\"</td></tr>\\n\");\n");
|
||||
print("\n");
|
||||
|
||||
sqlite_seek($result, 0);
|
||||
while ($row = sqlite_fetch_array($result))
|
||||
switch ($row['name'])
|
||||
{
|
||||
case "id" :
|
||||
case "create_date" :
|
||||
case "create_user" :
|
||||
case "modify_date" :
|
||||
case "modify_user" :
|
||||
case "is_published" :
|
||||
break;
|
||||
|
||||
default :
|
||||
$form = strtoupper($row['name']);
|
||||
$name = ucwords(str_replace('_', ' ', $row['name']));
|
||||
print(" \$temp = htmlspecialchars(\$row['$row[name]'], ENT_QUOTES);\n");
|
||||
print(" print(\"<tr><th align='right'>$name:</th>\"\n");
|
||||
|
||||
if ($row['type'] == "TEXT")
|
||||
{
|
||||
print(" .\"<td><textarea name='$form' \"\n");
|
||||
print(" .\"cols='80' rows='10' wrap='virtual'>\"\n");
|
||||
print(" .\"\$temp</textarea></td></tr>\\n\");\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
print(" .\"<td><input type='text' name='$form' \"\n");
|
||||
print(" .\"value='\$temp' size='40'></td></tr>\\n\");\n");
|
||||
}
|
||||
|
||||
print("\n");
|
||||
break;
|
||||
}
|
||||
|
||||
print(" print(\"<tr><th colspan='2'>\"\n");
|
||||
print(" .\"<input type='submit' value='Update $tname'></th></tr>\\n\");\n");
|
||||
print(" print(\"</table></p></form>\\n\");\n");
|
||||
print("\n");
|
||||
print(" html_footer();\n");
|
||||
print(" }\n");
|
||||
print(" break;\n");
|
||||
print("\n");
|
||||
print(" case 'N' : // Post new $tname\n");
|
||||
print(" if (\$REQUEST_METHOD == \"POST\")\n");
|
||||
print(" {\n");
|
||||
print(" \$date = time();\n");
|
||||
|
||||
sqlite_seek($result, 0);
|
||||
while ($row = sqlite_fetch_array($result))
|
||||
switch ($row['name'])
|
||||
{
|
||||
case "id" :
|
||||
case "create_date" :
|
||||
case "create_user" :
|
||||
case "modify_date" :
|
||||
case "modify_user" :
|
||||
break;
|
||||
|
||||
default :
|
||||
$form = strtoupper($row['name']);
|
||||
if ($row['type'] == "INTEGER")
|
||||
print(" \$$row[name] = db_escape(\$_POST[\"$form\"]);\n");
|
||||
else
|
||||
print(" \$$row[name] = db_escape(\$_POST[\"$form\"]);\n");
|
||||
break;
|
||||
}
|
||||
|
||||
print("\n");
|
||||
print(" db_query(\"INSERT INTO $table VALUES(NULL,\"\n");
|
||||
|
||||
sqlite_seek($result, 0);
|
||||
while ($row = sqlite_fetch_array($result))
|
||||
switch ($row['name'])
|
||||
{
|
||||
case "id" :
|
||||
case "create_date" :
|
||||
case "create_user" :
|
||||
case "modify_date" :
|
||||
case "modify_user" :
|
||||
break;
|
||||
|
||||
default :
|
||||
if ($row['type'] == "INTEGER")
|
||||
print(" .\"\$$row[name],\"\n");
|
||||
else
|
||||
print(" .\"'\$$row[name]',\"\n");
|
||||
break;
|
||||
}
|
||||
|
||||
print(" .\"\$date,'\$LOGIN_USER',\$date,'\$LOGIN_USER')\");\n");
|
||||
print("\n");
|
||||
print(" \$id = db_insert_id();\n");
|
||||
print("\n");
|
||||
print(" header(\"Location: \$PHP_SELF?L\$id\");\n");
|
||||
print(" break;\n");
|
||||
print(" }\n");
|
||||
print("\n");
|
||||
print(" html_header(\"New $tname\");\n");
|
||||
print("\n");
|
||||
print(" html_start_links(1);\n");
|
||||
print(" html_link(\"Return to $tname List\", \"\$PHP_SELF?L\");\n");
|
||||
print(" html_end_links();\n");
|
||||
print("\n");
|
||||
print(" print(\"<h1>New $tname</h1>\\n\");\n");
|
||||
print(" print(\"<form method='post' action='\$PHP_SELF?N'>\"\n");
|
||||
print(" .\"<p><table width='100%' cellpadding='5' cellspacing='0' border='0'>\\n\");\n");
|
||||
print("\n");
|
||||
print(" if (\$LOGIN_USER != \"\")\n");
|
||||
print(" {\n");
|
||||
print(" print(\"<tr><th align='right'>Published:</th><td>\");\n");
|
||||
print(" select_is_published();\n");
|
||||
print(" print(\"</td></tr>\\n\");\n");
|
||||
print(" }\n");
|
||||
print(" else\n");
|
||||
print(" print(\"<input type='hidden' name='IS_PUBLISHED' value='0'/>\\n\");\n");
|
||||
print("\n");
|
||||
|
||||
sqlite_seek($result, 0);
|
||||
while ($row = sqlite_fetch_array($result))
|
||||
switch ($row['name'])
|
||||
{
|
||||
case "id" :
|
||||
case "create_date" :
|
||||
case "create_user" :
|
||||
case "modify_date" :
|
||||
case "modify_user" :
|
||||
case "is_published" :
|
||||
break;
|
||||
|
||||
default :
|
||||
$form = strtoupper($row['name']);
|
||||
$name = ucwords(str_replace('_', ' ', $row['name']));
|
||||
|
||||
print(" print(\"<tr><th align='right'>$name:</th>\"\n");
|
||||
|
||||
if ($row['type'] == "TEXT")
|
||||
{
|
||||
print(" .\"<td><textarea name='$form' \"\n");
|
||||
print(" .\"cols='80' rows='10' wrap='virtual'>\"\n");
|
||||
print(" .\"</textarea></td></tr>\\n\");\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
print(" .\"<td><input type='text' name='$form' \"\n");
|
||||
print(" .\"size='40'></td></tr>\\n\");\n");
|
||||
}
|
||||
|
||||
print("\n");
|
||||
break;
|
||||
}
|
||||
|
||||
print(" print(\"<tr><th colspan='2'>\"\n");
|
||||
print(" .\"<input type='submit' value='Create $tname'></th></tr>\\n\");\n");
|
||||
print(" print(\"</table></p></form>\\n\");\n");
|
||||
print("\n");
|
||||
print(" html_footer();\n");
|
||||
print(" break;\n");
|
||||
print("}\n");
|
||||
print("\n");
|
||||
print("\n");
|
||||
print("//\n");
|
||||
print("// End of \"\$Id\$\".\n");
|
||||
print("//\n");
|
||||
print("?>\n");
|
||||
|
||||
?>
|
@ -1,12 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
if test -f mxml.db; then
|
||||
rm -f mxml.db.old
|
||||
mv mxml.db mxml.db.old
|
||||
fi
|
||||
|
||||
sqlite mxml.db <mxml.sql
|
||||
|
||||
chmod 775 .
|
||||
chmod 664 mxml.db
|
||||
chgrp apache . mxml.db
|
@ -1,242 +0,0 @@
|
||||
--
|
||||
-- "$Id: mxml.sql,v 1.7 2004/05/21 03:59:17 mike Exp $"
|
||||
--
|
||||
-- Database schema for the Mini-XML web pages.
|
||||
--
|
||||
-- This SQL file is specifically for use with the SQLite database
|
||||
-- engine, but is probably portable to other databases like MySQL
|
||||
-- and Postgresql.
|
||||
--
|
||||
-- Revision History:
|
||||
--
|
||||
-- M. Sweet 05/17/2004 Initial revision.
|
||||
-- M. Sweet 05/19/2004 Added link, poll, and vote tables.
|
||||
-- M. Sweet 05/20/2004 Changes for MySQL
|
||||
|
||||
|
||||
--
|
||||
-- Schema for table 'article'
|
||||
--
|
||||
-- This table lists the available articles for each application.
|
||||
-- Articles correspond roughly to FAQs, HOWTOs, and news announcements,
|
||||
-- and they can be searched.
|
||||
--
|
||||
|
||||
CREATE TABLE article (
|
||||
id INTEGER PRIMARY KEY AUTO_INCREMENT,-- Article number
|
||||
is_published INTEGER, -- 0 = private, 1 = public
|
||||
title VARCHAR(255), -- Title of article
|
||||
abstract VARCHAR(255), -- Plain text abstract of article
|
||||
contents TEXT, -- Contents of article
|
||||
create_date INTEGER, -- Time/date of creation
|
||||
create_user VARCHAR(255), -- User that created the article
|
||||
modify_date INTEGER, -- Time/date of last change
|
||||
modify_user VARCHAR(255) -- User that made the last change
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Schema for table 'carboncopy'
|
||||
--
|
||||
-- This table tracks users that want to be notified when a resource is
|
||||
-- modified. Resources are tracked by filename/URL...
|
||||
--
|
||||
-- This is used to notify users whenever a STR or article is updated.
|
||||
--
|
||||
|
||||
CREATE TABLE carboncopy (
|
||||
id INTEGER PRIMARY KEY AUTO_INCREMENT,-- Carbon copy ID
|
||||
url VARCHAR(255), -- File or URL
|
||||
email VARCHAR(255) -- Email address
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Schema for table 'comment'
|
||||
--
|
||||
-- This table tracks comments that are added to a page on the web site.
|
||||
-- Comments are associated with a specific URL, so you can make comments
|
||||
-- on any page on the site...
|
||||
--
|
||||
|
||||
CREATE TABLE comment (
|
||||
id INTEGER PRIMARY KEY AUTO_INCREMENT,-- Comment ID number
|
||||
parent_id INTEGER, -- Parent comment ID number (reply-to)
|
||||
status INTEGER, -- Moderation status, 0 = dead to 5 = great
|
||||
url VARCHAR(255), -- File/link this comment applies to
|
||||
contents text, -- Comment message
|
||||
create_date INTEGER, -- Date the comment was posted
|
||||
create_user VARCHAR(255) -- Author name/email
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Table structure for table 'link'
|
||||
--
|
||||
-- This table lists links to external applications, web pages, etc.
|
||||
-- Basically, we end up providing a hierachical, searchable link list,
|
||||
-- complete with comments from users...
|
||||
--
|
||||
|
||||
CREATE TABLE link (
|
||||
id INTEGER PRIMARY KEY AUTO_INCREMENT,-- Link ID number
|
||||
parent_id INTEGER, -- Parent link ID or 0 for top-level
|
||||
is_category INTEGER, -- 0 = listing, 1 = category
|
||||
is_published INTEGER, -- 0 = private, 1 = public
|
||||
name VARCHAR(255), -- Link name
|
||||
version VARCHAR(255), -- Current version number string
|
||||
license VARCHAR(255), -- Current license
|
||||
author VARCHAR(255), -- Current author
|
||||
email VARCHAR(255), -- Public email address
|
||||
homepage_url VARCHAR(255), -- Home page
|
||||
download_url VARCHAR(255), -- Download page
|
||||
description TEXT, -- Description of link
|
||||
rating_total INTEGER, -- Total of all ratings
|
||||
rating_count INTEGER, -- Number of ratings
|
||||
homepage_visits INTEGER, -- Number of clicks to the home page
|
||||
download_visits INTEGER, -- Number of clicks to the download page
|
||||
create_date INTEGER, -- Creation time/date
|
||||
create_user VARCHAR(255), -- User that created the link
|
||||
modify_date INTEGER, -- Last time/date changed
|
||||
modify_user VARCHAR(255) -- User that made the last change
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Table structure for table 'poll'
|
||||
--
|
||||
-- This table provides a very simple single question, multiple choice poll
|
||||
-- interface for the main page. Used successfully for a couple years now
|
||||
-- on the CUPS and FLTK sites, the main twist is the new poll_type field
|
||||
-- to control whether it is pick-one or pick-many poll.
|
||||
--
|
||||
|
||||
CREATE TABLE poll (
|
||||
id INTEGER PRIMARY KEY AUTO_INCREMENT,-- Poll ID number
|
||||
is_published INTEGER, -- 0 = private, 1 = public
|
||||
poll_type INTEGER, -- 0 = pick one, 1 = pick many
|
||||
question VARCHAR(255), -- Question plain text
|
||||
answer0 VARCHAR(255), -- Answer #1 plain text
|
||||
count0 INTEGER, -- Number of votes for #1
|
||||
answer1 VARCHAR(255), -- Answer #2 plain text
|
||||
count1 INTEGER, -- Number of votes for #2
|
||||
answer2 VARCHAR(255), -- Answer #3 plain text
|
||||
count2 INTEGER, -- Number of votes for #3
|
||||
answer3 VARCHAR(255), -- Answer #4 plain text
|
||||
count3 INTEGER, -- Number of votes for #4
|
||||
answer4 VARCHAR(255), -- Answer #5 plain text
|
||||
count4 INTEGER, -- Number of votes for #5
|
||||
answer5 VARCHAR(255), -- Answer #6 plain text
|
||||
count5 INTEGER, -- Number of votes for #6
|
||||
answer6 VARCHAR(255), -- Answer #7 plain text
|
||||
count6 INTEGER, -- Number of votes for #7
|
||||
answer7 VARCHAR(255), -- Answer #8 plain text
|
||||
count7 INTEGER, -- Number of votes for #8
|
||||
answer8 VARCHAR(255), -- Answer #9 plain text
|
||||
count8 INTEGER, -- Number of votes for #9
|
||||
answer9 VARCHAR(255), -- Answer #10 plain text
|
||||
count9 INTEGER, -- Number of votes for #10
|
||||
votes INTEGER, -- Total votes
|
||||
create_date INTEGER, -- Time/date of creation
|
||||
create_user VARCHAR(255), -- User that created the poll
|
||||
modify_date INTEGER, -- Time/date of last change
|
||||
modify_user VARCHAR(255) -- User that made the last change
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Schema for table 'str'
|
||||
--
|
||||
-- This table stores software trouble reports.
|
||||
--
|
||||
|
||||
CREATE TABLE str (
|
||||
id INTEGER PRIMARY KEY AUTO_INCREMENT,-- STR number
|
||||
master_id INTEGER, -- "Duplicate of" number
|
||||
is_published INTEGER, -- 0 = private, 1 = public
|
||||
status INTEGER, -- 1 = closed/resolved,
|
||||
-- 2 = closed/unresolved,
|
||||
-- 3 = active, 4 = pending, 5 = new
|
||||
priority INTEGER, -- 1 = rfe, 2 = low, 3 = moderate,
|
||||
-- 4 = high, 5 = critical
|
||||
scope INTEGER, -- 1 = unit, 2 = function, 3 = software
|
||||
summary text, -- Plain text summary
|
||||
subsystem VARCHAR(255), -- Subsystem name
|
||||
str_version VARCHAR(16), -- Software version for STR
|
||||
fix_version VARCHAR(16), -- Software version for fix
|
||||
manager_email VARCHAR(255), -- Manager of STR
|
||||
create_date INTEGER, -- Time/date of creation
|
||||
create_user VARCHAR(255), -- User that created the STR
|
||||
modify_date INTEGER, -- Time/date of last change
|
||||
modify_user VARCHAR(255) -- User that made the last change
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Schema for table 'strfile'
|
||||
--
|
||||
-- This table tracks the files that are attached to a STR.
|
||||
--
|
||||
|
||||
CREATE TABLE strfile (
|
||||
id INTEGER PRIMARY KEY AUTO_INCREMENT,-- File ID
|
||||
str_id INTEGER, -- STR number
|
||||
is_published INTEGER, -- 0 = private, 1 = public
|
||||
filename VARCHAR(255), -- Name of file
|
||||
create_date INTEGER, -- Time/date of creation
|
||||
create_user VARCHAR(255) -- User that posted the file
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Schema for table 'strtext'
|
||||
--
|
||||
-- This table tracks the text messages that are attached to a STR.
|
||||
--
|
||||
|
||||
CREATE TABLE strtext (
|
||||
id INTEGER PRIMARY KEY AUTO_INCREMENT,-- Text ID
|
||||
str_id INTEGER, -- STR number
|
||||
is_published INTEGER, -- 0 = private, 1 = public
|
||||
contents TEXT, -- Text message
|
||||
create_date INTEGER, -- Time/date of creation
|
||||
create_user VARCHAR(255) -- User that posted the text
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Schema for table 'users'
|
||||
--
|
||||
-- This table lists the users that work on Mini-XML. Various pages use
|
||||
-- this table when doing login/logout stuff and when listing the available
|
||||
-- users to assign stuff to.
|
||||
--
|
||||
|
||||
CREATE TABLE users (
|
||||
id INTEGER PRIMARY KEY AUTO_INCREMENT,-- ID
|
||||
is_published INTEGER, -- 0 = private, 1 = public
|
||||
name VARCHAR(255), -- Login name
|
||||
email VARCHAR(255), -- Name/email address
|
||||
hash CHAR(32), -- MD5 hash of name:password
|
||||
level INTEGER, -- 0 = normal user, 100 = admin user
|
||||
create_date INTEGER, -- Time/date of creation
|
||||
create_user VARCHAR(255), -- User that created the user
|
||||
modify_date INTEGER, -- Time/date of last change
|
||||
modify_user VARCHAR(255) -- User that made the last change
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Table structure for table 'vote'
|
||||
--
|
||||
-- This table is used to track ratings, poll votes, etc. that are made on
|
||||
-- the links and poll pages.
|
||||
--
|
||||
|
||||
CREATE TABLE vote (
|
||||
type_id_ip VARCHAR(255) PRIMARY KEY -- type_id_ip
|
||||
);
|
||||
|
||||
--
|
||||
-- End of "$Id: mxml.sql,v 1.7 2004/05/21 03:59:17 mike Exp $".
|
||||
--
|
@ -1,4 +0,0 @@
|
||||
76f2ae49bf0f5745d5cb5d9507774dc9 2.7 mxml/2.7/mxml-2.7.tar.gz
|
||||
68977789ae64985dddbd1a1a1652642e 2.6 mxml/2.6/mxml-2.6.tar.gz
|
||||
f706377fba630b39fa02fd63642b17e5 2.5 mxml/2.5/mxml-2.5.tar.gz
|
||||
9b116daa370bf647447d6ffe70e73534 1.3 mxml/1.3/mxml-1.3.tar.gz
|
@ -1,2 +0,0 @@
|
||||
DirectoryIndex off
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.4 KiB |
@ -1,581 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Mini-XML Programmers Manual, Version 2.7</TITLE>
|
||||
<META NAME="author" CONTENT="Michael R. Sweet">
|
||||
<META NAME="copyright" CONTENT="Copyright 2003-2011">
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-iso-8859-1">
|
||||
<LINK REL="Start" HREF="index.html">
|
||||
<LINK REL="Contents" HREF="index.html">
|
||||
<LINK REL="Prev" HREF="basics.html">
|
||||
<LINK REL="Next" HREF="mxmldoc.html">
|
||||
<STYLE TYPE="text/css"><!--
|
||||
BODY { font-family: sans-serif }
|
||||
H1 { font-family: sans-serif }
|
||||
H2 { font-family: sans-serif }
|
||||
H3 { font-family: sans-serif }
|
||||
H4 { font-family: sans-serif }
|
||||
H5 { font-family: sans-serif }
|
||||
H6 { font-family: sans-serif }
|
||||
SUB { font-size: smaller }
|
||||
SUP { font-size: smaller }
|
||||
PRE { font-family: monospace }
|
||||
A { text-decoration: none }
|
||||
--></STYLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<A HREF="index.html">Contents</A>
|
||||
<A HREF="basics.html">Previous</A>
|
||||
<A HREF="mxmldoc.html">Next</A>
|
||||
<HR NOSHADE>
|
||||
<H1 align="right"><A name="ADVANCED"><IMG align="right" alt="3" height="100"
|
||||
hspace="10" src="3.gif" width="100"></A>More Mini-XML Programming
|
||||
Techniques</H1>
|
||||
<P>This chapter shows additional ways to use the Mini-XML library in
|
||||
your programs.</P>
|
||||
<H2><A name="LOAD_CALLBACKS">Load Callbacks</A></H2>
|
||||
<P><A href="#LOAD_XML">Chapter 2</A> introduced the <A href="reference.html#mxmlLoadFile">
|
||||
<TT>mxmlLoadFile()</TT></A> and <A href="reference.html#mxmlLoadString"><TT>
|
||||
mxmlLoadString()</TT></A> functions. The last argument to these
|
||||
functions is a callback function which is used to determine the value
|
||||
type of each data node in an XML document.</P>
|
||||
<P>Mini-XML defines several standard callbacks for simple XML data
|
||||
files:</P>
|
||||
<UL>
|
||||
<LI><TT>MXML_INTEGER_CALLBACK</TT> - All data nodes contain
|
||||
whitespace-separated integers.</LI>
|
||||
<LI><TT>MXML_OPAQUE_CALLBACK</TT> - All data nodes contain opaque
|
||||
strings ("CDATA").</LI>
|
||||
<LI><TT>MXML_REAL_CALLBACK</TT> - All data nodes contain
|
||||
whitespace-separated floating-point numbers.</LI>
|
||||
<LI><TT>MXML_TEXT_CALLBACK</TT> - All data nodes contain
|
||||
whitespace-separated strings.</LI>
|
||||
</UL>
|
||||
<P>You can provide your own callback functions for more complex XML
|
||||
documents. Your callback function will receive a pointer to the current
|
||||
element node and must return the value type of the immediate children
|
||||
for that element node: <TT>MXML_INTEGER</TT>, <TT>MXML_OPAQUE</TT>, <TT>
|
||||
MXML_REAL</TT>, or <TT>MXML_TEXT</TT>. The function is called<I> after</I>
|
||||
the element and its attributes have been read, so you can look at the
|
||||
element name, attributes, and attribute values to determine the proper
|
||||
value type to return.</P>
|
||||
|
||||
<!-- NEED 2in -->
|
||||
<P>The following callback function looks for an attribute named "type"
|
||||
or the element name to determine the value type for its child nodes:</P>
|
||||
<PRE>
|
||||
mxml_type_t
|
||||
type_cb(mxml_node_t *node)
|
||||
{
|
||||
const char *type;
|
||||
|
||||
/*
|
||||
* You can lookup attributes and/or use the
|
||||
* element name, hierarchy, etc...
|
||||
*/
|
||||
|
||||
type = mxmlElementGetAttr(node, "type");
|
||||
if (type == NULL)
|
||||
type = mxmlGetElement(node);
|
||||
|
||||
if (!strcmp(type, "integer"))
|
||||
return (MXML_INTEGER);
|
||||
else if (!strcmp(type, "opaque"))
|
||||
return (MXML_OPAQUE);
|
||||
else if (!strcmp(type, "real"))
|
||||
return (MXML_REAL);
|
||||
else
|
||||
return (MXML_TEXT);
|
||||
}
|
||||
</PRE>
|
||||
<P>To use this callback function, simply use the name when you call any
|
||||
of the load functions:</P>
|
||||
<PRE>
|
||||
FILE *fp;
|
||||
mxml_node_t *tree;
|
||||
|
||||
fp = fopen("filename.xml", "r");
|
||||
tree = mxmlLoadFile(NULL, fp, <B>type_cb</B>);
|
||||
fclose(fp);
|
||||
</PRE>
|
||||
<H2><A name="SAVE_CALLBACKS">Save Callbacks</A></H2>
|
||||
<P><A href="#LOAD_XML">Chapter 2</A> also introduced the <A href="reference.html#mxmlSaveFile">
|
||||
<TT>mxmlSaveFile()</TT></A>, <A href="reference.html#mxmlSaveString"><TT>
|
||||
mxmlSaveString()</TT></A>, and <A href="reference.html#mxmlSaveAllocString">
|
||||
<TT>mxmlSaveAllocString()</TT></A> functions. The last argument to these
|
||||
functions is a callback function which is used to automatically insert
|
||||
whitespace in an XML document.</P>
|
||||
<P>Your callback function will be called up to four times for each
|
||||
element node with a pointer to the node and a "where" value of <TT>
|
||||
MXML_WS_BEFORE_OPEN</TT>, <TT>MXML_WS_AFTER_OPEN</TT>, <TT>
|
||||
MXML_WS_BEFORE_CLOSE</TT>, or <TT>MXML_WS_AFTER_CLOSE</TT>. The callback
|
||||
function should return <TT>NULL</TT> if no whitespace should be added
|
||||
and the string to insert (spaces, tabs, carriage returns, and newlines)
|
||||
otherwise.</P>
|
||||
<P>The following whitespace callback can be used to add whitespace to
|
||||
XHTML output to make it more readable in a standard text editor:</P>
|
||||
<PRE>
|
||||
const char *
|
||||
whitespace_cb(mxml_node_t *node,
|
||||
int where)
|
||||
{
|
||||
const char *name;
|
||||
|
||||
/*
|
||||
* We can conditionally break to a new line
|
||||
* before or after any element. These are
|
||||
* just common HTML elements...
|
||||
*/
|
||||
|
||||
name = mxmlGetElement(node);
|
||||
|
||||
if (!strcmp(name, "html") ||
|
||||
!strcmp(name, "head") ||
|
||||
!strcmp(name, "body") ||
|
||||
!strcmp(name, "pre") ||
|
||||
!strcmp(name, "p") ||
|
||||
!strcmp(name, "h1") ||
|
||||
!strcmp(name, "h2") ||
|
||||
!strcmp(name, "h3") ||
|
||||
!strcmp(name, "h4") ||
|
||||
!strcmp(name, "h5") ||
|
||||
!strcmp(name, "h6"))
|
||||
{
|
||||
/*
|
||||
* Newlines before open and after
|
||||
* close...
|
||||
*/
|
||||
|
||||
if (where == MXML_WS_BEFORE_OPEN ||
|
||||
where == MXML_WS_AFTER_CLOSE)
|
||||
return ("\n");
|
||||
}
|
||||
else if (!strcmp(name, "dl") ||
|
||||
!strcmp(name, "ol") ||
|
||||
!strcmp(name, "ul"))
|
||||
{
|
||||
/*
|
||||
* Put a newline before and after list
|
||||
* elements...
|
||||
*/
|
||||
|
||||
return ("\n");
|
||||
}
|
||||
else if (!strcmp(name, "dd") ||
|
||||
!strcmp(name, "dt") ||
|
||||
!strcmp(name, "li"))
|
||||
{
|
||||
/*
|
||||
* Put a tab before <li>'s, * <dd>'s,
|
||||
* and <dt>'s, and a newline after them...
|
||||
*/
|
||||
|
||||
if (where == MXML_WS_BEFORE_OPEN)
|
||||
return ("\t");
|
||||
else if (where == MXML_WS_AFTER_CLOSE)
|
||||
return ("\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Return NULL for no added whitespace...
|
||||
*/
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
</PRE>
|
||||
<P>To use this callback function, simply use the name when you call any
|
||||
of the save functions:</P>
|
||||
<PRE>
|
||||
FILE *fp;
|
||||
mxml_node_t *tree;
|
||||
|
||||
fp = fopen("filename.xml", "w");
|
||||
mxmlSaveFile(tree, fp, <B>whitespace_cb</B>);
|
||||
fclose(fp);
|
||||
</PRE>
|
||||
|
||||
<!-- NEED 10 -->
|
||||
<H2><A NAME="4_3">Custom Data Types</A></H2>
|
||||
<P>Mini-XML supports custom data types via global load and save
|
||||
callbacks. Only a single set of callbacks can be active at any time,
|
||||
however your callbacks can store additional information in order to
|
||||
support multiple custom data types as needed. The <TT>MXML_CUSTOM</TT>
|
||||
node type identifies custom data nodes.</P>
|
||||
<P>The load callback receives a pointer to the current data node and a
|
||||
string of opaque character data from the XML source with character
|
||||
entities converted to the corresponding UTF-8 characters. For example,
|
||||
if we wanted to support a custom date/time type whose value is encoded
|
||||
as "yyyy-mm-ddThh:mm:ssZ" (ISO format), the load callback would look
|
||||
like the following:</P>
|
||||
<PRE>
|
||||
typedef struct
|
||||
{
|
||||
unsigned year, /* Year */
|
||||
month, /* Month */
|
||||
day, /* Day */
|
||||
hour, /* Hour */
|
||||
minute, /* Minute */
|
||||
second; /* Second */
|
||||
time_t unix; /* UNIX time */
|
||||
} iso_date_time_t;
|
||||
|
||||
int
|
||||
load_custom(mxml_node_t *node,
|
||||
const char *data)
|
||||
{
|
||||
iso_date_time_t *dt;
|
||||
struct tm tmdata;
|
||||
|
||||
/*
|
||||
* Allocate data structure...
|
||||
*/
|
||||
|
||||
dt = calloc(1, sizeof(iso_date_time_t));
|
||||
|
||||
/*
|
||||
* Try reading 6 unsigned integers from the
|
||||
* data string...
|
||||
*/
|
||||
|
||||
if (sscanf(data, "%u-%u-%uT%u:%u:%uZ",
|
||||
&(dt->year), &(dt->month),
|
||||
&(dt->day), &(dt->hour),
|
||||
&(dt->minute),
|
||||
&(dt->second)) != 6)
|
||||
{
|
||||
/*
|
||||
* Unable to read numbers, free the data
|
||||
* structure and return an error...
|
||||
*/
|
||||
|
||||
free(dt);
|
||||
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Range check values...
|
||||
*/
|
||||
|
||||
if (dt->month <1 || dt->month > 12 ||
|
||||
dt->day <1 || dt->day > 31 ||
|
||||
dt->hour <0 || dt->hour > 23 ||
|
||||
dt->minute <0 || dt->minute > 59 ||
|
||||
dt->second <0 || dt->second > 59)
|
||||
{
|
||||
/*
|
||||
* Date information is out of range...
|
||||
*/
|
||||
|
||||
free(dt);
|
||||
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert ISO time to UNIX time in
|
||||
* seconds...
|
||||
*/
|
||||
|
||||
tmdata.tm_year = dt->year - 1900;
|
||||
tmdata.tm_mon = dt->month - 1;
|
||||
tmdata.tm_day = dt->day;
|
||||
tmdata.tm_hour = dt->hour;
|
||||
tmdata.tm_min = dt->minute;
|
||||
tmdata.tm_sec = dt->second;
|
||||
|
||||
dt->unix = gmtime(&tmdata);
|
||||
|
||||
/*
|
||||
* Assign custom node data and destroy
|
||||
* function pointers...
|
||||
*/
|
||||
|
||||
mxmlSetCustom(node, data, destroy);
|
||||
|
||||
/*
|
||||
* Return with no errors...
|
||||
*/
|
||||
|
||||
return (0);
|
||||
}
|
||||
</PRE>
|
||||
<P>The function itself can return 0 on success or -1 if it is unable to
|
||||
decode the custom data or the data contains an error. Custom data nodes
|
||||
contain a <TT>void</TT> pointer to the allocated custom data for the
|
||||
node and a pointer to a destructor function which will free the custom
|
||||
data when the node is deleted.</P>
|
||||
|
||||
<!-- NEED 15 -->
|
||||
<P>The save callback receives the node pointer and returns an allocated
|
||||
string containing the custom data value. The following save callback
|
||||
could be used for our ISO date/time type:</P>
|
||||
<PRE>
|
||||
char *
|
||||
save_custom(mxml_node_t *node)
|
||||
{
|
||||
char data[255];
|
||||
iso_date_time_t *dt;
|
||||
|
||||
|
||||
dt = (iso_date_time_t *)mxmlGetCustom(node);
|
||||
|
||||
snprintf(data, sizeof(data),
|
||||
"%04u-%02u-%02uT%02u:%02u:%02uZ",
|
||||
dt->year, dt->month, dt->day,
|
||||
dt->hour, dt->minute, dt->second);
|
||||
|
||||
return (strdup(data));
|
||||
}
|
||||
</PRE>
|
||||
<P>You register the callback functions using the <A href="reference.html#mxmlSetCustomHandlers">
|
||||
<TT>mxmlSetCustomHandlers()</TT></A> function:</P>
|
||||
<PRE>
|
||||
mxmlSetCustomHandlers(<B>load_custom</B>,
|
||||
<B>save_custom</B>);
|
||||
</PRE>
|
||||
|
||||
<!-- NEED 20 -->
|
||||
<H2><A NAME="4_4">Changing Node Values</A></H2>
|
||||
<P>All of the examples so far have concentrated on creating and loading
|
||||
new XML data nodes. Many applications, however, need to manipulate or
|
||||
change the nodes during their operation, so Mini-XML provides functions
|
||||
to change node values safely and without leaking memory.</P>
|
||||
<P>Existing nodes can be changed using the <A href="reference.html#mxmlSetElement">
|
||||
<TT>mxmlSetElement()</TT></A>, <A href="reference.html#mxmlSetInteger"><TT>
|
||||
mxmlSetInteger()</TT></A>, <A href="reference.html#mxmlSetOpaque"><TT>
|
||||
mxmlSetOpaque()</TT></A>, <A href="reference.html#mxmlSetReal"><TT>
|
||||
mxmlSetReal()</TT></A>, <A href="reference.html#mxmlSetText"><TT>
|
||||
mxmlSetText()</TT></A>, and <A href="reference.html#mxmlSetTextf"><TT>
|
||||
mxmlSetTextf()</TT></A> functions. For example, use the following
|
||||
function call to change a text node to contain the text "new" with
|
||||
leading whitespace:</P>
|
||||
<PRE>
|
||||
mxml_node_t *node;
|
||||
|
||||
mxmlSetText(node, 1, "new");
|
||||
</PRE>
|
||||
<H2><A NAME="4_5">Formatted Text</A></H2>
|
||||
<P>The <A href="reference.html#mxmlNewTextf"><TT>mxmlNewTextf()</TT></A>
|
||||
and <A href="reference.html#mxmlSetTextf"><TT>mxmlSetTextf()</TT></A>
|
||||
functions create and change text nodes, respectively, using <TT>printf</TT>
|
||||
-style format strings and arguments. For example, use the following
|
||||
function call to create a new text node containing a constructed
|
||||
filename:</P>
|
||||
<PRE>
|
||||
mxml_node_t *node;
|
||||
|
||||
node = mxmlNewTextf(node, 1, "%s/%s",
|
||||
path, filename);
|
||||
</PRE>
|
||||
<H2><A NAME="4_6">Indexing</A></H2>
|
||||
<P>Mini-XML provides functions for managing indices of nodes. The
|
||||
current implementation provides the same functionality as <A href="reference.html#mxmlFindElement">
|
||||
<TT>mxmlFindElement()</TT></A>. The advantage of using an index is that
|
||||
searching and enumeration of elements is significantly faster. The only
|
||||
disadvantage is that each index is a static snapshot of the XML
|
||||
document, so indices are not well suited to XML data that is updated
|
||||
more often than it is searched. The overhead of creating an index is
|
||||
approximately equal to walking the XML document tree. Nodes in the
|
||||
index are sorted by element name and attribute value.</P>
|
||||
<P>Indices are stored in <A href="reference.html#mxml_index_t"><TT>
|
||||
mxml_index_t</TT></A> structures. The <A href="reference.html#mxmlIndexNew">
|
||||
<TT>mxmlIndexNew()</TT></A> function creates a new index:</P>
|
||||
<PRE>
|
||||
mxml_node_t *tree;
|
||||
mxml_index_t *ind;
|
||||
|
||||
ind = mxmlIndexNew(tree, "element",
|
||||
"attribute");
|
||||
</PRE>
|
||||
<P>The first argument is the XML node tree to index. Normally this will
|
||||
be a pointer to the <TT>?xml</TT> element.</P>
|
||||
<P>The second argument contains the element to index; passing <TT>NULL</TT>
|
||||
indexes all element nodes alphabetically.</P>
|
||||
<P>The third argument contains the attribute to index; passing <TT>NULL</TT>
|
||||
causes only the element name to be indexed.</P>
|
||||
<P>Once the index is created, the <A href="reference.html#mxmlIndexEnum">
|
||||
<TT>mxmlIndexEnum()</TT></A>, <A href="reference.html#mxmlIndexFind"><TT>
|
||||
mxmlIndexFind()</TT></A>, and <A href="reference.html#mxmlIndexReset"><TT>
|
||||
mxmlIndexReset()</TT></A> functions are used to access the nodes in the
|
||||
index. The <A href="reference.html#mxmlIndexReset"><TT>mxmlIndexReset()</TT>
|
||||
</A> function resets the "current" node pointer in the index, allowing
|
||||
you to do new searches and enumerations on the same index. Typically
|
||||
you will call this function prior to your calls to <A href="reference.html#mxmlIndexEnum">
|
||||
<TT>mxmlIndexEnum()</TT></A> and <A href="reference.html#mxmlIndexFind"><TT>
|
||||
mxmlIndexFind()</TT></A>.</P>
|
||||
<P>The <A href="reference.html#mxmlIndexEnum"><TT>mxmlIndexEnum()</TT></A>
|
||||
function enumerates each of the nodes in the index and can be used in a
|
||||
loop as follows:</P>
|
||||
<PRE>
|
||||
mxml_node_t *node;
|
||||
|
||||
mxmlIndexReset(ind);
|
||||
|
||||
while ((node = mxmlIndexEnum(ind)) != NULL)
|
||||
{
|
||||
// do something with node
|
||||
}
|
||||
</PRE>
|
||||
<P>The <A href="reference.html#mxmlIndexFind"><TT>mxmlIndexFind()</TT></A>
|
||||
function locates the next occurrence of the named element and attribute
|
||||
value in the index. It can be used to find all matching elements in an
|
||||
index, as follows:</P>
|
||||
<PRE>
|
||||
mxml_node_t *node;
|
||||
|
||||
mxmlIndexReset(ind);
|
||||
|
||||
while ((node = mxmlIndexFind(ind, "element",
|
||||
"attr-value"))
|
||||
!= NULL)
|
||||
{
|
||||
// do something with node
|
||||
}
|
||||
</PRE>
|
||||
<P>The second and third arguments represent the element name and
|
||||
attribute value, respectively. A <TT>NULL</TT> pointer is used to
|
||||
return all elements or attributes in the index. Passing <TT>NULL</TT>
|
||||
for both the element name and attribute value is equivalent to calling <TT>
|
||||
mxmlIndexEnum</TT>.</P>
|
||||
<P>When you are done using the index, delete it using the <A href="#mxmlIndexDelete()">
|
||||
<TT>mxmlIndexDelete()</TT></A> function:</P>
|
||||
<PRE>
|
||||
mxmlIndexDelete(ind);
|
||||
</PRE>
|
||||
<H2><A NAME="4_7">SAX (Stream) Loading of Documents</A></H2>
|
||||
<P>Mini-XML supports an implementation of the Simple API for XML (SAX)
|
||||
which allows you to load and process an XML document as a stream of
|
||||
nodes. Aside from allowing you to process XML documents of any size,
|
||||
the Mini-XML implementation also allows you to retain portions of the
|
||||
document in memory for later processing.</P>
|
||||
<P>The <A href="#mxmlSAXLoad"><TT>mxmlSAXLoadFd</TT></A>, <A href="reference.html#mxmlSAXLoadFile">
|
||||
<TT>mxmlSAXLoadFile</TT></A>, and <A href="reference.html#mxmlSAXLoadString">
|
||||
<TT>mxmlSAXLoadString</TT></A> functions provide the SAX loading APIs.
|
||||
Each function works like the corresponding <TT>mxmlLoad</TT> function
|
||||
but uses a callback to process each node as it is read.</P>
|
||||
<P>The callback function receives the node, an event code, and a user
|
||||
data pointer you supply:</P>
|
||||
<PRE>
|
||||
void
|
||||
sax_cb(mxml_node_t *node,
|
||||
mxml_sax_event_t event,
|
||||
void *data)
|
||||
{
|
||||
... do something ...
|
||||
}
|
||||
</PRE>
|
||||
<P>The event will be one of the following:</P>
|
||||
<UL>
|
||||
<LI><TT>MXML_SAX_CDATA</TT> - CDATA was just read</LI>
|
||||
<LI><TT>MXML_SAX_COMMENT</TT> - A comment was just read</LI>
|
||||
<LI><TT>MXML_SAX_DATA</TT> - Data (custom, integer, opaque, real, or
|
||||
text) was just read</LI>
|
||||
<LI><TT>MXML_SAX_DIRECTIVE</TT> - A processing directive was just read</LI>
|
||||
<LI><TT>MXML_SAX_ELEMENT_CLOSE</TT> - A close element was just read (<TT>
|
||||
</element></TT>)</LI>
|
||||
<LI><TT>MXML_SAX_ELEMENT_OPEN</TT> - An open element was just read (<TT>
|
||||
<element></TT>)</LI>
|
||||
</UL>
|
||||
<P>Elements are<EM> released</EM> after the close element is processed.
|
||||
All other nodes are released after they are processed. The SAX callback
|
||||
can<EM> retain</EM> the node using the <A href="reference.html#mxmlRetain">
|
||||
<TT>mxmlRetain</TT></A> function. For example, the following SAX
|
||||
callback will retain all nodes, effectively simulating a normal
|
||||
in-memory load:</P>
|
||||
<PRE>
|
||||
void
|
||||
sax_cb(mxml_node_t *node,
|
||||
mxml_sax_event_t event,
|
||||
void *data)
|
||||
{
|
||||
if (event != MXML_SAX_ELEMENT_CLOSE)
|
||||
mxmlRetain(node);
|
||||
}
|
||||
</PRE>
|
||||
<P>More typically the SAX callback will only retain a small portion of
|
||||
the document that is needed for post-processing. For example, the
|
||||
following SAX callback will retain the title and headings in an XHTML
|
||||
file. It also retains the (parent) elements like <TT><html></TT>, <TT>
|
||||
<head></TT>, and <TT><body></TT>, and processing directives like <TT>
|
||||
<?xml ... ?></TT> and <TT><!DOCTYPE ... ></TT>:</P>
|
||||
|
||||
<!-- NEED 10 -->
|
||||
<PRE>
|
||||
void
|
||||
sax_cb(mxml_node_t *node,
|
||||
mxml_sax_event_t event,
|
||||
void *data)
|
||||
{
|
||||
if (event == MXML_SAX_ELEMENT_OPEN)
|
||||
{
|
||||
/*
|
||||
* Retain headings and titles...
|
||||
*/
|
||||
|
||||
char *name = mxmlGetElement(node);
|
||||
|
||||
if (!strcmp(name, "html") ||
|
||||
!strcmp(name, "head") ||
|
||||
!strcmp(name, "title") ||
|
||||
!strcmp(name, "body") ||
|
||||
!strcmp(name, "h1") ||
|
||||
!strcmp(name, "h2") ||
|
||||
!strcmp(name, "h3") ||
|
||||
!strcmp(name, "h4") ||
|
||||
!strcmp(name, "h5") ||
|
||||
!strcmp(name, "h6"))
|
||||
mxmlRetain(node);
|
||||
}
|
||||
else if (event == MXML_SAX_DIRECTIVE)
|
||||
mxmlRetain(node);
|
||||
else if (event == MXML_SAX_DATA)
|
||||
{
|
||||
if (mxmlGetRefCount(mxmlGetParent(node)) > 1)
|
||||
{
|
||||
/*
|
||||
* If the parent was retained, then retain
|
||||
* this data node as well.
|
||||
*/
|
||||
|
||||
mxmlRetain(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
</PRE>
|
||||
<P>The resulting skeleton document tree can then be searched just like
|
||||
one loaded using the <TT>mxmlLoad</TT> functions. For example, a filter
|
||||
that reads an XHTML document from stdin and then shows the title and
|
||||
headings in the document would look like:</P>
|
||||
<PRE>
|
||||
mxml_node_t *doc, *title, *body, *heading;
|
||||
|
||||
doc = mxmlSAXLoadFd(NULL, 0,
|
||||
MXML_TEXT_CALLBACK,
|
||||
<B>sax_cb</B>, NULL);
|
||||
|
||||
title = mxmlFindElement(doc, doc, "title",
|
||||
NULL, NULL,
|
||||
MXML_DESCEND);
|
||||
|
||||
if (title)
|
||||
print_children(title);
|
||||
|
||||
body = mxmlFindElement(doc, doc, "body",
|
||||
NULL, NULL,
|
||||
MXML_DESCEND);
|
||||
|
||||
if (body)
|
||||
{
|
||||
for (heading = mxmlGetFirstChild(body);
|
||||
heading;
|
||||
heading = mxmlGetNextSibling(heading))
|
||||
print_children(heading);
|
||||
}
|
||||
</PRE>
|
||||
<HR NOSHADE>
|
||||
<A HREF="index.html">Contents</A>
|
||||
<A HREF="basics.html">Previous</A>
|
||||
<A HREF="mxmldoc.html">Next</A>
|
||||
</BODY>
|
||||
</HTML>
|
@ -1,520 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Mini-XML Programmers Manual, Version 2.7</TITLE>
|
||||
<META NAME="author" CONTENT="Michael R. Sweet">
|
||||
<META NAME="copyright" CONTENT="Copyright 2003-2011">
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-iso-8859-1">
|
||||
<LINK REL="Start" HREF="index.html">
|
||||
<LINK REL="Contents" HREF="index.html">
|
||||
<LINK REL="Prev" HREF="install.html">
|
||||
<LINK REL="Next" HREF="advanced.html">
|
||||
<STYLE TYPE="text/css"><!--
|
||||
BODY { font-family: sans-serif }
|
||||
H1 { font-family: sans-serif }
|
||||
H2 { font-family: sans-serif }
|
||||
H3 { font-family: sans-serif }
|
||||
H4 { font-family: sans-serif }
|
||||
H5 { font-family: sans-serif }
|
||||
H6 { font-family: sans-serif }
|
||||
SUB { font-size: smaller }
|
||||
SUP { font-size: smaller }
|
||||
PRE { font-family: monospace }
|
||||
A { text-decoration: none }
|
||||
--></STYLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<A HREF="index.html">Contents</A>
|
||||
<A HREF="install.html">Previous</A>
|
||||
<A HREF="advanced.html">Next</A>
|
||||
<HR NOSHADE>
|
||||
<H1 align="right"><A name="BASICS"><IMG align="right" alt="2" height="100"
|
||||
hspace="10" src="2.gif" width="100"></A>Getting Started with Mini-XML</H1>
|
||||
<P>This chapter describes how to write programs that use Mini-XML to
|
||||
access data in an XML file. Mini-XML provides the following
|
||||
functionality:</P>
|
||||
<UL>
|
||||
<LI>Functions for creating and managing XML documents in memory.</LI>
|
||||
<LI>Reading of UTF-8 and UTF-16 encoded XML files and strings.</LI>
|
||||
<LI>Writing of UTF-8 encoded XML files and strings.</LI>
|
||||
<LI>Support for arbitrary element names, attributes, and attribute
|
||||
values with no preset limits, just available memory.</LI>
|
||||
<LI>Support for integer, real, opaque ("CDATA"), and text data types in
|
||||
"leaf" nodes.</LI>
|
||||
<LI>"Find", "index", and "walk" functions for easily accessing data in
|
||||
an XML document.</LI>
|
||||
</UL>
|
||||
<P>Mini-XML doesn't do validation or other types of processing on the
|
||||
data based upon schema files or other sources of definition
|
||||
information, nor does it support character entities other than those
|
||||
required by the XML specification.</P>
|
||||
<H2><A NAME="3_1">The Basics</A></H2>
|
||||
<P>Mini-XML provides a single header file which you include:</P>
|
||||
<PRE>
|
||||
#include <mxml.h>
|
||||
</PRE>
|
||||
<P>The Mini-XML library is included with your program using the <KBD>
|
||||
-lmxml</KBD> option:</P>
|
||||
<PRE>
|
||||
<KBD>gcc -o myprogram myprogram.c -lmxml ENTER</KBD>
|
||||
</PRE>
|
||||
<P>If you have the <TT>pkg-config(1)</TT> software installed, you can
|
||||
use it to determine the proper compiler and linker options for your
|
||||
installation:</P>
|
||||
<PRE>
|
||||
<KBD>pkg-config --cflags mxml ENTER</KBD>
|
||||
<KBD>pkg-config --libs mxml ENTER</KBD>
|
||||
</PRE>
|
||||
<H2><A NAME="3_2">Nodes</A></H2>
|
||||
<P>Every piece of information in an XML file is stored in memory in
|
||||
"nodes". Nodes are defined by the <A href="reference.html#mxml_node_t"><TT>
|
||||
mxml_node_t</TT></A> structure. Each node has a typed value, optional
|
||||
user data, a parent node, sibling nodes (previous and next), and
|
||||
potentially child nodes.</P>
|
||||
<P>For example, if you have an XML file like the following:</P>
|
||||
<PRE>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<data>
|
||||
<node>val1</node>
|
||||
<node>val2</node>
|
||||
<node>val3</node>
|
||||
<group>
|
||||
<node>val4</node>
|
||||
<node>val5</node>
|
||||
<node>val6</node>
|
||||
</group>
|
||||
<node>val7</node>
|
||||
<node>val8</node>
|
||||
</data>
|
||||
</PRE>
|
||||
<P>the node tree for the file would look like the following in memory:</P>
|
||||
<PRE>
|
||||
?xml version="1.0" encoding="utf-8"?
|
||||
|
|
||||
data
|
||||
|
|
||||
node - node - node - group - node - node
|
||||
| | | | | |
|
||||
val1 val2 val3 | val7 val8
|
||||
|
|
||||
node - node - node
|
||||
| | |
|
||||
val4 val5 val6
|
||||
</PRE>
|
||||
<P>where "-" is a pointer to the sibling node and "|" is a pointer to
|
||||
the first child or parent node.</P>
|
||||
<P>The <A href="reference.html#mxmlGetType"><TT>mxmlGetType</TT></A>
|
||||
function gets the type of a node, one of <TT>MXML_CUSTOM</TT>, <TT>
|
||||
MXML_ELEMENT</TT>, <TT>MXML_INTEGER</TT>, <TT>MXML_OPAQUE</TT>, <TT>
|
||||
MXML_REAL</TT>, or <TT>MXML_TEXT</TT>. The parent and sibling nodes are
|
||||
accessed using the <A href="reference.html#mxmlGetParent"><TT>
|
||||
mxmlGetParent</TT></A>, <A href="#mxmlGetNext"><TT>mxmlGetNext</TT></A>,
|
||||
and <A href="#mxmlGetPrevious"><TT>mxmlGetPrevious</TT></A> functions.
|
||||
The <A href="reference.html#mxmlGetUserData"><TT>mxmlGetUserData</TT></A>
|
||||
function gets any user data associated with the node.</P>
|
||||
<H3><A NAME="3_2_1">CDATA Nodes</A></H3>
|
||||
<P>CDATA (<TT>MXML_ELEMENT</TT>) nodes are created using the <A href="reference.html#mxmlNewCDATA">
|
||||
<TT>mxmlNewCDATA</TT></A> function. The <A href="reference.html#mxmlGetCDATA">
|
||||
<TT>mxmlGetCDATA</TT></A> function retrieves the CDATA string pointer
|
||||
for a node.</P>
|
||||
<BLOCKQUOTE><B>Note:</B>
|
||||
<P>CDATA nodes are currently stored in memory as special elements. This
|
||||
will be changed in a future major release of Mini-XML.</P>
|
||||
</BLOCKQUOTE>
|
||||
<H3><A NAME="3_2_2">Custom Nodes</A></H3>
|
||||
<P>Custom (<TT>MXML_CUSTOM</TT>) nodes are created using the <A href="reference.html#mxmlNewCustom">
|
||||
<TT>mxmlNewCustom</TT></A> function or using a custom load callback
|
||||
specified using the <A href="reference.html#mxmlSetCustomHandlers"><TT>
|
||||
mxmlSetCustomHandlers</TT></A> function. The <A href="reference.html#mxmlGetCustom">
|
||||
<TT>mxmlGetCustom</TT></A> function retrieves the custom value pointer
|
||||
for a node.</P>
|
||||
<H3><A NAME="3_2_3">Comment Nodes</A></H3>
|
||||
<P>Comment (<TT>MXML_ELEMENT</TT>) nodes are created using the <A href="reference.html#mxmlNewElement">
|
||||
<TT>mxmlNewElement</TT></A> function. The <A href="reference.html#mxmlGetElement">
|
||||
<TT>mxmlGetElement</TT></A> function retrieves the comment string
|
||||
pointer for a node, including the surrounding "!--" and "--"
|
||||
characters.</P>
|
||||
<BLOCKQUOTE><B>Note:</B>
|
||||
<P>Comment nodes are currently stored in memory as special elements.
|
||||
This will be changed in a future major release of Mini-XML.</P>
|
||||
</BLOCKQUOTE>
|
||||
<H3><A NAME="3_2_4">Element Nodes</A></H3>
|
||||
<P>Element (<TT>MXML_ELEMENT</TT>) nodes are created using the <A href="reference.html#mxmlNewElement">
|
||||
<TT>mxmlNewElement</TT></A> function. The <A href="reference.html#mxmlGetElement">
|
||||
<TT>mxmlGetElement</TT></A> function retrieves the element name, the <A href="reference.html#mxmlElementGetAttr">
|
||||
<TT>mxmlElementGetAttr</TT></A> function retrieves the value string for
|
||||
a named attribute associated with the element, and the <A href="reference.html#mxmlGetFirstChild">
|
||||
<TT>mxmlGetFirstChild</TT></A> and <A href="reference.html#mxmlGetLastChild">
|
||||
<TT>mxmlGetLastChild</TT></A> functions retrieve the first and last
|
||||
child nodes for the element, respectively.</P>
|
||||
<H3><A NAME="3_2_5">Integer Nodes</A></H3>
|
||||
<P>Integer (<TT>MXML_INTEGER</TT>) nodes are created using the <A href="reference.html#mxmlNewInteger">
|
||||
<TT>mxmlNewInteger</TT></A> function. The <A href="reference.html#mxmlGetInteger">
|
||||
<TT>mxmlGetInteger</TT></A> function retrieves the integer value for a
|
||||
node.</P>
|
||||
<H3><A NAME="3_2_6">Opaque Nodes</A></H3>
|
||||
<P>Opaque (<TT>MXML_OPAQUE</TT>) nodes are created using the <A href="reference.html#mxmlNewOpaque">
|
||||
<TT>mxmlNewOpaque</TT></A> function. The <A href="reference.html#mxmlGetOpaque">
|
||||
<TT>mxmlGetOpaque</TT></A> function retrieves the opaque string pointer
|
||||
for a node. Opaque nodes are like string nodes but preserve all
|
||||
whitespace between nodes.</P>
|
||||
<H3><A NAME="3_2_7">Text Nodes</A></H3>
|
||||
<P>Text (<TT>MXML_TEXT</TT>) nodes are created using the <A href="reference.html#mxmlNewText">
|
||||
<TT>mxmlNewText</TT></A> and <A href="reference.html#mxmlNewTextf"><TT>
|
||||
mxmlNewTextf</TT></A> functions. Each text node consists of a text
|
||||
string and (leading) whitespace value - the <A href="reference.html#mxmlGetText">
|
||||
<TT>mxmlGetText</TT></A> function retrieves the text string pointer and
|
||||
whitespace value for a node.</P>
|
||||
|
||||
<!-- NEED 12 -->
|
||||
<H3><A NAME="3_2_8">Processing Instruction Nodes</A></H3>
|
||||
<P>Processing instruction (<TT>MXML_ELEMENT</TT>) nodes are created
|
||||
using the <A href="reference.html#mxmlNewElement"><TT>mxmlNewElement</TT>
|
||||
</A> function. The <A href="reference.html#mxmlGetElement"><TT>
|
||||
mxmlGetElement</TT></A> function retrieves the processing instruction
|
||||
string for a node, including the surrounding "?" characters.</P>
|
||||
<BLOCKQUOTE><B>Note:</B>
|
||||
<P>Processing instruction nodes are currently stored in memory as
|
||||
special elements. This will be changed in a future major release of
|
||||
Mini-XML.</P>
|
||||
</BLOCKQUOTE>
|
||||
<H3><A NAME="3_2_9">Real Number Nodes</A></H3>
|
||||
<P>Real number (<TT>MXML_REAL</TT>) nodes are created using the <A href="reference.html#mxmlNewReal">
|
||||
<TT>mxmlNewReal</TT></A> function. The <A href="reference.html#mxmlGetReal">
|
||||
<TT>mxmlGetReal</TT></A> function retrieves the CDATA string pointer for
|
||||
a node.</P>
|
||||
|
||||
<!-- NEED 15 -->
|
||||
<H3><A NAME="3_2_10">XML Declaration Nodes</A></H3>
|
||||
<P>XML declaration (<TT>MXML_ELEMENT</TT>) nodes are created using the <A
|
||||
href="reference.html#mxmlNewXML"><TT>mxmlNewXML</TT></A> function. The <A
|
||||
href="reference.html#mxmlGetElement"><TT>mxmlGetElement</TT></A>
|
||||
function retrieves the XML declaration string for a node, including the
|
||||
surrounding "?" characters.</P>
|
||||
<BLOCKQUOTE><B>Note:</B>
|
||||
<P>XML declaration nodes are currently stored in memory as special
|
||||
elements. This will be changed in a future major release of Mini-XML.</P>
|
||||
</BLOCKQUOTE>
|
||||
<!-- NEW PAGE -->
|
||||
<H2><A NAME="3_3">Creating XML Documents</A></H2>
|
||||
<P>You can create and update XML documents in memory using the various <TT>
|
||||
mxmlNew</TT> functions. The following code will create the XML document
|
||||
described in the previous section:</P>
|
||||
<PRE>
|
||||
mxml_node_t *xml; /* <?xml ... ?> */
|
||||
mxml_node_t *data; /* <data> */
|
||||
mxml_node_t *node; /* <node> */
|
||||
mxml_node_t *group; /* <group> */
|
||||
|
||||
xml = mxmlNewXML("1.0");
|
||||
|
||||
data = mxmlNewElement(xml, "data");
|
||||
|
||||
node = mxmlNewElement(data, "node");
|
||||
mxmlNewText(node, 0, "val1");
|
||||
node = mxmlNewElement(data, "node");
|
||||
mxmlNewText(node, 0, "val2");
|
||||
node = mxmlNewElement(data, "node");
|
||||
mxmlNewText(node, 0, "val3");
|
||||
|
||||
group = mxmlNewElement(data, "group");
|
||||
|
||||
node = mxmlNewElement(group, "node");
|
||||
mxmlNewText(node, 0, "val4");
|
||||
node = mxmlNewElement(group, "node");
|
||||
mxmlNewText(node, 0, "val5");
|
||||
node = mxmlNewElement(group, "node");
|
||||
mxmlNewText(node, 0, "val6");
|
||||
|
||||
node = mxmlNewElement(data, "node");
|
||||
mxmlNewText(node, 0, "val7");
|
||||
node = mxmlNewElement(data, "node");
|
||||
mxmlNewText(node, 0, "val8");
|
||||
</PRE>
|
||||
|
||||
<!-- NEED 6 -->
|
||||
<P>We start by creating the declaration node common to all XML files
|
||||
using the <A href="reference.html#mxmlNewXML"><TT>mxmlNewXML</TT></A>
|
||||
function:</P>
|
||||
<PRE>
|
||||
xml = mxmlNewXML("1.0");
|
||||
</PRE>
|
||||
<P>We then create the <TT><data></TT> node used for this document using
|
||||
the <A href="reference.html#mxmlNewElement"><TT>mxmlNewElement</TT></A>
|
||||
function. The first argument specifies the parent node (<TT>xml</TT>)
|
||||
while the second specifies the element name (<TT>data</TT>):</P>
|
||||
<PRE>
|
||||
data = mxmlNewElement(xml, "data");
|
||||
</PRE>
|
||||
<P>Each <TT><node>...</node></TT> in the file is created using the <TT>
|
||||
mxmlNewElement</TT> and <A href="reference.html#mxmlNewText"><TT>
|
||||
mxmlNewText</TT></A> functions. The first argument of <TT>mxmlNewText</TT>
|
||||
specifies the parent node (<TT>node</TT>). The second argument
|
||||
specifies whether whitespace appears before the text - 0 or false in
|
||||
this case. The last argument specifies the actual text to add:</P>
|
||||
<PRE>
|
||||
node = mxmlNewElement(data, "node");
|
||||
mxmlNewText(node, 0, "val1");
|
||||
</PRE>
|
||||
<P>The resulting in-memory XML document can then be saved or processed
|
||||
just like one loaded from disk or a string.</P>
|
||||
|
||||
<!-- NEED 15 -->
|
||||
<H2><A NAME="3_4">Loading XML</A></H2>
|
||||
<P>You load an XML file using the <A href="reference.html#mxmlLoadFile"><TT>
|
||||
mxmlLoadFile</TT></A> function:</P>
|
||||
<PRE>
|
||||
FILE *fp;
|
||||
mxml_node_t *tree;
|
||||
|
||||
fp = fopen("filename.xml", "r");
|
||||
tree = mxmlLoadFile(NULL, fp,
|
||||
MXML_TEXT_CALLBACK);
|
||||
fclose(fp);
|
||||
</PRE>
|
||||
<P>The first argument specifies an existing XML parent node, if any.
|
||||
Normally you will pass <TT>NULL</TT> for this argument unless you are
|
||||
combining multiple XML sources. The XML file must contain a complete
|
||||
XML document including the <TT>?xml</TT> element if the parent node is <TT>
|
||||
NULL</TT>.</P>
|
||||
<P>The second argument specifies the stdio file to read from, as opened
|
||||
by <TT>fopen()</TT> or <TT>popen()</TT>. You can also use <TT>stdin</TT>
|
||||
if you are implementing an XML filter program.</P>
|
||||
<P>The third argument specifies a callback function which returns the
|
||||
value type of the immediate children for a new element node: <TT>
|
||||
MXML_CUSTOM</TT>, <TT>MXML_IGNORE</TT>, <TT>MXML_INTEGER</TT>, <TT>
|
||||
MXML_OPAQUE</TT>, <TT>MXML_REAL</TT>, or <TT>MXML_TEXT</TT>. Load
|
||||
callbacks are described in detail in <A href="advanced.html#LOAD_CALLBACKS">
|
||||
Chapter 3</A>. The example code uses the <TT>MXML_TEXT_CALLBACK</TT>
|
||||
constant which specifies that all data nodes in the document contain
|
||||
whitespace-separated text values. Other standard callbacks include <TT>
|
||||
MXML_IGNORE_CALLBACK</TT>, <TT>MXML_INTEGER_CALLBACK</TT>, <TT>
|
||||
MXML_OPAQUE_CALLBACK</TT>, and <TT>MXML_REAL_CALLBACK</TT>.</P>
|
||||
<P>The <A href="reference.html#mxmlLoadString"><TT>mxmlLoadString</TT></A>
|
||||
function loads XML node trees from a string:</P>
|
||||
|
||||
<!-- NEED 10 -->
|
||||
<PRE>
|
||||
char buffer[8192];
|
||||
mxml_node_t *tree;
|
||||
|
||||
...
|
||||
tree = mxmlLoadString(NULL, buffer,
|
||||
MXML_TEXT_CALLBACK);
|
||||
</PRE>
|
||||
<P>The first and third arguments are the same as used for <TT>
|
||||
mxmlLoadFile()</TT>. The second argument specifies the string or
|
||||
character buffer to load and must be a complete XML document including
|
||||
the <TT>?xml</TT> element if the parent node is <TT>NULL</TT>.</P>
|
||||
|
||||
<!-- NEED 15 -->
|
||||
<H2><A NAME="3_5">Saving XML</A></H2>
|
||||
<P>You save an XML file using the <A href="reference.html#mxmlSaveFile"><TT>
|
||||
mxmlSaveFile</TT></A> function:</P>
|
||||
<PRE>
|
||||
FILE *fp;
|
||||
mxml_node_t *tree;
|
||||
|
||||
fp = fopen("filename.xml", "w");
|
||||
mxmlSaveFile(tree, fp, MXML_NO_CALLBACK);
|
||||
fclose(fp);
|
||||
</PRE>
|
||||
<P>The first argument is the XML node tree to save. It should normally
|
||||
be a pointer to the top-level <TT>?xml</TT> node in your XML document.</P>
|
||||
<P>The second argument is the stdio file to write to, as opened by <TT>
|
||||
fopen()</TT> or <TT>popen()</TT>. You can also use <TT>stdout</TT> if
|
||||
you are implementing an XML filter program.</P>
|
||||
<P>The third argument is the whitespace callback to use when saving the
|
||||
file. Whitespace callbacks are covered in detail in <A href="SAVE_CALLBACKS">
|
||||
Chapter 3</A>. The previous example code uses the <TT>MXML_NO_CALLBACK</TT>
|
||||
constant to specify that no special whitespace handling is required.</P>
|
||||
<P>The <A href="reference.html#mxmlSaveAllocString"><TT>
|
||||
mxmlSaveAllocString</TT></A>, and <A href="reference.html#mxmlSaveString">
|
||||
<TT>mxmlSaveString</TT></A> functions save XML node trees to strings:</P>
|
||||
<PRE>
|
||||
char buffer[8192];
|
||||
char *ptr;
|
||||
mxml_node_t *tree;
|
||||
|
||||
...
|
||||
mxmlSaveString(tree, buffer, sizeof(buffer),
|
||||
MXML_NO_CALLBACK);
|
||||
|
||||
...
|
||||
ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);
|
||||
</PRE>
|
||||
<P>The first and last arguments are the same as used for <TT>
|
||||
mxmlSaveFile()</TT>. The <TT>mxmlSaveString</TT> function takes pointer
|
||||
and size arguments for saving the XML document to a fixed-size buffer,
|
||||
while <TT>mxmlSaveAllocString()</TT> returns a string buffer that was
|
||||
allocated using <TT>malloc()</TT>.</P>
|
||||
|
||||
<!-- NEED 15 -->
|
||||
<H3><A NAME="3_5_1">Controlling Line Wrapping</A></H3>
|
||||
<P>When saving XML documents, Mini-XML normally wraps output lines at
|
||||
column 75 so that the text is readable in terminal windows. The <A href="reference.html#mxmlSetWrapMargin">
|
||||
<TT>mxmlSetWrapMargin</TT></A> function overrides the default wrap
|
||||
margin:</P>
|
||||
<PRE>
|
||||
/* Set the margin to 132 columns */
|
||||
mxmlSetWrapMargin(132);
|
||||
|
||||
/* Disable wrapping */
|
||||
mxmlSetWrapMargin(0);
|
||||
</PRE>
|
||||
<H2><A NAME="3_6">Memory Management</A></H2>
|
||||
<P>Once you are done with the XML data, use the <A href="reference.html#mxmlDelete">
|
||||
<TT>mxmlDelete</TT></A> function to recursively free the memory that is
|
||||
used for a particular node or the entire tree:</P>
|
||||
<PRE>
|
||||
mxmlDelete(tree);
|
||||
</PRE>
|
||||
<P>You can also use reference counting to manage memory usage. The <A href="reference.html#mxmlRetain">
|
||||
<TT>mxmlRetain</TT></A> and <A href="reference.html#mxmlRelease"><TT>
|
||||
mxmlRelease</TT></A> functions increment and decrement a node's use
|
||||
count, respectively. When the use count goes to 0, <TT>mxmlRelease</TT>
|
||||
will automatically call <TT>mxmlDelete</TT> to actually free the memory
|
||||
used by the node tree. New nodes automatically start with a use count
|
||||
of 1.</P>
|
||||
|
||||
<!-- NEW PAGE-->
|
||||
<H2><A NAME="3_7">Finding and Iterating Nodes</A></H2>
|
||||
<P>The <A href="reference.html#mxmlWalkPrev"><TT>mxmlWalkPrev</TT></A>
|
||||
and <A href="reference.html#mxmlWalkNext"><TT>mxmlWalkNext</TT></A>
|
||||
functions can be used to iterate through the XML node tree:</P>
|
||||
<PRE>
|
||||
mxml_node_t *node;
|
||||
|
||||
node = mxmlWalkPrev(current, tree,
|
||||
MXML_DESCEND);
|
||||
|
||||
node = mxmlWalkNext(current, tree,
|
||||
MXML_DESCEND);
|
||||
</PRE>
|
||||
<P>In addition, you can find a named element/node using the <A href="reference.html#mxmlFindElement">
|
||||
<TT>mxmlFindElement</TT></A> function:</P>
|
||||
<PRE>
|
||||
mxml_node_t *node;
|
||||
|
||||
node = mxmlFindElement(tree, tree, "name",
|
||||
"attr", "value",
|
||||
MXML_DESCEND);
|
||||
</PRE>
|
||||
<P>The <TT>name</TT>, <TT>attr</TT>, and <TT>value</TT> arguments can be
|
||||
passed as <TT>NULL</TT> to act as wildcards, e.g.:</P>
|
||||
|
||||
<!-- NEED 4 -->
|
||||
<PRE>
|
||||
/* Find the first "a" element */
|
||||
node = mxmlFindElement(tree, tree, "a",
|
||||
NULL, NULL,
|
||||
MXML_DESCEND);
|
||||
</PRE>
|
||||
|
||||
<!-- NEED 5 -->
|
||||
<PRE>
|
||||
/* Find the first "a" element with "href"
|
||||
attribute */
|
||||
node = mxmlFindElement(tree, tree, "a",
|
||||
"href", NULL,
|
||||
MXML_DESCEND);
|
||||
</PRE>
|
||||
|
||||
<!-- NEED 6 -->
|
||||
<PRE>
|
||||
/* Find the first "a" element with "href"
|
||||
to a URL */
|
||||
node = mxmlFindElement(tree, tree, "a",
|
||||
"href",
|
||||
"http://www.easysw.com/",
|
||||
MXML_DESCEND);
|
||||
</PRE>
|
||||
|
||||
<!-- NEED 5 -->
|
||||
<PRE>
|
||||
/* Find the first element with a "src"
|
||||
attribute */
|
||||
node = mxmlFindElement(tree, tree, NULL,
|
||||
"src", NULL,
|
||||
MXML_DESCEND);
|
||||
</PRE>
|
||||
|
||||
<!-- NEED 5 -->
|
||||
<PRE>
|
||||
/* Find the first element with a "src"
|
||||
= "foo.jpg" */
|
||||
node = mxmlFindElement(tree, tree, NULL,
|
||||
"src", "foo.jpg",
|
||||
MXML_DESCEND);
|
||||
</PRE>
|
||||
<P>You can also iterate with the same function:</P>
|
||||
<PRE>
|
||||
mxml_node_t *node;
|
||||
|
||||
for (node = mxmlFindElement(tree, tree,
|
||||
"name",
|
||||
NULL, NULL,
|
||||
MXML_DESCEND);
|
||||
node != NULL;
|
||||
node = mxmlFindElement(node, tree,
|
||||
"name",
|
||||
NULL, NULL,
|
||||
MXML_DESCEND))
|
||||
{
|
||||
... do something ...
|
||||
}
|
||||
</PRE>
|
||||
|
||||
<!-- NEED 10 -->
|
||||
<P>The <TT>MXML_DESCEND</TT> argument can actually be one of three
|
||||
constants:</P>
|
||||
<UL>
|
||||
<LI><TT>MXML_NO_DESCEND</TT> means to not to look at any child nodes in
|
||||
the element hierarchy, just look at siblings at the same level or
|
||||
parent nodes until the top node or top-of-tree is reached.
|
||||
<P>The previous node from "group" would be the "node" element to the
|
||||
left, while the next node from "group" would be the "node" element to
|
||||
the right.
|
||||
<BR>
|
||||
<BR></P>
|
||||
</LI>
|
||||
<LI><TT>MXML_DESCEND_FIRST</TT> means that it is OK to descend to the
|
||||
first child of a node, but not to descend further when searching.
|
||||
You'll normally use this when iterating through direct children of a
|
||||
parent node, e.g. all of the "node" and "group" elements under the
|
||||
"?xml" parent node in the example above.
|
||||
<P>This mode is only applicable to the search function; the walk
|
||||
functions treat this as <TT>MXML_DESCEND</TT> since every call is a
|
||||
first time.
|
||||
<BR>
|
||||
<BR></P>
|
||||
</LI>
|
||||
<LI><TT>MXML_DESCEND</TT> means to keep descending until you hit the
|
||||
bottom of the tree. The previous node from "group" would be the "val3"
|
||||
node and the next node would be the first node element under "group".
|
||||
<P>If you were to walk from the root node "?xml" to the end of the tree
|
||||
with <TT>mxmlWalkNext()</TT>, the order would be:</P>
|
||||
<P><TT>?xml data node val1 node val2 node val3 group node val4 node val5
|
||||
node val6 node val7 node val8</TT></P>
|
||||
<P>If you started at "val8" and walked using <TT>mxmlWalkPrev()</TT>,
|
||||
the order would be reversed, ending at "?xml".</P>
|
||||
</LI>
|
||||
</UL>
|
||||
<H2><A NAME="3_8">Finding Specific Nodes</A></H2>
|
||||
<P>You can find specific nodes in the tree using the <A href="#mxmlFindValue">
|
||||
<TT>mxmlFindPath</TT></A>, for example:</P>
|
||||
<PRE>
|
||||
mxml_node_t *value;
|
||||
|
||||
value = mxmlFindPath(tree, "path/to/*/foo/bar");
|
||||
</PRE>
|
||||
<P>The second argument is a "path" to the parent node. Each component of
|
||||
the path is separated by a slash (/) and represents a named element in
|
||||
the document tree or a wildcard (*) path representing 0 or more
|
||||
intervening nodes.</P>
|
||||
<HR NOSHADE>
|
||||
<A HREF="index.html">Contents</A>
|
||||
<A HREF="install.html">Previous</A>
|
||||
<A HREF="advanced.html">Next</A>
|
||||
</BODY>
|
||||
</HTML>
|
@ -1,210 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Mini-XML Programmers Manual, Version 2.7</TITLE>
|
||||
<META NAME="author" CONTENT="Michael R. Sweet">
|
||||
<META NAME="copyright" CONTENT="Copyright 2003-2011">
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-iso-8859-1">
|
||||
<LINK REL="Start" HREF="index.html">
|
||||
<LINK REL="Contents" HREF="index.html">
|
||||
<STYLE TYPE="text/css"><!--
|
||||
BODY { font-family: sans-serif }
|
||||
H1 { font-family: sans-serif }
|
||||
H2 { font-family: sans-serif }
|
||||
H3 { font-family: sans-serif }
|
||||
H4 { font-family: sans-serif }
|
||||
H5 { font-family: sans-serif }
|
||||
H6 { font-family: sans-serif }
|
||||
SUB { font-size: smaller }
|
||||
SUP { font-size: smaller }
|
||||
PRE { font-family: monospace }
|
||||
A { text-decoration: none }
|
||||
--></STYLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
|
||||
<BR>
|
||||
<BR><B><A HREF="intro.html#INTRO">Introduction</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="intro.html#1_1">Organization of This Document</A></LI>
|
||||
<LI><A HREF="intro.html#1_2">Notation Conventions</A></LI>
|
||||
<LI><A HREF="intro.html#1_3">Abbreviations</A></LI>
|
||||
<LI><A HREF="intro.html#1_4">Other References</A></LI>
|
||||
<LI><A HREF="intro.html#1_5">Legal Stuff</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="install.html#INSTALL">Building, Installing, and Packaging
|
||||
Mini-XML</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="install.html#2_1">Compiling Mini-XML</A>
|
||||
<UL>
|
||||
<LI><A HREF="install.html#2_1_1">Compiling with Visual C++</A></LI>
|
||||
<LI><A HREF="install.html#2_1_2">Compiling with Command-Line Tools</A></LI>
|
||||
</UL>
|
||||
</LI>
|
||||
<LI><A HREF="install.html#2_2">Installing Mini-XML</A></LI>
|
||||
<LI><A HREF="install.html#2_3">Creating Mini-XML Packages</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="basics.html#BASICS">Getting Started with Mini-XML</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="basics.html#3_1">The Basics</A></LI>
|
||||
<LI><A HREF="basics.html#3_2">Nodes</A>
|
||||
<UL>
|
||||
<LI><A HREF="basics.html#3_2_1">CDATA Nodes</A></LI>
|
||||
<LI><A HREF="basics.html#3_2_2">Custom Nodes</A></LI>
|
||||
<LI><A HREF="basics.html#3_2_3">Comment Nodes</A></LI>
|
||||
<LI><A HREF="basics.html#3_2_4">Element Nodes</A></LI>
|
||||
<LI><A HREF="basics.html#3_2_5">Integer Nodes</A></LI>
|
||||
<LI><A HREF="basics.html#3_2_6">Opaque Nodes</A></LI>
|
||||
<LI><A HREF="basics.html#3_2_7">Text Nodes</A></LI>
|
||||
<LI><A HREF="basics.html#3_2_8">Processing Instruction Nodes</A></LI>
|
||||
<LI><A HREF="basics.html#3_2_9">Real Number Nodes</A></LI>
|
||||
<LI><A HREF="basics.html#3_2_10">XML Declaration Nodes</A></LI>
|
||||
</UL>
|
||||
</LI>
|
||||
<LI><A HREF="basics.html#3_3">Creating XML Documents</A></LI>
|
||||
<LI><A HREF="basics.html#3_4">Loading XML</A></LI>
|
||||
<LI><A HREF="basics.html#3_5">Saving XML</A>
|
||||
<UL>
|
||||
<LI><A HREF="basics.html#3_5_1">Controlling Line Wrapping</A></LI>
|
||||
</UL>
|
||||
</LI>
|
||||
<LI><A HREF="basics.html#3_6">Memory Management</A></LI>
|
||||
<LI><A HREF="basics.html#3_7">Finding and Iterating Nodes</A></LI>
|
||||
<LI><A HREF="basics.html#3_8">Finding Specific Nodes</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="advanced.html#ADVANCED">More Mini-XML Programming Techniques</A>
|
||||
</B>
|
||||
<UL>
|
||||
<LI><A HREF="advanced.html#LOAD_CALLBACKS">Load Callbacks</A></LI>
|
||||
<LI><A HREF="advanced.html#SAVE_CALLBACKS">Save Callbacks</A></LI>
|
||||
<LI><A HREF="advanced.html#4_3">Custom Data Types</A></LI>
|
||||
<LI><A HREF="advanced.html#4_4">Changing Node Values</A></LI>
|
||||
<LI><A HREF="advanced.html#4_5">Formatted Text</A></LI>
|
||||
<LI><A HREF="advanced.html#4_6">Indexing</A></LI>
|
||||
<LI><A HREF="advanced.html#4_7">SAX (Stream) Loading of Documents</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="mxmldoc.html#MXMLDOC">Using the mxmldoc Utility</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="mxmldoc.html#5_1">The Basics</A>
|
||||
<UL>
|
||||
<LI><A HREF="mxmldoc.html#5_1_1">Creating Man Pages</A></LI>
|
||||
<LI><A HREF="mxmldoc.html#5_1_2">Creating Xcode Documentation Sets</A></LI>
|
||||
</UL>
|
||||
</LI>
|
||||
<LI><A HREF="mxmldoc.html#5_2">Commenting Your Code</A></LI>
|
||||
<LI><A HREF="mxmldoc.html#5_3">Titles, Sections, and Introductions</A></LI>
|
||||
</UL>
|
||||
<B><A HREF="license.html#LICENSE">Mini-XML License</A></B>
|
||||
<BR>
|
||||
<BR><B><A HREF="relnotes.html#RELNOTES">Release Notes</A></B>
|
||||
<UL></UL>
|
||||
<B><A HREF="reference.html#REFERENCE">Library Reference</A></B>
|
||||
<UL>
|
||||
<LI><A HREF="reference.html#8_1">Contents</A></LI>
|
||||
<LI><A HREF="reference.html#FUNCTIONS">Functions</A>
|
||||
<UL>
|
||||
<LI><A HREF="reference.html#mxmlAdd">mxmlAdd</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlDelete">mxmlDelete</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_3">mxmlElementDeleteAttr</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlElementGetAttr">mxmlElementGetAttr</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlElementSetAttr">mxmlElementSetAttr</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_6">mxmlElementSetAttrf</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlEntityAddCallback">mxmlEntityAddCallback</A>
|
||||
</LI>
|
||||
<LI><A HREF="reference.html#mxmlEntityGetName">mxmlEntityGetName</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlEntityGetValue">mxmlEntityGetValue</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlEntityRemoveCallback">
|
||||
mxmlEntityRemoveCallback</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlFindElement">mxmlFindElement</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_12">mxmlFindPath</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_13">mxmlGetCDATA</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_14">mxmlGetCustom</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_15">mxmlGetElement</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_16">mxmlGetFirstChild</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_17">mxmlGetInteger</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_18">mxmlGetLastChild</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlGetNextSibling">mxmlGetNextSibling</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_20">mxmlGetOpaque</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_21">mxmlGetParent</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_22">mxmlGetPrevSibling</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_23">mxmlGetReal</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_24">mxmlGetRefCount</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_25">mxmlGetText</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_26">mxmlGetType</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_27">mxmlGetUserData</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlIndexDelete">mxmlIndexDelete</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlIndexEnum">mxmlIndexEnum</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlIndexFind">mxmlIndexFind</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_31">mxmlIndexGetCount</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlIndexNew">mxmlIndexNew</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlIndexReset">mxmlIndexReset</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlLoadFd">mxmlLoadFd</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlLoadFile">mxmlLoadFile</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlLoadString">mxmlLoadString</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_37">mxmlNewCDATA</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_38">mxmlNewCustom</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlNewElement">mxmlNewElement</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlNewInteger">mxmlNewInteger</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlNewOpaque">mxmlNewOpaque</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlNewReal">mxmlNewReal</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlNewText">mxmlNewText</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlNewTextf">mxmlNewTextf</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_45">mxmlNewXML</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_46">mxmlRelease</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlRemove">mxmlRemove</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_48">mxmlRetain</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_49">mxmlSAXLoadFd</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_50">mxmlSAXLoadFile</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_51">mxmlSAXLoadString</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlSaveAllocString">mxmlSaveAllocString</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlSaveFd">mxmlSaveFd</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlSaveFile">mxmlSaveFile</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlSaveString">mxmlSaveString</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_56">mxmlSetCDATA</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_57">mxmlSetCustom</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlSetCustomHandlers">mxmlSetCustomHandlers</A>
|
||||
</LI>
|
||||
<LI><A HREF="reference.html#mxmlSetElement">mxmlSetElement</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlSetErrorCallback">mxmlSetErrorCallback</A>
|
||||
</LI>
|
||||
<LI><A HREF="reference.html#mxmlSetInteger">mxmlSetInteger</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlSetOpaque">mxmlSetOpaque</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlSetReal">mxmlSetReal</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlSetText">mxmlSetText</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlSetTextf">mxmlSetTextf</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_66">mxmlSetUserData</A></LI>
|
||||
<LI><A HREF="reference.html#8_2_67">mxmlSetWrapMargin</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlWalkNext">mxmlWalkNext</A></LI>
|
||||
<LI><A HREF="reference.html#mxmlWalkPrev">mxmlWalkPrev</A></LI>
|
||||
</UL>
|
||||
</LI>
|
||||
<LI><A HREF="reference.html#TYPES">Data Types</A>
|
||||
<UL>
|
||||
<LI><A HREF="reference.html#mxml_custom_destroy_cb_t">
|
||||
mxml_custom_destroy_cb_t</A></LI>
|
||||
<LI><A HREF="reference.html#mxml_custom_load_cb_t">mxml_custom_load_cb_t</A>
|
||||
</LI>
|
||||
<LI><A HREF="reference.html#mxml_custom_save_cb_t">mxml_custom_save_cb_t</A>
|
||||
</LI>
|
||||
<LI><A HREF="reference.html#mxml_entity_cb_t">mxml_entity_cb_t</A></LI>
|
||||
<LI><A HREF="reference.html#mxml_error_cb_t">mxml_error_cb_t</A></LI>
|
||||
<LI><A HREF="reference.html#mxml_index_t">mxml_index_t</A></LI>
|
||||
<LI><A HREF="reference.html#mxml_load_cb_t">mxml_load_cb_t</A></LI>
|
||||
<LI><A HREF="reference.html#mxml_node_t">mxml_node_t</A></LI>
|
||||
<LI><A HREF="reference.html#mxml_save_cb_t">mxml_save_cb_t</A></LI>
|
||||
<LI><A HREF="reference.html#mxml_sax_cb_t">mxml_sax_cb_t</A></LI>
|
||||
<LI><A HREF="reference.html#mxml_sax_event_t">mxml_sax_event_t</A></LI>
|
||||
<LI><A HREF="reference.html#mxml_type_t">mxml_type_t</A></LI>
|
||||
</UL>
|
||||
</LI>
|
||||
<LI><A HREF="reference.html#ENUMERATIONS">Constants</A>
|
||||
<UL>
|
||||
<LI><A HREF="reference.html#mxml_sax_event_e">mxml_sax_event_e</A></LI>
|
||||
<LI><A HREF="reference.html#mxml_type_e">mxml_type_e</A></LI>
|
||||
</UL>
|
||||
</LI>
|
||||
</UL>
|
||||
<B><A HREF="schema.html#SCHEMA">XML Schema</A></B>
|
||||
<UL></UL>
|
||||
</BODY>
|
||||
</HTML>
|
@ -1,115 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Mini-XML Programmers Manual, Version 2.7</TITLE>
|
||||
<META NAME="author" CONTENT="Michael R. Sweet">
|
||||
<META NAME="copyright" CONTENT="Copyright 2003-2011">
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-iso-8859-1">
|
||||
<LINK REL="Start" HREF="index.html">
|
||||
<LINK REL="Contents" HREF="index.html">
|
||||
<LINK REL="Prev" HREF="intro.html">
|
||||
<LINK REL="Next" HREF="basics.html">
|
||||
<STYLE TYPE="text/css"><!--
|
||||
BODY { font-family: sans-serif }
|
||||
H1 { font-family: sans-serif }
|
||||
H2 { font-family: sans-serif }
|
||||
H3 { font-family: sans-serif }
|
||||
H4 { font-family: sans-serif }
|
||||
H5 { font-family: sans-serif }
|
||||
H6 { font-family: sans-serif }
|
||||
SUB { font-size: smaller }
|
||||
SUP { font-size: smaller }
|
||||
PRE { font-family: monospace }
|
||||
A { text-decoration: none }
|
||||
--></STYLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<A HREF="index.html">Contents</A>
|
||||
<A HREF="intro.html">Previous</A>
|
||||
<A HREF="basics.html">Next</A>
|
||||
<HR NOSHADE>
|
||||
<H1 align="right"><A name="INSTALL"><IMG align="right" alt="1" height="100"
|
||||
hspace="10" src="1.gif" width="100"></A>Building, Installing, and
|
||||
Packaging Mini-XML</H1>
|
||||
<P>This chapter describes how to build, install, and package Mini-XML on
|
||||
your system from the source archive. You will need an ANSI/ISO-C
|
||||
compatible compiler to build Mini-XML - GCC works, as do most vendors'
|
||||
C compilers. If you are building Mini-XML on Windows, we recommend
|
||||
using the Visual C++ environment with the supplied solution file. For
|
||||
other operating systems, you'll need a POSIX-compatible shell and <TT>
|
||||
make</TT> program in addition to the C compiler.</P>
|
||||
<H2><A NAME="2_1">Compiling Mini-XML</A></H2>
|
||||
<P>Mini-XML comes with both an autoconf-based configure script and a
|
||||
Visual C++ solution that can be used to compile the library and
|
||||
associated tools.</P>
|
||||
<H3><A NAME="2_1_1">Compiling with Visual C++</A></H3>
|
||||
<P>Open the<VAR> mxml.sln</VAR> solution in the<VAR> vcnet</VAR> folder.
|
||||
Choose the desired build configuration, "Debug" (the default) or
|
||||
"Release", and then choose<VAR> Build Solution</VAR> from the<VAR>
|
||||
Build</VAR> menu.</P>
|
||||
<H3><A NAME="2_1_2">Compiling with Command-Line Tools</A></H3>
|
||||
<P>Type the following command to configure the Mini-XML source code for
|
||||
your system:</P>
|
||||
<PRE>
|
||||
<KBD>./configure ENTER</KBD>
|
||||
</PRE>
|
||||
<P>The default install prefix is<VAR> /usr/local</VAR>, which can be
|
||||
overridden using the <KBD>--prefix</KBD> option:</P>
|
||||
<PRE>
|
||||
<KBD>./configure --prefix=/foo ENTER</KBD>
|
||||
</PRE>
|
||||
<P>Other configure options can be found using the <KBD>--help</KBD>
|
||||
option:</P>
|
||||
<PRE>
|
||||
<KBD>./configure --help ENTER</KBD>
|
||||
</PRE>
|
||||
<P>Once you have configured the software, use the <TT>make(1)</TT>
|
||||
program to do the build and run the test program to verify that things
|
||||
are working, as follows:</P>
|
||||
<PRE>
|
||||
<KBD>make ENTER</KBD>
|
||||
</PRE>
|
||||
<H2><A NAME="2_2">Installing Mini-XML</A></H2>
|
||||
<P>If you are using Visual C++, copy the<VAR> mxml.lib</VAR> and and<VAR>
|
||||
mxml.h</VAR> files to the Visual C++<VAR> lib</VAR> and<VAR> include<VAR>
|
||||
directories, respectively.</VAR></VAR></P>
|
||||
<P>Otherwise, use the <TT>make</TT> command with the <KBD>install</KBD>
|
||||
target to install Mini-XML in the configured directories:</P>
|
||||
<PRE>
|
||||
<KBD>make install ENTER</KBD>
|
||||
</PRE>
|
||||
<H2><A NAME="2_3">Creating Mini-XML Packages</A></H2>
|
||||
<P>Mini-XML includes two files that can be used to create binary
|
||||
packages. The first file is<VAR> mxml.spec</VAR> which is used by the <TT>
|
||||
rpmbuild(8)</TT> software to create Red Hat Package Manager ("RPM")
|
||||
packages which are commonly used on Linux. Since <TT>rpmbuild</TT>
|
||||
wants to compile the software on its own, you can provide it with the
|
||||
Mini-XML tar file to build the package:</P>
|
||||
<PRE>
|
||||
<KBD>rpmbuild -ta mxml-<I>version</I>.tar.gz ENTER</KBD>
|
||||
</PRE>
|
||||
<P>The second file is<VAR> mxml.list</VAR> which is used by the <TT>
|
||||
epm(1)</TT> program to create software packages in a variety of formats.
|
||||
The <TT>epm</TT> program is available from the following URL:</P>
|
||||
<PRE>
|
||||
<A href="http://www.epmhome.org/">http://www.epmhome.org/</A>
|
||||
</PRE>
|
||||
<P>Use the <TT>make</TT> command with the <KBD>epm</KBD> target to
|
||||
create portable and native packages for your system:</P>
|
||||
<PRE>
|
||||
<KBD>make epm ENTER</KBD>
|
||||
</PRE>
|
||||
<P>The packages are stored in a subdirectory named<VAR> dist</VAR> for
|
||||
your convenience. The portable packages utilize scripts and tar files
|
||||
to install the software on the target system. After extracting the
|
||||
package archive, use the<VAR> mxml.install</VAR> script to install the
|
||||
software.</P>
|
||||
<P>The native packages will be in the local OS's native format: RPM for
|
||||
Red Hat Linux, DPKG for Debian Linux, PKG for Solaris, and so forth.
|
||||
Use the corresponding commands to install the native packages.</P>
|
||||
<HR NOSHADE>
|
||||
<A HREF="index.html">Contents</A>
|
||||
<A HREF="intro.html">Previous</A>
|
||||
<A HREF="basics.html">Next</A>
|
||||
</BODY>
|
||||
</HTML>
|
@ -1,175 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Mini-XML Programmers Manual, Version 2.7</TITLE>
|
||||
<META NAME="author" CONTENT="Michael R. Sweet">
|
||||
<META NAME="copyright" CONTENT="Copyright 2003-2011">
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-iso-8859-1">
|
||||
<LINK REL="Start" HREF="index.html">
|
||||
<LINK REL="Contents" HREF="index.html">
|
||||
<LINK REL="Next" HREF="install.html">
|
||||
<STYLE TYPE="text/css"><!--
|
||||
BODY { font-family: sans-serif }
|
||||
H1 { font-family: sans-serif }
|
||||
H2 { font-family: sans-serif }
|
||||
H3 { font-family: sans-serif }
|
||||
H4 { font-family: sans-serif }
|
||||
H5 { font-family: sans-serif }
|
||||
H6 { font-family: sans-serif }
|
||||
SUB { font-size: smaller }
|
||||
SUP { font-size: smaller }
|
||||
PRE { font-family: monospace }
|
||||
A { text-decoration: none }
|
||||
--></STYLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<A HREF="index.html">Contents</A>
|
||||
<A HREF="install.html">Next</A>
|
||||
<HR NOSHADE>
|
||||
<H1 align="right"><A name="INTRO"><IMG align="right" alt="0" height="100"
|
||||
hspace="10" src="0.gif" width="100"></A>Introduction</H1>
|
||||
<P>This programmers manual describes Mini-XML version 2.7, a small XML
|
||||
parsing library that you can use to read and write XML data files in
|
||||
your C and C++ applications.</P>
|
||||
<P>Mini-XML was initially developed for the <A href="http://gutenprint.sf.net/">
|
||||
Gutenprint</A> project to replace the rather large and unwieldy <TT>
|
||||
libxml2</TT> library with something substantially smaller and
|
||||
easier-to-use. It all began one morning in June of 2003 when Robert
|
||||
posted the following sentence to the developer's list:</P>
|
||||
<BLOCKQUOTE><EM>It's bad enough that we require libxml2, but rolling our
|
||||
own XML parser is a bit more than we can handle.</EM></BLOCKQUOTE>
|
||||
<P>I then replied with:</P>
|
||||
<BLOCKQUOTE><EM>Given the limited scope of what you use in XML, it
|
||||
should be trivial to code a mini-XML API in a few hundred lines of
|
||||
code.</EM></BLOCKQUOTE>
|
||||
<P>I took my own challenge and coded furiously for two days to produced
|
||||
the initial public release of Mini-XML, total lines of code: 696.
|
||||
Robert promptly integrated Mini-XML into Gutenprint and removed
|
||||
libxml2.</P>
|
||||
<P>Thanks to lots of feedback and support from various developers,
|
||||
Mini-XML has evolved since then to provide a more complete XML
|
||||
implementation and now stands at a whopping 3,965 lines of code,
|
||||
compared to 103,893 lines of code for libxml2 version 2.6.9.</P>
|
||||
<P>Aside from Gutenprint, Mini-XML is used for the following
|
||||
projects/software applications:</P>
|
||||
<UL>
|
||||
<LI><A href="http://www.cups.org/">CUPS</A></LI>
|
||||
<LI><A href="http://zynaddsubfx.sourceforge.net">ZynAddSubFX</A></LI>
|
||||
</UL>
|
||||
<P>Please email me (mxml @ easysw . com) if you would like your project
|
||||
added or removed from this list, or if you have any comments/quotes you
|
||||
would like me to publish about your experiences with Mini-XML.</P>
|
||||
|
||||
<!-- NEED 1in -->
|
||||
<H2><A NAME="1_1">Organization of This Document</A></H2>
|
||||
<P>This manual is organized into the following chapters and appendices:</P>
|
||||
<UL>
|
||||
<LI>Chapter 1, "<A href="install.html#INSTALL">Building, Installing, and
|
||||
Packaging Mini-XML</A>", provides compilation, installation, and
|
||||
packaging instructions for Mini-XML.</LI>
|
||||
<LI>Chapter 2, "<A href="basics.html#BASICS">Getting Started with
|
||||
Mini-XML</A>", shows how to use the Mini-XML library in your programs.</LI>
|
||||
<LI>Chapter 3, "<A href="advanced.html#ADVANCED">More Mini-XML
|
||||
Programming Techniques</A>", shows additional ways to use the Mini-XML
|
||||
library.</LI>
|
||||
<LI>Chapter 4, "<A href="mxmldoc.html#MXMLDOC">Using the mxmldoc Utility</A>
|
||||
", describes how to use the <TT>mxmldoc(1)</TT> program to generate
|
||||
software documentation.</LI>
|
||||
<LI>Appendix A, "<A href="license.html#LICENSE">Mini-XML License</A>",
|
||||
provides the terms and conditions for using and distributing Mini-XML.</LI>
|
||||
<LI>Appendix B, "<A href="relnotes.html#RELNOTES">Release Notes</A>",
|
||||
lists the changes in each release of Mini-XML.</LI>
|
||||
<LI>Appendix C, "<A href="reference.html#REFERENCE">Library Reference</A>
|
||||
", contains a complete reference for Mini-XML, generated by <TT>mxmldoc</TT>
|
||||
.</LI>
|
||||
<LI>Appendix D, "<A href="schema.html#SCHEMA">XML Schema</A>", shows the
|
||||
XML schema used for the XML files produced by <TT>mxmldoc</TT>.</LI>
|
||||
</UL>
|
||||
|
||||
<!-- NEED 10 -->
|
||||
<H2><A NAME="1_2">Notation Conventions</A></H2>
|
||||
<P>Various font and syntax conventions are used in this guide. Examples
|
||||
and their meanings and uses are explained below:</P>
|
||||
<DL>
|
||||
<DT><CODE>mxmldoc</CODE>
|
||||
<BR> <CODE>mxmldoc(1)</CODE></DT>
|
||||
<DD>The names of commands; the first mention of a command or function in
|
||||
a chapter is followed by a manual page section number.
|
||||
<BR>
|
||||
<BR></DD>
|
||||
<DT><VAR>/var</VAR>
|
||||
<BR><VAR> /etc/hosts</VAR></DT>
|
||||
<DD>File and directory names.
|
||||
<BR>
|
||||
<BR></DD>
|
||||
<DT><TT>Request ID is Printer-123</TT></DT>
|
||||
<DD>Screen output.
|
||||
<BR>
|
||||
<BR></DD>
|
||||
<DT><KBD>lp -d printer filename ENTER</KBD></DT>
|
||||
<DD>Literal user input; special keys like <KBD>ENTER</KBD> are in ALL
|
||||
CAPS.
|
||||
<BR>
|
||||
<BR></DD>
|
||||
<DT>12.3</DT>
|
||||
<DD>Numbers in the text are written using the period (.) to indicate the
|
||||
decimal point.
|
||||
<BR>
|
||||
<BR></DD>
|
||||
</DL>
|
||||
|
||||
<!-- NEED 10 -->
|
||||
<H2><A NAME="1_3">Abbreviations</A></H2>
|
||||
<P>The following abbreviations are used throughout this manual:</P>
|
||||
<DL>
|
||||
<DT>Gb</DT>
|
||||
<DD>Gigabytes, or 1073741824 bytes
|
||||
<BR>
|
||||
<BR></DD>
|
||||
<DT>kb</DT>
|
||||
<DD>Kilobytes, or 1024 bytes
|
||||
<BR>
|
||||
<BR></DD>
|
||||
<DT>Mb</DT>
|
||||
<DD>Megabytes, or 1048576 bytes
|
||||
<BR>
|
||||
<BR></DD>
|
||||
<DT>UTF-8, UTF-16</DT>
|
||||
<DD>Unicode Transformation Format, 8-bit or 16-bit
|
||||
<BR>
|
||||
<BR></DD>
|
||||
<DT>W3C</DT>
|
||||
<DD>World Wide Web Consortium
|
||||
<BR>
|
||||
<BR></DD>
|
||||
<DT>XML</DT>
|
||||
<DD>Extensible Markup Language
|
||||
<BR>
|
||||
<BR></DD>
|
||||
</DL>
|
||||
|
||||
<!-- NEED 12 -->
|
||||
<H2><A NAME="1_4">Other References</A></H2>
|
||||
<DL>
|
||||
<DT>The Unicode Standard, Version 4.0, Addison-Wesley, ISBN
|
||||
0-321-18578-1</DT>
|
||||
<DD>The definition of the Unicode character set which is used for XML.
|
||||
<BR>
|
||||
<BR></DD>
|
||||
<DT><A href="http://www.w3.org/TR/2004/REC-xml-20040204/">Extensible
|
||||
Markup Language (XML) 1.0 (Third Edition)</A></DT>
|
||||
<DD>The XML specification from the World Wide Web Consortium (W3C)
|
||||
<BR>
|
||||
<BR></DD>
|
||||
</DL>
|
||||
|
||||
<!-- NEED 6 -->
|
||||
<H2><A NAME="1_5">Legal Stuff</A></H2>
|
||||
<P>The Mini-XML library is copyright 2003-2011 by Michael Sweet. License
|
||||
terms are described in <A href="license.html#LICENSE">Appendix A -
|
||||
Mini-XML License</A>.</P>
|
||||
<HR NOSHADE>
|
||||
<A HREF="index.html">Contents</A>
|
||||
<A HREF="install.html">Next</A>
|
||||
</BODY>
|
||||
</HTML>
|
@ -1,467 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Mini-XML Programmers Manual, Version 2.7</TITLE>
|
||||
<META NAME="author" CONTENT="Michael R. Sweet">
|
||||
<META NAME="copyright" CONTENT="Copyright 2003-2011">
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-iso-8859-1">
|
||||
<LINK REL="Start" HREF="index.html">
|
||||
<LINK REL="Contents" HREF="index.html">
|
||||
<LINK REL="Prev" HREF="mxmldoc.html">
|
||||
<LINK REL="Next" HREF="relnotes.html">
|
||||
<STYLE TYPE="text/css"><!--
|
||||
BODY { font-family: sans-serif }
|
||||
H1 { font-family: sans-serif }
|
||||
H2 { font-family: sans-serif }
|
||||
H3 { font-family: sans-serif }
|
||||
H4 { font-family: sans-serif }
|
||||
H5 { font-family: sans-serif }
|
||||
H6 { font-family: sans-serif }
|
||||
SUB { font-size: smaller }
|
||||
SUP { font-size: smaller }
|
||||
PRE { font-family: monospace }
|
||||
A { text-decoration: none }
|
||||
--></STYLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<A HREF="index.html">Contents</A>
|
||||
<A HREF="mxmldoc.html">Previous</A>
|
||||
<A HREF="relnotes.html">Next</A>
|
||||
<HR NOSHADE>
|
||||
<H1 align="right"><A name="LICENSE"><IMG align="right" alt="A" height="100"
|
||||
hspace="10" src="A.gif" width="100"></A>Mini-XML License</H1>
|
||||
<P>The Mini-XML library and included programs are provided under the
|
||||
terms of the GNU Library General Public License version 2 (LGPL2) with
|
||||
the following exceptions:</P>
|
||||
<P><B>1.</B> Static linking of applications to the Mini-XML library does
|
||||
not constitute a derivative work and does not require the author to
|
||||
provide source code for the application, use the shared Mini-XML
|
||||
libraries, or link their applications against a user-supplied version
|
||||
of Mini-XML.</P>
|
||||
<P><I>If you link the application to a modified version of Mini-XML,
|
||||
then the changes to Mini-XML must be provided under the terms of the
|
||||
LGPL2 in sections 1, 2, and 4.</I></P>
|
||||
<P><B>2.</B> You do not have to provide a copy of the Mini-XML license
|
||||
with programs that are linked to the Mini-XML library, nor do you have
|
||||
to identify the Mini-XML license in your program or documentation as
|
||||
required by section 6 of the LGPL2.</P>
|
||||
<P> </P>
|
||||
<P align="center"><B>GNU LIBRARY GENERAL PUBLIC LICENSE</B></P>
|
||||
<P align="center">Version 2, June 1991
|
||||
<BR> Copyright (C) 1991 Free Software Foundation, Inc.
|
||||
<BR> 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
<BR> Everyone is permitted to copy and distribute verbatim copies of
|
||||
this license document, but changing it is not allowed.
|
||||
<BR> [This is the first released version of the library GPL. It is
|
||||
numbered 2 because it goes with version 2 of the ordinary GPL.]</P>
|
||||
<P><B>Preamble</B></P>
|
||||
<P>The licenses for most software are designed to take away your freedom
|
||||
to share and change it. By contrast, the GNU General Public Licenses
|
||||
are intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users.</P>
|
||||
<P>This license, the Library General Public License, applies to some
|
||||
specially designated Free Software Foundation software, and to any
|
||||
other libraries whose authors decide to use it. You can use it for your
|
||||
libraries, too.</P>
|
||||
<P>When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it in
|
||||
new free programs; and that you know you can do these things.</P>
|
||||
<P>To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the library, or if you modify it.</P>
|
||||
<P>For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link a program with the library, you must provide complete
|
||||
object files to the recipients so that they can relink them with the
|
||||
library, after making changes to the library and recompiling it. And
|
||||
you must show them these terms so they know their rights.</P>
|
||||
<P>Our method of protecting your rights has two steps: (1) copyright the
|
||||
library, and (2) offer you this license which gives you legal
|
||||
permission to copy, distribute and/or modify the library.</P>
|
||||
<P>Also, for each distributor's protection, we want to make certain that
|
||||
everyone understands that there is no warranty for this free library.
|
||||
If the library is modified by someone else and passed on, we want its
|
||||
recipients to know that what they have is not the original version, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.</P>
|
||||
<P>Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that companies distributing free
|
||||
software will individually obtain patent licenses, thus in effect
|
||||
transforming the program into proprietary software. To prevent this, we
|
||||
have made it clear that any patent must be licensed for everyone's free
|
||||
use or not licensed at all.</P>
|
||||
<P>Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License, which was designed for utility
|
||||
programs. This license, the GNU Library General Public License, applies
|
||||
to certain designated libraries. This license is quite different from
|
||||
the ordinary one; be sure to read it in full, and don't assume that
|
||||
anything in it is the same as in the ordinary license.</P>
|
||||
<P>The reason we have a separate public license for some libraries is
|
||||
that they blur the distinction we usually make between modifying or
|
||||
adding to a program and simply using it. Linking a program with a
|
||||
library, without changing the library, is in some sense simply using
|
||||
the library, and is analogous to running a utility program or
|
||||
application program. However, in a textual and legal sense, the linked
|
||||
executable is a combined work, a derivative of the original library,
|
||||
and the ordinary General Public License treats it as such.</P>
|
||||
<P>Because of this blurred distinction, using the ordinary General
|
||||
Public License for libraries did not effectively promote software
|
||||
sharing, because most developers did not use the libraries. We
|
||||
concluded that weaker conditions might promote sharing better.</P>
|
||||
<P>However, unrestricted linking of non-free programs would deprive the
|
||||
users of those programs of all benefit from the free status of the
|
||||
libraries themselves. This Library General Public License is intended
|
||||
to permit developers of non-free programs to use free libraries, while
|
||||
preserving your freedom as a user of such programs to change the free
|
||||
libraries that are incorporated in them. (We have not seen how to
|
||||
achieve this as regards changes in header files, but we have achieved
|
||||
it as regards changes in the actual functions of the Library.) The hope
|
||||
is that this will lead to faster development of free libraries.</P>
|
||||
<P>The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the libary" and a "work that uses the library". The
|
||||
former contains code derived from the library, while the latter only
|
||||
works together with the library.</P>
|
||||
<P>Note that it is possible for a library to be covered by the ordinary
|
||||
General Public License rather than by this special one.</P>
|
||||
<P align="center"><B>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND
|
||||
MODIFICATION</B></P>
|
||||
<P><STRONG>0.</STRONG> This License Agreement applies to any software
|
||||
library which contains a notice placed by the copyright holder or other
|
||||
authorized party saying it may be distributed under the terms of this
|
||||
Library General Public License (also called "this License"). Each
|
||||
licensee is addressed as "you".</P>
|
||||
<P>A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.</P>
|
||||
<P>The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)</P>
|
||||
<P>"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control
|
||||
compilation and installation of the library.</P>
|
||||
<P>Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of running
|
||||
a program using the Library is not restricted, and output from such a
|
||||
program is covered only if its contents constitute a work based on the
|
||||
Library (independent of the use of the Library in a tool for writing
|
||||
it). Whether that is true depends on what the Library does and what the
|
||||
program that uses the Library does.</P>
|
||||
<P><STRONG>1.</STRONG> You may copy and distribute verbatim copies of
|
||||
the Library's complete source code as you receive it, in any medium,
|
||||
provided that you conspicuously and appropriately publish on each copy
|
||||
an appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the Library.</P>
|
||||
<P>You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.</P>
|
||||
<P><STRONG>2.</STRONG> You may modify your copy or copies of the Library
|
||||
or any portion of it, thus forming a work based on the Library, and
|
||||
copy and distribute such modifications or work under the terms of
|
||||
Section 1 above, provided that you also meet all of these conditions:</P>
|
||||
<UL>
|
||||
<P><STRONG>a)</STRONG> The modified work must itself be a software
|
||||
library.</P>
|
||||
<P><STRONG>b)</STRONG> You must cause the files modified to carry
|
||||
prominent notices stating that you changed the files and the date of
|
||||
any change.</P>
|
||||
<P><STRONG>c)</STRONG> You must cause the whole of the work to be
|
||||
licensed at no charge to all third parties under the terms of this
|
||||
License.</P>
|
||||
<P><STRONG>d)</STRONG> If a facility in the modified Library refers to a
|
||||
function or a table of data to be supplied by an application program
|
||||
that uses the facility, other than as an argument passed when the
|
||||
facility is invoked, then you must make a good faith effort to ensure
|
||||
that, in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of its
|
||||
purpose remains meaningful.</P>
|
||||
<P>(For example, a function in a library to compute square roots has a
|
||||
purpose that is entirely well-defined independent of the application.
|
||||
Therefore, Subsection 2d requires that any application-supplied
|
||||
function or table used by this function must be optional: if the
|
||||
application does not supply it, the square root function must still
|
||||
compute square roots.)</P>
|
||||
</UL>
|
||||
<P>These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.</P>
|
||||
<P>Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.</P>
|
||||
<P>In addition, mere aggregation of another work not based on the
|
||||
Library with the Library (or with a work based on the Library) on a
|
||||
volume of a storage or distribution medium does not bring the other
|
||||
work under the scope of this License.</P>
|
||||
<P><STRONG>3.</STRONG> You may opt to apply the terms of the ordinary
|
||||
GNU General Public License instead of this License to a given copy of
|
||||
the Library. To do this, you must alter all the notices that refer to
|
||||
this License, so that they refer to the ordinary GNU General Public
|
||||
License, version 2, instead of to this License. (If a newer version
|
||||
than version 2 of the ordinary GNU General Public License has appeared,
|
||||
then you can specify that version instead if you wish.) Do not make any
|
||||
other change in these notices.</P>
|
||||
<P>Once this change is made in a given copy, it is irreversible for that
|
||||
copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.</P>
|
||||
<P>This option is useful when you wish to copy part of the code of the
|
||||
Library into a program that is not a library.</P>
|
||||
<P><STRONG>4.</STRONG> You may copy and distribute the Library (or a
|
||||
portion or derivative of it, under Section 2) in object code or
|
||||
executable form under the terms of Sections 1 and 2 above provided that
|
||||
you accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections 1
|
||||
and 2 above on a medium customarily used for software interchange.</P>
|
||||
<P>If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to distribute
|
||||
the source code, even though third parties are not compelled to copy
|
||||
the source along with the object code.</P>
|
||||
<P><STRONG>5.</STRONG> A program that contains no derivative of any
|
||||
portion of the Library, but is designed to work with the Library by
|
||||
being compiled or linked with it, is called a "work that uses the
|
||||
Library". Such a work, in isolation, is not a derivative work of the
|
||||
Library, and therefore falls outside the scope of this License.</P>
|
||||
<P>However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License. Section
|
||||
6 states terms for distribution of such executables.</P>
|
||||
<P>When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.</P>
|
||||
<P>If such an object file uses only numerical parameters, data structure
|
||||
layouts and accessors, and small macros and small inline functions (ten
|
||||
lines or less in length), then the use of the object file is
|
||||
unrestricted, regardless of whether it is legally a derivative work.
|
||||
(Executables containing this object code plus portions of the Library
|
||||
will still fall under Section 6.)</P>
|
||||
<P>Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6, whether
|
||||
or not they are linked directly with the Library itself.</P>
|
||||
<P><STRONG>6.</STRONG> As an exception to the Sections above, you may
|
||||
also compile or link a "work that uses the Library" with the Library to
|
||||
produce a work containing portions of the Library, and distribute that
|
||||
work under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.</P>
|
||||
<P>You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:</P>
|
||||
<UL><STRONG> a)</STRONG> Accompany the work with the complete
|
||||
corresponding machine-readable source code for the Library including
|
||||
whatever changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked with
|
||||
the Library, with the complete machine-readable "work that uses the
|
||||
Library", as object code and/or source code, so that the user can
|
||||
modify the Library and then relink to produce a modified executable
|
||||
containing the modified Library. (It is understood that the user who
|
||||
changes the contents of definitions files in the Library will not
|
||||
necessarily be able to recompile the application to use the modified
|
||||
definitions.)
|
||||
<P><STRONG>b)</STRONG> Accompany the work with a written offer, valid
|
||||
for at least three years, to give the same user the materials specified
|
||||
in Subsection 6a, above, for a charge no more than the cost of
|
||||
performing this distribution.</P>
|
||||
<P><STRONG>c)</STRONG> If distribution of the work is made by offering
|
||||
access to copy from a designated place, offer equivalent access to copy
|
||||
the above specified materials from the same place.</P>
|
||||
<P><STRONG>d)</STRONG> Verify that the user has already received a copy
|
||||
of these materials or that you have already sent this user a copy.</P>
|
||||
</UL>
|
||||
<P>For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the source code distributed need not include anything that is normally
|
||||
distributed (in either source or binary form) with the major components
|
||||
(compiler, kernel, and so on) of the operating system on which the
|
||||
executable runs, unless that component itself accompanies the
|
||||
executable.</P>
|
||||
<P>It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.</P>
|
||||
<P><STRONG>7.</STRONG> You may place library facilities that are a work
|
||||
based on the Library side-by-side in a single library together with
|
||||
other library facilities not covered by this License, and distribute
|
||||
such a combined library, provided that the separate distribution of the
|
||||
work based on the Library and of the other library facilities is
|
||||
otherwise permitted, and provided that you do these two things:</P>
|
||||
<UL><STRONG> a)</STRONG> Accompany the combined library with a copy of
|
||||
the same work based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the Sections
|
||||
above.
|
||||
<P><STRONG>b)</STRONG> Give prominent notice with the combined library
|
||||
of the fact that part of it is a work based on the Library, and
|
||||
explaining where to find the accompanying uncombined form of the same
|
||||
work.</P>
|
||||
</UL>
|
||||
<P><STRONG>8.</STRONG> You may not copy, modify, sublicense, link with,
|
||||
or distribute the Library except as expressly provided under this
|
||||
License. Any attempt otherwise to copy, modify, sublicense, link with,
|
||||
or distribute the Library is void, and will automatically terminate
|
||||
your rights under this License. However, parties who have received
|
||||
copies, or rights, from you under this License will not have their
|
||||
licenses terminated so long as such parties remain in full compliance.</P>
|
||||
<P><STRONG>9.</STRONG> You are not required to accept this License,
|
||||
since you have not signed it. However, nothing else grants you
|
||||
permission to modify or distribute the Library or its derivative works.
|
||||
These actions are prohibited by law if you do not accept this License.
|
||||
Therefore, by modifying or distributing the Library (or any work based
|
||||
on the Library), you indicate your acceptance of this License to do so,
|
||||
and all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.</P>
|
||||
<P><STRONG>10.</STRONG> Each time you redistribute the Library (or any
|
||||
work based on the Library), the recipient automatically receives a
|
||||
license from the original licensor to copy, distribute, link with or
|
||||
modify the Library subject to these terms and conditions. You may not
|
||||
impose any further restrictions on the recipients' exercise of the
|
||||
rights granted herein. You are not responsible for enforcing compliance
|
||||
by third parties to this License.</P>
|
||||
<P><STRONG>11.</STRONG> If, as a consequence of a court judgment or
|
||||
allegation of patent infringement or for any other reason (not limited
|
||||
to patent issues), conditions are imposed on you (whether by court
|
||||
order, agreement or otherwise) that contradict the conditions of this
|
||||
License, they do not excuse you from the conditions of this License. If
|
||||
you cannot distribute so as to satisfy simultaneously your obligations
|
||||
under this License and any other pertinent obligations, then as a
|
||||
consequence you may not distribute the Library at all. For example, if
|
||||
a patent license would not permit royalty-free redistribution of the
|
||||
Library by all those who receive copies directly or indirectly through
|
||||
you, then the only way you could satisfy both it and this License would
|
||||
be to refrain entirely from distribution of the Library.</P>
|
||||
<P>If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply, and the section as a whole is intended to apply in other
|
||||
circumstances.</P>
|
||||
<P>It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is implemented
|
||||
by public license practices. Many people have made generous
|
||||
contributions to the wide range of software distributed through that
|
||||
system in reliance on consistent application of that system; it is up
|
||||
to the author/donor to decide if he or she is willing to distribute
|
||||
software through any other system and a licensee cannot impose that
|
||||
choice.</P>
|
||||
<P>This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.</P>
|
||||
<P><STRONG>12.</STRONG> If the distribution and/or use of the Library is
|
||||
restricted in certain countries either by patents or by copyrighted
|
||||
interfaces, the original copyright holder who places the Library under
|
||||
this License may add an explicit geographical distribution limitation
|
||||
excluding those countries, so that distribution is permitted only in or
|
||||
among countries not thus excluded. In such case, this License
|
||||
incorporates the limitation as if written in the body of this License.</P>
|
||||
<P><STRONG>13.</STRONG> The Free Software Foundation may publish revised
|
||||
and/or new versions of the Library General Public License from time to
|
||||
time. Such new versions will be similar in spirit to the present
|
||||
version, but may differ in detail to address new problems or concerns.</P>
|
||||
<P>Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a license
|
||||
version number, you may choose any version ever published by the Free
|
||||
Software Foundation.</P>
|
||||
<P><STRONG>14.</STRONG> If you wish to incorporate parts of the Library
|
||||
into other free programs whose distribution conditions are incompatible
|
||||
with these, write to the author to ask for permission. For software
|
||||
which is copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.</P>
|
||||
<P align="center"><B>NO WARRANTY</B></P>
|
||||
<P><STRONG>15.</STRONG> BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE,
|
||||
THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT
|
||||
WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
|
||||
OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU
|
||||
ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</P>
|
||||
<P><STRONG>16.</STRONG> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR
|
||||
AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO
|
||||
MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE
|
||||
LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL
|
||||
OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.</P>
|
||||
<P align="center"><B>END OF TERMS AND CONDITIONS</B></P>
|
||||
<P><B>How to Apply These Terms to Your New Libraries</B></P>
|
||||
<P>If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of
|
||||
the ordinary General Public License).</P>
|
||||
<P>To apply these terms, attach the following notices to the library. It
|
||||
is safest to attach them to the start of each source file to most
|
||||
effectively convey the exclusion of warranty; and each file should have
|
||||
at least the "copyright" line and a pointer to where the full notice is
|
||||
found.</P>
|
||||
<UL>
|
||||
<P><VAR>one line to give the library's name and an idea of what it does.</VAR>
|
||||
<BR> Copyright (C)<VAR> year</VAR><VAR> name of author</VAR></P>
|
||||
<P>This library is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.</P>
|
||||
<P>This library is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
|
||||
General Public License for more details.</P>
|
||||
<P>You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</P>
|
||||
</UL>
|
||||
<P>Also add information on how to contact you by electronic and paper
|
||||
mail.</P>
|
||||
<P>You should also get your employer (if you work as a programmer) or
|
||||
your school, if any, to sign a "copyright disclaimer" for the library,
|
||||
if necessary. Here is a sample; alter the names:</P>
|
||||
<UL>
|
||||
<P>Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random
|
||||
Hacker.</P>
|
||||
<P><VAR>signature of Ty Coon</VAR>, 1 April 1990 Ty Coon, President of
|
||||
Vice</P>
|
||||
</UL>
|
||||
<P>That's all there is to it!</P>
|
||||
<HR NOSHADE>
|
||||
<A HREF="index.html">Contents</A>
|
||||
<A HREF="mxmldoc.html">Previous</A>
|
||||
<A HREF="relnotes.html">Next</A>
|
||||
</BODY>
|
||||
</HTML>
|
@ -1,187 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Mini-XML Programmers Manual, Version 2.7</TITLE>
|
||||
<META NAME="author" CONTENT="Michael R. Sweet">
|
||||
<META NAME="copyright" CONTENT="Copyright 2003-2011">
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-iso-8859-1">
|
||||
<LINK REL="Start" HREF="index.html">
|
||||
<LINK REL="Contents" HREF="index.html">
|
||||
<LINK REL="Prev" HREF="advanced.html">
|
||||
<LINK REL="Next" HREF="license.html">
|
||||
<STYLE TYPE="text/css"><!--
|
||||
BODY { font-family: sans-serif }
|
||||
H1 { font-family: sans-serif }
|
||||
H2 { font-family: sans-serif }
|
||||
H3 { font-family: sans-serif }
|
||||
H4 { font-family: sans-serif }
|
||||
H5 { font-family: sans-serif }
|
||||
H6 { font-family: sans-serif }
|
||||
SUB { font-size: smaller }
|
||||
SUP { font-size: smaller }
|
||||
PRE { font-family: monospace }
|
||||
A { text-decoration: none }
|
||||
--></STYLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<A HREF="index.html">Contents</A>
|
||||
<A HREF="advanced.html">Previous</A>
|
||||
<A HREF="license.html">Next</A>
|
||||
<HR NOSHADE>
|
||||
<H1 align="right"><A name="MXMLDOC"><IMG align="right" alt="4" height="100"
|
||||
hspace="10" src="4.gif" width="100"></A>Using the mxmldoc Utility</H1>
|
||||
<P>This chapter describes how to use <TT>mxmldoc(1)</TT> program to
|
||||
automatically generate documentation from C and C++ source files.</P>
|
||||
<H2><A NAME="5_1">The Basics</A></H2>
|
||||
<P>Originally developed to generate the Mini-XML and CUPS API
|
||||
documentation, <TT>mxmldoc</TT> is now a general-purpose utility which
|
||||
scans C and C++ source files to produce HTML and man page documentation
|
||||
along with an XML file representing the functions, types, and
|
||||
definitions in those source files. Unlike popular documentation
|
||||
generators like Doxygen or Javadoc, <TT>mxmldoc</TT> uses in-line
|
||||
comments rather than comment headers, allowing for more "natural" code
|
||||
documentation.</P>
|
||||
<P>By default, <TT>mxmldoc</TT> produces HTML documentation. For
|
||||
example, the following command will scan all of the C source and header
|
||||
files in the current directory and produce a HTML documentation file
|
||||
called<VAR> filename.html</VAR>:</P>
|
||||
<PRE>
|
||||
<KBD>mxmldoc *.h *.c >filename.html ENTER</KBD>
|
||||
</PRE>
|
||||
<P>You can also specify an XML file to create which contains all of the
|
||||
information from the source files. For example, the following command
|
||||
creates an XML file called<VAR> filename.xml</VAR> in addition to the
|
||||
HTML file:</P>
|
||||
<PRE>
|
||||
<KBD>mxmldoc filename.xml *.h *.c >filename.html ENTER</KBD>
|
||||
</PRE>
|
||||
<P>The <TT>--no-output</TT> option disables the normal HTML output:</P>
|
||||
<PRE>
|
||||
<KBD>mxmldoc --no-output filename.xml *.h *.c ENTER</KBD>
|
||||
</PRE>
|
||||
<P>You can then run <TT>mxmldoc</TT> again with the XML file alone to
|
||||
generate the HTML documentation:</P>
|
||||
<PRE>
|
||||
<KBD>mxmldoc filename.xml >filename.html ENTER</KBD>
|
||||
</PRE>
|
||||
<H3><A NAME="5_1_1">Creating Man Pages</A></H3>
|
||||
<P>The <TT>--man filename</TT> option tells <TT>mxmldoc</TT> to create a
|
||||
man page instead of HTML documentation, for example:</P>
|
||||
<PRE>
|
||||
<KBD>mxmldoc --man filename filename.xml \
|
||||
>filename.man ENTER</KBD>
|
||||
|
||||
<KBD>mxmldoc --man filename *.h *.c \
|
||||
>filename.man ENTER</KBD>
|
||||
</PRE>
|
||||
<H3><A NAME="5_1_2">Creating Xcode Documentation Sets</A></H3>
|
||||
<P>The <TT>--docset directory.docset</TT> option tells <TT>mxmldoc</TT>
|
||||
to create an Xcode documentation set containing the HTML documentation,
|
||||
for example:</P>
|
||||
<PRE>
|
||||
<KBD>mxmldoc --docset foo.docset *.h *.c foo.xml ENTER</KBD>
|
||||
</PRE>
|
||||
<P>Xcode documentation sets can only be built on Mac OS X with Xcode 3.0
|
||||
or higher installed.</P>
|
||||
<H2><A NAME="5_2">Commenting Your Code</A></H2>
|
||||
<P>As noted previously, <TT>mxmldoc</TT> looks for in-line comments to
|
||||
describe the functions, types, and constants in your code. <TT>Mxmldoc</TT>
|
||||
will document all public names it finds in your source files - any
|
||||
names starting with the underscore character (_) or names that are
|
||||
documented with the <A HREF="#ATDIRECTIVES">@private@</A> directive are
|
||||
treated as private and are not documented.</P>
|
||||
<P>Comments appearing directly before a function or type definition are
|
||||
used to document that function or type. Comments appearing after
|
||||
argument, definition, return type, or variable declarations are used to
|
||||
document that argument, definition, return type, or variable. For
|
||||
example, the following code excerpt defines a key/value structure and a
|
||||
function that creates a new instance of that structure:</P>
|
||||
<PRE>
|
||||
/* A key/value pair. This is used with the
|
||||
dictionary structure. */
|
||||
|
||||
struct keyval
|
||||
{
|
||||
char *key; /* Key string */
|
||||
char *val; /* Value string */
|
||||
};
|
||||
|
||||
/* Create a new key/value pair. */
|
||||
|
||||
struct keyval * /* New key/value pair */
|
||||
new_keyval(
|
||||
const char *key, /* Key string */
|
||||
const char *val) /* Value string */
|
||||
{
|
||||
...
|
||||
}
|
||||
</PRE>
|
||||
<P><TT>Mxmldoc</TT> also knows to remove extra asterisks (*) from the
|
||||
comment string, so the comment string:</P>
|
||||
<PRE>
|
||||
/*
|
||||
* Compute the value of PI.
|
||||
*
|
||||
* The function connects to an Internet server
|
||||
* that streams audio of mathematical monks
|
||||
* chanting the first 100 digits of PI.
|
||||
*/
|
||||
</PRE>
|
||||
<P>will be shown as:</P>
|
||||
<PRE>
|
||||
Compute the value of PI.
|
||||
|
||||
The function connects to an Internet server
|
||||
that streams audio of mathematical monks
|
||||
chanting the first 100 digits of PI.
|
||||
</PRE>
|
||||
<P><A name="ATDIRECTIVES">Comments</A> can also include the following
|
||||
special <TT>@name ...@</TT> directive strings:</P>
|
||||
<UL>
|
||||
<LI><TT>@deprecated@</TT> - flags the item as deprecated to discourage
|
||||
its use</LI>
|
||||
<LI><TT>@private@</TT> - flags the item as private so it will not be
|
||||
included in the documentation</LI>
|
||||
<LI><TT>@since ...@</TT> - flags the item as new since a particular
|
||||
release. The text following the <TT>@since</TT> up to the closing <TT>@</TT>
|
||||
is highlighted in the generated documentation, e.g. <TT>@since Mini-XML
|
||||
2.7@</TT>.</LI>
|
||||
</UL>
|
||||
|
||||
<!-- NEED 10 -->
|
||||
<H2><A NAME="5_3">Titles, Sections, and Introductions</A></H2>
|
||||
<P><TT>Mxmldoc</TT> also provides options to set the title, section, and
|
||||
introduction text for the generated documentation. The <TT>--title text</TT>
|
||||
option specifies the title for the documentation. The title string is
|
||||
usually put in quotes:</P>
|
||||
<PRE>
|
||||
<KBD>mxmldoc filename.xml \
|
||||
--title "My Famous Documentation" \
|
||||
>filename.html ENTER</KBD>
|
||||
</PRE>
|
||||
<P>The <TT>--section name</TT> option specifies the section for the
|
||||
documentation. For HTML documentation, the name is placed in a HTML
|
||||
comment such as:</P>
|
||||
<PRE>
|
||||
<!-- SECTION: name -->
|
||||
</PRE>
|
||||
<P>For man pages, the section name is usually just a number ("3"), or a
|
||||
number followed by a vendor name ("3acme"). The section name is used in
|
||||
the <TT>.TH</TT> directive in the man page:</P>
|
||||
<PRE>
|
||||
.TH mylibrary 3acme "My Title" ...
|
||||
</PRE>
|
||||
<P>The default section name for man page output is "3". There is no
|
||||
default section name for HTML output.</P>
|
||||
<P>Finally, the <TT>--intro filename</TT> option specifies a file to
|
||||
embed after the title and section but before the generated
|
||||
documentation. For HTML documentation, the file must consist of valid
|
||||
HTML without the usual <TT>DOCTYPE</TT>, <TT>html</TT>, and <TT>body</TT>
|
||||
elements. For man page documentation, the file must consist of valid <TT>
|
||||
nroff(1)</TT> text.</P>
|
||||
<HR NOSHADE>
|
||||
<A HREF="index.html">Contents</A>
|
||||
<A HREF="advanced.html">Previous</A>
|
||||
<A HREF="license.html">Next</A>
|
||||
</BODY>
|
||||
</HTML>
|
@ -1,329 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Mini-XML Programmers Manual, Version 2.7</TITLE>
|
||||
<META NAME="author" CONTENT="Michael R. Sweet">
|
||||
<META NAME="copyright" CONTENT="Copyright 2003-2011">
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-iso-8859-1">
|
||||
<LINK REL="Start" HREF="index.html">
|
||||
<LINK REL="Contents" HREF="index.html">
|
||||
<LINK REL="Prev" HREF="license.html">
|
||||
<LINK REL="Next" HREF="reference.html">
|
||||
<STYLE TYPE="text/css"><!--
|
||||
BODY { font-family: sans-serif }
|
||||
H1 { font-family: sans-serif }
|
||||
H2 { font-family: sans-serif }
|
||||
H3 { font-family: sans-serif }
|
||||
H4 { font-family: sans-serif }
|
||||
H5 { font-family: sans-serif }
|
||||
H6 { font-family: sans-serif }
|
||||
SUB { font-size: smaller }
|
||||
SUP { font-size: smaller }
|
||||
PRE { font-family: monospace }
|
||||
A { text-decoration: none }
|
||||
--></STYLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<A HREF="index.html">Contents</A>
|
||||
<A HREF="license.html">Previous</A>
|
||||
<A HREF="reference.html">Next</A>
|
||||
<HR NOSHADE>
|
||||
<H1 align="right"><A name="RELNOTES"><IMG align="right" alt="B" height="100"
|
||||
hspace="10" src="B.gif" width="100"></A>Release Notes</H1>
|
||||
<H2><A NAME="7_1">Changes in Mini-XML 2.7</A></H2>
|
||||
<UL>
|
||||
<LI>Fixed conformance of mxmldoc's HTML and CSS output.</LI>
|
||||
<LI>Added data accessor ("get") functions and made the mxml_node_t and
|
||||
mxml_index_t structures private but still available in the Mini-XML
|
||||
header to preserve source compatibility (STR #118)</LI>
|
||||
<LI>Updated the source headers to reference the Mini-XML license and its
|
||||
exceptions to the LGPL2 (STR #108)</LI>
|
||||
<LI>Added a new mxmlFindPath() function to find the value node of a
|
||||
named element (STR #110)</LI>
|
||||
<LI>Building a static version of the library did not work on Windows
|
||||
(STR #112)</LI>
|
||||
<LI>The shared library did not include a destructor for the thread-
|
||||
specific data key on UNIX-based operating systems (STR #103)</LI>
|
||||
<LI>mxmlLoad* did not error out on XML with multiple root nodes (STR
|
||||
#101)</LI>
|
||||
<LI>Fixed an issue with the _mxml_vstrdupf function (STR #107)</LI>
|
||||
<LI>mxmlSave* no longer write all siblings of the passed node, just that
|
||||
node and its children (STR #109)</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_2">Changes in Mini-XML 2.6</A></H2>
|
||||
<UL>
|
||||
<LI>Documentation fixes (STR #91, STR #92)</LI>
|
||||
<LI>The mxmldoc program did not handle typedef comments properly (STR
|
||||
#72)</LI>
|
||||
<LI>Added support for "long long" printf formats.</LI>
|
||||
<LI>The XML parser now ignores BOMs in UTF-8 XML files (STR #89)</LI>
|
||||
<LI>The mxmldoc program now supports generating Xcode documentation
|
||||
sets.</LI>
|
||||
<LI>mxmlSave*() did not output UTF-8 correctly on some platforms.</LI>
|
||||
<LI>mxmlNewXML() now adds encoding="utf-8" in the ?xml directive to
|
||||
avoid problems with non-conformant XML parsers that assume something
|
||||
other than UTF-8 as the default encoding.</LI>
|
||||
<LI>Wrapping was not disabled when mxmlSetWrapMargin(0) was called, and
|
||||
"<?xml ... ?>" was always followed by a newline (STR #76)</LI>
|
||||
<LI>The mxml.pc.in file was broken (STR #79)</LI>
|
||||
<LI>The mxmldoc program now handles "typedef enum name {} name"
|
||||
correctly (STR #72)</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_3">Changes in Mini-XML 2.5</A></H2>
|
||||
<UL>
|
||||
<LI>The mxmldoc program now makes greater use of CSS and supports a
|
||||
--css option to embed an alternate stylesheet.</LI>
|
||||
<LI>The mxmldoc program now supports --header and --footer options to
|
||||
insert documentation content before and after the generated content.</LI>
|
||||
<LI>The mxmldoc program now supports a --framed option to generate
|
||||
framed HTML output.</LI>
|
||||
<LI>The mxmldoc program now creates a table of contents including any
|
||||
headings in the --intro file when generating HTML output.</LI>
|
||||
<LI>The man pages and man page output from mxmldoc did not use "\-" for
|
||||
dashes (STR #68)</LI>
|
||||
<LI>The debug version of the Mini-XML DLL could not be built (STR #65)</LI>
|
||||
<LI>Processing instructions and directives did not work when not at the
|
||||
top level of a document (STR #67)</LI>
|
||||
<LI>Spaces around the "=" in attributes were not supported (STR #67)</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_4">Changes in Mini-XML 2.4</A></H2>
|
||||
<UL>
|
||||
<LI>Fixed shared library build problems on HP-UX and Mac OS X.</LI>
|
||||
<LI>The mxmldoc program did not output argument descriptions for
|
||||
functions properly.</LI>
|
||||
<LI>All global settings (custom, error, and entity callbacks and the
|
||||
wrap margin) are now managed separately for each thread.</LI>
|
||||
<LI>Added mxmlElementDeleteAttr() function (STR #59)</LI>
|
||||
<LI>mxmlElementSetAttrf() did not work (STR #57)</LI>
|
||||
<LI>mxmlLoad*() incorrectly treated declarations as parent elements (STR
|
||||
#56)</LI>
|
||||
<LI>mxmlLoad*() incorrectly allowed attributes without values (STR #47)</LI>
|
||||
<LI>Fixed Visual C++ build problems (STR #49)</LI>
|
||||
<LI>mxmlLoad*() did not return NULL when an element contained an error
|
||||
(STR #46)</LI>
|
||||
<LI>Added support for the apos character entity (STR #54)</LI>
|
||||
<LI>Fixed whitespace detection with Unicode characters (STR #48)</LI>
|
||||
<LI>mxmlWalkNext() and mxmlWalkPrev() did not work correctly when called
|
||||
with a node with no children as the top node (STR #53)</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_5">Changes in Mini-XML 2.3</A></H2>
|
||||
<UL>
|
||||
<LI>Added two exceptions to the LGPL to support static linking of
|
||||
applications against Mini-XML</LI>
|
||||
<LI>The mxmldoc utility can now generate man pages, too.</LI>
|
||||
<LI>Added a mxmlNewXML() function</LI>
|
||||
<LI>Added a mxmlElementSetAttrf() function (STR #43)</LI>
|
||||
<LI>Added a snprintf() emulation function for the test program (STR #32)</LI>
|
||||
<LI>Added the _CRT_SECURE_NO_DEPRECATE definition when building on VC++
|
||||
2005 (STR #36)</LI>
|
||||
<LI>mxmlLoad*() did not detect missing > characters in elements (STR
|
||||
#41)</LI>
|
||||
<LI>mxmlLoad*() did not detect missing close tags at the end of an XML
|
||||
document (STR #45)</LI>
|
||||
<LI>Added user_data and ref_count members to mxml_node_t structure</LI>
|
||||
<LI>Added mxmlReleaseNode() and mxmlRetainNode() APIs for
|
||||
reference-counted nodes</LI>
|
||||
<LI>Added mxmlSetWrapMargin() to control the wrapping of XML output</LI>
|
||||
<LI>Added conditional check for EINTR error code for certain Windows
|
||||
compilers that do not define it (STR #33)</LI>
|
||||
<LI>The mxmldoc program now generates correct HTML 4.0 output -
|
||||
previously it generated invalid XHTML</LI>
|
||||
<LI>The mxmldoc program now supports "@deprecated@, "@private@", and
|
||||
"@since version@" comments</LI>
|
||||
<LI>Fixed function and enumeration type bugs in mxmldoc</LI>
|
||||
<LI>Fixed the XML schema for mxmldoc</LI>
|
||||
<LI>The mxmldoc program now supports --intro, --section, and --title
|
||||
options</LI>
|
||||
<LI>The mxmlLoad*() functions could leak a node on an error (STR #27)</LI>
|
||||
<LI>The mxml_vsnprintf() function could get in an infinite loop on a
|
||||
buffer overflow (STR #25)</LI>
|
||||
<LI>Added new mxmlNewCDATA() and mxmlSetCDATA() functions to create and
|
||||
set CDATA nodes, which are really just special element nodes</LI>
|
||||
<LI>Added new MXML_IGNORE type and MXML_IGNORE_CB callback to ignore
|
||||
non-element nodes, e.g. whitespace</LI>
|
||||
<LI>mxmlLoad*() did not treat custom data as opaque, so whitespace
|
||||
characters would be lost</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_6">Changes in Mini-XML 2.2.2</A></H2>
|
||||
<UL>
|
||||
<LI>mxmlLoad*() did not treat custom data as opaque, so whitespace
|
||||
characters would be lost.</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_7">Changes in Mini-XML 2.2.1</A></H2>
|
||||
<UL>
|
||||
<LI>mxmlLoadFd(), mxmlLoadFile(), and mxmlLoadString() now correctly
|
||||
return NULL on error (STR #21)</LI>
|
||||
<LI>mxmlNewInteger(), mxmlNewOpaque(), mxmlNewReal(), mxmlNewText(), and
|
||||
mxmlNewTextf() incorrectly required a parent node (STR #22)</LI>
|
||||
<LI>Fixed an XML output bug in mxmldoc.</LI>
|
||||
<LI>The "make install" target now uses the install command to set the
|
||||
proper permissions on UNIX/Linux/OSX.</LI>
|
||||
<LI>Fixed a MingW/Cygwin compilation problem (STR #18)</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_8">Changes in Mini-XML 2.2</A></H2>
|
||||
<UL>
|
||||
<LI>Added shared library support (STR #17)</LI>
|
||||
<LI>mxmlLoad*() now returns an error when an XML stream contains illegal
|
||||
control characters (STR #10)</LI>
|
||||
<LI>mxmlLoad*() now returns an error when an element contains two
|
||||
attributes with the same name in conformance with the XML spec (STR
|
||||
#16)</LI>
|
||||
<LI>Added support for CDATA (STR #14, STR #15)</LI>
|
||||
<LI>Updated comment and processing instruction handling - no entity
|
||||
support per XML specification.</LI>
|
||||
<LI>Added checking for invalid comment termination ("--->" is not
|
||||
allowed)</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_9">Changes in Mini-XML 2.1</A></H2>
|
||||
<UL>
|
||||
<LI>Added support for custom data nodes (STR #6)</LI>
|
||||
<LI>Now treat UTF-8 sequences which are longer than necessary as an
|
||||
error (STR #4)</LI>
|
||||
<LI>Fixed entity number support (STR #8)</LI>
|
||||
<LI>Fixed mxmlLoadString() bug with UTF-8 (STR #7)</LI>
|
||||
<LI>Fixed entity lookup bug (STR #5)</LI>
|
||||
<LI>Added mxmlLoadFd() and mxmlSaveFd() functions.</LI>
|
||||
<LI>Fixed multi-word UTF-16 handling.</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_10">Changes in Mini-XML 2.0</A></H2>
|
||||
<UL>
|
||||
<LI>New programmers manual.</LI>
|
||||
<LI>Added Visual C++ project files for Microsoft Windows users.</LI>
|
||||
<LI>Added optimizations to mxmldoc, mxmlSaveFile(), and mxmlIndexNew()
|
||||
(STR #2)</LI>
|
||||
<LI>mxmlEntityAddCallback() now returns an integer status (STR #2)</LI>
|
||||
<LI>Added UTF-16 support (input only; all output is UTF-8)</LI>
|
||||
<LI>Added index functions to build a searchable index of XML nodes.</LI>
|
||||
<LI>Added character entity callback interface to support additional
|
||||
character entities beyond those defined in the XHTML specification.</LI>
|
||||
<LI>Added support for XHTML character entities.</LI>
|
||||
<LI>The mxmldoc utility now produces XML output which conforms to an
|
||||
updated XML schema, described in the file "doc/mxmldoc.xsd".</LI>
|
||||
<LI>Changed the whitespace callback interface to return strings instead
|
||||
of a single character, allowing for greater control over the formatting
|
||||
of XML files written using Mini-XML. THIS CHANGE WILL REQUIRE CHANGES
|
||||
TO YOUR 1.x CODE IF YOU USE WHITESPACE CALLBACKS.</LI>
|
||||
<LI>The mxmldoc utility now produces XML output which conforms to an
|
||||
updated XML schema, described in the file "doc/mxmldoc.xsd".</LI>
|
||||
<LI>Changed the whitespace callback interface to return strings instead
|
||||
of a single character, allowing for greater control over the formatting
|
||||
of XML files written using Mini-XML. THIS CHANGE WILL REQUIRE CHANGES
|
||||
TO YOUR 1.x CODE IF YOU USE WHITESPACE CALLBACKS.</LI>
|
||||
<LI>The mxmldoc utility is now capable of documenting C++ classes,
|
||||
functions, and structures, and correctly handles C++ comments.</LI>
|
||||
<LI>Added new modular tests for mxmldoc.</LI>
|
||||
<LI>Updated the mxmldoc output to be more compatible with embedding in
|
||||
manuals produced with HTMLDOC.</LI>
|
||||
<LI>The makefile incorrectly included a "/" separator between the
|
||||
destination path and install path. This caused problems when building
|
||||
and installing with MingW.</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_11">Changes in Mini-XML 1.3</A></H2>
|
||||
<UL>
|
||||
<LI>Fixes for mxmldoc.</LI>
|
||||
<LI>Added support for reading standard HTML entity names.</LI>
|
||||
<LI>mxmlLoadString/File() did not decode character entities in element
|
||||
names, attribute names, or attribute values.</LI>
|
||||
<LI>mxmlLoadString/File() would crash when loading non- conformant XML
|
||||
data under an existing parent (top) node.</LI>
|
||||
<LI>Fixed several bugs in the mxmldoc utility.</LI>
|
||||
<LI>Added new error callback function to catch a variety of errors and
|
||||
log them to someplace other than stderr.</LI>
|
||||
<LI>The mxmlElementSetAttr() function now allows for NULL attribute
|
||||
values.</LI>
|
||||
<LI>The load and save functions now properly handle quoted element and
|
||||
attribute name strings properly, e.g. for !DOCTYPE declarations.</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_12">Changes in Mini-XML 1.2</A></H2>
|
||||
<UL>
|
||||
<LI>Added new "set" methods to set the value of a node.</LI>
|
||||
<LI>Added new formatted text methods mxmlNewTextf() and mxmlSetTextf()
|
||||
to create/set a text node value using printf-style formats.</LI>
|
||||
<LI>Added new standard callbacks for use with the mxmlLoad functions.</LI>
|
||||
<LI>Updated the HTML documentation to include examples of the walk and
|
||||
load function output.</LI>
|
||||
<LI>Added --with/without-ansi configure option to control the strdup()
|
||||
function check.</LI>
|
||||
<LI>Added --with/without-snprintf configure option to control the
|
||||
snprintf() and vsnprintf() function checks.</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_13">Changes in Mini-XML 1.1.2</A></H2>
|
||||
<UL>
|
||||
<LI>The mxml(3) man page wasn't updated for the string functions.</LI>
|
||||
<LI>mxmlSaveString() returned the wrong number of characters.</LI>
|
||||
<LI>mxml_add_char() updated the buffer pointer in the wrong place.</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_14">Changes in Mini-XML 1.1.1</A></H2>
|
||||
<UL>
|
||||
<LI>The private mxml_add_ch() function did not update the
|
||||
start-of-buffer pointer which could cause a crash when using
|
||||
mxmlSaveString().</LI>
|
||||
<LI>The private mxml_write_ws() function called putc() instead of using
|
||||
the proper callback which could cause a crash when using
|
||||
mxmlSaveString().</LI>
|
||||
<LI>Added a mxmlSaveAllocString() convenience function for saving an XML
|
||||
node tree to an allocated string.</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_15">Changes in Mini-XML 1.1</A></H2>
|
||||
<UL>
|
||||
<LI>The mxmlLoadFile() function now uses dynamically allocated string
|
||||
buffers for element names, attribute names, and attribute values.
|
||||
Previously they were capped at 16383, 255, and 255 bytes, respectively.</LI>
|
||||
<LI>Added a new mxmlLoadString() function for loading an XML node tree
|
||||
from a string.</LI>
|
||||
<LI>Added a new mxmlSaveString() function for saving an XML node tree to
|
||||
a string.</LI>
|
||||
<LI>Add emulation of strdup() if the local platform does not provide the
|
||||
function.</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_16">Changes in Mini-XML 1.0</A></H2>
|
||||
<UL>
|
||||
<LI>The mxmldoc program now handles function arguments, structures,
|
||||
unions, enumerations, classes, and typedefs properly.</LI>
|
||||
<LI>Documentation provided via mxmldoc and more in-line comments in the
|
||||
code.</LI>
|
||||
<LI>Added man pages and packaging files.</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_17">Changes in Mini-XML 0.93</A></H2>
|
||||
<UL>
|
||||
<LI>New mxmldoc example program that is also used to create and update
|
||||
code documentation using XML and produce HTML reference pages.</LI>
|
||||
<LI>Added mxmlAdd() and mxmlRemove() functions to add and remove nodes
|
||||
from a tree. This provides more flexibility over where the nodes are
|
||||
inserted and allows nodes to be moved within the tree as needed.</LI>
|
||||
<LI>mxmlLoadFile() now correctly handles comments.</LI>
|
||||
<LI>mxmlLoadFile() now supports the required "gt", "quot", and "nbsp"
|
||||
character entities.</LI>
|
||||
<LI>mxmlSaveFile() now uses newlines as whitespace when valid to do so.</LI>
|
||||
<LI>mxmlFindElement() now also takes attribute name and attribute value
|
||||
string arguments to limit the search to specific elements with
|
||||
attributes and/or values.</LI>
|
||||
NULL pointers can be used as "wildcards".
|
||||
<LI>Added uninstall target to makefile, and auto-reconfig if Makefile.in
|
||||
or configure.in are changed.</LI>
|
||||
<LI>mxmlFindElement(), mxmlWalkNext(), and mxmlWalkPrev() now all
|
||||
provide "descend" arguments to control whether they descend into child
|
||||
nodes in the tree.</LI>
|
||||
<LI>Fixed some whitespace issues in mxmlLoadFile().</LI>
|
||||
<LI>Fixed Unicode output and whitespace issues in mxmlSaveFile().</LI>
|
||||
<LI>mxmlSaveFile() now supports a whitespace callback to provide more
|
||||
human-readable XML output under program control.</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_18">Changes in Mini-XML 0.92</A></H2>
|
||||
<UL>
|
||||
<LI>mxmlSaveFile() didn't return a value on success.</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_19">Changes in Mini-XML 0.91</A></H2>
|
||||
<UL>
|
||||
<LI>mxmlWalkNext() would go into an infinite loop.</LI>
|
||||
</UL>
|
||||
<H2><A NAME="7_20">Changes in Mini-XML 0.9</A></H2>
|
||||
<UL>
|
||||
<LI>Initial public release.</LI>
|
||||
</UL>
|
||||
<HR NOSHADE>
|
||||
<A HREF="index.html">Contents</A>
|
||||
<A HREF="license.html">Previous</A>
|
||||
<A HREF="reference.html">Next</A>
|
||||
</BODY>
|
||||
</HTML>
|
@ -1,223 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Mini-XML Programmers Manual, Version 2.7</TITLE>
|
||||
<META NAME="author" CONTENT="Michael R. Sweet">
|
||||
<META NAME="copyright" CONTENT="Copyright 2003-2011">
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-iso-8859-1">
|
||||
<LINK REL="Start" HREF="index.html">
|
||||
<LINK REL="Contents" HREF="index.html">
|
||||
<LINK REL="Prev" HREF="reference.html">
|
||||
<STYLE TYPE="text/css"><!--
|
||||
BODY { font-family: sans-serif }
|
||||
H1 { font-family: sans-serif }
|
||||
H2 { font-family: sans-serif }
|
||||
H3 { font-family: sans-serif }
|
||||
H4 { font-family: sans-serif }
|
||||
H5 { font-family: sans-serif }
|
||||
H6 { font-family: sans-serif }
|
||||
SUB { font-size: smaller }
|
||||
SUP { font-size: smaller }
|
||||
PRE { font-family: monospace }
|
||||
A { text-decoration: none }
|
||||
--></STYLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<A HREF="index.html">Contents</A>
|
||||
<A HREF="reference.html">Previous</A>
|
||||
<HR NOSHADE>
|
||||
<H1 align="right"><A name="SCHEMA"><IMG align="right" alt="D" height="100"
|
||||
hspace="10" src="D.gif" width="100"></A>XML Schema</H1>
|
||||
<P>This appendix provides the XML schema that is used for the XML files
|
||||
produced by <TT>mxmldoc</TT>. This schema is available on-line at:</P>
|
||||
<PRE>
|
||||
http://www.minixml.org/mxmldoc.xsd
|
||||
</PRE>
|
||||
<H2><A NAME="9_1">mxmldoc.xsd</A></H2>
|
||||
<PRE><SMALL>
|
||||
<?xml version="1.0"?>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation xml:lang="en">
|
||||
Mini-XML 2.7 documentation schema for mxmldoc output.
|
||||
Copyright 2003-2011 by Michael Sweet.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
|
||||
<!-- basic element definitions -->
|
||||
<xsd:element name="argument" type="argumentType"/>
|
||||
<xsd:element name="class" type="classType"/>
|
||||
<xsd:element name="constant" type="constantType"/>
|
||||
<xsd:element name="description" type="xsd:string"/>
|
||||
<xsd:element name="enumeration" type="enumerationType"/>
|
||||
<xsd:element name="function" type="functionType"/>
|
||||
<xsd:element name="mxmldoc" type="mxmldocType"/>
|
||||
<xsd:element name="namespace" type="namespaceType"/>
|
||||
<xsd:element name="returnvalue" type="returnvalueType"/>
|
||||
<xsd:element name="seealso" type="identifierList"/>
|
||||
<xsd:element name="struct" type="structType"/>
|
||||
<xsd:element name="typedef" type="typedefType"/>
|
||||
<xsd:element name="type" type="xsd:string"/>
|
||||
<xsd:element name="union" type="unionType"/>
|
||||
<xsd:element name="variable" type="variableType"/>
|
||||
|
||||
<!-- descriptions of complex elements -->
|
||||
<xsd:complexType name="argumentType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="default" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
<xsd:attribute name="direction" type="direction" use="optional"
|
||||
default="I"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="classType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:element ref="class"/>
|
||||
<xsd:element ref="enumeration"/>
|
||||
<xsd:element ref="function"/>
|
||||
<xsd:element ref="struct"/>
|
||||
<xsd:element ref="typedef"/>
|
||||
<xsd:element ref="union"/>
|
||||
<xsd:element ref="variable"/>
|
||||
</xsd:choice>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
<xsd:attribute name="parent" type="xsd:string" use="optional"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="constantType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="enumerationType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
<xsd:element ref="constant" minOccurs="1" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="functionType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="returnvalue" minOccurs="0" maxOccurs="1"/>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
<xsd:element ref="argument" minOccurs="1" maxOccurs="unbounded"/>
|
||||
<xsd:element ref="seealso" minOccurs="0" maxOccurs="1"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
<xsd:attribute name="scope" type="scope" use="optional"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="mxmldocType">
|
||||
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:element ref="class"/>
|
||||
<xsd:element ref="enumeration"/>
|
||||
<xsd:element ref="function"/>
|
||||
<xsd:element ref="namespace"/>
|
||||
<xsd:element ref="struct"/>
|
||||
<xsd:element ref="typedef"/>
|
||||
<xsd:element ref="union"/>
|
||||
<xsd:element ref="variable"/>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="namespaceType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:element ref="class"/>
|
||||
<xsd:element ref="enumeration"/>
|
||||
<xsd:element ref="function"/>
|
||||
<xsd:element ref="struct"/>
|
||||
<xsd:element ref="typedef"/>
|
||||
<xsd:element ref="union"/>
|
||||
<xsd:element ref="variable"/>
|
||||
</xsd:choice>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="returnvalueType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="structType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:element ref="variable"/>
|
||||
<xsd:element ref="function"/>
|
||||
</xsd:choice>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="typedefType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="unionType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
<xsd:element ref="variable" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="variableType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<!-- data types -->
|
||||
<xsd:simpleType name="direction">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="I"/>
|
||||
<xsd:enumeration value="O"/>
|
||||
<xsd:enumeration value="IO"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
|
||||
<xsd:simpleType name="identifier">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:pattern value="[a-zA-Z_(.]([a-zA-Z_(.,)* 0-9])*"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
|
||||
<xsd:simpleType name="identifierList">
|
||||
<xsd:list itemType="identifier"/>
|
||||
</xsd:simpleType>
|
||||
|
||||
<xsd:simpleType name="scope">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value=""/>
|
||||
<xsd:enumeration value="private"/>
|
||||
<xsd:enumeration value="protected"/>
|
||||
<xsd:enumeration value="public"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:schema>
|
||||
</SMALL></PRE>
|
||||
<HR NOSHADE>
|
||||
<A HREF="index.html">Contents</A>
|
||||
<A HREF="reference.html">Previous</A>
|
||||
</BODY>
|
||||
</HTML>
|
@ -1,267 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// "$Id$"
|
||||
//
|
||||
// Mini-XML documentation page...
|
||||
//
|
||||
|
||||
//
|
||||
// Include necessary headers...
|
||||
//
|
||||
|
||||
include_once "phplib/html.php";
|
||||
include_once "phplib/common.php";
|
||||
|
||||
|
||||
//
|
||||
// Get the web server path information and serve the named file as needed...
|
||||
//
|
||||
|
||||
if (array_key_exists("PATH_INFO", $_SERVER) &&
|
||||
$_SERVER["PATH_INFO"] != "/" &&
|
||||
$_SERVER["PATH_INFO"] != "")
|
||||
{
|
||||
$path = "$_SERVER[PATH_INFO]";
|
||||
|
||||
if (fnmatch("*.gif", $path))
|
||||
$type = "gif";
|
||||
else if (fnmatch("*.jpg", $path))
|
||||
$type = "jpeg";
|
||||
else if (fnmatch("*.png", $path))
|
||||
$type = "png";
|
||||
else
|
||||
$type = "html";
|
||||
|
||||
if (strstr($path, ".."))
|
||||
{
|
||||
if ($type == "html")
|
||||
{
|
||||
html_header("Documentation Error");
|
||||
|
||||
print("<p>The path '$path' is bad.</p>\n");
|
||||
|
||||
html_footer();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$fp = fopen("docfiles$path", "rb");
|
||||
if (!$fp)
|
||||
{
|
||||
if ($type == "html")
|
||||
{
|
||||
html_header("Documentation Error");
|
||||
|
||||
print("<p>Unable to open path '$path'.</p>\n");
|
||||
|
||||
html_footer();
|
||||
}
|
||||
}
|
||||
else if ($type == "html")
|
||||
{
|
||||
html_header("Documentation");
|
||||
|
||||
$saw_body = 0;
|
||||
$last_nav = 0;
|
||||
|
||||
while ($line = fgets($fp, 1024))
|
||||
{
|
||||
if (strstr($line, "<BODY") || strstr($line, "<body"))
|
||||
{
|
||||
$saw_body = 1;
|
||||
}
|
||||
else if (strstr($line, "</BODY>") || strstr($line, "</body>"))
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if ($saw_body)
|
||||
{
|
||||
if (strstr($line, "<A HREF=\"index.html\">Contents</A") ||
|
||||
strstr($line, ">Previous</A>") ||
|
||||
strstr($line, ">Next</A>"))
|
||||
{
|
||||
if ($last_nav)
|
||||
print("·\n");
|
||||
else
|
||||
print("<p class='links'><A HREF='#_USER_COMMENTS'>Comments</a> "
|
||||
."·\n");
|
||||
|
||||
$last_nav = 1;
|
||||
}
|
||||
else if (strstr($line, "<HR"))
|
||||
{
|
||||
if ($last_nav)
|
||||
print("</p>\n");
|
||||
|
||||
$last_nav = 0;
|
||||
$line = "";
|
||||
}
|
||||
|
||||
print($line);
|
||||
}
|
||||
}
|
||||
|
||||
fclose($fp);
|
||||
|
||||
if ($last_nav)
|
||||
print("</p>\n");
|
||||
|
||||
print("<h1><a name='_USER_COMMENTS'>User Comments</a></h1>\n"
|
||||
."<p><a href='$html_path/comment.php?r0+pdocumentation.php$path'>"
|
||||
."Add Comment</a></p>\n");
|
||||
|
||||
$num_comments = show_comments("documentation.php$path");
|
||||
|
||||
if ($num_comments == 0)
|
||||
print("<p>No comments for this page.</p>\n");
|
||||
|
||||
html_footer();
|
||||
}
|
||||
else
|
||||
{
|
||||
header("Content-Type: image/$type");
|
||||
|
||||
print(fread($fp, filesize("docfiles$path")));
|
||||
|
||||
fclose($fp);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
html_header("Documentation");
|
||||
|
||||
if (array_key_exists("CLEAR", $_GET))
|
||||
$q = "";
|
||||
else if (array_key_exists("Q", $_GET))
|
||||
$q = $_GET["Q"];
|
||||
else
|
||||
$q = "";
|
||||
|
||||
$html = htmlspecialchars($q, ENT_QUOTES);
|
||||
|
||||
if (stripos($_SERVER["HTTP_USER_AGENT"], "webkit") !== FALSE)
|
||||
{
|
||||
// Use Safari search box...
|
||||
$search = "<input type='search' name='Q' value='$html' size='50' "
|
||||
."autosave='com.easysw.mxml.search' results='5' "
|
||||
."placeholder='Search'>";
|
||||
}
|
||||
else
|
||||
{
|
||||
// Use standard HTML text field...
|
||||
$search = "<input type='text' name='Q' value='$html' size='40' "
|
||||
."title='Search'> "
|
||||
."<input type='submit' value='Search'> "
|
||||
."<input type='submit' name='CLEAR' value='Clear'>";
|
||||
}
|
||||
|
||||
print("<form action='$PHP_SELF' method='GET'>\n"
|
||||
."<p align='center'>$search</p>\n"
|
||||
."</form>\n");
|
||||
|
||||
if ($q != "")
|
||||
{
|
||||
// Run htmlsearch to search the documentation...
|
||||
$matches = array();
|
||||
$scores = array();
|
||||
$maxscore = 0;
|
||||
$fp = popen("/usr/local/bin/websearch docfiles " . escapeshellarg($q),
|
||||
"r");
|
||||
|
||||
fgets($fp, 1024);
|
||||
|
||||
while ($line = fgets($fp, 1024))
|
||||
{
|
||||
$data = explode("|", $line);
|
||||
$matches[$data[1]] = $data[2];
|
||||
$scores[$data[1]] = $data[0];
|
||||
|
||||
if ($maxscore == 0)
|
||||
$maxscore = $data[0];
|
||||
}
|
||||
|
||||
pclose($fp);
|
||||
|
||||
// Show the results...
|
||||
if (sizeof($matches) == 1)
|
||||
$total = "1 match";
|
||||
else
|
||||
$total = sizeof($matches) . " matches";
|
||||
|
||||
print("<p>$total found:</p>\n"
|
||||
."<table symmary=\"Search Results\">\n");
|
||||
|
||||
reset($matches);
|
||||
foreach ($matches as $file => $text)
|
||||
{
|
||||
$link = "$PHP_SELF/$file";
|
||||
$score = str_repeat("★",
|
||||
(int)(4 * $scores[$file] / $maxscore) + 1);
|
||||
|
||||
print("<tr><td style=\"font-size: 50%;\">$score </td>"
|
||||
."<td><a href='$link'>$text</a></td></tr>\n");
|
||||
}
|
||||
|
||||
print("</table>\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
?>
|
||||
|
||||
<p>You can view the Mini-XML documentation in a single HTML file or in
|
||||
multiple files with comments on-line:</p>
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href='mxml.html'>HTML in one file (169k)</a></li>
|
||||
|
||||
<li><a href='documentation.php/index.html'>HTML in
|
||||
separate files with Comments</a>
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a
|
||||
href='documentation.php/intro.html'>Introduction</a></li>
|
||||
|
||||
<li><a
|
||||
href='documentation.php/install.html'>Building,
|
||||
Installing, and Packaging Mini-XML</a></li>
|
||||
|
||||
<li><a href='documentation.php/basics.html'>Getting
|
||||
Started with Mini-XML</a></li>
|
||||
|
||||
<li><a href='documentation.php/advanced.html'>More
|
||||
Mini-XML Programming Techniques</a></li>
|
||||
|
||||
<li><a href='documentation.php/mxmldoc.html'>Using
|
||||
the mxmldoc Utility</a></li>
|
||||
|
||||
<li><a
|
||||
href='documentation.php/license.html'>Mini-XML
|
||||
License</a></li>
|
||||
|
||||
<li><a
|
||||
href='documentation.php/relnotes.html'>Release
|
||||
Notes</a></li>
|
||||
|
||||
<li><a href='documentation.php/reference.html'>Library
|
||||
Reference</a></li>
|
||||
|
||||
</ul></li>
|
||||
|
||||
</ul>
|
||||
|
||||
<p>You can also get a printed version of the Mini-XML documentation on
|
||||
<a href="http://www.lulu.com/content/820838">Lulu.com</a>.</p>
|
||||
|
||||
<?php
|
||||
}
|
||||
|
||||
html_footer();
|
||||
}
|
||||
|
||||
//
|
||||
// End of "$Id$".
|
||||
//
|
||||
?>
|
1199
www/forums.php
@ -1,2 +0,0 @@
|
||||
DirectoryIndex off
|
||||
|
Before Width: | Height: | Size: 35 B |
Before Width: | Height: | Size: 44 B |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 846 B |
Before Width: | Height: | Size: 84 B |
@ -1,93 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// "$Id$"
|
||||
//
|
||||
// Mini-XML home page...
|
||||
//
|
||||
|
||||
include_once "phplib/html.php";
|
||||
include_once "phplib/common.php";
|
||||
include_once "phplib/poll.php";
|
||||
|
||||
html_header();
|
||||
|
||||
$fp = fopen("data/software.md5", "r");
|
||||
$line = fgets($fp, 255);
|
||||
$data = explode(" ", $line);
|
||||
fclose($fp);
|
||||
|
||||
$version = $data[1];
|
||||
$file = $data[2];
|
||||
|
||||
?>
|
||||
|
||||
<div style='margin-left: 20px; float: right; line-height: 200%;
|
||||
text-align: center;'><a
|
||||
href='software.php?FILE=<?print($file);?>&VERSION=<?print($version);?>'><img
|
||||
src='images/logo-large.gif' width='150' height='150' alt='Mini-XML logo'><br>
|
||||
Download v<?print($version);?></a></div>
|
||||
|
||||
<h1>Mini-XML: Lightweight XML Library</h1>
|
||||
|
||||
<p>Mini-XML is a small XML library that you can use to read and write XML and
|
||||
XML-like data files in your application without requiring large non-standard
|
||||
libraries. Mini-XML only requires an ANSI C compatible compiler (GCC works, as
|
||||
do most vendors' ANSI C compilers) and a 'make' program.</p>
|
||||
|
||||
<p>Mini-XML supports reading of UTF-8 and UTF-16 and writing of UTF-8 encoded
|
||||
XML files and strings. Data is stored in a linked-list tree structure,
|
||||
preserving the XML data hierarchy, and arbitrary element names, attributes,
|
||||
and attribute values are supported with no preset limits, just available
|
||||
memory.</p>
|
||||
|
||||
<table width='100%' cellpadding='0' cellspacing='0' border='0' summary=''>
|
||||
<tr><td valign='top' width='45%'>
|
||||
|
||||
<h2>Documentation</h2>
|
||||
|
||||
<p><a href='documentation.php/intro.html'>Introduction</a></p>
|
||||
|
||||
<p><a href='documentation.php/basics.html'>Getting Started with Mini-XML</a></p>
|
||||
|
||||
<p><a href='documentation.php/advanced.html'>More Mini-XML Programming
|
||||
Techniques</a></p>
|
||||
|
||||
<p><a href='documentation.php/license.html'>Mini-XML License</a></p>
|
||||
|
||||
<p><a href='documentation.php/reference.html'>Library Reference</a></p>
|
||||
|
||||
</td><td> </td><td valign='top' width='55%'>
|
||||
|
||||
<h2>Recent News</h2>
|
||||
|
||||
<?
|
||||
|
||||
$result = db_query("SELECT * FROM article WHERE is_published = 1 "
|
||||
."ORDER BY modify_date DESC LIMIT 3");
|
||||
$count = db_count($result);
|
||||
|
||||
while ($row = db_next($result))
|
||||
{
|
||||
$id = $row['id'];
|
||||
$title = htmlspecialchars($row['title']);
|
||||
$abstract = htmlspecialchars($row['abstract']);
|
||||
$date = date("H:i M d, Y", $row['modify_date']);
|
||||
$count = count_comments("articles.php_L$id");
|
||||
|
||||
if ($count == 1)
|
||||
$count .= " comment";
|
||||
else
|
||||
$count .= " comments";
|
||||
|
||||
print("<p><a href='articles.php?L$id'>$title</a> - $abstract<br>\n"
|
||||
."<span class='dateinfo'>$date, $count</span></p>\n");
|
||||
}
|
||||
|
||||
db_free($result);
|
||||
|
||||
?>
|
||||
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
<? html_footer(); ?>
|
264
www/login.php
@ -1,264 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// "$Id$"
|
||||
//
|
||||
// Login/registration form...
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
// Include necessary headers...
|
||||
//
|
||||
|
||||
include_once "phplib/html.php";
|
||||
include_once "phplib/common.php";
|
||||
|
||||
$usererror = "";
|
||||
|
||||
if (array_key_exists("PAGE", $_GET))
|
||||
$page = $_GET["PAGE"];
|
||||
else if (array_key_exists("PAGE", $_POST))
|
||||
$page = $_POST["PAGE"];
|
||||
else
|
||||
$page = "account.php";
|
||||
|
||||
if ($REQUEST_METHOD == "POST")
|
||||
{
|
||||
if (array_key_exists("USERNAME", $_POST))
|
||||
$username = $_POST["USERNAME"];
|
||||
else
|
||||
$username = "";
|
||||
|
||||
if (array_key_exists("PASSWORD", $_POST))
|
||||
$password = $_POST["PASSWORD"];
|
||||
else
|
||||
$password = "";
|
||||
|
||||
if (array_key_exists("PASSWORD2", $_POST))
|
||||
$password2 = $_POST["PASSWORD2"];
|
||||
else
|
||||
$password2 = "";
|
||||
|
||||
if (array_key_exists("EMAIL", $_POST))
|
||||
$email = $_POST["EMAIL"];
|
||||
else
|
||||
$email = "";
|
||||
|
||||
if (array_key_exists("REGISTER", $_POST))
|
||||
$register = $_POST["REGISTER"];
|
||||
else
|
||||
$register = "";
|
||||
|
||||
if ($username != "" && !eregi("^[-a-z0-9._]+\$", $username))
|
||||
$usererror = "Bad username - only letters, numbers, '.', '-', and '_' "
|
||||
."are allowed!";
|
||||
else if ($argc == 1 && $argv[0] == "A" && $username != "" &&
|
||||
$password != "" && $password == $password2 &&
|
||||
$email != "" && validate_email($email))
|
||||
{
|
||||
// Good new account request so far; see if account already
|
||||
// exists...
|
||||
$name = db_escape($username);
|
||||
$result = db_query("SELECT * FROM users WHERE name='$name'");
|
||||
if (db_count($result) == 0)
|
||||
{
|
||||
// Nope, add unpublished user account and send registration email.
|
||||
db_free($result);
|
||||
|
||||
$hash = md5("$username:$password");
|
||||
$demail = db_escape($email);
|
||||
$date = time();
|
||||
|
||||
db_query("INSERT INTO users VALUES(NULL, 0, '$name', '$demail', '$hash', "
|
||||
."0, $date, '$name', $date, '$name')");
|
||||
|
||||
$userid = db_insert_id();
|
||||
$hash = md5("$userid:$hash");
|
||||
|
||||
mail($email, "$PROJECT_NAME User Registration",
|
||||
wordwrap("Thank you for requesting an account on the $PROJECT_NAME "
|
||||
."home page. To complete your registration, go to the "
|
||||
."following URL:\n\n"
|
||||
." $PHP_URL?E\n\n"
|
||||
."and enter your username ($username), password, and the "
|
||||
."following registration code:\n\n"
|
||||
." $hash\n\n"
|
||||
."You will then be able to access your account.\n"),
|
||||
"From: $PROJECT_EMAIL\r\n");
|
||||
|
||||
html_header("Login Registration");
|
||||
|
||||
html_start_links(1);
|
||||
html_link("Enable Account", "$PHP_SELF?E");
|
||||
html_end_links();
|
||||
|
||||
print("Thank you for requesting an account. You should receive an "
|
||||
."email from $PROJECT_EMAIL shortly with instructions on "
|
||||
."completing your registration.</p>\n");
|
||||
html_footer();
|
||||
exit();
|
||||
}
|
||||
|
||||
db_free($result);
|
||||
|
||||
$usererror = "Username already exists!";
|
||||
}
|
||||
else if ($argc == 1 && $argv[0] == "E" && $username != "" &&
|
||||
$password != "" && $register != "")
|
||||
{
|
||||
// Check that we have an existing user account...
|
||||
$name = db_escape($username);
|
||||
$result = db_query("SELECT * FROM users WHERE name='$name'");
|
||||
if (db_count($result) == 1)
|
||||
{
|
||||
// Yes, now check the registration code...
|
||||
$row = db_next($result);
|
||||
$hash = md5("$row[id]:$row[hash]");
|
||||
|
||||
if ($hash == $register)
|
||||
{
|
||||
// Good code, enable the account and login...
|
||||
db_query("UPDATE users SET is_published = 1 WHERE name='$name'");
|
||||
|
||||
if (auth_login($username, $password) == "")
|
||||
{
|
||||
db_query("UPDATE users SET is_published = 0 WHERE name='$name'");
|
||||
$usererror = "Login failed!";
|
||||
}
|
||||
}
|
||||
else
|
||||
$usererror = "Bad registration code!";
|
||||
}
|
||||
else
|
||||
$usererror = "Username not found!";
|
||||
|
||||
db_free($result);
|
||||
}
|
||||
else if ($argc == 0 && $username != "" && $password != "")
|
||||
if (auth_login($username, $password) == "")
|
||||
$usererror = "Login failed!";
|
||||
}
|
||||
else
|
||||
{
|
||||
$username = "";
|
||||
$password = "";
|
||||
$password2 = "";
|
||||
$email = "";
|
||||
$register = "";
|
||||
}
|
||||
|
||||
if ($LOGIN_USER != "")
|
||||
header("Location: $page");
|
||||
else if ($argc == 0 || $argv[0] != "E")
|
||||
{
|
||||
// Header + start of table...
|
||||
html_header("Login");
|
||||
|
||||
print("<table width='100%' height='100%' border='0' cellpadding='0' "
|
||||
."cellspacing='0'>\n"
|
||||
."<tr><td valign='top'>\n");
|
||||
|
||||
// Existing users...
|
||||
print("<h1>Current Users</h1>\n");
|
||||
|
||||
if ($argc == 0 && $usererror != "")
|
||||
print("<p><b>$usererror</b></p>\n");
|
||||
|
||||
$page = htmlspecialchars($page, ENT_QUOTES);
|
||||
|
||||
print("<p>If you are a registered $PROJECT_NAME developer, please enter "
|
||||
."your username and password to login:</p>\n"
|
||||
."<form method='POST' action='$PHP_SELF'>"
|
||||
."<input type='hidden' name='PAGE' value='$page'>"
|
||||
."<table width='100%'>\n"
|
||||
."<tr><th align='right'>Username:</th>"
|
||||
."<td><input type='text' name='USERNAME' size='16' maxsize='255'");
|
||||
|
||||
if (array_key_exists("USERNAME", $_POST))
|
||||
print(" value='" . htmlspecialchars($_POST["USERNAME"], ENT_QUOTES) . "'");
|
||||
|
||||
print("></td></tr>\n"
|
||||
."<tr><th align='right'>Password:</th>"
|
||||
."<td><input type='password' name='PASSWORD' size='16' maxsize='255'>"
|
||||
."</td></tr>\n"
|
||||
."<tr><th></th><td><input type='submit' value='Login'></td></tr>\n"
|
||||
."</table></form>\n");
|
||||
|
||||
// Separator...
|
||||
print("</td>"
|
||||
."<td> "
|
||||
."<img src='images/black.gif' width='1' height='80%' alt=''>"
|
||||
." </td>"
|
||||
."<td valign='top'>\n");
|
||||
|
||||
// New users...
|
||||
print("<h1>New Users</h1>\n");
|
||||
|
||||
if ($argc == 1 && $usererror != "")
|
||||
print("<p><b>$usererror</b></p>\n");
|
||||
|
||||
$username = htmlspecialchars($username, ENT_QUOTES);
|
||||
$email = htmlspecialchars($email, ENT_QUOTES);
|
||||
|
||||
print("<p>If you are a not registered $PROJECT_NAME developer, please fill "
|
||||
."in the form below to register. An email will be sent to the "
|
||||
."address you supply to confirm the registration:</p>\n"
|
||||
."<form method='POST' action='$PHP_SELF?A'>"
|
||||
."<input type='hidden' name='PAGE' value='$page'>"
|
||||
."<table width='100%'>\n"
|
||||
."<tr><th align='right'>Username:</th>"
|
||||
."<td><input type='text' name='USERNAME' size='16' maxsize='255' "
|
||||
." value='$username'></td></tr>\n"
|
||||
."<tr><th align='right'>EMail:</th>"
|
||||
."<td><input type='text' name='EMAIL' size='16' maxsize='255' "
|
||||
." value='$email'></td></tr>\n"
|
||||
."<tr><th align='right'>Password:</th>"
|
||||
."<td><input type='password' name='PASSWORD' size='16' maxsize='255'>"
|
||||
."</td></tr>\n"
|
||||
."<tr><th align='right'>Password Again:</th>"
|
||||
."<td><input type='password' name='PASSWORD2' size='16' maxsize='255'>"
|
||||
."</td></tr>\n"
|
||||
."<tr><th></th><td><input type='submit' value='Request Account'></td></tr>\n"
|
||||
."</table></form>\n");
|
||||
|
||||
// End table
|
||||
print("</td></tr>\n"
|
||||
."</table>\n");
|
||||
|
||||
html_footer();
|
||||
}
|
||||
else
|
||||
{
|
||||
html_header("Enable Account");
|
||||
|
||||
if ($usererror != NULL)
|
||||
print("<p><b>$usererror</b></p>\n");
|
||||
|
||||
$username = htmlspecialchars($username, ENT_QUOTES);
|
||||
$register = htmlspecialchars($register, ENT_QUOTES);
|
||||
|
||||
print("<p>Please enter the registration code that was emailed to you "
|
||||
."with your username and password to enable your account and login:</p>\n"
|
||||
."<form method='POST' action='$PHP_SELF?E'>"
|
||||
."<center><table width='100%'>\n"
|
||||
."<tr><th align='right'>Registration Code:</th>"
|
||||
."<td><input type='text' name='REGISTER' size='32' maxsize='32' "
|
||||
."value = '$register'>"
|
||||
."</td></tr>\n"
|
||||
."<tr><th align='right'>Username:</th>"
|
||||
."<td><input type='text' name='USERNAME' size='16' maxsize='255' "
|
||||
."value='$username'></td></tr>\n"
|
||||
."<tr><th align='right'>Password:</th>"
|
||||
."<td><input type='password' name='PASSWORD' size='16' maxsize='255'>"
|
||||
."</td></tr>\n"
|
||||
."<tr><th></th><td><input type='submit' value='Enable Account'></td></tr>\n"
|
||||
."</table></center></form>\n");
|
||||
|
||||
html_footer();
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// End of "$Id$".
|
||||
//
|
||||
?>
|
4222
www/mxml.html
189
www/mxmldoc.xsd
@ -1,189 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation xml:lang="en">
|
||||
Mini-XML 2.7 documentation schema for mxmldoc output.
|
||||
Copyright 2003-2011 by Michael Sweet.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
|
||||
<!-- basic element definitions -->
|
||||
<xsd:element name="argument" type="argumentType"/>
|
||||
<xsd:element name="class" type="classType"/>
|
||||
<xsd:element name="constant" type="constantType"/>
|
||||
<xsd:element name="description" type="xsd:string"/>
|
||||
<xsd:element name="enumeration" type="enumerationType"/>
|
||||
<xsd:element name="function" type="functionType"/>
|
||||
<xsd:element name="mxmldoc" type="mxmldocType"/>
|
||||
<xsd:element name="namespace" type="namespaceType"/>
|
||||
<xsd:element name="returnvalue" type="returnvalueType"/>
|
||||
<xsd:element name="seealso" type="identifierList"/>
|
||||
<xsd:element name="struct" type="structType"/>
|
||||
<xsd:element name="typedef" type="typedefType"/>
|
||||
<xsd:element name="type" type="xsd:string"/>
|
||||
<xsd:element name="union" type="unionType"/>
|
||||
<xsd:element name="variable" type="variableType"/>
|
||||
|
||||
<!-- descriptions of complex elements -->
|
||||
<xsd:complexType name="argumentType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="default" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
<xsd:attribute name="direction" type="direction" use="optional" default="I"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="classType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:element ref="class"/>
|
||||
<xsd:element ref="enumeration"/>
|
||||
<xsd:element ref="function"/>
|
||||
<xsd:element ref="struct"/>
|
||||
<xsd:element ref="typedef"/>
|
||||
<xsd:element ref="union"/>
|
||||
<xsd:element ref="variable"/>
|
||||
</xsd:choice>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
<xsd:attribute name="parent" type="xsd:string" use="optional"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="constantType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="enumerationType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
<xsd:element ref="constant" minOccurs="1" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="functionType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="returnvalue" minOccurs="0" maxOccurs="1"/>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
<xsd:element ref="argument" minOccurs="1" maxOccurs="unbounded"/>
|
||||
<xsd:element ref="seealso" minOccurs="0" maxOccurs="1"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
<xsd:attribute name="scope" type="scope" use="optional"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="mxmldocType">
|
||||
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:element ref="class"/>
|
||||
<xsd:element ref="enumeration"/>
|
||||
<xsd:element ref="function"/>
|
||||
<xsd:element ref="namespace"/>
|
||||
<xsd:element ref="struct"/>
|
||||
<xsd:element ref="typedef"/>
|
||||
<xsd:element ref="union"/>
|
||||
<xsd:element ref="variable"/>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="namespaceType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:element ref="class"/>
|
||||
<xsd:element ref="enumeration"/>
|
||||
<xsd:element ref="function"/>
|
||||
<xsd:element ref="struct"/>
|
||||
<xsd:element ref="typedef"/>
|
||||
<xsd:element ref="union"/>
|
||||
<xsd:element ref="variable"/>
|
||||
</xsd:choice>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="returnvalueType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="structType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:element ref="variable"/>
|
||||
<xsd:element ref="function"/>
|
||||
</xsd:choice>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="typedefType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="unionType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
<xsd:element ref="variable" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="variableType">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
|
||||
<xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="identifier" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<!-- data types -->
|
||||
<xsd:simpleType name="direction">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="I"/>
|
||||
<xsd:enumeration value="O"/>
|
||||
<xsd:enumeration value="IO"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
|
||||
<xsd:simpleType name="identifier">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:pattern value="[a-zA-Z_(.]([a-zA-Z_(.,)* 0-9])*"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
|
||||
<xsd:simpleType name="identifierList">
|
||||
<xsd:list itemType="identifier"/>
|
||||
</xsd:simpleType>
|
||||
|
||||
<xsd:simpleType name="scope">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value=""/>
|
||||
<xsd:enumeration value="private"/>
|
||||
<xsd:enumeration value="protected"/>
|
||||
<xsd:enumeration value="public"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:schema>
|
@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:docset="http://developer.apple.com/rss/docset_extensions" xml:lang="en">
|
||||
<id>http://www.minixml.org/org.minixml.atom/20111220234804</id>
|
||||
<title type="text">minixml.org</title>
|
||||
<link rel="self" href="http://www.minixml.org/org.minixml.atom"></link>
|
||||
<updated>2011-12-20T23:48:04-08:00</updated>
|
||||
<entry>
|
||||
<id>tag:www.minixml.org,2011-12-20:org.minixml.docset/2.7.0</id>
|
||||
<title type="text">Mini-XML API Reference</title>
|
||||
<updated>2011-12-20T23:48:04-08:00</updated>
|
||||
<content type="text">Mini-XML API Reference (v2.7.0)</content>
|
||||
<link rel="enclosure" type="application/octet-stream" href="http://www.minixml.org/org.minixml.xar" length="48828"></link>
|
||||
<docset:identifier>org.minixml.docset</docset:identifier>
|
||||
<docset:version>2.7.0</docset:version>
|
||||
</entry>
|
||||
</feed>
|
@ -1,3 +0,0 @@
|
||||
Order deny,allow
|
||||
Allow from none
|
||||
|
@ -1,183 +0,0 @@
|
||||
<?
|
||||
//
|
||||
// "$Id: auth.php,v 1.8 2004/05/20 02:04:45 mike Exp $"
|
||||
//
|
||||
// Authentication functions for PHP pages...
|
||||
//
|
||||
// Contents:
|
||||
//
|
||||
// auth_current() - Return the currently logged in user...
|
||||
// auth_login() - Log a user into the system.
|
||||
// auth_logout() - Logout of the current user by clearing the session ID.
|
||||
// auth_user_email() - Return the email address of a user...
|
||||
//
|
||||
|
||||
//
|
||||
// Include necessary headers...
|
||||
//
|
||||
|
||||
include_once "db.php";
|
||||
|
||||
|
||||
//
|
||||
// Define authorization levels...
|
||||
//
|
||||
|
||||
define("AUTH_USER", 0);
|
||||
define("AUTH_DEVEL", 50);
|
||||
define("AUTH_ADMIN", 100);
|
||||
|
||||
|
||||
//
|
||||
// Store the current user in the global variable LOGIN_USER...
|
||||
//
|
||||
|
||||
$LOGIN_LEVEL = 0;
|
||||
$LOGIN_USER = "";
|
||||
$LOGIN_EMAIL = "";
|
||||
|
||||
auth_current();
|
||||
|
||||
|
||||
//
|
||||
// 'auth_current()' - Return the currently logged in user...
|
||||
//
|
||||
|
||||
function // O - Current username or ""
|
||||
auth_current()
|
||||
{
|
||||
global $_COOKIE, $_SERVER, $LOGIN_EMAIL, $LOGIN_LEVEL, $LOGIN_USER;
|
||||
|
||||
|
||||
// See if the SID cookie is set; if not, the user is not logged in...
|
||||
if (!array_key_exists("SID", $_COOKIE))
|
||||
return ("");
|
||||
|
||||
// Extract the "username:hash" from the SID string...
|
||||
$cookie = explode(':', $_COOKIE["SID"]);
|
||||
|
||||
// Don't allow invalid values...
|
||||
if (count($cookie) != 2)
|
||||
return ("");
|
||||
|
||||
// Lookup the username in the users table and compare...
|
||||
$result = db_query("SELECT * FROM users WHERE "
|
||||
."name='".db_escape($cookie[0])."' AND "
|
||||
."is_published = 1");
|
||||
if (db_count($result) == 1 && ($row = db_next($result)))
|
||||
{
|
||||
// Compute the session ID...
|
||||
$sid = md5("$_SERVER[REMOTE_ADDR]:$row[hash]");
|
||||
|
||||
// See if it matches the cookie value...
|
||||
if ($cookie[1] == $sid)
|
||||
{
|
||||
// Refresh the cookies so they don't expire...
|
||||
setcookie("SID", "$cookie[0]:$sid", time() + 90 * 86400, "/");
|
||||
setcookie("FROM", $row['email'], time() + 90 * 86400, "/");
|
||||
|
||||
// Set globals...
|
||||
$LOGIN_USER = $cookie[0];
|
||||
$LOGIN_LEVEL = $row["level"];
|
||||
$LOGIN_EMAIL = $row["email"];
|
||||
$_COOKIE["FROM"] = $row["email"];
|
||||
|
||||
// Return the current user...
|
||||
return ($cookie[0]);
|
||||
}
|
||||
}
|
||||
|
||||
return ("");
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'auth_login()' - Log a user into the system.
|
||||
//
|
||||
|
||||
function // O - Current username or ""
|
||||
auth_login($name, // I - Username
|
||||
$password) // I - Password
|
||||
{
|
||||
global $_COOKIE, $_SERVER, $LOGIN_EMAIL, $LOGIN_LEVEL, $LOGIN_USER;
|
||||
|
||||
|
||||
// Reset the user...
|
||||
$LOGIN_USER = "";
|
||||
|
||||
// Lookup the username in the database...
|
||||
$result = db_query("SELECT * FROM users WHERE "
|
||||
."name='".db_escape($name)."' AND "
|
||||
."is_published = 1");
|
||||
if (db_count($result) == 1 && ($row = db_next($result)))
|
||||
{
|
||||
// Compute the hash of the name and password...
|
||||
$hash = md5("$name:$password");
|
||||
|
||||
// See if they match...
|
||||
if ($row["hash"] == $hash)
|
||||
{
|
||||
// Update the username and email...
|
||||
$LOGIN_USER = $name;
|
||||
$LOGIN_LEVEL = $row["level"];
|
||||
$LOGIN_EMAIL = $row["email"];
|
||||
$_COOKIE["FROM"] = $row["email"];
|
||||
|
||||
// Compute the session ID...
|
||||
$sid = "$name:" . md5("$_SERVER[REMOTE_ADDR]:$hash");
|
||||
|
||||
// Save the SID and email address cookies...
|
||||
setcookie("SID", $sid, time() + 90 * 86400, "/");
|
||||
setcookie("FROM", $row['email'], time() + 90 * 86400, "/");
|
||||
}
|
||||
}
|
||||
|
||||
return ($LOGIN_USER);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'auth_logout()' - Logout of the current user by clearing the session ID.
|
||||
//
|
||||
|
||||
function
|
||||
auth_logout()
|
||||
{
|
||||
global $LOGIN_EMAIL, $LOGIN_LEVEL, $LOGIN_USER;
|
||||
|
||||
|
||||
$LOGIN_USER = "";
|
||||
$LOGIN_EMAIL = "";
|
||||
$LOGIN_LEVEL = 0;
|
||||
|
||||
setcookie("SID", "", time() + 90 * 86400, "/");
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'auth_user_email()' - Return the email address of a user...
|
||||
//
|
||||
|
||||
function // O - Email address
|
||||
auth_user_email($username) // I - Username
|
||||
{
|
||||
$result = db_query("SELECT * FROM users WHERE "
|
||||
."name = '" . db_escape($username) . "'");
|
||||
if (db_count($result) == 1)
|
||||
{
|
||||
$row = db_next($result);
|
||||
$email = $row["email"];
|
||||
}
|
||||
else
|
||||
$email = "";
|
||||
|
||||
db_free($result);
|
||||
|
||||
return ($email);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// End of "$Id: auth.php,v 1.8 2004/05/20 02:04:45 mike Exp $".
|
||||
//
|
||||
?>
|
@ -1,681 +0,0 @@
|
||||
<?
|
||||
//
|
||||
// "$Id: common.php,v 1.12 2004/05/20 21:37:57 mike Exp $"
|
||||
//
|
||||
// Common utility functions for PHP pages...
|
||||
//
|
||||
// This file should be included using "include_once"...
|
||||
//
|
||||
// Contents:
|
||||
//
|
||||
// abbreviate() - Abbreviate long strings...
|
||||
// format_text() - Convert plain text to HTML...
|
||||
// quote_text() - Quote a string...
|
||||
// sanitize_email() - Convert an email address to something a SPAMbot
|
||||
// can't read...
|
||||
// sanitize_text() - Sanitize text.
|
||||
// select_is_published() - Do a <select> for the "is published" field...
|
||||
// show_comments() - Show comments for the given path...
|
||||
// validate_email() - Validate an email address...
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
// 'abbreviate()' - Abbreviate long strings...
|
||||
//
|
||||
|
||||
function // O - Abbreviated string
|
||||
abbreviate($text, // I - String
|
||||
$maxlen = 32) // I - Maximum length of string
|
||||
{
|
||||
$newtext = "";
|
||||
$textlen = strlen($text);
|
||||
$inelement = 0;
|
||||
|
||||
for ($i = 0, $len = 0; $i < $textlen && $len < $maxlen; $i ++)
|
||||
switch ($text[$i])
|
||||
{
|
||||
case '<' :
|
||||
$inelement = 1;
|
||||
break;
|
||||
|
||||
case '>' :
|
||||
if ($inelement)
|
||||
$inelement = 0;
|
||||
else
|
||||
{
|
||||
$newtext .= ">";
|
||||
$len ++;
|
||||
}
|
||||
break;
|
||||
|
||||
case '&' :
|
||||
$len ++;
|
||||
|
||||
while ($i < $textlen)
|
||||
{
|
||||
$newtext .= $text[$i];
|
||||
|
||||
if ($text[$i] == ';')
|
||||
break;
|
||||
|
||||
$i ++;
|
||||
}
|
||||
break;
|
||||
|
||||
default :
|
||||
if (!$inelement)
|
||||
{
|
||||
$newtext .= $text[$i];
|
||||
$len ++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if ($i < $textlen)
|
||||
return ($newtext . "...");
|
||||
else
|
||||
return ($newtext);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'count_comments()' - Count visible comments for the given path...
|
||||
//
|
||||
|
||||
function // O - Number of comments
|
||||
count_comments($url, // I - URL for comment
|
||||
$parent_id = 0) // I - Parent comment
|
||||
{
|
||||
$result = db_query("SELECT * FROM comment WHERE "
|
||||
."url = '" . db_escape($url) ."' "
|
||||
."AND parent_id = $parent_id "
|
||||
."ORDER BY id");
|
||||
|
||||
$num_comments = 0;
|
||||
|
||||
while ($row = db_next($result))
|
||||
{
|
||||
if ($row["status"] > 0)
|
||||
$num_comments ++;
|
||||
|
||||
$num_comments += count_comments($url, $row['id']);
|
||||
}
|
||||
|
||||
db_free($result);
|
||||
|
||||
return ($num_comments);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'format_text()' - Convert plain text to HTML...
|
||||
//
|
||||
|
||||
function // O - Quoted string
|
||||
format_text($text) // I - Original string
|
||||
{
|
||||
$len = strlen($text);
|
||||
$col = 0;
|
||||
$list = 0;
|
||||
$bold = 0;
|
||||
$pre = 0;
|
||||
$ftext = "<p>";
|
||||
|
||||
for ($i = 0; $i < $len; $i ++)
|
||||
{
|
||||
switch ($text[$i])
|
||||
{
|
||||
case '<' :
|
||||
$col ++;
|
||||
if (strtolower(substr($text, $i, 8)) == "<a href=" ||
|
||||
strtolower(substr($text, $i, 8)) == "<a name=" ||
|
||||
strtolower(substr($text, $i, 4)) == "</a>" ||
|
||||
strtolower(substr($text, $i, 3)) == "<b>" ||
|
||||
strtolower(substr($text, $i, 4)) == "</b>" ||
|
||||
strtolower(substr($text, $i, 12)) == "<blockquote>" ||
|
||||
strtolower(substr($text, $i, 13)) == "</blockquote>" ||
|
||||
strtolower(substr($text, $i, 6)) == "<code>" ||
|
||||
strtolower(substr($text, $i, 7)) == "</code>" ||
|
||||
strtolower(substr($text, $i, 4)) == "<em>" ||
|
||||
strtolower(substr($text, $i, 5)) == "</em>" ||
|
||||
strtolower(substr($text, $i, 4)) == "<h1>" ||
|
||||
strtolower(substr($text, $i, 5)) == "</h1>" ||
|
||||
strtolower(substr($text, $i, 4)) == "<h2>" ||
|
||||
strtolower(substr($text, $i, 5)) == "</h2>" ||
|
||||
strtolower(substr($text, $i, 4)) == "<h3>" ||
|
||||
strtolower(substr($text, $i, 5)) == "</h3>" ||
|
||||
strtolower(substr($text, $i, 4)) == "<h4>" ||
|
||||
strtolower(substr($text, $i, 5)) == "</h4>" ||
|
||||
strtolower(substr($text, $i, 4)) == "<h5>" ||
|
||||
strtolower(substr($text, $i, 5)) == "</h5>" ||
|
||||
strtolower(substr($text, $i, 4)) == "<h6>" ||
|
||||
strtolower(substr($text, $i, 5)) == "</h6>" ||
|
||||
strtolower(substr($text, $i, 3)) == "<i>" ||
|
||||
strtolower(substr($text, $i, 4)) == "</i>" ||
|
||||
strtolower(substr($text, $i, 5)) == "<img " ||
|
||||
strtolower(substr($text, $i, 4)) == "<li>" ||
|
||||
strtolower(substr($text, $i, 5)) == "</li>" ||
|
||||
strtolower(substr($text, $i, 4)) == "<ol>" ||
|
||||
strtolower(substr($text, $i, 5)) == "</ol>" ||
|
||||
strtolower(substr($text, $i, 3)) == "<p>" ||
|
||||
strtolower(substr($text, $i, 4)) == "</p>" ||
|
||||
strtolower(substr($text, $i, 5)) == "<pre>" ||
|
||||
strtolower(substr($text, $i, 6)) == "</pre>" ||
|
||||
strtolower(substr($text, $i, 4)) == "<tt>" ||
|
||||
strtolower(substr($text, $i, 5)) == "</tt>" ||
|
||||
strtolower(substr($text, $i, 3)) == "<u>" ||
|
||||
strtolower(substr($text, $i, 4)) == "</u>" ||
|
||||
strtolower(substr($text, $i, 4)) == "<ul>" ||
|
||||
strtolower(substr($text, $i, 5)) == "</ul>")
|
||||
{
|
||||
while ($i < $len && $text[$i] != '>')
|
||||
{
|
||||
$ftext .= $text[$i];
|
||||
$i ++;
|
||||
}
|
||||
|
||||
$ftext .= ">";
|
||||
}
|
||||
else
|
||||
$ftext .= "<";
|
||||
break;
|
||||
|
||||
case '>' :
|
||||
$col ++;
|
||||
$ftext .= ">";
|
||||
break;
|
||||
|
||||
case '&' :
|
||||
$col ++;
|
||||
$ftext .= "&";
|
||||
break;
|
||||
|
||||
case "\n" :
|
||||
if (($i + 1) < $len &&
|
||||
($text[$i + 1] == "\n" || $text[$i + 1] == "\r"))
|
||||
{
|
||||
while (($i + 1) < $len &&
|
||||
($text[$i + 1] == "\n" || $text[$i + 1] == "\r"))
|
||||
$i ++;
|
||||
|
||||
if ($pre)
|
||||
{
|
||||
$ftext .= "</pre>";
|
||||
$pre = 0;
|
||||
}
|
||||
|
||||
if (($i + 1) < $len && $text[$i + 1] != '-' && $list)
|
||||
{
|
||||
$ftext .= "\n</ul>\n<p>";
|
||||
$list = 0;
|
||||
}
|
||||
else
|
||||
$ftext .= "\n<p>";
|
||||
}
|
||||
else if (($i + 1) < $len &&
|
||||
($text[$i + 1] == " " || $text[$i + 1] == "\t"))
|
||||
{
|
||||
if ($pre)
|
||||
{
|
||||
$ftext .= "</pre>";
|
||||
$pre = 0;
|
||||
}
|
||||
else
|
||||
$ftext .= "<br />\n";
|
||||
}
|
||||
else
|
||||
$ftext .= "\n";
|
||||
|
||||
$col = 0;
|
||||
break;
|
||||
|
||||
case "\r" :
|
||||
break;
|
||||
|
||||
case "\t" :
|
||||
if ($col == 0)
|
||||
$ftext .= " ";
|
||||
else
|
||||
$ftext .= " ";
|
||||
break;
|
||||
|
||||
case " " :
|
||||
if ($col == 0 && !$pre)
|
||||
{
|
||||
for ($j = $i + 1; $j < $len; $j ++)
|
||||
if ($text[$j] != " " && $text[$j] != "\t")
|
||||
break;
|
||||
|
||||
if ($j < $len && $text[$j] == '%')
|
||||
{
|
||||
$ftext .= "\n<pre>";
|
||||
$pre = 1;
|
||||
}
|
||||
|
||||
$ftext .= " ";
|
||||
}
|
||||
else if ($text[$i + 1] == " ")
|
||||
$ftext .= " ";
|
||||
else
|
||||
$ftext .= " ";
|
||||
|
||||
if ($col > 0)
|
||||
$col ++;
|
||||
break;
|
||||
|
||||
case '*' :
|
||||
if ($bold)
|
||||
$ftext .= "</b>";
|
||||
else
|
||||
$ftext .= "<b>";
|
||||
|
||||
$bold = 1 - $bold;
|
||||
break;
|
||||
|
||||
case '-' :
|
||||
// Possible list...
|
||||
if ($col == 0)
|
||||
{
|
||||
if (!$list)
|
||||
{
|
||||
$ftext .= "\n<ul>";
|
||||
$list = 1;
|
||||
}
|
||||
|
||||
$ftext .= "\n<li>";
|
||||
|
||||
while (($i + 1) < $len && $text[$i + 1] == "-")
|
||||
$i ++;
|
||||
break;
|
||||
}
|
||||
|
||||
$col ++;
|
||||
$ftext .= $text[$i];
|
||||
break;
|
||||
|
||||
case 'f' :
|
||||
case 'h' :
|
||||
if (substr($text, $i, 7) == "http://" ||
|
||||
substr($text, $i, 8) == "https://" ||
|
||||
substr($text, $i, 6) == "ftp://")
|
||||
{
|
||||
// Extract the URL and make this a link...
|
||||
for ($j = $i; $j < $len; $j ++)
|
||||
if ($text[$j] == " " || $text[$j] == "\n" || $text[$j] == "\r" ||
|
||||
$text[$j] == "\t" || $text[$j] == "\'" || $text[$j] == "'")
|
||||
break;
|
||||
|
||||
$count = $j - $i;
|
||||
$url = substr($text, $i, $count);
|
||||
$ftext .= "<a href='$url'>$url</a>";
|
||||
$col += $count;
|
||||
$i = $j - 1;
|
||||
break;
|
||||
}
|
||||
|
||||
default :
|
||||
$col ++;
|
||||
$ftext .= $text[$i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($bold)
|
||||
$ftext .= "</b>";
|
||||
|
||||
if ($list)
|
||||
$ftext .= "</ul>";
|
||||
|
||||
if ($pre)
|
||||
$ftext .= "</pre>";
|
||||
|
||||
return ($ftext);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'quote_text()' - Quote a string...
|
||||
//
|
||||
|
||||
function // O - Quoted string
|
||||
quote_text($text, // I - Original string
|
||||
$quote = 0) // I - Add ">" to front of message
|
||||
{
|
||||
$len = strlen($text);
|
||||
$col = 0;
|
||||
|
||||
if ($quote)
|
||||
$qtext = "> ";
|
||||
else
|
||||
$qtext = "";
|
||||
|
||||
for ($i = 0; $i < $len; $i ++)
|
||||
{
|
||||
switch ($text[$i])
|
||||
{
|
||||
case '<' :
|
||||
$col ++;
|
||||
$qtext .= "<";
|
||||
break;
|
||||
|
||||
case '>' :
|
||||
$col ++;
|
||||
$qtext .= ">";
|
||||
break;
|
||||
|
||||
case '&' :
|
||||
$col ++;
|
||||
$qtext .= "&";
|
||||
break;
|
||||
|
||||
case "\n" :
|
||||
if ($quote)
|
||||
$qtext .= "\n> ";
|
||||
else
|
||||
$qtext .= "<br />";
|
||||
|
||||
$col = 0;
|
||||
break;
|
||||
|
||||
case "\r" :
|
||||
break;
|
||||
|
||||
case "\t" :
|
||||
if ($col == 0)
|
||||
$qtext .= " ";
|
||||
else
|
||||
$qtext .= " ";
|
||||
break;
|
||||
|
||||
case " " :
|
||||
if ($col == 0 || $text[$i + 1] == " ")
|
||||
$qtext .= " ";
|
||||
else if ($col > 65 && $quote)
|
||||
{
|
||||
$qtext .= "\n> ";
|
||||
$col = 0;
|
||||
}
|
||||
else
|
||||
$qtext .= " ";
|
||||
|
||||
if ($col > 0)
|
||||
$col ++;
|
||||
break;
|
||||
|
||||
case 'f' :
|
||||
case 'h' :
|
||||
if (substr($text, $i, 7) == "http://" ||
|
||||
substr($text, $i, 8) == "https://" ||
|
||||
substr($text, $i, 6) == "ftp://")
|
||||
{
|
||||
// Extract the URL and make this a link...
|
||||
for ($j = $i; $j < $len; $j ++)
|
||||
if ($text[$j] == " " || $text[$j] == "\n" || $text[$j] == "\r" ||
|
||||
$text[$j] == "\t" || $text[$j] == "\'" || $text[$j] == "'")
|
||||
break;
|
||||
|
||||
$count = $j - $i;
|
||||
$url = substr($text, $i, $count);
|
||||
$qtext .= "<a href='$url'>$url</a>";
|
||||
$col += $count;
|
||||
$i = $j - 1;
|
||||
break;
|
||||
}
|
||||
|
||||
default :
|
||||
$col ++;
|
||||
$qtext .= $text[$i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ($qtext);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'sanitize_email()' - Convert an email address to something a SPAMbot
|
||||
// can't read...
|
||||
//
|
||||
|
||||
function // O - Sanitized email
|
||||
sanitize_email($email, // I - Email address
|
||||
$html = 1) // I - HTML format?
|
||||
{
|
||||
$nemail = "";
|
||||
$len = strlen($email);
|
||||
|
||||
for ($i = 0; $i < $len; $i ++)
|
||||
{
|
||||
switch ($email[$i])
|
||||
{
|
||||
case '@' :
|
||||
if ($i > 0)
|
||||
$i = $len;
|
||||
else if ($html)
|
||||
$nemail .= " <I>at</I> ";
|
||||
else
|
||||
$nemail .= " at ";
|
||||
break;
|
||||
|
||||
case '<' :
|
||||
if ($i > 0)
|
||||
$i = $len;
|
||||
break;
|
||||
|
||||
case '>' :
|
||||
break;
|
||||
|
||||
case '&' ;
|
||||
$nemail .= "&";
|
||||
break;
|
||||
|
||||
default :
|
||||
$nemail .= $email[$i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (trim($nemail));
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'sanitize_text()' - Sanitize text.
|
||||
//
|
||||
|
||||
function // O - Sanitized text
|
||||
sanitize_text($text) // I - Original text
|
||||
{
|
||||
$len = strlen($text);
|
||||
$word = "";
|
||||
$qtext = "";
|
||||
|
||||
for ($i = 0; $i < $len; $i ++)
|
||||
{
|
||||
switch ($text[$i])
|
||||
{
|
||||
case "\n" :
|
||||
if (!strncmp($word, "http://", 7) ||
|
||||
!strncmp($word, "https://", 8) ||
|
||||
!strncmp($word, "ftp://", 6))
|
||||
$qtext .= "<a href='$word'>$word</a>";
|
||||
else if (strchr($word, '@'))
|
||||
$qtext .= sanitize_email($word);
|
||||
else
|
||||
$qtext .= quote_text($word);
|
||||
|
||||
$qtext .= "<br />";
|
||||
$word = "";
|
||||
break;
|
||||
|
||||
case "\r" :
|
||||
break;
|
||||
|
||||
case "\t" :
|
||||
case " " :
|
||||
if (!strncmp($word, "http://", 7) ||
|
||||
!strncmp($word, "https://", 8) ||
|
||||
!strncmp($word, "ftp://", 6))
|
||||
$qtext .= "<a href='$word'>$word</a>";
|
||||
else if (strchr($word, '@'))
|
||||
$qtext .= sanitize_email($word);
|
||||
else
|
||||
$qtext .= quote_text($word);
|
||||
|
||||
if ($word)
|
||||
$qtext .= " ";
|
||||
else
|
||||
$qtext .= " ";
|
||||
|
||||
$word = "";
|
||||
break;
|
||||
|
||||
default :
|
||||
$word .= $text[$i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!strncmp($word, "http://", 7) ||
|
||||
!strncmp($word, "https://", 8) ||
|
||||
!strncmp($word, "ftp://", 6))
|
||||
$qtext .= "<a href='$word'>$word</a>";
|
||||
else if (strchr($word, '@'))
|
||||
$qtext .= sanitize_email($word);
|
||||
else
|
||||
$qtext .= quote_text($word);
|
||||
|
||||
return ($qtext);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'select_is_published()' - Do a <select> for the "is published" field...
|
||||
//
|
||||
|
||||
function
|
||||
select_is_published($is_published = 1) // I - Default state
|
||||
{
|
||||
print("<select name='IS_PUBLISHED'>");
|
||||
if ($is_published)
|
||||
{
|
||||
print("<option value='0'>No</option>");
|
||||
print("<option value='1' selected>Yes</option>");
|
||||
}
|
||||
else
|
||||
{
|
||||
print("<option value='0' selected>No</option>");
|
||||
print("<option value='1'>Yes</option>");
|
||||
}
|
||||
print("</select>");
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'show_comments()' - Show comments for the given path...
|
||||
//
|
||||
|
||||
function // O - Number of comments
|
||||
show_comments($url, // I - URL for comment
|
||||
$path = "", // I - Path component
|
||||
$parent_id = 0, // I - Parent comment
|
||||
$heading = 3) // I - Heading level
|
||||
{
|
||||
global $_COOKIE, $LOGIN_LEVEL;
|
||||
|
||||
|
||||
$result = db_query("SELECT * FROM comment WHERE "
|
||||
."url = '" . db_escape($url) ."' "
|
||||
."AND parent_id = $parent_id "
|
||||
."ORDER BY id");
|
||||
|
||||
if (array_key_exists("MODPOINTS", $_COOKIE))
|
||||
$modpoints = $_COOKIE["MODPOINTS"];
|
||||
else
|
||||
$modpoints = 5;
|
||||
|
||||
if ($parent_id == 0 && $modpoints > 0)
|
||||
print("<P>You have $modpoints moderation points available.</P>\n");
|
||||
|
||||
if ($heading > 6)
|
||||
$heading = 6;
|
||||
|
||||
$safeurl = urlencode($url);
|
||||
$num_comments = 0;
|
||||
$div = 0;
|
||||
|
||||
while ($row = db_next($result))
|
||||
{
|
||||
if ($row["status"] > 0)
|
||||
{
|
||||
if ($heading > 3 && !$div)
|
||||
{
|
||||
print("<div style='margin-left: 3em;'>\n");
|
||||
$div = 1;
|
||||
}
|
||||
|
||||
$num_comments ++;
|
||||
|
||||
$create_date = date("H:i M d, Y", $row['create_date']);
|
||||
$create_user = sanitize_email($row['create_user']);
|
||||
$contents = format_text($row['contents']);
|
||||
|
||||
print("<h$heading><a name='_USER_COMMENT_$row[id]'>From</a> "
|
||||
."$create_user, $create_date (score=$row[status])</h$heading>\n"
|
||||
."$contents\n");
|
||||
|
||||
html_start_links();
|
||||
|
||||
if ($LOGIN_LEVEL >= AUTH_DEVEL)
|
||||
{
|
||||
html_link("Edit", "${path}comment.php?e$row[id]+p$safeurl");
|
||||
html_link("Delete", "${path}comment.php?d$row[id]+p$safeurl");
|
||||
}
|
||||
|
||||
html_link("Reply", "${path}comment.php?r$row[id]+p$safeurl");
|
||||
|
||||
if ($modpoints > 0)
|
||||
{
|
||||
if ($row['status'] > 0)
|
||||
html_link("Moderate Down", "${path}comment.php?md$row[id]+p$safeurl");
|
||||
|
||||
if ($row['status'] < 5)
|
||||
html_link("Moderate Up", "${path}comment.php?mu$row[id]+p$safeurl");
|
||||
}
|
||||
|
||||
html_end_links();
|
||||
}
|
||||
|
||||
$num_comments += show_comments($url, $path, $row['id'], $heading + 1);
|
||||
}
|
||||
|
||||
db_free($result);
|
||||
|
||||
if ($div)
|
||||
print("</div>\n");
|
||||
|
||||
return ($num_comments);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'validate_email()' - Validate an email address...
|
||||
//
|
||||
|
||||
function // O - TRUE if OK, FALSE otherwise
|
||||
validate_email($email) // I - Email address
|
||||
{
|
||||
// Check for both "name@domain.com" and "Full Name <name@domain.com>"
|
||||
return (eregi("^[a-zA-Z0-9_\.+-]+@[a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4}$",
|
||||
$email) ||
|
||||
eregi("^[^<]*<[a-zA-Z0-9_\.+-]+@[a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4}>$",
|
||||
$email));
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// End of "$Id: common.php,v 1.12 2004/05/20 21:37:57 mike Exp $".
|
||||
//
|
||||
?>
|
@ -1,159 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// "$Id: db.php,v 1.5 2004/05/21 03:59:17 mike Exp $"
|
||||
//
|
||||
// Common database include file for PHP web pages. This file can be used
|
||||
// to abstract the specific database in use...
|
||||
//
|
||||
// This version is for the SQLite database and module.
|
||||
//
|
||||
// This file should be included using "include_once"...
|
||||
//
|
||||
// Contents:
|
||||
//
|
||||
// db_close() - Close the database.
|
||||
// db_count() - Return the number of rows in a query result.
|
||||
// db_escape() - Escape special chars in string for query.
|
||||
// db_free() - Free a database query result...
|
||||
// db_insert_id() - Return the ID of the last inserted record.
|
||||
// db_next() - Fetch the next row of a result set and return it as
|
||||
// an object.
|
||||
// db_query() - Run a SQL query and return the result or 0 on error.
|
||||
// db_seek() - Seek to a specific row within a result.
|
||||
//
|
||||
|
||||
// Some static database access info.
|
||||
$DB_ADMIN = "webmaster@easysw.com";
|
||||
$DB_HOST = "localhost";
|
||||
$DB_NAME = "mxml";
|
||||
$DB_USER = "mike";
|
||||
$DB_PASSWORD = "";
|
||||
|
||||
//
|
||||
// Connect to the MySQL server using DB_HOST, DB_USER, DB_PASSWORD
|
||||
// that are set above...
|
||||
//
|
||||
|
||||
$DB_CONN = mysql_connect($DB_HOST, $DB_USER, $DB_PASSWORD);
|
||||
|
||||
if ($DB_CONN)
|
||||
{
|
||||
// Connected to server; select the database...
|
||||
mysql_select_db($DB_NAME, $DB_CONN);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Unable to connect; display an error message...
|
||||
$sqlerrno = mysql_errno();
|
||||
$sqlerr = mysql_error();
|
||||
|
||||
print("<p>Database error $sqlerrno: $sqlerr</p>\n");
|
||||
print("<p>Please report the problem to <a href='mailto:webmaster@easysw.com'>"
|
||||
."webmaster@easysw.com</a>.</p>\n");
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'db_count()' - Return the number of rows in a query result.
|
||||
//
|
||||
|
||||
function // O - Number of rows in result
|
||||
db_count($result) // I - Result of query
|
||||
{
|
||||
if ($result)
|
||||
return (mysql_num_rows($result));
|
||||
else
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'db_escape()' - Escape special chars in string for query.
|
||||
//
|
||||
|
||||
function // O - Quoted string
|
||||
db_escape($str) // I - String
|
||||
{
|
||||
return (mysql_escape_string($str));
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'db_free()' - Free a database query result...
|
||||
//
|
||||
|
||||
function
|
||||
db_free($result) // I - Result of query
|
||||
{
|
||||
if ($result)
|
||||
mysql_free_result($result);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'db_insert_id()' - Return the ID of the last inserted record.
|
||||
//
|
||||
|
||||
function // O - ID number
|
||||
db_insert_id()
|
||||
{
|
||||
global $DB_CONN;
|
||||
|
||||
return (mysql_insert_id($DB_CONN));
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'db_next()' - Fetch the next row of a result set and return it as an object.
|
||||
//
|
||||
|
||||
function // O - Row object or NULL at end
|
||||
db_next($result) // I - Result of query
|
||||
{
|
||||
if ($result)
|
||||
return (mysql_fetch_array($result));
|
||||
else
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'db_query()' - Run a SQL query and return the result or 0 on error.
|
||||
//
|
||||
|
||||
function // O - Result of query or NULL
|
||||
db_query($SQL_QUERY) // I - SQL query string
|
||||
{
|
||||
global $DB_NAME, $DB_CONN;
|
||||
|
||||
return (mysql_query($SQL_QUERY, $DB_CONN));
|
||||
|
||||
// print("<p>SQL_QUERY: $SQL_QUERY</p>\n");
|
||||
//
|
||||
// $result = mysql_query($SQL_QUERY, $DB_CONN);
|
||||
// $count = db_count($result);
|
||||
// print("<p>Result = $count rows...</p>\n");
|
||||
//
|
||||
// return ($result);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'db_seek()' - Seek to a specific row within a result.
|
||||
//
|
||||
|
||||
function // O - TRUE on success, FALSE otherwise
|
||||
db_seek($result, // I - Result of query
|
||||
$index = 0) // I - Row number (0 = first row)
|
||||
{
|
||||
if ($result)
|
||||
return (mysql_data_seek($result, $index));
|
||||
else
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// End of "$Id: db.php,v 1.5 2004/05/21 03:59:17 mike Exp $".
|
||||
//
|
||||
?>
|
@ -1,49 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// "$Id$"
|
||||
//
|
||||
// Global PHP constants and variables...
|
||||
//
|
||||
// This file should be included using "include_once"...
|
||||
//
|
||||
|
||||
//
|
||||
// Global vars...
|
||||
//
|
||||
|
||||
$PROJECT_NAME = "Mini-XML"; // Title of project
|
||||
$PROJECT_EMAIL = "webmaster@minixml.org";
|
||||
// Default notification address
|
||||
$PROJECT_REGISTER = "webmaster@minixml.org";
|
||||
// User registration email
|
||||
$PROJECT_MODULE = "mxml"; // CVS module
|
||||
$PAGE_MAX = 10; // Max items per page
|
||||
|
||||
|
||||
//
|
||||
// PHP transition stuff...
|
||||
//
|
||||
|
||||
global $_COOKIE, $_FILES, $_POST, $_SERVER;
|
||||
|
||||
$argc = $_SERVER["argc"];
|
||||
$argv = $_SERVER["argv"];
|
||||
$REQUEST_METHOD = $_SERVER["REQUEST_METHOD"];
|
||||
$SERVER_NAME = $_SERVER["SERVER_NAME"];
|
||||
$REMOTE_ADDR = $_SERVER["REMOTE_ADDR"];
|
||||
|
||||
// Handle PHP_SELF differently - we need to quote it properly...
|
||||
if (array_key_exists("PHP_SELF", $_SERVER))
|
||||
$PHP_SELF = htmlspecialchars($_SERVER["PHP_SELF"], ENT_QUOTES);
|
||||
else
|
||||
$PHP_SELF = "";
|
||||
|
||||
if (array_key_exists("ISHTTPS", $_SERVER))
|
||||
$PHP_URL = "https://$_SERVER[SERVER_NAME]$_SERVER[PHP_SELF]";
|
||||
else
|
||||
$PHP_URL = "http://$_SERVER[SERVER_NAME]:$_SERVER[SERVER_PORT]$_SERVER[PHP_SELF]";
|
||||
|
||||
//
|
||||
// End of "$Id$".
|
||||
//
|
||||
?>
|
@ -1,465 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// "$Id$"
|
||||
//
|
||||
// PHP functions for standardized HTML output...
|
||||
//
|
||||
// This file should be included using "include_once"...
|
||||
//
|
||||
// Contents:
|
||||
//
|
||||
// html_header() - Show the standard page header and navbar...
|
||||
// html_footer() - Show the standard footer for a page.
|
||||
// html_start_links() - Start of series of hyperlinks.
|
||||
// html_end_links() - End of series of hyperlinks.
|
||||
// html_link() - Show a single hyperlink.
|
||||
// html_links() - Show an array of links.
|
||||
// html_start_box() - Start a rounded, shaded box.
|
||||
// html_end_box() - End a rounded, shaded box.
|
||||
// html_start_table() - Start a rounded, shaded table.
|
||||
// html_end_table() - End a rounded, shaded table.
|
||||
// html_start_row() - Start a table row.
|
||||
// html_end_row() - End a table row.
|
||||
// html_search_words() - Generate an array of search words.
|
||||
// html_select_is_published() - Do a <select> for the "is published" field...
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
// Include necessary headers...
|
||||
//
|
||||
|
||||
include_once "globals.php";
|
||||
include_once "auth.php";
|
||||
|
||||
|
||||
// Check for a logout on the command-line...
|
||||
if ($argc == 1 && $argv[0] == "logout")
|
||||
{
|
||||
auth_logout();
|
||||
$argc = 0;
|
||||
}
|
||||
|
||||
|
||||
// Search keywords...
|
||||
$html_keywords = array(
|
||||
"documentation",
|
||||
"functions",
|
||||
"library",
|
||||
"linux",
|
||||
"macos x",
|
||||
"mini-xml",
|
||||
"mxml",
|
||||
"mxmldoc",
|
||||
"software",
|
||||
"unix",
|
||||
"windows",
|
||||
"xml"
|
||||
);
|
||||
|
||||
// Figure out the base path...
|
||||
$html_path = dirname($PHP_SELF);
|
||||
|
||||
if (array_key_exists("PATH_INFO", $_SERVER))
|
||||
{
|
||||
$i = -1;
|
||||
while (($i = strpos($_SERVER["PATH_INFO"], "/", $i + 1)) !== FALSE)
|
||||
$html_path = dirname($html_path);
|
||||
}
|
||||
|
||||
if ($html_path == "/")
|
||||
$html_path = "";
|
||||
|
||||
|
||||
//
|
||||
// 'html_header()' - Show the standard page header and navbar...
|
||||
//
|
||||
|
||||
function // O - User information
|
||||
html_header($title = "", // I - Additional document title
|
||||
$refresh = "") // I - Refresh URL
|
||||
{
|
||||
global $html_keywords, $html_path, $_GET, $LOGIN_USER, $PHP_SELF, $_SERVER;
|
||||
|
||||
|
||||
// Common stuff...
|
||||
// header("Cache-Control: no-cache");
|
||||
|
||||
print("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN' "
|
||||
."'http://www.w3.org/TR/REC-html40/loose.dtd'>\n");
|
||||
print("<html>\n");
|
||||
print("<head>\n");
|
||||
|
||||
// Title...
|
||||
if ($title != "")
|
||||
$html_title = "$title -";
|
||||
else
|
||||
$html_title = "";
|
||||
|
||||
print(" <title>$html_title Mini-XML</title>\n"
|
||||
." <meta http-equiv='Pragma' content='no-cache'>\n"
|
||||
." <meta http-equiv='Content-Type' content='text/html; "
|
||||
."charset=utf-8'>\n"
|
||||
." <link rel='stylesheet' type='text/css' href='$html_path/style.css'>\n"
|
||||
." <link rel='shortcut icon' href='$html_path/images/logo.gif' "
|
||||
."type='image/x-icon'>\n");
|
||||
|
||||
// If refresh URL is specified, add the META tag...
|
||||
if ($refresh != "")
|
||||
print(" <meta http-equiv='refresh' content='3; $refresh'>\n");
|
||||
|
||||
// Search engine keywords...
|
||||
reset($html_keywords);
|
||||
|
||||
list($key, $val) = each($html_keywords);
|
||||
print("<meta name='keywords' content='$val");
|
||||
|
||||
while (list($key, $val) = each($html_keywords))
|
||||
print(",$val");
|
||||
|
||||
print("'>\n");
|
||||
|
||||
print("</head>\n"
|
||||
."<body>\n");
|
||||
|
||||
// Standard navigation stuff...
|
||||
if (array_key_exists("Q", $_GET))
|
||||
$q = htmlspecialchars($_GET["Q"], ENT_QUOTES);
|
||||
else
|
||||
$q = "";
|
||||
|
||||
if (stripos($_SERVER["HTTP_USER_AGENT"], "webkit") !== FALSE)
|
||||
{
|
||||
// Use Safari search box...
|
||||
$search = "<input type='search' name='Q' value='$q' size='25' "
|
||||
."autosave='com.easysw.mxml.search' results='5' "
|
||||
."placeholder='Search'>";
|
||||
}
|
||||
else
|
||||
{
|
||||
// Use standard HTML text field...
|
||||
$search = "<input type='text' name='Q' value='$q' size='15' "
|
||||
."title='Search'><input type='submit' value='Search'>";
|
||||
}
|
||||
|
||||
$classes = array("unsel", "unsel", "unsel", "unsel", "unsel", "unsel");
|
||||
if (strpos($PHP_SELF, "/account.php") !== FALSE ||
|
||||
strpos($PHP_SELF, "/login.php") !== FALSE)
|
||||
$classes[0] = "sel";
|
||||
else if (strpos($PHP_SELF, "/str.php") !== FALSE)
|
||||
$classes[2] = "sel";
|
||||
else if (strpos($PHP_SELF, "/documentation.php") !== FALSE ||
|
||||
strpos($PHP_SELF, "/account.php") !== FALSE)
|
||||
$classes[3] = "sel";
|
||||
else if (strpos($PHP_SELF, "/software.php") !== FALSE)
|
||||
$classes[4] = "sel";
|
||||
else if (strpos($PHP_SELF, "/forums.php") !== FALSE)
|
||||
$classes[5] = "sel";
|
||||
else
|
||||
$classes[1] = "sel";
|
||||
|
||||
print("<table width='100%' style='height: 100%;' border='0' cellspacing='0' "
|
||||
."cellpadding='0' summary=''>\n"
|
||||
."<tr>"
|
||||
."<td class='unsel'><img src='$html_path/images/logo.gif' width='32' "
|
||||
."height='32' alt=''></td>"
|
||||
."<td class='$classes[0]'>");
|
||||
|
||||
if ($LOGIN_USER)
|
||||
print("<a href='$html_path/account.php'>$LOGIN_USER</a>");
|
||||
else
|
||||
print("<a href='$html_path/login.php'>Login</a>");
|
||||
|
||||
print("</td>"
|
||||
."<td class='$classes[1]'><a href='$html_path/index.php'>Home</a></td>"
|
||||
."<td class='$classes[2]'><a href='$html_path/str.php'>Bugs & Features</a></td>"
|
||||
."<td class='$classes[3]'><a href='$html_path/documentation.php'>Documentation</a></td>"
|
||||
."<td class='$classes[4]'><a href='$html_path/software.php'>Download</a></td>"
|
||||
."<td class='$classes[5]'><a href='$html_path/forums.php'>Forums</a></td>"
|
||||
."<td class='unsel' align='right' width='100%'>"
|
||||
."<form action='$html_path/documentation.php' method='GET'>"
|
||||
."$search</form></td>"
|
||||
."</tr>\n"
|
||||
."<tr><td class='page' colspan='8'>");
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'html_footer()' - Show the standard footer for a page.
|
||||
//
|
||||
|
||||
function
|
||||
html_footer()
|
||||
{
|
||||
print("</td></tr>\n"
|
||||
."<td class='footer' colspan='8'>"
|
||||
."Copyright 2003-2011 by Michael Sweet. This library is free "
|
||||
."software; you can redistribute it and/or modify it "
|
||||
."under the terms of the <a href='$html_path/docfiles/license.html'>"
|
||||
."Mini-XML License</a>.</td></tr>\n"
|
||||
."</table>\n"
|
||||
."</body>\n"
|
||||
."</html>\n");
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'html_start_links()' - Start of series of hyperlinks.
|
||||
//
|
||||
|
||||
function
|
||||
html_start_links($center = FALSE) // I - Center links?
|
||||
{
|
||||
global $html_firstlink;
|
||||
|
||||
$html_firstlink = 1;
|
||||
|
||||
if ($center)
|
||||
print("<p class='links'>");
|
||||
else
|
||||
print("<p>");
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'html_end_links()' - End of series of hyperlinks.
|
||||
//
|
||||
|
||||
function
|
||||
html_end_links()
|
||||
{
|
||||
print("</p>\n");
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'html_link()' - Show a single hyperlink.
|
||||
//
|
||||
|
||||
function
|
||||
html_link($text, // I - Text for hyperlink
|
||||
$link) // I - URL for hyperlink
|
||||
{
|
||||
global $html_firstlink;
|
||||
|
||||
if ($html_firstlink)
|
||||
$html_firstlink = 0;
|
||||
else
|
||||
print(" · ");
|
||||
|
||||
$safetext = str_replace(" ", " ", $text);
|
||||
|
||||
print("<a href='$link'>$safetext</a>");
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'html_links()' - Show an array of links.
|
||||
//
|
||||
|
||||
function
|
||||
html_links($links) // I - Associated array of hyperlinks
|
||||
{
|
||||
reset($links);
|
||||
while (list($key, $val) = each($links))
|
||||
html_link($key, $val);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'html_start_table()' - Start a rounded, shaded table.
|
||||
//
|
||||
|
||||
function
|
||||
html_start_table($headings, // I - Array of heading strings
|
||||
$width = "100%", // I - Width of table
|
||||
$height = "") // I - Height of table
|
||||
{
|
||||
global $html_row;
|
||||
|
||||
|
||||
print("<table class='standard'");
|
||||
if ($width != "")
|
||||
print(" width='$width'");
|
||||
if ($height != "")
|
||||
print(" style='height: $height'");
|
||||
print(" summary=''>"
|
||||
."<tr class='header'>");
|
||||
|
||||
$html_row = 0;
|
||||
|
||||
reset($headings);
|
||||
for ($i = 0; $i < count($headings); $i ++)
|
||||
{
|
||||
//
|
||||
// Headings can be in the following forms:
|
||||
//
|
||||
// Mix and match as needed:
|
||||
//
|
||||
// "xxxxxxxx" -- Just a column heading.
|
||||
// "xxxxxxxx:aa" -- Heading with align.
|
||||
// "xxxxxxxx::cc" -- Heading with a colspan.
|
||||
// "xxxxxxxx:::ww" -- Heading with a width.
|
||||
// "xxxxxxxx::cc:ww" -- Heading with colspan and width.
|
||||
// "xxxxxxxx:aa:cc:ww" -- Heading with align, colspan and width.
|
||||
//
|
||||
// etc, etc.
|
||||
//
|
||||
|
||||
$s_header = "";
|
||||
$s_colspan = "";
|
||||
$s_width = "";
|
||||
$s_align = "";
|
||||
|
||||
if (strstr($headings[$i], ":"))
|
||||
{
|
||||
$data = explode(":", $headings[$i]);
|
||||
$s_header = $data[0];
|
||||
|
||||
if ($data[1] != "")
|
||||
$s_align = "align=$data[1]";
|
||||
|
||||
if ($data[2] > 1)
|
||||
$s_colspan = "colspan=$data[2]";
|
||||
|
||||
if ($data[3] > 0)
|
||||
$s_width = "width=$data[3]%";
|
||||
}
|
||||
else
|
||||
$s_header = $headings[$i];
|
||||
|
||||
if (strlen($s_header))
|
||||
print("<th $s_align $s_colspan $s_width>$s_header</th>");
|
||||
else
|
||||
print("<th $s_colspan $s_width> </th>");
|
||||
}
|
||||
|
||||
print("</tr>\n");
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'html_end_table()' - End a rounded, shaded table.
|
||||
//
|
||||
|
||||
function
|
||||
html_end_table()
|
||||
{
|
||||
print("</table>\n");
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'html_start_row()' - Start a table row.
|
||||
//
|
||||
|
||||
function
|
||||
html_start_row($classname = "") // I - HTML class to use
|
||||
{
|
||||
global $html_row;
|
||||
|
||||
if ($classname == "")
|
||||
$classname = "data$html_row";
|
||||
else
|
||||
$html_row = 1 - $html_row;
|
||||
|
||||
print("<tr class='$classname'>");
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'html_end_row()' - End a table row.
|
||||
//
|
||||
|
||||
function
|
||||
html_end_row()
|
||||
{
|
||||
global $html_row;
|
||||
|
||||
$html_row = 1 - $html_row;
|
||||
|
||||
print("</tr>\n");
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'html_search_words()' - Generate an array of search words.
|
||||
//
|
||||
|
||||
function // O - Array of words
|
||||
html_search_words($search = "") // I - Search string
|
||||
{
|
||||
$words = array();
|
||||
$temp = "";
|
||||
$len = strlen($search);
|
||||
|
||||
for ($i = 0; $i < $len; $i ++)
|
||||
{
|
||||
switch ($search[$i])
|
||||
{
|
||||
case "\"" :
|
||||
if ($temp != "")
|
||||
{
|
||||
$words[sizeof($words)] = strtolower($temp);
|
||||
$temp = "";
|
||||
}
|
||||
|
||||
$i ++;
|
||||
|
||||
while ($i < $len && $search[$i] != "\"")
|
||||
{
|
||||
$temp .= $search[$i];
|
||||
$i ++;
|
||||
}
|
||||
|
||||
$words[sizeof($words)] = strtolower($temp);
|
||||
$temp = "";
|
||||
break;
|
||||
|
||||
case " " :
|
||||
case "\t" :
|
||||
case "\n" :
|
||||
if ($temp != "")
|
||||
{
|
||||
$words[sizeof($words)] = strtolower($temp);
|
||||
$temp = "";
|
||||
}
|
||||
break;
|
||||
|
||||
default :
|
||||
$temp .= $search[$i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($temp != "")
|
||||
$words[sizeof($words)] = strtolower($temp);
|
||||
|
||||
return ($words);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'html_select_is_published()' - Do a <select> for the "is published" field...
|
||||
//
|
||||
|
||||
function
|
||||
html_select_is_published($is_published = 1)
|
||||
// I - Default state
|
||||
{
|
||||
print("<select name='is_published'>");
|
||||
if ($is_published)
|
||||
{
|
||||
print("<option value='0'>No</option>");
|
||||
print("<option value='1' selected>Yes</option>");
|
||||
}
|
||||
else
|
||||
{
|
||||
print("<option value='0' selected>No</option>");
|
||||
print("<option value='1'>Yes</option>");
|
||||
}
|
||||
print("</select>");
|
||||
}
|
||||
|
||||
|
||||
?>
|
@ -1,71 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// "$Id$"
|
||||
//
|
||||
// Mirror selection functions (depends on GeoIP PECL interface).
|
||||
//
|
||||
// Contents:
|
||||
//
|
||||
// mirror_closest() - Return the closest mirror to the current IP.
|
||||
//
|
||||
|
||||
//
|
||||
// List of download servers...
|
||||
//
|
||||
|
||||
$MIRRORS = array(
|
||||
"http://ftp.easysw.com/pub" => array("California, USA", 37.7898, -122.3942),
|
||||
"http://ftp2.easysw.com/pub" => array("New Jersey, USA", 40.4619, -74.3561),
|
||||
"http://ftp.funet.fi/pub/mirrors/ftp.easysw.com/pub" => array("Espoo, Finland", 60.2167, 24.6667),
|
||||
"http://ftp.rz.tu-bs.de/pub/mirror/ftp.easysw.com/ftp/pub" => array("Braunschweig, Germany", 52.2667, 10.5333),
|
||||
);
|
||||
|
||||
|
||||
//
|
||||
// 'mirror_closest()' - Return the closest mirror to the current IP.
|
||||
//
|
||||
|
||||
function // O - Closest mirror
|
||||
mirror_closest()
|
||||
{
|
||||
global $_SERVER, $MIRRORS;
|
||||
|
||||
|
||||
// Get the current longitude for the client...
|
||||
if (!extension_loaded("geoip.so") ||
|
||||
$_SERVER["REMOTE_ADDR"] == "::1" ||
|
||||
$_SERVER["REMOTE_ADDR"] == "127.0.0.1")
|
||||
$lon = -120;
|
||||
else
|
||||
{
|
||||
$current = geoip_record_by_name($_SERVER["REMOTE_ADDR"]);
|
||||
$lon = $current["longitude"];
|
||||
}
|
||||
|
||||
// Loop through the mirrors to find the closest one, currently just using
|
||||
// the longitude...
|
||||
$closest_mirror = "";
|
||||
$closest_distance = 999;
|
||||
|
||||
reset($MIRRORS);
|
||||
foreach ($MIRRORS as $mirror => $data)
|
||||
{
|
||||
$distance = abs($lon - $data[2]);
|
||||
if ($distance > 180)
|
||||
$distance = 360 - $distance;
|
||||
|
||||
if ($distance < $closest_distance)
|
||||
{
|
||||
$closest_mirror = $mirror;
|
||||
$closest_distance = $distance;
|
||||
}
|
||||
}
|
||||
|
||||
return ($closest_mirror);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// End of "$Id$".
|
||||
//
|
||||
?>
|
@ -1,114 +0,0 @@
|
||||
<?
|
||||
//
|
||||
// "$Id: poll.php,v 1.1 2004/05/20 03:38:42 mike Exp $"
|
||||
//
|
||||
// Common poll interface functions...
|
||||
//
|
||||
// This file should be included using "include_once"...
|
||||
//
|
||||
// Contents:
|
||||
//
|
||||
// get_recent_poll() - Get the most recent poll...
|
||||
// show_poll() - Show a poll...
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
// Include necessary headers...
|
||||
//
|
||||
|
||||
include_once "db.php";
|
||||
|
||||
|
||||
//
|
||||
// Constants for poll_type column...
|
||||
//
|
||||
|
||||
$POLL_TYPE_PICKONE = 0;
|
||||
$POLL_TYPE_PICKMANY = 1;
|
||||
|
||||
|
||||
//
|
||||
// 'get_recent_poll()' - Get the most recent poll...
|
||||
//
|
||||
|
||||
function // O - Poll ID or 0
|
||||
get_recent_poll()
|
||||
{
|
||||
$result = db_query("SELECT id FROM poll WHERE is_published = 1 "
|
||||
."ORDER BY id DESC LIMIT 1");
|
||||
$row = db_next($result);
|
||||
$id = (int)$row['id'];
|
||||
|
||||
db_free($result);
|
||||
|
||||
return ($id);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'show_poll()' - Show a poll...
|
||||
//
|
||||
|
||||
function
|
||||
show_poll($id) // I - Poll ID
|
||||
{
|
||||
global $PHP_SELF, $POLL_TYPE_PICKONE, $POLL_TYPE_PICKMANY;
|
||||
|
||||
|
||||
$result = db_query("SELECT * FROM poll WHERE is_published = 1 AND id = $id");
|
||||
|
||||
if (db_count($result) == 1)
|
||||
{
|
||||
$row = db_next($result);
|
||||
$id = $row['id'];
|
||||
$question = htmlspecialchars($row['question']);
|
||||
|
||||
print("<p><form method='POST' action='poll.php?v$row[id]'>"
|
||||
."<b>$question</b>\n");
|
||||
|
||||
if ($row['poll_type'] == $POLL_TYPE_PICKONE)
|
||||
print("(please pick one)\n");
|
||||
else
|
||||
print("(pick all that apply)\n");
|
||||
|
||||
for ($i = 0; $i < 10; $i ++)
|
||||
{
|
||||
$answer = htmlspecialchars($row["answer$i"]);
|
||||
|
||||
if ($answer != "")
|
||||
{
|
||||
if ($row['poll_type'] == $POLL_TYPE_PICKONE)
|
||||
print("<br /><input type='radio' name='ANSWER'");
|
||||
else
|
||||
print("<br /><input type='checkbox' name='ANSWER$i'");
|
||||
|
||||
print(" value='$i'/>$answer\n");
|
||||
}
|
||||
}
|
||||
|
||||
$votes = $row['votes'];
|
||||
if ($votes == 1)
|
||||
$votes .= " vote";
|
||||
else
|
||||
$votes .= " votes";
|
||||
|
||||
$ccount = count_comments("poll.php_r$id");
|
||||
if ($ccount == 1)
|
||||
$ccount .= " comment";
|
||||
else
|
||||
$ccount .= " comments";
|
||||
|
||||
print("<br /><input type='submit' value='Vote'/>\n"
|
||||
."[ <a href='poll.php?r$id'>Results</a> ]\n");
|
||||
print("<br />($votes, $ccount)</form></p>\n");
|
||||
}
|
||||
|
||||
db_free($result);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// End of "$Id: poll.php,v 1.1 2004/05/20 03:38:42 mike Exp $".
|
||||
//
|
||||
?>
|
@ -1,82 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// "$Id: str.php,v 1.2 2004/05/19 00:57:33 mike Exp $"
|
||||
//
|
||||
// Common STR definitions...
|
||||
//
|
||||
// This file should be included using "include_once"...
|
||||
//
|
||||
|
||||
//
|
||||
// STR constants...
|
||||
//
|
||||
|
||||
$STR_STATUS_RESOLVED = 1;
|
||||
$STR_STATUS_UNRESOLVED = 2;
|
||||
$STR_STATUS_ACTIVE = 3;
|
||||
$STR_STATUS_PENDING = 4;
|
||||
$STR_STATUS_NEW = 5;
|
||||
|
||||
$STR_PRIORITY_RFE = 1;
|
||||
$STR_PRIORITY_LOW = 2;
|
||||
$STR_PRIORITY_MODERATE = 3;
|
||||
$STR_PRIORITY_HIGH = 4;
|
||||
$STR_PRIORITY_CRITICAL = 5;
|
||||
|
||||
$STR_SCOPE_UNIT = 1;
|
||||
$STR_SCOPE_FUNCTION = 2;
|
||||
$STR_SCOPE_SOFTWARE = 3;
|
||||
|
||||
//
|
||||
// String definitions for STR constants...
|
||||
//
|
||||
|
||||
$status_text = array(
|
||||
1 => "Resolved",
|
||||
2 => "Unresolved",
|
||||
3 => "Active",
|
||||
4 => "Pending",
|
||||
5 => "New"
|
||||
);
|
||||
|
||||
$status_long = array(
|
||||
1 => "1 - Closed w/Resolution",
|
||||
2 => "2 - Closed w/o Resolution",
|
||||
3 => "3 - Active",
|
||||
4 => "4 - Pending",
|
||||
5 => "5 - New"
|
||||
);
|
||||
|
||||
$priority_text = array(
|
||||
1 => "RFE",
|
||||
2 => "LOW",
|
||||
3 => "MODERATE",
|
||||
4 => "HIGH",
|
||||
5 => "CRITICAL"
|
||||
);
|
||||
|
||||
$priority_long = array(
|
||||
1 => "1 - Request for Enhancement, e.g. asking for a feature",
|
||||
2 => "2 - Low, e.g. a documentation error or undocumented side-effect",
|
||||
3 => "3 - Moderate, e.g. unable to compile the software",
|
||||
4 => "4 - High, e.g. key functionality not working",
|
||||
5 => "5 - Critical, e.g. nothing working at all"
|
||||
);
|
||||
|
||||
$scope_text = array(
|
||||
1 => "MACH",
|
||||
2 => "OS",
|
||||
3 => "ALL"
|
||||
);
|
||||
|
||||
$scope_long = array(
|
||||
1 => "1 - Specific to a machine",
|
||||
2 => "2 - Specific to an operating system",
|
||||
3 => "3 - Applies to all machines and operating systems"
|
||||
);
|
||||
|
||||
|
||||
//
|
||||
// End of "$Id: str.php,v 1.2 2004/05/19 00:57:33 mike Exp $".
|
||||
//
|
||||
?>
|
395
www/poll.php
@ -1,395 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// "$Id: poll.php,v 1.3 2004/05/20 15:45:55 mike Exp $"
|
||||
//
|
||||
// Poll page...
|
||||
//
|
||||
|
||||
//
|
||||
// Include necessary headers...
|
||||
//
|
||||
|
||||
include_once "phplib/html.php";
|
||||
include_once "phplib/poll.php";
|
||||
include_once "phplib/common.php";
|
||||
|
||||
|
||||
// Get the operation code:
|
||||
//
|
||||
// cN = show poll N
|
||||
// eN = edit poll N
|
||||
// l = list all polls
|
||||
// n = new poll
|
||||
// rN = show results of poll N
|
||||
// uN = update poll N (POST)
|
||||
// vN = vote for poll N (POST)
|
||||
|
||||
$poll = 0;
|
||||
|
||||
if ($argc > 0)
|
||||
{
|
||||
$op = $argv[0][0];
|
||||
$argv[0][0] = ' ';
|
||||
$poll = (int)$argv[0];
|
||||
}
|
||||
else if ($LOGIN_LEVEL >= AUTH_DEVEL)
|
||||
$op = 'l';
|
||||
else
|
||||
$op = 'c';
|
||||
|
||||
if ($poll == 0 && $op != 'u' && $op != 'n')
|
||||
$poll = get_recent_poll();
|
||||
|
||||
// Do it!
|
||||
switch ($op)
|
||||
{
|
||||
case 'c' : // Show a poll
|
||||
html_header("Poll #$poll");
|
||||
print("<h1>Poll #$poll</h1>\n");
|
||||
show_poll($poll);
|
||||
html_footer();
|
||||
break;
|
||||
|
||||
case 'l' : // List all polls
|
||||
html_header("Polls");
|
||||
|
||||
if ($LOGIN_LEVEL > AUTH_USER)
|
||||
{
|
||||
// Show all polls and allow poll creation...
|
||||
$result = db_query("SELECT * FROM poll ORDER BY id DESC");
|
||||
|
||||
html_start_links(1);
|
||||
html_link("Add New Poll", "$PHP_SELF?n");
|
||||
html_end_links(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Only show published polls...
|
||||
$result = db_query("SELECT * FROM poll WHERE is_published = 1 "
|
||||
."ORDER BY id DESC");
|
||||
}
|
||||
|
||||
print("<h1>Polls</h1>\n");
|
||||
|
||||
if (db_count($result) == 0)
|
||||
{
|
||||
print("<p>No polls found.</p>\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
html_start_table(array("ID", "Question::2"));
|
||||
|
||||
while ($row = db_next($result))
|
||||
{
|
||||
$id = $row['id'];
|
||||
$votes = $row['votes'];
|
||||
$question = htmlspecialchars($row['question']);
|
||||
$ccount = count_comments("poll.php_r$id");
|
||||
|
||||
if ($ccount == 1)
|
||||
$ccount .= " comment";
|
||||
else
|
||||
$ccount .= " comments";
|
||||
|
||||
html_start_row();
|
||||
print("<td align='center'>#$row[id]</td>"
|
||||
."<td align='center' width='67%'>$question");
|
||||
if (!$row['is_published'])
|
||||
print(" <img src='images/private.gif' width='16' height='16' "
|
||||
."align='middle' alt='private'/>");
|
||||
print("</td><td nowrap><a href='$PHP_SELF?c$id'>Vote</a> | "
|
||||
."<a href='$PHP_SELF?r$id'>Results</a>");
|
||||
|
||||
if ($LOGIN_LEVEL > AUTH_USER)
|
||||
print(" | <a href='$PHP_SELF?e$id'>Edit</a>");
|
||||
|
||||
print(" ($votes total votes, $ccount)</td>");
|
||||
html_end_row();
|
||||
}
|
||||
|
||||
html_end_table();
|
||||
}
|
||||
|
||||
db_free($result);
|
||||
|
||||
html_footer();
|
||||
break;
|
||||
|
||||
case 'r' : // Show results
|
||||
html_header("Poll #$poll");
|
||||
|
||||
html_start_links(1);
|
||||
html_link("Show All Polls", "$PHP_SELF?l");
|
||||
html_link("Show Comments", "#_USER_COMMENTS");
|
||||
html_link("Submit Comment", "comment.php?r0+ppoll.php_r$poll");
|
||||
html_end_links(1);
|
||||
|
||||
print("<h1>Poll #$poll</h1>\n");
|
||||
|
||||
$result = db_query("SELECT * FROM poll WHERE id = $poll");
|
||||
$row = db_next($result);
|
||||
|
||||
$votes = $row['votes'];
|
||||
|
||||
for ($max_count = 0, $i = 0; $i < 10; $i ++)
|
||||
{
|
||||
if ($row["count$i"] > $max_count)
|
||||
$max_count = $row["count$i"];
|
||||
}
|
||||
|
||||
if ($votes == 0)
|
||||
print("<p>No votes for this poll yet...</p>\n");
|
||||
else
|
||||
{
|
||||
$question = htmlspecialchars($row['question']);
|
||||
|
||||
print("<center><table>\n");
|
||||
print("<tr><td></td><th align='left'>$question</th></tr>\n");
|
||||
|
||||
for ($i = 0; $i < 10; $i ++)
|
||||
{
|
||||
if ($row["answer$i"] != "")
|
||||
{
|
||||
$percent = (int)(100 * $row["count$i"] / $votes);
|
||||
$size = (int)(300 * $row["count$i"] / $max_count);
|
||||
$answer = htmlspecialchars($row["answer$i"]);
|
||||
$count = $row["count$i"];
|
||||
|
||||
print("<tr><td align='right'>$answer</td><td>"
|
||||
."<img src='${rootpath}images/graph.gif' width='$size' "
|
||||
."height='12'> $count / $percent%</td></tr>\n");
|
||||
}
|
||||
}
|
||||
|
||||
print("<tr><td></td><th align='right'>$votes total votes.</th></tr>\n");
|
||||
print("</table></center>\n");
|
||||
}
|
||||
|
||||
print("<hr noshade/>\n"
|
||||
."<h2><a name='_USER_COMMENTS'>User Comments</a></h2>\n");
|
||||
html_start_links();
|
||||
html_link("Submit Comment", "comment.php?r0+ppoll.php_r$poll");
|
||||
html_end_links();
|
||||
|
||||
show_comments("poll.php_r$poll");
|
||||
|
||||
db_free($result);
|
||||
|
||||
html_footer();
|
||||
break;
|
||||
|
||||
case 'v' : // Vote on a poll
|
||||
$answers = "";
|
||||
|
||||
if ($REQUEST_METHOD == "POST")
|
||||
{
|
||||
if (array_key_exists("ANSWER", $_POST))
|
||||
{
|
||||
$answer = (int)$_POST["ANSWER"];
|
||||
$answers = ",count$answer=count$answer+1";
|
||||
}
|
||||
else
|
||||
{
|
||||
for ($i = 0; $i < 10; $i ++)
|
||||
{
|
||||
if (array_key_exists("ANSWER$i", $_POST))
|
||||
$answers .= ",count$i=count$i+1";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($answers != "")
|
||||
{
|
||||
if (!db_query("INSERT INTO vote VALUES('poll_${poll}_${REMOTE_ADDR}')")
|
||||
&& $LOGIN_LEVEL < AUTH_ADMIN)
|
||||
{
|
||||
html_header("Poll Error");
|
||||
print("<h1>Poll Error</h1>\n");
|
||||
print("<p>Sorry, it appears that you or someone else using your IP "
|
||||
."address has already voted for "
|
||||
."<a href='$PHP_SELF?r$poll'>poll #$poll</a>.\n");
|
||||
html_footer();
|
||||
}
|
||||
else
|
||||
{
|
||||
db_query("UPDATE poll SET votes=votes+1$answers WHERE id = $poll");
|
||||
|
||||
header("Location: $PHP_SELF?r$poll");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
header("Location: $PHP_SELF?c$poll");
|
||||
}
|
||||
break;
|
||||
|
||||
case 'n' : // New poll
|
||||
case 'e' : // Edit poll
|
||||
if (!$LOGIN_USER)
|
||||
{
|
||||
header("Location:$PHP_SELF?r$poll");
|
||||
break;
|
||||
}
|
||||
|
||||
if ($poll)
|
||||
{
|
||||
html_header("Poll #$poll");
|
||||
|
||||
print("<h1>Poll #$poll</h1>\n");
|
||||
|
||||
$result = db_query("SELECT * FROM poll WHERE id = $poll");
|
||||
$row = db_next($result);
|
||||
|
||||
$question = htmlspecialchars($row['question']);
|
||||
$poll_type = $row['poll_type'];
|
||||
|
||||
for ($i = 0; $i < 10; $i ++)
|
||||
{
|
||||
if ($row["answer$i"])
|
||||
$answer[$i] = htmlspecialchars($row["answer$i"], ENT_QUOTES);
|
||||
else
|
||||
$answer[$i] = "";
|
||||
}
|
||||
|
||||
$is_published = $row['is_published'];
|
||||
|
||||
db_free($result);
|
||||
}
|
||||
else
|
||||
{
|
||||
html_header("New Poll");
|
||||
|
||||
print("<h1>New Poll</h1>\n");
|
||||
|
||||
$question = "";
|
||||
$poll_type = $POLL_TYPE_PICKONE;
|
||||
$answer[0] = "";
|
||||
$answer[1] = "";
|
||||
$answer[2] = "";
|
||||
$answer[3] = "";
|
||||
$answer[4] = "";
|
||||
$answer[5] = "";
|
||||
$answer[6] = "";
|
||||
$answer[7] = "";
|
||||
$answer[8] = "";
|
||||
$answer[9] = "";
|
||||
$is_published = 0;
|
||||
}
|
||||
|
||||
print("<form method='POST' action='$PHP_SELF?u$poll'>\n");
|
||||
print("<center><table>\n"
|
||||
."<tr><th align='right' valign='top'>Question:</th><td>"
|
||||
."<textarea name='QUESTION' wrap='virtual' cols='40' rows='4'>"
|
||||
."$question</textarea></td></tr>\n");
|
||||
|
||||
print("<tr><th align='right'>Type:</th><td>"
|
||||
."<select name='POLLTYPE'>");
|
||||
|
||||
print("<option value='$POLL_TYPE_PICKONE'");
|
||||
if ($poll_type == $POLL_TYPE_PICKONE)
|
||||
print(" selected");
|
||||
print(">Pick One</option>");
|
||||
|
||||
print("<option value='$POLL_TYPE_PICKMANY'");
|
||||
if ($poll_type == $POLL_TYPE_PICKMANY)
|
||||
print(" selected");
|
||||
print(">Pick Many</option>");
|
||||
|
||||
print("</select></td></tr>\n");
|
||||
|
||||
print("<tr><th align='right'>Published:</th><td>");
|
||||
select_is_published($is_published);
|
||||
print("</td></tr>\n");
|
||||
|
||||
for ($i = 0; $i < 10; $i ++)
|
||||
{
|
||||
$number = $i + 1;
|
||||
|
||||
print("<tr><TH ALIGN='RIGHT'>Answer #$number</th><td>"
|
||||
."<INPUT NAME='ANSWER$i' SIZE='45' MAXLENGTH='255' "
|
||||
."VALUE='$answer[$i]'></td></tr>\n");
|
||||
}
|
||||
|
||||
if ($poll)
|
||||
print("<tr><th></th><td><input type='SUBMIT' VALUE='Update Poll'></td></tr>\n");
|
||||
else
|
||||
print("<tr><th></th><td><input type='SUBMIT' VALUE='Create Poll'></td></tr>\n");
|
||||
|
||||
print("</table></center>\n");
|
||||
print("</form>\n");
|
||||
|
||||
html_footer();
|
||||
break;
|
||||
|
||||
case 'u' : // Update poll
|
||||
header("Location:$PHP_SELF?l");
|
||||
|
||||
if ($LOGIN_LEVEL < AUTH_DEVEL)
|
||||
break;
|
||||
|
||||
$is_published = (int)$_POST["IS_PUBLISHED"];
|
||||
$question = db_escape($_POST["QUESTION"]);
|
||||
$poll_type = (int)$_POST["POLLTYPE"];
|
||||
$answer0 = db_escape($_POST["ANSWER0"]);
|
||||
$answer1 = db_escape($_POST["ANSWER1"]);
|
||||
$answer2 = db_escape($_POST["ANSWER2"]);
|
||||
$answer3 = db_escape($_POST["ANSWER3"]);
|
||||
$answer4 = db_escape($_POST["ANSWER4"]);
|
||||
$answer5 = db_escape($_POST["ANSWER5"]);
|
||||
$answer6 = db_escape($_POST["ANSWER6"]);
|
||||
$answer7 = db_escape($_POST["ANSWER7"]);
|
||||
$answer8 = db_escape($_POST["ANSWER8"]);
|
||||
$answer9 = db_escape($_POST["ANSWER9"]);
|
||||
$date = time();
|
||||
|
||||
if ($poll)
|
||||
{
|
||||
// Update an existing poll...
|
||||
db_query("UPDATE poll SET "
|
||||
."question='$question',"
|
||||
."is_published=$is_published,"
|
||||
."poll_type=$poll_type,"
|
||||
."answer0='$answer0',"
|
||||
."answer1='$answer1',"
|
||||
."answer2='$answer2',"
|
||||
."answer3='$answer3',"
|
||||
."answer4='$answer4',"
|
||||
."answer5='$answer5',"
|
||||
."answer6='$answer6',"
|
||||
."answer7='$answer7',"
|
||||
."answer8='$answer8',"
|
||||
."answer9='$answer9',"
|
||||
."modify_date=$date,"
|
||||
."modify_user='$LOGIN_USER' "
|
||||
."WHERE id = $poll");
|
||||
}
|
||||
else
|
||||
{
|
||||
// Create a new poll...
|
||||
db_query("INSERT INTO poll VALUES(NULL,"
|
||||
."$is_published,"
|
||||
."$poll_type,"
|
||||
."'$question',"
|
||||
."'$answer0',0,"
|
||||
."'$answer1',0,"
|
||||
."'$answer2',0,"
|
||||
."'$answer3',0,"
|
||||
."'$answer4',0,"
|
||||
."'$answer5',0,"
|
||||
."'$answer6',0,"
|
||||
."'$answer7',0,"
|
||||
."'$answer8',0,"
|
||||
."'$answer9',0,"
|
||||
."0,"
|
||||
."$date,'$LOGIN_USER',"
|
||||
."$date,'$LOGIN_USER')");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
db_close();
|
||||
|
||||
//
|
||||
// End of "$Id: poll.php,v 1.3 2004/05/20 15:45:55 mike Exp $".
|
||||
//
|
||||
?>
|
182
www/software.php
@ -1,182 +0,0 @@
|
||||
<?php
|
||||
//
|
||||
// "$Id$"
|
||||
//
|
||||
// Software download page.
|
||||
//
|
||||
|
||||
//
|
||||
// Include necessary headers...
|
||||
//
|
||||
|
||||
include_once "phplib/html.php";
|
||||
include_once "phplib/mirrors.php";
|
||||
|
||||
// Get the list of software files...
|
||||
$fp = fopen("data/software.md5", "r");
|
||||
$files = array();
|
||||
|
||||
while ($line = fgets($fp, 255))
|
||||
$files[sizeof($files)] = trim($line);
|
||||
|
||||
fclose($fp);
|
||||
|
||||
// Get form data, if any...
|
||||
if (array_key_exists("FILE", $_GET))
|
||||
{
|
||||
$file = $_GET["FILE"];
|
||||
|
||||
if (strpos($file, "../") !== FALSE ||
|
||||
!file_exists("/home/ftp.easysw.com/pub/$file"))
|
||||
$file = "";
|
||||
}
|
||||
else
|
||||
$file = "";
|
||||
|
||||
$site = mirror_closest();
|
||||
|
||||
if (array_key_exists("VERSION", $_GET))
|
||||
$version = $_GET["VERSION"];
|
||||
else
|
||||
{
|
||||
$data = explode(" ", $files[0]);
|
||||
$version = $data[1];
|
||||
}
|
||||
|
||||
// Show the standard header...
|
||||
if ($site != "" && $file != "")
|
||||
html_header("Download", "$site/$file");
|
||||
else
|
||||
html_header("Download");
|
||||
|
||||
html_start_links(1);
|
||||
|
||||
$curversion = "";
|
||||
for ($i = 0; $i < sizeof($files); $i ++)
|
||||
{
|
||||
// Grab the data for the current file...
|
||||
$data = explode(" ", $files[$i]);
|
||||
$fversion = $data[1];
|
||||
|
||||
if ($fversion != $curversion)
|
||||
{
|
||||
$curversion = $fversion;
|
||||
html_link("v$fversion", "$PHP_SELF?VERSION=$fversion");
|
||||
}
|
||||
}
|
||||
|
||||
html_link("Subversion", "$PHP_SELF#SVN");
|
||||
|
||||
html_end_links();
|
||||
|
||||
// Show files or sites...
|
||||
if ($file != "")
|
||||
{
|
||||
print("<h1>Download</h1>\n");
|
||||
|
||||
print("<p>Your download should begin shortly. If not, please "
|
||||
."<a href='$site/$file'>click here</a> to download the file "
|
||||
."from the current mirror.</p>\n"
|
||||
."<form action='$PHP_SELF' method='GET' name='download'>\n"
|
||||
."<input type='hidden' name='FILE' value='"
|
||||
. htmlspecialchars($file, ENT_QUOTES) . "'>\n"
|
||||
."<input type='hidden' name='VERSION' value='"
|
||||
. htmlspecialchars($version, ENT_QUOTES) . "'>\n");
|
||||
|
||||
reset($MIRRORS);
|
||||
while (list($key, $val) = each($MIRRORS))
|
||||
{
|
||||
print("<input type='radio' name='SITE' value='$key' "
|
||||
."onClick='document.download.submit();'");
|
||||
if ($site == $key)
|
||||
print(" checked");
|
||||
print(">$val[0]<br>\n");
|
||||
}
|
||||
|
||||
print("<p><input type='submit' value='Change Mirror Site'>\n"
|
||||
."</form>\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
// Show files...
|
||||
print("<h1>Releases</h1>\n");
|
||||
|
||||
html_start_table(array("Version", "Filename", "Size", "MD5 Sum"));
|
||||
|
||||
$curversion = "";
|
||||
|
||||
for ($i = 0; $i < sizeof($files); $i ++)
|
||||
{
|
||||
// Grab the data for the current file...
|
||||
$data = explode(" ", $files[$i]);
|
||||
$md5 = $data[0];
|
||||
$fversion = $data[1];
|
||||
$filename = $data[2];
|
||||
$basename = basename($filename);
|
||||
|
||||
if ($fversion == $version)
|
||||
{
|
||||
$cs = "<th>";
|
||||
$ce = "</th>";
|
||||
}
|
||||
else
|
||||
{
|
||||
$cs = "<td align='center'>";
|
||||
$ce = "</td>";
|
||||
}
|
||||
|
||||
if ($fversion != $curversion)
|
||||
{
|
||||
if ($curversion != "")
|
||||
{
|
||||
html_start_row("header");
|
||||
print("<th colspan='4'></th>");
|
||||
html_end_row();
|
||||
}
|
||||
|
||||
$curversion = $fversion;
|
||||
html_start_row();
|
||||
print("$cs<a name='$fversion'>$fversion</a>$ce");
|
||||
}
|
||||
else
|
||||
{
|
||||
html_start_row();
|
||||
print("$cs$ce");
|
||||
}
|
||||
|
||||
if (file_exists("/home/ftp.easysw.com/pub/$filename"))
|
||||
$kbytes = (int)((filesize("/home/ftp.easysw.com/pub/$filename") + 1023) / 1024);
|
||||
else
|
||||
$kbytes = "???";
|
||||
|
||||
print("$cs<a href='$PHP_SELF?VERSION=$version&FILE=$filename'>"
|
||||
."<tt>$basename</tt></a>$ce"
|
||||
."$cs${kbytes}k$ce"
|
||||
."$cs<tt>$md5</tt>$ce");
|
||||
|
||||
html_end_row();
|
||||
}
|
||||
|
||||
html_end_table();
|
||||
|
||||
print("<h1><a name='SVN'>Subversion Access</a></h1>\n"
|
||||
."<p>The $PROJECT_NAME software is available via Subversion "
|
||||
."using the following URL:</p>\n"
|
||||
."<pre>\n"
|
||||
." <a href='http://svn.easysw.com/public/$PROJECT_MODULE/'>"
|
||||
."http://svn.easysw.com/public/$PROJECT_MODULE/</a>\n"
|
||||
."</pre>\n"
|
||||
."<p>The following command can be used to checkout the current "
|
||||
."$PROJECT_NAME source from Subversion:</p>\n"
|
||||
."<pre>\n"
|
||||
." <kbd>svn co http://svn.easysw.com/public/$PROJECT_MODULE/trunk/ $PROJECT_MODULE</kbd>\n"
|
||||
."</pre>\n");
|
||||
}
|
||||
|
||||
// Show the standard footer...
|
||||
html_footer();
|
||||
|
||||
//
|
||||
// End of "$Id$".
|
||||
//
|
||||
?>
|
1934
www/str.php
@ -1,2 +0,0 @@
|
||||
DirectoryIndex off
|
||||
|
241
www/style.css
@ -1,241 +0,0 @@
|
||||
BODY {
|
||||
background: #ffffff;
|
||||
color: #000000;
|
||||
font-family: sans-serif;
|
||||
margin: 15px;
|
||||
}
|
||||
|
||||
P, TD, TH {
|
||||
color: #000000;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
H1, H2, H3, H4, H5, H6 {
|
||||
color: #000000;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
H2, H3, H4, H5, H6 {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
KBD {
|
||||
color: #006600;
|
||||
font-family: monospace;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
PRE {
|
||||
color: #7f0000;
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
SUB, SUP {
|
||||
font-size: smaller;
|
||||
}
|
||||
|
||||
FORM {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
INPUT[TYPE="TEXT"], INPUT[TYPE="PASSWORD"], INPUT[TYPE="SEARCH"], TEXTAREA {
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
A:link {
|
||||
font-family: sans-serif;
|
||||
text-decoration: none;
|
||||
color: #00007f;
|
||||
}
|
||||
|
||||
A:visited {
|
||||
font-family: sans-serif;
|
||||
text-decoration: none;
|
||||
color: #0000bf;
|
||||
}
|
||||
|
||||
A:hover {
|
||||
font-family: sans-serif;
|
||||
text-decoration: none;
|
||||
color: #7f0000;
|
||||
}
|
||||
|
||||
A:active {
|
||||
font-family: sans-serif;
|
||||
text-decoration: underline;
|
||||
color: #bf0000;
|
||||
}
|
||||
|
||||
TD.unsel, TD.sel {
|
||||
border-bottom: solid 1px black;
|
||||
padding: 1px 10px;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
TD.unsel A, TD.sel A {
|
||||
font-weight: bold;
|
||||
padding: 1px 10px;
|
||||
}
|
||||
|
||||
TD.sel A {
|
||||
border-bottom: solid 3px black;
|
||||
}
|
||||
|
||||
TD.unsel A:hover, TD.sel A:hover {
|
||||
background: #f4f4f4;
|
||||
border-bottom: solid 3px #999999;
|
||||
}
|
||||
|
||||
TD.page {
|
||||
height: 100%;
|
||||
padding: 10px 0px;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
TD.footer {
|
||||
border-top: solid thin #666666;
|
||||
color: #666666;
|
||||
font-size: 80%;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
P.links {
|
||||
border-bottom: solid 1px #999999;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
padding: 0px 10px;
|
||||
text-align: center;
|
||||
vertical-align: bottom;
|
||||
width: 80%;
|
||||
}
|
||||
|
||||
P.links A {
|
||||
padding: 0px 5px;
|
||||
}
|
||||
|
||||
P.links A:hover {
|
||||
background: #f8f8f8;
|
||||
border-bottom: solid 3px #cccccc;
|
||||
}
|
||||
|
||||
TABLE.standard {
|
||||
border-bottom: solid thin black;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
TR.header TH {
|
||||
border-bottom: solid thin black;
|
||||
padding: 0px 5px;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
TR.data0 TD, TR.data0 TH {
|
||||
background-color: #f8f8f8;
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
TR.data1 TD, TR.data1 TH {
|
||||
background-color: #f4f4f4;
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
.dateinfo {
|
||||
font-size: 80%;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.invalid {
|
||||
background: red;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
padding: 2px;
|
||||
}
|
||||
/* Styles for documentation */
|
||||
.class {
|
||||
border-bottom: solid 2px gray;
|
||||
}
|
||||
.constants {
|
||||
}
|
||||
.description {
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
.discussion {
|
||||
}
|
||||
.enumeration {
|
||||
border-bottom: solid 2px gray;
|
||||
}
|
||||
.function {
|
||||
border-bottom: solid 2px gray;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.members {
|
||||
}
|
||||
.method {
|
||||
}
|
||||
.parameters {
|
||||
}
|
||||
.returnvalue {
|
||||
}
|
||||
.struct {
|
||||
border-bottom: solid 2px gray;
|
||||
}
|
||||
.typedef {
|
||||
border-bottom: solid 2px gray;
|
||||
}
|
||||
.union {
|
||||
border-bottom: solid 2px gray;
|
||||
}
|
||||
.variable {
|
||||
}
|
||||
code, p.code, pre, ul.code li {
|
||||
font-family: monaco, courier, monospace;
|
||||
font-size: 90%;
|
||||
}
|
||||
a:link, a:visited {
|
||||
text-decoration: none;
|
||||
}
|
||||
span.info {
|
||||
background: black;
|
||||
border: solid thin black;
|
||||
color: white;
|
||||
font-size: 80%;
|
||||
font-style: italic;
|
||||
font-weight: bold;
|
||||
white-space: nowrap;
|
||||
}
|
||||
h3 span.info, h4 span.info {
|
||||
float: right;
|
||||
font-size: 100%;
|
||||
}
|
||||
ul.code, ul.contents, ul.subcontents {
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
ul.code li {
|
||||
margin: 0;
|
||||
}
|
||||
ul.contents > li {
|
||||
margin-top: 1em;
|
||||
}
|
||||
ul.contents li ul.code, ul.contents li ul.subcontents {
|
||||
padding-left: 2em;
|
||||
}
|
||||
div.body dl {
|
||||
margin-top: 0;
|
||||
}
|
||||
div.body dt {
|
||||
font-style: italic;
|
||||
margin-top: 0;
|
||||
}
|
||||
div.body dd {
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
h1.title {
|
||||
}
|
||||
h2.title {
|
||||
border-bottom: solid 2px black;
|
||||
}
|
||||
h3.title {
|
||||
border-bottom: solid 2px black;
|
||||
}
|
@ -1,2 +0,0 @@
|
||||
DirectoryIndex off
|
||||
|