diff --git a/www/.htaccess b/www/.htaccess deleted file mode 100644 index 38dcd05..0000000 --- a/www/.htaccess +++ /dev/null @@ -1 +0,0 @@ -RewriteEngine Off diff --git a/www/0.gif b/www/0.gif deleted file mode 100644 index d5e883c..0000000 Binary files a/www/0.gif and /dev/null differ diff --git a/www/1.gif b/www/1.gif deleted file mode 100644 index 316ff7c..0000000 Binary files a/www/1.gif and /dev/null differ diff --git a/www/2.gif b/www/2.gif deleted file mode 100644 index ebc1e75..0000000 Binary files a/www/2.gif and /dev/null differ diff --git a/www/3.gif b/www/3.gif deleted file mode 100644 index 2b3ac7b..0000000 Binary files a/www/3.gif and /dev/null differ diff --git a/www/4.gif b/www/4.gif deleted file mode 100644 index bd145f2..0000000 Binary files a/www/4.gif and /dev/null differ diff --git a/www/A.gif b/www/A.gif deleted file mode 100644 index 7f2a147..0000000 Binary files a/www/A.gif and /dev/null differ diff --git a/www/B.gif b/www/B.gif deleted file mode 100644 index 54f81f4..0000000 Binary files a/www/B.gif and /dev/null differ diff --git a/www/C.gif b/www/C.gif deleted file mode 100644 index 891e7fe..0000000 Binary files a/www/C.gif and /dev/null differ diff --git a/www/D.gif b/www/D.gif deleted file mode 100644 index dd8f829..0000000 Binary files a/www/D.gif and /dev/null differ diff --git a/www/account.php b/www/account.php deleted file mode 100644 index bcd6e00..0000000 --- a/www/account.php +++ /dev/null @@ -1,653 +0,0 @@ - "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("

Account added successfully!

\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("
" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."\n" - ."
Published:"); - select_is_published($is_published); - print("
Username:
EMail:
Access Level:
Password:
Password Again:
" - ."
\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("

Account modified successfully!

\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("
" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."\n" - ."
Published:"); - select_is_published($is_published); - print("
Username:$name
EMail:
Access Level:"); - - if ($LOGIN_USER == $name) - print("" - . $levels[$level]); - else - { - print(""); - } - - print("
Password:
Password Again:
" - ."
\n"); - } - - html_footer(); - } - else - { - // List accounts... - account_header("Manage Accounts"); - - $result = db_query("SELECT * FROM users ORDER BY name"); - - print("
\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 .= " Private"; - - html_start_row(); - print("" - ."$name" - ."" - ."$email" - ."" - ."$level"); - html_end_row(); - } - - html_end_table(); - - print("

" - ."

"); - - 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("

New/Pending Articles:

\n"); - - $result = db_query("SELECT * FROM article WHERE is_published = 0 " - ."ORDER BY modify_date"); - $count = db_count($result); - - if ($count == 0) - print("

No new/pending articles found.

\n"); - else - { - html_start_table(array("Id", "Title", "Last Updated")); - - while ($row = db_next($result)) - { - $id = $row['id']; - $title = htmlspecialchars($row['title'], ENT_QUOTES) . - " Private"; - $abstract = htmlspecialchars($row['abstract'], ENT_QUOTES); - $date = date("M d, Y", $row['modify_date']); - - html_start_row(); - - print("$id" - ."$title" - ."$date"); - - html_end_row(); - - html_start_row(); - - print("$abstract"); - - html_end_row(); - } - - html_end_table(); - } - - db_free($result); - - print("

New/Pending Links:

\n"); - - $result = db_query("SELECT * FROM link WHERE is_published = 0 " - ."ORDER BY modify_date"); - $count = db_count($result); - - if ($count == 0) - print("

No new/pending links found.

\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) . - " Private"; - $date = date("M d, Y", $row['modify_date']); - - if ($row["is_category"]) - $link = ""; - else - $link = ""; - - html_start_row(); - - print("$link$id" - ."$link$title" - ."$link$date"); - - html_end_row(); - } - - html_end_table(); - } - - db_free($result); - - print("

New/Pending STRs:

\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("

No new/pending STRs found.

\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 .= " Private"; - - html_start_row(); - - print("" - ."" - ."$row[id]" - ."$prtext" - ."$sttext" - ."$sctext" - ."$summabbr" - ."$row[str_version]" - ."$date"); - - if ($row['manager_email'] != "") - $email = sanitize_email($row['manager_email']); - else - $email = "Unassigned"; - - print("$email"); - - html_end_row(); - } - - html_end_table(); - } - - db_free($result); - - // Show hidden comments... - print("

Hidden Comments:

\n"); - - $result = db_query("SELECT * FROM comment WHERE status = 0 ORDER BY id"); - - if (db_count($result) == 0) - print("

No hidden comments.

\n"); - else - { - print("\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("

Password changed successfully!

\n"); - } - else - { - print("" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."\n" - ."
Password:
Password Again:
" - ."
\n"); - } - - html_footer(); - break; - - default : - // Show account info... - account_header($LOGIN_USER); - - if (array_key_exists("FROM", $_COOKIE)) - $email = htmlspecialchars($_COOKIE["FROM"]); - else - $email = "unknown"; - - print("
\n" - ."\n" - ."\n" - ."" - ."\n" - ."
Username:$LOGIN_USER
EMail:$email
Access Level:$levels[$LOGIN_LEVEL]
\n"); - - html_footer(); - break; -} - - -// -// End of "$Id$". -// -?> diff --git a/www/articles.php b/www/articles.php deleted file mode 100644 index 0cac248..0000000 --- a/www/articles.php +++ /dev/null @@ -1,857 +0,0 @@ -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("

Command '$op' requires an ID!\n"); - html_footer(); - exit(); - } - - if ($op == 'B' && $LOGIN_LEVEL < AUTH_DEVEL) - { - html_header("Article Error"); - print("

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("

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("

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("

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("

Bad option '$argv[$i]'!

\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("

Error: Article #$id was not found!

\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("
" - ."\n"); - - if (!$row['is_published']) - print("\n"); - - $temp = htmlspecialchars($row["title"]); - print("\n"); - - $temp = htmlspecialchars($row["abstract"]); - print("\n"); - - $temp = format_text($row["contents"]); - print("\n"); - - print("\n"); - print("
This article is " - ."currently hidden from public view.
Title:$temp
Abstract:$temp
Contents:$temp
" - ."
\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("

Error: Article #$id was not found!

\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("

This article is currently hidden from " - ."public view.

\n"); - - print("

$date by $create_user
$abstract

\n" - ."$contents\n" - ."

Comments

\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("

" - ."Search Words:  " - ."

\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("

No Articles found.

\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("

$count article(s) found, showing $start to $end:

\n"); - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - print("
\n"); - - if ($count > $PAGE_MAX) - { - print("\n"); - - print("\n"); - print("
"); - if ($index > 0) - print("Previous $PAGE_MAX"); - print(""); - if ($end < $count) - { - $next_count = min($PAGE_MAX, $count - $end); - print("Next $next_count"); - } - print("
\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 = ""; - - print(""); - if ($LOGIN_LEVEL >= AUTH_DEVEL) - print(""); - print("$link$id"); - - $temp = htmlspecialchars($row['title']); - if ($row['is_published'] == 0) - $temp .= " Private"; - - print("$link$temp"); - - $temp = date("M d, Y", $row['modify_date']); - print("$link$temp"); - - $ccount = count_comments("articles.php_L$id"); - print("$link$ccount"); - - html_end_row(); - - html_start_row(); - $temp = htmlspecialchars($row['abstract']); - print("$temp"); - html_end_row(); - } - - html_end_table(); - - if ($LOGIN_LEVEL > 0) - { - print("

Published: "); - select_is_published(); - print("

\n"); - } - - if ($count > $PAGE_MAX) - { - print("\n"); - - print("\n"); - print("
"); - if ($index > 0) - print("Previous $PAGE_MAX"); - print(""); - if ($end < $count) - { - $next_count = min($PAGE_MAX, $count - $end); - print("Next $next_count"); - } - print("
\n"); - } - - print("

private = hidden from public view

\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("

Error: Article #$id was not found!

\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("

Error: Please fill in the fields marked in " - ."bold red below and resubmit " - ."your article.

\n"); - - $hstart = ""; - $hend = ""; - } - else - { - $hstart = ""; - $hend = ""; - } - - print("" - ."\n"); - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - { - print("\n"); - } - else - print("\n"); - - $title = htmlspecialchars($title, ENT_QUOTES); - - if ($title == "") - print(""); - else - print(""); - print("\n"); - - $abstract = htmlspecialchars($abstract, ENT_QUOTES); - - if ($abstract == "") - print(""); - else - print(""); - print("\n"); - - $contents = htmlspecialchars($contents, ENT_QUOTES); - - if ($contents == "") - print(""); - else - print(""); - print("\n"); - - print("\n"); - print("
Published:"); - select_is_published($is_published); - print("
${hstart}Title:${hend}
Title:
${hstart}Abstract:${hend}
Abstract:
${hstart}Contents:${hend}
Contents:\n" - ."

The contents of the article may contain the following " - ."HTML elements: A, B, BLOCKQUOTE, " - ."CODE, EM, H1, H2, " - ."H3, H4, H5, H6, I, " - ."IMG, LI, OL, P, PRE, " - ."TT, U, UL

" - ."
\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("

Error: Please fill in the fields marked in " - ."bold red below and resubmit " - ."your article.

\n"); - - $hstart = ""; - $hend = ""; - } - else - { - print("

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. Thank you for supporting $PROJECT_NAME!

\n"); - - $hstart = ""; - $hend = ""; - } - - print("
" - ."\n"); - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - { - print("\n"); - } - else - print("\n"); - - $title = htmlspecialchars($title, ENT_QUOTES); - - if ($title == "") - print(""); - else - print(""); - print("\n"); - - $abstract = htmlspecialchars($abstract, ENT_QUOTES); - - if ($abstract == "") - print(""); - else - print(""); - print("\n"); - - $create_user = htmlspecialchars($create_user, ENT_QUOTES); - - if ($create_user == "") - print(""); - else - print(""); - - if ($LOGIN_USER != "" && $LOGIN_LEVEL < AUTH_DEVEL) - print("\n"); - else - print("\n"); - - $contents = htmlspecialchars($contents, ENT_QUOTES); - - if ($contents == "") - print(""); - else - print(""); - print("\n"); - - print("\n"); - print("
Published:"); - select_is_published($is_published); - print("
${hstart}Title:${hend}
Title:
${hstart}Abstract:${hend}
Abstract:
${hstart}Author:${hend}
Author:$create_user
${hstart}Contents:${hend}
Contents:\n" - ."

The contents of the article may contain the following " - ."HTML elements: A, B, BLOCKQUOTE, " - ."CODE, EM, H1, H2, " - ."H3, H4, H5, H6, I, " - ."IMG, LI, OL, P, PRE, " - ."TT, U, UL

" - ."
\n"); - - html_footer(); - break; -} - - -// -// End of "$Id$". -// -?> diff --git a/www/comment.php b/www/comment.php deleted file mode 100644 index a393eca..0000000 --- a/www/comment.php +++ /dev/null @@ -1,377 +0,0 @@ -Click the button below to confirm the deletion.

\n" - ."
" - ."
" - ."
\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 "; - - $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 "; - - $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("

Your comment posting is missing required information. " - ."Please fill in all fields marked in " - ."red and resubmit your comments.

\n"); - $hstart = ""; - $hend = ""; - } - else - { - $hstart = ""; - $hend = ""; - } - - if ($op == "e") - print("
\n" - ."
\n"); - else - print("\n" - ."
\n"); - - $create_user = htmlspecialchars($create_user); - if ($create_user == "") - print("" - ."\n"); - else - print("" - ."\n"); - - $contents = htmlspecialchars($contents); - if ($contents == "") - print("" - ."" - ."\n"); - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - { - print("" - ."\n"); - print("" - ."\n"); - } - else - { - print("\n"); - print("\n"); - } - - if ($id) - print("\n"); - else - print("\n"); - - print("
${hstart}Author:${hend}
Author:
${hstart}Message:${hend}"); - else - print("
Message:"); - - print("

Comments may contain the following " - ."HTML elements: A, B, BLOCKQUOTE, " - ."CODE, EM, H1, H2, " - ."H3, H4, H5, H6, I, " - ."IMG, LI, OL, P, PRE, " - ."TT, U, UL

File Path:
Score:
\n" - ."
\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("

Show Hidden Comments

\n"); - } - else - { - $result = db_query("SELECT * FROM comment WHERE status = 0 AND " - ."url LIKE '${listpath}%' ORDER BY id"); - print("

Show All Comments

\n"); - } - } - - if (db_count($result) == 0) - { - if ($LOGIN_LEVEL >= AUTH_DEVEL && $op == 'l') - print("

No hidden comments.

\n"); - else - print("

No visible comments.

\n"); - } - else - { - print("\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$". -// -?> diff --git a/www/data/.htaccess b/www/data/.htaccess deleted file mode 100644 index 0a35203..0000000 --- a/www/data/.htaccess +++ /dev/null @@ -1,3 +0,0 @@ -Order deny,allow -Allow from none - diff --git a/www/data/make-form.php b/www/data/make-form.php deleted file mode 100755 index dfd10bc..0000000 --- a/www/data/make-form.php +++ /dev/null @@ -1,598 +0,0 @@ -#!/usr/bin/php -q -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(\"

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(\"

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(\"

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(\"

Error: $tname #\$id was not found!

\\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\", \"\$PHP_SELF?L\$id\");\n"); -print(" html_link(\"Modify $tname #\$id\", \"\$PHP_SELF?M\$id\");\n"); -print(" html_end_links();\n"); -print("\n"); -print(" print(\"

Delete $tname #\$id

\\n\");\n"); -print(" print(\"
\"\n"); -print(" .\"

\\n\");\n"); -print("\n"); - -print(" if (!\$row['is_published'])\n"); -print(" print(\"\\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(\"" - ."\\n\");\n"); - print("\n"); - break; - } -} - -print(" print(\"\\n\");\n"); -print(" print(\"
This $tname is \"\n"); -print(" .\"currently hidden from public view.
$name:\$temp
\"\n"); -print(" .\"

\\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(\"

Error: $tname #\$id was not found!

\\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\", \"\$PHP_SELF?M\$id\");\n"); -print(" html_link(\"Delete $tname #\$id\", \"\$PHP_SELF?D\$id\");\n"); -print(" html_end_links();\n"); -print("\n"); -print(" print(\"

$tname #\$id

\\n\");\n"); -print(" print(\"

\\n\");\n"); -print("\n"); -print(" if (!\$row['is_published'])\n"); -print(" print(\"\\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(\"" - ."\\n\");\n"); - print("\n"); - break; - } -} - -print(" print(\"
This $tname is \"\n"); -print(" .\"currently hidden from public view.
$name:\$temp

\\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(\"

$tname List

\\n\");\n"); -print(" if (\$count == 0)\n"); -print(" {\n"); -print(" print(\"

No ${tname}s found.

\\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(\"\"\n"); - print(" .\"\$id\");\n"); - print("\n"); - break; - - case "modify_date" : - print(" \$temp = date(\"M d, Y\", \$row['modify_date']);\n"); - print(" print(\"\"\n"); - print(" .\"\$temp\");\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(\"\"\n"); - print(" .\"\$temp\");\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(\"\$temp\");\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(\"

Modify $tname #\$id

\\n\");\n"); -print(" \$result = db_query(\"SELECT * FROM $table WHERE id = \$id\");\n"); -print(" if (db_count(\$result) != 1)\n"); -print(" {\n"); -print(" print(\"

Error: $tname #\$id was not found!

\\n\");\n"); -print(" html_footer();\n"); -print(" exit();\n"); -print(" }\n"); -print("\n"); -print(" \$row = db_next(\$result);\n"); -print("\n"); -print(" print(\"
\"\n"); -print(" .\"

\\n\");\n"); -print("\n"); -print(" print(\"\\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(\"\"\n"); - - if ($row['type'] == "TEXT") - { - print(" .\"\\n\");\n"); - } - else - { - print(" .\"\\n\");\n"); - } - - print("\n"); - break; - } - -print(" print(\"\\n\");\n"); -print(" print(\"
Published:\");\n"); -print(" select_is_published(\$row['is_published']);\n"); -print(" print(\"
$name:
\"\n"); -print(" .\"

\\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(\"

New $tname

\\n\");\n"); -print(" print(\"
\"\n"); -print(" .\"

\\n\");\n"); -print("\n"); -print(" if (\$LOGIN_USER != \"\")\n"); -print(" {\n"); -print(" print(\"\\n\");\n"); -print(" }\n"); -print(" else\n"); -print(" print(\"\\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(\"\"\n"); - - if ($row['type'] == "TEXT") - { - print(" .\"\\n\");\n"); - } - else - { - print(" .\"\\n\");\n"); - } - - print("\n"); - break; - } - -print(" print(\"\\n\");\n"); -print(" print(\"
Published:\");\n"); -print(" select_is_published();\n"); -print(" print(\"
$name:
\"\n"); -print(" .\"

\\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"); - -?> diff --git a/www/data/makedb b/www/data/makedb deleted file mode 100755 index c8ed87b..0000000 --- a/www/data/makedb +++ /dev/null @@ -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 - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - - -Contents -Previous -Next -
-

3More Mini-XML Programming - Techniques

-

This chapter shows additional ways to use the Mini-XML library in - your programs.

-

Load Callbacks

-

Chapter 2 introduced the -mxmlLoadFile() and -mxmlLoadString() 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.

-

Mini-XML defines several standard callbacks for simple XML data - files:

-
    -
  • MXML_INTEGER_CALLBACK - All data nodes contain - whitespace-separated integers.
  • -
  • MXML_OPAQUE_CALLBACK - All data nodes contain opaque - strings ("CDATA").
  • -
  • MXML_REAL_CALLBACK - All data nodes contain - whitespace-separated floating-point numbers.
  • -
  • MXML_TEXT_CALLBACK - All data nodes contain - whitespace-separated strings.
  • -
-

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: MXML_INTEGER, MXML_OPAQUE, -MXML_REAL, or MXML_TEXT. The function is called after - 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.

- - -

The following callback function looks for an attribute named "type" - or the element name to determine the value type for its child nodes:

-
-    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);
-    }
-
-

To use this callback function, simply use the name when you call any - of the load functions:

-
-    FILE *fp;
-    mxml_node_t *tree;
-
-    fp = fopen("filename.xml", "r");
-    tree = mxmlLoadFile(NULL, fp, type_cb);
-    fclose(fp);
-
-

Save Callbacks

-

Chapter 2 also introduced the -mxmlSaveFile(), -mxmlSaveString(), and -mxmlSaveAllocString() functions. The last argument to these - functions is a callback function which is used to automatically insert - whitespace in an XML document.

-

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 -MXML_WS_BEFORE_OPEN, MXML_WS_AFTER_OPEN, -MXML_WS_BEFORE_CLOSE, or MXML_WS_AFTER_CLOSE. The callback - function should return NULL if no whitespace should be added - and the string to insert (spaces, tabs, carriage returns, and newlines) - otherwise.

-

The following whitespace callback can be used to add whitespace to - XHTML output to make it more readable in a standard text editor:

-
-    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);
-    }
-
-

To use this callback function, simply use the name when you call any - of the save functions:

-
-    FILE *fp;
-    mxml_node_t *tree;
-
-    fp = fopen("filename.xml", "w");
-    mxmlSaveFile(tree, fp, whitespace_cb);
-    fclose(fp);
-
- - -

Custom Data Types

-

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 MXML_CUSTOM - node type identifies custom data nodes.

-

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:

-
-    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);
-    }
-
-

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 void 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.

- - -

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:

-
-    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));
-    }
-
-

You register the callback functions using the -mxmlSetCustomHandlers() function:

-
-    mxmlSetCustomHandlers(load_custom,
-                          save_custom);
-
- - -

Changing Node Values

-

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.

-

Existing nodes can be changed using the -mxmlSetElement(), -mxmlSetInteger(), -mxmlSetOpaque(), -mxmlSetReal(), -mxmlSetText(), and -mxmlSetTextf() functions. For example, use the following - function call to change a text node to contain the text "new" with - leading whitespace:

-
-    mxml_node_t *node;
-
-    mxmlSetText(node, 1, "new");
-
-

Formatted Text

-

The mxmlNewTextf() - and mxmlSetTextf() - functions create and change text nodes, respectively, using printf --style format strings and arguments. For example, use the following - function call to create a new text node containing a constructed - filename:

-
-    mxml_node_t *node;
-
-    node = mxmlNewTextf(node, 1, "%s/%s",
-                        path, filename);
-
-

Indexing

-

Mini-XML provides functions for managing indices of nodes. The - current implementation provides the same functionality as -mxmlFindElement(). 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.

-

Indices are stored in -mxml_index_t structures. The -mxmlIndexNew() function creates a new index:

-
-    mxml_node_t *tree;
-    mxml_index_t *ind;
-
-    ind = mxmlIndexNew(tree, "element",
-                       "attribute");
-
-

The first argument is the XML node tree to index. Normally this will - be a pointer to the ?xml element.

-

The second argument contains the element to index; passing NULL - indexes all element nodes alphabetically.

-

The third argument contains the attribute to index; passing NULL - causes only the element name to be indexed.

-

Once the index is created, the -mxmlIndexEnum(), -mxmlIndexFind(), and -mxmlIndexReset() functions are used to access the nodes in the - index. The mxmlIndexReset() - 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 -mxmlIndexEnum() and -mxmlIndexFind().

-

The mxmlIndexEnum() - function enumerates each of the nodes in the index and can be used in a - loop as follows:

-
-    mxml_node_t *node;
-
-    mxmlIndexReset(ind);
-
-    while ((node = mxmlIndexEnum(ind)) != NULL)
-    {
-      // do something with node
-    }
-
-

The mxmlIndexFind() - 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:

-
-    mxml_node_t *node;
-
-    mxmlIndexReset(ind);
-
-    while ((node = mxmlIndexFind(ind, "element",
-                                 "attr-value"))
-                != NULL)
-    {
-      // do something with node
-    }
-
-

The second and third arguments represent the element name and - attribute value, respectively. A NULL pointer is used to - return all elements or attributes in the index. Passing NULL - for both the element name and attribute value is equivalent to calling -mxmlIndexEnum.

-

When you are done using the index, delete it using the -mxmlIndexDelete() function:

-
-    mxmlIndexDelete(ind);
-
-

SAX (Stream) Loading of Documents

-

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.

-

The mxmlSAXLoadFd, -mxmlSAXLoadFile, and -mxmlSAXLoadString functions provide the SAX loading APIs. - Each function works like the corresponding mxmlLoad function - but uses a callback to process each node as it is read.

-

The callback function receives the node, an event code, and a user - data pointer you supply:

-
-    void
-    sax_cb(mxml_node_t *node,
-           mxml_sax_event_t event,
-           void *data)
-    {
-      ... do something ...
-    }
-
-

The event will be one of the following:

-
    -
  • MXML_SAX_CDATA - CDATA was just read
  • -
  • MXML_SAX_COMMENT - A comment was just read
  • -
  • MXML_SAX_DATA - Data (custom, integer, opaque, real, or - text) was just read
  • -
  • MXML_SAX_DIRECTIVE - A processing directive was just read
  • -
  • MXML_SAX_ELEMENT_CLOSE - A close element was just read ( -</element>)
  • -
  • MXML_SAX_ELEMENT_OPEN - An open element was just read ( -<element>)
  • -
-

Elements are released after the close element is processed. - All other nodes are released after they are processed. The SAX callback - can retain the node using the -mxmlRetain function. For example, the following SAX - callback will retain all nodes, effectively simulating a normal - in-memory load:

-
-    void
-    sax_cb(mxml_node_t *node,
-           mxml_sax_event_t event,
-           void *data)
-    {
-      if (event != MXML_SAX_ELEMENT_CLOSE)
-        mxmlRetain(node);
-    }
-
-

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 <html>, -<head>, and <body>, and processing directives like -<?xml ... ?> and <!DOCTYPE ... >:

- - -
-    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);
-        }
-      }
-    }
-
-

The resulting skeleton document tree can then be searched just like - one loaded using the mxmlLoad 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:

-
-    mxml_node_t *doc, *title, *body, *heading;
-
-    doc = mxmlSAXLoadFd(NULL, 0,
-                        MXML_TEXT_CALLBACK,
-                        sax_cb, 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);
-    }
-
-
-Contents -Previous -Next - - diff --git a/www/docfiles/basics.html b/www/docfiles/basics.html deleted file mode 100644 index c3e3521..0000000 --- a/www/docfiles/basics.html +++ /dev/null @@ -1,520 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - - -Contents -Previous -Next -
-

2Getting Started with Mini-XML

-

This chapter describes how to write programs that use Mini-XML to - access data in an XML file. Mini-XML provides the following - functionality:

-
    -
  • Functions for creating and managing XML documents in memory.
  • -
  • Reading of UTF-8 and UTF-16 encoded XML files and strings.
  • -
  • Writing of UTF-8 encoded XML files and strings.
  • -
  • Support for arbitrary element names, attributes, and attribute - values with no preset limits, just available memory.
  • -
  • Support for integer, real, opaque ("CDATA"), and text data types in - "leaf" nodes.
  • -
  • "Find", "index", and "walk" functions for easily accessing data in - an XML document.
  • -
-

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.

-

The Basics

-

Mini-XML provides a single header file which you include:

-
-    #include <mxml.h>
-
-

The Mini-XML library is included with your program using the --lmxml option:

-
-    gcc -o myprogram myprogram.c -lmxml ENTER
-
-

If you have the pkg-config(1) software installed, you can - use it to determine the proper compiler and linker options for your - installation:

-
-    pkg-config --cflags mxml ENTER
-    pkg-config --libs mxml ENTER
-
-

Nodes

-

Every piece of information in an XML file is stored in memory in - "nodes". Nodes are defined by the -mxml_node_t structure. Each node has a typed value, optional - user data, a parent node, sibling nodes (previous and next), and - potentially child nodes.

-

For example, if you have an XML file like the following:

-
-    <?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>
-
-

the node tree for the file would look like the following in memory:

-
-    ?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
-
-

where "-" is a pointer to the sibling node and "|" is a pointer to - the first child or parent node.

-

The mxmlGetType - function gets the type of a node, one of MXML_CUSTOM, -MXML_ELEMENT, MXML_INTEGER, MXML_OPAQUE, -MXML_REAL, or MXML_TEXT. The parent and sibling nodes are - accessed using the -mxmlGetParent, mxmlGetNext, - and mxmlGetPrevious functions. - The mxmlGetUserData - function gets any user data associated with the node.

-

CDATA Nodes

-

CDATA (MXML_ELEMENT) nodes are created using the -mxmlNewCDATA function. The -mxmlGetCDATA function retrieves the CDATA string pointer - for a node.

-
Note: -

CDATA nodes are currently stored in memory as special elements. This - will be changed in a future major release of Mini-XML.

-
-

Custom Nodes

-

Custom (MXML_CUSTOM) nodes are created using the -mxmlNewCustom function or using a custom load callback - specified using the -mxmlSetCustomHandlers function. The -mxmlGetCustom function retrieves the custom value pointer - for a node.

-

Comment Nodes

-

Comment (MXML_ELEMENT) nodes are created using the -mxmlNewElement function. The -mxmlGetElement function retrieves the comment string - pointer for a node, including the surrounding "!--" and "--" - characters.

-
Note: -

Comment nodes are currently stored in memory as special elements. - This will be changed in a future major release of Mini-XML.

-
-

Element Nodes

-

Element (MXML_ELEMENT) nodes are created using the -mxmlNewElement function. The -mxmlGetElement function retrieves the element name, the -mxmlElementGetAttr function retrieves the value string for - a named attribute associated with the element, and the -mxmlGetFirstChild and -mxmlGetLastChild functions retrieve the first and last - child nodes for the element, respectively.

-

Integer Nodes

-

Integer (MXML_INTEGER) nodes are created using the -mxmlNewInteger function. The -mxmlGetInteger function retrieves the integer value for a - node.

-

Opaque Nodes

-

Opaque (MXML_OPAQUE) nodes are created using the -mxmlNewOpaque function. The -mxmlGetOpaque function retrieves the opaque string pointer - for a node. Opaque nodes are like string nodes but preserve all - whitespace between nodes.

-

Text Nodes

-

Text (MXML_TEXT) nodes are created using the -mxmlNewText and -mxmlNewTextf functions. Each text node consists of a text - string and (leading) whitespace value - the -mxmlGetText function retrieves the text string pointer and - whitespace value for a node.

- - -

Processing Instruction Nodes

-

Processing instruction (MXML_ELEMENT) nodes are created - using the mxmlNewElement - function. The -mxmlGetElement function retrieves the processing instruction - string for a node, including the surrounding "?" characters.

-
Note: -

Processing instruction nodes are currently stored in memory as - special elements. This will be changed in a future major release of - Mini-XML.

-
-

Real Number Nodes

-

Real number (MXML_REAL) nodes are created using the -mxmlNewReal function. The -mxmlGetReal function retrieves the CDATA string pointer for - a node.

- - -

XML Declaration Nodes

-

XML declaration (MXML_ELEMENT) nodes are created using the mxmlNewXML function. The mxmlGetElement - function retrieves the XML declaration string for a node, including the - surrounding "?" characters.

-
Note: -

XML declaration nodes are currently stored in memory as special - elements. This will be changed in a future major release of Mini-XML.

-
- -

Creating XML Documents

-

You can create and update XML documents in memory using the various -mxmlNew functions. The following code will create the XML document - described in the previous section:

-
-    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");
-
- - -

We start by creating the declaration node common to all XML files - using the mxmlNewXML - function:

-
-    xml = mxmlNewXML("1.0");
-
-

We then create the <data> node used for this document using - the mxmlNewElement - function. The first argument specifies the parent node (xml) - while the second specifies the element name (data):

-
-    data = mxmlNewElement(xml, "data");
-
-

Each <node>...</node> in the file is created using the -mxmlNewElement and -mxmlNewText functions. The first argument of mxmlNewText - specifies the parent node (node). 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:

-
-    node = mxmlNewElement(data, "node");
-    mxmlNewText(node, 0, "val1");
-
-

The resulting in-memory XML document can then be saved or processed - just like one loaded from disk or a string.

- - -

Loading XML

-

You load an XML file using the -mxmlLoadFile function:

-
-    FILE *fp;
-    mxml_node_t *tree;
-
-    fp = fopen("filename.xml", "r");
-    tree = mxmlLoadFile(NULL, fp,
-                        MXML_TEXT_CALLBACK);
-    fclose(fp);
-
-

The first argument specifies an existing XML parent node, if any. - Normally you will pass NULL for this argument unless you are - combining multiple XML sources. The XML file must contain a complete - XML document including the ?xml element if the parent node is -NULL.

-

The second argument specifies the stdio file to read from, as opened - by fopen() or popen(). You can also use stdin - if you are implementing an XML filter program.

-

The third argument specifies a callback function which returns the - value type of the immediate children for a new element node: -MXML_CUSTOM, MXML_IGNORE, MXML_INTEGER, -MXML_OPAQUE, MXML_REAL, or MXML_TEXT. Load - callbacks are described in detail in -Chapter 3. The example code uses the MXML_TEXT_CALLBACK - constant which specifies that all data nodes in the document contain - whitespace-separated text values. Other standard callbacks include -MXML_IGNORE_CALLBACK, MXML_INTEGER_CALLBACK, -MXML_OPAQUE_CALLBACK, and MXML_REAL_CALLBACK.

-

The mxmlLoadString - function loads XML node trees from a string:

- - -
-    char buffer[8192];
-    mxml_node_t *tree;
-
-    ...
-    tree = mxmlLoadString(NULL, buffer,
-                          MXML_TEXT_CALLBACK);
-
-

The first and third arguments are the same as used for -mxmlLoadFile(). The second argument specifies the string or - character buffer to load and must be a complete XML document including - the ?xml element if the parent node is NULL.

- - -

Saving XML

-

You save an XML file using the -mxmlSaveFile function:

-
-    FILE *fp;
-    mxml_node_t *tree;
-
-    fp = fopen("filename.xml", "w");
-    mxmlSaveFile(tree, fp, MXML_NO_CALLBACK);
-    fclose(fp);
-
-

The first argument is the XML node tree to save. It should normally - be a pointer to the top-level ?xml node in your XML document.

-

The second argument is the stdio file to write to, as opened by -fopen() or popen(). You can also use stdout if - you are implementing an XML filter program.

-

The third argument is the whitespace callback to use when saving the - file. Whitespace callbacks are covered in detail in -Chapter 3. The previous example code uses the MXML_NO_CALLBACK - constant to specify that no special whitespace handling is required.

-

The -mxmlSaveAllocString, and -mxmlSaveString functions save XML node trees to strings:

-
-    char buffer[8192];
-    char *ptr;
-    mxml_node_t *tree;
-
-    ...
-    mxmlSaveString(tree, buffer, sizeof(buffer),
-                   MXML_NO_CALLBACK);
-
-    ...
-    ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);
-
-

The first and last arguments are the same as used for -mxmlSaveFile(). The mxmlSaveString function takes pointer - and size arguments for saving the XML document to a fixed-size buffer, - while mxmlSaveAllocString() returns a string buffer that was - allocated using malloc().

- - -

Controlling Line Wrapping

-

When saving XML documents, Mini-XML normally wraps output lines at - column 75 so that the text is readable in terminal windows. The -mxmlSetWrapMargin function overrides the default wrap - margin:

-
-    /* Set the margin to 132 columns */
-    mxmlSetWrapMargin(132);
-
-    /* Disable wrapping */
-    mxmlSetWrapMargin(0);
-
-

Memory Management

-

Once you are done with the XML data, use the -mxmlDelete function to recursively free the memory that is - used for a particular node or the entire tree:

-
-    mxmlDelete(tree);
-
-

You can also use reference counting to manage memory usage. The -mxmlRetain and -mxmlRelease functions increment and decrement a node's use - count, respectively. When the use count goes to 0, mxmlRelease - will automatically call mxmlDelete to actually free the memory - used by the node tree. New nodes automatically start with a use count - of 1.

- - -

Finding and Iterating Nodes

-

The mxmlWalkPrev - and mxmlWalkNext -functions can be used to iterate through the XML node tree:

-
-    mxml_node_t *node;
-    
-    node = mxmlWalkPrev(current, tree,
-                        MXML_DESCEND);
-
-    node = mxmlWalkNext(current, tree,
-                        MXML_DESCEND);
-
-

In addition, you can find a named element/node using the -mxmlFindElement function:

-
-    mxml_node_t *node;
-    
-    node = mxmlFindElement(tree, tree, "name",
-                           "attr", "value",
-                           MXML_DESCEND);
-
-

The name, attr, and value arguments can be - passed as NULL to act as wildcards, e.g.:

- - -
-    /* Find the first "a" element */
-    node = mxmlFindElement(tree, tree, "a",
-                           NULL, NULL,
-                           MXML_DESCEND);
-
- - -
-    /* Find the first "a" element with "href"
-       attribute */
-    node = mxmlFindElement(tree, tree, "a",
-                           "href", NULL,
-                           MXML_DESCEND);
-
- - -
-    /* Find the first "a" element with "href"
-       to a URL */
-    node = mxmlFindElement(tree, tree, "a",
-                           "href",
-                           "http://www.easysw.com/",
-                           MXML_DESCEND);
-
- - -
-    /* Find the first element with a "src"
-       attribute */
-    node = mxmlFindElement(tree, tree, NULL,
-                           "src", NULL,
-                           MXML_DESCEND);
-
- - -
-    /* Find the first element with a "src"
-       = "foo.jpg" */
-    node = mxmlFindElement(tree, tree, NULL,
-                           "src", "foo.jpg",
-                           MXML_DESCEND);
-
-

You can also iterate with the same function:

-
-    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 ...
-    }
-
- - -

The MXML_DESCEND argument can actually be one of three - constants:

-
    -
  • MXML_NO_DESCEND 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. -

    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. -
    -

    -
  • -
  • MXML_DESCEND_FIRST 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. -

    This mode is only applicable to the search function; the walk - functions treat this as MXML_DESCEND since every call is a - first time. -
    -

    -
  • -
  • MXML_DESCEND 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". -

    If you were to walk from the root node "?xml" to the end of the tree - with mxmlWalkNext(), the order would be:

    -

    ?xml data node val1 node val2 node val3 group node val4 node val5 - node val6 node val7 node val8

    -

    If you started at "val8" and walked using mxmlWalkPrev(), - the order would be reversed, ending at "?xml".

    -
  • -
-

Finding Specific Nodes

-

You can find specific nodes in the tree using the -mxmlFindPath, for example:

-
-    mxml_node_t *value;
-
-    value = mxmlFindPath(tree, "path/to/*/foo/bar");
-
-

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.

-
-Contents -Previous -Next - - diff --git a/www/docfiles/index.html b/www/docfiles/index.html deleted file mode 100644 index 357fb88..0000000 --- a/www/docfiles/index.html +++ /dev/null @@ -1,210 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - -

Table of Contents

-
-
Introduction - -Building, Installing, and Packaging - Mini-XML - -Getting Started with Mini-XML - -More Mini-XML Programming Techniques - - -Using the mxmldoc Utility - -Mini-XML License -
-
Release Notes -
    -Library Reference - -XML Schema -
      - - diff --git a/www/docfiles/install.html b/www/docfiles/install.html deleted file mode 100644 index 25e07a3..0000000 --- a/www/docfiles/install.html +++ /dev/null @@ -1,115 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - - -Contents -Previous -Next -
      -

      1Building, Installing, and - Packaging Mini-XML

      -

      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 -make program in addition to the C compiler.

      -

      Compiling Mini-XML

      -

      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.

      -

      Compiling with Visual C++

      -

      Open the mxml.sln solution in the vcnet folder. - Choose the desired build configuration, "Debug" (the default) or - "Release", and then choose Build Solution from the - Build menu.

      -

      Compiling with Command-Line Tools

      -

      Type the following command to configure the Mini-XML source code for - your system:

      -
      -    ./configure ENTER
      -
      -

      The default install prefix is /usr/local, which can be - overridden using the --prefix option:

      -
      -    ./configure --prefix=/foo ENTER
      -
      -

      Other configure options can be found using the --help - option:

      -
      -    ./configure --help ENTER
      -
      -

      Once you have configured the software, use the make(1) - program to do the build and run the test program to verify that things - are working, as follows:

      -
      -    make ENTER
      -
      -

      Installing Mini-XML

      -

      If you are using Visual C++, copy the mxml.lib and and - mxml.h files to the Visual C++ lib and include - directories, respectively.

      -

      Otherwise, use the make command with the install - target to install Mini-XML in the configured directories:

      -
      -    make install ENTER
      -
      -

      Creating Mini-XML Packages

      -

      Mini-XML includes two files that can be used to create binary - packages. The first file is mxml.spec which is used by the -rpmbuild(8) software to create Red Hat Package Manager ("RPM") - packages which are commonly used on Linux. Since rpmbuild - wants to compile the software on its own, you can provide it with the - Mini-XML tar file to build the package:

      -
      -    rpmbuild -ta mxml-version.tar.gz ENTER
      -
      -

      The second file is mxml.list which is used by the -epm(1) program to create software packages in a variety of formats. - The epm program is available from the following URL:

      -
      -    http://www.epmhome.org/
      -
      -

      Use the make command with the epm target to - create portable and native packages for your system:

      -
      -    make epm ENTER
      -
      -

      The packages are stored in a subdirectory named dist 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 mxml.install script to install the - software.

      -

      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.

      -
      -Contents -Previous -Next - - diff --git a/www/docfiles/intro.html b/www/docfiles/intro.html deleted file mode 100644 index 865c6b8..0000000 --- a/www/docfiles/intro.html +++ /dev/null @@ -1,175 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - -Contents -Next -
      -

      0Introduction

      -

      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.

      -

      Mini-XML was initially developed for the -Gutenprint project to replace the rather large and unwieldy -libxml2 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:

      -
      It's bad enough that we require libxml2, but rolling our - own XML parser is a bit more than we can handle.
      -

      I then replied with:

      -
      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.
      -

      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.

      -

      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.

      -

      Aside from Gutenprint, Mini-XML is used for the following - projects/software applications:

      - -

      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.

      - - -

      Organization of This Document

      -

      This manual is organized into the following chapters and appendices:

      - - - -

      Notation Conventions

      -

      Various font and syntax conventions are used in this guide. Examples - and their meanings and uses are explained below:

      -
      -
      mxmldoc -
      mxmldoc(1)
      -
      The names of commands; the first mention of a command or function in - a chapter is followed by a manual page section number. -
      -
      -
      /var -
      /etc/hosts
      -
      File and directory names. -
      -
      -
      Request ID is Printer-123
      -
      Screen output. -
      -
      -
      lp -d printer filename ENTER
      -
      Literal user input; special keys like ENTER are in ALL - CAPS. -
      -
      -
      12.3
      -
      Numbers in the text are written using the period (.) to indicate the - decimal point. -
      -
      -
      - - -

      Abbreviations

      -

      The following abbreviations are used throughout this manual:

      -
      -
      Gb
      -
      Gigabytes, or 1073741824 bytes -
      -
      -
      kb
      -
      Kilobytes, or 1024 bytes -
      -
      -
      Mb
      -
      Megabytes, or 1048576 bytes -
      -
      -
      UTF-8, UTF-16
      -
      Unicode Transformation Format, 8-bit or 16-bit -
      -
      -
      W3C
      -
      World Wide Web Consortium -
      -
      -
      XML
      -
      Extensible Markup Language -
      -
      -
      - - -

      Other References

      -
      -
      The Unicode Standard, Version 4.0, Addison-Wesley, ISBN - 0-321-18578-1
      -
      The definition of the Unicode character set which is used for XML. -
      -
      -
      Extensible - Markup Language (XML) 1.0 (Third Edition)
      -
      The XML specification from the World Wide Web Consortium (W3C) -
      -
      -
      - - -

      Legal Stuff

      -

      The Mini-XML library is copyright 2003-2011 by Michael Sweet. License - terms are described in Appendix A - - Mini-XML License.

      -
      -Contents -Next - - diff --git a/www/docfiles/license.html b/www/docfiles/license.html deleted file mode 100644 index 7d526fd..0000000 --- a/www/docfiles/license.html +++ /dev/null @@ -1,467 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - - -Contents -Previous -Next -
      -

      AMini-XML License

      -

      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:

      -

      1. 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.

      -

      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.

      -

      2. 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.

      -

       

      -

      GNU LIBRARY GENERAL PUBLIC LICENSE

      -

      Version 2, June 1991 -
      Copyright (C) 1991 Free Software Foundation, Inc. -
      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA -
      Everyone is permitted to copy and distribute verbatim copies of - this license document, but changing it is not allowed. -
      [This is the first released version of the library GPL. It is - numbered 2 because it goes with version 2 of the ordinary GPL.]

      -

      Preamble

      -

      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.

      -

      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.

      -

      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.

      -

      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.

      -

      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.

      -

      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.

      -

      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.

      -

      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.

      -

      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.

      -

      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.

      -

      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.

      -

      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.

      -

      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.

      -

      Note that it is possible for a library to be covered by the ordinary - General Public License rather than by this special one.

      -

      TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND - MODIFICATION

      -

      0. 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".

      -

      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.

      -

      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".)

      -

      "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.

      -

      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.

      -

      1. 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.

      -

      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.

      -

      2. 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:

      -
        -

        a) The modified work must itself be a software - library.

        -

        b) You must cause the files modified to carry - prominent notices stating that you changed the files and the date of - any change.

        -

        c) You must cause the whole of the work to be - licensed at no charge to all third parties under the terms of this - License.

        -

        d) 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.

        -

        (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.)

        -
      -

      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.

      -

      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.

      -

      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.

      -

      3. 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.

      -

      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.

      -

      This option is useful when you wish to copy part of the code of the - Library into a program that is not a library.

      -

      4. 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.

      -

      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.

      -

      5. 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.

      -

      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.

      -

      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.

      -

      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.)

      -

      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.

      -

      6. 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.

      -

      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:

      -
        a) 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.) -

        b) 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.

        -

        c) 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.

        -

        d) Verify that the user has already received a copy - of these materials or that you have already sent this user a copy.

        -
      -

      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.

      -

      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.

      -

      7. 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:

      -
        a) 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. -

        b) 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.

        -
      -

      8. 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.

      -

      9. 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.

      -

      10. 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.

      -

      11. 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.

      -

      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.

      -

      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.

      -

      This section is intended to make thoroughly clear what is believed to - be a consequence of the rest of this License.

      -

      12. 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.

      -

      13. 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.

      -

      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.

      -

      14. 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.

      -

      NO WARRANTY

      -

      15. 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.

      -

      16. 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.

      -

      END OF TERMS AND CONDITIONS

      -

      How to Apply These Terms to Your New Libraries

      -

      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).

      -

      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.

      -
        -

        one line to give the library's name and an idea of what it does. -
        Copyright (C) year name of author

        -

        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.

        -

        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.

        -

        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

        -
      -

      Also add information on how to contact you by electronic and paper - mail.

      -

      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:

      -
        -

        Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random - Hacker.

        -

        signature of Ty Coon, 1 April 1990 Ty Coon, President of - Vice

        -
      -

      That's all there is to it!

      -
      -Contents -Previous -Next - - diff --git a/www/docfiles/mxmldoc.html b/www/docfiles/mxmldoc.html deleted file mode 100644 index a799343..0000000 --- a/www/docfiles/mxmldoc.html +++ /dev/null @@ -1,187 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - - -Contents -Previous -Next -
      -

      4Using the mxmldoc Utility

      -

      This chapter describes how to use mxmldoc(1) program to - automatically generate documentation from C and C++ source files.

      -

      The Basics

      -

      Originally developed to generate the Mini-XML and CUPS API - documentation, mxmldoc 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, mxmldoc uses in-line - comments rather than comment headers, allowing for more "natural" code - documentation.

      -

      By default, mxmldoc 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 filename.html:

      -
      -    mxmldoc *.h *.c >filename.html ENTER
      -
      -

      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 filename.xml in addition to the - HTML file:

      -
      -    mxmldoc filename.xml *.h *.c >filename.html ENTER
      -
      -

      The --no-output option disables the normal HTML output:

      -
      -    mxmldoc --no-output filename.xml *.h *.c ENTER
      -
      -

      You can then run mxmldoc again with the XML file alone to - generate the HTML documentation:

      -
      -    mxmldoc filename.xml >filename.html ENTER
      -
      -

      Creating Man Pages

      -

      The --man filename option tells mxmldoc to create a - man page instead of HTML documentation, for example:

      -
      -    mxmldoc --man filename filename.xml \
      -        >filename.man ENTER
      -
      -    mxmldoc --man filename *.h *.c \
      -        >filename.man ENTER
      -
      -

      Creating Xcode Documentation Sets

      -

      The --docset directory.docset option tells mxmldoc - to create an Xcode documentation set containing the HTML documentation, - for example:

      -
      -    mxmldoc --docset foo.docset *.h *.c foo.xml ENTER
      -
      -

      Xcode documentation sets can only be built on Mac OS X with Xcode 3.0 - or higher installed.

      -

      Commenting Your Code

      -

      As noted previously, mxmldoc looks for in-line comments to - describe the functions, types, and constants in your code. Mxmldoc - 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 @private@ directive are - treated as private and are not documented.

      -

      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:

      -
      -    /* 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 */
      -    {
      -      ...
      -    }
      -
      -

      Mxmldoc also knows to remove extra asterisks (*) from the - comment string, so the comment string:

      -
      -    /*
      -     * 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.
      -     */
      -
      -

      will be shown as:

      -
      -    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.
      -
      -

      Comments can also include the following - special @name ...@ directive strings:

      -
        -
      • @deprecated@ - flags the item as deprecated to discourage - its use
      • -
      • @private@ - flags the item as private so it will not be - included in the documentation
      • -
      • @since ...@ - flags the item as new since a particular - release. The text following the @since up to the closing @ - is highlighted in the generated documentation, e.g. @since Mini-XML - 2.7@.
      • -
      - - -

      Titles, Sections, and Introductions

      -

      Mxmldoc also provides options to set the title, section, and - introduction text for the generated documentation. The --title text - option specifies the title for the documentation. The title string is - usually put in quotes:

      -
      -    mxmldoc filename.xml \
      -        --title "My Famous Documentation" \
      -        >filename.html ENTER
      -
      -

      The --section name option specifies the section for the - documentation. For HTML documentation, the name is placed in a HTML - comment such as:

      -
      -    <!-- SECTION: name -->
      -
      -

      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 .TH directive in the man page:

      -
      -    .TH mylibrary 3acme "My Title" ...
      -
      -

      The default section name for man page output is "3". There is no - default section name for HTML output.

      -

      Finally, the --intro filename 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 DOCTYPE, html, and body - elements. For man page documentation, the file must consist of valid -nroff(1) text.

      -
      -Contents -Previous -Next - - diff --git a/www/docfiles/reference.html b/www/docfiles/reference.html deleted file mode 100644 index a8f9aa9..0000000 --- a/www/docfiles/reference.html +++ /dev/null @@ -1,1747 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - - -Contents -Previous -Next -
      -
      -

      CLibrary Reference

      -

      Contents

      - -

      Functions

      -

      mxmlAdd

      -

      Add a node to a tree.

      -

      void mxmlAdd ( -
          mxml_node_t *parent, -
          int where, -
          mxml_node_t *child, -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node
      -
      where
      -
      Where to add, MXML_ADD_BEFORE or MXML_ADD_AFTER
      -
      child
      -
      Child node for where or MXML_ADD_TO_PARENT
      -
      node
      -
      Node to add
      -
      -

      Discussion

      -

      Adds the specified node to the parent. If the - child argument is not NULL, puts the new node before or after the - specified child depending on the value of the where argument. If the - child argument is NULL, puts the new node at the beginning of the child - list (MXML_ADD_BEFORE) or at the end of the child list - (MXML_ADD_AFTER). The constant MXML_ADD_TO_PARENT can be used to - specify a NULL child pointer.

      -

      mxmlDelete

      -

      Delete a node and all of its children.

      -

      void mxmlDelete ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to delete
      -
      -

      Discussion

      -

      If the specified node has a parent, this function - first removes the node from its parent using the mxmlRemove() function.

      -

      - - Mini-XML 2.4 mxmlElementDeleteAttr -

      -

      Delete an attribute.

      -

      void mxmlElementDeleteAttr ( -
          mxml_node_t *node, -
          const char *name -
      );

      -

      Parameters

      -
      -
      node
      -
      Element
      -
      name
      -
      Attribute name
      -
      -

      mxmlElementGetAttr

      -

      Get an attribute.

      -

      const char *mxmlElementGetAttr ( -
          mxml_node_t *node, -
          const char *name -
      );

      -

      Parameters

      -
      -
      node
      -
      Element node
      -
      name
      -
      Name of attribute
      -
      -

      Return Value

      -

      Attribute value or NULL

      -

      Discussion

      -

      This function returns NULL if the node is not an - element or the named attribute does not exist.

      -

      mxmlElementSetAttr

      -

      Set an attribute.

      -

      void mxmlElementSetAttr ( -
          mxml_node_t *node, -
          const char *name, -
          const char *value -
      );

      -

      Parameters

      -
      -
      node
      -
      Element node
      -
      name
      -
      Name of attribute
      -
      value
      -
      Attribute value
      -
      -

      Discussion

      -

      If the named attribute already exists, the value - of the attribute is replaced by the new string value. The string value - is copied into the element node. This function does nothing if the node - is not an element.

      -

      - - Mini-XML 2.3 mxmlElementSetAttrf

      -

      Set an attribute with a formatted value.

      -

      void mxmlElementSetAttrf ( -
          mxml_node_t *node, -
          const char *name, -
          const char *format, -
          ... -
      );

      -

      Parameters

      -
      -
      node
      -
      Element node
      -
      name
      -
      Name of attribute
      -
      format
      -
      Printf-style attribute value
      -
      ...
      -
      Additional arguments as needed
      -
      -

      Discussion

      -

      If the named attribute already exists, the value - of the attribute is replaced by the new formatted string. The formatted - string value is copied into the element node. This function does - nothing if the node is not an element.

      -

      -mxmlEntityAddCallback

      -

      Add a callback to convert entities to Unicode.

      -

      int mxmlEntityAddCallback ( -
          mxml_entity_cb_t cb -
      );

      -

      Parameters

      -
      -
      cb
      -
      Callback function to add
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      mxmlEntityGetName

      -

      Get the name that corresponds to the character - value.

      -

      const char *mxmlEntityGetName ( -
          int val -
      );

      -

      Parameters

      -
      -
      val
      -
      Character value
      -
      -

      Return Value

      -

      Entity name or NULL

      -

      Discussion

      -

      If val does not need to be represented by a named - entity, NULL is returned.

      -

      mxmlEntityGetValue

      -

      Get the character corresponding to a named - entity.

      -

      int mxmlEntityGetValue ( -
          const char *name -
      );

      -

      Parameters

      -
      -
      name
      -
      Entity name
      -
      -

      Return Value

      -

      Character value or -1 on error

      -

      Discussion

      -

      The entity name can also be a numeric constant. -1 - is returned if the name is not known.

      -

      -mxmlEntityRemoveCallback

      -

      Remove a callback.

      -

      void mxmlEntityRemoveCallback ( -
          mxml_entity_cb_t cb -
      );

      -

      Parameters

      -
      -
      cb
      -
      Callback function to remove
      -
      -

      mxmlFindElement

      -

      Find the named element.

      -

      mxml_node_t *mxmlFindElement - ( -
          mxml_node_t *node, -
          mxml_node_t *top, -
          const char *name, -
          const char *attr, -
          const char *value, -
          int descend -
      );

      -

      Parameters

      -
      -
      node
      -
      Current node
      -
      top
      -
      Top node
      -
      name
      -
      Element name or NULL for any
      -
      attr
      -
      Attribute name, or NULL for none
      -
      value
      -
      Attribute value, or NULL for any
      -
      descend
      -
      Descend into tree - MXML_DESCEND, - MXML_NO_DESCEND, or MXML_DESCEND_FIRST
      -
      -

      Return Value

      -

      Element node or NULL

      -

      Discussion

      -

      The search is constrained by the name, attribute - name, and value; any NULL names or values are treated as wildcards, so - different kinds of searches can be implemented by looking for all - elements of a given name or all elements with a specific attribute. The - descend argument determines whether the search descends into child - nodes; normally you will use MXML_DESCEND_FIRST for the initial search - and MXML_NO_DESCEND to find additional direct descendents of the node. - The top node argument constrains the search to a particular node's - children.

      -

      - - Mini-XML 2.7 mxmlFindPath

      -

      Find a node with the given path.

      -

      mxml_node_t *mxmlFindPath ( -
          mxml_node_t *top, -
          const char *path -
      );

      -

      Parameters

      -
      -
      top
      -
      Top node
      -
      path
      -
      Path to element
      -
      -

      Return Value

      -

      Found node or NULL

      -

      Discussion

      -

      The "path" is a slash-separated list of element - names. The name "*" is considered a wildcard for one or more levels of - elements. For example, "foo/one/two", "bar/two/one", "*/one", and so - forth. -
      -
      The first child node of the found node is returned if the given - node has children and the first child is a value node.

      -

      - - Mini-XML 2.7 mxmlGetCDATA

      -

      Get the value for a CDATA node.

      -

      const char *mxmlGetCDATA ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      CDATA value or NULL

      -

      Discussion

      -

      NULL is returned if the node is not a - CDATA element.

      -

      - - Mini-XML 2.7 mxmlGetCustom

      -

      Get the value for a custom node.

      -

      const void *mxmlGetCustom ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Custom value or NULL

      -

      Discussion

      -

      NULL is returned if the node (or its - first child) is not a custom value node.

      -

      - - Mini-XML 2.7 mxmlGetElement

      -

      Get the name for an element node.

      -

      const char *mxmlGetElement ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Element name or NULL

      -

      Discussion

      -

      NULL is returned if the node is not - an element node.

      -

      - - Mini-XML 2.7 mxmlGetFirstChild

      -

      Get the first child of an element node.

      -

      mxml_node_t - *mxmlGetFirstChild ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      First child or NULL

      -

      Discussion

      -

      NULL is returned if the node is not - an element node or if the node has no children.

      -

      - - Mini-XML 2.7 mxmlGetInteger

      -

      Get the integer value from the specified node or - its first child.

      -

      int mxmlGetInteger ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Integer value or 0

      -

      Discussion

      -

      0 is returned if the node (or its first child) is - not an integer value node.

      -

      - - Mini-XML 2.7 mxmlGetLastChild

      -

      Get the last child of an element node.

      -

      mxml_node_t - *mxmlGetLastChild ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Last child or NULL

      -

      Discussion

      -

      NULL is returned if the node is not - an element node or if the node has no children.

      -

      mxmlGetNextSibling

      -

      Return the node type...

      -

      mxml_node_t - *mxmlGetNextSibling ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Get the next node for the current parent.

      -

      NULL is returned if this is the last - child for the current parent.

      -

      - - Mini-XML 2.7 mxmlGetOpaque

      -

      Get an opaque string value for a node or its - first child.

      -

      const char *mxmlGetOpaque ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Opaque string or NULL

      -

      Discussion

      -

      NULL is returned if the node (or its - first child) is not an opaque value node.

      -

      - - Mini-XML 2.7 mxmlGetParent

      -

      Get the parent node.

      -

      mxml_node_t *mxmlGetParent ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Parent node or NULL

      -

      Discussion

      -

      NULL is returned for a root node.

      -

      - - Mini-XML 2.7 mxmlGetPrevSibling

      -

      Get the previous node for the current parent.

      -

      mxml_node_t - *mxmlGetPrevSibling ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Previous node or NULL

      -

      Discussion

      -

      NULL is returned if this is the first - child for the current parent.

      -

      - - Mini-XML 2.7 mxmlGetReal

      -

      Get the real value for a node or its first child.

      -

      double mxmlGetReal ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Real value or 0.0

      -

      Discussion

      -

      0.0 is returned if the node (or its first child) - is not a real value node.

      -

      - - Mini-XML 2.7 mxmlGetRefCount

      -

      Get the current reference (use) count for a node.

      -

      int mxmlGetRefCount ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node
      -
      -

      Return Value

      -

      Reference count

      -

      Discussion

      -

      The initial reference count of new nodes is 1. Use - the mxmlRetain and -mxmlRelease functions to increment and decrement a - node's reference count. .

      -

      - - Mini-XML 2.7 mxmlGetText

      -

      Get the text value for a node or its first child.

      -

      const char *mxmlGetText ( -
          mxml_node_t *node, -
          int *whitespace -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      whitespace
      -
      1 if string is preceded by whitespace, 0 - otherwise
      -
      -

      Return Value

      -

      Text string or NULL

      -

      Discussion

      -

      NULL is returned if the node (or its - first child) is not a text node. The "whitespace" argument can be NULL.

      -

      - - Mini-XML 2.7 mxmlGetType

      -

      Get the node type.

      -

      mxml_type_t mxmlGetType ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Type of node

      -

      Discussion

      -

      MXML_IGNORE is returned if "node" is -NULL.

      -

      - - Mini-XML 2.7 mxmlGetUserData

      -

      Get the user data pointer for a node.

      -

      void *mxmlGetUserData ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      User data pointer

      -

      mxmlIndexDelete

      -

      Delete an index.

      -

      void mxmlIndexDelete ( -
          mxml_index_t *ind -
      );

      -

      Parameters

      -
      -
      ind
      -
      Index to delete
      -
      -

      mxmlIndexEnum

      -

      Return the next node in the index.

      -

      mxml_node_t *mxmlIndexEnum ( -
          mxml_index_t *ind -
      );

      -

      Parameters

      -
      -
      ind
      -
      Index to enumerate
      -
      -

      Return Value

      -

      Next node or NULL if there is none

      -

      Discussion

      -

      Nodes are returned in the sorted order of the - index.

      -

      mxmlIndexFind

      -

      Find the next matching node.

      -

      mxml_node_t *mxmlIndexFind ( -
          mxml_index_t *ind, -
          const char *element, -
          const char *value -
      );

      -

      Parameters

      -
      -
      ind
      -
      Index to search
      -
      element
      -
      Element name to find, if any
      -
      value
      -
      Attribute value, if any
      -
      -

      Return Value

      -

      Node or NULL if none found

      -

      Discussion

      -

      You should call mxmlIndexReset() prior to using - this function for the first time with a particular set of "element" and - "value" strings. Passing NULL for both "element" and "value" is - equivalent to calling mxmlIndexEnum().

      -

      - - Mini-XML 2.7 mxmlIndexGetCount

      -

      Get the number of nodes in an index.

      -

      int mxmlIndexGetCount ( -
          mxml_index_t *ind -
      );

      -

      Parameters

      -
      -
      ind
      -
      Index of nodes
      -
      -

      Return Value

      -

      Number of nodes in index

      -

      mxmlIndexNew

      -

      Create a new index.

      -

      mxml_index_t *mxmlIndexNew - ( -
          mxml_node_t *node, -
          const char *element, -
          const char *attr -
      );

      -

      Parameters

      -
      -
      node
      -
      XML node tree
      -
      element
      -
      Element to index or NULL for all
      -
      attr
      -
      Attribute to index or NULL for none
      -
      -

      Return Value

      -

      New index

      -

      Discussion

      -

      The index will contain all nodes that contain the - named element and/or attribute. If both "element" and "attr" are NULL, - then the index will contain a sorted list of the elements in the node - tree. Nodes are sorted by element name and optionally by attribute - value if the "attr" argument is not NULL.

      -

      mxmlIndexReset

      -

      Reset the enumeration/find pointer in the index - and return the first node in the index.

      -

      mxml_node_t *mxmlIndexReset - ( -
          mxml_index_t *ind -
      );

      -

      Parameters

      -
      -
      ind
      -
      Index to reset
      -
      -

      Return Value

      -

      First node or NULL if there is none

      -

      Discussion

      -

      This function should be called prior to using - mxmlIndexEnum() or mxmlIndexFind() for the first time.

      -

      mxmlLoadFd

      -

      Load a file descriptor into an XML node tree.

      -

      mxml_node_t *mxmlLoadFd ( -
          mxml_node_t *top, -
          int fd, -
          mxml_load_cb_t cb -
      );

      -

      Parameters

      -
      -
      top
      -
      Top node
      -
      fd
      -
      File descriptor to read from
      -
      cb
      -
      Callback function or MXML_NO_CALLBACK
      -
      -

      Return Value

      -

      First node or NULL if the file could not be read.

      -

      Discussion

      -

      The nodes in the specified file are added to the - specified top node. If no top node is provided, the XML file MUST be - well-formed with a single parent node like <?xml> for the entire file. - The callback function returns the value type that should be used for - child nodes. If MXML_NO_CALLBACK is specified then all child nodes will - be either MXML_ELEMENT or MXML_TEXT nodes. -
      -
      The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type.

      -

      mxmlLoadFile

      -

      Load a file into an XML node tree.

      -

      mxml_node_t *mxmlLoadFile ( -
          mxml_node_t *top, -
          FILE *fp, -
          mxml_load_cb_t cb -
      );

      -

      Parameters

      -
      -
      top
      -
      Top node
      -
      fp
      -
      File to read from
      -
      cb
      -
      Callback function or MXML_NO_CALLBACK
      -
      -

      Return Value

      -

      First node or NULL if the file could not be read.

      -

      Discussion

      -

      The nodes in the specified file are added to the - specified top node. If no top node is provided, the XML file MUST be - well-formed with a single parent node like <?xml> for the entire file. - The callback function returns the value type that should be used for - child nodes. If MXML_NO_CALLBACK is specified then all child nodes will - be either MXML_ELEMENT or MXML_TEXT nodes. -
      -
      The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type.

      -

      mxmlLoadString

      -

      Load a string into an XML node tree.

      -

      mxml_node_t *mxmlLoadString - ( -
          mxml_node_t *top, -
          const char *s, -
          mxml_load_cb_t cb -
      );

      -

      Parameters

      -
      -
      top
      -
      Top node
      -
      s
      -
      String to load
      -
      cb
      -
      Callback function or MXML_NO_CALLBACK
      -
      -

      Return Value

      -

      First node or NULL if the string has errors.

      -

      Discussion

      -

      The nodes in the specified string are added to the - specified top node. If no top node is provided, the XML string MUST be - well-formed with a single parent node like <?xml> for the entire - string. The callback function returns the value type that should be - used for child nodes. If MXML_NO_CALLBACK is specified then all child - nodes will be either MXML_ELEMENT or MXML_TEXT nodes. -
      -
      The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type.

      -

      - - Mini-XML 2.3 mxmlNewCDATA

      -

      Create a new CDATA node.

      -

      mxml_node_t *mxmlNewCDATA ( -
          mxml_node_t *parent, -
          const char *data -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node or MXML_NO_PARENT
      -
      data
      -
      Data string
      -
      -

      Return Value

      -

      New node

      -

      Discussion

      -

      The new CDATA node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new CDATA node has no parent. The data string must - be nul-terminated and is copied into the new node. CDATA nodes use the - MXML_ELEMENT type.

      -

      - - Mini-XML 2.1 mxmlNewCustom

      -

      Create a new custom data node.

      -

      mxml_node_t *mxmlNewCustom ( -
          mxml_node_t *parent, -
          void *data, -
          mxml_custom_destroy_cb_t - destroy -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node or MXML_NO_PARENT
      -
      data
      -
      Pointer to data
      -
      destroy
      -
      Function to destroy data
      -
      -

      Return Value

      -

      New node

      -

      Discussion

      -

      The new custom node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new element node has no parent. NULL can be passed - when the data in the node is not dynamically allocated or is separately - managed.

      -

      mxmlNewElement

      -

      Create a new element node.

      -

      mxml_node_t *mxmlNewElement - ( -
          mxml_node_t *parent, -
          const char *name -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node or MXML_NO_PARENT
      -
      name
      -
      Name of element
      -
      -

      Return Value

      -

      New node

      -

      Discussion

      -

      The new element node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new element node has no parent.

      -

      mxmlNewInteger

      -

      Create a new integer node.

      -

      mxml_node_t *mxmlNewInteger - ( -
          mxml_node_t *parent, -
          int integer -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node or MXML_NO_PARENT
      -
      integer
      -
      Integer value
      -
      -

      Return Value

      -

      New node

      -

      Discussion

      -

      The new integer node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new integer node has no parent.

      -

      mxmlNewOpaque

      -

      Create a new opaque string.

      -

      mxml_node_t *mxmlNewOpaque ( -
          mxml_node_t *parent, -
          const char *opaque -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node or MXML_NO_PARENT
      -
      opaque
      -
      Opaque string
      -
      -

      Return Value

      -

      New node

      -

      Discussion

      -

      The new opaque node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new opaque node has no parent. The opaque string - must be nul-terminated and is copied into the new node.

      -

      mxmlNewReal

      -

      Create a new real number node.

      -

      mxml_node_t *mxmlNewReal ( -
          mxml_node_t *parent, -
          double real -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node or MXML_NO_PARENT
      -
      real
      -
      Real number value
      -
      -

      Return Value

      -

      New node

      -

      Discussion

      -

      The new real number node is added to the end of - the specified parent's child list. The constant MXML_NO_PARENT can be - used to specify that the new real number node has no parent.

      -

      mxmlNewText

      -

      Create a new text fragment node.

      -

      mxml_node_t *mxmlNewText ( -
          mxml_node_t *parent, -
          int whitespace, -
          const char *string -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node or MXML_NO_PARENT
      -
      whitespace
      -
      1 = leading whitespace, 0 = no whitespace
      -
      string
      -
      String
      -
      -

      Return Value

      -

      New node

      -

      Discussion

      -

      The new text node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new text node has no parent. The whitespace - parameter is used to specify whether leading whitespace is present - before the node. The text string must be nul-terminated and is copied - into the new node.

      -

      mxmlNewTextf

      -

      Create a new formatted text fragment node.

      -

      mxml_node_t *mxmlNewTextf ( -
          mxml_node_t *parent, -
          int whitespace, -
          const char *format, -
          ... -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node or MXML_NO_PARENT
      -
      whitespace
      -
      1 = leading whitespace, 0 = no whitespace
      -
      format
      -
      Printf-style frmat string
      -
      ...
      -
      Additional args as needed
      -
      -

      Return Value

      -

      New node

      -

      Discussion

      -

      The new text node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new text node has no parent. The whitespace - parameter is used to specify whether leading whitespace is present - before the node. The format string must be nul-terminated and is - formatted into the new node.

      -

      - - Mini-XML 2.3 mxmlNewXML

      -

      Create a new XML document tree.

      -

      mxml_node_t *mxmlNewXML ( -
          const char *version -
      );

      -

      Parameters

      -
      -
      version
      -
      Version number to use
      -
      -

      Return Value

      -

      New ?xml node

      -

      Discussion

      -

      The "version" argument specifies the version - number to put in the ?xml element node. If NULL, version 1.0 is - assumed.

      -

      - - Mini-XML 2.3 mxmlRelease

      -

      Release a node.

      -

      int mxmlRelease ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node
      -
      -

      Return Value

      -

      New reference count

      -

      Discussion

      -

      When the reference count reaches zero, the node - (and any children) is deleted via mxmlDelete().

      -

      mxmlRemove

      -

      Remove a node from its parent.

      -

      void mxmlRemove ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to remove
      -
      -

      Discussion

      -

      Does not free memory used by the node - use - mxmlDelete() for that. This function does nothing if the node has no - parent.

      -

      - - Mini-XML 2.3 mxmlRetain

      -

      Retain a node.

      -

      int mxmlRetain ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node
      -
      -

      Return Value

      -

      New reference count

      -

      - - Mini-XML 2.3 mxmlSAXLoadFd

      -

      Load a file descriptor into an XML node tree - using a SAX callback.

      -

      mxml_node_t *mxmlSAXLoadFd ( -
          mxml_node_t *top, -
          int fd, -
          mxml_load_cb_t cb, -
          mxml_sax_cb_t sax_cb, -
          void *sax_data -
      );

      -

      Parameters

      -
      -
      top
      -
      Top node
      -
      fd
      -
      File descriptor to read from
      -
      cb
      -
      Callback function or MXML_NO_CALLBACK
      -
      sax_cb
      -
      SAX callback or MXML_NO_CALLBACK
      -
      sax_data
      -
      SAX user data
      -
      -

      Return Value

      -

      First node or NULL if the file could not be read.

      -

      Discussion

      -

      The nodes in the specified file are added to the - specified top node. If no top node is provided, the XML file MUST be - well-formed with a single parent node like <?xml> for the entire file. - The callback function returns the value type that should be used for - child nodes. If MXML_NO_CALLBACK is specified then all child nodes will - be either MXML_ELEMENT or MXML_TEXT nodes. -
      -
      The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type. -
      -
      The SAX callback must call mxmlRetain() for any nodes that need to - be kept for later use. Otherwise, nodes are deleted when the parent - node is closed or after each data, comment, CDATA, or directive node.

      -

      - - Mini-XML 2.3 mxmlSAXLoadFile

      -

      Load a file into an XML node tree using a SAX - callback.

      -

      mxml_node_t *mxmlSAXLoadFile - ( -
          mxml_node_t *top, -
          FILE *fp, -
          mxml_load_cb_t cb, -
          mxml_sax_cb_t sax_cb, -
          void *sax_data -
      );

      -

      Parameters

      -
      -
      top
      -
      Top node
      -
      fp
      -
      File to read from
      -
      cb
      -
      Callback function or MXML_NO_CALLBACK
      -
      sax_cb
      -
      SAX callback or MXML_NO_CALLBACK
      -
      sax_data
      -
      SAX user data
      -
      -

      Return Value

      -

      First node or NULL if the file could not be read.

      -

      Discussion

      -

      The nodes in the specified file are added to the - specified top node. If no top node is provided, the XML file MUST be - well-formed with a single parent node like <?xml> for the entire file. - The callback function returns the value type that should be used for - child nodes. If MXML_NO_CALLBACK is specified then all child nodes will - be either MXML_ELEMENT or MXML_TEXT nodes. -
      -
      The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type. -
      -
      The SAX callback must call mxmlRetain() for any nodes that need to - be kept for later use. Otherwise, nodes are deleted when the parent - node is closed or after each data, comment, CDATA, or directive node.

      -

      - - Mini-XML 2.3 mxmlSAXLoadString

      -

      Load a string into an XML node tree using a SAX - callback.

      -

      mxml_node_t - *mxmlSAXLoadString ( -
          mxml_node_t *top, -
          const char *s, -
          mxml_load_cb_t cb, -
          mxml_sax_cb_t sax_cb, -
          void *sax_data -
      );

      -

      Parameters

      -
      -
      top
      -
      Top node
      -
      s
      -
      String to load
      -
      cb
      -
      Callback function or MXML_NO_CALLBACK
      -
      sax_cb
      -
      SAX callback or MXML_NO_CALLBACK
      -
      sax_data
      -
      SAX user data
      -
      -

      Return Value

      -

      First node or NULL if the string has errors.

      -

      Discussion

      -

      The nodes in the specified string are added to the - specified top node. If no top node is provided, the XML string MUST be - well-formed with a single parent node like <?xml> for the entire - string. The callback function returns the value type that should be - used for child nodes. If MXML_NO_CALLBACK is specified then all child - nodes will be either MXML_ELEMENT or MXML_TEXT nodes. -
      -
      The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type. -
      -
      The SAX callback must call mxmlRetain() for any nodes that need to - be kept for later use. Otherwise, nodes are deleted when the parent - node is closed or after each data, comment, CDATA, or directive node.

      -

      mxmlSaveAllocString -

      -

      Save an XML tree to an allocated string.

      -

      char *mxmlSaveAllocString ( -
          mxml_node_t *node, -
          mxml_save_cb_t cb -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to write
      -
      cb
      -
      Whitespace callback or MXML_NO_CALLBACK
      -
      -

      Return Value

      -

      Allocated string or NULL

      -

      Discussion

      -

      This function returns a pointer to a string - containing the textual representation of the XML node tree. The string - should be freed using the free() function when you are done with it. - NULL is returned if the node would produce an empty string or if the - string cannot be allocated. -
      -
      The callback argument specifies a function that returns a - whitespace string or NULL before and after each element. If - MXML_NO_CALLBACK is specified, whitespace will only be added before - MXML_TEXT nodes with leading whitespace and before attribute names - inside opening element tags.

      -

      mxmlSaveFd

      -

      Save an XML tree to a file descriptor.

      -

      int mxmlSaveFd ( -
          mxml_node_t *node, -
          int fd, -
          mxml_save_cb_t cb -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to write
      -
      fd
      -
      File descriptor to write to
      -
      cb
      -
      Whitespace callback or MXML_NO_CALLBACK
      -
      -

      Return Value

      -

      0 on success, -1 on error.

      -

      Discussion

      -

      The callback argument specifies a function that - returns a whitespace string or NULL before and after each element. If - MXML_NO_CALLBACK is specified, whitespace will only be added before - MXML_TEXT nodes with leading whitespace and before attribute names - inside opening element tags.

      -

      mxmlSaveFile

      -

      Save an XML tree to a file.

      -

      int mxmlSaveFile ( -
          mxml_node_t *node, -
          FILE *fp, -
          mxml_save_cb_t cb -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to write
      -
      fp
      -
      File to write to
      -
      cb
      -
      Whitespace callback or MXML_NO_CALLBACK
      -
      -

      Return Value

      -

      0 on success, -1 on error.

      -

      Discussion

      -

      The callback argument specifies a function that - returns a whitespace string or NULL before and after each element. If - MXML_NO_CALLBACK is specified, whitespace will only be added before - MXML_TEXT nodes with leading whitespace and before attribute names - inside opening element tags.

      -

      mxmlSaveString

      -

      Save an XML node tree to a string.

      -

      int mxmlSaveString ( -
          mxml_node_t *node, -
          char *buffer, -
          int bufsize, -
          mxml_save_cb_t cb -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to write
      -
      buffer
      -
      String buffer
      -
      bufsize
      -
      Size of string buffer
      -
      cb
      -
      Whitespace callback or MXML_NO_CALLBACK
      -
      -

      Return Value

      -

      Size of string

      -

      Discussion

      -

      This function returns the total number of bytes - that would be required for the string but only copies (bufsize - 1) - characters into the specified buffer. -
      -
      The callback argument specifies a function that returns a - whitespace string or NULL before and after each element. If - MXML_NO_CALLBACK is specified, whitespace will only be added before - MXML_TEXT nodes with leading whitespace and before attribute names - inside opening element tags.

      -

      - - Mini-XML 2.3 mxmlSetCDATA

      -

      Set the element name of a CDATA node.

      -

      int mxmlSetCDATA ( -
          mxml_node_t *node, -
          const char *data -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      data
      -
      New data string
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      Discussion

      -

      The node is not changed if it (or its first child) - is not a CDATA element node.

      -

      - - Mini-XML 2.1 mxmlSetCustom

      -

      Set the data and destructor of a custom data - node.

      -

      int mxmlSetCustom ( -
          mxml_node_t *node, -
          void *data, -
          mxml_custom_destroy_cb_t - destroy -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      data
      -
      New data pointer
      -
      destroy
      -
      New destructor function
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      Discussion

      -

      The node is not changed if it (or its first child) - is not a custom node.

      -

      -mxmlSetCustomHandlers

      -

      Set the handling functions for custom data.

      -

      void mxmlSetCustomHandlers ( -
          mxml_custom_load_cb_t - load, -
          mxml_custom_save_cb_t save -
      );

      -

      Parameters

      -
      -
      load
      -
      Load function
      -
      save
      -
      Save function
      -
      -

      Discussion

      -

      The load function accepts a node pointer and a - data string and must return 0 on success and non-zero on error. -
      -
      The save function accepts a node pointer and must return a malloc'd - string on success and NULL on error.

      -

      mxmlSetElement

      -

      Set the name of an element node.

      -

      int mxmlSetElement ( -
          mxml_node_t *node, -
          const char *name -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      name
      -
      New name string
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      Discussion

      -

      The node is not changed if it is not an element - node.

      -

      mxmlSetErrorCallback -

      -

      Set the error message callback.

      -

      void mxmlSetErrorCallback ( -
          mxml_error_cb_t cb -
      );

      -

      Parameters

      -
      -
      cb
      -
      Error callback function
      -
      -

      mxmlSetInteger

      -

      Set the value of an integer node.

      -

      int mxmlSetInteger ( -
          mxml_node_t *node, -
          int integer -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      integer
      -
      Integer value
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      Discussion

      -

      The node is not changed if it (or its first child) - is not an integer node.

      -

      mxmlSetOpaque

      -

      Set the value of an opaque node.

      -

      int mxmlSetOpaque ( -
          mxml_node_t *node, -
          const char *opaque -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      opaque
      -
      Opaque string
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      Discussion

      -

      The node is not changed if it (or its first child) - is not an opaque node.

      -

      mxmlSetReal

      -

      Set the value of a real number node.

      -

      int mxmlSetReal ( -
          mxml_node_t *node, -
          double real -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      real
      -
      Real number value
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      Discussion

      -

      The node is not changed if it (or its first child) - is not a real number node.

      -

      mxmlSetText

      -

      Set the value of a text node.

      -

      int mxmlSetText ( -
          mxml_node_t *node, -
          int whitespace, -
          const char *string -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      whitespace
      -
      1 = leading whitespace, 0 = no whitespace
      -
      string
      -
      String
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      Discussion

      -

      The node is not changed if it (or its first child) - is not a text node.

      -

      mxmlSetTextf

      -

      Set the value of a text node to a formatted - string.

      -

      int mxmlSetTextf ( -
          mxml_node_t *node, -
          int whitespace, -
          const char *format, -
          ... -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      whitespace
      -
      1 = leading whitespace, 0 = no whitespace
      -
      format
      -
      Printf-style format string
      -
      ...
      -
      Additional arguments as needed
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      Discussion

      -

      The node is not changed if it (or its first child) - is not a text node.

      -

      - - Mini-XML 2.7 mxmlSetUserData

      -

      Set the user data pointer for a node.

      -

      int mxmlSetUserData ( -
          mxml_node_t *node, -
          void *data -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      data
      -
      User data pointer
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      - - Mini-XML 2.3 mxmlSetWrapMargin

      -

      Set the wrap margin when saving XML data.

      -

      void mxmlSetWrapMargin ( -
          int column -
      );

      -

      Parameters

      -
      -
      column
      -
      Column for wrapping, 0 to disable wrapping
      -
      -

      Discussion

      -

      Wrapping is disabled when "column" is 0.

      -

      mxmlWalkNext

      -

      Walk to the next logical node in the tree.

      -

      mxml_node_t *mxmlWalkNext ( -
          mxml_node_t *node, -
          mxml_node_t *top, -
          int descend -
      );

      -

      Parameters

      -
      -
      node
      -
      Current node
      -
      top
      -
      Top node
      -
      descend
      -
      Descend into tree - MXML_DESCEND, - MXML_NO_DESCEND, or MXML_DESCEND_FIRST
      -
      -

      Return Value

      -

      Next node or NULL

      -

      Discussion

      -

      The descend argument controls whether the first - child is considered to be the next node. The top node argument - constrains the walk to the node's children.

      -

      mxmlWalkPrev

      -

      Walk to the previous logical node in the tree.

      -

      mxml_node_t *mxmlWalkPrev ( -
          mxml_node_t *node, -
          mxml_node_t *top, -
          int descend -
      );

      -

      Parameters

      -
      -
      node
      -
      Current node
      -
      top
      -
      Top node
      -
      descend
      -
      Descend into tree - MXML_DESCEND, - MXML_NO_DESCEND, or MXML_DESCEND_FIRST
      -
      -

      Return Value

      -

      Previous node or NULL

      -

      Discussion

      -

      The descend argument controls whether the previous - node's last child is considered to be the previous node. The top node - argument constrains the walk to the node's children.

      -

      Data Types

      -

      -mxml_custom_destroy_cb_t

      -

      Custom data destructor

      -

      typedef void (*mxml_custom_destroy_cb_t)(void *);

      -

      -mxml_custom_load_cb_t

      -

      Custom data load callback function

      -

      typedef int (*mxml_custom_load_cb_t)( -mxml_node_t *, const char *);

      -

      -mxml_custom_save_cb_t

      -

      Custom data save callback function

      -

      typedef char *(*mxml_custom_save_cb_t)( -mxml_node_t *);

      -

      mxml_entity_cb_t

      -

      Entity callback function

      -

      typedef int (*mxml_entity_cb_t)(const char *);

      -

      mxml_error_cb_t

      -

      Error callback function

      -

      typedef void (*mxml_error_cb_t)(const char *);

      -

      mxml_index_t

      -

      An XML node index.

      -

      typedef struct mxml_index_s - mxml_index_t;

      -

      mxml_load_cb_t

      -

      Load callback function

      -

      typedef mxml_type_t - (*mxml_load_cb_t)(mxml_node_t *);

      -

      mxml_node_t

      -

      An XML node.

      -

      typedef struct mxml_node_s - mxml_node_t;

      -

      mxml_save_cb_t

      -

      Save callback function

      -

      typedef const char *(*mxml_save_cb_t)( -mxml_node_t *, int);

      -

      mxml_sax_cb_t

      -

      SAX callback function

      -

      typedef void (*mxml_sax_cb_t)( -mxml_node_t *, mxml_sax_event_t, void *);

      -

      mxml_sax_event_t

      -

      SAX event type.

      -

      typedef enum -mxml_sax_event_e mxml_sax_event_t;

      -

      mxml_type_t

      -

      The XML node type.

      -

      typedef enum mxml_type_e - mxml_type_t;

      -

      Constants

      -

      mxml_sax_event_e

      -

      SAX event type.

      -

      Constants

      -
      -
      MXML_SAX_CDATA
      -
      CDATA node
      -
      MXML_SAX_COMMENT
      -
      Comment node
      -
      MXML_SAX_DATA
      -
      Data node
      -
      MXML_SAX_DIRECTIVE
      -
      Processing directive node
      -
      MXML_SAX_ELEMENT_CLOSE
      -
      Element closed
      -
      MXML_SAX_ELEMENT_OPEN
      -
      Element opened
      -
      -

      mxml_type_e

      -

      The XML node type.

      -

      Constants

      -
      -
      MXML_CUSTOM - -  Mini-XML 2.1 
      -
      Custom data
      -
      MXML_ELEMENT
      -
      XML element with attributes
      -
      MXML_IGNORE - -  Mini-XML 2.3 
      -
      Ignore/throw away node
      -
      MXML_INTEGER
      -
      Integer value
      -
      MXML_OPAQUE
      -
      Opaque string
      -
      MXML_REAL
      -
      Real value
      -
      MXML_TEXT
      -
      Text fragment
      -
      -

      -Contents -Previous -Next - - diff --git a/www/docfiles/relnotes.html b/www/docfiles/relnotes.html deleted file mode 100644 index 5b2cc59..0000000 --- a/www/docfiles/relnotes.html +++ /dev/null @@ -1,329 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - - -Contents -Previous -Next -
      -

      BRelease Notes

      -

      Changes in Mini-XML 2.7

      -
        -
      • Fixed conformance of mxmldoc's HTML and CSS output.
      • -
      • 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)
      • -
      • Updated the source headers to reference the Mini-XML license and its - exceptions to the LGPL2 (STR #108)
      • -
      • Added a new mxmlFindPath() function to find the value node of a - named element (STR #110)
      • -
      • Building a static version of the library did not work on Windows - (STR #112)
      • -
      • The shared library did not include a destructor for the thread- - specific data key on UNIX-based operating systems (STR #103)
      • -
      • mxmlLoad* did not error out on XML with multiple root nodes (STR - #101)
      • -
      • Fixed an issue with the _mxml_vstrdupf function (STR #107)
      • -
      • mxmlSave* no longer write all siblings of the passed node, just that - node and its children (STR #109)
      • -
      -

      Changes in Mini-XML 2.6

      -
        -
      • Documentation fixes (STR #91, STR #92)
      • -
      • The mxmldoc program did not handle typedef comments properly (STR - #72)
      • -
      • Added support for "long long" printf formats.
      • -
      • The XML parser now ignores BOMs in UTF-8 XML files (STR #89)
      • -
      • The mxmldoc program now supports generating Xcode documentation - sets.
      • -
      • mxmlSave*() did not output UTF-8 correctly on some platforms.
      • -
      • 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.
      • -
      • Wrapping was not disabled when mxmlSetWrapMargin(0) was called, and - "<?xml ... ?>" was always followed by a newline (STR #76)
      • -
      • The mxml.pc.in file was broken (STR #79)
      • -
      • The mxmldoc program now handles "typedef enum name {} name" - correctly (STR #72)
      • -
      -

      Changes in Mini-XML 2.5

      -
        -
      • The mxmldoc program now makes greater use of CSS and supports a - --css option to embed an alternate stylesheet.
      • -
      • The mxmldoc program now supports --header and --footer options to - insert documentation content before and after the generated content.
      • -
      • The mxmldoc program now supports a --framed option to generate - framed HTML output.
      • -
      • The mxmldoc program now creates a table of contents including any - headings in the --intro file when generating HTML output.
      • -
      • The man pages and man page output from mxmldoc did not use "\-" for - dashes (STR #68)
      • -
      • The debug version of the Mini-XML DLL could not be built (STR #65)
      • -
      • Processing instructions and directives did not work when not at the - top level of a document (STR #67)
      • -
      • Spaces around the "=" in attributes were not supported (STR #67)
      • -
      -

      Changes in Mini-XML 2.4

      -
        -
      • Fixed shared library build problems on HP-UX and Mac OS X.
      • -
      • The mxmldoc program did not output argument descriptions for - functions properly.
      • -
      • All global settings (custom, error, and entity callbacks and the - wrap margin) are now managed separately for each thread.
      • -
      • Added mxmlElementDeleteAttr() function (STR #59)
      • -
      • mxmlElementSetAttrf() did not work (STR #57)
      • -
      • mxmlLoad*() incorrectly treated declarations as parent elements (STR - #56)
      • -
      • mxmlLoad*() incorrectly allowed attributes without values (STR #47)
      • -
      • Fixed Visual C++ build problems (STR #49)
      • -
      • mxmlLoad*() did not return NULL when an element contained an error - (STR #46)
      • -
      • Added support for the apos character entity (STR #54)
      • -
      • Fixed whitespace detection with Unicode characters (STR #48)
      • -
      • mxmlWalkNext() and mxmlWalkPrev() did not work correctly when called - with a node with no children as the top node (STR #53)
      • -
      -

      Changes in Mini-XML 2.3

      -
        -
      • Added two exceptions to the LGPL to support static linking of - applications against Mini-XML
      • -
      • The mxmldoc utility can now generate man pages, too.
      • -
      • Added a mxmlNewXML() function
      • -
      • Added a mxmlElementSetAttrf() function (STR #43)
      • -
      • Added a snprintf() emulation function for the test program (STR #32)
      • -
      • Added the _CRT_SECURE_NO_DEPRECATE definition when building on VC++ - 2005 (STR #36)
      • -
      • mxmlLoad*() did not detect missing > characters in elements (STR - #41)
      • -
      • mxmlLoad*() did not detect missing close tags at the end of an XML - document (STR #45)
      • -
      • Added user_data and ref_count members to mxml_node_t structure
      • -
      • Added mxmlReleaseNode() and mxmlRetainNode() APIs for - reference-counted nodes
      • -
      • Added mxmlSetWrapMargin() to control the wrapping of XML output
      • -
      • Added conditional check for EINTR error code for certain Windows - compilers that do not define it (STR #33)
      • -
      • The mxmldoc program now generates correct HTML 4.0 output - - previously it generated invalid XHTML
      • -
      • The mxmldoc program now supports "@deprecated@, "@private@", and - "@since version@" comments
      • -
      • Fixed function and enumeration type bugs in mxmldoc
      • -
      • Fixed the XML schema for mxmldoc
      • -
      • The mxmldoc program now supports --intro, --section, and --title - options
      • -
      • The mxmlLoad*() functions could leak a node on an error (STR #27)
      • -
      • The mxml_vsnprintf() function could get in an infinite loop on a - buffer overflow (STR #25)
      • -
      • Added new mxmlNewCDATA() and mxmlSetCDATA() functions to create and - set CDATA nodes, which are really just special element nodes
      • -
      • Added new MXML_IGNORE type and MXML_IGNORE_CB callback to ignore - non-element nodes, e.g. whitespace
      • -
      • mxmlLoad*() did not treat custom data as opaque, so whitespace - characters would be lost
      • -
      -

      Changes in Mini-XML 2.2.2

      -
        -
      • mxmlLoad*() did not treat custom data as opaque, so whitespace - characters would be lost.
      • -
      -

      Changes in Mini-XML 2.2.1

      -
        -
      • mxmlLoadFd(), mxmlLoadFile(), and mxmlLoadString() now correctly - return NULL on error (STR #21)
      • -
      • mxmlNewInteger(), mxmlNewOpaque(), mxmlNewReal(), mxmlNewText(), and - mxmlNewTextf() incorrectly required a parent node (STR #22)
      • -
      • Fixed an XML output bug in mxmldoc.
      • -
      • The "make install" target now uses the install command to set the - proper permissions on UNIX/Linux/OSX.
      • -
      • Fixed a MingW/Cygwin compilation problem (STR #18)
      • -
      -

      Changes in Mini-XML 2.2

      -
        -
      • Added shared library support (STR #17)
      • -
      • mxmlLoad*() now returns an error when an XML stream contains illegal - control characters (STR #10)
      • -
      • mxmlLoad*() now returns an error when an element contains two - attributes with the same name in conformance with the XML spec (STR - #16)
      • -
      • Added support for CDATA (STR #14, STR #15)
      • -
      • Updated comment and processing instruction handling - no entity - support per XML specification.
      • -
      • Added checking for invalid comment termination ("--->" is not - allowed)
      • -
      -

      Changes in Mini-XML 2.1

      -
        -
      • Added support for custom data nodes (STR #6)
      • -
      • Now treat UTF-8 sequences which are longer than necessary as an - error (STR #4)
      • -
      • Fixed entity number support (STR #8)
      • -
      • Fixed mxmlLoadString() bug with UTF-8 (STR #7)
      • -
      • Fixed entity lookup bug (STR #5)
      • -
      • Added mxmlLoadFd() and mxmlSaveFd() functions.
      • -
      • Fixed multi-word UTF-16 handling.
      • -
      -

      Changes in Mini-XML 2.0

      -
        -
      • New programmers manual.
      • -
      • Added Visual C++ project files for Microsoft Windows users.
      • -
      • Added optimizations to mxmldoc, mxmlSaveFile(), and mxmlIndexNew() - (STR #2)
      • -
      • mxmlEntityAddCallback() now returns an integer status (STR #2)
      • -
      • Added UTF-16 support (input only; all output is UTF-8)
      • -
      • Added index functions to build a searchable index of XML nodes.
      • -
      • Added character entity callback interface to support additional - character entities beyond those defined in the XHTML specification.
      • -
      • Added support for XHTML character entities.
      • -
      • The mxmldoc utility now produces XML output which conforms to an - updated XML schema, described in the file "doc/mxmldoc.xsd".
      • -
      • 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.
      • -
      • The mxmldoc utility now produces XML output which conforms to an - updated XML schema, described in the file "doc/mxmldoc.xsd".
      • -
      • 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.
      • -
      • The mxmldoc utility is now capable of documenting C++ classes, - functions, and structures, and correctly handles C++ comments.
      • -
      • Added new modular tests for mxmldoc.
      • -
      • Updated the mxmldoc output to be more compatible with embedding in - manuals produced with HTMLDOC.
      • -
      • The makefile incorrectly included a "/" separator between the - destination path and install path. This caused problems when building - and installing with MingW.
      • -
      -

      Changes in Mini-XML 1.3

      -
        -
      • Fixes for mxmldoc.
      • -
      • Added support for reading standard HTML entity names.
      • -
      • mxmlLoadString/File() did not decode character entities in element - names, attribute names, or attribute values.
      • -
      • mxmlLoadString/File() would crash when loading non- conformant XML - data under an existing parent (top) node.
      • -
      • Fixed several bugs in the mxmldoc utility.
      • -
      • Added new error callback function to catch a variety of errors and - log them to someplace other than stderr.
      • -
      • The mxmlElementSetAttr() function now allows for NULL attribute - values.
      • -
      • The load and save functions now properly handle quoted element and - attribute name strings properly, e.g. for !DOCTYPE declarations.
      • -
      -

      Changes in Mini-XML 1.2

      -
        -
      • Added new "set" methods to set the value of a node.
      • -
      • Added new formatted text methods mxmlNewTextf() and mxmlSetTextf() - to create/set a text node value using printf-style formats.
      • -
      • Added new standard callbacks for use with the mxmlLoad functions.
      • -
      • Updated the HTML documentation to include examples of the walk and - load function output.
      • -
      • Added --with/without-ansi configure option to control the strdup() - function check.
      • -
      • Added --with/without-snprintf configure option to control the - snprintf() and vsnprintf() function checks.
      • -
      -

      Changes in Mini-XML 1.1.2

      -
        -
      • The mxml(3) man page wasn't updated for the string functions.
      • -
      • mxmlSaveString() returned the wrong number of characters.
      • -
      • mxml_add_char() updated the buffer pointer in the wrong place.
      • -
      -

      Changes in Mini-XML 1.1.1

      -
        -
      • The private mxml_add_ch() function did not update the - start-of-buffer pointer which could cause a crash when using - mxmlSaveString().
      • -
      • The private mxml_write_ws() function called putc() instead of using - the proper callback which could cause a crash when using - mxmlSaveString().
      • -
      • Added a mxmlSaveAllocString() convenience function for saving an XML - node tree to an allocated string.
      • -
      -

      Changes in Mini-XML 1.1

      -
        -
      • 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.
      • -
      • Added a new mxmlLoadString() function for loading an XML node tree - from a string.
      • -
      • Added a new mxmlSaveString() function for saving an XML node tree to - a string.
      • -
      • Add emulation of strdup() if the local platform does not provide the - function.
      • -
      -

      Changes in Mini-XML 1.0

      -
        -
      • The mxmldoc program now handles function arguments, structures, - unions, enumerations, classes, and typedefs properly.
      • -
      • Documentation provided via mxmldoc and more in-line comments in the - code.
      • -
      • Added man pages and packaging files.
      • -
      -

      Changes in Mini-XML 0.93

      -
        -
      • New mxmldoc example program that is also used to create and update - code documentation using XML and produce HTML reference pages.
      • -
      • 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.
      • -
      • mxmlLoadFile() now correctly handles comments.
      • -
      • mxmlLoadFile() now supports the required "gt", "quot", and "nbsp" - character entities.
      • -
      • mxmlSaveFile() now uses newlines as whitespace when valid to do so.
      • -
      • mxmlFindElement() now also takes attribute name and attribute value - string arguments to limit the search to specific elements with - attributes and/or values.
      • - NULL pointers can be used as "wildcards". -
      • Added uninstall target to makefile, and auto-reconfig if Makefile.in - or configure.in are changed.
      • -
      • mxmlFindElement(), mxmlWalkNext(), and mxmlWalkPrev() now all - provide "descend" arguments to control whether they descend into child - nodes in the tree.
      • -
      • Fixed some whitespace issues in mxmlLoadFile().
      • -
      • Fixed Unicode output and whitespace issues in mxmlSaveFile().
      • -
      • mxmlSaveFile() now supports a whitespace callback to provide more - human-readable XML output under program control.
      • -
      -

      Changes in Mini-XML 0.92

      -
        -
      • mxmlSaveFile() didn't return a value on success.
      • -
      -

      Changes in Mini-XML 0.91

      -
        -
      • mxmlWalkNext() would go into an infinite loop.
      • -
      -

      Changes in Mini-XML 0.9

      -
        -
      • Initial public release.
      • -
      -
      -Contents -Previous -Next - - diff --git a/www/docfiles/schema.html b/www/docfiles/schema.html deleted file mode 100644 index 907438e..0000000 --- a/www/docfiles/schema.html +++ /dev/null @@ -1,223 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - -Contents -Previous -
      -

      DXML Schema

      -

      This appendix provides the XML schema that is used for the XML files - produced by mxmldoc. This schema is available on-line at:

      -
      -    http://www.minixml.org/mxmldoc.xsd
      -
      -

      mxmldoc.xsd

      -
      
      -<?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>
      -
      -
      -Contents -Previous - - diff --git a/www/docfiles/search.index b/www/docfiles/search.index deleted file mode 100644 index 052dd7b..0000000 Binary files a/www/docfiles/search.index and /dev/null differ diff --git a/www/documentation.php b/www/documentation.php deleted file mode 100644 index a255036..0000000 --- a/www/documentation.php +++ /dev/null @@ -1,267 +0,0 @@ -The path '$path' is bad.

      \n"); - - html_footer(); - } - } - else - { - $fp = fopen("docfiles$path", "rb"); - if (!$fp) - { - if ($type == "html") - { - html_header("Documentation Error"); - - print("

      Unable to open path '$path'.

      \n"); - - html_footer(); - } - } - else if ($type == "html") - { - html_header("Documentation"); - - $saw_body = 0; - $last_nav = 0; - - while ($line = fgets($fp, 1024)) - { - if (strstr($line, "") || strstr($line, "")) - { - break; - } - else if ($saw_body) - { - if (strstr($line, "ContentsPrevious") || - strstr($line, ">Next")) - { - if ($last_nav) - print("·\n"); - else - print("\n"); - - print("

      User Comments

      \n" - ."

      " - ."Add Comment

      \n"); - - $num_comments = show_comments("documentation.php$path"); - - if ($num_comments == 0) - print("

      No comments for this page.

      \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 = ""; - } - else - { - // Use standard HTML text field... - $search = " " - ." " - .""; - } - - print("
      \n" - ."

      $search

      \n" - ."
      \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("

      $total found:

      \n" - ."\n"); - - reset($matches); - foreach ($matches as $file => $text) - { - $link = "$PHP_SELF/$file"; - $score = str_repeat("★", - (int)(4 * $scores[$file] / $maxscore) + 1); - - print("" - ."\n"); - } - - print("
      $score   $text
      \n"); - } - else - { -?> - -

      You can view the Mini-XML documentation in a single HTML file or in -multiple files with comments on-line:

      - - - -

      You can also get a printed version of the Mini-XML documentation on -Lulu.com.

      - - diff --git a/www/forums.php b/www/forums.php deleted file mode 100644 index a89b675..0000000 --- a/www/forums.php +++ /dev/null @@ -1,1199 +0,0 @@ -"; - -if ($from == "" || $from == "Anonymous") - $from = "Anonymous "; - - -// -// '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 .= " at "; - else - $nemail .= " at "; - break; - - case '<' : - if ($i > 0) - $i = $len; - break; - - case '>' : - break; - - case '&' ; - $nemail .= "&"; - break; - - default : - $nemail .= $email[$i]; - break; - } - } - - return (trim($nemail)); -} - - -// -// 'format_date()' - Format a RFC 2822 date string. -// - -function // O - Date/time in human format -format_date($rfc2822) // I - Date/time in RFC 2822 format -{ - if (($time = strtotime($rfc2822)) < 0) - $date = htmlspecialchars($rfc2822, ENT_QUOTES); - else - { - $diff = abs(time() - $time); - - if ($diff < 604800) - $date = date("H:i D", $time); - else if ($diff < 31536000) - $date = date("H:i M d", $time); - else - $date = date("M d, Y", $time); - } - - return ($date); -} - - -// -// 'nntp_header()' - Show the standard header and nav links. -// - -function -nntp_header($title, // I - Title - $links) // I - Links -{ - html_header($title); - html_start_links(TRUE); - html_links($links); - html_end_links(); -} - - -// -// 'nntp_close()' - Close a news server thing... -// - -function -nntp_close($stream) // I - Socket stream -{ - nntp_command($stream, "QUIT", 205); - - fclose($stream); -} - - -// -// 'nntp_command()' - Send a command and get the response... -// - -function // O - NNTP response -nntp_command($stream, // I - Socket stream - $command = "QUIT", // I - NNTP command - $expect = 200) // I - Expected status - -{ -// print("

      nntp_command(stream=$stream, command='$command', expect=$expect)

      \n"); - - fwrite($stream, "$command\r\n"); - - $status = fgets($stream, 1024); - -// print("

      status='$status'

      \n"); - -// if ((int)$status != $expect) -// { -// print("

      Error: $status

      \n"); -// return (NULL); -// } -// else - return ($status); -} - - -// -// 'nntp_connect()' - Connect to the news server. -// - -function // O - Socket stream -nntp_connect() -{ - global $NNTPSERVER, $NNTPPORT; - - - $errno = 0; - $errstr = ""; - $stream = fsockopen($NNTPSERVER, $NNTPPORT, $errno, $errstr); - - if ($stream) - { - if ($line = fgets($stream, 1024)) - { - if ((int)$line != 200) - { - print("

      Error: $line

      \n"); - fclose($stream); - return (FALSE); - } - } - else - { - print("

      Error: No response from NNTP server!

      \n"); - fclose($stream); - return (FALSE); - } - } - else - print("

      Error: $errstr ($errno)

      \n"); - - return ($stream); -} - - -// -// 'nntp_error()' - Show an error message. -// - -function -nntp_error($text, // I - Human-readable message - $status, // I - NNTP status message - $group = "") // I - Current group, if any -{ - $links = array(); - - $links["All Forums"] = "forums.php"; - if ($group != "") - $links["Back to $group"] = "forums.php?g$group"; - - nntp_header("Error", $links); - - print("

      $text

      \n" - ."
      $status
      \n"); - - html_footer(); -} - - -// -// 'nntp_search()' - Do a header search... -// - -function // O - Matching message headers... -nntp_search($stream, // I - Socket stream - $group, // I - NNTP group - $search, // I - Search text - $threaded = TRUE) // I - Thread messages? -{ -// print("

      nntp_search(stream=$stream, group='$group', search='$search'

      \n"); - - // Get the start and end messages in the group... - $status = nntp_command($stream, "GROUP $group", 211); - if ((int)$status != 211) - { - nntp_error("We were unable to open the forum '$group' for the following " - ."reason:", $status, $group); - return (NULL); - } - - // Read the messages in the group... - $fields = explode(" ", $status); - $status = nntp_command($stream, "XOVER $fields[2]-$fields[3]", 224); - if ((int)$status != 224) - { - nntp_error("We were unable to search the forum '$group' for the following " - ."reason:", $status, $group); - return (NULL); - } - - $words = html_search_words($search); - $num_matches = 0; - $matches = NULL; - - while ($line = fgets($stream, 1024)) - { - $line = rtrim($line); - - if ($line == ".") - break; - -// print("
      " . htmlspecialchars($line) . "
      \n"); - - if ($search == "") - { - // Return all matches... - $matches[$num_matches] = $line; - $num_matches ++; - } - else - { - // Search for words... - reset($words); - - $fields = explode("\t", $line); - - foreach ($words as $word) - { - if (stristr($fields[1], $word) || stristr($fields[2], $word)) - { - $matches[$num_matches] = $line; - $num_matches ++; - break; - } - } - } - } - - if ($threaded) - { - // Thread the articles... - $threads = array(); - $parents = array(); - - for ($i = 0; $i < sizeof($matches); $i ++) - { - $fields = explode("\t", $matches[$i]); - $subject = eregi_replace("(re:|\\[[a-z]+\\.[a-z]+\\]) ", "", $fields[1]); - - if (array_key_exists($subject, $parents)) - $threads[$i] = sprintf("%06d%06d", $parents[$subject], $i); - else - { - $parents["$subject"] = $i; - $threads[$i] = sprintf("%06d%06d", $i, $i); - } - } - - array_multisort($threads, SORT_NUMERIC, $matches); - } - - // Return the matches... - return ($matches); -} - - -// -// 'show_prevnext_page()' - Show the prev/next links for the messages list... -// - -function -show_prevnext_page($group, // I - Group - $group_filter, // I - Group filter - $start, // I - Start message - $end, // I - End message - $count, // I - Number of messages - $threaded) // I - Thread messages? -{ - global $PHP_SELF, $PAGE_MAX, $options; - - - print("

      \n" - ."\n" - ."
      "); - - if ($start > 1) - { - $i = $start - $PAGE_MAX; - if ($i < 1) - $i = 1; - - $j = $i + $PAGE_MAX - 1; - if ($j > $count) - $j = $count; - - html_start_links(); - html_link("Show Messages $i - $j", "$PHP_SELF?s$i+g$group$options"); - html_end_links(); - } - - print(""); - html_start_links(); - if (!ereg(".*\.announce", $group) && !ereg(".*\.commit", $group)) - html_link("New Message", "$PHP_SELF?s$start+g$group+n$options"); - if ($threaded) - html_link("Sort by Date", - "$PHP_SELF?s$start+g$group+T0" . substr($options, 3)); - else - html_link("Sort by Thread", - "$PHP_SELF?s$start+g$group+T1" . substr($options, 3)); - html_end_links(); - print(""); - - if ($end < $count) - { - $i = $start + $PAGE_MAX; - $j = $i + $PAGE_MAX - 1; - if ($j > $count) - $j = $count; - - html_start_links(); - html_link("Show Messages $i - $j", "$PHP_SELF?s$i+g$group$options"); - html_end_links(); - } - - print("

      \n"); -} - - -// -// 'show_messages()' - Show messages in the named group... -// - -function -show_messages($group, // I - Group - $group_filter, // I - Group filter - $start, // I - Start message - $search, // I - Search string - $threaded) // I - Threaded view? -{ - global $PHP_SELF, $PAGE_MAX, $_COOKIE, $options; - - - // Figure out which messages to show... - $error = ""; - - $stream = nntp_connect(); - $matches = nntp_search($stream, $group, $search, $threaded); - - nntp_close($stream); - - if (!$matches) - { - $count = 0; - - if ($search == "") - $error = "No messages in group."; - else - $error = "No matches found for '" . - htmlspecialchars($search, ENT_QUOTES) . "'..."; - } - else - $count = count($matches); - - if ($start == 0) - { - if ($search == "") - { - $cookie = str_replace(".", "_", $group); - - if (array_key_exists($cookie, $_COOKIE)) - { - $msgnum = (int)$_COOKIE[$cookie]; - - for ($i = 0; $i < $count; $i ++) - { - $fields = explode("\t", $matches[$i]); - if ((int)$fields[0] == $msgnum) - break; - } - - $start = $i + 1; - } - else - $start = $count - $PAGE_MAX + 1; - } - else - $start = 1; - } - - if ($start > ($count - $PAGE_MAX + 1)) - $start = $count - $PAGE_MAX + 1; - if ($start < 1) - $start = 1; - - $end = $start + $PAGE_MAX - 1; - if ($end > $count) - $end = $count; - - // Show the standard header... - nntp_header("$group ($start - $end of $count)", - array("All Forums" => "forums.php?g$options")); - - $temp = htmlspecialchars($search, ENT_QUOTES); - print("
      \n" - ."

      Search Words:

      \n" - ."
      \n"); - - if ($error != "") - print("

      $error

      \n"); - else - { - show_prevnext_page($group, $group_filter, $start, $end, $count, $threaded); - - html_start_table(array("Subject", "Author", "Date/Time")); - - for ($i = $start; $i <= $end; $i ++) - { - $fields = explode("\t", $matches[$i - 1]); - $subject = htmlspecialchars(eregi_replace("\\[[a-z]+\\.[a-z]+\\] ", "", - $fields[1]), ENT_QUOTES); - $author = sanitize_email($fields[2]); - $date = format_date($fields[3]); - - if ($subject == "") - $subject = "(No Subject)"; - - html_start_row(); - print("" - ."$subject" - ."  $author  " - ."$date"); - html_end_row(); - } - - html_end_table(); - - show_prevnext_page($group, $group_filter, $start, $end, $count, $threaded); - } - - html_footer(); -} - - -// -// 'show_groups()' - Show groups... -// - -function -show_groups($group_filter, // I - Group filter - $search) // I - Search string -{ - global $PHP_SELF, $_COOKIE, $options; - - - nntp_header("Forums", - array("All Forums" => "forums.php?g$options")); - - // Figure out which messages to show... - $stream = nntp_connect(); - - // Search stuff... - print("
      \n" - ."

      Search Words:

      \n" - ."
      \n"); - - // Show the standard header... - html_start_table(array("Forum", "Messages", "")); - - $status = nntp_command($stream, "LIST", 215); - $num_groups = 0; - $groups = array(); - - if ((int)$status == 215) - { - while ($line = fgets($stream, 1024)) - { - $line = rtrim($line); - if ($line == ".") - break; - - $fields = explode(" ", $line); - $groups[$num_groups] = $fields[0]; - $num_groups ++; - } - } - - sort($groups); - - while (list($key, $group) = each($groups)) - { - if (ereg("(linuxprinting|private)\\..*", $group)) - continue; - - if ($group_filter && !ereg("${group_filter}\\.*", $group)) - continue; - - $status = nntp_command($stream, "GROUP $group", 211); - if ((int)$status != 211) - continue; - - $fields = explode(" ", $status); - $total = (int)$fields[1]; - - if ($search != "") - { - $matches = nntp_search($stream, $group, $search); - $mcount = count($matches); - $count = "$total total, $mcount match"; - } - else - { - $cookie = str_replace(".", "_", $group); - - if (array_key_exists($cookie, $_COOKIE)) - { - $newcount = (int)$fields[3] - (int)$_COOKIE[$cookie]; - - $count = "$total total, $newcount unread"; - } - else - $count = "$total total"; - } - - html_start_row(); - print("$group" - ."$count"); - - if ($search != "") - print("/$total"); - - print(""); - html_start_links(); - html_link("View", "$PHP_SELF?g$group$options"); - if (!ereg(".*\.announce", $group) && !ereg(".*\.commit", $group)) - html_link("New Message", "$PHP_SELF?g$group+n$options"); - html_end_links(); - print(""); - html_end_row(); - } - - html_start_row("header"); - print("Forums and Mailing Lists"); - html_end_row(); - html_start_row(); - print("" - ."

      Point your news reader at " - ."news.easysw.com to view these forums directly.

      \n" - ."

      Go to " - ."http://lists.easysw.com/mailman/listinfo " - ."to subscribe to or unsubcribe from the mailing lists that mirror " - ."these forums.

      " - .""); - html_end_row(); - html_end_table(); - - nntp_close($stream); - - html_footer(); -} - - -// -// 'show_prevnext_msg()' - Show the prev/next links for the messages list... -// - -function -show_prevnext_msg($group, // I - Group - $group_filter, // I - Group filter - $start, // I - Start message - $count, // I - Number of messages - $msg, // I - Current message - $threaded) // I - Thread messages? -{ - global $PHP_SELF, $options; - - - print("

      \n" - ."\n" - ."
      "); - - if ($msg > 1) - { - $i = $msg - 1; - - html_start_links(); - html_link("Previous Message", "$PHP_SELF?s$start+g$group+v$i$options"); - html_end_links(); - } - - print(""); - if (!ereg(".*\.announce", $group) && !ereg(".*\.commit", $group)) - { - html_start_links(); - html_link("New Message", "$PHP_SELF?s$start+g$group+n$options"); - html_link("Reply", "$PHP_SELF?s$start+g$group+r$msg$options"); - html_end_links(); - } - - print(""); - - if ($msg < $count) - { - $i = $msg + 1; - html_start_links(); - html_link("Next Message", "$PHP_SELF?s$start+g$group+v$i$options"); - html_end_links(); - } - - print("

      \n"); -} - - -// -// 'show_message()' - Show a single message... -// - -function -show_message($group, // I - Group - $group_filter, // I - Group filter - $start, // I - Start message - $msg, // I - Current message - $search, // I - Search string - $threaded) // I - Thread messages? -{ - global $PHP_SELF, $_COOKIE, $options; - - -// print("\n"); - - // Figure out which messages to show... - $stream = nntp_connect(); - $matches = nntp_search($stream, $group, $search, $threaded); - $count = count($matches); - - if ($msg[0] == ':') - { - // Lookup a specific message ID... - $msg = (int)substr($msg, 1); - - for ($i = 0; $i < $count; $i ++) - { - $fields = explode("\t", $matches[$i]); - - if ($msg == $fields[0]) - break; - } - - if ($i >= $count) - { - nntp_error("We were unable to show the requested message for the following " - ."reason:", "The message number ($msg) is out of range.", $group); - nntp_close($stream); - return; - } - - $msg = $i; - } - else - { - // Lookup index into search... - if ($msg < 1 || $msg > $count) - { - nntp_error("We were unable to show the requested message for the following " - ."reason:", "The message number is out of range.", $group); - nntp_close($stream); - return; - } - - $fields = explode("\t", $matches[$msg - 1]); - } - -// print("\n"); - - $msgnum = (int)$fields[0]; - $subject = htmlspecialchars(eregi_replace("\\[[a-z]+\\.[a-z]+\\] ", "", - $fields[1]), ENT_QUOTES); - $author = sanitize_email($fields[2]); - $date = format_date($fields[3]); - - if ($subject == "") - $subject = "(No Subject)"; - - // Save last message read... - $cookie = str_replace(".", "_", $group); - if ($search == "" && - (!array_key_exists($group, $_COOKIE) || (int)$_COOKIE[$cookie] < $msgnum)) - setcookie($cookie, $msgnum, time() + 90 * 86400, "/"); - - $status = nntp_command($stream, "BODY $msgnum", 222); - if ((int)$status != 222) - { - nntp_close($stream); - nntp_error("We were unable to show the requested message for the following " - ."reason:", $status, $group); - return (NULL); - } - - $body = ""; - while ($line = fgets($stream, 1024)) - { - $line = rtrim($line); - - if ($line == ".") - break; - - $body = $body . $line . "\n"; - } - - nntp_close($stream); - - $body = quote_text($body); - - nntp_header("$subject", - array("All Forums" => "forums.php?g$options", - "Back to $group" => "forums.php?g$group+s$start$options")); - - show_prevnext_msg($group, $group_filter, $start, $count, $msg, $threaded); - - html_start_table(array($subject, $author, $date), "", "", TRUE); - html_start_row(); - print("$body
      \n" - ."[ Direct Link" - ." to Message ]"); - html_end_row(); - html_end_table(); - - show_prevnext_msg($group, $group_filter, $start, $count, $msg, $threaded); - - html_footer(); -} - - -// -// 'post_message()' - Post a message... -// - -function -post_message($group, // I - Group - $group_filter, // I - Group filter - $start, // I - Start message - $msg, // I - Current message - $search, // I - Search string - $threaded) // I - Thread messages? -{ - global $LOGIN_USER, $PHP_SELF, $PROJECT_URL, $_POST, $options; - - - // Get form data... - if (array_key_exists("FROM", $_POST)) - $from = $_POST["FROM"]; - else - $from = ""; - - if (array_key_exists("SUBJECT", $_POST)) - $subject = $_POST["SUBJECT"]; - else - $subject = ""; - - if (array_key_exists("BODY", $_POST)) - $body = $_POST["BODY"]; - else - $body = ""; - - // Validate form data... - if (!validate_email($from) || $subject == "" || $body == "") - { - new_message($group, $group_filter, $start, $from, $subject, $body); - return; - } - - // Connect to the news server and get the reply-to message ID... - $stream = nntp_connect(); - if (!$stream) - { - return; - } - - $id = ""; - - if ($msg > 0) - { - $matches = nntp_search($stream, $group, $search, $threaded); - $count = count($matches); - - if ($msg <= $count) - { - $fields = explode("\t", $matches[$msg - 1]); - $id = $fields[4]; - } - } - - // Create the message body... - $message = "From: $from\r\n" - ."Subject: $subject\r\n" - ."Newsgroups: $group\r\n"; - - if ($id != "") - $message .= "In-Reply-To: $id\r\n"; - - $message .= "X-Login-Name: $LOGIN_USER\r\n" - ."X-Site-URL: $PROJECT_URL\r\n" - ."\r\n"; - - $lines = explode("\n", $body); - $count = count($lines); - - for ($i = 0; $i < $count; $i ++) - { - $line = rtrim($lines[$i]); - - if ($line == ".") - $message .= ". \r\n"; - else - $message .= "$line\r\n"; - } - - // Run the message by spamc to see if it thinks the message is - // spam... - $p = popen("spamc -c >/dev/null", "w"); - if ($p) - { - fwrite($p, $message); - if (pclose($p)) - { - // Message is spam... - nntp_header("$group Error", - array("All Forums" => "forums.php?g$options", - "Back to $group" => "forums.php?g$group+s$start$options")); - - print("

      Your message could not be posted for the following reason:

      \n" - ."
      The anti-spam filters determined that your message " - ."is most likely an unsolicited commercial message that is not " - ."allowed on this group. If this is not the case, please press your " - ."browser's Back button and check that the message does " - ."not contain common spam phrases like 'an offer for you' and so " - ."forth.
      \n"); - - html_footer(); - return; - } - } - - // Post the message... - $status = nntp_command($stream, "POST", 340); - - if ((int)$status != 340) - { - nntp_close($stream); - nntp_error("We were unable to post the requested message for the following " - ."reason:", $status, $group); - return; - } - - fwrite($stream, $message); - - // Get the posting status... - $status = nntp_command($stream, ".", 240); - - if ((int)$status == 240) - { - if ($msg == 0) - header("Location: $PHP_SELF?s$start+g$group$options"); - else - header("Location: $PHP_SELF?s$start+g$group+v$msg$options"); - } - else - nntp_error("We were unable to post the requested message for the following " - ."reason:", $status, $group); - - nntp_close($stream); -} - - -// -// 'reply_message()' - Reply to a message... -// - -function -reply_message($group, // I - Group to reply to - $group_filter, // I - Group filter - $start, // I - First message in the display - $msg, // I - Message to reply to - $search, // I - Search string - $threaded, // I - Thread messages? - $sender) // I - Sender address -{ - // Figure out which messages to show... - $stream = nntp_connect(); - $matches = nntp_search($stream, $group, $search, $threaded); - $count = count($matches); - - if ($msg < 1 || $msg > $count) - { - nntp_close($stream); - return; - } - - $fields = explode("\t", $matches[$msg - 1]); - $msgnum = (int)$fields[0]; - $subject = eregi_replace("\\[[a-z]+\\.[a-z]+\\] ", "", $fields[1]); - $author = sanitize_email($fields[2]); - $date = htmlspecialchars($fields[3], ENT_QUOTES); - - if (strncasecmp($subject, "re:", 3)) - $subject = "Re: " . $subject; - - $status = nntp_command($stream, "BODY $msgnum", 222); - if ((int)$status != 222) - { - nntp_close($stream); - nntp_error("We were unable to reply to the requested message for the following " - ."reason:", $status, $group); - return; - } - - $body = ""; - while ($line = fgets($stream, 1024)) - { - $line = rtrim($line); - - if ($line == ".") - break; - - $body = $body . "> " . $line . "\n"; - } - - nntp_close($stream); - - new_message($group, $group_filter, $start, $subject, $sender, $body); -} - - -// -// 'new_message()' - Post a new message... -// - -function -new_message($group, // I - Group to post to - $group_filter, // I - Group filter - $start, // I - First message - $subject, // I - Subject of message - $sender, // I - Sender address - $body) // I - Message body -{ - global $PHP_SELF, $NNTPSPEC, $options; - - - $subject = htmlspecialchars($subject, ENT_QUOTES); - $sender = htmlspecialchars($sender, ENT_QUOTES); - $body = htmlspecialchars($body, ENT_QUOTES); - - nntp_header("Post Message to $group", - array("All Forums" => "forums.php?g$options", - "Back to $group" => "forums.php?g$group+s$start$options")); - - print("

      Post Message to $group

      "); - - print("
      \n"); - - print("
      \n"); - print("" - ."\n"); - - print("" - ."\n"); - - print("" - ."\n"); - - print("" - ."\n"); - print("
      Subject:
      From:
      Body:
      \n"); - - print("
      \n"); - - html_footer(); -} - - -// Parse command-line options... -$start = 0; -$group = ""; -$op = 'l'; -$msg = ""; -$groups = "minixml"; - -if (array_key_exists("THREADED", $_COOKIE)) - $threaded = $_COOKIE["THREADED"] != 0; -else - $threaded = FALSE; - -if (array_key_exists("SEARCH", $_POST)) - $search = $_POST["SEARCH"]; -else - $search = ""; - -for ($i = 0; $i < $argc; $i ++) -{ - switch ($argv[$i][0]) - { - case 'g' : - $group = substr($argv[$i], 1); - break; - - case 'G' : - $groups = substr($argv[$i], 1); - break; - - case 'n' : - case 'p' : - case 'r' : - $op = $argv[$i][0]; - $msg = (int)substr($argv[$i], 1); - break; - - case 'v' : - $op = $argv[$i][0]; - $msg = substr($argv[$i], 1); - break; - - case 's' : - $start = (int)substr($argv[$i], 1); - break; - - case 'T' : // Set threading - $threaded = (int)substr($argv[$i], 1); - break; - - case 'Q' : // Set search text - $search = urldecode(substr($argv[$i], 1)); - $i ++; - while ($i < $argc) - { - $search .= urldecode(" $argv[$i]"); - $i ++; - } - break; - } -} - -setcookie("THREADED", $threaded, time() + 90 * 86400, "/"); - -if ($search != "") - $options = "+T$threaded+Q" . urlencode($search); -else - $options = "+T$threaded"; - -// Now handle the request... -switch ($op) -{ - case 'l' : // List - if ($group) - show_messages($group, $groups, $start, $search, $threaded); - else - show_groups($groups, $search); - break; - - case 'n' : // New message - if ($LOGIN_USER == "") - { - $options = str_replace("+", "%2B", "+g" . urlencode($group) . $options); - header("Location: login.php?PAGE=$PHP_SELF?n$options"); - return; - } - - new_message($group, $groups, $start, "", $from, ""); - break; - - case 'p' : // Post message - if ($LOGIN_USER == "") - { - $options = str_replace("+", "%2B", "+g" . urlencode($group) . $options); - header("Location: login.php?PAGE=$PHP_SELF?l$options"); - return; - } - - if (ereg(".*\.announce", $group) || ereg(".*\.commit", $group)) - { - nntp_header("Forum Posting Error", - array("All Forums" => "forums.php?g$options", - "Back to $group" => "forums.php?g$group+s$start$options")); - - print("

      We are sorry, but we could not post your message for the " - ."following reason:\n" - ."

      Forum $group is read-only.
      \n"); - - html_footer(); - - } - else - post_message($group, $groups, $start, $msg, $search, $threaded); - break; - - case 'r' : // Reply message - if ($LOGIN_USER == "") - { - $options = str_replace("+", "%2B", "+g" . urlencode($group) . $options); - header("Location: login.php?PAGE=$PHP_SELF?r$msg$options"); - return; - } - - reply_message($group, $groups, $start, $msg, $search, $threaded, - $from); - break; - - case 'v' : // View message - show_message($group, $groups, $start, $msg, $search, $threaded); - break; -} - - -// -// End of "$Id$". -// -?> diff --git a/www/images/.htaccess b/www/images/.htaccess deleted file mode 100644 index 6537b6a..0000000 --- a/www/images/.htaccess +++ /dev/null @@ -1,2 +0,0 @@ -DirectoryIndex off - diff --git a/www/images/black.gif b/www/images/black.gif deleted file mode 100644 index 26735dd..0000000 Binary files a/www/images/black.gif and /dev/null differ diff --git a/www/images/favicon.xcf.gz b/www/images/favicon.xcf.gz deleted file mode 100644 index c35df9c..0000000 Binary files a/www/images/favicon.xcf.gz and /dev/null differ diff --git a/www/images/graph.gif b/www/images/graph.gif deleted file mode 100644 index de9568b..0000000 Binary files a/www/images/graph.gif and /dev/null differ diff --git a/www/images/logo-large.gif b/www/images/logo-large.gif deleted file mode 100644 index b73f1d7..0000000 Binary files a/www/images/logo-large.gif and /dev/null differ diff --git a/www/images/logo.gif b/www/images/logo.gif deleted file mode 100644 index c44c9e2..0000000 Binary files a/www/images/logo.gif and /dev/null differ diff --git a/www/images/private.gif b/www/images/private.gif deleted file mode 100644 index c640835..0000000 Binary files a/www/images/private.gif and /dev/null differ diff --git a/www/index.php b/www/index.php deleted file mode 100644 index 7880785..0000000 --- a/www/index.php +++ /dev/null @@ -1,93 +0,0 @@ - - - - -

      Mini-XML: Lightweight XML Library

      - -

      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.

      - -

      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.

      - - - -
      - -

      Documentation

      - -

      Introduction

      - -

      Getting Started with Mini-XML

      - -

      More Mini-XML Programming -Techniques

      - -

      Mini-XML License

      - -

      Library Reference

      - -
            - -

      Recent News

      - -$title - $abstract
      \n" - ."$date, $count

      \n"); -} - -db_free($result); - -?> - -
      - - diff --git a/www/login.php b/www/login.php deleted file mode 100644 index 2ca8cd1..0000000 --- a/www/login.php +++ /dev/null @@ -1,264 +0,0 @@ -\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("\n" - ."" - ."" - ."\n" - ."
      \n"); - - // Existing users... - print("

      Current Users

      \n"); - - if ($argc == 0 && $usererror != "") - print("

      $usererror

      \n"); - - $page = htmlspecialchars($page, ENT_QUOTES); - - print("

      If you are a registered $PROJECT_NAME developer, please enter " - ."your username and password to login:

      \n" - ."
      " - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."\n" - ."
      Username:
      Password:" - ."
      \n"); - - // Separator... - print("
          " - ."" - ."    \n"); - - // New users... - print("

      New Users

      \n"); - - if ($argc == 1 && $usererror != "") - print("

      $usererror

      \n"); - - $username = htmlspecialchars($username, ENT_QUOTES); - $email = htmlspecialchars($email, ENT_QUOTES); - - print("

      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:

      \n" - ."
      " - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."\n" - ."
      Username:
      EMail:
      Password:" - ."
      Password Again:" - ."
      \n"); - - // End table - print("
      \n"); - - html_footer(); -} -else -{ - html_header("Enable Account"); - - if ($usererror != NULL) - print("

      $usererror

      \n"); - - $username = htmlspecialchars($username, ENT_QUOTES); - $register = htmlspecialchars($register, ENT_QUOTES); - - print("

      Please enter the registration code that was emailed to you " - ."with your username and password to enable your account and login:

      \n" - ."
      " - ."
      \n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."\n" - ."
      Registration Code:" - ."
      Username:
      Password:" - ."
      \n"); - - html_footer(); -} - - -// -// End of "$Id$". -// -?> diff --git a/www/mxml.html b/www/mxml.html deleted file mode 100644 index c20a101..0000000 --- a/www/mxml.html +++ /dev/null @@ -1,4222 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - -

      Table of Contents

      -
      -
      Introduction - -Building, Installing, and Packaging Mini-XML - -Getting Started with Mini-XML - -More Mini-XML Programming Techniques - -Using the mxmldoc Utility - -Mini-XML License -
      -
      Release Notes -
        -Library Reference - -XML Schema -
          -
          -

          0Introduction

          -

          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.

          -

          Mini-XML was initially developed for the -Gutenprint project to replace the rather large and unwieldy -libxml2 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:

          -
          It's bad enough that we require libxml2, but rolling our - own XML parser is a bit more than we can handle.
          -

          I then replied with:

          -
          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.
          -

          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.

          -

          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.

          -

          Aside from Gutenprint, Mini-XML is used for the following - projects/software applications:

          - -

          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.

          - - -

          Organization of This Document

          -

          This manual is organized into the following chapters and appendices:

          - - - -

          Notation Conventions

          -

          Various font and syntax conventions are used in this guide. Examples - and their meanings and uses are explained below:

          -
          -
          mxmldoc -
          mxmldoc(1)
          -
          The names of commands; the first mention of a command or function in - a chapter is followed by a manual page section number. -
          -
          -
          /var -
          /etc/hosts
          -
          File and directory names. -
          -
          -
          Request ID is Printer-123
          -
          Screen output. -
          -
          -
          lp -d printer filename ENTER
          -
          Literal user input; special keys like ENTER are in ALL - CAPS. -
          -
          -
          12.3
          -
          Numbers in the text are written using the period (.) to indicate the - decimal point. -
          -
          -
          - - -

          Abbreviations

          -

          The following abbreviations are used throughout this manual:

          -
          -
          Gb
          -
          Gigabytes, or 1073741824 bytes -
          -
          -
          kb
          -
          Kilobytes, or 1024 bytes -
          -
          -
          Mb
          -
          Megabytes, or 1048576 bytes -
          -
          -
          UTF-8, UTF-16
          -
          Unicode Transformation Format, 8-bit or 16-bit -
          -
          -
          W3C
          -
          World Wide Web Consortium -
          -
          -
          XML
          -
          Extensible Markup Language -
          -
          -
          - - -

          Other References

          -
          -
          The Unicode Standard, Version 4.0, Addison-Wesley, ISBN - 0-321-18578-1
          -
          The definition of the Unicode character set which is used for XML. -
          -
          -
          Extensible - Markup Language (XML) 1.0 (Third Edition)
          -
          The XML specification from the World Wide Web Consortium (W3C) -
          -
          -
          - - -

          Legal Stuff

          -

          The Mini-XML library is copyright 2003-2011 by Michael Sweet. License - terms are described in Appendix A - Mini-XML License -.

          -
          -

          1Building, Installing, and - Packaging Mini-XML

          -

          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 -make program in addition to the C compiler.

          -

          Compiling Mini-XML

          -

          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.

          -

          Compiling with Visual C++

          -

          Open the mxml.sln solution in the vcnet folder. - Choose the desired build configuration, "Debug" (the default) or - "Release", and then choose Build Solution from the - Build menu.

          -

          Compiling with Command-Line Tools

          -

          Type the following command to configure the Mini-XML source code for - your system:

          -
          -    ./configure ENTER
          -
          -

          The default install prefix is /usr/local, which can be - overridden using the --prefix option:

          -
          -    ./configure --prefix=/foo ENTER
          -
          -

          Other configure options can be found using the --help - option:

          -
          -    ./configure --help ENTER
          -
          -

          Once you have configured the software, use the make(1) - program to do the build and run the test program to verify that things - are working, as follows:

          -
          -    make ENTER
          -
          -

          Installing Mini-XML

          -

          If you are using Visual C++, copy the mxml.lib and and - mxml.h files to the Visual C++ lib and include - directories, respectively.

          -

          Otherwise, use the make command with the install - target to install Mini-XML in the configured directories:

          -
          -    make install ENTER
          -
          -

          Creating Mini-XML Packages

          -

          Mini-XML includes two files that can be used to create binary - packages. The first file is mxml.spec which is used by the -rpmbuild(8) software to create Red Hat Package Manager ("RPM") - packages which are commonly used on Linux. Since rpmbuild - wants to compile the software on its own, you can provide it with the - Mini-XML tar file to build the package:

          -
          -    rpmbuild -ta mxml-version.tar.gz ENTER
          -
          -

          The second file is mxml.list which is used by the -epm(1) program to create software packages in a variety of formats. - The epm program is available from the following URL:

          -
          -    http://www.epmhome.org/
          -
          -

          Use the make command with the epm target to - create portable and native packages for your system:

          -
          -    make epm ENTER
          -
          -

          The packages are stored in a subdirectory named dist 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 mxml.install script to install the - software.

          -

          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.

          -
          -

          2Getting Started with Mini-XML

          -

          This chapter describes how to write programs that use Mini-XML to - access data in an XML file. Mini-XML provides the following - functionality:

          -
            -
          • Functions for creating and managing XML documents in memory.
          • -
          • Reading of UTF-8 and UTF-16 encoded XML files and strings.
          • -
          • Writing of UTF-8 encoded XML files and strings.
          • -
          • Support for arbitrary element names, attributes, and attribute - values with no preset limits, just available memory.
          • -
          • Support for integer, real, opaque ("CDATA"), and text data types in - "leaf" nodes.
          • -
          • "Find", "index", and "walk" functions for easily accessing data in - an XML document.
          • -
          -

          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.

          -

          The Basics

          -

          Mini-XML provides a single header file which you include:

          -
          -    #include <mxml.h>
          -
          -

          The Mini-XML library is included with your program using the --lmxml option:

          -
          -    gcc -o myprogram myprogram.c -lmxml ENTER
          -
          -

          If you have the pkg-config(1) software installed, you can - use it to determine the proper compiler and linker options for your - installation:

          -
          -    pkg-config --cflags mxml ENTER
          -    pkg-config --libs mxml ENTER
          -
          -

          Nodes

          -

          Every piece of information in an XML file is stored in memory in - "nodes". Nodes are defined by the -mxml_node_t structure. Each node has a typed value, optional - user data, a parent node, sibling nodes (previous and next), and - potentially child nodes.

          -

          For example, if you have an XML file like the following:

          -
          -    <?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>
          -
          -

          the node tree for the file would look like the following in memory:

          -
          -    ?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
          -
          -

          where "-" is a pointer to the sibling node and "|" is a pointer to - the first child or parent node.

          -

          The mxmlGetType function gets the - type of a node, one of MXML_CUSTOM, MXML_ELEMENT, -MXML_INTEGER, MXML_OPAQUE, MXML_REAL, or -MXML_TEXT. The parent and sibling nodes are accessed using the -mxmlGetParent, mxmlGetNext -, and mxmlGetPrevious functions. - The mxmlGetUserData function - gets any user data associated with the node.

          -

          CDATA Nodes

          -

          CDATA (MXML_ELEMENT) nodes are created using the -mxmlNewCDATA function. The -mxmlGetCDATA function retrieves the CDATA string pointer for a - node.

          -
          Note: -

          CDATA nodes are currently stored in memory as special elements. This - will be changed in a future major release of Mini-XML.

          -
          -

          Custom Nodes

          -

          Custom (MXML_CUSTOM) nodes are created using the -mxmlNewCustom function or using a custom load callback - specified using the -mxmlSetCustomHandlers function. The -mxmlGetCustom function retrieves the custom value pointer for a - node.

          -

          Comment Nodes

          -

          Comment (MXML_ELEMENT) nodes are created using the -mxmlNewElement function. The -mxmlGetElement function retrieves the comment string pointer - for a node, including the surrounding "!--" and "--" characters.

          -
          Note: -

          Comment nodes are currently stored in memory as special elements. - This will be changed in a future major release of Mini-XML.

          -
          -

          Element Nodes

          -

          Element (MXML_ELEMENT) nodes are created using the -mxmlNewElement function. The -mxmlGetElement function retrieves the element name, the -mxmlElementGetAttr function retrieves the value string for - a named attribute associated with the element, and the -mxmlGetFirstChild and -mxmlGetLastChild functions retrieve the first and last child - nodes for the element, respectively.

          -

          Integer Nodes

          -

          Integer (MXML_INTEGER) nodes are created using the -mxmlNewInteger function. The -mxmlGetInteger function retrieves the integer value for a node.

          -

          Opaque Nodes

          -

          Opaque (MXML_OPAQUE) nodes are created using the -mxmlNewOpaque function. The -mxmlGetOpaque function retrieves the opaque string pointer for - a node. Opaque nodes are like string nodes but preserve all whitespace - between nodes.

          -

          Text Nodes

          -

          Text (MXML_TEXT) nodes are created using the -mxmlNewText and mxmlNewTextf - functions. Each text node consists of a text string and (leading) - whitespace value - the mxmlGetText - function retrieves the text string pointer and whitespace value for a - node.

          - - -

          Processing Instruction Nodes

          -

          Processing instruction (MXML_ELEMENT) nodes are created - using the mxmlNewElement - function. The mxmlGetElement - function retrieves the processing instruction string for a node, - including the surrounding "?" characters.

          -
          Note: -

          Processing instruction nodes are currently stored in memory as - special elements. This will be changed in a future major release of - Mini-XML.

          -
          -

          Real Number Nodes

          -

          Real number (MXML_REAL) nodes are created using the -mxmlNewReal function. The -mxmlGetReal function retrieves the CDATA string pointer for a - node.

          - - -

          XML Declaration Nodes

          -

          XML declaration (MXML_ELEMENT) nodes are created using the mxmlNewXML function. The -mxmlGetElement function retrieves the XML declaration - string for a node, including the surrounding "?" characters.

          -
          Note: -

          XML declaration nodes are currently stored in memory as special - elements. This will be changed in a future major release of Mini-XML.

          -
          - -

          Creating XML Documents

          -

          You can create and update XML documents in memory using the various -mxmlNew functions. The following code will create the XML document - described in the previous section:

          -
          -    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");
          -
          - - -

          We start by creating the declaration node common to all XML files - using the mxmlNewXML function:

          -
          -    xml = mxmlNewXML("1.0");
          -
          -

          We then create the <data> node used for this document using - the mxmlNewElement function. The - first argument specifies the parent node (xml) while the - second specifies the element name (data):

          -
          -    data = mxmlNewElement(xml, "data");
          -
          -

          Each <node>...</node> in the file is created using the -mxmlNewElement and mxmlNewText - functions. The first argument of mxmlNewText specifies the - parent node (node). 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:

          -
          -    node = mxmlNewElement(data, "node");
          -    mxmlNewText(node, 0, "val1");
          -
          -

          The resulting in-memory XML document can then be saved or processed - just like one loaded from disk or a string.

          - - -

          Loading XML

          -

          You load an XML file using the -mxmlLoadFile function:

          -
          -    FILE *fp;
          -    mxml_node_t *tree;
          -
          -    fp = fopen("filename.xml", "r");
          -    tree = mxmlLoadFile(NULL, fp,
          -                        MXML_TEXT_CALLBACK);
          -    fclose(fp);
          -
          -

          The first argument specifies an existing XML parent node, if any. - Normally you will pass NULL for this argument unless you are - combining multiple XML sources. The XML file must contain a complete - XML document including the ?xml element if the parent node is -NULL.

          -

          The second argument specifies the stdio file to read from, as opened - by fopen() or popen(). You can also use stdin - if you are implementing an XML filter program.

          -

          The third argument specifies a callback function which returns the - value type of the immediate children for a new element node: -MXML_CUSTOM, MXML_IGNORE, MXML_INTEGER, -MXML_OPAQUE, MXML_REAL, or MXML_TEXT. Load - callbacks are described in detail in Chapter - 3. The example code uses the MXML_TEXT_CALLBACK constant - which specifies that all data nodes in the document contain - whitespace-separated text values. Other standard callbacks include -MXML_IGNORE_CALLBACK, MXML_INTEGER_CALLBACK, -MXML_OPAQUE_CALLBACK, and MXML_REAL_CALLBACK.

          -

          The mxmlLoadString function - loads XML node trees from a string:

          - - -
          -    char buffer[8192];
          -    mxml_node_t *tree;
          -
          -    ...
          -    tree = mxmlLoadString(NULL, buffer,
          -                          MXML_TEXT_CALLBACK);
          -
          -

          The first and third arguments are the same as used for -mxmlLoadFile(). The second argument specifies the string or - character buffer to load and must be a complete XML document including - the ?xml element if the parent node is NULL.

          - - -

          Saving XML

          -

          You save an XML file using the -mxmlSaveFile function:

          -
          -    FILE *fp;
          -    mxml_node_t *tree;
          -
          -    fp = fopen("filename.xml", "w");
          -    mxmlSaveFile(tree, fp, MXML_NO_CALLBACK);
          -    fclose(fp);
          -
          -

          The first argument is the XML node tree to save. It should normally - be a pointer to the top-level ?xml node in your XML document.

          -

          The second argument is the stdio file to write to, as opened by -fopen() or popen(). You can also use stdout if - you are implementing an XML filter program.

          -

          The third argument is the whitespace callback to use when saving the - file. Whitespace callbacks are covered in detail in -Chapter 3. The previous example code uses the MXML_NO_CALLBACK - constant to specify that no special whitespace handling is required.

          -

          The mxmlSaveAllocString, - and mxmlSaveString functions - save XML node trees to strings:

          -
          -    char buffer[8192];
          -    char *ptr;
          -    mxml_node_t *tree;
          -
          -    ...
          -    mxmlSaveString(tree, buffer, sizeof(buffer),
          -                   MXML_NO_CALLBACK);
          -
          -    ...
          -    ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);
          -
          -

          The first and last arguments are the same as used for -mxmlSaveFile(). The mxmlSaveString function takes pointer - and size arguments for saving the XML document to a fixed-size buffer, - while mxmlSaveAllocString() returns a string buffer that was - allocated using malloc().

          - - -

          Controlling Line Wrapping

          -

          When saving XML documents, Mini-XML normally wraps output lines at - column 75 so that the text is readable in terminal windows. The -mxmlSetWrapMargin function overrides the default wrap - margin:

          -
          -    /* Set the margin to 132 columns */
          -    mxmlSetWrapMargin(132);
          -
          -    /* Disable wrapping */
          -    mxmlSetWrapMargin(0);
          -
          -

          Memory Management

          -

          Once you are done with the XML data, use the -mxmlDelete function to recursively free the memory that is used - for a particular node or the entire tree:

          -
          -    mxmlDelete(tree);
          -
          -

          You can also use reference counting to manage memory usage. The -mxmlRetain and mxmlRelease - functions increment and decrement a node's use count, respectively. - When the use count goes to 0, mxmlRelease will automatically - call mxmlDelete to actually free the memory used by the node - tree. New nodes automatically start with a use count of 1.

          - - -

          Finding and Iterating Nodes

          -

          The mxmlWalkPrev and -mxmlWalkNextfunctions can be used to iterate through the - XML node tree:

          -
          -    mxml_node_t *node;
          -    
          -    node = mxmlWalkPrev(current, tree,
          -                        MXML_DESCEND);
          -
          -    node = mxmlWalkNext(current, tree,
          -                        MXML_DESCEND);
          -
          -

          In addition, you can find a named element/node using the -mxmlFindElement function:

          -
          -    mxml_node_t *node;
          -    
          -    node = mxmlFindElement(tree, tree, "name",
          -                           "attr", "value",
          -                           MXML_DESCEND);
          -
          -

          The name, attr, and value arguments can be - passed as NULL to act as wildcards, e.g.:

          - - -
          -    /* Find the first "a" element */
          -    node = mxmlFindElement(tree, tree, "a",
          -                           NULL, NULL,
          -                           MXML_DESCEND);
          -
          - - -
          -    /* Find the first "a" element with "href"
          -       attribute */
          -    node = mxmlFindElement(tree, tree, "a",
          -                           "href", NULL,
          -                           MXML_DESCEND);
          -
          - - -
          -    /* Find the first "a" element with "href"
          -       to a URL */
          -    node = mxmlFindElement(tree, tree, "a",
          -                           "href",
          -                           "http://www.easysw.com/",
          -                           MXML_DESCEND);
          -
          - - -
          -    /* Find the first element with a "src"
          -       attribute */
          -    node = mxmlFindElement(tree, tree, NULL,
          -                           "src", NULL,
          -                           MXML_DESCEND);
          -
          - - -
          -    /* Find the first element with a "src"
          -       = "foo.jpg" */
          -    node = mxmlFindElement(tree, tree, NULL,
          -                           "src", "foo.jpg",
          -                           MXML_DESCEND);
          -
          -

          You can also iterate with the same function:

          -
          -    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 ...
          -    }
          -
          - - -

          The MXML_DESCEND argument can actually be one of three - constants:

          -
            -
          • MXML_NO_DESCEND 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. -

            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. -
            -

            -
          • -
          • MXML_DESCEND_FIRST 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. -

            This mode is only applicable to the search function; the walk - functions treat this as MXML_DESCEND since every call is a - first time. -
            -

            -
          • -
          • MXML_DESCEND 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". -

            If you were to walk from the root node "?xml" to the end of the tree - with mxmlWalkNext(), the order would be:

            -

            ?xml data node val1 node val2 node val3 group node val4 node val5 - node val6 node val7 node val8

            -

            If you started at "val8" and walked using mxmlWalkPrev(), - the order would be reversed, ending at "?xml".

            -
          • -
          -

          Finding Specific Nodes

          -

          You can find specific nodes in the tree using the -mxmlFindPath, for example:

          -
          -    mxml_node_t *value;
          -
          -    value = mxmlFindPath(tree, "path/to/*/foo/bar");
          -
          -

          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.

          -
          -

          3More Mini-XML Programming - Techniques

          -

          This chapter shows additional ways to use the Mini-XML library in - your programs.

          -

          Load Callbacks

          -

          Chapter 2 introduced the -mxmlLoadFile() and -mxmlLoadString() 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.

          -

          Mini-XML defines several standard callbacks for simple XML data - files:

          -
            -
          • MXML_INTEGER_CALLBACK - All data nodes contain - whitespace-separated integers.
          • -
          • MXML_OPAQUE_CALLBACK - All data nodes contain opaque - strings ("CDATA").
          • -
          • MXML_REAL_CALLBACK - All data nodes contain - whitespace-separated floating-point numbers.
          • -
          • MXML_TEXT_CALLBACK - All data nodes contain - whitespace-separated strings.
          • -
          -

          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: MXML_INTEGER, MXML_OPAQUE, -MXML_REAL, or MXML_TEXT. The function is called after - 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.

          - - -

          The following callback function looks for an attribute named "type" - or the element name to determine the value type for its child nodes:

          -
          -    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);
          -    }
          -
          -

          To use this callback function, simply use the name when you call any - of the load functions:

          -
          -    FILE *fp;
          -    mxml_node_t *tree;
          -
          -    fp = fopen("filename.xml", "r");
          -    tree = mxmlLoadFile(NULL, fp, type_cb);
          -    fclose(fp);
          -
          -

          Save Callbacks

          -

          Chapter 2 also introduced the -mxmlSaveFile(), -mxmlSaveString(), and -mxmlSaveAllocString() functions. The last argument to these - functions is a callback function which is used to automatically insert - whitespace in an XML document.

          -

          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 -MXML_WS_BEFORE_OPEN, MXML_WS_AFTER_OPEN, -MXML_WS_BEFORE_CLOSE, or MXML_WS_AFTER_CLOSE. The callback - function should return NULL if no whitespace should be added - and the string to insert (spaces, tabs, carriage returns, and newlines) - otherwise.

          -

          The following whitespace callback can be used to add whitespace to - XHTML output to make it more readable in a standard text editor:

          -
          -    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);
          -    }
          -
          -

          To use this callback function, simply use the name when you call any - of the save functions:

          -
          -    FILE *fp;
          -    mxml_node_t *tree;
          -
          -    fp = fopen("filename.xml", "w");
          -    mxmlSaveFile(tree, fp, whitespace_cb);
          -    fclose(fp);
          -
          - - -

          Custom Data Types

          -

          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 MXML_CUSTOM - node type identifies custom data nodes.

          -

          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:

          -
          -    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);
          -    }
          -
          -

          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 void 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.

          - - -

          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:

          -
          -    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));
          -    }
          -
          -

          You register the callback functions using the -mxmlSetCustomHandlers() function:

          -
          -    mxmlSetCustomHandlers(load_custom,
          -                          save_custom);
          -
          - - -

          Changing Node Values

          -

          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.

          -

          Existing nodes can be changed using the -mxmlSetElement(), -mxmlSetInteger(), mxmlSetOpaque() -, mxmlSetReal(), -mxmlSetText(), and -mxmlSetTextf() functions. For example, use the following - function call to change a text node to contain the text "new" with - leading whitespace:

          -
          -    mxml_node_t *node;
          -
          -    mxmlSetText(node, 1, "new");
          -
          -

          Formatted Text

          -

          The mxmlNewTextf() and -mxmlSetTextf() functions create and change text nodes, - respectively, using printf-style format strings and arguments. - For example, use the following function call to create a new text node - containing a constructed filename:

          -
          -    mxml_node_t *node;
          -
          -    node = mxmlNewTextf(node, 1, "%s/%s",
          -                        path, filename);
          -
          -

          Indexing

          -

          Mini-XML provides functions for managing indices of nodes. The - current implementation provides the same functionality as -mxmlFindElement(). 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.

          -

          Indices are stored in mxml_index_t - structures. The mxmlIndexNew() - function creates a new index:

          -
          -    mxml_node_t *tree;
          -    mxml_index_t *ind;
          -
          -    ind = mxmlIndexNew(tree, "element",
          -                       "attribute");
          -
          -

          The first argument is the XML node tree to index. Normally this will - be a pointer to the ?xml element.

          -

          The second argument contains the element to index; passing NULL - indexes all element nodes alphabetically.

          -

          The third argument contains the attribute to index; passing NULL - causes only the element name to be indexed.

          -

          Once the index is created, the -mxmlIndexEnum(), mxmlIndexFind() -, and mxmlIndexReset() - functions are used to access the nodes in the index. The -mxmlIndexReset() 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 mxmlIndexEnum() and -mxmlIndexFind().

          -

          The mxmlIndexEnum() function - enumerates each of the nodes in the index and can be used in a loop as - follows:

          -
          -    mxml_node_t *node;
          -
          -    mxmlIndexReset(ind);
          -
          -    while ((node = mxmlIndexEnum(ind)) != NULL)
          -    {
          -      // do something with node
          -    }
          -
          -

          The mxmlIndexFind() 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:

          -
          -    mxml_node_t *node;
          -
          -    mxmlIndexReset(ind);
          -
          -    while ((node = mxmlIndexFind(ind, "element",
          -                                 "attr-value"))
          -                != NULL)
          -    {
          -      // do something with node
          -    }
          -
          -

          The second and third arguments represent the element name and - attribute value, respectively. A NULL pointer is used to - return all elements or attributes in the index. Passing NULL - for both the element name and attribute value is equivalent to calling -mxmlIndexEnum.

          -

          When you are done using the index, delete it using the -mxmlIndexDelete() function:

          -
          -    mxmlIndexDelete(ind);
          -
          -

          SAX (Stream) Loading of Documents

          -

          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.

          -

          The mxmlSAXLoadFd, -mxmlSAXLoadFile, and -mxmlSAXLoadString functions provide the SAX loading APIs. Each - function works like the corresponding mxmlLoad function but - uses a callback to process each node as it is read.

          -

          The callback function receives the node, an event code, and a user - data pointer you supply:

          -
          -    void
          -    sax_cb(mxml_node_t *node,
          -           mxml_sax_event_t event,
          -           void *data)
          -    {
          -      ... do something ...
          -    }
          -
          -

          The event will be one of the following:

          -
            -
          • MXML_SAX_CDATA - CDATA was just read
          • -
          • MXML_SAX_COMMENT - A comment was just read
          • -
          • MXML_SAX_DATA - Data (custom, integer, opaque, real, or - text) was just read
          • -
          • MXML_SAX_DIRECTIVE - A processing directive was just read
          • -
          • MXML_SAX_ELEMENT_CLOSE - A close element was just read ( -</element>)
          • -
          • MXML_SAX_ELEMENT_OPEN - An open element was just read ( -<element>)
          • -
          -

          Elements are released after the close element is processed. - All other nodes are released after they are processed. The SAX callback - can retain the node using the -mxmlRetain function. For example, the following SAX callback - will retain all nodes, effectively simulating a normal in-memory load:

          -
          -    void
          -    sax_cb(mxml_node_t *node,
          -           mxml_sax_event_t event,
          -           void *data)
          -    {
          -      if (event != MXML_SAX_ELEMENT_CLOSE)
          -        mxmlRetain(node);
          -    }
          -
          -

          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 <html>, -<head>, and <body>, and processing directives like -<?xml ... ?> and <!DOCTYPE ... >:

          - - -
          -    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);
          -        }
          -      }
          -    }
          -
          -

          The resulting skeleton document tree can then be searched just like - one loaded using the mxmlLoad 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:

          -
          -    mxml_node_t *doc, *title, *body, *heading;
          -
          -    doc = mxmlSAXLoadFd(NULL, 0,
          -                        MXML_TEXT_CALLBACK,
          -                        sax_cb, 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);
          -    }
          -
          -
          -

          4Using the mxmldoc Utility

          -

          This chapter describes how to use mxmldoc(1) program to - automatically generate documentation from C and C++ source files.

          -

          The Basics

          -

          Originally developed to generate the Mini-XML and CUPS API - documentation, mxmldoc 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, mxmldoc uses in-line - comments rather than comment headers, allowing for more "natural" code - documentation.

          -

          By default, mxmldoc 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 filename.html:

          -
          -    mxmldoc *.h *.c >filename.html ENTER
          -
          -

          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 filename.xml in addition to the - HTML file:

          -
          -    mxmldoc filename.xml *.h *.c >filename.html ENTER
          -
          -

          The --no-output option disables the normal HTML output:

          -
          -    mxmldoc --no-output filename.xml *.h *.c ENTER
          -
          -

          You can then run mxmldoc again with the XML file alone to - generate the HTML documentation:

          -
          -    mxmldoc filename.xml >filename.html ENTER
          -
          -

          Creating Man Pages

          -

          The --man filename option tells mxmldoc to create a - man page instead of HTML documentation, for example:

          -
          -    mxmldoc --man filename filename.xml \
          -        >filename.man ENTER
          -
          -    mxmldoc --man filename *.h *.c \
          -        >filename.man ENTER
          -
          -

          Creating Xcode Documentation Sets

          -

          The --docset directory.docset option tells mxmldoc - to create an Xcode documentation set containing the HTML documentation, - for example:

          -
          -    mxmldoc --docset foo.docset *.h *.c foo.xml ENTER
          -
          -

          Xcode documentation sets can only be built on Mac OS X with Xcode 3.0 - or higher installed.

          -

          Commenting Your Code

          -

          As noted previously, mxmldoc looks for in-line comments to - describe the functions, types, and constants in your code. Mxmldoc - 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 @private@ directive are - treated as private and are not documented.

          -

          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:

          -
          -    /* 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 */
          -    {
          -      ...
          -    }
          -
          -

          Mxmldoc also knows to remove extra asterisks (*) from the - comment string, so the comment string:

          -
          -    /*
          -     * 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.
          -     */
          -
          -

          will be shown as:

          -
          -    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.
          -
          -

          Comments can also include the following - special @name ...@ directive strings:

          -
            -
          • @deprecated@ - flags the item as deprecated to discourage - its use
          • -
          • @private@ - flags the item as private so it will not be - included in the documentation
          • -
          • @since ...@ - flags the item as new since a particular - release. The text following the @since up to the closing @ - is highlighted in the generated documentation, e.g. @since Mini-XML - 2.7@.
          • -
          - - -

          Titles, Sections, and Introductions

          -

          Mxmldoc also provides options to set the title, section, and - introduction text for the generated documentation. The --title text - option specifies the title for the documentation. The title string is - usually put in quotes:

          -
          -    mxmldoc filename.xml \
          -        --title "My Famous Documentation" \
          -        >filename.html ENTER
          -
          -

          The --section name option specifies the section for the - documentation. For HTML documentation, the name is placed in a HTML - comment such as:

          -
          -    <!-- SECTION: name -->
          -
          -

          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 .TH directive in the man page:

          -
          -    .TH mylibrary 3acme "My Title" ...
          -
          -

          The default section name for man page output is "3". There is no - default section name for HTML output.

          -

          Finally, the --intro filename 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 DOCTYPE, html, and body - elements. For man page documentation, the file must consist of valid -nroff(1) text.

          -
          -

          AMini-XML License

          -

          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:

          -

          1. 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.

          -

          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.

          -

          2. 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.

          -

           

          -

          GNU LIBRARY GENERAL PUBLIC LICENSE

          -

          Version 2, June 1991 -
          Copyright (C) 1991 Free Software Foundation, Inc. -
          59 Temple Place - Suite 330, Boston, MA 02111-1307, USA -
          Everyone is permitted to copy and distribute verbatim copies of - this license document, but changing it is not allowed. -
          [This is the first released version of the library GPL. It is - numbered 2 because it goes with version 2 of the ordinary GPL.]

          -

          Preamble

          -

          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.

          -

          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.

          -

          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.

          -

          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.

          -

          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.

          -

          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.

          -

          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.

          -

          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.

          -

          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.

          -

          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.

          -

          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.

          -

          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.

          -

          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.

          -

          Note that it is possible for a library to be covered by the ordinary - General Public License rather than by this special one.

          -

          TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND - MODIFICATION

          -

          0. 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".

          -

          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.

          -

          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".)

          -

          "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.

          -

          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.

          -

          1. 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.

          -

          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.

          -

          2. 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:

          -
            -

            a) The modified work must itself be a software - library.

            -

            b) You must cause the files modified to carry - prominent notices stating that you changed the files and the date of - any change.

            -

            c) You must cause the whole of the work to be - licensed at no charge to all third parties under the terms of this - License.

            -

            d) 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.

            -

            (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.)

            -
          -

          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.

          -

          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.

          -

          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.

          -

          3. 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.

          -

          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.

          -

          This option is useful when you wish to copy part of the code of the - Library into a program that is not a library.

          -

          4. 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.

          -

          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.

          -

          5. 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.

          -

          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.

          -

          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.

          -

          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.)

          -

          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.

          -

          6. 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.

          -

          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:

          -
            a) 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.) -

            b) 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.

            -

            c) 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.

            -

            d) Verify that the user has already received a copy - of these materials or that you have already sent this user a copy.

            -
          -

          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.

          -

          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.

          -

          7. 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:

          -
            a) 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. -

            b) 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.

            -
          -

          8. 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.

          -

          9. 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.

          -

          10. 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.

          -

          11. 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.

          -

          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.

          -

          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.

          -

          This section is intended to make thoroughly clear what is believed to - be a consequence of the rest of this License.

          -

          12. 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.

          -

          13. 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.

          -

          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.

          -

          14. 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.

          -

          NO WARRANTY

          -

          15. 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.

          -

          16. 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.

          -

          END OF TERMS AND CONDITIONS

          -

          How to Apply These Terms to Your New Libraries

          -

          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).

          -

          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.

          -
            -

            one line to give the library's name and an idea of what it does. -
            Copyright (C) year name of author

            -

            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.

            -

            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.

            -

            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

            -
          -

          Also add information on how to contact you by electronic and paper - mail.

          -

          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:

          -
            -

            Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random - Hacker.

            -

            signature of Ty Coon, 1 April 1990 Ty Coon, President of - Vice

            -
          -

          That's all there is to it!

          -
          -

          BRelease Notes

          -

          Changes in Mini-XML 2.7

          -
            -
          • Fixed conformance of mxmldoc's HTML and CSS output.
          • -
          • 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)
          • -
          • Updated the source headers to reference the Mini-XML license and its - exceptions to the LGPL2 (STR #108)
          • -
          • Added a new mxmlFindPath() function to find the value node of a - named element (STR #110)
          • -
          • Building a static version of the library did not work on Windows - (STR #112)
          • -
          • The shared library did not include a destructor for the thread- - specific data key on UNIX-based operating systems (STR #103)
          • -
          • mxmlLoad* did not error out on XML with multiple root nodes (STR - #101)
          • -
          • Fixed an issue with the _mxml_vstrdupf function (STR #107)
          • -
          • mxmlSave* no longer write all siblings of the passed node, just that - node and its children (STR #109)
          • -
          -

          Changes in Mini-XML 2.6

          -
            -
          • Documentation fixes (STR #91, STR #92)
          • -
          • The mxmldoc program did not handle typedef comments properly (STR - #72)
          • -
          • Added support for "long long" printf formats.
          • -
          • The XML parser now ignores BOMs in UTF-8 XML files (STR #89)
          • -
          • The mxmldoc program now supports generating Xcode documentation - sets.
          • -
          • mxmlSave*() did not output UTF-8 correctly on some platforms.
          • -
          • 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.
          • -
          • Wrapping was not disabled when mxmlSetWrapMargin(0) was called, and - "<?xml ... ?>" was always followed by a newline (STR #76)
          • -
          • The mxml.pc.in file was broken (STR #79)
          • -
          • The mxmldoc program now handles "typedef enum name {} name" - correctly (STR #72)
          • -
          -

          Changes in Mini-XML 2.5

          -
            -
          • The mxmldoc program now makes greater use of CSS and supports a - --css option to embed an alternate stylesheet.
          • -
          • The mxmldoc program now supports --header and --footer options to - insert documentation content before and after the generated content.
          • -
          • The mxmldoc program now supports a --framed option to generate - framed HTML output.
          • -
          • The mxmldoc program now creates a table of contents including any - headings in the --intro file when generating HTML output.
          • -
          • The man pages and man page output from mxmldoc did not use "\-" for - dashes (STR #68)
          • -
          • The debug version of the Mini-XML DLL could not be built (STR #65)
          • -
          • Processing instructions and directives did not work when not at the - top level of a document (STR #67)
          • -
          • Spaces around the "=" in attributes were not supported (STR #67)
          • -
          -

          Changes in Mini-XML 2.4

          -
            -
          • Fixed shared library build problems on HP-UX and Mac OS X.
          • -
          • The mxmldoc program did not output argument descriptions for - functions properly.
          • -
          • All global settings (custom, error, and entity callbacks and the - wrap margin) are now managed separately for each thread.
          • -
          • Added mxmlElementDeleteAttr() function (STR #59)
          • -
          • mxmlElementSetAttrf() did not work (STR #57)
          • -
          • mxmlLoad*() incorrectly treated declarations as parent elements (STR - #56)
          • -
          • mxmlLoad*() incorrectly allowed attributes without values (STR #47)
          • -
          • Fixed Visual C++ build problems (STR #49)
          • -
          • mxmlLoad*() did not return NULL when an element contained an error - (STR #46)
          • -
          • Added support for the apos character entity (STR #54)
          • -
          • Fixed whitespace detection with Unicode characters (STR #48)
          • -
          • mxmlWalkNext() and mxmlWalkPrev() did not work correctly when called - with a node with no children as the top node (STR #53)
          • -
          -

          Changes in Mini-XML 2.3

          -
            -
          • Added two exceptions to the LGPL to support static linking of - applications against Mini-XML
          • -
          • The mxmldoc utility can now generate man pages, too.
          • -
          • Added a mxmlNewXML() function
          • -
          • Added a mxmlElementSetAttrf() function (STR #43)
          • -
          • Added a snprintf() emulation function for the test program (STR #32)
          • -
          • Added the _CRT_SECURE_NO_DEPRECATE definition when building on VC++ - 2005 (STR #36)
          • -
          • mxmlLoad*() did not detect missing > characters in elements (STR - #41)
          • -
          • mxmlLoad*() did not detect missing close tags at the end of an XML - document (STR #45)
          • -
          • Added user_data and ref_count members to mxml_node_t structure
          • -
          • Added mxmlReleaseNode() and mxmlRetainNode() APIs for - reference-counted nodes
          • -
          • Added mxmlSetWrapMargin() to control the wrapping of XML output
          • -
          • Added conditional check for EINTR error code for certain Windows - compilers that do not define it (STR #33)
          • -
          • The mxmldoc program now generates correct HTML 4.0 output - - previously it generated invalid XHTML
          • -
          • The mxmldoc program now supports "@deprecated@, "@private@", and - "@since version@" comments
          • -
          • Fixed function and enumeration type bugs in mxmldoc
          • -
          • Fixed the XML schema for mxmldoc
          • -
          • The mxmldoc program now supports --intro, --section, and --title - options
          • -
          • The mxmlLoad*() functions could leak a node on an error (STR #27)
          • -
          • The mxml_vsnprintf() function could get in an infinite loop on a - buffer overflow (STR #25)
          • -
          • Added new mxmlNewCDATA() and mxmlSetCDATA() functions to create and - set CDATA nodes, which are really just special element nodes
          • -
          • Added new MXML_IGNORE type and MXML_IGNORE_CB callback to ignore - non-element nodes, e.g. whitespace
          • -
          • mxmlLoad*() did not treat custom data as opaque, so whitespace - characters would be lost
          • -
          -

          Changes in Mini-XML 2.2.2

          -
            -
          • mxmlLoad*() did not treat custom data as opaque, so whitespace - characters would be lost.
          • -
          -

          Changes in Mini-XML 2.2.1

          -
            -
          • mxmlLoadFd(), mxmlLoadFile(), and mxmlLoadString() now correctly - return NULL on error (STR #21)
          • -
          • mxmlNewInteger(), mxmlNewOpaque(), mxmlNewReal(), mxmlNewText(), and - mxmlNewTextf() incorrectly required a parent node (STR #22)
          • -
          • Fixed an XML output bug in mxmldoc.
          • -
          • The "make install" target now uses the install command to set the - proper permissions on UNIX/Linux/OSX.
          • -
          • Fixed a MingW/Cygwin compilation problem (STR #18)
          • -
          -

          Changes in Mini-XML 2.2

          -
            -
          • Added shared library support (STR #17)
          • -
          • mxmlLoad*() now returns an error when an XML stream contains illegal - control characters (STR #10)
          • -
          • mxmlLoad*() now returns an error when an element contains two - attributes with the same name in conformance with the XML spec (STR - #16)
          • -
          • Added support for CDATA (STR #14, STR #15)
          • -
          • Updated comment and processing instruction handling - no entity - support per XML specification.
          • -
          • Added checking for invalid comment termination ("--->" is not - allowed)
          • -
          -

          Changes in Mini-XML 2.1

          -
            -
          • Added support for custom data nodes (STR #6)
          • -
          • Now treat UTF-8 sequences which are longer than necessary as an - error (STR #4)
          • -
          • Fixed entity number support (STR #8)
          • -
          • Fixed mxmlLoadString() bug with UTF-8 (STR #7)
          • -
          • Fixed entity lookup bug (STR #5)
          • -
          • Added mxmlLoadFd() and mxmlSaveFd() functions.
          • -
          • Fixed multi-word UTF-16 handling.
          • -
          -

          Changes in Mini-XML 2.0

          -
            -
          • New programmers manual.
          • -
          • Added Visual C++ project files for Microsoft Windows users.
          • -
          • Added optimizations to mxmldoc, mxmlSaveFile(), and mxmlIndexNew() - (STR #2)
          • -
          • mxmlEntityAddCallback() now returns an integer status (STR #2)
          • -
          • Added UTF-16 support (input only; all output is UTF-8)
          • -
          • Added index functions to build a searchable index of XML nodes.
          • -
          • Added character entity callback interface to support additional - character entities beyond those defined in the XHTML specification.
          • -
          • Added support for XHTML character entities.
          • -
          • The mxmldoc utility now produces XML output which conforms to an - updated XML schema, described in the file "doc/mxmldoc.xsd".
          • -
          • 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.
          • -
          • The mxmldoc utility now produces XML output which conforms to an - updated XML schema, described in the file "doc/mxmldoc.xsd".
          • -
          • 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.
          • -
          • The mxmldoc utility is now capable of documenting C++ classes, - functions, and structures, and correctly handles C++ comments.
          • -
          • Added new modular tests for mxmldoc.
          • -
          • Updated the mxmldoc output to be more compatible with embedding in - manuals produced with HTMLDOC.
          • -
          • The makefile incorrectly included a "/" separator between the - destination path and install path. This caused problems when building - and installing with MingW.
          • -
          -

          Changes in Mini-XML 1.3

          -
            -
          • Fixes for mxmldoc.
          • -
          • Added support for reading standard HTML entity names.
          • -
          • mxmlLoadString/File() did not decode character entities in element - names, attribute names, or attribute values.
          • -
          • mxmlLoadString/File() would crash when loading non- conformant XML - data under an existing parent (top) node.
          • -
          • Fixed several bugs in the mxmldoc utility.
          • -
          • Added new error callback function to catch a variety of errors and - log them to someplace other than stderr.
          • -
          • The mxmlElementSetAttr() function now allows for NULL attribute - values.
          • -
          • The load and save functions now properly handle quoted element and - attribute name strings properly, e.g. for !DOCTYPE declarations.
          • -
          -

          Changes in Mini-XML 1.2

          -
            -
          • Added new "set" methods to set the value of a node.
          • -
          • Added new formatted text methods mxmlNewTextf() and mxmlSetTextf() - to create/set a text node value using printf-style formats.
          • -
          • Added new standard callbacks for use with the mxmlLoad functions.
          • -
          • Updated the HTML documentation to include examples of the walk and - load function output.
          • -
          • Added --with/without-ansi configure option to control the strdup() - function check.
          • -
          • Added --with/without-snprintf configure option to control the - snprintf() and vsnprintf() function checks.
          • -
          -

          Changes in Mini-XML 1.1.2

          -
            -
          • The mxml(3) man page wasn't updated for the string functions.
          • -
          • mxmlSaveString() returned the wrong number of characters.
          • -
          • mxml_add_char() updated the buffer pointer in the wrong place.
          • -
          -

          Changes in Mini-XML 1.1.1

          -
            -
          • The private mxml_add_ch() function did not update the - start-of-buffer pointer which could cause a crash when using - mxmlSaveString().
          • -
          • The private mxml_write_ws() function called putc() instead of using - the proper callback which could cause a crash when using - mxmlSaveString().
          • -
          • Added a mxmlSaveAllocString() convenience function for saving an XML - node tree to an allocated string.
          • -
          -

          Changes in Mini-XML 1.1

          -
            -
          • 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.
          • -
          • Added a new mxmlLoadString() function for loading an XML node tree - from a string.
          • -
          • Added a new mxmlSaveString() function for saving an XML node tree to - a string.
          • -
          • Add emulation of strdup() if the local platform does not provide the - function.
          • -
          -

          Changes in Mini-XML 1.0

          -
            -
          • The mxmldoc program now handles function arguments, structures, - unions, enumerations, classes, and typedefs properly.
          • -
          • Documentation provided via mxmldoc and more in-line comments in the - code.
          • -
          • Added man pages and packaging files.
          • -
          -

          Changes in Mini-XML 0.93

          -
            -
          • New mxmldoc example program that is also used to create and update - code documentation using XML and produce HTML reference pages.
          • -
          • 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.
          • -
          • mxmlLoadFile() now correctly handles comments.
          • -
          • mxmlLoadFile() now supports the required "gt", "quot", and "nbsp" - character entities.
          • -
          • mxmlSaveFile() now uses newlines as whitespace when valid to do so.
          • -
          • mxmlFindElement() now also takes attribute name and attribute value - string arguments to limit the search to specific elements with - attributes and/or values.
          • - NULL pointers can be used as "wildcards". -
          • Added uninstall target to makefile, and auto-reconfig if Makefile.in - or configure.in are changed.
          • -
          • mxmlFindElement(), mxmlWalkNext(), and mxmlWalkPrev() now all - provide "descend" arguments to control whether they descend into child - nodes in the tree.
          • -
          • Fixed some whitespace issues in mxmlLoadFile().
          • -
          • Fixed Unicode output and whitespace issues in mxmlSaveFile().
          • -
          • mxmlSaveFile() now supports a whitespace callback to provide more - human-readable XML output under program control.
          • -
          -

          Changes in Mini-XML 0.92

          -
            -
          • mxmlSaveFile() didn't return a value on success.
          • -
          -

          Changes in Mini-XML 0.91

          -
            -
          • mxmlWalkNext() would go into an infinite loop.
          • -
          -

          Changes in Mini-XML 0.9

          -
            -
          • Initial public release.
          • -
          -
          -
          -

          CLibrary Reference

          -

          Contents

          - -

          Functions

          -

          mxmlAdd

          -

          Add a node to a tree.

          -

          void mxmlAdd ( -
              mxml_node_t *parent, -
              int where, -
              mxml_node_t *child, -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node
          -
          where
          -
          Where to add, MXML_ADD_BEFORE or MXML_ADD_AFTER
          -
          child
          -
          Child node for where or MXML_ADD_TO_PARENT
          -
          node
          -
          Node to add
          -
          -

          Discussion

          -

          Adds the specified node to the parent. If the - child argument is not NULL, puts the new node before or after the - specified child depending on the value of the where argument. If the - child argument is NULL, puts the new node at the beginning of the child - list (MXML_ADD_BEFORE) or at the end of the child list - (MXML_ADD_AFTER). The constant MXML_ADD_TO_PARENT can be used to - specify a NULL child pointer.

          -

          mxmlDelete

          -

          Delete a node and all of its children.

          -

          void mxmlDelete ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to delete
          -
          -

          Discussion

          -

          If the specified node has a parent, this function - first removes the node from its parent using the mxmlRemove() function.

          -

          - - Mini-XML 2.4 mxmlElementDeleteAttr -

          -

          Delete an attribute.

          -

          void mxmlElementDeleteAttr ( -
              mxml_node_t *node, -
              const char *name -
          );

          -

          Parameters

          -
          -
          node
          -
          Element
          -
          name
          -
          Attribute name
          -
          -

          mxmlElementGetAttr

          -

          Get an attribute.

          -

          const char *mxmlElementGetAttr ( -
              mxml_node_t *node, -
              const char *name -
          );

          -

          Parameters

          -
          -
          node
          -
          Element node
          -
          name
          -
          Name of attribute
          -
          -

          Return Value

          -

          Attribute value or NULL

          -

          Discussion

          -

          This function returns NULL if the node is not an - element or the named attribute does not exist.

          -

          mxmlElementSetAttr

          -

          Set an attribute.

          -

          void mxmlElementSetAttr ( -
              mxml_node_t *node, -
              const char *name, -
              const char *value -
          );

          -

          Parameters

          -
          -
          node
          -
          Element node
          -
          name
          -
          Name of attribute
          -
          value
          -
          Attribute value
          -
          -

          Discussion

          -

          If the named attribute already exists, the value - of the attribute is replaced by the new string value. The string value - is copied into the element node. This function does nothing if the node - is not an element.

          -

          - - Mini-XML 2.3 mxmlElementSetAttrf

          -

          Set an attribute with a formatted value.

          -

          void mxmlElementSetAttrf ( -
              mxml_node_t *node, -
              const char *name, -
              const char *format, -
              ... -
          );

          -

          Parameters

          -
          -
          node
          -
          Element node
          -
          name
          -
          Name of attribute
          -
          format
          -
          Printf-style attribute value
          -
          ...
          -
          Additional arguments as needed
          -
          -

          Discussion

          -

          If the named attribute already exists, the value - of the attribute is replaced by the new formatted string. The formatted - string value is copied into the element node. This function does - nothing if the node is not an element.

          -

          -mxmlEntityAddCallback

          -

          Add a callback to convert entities to Unicode.

          -

          int mxmlEntityAddCallback ( -
              mxml_entity_cb_t cb -
          );

          -

          Parameters

          -
          -
          cb
          -
          Callback function to add
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          mxmlEntityGetName

          -

          Get the name that corresponds to the character - value.

          -

          const char *mxmlEntityGetName ( -
              int val -
          );

          -

          Parameters

          -
          -
          val
          -
          Character value
          -
          -

          Return Value

          -

          Entity name or NULL

          -

          Discussion

          -

          If val does not need to be represented by a named - entity, NULL is returned.

          -

          mxmlEntityGetValue

          -

          Get the character corresponding to a named - entity.

          -

          int mxmlEntityGetValue ( -
              const char *name -
          );

          -

          Parameters

          -
          -
          name
          -
          Entity name
          -
          -

          Return Value

          -

          Character value or -1 on error

          -

          Discussion

          -

          The entity name can also be a numeric constant. -1 - is returned if the name is not known.

          -

          -mxmlEntityRemoveCallback

          -

          Remove a callback.

          -

          void mxmlEntityRemoveCallback ( -
              mxml_entity_cb_t cb -
          );

          -

          Parameters

          -
          -
          cb
          -
          Callback function to remove
          -
          -

          mxmlFindElement

          -

          Find the named element.

          -

          mxml_node_t *mxmlFindElement - ( -
              mxml_node_t *node, -
              mxml_node_t *top, -
              const char *name, -
              const char *attr, -
              const char *value, -
              int descend -
          );

          -

          Parameters

          -
          -
          node
          -
          Current node
          -
          top
          -
          Top node
          -
          name
          -
          Element name or NULL for any
          -
          attr
          -
          Attribute name, or NULL for none
          -
          value
          -
          Attribute value, or NULL for any
          -
          descend
          -
          Descend into tree - MXML_DESCEND, - MXML_NO_DESCEND, or MXML_DESCEND_FIRST
          -
          -

          Return Value

          -

          Element node or NULL

          -

          Discussion

          -

          The search is constrained by the name, attribute - name, and value; any NULL names or values are treated as wildcards, so - different kinds of searches can be implemented by looking for all - elements of a given name or all elements with a specific attribute. The - descend argument determines whether the search descends into child - nodes; normally you will use MXML_DESCEND_FIRST for the initial search - and MXML_NO_DESCEND to find additional direct descendents of the node. - The top node argument constrains the search to a particular node's - children.

          -

          - - Mini-XML 2.7 mxmlFindPath

          -

          Find a node with the given path.

          -

          mxml_node_t *mxmlFindPath ( -
              mxml_node_t *top, -
              const char *path -
          );

          -

          Parameters

          -
          -
          top
          -
          Top node
          -
          path
          -
          Path to element
          -
          -

          Return Value

          -

          Found node or NULL

          -

          Discussion

          -

          The "path" is a slash-separated list of element - names. The name "*" is considered a wildcard for one or more levels of - elements. For example, "foo/one/two", "bar/two/one", "*/one", and so - forth. -
          -
          The first child node of the found node is returned if the given - node has children and the first child is a value node.

          -

          - - Mini-XML 2.7 mxmlGetCDATA

          -

          Get the value for a CDATA node.

          -

          const char *mxmlGetCDATA ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          CDATA value or NULL

          -

          Discussion

          -

          NULL is returned if the node is not a - CDATA element.

          -

          - - Mini-XML 2.7 mxmlGetCustom

          -

          Get the value for a custom node.

          -

          const void *mxmlGetCustom ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Custom value or NULL

          -

          Discussion

          -

          NULL is returned if the node (or its - first child) is not a custom value node.

          -

          - - Mini-XML 2.7 mxmlGetElement

          -

          Get the name for an element node.

          -

          const char *mxmlGetElement ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Element name or NULL

          -

          Discussion

          -

          NULL is returned if the node is not - an element node.

          -

          - - Mini-XML 2.7 mxmlGetFirstChild

          -

          Get the first child of an element node.

          -

          mxml_node_t - *mxmlGetFirstChild ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          First child or NULL

          -

          Discussion

          -

          NULL is returned if the node is not - an element node or if the node has no children.

          -

          - - Mini-XML 2.7 mxmlGetInteger

          -

          Get the integer value from the specified node or - its first child.

          -

          int mxmlGetInteger ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Integer value or 0

          -

          Discussion

          -

          0 is returned if the node (or its first child) is - not an integer value node.

          -

          - - Mini-XML 2.7 mxmlGetLastChild

          -

          Get the last child of an element node.

          -

          mxml_node_t - *mxmlGetLastChild ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Last child or NULL

          -

          Discussion

          -

          NULL is returned if the node is not - an element node or if the node has no children.

          -

          mxmlGetNextSibling

          -

          Return the node type...

          -

          mxml_node_t - *mxmlGetNextSibling ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Get the next node for the current parent.

          -

          NULL is returned if this is the last - child for the current parent.

          -

          - - Mini-XML 2.7 mxmlGetOpaque

          -

          Get an opaque string value for a node or its - first child.

          -

          const char *mxmlGetOpaque ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Opaque string or NULL

          -

          Discussion

          -

          NULL is returned if the node (or its - first child) is not an opaque value node.

          -

          - - Mini-XML 2.7 mxmlGetParent

          -

          Get the parent node.

          -

          mxml_node_t *mxmlGetParent ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Parent node or NULL

          -

          Discussion

          -

          NULL is returned for a root node.

          -

          - - Mini-XML 2.7 mxmlGetPrevSibling

          -

          Get the previous node for the current parent.

          -

          mxml_node_t - *mxmlGetPrevSibling ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Previous node or NULL

          -

          Discussion

          -

          NULL is returned if this is the first - child for the current parent.

          -

          - - Mini-XML 2.7 mxmlGetReal

          -

          Get the real value for a node or its first child.

          -

          double mxmlGetReal ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Real value or 0.0

          -

          Discussion

          -

          0.0 is returned if the node (or its first child) - is not a real value node.

          -

          - - Mini-XML 2.7 mxmlGetRefCount

          -

          Get the current reference (use) count for a node.

          -

          int mxmlGetRefCount ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node
          -
          -

          Return Value

          -

          Reference count

          -

          Discussion

          -

          The initial reference count of new nodes is 1. Use - the mxmlRetain and -mxmlRelease functions to increment and decrement a - node's reference count. .

          -

          - - Mini-XML 2.7 mxmlGetText

          -

          Get the text value for a node or its first child.

          -

          const char *mxmlGetText ( -
              mxml_node_t *node, -
              int *whitespace -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          whitespace
          -
          1 if string is preceded by whitespace, 0 - otherwise
          -
          -

          Return Value

          -

          Text string or NULL

          -

          Discussion

          -

          NULL is returned if the node (or its - first child) is not a text node. The "whitespace" argument can be NULL.

          -

          - - Mini-XML 2.7 mxmlGetType

          -

          Get the node type.

          -

          mxml_type_t mxmlGetType ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Type of node

          -

          Discussion

          -

          MXML_IGNORE is returned if "node" is -NULL.

          -

          - - Mini-XML 2.7 mxmlGetUserData

          -

          Get the user data pointer for a node.

          -

          void *mxmlGetUserData ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          User data pointer

          -

          mxmlIndexDelete

          -

          Delete an index.

          -

          void mxmlIndexDelete ( -
              mxml_index_t *ind -
          );

          -

          Parameters

          -
          -
          ind
          -
          Index to delete
          -
          -

          mxmlIndexEnum

          -

          Return the next node in the index.

          -

          mxml_node_t *mxmlIndexEnum ( -
              mxml_index_t *ind -
          );

          -

          Parameters

          -
          -
          ind
          -
          Index to enumerate
          -
          -

          Return Value

          -

          Next node or NULL if there is none

          -

          Discussion

          -

          Nodes are returned in the sorted order of the - index.

          -

          mxmlIndexFind

          -

          Find the next matching node.

          -

          mxml_node_t *mxmlIndexFind ( -
              mxml_index_t *ind, -
              const char *element, -
              const char *value -
          );

          -

          Parameters

          -
          -
          ind
          -
          Index to search
          -
          element
          -
          Element name to find, if any
          -
          value
          -
          Attribute value, if any
          -
          -

          Return Value

          -

          Node or NULL if none found

          -

          Discussion

          -

          You should call mxmlIndexReset() prior to using - this function for the first time with a particular set of "element" and - "value" strings. Passing NULL for both "element" and "value" is - equivalent to calling mxmlIndexEnum().

          -

          - - Mini-XML 2.7 mxmlIndexGetCount

          -

          Get the number of nodes in an index.

          -

          int mxmlIndexGetCount ( -
              mxml_index_t *ind -
          );

          -

          Parameters

          -
          -
          ind
          -
          Index of nodes
          -
          -

          Return Value

          -

          Number of nodes in index

          -

          mxmlIndexNew

          -

          Create a new index.

          -

          mxml_index_t *mxmlIndexNew - ( -
              mxml_node_t *node, -
              const char *element, -
              const char *attr -
          );

          -

          Parameters

          -
          -
          node
          -
          XML node tree
          -
          element
          -
          Element to index or NULL for all
          -
          attr
          -
          Attribute to index or NULL for none
          -
          -

          Return Value

          -

          New index

          -

          Discussion

          -

          The index will contain all nodes that contain the - named element and/or attribute. If both "element" and "attr" are NULL, - then the index will contain a sorted list of the elements in the node - tree. Nodes are sorted by element name and optionally by attribute - value if the "attr" argument is not NULL.

          -

          mxmlIndexReset

          -

          Reset the enumeration/find pointer in the index - and return the first node in the index.

          -

          mxml_node_t *mxmlIndexReset - ( -
              mxml_index_t *ind -
          );

          -

          Parameters

          -
          -
          ind
          -
          Index to reset
          -
          -

          Return Value

          -

          First node or NULL if there is none

          -

          Discussion

          -

          This function should be called prior to using - mxmlIndexEnum() or mxmlIndexFind() for the first time.

          -

          mxmlLoadFd

          -

          Load a file descriptor into an XML node tree.

          -

          mxml_node_t *mxmlLoadFd ( -
              mxml_node_t *top, -
              int fd, -
              mxml_load_cb_t cb -
          );

          -

          Parameters

          -
          -
          top
          -
          Top node
          -
          fd
          -
          File descriptor to read from
          -
          cb
          -
          Callback function or MXML_NO_CALLBACK
          -
          -

          Return Value

          -

          First node or NULL if the file could not be read.

          -

          Discussion

          -

          The nodes in the specified file are added to the - specified top node. If no top node is provided, the XML file MUST be - well-formed with a single parent node like <?xml> for the entire file. - The callback function returns the value type that should be used for - child nodes. If MXML_NO_CALLBACK is specified then all child nodes will - be either MXML_ELEMENT or MXML_TEXT nodes. -
          -
          The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type.

          -

          mxmlLoadFile

          -

          Load a file into an XML node tree.

          -

          mxml_node_t *mxmlLoadFile ( -
              mxml_node_t *top, -
              FILE *fp, -
              mxml_load_cb_t cb -
          );

          -

          Parameters

          -
          -
          top
          -
          Top node
          -
          fp
          -
          File to read from
          -
          cb
          -
          Callback function or MXML_NO_CALLBACK
          -
          -

          Return Value

          -

          First node or NULL if the file could not be read.

          -

          Discussion

          -

          The nodes in the specified file are added to the - specified top node. If no top node is provided, the XML file MUST be - well-formed with a single parent node like <?xml> for the entire file. - The callback function returns the value type that should be used for - child nodes. If MXML_NO_CALLBACK is specified then all child nodes will - be either MXML_ELEMENT or MXML_TEXT nodes. -
          -
          The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type.

          -

          mxmlLoadString

          -

          Load a string into an XML node tree.

          -

          mxml_node_t *mxmlLoadString - ( -
              mxml_node_t *top, -
              const char *s, -
              mxml_load_cb_t cb -
          );

          -

          Parameters

          -
          -
          top
          -
          Top node
          -
          s
          -
          String to load
          -
          cb
          -
          Callback function or MXML_NO_CALLBACK
          -
          -

          Return Value

          -

          First node or NULL if the string has errors.

          -

          Discussion

          -

          The nodes in the specified string are added to the - specified top node. If no top node is provided, the XML string MUST be - well-formed with a single parent node like <?xml> for the entire - string. The callback function returns the value type that should be - used for child nodes. If MXML_NO_CALLBACK is specified then all child - nodes will be either MXML_ELEMENT or MXML_TEXT nodes. -
          -
          The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type.

          -

          - - Mini-XML 2.3 mxmlNewCDATA

          -

          Create a new CDATA node.

          -

          mxml_node_t *mxmlNewCDATA ( -
              mxml_node_t *parent, -
              const char *data -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node or MXML_NO_PARENT
          -
          data
          -
          Data string
          -
          -

          Return Value

          -

          New node

          -

          Discussion

          -

          The new CDATA node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new CDATA node has no parent. The data string must - be nul-terminated and is copied into the new node. CDATA nodes use the - MXML_ELEMENT type.

          -

          - - Mini-XML 2.1 mxmlNewCustom

          -

          Create a new custom data node.

          -

          mxml_node_t *mxmlNewCustom ( -
              mxml_node_t *parent, -
              void *data, -
              mxml_custom_destroy_cb_t - destroy -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node or MXML_NO_PARENT
          -
          data
          -
          Pointer to data
          -
          destroy
          -
          Function to destroy data
          -
          -

          Return Value

          -

          New node

          -

          Discussion

          -

          The new custom node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new element node has no parent. NULL can be passed - when the data in the node is not dynamically allocated or is separately - managed.

          -

          mxmlNewElement

          -

          Create a new element node.

          -

          mxml_node_t *mxmlNewElement - ( -
              mxml_node_t *parent, -
              const char *name -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node or MXML_NO_PARENT
          -
          name
          -
          Name of element
          -
          -

          Return Value

          -

          New node

          -

          Discussion

          -

          The new element node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new element node has no parent.

          -

          mxmlNewInteger

          -

          Create a new integer node.

          -

          mxml_node_t *mxmlNewInteger - ( -
              mxml_node_t *parent, -
              int integer -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node or MXML_NO_PARENT
          -
          integer
          -
          Integer value
          -
          -

          Return Value

          -

          New node

          -

          Discussion

          -

          The new integer node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new integer node has no parent.

          -

          mxmlNewOpaque

          -

          Create a new opaque string.

          -

          mxml_node_t *mxmlNewOpaque ( -
              mxml_node_t *parent, -
              const char *opaque -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node or MXML_NO_PARENT
          -
          opaque
          -
          Opaque string
          -
          -

          Return Value

          -

          New node

          -

          Discussion

          -

          The new opaque node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new opaque node has no parent. The opaque string - must be nul-terminated and is copied into the new node.

          -

          mxmlNewReal

          -

          Create a new real number node.

          -

          mxml_node_t *mxmlNewReal ( -
              mxml_node_t *parent, -
              double real -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node or MXML_NO_PARENT
          -
          real
          -
          Real number value
          -
          -

          Return Value

          -

          New node

          -

          Discussion

          -

          The new real number node is added to the end of - the specified parent's child list. The constant MXML_NO_PARENT can be - used to specify that the new real number node has no parent.

          -

          mxmlNewText

          -

          Create a new text fragment node.

          -

          mxml_node_t *mxmlNewText ( -
              mxml_node_t *parent, -
              int whitespace, -
              const char *string -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node or MXML_NO_PARENT
          -
          whitespace
          -
          1 = leading whitespace, 0 = no whitespace
          -
          string
          -
          String
          -
          -

          Return Value

          -

          New node

          -

          Discussion

          -

          The new text node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new text node has no parent. The whitespace - parameter is used to specify whether leading whitespace is present - before the node. The text string must be nul-terminated and is copied - into the new node.

          -

          mxmlNewTextf

          -

          Create a new formatted text fragment node.

          -

          mxml_node_t *mxmlNewTextf ( -
              mxml_node_t *parent, -
              int whitespace, -
              const char *format, -
              ... -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node or MXML_NO_PARENT
          -
          whitespace
          -
          1 = leading whitespace, 0 = no whitespace
          -
          format
          -
          Printf-style frmat string
          -
          ...
          -
          Additional args as needed
          -
          -

          Return Value

          -

          New node

          -

          Discussion

          -

          The new text node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new text node has no parent. The whitespace - parameter is used to specify whether leading whitespace is present - before the node. The format string must be nul-terminated and is - formatted into the new node.

          -

          - - Mini-XML 2.3 mxmlNewXML

          -

          Create a new XML document tree.

          -

          mxml_node_t *mxmlNewXML ( -
              const char *version -
          );

          -

          Parameters

          -
          -
          version
          -
          Version number to use
          -
          -

          Return Value

          -

          New ?xml node

          -

          Discussion

          -

          The "version" argument specifies the version - number to put in the ?xml element node. If NULL, version 1.0 is - assumed.

          -

          - - Mini-XML 2.3 mxmlRelease

          -

          Release a node.

          -

          int mxmlRelease ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node
          -
          -

          Return Value

          -

          New reference count

          -

          Discussion

          -

          When the reference count reaches zero, the node - (and any children) is deleted via mxmlDelete().

          -

          mxmlRemove

          -

          Remove a node from its parent.

          -

          void mxmlRemove ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to remove
          -
          -

          Discussion

          -

          Does not free memory used by the node - use - mxmlDelete() for that. This function does nothing if the node has no - parent.

          -

          - - Mini-XML 2.3 mxmlRetain

          -

          Retain a node.

          -

          int mxmlRetain ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node
          -
          -

          Return Value

          -

          New reference count

          -

          - - Mini-XML 2.3 mxmlSAXLoadFd

          -

          Load a file descriptor into an XML node tree - using a SAX callback.

          -

          mxml_node_t *mxmlSAXLoadFd ( -
              mxml_node_t *top, -
              int fd, -
              mxml_load_cb_t cb, -
              mxml_sax_cb_t sax_cb, -
              void *sax_data -
          );

          -

          Parameters

          -
          -
          top
          -
          Top node
          -
          fd
          -
          File descriptor to read from
          -
          cb
          -
          Callback function or MXML_NO_CALLBACK
          -
          sax_cb
          -
          SAX callback or MXML_NO_CALLBACK
          -
          sax_data
          -
          SAX user data
          -
          -

          Return Value

          -

          First node or NULL if the file could not be read.

          -

          Discussion

          -

          The nodes in the specified file are added to the - specified top node. If no top node is provided, the XML file MUST be - well-formed with a single parent node like <?xml> for the entire file. - The callback function returns the value type that should be used for - child nodes. If MXML_NO_CALLBACK is specified then all child nodes will - be either MXML_ELEMENT or MXML_TEXT nodes. -
          -
          The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type. -
          -
          The SAX callback must call mxmlRetain() for any nodes that need to - be kept for later use. Otherwise, nodes are deleted when the parent - node is closed or after each data, comment, CDATA, or directive node.

          -

          - - Mini-XML 2.3 mxmlSAXLoadFile

          -

          Load a file into an XML node tree using a SAX - callback.

          -

          mxml_node_t *mxmlSAXLoadFile - ( -
              mxml_node_t *top, -
              FILE *fp, -
              mxml_load_cb_t cb, -
              mxml_sax_cb_t sax_cb, -
              void *sax_data -
          );

          -

          Parameters

          -
          -
          top
          -
          Top node
          -
          fp
          -
          File to read from
          -
          cb
          -
          Callback function or MXML_NO_CALLBACK
          -
          sax_cb
          -
          SAX callback or MXML_NO_CALLBACK
          -
          sax_data
          -
          SAX user data
          -
          -

          Return Value

          -

          First node or NULL if the file could not be read.

          -

          Discussion

          -

          The nodes in the specified file are added to the - specified top node. If no top node is provided, the XML file MUST be - well-formed with a single parent node like <?xml> for the entire file. - The callback function returns the value type that should be used for - child nodes. If MXML_NO_CALLBACK is specified then all child nodes will - be either MXML_ELEMENT or MXML_TEXT nodes. -
          -
          The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type. -
          -
          The SAX callback must call mxmlRetain() for any nodes that need to - be kept for later use. Otherwise, nodes are deleted when the parent - node is closed or after each data, comment, CDATA, or directive node.

          -

          - - Mini-XML 2.3 mxmlSAXLoadString

          -

          Load a string into an XML node tree using a SAX - callback.

          -

          mxml_node_t - *mxmlSAXLoadString ( -
              mxml_node_t *top, -
              const char *s, -
              mxml_load_cb_t cb, -
              mxml_sax_cb_t sax_cb, -
              void *sax_data -
          );

          -

          Parameters

          -
          -
          top
          -
          Top node
          -
          s
          -
          String to load
          -
          cb
          -
          Callback function or MXML_NO_CALLBACK
          -
          sax_cb
          -
          SAX callback or MXML_NO_CALLBACK
          -
          sax_data
          -
          SAX user data
          -
          -

          Return Value

          -

          First node or NULL if the string has errors.

          -

          Discussion

          -

          The nodes in the specified string are added to the - specified top node. If no top node is provided, the XML string MUST be - well-formed with a single parent node like <?xml> for the entire - string. The callback function returns the value type that should be - used for child nodes. If MXML_NO_CALLBACK is specified then all child - nodes will be either MXML_ELEMENT or MXML_TEXT nodes. -
          -
          The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type. -
          -
          The SAX callback must call mxmlRetain() for any nodes that need to - be kept for later use. Otherwise, nodes are deleted when the parent - node is closed or after each data, comment, CDATA, or directive node.

          -

          mxmlSaveAllocString -

          -

          Save an XML tree to an allocated string.

          -

          char *mxmlSaveAllocString ( -
              mxml_node_t *node, -
              mxml_save_cb_t cb -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to write
          -
          cb
          -
          Whitespace callback or MXML_NO_CALLBACK
          -
          -

          Return Value

          -

          Allocated string or NULL

          -

          Discussion

          -

          This function returns a pointer to a string - containing the textual representation of the XML node tree. The string - should be freed using the free() function when you are done with it. - NULL is returned if the node would produce an empty string or if the - string cannot be allocated. -
          -
          The callback argument specifies a function that returns a - whitespace string or NULL before and after each element. If - MXML_NO_CALLBACK is specified, whitespace will only be added before - MXML_TEXT nodes with leading whitespace and before attribute names - inside opening element tags.

          -

          mxmlSaveFd

          -

          Save an XML tree to a file descriptor.

          -

          int mxmlSaveFd ( -
              mxml_node_t *node, -
              int fd, -
              mxml_save_cb_t cb -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to write
          -
          fd
          -
          File descriptor to write to
          -
          cb
          -
          Whitespace callback or MXML_NO_CALLBACK
          -
          -

          Return Value

          -

          0 on success, -1 on error.

          -

          Discussion

          -

          The callback argument specifies a function that - returns a whitespace string or NULL before and after each element. If - MXML_NO_CALLBACK is specified, whitespace will only be added before - MXML_TEXT nodes with leading whitespace and before attribute names - inside opening element tags.

          -

          mxmlSaveFile

          -

          Save an XML tree to a file.

          -

          int mxmlSaveFile ( -
              mxml_node_t *node, -
              FILE *fp, -
              mxml_save_cb_t cb -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to write
          -
          fp
          -
          File to write to
          -
          cb
          -
          Whitespace callback or MXML_NO_CALLBACK
          -
          -

          Return Value

          -

          0 on success, -1 on error.

          -

          Discussion

          -

          The callback argument specifies a function that - returns a whitespace string or NULL before and after each element. If - MXML_NO_CALLBACK is specified, whitespace will only be added before - MXML_TEXT nodes with leading whitespace and before attribute names - inside opening element tags.

          -

          mxmlSaveString

          -

          Save an XML node tree to a string.

          -

          int mxmlSaveString ( -
              mxml_node_t *node, -
              char *buffer, -
              int bufsize, -
              mxml_save_cb_t cb -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to write
          -
          buffer
          -
          String buffer
          -
          bufsize
          -
          Size of string buffer
          -
          cb
          -
          Whitespace callback or MXML_NO_CALLBACK
          -
          -

          Return Value

          -

          Size of string

          -

          Discussion

          -

          This function returns the total number of bytes - that would be required for the string but only copies (bufsize - 1) - characters into the specified buffer. -
          -
          The callback argument specifies a function that returns a - whitespace string or NULL before and after each element. If - MXML_NO_CALLBACK is specified, whitespace will only be added before - MXML_TEXT nodes with leading whitespace and before attribute names - inside opening element tags.

          -

          - - Mini-XML 2.3 mxmlSetCDATA

          -

          Set the element name of a CDATA node.

          -

          int mxmlSetCDATA ( -
              mxml_node_t *node, -
              const char *data -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          data
          -
          New data string
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          Discussion

          -

          The node is not changed if it (or its first child) - is not a CDATA element node.

          -

          - - Mini-XML 2.1 mxmlSetCustom

          -

          Set the data and destructor of a custom data - node.

          -

          int mxmlSetCustom ( -
              mxml_node_t *node, -
              void *data, -
              mxml_custom_destroy_cb_t - destroy -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          data
          -
          New data pointer
          -
          destroy
          -
          New destructor function
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          Discussion

          -

          The node is not changed if it (or its first child) - is not a custom node.

          -

          -mxmlSetCustomHandlers

          -

          Set the handling functions for custom data.

          -

          void mxmlSetCustomHandlers ( -
              mxml_custom_load_cb_t - load, -
              mxml_custom_save_cb_t save -
          );

          -

          Parameters

          -
          -
          load
          -
          Load function
          -
          save
          -
          Save function
          -
          -

          Discussion

          -

          The load function accepts a node pointer and a - data string and must return 0 on success and non-zero on error. -
          -
          The save function accepts a node pointer and must return a malloc'd - string on success and NULL on error.

          -

          mxmlSetElement

          -

          Set the name of an element node.

          -

          int mxmlSetElement ( -
              mxml_node_t *node, -
              const char *name -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          name
          -
          New name string
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          Discussion

          -

          The node is not changed if it is not an element - node.

          -

          mxmlSetErrorCallback -

          -

          Set the error message callback.

          -

          void mxmlSetErrorCallback ( -
              mxml_error_cb_t cb -
          );

          -

          Parameters

          -
          -
          cb
          -
          Error callback function
          -
          -

          mxmlSetInteger

          -

          Set the value of an integer node.

          -

          int mxmlSetInteger ( -
              mxml_node_t *node, -
              int integer -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          integer
          -
          Integer value
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          Discussion

          -

          The node is not changed if it (or its first child) - is not an integer node.

          -

          mxmlSetOpaque

          -

          Set the value of an opaque node.

          -

          int mxmlSetOpaque ( -
              mxml_node_t *node, -
              const char *opaque -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          opaque
          -
          Opaque string
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          Discussion

          -

          The node is not changed if it (or its first child) - is not an opaque node.

          -

          mxmlSetReal

          -

          Set the value of a real number node.

          -

          int mxmlSetReal ( -
              mxml_node_t *node, -
              double real -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          real
          -
          Real number value
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          Discussion

          -

          The node is not changed if it (or its first child) - is not a real number node.

          -

          mxmlSetText

          -

          Set the value of a text node.

          -

          int mxmlSetText ( -
              mxml_node_t *node, -
              int whitespace, -
              const char *string -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          whitespace
          -
          1 = leading whitespace, 0 = no whitespace
          -
          string
          -
          String
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          Discussion

          -

          The node is not changed if it (or its first child) - is not a text node.

          -

          mxmlSetTextf

          -

          Set the value of a text node to a formatted - string.

          -

          int mxmlSetTextf ( -
              mxml_node_t *node, -
              int whitespace, -
              const char *format, -
              ... -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          whitespace
          -
          1 = leading whitespace, 0 = no whitespace
          -
          format
          -
          Printf-style format string
          -
          ...
          -
          Additional arguments as needed
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          Discussion

          -

          The node is not changed if it (or its first child) - is not a text node.

          -

          - - Mini-XML 2.7 mxmlSetUserData

          -

          Set the user data pointer for a node.

          -

          int mxmlSetUserData ( -
              mxml_node_t *node, -
              void *data -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          data
          -
          User data pointer
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          - - Mini-XML 2.3 mxmlSetWrapMargin

          -

          Set the wrap margin when saving XML data.

          -

          void mxmlSetWrapMargin ( -
              int column -
          );

          -

          Parameters

          -
          -
          column
          -
          Column for wrapping, 0 to disable wrapping
          -
          -

          Discussion

          -

          Wrapping is disabled when "column" is 0.

          -

          mxmlWalkNext

          -

          Walk to the next logical node in the tree.

          -

          mxml_node_t *mxmlWalkNext ( -
              mxml_node_t *node, -
              mxml_node_t *top, -
              int descend -
          );

          -

          Parameters

          -
          -
          node
          -
          Current node
          -
          top
          -
          Top node
          -
          descend
          -
          Descend into tree - MXML_DESCEND, - MXML_NO_DESCEND, or MXML_DESCEND_FIRST
          -
          -

          Return Value

          -

          Next node or NULL

          -

          Discussion

          -

          The descend argument controls whether the first - child is considered to be the next node. The top node argument - constrains the walk to the node's children.

          -

          mxmlWalkPrev

          -

          Walk to the previous logical node in the tree.

          -

          mxml_node_t *mxmlWalkPrev ( -
              mxml_node_t *node, -
              mxml_node_t *top, -
              int descend -
          );

          -

          Parameters

          -
          -
          node
          -
          Current node
          -
          top
          -
          Top node
          -
          descend
          -
          Descend into tree - MXML_DESCEND, - MXML_NO_DESCEND, or MXML_DESCEND_FIRST
          -
          -

          Return Value

          -

          Previous node or NULL

          -

          Discussion

          -

          The descend argument controls whether the previous - node's last child is considered to be the previous node. The top node - argument constrains the walk to the node's children.

          -

          Data Types

          -

          -mxml_custom_destroy_cb_t

          -

          Custom data destructor

          -

          typedef void (*mxml_custom_destroy_cb_t)(void *);

          -

          -mxml_custom_load_cb_t

          -

          Custom data load callback function

          -

          typedef int (*mxml_custom_load_cb_t)( -mxml_node_t *, const char *);

          -

          -mxml_custom_save_cb_t

          -

          Custom data save callback function

          -

          typedef char *(*mxml_custom_save_cb_t)( -mxml_node_t *);

          -

          mxml_entity_cb_t

          -

          Entity callback function

          -

          typedef int (*mxml_entity_cb_t)(const char *);

          -

          mxml_error_cb_t

          -

          Error callback function

          -

          typedef void (*mxml_error_cb_t)(const char *);

          -

          mxml_index_t

          -

          An XML node index.

          -

          typedef struct mxml_index_s - mxml_index_t;

          -

          mxml_load_cb_t

          -

          Load callback function

          -

          typedef mxml_type_t - (*mxml_load_cb_t)(mxml_node_t *);

          -

          mxml_node_t

          -

          An XML node.

          -

          typedef struct mxml_node_s - mxml_node_t;

          -

          mxml_save_cb_t

          -

          Save callback function

          -

          typedef const char *(*mxml_save_cb_t)( -mxml_node_t *, int);

          -

          mxml_sax_cb_t

          -

          SAX callback function

          -

          typedef void (*mxml_sax_cb_t)( -mxml_node_t *, mxml_sax_event_t, void *);

          -

          mxml_sax_event_t

          -

          SAX event type.

          -

          typedef enum -mxml_sax_event_e mxml_sax_event_t;

          -

          mxml_type_t

          -

          The XML node type.

          -

          typedef enum mxml_type_e - mxml_type_t;

          -

          Constants

          -

          mxml_sax_event_e

          -

          SAX event type.

          -

          Constants

          -
          -
          MXML_SAX_CDATA
          -
          CDATA node
          -
          MXML_SAX_COMMENT
          -
          Comment node
          -
          MXML_SAX_DATA
          -
          Data node
          -
          MXML_SAX_DIRECTIVE
          -
          Processing directive node
          -
          MXML_SAX_ELEMENT_CLOSE
          -
          Element closed
          -
          MXML_SAX_ELEMENT_OPEN
          -
          Element opened
          -
          -

          mxml_type_e

          -

          The XML node type.

          -

          Constants

          -
          -
          MXML_CUSTOM - -  Mini-XML 2.1 
          -
          Custom data
          -
          MXML_ELEMENT
          -
          XML element with attributes
          -
          MXML_IGNORE - -  Mini-XML 2.3 
          -
          Ignore/throw away node
          -
          MXML_INTEGER
          -
          Integer value
          -
          MXML_OPAQUE
          -
          Opaque string
          -
          MXML_REAL
          -
          Real value
          -
          MXML_TEXT
          -
          Text fragment
          -
          -

          -

          DXML Schema

          -

          This appendix provides the XML schema that is used for the XML files - produced by mxmldoc. This schema is available on-line at:

          -
          -    http://www.minixml.org/mxmldoc.xsd
          -
          -

          mxmldoc.xsd

          -
          
          -<?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>
          -
          - - diff --git a/www/mxmldoc.xsd b/www/mxmldoc.xsd deleted file mode 100644 index 26c6508..0000000 --- a/www/mxmldoc.xsd +++ /dev/null @@ -1,189 +0,0 @@ - - - - - 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. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/www/org.minixml.atom b/www/org.minixml.atom deleted file mode 100644 index fe7854e..0000000 --- a/www/org.minixml.atom +++ /dev/null @@ -1,16 +0,0 @@ - - - http://www.minixml.org/org.minixml.atom/20111220234804 - minixml.org - - 2011-12-20T23:48:04-08:00 - - tag:www.minixml.org,2011-12-20:org.minixml.docset/2.7.0 - Mini-XML API Reference - 2011-12-20T23:48:04-08:00 - Mini-XML API Reference (v2.7.0) - - org.minixml.docset - 2.7.0 - - \ No newline at end of file diff --git a/www/org.minixml.xar b/www/org.minixml.xar deleted file mode 100644 index 5185c52..0000000 Binary files a/www/org.minixml.xar and /dev/null differ diff --git a/www/phplib/.htaccess b/www/phplib/.htaccess deleted file mode 100644 index 0a35203..0000000 --- a/www/phplib/.htaccess +++ /dev/null @@ -1,3 +0,0 @@ -Order deny,allow -Allow from none - diff --git a/www/phplib/auth.php b/www/phplib/auth.php deleted file mode 100644 index 1623667..0000000 --- a/www/phplib/auth.php +++ /dev/null @@ -1,183 +0,0 @@ - diff --git a/www/phplib/common.php b/www/phplib/common.php deleted file mode 100644 index 362d4c9..0000000 --- a/www/phplib/common.php +++ /dev/null @@ -1,681 +0,0 @@ - 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 = "

          "; - - for ($i = 0; $i < $len; $i ++) - { - switch ($text[$i]) - { - case '<' : - $col ++; - if (strtolower(substr($text, $i, 8)) == "" || - strtolower(substr($text, $i, 3)) == "" || - strtolower(substr($text, $i, 4)) == "" || - strtolower(substr($text, $i, 12)) == "

          " || - strtolower(substr($text, $i, 13)) == "
          " || - strtolower(substr($text, $i, 6)) == "" || - strtolower(substr($text, $i, 7)) == "" || - strtolower(substr($text, $i, 4)) == "" || - strtolower(substr($text, $i, 5)) == "" || - strtolower(substr($text, $i, 4)) == "

          " || - strtolower(substr($text, $i, 5)) == "

          " || - strtolower(substr($text, $i, 4)) == "

          " || - strtolower(substr($text, $i, 5)) == "

          " || - strtolower(substr($text, $i, 4)) == "

          " || - strtolower(substr($text, $i, 5)) == "

          " || - strtolower(substr($text, $i, 4)) == "

          " || - strtolower(substr($text, $i, 5)) == "

          " || - strtolower(substr($text, $i, 4)) == "
          " || - strtolower(substr($text, $i, 5)) == "
          " || - strtolower(substr($text, $i, 4)) == "
          " || - strtolower(substr($text, $i, 5)) == "
          " || - strtolower(substr($text, $i, 3)) == "" || - strtolower(substr($text, $i, 4)) == "" || - strtolower(substr($text, $i, 5)) == "" || - strtolower(substr($text, $i, 5)) == "" || - strtolower(substr($text, $i, 4)) == "
            " || - strtolower(substr($text, $i, 5)) == "
          " || - strtolower(substr($text, $i, 3)) == "

          " || - strtolower(substr($text, $i, 4)) == "

          " || - strtolower(substr($text, $i, 5)) == "
          " ||
          -	      strtolower(substr($text, $i, 6)) == "
          " || - strtolower(substr($text, $i, 4)) == "" || - strtolower(substr($text, $i, 5)) == "" || - strtolower(substr($text, $i, 3)) == "" || - strtolower(substr($text, $i, 4)) == "" || - strtolower(substr($text, $i, 4)) == "
            " || - strtolower(substr($text, $i, 5)) == "
          ") - { - 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 = 0; - } - - if (($i + 1) < $len && $text[$i + 1] != '-' && $list) - { - $ftext .= "\n\n

          "; - $list = 0; - } - else - $ftext .= "\n

          "; - } - else if (($i + 1) < $len && - ($text[$i + 1] == " " || $text[$i + 1] == "\t")) - { - if ($pre) - { - $ftext .= ""; - $pre = 0; - } - else - $ftext .= "
          \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   = 1;
          -	    }
          -
          -	    $ftext .= " ";
          -	  }
          -	  else if ($text[$i + 1] == " ")
          -	    $ftext .= " ";
          -	  else
          -            $ftext .= " ";
          -
          -          if ($col > 0)
          -	    $col ++;
          -	  break;
          -
          -      case '*' :
          -          if ($bold)
          -	    $ftext .= "";
          -	  else
          -	    $ftext .= "";
          -
          -	  $bold = 1 - $bold;
          -	  break;
          -
          -      case '-' :
          -          // Possible list...
          -	  if ($col == 0)
          -	  {
          -	    if (!$list)
          -	    {
          -	      $ftext .= "\n";
          -
          -  if ($pre)
          -    $ftext .= "
          "; - - 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 .= "
          "; - - $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 .= "$url"; - $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 .= " at "; - 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 .= "$word"; - else if (strchr($word, '@')) - $qtext .= sanitize_email($word); - else - $qtext .= quote_text($word); - - $qtext .= "
          "; - $word = ""; - break; - - case "\r" : - break; - - case "\t" : - case " " : - if (!strncmp($word, "http://", 7) || - !strncmp($word, "https://", 8) || - !strncmp($word, "ftp://", 6)) - $qtext .= "$word"; - 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 .= "$word"; - else if (strchr($word, '@')) - $qtext .= sanitize_email($word); - else - $qtext .= quote_text($word); - - return ($qtext); -} - - -// -// 'select_is_published()' - Do a "); - if ($is_published) - { - print(""); - print(""); - } - else - { - print(""); - print(""); - } - print(""); -} - - -// -// '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("

          You have $modpoints moderation points available.

          \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("
          \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("From " - ."$create_user, $create_date (score=$row[status])\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("
          \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 " - 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 $". -// -?> diff --git a/www/phplib/db.php b/www/phplib/db.php deleted file mode 100644 index 793d459..0000000 --- a/www/phplib/db.php +++ /dev/null @@ -1,159 +0,0 @@ -Database error $sqlerrno: $sqlerr

          \n"); - print("

          Please report the problem to " - ."webmaster@easysw.com.

          \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("

          SQL_QUERY: $SQL_QUERY

          \n"); -// -// $result = mysql_query($SQL_QUERY, $DB_CONN); -// $count = db_count($result); -// print("

          Result = $count rows...

          \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 $". -// -?> diff --git a/www/phplib/globals.php b/www/phplib/globals.php deleted file mode 100644 index 4f21fb1..0000000 --- a/www/phplib/globals.php +++ /dev/null @@ -1,49 +0,0 @@ - diff --git a/www/phplib/html.php b/www/phplib/html.php deleted file mode 100644 index 07a9a30..0000000 --- a/www/phplib/html.php +++ /dev/null @@ -1,465 +0,0 @@ - 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("\n"); - print("\n"); - print("\n"); - - // Title... - if ($title != "") - $html_title = "$title -"; - else - $html_title = ""; - - print(" $html_title Mini-XML\n" - ." \n" - ." \n" - ." \n" - ." \n"); - - // If refresh URL is specified, add the META tag... - if ($refresh != "") - print(" \n"); - - // Search engine keywords... - reset($html_keywords); - - list($key, $val) = each($html_keywords); - print("\n"); - - print("\n" - ."\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 = ""; - } - else - { - // Use standard HTML text field... - $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("\n" - ."" - ."" - ."" - ."" - ."" - ."" - ."" - ."" - ."" - ."\n" - ."\n" - ."\n" - ."
          "); - - if ($LOGIN_USER) - print("$LOGIN_USER"); - else - print("Login"); - - print("HomeBugs & FeaturesDocumentationDownloadForums" - ."
          " - ."$search
          "); -} - - -// -// 'html_footer()' - Show the standard footer for a page. -// - -function -html_footer() -{ - print("
          \n" - ."\n" - ."\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("

          "); -} - - -// -// 'html_end_links()' - End of series of hyperlinks. -// - -function -html_end_links() -{ - print("

          \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("$safetext"); -} - - -// -// '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("" - .""); - - $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(""); - else - print(""); - } - - print("\n"); -} - - -// -// 'html_end_table()' - End a rounded, shaded table. -// - -function -html_end_table() -{ - print("
          $s_header 
          \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(""); -} - - -// -// 'html_end_row()' - End a table row. -// - -function -html_end_row() -{ - global $html_row; - - $html_row = 1 - $html_row; - - print("\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 "); - if ($is_published) - { - print(""); - print(""); - } - else - { - print(""); - print(""); - } - print(""); -} - - -?> diff --git a/www/phplib/mirrors.php b/www/phplib/mirrors.php deleted file mode 100644 index 6b25321..0000000 --- a/www/phplib/mirrors.php +++ /dev/null @@ -1,71 +0,0 @@ - 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$". -// -?> diff --git a/www/phplib/poll.php b/www/phplib/poll.php deleted file mode 100644 index e2cedb7..0000000 --- a/www/phplib/poll.php +++ /dev/null @@ -1,114 +0,0 @@ -
          " - ."$question\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("
          $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("
          \n" - ."[ Results ]\n"); - print("
          ($votes, $ccount)

          \n"); - } - - db_free($result); -} - - -// -// End of "$Id: poll.php,v 1.1 2004/05/20 03:38:42 mike Exp $". -// -?> diff --git a/www/phplib/str.php b/www/phplib/str.php deleted file mode 100644 index f771cef..0000000 --- a/www/phplib/str.php +++ /dev/null @@ -1,82 +0,0 @@ - "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 $". -// -?> diff --git a/www/poll.php b/www/poll.php deleted file mode 100644 index ed84aa6..0000000 --- a/www/poll.php +++ /dev/null @@ -1,395 +0,0 @@ - 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("

          Poll #$poll

          \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("

          Polls

          \n"); - - if (db_count($result) == 0) - { - print("

          No polls found.

          \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("#$row[id]" - ."$question"); - if (!$row['is_published']) - print(" private"); - print("Vote | " - ."Results"); - - if ($LOGIN_LEVEL > AUTH_USER) - print(" | Edit"); - - print(" ($votes total votes, $ccount)"); - 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("

          Poll #$poll

          \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("

          No votes for this poll yet...

          \n"); - else - { - $question = htmlspecialchars($row['question']); - - print("
          \n"); - print("\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("\n"); - } - } - - print("\n"); - print("
          $question
          $answer" - ." $count / $percent%
          $votes total votes.
          \n"); - } - - print("
          \n" - ."

          User Comments

          \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("

          Poll Error

          \n"); - print("

          Sorry, it appears that you or someone else using your IP " - ."address has already voted for " - ."poll #$poll.\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("

          Poll #$poll

          \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("

          New Poll

          \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("
          \n"); - print("
          \n" - ."\n"); - - print("\n"); - - print("\n"); - - for ($i = 0; $i < 10; $i ++) - { - $number = $i + 1; - - print("\n"); - } - - if ($poll) - print("\n"); - else - print("\n"); - - print("
          Question:" - ."
          Type:" - ."
          Published:"); - select_is_published($is_published); - print("
          Answer #$number" - ."
          \n"); - print("
          \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 $". -// -?> diff --git a/www/software.php b/www/software.php deleted file mode 100644 index cc3ce64..0000000 --- a/www/software.php +++ /dev/null @@ -1,182 +0,0 @@ -Download\n"); - - print("

          Your download should begin shortly. If not, please " - ."click here to download the file " - ."from the current mirror.

          \n" - ."
          \n" - ."\n" - ."\n"); - - reset($MIRRORS); - while (list($key, $val) = each($MIRRORS)) - { - print("$val[0]
          \n"); - } - - print("

          \n" - ."

          \n"); -} -else -{ - // Show files... - print("

          Releases

          \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 = ""; - $ce = ""; - } - else - { - $cs = ""; - $ce = ""; - } - - if ($fversion != $curversion) - { - if ($curversion != "") - { - html_start_row("header"); - print(""); - html_end_row(); - } - - $curversion = $fversion; - html_start_row(); - print("$cs$fversion$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" - ."$basename$ce" - ."$cs${kbytes}k$ce" - ."$cs$md5$ce"); - - html_end_row(); - } - - html_end_table(); - - print("

          Subversion Access

          \n" - ."

          The $PROJECT_NAME software is available via Subversion " - ."using the following URL:

          \n" - ."
          \n"
          -       ."    "
          -       ."http://svn.easysw.com/public/$PROJECT_MODULE/\n"
          -       ."
          \n" - ."

          The following command can be used to checkout the current " - ."$PROJECT_NAME source from Subversion:

          \n" - ."
          \n"
          -       ."    svn co http://svn.easysw.com/public/$PROJECT_MODULE/trunk/ $PROJECT_MODULE\n"
          -       ."
          \n"); -} - -// Show the standard footer... -html_footer(); - -// -// End of "$Id$". -// -?> diff --git a/www/str.php b/www/str.php deleted file mode 100644 index d443789..0000000 --- a/www/str.php +++ /dev/null @@ -1,1934 +0,0 @@ - - "Fixed in Subversion repository.", - "Old STR" => - "This STR has not been updated by the submitter for two or more weeks " - ."and has been closed as required by the Mini-XML Configuration Management " - ."Plan. If the issue still requires resolution, please re-submit a new " - ."STR.", - "Unresolvable" => - "We are unable to resolve this problem with the information provided. " - ."If you discover new information, please file a new STR referencing " - ."this one." -); - -$subsystems = array( - "Build Files", - "Config Files", - "Core API", - "Documentation", - "Multiple", - "mxmldoc", - "Sample Programs", - "Web Site" -); - -$versions = array( - "+Will Not Fix", - "+None", - "+Future", - "Trunk", - "+3.0", - "2.7", - "2.6", - "2.5", - "2.4", - "2.3", - "2.2.2", - "2.2.1", - "2.2", - "2.1", - "2.0", - "2.0rc1", - "1.3", - "1.2", - "1.1.2", - "1.1.1", - "1.1", - "1.0", - "Web Site" -); - - -// -// Get the list of valid developers from the users table... -// - -$managers = array(); - -$result = db_query("SELECT * FROM users WHERE is_published = 1 AND " - ."level >= " . AUTH_DEVEL); -while ($row = db_next($result)) - $managers[$row["name"]] = $row["email"]; - -db_free($result); - - -// -// 'notify_users()' - Notify users of STR changes... -// - -function -notify_users($id, // I - STR # - $what = "updated", // I - Reason for notification - $contents = "") // I - Notification message -{ - global $priority_long; - global $scope_long; - global $status_long; - global $PHP_URL, $PROJECT_EMAIL, $PROJECT_NAME; - - - $result = db_query("SELECT * FROM str WHERE id = $id"); - if ($result) - { - $contents = wordwrap($contents); - $row = db_next($result); - $prtext = $priority_long[$row['priority']]; - $sttext = $status_long[$row['status']]; - $sctext = $scope_long[$row['scope']]; - - if ($row['subsystem'] != "") - $subsystem = $row['subsystem']; - else - $subsystem = "Unassigned"; - - if ($row['fix_version'] != "") - $fix_version = $row['fix_version']; - else - $fix_version = "Unassigned"; - - if (eregi("[a-z0-9_.]+", $row['create_user'])) - $email = auth_user_email($row['create_user']); - else - $email = $row['create_user']; - - if ($row['create_user'] != $row['modify_user'] && - $row['create_user'] != $manager && - $email != "") - mail($email, "$PROJECT_NAME STR #$id $what", - "Your software trouble report #$id has been $what. You can check\n" - ."the status of the report and add additional comments and/or files\n" - ."at the following URL:\n" - ."\n" - ." $PHP_URL?L$id\n" - ."\n" - ." Summary: $row[summary]\n" - ." Version: $row[str_version]\n" - ." Status: $sttext\n" - ." Priority: $prtext\n" - ." Scope: $sctext\n" - ." Subsystem: $subsystem\n" - ."Fix Version: $fix_version\n" - ."\n$contents" - ."________________________________________________________________\n" - ."Thank you for using the $PROJECT_NAME Software Trouble Report page!", - "From: $PROJECT_EMAIL\r\n"); - - $ccresult = db_query("SELECT email FROM carboncopy WHERE url = 'str.php_L$id'"); - if ($ccresult) - { - while ($ccrow = db_next($ccresult)) - { - mail($ccrow['email'], "$PROJECT_NAME STR #$id $what", - "Software trouble report #$id has been $what. You can check\n" - ."the status of the report and add additional comments and/or files\n" - ."at the following URL:\n" - ."\n" - ." $PHP_URL?L$id\n" - ."\n" - ." Summary: $row[summary]\n" - ." Version: $row[str_version]\n" - ." Status: $sttext\n" - ." Priority: $prtext\n" - ." Scope: $sctext\n" - ." Subsystem: $subsystem\n" - ."Fix Version: $fix_version\n" - ."\n$contents" - ."________________________________________________________________\n" - ."Thank you for using the $PROJECT_NAME Software Trouble Report page!", - "From: $PROJECT_EMAIL\r\n"); - } - - db_free($ccresult); - } - - if ($row['manager_email'] != "") - $manager = $row['manager_email']; - else - $manager = $PROJECT_EMAIL; - - if ($row['modify_user'] != $manager) - mail($manager, "$PROJECT_NAME STR #$id $what", - "The software trouble report #$id assigned to you has been $what.\n" - ."You can manage the report and add additional comments and/or files\n" - ."at the following URL:\n" - ."\n" - ." $PHP_URL?L$id\n" - ."\n" - ." Summary: $row[summary]\n" - ." Version: $row[str_version]\n" - ." Status: $sttext\n" - ." Priority: $prtext\n" - ." Scope: $sctext\n" - ." Subsystem: $subsystem\n" - ."Fix Version: $fix_version\n" - ."\n$contents", - "From: $PROJECT_EMAIL\r\n"); - - db_free($result); - } -} - - -// Get command-line options... -// -// Usage: str.php [operation] [options] -// -// Operations: -// -// B = Batch update selected STRs -// L = List all STRs -// L# = List STR # -// M# = Modify STR # -// T# = Post text for STR # -// F# = Post file for STR # -// N = Post new STR -// U# = Update notification for STR # -// -// Options: -// -// I# = Set first STR -// P# = Set priority filter -// S# = Set status filter -// C# = Set scope filter -// E# = Set email filter -// Qtext = Set search text - -$priority = 0; -$status = -2; -$scope = 0; -$search = ""; -$index = 0; -$femail = 0; - -if ($argc) -{ - $op = $argv[0][0]; - $id = (int)substr($argv[0], 1); - - if ($op != 'L' && $op != 'M' && $op != 'T' && $op != 'F' && - $op != 'N' && $op != 'U' && $op != 'B') - { - html_header("Bugs & Features Error"); - print("

          Bad command '$op'!

          \n"); - html_footer(); - exit(); - } - - if (($op == 'M' || $op == 'B') && $LOGIN_LEVEL < AUTH_DEVEL) - { - html_header("Bugs & Features Error"); - print("

          The '$op' command is not available to you!

          \n"); - html_footer(); - exit(); - } - - if (($op == 'M' || $op == 'T' || $op == 'F') && !$id) - { - html_header("Bugs & Features Error"); - print("

          Command '$op' requires an STR number!

          \n"); - html_footer(); - exit(); - } - - if ($op == 'N' && $id) - { - html_header("Bugs & Features Error"); - print("

          Command '$op' cannot have an STR number!

          \n"); - html_footer(); - exit(); - } - - for ($i = 1; $i < $argc; $i ++) - { - $option = substr($argv[$i], 1); - - switch ($argv[$i][0]) - { - case 'P' : // Set priority filter - $priority = (int)$option; - break; - case 'S' : // Set status filter - $status = (int)$option; - break; - case 'C' : // Set scope filter - $scope = (int)$option; - break; - 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; - case 'E' : // Show only problem reports matching the current email - $femail = (int)$option; - break; - default : - html_header("Bugs & Features Error"); - print("

          Bad option '$argv[$i]'!

          \n"); - html_footer(); - exit(); - break; - } - } -} -else -{ - $op = 'L'; - $id = 0; -} - -if ($REQUEST_METHOD == "POST") -{ - if (array_key_exists("FPRIORITY", $_POST)) - $priority = (int)$_POST["FPRIORITY"]; - if (array_key_exists("FSTATUS", $_POST)) - $status = (int)$_POST["FSTATUS"]; - if (array_key_exists("FSCOPE", $_POST)) - $scope = (int)$_POST["FSCOPE"]; - if (array_key_exists("FEMAIL", $_POST)) - $femail = (int)$_POST["FEMAIL"]; - if (array_key_exists("SEARCH", $_POST)) - $search = $_POST["SEARCH"]; -} - -$options = "+P$priority+S$status+C$scope+I$index+E$femail+Q" . urlencode($search); - -// B = Batch update selected STRs -// L = List all STRs -// L# = List STR # -// M# = Modify STR # -// T# = Post text for STR # -// F# = Post file for STR # -// N = Post new STR -// U# = Update notification for STR # - -switch ($op) -{ - case 'B' : // Batch update selected STRs - if ($REQUEST_METHOD != "POST") - { - header("Location: $PHP_SELF?L$options"); - break; - } - - if (array_key_exists("STATUS", $_POST) && - ($_POST["STATUS"] != "" || - $_POST["PRIORITY"] != "" || - $_POST["MANAGER_EMAIL"] != "" || - $_POST["MESSAGE"] != "")) - { - $time = time(); - $manager_email = db_escape($_POST["MANAGER_EMAIL"]); - $modify_user = db_escape($_COOKIE["FROM"]); - $message = $_POST["MESSAGE"]; - - if ($message != "") - { - $contents = db_escape($messages[$message]); - $mailmsg = $messages[$message] . "\n\n"; - } - else - { - $contents = ""; - $mailmsg = ""; - } - - $query = "modify_date = $time, modify_user = '$modify_user'"; - - if ($_POST["STATUS"] != "") - $query .= ", status = $_POST[STATUS]"; - if ($_POST["PRIORITY"] != "") - $query .= ", priority = $_POST[PRIORITY]"; - if ($manager_email != "") - $query .= ", manager_email = '$manager_email'"; - - 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 str SET $query WHERE id = $id"); - - if ($contents != "") - { - db_query("INSERT INTO strtext VALUES(NULL,$id,1,'$contents'," - ."$time,'$modify_user')"); - - notify_users($id, "updated", $mailmsg); - } - } - - db_query("COMMIT TRANSACTION"); - } - - header("Location: $PHP_SELF?L$options"); - break; - - case 'L' : // List (all) STR(s) - if ($id) - { - html_header("STR #$id"); - - $result = db_query("SELECT * FROM str WHERE id = $id"); - if (db_count($result) != 1) - { - print("

          Error: STR #$id was not found!

          \n"); - html_footer(); - exit(); - } - - $row = db_next($result); - - html_start_links(1); - html_link("Return to Bugs & Features", "$PHP_SELF?L$options"); - - if ($row['status'] >= $STR_STATUS_ACTIVE) - { - html_link("Post Text", "$PHP_SELF?T$id$options"); - html_link("Post File", "$PHP_SELF?F$id$options"); - } - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - html_link("Modify STR", "$PHP_SELF?M$id$options"); - - html_end_links(); - - $create_user = sanitize_email($row['create_user']); - $manager_email = sanitize_email($row['manager_email']); - $subsystem = $row['subsystem']; - $summary = htmlspecialchars($row['summary'], ENT_QUOTES); - $prtext = $priority_long[$row['priority']]; - $sttext = $status_long[$row['status']]; - $sctext = $scope_long[$row['scope']]; - $str_version = $row['str_version']; - $fix_version = $row['fix_version']; - - if ($manager_email == "") - $manager_email = "Unassigned"; - - if ($subsystem == "") - $subsystem = "Unassigned"; - - if ($fix_version == "") - $fix_version = "Unassigned"; - - print("\n"); - - print("\n"); - - if ($row['master_id'] > 0) - print("" - ."\n"); - - if (!$row['is_published']) - print("\n"); - - print("\n"); - - print("\n"); - print("\n"); - print("\n"); - print("\n"); - print("\n"); - print("\n"); - print("\n"); - print("\n"); - - if (array_key_exists("FROM", $_COOKIE)) - $email = htmlspecialchars($_COOKIE["FROM"]); - else - $email = ""; - - print("\n"); - print("
          ID:$id
          Duplicate Of:STR " - ."#$row[master_id]
          This STR is " - ."currently hidden from public view.
          Status:$sttext
          Priority:$prtext
          Scope:$sctext
          Subsystem:$subsystem
          Summary:$summary
          Version:$str_version
          Created By:$create_user
          Assigned To:$manager_email
          Fix Version:$fix_version
          Update Notification:" - ."
          " - ."" - ."" - ."
          Receive EMails " - ."Don't Receive EMails" - ."
          " - ."
          \n"); - - db_free($result); - - print("

          Trouble Report Files:

          \n"); - if ($row['status'] >= $STR_STATUS_ACTIVE) - { - html_start_links(); - html_link("Post File", "$PHP_SELF?F$id$options"); - html_end_links(); - } - - $result = db_query("SELECT * FROM strfile WHERE " - ."str_id = $id AND is_published = 1"); - - if (db_count($result) == 0) - print("

          No files

          \n"); - else - { - html_start_table(array("Name/Time/Date", "Filename")); - - while ($row = db_next($result)) - { - $date = date("M d, Y", $row['create_date']); - $time = date("H:i", $row['create_date']); - $email = sanitize_email($row['create_user']); - $filename = htmlspecialchars($row['filename']); - - html_start_row(); - print("$email
          $time $date" - ."" - ."$filename"); - html_end_row(); - } - - html_end_table(); - } - - db_free($result); - - print("

          Trouble Report Dialog:

          \n"); - if ($row['status'] >= $STR_STATUS_ACTIVE) - { - html_start_links(); - html_link("Post Text", "$PHP_SELF?T$id$options"); - html_end_links(); - } - - $result = db_query("SELECT * FROM strtext WHERE " - ."str_id = $id AND is_published = 1"); - - if (db_count($result) == 0) - print("

          No text

          \n"); - else - { - html_start_table(array("Name/Time/Date", "Text")); - - while ($row = db_next($result)) - { - $date = date("M d, Y", $row['create_date']); - $time = date("H:i", $row['create_date']); - $email = sanitize_email($row['create_user']); - $contents = quote_text($row['contents']); - - html_start_row(); - print("$email
          $time $date" - ."$contents"); - html_end_row(); - } - - html_end_table(); - } - - db_free($result); - } - else - { - html_header("Bugs & Features"); - - html_start_links(1); - html_link("Submit Bug or Feature Request", "$PHP_SELF?N$options'"); - html_end_links(); - - $htmlsearch = htmlspecialchars($search, ENT_QUOTES); - - print("

          " - ."Search Words:  " - ."

          \n"); - - print("

          Priority: \n"); - - print("Status: \n"); - - print("Scope: \n"); - - if (array_key_exists("FROM", $_COOKIE)) - { - print("Show: \n"); - } - - print("

          \n"); - - $query = ""; - $prefix = "WHERE "; - - if ($priority > 0) - { - $query .= "${prefix}priority = $priority"; - $prefix = " AND "; - } - - if ($status > 0) - { - $query .= "${prefix}status = $status"; - $prefix = " AND "; - } - else if ($status == -1) // Show closed - { - $query .= "${prefix}status <= $STR_STATUS_UNRESOLVED"; - $prefix = " AND "; - } - else if ($status == -2) // Show open - { - $query .= "${prefix}status >= $STR_STATUS_ACTIVE"; - $prefix = " AND "; - } - - if ($scope > 0) - { - $query .= "${prefix}scope = $scope"; - $prefix = " AND "; - } - - if ($LOGIN_LEVEL < AUTH_DEVEL) - { - $query .= "${prefix}(is_published = 1 OR create_user = '" - . db_escape($LOGIN_USER) . "')"; - $prefix = " AND "; - } - - if ($femail) - { - if (array_key_exists("FROM", $_COOKIE)) - $email = db_escape($_COOKIE["FROM"]); - else - $email = ""; - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - { - $query .= "${prefix}(manager_email = '' OR manager_email = '$email')"; - $prefix = " AND "; - } - else if ($email != "") - { - $query .= "${prefix}create_user = '$email'"; - $prefix = " AND "; - } - } - - if ($search) - { - // Convert the search string to an array of words... - $words = html_search_words($search); - - // Loop through the array of words, adding them to the query... - $query .= "${prefix}("; - $prefix = ""; - $next = " OR"; - $logic = ""; - - reset($words); - foreach ($words as $word) - { - if ($word == "or") - { - $next = ' OR'; - if ($prefix != '') - $prefix = ' OR'; - } - else if ($word == "and") - { - $next = ' AND'; - if ($prefix != '') - $prefix = ' AND'; - } - else if ($word == "not") - $logic = ' NOT'; - else - { - $query .= "$prefix$logic ("; - $subpre = ""; - $word = db_escape($word); - - if (ereg("[0-9]+", $word)) - { - $query .= "${subpre}id = $word"; - $subpre = " OR "; - } - - $query .= "${subpre}summary LIKE \"%$word%\""; - $subpre = " OR "; - $query .= "${subpre}subsystem LIKE \"%$word%\""; - $query .= "${subpre}str_version LIKE \"%$word%\""; - $query .= "${subpre}fix_version LIKE \"%$word%\""; - $query .= "${subpre}manager_email LIKE \"%$word%\""; - $query .= "${subpre}create_user LIKE \"%$word%\""; - - $query .= ")"; - $prefix = $next; - $logic = ''; - } - } - - $query .= ")"; - } - - $result = db_query("SELECT * FROM str $query " - ."ORDER BY status DESC, priority DESC, scope DESC, " - ."modify_date"); - $count = db_count($result); - - if ($count == 0) - { - print("

          No STRs found.

          \n"); - - if (($priority || $status || $scope) && $search != "") - print("

          Search for \"$htmlsearch\" in all STRs

          \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("

          $count STR(s) found, showing $start to $end:\n"); - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - print("

          \n"); - - if ($count > $PAGE_MAX) - { - print("\n"); - - print("\n"); - print("
          "); - if ($index > 0) - print("Previous $PAGE_MAX"); - print(""); - if ($end < $count) - { - $next_count = min($PAGE_MAX, $count - $end); - print("Next $next_count"); - } - print("
          \n"); - } - - html_start_table(array("Id", "Priority", "Status", "Scope", - "Summary", "Version", "Last Updated", - "Assigned To")); - - db_seek($result, $index); - for ($i = 0; $i < $PAGE_MAX && $row = db_next($result); $i ++) - { - $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']]; - $link = ""; - - html_start_row(); - - if ($row['is_published'] == 0) - $summabbr .= " Private"; - - print(""); - if ($LOGIN_LEVEL >= AUTH_DEVEL) - print(""); - print("$link$row[id]" - ."$link$prtext" - ."$link$sttext" - ."$link$sctext" - ."$link$summabbr" - ."$link$row[str_version]" - ."$link$date"); - - if ($row['manager_email'] != "") - $email = sanitize_email($row['manager_email']); - else - $email = "Unassigned"; - - print("$link$email"); - - html_end_row(); - - if ($row['status'] >= $STR_STATUS_PENDING) - { - $textresult = db_query("SELECT * FROM strtext " - ."WHERE str_id = $row[id] " - ."ORDER BY id DESC LIMIT 1"); - if ($textresult && db_count($textresult) > 0) - { - $textrow = db_next($textresult); - - html_start_row(); - - $email = sanitize_email($textrow['create_user']); - $contents = abbreviate(quote_text($textrow['contents']), 128); - - print("$email" - ."" - ."$contents"); - - html_end_row(); - - db_free($textresult); - } - } - } - - db_free($result); - html_end_table(); - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - { - print("

          \n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print(""); - print("

          \n"); - } - - if ($count > $PAGE_MAX) - { - print("\n"); - - print("\n"); - print("
          "); - if ($index > 0) - print("Previous $PAGE_MAX"); - print(""); - if ($end < $count) - { - $next_count = min($PAGE_MAX, $count - $end); - print("Next $next_count"); - } - print("
          \n"); - } - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - print("
          "); - - print("

          " - ."MACH = Machine, " - ."OS = Operating System, " - ."STR = Software Trouble Report, " - ."private = hidden from public view

          \n"); - } - - html_footer(); - break; - - case 'M' : // Modify STR - if ($LOGIN_USER == "") - { - header("Location: login.php?PAGE=$PHP_SELF?M$id$options"); - return; - } - - if ($REQUEST_METHOD == "POST") - { - if (array_key_exists("STATUS", $_POST)) - { - $time = time(); - $master_id = (int)$_POST["MASTER_ID"]; - $summary = db_escape($_POST["SUMMARY"]); - $subsystem = db_escape($_POST["SUBSYSTEM"]); - $manager_email = db_escape($_POST["MANAGER_EMAIL"]); - $modify_user = db_escape($_COOKIE["FROM"]); - $contents = db_escape(trim($_POST["CONTENTS"])); - $message = $_POST["MESSAGE"]; - - db_query("UPDATE str SET " - ."master_id = $master_id, " - ."is_published = $_POST[IS_PUBLISHED], " - ."status = $_POST[STATUS], " - ."priority = $_POST[PRIORITY], " - ."scope = $_POST[SCOPE], " - ."summary = '$summary', " - ."subsystem = '$subsystem', " - ."str_version = '$_POST[STR_VERSION]', " - ."fix_version = '$_POST[FIX_VERSION]', " - ."manager_email = '$manager_email', " - ."modify_date = $time, " - ."modify_user = '$modify_user' " - ."WHERE id = $id"); - - if ($contents != "") - { - db_query("INSERT INTO strtext VALUES(NULL,$id,1,'$contents'," - ."$time,'$modify_user')"); - $contents = trim($_POST["CONTENTS"]) . "\n\n"; - } - - if ($message != "") - { - $contents = db_escape($messages[$message]); - - db_query("INSERT INTO strtext VALUES(NULL,$id,1,'$contents'," - ."$time,'$modify_user')"); - - $contents = $messages[$message] . "\n\n"; - } - - header("Location: $PHP_SELF?L$id$options"); - - notify_users($id, "updated", $contents); - } - else if (array_key_exists("FILE_ID", $_POST)) - { - db_query("UPDATE strfile SET " - ."is_published = $_POST[IS_PUBLISHED] " - ."WHERE id = $_POST[FILE_ID]"); - - header("Location: $PHP_SELF?M$id$options"); - } - else if (array_key_exists("TEXT_ID", $_POST)) - { - db_query("UPDATE strtext SET " - ."is_published = $_POST[IS_PUBLISHED] " - ."WHERE id = $_POST[TEXT_ID]"); - - header("Location: $PHP_SELF?M$id$options"); - } - else - header("Location: $PHP_SELF?M$id$options"); - } - else - { - html_header("Modify STR #$id"); - - html_start_links(1); - html_link("Return to Bugs & Features", "$PHP_SELF?L$options"); - html_link("Return to STR #$id", "$PHP_SELF?L$id$options"); - html_link("Post Text", "$PHP_SELF?T$id$options"); - html_link("Post File", "$PHP_SELF?F$id$options"); - html_end_links(); - - $result = db_query("SELECT * FROM str WHERE id = $id"); - if (db_count($result) != 1) - { - print("

          Error: STR #$id was not found!

          \n"); - html_footer(); - exit(); - } - - $row = db_next($result); - - $create_user = htmlspecialchars($row['create_user']); - $manager_email = htmlspecialchars($row['manager_email']); - $summary = htmlspecialchars($row['summary'], ENT_QUOTES); - - print("
          " - ."\n"); - - print("\n"); - - print("" - ."\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print("" - ."\n"); - - print("" - ."\n"); - - print("" - ."\n"); - - print("" - ."\n"); - - print("" - ."\n"); - - print("" - ."\n"); - - print("\n"); - - print("\n"); - print("
          ID:$id
          Duplicate Of:
          Published:"); - print("
          Status:"); - print("\n"); - print("
          Priority:"); - print("
          Scope:"); - print("
          Subsystem:
          Summary:
          Version:
          Created By:$create_user
          Assigned To:
          Fix Version:
          Text:"); - - print("
          \n"); - - print("
          " - ."
          \n"); - - print("

          Trouble Report Files: " - ."Post File" - ."

          \n"); - - $result = db_query("SELECT * FROM strfile WHERE str_id = $id"); - - if (db_count($result) == 0) - print("

          No files

          \n"); - else - { - print("\n" - ."" - ."\n"); - - $line = 0; - while ($row = db_next($result)) - { - $date = date("M d, Y", $row['create_date']); - $time = date("H:i", $row['create_date']); - $email = sanitize_email($row['create_user']); - $filename = htmlspecialchars($row['filename']); - - print("" - ."" - ."" - ."\n"); - - $line = 1 - $line; - } - print("
          Name/Time/DateFilename
          $email
          $time $date
          " - ."
          " - .""); - - if ($row['is_published']) - print("" - .""); - else - print("" - .""); - - print("
          " - ."$filename
          \n"); - } - - db_free($result); - - print("

          Trouble Report Dialog: " - ."Post Text" - ."

          \n"); - - $result = db_query("SELECT * FROM strtext WHERE " - ."str_id = $id"); - - if (db_count($result) == 0) - print("

          No text

          \n"); - else - { - print("\n" - ."" - ."\n"); - - $line = 0; - - while ($row = db_next($result)) - { - $date = date("M d, Y", $row['create_date']); - $time = date("H:i", $row['create_date']); - $email = sanitize_email($row['create_user']); - $contents = quote_text($row['contents']); - - print("" - ."" - ."" - ."\n"); - - $line = 1 - $line; - } - print("
          Name/Time/DateText
          $email
          $time $date
          " - ."
          " - .""); - - if ($row['is_published']) - print("" - .""); - else - print("" - .""); - - print("
          $contents
          \n"); - } - - db_free($result); - - html_footer(); - } - break; - - case 'T' : // Post text for STR # - if ($LOGIN_USER == "") - { - header("Location: login.php?PAGE=$PHP_SELF?T$id$options"); - return; - } - - if ($REQUEST_METHOD == "POST") - { - $contents = $_POST["CONTENTS"]; - - if ($LOGIN_USER != "" && $LOGIN_LEVEL < AUTH_DEVEL) - $email = $LOGIN_USER; - else if (array_key_exists("EMAIL", $_POST) && - validate_email($_POST["EMAIL"])) - { - $email = $_POST["EMAIL"]; - setcookie("FROM", "$email", time() + 90 * 86400, "/"); - } - else if (array_key_exists("FROM", $_COOKIE)) - $email = $_COOKIE["FROM"]; - else - $email = ""; - - if (ereg("Anonymous.*", $email)) - $email = ""; - - if ($email != "" && $contents != "") - $havedata = 1; - } - else - { - if ($LOGIN_USER != "") - $email = $LOGIN_USER; - else if (array_key_exists("FROM", $_COOKIE)) - $email = $_COOKIE["FROM"]; - else - $email = ""; - - $contents = ""; - - if (ereg("Anonymous.*", $email)) - $email = ""; - } - - if ($REQUEST_METHOD == "POST" && $havedata) - { - $time = time(); - $temail = db_escape($email); - $tcontents = db_escape($contents); - - db_query("INSERT INTO strtext VALUES(NULL,$id,1,'$tcontents'," - ."$time,'$temail')"); - - db_query("UPDATE str SET modify_date=$time, modify_user='$temail' " - ."WHERE id = $id"); - db_query("UPDATE str SET status=$STR_STATUS_PENDING WHERE " - ."id = $id AND status >= $STR_STATUS_ACTIVE AND " - ."status < $STR_STATUS_NEW"); - - header("Location: $PHP_SELF?L$id$options"); - - notify_users($id, "updated", "$contents\n\n"); - } - else - { - html_header("Post Text For STR #$id"); - - html_start_links(1); - html_link("Return to STR #$id", "$PHP_SELF?L$id$options"); - html_end_links(); - - if ($REQUEST_METHOD == "POST") - { - print("

          Error: Please fill in the fields marked in " - ."bold red below and resubmit " - ."your trouble report.

          \n"); - - $hstart = ""; - $hend = ""; - } - else - { - $hstart = ""; - $hend = ""; - } - - print("
          " - ."\n"); - - print("\n"); - - print("\n"); - - print("\n"); - print("
          "); - if ($email != "") - print("EMail:"); - else - print("${hstart}EMail:$hend"); - - $temp = htmlspecialchars($email); - print("
          "); - if ($contents != "") - print("Text:"); - else - print("${hstart}Text:$hend"); - - $temp = htmlspecialchars($contents); - print("
          " - ."
          \n"); - html_footer(); - } - break; - - case 'F' : // Post file for STR # - if ($LOGIN_USER == "") - { - header("Location: login.php?PAGE=$PHP_SELF?F$id$options"); - return; - } - - if ($REQUEST_METHOD == "POST") - { - if ($LOGIN_USER != "" && $LOGIN_LEVEL < AUTH_DEVEL) - $email = $LOGIN_USER; - else if (array_key_exists("EMAIL", $_POST) && - validate_email($_POST["EMAIL"])) - { - $email = $_POST["EMAIL"]; - setcookie("FROM", "$email", time() + 90 * 86400, "/"); - } - else if (array_key_exists("FROM", $_COOKIE)) - $email = $_COOKIE["FROM"]; - else - $email = ""; - - if (ereg("Anonymous.*", $email)) - $email = ""; - - if (array_key_exists("STRFILE", $_FILES)) - { - $filename = $_FILES['STRFILE']['name']; - if ($filename[0] == '.' || $filename[0] == '/') - $filename = ""; - } - else - $filename = ""; - - if ($email != "" && $filename != "") - $havedata = 1; - } - else - { - if ($LOGIN_USER != "") - $email = $LOGIN_USER; - else if (array_key_exists("FROM", $_COOKIE)) - $email = $_COOKIE["FROM"]; - else - $email = ""; - - $filename = ""; - - if (ereg("Anonymous.*", $email)) - $email = ""; - } - - if ($REQUEST_METHOD == "POST" && $havedata) - { - $time = time(); - $temail = db_escape($email); - $tmp_name = $_FILES['STRFILE']['tmp_name']; - $name = $_FILES['STRFILE']['name']; - $tname = db_escape($name); - - $infile = fopen($tmp_name, "rb"); - - if (!$infile) - { - html_header("Error"); - print("

          Error! Unable to open file attachment!

          \n"); - html_footer(); - exit(); - } - - mkdir("strfiles/$id"); - $outfile = fopen("strfiles/$id/$name", "wb"); - - if (!$outfile) - { - html_header("Error"); - print("

          Error! Unable to save file attachment!

          \n"); - html_footer(); - exit(); - } - - while ($data = fread($infile, 8192)) - fwrite($outfile, $data); - - fclose($infile); - fclose($outfile); - - db_query("INSERT INTO strfile VALUES(NULL,$id,1,'$tname'," - ."$time,'$temail')"); - - db_query("UPDATE str SET modify_date=$time, modify_user='$temail' " - ."WHERE id = $id"); - db_query("UPDATE str SET status=$STR_STATUS_PENDING WHERE " - ."id = $id AND status >= $STR_STATUS_ACTIVE AND " - ."status < $STR_STATUS_NEW"); - - header("Location: $PHP_SELF?L$id$options"); - - notify_users($id, "updated", "Added file $name\n\n"); - } - else - { - html_header("Post File For STR #$id"); - - html_start_links(1); - html_link("Return to STR #$id", "$PHP_SELF?L$id$options"); - html_end_links(); - - if ($REQUEST_METHOD == "POST") - { - print("

          Error: Please fill in the fields marked in " - ."bold red below and resubmit " - ."your trouble report.

          \n"); - - $hstart = ""; - $hend = ""; - } - else - { - $hstart = ""; - $hend = ""; - } - - print("
          " - .""); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - print("
          "); - if ($email != "") - print("EMail:"); - else - print("${hstart}EMail:$hend"); - - $temp = htmlspecialchars($email); - print("
          "); - if (array_key_exists("STRFILE", $_FILES)) - print("File:"); - else - print("${hstart}File:$hend"); - - print("
          " - ."
          \n"); - html_footer(); - } - break; - - case 'N' : // Post new STR - if ($LOGIN_USER == "") - { - header("Location: login.php?PAGE=$PHP_SELF?N$options"); - return; - } - - $havedata = 0; - - if ($REQUEST_METHOD == "POST") - { - $npriority = $_POST["PRIORITY"]; - $nscope = $_POST["SCOPE"]; - $summary = $_POST["SUMMARY"]; - $version = $_POST["VERSION"]; - $contents = $_POST["CONTENTS"]; - $email = $LOGIN_USER; - - if (array_key_exists("STRFILE", $_FILES)) - { - $filename = $_FILES['STRFILE']['name']; - if ($filename[0] == '.' || $filename[0] == '/') - $filename = ""; - } - else - $filename = ""; - - if ($npriority && $nscope && $summary != "" && $email != "" && - $version != "" && $contents != "") - $havedata = 1; - } - else - { - $email = $LOGIN_USER; - $npriority = 0; - $nscope = 0; - $summary = ""; - $version = ""; - $contents = ""; - $filename = ""; - } - - if ($REQUEST_METHOD == "POST" && $havedata) - { - $time = time(); - $temail = db_escape($email); - $tsummary = db_escape($summary); - $tcontents = db_escape($contents); - - db_query("INSERT INTO str VALUES(NULL,0," - ."$_POST[IS_PUBLISHED],$STR_STATUS_NEW," - ."$npriority,$nscope,'$tsummary','','$version','',''," - ."$time,'$temail',$time,'$temail')"); - - $id = db_insert_id(); - - db_query("INSERT INTO strtext VALUES(NULL,$id,1,'$tcontents'," - ."$time,'$temail')"); - - if ($filename != "") - { - $tmp_name = $_FILES['STRFILE']['tmp_name']; - $name = $_FILES['STRFILE']['name']; - $tname = db_escape($name); - - $infile = fopen($tmp_name, "rb"); - - if (!$infile) - { - html_header("Error"); - print("

          Error! Unable to open file attachment!

          \n"); - html_footer(); - exit(); - } - - mkdir("strfiles/$id"); - $outfile = fopen("strfiles/$id/$name", "wb"); - - if (!$outfile) - { - html_header("Error"); - print("

          Error! Unable to save file attachment!

          \n"); - html_footer(); - exit(); - } - - while ($data = fread($infile, 8192)) - fwrite($outfile, $data); - - fclose($infile); - fclose($outfile); - - db_query("INSERT INTO strfile VALUES(NULL,$id,1,'$tname'," - ."$time,'$temail')"); - } - - header("Location: $PHP_SELF?L$id$options"); - notify_users($id, "created", "$contents\n\n"); - } - else - { - html_header("Submit Bug or Feature Request"); - - html_start_links(1); - html_link("Return to Bugs & Features", "$PHP_SELF?L$options"); - html_end_links(); - - if ($REQUEST_METHOD == "POST") - { - print("

          Error: Please fill in the fields marked " - ."like this below and resubmit " - ."your trouble report.

          \n"); - - $hstart = ""; - $hend = ""; - } - else - { - print("

          Please use this form to report all bugs and request " - ."features in the $PROJECT_NAME software. Be sure to include " - ."the operating system, compiler, sample programs and/or " - ."files, and any other information you can about your " - ."problem. Thank you for helping us to improve " - ."$PROJECT_NAME!

          \n"); - - $hstart = ""; - $hend = ""; - - $recent = time() - 90 * 86400; - $result = db_query("SELECT master_id, " - ."count(master_id) AS count FROM str " - ."WHERE master_id > 0 AND modify_date > $recent " - ."GROUP BY master_id " - ."ORDER BY count DESC, modify_date DESC"); - if (db_count($result) > 0) - { - print("
          \n" - ."

          Commonly reported bugs:

          \n" - ."
            \n"); - $count = 0; - while ($row = db_next($result)) - { - $count ++; - if ($count > 10) - break; - - $common = db_query("SELECT summary, status, fix_version " - ."FROM str WHERE id=$row[master_id]"); - $crow = db_next($common); - $csummary = htmlspecialchars($crow["summary"], ENT_QUOTES); - $cstatus = $status_text[$crow["status"]]; - - if ($crow["fix_version"] != "") - $cstatus .= ", $crow[fix_version]"; - - print("
          • " - ."STR #$row[master_id]: $csummary ($cstatus)
          • \n"); - } - print("
          \n"); - } - } - - print("
          \n" - ."
          " - .""); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - $temp = htmlspecialchars($email); - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - print("
          Security Advisory:" - ."
          Status:5 - New
          "); - if ($npriority > 0) - print("Priority:"); - else - print("${hstart}Priority:$hend"); - for ($i = 1; $i <= 5; $i ++) - { - print("$priority_long[$i]
          "); - } - print("
          "); - if ($nscope > 0) - print("Scope:"); - else - print("${hstart}Scope:$hend"); - for ($i = 1; $i <= 3; $i ++) - { - print("$scope_long[$i]
          "); - } - print("
          Subsystem:Unassigned
          "); - if ($summary != "") - print("Summary:"); - else - print("${hstart}Summary:$hend"); - - $temp = htmlspecialchars($summary, ENT_QUOTES); - print("
          "); - if ($version != "") - print("Version:"); - else - print("${hstart}Version:$hend"); - - print("
          Created By:$temp
          Assigned To:Unassigned
          Fix Version:Unassigned
          "); - if ($contents != "") - print("Detailed Description of Problem:"); - else - print("${hstart}Detailed Description of Problem:$hend"); - - $temp = htmlspecialchars($contents); - print("
          File:"); - - print("
          " - ."
          \n"); - html_footer(); - } - break; - - case 'U' : // Update notification status - // EMAIL and NOTIFICATION variables hold status; add/delete from strcc... - $havedata = 0; - - if ($REQUEST_METHOD != "POST") - { - html_header("Bugs & Features Error"); - print("

          The '$op' command requires a POST request!\n"); - html_footer(); - exit(); - } - - $notification = $_POST["NOTIFICATION"]; - $email = $_POST["EMAIL"]; - - if (($notification != "ON" && $notification != "OFF") || $email == "" || - !validate_email($email)) - { - html_header("Bugs & Features Error"); - print("

          Please press your browsers back button and enter a valid " - ."EMail address and choose whether to receive notification " - ."messages.

          \n"); - html_footer(); - exit(); - } - - setcookie("FROM", "$email", time() + 90 * 86400, "/"); - - $result = db_query("SELECT * FROM carboncopy WHERE " - ."url = 'str.php_L$id' AND email = '$email'"); - - html_header("STR #$id Notifications"); - - html_start_links(); - html_link("Return to STR #$id", "$PHP_SELF?L$id$options"); - html_end_links(); - - if ($notification == "ON") - { - if ($result && db_count($result) > 0) - print("

          Your email address has already been added to the " - ."notification list for STR #$id!

          \n"); - else - { - db_query("INSERT INTO carboncopy VALUES(NULL,'str.php?L$id','$email')"); - - print("

          Your email address has been added to the notification list " - ."for STR #$id.

          \n"); - } - } - else if ($result && db_count($result) > 0) - { - db_query("DELETE FROM carboncopy WHERE " - ."url = 'str.php?L$id' AND email = '$email'"); - - print("

          Your email address has been removed from the notification list " - ."for STR #$id.

          \n"); - } - else - { - print("

          Your email address is not on the notification list for " - ."STR #$id!

          \n"); - } - - if ($result) - db_free($result); - - html_footer(); - break; -} - -// -// End of "$Id$". -// -?> diff --git a/www/strfiles/.htaccess b/www/strfiles/.htaccess deleted file mode 100644 index 6537b6a..0000000 --- a/www/strfiles/.htaccess +++ /dev/null @@ -1,2 +0,0 @@ -DirectoryIndex off - diff --git a/www/style.css b/www/style.css deleted file mode 100644 index 92d4f70..0000000 --- a/www/style.css +++ /dev/null @@ -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; -} diff --git a/www/swfiles/.htaccess b/www/swfiles/.htaccess deleted file mode 100644 index 6537b6a..0000000 --- a/www/swfiles/.htaccess +++ /dev/null @@ -1,2 +0,0 @@ -DirectoryIndex off -