generated from sethub/template
Compare commits
2
Commits
main
..
5af1dec511
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5af1dec511 | ||
|
|
e841ac915d |
@@ -1,2 +1,13 @@
|
|||||||
# template
|
# template
|
||||||
|
|
||||||
|
## GIT
|
||||||
|
|
||||||
|
### clone
|
||||||
|
git clone http://sethub.club/sethub/XML_Data_Parsing.git
|
||||||
|
git checkout -b dev_xxx origin/dev
|
||||||
|
|
||||||
|
### pull
|
||||||
|
git pull origin dev
|
||||||
|
|
||||||
|
## push
|
||||||
|
git push origin dev_xxx -u
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# EditorConfig : http://EditorConfig.org
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
tab_width = 8
|
||||||
|
|
||||||
|
[Makefile*]
|
||||||
|
indent_style = tab
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
ref: refs/heads/master
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
[core]
|
||||||
|
repositoryformatversion = 0
|
||||||
|
filemode = false
|
||||||
|
bare = false
|
||||||
|
logallrefupdates = true
|
||||||
|
symlinks = false
|
||||||
|
ignorecase = true
|
||||||
|
[remote "origin"]
|
||||||
|
url = https://gitlab.gnome.org/GNOME/libxml2.git
|
||||||
|
fetch = +refs/heads/*:refs/remotes/origin/*
|
||||||
|
[branch "master"]
|
||||||
|
remote = origin
|
||||||
|
merge = refs/heads/master
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Unnamed repository; edit this file 'description' to name the repository.
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to check the commit log message taken by
|
||||||
|
# applypatch from an e-mail message.
|
||||||
|
#
|
||||||
|
# The hook should exit with non-zero status after issuing an
|
||||||
|
# appropriate message if it wants to stop the commit. The hook is
|
||||||
|
# allowed to edit the commit message file.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "applypatch-msg".
|
||||||
|
|
||||||
|
. git-sh-setup
|
||||||
|
commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
|
||||||
|
test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
|
||||||
|
:
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to check the commit log message.
|
||||||
|
# Called by "git commit" with one argument, the name of the file
|
||||||
|
# that has the commit message. The hook should exit with non-zero
|
||||||
|
# status after issuing an appropriate message if it wants to stop the
|
||||||
|
# commit. The hook is allowed to edit the commit message file.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "commit-msg".
|
||||||
|
|
||||||
|
# Uncomment the below to add a Signed-off-by line to the message.
|
||||||
|
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
|
||||||
|
# hook is more suited to it.
|
||||||
|
#
|
||||||
|
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
|
||||||
|
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
|
||||||
|
|
||||||
|
# This example catches duplicate Signed-off-by lines and messages that
|
||||||
|
# would confuse 'git am'.
|
||||||
|
|
||||||
|
ret=0
|
||||||
|
|
||||||
|
test "" = "$(grep '^Signed-off-by: ' "$1" |
|
||||||
|
sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
|
||||||
|
echo >&2 Duplicate Signed-off-by lines.
|
||||||
|
ret=1
|
||||||
|
}
|
||||||
|
|
||||||
|
comment_re="$(
|
||||||
|
{
|
||||||
|
git config --get-regexp "^core\.comment(char|string)\$" ||
|
||||||
|
echo '#'
|
||||||
|
} | sed -n -e '
|
||||||
|
${
|
||||||
|
s/^[^ ]* //
|
||||||
|
s|[][*./\]|\\&|g
|
||||||
|
s/^auto$/[#;@!$%^&|:]/
|
||||||
|
p
|
||||||
|
}'
|
||||||
|
)"
|
||||||
|
scissors_line="^${comment_re} -\{8,\} >8 -\{8,\}\$"
|
||||||
|
comment_line="^${comment_re}.*"
|
||||||
|
blank_line='^[ ]*$'
|
||||||
|
# Disallow lines starting with "diff -" or "Index: " in the body of the
|
||||||
|
# message. Stop looking if we see a scissors line.
|
||||||
|
line="$(sed -n -e "
|
||||||
|
# Skip comments and blank lines at the start of the file.
|
||||||
|
/${scissors_line}/q
|
||||||
|
/${comment_line}/d
|
||||||
|
/${blank_line}/d
|
||||||
|
# The first paragraph will become the subject header so
|
||||||
|
# does not need to be checked.
|
||||||
|
: subject
|
||||||
|
n
|
||||||
|
/${scissors_line}/q
|
||||||
|
/${blank_line}/!b subject
|
||||||
|
# Check the body of the message for problematic
|
||||||
|
# prefixes.
|
||||||
|
: body
|
||||||
|
n
|
||||||
|
/${scissors_line}/q
|
||||||
|
/${comment_line}/b body
|
||||||
|
/^diff -/{p;q;}
|
||||||
|
/^Index: /{p;q;}
|
||||||
|
b body
|
||||||
|
" "$1")"
|
||||||
|
if test -n "$line"
|
||||||
|
then
|
||||||
|
echo >&2 "Message contains a diff that will confuse 'git am'."
|
||||||
|
echo >&2 "To fix this indent the diff."
|
||||||
|
ret=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit $ret
|
||||||
@@ -0,0 +1,168 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use IPC::Open2;
|
||||||
|
|
||||||
|
# An example hook script to integrate Watchman
|
||||||
|
# (https://facebook.github.io/watchman/) with git to speed up detecting
|
||||||
|
# new and modified files.
|
||||||
|
#
|
||||||
|
# The hook is passed a version (currently 2) and last update token
|
||||||
|
# formatted as a string and outputs to stdout a new update token and
|
||||||
|
# all files that have been modified since the update token. Paths must
|
||||||
|
# be relative to the root of the working tree and separated by a single NUL.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "query-watchman" and set
|
||||||
|
# 'git config core.fsmonitor .git/hooks/query-watchman'
|
||||||
|
#
|
||||||
|
my ($version, $last_update_token) = @ARGV;
|
||||||
|
|
||||||
|
# Uncomment for debugging
|
||||||
|
# print STDERR "$0 $version $last_update_token\n";
|
||||||
|
|
||||||
|
# Check the hook interface version
|
||||||
|
if ($version ne 2) {
|
||||||
|
die "Unsupported query-fsmonitor hook version '$version'.\n" .
|
||||||
|
"Falling back to scanning...\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
my $git_work_tree = get_working_dir();
|
||||||
|
|
||||||
|
my $json_pkg;
|
||||||
|
eval {
|
||||||
|
require JSON::XS;
|
||||||
|
$json_pkg = "JSON::XS";
|
||||||
|
1;
|
||||||
|
} or do {
|
||||||
|
require JSON::PP;
|
||||||
|
$json_pkg = "JSON::PP";
|
||||||
|
};
|
||||||
|
|
||||||
|
launch_watchman();
|
||||||
|
|
||||||
|
sub launch_watchman {
|
||||||
|
my $o = watchman_query();
|
||||||
|
if (is_work_tree_watched($o)) {
|
||||||
|
output_result($o->{clock}, @{$o->{files}});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub output_result {
|
||||||
|
my ($clockid, @files) = @_;
|
||||||
|
|
||||||
|
# Uncomment for debugging watchman output
|
||||||
|
# open (my $fh, ">", ".git/watchman-output.out");
|
||||||
|
# binmode $fh, ":utf8";
|
||||||
|
# print $fh "$clockid\n@files\n";
|
||||||
|
# close $fh;
|
||||||
|
|
||||||
|
binmode STDOUT, ":utf8";
|
||||||
|
print $clockid;
|
||||||
|
print "\0";
|
||||||
|
local $, = "\0";
|
||||||
|
print @files;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub watchman_clock {
|
||||||
|
my $response = qx/watchman clock "$git_work_tree"/;
|
||||||
|
die "Failed to get clock id on '$git_work_tree'.\n" .
|
||||||
|
"Falling back to scanning...\n" if $? != 0;
|
||||||
|
|
||||||
|
return $json_pkg->new->utf8->decode($response);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub watchman_query {
|
||||||
|
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty')
|
||||||
|
or die "open2() failed: $!\n" .
|
||||||
|
"Falling back to scanning...\n";
|
||||||
|
|
||||||
|
# In the query expression below we're asking for names of files that
|
||||||
|
# changed since $last_update_token but not from the .git folder.
|
||||||
|
#
|
||||||
|
# To accomplish this, we're using the "since" generator to use the
|
||||||
|
# recency index to select candidate nodes and "fields" to limit the
|
||||||
|
# output to file names only. Then we're using the "expression" term to
|
||||||
|
# further constrain the results.
|
||||||
|
my $last_update_line = "";
|
||||||
|
if (substr($last_update_token, 0, 1) eq "c") {
|
||||||
|
$last_update_token = "\"$last_update_token\"";
|
||||||
|
$last_update_line = qq[\n"since": $last_update_token,];
|
||||||
|
}
|
||||||
|
my $query = <<" END";
|
||||||
|
["query", "$git_work_tree", {$last_update_line
|
||||||
|
"fields": ["name"],
|
||||||
|
"expression": ["not", ["dirname", ".git"]]
|
||||||
|
}]
|
||||||
|
END
|
||||||
|
|
||||||
|
# Uncomment for debugging the watchman query
|
||||||
|
# open (my $fh, ">", ".git/watchman-query.json");
|
||||||
|
# print $fh $query;
|
||||||
|
# close $fh;
|
||||||
|
|
||||||
|
print CHLD_IN $query;
|
||||||
|
close CHLD_IN;
|
||||||
|
my $response = do {local $/; <CHLD_OUT>};
|
||||||
|
|
||||||
|
# Uncomment for debugging the watch response
|
||||||
|
# open ($fh, ">", ".git/watchman-response.json");
|
||||||
|
# print $fh $response;
|
||||||
|
# close $fh;
|
||||||
|
|
||||||
|
die "Watchman: command returned no output.\n" .
|
||||||
|
"Falling back to scanning...\n" if $response eq "";
|
||||||
|
die "Watchman: command returned invalid output: $response\n" .
|
||||||
|
"Falling back to scanning...\n" unless $response =~ /^\{/;
|
||||||
|
|
||||||
|
return $json_pkg->new->utf8->decode($response);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub is_work_tree_watched {
|
||||||
|
my ($output) = @_;
|
||||||
|
my $error = $output->{error};
|
||||||
|
if ($error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) {
|
||||||
|
my $response = qx/watchman watch "$git_work_tree"/;
|
||||||
|
die "Failed to make watchman watch '$git_work_tree'.\n" .
|
||||||
|
"Falling back to scanning...\n" if $? != 0;
|
||||||
|
$output = $json_pkg->new->utf8->decode($response);
|
||||||
|
$error = $output->{error};
|
||||||
|
die "Watchman: $error.\n" .
|
||||||
|
"Falling back to scanning...\n" if $error;
|
||||||
|
|
||||||
|
# Uncomment for debugging watchman output
|
||||||
|
# open (my $fh, ">", ".git/watchman-output.out");
|
||||||
|
# close $fh;
|
||||||
|
|
||||||
|
# Watchman will always return all files on the first query so
|
||||||
|
# return the fast "everything is dirty" flag to git and do the
|
||||||
|
# Watchman query just to get it over with now so we won't pay
|
||||||
|
# the cost in git to look up each individual file.
|
||||||
|
my $o = watchman_clock();
|
||||||
|
$error = $o->{error};
|
||||||
|
|
||||||
|
die "Watchman: $error.\n" .
|
||||||
|
"Falling back to scanning...\n" if $error;
|
||||||
|
|
||||||
|
output_result($o->{clock}, ("/"));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
die "Watchman: $error.\n" .
|
||||||
|
"Falling back to scanning...\n" if $error;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_working_dir {
|
||||||
|
my $working_dir;
|
||||||
|
if ($^O =~ 'msys' || $^O =~ 'cygwin') {
|
||||||
|
$working_dir = Win32::GetCwd();
|
||||||
|
$working_dir =~ tr/\\/\//;
|
||||||
|
} else {
|
||||||
|
require Cwd;
|
||||||
|
$working_dir = Cwd::cwd();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $working_dir;
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to prepare a packed repository for use over
|
||||||
|
# dumb transports.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "post-update".
|
||||||
|
|
||||||
|
exec git update-server-info
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to verify what is about to be committed
|
||||||
|
# by applypatch from an e-mail message.
|
||||||
|
#
|
||||||
|
# The hook should exit with non-zero status after issuing an
|
||||||
|
# appropriate message if it wants to stop the commit.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "pre-applypatch".
|
||||||
|
|
||||||
|
. git-sh-setup
|
||||||
|
precommit="$(git rev-parse --git-path hooks/pre-commit)"
|
||||||
|
test -x "$precommit" && exec "$precommit" ${1+"$@"}
|
||||||
|
:
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to verify what is about to be committed.
|
||||||
|
# Called by "git commit" with no arguments. The hook should
|
||||||
|
# exit with non-zero status after issuing an appropriate message if
|
||||||
|
# it wants to stop the commit.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "pre-commit".
|
||||||
|
|
||||||
|
if git rev-parse --verify HEAD >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
against=HEAD
|
||||||
|
else
|
||||||
|
# Initial commit: diff against an empty tree object
|
||||||
|
against=$(git hash-object -t tree /dev/null)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If you want to allow non-ASCII filenames set this variable to true.
|
||||||
|
allownonascii=$(git config --type=bool hooks.allownonascii)
|
||||||
|
|
||||||
|
# Redirect output to stderr.
|
||||||
|
exec 1>&2
|
||||||
|
|
||||||
|
# Cross platform projects tend to avoid non-ASCII filenames; prevent
|
||||||
|
# them from being added to the repository. We exploit the fact that the
|
||||||
|
# printable range starts at the space character and ends with tilde.
|
||||||
|
if [ "$allownonascii" != "true" ] &&
|
||||||
|
# Note that the use of brackets around a tr range is ok here, (it's
|
||||||
|
# even required, for portability to Solaris 10's /usr/bin/tr), since
|
||||||
|
# the square bracket bytes happen to fall in the designated range.
|
||||||
|
test $(git diff-index --cached --name-only --diff-filter=A -z $against |
|
||||||
|
LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
|
||||||
|
then
|
||||||
|
cat <<\EOF
|
||||||
|
Error: Attempt to add a non-ASCII file name.
|
||||||
|
|
||||||
|
This can cause problems if you want to work with people on other platforms.
|
||||||
|
|
||||||
|
To be portable it is advisable to rename the file.
|
||||||
|
|
||||||
|
If you know what you are doing you can disable this check using:
|
||||||
|
|
||||||
|
git config hooks.allownonascii true
|
||||||
|
EOF
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If there are whitespace errors, print the offending file names and fail.
|
||||||
|
exec git diff-index --check --cached $against --
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to verify what is about to be committed.
|
||||||
|
# Called by "git merge" with no arguments. The hook should
|
||||||
|
# exit with non-zero status after issuing an appropriate message to
|
||||||
|
# stderr if it wants to stop the merge commit.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "pre-merge-commit".
|
||||||
|
|
||||||
|
. git-sh-setup
|
||||||
|
test -x "$GIT_DIR/hooks/pre-commit" &&
|
||||||
|
exec "$GIT_DIR/hooks/pre-commit"
|
||||||
|
:
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# An example hook script to verify what is about to be pushed. Called by "git
|
||||||
|
# push" after it has checked the remote status, but before anything has been
|
||||||
|
# pushed. If this script exits with a non-zero status nothing will be pushed.
|
||||||
|
#
|
||||||
|
# This hook is called with the following parameters:
|
||||||
|
#
|
||||||
|
# $1 -- Name of the remote to which the push is being done
|
||||||
|
# $2 -- URL to which the push is being done
|
||||||
|
#
|
||||||
|
# If pushing without using a named remote those arguments will be equal.
|
||||||
|
#
|
||||||
|
# Information about the commits which are being pushed is supplied as lines to
|
||||||
|
# the standard input in the form:
|
||||||
|
#
|
||||||
|
# <local ref> <local oid> <remote ref> <remote oid>
|
||||||
|
#
|
||||||
|
# This sample shows how to prevent push of commits where the log message starts
|
||||||
|
# with "WIP" (work in progress).
|
||||||
|
|
||||||
|
remote="$1"
|
||||||
|
url="$2"
|
||||||
|
|
||||||
|
zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
|
||||||
|
|
||||||
|
while read local_ref local_oid remote_ref remote_oid
|
||||||
|
do
|
||||||
|
if test "$local_oid" = "$zero"
|
||||||
|
then
|
||||||
|
# Handle delete
|
||||||
|
:
|
||||||
|
else
|
||||||
|
if test "$remote_oid" = "$zero"
|
||||||
|
then
|
||||||
|
# New branch, examine all commits
|
||||||
|
range="$local_oid"
|
||||||
|
else
|
||||||
|
# Update to existing branch, examine new commits
|
||||||
|
range="$remote_oid..$local_oid"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for WIP commit
|
||||||
|
commit=$(git rev-list -n 1 --grep '^WIP' "$range")
|
||||||
|
if test -n "$commit"
|
||||||
|
then
|
||||||
|
echo >&2 "Found WIP commit in $local_ref, not pushing"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,169 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Copyright (c) 2006, 2008 Junio C Hamano
|
||||||
|
#
|
||||||
|
# The "pre-rebase" hook is run just before "git rebase" starts doing
|
||||||
|
# its job, and can prevent the command from running by exiting with
|
||||||
|
# non-zero status.
|
||||||
|
#
|
||||||
|
# The hook is called with the following parameters:
|
||||||
|
#
|
||||||
|
# $1 -- the upstream the series was forked from.
|
||||||
|
# $2 -- the branch being rebased (or empty when rebasing the current branch).
|
||||||
|
#
|
||||||
|
# This sample shows how to prevent topic branches that are already
|
||||||
|
# merged to 'next' branch from getting rebased, because allowing it
|
||||||
|
# would result in rebasing already published history.
|
||||||
|
|
||||||
|
publish=next
|
||||||
|
basebranch="$1"
|
||||||
|
if test "$#" = 2
|
||||||
|
then
|
||||||
|
topic="refs/heads/$2"
|
||||||
|
else
|
||||||
|
topic=`git symbolic-ref HEAD` ||
|
||||||
|
exit 0 ;# we do not interrupt rebasing detached HEAD
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$topic" in
|
||||||
|
refs/heads/??/*)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exit 0 ;# we do not interrupt others.
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Now we are dealing with a topic branch being rebased
|
||||||
|
# on top of master. Is it OK to rebase it?
|
||||||
|
|
||||||
|
# Does the topic really exist?
|
||||||
|
git show-ref -q "$topic" || {
|
||||||
|
echo >&2 "No such branch $topic"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Is topic fully merged to master?
|
||||||
|
not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
|
||||||
|
if test -z "$not_in_master"
|
||||||
|
then
|
||||||
|
echo >&2 "$topic is fully merged to master; better remove it."
|
||||||
|
exit 1 ;# we could allow it, but there is no point.
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Is topic ever merged to next? If so you should not be rebasing it.
|
||||||
|
only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
|
||||||
|
only_next_2=`git rev-list ^master ${publish} | sort`
|
||||||
|
if test "$only_next_1" = "$only_next_2"
|
||||||
|
then
|
||||||
|
not_in_topic=`git rev-list "^$topic" master`
|
||||||
|
if test -z "$not_in_topic"
|
||||||
|
then
|
||||||
|
echo >&2 "$topic is already up to date with master"
|
||||||
|
exit 1 ;# we could allow it, but there is no point.
|
||||||
|
else
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
|
||||||
|
/usr/bin/perl -e '
|
||||||
|
my $topic = $ARGV[0];
|
||||||
|
my $msg = "* $topic has commits already merged to public branch:\n";
|
||||||
|
my (%not_in_next) = map {
|
||||||
|
/^([0-9a-f]+) /;
|
||||||
|
($1 => 1);
|
||||||
|
} split(/\n/, $ARGV[1]);
|
||||||
|
for my $elem (map {
|
||||||
|
/^([0-9a-f]+) (.*)$/;
|
||||||
|
[$1 => $2];
|
||||||
|
} split(/\n/, $ARGV[2])) {
|
||||||
|
if (!exists $not_in_next{$elem->[0]}) {
|
||||||
|
if ($msg) {
|
||||||
|
print STDERR $msg;
|
||||||
|
undef $msg;
|
||||||
|
}
|
||||||
|
print STDERR " $elem->[1]\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
' "$topic" "$not_in_next" "$not_in_master"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
<<\DOC_END
|
||||||
|
|
||||||
|
This sample hook safeguards topic branches that have been
|
||||||
|
published from being rewound.
|
||||||
|
|
||||||
|
The workflow assumed here is:
|
||||||
|
|
||||||
|
* Once a topic branch forks from "master", "master" is never
|
||||||
|
merged into it again (either directly or indirectly).
|
||||||
|
|
||||||
|
* Once a topic branch is fully cooked and merged into "master",
|
||||||
|
it is deleted. If you need to build on top of it to correct
|
||||||
|
earlier mistakes, a new topic branch is created by forking at
|
||||||
|
the tip of the "master". This is not strictly necessary, but
|
||||||
|
it makes it easier to keep your history simple.
|
||||||
|
|
||||||
|
* Whenever you need to test or publish your changes to topic
|
||||||
|
branches, merge them into "next" branch.
|
||||||
|
|
||||||
|
The script, being an example, hardcodes the publish branch name
|
||||||
|
to be "next", but it is trivial to make it configurable via
|
||||||
|
$GIT_DIR/config mechanism.
|
||||||
|
|
||||||
|
With this workflow, you would want to know:
|
||||||
|
|
||||||
|
(1) ... if a topic branch has ever been merged to "next". Young
|
||||||
|
topic branches can have stupid mistakes you would rather
|
||||||
|
clean up before publishing, and things that have not been
|
||||||
|
merged into other branches can be easily rebased without
|
||||||
|
affecting other people. But once it is published, you would
|
||||||
|
not want to rewind it.
|
||||||
|
|
||||||
|
(2) ... if a topic branch has been fully merged to "master".
|
||||||
|
Then you can delete it. More importantly, you should not
|
||||||
|
build on top of it -- other people may already want to
|
||||||
|
change things related to the topic as patches against your
|
||||||
|
"master", so if you need further changes, it is better to
|
||||||
|
fork the topic (perhaps with the same name) afresh from the
|
||||||
|
tip of "master".
|
||||||
|
|
||||||
|
Let's look at this example:
|
||||||
|
|
||||||
|
o---o---o---o---o---o---o---o---o---o "next"
|
||||||
|
/ / / /
|
||||||
|
/ a---a---b A / /
|
||||||
|
/ / / /
|
||||||
|
/ / c---c---c---c B /
|
||||||
|
/ / / \ /
|
||||||
|
/ / / b---b C \ /
|
||||||
|
/ / / / \ /
|
||||||
|
---o---o---o---o---o---o---o---o---o---o---o "master"
|
||||||
|
|
||||||
|
|
||||||
|
A, B and C are topic branches.
|
||||||
|
|
||||||
|
* A has one fix since it was merged up to "next".
|
||||||
|
|
||||||
|
* B has finished. It has been fully merged up to "master" and "next",
|
||||||
|
and is ready to be deleted.
|
||||||
|
|
||||||
|
* C has not merged to "next" at all.
|
||||||
|
|
||||||
|
We would want to allow C to be rebased, refuse A, and encourage
|
||||||
|
B to be deleted.
|
||||||
|
|
||||||
|
To compute (1):
|
||||||
|
|
||||||
|
git rev-list ^master ^topic next
|
||||||
|
git rev-list ^master next
|
||||||
|
|
||||||
|
if these match, topic has not merged in next at all.
|
||||||
|
|
||||||
|
To compute (2):
|
||||||
|
|
||||||
|
git rev-list master..topic
|
||||||
|
|
||||||
|
if this is empty, it is fully merged to "master".
|
||||||
|
|
||||||
|
DOC_END
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to make use of push options.
|
||||||
|
# The example simply echoes all push options that start with 'echoback='
|
||||||
|
# and rejects all pushes when the "reject" push option is used.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "pre-receive".
|
||||||
|
|
||||||
|
if test -n "$GIT_PUSH_OPTION_COUNT"
|
||||||
|
then
|
||||||
|
i=0
|
||||||
|
while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"
|
||||||
|
do
|
||||||
|
eval "value=\$GIT_PUSH_OPTION_$i"
|
||||||
|
case "$value" in
|
||||||
|
echoback=*)
|
||||||
|
echo "echo from the pre-receive-hook: ${value#*=}" >&2
|
||||||
|
;;
|
||||||
|
reject)
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
i=$((i + 1))
|
||||||
|
done
|
||||||
|
fi
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to prepare the commit log message.
|
||||||
|
# Called by "git commit" with the name of the file that has the
|
||||||
|
# commit message, followed by the description of the commit
|
||||||
|
# message's source. The hook's purpose is to edit the commit
|
||||||
|
# message file. If the hook fails with a non-zero status,
|
||||||
|
# the commit is aborted.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "prepare-commit-msg".
|
||||||
|
|
||||||
|
# This hook includes three examples. The first one removes the
|
||||||
|
# "# Please enter the commit message..." help message.
|
||||||
|
#
|
||||||
|
# The second includes the output of "git diff --name-status -r"
|
||||||
|
# into the message, just before the "git status" output. It is
|
||||||
|
# commented because it doesn't cope with --amend or with squashed
|
||||||
|
# commits.
|
||||||
|
#
|
||||||
|
# The third example adds a Signed-off-by line to the message, that can
|
||||||
|
# still be edited. This is rarely a good idea.
|
||||||
|
|
||||||
|
COMMIT_MSG_FILE=$1
|
||||||
|
COMMIT_SOURCE=$2
|
||||||
|
SHA1=$3
|
||||||
|
|
||||||
|
/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE"
|
||||||
|
|
||||||
|
# case "$COMMIT_SOURCE,$SHA1" in
|
||||||
|
# ,|template,)
|
||||||
|
# /usr/bin/perl -i.bak -pe '
|
||||||
|
# print "\n" . `git diff --cached --name-status -r`
|
||||||
|
# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;;
|
||||||
|
# *) ;;
|
||||||
|
# esac
|
||||||
|
|
||||||
|
# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
|
||||||
|
# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE"
|
||||||
|
# if test -z "$COMMIT_SOURCE"
|
||||||
|
# then
|
||||||
|
# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE"
|
||||||
|
# fi
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# An example hook script to update a checked-out tree on a git push.
|
||||||
|
#
|
||||||
|
# This hook is invoked by git-receive-pack(1) when it reacts to git
|
||||||
|
# push and updates reference(s) in its repository, and when the push
|
||||||
|
# tries to update the branch that is currently checked out and the
|
||||||
|
# receive.denyCurrentBranch configuration variable is set to
|
||||||
|
# updateInstead.
|
||||||
|
#
|
||||||
|
# By default, such a push is refused if the working tree and the index
|
||||||
|
# of the remote repository has any difference from the currently
|
||||||
|
# checked out commit; when both the working tree and the index match
|
||||||
|
# the current commit, they are updated to match the newly pushed tip
|
||||||
|
# of the branch. This hook is to be used to override the default
|
||||||
|
# behaviour; however the code below reimplements the default behaviour
|
||||||
|
# as a starting point for convenient modification.
|
||||||
|
#
|
||||||
|
# The hook receives the commit with which the tip of the current
|
||||||
|
# branch is going to be updated:
|
||||||
|
commit=$1
|
||||||
|
|
||||||
|
# It can exit with a non-zero status to refuse the push (when it does
|
||||||
|
# so, it must not modify the index or the working tree).
|
||||||
|
die () {
|
||||||
|
echo >&2 "$*"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Or it can make any necessary changes to the working tree and to the
|
||||||
|
# index to bring them to the desired state when the tip of the current
|
||||||
|
# branch is updated to the new commit, and exit with a zero status.
|
||||||
|
#
|
||||||
|
# For example, the hook can simply run git read-tree -u -m HEAD "$1"
|
||||||
|
# in order to emulate git fetch that is run in the reverse direction
|
||||||
|
# with git push, as the two-tree form of git read-tree -u -m is
|
||||||
|
# essentially the same as git switch or git checkout that switches
|
||||||
|
# branches while keeping the local changes in the working tree that do
|
||||||
|
# not interfere with the difference between the branches.
|
||||||
|
|
||||||
|
# The below is a more-or-less exact translation to shell of the C code
|
||||||
|
# for the default behaviour for git's push-to-checkout hook defined in
|
||||||
|
# the push_to_deploy() function in builtin/receive-pack.c.
|
||||||
|
#
|
||||||
|
# Note that the hook will be executed from the repository directory,
|
||||||
|
# not from the working tree, so if you want to perform operations on
|
||||||
|
# the working tree, you will have to adapt your code accordingly, e.g.
|
||||||
|
# by adding "cd .." or using relative paths.
|
||||||
|
|
||||||
|
if ! git update-index -q --ignore-submodules --refresh
|
||||||
|
then
|
||||||
|
die "Up-to-date check failed"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! git diff-files --quiet --ignore-submodules --
|
||||||
|
then
|
||||||
|
die "Working directory has unstaged changes"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# This is a rough translation of:
|
||||||
|
#
|
||||||
|
# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX
|
||||||
|
if git cat-file -e HEAD 2>/dev/null
|
||||||
|
then
|
||||||
|
head=HEAD
|
||||||
|
else
|
||||||
|
head=$(git hash-object -t tree --stdin </dev/null)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! git diff-index --quiet --cached --ignore-submodules $head --
|
||||||
|
then
|
||||||
|
die "Working directory has staged changes"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! git read-tree -u -m "$commit"
|
||||||
|
then
|
||||||
|
die "Could not update working tree to new HEAD"
|
||||||
|
fi
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# An example hook script to validate a patch (and/or patch series) before
|
||||||
|
# sending it via email.
|
||||||
|
#
|
||||||
|
# The hook should exit with non-zero status after issuing an appropriate
|
||||||
|
# message if it wants to prevent the email(s) from being sent.
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "sendemail-validate".
|
||||||
|
#
|
||||||
|
# By default, it will only check that the patch(es) can be applied on top of
|
||||||
|
# the default upstream branch without conflicts in a secondary worktree. After
|
||||||
|
# validation (successful or not) of the last patch of a series, the worktree
|
||||||
|
# will be deleted.
|
||||||
|
#
|
||||||
|
# The following config variables can be set to change the default remote and
|
||||||
|
# remote ref that are used to apply the patches against:
|
||||||
|
#
|
||||||
|
# sendemail.validateRemote (default: origin)
|
||||||
|
# sendemail.validateRemoteRef (default: HEAD)
|
||||||
|
#
|
||||||
|
# Replace the TODO placeholders with appropriate checks according to your
|
||||||
|
# needs.
|
||||||
|
|
||||||
|
validate_cover_letter () {
|
||||||
|
file="$1"
|
||||||
|
# TODO: Replace with appropriate checks (e.g. spell checking).
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
validate_patch () {
|
||||||
|
file="$1"
|
||||||
|
# Ensure that the patch applies without conflicts.
|
||||||
|
git am -3 "$file" || return
|
||||||
|
# TODO: Replace with appropriate checks for this patch
|
||||||
|
# (e.g. checkpatch.pl).
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
validate_series () {
|
||||||
|
# TODO: Replace with appropriate checks for the whole series
|
||||||
|
# (e.g. quick build, coding style checks, etc.).
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
# main -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if test "$GIT_SENDEMAIL_FILE_COUNTER" = 1
|
||||||
|
then
|
||||||
|
remote=$(git config --default origin --get sendemail.validateRemote) &&
|
||||||
|
ref=$(git config --default HEAD --get sendemail.validateRemoteRef) &&
|
||||||
|
worktree=$(mktemp --tmpdir -d sendemail-validate.XXXXXXX) &&
|
||||||
|
git worktree add -fd --checkout "$worktree" "refs/remotes/$remote/$ref" &&
|
||||||
|
git config --replace-all sendemail.validateWorktree "$worktree"
|
||||||
|
else
|
||||||
|
worktree=$(git config --get sendemail.validateWorktree)
|
||||||
|
fi || {
|
||||||
|
echo "sendemail-validate: error: failed to prepare worktree" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
unset GIT_DIR GIT_WORK_TREE
|
||||||
|
cd "$worktree" &&
|
||||||
|
|
||||||
|
if grep -q "^diff --git " "$1"
|
||||||
|
then
|
||||||
|
validate_patch "$1"
|
||||||
|
else
|
||||||
|
validate_cover_letter "$1"
|
||||||
|
fi &&
|
||||||
|
|
||||||
|
if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL"
|
||||||
|
then
|
||||||
|
git config --unset-all sendemail.validateWorktree &&
|
||||||
|
trap 'git worktree remove -ff "$worktree"' EXIT &&
|
||||||
|
validate_series
|
||||||
|
fi
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to block unannotated tags from entering.
|
||||||
|
# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
|
||||||
|
#
|
||||||
|
# To enable this hook, rename this file to "update".
|
||||||
|
#
|
||||||
|
# Config
|
||||||
|
# ------
|
||||||
|
# hooks.allowunannotated
|
||||||
|
# This boolean sets whether unannotated tags will be allowed into the
|
||||||
|
# repository. By default they won't be.
|
||||||
|
# hooks.allowdeletetag
|
||||||
|
# This boolean sets whether deleting tags will be allowed in the
|
||||||
|
# repository. By default they won't be.
|
||||||
|
# hooks.allowmodifytag
|
||||||
|
# This boolean sets whether a tag may be modified after creation. By default
|
||||||
|
# it won't be.
|
||||||
|
# hooks.allowdeletebranch
|
||||||
|
# This boolean sets whether deleting branches will be allowed in the
|
||||||
|
# repository. By default they won't be.
|
||||||
|
# hooks.denycreatebranch
|
||||||
|
# This boolean sets whether remotely creating branches will be denied
|
||||||
|
# in the repository. By default this is allowed.
|
||||||
|
#
|
||||||
|
|
||||||
|
# --- Command line
|
||||||
|
refname="$1"
|
||||||
|
oldrev="$2"
|
||||||
|
newrev="$3"
|
||||||
|
|
||||||
|
# --- Safety check
|
||||||
|
if [ -z "$GIT_DIR" ]; then
|
||||||
|
echo "Don't run this script from the command line." >&2
|
||||||
|
echo " (if you want, you could supply GIT_DIR then run" >&2
|
||||||
|
echo " $0 <ref> <oldrev> <newrev>)" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
|
||||||
|
echo "usage: $0 <ref> <oldrev> <newrev>" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- Config
|
||||||
|
allowunannotated=$(git config --type=bool hooks.allowunannotated)
|
||||||
|
allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch)
|
||||||
|
denycreatebranch=$(git config --type=bool hooks.denycreatebranch)
|
||||||
|
allowdeletetag=$(git config --type=bool hooks.allowdeletetag)
|
||||||
|
allowmodifytag=$(git config --type=bool hooks.allowmodifytag)
|
||||||
|
|
||||||
|
# check for no description
|
||||||
|
projectdesc=$(sed -e '1q' "$GIT_DIR/description")
|
||||||
|
case "$projectdesc" in
|
||||||
|
"Unnamed repository"* | "")
|
||||||
|
echo "*** Project description file hasn't been set" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# --- Check types
|
||||||
|
# if $newrev is 0000...0000, it's a commit to delete a ref.
|
||||||
|
zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
|
||||||
|
if [ "$newrev" = "$zero" ]; then
|
||||||
|
newrev_type=delete
|
||||||
|
else
|
||||||
|
newrev_type=$(git cat-file -t $newrev)
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$refname","$newrev_type" in
|
||||||
|
refs/tags/*,commit)
|
||||||
|
# un-annotated tag
|
||||||
|
short_refname=${refname##refs/tags/}
|
||||||
|
if [ "$allowunannotated" != "true" ]; then
|
||||||
|
echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
|
||||||
|
echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
refs/tags/*,delete)
|
||||||
|
# delete tag
|
||||||
|
if [ "$allowdeletetag" != "true" ]; then
|
||||||
|
echo "*** Deleting a tag is not allowed in this repository" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
refs/tags/*,tag)
|
||||||
|
# annotated tag
|
||||||
|
if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
|
||||||
|
then
|
||||||
|
echo "*** Tag '$refname' already exists." >&2
|
||||||
|
echo "*** Modifying a tag is not allowed in this repository." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
refs/heads/*,commit)
|
||||||
|
# branch
|
||||||
|
if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
|
||||||
|
echo "*** Creating a branch is not allowed in this repository" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
refs/heads/*,delete)
|
||||||
|
# delete branch
|
||||||
|
if [ "$allowdeletebranch" != "true" ]; then
|
||||||
|
echo "*** Deleting a branch is not allowed in this repository" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
refs/remotes/*,commit)
|
||||||
|
# tracking branch
|
||||||
|
;;
|
||||||
|
refs/remotes/*,delete)
|
||||||
|
# delete tracking branch
|
||||||
|
if [ "$allowdeletebranch" != "true" ]; then
|
||||||
|
echo "*** Deleting a tracking branch is not allowed in this repository" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Anything else (is there anything else?)
|
||||||
|
echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# --- Finished
|
||||||
|
exit 0
|
||||||
Binary file not shown.
@@ -0,0 +1,6 @@
|
|||||||
|
# git ls-files --others --exclude-from=.git/info/exclude
|
||||||
|
# Lines that start with '#' are comments.
|
||||||
|
# For a project mostly in C, the following would be a good set of
|
||||||
|
# exclude patterns (uncomment them if you want to use them):
|
||||||
|
# *.[oa]
|
||||||
|
# *~
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
0000000000000000000000000000000000000000 ddcb79dc9934fd8a26263f6368c4eb7aa43f6d49 unknown <Administrator@PC-202504292023.(none)> 1785055843 +0800 clone: from https://gitlab.gnome.org/GNOME/libxml2.git
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
0000000000000000000000000000000000000000 ddcb79dc9934fd8a26263f6368c4eb7aa43f6d49 unknown <Administrator@PC-202504292023.(none)> 1785055843 +0800 clone: from https://gitlab.gnome.org/GNOME/libxml2.git
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
0000000000000000000000000000000000000000 ddcb79dc9934fd8a26263f6368c4eb7aa43f6d49 unknown <Administrator@PC-202504292023.(none)> 1785055843 +0800 clone: from https://gitlab.gnome.org/GNOME/libxml2.git
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,491 @@
|
|||||||
|
# pack-refs with: peeled fully-peeled sorted
|
||||||
|
ee0520e097d5d5eabc355041f350558fadd07492 refs/remotes/origin/2.10
|
||||||
|
0740a367a570c40246fe8077c2d172b63693f105 refs/remotes/origin/2.11
|
||||||
|
d7657811964eac1cb9743bb98649278ad948f0d2 refs/remotes/origin/2.12
|
||||||
|
04af2cabb9f859c198b8a553c028a87481199410 refs/remotes/origin/2.13
|
||||||
|
d23960a130c5bb82779c9405fbbf85e65fb3c57c refs/remotes/origin/2.14
|
||||||
|
c94eb0210183b9d7cb43f8e7fddc6be55843ef49 refs/remotes/origin/2.15
|
||||||
|
7846b0a677f8d3ce72486125fa281e92ac9970e8 refs/remotes/origin/2.9
|
||||||
|
0b348def38d88a639dae39870a23757dfdc4d4b7 refs/remotes/origin/LIB_XML_1_BRANCH
|
||||||
|
05a8ffeada05501f7a0288454e79c21203a31dd1 refs/remotes/origin/copy-entities
|
||||||
|
ddcb79dc9934fd8a26263f6368c4eb7aa43f6d49 refs/remotes/origin/master
|
||||||
|
163dc10dc51629c2ff9c027598a1a788213aadd4 refs/tags/CVE-2013-2877
|
||||||
|
^e50ba8164eee06461c73cd8abb9b46aa0be81869
|
||||||
|
fd5fad283f439e6711ac6c6cbba1e5eb4e7f9dc7 refs/tags/CVE-2014-0191
|
||||||
|
^9cd1c3cfbd32655d60572c0a413e017260c854df
|
||||||
|
e0dbd9dfe4c93a326c88b917a388d29795b5f296 refs/tags/CVE-2014-3660
|
||||||
|
^be2a7edaf289c5da74a4f9ed3a0b6c733e775230
|
||||||
|
e1f895952796c7e1e264bee4bc6bb1195d2279ab refs/tags/CVE-2015-1819
|
||||||
|
^213f1fe0d76d30eaed6e5853057defc43e6df2c9
|
||||||
|
c4c966b3841b775cd7d6719aa7fcaa0f345264e2 refs/tags/CVE-2015-5312
|
||||||
|
^69030714cde66d525a8884bda01b9e8f0abf8e1e
|
||||||
|
8f8bd7c77eba811e0566bfbe1f36a3d3837c59c2 refs/tags/CVE-2015-7497
|
||||||
|
^6360a31a84efe69d155ed96306b9a931a40beab9
|
||||||
|
b70d6d6dcf442e8769d2d290218ab75f2413e920 refs/tags/CVE-2015-7498
|
||||||
|
^afd27c21f6b36e22682b7da20d726bce2dcb2f43
|
||||||
|
ceaa9b17834d2986e93d304972e8c72380c602a8 refs/tags/CVE-2015-7499-1
|
||||||
|
^28cd9cb747a94483f4aea7f0968d202c20bb4cfc
|
||||||
|
a5ec74ac392aac86fba093ecd0136ae6245cb2d5 refs/tags/CVE-2015-7499-2
|
||||||
|
^35bcb1d758ed70aa7b257c9c3b3ff55e54e3d0da
|
||||||
|
b2a2bcfca4e09dbdc06cce57e19f14313590052e refs/tags/CVE-2015-7500
|
||||||
|
^f1063fdbe7fa66332bbb76874101c2a7b51b519f
|
||||||
|
e892062051dd4bf2f18c1388f68d3fa6207fca99 refs/tags/CVE-2015-7941_1
|
||||||
|
^a7dfab7411cbf545f359dd3157e5df1eb0e7ce31
|
||||||
|
943170f1d822aa50ae4bbf37cfef56b2116735b7 refs/tags/CVE-2015-7941_2
|
||||||
|
^9b8512337d14c8ddf662fcb98b0135f225a1c489
|
||||||
|
4bafc7d56574333a7b865eef5a1d89484e9af453 refs/tags/CVE-2015-7942
|
||||||
|
^bd0526e66a56e75a18da8c15c4750db8f801c52d
|
||||||
|
62f98ac9b842635e5874383c5cd1f91691443a9a refs/tags/CVE-2015-7942-2
|
||||||
|
^41ac9049a27f52e7a1f3b341f8714149fc88d450
|
||||||
|
c41fcb5c6e928a91dd4b29225b866baee7f687a7 refs/tags/CVE-2015-8035
|
||||||
|
^f0709e3ca8f8947f2d91ed34e92e38a4c23eae63
|
||||||
|
b27782bf51e7190816f62460bbe6d39fbba86caa refs/tags/CVE-2015-8242
|
||||||
|
^8fb4a770075628d6441fb17a1e435100e2f3b1a2
|
||||||
|
3293785cecdd5cc99a9c6d528f34826ba0868be4 refs/tags/CVE-2015-8317
|
||||||
|
^709a952110e98621c9b78c4f26462a9d8333102e
|
||||||
|
294a51cccca59b83ded6337150dafc4b35f7adb7 refs/tags/CVE-2016-1762
|
||||||
|
^a7a94612aa3b16779e2c74e1fa353b5d9786c602
|
||||||
|
158f6d9604e60f1b0b742e83082ff725f87168fa refs/tags/CVE-2016-1833
|
||||||
|
^0bcd05c5cd83dec3406c8f68b769b1d610c72f76
|
||||||
|
4a189503c845360fd6c5004a4e696ac4e69505c7 refs/tags/CVE-2016-1834
|
||||||
|
^8fbbf5513d609c1770b391b99e33314cd0742704
|
||||||
|
9cad8ce3d3e8f426bb98046b983a6ff103321d00 refs/tags/CVE-2016-1835
|
||||||
|
^38eae571111db3b43ffdeb05487c9f60551906fb
|
||||||
|
67dd1fda4bcaf457f922b2e0bb3169382ec3baf2 refs/tags/CVE-2016-1836
|
||||||
|
^45752d2c334b50016666d8f0ec3691e2d680f0a0
|
||||||
|
275b9f71a2c77fc76dec38b3e97a1d4dad497a17 refs/tags/CVE-2016-1837
|
||||||
|
^11ed4a7a90d5ce156a18980a4ad4e53e77384852
|
||||||
|
970aa35a0c96ec6dd44eb9e16b6ed7598a4c1702 refs/tags/CVE-2016-1838
|
||||||
|
^db07dd613e461df93dde7902c6505629bf0734e9
|
||||||
|
e804274a08ea2d5b7be5172dd05faeee9bb1dc7f refs/tags/CVE-2016-1839
|
||||||
|
^a820dbeac29d330bae4be05d9ecd939ad6b4aa33
|
||||||
|
bb9d3ea8b9b81bea178ef01e5e7092d40819c1ed refs/tags/CVE-2016-1840
|
||||||
|
^cbb271655cadeb8dbb258a64701d9a3a0c4835b4
|
||||||
|
82a7217b1c6eb37b9daca1dedd4c49618f0e7ac6 refs/tags/CVE-2016-3627
|
||||||
|
^bdd66182ef53fe1f7209ab6535fda56366bd7ac9
|
||||||
|
5f089881420bcd86034f3dba89935712b5491d83 refs/tags/CVE-2016-3705
|
||||||
|
^8f30bdff69edac9075f4663ce3b56b0c52d48ce6
|
||||||
|
d606f2da652964a79d86a7b920bde4e9a8863bfa refs/tags/CVE-2016-4449
|
||||||
|
^b1d34de46a11323fccffa9fadeb33be670d602f5
|
||||||
|
80dc44d75773a8f5d122ddf5e33ba7656fd43ce7 refs/tags/CVE-2016-4483
|
||||||
|
^c97750d11bb8b6f3303e7131fe526a61ac65bcfd
|
||||||
|
33c656c8cfa423aa5c0f40421b84ae3c3b523060 refs/tags/CVE-2021-3541
|
||||||
|
^8598060bacada41a0eb09d95c97744ff4e428f8e
|
||||||
|
6f67896efe30c2c748a77fa152fa318fdd31863c refs/tags/ChangeLog
|
||||||
|
^30fbd3f40eb514294b0f1a32f73db30a86c5b2e4
|
||||||
|
6278cf2922e700a5122943e4a9d3b8e0f08e599b refs/tags/EAZEL-NAUTILUS-MS-AUG07
|
||||||
|
^76234da1520f108588bbec7428f7d7f663e4b96e
|
||||||
|
58f71630e32934536da0b122e839853fcb213f00 refs/tags/FOR_GNOME_0_99_1
|
||||||
|
^8f8b4c80f6dfcc5d3985367cfd078c8b6d6e3f4b
|
||||||
|
069c04b1511d99804f72e3dcbe876001e2806984 refs/tags/GNOME_0_30
|
||||||
|
^8e0137ced4d14942286fe9ff8d423d986973795d
|
||||||
|
bcb6b9d6261a3f831ec611a433ab7e6f938dac24 refs/tags/GNOME_PRINT_0_24
|
||||||
|
^4b0755c68b0182809a7db5b6ab1478cb2767abfb
|
||||||
|
555474d5bf57162b5bbef8d11c4d1cb615a8ffe3 refs/tags/GNUMERIC_FIRST_PUBLIC_RELEASE
|
||||||
|
^8e0137ced4d14942286fe9ff8d423d986973795d
|
||||||
|
5fef2815562c67e6367f15f5aefb50c91548f85a refs/tags/LIBXML2.6.31
|
||||||
|
^216850b27ecf0a48bff5802f04760f5bdf027bfc
|
||||||
|
f4e1fc182582ff420cf8b7d2aa52b4c5085a1cd6 refs/tags/LIBXML2.6.32
|
||||||
|
^596da973eb47ae1c5fcec9e0085994a689648868
|
||||||
|
0461a0c499a6a58ad1a6732f2f76e38789b31e6b refs/tags/LIBXML2.7.0
|
||||||
|
^1572425c2774b3fef6af062b87351a0e42c3e172
|
||||||
|
2d3852c8072758184e8d1ef084cd8f2f0fc81236 refs/tags/LIBXML2.7.1
|
||||||
|
^a7036d93a0fd81c34e1d1f25b9a099454c8b8ac5
|
||||||
|
d9e71cf4744d527b6f27ef3b8f51afa8155ca924 refs/tags/LIBXML2.7.2
|
||||||
|
^7f4547cdbd76a2931553759fb433df88b8b99452
|
||||||
|
a30f67e606819120fa84931004eacb45db9e716d refs/tags/LIBXML2.7.3
|
||||||
|
^97ff9b367a6428f7703aa7938595c03ad39652e0
|
||||||
|
493ecdf13794c5c28b2cb5997932e53bd744af44 refs/tags/LIBXML2_2_4_21
|
||||||
|
^fc57b41cb14a9920fa73cbb9fa1e495047970f2b
|
||||||
|
98b6e2e0ad4133df54ea9e6ba11aec5693930a65 refs/tags/LIBXML2_2_5_0
|
||||||
|
^7b4b2f9d8fc712c49beaf75985161a130c77d13a
|
||||||
|
ae174f24106a3faee155f4ac363943e05c423547 refs/tags/LIBXML2_2_5_10
|
||||||
|
^cfba2fe0bbbdd1158666fc1090c7f48c0fdb00e1
|
||||||
|
ef1152a1bb47d73162ebb169f2187010e78853e8 refs/tags/LIBXML2_2_5_11
|
||||||
|
^b42dc2bb2d66d31d2f811ad72880b4ba655a8f58
|
||||||
|
594a62a749038ccfeddb97090526c81e92902a5f refs/tags/LIBXML2_2_5_7
|
||||||
|
^92fc02cc52326430de4d7009b177e845fb69dba0
|
||||||
|
0e641fffb721aadb23c4221b8c0cd7f5e0bb2e58 refs/tags/LIBXML2_2_5_8
|
||||||
|
^560c2a441bf27f5b9d55252a70f3d5952d9ae351
|
||||||
|
dbd8be27bbd3f3c1fd0502e3bbd6ffc43bf984f8 refs/tags/LIBXML2_2_5_9
|
||||||
|
^83ee40de7569cf3e4cb45080fc9c9cb337a1e8cd
|
||||||
|
945d471f5eae6adb42841e57f6df34d7cbf478d6 refs/tags/LIBXML2_2_5_x
|
||||||
|
^cfba2fe0bbbdd1158666fc1090c7f48c0fdb00e1
|
||||||
|
1866f526ba0d9dc85fe68d77657c42fb54579354 refs/tags/LIBXML2_2_6_1
|
||||||
|
^ceffd451992ced3747ecd7477d74e3c88d3ad681
|
||||||
|
d621edb6f28d8a91ba066b17c7eda5b5170e07a3 refs/tags/LIBXML2_2_6_11
|
||||||
|
^45cb0f41e457439d508f03a19d7a6c98d9803d9f
|
||||||
|
fadd1eaf40a8960444cc078c4193ced10756ac80 refs/tags/LIBXML2_2_6_12
|
||||||
|
^b331fffbb90064c98e4e6ec5c08bfbe8efa17ffd
|
||||||
|
1351130ccb631fc0c60a1be9d128145f3850442c refs/tags/LIBXML2_2_6_13
|
||||||
|
^d1de4a3da9e5364a37469108b932e5ad66055a5e
|
||||||
|
6e4939285c4ca104695a45d78caf29e98011f378 refs/tags/LIBXML2_2_6_14
|
||||||
|
^210818b18aec4674f43b45143f4f4eed850c9e50
|
||||||
|
6070cd3f5d98c15ee39f6b3b8d0b7fec6c6cc33c refs/tags/LIBXML2_2_6_15
|
||||||
|
^c2f83d1fad48c4483f34213dcf6935e308e0c596
|
||||||
|
deea881c69a077adbe6289f22511f116f097846a refs/tags/LIBXML2_2_6_16
|
||||||
|
^c3d7cb4e582da89a442d6da32b13950af4cf7067
|
||||||
|
31398af43568e5dd3a216f54147e83c1c8694564 refs/tags/LIBXML2_2_6_18
|
||||||
|
^57c000e33d0f970846aaa35d47a2b7faf5262032
|
||||||
|
82466b40494d537d2c050dd96ca5a8d92714f385 refs/tags/LIBXML2_2_6_19
|
||||||
|
^771971f2e5077482fce3d9c234455118f2352f73
|
||||||
|
3a1b40aba764c9319781c4535b404b95036e7470 refs/tags/LIBXML2_2_6_2
|
||||||
|
^6d373a26fff17281ac1c872adae95b14727ca959
|
||||||
|
2ff310f0463982c9ed9ec2b6fc2fc8771437c399 refs/tags/LIBXML2_2_6_20
|
||||||
|
^e4aaae2640843b4e1453f57c62a64d70faf95edb
|
||||||
|
1144760805ea47e56ce26556cccb9281db8e7e69 refs/tags/LIBXML2_2_6_21
|
||||||
|
^0bcc7f6ae97a8bd8615dfd9d3acf8188ab66580e
|
||||||
|
83f982c60e1abf40ed98a1ba242629ec6e422077 refs/tags/LIBXML2_2_6_22
|
||||||
|
^33b20b70e2b0cc036bd23909fe262f816228f305
|
||||||
|
7ccf4c8f185a87d846e48385cdaf2bc244e34344 refs/tags/LIBXML2_2_6_23
|
||||||
|
^6795260135a78da60182504a2d7efb4e3177eb57
|
||||||
|
76ae427a860d53da573126c5d3defd1fbb1ae2a4 refs/tags/LIBXML2_2_6_24
|
||||||
|
^b2f8f1de7a02900f3e62a8170618ac35bd189269
|
||||||
|
6990c2948bab125fb3216e58981be116b9af5d90 refs/tags/LIBXML2_2_6_26
|
||||||
|
^7cb3fa9d51a0a57d1e538854e4be84db82b75098
|
||||||
|
4093371c160d427494f2b459e34762ca49cad824 refs/tags/LIBXML2_2_6_27
|
||||||
|
^c8338f1a52e7712dbba5e7c2fd5f76ecf01bf14f
|
||||||
|
c23b0423f20e59dc2eeaf3913bef1c78b9404705 refs/tags/LIBXML2_2_6_28
|
||||||
|
^e61d75f11e1e061d0394db395937cd8cdad7d689
|
||||||
|
3283d0df55d21811897074b757cf32746a75f030 refs/tags/LIBXML2_2_6_29
|
||||||
|
^9049c1c50a9e2454f2b43c988c6069631d313c1e
|
||||||
|
3d508f7d89b6c069f3d730a55e01e0ddf4fdf09d refs/tags/LIBXML2_2_6_3
|
||||||
|
^c480c4ea56bbb5aad5ac991dafef5702dabb6360
|
||||||
|
bba1bb9e7ca47ca5a3e73ccecede542da47f3964 refs/tags/LIBXML2_2_6_30
|
||||||
|
^22f476e0f2f5549e0a246be62a3affba276f4b75
|
||||||
|
d3e8c95b24821db0a34332f877e2f1f4919391f0 refs/tags/LIBXML2_2_6_4
|
||||||
|
^e6e59cdf33e02648fc8f33c357accadf2a657668
|
||||||
|
e5e563aa3507fc2d1c708b8d2bfe17869cf103f4 refs/tags/LIBXML2_2_6_5
|
||||||
|
^189f46b18cf94b0c941f34138611dc56a16cc6f1
|
||||||
|
f9548bdf541a0a1261034dee1749e9ba255858f9 refs/tags/LIBXML2_2_6_6
|
||||||
|
^5c9547e4f3173e92501d735193767705eab9ac31
|
||||||
|
cd9ffc78f627bda4b38322e4994873b80711ec24 refs/tags/LIBXML2_2_6_7
|
||||||
|
^9291449d9e7ca7179a2b26182ef1ab375ff4731e
|
||||||
|
954f4c261bcf5e7b0e33076198886867b79895ee refs/tags/LIBXML2_2_6_8
|
||||||
|
^252004df14b680d40c29e2ab479660162e15431e
|
||||||
|
c292b6aeacf7a0d17f7e938e548b704d6840dd36 refs/tags/LIBXML2_2_6_9
|
||||||
|
^f70f7b2da92c10e551724fdc955c8b668e5ec0b6
|
||||||
|
d1b1f19d55e17a37afa91f87909366f4bfd01788 refs/tags/LIBXML2_6_0
|
||||||
|
^2189b59b1005976970ebadb65edbb289f9e091ff
|
||||||
|
f5210f2ab3bd0d3030d19b904421e905fcd79a03 refs/tags/LIBXML_0_99
|
||||||
|
^29fb727eb480f10010f37ca9e0b984bbd4dcae3b
|
||||||
|
6e7609f2a73f3633f6e090e27c9ce0d7420e0f6a refs/tags/LIBXML_1_5_0
|
||||||
|
^424af3912493b654c46e569b06b7cd58cb2947c9
|
||||||
|
f64eef45b0dec07ef6e69d277aeb430f8d05da47 refs/tags/LIBXML_1_8_10
|
||||||
|
^7cb7a77c30b4d64a276c43f9c446be165e5b6b1e
|
||||||
|
7872d3ee8561df9a75937b5762077c73fea74a54 refs/tags/LIBXML_1_8_10_REAL
|
||||||
|
^c0408519798f2e10497cb46e4d01b53cc7a08ce6
|
||||||
|
a05e695a83ae96dda7712fd63614714992324952 refs/tags/LIBXML_1_8_12
|
||||||
|
^73a4bfe95229a0f89ac9335a4f5f3960561d0158
|
||||||
|
42344bf524ffced12be408577a1b78095350b72a refs/tags/LIBXML_1_8_14
|
||||||
|
^146f50561fa2ad63cbf81571887b1e26101d64be
|
||||||
|
66cab196da7c222b0cb26e4de7812cb6806e1c8c refs/tags/LIBXML_1_8_16
|
||||||
|
^a1ac9b0c7a23734d77fdd9235cb385f0e8b70025
|
||||||
|
bb50ea3628cbd82f2869b5f27e2b63726277dec2 refs/tags/LIBXML_1_8_17
|
||||||
|
^ead1ea69da2cceea4018cb411971261f8952444c
|
||||||
|
09e31436c4e938f3eba2b3f726c1da83d62dcb65 refs/tags/LIBXML_1_8_5
|
||||||
|
^461a66c9428af63ee8de68fbb45deaf58c0f79fc
|
||||||
|
501e80104894e407e267da087f4a488cdc4a4163 refs/tags/LIBXML_1_8_6
|
||||||
|
^e41f2b74c53d9d97b51dfc1d20aa201e4b2c9201
|
||||||
|
b22494c4ada06e09e2aeed3be32b249291e277e2 refs/tags/LIBXML_1_8_8
|
||||||
|
^08746ae6f0fe219b8c760ff6e85bddf9f39ac1ab
|
||||||
|
7ba7b81be0b6f52564a7395d5c87e02d3b7561b2 refs/tags/LIBXML_1_8_9
|
||||||
|
^e98991955c4e6661ed1bfe8c84951ff6fd2ed1d6
|
||||||
|
8d86f6fc6a5ef306638ae0bb59bac7cbe2750886 refs/tags/LIBXML_2_0_0
|
||||||
|
^18b0ef6d41fdc3905e60fce0123f9ff5f48581da
|
||||||
|
1270f021d26d5ec3f8fba2fd932cc27fa2634518 refs/tags/LIBXML_2_1_0
|
||||||
|
^c230410eadbada15092c04f92d01068af8a19f8d
|
||||||
|
ca834ba122b807fb2ce88142385a1475de22de5e refs/tags/LIBXML_2_1_1
|
||||||
|
^663a607aa40e095a2e43a78a950a73a8ac1299dd
|
||||||
|
f8457304220ac4e34b0343d82d589ab9e1108409 refs/tags/LIBXML_2_2_1
|
||||||
|
^69f94a3b722e33fc980ee9e59a78f5ec26863d26
|
||||||
|
30a3c2d958db6a20c783cb87b2282a7911aad603 refs/tags/LIBXML_2_2_3
|
||||||
|
^04698d9e1c56467007fcbb9472e5db67cf5938f5
|
||||||
|
360a48b58ccbb9beddb707e6a0a3db237283d954 refs/tags/LIBXML_2_2_4
|
||||||
|
^3bff2b0e5d2428cff9778ae60d38476f6c58c43b
|
||||||
|
1c168bcf814a286a761f3652b4ea0ca5bcb51b30 refs/tags/LIBXML_2_2_6
|
||||||
|
^29a11cc696655f9ac841a5ca28b272e4150aafa1
|
||||||
|
2da5a07b0b3bc69c9d74b310e27e6248a66b313d refs/tags/LIBXML_2_2_7
|
||||||
|
^a4964b75003d138d4643ab03e3e116a8453f8308
|
||||||
|
7e3278760ac64a94adcacfbb1837b6e175410e58 refs/tags/LIBXML_2_2_8
|
||||||
|
^4e19074bc26bac984de1d8eb3e54a5aeee421af1
|
||||||
|
a7ed8d41e2498fca91da0fe05b2245a2dd288c67 refs/tags/LIBXML_2_3_0
|
||||||
|
^6a2e40604393375cf4c42c464a532dee0be82845
|
||||||
|
b92adf88125b7e9d3a88b58fb004fc54d73bfa2e refs/tags/LIBXML_2_3_10
|
||||||
|
^b3a182e53326cce1438bc2951372ffc1ca4eb18c
|
||||||
|
ec28ff67eb27b33d3a025d8675ed5be7373f787b refs/tags/LIBXML_2_3_11
|
||||||
|
^6d473ed349020894228f29d334cba4749f9a7cea
|
||||||
|
e8544c76a86f17d33c7e6cd62ea43b530e27e40d refs/tags/LIBXML_2_3_12
|
||||||
|
^823a77f8f9effd47b22715f66883bfd889c771ff
|
||||||
|
1aa09dd44d790f3583f000cbc4ade9ed5908a181 refs/tags/LIBXML_2_3_13
|
||||||
|
^b37ecd0e51908bc9922fa37d1ec0aaaf9dc9d8e8
|
||||||
|
a445536c5a474948ef1ac271be3f4d201fbfc298 refs/tags/LIBXML_2_3_14
|
||||||
|
^5b43fde43de0b9a507f25238ad6ff3aec7cdafb2
|
||||||
|
8accf226f0600685d5ed2127153ef5d329b572c2 refs/tags/LIBXML_2_3_2
|
||||||
|
^59a3bd3744b5e46e30ab63dc772bfe924ad81469
|
||||||
|
bf5e305a26c27f3a72a61430a49c563a972438e8 refs/tags/LIBXML_2_3_3
|
||||||
|
^b402c07ca541924d89cd6ff49f99bd1b59097278
|
||||||
|
00943a4a2de3546bf14b913378883103c023cee4 refs/tags/LIBXML_2_3_4
|
||||||
|
^e356c280069914f0052891861a55fdfaff6dcf65
|
||||||
|
72d74b776193484557d6a649685b26d22c154085 refs/tags/LIBXML_2_3_5
|
||||||
|
^c7ad7ce598261a447cfceb7837219fcd93151336
|
||||||
|
e21e54203aeef732dfa459cf4838e9040542e9d2 refs/tags/LIBXML_2_3_6
|
||||||
|
^fac26a1f9330f404a90a8f347c8d13fdf08dbba1
|
||||||
|
adbdbc4f8f746f02f38c99112864abf4cefa2278 refs/tags/LIBXML_2_3_7
|
||||||
|
^393df01cac24c7344ddcdc3b6968f893790c5e67
|
||||||
|
e3847ae4bcdb6e4e258bfa651a52dccb561018f9 refs/tags/LIBXML_2_3_8
|
||||||
|
^3bbbe6fa2a16ce1e1c1ff08725cf09857d7c0428
|
||||||
|
68fb039bfda99e6f4c2576bf70b5735914aa0e17 refs/tags/LIBXML_2_3_9
|
||||||
|
^bed7b052a318695f5e0856f12fc0c86f66472cb3
|
||||||
|
deade41e955fb930d0bc528bba8087b88e249f6a refs/tags/LIBXML_2_4_0
|
||||||
|
^09ab7e1c1c943a6ba160037208c58a0dda3fe8ec
|
||||||
|
fade9185f8862bf496e6c35f900f6eadcd453eac refs/tags/LIBXML_2_4_11
|
||||||
|
^bd9b0e8eedacd57d26bbe655d76a6bc858ab95ec
|
||||||
|
703a08b6efa6d902a8c3ba83801fe76d3c53b32a refs/tags/LIBXML_2_4_12
|
||||||
|
^ef90ba7e3b530a8eb9ed27f57f0ced139b839780
|
||||||
|
6543d5679b5ffeda3ffb311db4b4f9ef39888b24 refs/tags/LIBXML_2_4_13
|
||||||
|
^af43f63aaabf0dc4b4a070773875d0927da3d8a2
|
||||||
|
d74637c3f6dbfe3249ba01f79a0c056e6975b9b7 refs/tags/LIBXML_2_4_14
|
||||||
|
^07be19bb1e73b86bdd1014eb1d9f84cb7d08e9fa
|
||||||
|
5baae18ca7ece6da7809840dcf26c1b95ebca10c refs/tags/LIBXML_2_4_16
|
||||||
|
^5f4b5999b4eeda2ca68e6d9f54a3c534a8474b38
|
||||||
|
13ba6f67deac547beaa954065cfd2a63e4388b78 refs/tags/LIBXML_2_4_18
|
||||||
|
^34ce8bece2f22cc99d25221b77315cd008f4866b
|
||||||
|
991e738a986bd7af093489d4051d65fd6df12859 refs/tags/LIBXML_2_4_2
|
||||||
|
^9a0b3d63c152fd11e2e49a308f4f102dc6043d97
|
||||||
|
cb220ae9180fb44709c2aa1f0dbf510d49f33906 refs/tags/LIBXML_2_4_20
|
||||||
|
^a7084cd57e055ac5f768c0d2aacd1bdab952798c
|
||||||
|
2d9fad9527c5a9c902d8cd774b1307933e728f8a refs/tags/LIBXML_2_4_22
|
||||||
|
^d5e22ef5802bc1d2d730cded59a700a88abfa47a
|
||||||
|
17fb73c4b80399cf37ad2762d4ef2152b0b82995 refs/tags/LIBXML_2_4_23
|
||||||
|
^539638ba2359774d184bd87cf713c7e2afc23a8c
|
||||||
|
690c9d30526aabcf0a22e2f8bcb9bf716afa139c refs/tags/LIBXML_2_4_24
|
||||||
|
^42766c0eea0fa40c7b721fa4c9cf56b4c484b4c7
|
||||||
|
ea847274005ee18c78f93fdf3b9f4354881f71f0 refs/tags/LIBXML_2_4_25
|
||||||
|
^e16b57406a96297a6ce39e509e06511c3c8a200e
|
||||||
|
7a13ab487e54688b5f4f490e7dfa5a9457c18258 refs/tags/LIBXML_2_4_26
|
||||||
|
^4826743d1643bd01d5ceaeaf627b0d71b60beb2f
|
||||||
|
4a8a33fe201084427668e814cfd7b160c98728cd refs/tags/LIBXML_2_4_27
|
||||||
|
^dad3f680e504b25b3bfd30a411adb55b4d0efe09
|
||||||
|
3996c4428a894592c28422c18c306e551976e2ff refs/tags/LIBXML_2_4_29
|
||||||
|
^9b4bb4d07ab8f820fdc19a4fc7e8d7a39e159c66
|
||||||
|
7b7a8929f92402ae6bd73cd82823870efe22481c refs/tags/LIBXML_2_4_3
|
||||||
|
^e8f379330e16fcfae7d2737bbc22007b69cc3704
|
||||||
|
fdad8d1875fb14da9dbd6b322cfc4915c3833d33 refs/tags/LIBXML_2_4_30
|
||||||
|
^2d45f52c14fe508f003b42dca81264147a0fcabc
|
||||||
|
a5fa03e1a93ef1d8d5f79509d3000629d978dc65 refs/tags/LIBXML_2_4_4
|
||||||
|
^baa8854e4e005f7a58ee1b0aa306c978247da9a7
|
||||||
|
c94b7df0bdd68d94545575b7edf88cb797b106c3 refs/tags/LIBXML_2_4_6
|
||||||
|
^60087f30f3b4cf21de48f39181736e7d71e7a661
|
||||||
|
898487ecf5beb7047e1671aedfcb09276fc55699 refs/tags/LIBXML_2_4_7
|
||||||
|
^52dcab3999cc9c480b275bc3ddf66dbb66f92d68
|
||||||
|
6d315cb263e6b956fadf65a421061e7b20303921 refs/tags/LIBXML_2_5_1
|
||||||
|
^e2830f1e65ddef63fc74a22addfea30d97ef8d65
|
||||||
|
dae9a5a6fb8fde389d693a854e8033a14414aea3 refs/tags/LIBXML_2_5_2
|
||||||
|
^72fef16e5c05224a81425b2ada12f4147b5194be
|
||||||
|
74d430bf12c9422842cdb70f7c9191d5c70ad3d4 refs/tags/LIBXML_2_5_3
|
||||||
|
^869fb32050e8e89c0c4848087970a58df9966f51
|
||||||
|
4672f42c45796bb9c56ecabce4a4be7625a33e74 refs/tags/LIBXML_2_5_4
|
||||||
|
^17bed98106ac388a6eae80515aae6957782d6029
|
||||||
|
1d4de4b34555e0b3fca79e6a589a42901449536a refs/tags/LIBXML_2_5_5
|
||||||
|
^9adc0469d4691e798ea4ad59b84c874cdea8b38d
|
||||||
|
9ff4a158ebe9ece4bb03b4f2f77c4e35c3f58774 refs/tags/LIBXML_2_5_6
|
||||||
|
^c2d4a93d4f6ecc658e63ddc416be918318cea7a9
|
||||||
|
11fb419f2b9ddc4e661e400f3a836415ed87c75c refs/tags/LIBXML_2_6_10
|
||||||
|
^4e6fef4dab062b22d2e0386415a5218070952faa
|
||||||
|
b8d74ccc2f8da503e9526d7d03143f7402342cb8 refs/tags/LIBXML_TEST_2_0_0
|
||||||
|
^5d211f4c7a150e45a301cec55426a7ed7edb7f50
|
||||||
|
080725036cf5184d3fcc3a218b83a4801a3c56e2 refs/tags/LIB_XML_1_1
|
||||||
|
^011b63cb2034476017dde1d4ad5a6aea43b94066
|
||||||
|
cefebfc541511ae9689fe6974fbca23e3e4c3dd1 refs/tags/LIB_XML_1_3
|
||||||
|
^97fea18b7138caf76bf17d003f4985d8797d26f9
|
||||||
|
dc13fa6616f650c4883e5d4dcd60361119e50755 refs/tags/LIB_XML_1_4
|
||||||
|
^1566d3a91b50e08f8bd928da5a06d9c53a99747f
|
||||||
|
0b62127e46dd8131fe7ce0f1c1ba38d3c9393b4e refs/tags/LIB_XML_1_6_1
|
||||||
|
^d2d38e9ab3691d11755857b87d83f2322b85d93d
|
||||||
|
7b0dc286b7b99b0e7e5cc3e7a1094844544cf9b9 refs/tags/LIB_XML_1_6_2
|
||||||
|
^c08a2c6fd41773f55853c5d93a67a932c61511e9
|
||||||
|
71da3e0339adb75e12fa5dd643e85ae90c3a53d5 refs/tags/LIB_XML_1_7_0
|
||||||
|
^4ecf39f3e3e51df736cbb7bdc3d24739a786fb3b
|
||||||
|
5000182a4ff1c18fb16dfbbcce18408c9a471b5f refs/tags/LIB_XML_1_7_1
|
||||||
|
^dd6b36766fb1cc83020cc12f226452ba2d640e35
|
||||||
|
b41926302ec35da1c0009a4dcf493cc1edcd0600 refs/tags/LIB_XML_1_7_3
|
||||||
|
^ad21944c30f85761a9339fe054e1f93e176b7152
|
||||||
|
42ce4e01ec843426c961900a710d7c24edd33a0d refs/tags/LIB_XML_1_8_3
|
||||||
|
^f3a7358dcae937caacd7149d080bf275e920ba69
|
||||||
|
6b2edc001df59352a92d9e124c085b508f050ded refs/tags/LIB_XML_1_X
|
||||||
|
^76234da1520f108588bbec7428f7d7f663e4b96e
|
||||||
|
9942b0f93d22dc8e4b081f0907365616c8da976a refs/tags/PRE_MUCKUP
|
||||||
|
^4b637079f26d8f5879ed45eb18cd249cad261951
|
||||||
|
d95c7184373f24ab680fea530aed57d2775993d9 refs/tags/PRE_MUCKUP2
|
||||||
|
^4b637079f26d8f5879ed45eb18cd249cad261951
|
||||||
|
48b237e1d5e319fe7473f11037884f58931b1646 refs/tags/PRE_MUCKUP3
|
||||||
|
^4b637079f26d8f5879ed45eb18cd249cad261951
|
||||||
|
8b3ff3d64c7bef4d4e3b2c7f65013d0136ba343b refs/tags/help
|
||||||
|
^3ed155fcdf123a94ac885923a9262f250bdb3301
|
||||||
|
82936c45494bb1336b19b2cc456204ddc0d7506a refs/tags/v2.10.0
|
||||||
|
^ae383bdb74523ddaf831d7db0690173c25e483b3
|
||||||
|
3fdcf0b4150a6e8b2df3189568b810e46dcdafc5 refs/tags/v2.10.1
|
||||||
|
^d85c4a01407b75eb4005256df106d121e766a1d8
|
||||||
|
b8965a6c8994b19cf360d3f35b97c5b0399c17ca refs/tags/v2.10.2
|
||||||
|
^21b24b51608d471bb9f7c4225e23d0db2acecc52
|
||||||
|
096ae438216478f676df7ea7a8532d565132d22d refs/tags/v2.10.3
|
||||||
|
^f507d167f1755b7eaea09fb1a44d29aab828b6d1
|
||||||
|
9ddf8ecda72891d1bbe8517be1a59153e8ae944d refs/tags/v2.10.4
|
||||||
|
^223cb03a5d27b1b2393b266a8657443d046139d6
|
||||||
|
4f14180cc7066c06735cb8a4a7cc7ab1d8817a5d refs/tags/v2.11.0
|
||||||
|
^f296934ade688baab79caf1c62a82149ad78accf
|
||||||
|
777ca04136443748218d3aeca79442f103af2d4a refs/tags/v2.11.1
|
||||||
|
^ab9fea4ac0d494bcf68864e9be0574137e48a80e
|
||||||
|
752811ac559fcd72e518c144c328a6a90e66154a refs/tags/v2.11.2
|
||||||
|
^838bf42d54f94c8ff99b6e5022899a32875ed5d7
|
||||||
|
11b9961d22c1bc72e651b07c3c542e9b64d19be5 refs/tags/v2.11.3
|
||||||
|
^787ae0390a3b90a76c2c54d6a18d7f1abe888c64
|
||||||
|
be5448432faaf7b108665fb2f4336c407dcecee9 refs/tags/v2.11.4
|
||||||
|
^2e9f7860a9cb8be29eca90b7409ef0278d30ef10
|
||||||
|
0884fd4019dcca3b57be83ae15272eec10519370 refs/tags/v2.11.5
|
||||||
|
^2b998a4ffbdfea04fc6a620721abc690a15743af
|
||||||
|
2ee598b7bf849ee7ee990977fe5d17ec63f651bd refs/tags/v2.11.6
|
||||||
|
^93f0179d9d0bcd0d053d2df3e2fd382e6dac6954
|
||||||
|
8651f4757b6a6855ea322dd49af1c5a77842bf34 refs/tags/v2.11.7
|
||||||
|
^8711320065405c4bb08aaccd4bd2881450b5ce41
|
||||||
|
5ca98838f76cb3791df01b5d2cbc8cd1c40463a4 refs/tags/v2.11.8
|
||||||
|
^58a973c40ba927e5ad941789723da7c47a2d60e3
|
||||||
|
81517a021421977c185c4ebb970e372f6301a9c9 refs/tags/v2.11.9
|
||||||
|
^954e851e1d8d1f4c1dfbdf043623b3c11a1c723c
|
||||||
|
a816094b4370aebb48ed8a8015b7ef89603fdc1e refs/tags/v2.12.0
|
||||||
|
^5e9b167dce73bd6a804ab107ae4c4b95e6849597
|
||||||
|
ad035cb0a2872f8bbc2f936c25b16b4d6a0f5a23 refs/tags/v2.12.1
|
||||||
|
^f4ac9926a463ecb628f73049e4fd7ecced8fb7cf
|
||||||
|
ede4fc0a676c47c40612d26ef93b0cd973df319d refs/tags/v2.12.10
|
||||||
|
^02d577715e1951cf114ca4e9adaf5605156c4f4c
|
||||||
|
3772809730ffdc1b58f2e0474daa39d1c1823779 refs/tags/v2.12.2
|
||||||
|
^4d8fa5b292fc902268217fa0f7031e77e5437b5a
|
||||||
|
e6d5e1ca18550f26eb864e267798f1304cbb8f74 refs/tags/v2.12.3
|
||||||
|
^30d22bec03893ad646907050959bdfe9e8000146
|
||||||
|
8992d2c17dba0b1842935bc626a3108b0844e509 refs/tags/v2.12.4
|
||||||
|
^8292f361458fcffe0bff515a385be02e9d35582c
|
||||||
|
906253a1d2d6dea0bf53cd8228746a163b21f221 refs/tags/v2.12.5
|
||||||
|
^e189e9945317ad4c8603fa2300d11d11f5e2e335
|
||||||
|
583f84988ae976b2683addce4107fd4afaab66f4 refs/tags/v2.12.6
|
||||||
|
^505e2e872e767405be565aa9d47ae9d6d5677f79
|
||||||
|
87d84ef5ab9dc42e31d31a9ee5929f89b1908191 refs/tags/v2.12.7
|
||||||
|
^0b6d8130737125ba45981d54be7f15fe398ad2e0
|
||||||
|
251d8617d7768e81d00d57a6257e8668deb19285 refs/tags/v2.12.8
|
||||||
|
^83fce0a3f9ef22c90a980b03bb90cbd364d5c9ab
|
||||||
|
94175bb9217a889e0d287962e6a0a8f4b658371e refs/tags/v2.12.9
|
||||||
|
^00301f0fe8bccdb9945fb684e9bbd72449b961a5
|
||||||
|
b51780c6ba0bb92d70093935bda36ccffff66039 refs/tags/v2.13.0
|
||||||
|
^cdd2575f7fbab1d8162600f4048bc37503c80e28
|
||||||
|
5c0a632451b7442a606fbe1b2ad8e6cbb431ee97 refs/tags/v2.13.1
|
||||||
|
^48dba1e21f8f1a7d8a817eaf65831396e74b78d2
|
||||||
|
9fc170941a355569b252470e4ede6846b9d8074d refs/tags/v2.13.2
|
||||||
|
^4b3f860e5420ade19a825dc7f4d75789489535ba
|
||||||
|
72c519a5220e5ed2d50d3092ad32264c58f6b021 refs/tags/v2.13.3
|
||||||
|
^3b1742b8391e966be780bdc43fdf959f7b3a118c
|
||||||
|
5d08d498f89e857756978ce092b7e4af2b74c62b refs/tags/v2.13.4
|
||||||
|
^60d3056c97067e6cb2125284878ed7c99c90ed81
|
||||||
|
912cb0a6552b5dd099e283a234447208638c2209 refs/tags/v2.13.5
|
||||||
|
^de918d45e1b2276a28a4cd32bcf556bef65284e4
|
||||||
|
8e7a3f7643aeb3f00c5d8480cfd9907e218f253a refs/tags/v2.13.6
|
||||||
|
^66453240c94b5cbd3e9ae9b32016fdafb13cdf18
|
||||||
|
92013f5e380c7027f89002d1fa150a656bb5cb66 refs/tags/v2.13.7
|
||||||
|
^9b8fbe99ad14fe32c5dd5913743046d80cf347fe
|
||||||
|
c1a40ead7b592be7112cd1a9e60cc7d31bf4b595 refs/tags/v2.13.8
|
||||||
|
^eb0a2f2b91566384f378d870ffcd69c0a24162cc
|
||||||
|
01d801ed453402320ca67f28bd7b71ca07d473d9 refs/tags/v2.13.9
|
||||||
|
^04af2cabb9f859c198b8a553c028a87481199410
|
||||||
|
8f31df3715c794325282f91e06836808ec0e3e25 refs/tags/v2.14.0
|
||||||
|
^a372cbf5821302ebaf757235b29ba812df78204d
|
||||||
|
103391ea91479da9b918448dc707001b3114a2bb refs/tags/v2.14.1
|
||||||
|
^0f10a05d2e1043dcc178736b82277223a76eacc9
|
||||||
|
718a140a367cb89192587d3dc80bf389f5aca531 refs/tags/v2.14.2
|
||||||
|
^0e145ae4881c2a05ae00128a3bd90d76d4dadc4b
|
||||||
|
514a3a41e7e273fb5642cde2dbd53a76e4aebf63 refs/tags/v2.14.3
|
||||||
|
^8d509f483dd5ce268b2fded9c738132c47d820d8
|
||||||
|
2f93c7b32890525107153c8920398058d33f17b4 refs/tags/v2.14.4
|
||||||
|
^4c6b2c3096b1da0d0780fe0b4f147e837140468d
|
||||||
|
97bd75ab83e6c2c2596cc520abe80d6779e4a69c refs/tags/v2.14.5
|
||||||
|
^74f3154320df8950eceae4951975cc9dfc3a254d
|
||||||
|
20f532eb52155e0657858712823f5908d1022a6d refs/tags/v2.14.6
|
||||||
|
^d23960a130c5bb82779c9405fbbf85e65fb3c57c
|
||||||
|
1b21b6c77bc1860e1a2b732bd2d9bff304d112c3 refs/tags/v2.15.0
|
||||||
|
^0bea77c8289324483c0504d36ac730bb03f6a70b
|
||||||
|
c36a6d572993da7e72a95fc8d6bbe4d371b57a72 refs/tags/v2.15.1
|
||||||
|
^b7fa62cbe8ef0df5869e000d5b690bdedd07f33e
|
||||||
|
580f6350dcb08d07723069c8a0163b9f7961eb84 refs/tags/v2.15.2
|
||||||
|
^3d840e17858de03a09fba8b202e3a89267d5795a
|
||||||
|
5e0a659ebe62aec93c518135d669404e108c7593 refs/tags/v2.15.3
|
||||||
|
^c94eb0210183b9d7cb43f8e7fddc6be55843ef49
|
||||||
|
32c00ab1f275a5cb405984b9d05074f0220c51b2 refs/tags/v2.7.4
|
||||||
|
^293416828e1467f877d9dd928f174dcf81b103bc
|
||||||
|
16d832067a0cd91c872bddcbaaa333ecfde4e21f refs/tags/v2.7.5
|
||||||
|
^7a896ce260d2447d405b4ae683bf9d643eef6cda
|
||||||
|
09722218f6b34cf7956b9d783b6c4c22245ae0cf refs/tags/v2.7.6
|
||||||
|
^96bb740e2102f103777f0a630d29ba88996dd80c
|
||||||
|
d87cd23dc35db8e3740278437b9788e04842ee8a refs/tags/v2.7.7
|
||||||
|
^bb5055f3875c5a3c45f4daa8058e35aab8c5ac3f
|
||||||
|
dfb55d16be9160f47c2d975787c51e542317bf98 refs/tags/v2.7.8
|
||||||
|
^4c2e7c651f6c2f0d1a74f350cbda95f7df3e7017
|
||||||
|
60f2ea93af9cf5fb703619b1f70b6efe44e72a68 refs/tags/v2.8.0
|
||||||
|
^c943f708f1853de4eb15e5a94cf0b35d108da87a
|
||||||
|
33ea7b311ab9ef2876f6f637d9d3070168097d6d refs/tags/v2.8.0-rc1
|
||||||
|
^9d9685ad88c17d35b6688695af3ceba7c7309b13
|
||||||
|
873af1e595d9d38161713173abe886c2f964ecf3 refs/tags/v2.8.0-rc2
|
||||||
|
^ee8f1d4cda8dc1a6f2c515fe234f7bc89cdc9f80
|
||||||
|
64ff9c0b6c1428b22139e96e9c8a6073cb13621c refs/tags/v2.9.0
|
||||||
|
^38bbd3412d1c2a2016cf5a1a221ad4010216d28e
|
||||||
|
68dbd0731a531c518af3119fd28fd76d358cb0fe refs/tags/v2.9.0-rc2
|
||||||
|
^f933c898132f20a50ba39ac6116378b71a01c700
|
||||||
|
3c5a219589cd29e14cc98ff3888782f3b4d44fc1 refs/tags/v2.9.1
|
||||||
|
^f4e5a6994ed230dfa3fb5b5c3fd94c4993ef1ba7
|
||||||
|
f1840421fcb591dac8da7ca337687f9901e7a6f2 refs/tags/v2.9.10
|
||||||
|
^41a34e1f4ffae2ce401600dbb5fe43f8fe402641
|
||||||
|
bf8ef642e5628ae14d6e08af901266ddea34e397 refs/tags/v2.9.10-rc1
|
||||||
|
^9acef289285008f81b4b66b4880baf600773cf67
|
||||||
|
45d730733714c9845dc9dc703dac896c6e8ee778 refs/tags/v2.9.11
|
||||||
|
^e1bcffea180d6cc0651757bb64284a763e0e2239
|
||||||
|
adf8e7ce9659c5d7e8401b1962fdbd3183413970 refs/tags/v2.9.12
|
||||||
|
^b48e77cf4f6fa0792c5f4b639707a2b0675e461b
|
||||||
|
0d2678b55df8165c9957d727f65ea7bc5db45394 refs/tags/v2.9.13
|
||||||
|
^a075d256fd9ff15590b86d981b75a50ead124fca
|
||||||
|
bd61cd3e2641f73dfeb1477cc96f4fce66695441 refs/tags/v2.9.14
|
||||||
|
^7846b0a677f8d3ce72486125fa281e92ac9970e8
|
||||||
|
1981966910ce8b9fccbe2d389539cc9d4a0f2b8b refs/tags/v2.9.2
|
||||||
|
^726f67e2f140f8d936dfe993bf9ded3180d750d2
|
||||||
|
a0be0ee781ee75068ed09e3689cedb86bb3fc6f8 refs/tags/v2.9.2-rc1
|
||||||
|
^f985ada79027570d5e3f0d1b29c8ecf23921044a
|
||||||
|
a7ee9ac2c9501a0bc19fecc79835e88ee3a0fb8b refs/tags/v2.9.2-rc2
|
||||||
|
^af62eb4fabda119f12c53da2e68cf0decb68b0d8
|
||||||
|
9393796f3d9fe9c3695bb04d04c4d63115201dc1 refs/tags/v2.9.3
|
||||||
|
^6657afe83a38278f124ace71dc85f60420beb2d5
|
||||||
|
56a6e1aebed937941d2960cc5012665a5ca0115e refs/tags/v2.9.4
|
||||||
|
^bdec2183f34b37ee89ae1d330c6ad2bb4d76605f
|
||||||
|
497393910ff3b586deaa497bc4a2e9f26eb0bdc0 refs/tags/v2.9.4-rc1
|
||||||
|
^a1dca81df7c352cd9a14ab678750b1623f8f8ed7
|
||||||
|
c1cda08208d5d5f5799e08a0b94dec639b99afe8 refs/tags/v2.9.4-rc2
|
||||||
|
^8effcb578e0590cc01bbcab0f9dccefc6bdbcdbd
|
||||||
|
f3ec1e3f525ac665f35d5f08013b30b9988cd2ad refs/tags/v2.9.5
|
||||||
|
^2960178fe8f9fe690b7f8c1c49093ff54bb56934
|
||||||
|
aecbb680b62a451695faa0058125c036eda308f9 refs/tags/v2.9.5-rc1
|
||||||
|
^e29e50e54f471c7019059e5358b2739442266246
|
||||||
|
ac79e63dc73782adf84b7cac4ea4884cf8082652 refs/tags/v2.9.5-rc2
|
||||||
|
^69936b129fedcda3514fee1a0d6b39521923cbac
|
||||||
|
60937cf0a9bf4f7c2e85fde7311d2faa9509a3b2 refs/tags/v2.9.6
|
||||||
|
^4b4d3d85165e6bfca23893cf98834c4bc747a96c
|
||||||
|
088e58814aab32e5a52fff33e5b8b5cc28988a0b refs/tags/v2.9.6-rc1
|
||||||
|
^0f3b843b3534784ef57a4f9b874238aa1fda5a73
|
||||||
|
6b6c944506736ab8c1e026b0bc7dcf39f5dedd17 refs/tags/v2.9.7
|
||||||
|
^bc5a5d658320c37e206fe4e7b525b4a24466d0c6
|
||||||
|
8bb75f1fd0d7060127851da63330e5a7805f01ae refs/tags/v2.9.7-rc1
|
||||||
|
^09f51ecbc5b8ea418bacca4ad43a4d2d1e3ccdfb
|
||||||
|
8b595673b8fcb5d5769e38bb40fde00ac8ddba0b refs/tags/v2.9.8
|
||||||
|
^18890f471c420411aa3c989e104d090966ec9dbf
|
||||||
|
d6d2d9a1413638f2c98a5404665e8071917ae3d0 refs/tags/v2.9.8-rc1
|
||||||
|
^ab362ab0ad3af54406ae8237a525405c6e2a705b
|
||||||
|
e555d28c1c16469b396d44827c1b8e2d59bf92bc refs/tags/v2.9.9
|
||||||
|
^f8a8c1f59db355b46962577e7b74f1a1e8149dc6
|
||||||
|
11a505b2d5d3778c39759e1a16c5a58546a2a058 refs/tags/v2.9.9-rc1
|
||||||
|
^c8e5f9588b986c6e81c9028825aeff8151375d28
|
||||||
|
f67b2a86b67d8fcadc1b9f25ae3cebbfdb0c9cb6 refs/tags/v2.9.9-rc2
|
||||||
|
^a71b98ec9dee2d44e16a74ab8472868891bbc7b4
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
ddcb79dc9934fd8a26263f6368c4eb7aa43f6d49
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
ref: refs/remotes/origin/master
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
/result/** -text
|
||||||
|
/test/** -text
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
*.exe
|
||||||
|
*.o
|
||||||
|
*.la
|
||||||
|
*.lo
|
||||||
|
*.pyc
|
||||||
|
|
||||||
|
# local build directories
|
||||||
|
/build
|
||||||
|
/install
|
||||||
|
|
||||||
|
# Executables
|
||||||
|
/xmlcatalog
|
||||||
|
/xmllint
|
||||||
|
|
||||||
|
# Test executables
|
||||||
|
/runsuite
|
||||||
|
/runtest
|
||||||
|
/runxmlconf
|
||||||
|
/testModule
|
||||||
|
/testapi
|
||||||
|
/testchar
|
||||||
|
/testdict
|
||||||
|
/testlimits
|
||||||
|
/testparser
|
||||||
|
/testrecurse
|
||||||
|
|
||||||
|
# Tests
|
||||||
|
/missing.lst
|
||||||
|
/runsuite.log
|
||||||
|
/runxmlconf.log
|
||||||
|
/test.out
|
||||||
|
/xmlconf
|
||||||
|
/xstc/Tests
|
||||||
|
|
||||||
|
# Generated by build system
|
||||||
|
/config.h
|
||||||
|
/include/libxml/xmlversion.h
|
||||||
|
/libxml-2.0.pc
|
||||||
|
/libxml2-config.cmake
|
||||||
|
/xml2-config
|
||||||
|
|
||||||
|
# Autotools
|
||||||
|
.deps
|
||||||
|
.libs
|
||||||
|
Makefile
|
||||||
|
Makefile.in
|
||||||
|
/INSTALL
|
||||||
|
/aclocal.m4
|
||||||
|
/autom4te.cache
|
||||||
|
/compile
|
||||||
|
/config.guess
|
||||||
|
/config.guess~
|
||||||
|
/config.h.in
|
||||||
|
/config.h.in~
|
||||||
|
/config.log
|
||||||
|
/config.status
|
||||||
|
/config.sub
|
||||||
|
/config.sub~
|
||||||
|
/configure
|
||||||
|
/configure~
|
||||||
|
/depcomp
|
||||||
|
/install-sh
|
||||||
|
/install-sh~
|
||||||
|
/libtool
|
||||||
|
/ltmain.sh
|
||||||
|
/missing
|
||||||
|
/m4/libtool.m4
|
||||||
|
/m4/lt*.m4
|
||||||
|
/py-compile
|
||||||
|
/stamp-h1
|
||||||
@@ -0,0 +1,355 @@
|
|||||||
|
include:
|
||||||
|
- component: "gitlab.gnome.org/GNOME/citemplates/release-service@master"
|
||||||
|
inputs:
|
||||||
|
dist-job-name: "dist"
|
||||||
|
tarball-artifact-path: "${TARBALL_ARTIFACT_PATH}"
|
||||||
|
|
||||||
|
install:
|
||||||
|
image: registry.gitlab.gnome.org/gnome/libxml2/docs
|
||||||
|
before_script:
|
||||||
|
- rm -rf libxml2-build
|
||||||
|
- mkdir libxml2-build
|
||||||
|
- ln -s /tests/xmlconf .
|
||||||
|
script:
|
||||||
|
- sh .gitlab-ci/install.sh
|
||||||
|
variables:
|
||||||
|
CFLAGS: "-O2"
|
||||||
|
DOXYGEN_WARN_AS_ERROR: "FAIL_ON_WARNINGS"
|
||||||
|
artifacts:
|
||||||
|
expire_in: 2 hrs
|
||||||
|
paths:
|
||||||
|
- install
|
||||||
|
|
||||||
|
.test:
|
||||||
|
image: registry.gitlab.gnome.org/gnome/libxml2
|
||||||
|
variables:
|
||||||
|
BASE_CONFIG: "--with-http --with-schematron --with-zlib --with-python"
|
||||||
|
before_script:
|
||||||
|
- rm -rf libxml2-build
|
||||||
|
- mkdir libxml2-build
|
||||||
|
- ln -s /tests/xmlconf .
|
||||||
|
script:
|
||||||
|
- sh .gitlab-ci/test.sh
|
||||||
|
|
||||||
|
gcc:
|
||||||
|
extends: .test
|
||||||
|
variables:
|
||||||
|
CFLAGS: "-O2"
|
||||||
|
|
||||||
|
gcc:c89:
|
||||||
|
extends: .test
|
||||||
|
variables:
|
||||||
|
CONFIG: "--without-python"
|
||||||
|
CFLAGS: "-O2 -std=c89 -D_XOPEN_SOURCE=600 -Wno-error=unused-function -Wno-error=overlength-strings"
|
||||||
|
|
||||||
|
gcc:minimum:
|
||||||
|
extends: .test
|
||||||
|
variables:
|
||||||
|
BASE_CONFIG: "--with-minimum"
|
||||||
|
CFLAGS: "-O2"
|
||||||
|
|
||||||
|
gcc:medium:
|
||||||
|
extends: .test
|
||||||
|
variables:
|
||||||
|
BASE_CONFIG: "--with-minimum"
|
||||||
|
CONFIG: "--with-threads --with-tree --with-xpath --with-output --with-html --with-iso8859x --with-valid"
|
||||||
|
CFLAGS: "-O2"
|
||||||
|
|
||||||
|
gcc:legacy:
|
||||||
|
extends: .test
|
||||||
|
only:
|
||||||
|
- schedules
|
||||||
|
variables:
|
||||||
|
BASE_CONFIG: "--with-legacy --with-python"
|
||||||
|
CFLAGS: "-O2"
|
||||||
|
|
||||||
|
gcc:static:
|
||||||
|
extends: .test
|
||||||
|
variables:
|
||||||
|
CONFIG: "--disable-shared --without-python --without-modules"
|
||||||
|
CFLAGS: "-O2"
|
||||||
|
|
||||||
|
clang:asan:
|
||||||
|
extends: .test
|
||||||
|
tags:
|
||||||
|
- asan
|
||||||
|
variables:
|
||||||
|
CONFIG: "--without-python"
|
||||||
|
CC: clang
|
||||||
|
CFLAGS: "-O2 -g -fno-omit-frame-pointer -fsanitize=address,undefined,integer -fno-sanitize-recover=all"
|
||||||
|
UBSAN_OPTIONS: "print_stacktrace=1"
|
||||||
|
ASAN_SYMBOLIZER_PATH: "$CI_PROJECT_DIR/.gitlab-ci/llvm-symbolizer"
|
||||||
|
|
||||||
|
clang:msan:
|
||||||
|
extends: .test
|
||||||
|
# only:
|
||||||
|
# - schedules
|
||||||
|
variables:
|
||||||
|
CONFIG: "--without-python --without-zlib"
|
||||||
|
CC: clang
|
||||||
|
CFLAGS: "-O2 -g -fno-omit-frame-pointer -fsanitize=memory"
|
||||||
|
MSAN_SYMBOLIZER_PATH: "$CI_PROJECT_DIR/.gitlab-ci/llvm-symbolizer"
|
||||||
|
|
||||||
|
.mingw:
|
||||||
|
tags:
|
||||||
|
- win32-ps
|
||||||
|
variables:
|
||||||
|
BASE_CONFIG: "--with-http --with-schematron --with-zlib --with-python"
|
||||||
|
# Python is disabled for now, see #658
|
||||||
|
CONFIG: "--with-docs --without-python"
|
||||||
|
CHERE_INVOKING: "yes"
|
||||||
|
before_script:
|
||||||
|
- $Env:Path="C:\msys64\usr\bin;$Env:Path"
|
||||||
|
- bash -lc 'sh .gitlab-ci/setup_mingw.sh autotools'
|
||||||
|
script:
|
||||||
|
- bash -lc 'sh .gitlab-ci/test.sh'
|
||||||
|
cache:
|
||||||
|
key: "$MSYSTEM"
|
||||||
|
paths:
|
||||||
|
- xmlconf/
|
||||||
|
|
||||||
|
mingw:w64-x86_64:shared:
|
||||||
|
extends: .mingw
|
||||||
|
variables:
|
||||||
|
CFLAGS: "-O2"
|
||||||
|
MSYSTEM: MINGW64
|
||||||
|
|
||||||
|
mingw:w64-i686:shared:
|
||||||
|
extends: .mingw
|
||||||
|
only:
|
||||||
|
- schedules
|
||||||
|
variables:
|
||||||
|
CFLAGS: "-O2"
|
||||||
|
MSYSTEM: MINGW32
|
||||||
|
|
||||||
|
# Disabled, GCC missing?
|
||||||
|
.mingw:msys:shared:
|
||||||
|
extends: .mingw
|
||||||
|
variables:
|
||||||
|
CFLAGS: "-O2"
|
||||||
|
MSYSTEM: MSYS
|
||||||
|
|
||||||
|
.cmake:linux:
|
||||||
|
image: registry.gitlab.gnome.org/gnome/libxml2
|
||||||
|
before_script:
|
||||||
|
- rm -rf libxml2-build
|
||||||
|
- mkdir libxml2-build
|
||||||
|
- ln -s /tests/xmlconf .
|
||||||
|
script:
|
||||||
|
- sh .gitlab-ci/test_cmake.sh
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- libxml2-$CI_COMMIT_SHORT_SHA-$SUFFIX.tar.gz
|
||||||
|
expire_in: 1 day
|
||||||
|
|
||||||
|
cmake:linux:gcc:shared:
|
||||||
|
extends: .cmake:linux
|
||||||
|
variables:
|
||||||
|
BUILD_SHARED_LIBS: "ON"
|
||||||
|
CONFIG: "-DLIBXML2_WITH_DOCS=ON"
|
||||||
|
CC: gcc
|
||||||
|
SUFFIX: linux-gcc-shared
|
||||||
|
|
||||||
|
cmake:linux:gcc:static:
|
||||||
|
extends: .cmake:linux
|
||||||
|
only:
|
||||||
|
- schedules
|
||||||
|
variables:
|
||||||
|
BUILD_SHARED_LIBS: "OFF"
|
||||||
|
CC: gcc
|
||||||
|
SUFFIX: linux-gcc-static
|
||||||
|
|
||||||
|
cmake:linux:clang:shared:
|
||||||
|
extends: .cmake:linux
|
||||||
|
only:
|
||||||
|
- schedules
|
||||||
|
variables:
|
||||||
|
BUILD_SHARED_LIBS: "ON"
|
||||||
|
CC: clang
|
||||||
|
SUFFIX: linux-clang-shared
|
||||||
|
|
||||||
|
cmake:linux:clang:static:
|
||||||
|
extends: .cmake:linux
|
||||||
|
only:
|
||||||
|
- schedules
|
||||||
|
variables:
|
||||||
|
BUILD_SHARED_LIBS: "OFF"
|
||||||
|
CC: clang
|
||||||
|
SUFFIX: linux-clang-static
|
||||||
|
|
||||||
|
.cmake:mingw:
|
||||||
|
tags:
|
||||||
|
- win32-ps
|
||||||
|
variables:
|
||||||
|
CHERE_INVOKING: "yes"
|
||||||
|
before_script:
|
||||||
|
- $Env:Path="C:\msys64\usr\bin;$Env:Path"
|
||||||
|
- bash -lc 'sh .gitlab-ci/setup_mingw.sh cmake ninja'
|
||||||
|
script:
|
||||||
|
- bash -lc 'sh .gitlab-ci/test_cmake.sh -G Ninja'
|
||||||
|
cache:
|
||||||
|
key: "$MSYSTEM"
|
||||||
|
paths:
|
||||||
|
- xmlconf/
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- libxml2-$Env:CI_COMMIT_SHORT_SHA-$Env:SUFFIX.tar.gz
|
||||||
|
expire_in: 1 day
|
||||||
|
|
||||||
|
cmake:mingw:w64-i686:shared:
|
||||||
|
extends: .cmake:mingw
|
||||||
|
only:
|
||||||
|
- schedules
|
||||||
|
variables:
|
||||||
|
BUILD_SHARED_LIBS: "ON"
|
||||||
|
CONFIG: "-DLIBXML2_WITH_DOCS=ON"
|
||||||
|
MSYSTEM: MINGW32
|
||||||
|
SUFFIX: mingw-w64-i686-shared
|
||||||
|
|
||||||
|
cmake:mingw:w64-i686:static:
|
||||||
|
extends: .cmake:mingw
|
||||||
|
# only:
|
||||||
|
# - schedules
|
||||||
|
variables:
|
||||||
|
BUILD_SHARED_LIBS: "OFF"
|
||||||
|
MSYSTEM: MINGW32
|
||||||
|
SUFFIX: mingw-w64-i686-static
|
||||||
|
|
||||||
|
cmake:mingw:w64-x86_64:shared:
|
||||||
|
extends: .cmake:mingw
|
||||||
|
# only:
|
||||||
|
# - schedules
|
||||||
|
variables:
|
||||||
|
BUILD_SHARED_LIBS: "ON"
|
||||||
|
MSYSTEM: MINGW64
|
||||||
|
SUFFIX: mingw-w64-x86_64-shared
|
||||||
|
|
||||||
|
cmake:mingw:w64-x86_64:static:
|
||||||
|
extends: .cmake:mingw
|
||||||
|
only:
|
||||||
|
- schedules
|
||||||
|
variables:
|
||||||
|
BUILD_SHARED_LIBS: "OFF"
|
||||||
|
MSYSTEM: MINGW64
|
||||||
|
SUFFIX: mingw-w64-x86_64-static
|
||||||
|
|
||||||
|
.cmake:msvc:
|
||||||
|
tags:
|
||||||
|
- win32-ps
|
||||||
|
variables:
|
||||||
|
# MSVC warns when casting `const char **` to `void *` which is wrong.
|
||||||
|
# Disable warning C4090.
|
||||||
|
CFLAGS: /WX /wd4090
|
||||||
|
CMAKE_VERSION: 3.19.4
|
||||||
|
script:
|
||||||
|
- .gitlab-ci/Test-Msvc
|
||||||
|
cache:
|
||||||
|
key: "msvc"
|
||||||
|
paths:
|
||||||
|
- cmake-$Env:CMAKE_VERSION-win64-x64/
|
||||||
|
- xmlconf/
|
||||||
|
- 7za.exe
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- libxml2-$Env:CI_COMMIT_SHORT_SHA-$Env:CMAKE_GENERATOR_TOOLSET-$Env:CMAKE_GENERATOR_PLATFORM-$Env:SUFFIX.7z
|
||||||
|
expire_in: 1 day
|
||||||
|
|
||||||
|
.cmake:msvc:v141:
|
||||||
|
extends: .cmake:msvc
|
||||||
|
variables:
|
||||||
|
CMAKE_GENERATOR: Visual Studio 15 2017
|
||||||
|
CMAKE_GENERATOR_TOOLSET: v141
|
||||||
|
|
||||||
|
.cmake:msvc:v141:x64:
|
||||||
|
extends: .cmake:msvc:v141
|
||||||
|
variables:
|
||||||
|
CMAKE_GENERATOR_PLATFORM: x64
|
||||||
|
|
||||||
|
cmake:msvc:v141:x64:shared:
|
||||||
|
extends: .cmake:msvc:v141:x64
|
||||||
|
variables:
|
||||||
|
BUILD_SHARED_LIBS: "ON"
|
||||||
|
SUFFIX: shared
|
||||||
|
|
||||||
|
cmake:msvc:v141:x64:static:
|
||||||
|
extends: .cmake:msvc:v141:x64
|
||||||
|
only:
|
||||||
|
- schedules
|
||||||
|
variables:
|
||||||
|
BUILD_SHARED_LIBS: "OFF"
|
||||||
|
SUFFIX: static
|
||||||
|
|
||||||
|
.cmake:msvc:v141:x86:
|
||||||
|
extends: .cmake:msvc:v141
|
||||||
|
only:
|
||||||
|
- schedules
|
||||||
|
variables:
|
||||||
|
CMAKE_GENERATOR_PLATFORM: Win32
|
||||||
|
|
||||||
|
cmake:msvc:v141:x86:shared:
|
||||||
|
extends: .cmake:msvc:v141:x86
|
||||||
|
only:
|
||||||
|
- schedules
|
||||||
|
variables:
|
||||||
|
BUILD_SHARED_LIBS: "ON"
|
||||||
|
SUFFIX: shared
|
||||||
|
|
||||||
|
cmake:msvc:v141:x86:static:
|
||||||
|
extends: .cmake:msvc:v141:x86
|
||||||
|
variables:
|
||||||
|
BUILD_SHARED_LIBS: "OFF"
|
||||||
|
SUFFIX: static
|
||||||
|
|
||||||
|
meson:
|
||||||
|
image: registry.gitlab.gnome.org/gnome/libxml2
|
||||||
|
before_script:
|
||||||
|
- ln -s /tests/xmlconf .
|
||||||
|
script:
|
||||||
|
- sh .gitlab-ci/test_meson.sh
|
||||||
|
|
||||||
|
cmake:linux:gcc:shared:
|
||||||
|
extends: .cmake:linux
|
||||||
|
variables:
|
||||||
|
BUILD_SHARED_LIBS: "ON"
|
||||||
|
CC: gcc
|
||||||
|
SUFFIX: linux-gcc-shared
|
||||||
|
|
||||||
|
dist:
|
||||||
|
image: registry.gitlab.gnome.org/gnome/libxml2
|
||||||
|
script:
|
||||||
|
- sh .gitlab-ci/dist.sh
|
||||||
|
- echo "TARBALL_ARTIFACT_PATH=$(ls libxml2-dist/*.tar.xz)" >> build.env
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- libxml2-dist/*.tar.xz
|
||||||
|
reports:
|
||||||
|
dotenv: build.env
|
||||||
|
|
||||||
|
pages:
|
||||||
|
needs: [install]
|
||||||
|
script:
|
||||||
|
- cp -r install/share/doc/libxml2 public
|
||||||
|
- cp doc/_redirects public
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- public
|
||||||
|
only:
|
||||||
|
- master@GNOME/libxml2
|
||||||
|
|
||||||
|
downstream-lxml:
|
||||||
|
image: registry.gitlab.gnome.org/gnome/libxml2
|
||||||
|
needs: [install]
|
||||||
|
script:
|
||||||
|
- sh .gitlab-ci/downstream-lxml.sh
|
||||||
|
|
||||||
|
downstream-nokogiri:
|
||||||
|
# owner: @flavorjones
|
||||||
|
image: ghcr.io/sparklemotion/nokogiri-test:upstream-libxml
|
||||||
|
script:
|
||||||
|
- .gitlab-ci/downstream-nokogiri.sh
|
||||||
|
|
||||||
|
downstream-php:
|
||||||
|
image: registry.gitlab.gnome.org/gnome/libxml2
|
||||||
|
needs: [install]
|
||||||
|
script:
|
||||||
|
- sh .gitlab-ci/downstream-php.sh
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
# The image is also used for libxslt.
|
||||||
|
#
|
||||||
|
# package required for
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# libclang-rt-dev sanitizer runtimes
|
||||||
|
# llvm llvm-symbolizer (for sanitizer backtraces)
|
||||||
|
# git libxslt, downstream projects
|
||||||
|
# libgcrypt-dev libxslt
|
||||||
|
# xz-utils make dist
|
||||||
|
# doxygen documentation
|
||||||
|
# xsltproc documentation
|
||||||
|
# docbook-xsl documentation
|
||||||
|
|
||||||
|
FROM ubuntu:26.04
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get upgrade -y && \
|
||||||
|
apt-get install -y --no-install-recommends \
|
||||||
|
curl git ca-certificates \
|
||||||
|
autoconf automake libtool pkg-config \
|
||||||
|
make gcc clang llvm libclang-rt-dev \
|
||||||
|
zlib1g-dev libgcrypt-dev \
|
||||||
|
python3-dev \
|
||||||
|
cmake meson \
|
||||||
|
xz-utils \
|
||||||
|
doxygen xsltproc docbook-xsl
|
||||||
|
WORKDIR /tests
|
||||||
|
RUN curl https://www.w3.org/XML/Test/xmlts20080827.tar.gz |tar xz
|
||||||
|
|
||||||
|
# XML::LibXML uses Alien::Libxml2 which has a huge dependency chain.
|
||||||
|
# We try to install most dependencies with apt. We also require
|
||||||
|
# libxml2-dev to stop Alien::Libxml2 from downloading and building
|
||||||
|
# libxml2 on its own.
|
||||||
|
RUN apt-get install -y --no-install-recommends \
|
||||||
|
libperl-dev libxml2-dev cpanminus \
|
||||||
|
libalien-build-perl \
|
||||||
|
libio-socket-ssl-perl \
|
||||||
|
libsort-versions-perl \
|
||||||
|
liburi-perl \
|
||||||
|
libxml-namespacesupport-perl \
|
||||||
|
libxml-sax-perl \
|
||||||
|
libyaml-perl
|
||||||
|
RUN cpanm -n Alien::Libxml2
|
||||||
|
RUN apt-get remove -y libxml2-dev
|
||||||
|
|
||||||
|
# PHP
|
||||||
|
RUN apt-get install -y --no-install-recommends \
|
||||||
|
bison re2c libsqlite3-dev
|
||||||
|
|
||||||
|
# lxml
|
||||||
|
# ubuntu cython3 is too old, so we install using pip
|
||||||
|
RUN apt-get install -y --no-install-recommends \
|
||||||
|
python3-pip
|
||||||
|
RUN pip3 install Cython --break-system-packages
|
||||||
|
|
||||||
|
# xmlstarlet
|
||||||
|
RUN apt-get install -y --no-install-recommends \
|
||||||
|
docbook-xsl-ns
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# Image used to generate documentation with a recent version of Doxygen.
|
||||||
|
# 1.14.0 fixes an important bug.
|
||||||
|
|
||||||
|
FROM archlinux:base-devel
|
||||||
|
RUN pacman -Syu --noconfirm doxygen libxslt docbook-xsl git
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||||
|
|
||||||
|
if (-not (Test-Path 7za.exe)) {
|
||||||
|
Invoke-WebRequest `
|
||||||
|
-Uri https://www.7-zip.org/a/7z1900-extra.7z `
|
||||||
|
-OutFile 7z1900-extra.7z
|
||||||
|
cmake -E tar xf 7z1900-extra.7z 7za.exe
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not (Test-Path xmlconf)) {
|
||||||
|
Invoke-WebRequest `
|
||||||
|
-Uri https://www.w3.org/XML/Test/xmlts20080827.tar.gz `
|
||||||
|
-OutFile xmlts20080827.tar.gz ;
|
||||||
|
.\7za.exe x xmlts20080827.tar.gz
|
||||||
|
.\7za.exe x xmlts20080827.tar
|
||||||
|
}
|
||||||
|
|
||||||
|
cmake `
|
||||||
|
-G "Visual Studio 16 2019" `
|
||||||
|
-DBUILD_SHARED_LIBS="$Env:BUILD_SHARED_LIBS" `
|
||||||
|
-DCMAKE_INSTALL_PREFIX=libxml2-install `
|
||||||
|
-DLIBXML2_WITH_SCHEMATRON=ON `
|
||||||
|
-DLIBXML2_WITH_ICONV=OFF `
|
||||||
|
-DLIBXML2_WITH_PYTHON=OFF `
|
||||||
|
-DLIBXML2_WITH_ZLIB=OFF `
|
||||||
|
-S . -B libxml2-build
|
||||||
|
if ($LastExitCode -ne 0) {
|
||||||
|
throw "cmake failed"
|
||||||
|
}
|
||||||
|
cmake --build libxml2-build --config Debug --target install
|
||||||
|
cmake --build libxml2-build --config Release --target install
|
||||||
|
New-Item -ItemType Directory libxml2-install\share\libxml2
|
||||||
|
Copy-Item Copyright libxml2-install\share\libxml2
|
||||||
|
|
||||||
|
cd libxml2-build
|
||||||
|
ctest -C Debug -VV
|
||||||
|
if ($LastExitCode -ne 0) {
|
||||||
|
throw "ctest failed"
|
||||||
|
}
|
||||||
|
ctest -C Release -VV
|
||||||
|
if ($LastExitCode -ne 0) {
|
||||||
|
throw "ctest failed"
|
||||||
|
}
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
.\7za.exe a libxml2-$Env:CI_COMMIT_SHORT_SHA-$Env:CMAKE_GENERATOR_TOOLSET-$Env:CMAKE_GENERATOR_PLATFORM-$Env:SUFFIX.7z .\libxml2-install\*
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
mkdir -p libxml2-dist
|
||||||
|
cd libxml2-dist
|
||||||
|
sh ../autogen.sh --with-docs --with-legacy
|
||||||
|
VERSION=$(cat libxml-2.0.pc | grep Version | cut -d" " -f2)
|
||||||
|
|
||||||
|
# Build doc into the dist: https://gitlab.gnome.org/GNOME/libxml2/-/issues/1048
|
||||||
|
cd doc
|
||||||
|
make
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
make distcheck V=1 DISTCHECK_CONFIGURE_FLAGS='--with-docs --with-legacy'
|
||||||
|
|
||||||
|
tar xJvf libxml2-$VERSION.tar.xz
|
||||||
|
cp -rf doc libxml2-$VERSION/dist-doc
|
||||||
|
tar cJvf libxml2-$VERSION.tar.xz libxml2-$VERSION
|
||||||
|
|
||||||
|
if [ -z "$CI_COMMIT_TAG" ]; then
|
||||||
|
mv libxml2-$VERSION.tar.xz libxml2-git-$CI_COMMIT_SHORT_SHA.tar.xz
|
||||||
|
fi
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
srcdir=$(pwd)
|
||||||
|
installdir="$srcdir/install"
|
||||||
|
export PKG_CONFIG_PATH="$installdir/lib/pkgconfig"
|
||||||
|
|
||||||
|
git clone --depth 1 https://github.com/lxml/lxml.git
|
||||||
|
cd lxml
|
||||||
|
make
|
||||||
|
LD_LIBRARY_PATH="$installdir/lib" make TESTFLAGS='' test
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
export LIBXML_DIR=$(pwd)
|
||||||
|
export MAKEFLAGS=-j$(nproc)
|
||||||
|
export NOCONFIGURE=1
|
||||||
|
./autogen.sh
|
||||||
|
|
||||||
|
git clone https://github.com/sparklemotion/nokogiri
|
||||||
|
cd nokogiri
|
||||||
|
gem install bundler:2.7.2
|
||||||
|
bundle _2.7.2_ install
|
||||||
|
bundle exec rake compile -- --with-xml2-source-dir=${LIBXML_DIR} --disable-xml2-legacy
|
||||||
|
bundle exec rake test
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
srcdir=$(pwd)
|
||||||
|
installdir="$srcdir/install"
|
||||||
|
export PKG_CONFIG_PATH="$installdir/lib/pkgconfig"
|
||||||
|
|
||||||
|
git clone --depth 1 https://github.com/php/php-src.git
|
||||||
|
cd php-src
|
||||||
|
./buildconf
|
||||||
|
./configure --with-xsl --enable-soap --enable-debug
|
||||||
|
make -j$(nproc)
|
||||||
|
make TESTS=" \
|
||||||
|
-g FAIL \
|
||||||
|
--show-diff \
|
||||||
|
--no-progress \
|
||||||
|
ext/dom \
|
||||||
|
ext/libxml \
|
||||||
|
ext/simplexml \
|
||||||
|
ext/soap \
|
||||||
|
ext/xml \
|
||||||
|
ext/xmlreader \
|
||||||
|
ext/xmlwriter \
|
||||||
|
ext/xsl \
|
||||||
|
" test
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
srcdir=$(pwd)
|
||||||
|
|
||||||
|
mkdir -p install
|
||||||
|
installdir="$srcdir/install"
|
||||||
|
export PKG_CONFIG_PATH="$installdir/lib/pkgconfig"
|
||||||
|
|
||||||
|
sh autogen.sh "--prefix=$installdir" --with-docs --with-schematron --with-zlib
|
||||||
|
make -j$(nproc)
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Make system XML catalog available
|
||||||
|
ln -s /etc install/etc
|
||||||
|
|
||||||
|
git clone --depth 1 https://gitlab.gnome.org/GNOME/libxslt.git
|
||||||
|
cd libxslt
|
||||||
|
sh autogen.sh \
|
||||||
|
"--prefix=$installdir" \
|
||||||
|
--without-python
|
||||||
|
make -j$(nproc)
|
||||||
|
make install
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Newer versions of llvm-symbolizer require libxml2 themselves. Running
|
||||||
|
# a test program with LD_LIBRARY_PATH set to .libs makes llvm-symbolizer
|
||||||
|
# pick up the tested development version of libxml2 which breaks
|
||||||
|
# completely if the build is instrumented with ASan. This wrapper script
|
||||||
|
# invokes llvm-symbolizer with an empty LD_LIBRARY_PATH.
|
||||||
|
|
||||||
|
LD_LIBRARY_PATH='' llvm-symbolizer "$@"
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
pacman --noconfirm -Syu
|
||||||
|
|
||||||
|
prefix=
|
||||||
|
if [ -n "$MINGW_PACKAGE_PREFIX" ]; then
|
||||||
|
prefix="${MINGW_PACKAGE_PREFIX}-"
|
||||||
|
fi
|
||||||
|
for module in docbook-xsl doxygen libiconv python xsltproc xz zlib "$@"; do
|
||||||
|
pacman --noconfirm -S --needed ${prefix}$module
|
||||||
|
done
|
||||||
|
|
||||||
|
mkdir -p libxml2-build
|
||||||
|
|
||||||
|
if [ ! -e xmlconf ]; then
|
||||||
|
wget https://www.w3.org/XML/Test/xmlts20080827.tar -O - |
|
||||||
|
tar -x
|
||||||
|
fi
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
cd libxml2-build
|
||||||
|
sh ../autogen.sh $BASE_CONFIG $CONFIG || cat config.log
|
||||||
|
make -j$(nproc) V=1 CFLAGS="$CFLAGS -Werror"
|
||||||
|
make CFLAGS="$CFLAGS -Werror" check
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
CFLAGS="-Werror $CFLAGS" \
|
||||||
|
cmake "$@" \
|
||||||
|
-DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=libxml2-install \
|
||||||
|
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||||
|
-DLIBXML2_WITH_HTTP=ON \
|
||||||
|
-DLIBXML2_WITH_SCHEMATRON=ON \
|
||||||
|
-DLIBXML2_WITH_ZLIB=ON \
|
||||||
|
-DLIBXML2_WITH_PYTHON=ON \
|
||||||
|
$CONFIG \
|
||||||
|
-S . -B libxml2-build
|
||||||
|
cmake --build libxml2-build --target install
|
||||||
|
|
||||||
|
(cd libxml2-build && ctest -VV)
|
||||||
|
|
||||||
|
mkdir -p libxml2-install/share/libxml2
|
||||||
|
cp Copyright libxml2-install/share/libxml2
|
||||||
|
(cd libxml2-install &&
|
||||||
|
tar -czf ../libxml2-$CI_COMMIT_SHORT_SHA-$SUFFIX.tar.gz *)
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# compile with the following warnings:
|
||||||
|
# --warnlevel 3 : passes to the compiler -Wall -Wextra -Wpedantic
|
||||||
|
# --werror : passes to the compiler -Werror
|
||||||
|
# --default-library : can be 'shared', 'static' or 'both'
|
||||||
|
meson setup \
|
||||||
|
--warnlevel 3 \
|
||||||
|
--werror \
|
||||||
|
--buildtype=debugoptimized \
|
||||||
|
--default-library shared \
|
||||||
|
-Ddocs=enabled \
|
||||||
|
-Dhttp=enabled \
|
||||||
|
-Dschematron=enabled \
|
||||||
|
-Dzlib=enabled \
|
||||||
|
-Dpython=enabled \
|
||||||
|
builddir
|
||||||
|
|
||||||
|
ninja -C builddir
|
||||||
|
|
||||||
|
meson test --verbose -C builddir
|
||||||
@@ -0,0 +1,847 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.18)
|
||||||
|
|
||||||
|
file(READ "VERSION" VERSION)
|
||||||
|
string(STRIP ${VERSION} VERSION)
|
||||||
|
if(${VERSION} MATCHES [[([0-9]+)\.([0-9]+)\.([0-9]+)]])
|
||||||
|
set(LIBXML_MAJOR_VERSION ${CMAKE_MATCH_1})
|
||||||
|
set(LIBXML_MINOR_VERSION ${CMAKE_MATCH_2})
|
||||||
|
set(LIBXML_MICRO_VERSION ${CMAKE_MATCH_3})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
project(libxml2 VERSION ${VERSION} LANGUAGES C)
|
||||||
|
|
||||||
|
set(CMAKE_C_STANDARD 11)
|
||||||
|
|
||||||
|
include(CheckCSourceCompiles)
|
||||||
|
include(CheckFunctionExists)
|
||||||
|
include(CheckIncludeFiles)
|
||||||
|
include(CheckLibraryExists)
|
||||||
|
include(CheckStructHasMember)
|
||||||
|
include(CheckSymbolExists)
|
||||||
|
include(CMakeDependentOption)
|
||||||
|
include(CMakePackageConfigHelpers)
|
||||||
|
include(CMakePushCheckState)
|
||||||
|
include(FindPkgConfig)
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
|
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
|
||||||
|
option(LIBXML2_WITH_CATALOG "Add the Catalog support" ON)
|
||||||
|
option(LIBXML2_WITH_DEBUG "Add the debugging module" ON)
|
||||||
|
option(LIBXML2_WITH_DOCS "Build documentation" OFF)
|
||||||
|
option(LIBXML2_WITH_HTML "Add the HTML support" ON)
|
||||||
|
option(LIBXML2_WITH_HTTP "ABI compatibility for removed HTTP support" OFF)
|
||||||
|
option(LIBXML2_WITH_ICONV "Add ICONV support" ON)
|
||||||
|
option(LIBXML2_WITH_ICU "Add ICU support" OFF)
|
||||||
|
option(LIBXML2_WITH_ISO8859X "Add ISO8859X support if no iconv" ON)
|
||||||
|
option(LIBXML2_WITH_LEGACY "Add deprecated APIs for compatibility" OFF)
|
||||||
|
option(LIBXML2_WITH_MODULES "Add the dynamic modules support" ON)
|
||||||
|
option(LIBXML2_WITH_OUTPUT "Add the serialization support" ON)
|
||||||
|
option(LIBXML2_WITH_PATTERN "Add the xmlPattern selection interface" ON)
|
||||||
|
option(LIBXML2_WITH_PROGRAMS "Build programs" ON)
|
||||||
|
option(LIBXML2_WITH_PUSH "Add the PUSH parser interfaces" ON)
|
||||||
|
option(LIBXML2_WITH_PYTHON "Build Python bindings" OFF)
|
||||||
|
option(LIBXML2_WITH_READLINE "readline support for xmllint shell" OFF)
|
||||||
|
option(LIBXML2_WITH_REGEXPS "Add Regular Expressions support" ON)
|
||||||
|
option(LIBXML2_WITH_SAX1 "Add the older SAX1 interface" ON)
|
||||||
|
option(LIBXML2_WITH_TESTS "Build tests" ON)
|
||||||
|
option(LIBXML2_WITH_THREADS "Add multithread support" ON)
|
||||||
|
option(LIBXML2_WITH_TLS "Enable thread-local storage" OFF)
|
||||||
|
option(LIBXML2_WITH_VALID "Add the DTD validation support" ON)
|
||||||
|
if(WIN32 OR CYGWIN)
|
||||||
|
option(LIBXML2_WITH_WINPATH "Handle Windows-styled path" ON)
|
||||||
|
else()
|
||||||
|
option(LIBXML2_WITH_WINPATH "Handle Windows-styled path" OFF)
|
||||||
|
endif()
|
||||||
|
option(LIBXML2_WITH_XINCLUDE "Add the XInclude support" ON)
|
||||||
|
option(LIBXML2_WITH_XPATH "Add the XPATH support" ON)
|
||||||
|
|
||||||
|
cmake_dependent_option(
|
||||||
|
LIBXML2_WITH_ZLIB "Use libz" OFF
|
||||||
|
"NOT LIBXML2_WITH_LEGACY" ON)
|
||||||
|
|
||||||
|
cmake_dependent_option(
|
||||||
|
LIBXML2_WITH_C14N "Add the Canonicalization support" ON
|
||||||
|
"LIBXML2_WITH_OUTPUT;LIBXML2_WITH_XPATH" OFF)
|
||||||
|
cmake_dependent_option(
|
||||||
|
LIBXML2_WITH_HISTORY "history support for xmllint shell" OFF
|
||||||
|
"LIBXML2_WITH_READLINE" OFF)
|
||||||
|
cmake_dependent_option(
|
||||||
|
LIBXML2_WITH_READER "Add the xmlReader parsing interface" ON
|
||||||
|
"LIBXML2_WITH_PUSH" OFF)
|
||||||
|
cmake_dependent_option(
|
||||||
|
LIBXML2_WITH_SCHEMAS "Add XML Schemas 1.0 support" ON
|
||||||
|
"LIBXML2_WITH_PATTERN;LIBXML2_WITH_REGEXPS" OFF)
|
||||||
|
cmake_dependent_option(
|
||||||
|
LIBXML2_WITH_SCHEMATRON "Add Schematron support" OFF
|
||||||
|
"LIBXML2_WITH_PATTERN;LIBXML2_WITH_XPATH" OFF)
|
||||||
|
cmake_dependent_option(
|
||||||
|
LIBXML2_WITH_THREAD_ALLOC "Add per-thread malloc hooks" OFF
|
||||||
|
"LIBXML2_WITH_THREADS" OFF)
|
||||||
|
cmake_dependent_option(
|
||||||
|
LIBXML2_WITH_WRITER "Add the xmlWriter saving interface" ON
|
||||||
|
"LIBXML2_WITH_OUTPUT;LIBXML2_WITH_PUSH" OFF)
|
||||||
|
cmake_dependent_option(
|
||||||
|
LIBXML2_WITH_XPTR "Add the XPointer support" ON
|
||||||
|
"LIBXML2_WITH_XPATH" OFF)
|
||||||
|
|
||||||
|
cmake_dependent_option(
|
||||||
|
LIBXML2_WITH_RELAXNG "Add Relax-NG support" ON
|
||||||
|
"LIBXML2_WITH_REGEXPS;LIBXML2_WITH_SCHEMAS" OFF)
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_PYTHON)
|
||||||
|
find_package(Python3 COMPONENTS Interpreter Development REQUIRED)
|
||||||
|
#set(LIBXML2_PYTHON_INSTALL_DIR ${Python3_SITEARCH} CACHE PATH "Python bindings install directory")
|
||||||
|
set(LIBXML2_PYTHON_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/python"
|
||||||
|
CACHE PATH "Python bindings install directory")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
foreach(VARIABLE IN ITEMS WITH_C14N WITH_CATALOG WITH_DEBUG WITH_HTML WITH_HTTP WITH_ICONV WITH_ICU WITH_ISO8859X WITH_MODULES WITH_OUTPUT WITH_PATTERN WITH_PUSH WITH_READER WITH_REGEXPS WITH_RELAXNG WITH_SAX1 WITH_SCHEMAS WITH_SCHEMATRON WITH_THREADS WITH_THREAD_ALLOC WITH_VALID WITH_WINPATH WITH_WRITER WITH_XINCLUDE WITH_XPATH WITH_XPTR WITH_ZLIB)
|
||||||
|
if(LIBXML2_${VARIABLE})
|
||||||
|
set(${VARIABLE} 1)
|
||||||
|
else()
|
||||||
|
set(${VARIABLE} 0)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
set(LIBXML_VERSION ${VERSION})
|
||||||
|
set(LIBXML_VERSION_EXTRA "")
|
||||||
|
math(EXPR LIBXML_VERSION_NUMBER "
|
||||||
|
${LIBXML_MAJOR_VERSION} * 10000 +
|
||||||
|
${LIBXML_MINOR_VERSION} * 100 +
|
||||||
|
${LIBXML_MICRO_VERSION}
|
||||||
|
")
|
||||||
|
|
||||||
|
set(MODULE_EXTENSION "${CMAKE_SHARED_LIBRARY_SUFFIX}")
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_ICONV)
|
||||||
|
find_package(Iconv REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_ICU)
|
||||||
|
find_package(ICU REQUIRED COMPONENTS uc)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_THREADS)
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
set(THREAD_LIBS ${CMAKE_THREAD_LIBS_INIT})
|
||||||
|
list(APPEND CMAKE_REQUIRED_LIBRARIES Threads::Threads)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_ZLIB)
|
||||||
|
find_package(ZLIB REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
check_c_source_compiles("
|
||||||
|
void __attribute__((destructor))
|
||||||
|
f(void) {}
|
||||||
|
int main(void) { return 0; }
|
||||||
|
" HAVE_FUNC_ATTRIBUTE_DESTRUCTOR)
|
||||||
|
check_symbol_exists(getentropy "sys/random.h" HAVE_DECL_GETENTROPY)
|
||||||
|
check_symbol_exists(glob "glob.h" HAVE_DECL_GLOB)
|
||||||
|
check_symbol_exists(mmap "sys/mman.h" HAVE_DECL_MMAP)
|
||||||
|
check_include_files(stdint.h HAVE_STDINT_H)
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_READLINE)
|
||||||
|
check_library_exists(readline readline "" HAVE_LIBREADLINE)
|
||||||
|
if (LIBXML2_WITH_HISTORY)
|
||||||
|
check_library_exists(history append_history "" HAVE_LIBHISTORY)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_TLS)
|
||||||
|
check_c_source_compiles(
|
||||||
|
"_Thread_local int v; int main(){return 0;}"
|
||||||
|
XML_THREAD_LOCAL_C11
|
||||||
|
)
|
||||||
|
if (XML_THREAD_LOCAL_C11)
|
||||||
|
set(XML_THREAD_LOCAL "_Thread_local")
|
||||||
|
else()
|
||||||
|
check_c_source_compiles(
|
||||||
|
"__thread int v; int main(){return 0;}"
|
||||||
|
XML_THREAD_LOCAL_THREAD
|
||||||
|
)
|
||||||
|
if (XML_THREAD_LOCAL_THREAD)
|
||||||
|
set(XML_THREAD_LOCAL "__thread")
|
||||||
|
else()
|
||||||
|
check_c_source_compiles(
|
||||||
|
"__declspec(thread) int v; int main(){return 0;}"
|
||||||
|
XML_THREAD_LOCAL_DECLSPEC
|
||||||
|
)
|
||||||
|
if (XML_THREAD_LOCAL_DECLSPEC)
|
||||||
|
set(XML_THREAD_LOCAL "__declspec(thread)")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Headers which are private.
|
||||||
|
set(
|
||||||
|
LIBXML2_PRIVATE_HDRS
|
||||||
|
include/private/buf.h
|
||||||
|
include/private/cata.h
|
||||||
|
include/private/dict.h
|
||||||
|
include/private/enc.h
|
||||||
|
include/private/entities.h
|
||||||
|
include/private/error.h
|
||||||
|
include/private/globals.h
|
||||||
|
include/private/html.h
|
||||||
|
include/private/io.h
|
||||||
|
include/private/lint.h
|
||||||
|
include/private/memory.h
|
||||||
|
include/private/parser.h
|
||||||
|
include/private/regexp.h
|
||||||
|
include/private/save.h
|
||||||
|
include/private/string.h
|
||||||
|
include/private/threads.h
|
||||||
|
include/private/tree.h
|
||||||
|
include/private/xinclude.h
|
||||||
|
include/private/xpath.h
|
||||||
|
)
|
||||||
|
|
||||||
|
set(
|
||||||
|
LIBXML2_HDRS
|
||||||
|
include/libxml/c14n.h
|
||||||
|
include/libxml/catalog.h
|
||||||
|
include/libxml/chvalid.h
|
||||||
|
include/libxml/debugXML.h
|
||||||
|
include/libxml/dict.h
|
||||||
|
include/libxml/encoding.h
|
||||||
|
include/libxml/entities.h
|
||||||
|
include/libxml/globals.h
|
||||||
|
include/libxml/hash.h
|
||||||
|
include/libxml/HTMLparser.h
|
||||||
|
include/libxml/HTMLtree.h
|
||||||
|
include/libxml/list.h
|
||||||
|
include/libxml/nanoftp.h
|
||||||
|
include/libxml/nanohttp.h
|
||||||
|
include/libxml/parser.h
|
||||||
|
include/libxml/parserInternals.h
|
||||||
|
include/libxml/pattern.h
|
||||||
|
include/libxml/relaxng.h
|
||||||
|
include/libxml/SAX.h
|
||||||
|
include/libxml/SAX2.h
|
||||||
|
include/libxml/schemasInternals.h
|
||||||
|
include/libxml/schematron.h
|
||||||
|
include/libxml/threads.h
|
||||||
|
include/libxml/tree.h
|
||||||
|
include/libxml/uri.h
|
||||||
|
include/libxml/valid.h
|
||||||
|
include/libxml/xinclude.h
|
||||||
|
include/libxml/xlink.h
|
||||||
|
include/libxml/xmlIO.h
|
||||||
|
include/libxml/xmlautomata.h
|
||||||
|
include/libxml/xmlerror.h
|
||||||
|
include/libxml/xmlexports.h
|
||||||
|
include/libxml/xmlmemory.h
|
||||||
|
include/libxml/xmlmodule.h
|
||||||
|
include/libxml/xmlreader.h
|
||||||
|
include/libxml/xmlregexp.h
|
||||||
|
include/libxml/xmlsave.h
|
||||||
|
include/libxml/xmlschemas.h
|
||||||
|
include/libxml/xmlschemastypes.h
|
||||||
|
include/libxml/xmlstring.h
|
||||||
|
include/libxml/xmlunicode.h
|
||||||
|
include/libxml/xmlwriter.h
|
||||||
|
include/libxml/xpath.h
|
||||||
|
include/libxml/xpathInternals.h
|
||||||
|
include/libxml/xpointer.h
|
||||||
|
)
|
||||||
|
|
||||||
|
set(
|
||||||
|
LIBXML2_SRCS
|
||||||
|
buf.c
|
||||||
|
chvalid.c
|
||||||
|
dict.c
|
||||||
|
encoding.c
|
||||||
|
entities.c
|
||||||
|
error.c
|
||||||
|
globals.c
|
||||||
|
hash.c
|
||||||
|
list.c
|
||||||
|
parser.c
|
||||||
|
parserInternals.c
|
||||||
|
SAX2.c
|
||||||
|
threads.c
|
||||||
|
tree.c
|
||||||
|
uri.c
|
||||||
|
valid.c
|
||||||
|
xmlIO.c
|
||||||
|
xmlmemory.c
|
||||||
|
xmlstring.c
|
||||||
|
)
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_C14N)
|
||||||
|
list(APPEND LIBXML2_SRCS c14n.c)
|
||||||
|
endif()
|
||||||
|
if(LIBXML2_WITH_CATALOG)
|
||||||
|
list(APPEND LIBXML2_SRCS catalog.c)
|
||||||
|
endif()
|
||||||
|
if(LIBXML2_WITH_DEBUG)
|
||||||
|
list(APPEND LIBXML2_SRCS debugXML.c)
|
||||||
|
endif()
|
||||||
|
if(LIBXML2_WITH_HTML)
|
||||||
|
list(APPEND LIBXML2_SRCS HTMLparser.c HTMLtree.c)
|
||||||
|
endif()
|
||||||
|
if(LIBXML2_WITH_HTTP)
|
||||||
|
list(APPEND LIBXML2_SRCS nanohttp.c)
|
||||||
|
endif()
|
||||||
|
if(LIBXML2_WITH_MODULES)
|
||||||
|
list(APPEND LIBXML2_SRCS xmlmodule.c)
|
||||||
|
endif()
|
||||||
|
if(LIBXML2_WITH_OUTPUT)
|
||||||
|
list(APPEND LIBXML2_SRCS xmlsave.c)
|
||||||
|
endif()
|
||||||
|
if(LIBXML2_WITH_PATTERN)
|
||||||
|
list(APPEND LIBXML2_SRCS pattern.c)
|
||||||
|
endif()
|
||||||
|
if(LIBXML2_WITH_READER)
|
||||||
|
list(APPEND LIBXML2_SRCS xmlreader.c)
|
||||||
|
endif()
|
||||||
|
if(LIBXML2_WITH_REGEXPS)
|
||||||
|
list(APPEND LIBXML2_SRCS xmlregexp.c)
|
||||||
|
endif()
|
||||||
|
if(LIBXML2_WITH_RELAXNG)
|
||||||
|
list(APPEND LIBXML2_SRCS relaxng.c)
|
||||||
|
endif()
|
||||||
|
if(LIBXML2_WITH_SCHEMAS)
|
||||||
|
list(APPEND LIBXML2_SRCS xmlschemas.c xmlschemastypes.c)
|
||||||
|
endif()
|
||||||
|
if(LIBXML2_WITH_SCHEMATRON)
|
||||||
|
list(APPEND LIBXML2_SRCS schematron.c)
|
||||||
|
endif()
|
||||||
|
if(LIBXML2_WITH_WRITER)
|
||||||
|
list(APPEND LIBXML2_SRCS xmlwriter.c)
|
||||||
|
endif()
|
||||||
|
if(LIBXML2_WITH_XINCLUDE)
|
||||||
|
list(APPEND LIBXML2_SRCS xinclude.c)
|
||||||
|
endif()
|
||||||
|
if(LIBXML2_WITH_XPATH)
|
||||||
|
list(APPEND LIBXML2_SRCS xpath.c)
|
||||||
|
endif()
|
||||||
|
if(LIBXML2_WITH_XPTR)
|
||||||
|
list(APPEND LIBXML2_SRCS xlink.c xpointer.c)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
list(APPEND LIBXML2_SRCS win32/libxml2.rc)
|
||||||
|
file(
|
||||||
|
WRITE
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/rcVersion.h
|
||||||
|
"#define LIBXML_MAJOR_VERSION ${LIBXML_MAJOR_VERSION}\n"
|
||||||
|
"#define LIBXML_MINOR_VERSION ${LIBXML_MINOR_VERSION}\n"
|
||||||
|
"#define LIBXML_MICRO_VERSION ${LIBXML_MICRO_VERSION}\n"
|
||||||
|
"#define LIBXML_DOTTED_VERSION \"${VERSION}\"\n"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(LibXml2 ${LIBXML2_HDRS} ${LIBXML2_SRCS} ${LIBXML2_PRIVATE_HDRS})
|
||||||
|
add_library(LibXml2::LibXml2 ALIAS LibXml2)
|
||||||
|
|
||||||
|
target_include_directories(
|
||||||
|
LibXml2
|
||||||
|
PUBLIC
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||||
|
$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}/libxml2>
|
||||||
|
)
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_MODULES)
|
||||||
|
cmake_push_check_state(RESET)
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_DL_LIBS})
|
||||||
|
check_symbol_exists(dlopen "dlfcn.h" HAVE_DLOPEN)
|
||||||
|
cmake_pop_check_state()
|
||||||
|
if(HAVE_DLOPEN)
|
||||||
|
target_link_libraries(LibXml2 PRIVATE ${CMAKE_DL_LIBS})
|
||||||
|
list(TRANSFORM CMAKE_DL_LIBS PREPEND "-l" REGEX "^[^-]" OUTPUT_VARIABLE MODULE_LIBS)
|
||||||
|
else()
|
||||||
|
check_library_exists(dld shl_load "" HAVE_SHLLOAD)
|
||||||
|
if(HAVE_SHLLOAD)
|
||||||
|
target_link_libraries(LibXml2 PRIVATE dld)
|
||||||
|
set(MODULE_LIBS "-ldld")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(UNIX)
|
||||||
|
target_link_libraries(LibXml2 PRIVATE m)
|
||||||
|
set(LIBM "-lm")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
target_link_libraries(LibXml2 PRIVATE bcrypt)
|
||||||
|
set(CRYPTO_LIBS "-lbcrypt")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_ICONV)
|
||||||
|
target_link_libraries(LibXml2 PRIVATE Iconv::Iconv)
|
||||||
|
if(NOT Iconv_IS_BUILT_IN)
|
||||||
|
set(ICONV_LIBS "-liconv")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_ICU)
|
||||||
|
target_link_libraries(LibXml2 PRIVATE ICU::uc)
|
||||||
|
set(ICU_LDFLAGS "-licuuc")
|
||||||
|
list(APPEND XML_PRIVATE_LIBS "${ICU_LDFLAGS}")
|
||||||
|
pkg_check_modules(ICU_PC IMPORTED_TARGET icu-uc)
|
||||||
|
if(ICU_PC_FOUND)
|
||||||
|
list(APPEND XML_PC_REQUIRES icu-uc)
|
||||||
|
else()
|
||||||
|
list(APPEND XML_PC_LIBS "${ICU_LDFLAGS}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_THREADS)
|
||||||
|
target_link_libraries(LibXml2 PRIVATE Threads::Threads)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_ZLIB)
|
||||||
|
target_link_libraries(LibXml2 PRIVATE ZLIB::ZLIB)
|
||||||
|
set(ZLIB_LDFLAGS "-lz")
|
||||||
|
list(APPEND XML_PRIVATE_LIBS "${ZLIB_LDFLAGS}")
|
||||||
|
pkg_check_modules(ZLIB_PC IMPORTED_TARGET zlib)
|
||||||
|
if(ZLIB_PC_FOUND)
|
||||||
|
list(APPEND XML_PC_REQUIRES zlib)
|
||||||
|
else()
|
||||||
|
list(APPEND XML_PC_LIBS "${ZLIB_LDFLAGS}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
||||||
|
# These compiler flags can break the checks above so keep them here.
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic -Wall -Wextra -Wshadow \
|
||||||
|
-Wpointer-arith -Wcast-align -Wwrite-strings \
|
||||||
|
-Wstrict-prototypes -Wmissing-prototypes \
|
||||||
|
-Wno-long-long -Wno-format-extra-args -Wno-array-bounds")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(LIBXML_MINOR_COMPAT 14)
|
||||||
|
math(EXPR LIBXML_SOVERSION "${LIBXML_MAJOR_VERSION} + ${LIBXML_MINOR_COMPAT}")
|
||||||
|
math(EXPR LIBXML_AGE "${LIBXML_MINOR_VERSION} - ${LIBXML_MINOR_COMPAT}")
|
||||||
|
math(EXPR LIBXML_MACHO_COMPAT "${LIBXML_MAJOR_VERSION} + ${LIBXML_MINOR_VERSION} + 1")
|
||||||
|
set_target_properties(
|
||||||
|
LibXml2
|
||||||
|
PROPERTIES
|
||||||
|
IMPORT_PREFIX lib
|
||||||
|
OUTPUT_NAME xml2
|
||||||
|
POSITION_INDEPENDENT_CODE ON
|
||||||
|
PREFIX lib
|
||||||
|
VERSION "${LIBXML_SOVERSION}.${LIBXML_AGE}.${LIBXML_MICRO_VERSION}"
|
||||||
|
SOVERSION ${LIBXML_SOVERSION}
|
||||||
|
MACHO_COMPATIBILITY_VERSION ${LIBXML_MACHO_COMPAT}
|
||||||
|
MACHO_CURRENT_VERSION "${LIBXML_MACHO_COMPAT}.${LIBXML_MICRO_VERSION}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
if(BUILD_SHARED_LIBS)
|
||||||
|
set_target_properties(
|
||||||
|
LibXml2
|
||||||
|
PROPERTIES
|
||||||
|
DEBUG_POSTFIX d
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
set_target_properties(
|
||||||
|
LibXml2
|
||||||
|
PROPERTIES
|
||||||
|
DEBUG_POSTFIX sd
|
||||||
|
MINSIZEREL_POSTFIX s
|
||||||
|
RELEASE_POSTFIX s
|
||||||
|
RELWITHDEBINFO_POSTFIX s
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(XML_SYSCONFDIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}")
|
||||||
|
|
||||||
|
install(FILES ${LIBXML2_HDRS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libxml2/libxml COMPONENT development)
|
||||||
|
|
||||||
|
install(
|
||||||
|
TARGETS LibXml2
|
||||||
|
EXPORT LibXml2
|
||||||
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT development
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT runtime NAMELINK_COMPONENT development
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
|
||||||
|
)
|
||||||
|
|
||||||
|
if(MSVC AND BUILD_SHARED_LIBS)
|
||||||
|
install(FILES $<TARGET_PDB_FILE:LibXml2> DESTINATION ${CMAKE_INSTALL_BINDIR} CONFIGURATIONS Debug RelWithDebInfo COMPONENT debug)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_PROGRAMS)
|
||||||
|
add_executable(xmllint xmllint.c shell.c lintmain.c)
|
||||||
|
set(PROGRAMS xmllint)
|
||||||
|
if(LIBXML2_WITH_CATALOG AND LIBXML2_WITH_OUTPUT)
|
||||||
|
add_executable(xmlcatalog xmlcatalog.c)
|
||||||
|
list(APPEND PROGRAMS xmlcatalog)
|
||||||
|
endif()
|
||||||
|
foreach(PROGRAM ${PROGRAMS})
|
||||||
|
add_executable(LibXml2::${PROGRAM} ALIAS ${PROGRAM})
|
||||||
|
target_link_libraries(${PROGRAM} LibXml2)
|
||||||
|
if(HAVE_LIBHISTORY)
|
||||||
|
target_link_libraries(${PROGRAM} history)
|
||||||
|
endif()
|
||||||
|
if(HAVE_LIBREADLINE)
|
||||||
|
target_link_libraries(${PROGRAM} readline)
|
||||||
|
endif()
|
||||||
|
install(TARGETS ${PROGRAM} EXPORT LibXml2 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT programs)
|
||||||
|
endforeach()
|
||||||
|
if(LIBXML2_WITH_ZLIB)
|
||||||
|
target_link_libraries(xmllint ZLIB::ZLIB)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_TESTS)
|
||||||
|
enable_testing()
|
||||||
|
set(
|
||||||
|
TESTS
|
||||||
|
runtest
|
||||||
|
runxmlconf
|
||||||
|
runsuite
|
||||||
|
testapi
|
||||||
|
testcatalog
|
||||||
|
testchar
|
||||||
|
testdict
|
||||||
|
testModule
|
||||||
|
testlimits
|
||||||
|
testparser
|
||||||
|
testrecurse
|
||||||
|
)
|
||||||
|
foreach(TEST ${TESTS})
|
||||||
|
add_executable(${TEST} ${TEST}.c)
|
||||||
|
target_link_libraries(${TEST} LibXml2)
|
||||||
|
endforeach()
|
||||||
|
if(Threads_FOUND)
|
||||||
|
foreach(TEST runtest)
|
||||||
|
if(LIBXML2_WITH_ZLIB)
|
||||||
|
target_link_libraries(${TEST} ZLIB::ZLIB Threads::Threads)
|
||||||
|
else()
|
||||||
|
target_link_libraries(${TEST} Threads::Threads)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
add_test(NAME runtest COMMAND runtest --out ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
add_test(NAME runsuite COMMAND runsuite WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/xmlconf/xmlconf.xml)
|
||||||
|
add_test(NAME runxmlconf COMMAND runxmlconf WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
endif()
|
||||||
|
add_test(NAME testapi COMMAND testapi)
|
||||||
|
add_test(NAME testcatalog COMMAND testcatalog)
|
||||||
|
add_test(NAME testchar COMMAND testchar)
|
||||||
|
add_test(NAME testdict COMMAND testdict)
|
||||||
|
add_test(NAME testparser COMMAND testparser WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
add_test(NAME testrecurse COMMAND testrecurse WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
|
||||||
|
|
||||||
|
function(ADD_SUITE test_dir program)
|
||||||
|
file(GLOB_RECURSE files_to_process CONFIGURE_DEPENDS "./test/${test_dir}/*.script")
|
||||||
|
|
||||||
|
foreach(file_path ${files_to_process})
|
||||||
|
file(RELATIVE_PATH file_relative "${CMAKE_CURRENT_SOURCE_DIR}" "${file_path}")
|
||||||
|
get_filename_component(dir_path ${file_relative} DIRECTORY)
|
||||||
|
get_filename_component(base_name ${file_relative} NAME_WE)
|
||||||
|
get_filename_component(extension ${file_relative} EXT)
|
||||||
|
|
||||||
|
set(actual_stdout "${CMAKE_CURRENT_BINARY_DIR}/result/${test_dir}/${base_name}")
|
||||||
|
set(actual_stderr "${CMAKE_CURRENT_BINARY_DIR}/result/${test_dir}/${base_name}.err")
|
||||||
|
set(expected_stdout "${CMAKE_CURRENT_SOURCE_DIR}/result/${test_dir}/${base_name}")
|
||||||
|
set(expected_stderr "${CMAKE_CURRENT_SOURCE_DIR}/result/${test_dir}/${base_name}.err")
|
||||||
|
|
||||||
|
set(xml_path "${CMAKE_CURRENT_SOURCE_DIR}/${dir_path}/${base_name}.xml")
|
||||||
|
set(sgml_path "${CMAKE_CURRENT_SOURCE_DIR}/${dir_path}/${base_name}.sgml")
|
||||||
|
|
||||||
|
if(EXISTS "${xml_path}")
|
||||||
|
set(input_file "./${dir_path}/${base_name}.xml")
|
||||||
|
elseif(EXISTS "${sgml_path}")
|
||||||
|
set(input_file "./${dir_path}/${base_name}.sgml")
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "Neither XML nor SGML exists for: ${dir_path}/${base_name}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_test(
|
||||||
|
NAME ${test_dir}_${base_name}
|
||||||
|
COMMAND ${CMAKE_COMMAND}
|
||||||
|
-DPROG=$<TARGET_FILE:${program}>
|
||||||
|
-DSTDIN=./${dir_path}/${base_name}.script
|
||||||
|
-DXML=${input_file}
|
||||||
|
-DSTDOUT=${actual_stdout}
|
||||||
|
-DSTDERR=${actual_stderr}
|
||||||
|
-DEXPECTED_STDOUT=${expected_stdout}
|
||||||
|
-DEXPECTED_STDERR=${expected_stderr}
|
||||||
|
-DWORKDIR=${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
-P ${CMAKE_CURRENT_SOURCE_DIR}/run_and_diff.cmake
|
||||||
|
)
|
||||||
|
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_PROGRAMS)
|
||||||
|
add_suite("scripts" xmllint)
|
||||||
|
add_suite("catalogs" xmlcatalog)
|
||||||
|
|
||||||
|
add_test(
|
||||||
|
NAME catalog_add_del
|
||||||
|
COMMAND ${CMAKE_COMMAND}
|
||||||
|
-DXMLCAT=$<TARGET_FILE:xmlcatalog>
|
||||||
|
-DEXPECTED_FULL=${CMAKE_CURRENT_SOURCE_DIR}/result/catalogs/mycatalog.full
|
||||||
|
-DEXPECTED_EMPTY=${CMAKE_CURRENT_SOURCE_DIR}/result/catalogs/mycatalog.empty
|
||||||
|
-P ${CMAKE_CURRENT_SOURCE_DIR}/test_xmlcatalog_add_del.cmake
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_DOCS OR LIBXML2_WITH_PYTHON)
|
||||||
|
set(DOXYFILE ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile)
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT doc/html doc/xml
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E env
|
||||||
|
SOURCE_ROOT=${CMAKE_CURRENT_SOURCE_DIR}/
|
||||||
|
BUILD_ROOT=${CMAKE_CURRENT_BINARY_DIR}/
|
||||||
|
doxygen -q ${DOXYFILE}
|
||||||
|
MAIN_DEPENDENCY ${DOXYFILE}
|
||||||
|
DEPENDS ${LIBXML2_HDRS} ${LIBXML2_SRCS}
|
||||||
|
)
|
||||||
|
add_custom_target(Doxygen ALL DEPENDS doc/html doc/xml)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_PYTHON)
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT
|
||||||
|
libxml2-py.c
|
||||||
|
libxml2-py.h
|
||||||
|
libxml2.py
|
||||||
|
COMMAND
|
||||||
|
${Python3_EXECUTABLE}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/python/generator.py
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
DEPENDS
|
||||||
|
python/generator.py
|
||||||
|
Doxygen
|
||||||
|
)
|
||||||
|
|
||||||
|
Python3_add_library(
|
||||||
|
LibXml2Mod MODULE WITH_SOABI
|
||||||
|
libxml2-py.c
|
||||||
|
libxml2-py.h
|
||||||
|
python/libxml.c
|
||||||
|
python/libxml_wrap.h
|
||||||
|
python/types.c
|
||||||
|
)
|
||||||
|
target_include_directories(
|
||||||
|
LibXml2Mod
|
||||||
|
PRIVATE
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/python>
|
||||||
|
)
|
||||||
|
target_link_libraries(LibXml2Mod PRIVATE LibXml2)
|
||||||
|
set_target_properties(
|
||||||
|
LibXml2Mod
|
||||||
|
PROPERTIES
|
||||||
|
IMPORT_PREFIX lib
|
||||||
|
OUTPUT_NAME xml2mod
|
||||||
|
PREFIX lib
|
||||||
|
)
|
||||||
|
install(
|
||||||
|
TARGETS LibXml2Mod
|
||||||
|
ARCHIVE DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT development
|
||||||
|
LIBRARY DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT runtime NAMELINK_COMPONENT development
|
||||||
|
RUNTIME DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT runtime
|
||||||
|
)
|
||||||
|
if(MSVC AND BUILD_SHARED_LIBS)
|
||||||
|
install(FILES $<TARGET_PDB_FILE:LibXml2Mod> DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} CONFIGURATIONS Debug RelWithDebInfo COMPONENT debug)
|
||||||
|
endif()
|
||||||
|
install(FILES python/drv_libxml2.py DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT runtime)
|
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml2.py DESTINATION ${LIBXML2_PYTHON_INSTALL_DIR} COMPONENT runtime)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (LIBXML2_WITH_DOCS)
|
||||||
|
set(MAN_PAGES doc/xml2-config.1)
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_PROGRAMS)
|
||||||
|
set(PROGNAMES xmllint)
|
||||||
|
if(LIBXML2_WITH_CATALOG AND LIBXML2_WITH_OUTPUT)
|
||||||
|
list(APPEND PROGNAMES xmlcatalog)
|
||||||
|
endif()
|
||||||
|
foreach(PROG IN ITEMS ${PROGNAMES})
|
||||||
|
set(XML_SRC ${CMAKE_CURRENT_SOURCE_DIR}/doc/${PROG}.xml)
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${PROG}.1
|
||||||
|
COMMAND xsltproc
|
||||||
|
--nonet --novalid
|
||||||
|
--param man.output.quietly 1
|
||||||
|
-o ${PROG}.1
|
||||||
|
http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl
|
||||||
|
${XML_SRC}
|
||||||
|
MAIN_DEPENDENCY ${XML_SRC}
|
||||||
|
)
|
||||||
|
list(APPEND MAN_PAGES ${CMAKE_CURRENT_BINARY_DIR}/${PROG}.1)
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${PROG}.html
|
||||||
|
COMMAND xsltproc
|
||||||
|
--nonet --novalid
|
||||||
|
-o ${PROG}.html
|
||||||
|
http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl
|
||||||
|
${XML_SRC}
|
||||||
|
MAIN_DEPENDENCY ${XML_SRC}
|
||||||
|
)
|
||||||
|
list(APPEND HTML_PAGES ${CMAKE_CURRENT_BINARY_DIR}/${PROG}.html)
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
add_custom_target(DocBook ALL DEPENDS ${MAN_PAGES} ${HTML_PAGES})
|
||||||
|
|
||||||
|
install(
|
||||||
|
FILES ${HTML_PAGES}
|
||||||
|
DESTINATION ${CMAKE_INSTALL_DOCDIR}
|
||||||
|
COMPONENT documentation
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
install(
|
||||||
|
FILES ${MAN_PAGES}
|
||||||
|
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1
|
||||||
|
COMPONENT documentation
|
||||||
|
)
|
||||||
|
install(
|
||||||
|
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc/html
|
||||||
|
DESTINATION ${CMAKE_INSTALL_DOCDIR}
|
||||||
|
COMPONENT documentation
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
configure_package_config_file(
|
||||||
|
libxml2-config.cmake.cmake.in libxml2-config.cmake
|
||||||
|
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxml2
|
||||||
|
)
|
||||||
|
|
||||||
|
install(
|
||||||
|
FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml2-config.cmake
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxml2
|
||||||
|
COMPONENT development
|
||||||
|
)
|
||||||
|
|
||||||
|
write_basic_package_version_file(
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/libxml2-config-version.cmake
|
||||||
|
VERSION ${PROJECT_VERSION}
|
||||||
|
COMPATIBILITY SameMajorVersion
|
||||||
|
)
|
||||||
|
|
||||||
|
install(
|
||||||
|
FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml2-config-version.cmake
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxml2
|
||||||
|
COMPONENT development
|
||||||
|
)
|
||||||
|
|
||||||
|
install(
|
||||||
|
EXPORT LibXml2
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxml2
|
||||||
|
NAMESPACE LibXml2::
|
||||||
|
FILE libxml2-export.cmake
|
||||||
|
COMPONENT development
|
||||||
|
)
|
||||||
|
|
||||||
|
configure_file(config.h.cmake.in config.h)
|
||||||
|
configure_file(include/libxml/xmlversion.h.in libxml/xmlversion.h)
|
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml/xmlversion.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libxml2/libxml COMPONENT development)
|
||||||
|
|
||||||
|
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
FILES ${LIBXML2_SRCS} ${LIBXML2_HDRS} ${LIBXML2_PRIVATE_HDRS})
|
||||||
|
|
||||||
|
if(LIBXML2_WITH_PYTHON)
|
||||||
|
set(prefix "${CMAKE_INSTALL_PREFIX}")
|
||||||
|
configure_file(python/setup.py.in setup.py @ONLY)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(NON_PC_LIBS "${THREAD_LIBS} ${ICONV_LIBS} ${LIBM} ${WINSOCK_LIBS} ${CRYPTO_LIBS} ${MODULE_LIBS}")
|
||||||
|
list(APPEND XML_PC_LIBS "${NON_PC_LIBS}")
|
||||||
|
list(APPEND XML_PRIVATE_LIBS "${NON_PC_LIBS}")
|
||||||
|
list(REMOVE_DUPLICATES XML_PC_LIBS)
|
||||||
|
list(REMOVE_DUPLICATES XML_PRIVATE_LIBS)
|
||||||
|
|
||||||
|
list(JOIN XML_PC_REQUIRES " " XML_PC_REQUIRES)
|
||||||
|
list(JOIN XML_PC_LIBS " " XML_PC_LIBS)
|
||||||
|
list(JOIN XML_PRIVATE_LIBS " " XML_PRIVATE_LIBS)
|
||||||
|
|
||||||
|
set(XML_INCLUDEDIR "-I\${includedir}/libxml2")
|
||||||
|
set(XML_LIBDIR "-L\${libdir}")
|
||||||
|
set(XML_LIBS "-lxml2")
|
||||||
|
|
||||||
|
if(BUILD_SHARED_LIBS)
|
||||||
|
set(XML_PC_PRIVATE ".private")
|
||||||
|
set(XML_PC_LIBS_PRIVATE "
|
||||||
|
Libs.private:")
|
||||||
|
else()
|
||||||
|
set(XML_PRIVATE_LIBS_NO_SHARED "${XML_PRIVATE_LIBS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
set(XML_STATIC_CFLAGS "-DLIBXML_STATIC")
|
||||||
|
if (BUILD_SHARED_LIBS)
|
||||||
|
set(XML_PC_CFLAGS_PRIVATE "
|
||||||
|
Cflags.private:")
|
||||||
|
else()
|
||||||
|
target_compile_definitions(LibXml2 PUBLIC LIBXML_STATIC)
|
||||||
|
set(XML_CFLAGS "${XML_STATIC_CFLAGS}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
file(RELATIVE_PATH PACKAGE_RELATIVE_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/pkgconfig" "${CMAKE_INSTALL_PREFIX}")
|
||||||
|
string(REGEX REPLACE "/$" "" PACKAGE_RELATIVE_PATH "${PACKAGE_RELATIVE_PATH}")
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
set(prefix "\${pcfiledir}/${PACKAGE_RELATIVE_PATH}")
|
||||||
|
else()
|
||||||
|
set(prefix "${CMAKE_INSTALL_PREFIX}")
|
||||||
|
endif()
|
||||||
|
set(exec_prefix "\${prefix}")
|
||||||
|
set(libdir "\${prefix}/${CMAKE_INSTALL_LIBDIR}")
|
||||||
|
set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
|
||||||
|
configure_file(libxml-2.0.pc.in libxml-2.0.pc @ONLY)
|
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libxml-2.0.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig COMPONENT development)
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
set(prefix "\$(cd \"\$(dirname \"\$0\")\"; pwd -P)/..")
|
||||||
|
endif()
|
||||||
|
configure_file(xml2-config.in xml2-config @ONLY)
|
||||||
|
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/xml2-config DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT development)
|
||||||
|
|
||||||
|
set(XML_INCLUDEDIR "-I${CMAKE_INSTALL_FULL_INCLUDEDIR}/libxml2")
|
||||||
|
set(XML_LIBDIR "-L${CMAKE_INSTALL_FULL_LIBDIR}")
|
||||||
|
|
||||||
|
set(CPACK_COMPONENT_DEVELOPMENT_DEPENDS runtime)
|
||||||
|
set(CPACK_COMPONENT_PROGRAMS_DEPENDS runtime)
|
||||||
|
set(CPACK_DEB_COMPONENT_INSTALL ON)
|
||||||
|
set(CPACK_DEBIAN_DEVELOPMENT_PACKAGE_DEPENDS "${PACKAGE_TARNAME}")
|
||||||
|
set(CPACK_DEBIAN_DEVELOPMENT_PACKAGE_NAME "${PACKAGE_TARNAME}-dev")
|
||||||
|
set(CPACK_DEBIAN_DEVELOPMENT_PACKAGE_SECTION "libdevel")
|
||||||
|
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${PACKAGE_URL})
|
||||||
|
set(CPACK_DEBIAN_PACKAGE_NAME ${PACKAGE_TARNAME})
|
||||||
|
set(CPACK_DEBIAN_PACKAGE_SECTION "devel")
|
||||||
|
set(CPACK_DEBIAN_PROGRAMS_PACKAGE_DEPENDS "${PACKAGE_TARNAME}")
|
||||||
|
set(CPACK_DEBIAN_PROGRAMS_PACKAGE_NAME "${PACKAGE_TARNAME}-utils")
|
||||||
|
set(CPACK_DEBIAN_PROGRAMS_PACKAGE_SECTION "utils")
|
||||||
|
set(CPACK_DEBIAN_RUNTIME_PACKAGE_NAME ${PACKAGE_TARNAME})
|
||||||
|
set(CPACK_DEBIAN_RUNTIME_PACKAGE_RECOMMENDS "${PACKAGE_TARNAME}-utils")
|
||||||
|
set(CPACK_DEBIAN_RUNTIME_PACKAGE_SECTION "libs")
|
||||||
|
set(CPACK_NSIS_PACKAGE_NAME ${PACKAGE_STRING})
|
||||||
|
set(CPACK_NSIS_URL_INFO_ABOUT ${PACKAGE_URL})
|
||||||
|
set(CPACK_PACKAGE_DISPLAY_NAME ${PACKAGE_STRING})
|
||||||
|
set(CPACK_PACKAGE_INSTALL_DIRECTORY "${PACKAGE_TARNAME}-${PACKAGE_VERSION}")
|
||||||
|
set(CPACK_PACKAGE_NAME ${PACKAGE_TARNAME})
|
||||||
|
set(CPACK_PACKAGE_VERSION ${PACKAGE_VERSION})
|
||||||
|
set(CPACK_PACKAGE_VERSION_MAJOR ${LIBXML_MAJOR_VERSION})
|
||||||
|
set(CPACK_PACKAGE_VERSION_MINOR ${LIBXML_MINOR_VERSION})
|
||||||
|
set(CPACK_PACKAGE_VERSION_PATCH ${LIBXML_MICRO_VERSION})
|
||||||
|
set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/Copyright)
|
||||||
|
set(CPACK_RPM_COMPONENT_INSTALL ON)
|
||||||
|
set(CPACK_RPM_development_PACKAGE_NAME "${PACKAGE_NAME}-devel")
|
||||||
|
set(CPACK_RPM_development_PACKAGE_REQUIRES "${PACKAGE_NAME}")
|
||||||
|
set(CPACK_RPM_PACKAGE_GROUP "Development/Libraries")
|
||||||
|
set(CPACK_RPM_PACKAGE_NAME ${PACKAGE_TARNAME})
|
||||||
|
set(CPACK_RPM_PACKAGE_URL ${PACKAGE_URL})
|
||||||
|
set(CPACK_RPM_programs_PACKAGE_NAME "${PACKAGE_NAME}-utils")
|
||||||
|
set(CPACK_RPM_programs_PACKAGE_REQUIRES "${PACKAGE_NAME}")
|
||||||
|
set(CPACK_RPM_runtime_PACKAGE_NAME "${PACKAGE_NAME}")
|
||||||
|
set(CPACK_RPM_runtime_PACKAGE_SUGGESTS "${PACKAGE_NAME}-utils")
|
||||||
|
|
||||||
|
include(CPack)
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
Except where otherwise noted in the source code (e.g. the files dict.c and
|
||||||
|
list.c, which are covered by a similar licence but with different Copyright
|
||||||
|
notices) all the files are:
|
||||||
|
|
||||||
|
Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved.
|
||||||
|
Copyright (C) The Libxml2 Contributors.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is fur-
|
||||||
|
nished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
|
||||||
|
NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
File diff suppressed because it is too large
Load Diff
+1314
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,130 @@
|
|||||||
|
# Maintainer's Guide
|
||||||
|
|
||||||
|
## Working with the test suite
|
||||||
|
|
||||||
|
Most of the tests are contained in the `runtest` executable which
|
||||||
|
generally reads test cases from the `test` directory and compares output
|
||||||
|
to files in the `result` directory.
|
||||||
|
|
||||||
|
You can simply add new test cases and run `runtest -u` to update the
|
||||||
|
results. If you debug test failures, it's also useful to execute
|
||||||
|
`runtest -u` and then `git diff result` to get a diff between actual and
|
||||||
|
expected results. You can restore the original results by running
|
||||||
|
`git restore result` and `git clean -xd result`.
|
||||||
|
|
||||||
|
## Generated files
|
||||||
|
|
||||||
|
Some source code is generated with Python scripts in the `tools`
|
||||||
|
directory.
|
||||||
|
|
||||||
|
- `tools/genChRanges.py` generates code to handle character ranges
|
||||||
|
from chvalid.def:
|
||||||
|
- `chvalid.c`
|
||||||
|
- `include/libxml/chvalid.h`
|
||||||
|
|
||||||
|
- `tools/genEscape prints lookup tables for serialization.
|
||||||
|
|
||||||
|
- `tools/genHtml5LibTests.py` creates test cases and expected results
|
||||||
|
from the html5lib test suite:
|
||||||
|
- `test/html-tokenizer`
|
||||||
|
- `result/html-tokenizer`
|
||||||
|
|
||||||
|
- `tools/genHtmlEnt.py` prints lookup tables for HTML5 named character
|
||||||
|
references (predefined entities):
|
||||||
|
- `html5ent.inc`
|
||||||
|
|
||||||
|
- `tools/gentest.py` generates test code using the Doxygen XML output:
|
||||||
|
- `testapi.c`
|
||||||
|
|
||||||
|
- `tools/genUnicode.py` generates code to handle Unicode ranges
|
||||||
|
from Unicode data files:
|
||||||
|
- `xmlunicode.c`
|
||||||
|
|
||||||
|
## Making a release
|
||||||
|
|
||||||
|
### Update the NEWS file
|
||||||
|
|
||||||
|
You can get started by running
|
||||||
|
|
||||||
|
git log --format='- %s (%an)' [previous-release-tag]..
|
||||||
|
|
||||||
|
### Bump the version number
|
||||||
|
|
||||||
|
Update the version number in `VERSION` if you haven't done so already.
|
||||||
|
|
||||||
|
### Commit and verify tarball
|
||||||
|
|
||||||
|
Release tarballs are generated with a CI job and the `.gitlab-ci/dist.sh`
|
||||||
|
script. Push the release commit and inspect the tarball artifact generated
|
||||||
|
by Gitlab CI.
|
||||||
|
|
||||||
|
### Tag the release
|
||||||
|
|
||||||
|
Create an annotated tag and push it:
|
||||||
|
|
||||||
|
git tag -a [version] -m 'Release [version]'
|
||||||
|
git push origin [version]
|
||||||
|
|
||||||
|
This will upload the release to the downloads server using the GNOME
|
||||||
|
Release Service. For more details, see
|
||||||
|
<https://handbook.gnome.org/maintainers/release-pipeline.html>
|
||||||
|
|
||||||
|
### Create a GitLab release
|
||||||
|
|
||||||
|
Create or update a GitLab release on
|
||||||
|
<https://gitlab.gnome.org/GNOME/libxml2/-/releases>.
|
||||||
|
|
||||||
|
### Announce the release
|
||||||
|
|
||||||
|
Announce the release on https://discourse.gnome.org under topics 'libxml2'
|
||||||
|
and 'announcements'.
|
||||||
|
|
||||||
|
## Removing public API functions
|
||||||
|
|
||||||
|
General process to remove public API functions (or variables):
|
||||||
|
|
||||||
|
- Make sure that there's a reasonable alternative.
|
||||||
|
- Mark the function as deprecated in the documentation and mention
|
||||||
|
alternatives.
|
||||||
|
- Mark the function as XML_DEPRECATED in the header files.
|
||||||
|
- For whole modules: disable the module by default and only enable
|
||||||
|
it in "legacy mode".
|
||||||
|
- Remove the function body and make the function return an error code
|
||||||
|
or a no-op. Make sure that the symbol is kept and exported. This
|
||||||
|
should only be done after allowing users enough time to adjust.
|
||||||
|
- At the next ABI bump, remove the symbol completely.
|
||||||
|
|
||||||
|
You can wait for the next feature release between some of the steps to
|
||||||
|
make the process more gradual.
|
||||||
|
|
||||||
|
## Breaking the ABI
|
||||||
|
|
||||||
|
Unfortunately, libxml2 exposes many internal structs which makes some
|
||||||
|
beneficial changes impossible without breaking the ABI.
|
||||||
|
|
||||||
|
The following changes are allowed (after careful consideration):
|
||||||
|
|
||||||
|
- Appending members to structs which client code should never allocate
|
||||||
|
directly. A notable example is xmlParserCtxt. Other structs like
|
||||||
|
xmlError are allocated directly by client code and must not be changed.
|
||||||
|
|
||||||
|
- Making a void function return a value.
|
||||||
|
|
||||||
|
- Making functions accept const pointers unless it's a typedef for a
|
||||||
|
callback.
|
||||||
|
|
||||||
|
- Changing signedness of struct members or function arguments.
|
||||||
|
|
||||||
|
## Updating the CI Docker image
|
||||||
|
|
||||||
|
Note that the CI image is used for libxslt as well. First create a
|
||||||
|
GitLab access token with maintainer role and `read_registry` and
|
||||||
|
`write_registry` permissions. Then run the following commands with the
|
||||||
|
Dockerfile in the .gitlab-ci directory:
|
||||||
|
|
||||||
|
docker login -u <username> -p <access_token> \
|
||||||
|
registry.gitlab.gnome.org
|
||||||
|
docker build -t registry.gitlab.gnome.org/gnome/libxml2 - \
|
||||||
|
< .gitlab-ci/Dockerfile
|
||||||
|
docker push registry.gitlab.gnome.org/gnome/libxml2
|
||||||
|
|
||||||
@@ -0,0 +1,234 @@
|
|||||||
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
|
SUBDIRS = include . example
|
||||||
|
if WITH_DOXYGEN
|
||||||
|
SUBDIRS += doc
|
||||||
|
endif
|
||||||
|
if WITH_PYTHON
|
||||||
|
SUBDIRS += python
|
||||||
|
endif
|
||||||
|
if WITH_GLOB
|
||||||
|
SUBDIRS += fuzz
|
||||||
|
endif
|
||||||
|
|
||||||
|
DIST_SUBDIRS = include . doc example fuzz python
|
||||||
|
|
||||||
|
AM_CPPFLAGS = -I$(builddir)/include -I$(srcdir)/include
|
||||||
|
|
||||||
|
check_PROGRAMS = \
|
||||||
|
runsuite \
|
||||||
|
runtest \
|
||||||
|
runxmlconf \
|
||||||
|
testModule \
|
||||||
|
testapi \
|
||||||
|
testcatalog \
|
||||||
|
testchar \
|
||||||
|
testdict \
|
||||||
|
testlimits \
|
||||||
|
testparser \
|
||||||
|
testrecurse
|
||||||
|
|
||||||
|
bin_PROGRAMS = xmllint
|
||||||
|
|
||||||
|
bin_SCRIPTS = xml2-config
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libxml2.la
|
||||||
|
libxml2_la_CFLAGS = $(AM_CFLAGS) $(XML_PRIVATE_CFLAGS)
|
||||||
|
libxml2_la_LIBADD = $(XML_PRIVATE_LIBS)
|
||||||
|
|
||||||
|
libxml2_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined \
|
||||||
|
-version-info $(LIBXML_VERSION_INFO)
|
||||||
|
|
||||||
|
libxml2_la_SOURCES = buf.c chvalid.c dict.c entities.c encoding.c error.c \
|
||||||
|
globals.c hash.c list.c parser.c parserInternals.c \
|
||||||
|
SAX2.c threads.c tree.c uri.c valid.c xmlIO.c \
|
||||||
|
xmlmemory.c xmlstring.c
|
||||||
|
if WITH_C14N_SOURCES
|
||||||
|
libxml2_la_SOURCES += c14n.c
|
||||||
|
endif
|
||||||
|
if WITH_CATALOG_SOURCES
|
||||||
|
if WITH_OUTPUT_SOURCES
|
||||||
|
bin_PROGRAMS += xmlcatalog
|
||||||
|
|
||||||
|
xmlcatalog_SOURCES = xmlcatalog.c
|
||||||
|
xmlcatalog_CFLAGS = $(AM_CFLAGS) $(RDL_CFLAGS)
|
||||||
|
xmlcatalog_DEPENDENCIES = $(DEPS)
|
||||||
|
xmlcatalog_LDADD = $(RDL_LIBS) $(LDADDS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
libxml2_la_SOURCES += catalog.c
|
||||||
|
endif
|
||||||
|
if WITH_DEBUG_SOURCES
|
||||||
|
libxml2_la_SOURCES += debugXML.c
|
||||||
|
endif
|
||||||
|
if WITH_HTML_SOURCES
|
||||||
|
libxml2_la_SOURCES += HTMLparser.c HTMLtree.c
|
||||||
|
endif
|
||||||
|
if WITH_HTTP_SOURCES
|
||||||
|
libxml2_la_SOURCES += nanohttp.c
|
||||||
|
endif
|
||||||
|
if WITH_MODULES_SOURCES
|
||||||
|
libxml2_la_SOURCES += xmlmodule.c
|
||||||
|
endif
|
||||||
|
if WITH_OUTPUT_SOURCES
|
||||||
|
libxml2_la_SOURCES += xmlsave.c
|
||||||
|
endif
|
||||||
|
if WITH_PATTERN_SOURCES
|
||||||
|
libxml2_la_SOURCES += pattern.c
|
||||||
|
endif
|
||||||
|
if WITH_READER_SOURCES
|
||||||
|
libxml2_la_SOURCES += xmlreader.c
|
||||||
|
endif
|
||||||
|
if WITH_REGEXPS_SOURCES
|
||||||
|
libxml2_la_SOURCES += xmlregexp.c
|
||||||
|
endif
|
||||||
|
if WITH_RELAXNG_SOURCES
|
||||||
|
libxml2_la_SOURCES += relaxng.c
|
||||||
|
endif
|
||||||
|
if WITH_SCHEMAS_SOURCES
|
||||||
|
libxml2_la_SOURCES += xmlschemas.c xmlschemastypes.c
|
||||||
|
endif
|
||||||
|
if WITH_SCHEMATRON_SOURCES
|
||||||
|
libxml2_la_SOURCES += schematron.c
|
||||||
|
endif
|
||||||
|
if WITH_WRITER_SOURCES
|
||||||
|
libxml2_la_SOURCES += xmlwriter.c
|
||||||
|
endif
|
||||||
|
if WITH_XINCLUDE_SOURCES
|
||||||
|
libxml2_la_SOURCES += xinclude.c
|
||||||
|
endif
|
||||||
|
if WITH_XPATH_SOURCES
|
||||||
|
libxml2_la_SOURCES += xpath.c
|
||||||
|
endif
|
||||||
|
if WITH_XPTR_SOURCES
|
||||||
|
libxml2_la_SOURCES += xlink.c xpointer.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
DEPS = libxml2.la
|
||||||
|
LDADDS = libxml2.la
|
||||||
|
|
||||||
|
runtest_SOURCES=runtest.c
|
||||||
|
runtest_DEPENDENCIES = $(DEPS)
|
||||||
|
runtest_LDADD= $(THREAD_LIBS) $(Z_LIBS) $(LDADDS)
|
||||||
|
|
||||||
|
testrecurse_SOURCES=testrecurse.c
|
||||||
|
testrecurse_DEPENDENCIES = $(DEPS)
|
||||||
|
testrecurse_LDADD= $(LDADDS)
|
||||||
|
|
||||||
|
testlimits_SOURCES=testlimits.c
|
||||||
|
testlimits_DEPENDENCIES = $(DEPS)
|
||||||
|
testlimits_LDADD= $(LDADDS)
|
||||||
|
|
||||||
|
testcatalog_SOURCES=testcatalog.c
|
||||||
|
testcatalog_DEPENDENCIES = $(DEPS)
|
||||||
|
testcatalog_LDADD= $(LDADDS)
|
||||||
|
|
||||||
|
testchar_SOURCES=testchar.c
|
||||||
|
testchar_DEPENDENCIES = $(DEPS)
|
||||||
|
testchar_LDADD= $(LDADDS)
|
||||||
|
|
||||||
|
testdict_SOURCES=testdict.c
|
||||||
|
testdict_DEPENDENCIES = $(DEPS)
|
||||||
|
testdict_LDADD= $(LDADDS)
|
||||||
|
|
||||||
|
testparser_SOURCES=testparser.c
|
||||||
|
testparser_DEPENDENCIES = $(DEPS)
|
||||||
|
testparser_LDADD= $(LDADDS)
|
||||||
|
|
||||||
|
runsuite_SOURCES=runsuite.c
|
||||||
|
runsuite_DEPENDENCIES = $(DEPS)
|
||||||
|
runsuite_LDADD= $(LDADDS)
|
||||||
|
|
||||||
|
xmllint_SOURCES = xmllint.c shell.c lintmain.c
|
||||||
|
xmllint_CFLAGS = $(AM_CFLAGS) $(RDL_CFLAGS) $(Z_CFLAGS)
|
||||||
|
xmllint_DEPENDENCIES = $(DEPS)
|
||||||
|
xmllint_LDADD = $(RDL_LIBS) $(Z_LIBS) $(LDADDS)
|
||||||
|
|
||||||
|
testModule_SOURCES=testModule.c
|
||||||
|
testModule_DEPENDENCIES = $(DEPS)
|
||||||
|
testModule_LDADD= $(LDADDS)
|
||||||
|
|
||||||
|
check_LTLIBRARIES = testdso.la
|
||||||
|
testdso_la_SOURCES = testdso.c
|
||||||
|
testdso_la_LDFLAGS = $(AM_LDFLAGS) \
|
||||||
|
-module -no-undefined -avoid-version -rpath $(libdir)
|
||||||
|
|
||||||
|
rebuild_testapi:
|
||||||
|
cd $(srcdir) && python3 codegen/genTestApi.py $(abs_builddir)
|
||||||
|
|
||||||
|
testapi_SOURCES=testapi.c
|
||||||
|
testapi_DEPENDENCIES = $(DEPS)
|
||||||
|
testapi_LDADD= $(LDADDS)
|
||||||
|
|
||||||
|
runxmlconf_SOURCES=runxmlconf.c
|
||||||
|
runxmlconf_DEPENDENCIES = $(DEPS)
|
||||||
|
runxmlconf_LDADD= $(LDADDS)
|
||||||
|
|
||||||
|
check-local:
|
||||||
|
[ -d test ] || $(LN_S) $(srcdir)/test .
|
||||||
|
[ -d result ] || $(LN_S) $(srcdir)/result .
|
||||||
|
$(CHECKER) ./runtest$(EXEEXT)
|
||||||
|
$(CHECKER) ./testrecurse$(EXEEXT)
|
||||||
|
$(CHECKER) ./testapi$(EXEEXT)
|
||||||
|
$(CHECKER) ./testcatalog$(EXEEXT)
|
||||||
|
$(CHECKER) ./testchar$(EXEEXT)
|
||||||
|
$(CHECKER) ./testdict$(EXEEXT)
|
||||||
|
$(CHECKER) ./testparser$(EXEEXT)
|
||||||
|
$(CHECKER) ./testModule$(EXEEXT)
|
||||||
|
$(CHECKER) ./runxmlconf$(EXEEXT) -d $(srcdir)/xmlconf
|
||||||
|
$(CHECKER) ./runsuite$(EXEEXT)
|
||||||
|
if WITH_OUTPUT_SOURCES
|
||||||
|
if WITH_DEBUG_SOURCES
|
||||||
|
test/scripts/test.sh ./xmllint$(EXEEXT)
|
||||||
|
endif
|
||||||
|
if WITH_CATALOG_SOURCES
|
||||||
|
ASAN_OPTIONS=detect_leaks=0 test/catalogs/test.sh ./xmlcatalog$(EXEEXT)
|
||||||
|
ASAN_OPTIONS=detect_leaks=0 test/catalogs/test_sgml.sh ./xmlcatalog$(EXEEXT)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Compatibility name of the check target
|
||||||
|
runtests: check
|
||||||
|
|
||||||
|
VALGRIND = valgrind -q --leak-check=full --error-exitcode=1
|
||||||
|
|
||||||
|
check-valgrind valgrind:
|
||||||
|
@echo '## Running the regression tests under Valgrind'
|
||||||
|
@echo '## Go get a cup of coffee it is gonna take a while ...'
|
||||||
|
$(MAKE) check CHECKER="$(LIBTOOL) --mode=execute $(VALGRIND)"
|
||||||
|
|
||||||
|
dist-hook:
|
||||||
|
(cd $(srcdir) ; tar -cf - --exclude .git win32 test result) | (cd $(distdir); tar xf -)
|
||||||
|
|
||||||
|
CLEANFILES = missing.lst runsuite.log runxmlconf.log test.out \
|
||||||
|
*.gcda *.gcno *.res
|
||||||
|
|
||||||
|
EXTRA_DIST = Copyright libxml2-config.cmake.in autogen.sh \
|
||||||
|
libxml.h \
|
||||||
|
codegen/charset.inc \
|
||||||
|
codegen/escape.inc \
|
||||||
|
codegen/genCharset.py \
|
||||||
|
codegen/genEscape.py \
|
||||||
|
codegen/genHtml5Ent.py \
|
||||||
|
codegen/genHtml5LibTests.py \
|
||||||
|
codegen/genRanges.py \
|
||||||
|
codegen/genTestApi.py \
|
||||||
|
codegen/genUnicode.py \
|
||||||
|
codegen/html5ent.inc \
|
||||||
|
codegen/ranges.def \
|
||||||
|
codegen/ranges.inc \
|
||||||
|
codegen/rangetab.py \
|
||||||
|
codegen/unicode.inc \
|
||||||
|
codegen/xmlmod.py \
|
||||||
|
timsort.h \
|
||||||
|
README.zOS README.md \
|
||||||
|
CMakeLists.txt config.h.cmake.in libxml2-config.cmake.cmake.in \
|
||||||
|
meson.build meson_options.txt xml2-config-meson
|
||||||
|
|
||||||
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
|
pkgconfig_DATA = libxml-2.0.pc
|
||||||
|
|
||||||
|
cmakedir = $(libdir)/cmake/libxml2
|
||||||
|
cmake_DATA = libxml2-config.cmake
|
||||||
+5309
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,213 @@
|
|||||||
|
# libxml2
|
||||||
|
|
||||||
|
libxml2 is an XML toolkit implemented in C, originally developed for
|
||||||
|
the GNOME Project.
|
||||||
|
|
||||||
|
Official releases can be downloaded from
|
||||||
|
<https://download.gnome.org/sources/libxml2/>
|
||||||
|
|
||||||
|
The git repository is hosted on GNOME's GitLab server:
|
||||||
|
<https://gitlab.gnome.org/GNOME/libxml2>
|
||||||
|
|
||||||
|
Bugs should be reported at
|
||||||
|
<https://gitlab.gnome.org/GNOME/libxml2/-/issues>.
|
||||||
|
|
||||||
|
Documentation is available at
|
||||||
|
<https://gitlab.gnome.org/GNOME/libxml2/-/wikis>
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This code is released under the MIT License, see the Copyright file.
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
This is open-source software written by hobbyists and maintained by
|
||||||
|
volunteers.
|
||||||
|
|
||||||
|
It's NOT recommended to use this software to process **untrusted data**.
|
||||||
|
There is a lot of ways that a malicious crafted xml could exploit a
|
||||||
|
hidden vulnerability in the software.
|
||||||
|
|
||||||
|
The software is provided "as is", without warranty of any kind,
|
||||||
|
express or implied. Use this software at your own risk.
|
||||||
|
|
||||||
|
To **report security bugs**, you can create a confidential issue with
|
||||||
|
the "security" label. We will review and work on it as a best effort.
|
||||||
|
But remember that this is a community project, maintained by volunteer
|
||||||
|
developers, so if you are concern about any important security bug
|
||||||
|
that's critical for you, feel free to collaborate and provide a patch.
|
||||||
|
|
||||||
|
The main rule is to be kind. Do not pressure developers to fix a CVE
|
||||||
|
or to work on a functionality that you need, because that won't work.
|
||||||
|
This is a community project, developers will work in the issues that
|
||||||
|
they consider interesting and when they want. All contributions are
|
||||||
|
welcome, so if something is important for you, you can always get
|
||||||
|
involved, implement it yourself and be part of the open source
|
||||||
|
community.
|
||||||
|
|
||||||
|
## Build instructions
|
||||||
|
|
||||||
|
libxml2 can be built with GNU Autotools, CMake or meson.
|
||||||
|
|
||||||
|
### Autotools (for POSIX systems like Linux, BSD, macOS)
|
||||||
|
|
||||||
|
If you build from a Git tree, you have to install Autotools and start
|
||||||
|
by generating the configuration files with:
|
||||||
|
|
||||||
|
./autogen.sh [configuration options]
|
||||||
|
|
||||||
|
If you build from a source tarball, extract the archive with:
|
||||||
|
|
||||||
|
tar xf libxml2-xxx.tar.gz
|
||||||
|
cd libxml2-xxx
|
||||||
|
|
||||||
|
Then you can configure and build the library:
|
||||||
|
|
||||||
|
./configure [configuration options]
|
||||||
|
make
|
||||||
|
|
||||||
|
The following options disable or enable code modules and relevant symbols:
|
||||||
|
|
||||||
|
--with-c14n Canonical XML 1.0 support (on)
|
||||||
|
--with-catalog XML Catalogs support (on)
|
||||||
|
--with-debug debugging module (on)
|
||||||
|
--with-docs Build documentation (off)
|
||||||
|
--with-history history support for xmllint shell (off)
|
||||||
|
--with-readline[=DIR] use readline in DIR for shell (off)
|
||||||
|
--with-html HTML parser (on)
|
||||||
|
--with-http ABI compatibility for removed HTTP support (off)
|
||||||
|
--with-iconv[=DIR] iconv support (on)
|
||||||
|
--with-icu ICU support (off)
|
||||||
|
--with-iso8859x ISO-8859-X support if no iconv (on)
|
||||||
|
--with-modules dynamic modules support (on)
|
||||||
|
--with-output serialization support (on)
|
||||||
|
--with-pattern xmlPattern selection interface (on)
|
||||||
|
--with-push push parser interfaces (on)
|
||||||
|
--with-python Python bindings (off)
|
||||||
|
--with-reader xmlReader parsing interface (on)
|
||||||
|
--with-regexps regular expressions support (on)
|
||||||
|
--with-relaxng RELAX NG support (on)
|
||||||
|
--with-sax1 older SAX1 interface (on)
|
||||||
|
--with-schemas XML Schemas 1.0 support (on)
|
||||||
|
--with-schematron Schematron support (off)
|
||||||
|
--with-threads multithreading support (on)
|
||||||
|
--with-thread-alloc per-thread malloc hooks (off)
|
||||||
|
--with-valid DTD validation support (on)
|
||||||
|
--with-winpath Windows path support (on for Windows)
|
||||||
|
--with-writer xmlWriter serialization interface (on)
|
||||||
|
--with-xinclude XInclude 1.0 support (on)
|
||||||
|
--with-xpath XPath 1.0 support (on)
|
||||||
|
--with-xptr XPointer support (on)
|
||||||
|
--with-zlib[=DIR] use libz in DIR (off)
|
||||||
|
|
||||||
|
Other options:
|
||||||
|
|
||||||
|
--prefix=DIR set installation prefix
|
||||||
|
--with-minimum build a minimally sized library (off)
|
||||||
|
--with-legacy maximum ABI compatibility (off)
|
||||||
|
|
||||||
|
Note that by default, no optimization options are used. You have to
|
||||||
|
enable them manually, for example with:
|
||||||
|
|
||||||
|
CFLAGS='-O2 -fno-semantic-interposition' ./configure
|
||||||
|
|
||||||
|
Now you can run the test suite with:
|
||||||
|
|
||||||
|
make check
|
||||||
|
|
||||||
|
Please report test failures to the bug tracker.
|
||||||
|
|
||||||
|
Then you can install the library:
|
||||||
|
|
||||||
|
make install
|
||||||
|
|
||||||
|
At that point you may have to rerun ldconfig or a similar utility to
|
||||||
|
update your list of installed shared libs.
|
||||||
|
|
||||||
|
### CMake (mainly for Windows)
|
||||||
|
|
||||||
|
Example commands:
|
||||||
|
|
||||||
|
cmake -E tar xf libxml2-xxx.tar.xz
|
||||||
|
cmake -S libxml2-xxx -B builddir [options]
|
||||||
|
cmake --build builddir
|
||||||
|
ctest --test-dir builddir
|
||||||
|
cmake --install builddir
|
||||||
|
|
||||||
|
Common CMake options include:
|
||||||
|
|
||||||
|
-D BUILD_SHARED_LIBS=OFF # build static libraries
|
||||||
|
-D CMAKE_BUILD_TYPE=Release # specify build type (single-config)
|
||||||
|
--config Release # specify build type (multi-config)
|
||||||
|
-D CMAKE_INSTALL_PREFIX=/usr/local # specify the install path
|
||||||
|
-D LIBXML2_WITH_ICONV=OFF # disable iconv
|
||||||
|
-D LIBXML2_WITH_ZLIB=ON # enable zlib
|
||||||
|
|
||||||
|
You can also open the libxml source directory with its CMakeLists.txt
|
||||||
|
directly in various IDEs such as CLion, QtCreator, or Visual Studio.
|
||||||
|
|
||||||
|
### Meson
|
||||||
|
|
||||||
|
Example commands:
|
||||||
|
|
||||||
|
meson setup [options] builddir
|
||||||
|
ninja -C builddir
|
||||||
|
meson test -C builddir
|
||||||
|
ninja -C builddir install
|
||||||
|
|
||||||
|
See the `meson_options.txt` file for options. For example:
|
||||||
|
|
||||||
|
-Dprefix=$prefix
|
||||||
|
-Dhistory=enabled
|
||||||
|
-Dschemas=disabled
|
||||||
|
-Dzlib=enabled
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
libxml2 supports POSIX and Windows operating systems.
|
||||||
|
|
||||||
|
The iconv function is required for conversion of character encodings.
|
||||||
|
This function is part of POSIX.1-2001. If your platform doesn't provide
|
||||||
|
iconv, you need an external libiconv library, for example
|
||||||
|
[GNU libiconv](https://www.gnu.org/software/libiconv/). Using
|
||||||
|
[ICU](https://icu.unicode.org/) is also supported but discouraged.
|
||||||
|
|
||||||
|
The xmllint executable uses libreadline and libhistory if enabled.
|
||||||
|
|
||||||
|
### Build requirements
|
||||||
|
|
||||||
|
Besides build system tools, only a C compiler should be required.
|
||||||
|
Reconfiguration of the Autotools build requires the pkg.m4 macro from
|
||||||
|
pkg-config. Building the documentation requires Doxygen, xsltproc and the
|
||||||
|
DocBook 4 XSLT stylesheets. Building the Python bindings requires Doxygen.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
The current version of the code can be found in GNOME's GitLab at
|
||||||
|
<https://gitlab.gnome.org/GNOME/libxml2>. The best way to get involved
|
||||||
|
is by creating issues and merge requests on GitLab.
|
||||||
|
|
||||||
|
All code must conform to C89 and pass the GitLab CI tests. Add regression
|
||||||
|
tests if possible.
|
||||||
|
|
||||||
|
### Strict No LLM / No AI Policy
|
||||||
|
|
||||||
|
No LLMs for issues.
|
||||||
|
|
||||||
|
No LLMs for patches / pull requests.
|
||||||
|
|
||||||
|
No LLMs for comments on the bug tracker, including translation.
|
||||||
|
|
||||||
|
English is encouraged, but not required. You are welcome to post in
|
||||||
|
your native language and rely on others to have their own translation
|
||||||
|
tools of choice to interpret your words.
|
||||||
|
|
||||||
|
## Authors
|
||||||
|
|
||||||
|
- Daniel Veillard
|
||||||
|
- Bjorn Reese
|
||||||
|
- William Brack
|
||||||
|
- Igor Zlatkovic for the Windows port
|
||||||
|
- Aleksey Sanin
|
||||||
|
- Nick Wellnhofer
|
||||||
|
|
||||||
@@ -0,0 +1,212 @@
|
|||||||
|
Notes for compiling on zOS:
|
||||||
|
|
||||||
|
- since testapi.c file is huge (over 52000 lines), it's compilation
|
||||||
|
fails: I skipped the problem by removing all references to testapi in the
|
||||||
|
Makefile.in, but it would be neater if one can build without test files
|
||||||
|
(I didn't find an option in configure...)
|
||||||
|
|
||||||
|
- since the name of files (or qualifier) in PDS are limited to 8 I had to
|
||||||
|
rename xmlschemas.c and xmlschemastypes.c in (resp.) xmlsche.c xmlschet.c
|
||||||
|
(and I had to modify all occurrences of these files accordingly in the
|
||||||
|
rest of the Makefile !!!).
|
||||||
|
|
||||||
|
- in order to copy objects to PDS, I had the cp command at line 860
|
||||||
|
of Makefile.in
|
||||||
|
|
||||||
|
libxml2.la: $(libxml2_la_OBJECTS) $(libxml2_la_DEPENDENCIES)
|
||||||
|
$(AM_V_CCLD)$(libxml2_la_LINK) -rpath $(libdir) $(libxml2_la_OBJECTS) $(libxml2_la_LIBADD) $(LIBS)
|
||||||
|
# Copy objects to PDS
|
||||||
|
@list='$(libxml2_OBJECTS)' ; for p in $$list; do \
|
||||||
|
cp -ACMv $$p "//'<PDS NAME>'"; \
|
||||||
|
done
|
||||||
|
|
||||||
|
with <PDS NAME> stands for the name of my PDS and
|
||||||
|
|
||||||
|
libxml2_OBJECTS = SAX.o entities.o encoding.o error.o \
|
||||||
|
parserInternals.o parser.o tree.o hash.o list.o xmlIO.o \
|
||||||
|
xmlmemory.o uri.o valid.o xlink.o HTMLparser.o \
|
||||||
|
HTMLtree.o debugXML.o xpath.o xpointer.o xinclude.o \
|
||||||
|
nanohttp.o nanoftp.o triostr.o trio.o catalog.o globals.o \
|
||||||
|
threads.o c14n.o xmlstring.o buf.o xmlregexp.o \
|
||||||
|
xmlsche.o xmlschet.o xmlunicode.o \
|
||||||
|
xmlreader.o relaxng.o dict.o SAX2.o \
|
||||||
|
xmlwriter.o legacy.o chvalid.o pattern.o xmlsave.o \
|
||||||
|
xmlmodule.o schematron.o xzlib.o
|
||||||
|
|
||||||
|
In order to handle the support of zOS without breaking the existing
|
||||||
|
Makefile maybe a new option/flag zOs would copy xmlschemas.c and
|
||||||
|
xmlschemastypes.c files and use specifics targets rather than existing
|
||||||
|
ones with the longer names... A variable to handle the PDS name has to
|
||||||
|
be provided also...
|
||||||
|
|
||||||
|
See patch below for set of changes to Makefile.in
|
||||||
|
|
||||||
|
Stéphane Michaut <smichaut@axway.com>
|
||||||
|
July 2017
|
||||||
|
|
||||||
|
|
||||||
|
--- Makefile.in 2017-08-01 08:17:15.000000000 +0200
|
||||||
|
+++ Makefile-new.in 2017-08-01 08:07:26.000000000 +0200
|
||||||
|
@@ -41,7 +41,7 @@
|
||||||
|
testSAX$(EXEEXT) testHTML$(EXEEXT) testXPath$(EXEEXT) \
|
||||||
|
testURI$(EXEEXT) testThreads$(EXEEXT) testC14N$(EXEEXT) \
|
||||||
|
testAutomata$(EXEEXT) testRegexp$(EXEEXT) testReader$(EXEEXT) \
|
||||||
|
- testapi$(EXEEXT) testModule$(EXEEXT) runtest$(EXEEXT) \
|
||||||
|
+ testModule$(EXEEXT) runtest$(EXEEXT) \
|
||||||
|
runsuite$(EXEEXT) testchar$(EXEEXT) testdict$(EXEEXT) \
|
||||||
|
runxmlconf$(EXEEXT) testrecurse$(EXEEXT) testlimits$(EXEEXT)
|
||||||
|
bin_PROGRAMS = xmllint$(EXEEXT) xmlcatalog$(EXEEXT)
|
||||||
|
@@ -106,6 +106,7 @@
|
||||||
|
debugXML.c xpath.c xpointer.c xinclude.c nanohttp.c nanoftp.c \
|
||||||
|
DOCBparser.c catalog.c globals.c threads.c c14n.c xmlstring.c \
|
||||||
|
buf.c xmlregexp.c xmlschemas.c xmlschemastypes.c xmlunicode.c \
|
||||||
|
+ xmlsche.c xmlschet.c \
|
||||||
|
triostr.c trio.c xmlreader.c relaxng.c dict.c SAX2.c \
|
||||||
|
xmlwriter.c legacy.c chvalid.c pattern.c xmlsave.c xmlmodule.c \
|
||||||
|
schematron.c xzlib.c
|
||||||
|
@@ -118,10 +119,24 @@
|
||||||
|
nanohttp.lo nanoftp.lo $(am__objects_1) catalog.lo globals.lo \
|
||||||
|
threads.lo c14n.lo xmlstring.lo buf.lo xmlregexp.lo \
|
||||||
|
xmlschemas.lo xmlschemastypes.lo xmlunicode.lo \
|
||||||
|
+ xmlsche.lo xmlschet.lo \
|
||||||
|
$(am__objects_2) xmlreader.lo relaxng.lo dict.lo SAX2.lo \
|
||||||
|
xmlwriter.lo legacy.lo chvalid.lo pattern.lo xmlsave.lo \
|
||||||
|
xmlmodule.lo schematron.lo xzlib.lo
|
||||||
|
libxml2_la_OBJECTS = $(am_libxml2_la_OBJECTS)
|
||||||
|
+
|
||||||
|
+libxml2_OBJECTS = SAX.o entities.o encoding.o error.o \
|
||||||
|
+ parserInternals.o parser.o tree.o hash.o list.o xmlIO.o \
|
||||||
|
+ xmlmemory.o uri.o valid.o xlink.o HTMLparser.o \
|
||||||
|
+ HTMLtree.o debugXML.o xpath.o xpointer.o xinclude.o \
|
||||||
|
+ nanohttp.o nanoftp.o triostr.o trio.o catalog.o globals.o \
|
||||||
|
+ threads.o c14n.o xmlstring.o buf.o xmlregexp.o \
|
||||||
|
+ xmlschemas.o xmlschemastypes.o xmlunicode.o \
|
||||||
|
+ xmlsche.o xmlschemast.o \
|
||||||
|
+ xmlreader.o relaxng.o dict.o SAX2.o \
|
||||||
|
+ xmlwriter.o legacy.o chvalid.o pattern.o xmlsave.o \
|
||||||
|
+ xmlmodule.o schematron.o xzlib.o
|
||||||
|
+
|
||||||
|
AM_V_lt = $(am__v_lt_$(V))
|
||||||
|
am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
|
||||||
|
am__v_lt_0 = --silent
|
||||||
|
@@ -216,11 +231,6 @@
|
||||||
|
testXPath_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||||
|
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||||
|
$(testXPath_LDFLAGS) $(LDFLAGS) -o $@
|
||||||
|
-am_testapi_OBJECTS = testapi.$(OBJEXT)
|
||||||
|
-testapi_OBJECTS = $(am_testapi_OBJECTS)
|
||||||
|
-testapi_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||||
|
- $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||||
|
- $(testapi_LDFLAGS) $(LDFLAGS) -o $@
|
||||||
|
am_testchar_OBJECTS = testchar.$(OBJEXT)
|
||||||
|
testchar_OBJECTS = $(am_testchar_OBJECTS)
|
||||||
|
testchar_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||||
|
@@ -285,7 +295,7 @@
|
||||||
|
$(testReader_SOURCES) $(testRegexp_SOURCES) \
|
||||||
|
$(testRelax_SOURCES) $(testSAX_SOURCES) $(testSchemas_SOURCES) \
|
||||||
|
$(testThreads_SOURCES) $(testURI_SOURCES) $(testXPath_SOURCES) \
|
||||||
|
- $(testapi_SOURCES) $(testchar_SOURCES) $(testdict_SOURCES) \
|
||||||
|
+ $(testchar_SOURCES) $(testdict_SOURCES) \
|
||||||
|
$(testlimits_SOURCES) $(testrecurse_SOURCES) \
|
||||||
|
$(xmlcatalog_SOURCES) $(xmllint_SOURCES)
|
||||||
|
DIST_SOURCES = $(am__libxml2_la_SOURCES_DIST) $(testdso_la_SOURCES) \
|
||||||
|
@@ -295,7 +305,7 @@
|
||||||
|
$(testReader_SOURCES) $(testRegexp_SOURCES) \
|
||||||
|
$(testRelax_SOURCES) $(testSAX_SOURCES) $(testSchemas_SOURCES) \
|
||||||
|
$(am__testThreads_SOURCES_DIST) $(testURI_SOURCES) \
|
||||||
|
- $(testXPath_SOURCES) $(testapi_SOURCES) $(testchar_SOURCES) \
|
||||||
|
+ $(testXPath_SOURCES) $(testchar_SOURCES) \
|
||||||
|
$(testdict_SOURCES) $(testlimits_SOURCES) \
|
||||||
|
$(testrecurse_SOURCES) $(xmlcatalog_SOURCES) \
|
||||||
|
$(xmllint_SOURCES)
|
||||||
|
@@ -700,11 +710,6 @@
|
||||||
|
noinst_LTLIBRARIES = testdso.la
|
||||||
|
testdso_la_SOURCES = testdso.c
|
||||||
|
testdso_la_LDFLAGS = -module -no-undefined -avoid-version -rpath $(libdir)
|
||||||
|
-BUILT_SOURCES = testapi.c
|
||||||
|
-testapi_SOURCES = testapi.c
|
||||||
|
-testapi_LDFLAGS =
|
||||||
|
-testapi_DEPENDENCIES = $(DEPS)
|
||||||
|
-testapi_LDADD = $(LDADDS)
|
||||||
|
runxmlconf_SOURCES = runxmlconf.c
|
||||||
|
runxmlconf_LDFLAGS =
|
||||||
|
runxmlconf_DEPENDENCIES = $(DEPS)
|
||||||
|
@@ -854,6 +859,12 @@
|
||||||
|
done
|
||||||
|
libxml2.la: $(libxml2_la_OBJECTS) $(libxml2_la_DEPENDENCIES)
|
||||||
|
$(AM_V_CCLD)$(libxml2_la_LINK) -rpath $(libdir) $(libxml2_la_OBJECTS) $(libxml2_la_LIBADD) $(LIBS)
|
||||||
|
+ # Copie des obj
|
||||||
|
+ @list='$(libxml2_OBJECTS)' ; for p in $$list; do \
|
||||||
|
+ echo "copy to PDS: $$p"; \
|
||||||
|
+ cp -ACMv $$p "//'A009153.XRDEV230.FIC.OBJLIB.LIBXML'"; \
|
||||||
|
+ done
|
||||||
|
+
|
||||||
|
testdso.la: $(testdso_la_OBJECTS) $(testdso_la_DEPENDENCIES)
|
||||||
|
$(AM_V_CCLD)$(testdso_la_LINK) $(testdso_la_OBJECTS) $(testdso_la_LIBADD) $(LIBS)
|
||||||
|
install-binPROGRAMS: $(bin_PROGRAMS)
|
||||||
|
@@ -953,9 +964,6 @@
|
||||||
|
testXPath$(EXEEXT): $(testXPath_OBJECTS) $(testXPath_DEPENDENCIES)
|
||||||
|
@rm -f testXPath$(EXEEXT)
|
||||||
|
$(AM_V_CCLD)$(testXPath_LINK) $(testXPath_OBJECTS) $(testXPath_LDADD) $(LIBS)
|
||||||
|
-testapi$(EXEEXT): $(testapi_OBJECTS) $(testapi_DEPENDENCIES)
|
||||||
|
- @rm -f testapi$(EXEEXT)
|
||||||
|
- $(AM_V_CCLD)$(testapi_LINK) $(testapi_OBJECTS) $(testapi_LDADD) $(LIBS)
|
||||||
|
testchar$(EXEEXT): $(testchar_OBJECTS) $(testchar_DEPENDENCIES)
|
||||||
|
@rm -f testchar$(EXEEXT)
|
||||||
|
$(AM_V_CCLD)$(testchar_LINK) $(testchar_OBJECTS) $(testchar_LDADD) $(LIBS)
|
||||||
|
@@ -1056,7 +1064,6 @@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testThreadsWin32.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testURI.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testXPath.Po@am__quote@
|
||||||
|
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testapi.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testchar.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testdict.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testdso.Plo@am__quote@
|
||||||
|
@@ -1755,18 +1762,6 @@
|
||||||
|
uninstall-local uninstall-m4dataDATA uninstall-man \
|
||||||
|
uninstall-man1 uninstall-man3 uninstall-pkgconfigDATA
|
||||||
|
|
||||||
|
-
|
||||||
|
-# that one forces the rebuild when "make rebuild" is run on doc/
|
||||||
|
-rebuild_testapi:
|
||||||
|
- -@(if [ "$(PYTHON)" != "" ] ; then \
|
||||||
|
- $(PYTHON) $(srcdir)/gentest.py $(srcdir) ; fi )
|
||||||
|
-
|
||||||
|
-# that one is just to make sure it is rebuilt if missing
|
||||||
|
-# but adding the dependances generate mess
|
||||||
|
-testapi.c: $(srcdir)/gentest.py
|
||||||
|
- -@(if [ "$(PYTHON)" != "" ] ; then \
|
||||||
|
- $(PYTHON) $(srcdir)/gentest.py $(srcdir) ; fi )
|
||||||
|
-
|
||||||
|
#testOOM_SOURCES=testOOM.c testOOMlib.h testOOMlib.c
|
||||||
|
#testOOM_LDFLAGS =
|
||||||
|
#testOOM_DEPENDENCIES = $(DEPS)
|
||||||
|
@@ -1775,7 +1770,7 @@
|
||||||
|
runtests:
|
||||||
|
[ -d test ] || $(LN_S) $(srcdir)/test .
|
||||||
|
[ -d result ] || $(LN_S) $(srcdir)/result .
|
||||||
|
- $(CHECKER) ./runtest$(EXEEXT) && $(CHECKER) ./testrecurse$(EXEEXT) &&$(CHECKER) ./testapi$(EXEEXT) && $(CHECKER) ./testchar$(EXEEXT)&& $(CHECKER) ./testdict$(EXEEXT) && $(CHECKER) ./runxmlconf$(EXEEXT)
|
||||||
|
+ $(CHECKER) ./runtest$(EXEEXT) && $(CHECKER) ./testrecurse$(EXEEXT) &&$(CHECKER) && $(CHECKER) ./testchar$(EXEEXT)&& $(CHECKER) ./testdict$(EXEEXT) && $(CHECKER) ./runxmlconf$(EXEEXT)
|
||||||
|
@(if [ "$(PYTHON_SUBDIR)" != "" ] ; then cd python ; \
|
||||||
|
$(MAKE) tests ; fi)
|
||||||
|
|
||||||
|
@@ -1797,10 +1792,6 @@
|
||||||
|
$(MAKE) tests ; fi)
|
||||||
|
@(cd doc/examples ; $(MAKE) tests)
|
||||||
|
|
||||||
|
-APItests: testapi$(EXEEXT)
|
||||||
|
- @echo "## Running the API regression tests this may take a little while"
|
||||||
|
- -@($(CHECKER) $(top_builddir)/testapi -q)
|
||||||
|
-
|
||||||
|
HTMLtests : testHTML$(EXEEXT)
|
||||||
|
@(echo > .memdump)
|
||||||
|
@echo "## HTML regression tests"
|
||||||
|
@@ -2746,7 +2737,7 @@
|
||||||
|
dist-test: distdir
|
||||||
|
(mkdir -p $(distdir))
|
||||||
|
(cd $(srcdir) ; tar -cf - --exclude CVS --exclude .svn --exclude .git xstc/Tests) | (cd $(distdir); tar xf -)
|
||||||
|
- tar -cf - $(distdir)/test $(distdir)/result $(distdir)/xstc/Tests $(distdir)/Makefile.tests $(distdir)/README $(distdir)/README.tests $(distdir)/AUTHORS $(distdir)/testapi.c $(distdir)/runtest.c $(distdir)/runsuite.c | GZIP=$(GZIP_ENV) gzip -c >`echo "$(distdir)" | sed "s+libxml2+libxml2-tests+"`.tar.gz
|
||||||
|
+ tar -cf - $(distdir)/test $(distdir)/result $(distdir)/xstc/Tests $(distdir)/Makefile.tests $(distdir)/README $(distdir)/README.tests $(distdir)/AUTHORS $(distdir)/runtest.c $(distdir)/runsuite.c | GZIP=$(GZIP_ENV) gzip -c >`echo "$(distdir)" | sed "s+libxml2+libxml2-tests+"`.tar.gz
|
||||||
|
@(rm -rf $(distdir)/xstc/Test)
|
||||||
|
|
||||||
|
cleantar:
|
||||||
+2842
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
|||||||
|
2.16.0
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Run this to generate all the initial makefiles, etc.
|
||||||
|
|
||||||
|
THEDIR=`pwd`
|
||||||
|
cd `dirname $0`
|
||||||
|
srcdir=`pwd`
|
||||||
|
|
||||||
|
DIE=0
|
||||||
|
|
||||||
|
(autoconf --version) < /dev/null > /dev/null 2>&1 || {
|
||||||
|
echo
|
||||||
|
echo "You must have autoconf installed to compile libxml."
|
||||||
|
echo "Download the appropriate package for your distribution,"
|
||||||
|
echo "or see http://www.gnu.org/software/autoconf"
|
||||||
|
DIE=1
|
||||||
|
}
|
||||||
|
|
||||||
|
(libtoolize --version) < /dev/null > /dev/null 2>&1 ||
|
||||||
|
(glibtoolize --version) < /dev/null > /dev/null 2>&1 || {
|
||||||
|
echo
|
||||||
|
echo "You must have libtool installed to compile libxml."
|
||||||
|
echo "Download the appropriate package for your distribution,"
|
||||||
|
echo "or see http://www.gnu.org/software/libtool"
|
||||||
|
DIE=1
|
||||||
|
}
|
||||||
|
|
||||||
|
(automake --version) < /dev/null > /dev/null 2>&1 || {
|
||||||
|
echo
|
||||||
|
DIE=1
|
||||||
|
echo "You must have automake installed to compile libxml."
|
||||||
|
echo "Download the appropriate package for your distribution,"
|
||||||
|
echo "or see http://www.gnu.org/software/automake"
|
||||||
|
}
|
||||||
|
|
||||||
|
if test "$DIE" -eq 1; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
test -f entities.c || {
|
||||||
|
echo "You must run this script in the top-level libxml directory"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
EXTRA_ARGS=
|
||||||
|
if test "x$1" = "x--system"; then
|
||||||
|
shift
|
||||||
|
prefix=/usr
|
||||||
|
libdir=$prefix/lib
|
||||||
|
sysconfdir=/etc
|
||||||
|
localstatedir=/var
|
||||||
|
if [ -d /usr/lib64 ]; then
|
||||||
|
libdir=$prefix/lib64
|
||||||
|
fi
|
||||||
|
EXTRA_ARGS="--prefix=$prefix --sysconfdir=$sysconfdir --localstatedir=$localstatedir --libdir=$libdir"
|
||||||
|
echo "Running ./configure with $EXTRA_ARGS $@"
|
||||||
|
else
|
||||||
|
if test -z "$NOCONFIGURE" && test -z "$*"; then
|
||||||
|
echo "I am going to run ./configure with no arguments - if you wish "
|
||||||
|
echo "to pass any to it, please specify them on the $0 command line."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $srcdir/m4 ]; then
|
||||||
|
mkdir $srcdir/m4
|
||||||
|
fi
|
||||||
|
|
||||||
|
aclocal
|
||||||
|
|
||||||
|
if ! grep -q pkg.m4 aclocal.m4; then
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
Couldn't find pkg.m4 from pkg-config. Install the appropriate package for
|
||||||
|
your distribution or set ACLOCAL_PATH to the directory containing pkg.m4.
|
||||||
|
EOF
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
autoreconf -if -Wall || exit 1
|
||||||
|
|
||||||
|
cd $THEDIR
|
||||||
|
|
||||||
|
if test x$OBJ_DIR != x; then
|
||||||
|
mkdir -p "$OBJ_DIR"
|
||||||
|
cd "$OBJ_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$NOCONFIGURE"; then
|
||||||
|
$srcdir/configure $EXTRA_ARGS "$@"
|
||||||
|
if test "$?" -ne 0; then
|
||||||
|
echo
|
||||||
|
echo "Configure script failed, check config.log for more info."
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo
|
||||||
|
echo "Now type 'make' to compile libxml2."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
+1164
File diff suppressed because it is too large
Load Diff
+2170
File diff suppressed because it is too large
Load Diff
+3899
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,174 @@
|
|||||||
|
/*
|
||||||
|
* chvalid.c: this module implements the character range
|
||||||
|
* validation APIs
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define IN_LIBXML
|
||||||
|
#include "libxml.h"
|
||||||
|
#include <libxml/chvalid.h>
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The initial tables ({func_name}_tab) are used to validate whether a
|
||||||
|
* single-byte character is within the specified group. Each table
|
||||||
|
* contains 256 bytes, with each byte representing one of the 256
|
||||||
|
* possible characters. If the table byte is set, the character is
|
||||||
|
* allowed.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "codegen/ranges.inc"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does a binary search of the range table to determine if char
|
||||||
|
* is valid
|
||||||
|
*
|
||||||
|
* @param val character to be validated
|
||||||
|
* @param rptr pointer to range to be used to validate
|
||||||
|
* @returns true if character valid, false otherwise
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
xmlCharInRange (unsigned int val, const xmlChRangeGroup *rptr) {
|
||||||
|
int low, high, mid;
|
||||||
|
const xmlChSRange *sptr;
|
||||||
|
const xmlChLRange *lptr;
|
||||||
|
|
||||||
|
if (rptr == NULL) return(0);
|
||||||
|
if (val < 0x10000) { /* is val in 'short' or 'long' array? */
|
||||||
|
if (rptr->nbShortRange == 0)
|
||||||
|
return 0;
|
||||||
|
low = 0;
|
||||||
|
high = rptr->nbShortRange - 1;
|
||||||
|
sptr = rptr->shortRange;
|
||||||
|
while (low <= high) {
|
||||||
|
mid = (low + high) / 2;
|
||||||
|
if ((unsigned short) val < sptr[mid].low) {
|
||||||
|
high = mid - 1;
|
||||||
|
} else {
|
||||||
|
if ((unsigned short) val > sptr[mid].high) {
|
||||||
|
low = mid + 1;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (rptr->nbLongRange == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
low = 0;
|
||||||
|
high = rptr->nbLongRange - 1;
|
||||||
|
lptr = rptr->longRange;
|
||||||
|
while (low <= high) {
|
||||||
|
mid = (low + high) / 2;
|
||||||
|
if (val < lptr[mid].low) {
|
||||||
|
high = mid - 1;
|
||||||
|
} else {
|
||||||
|
if (val > lptr[mid].high) {
|
||||||
|
low = mid + 1;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use #xmlIsBaseChar_ch or #xmlIsBaseCharQ.
|
||||||
|
*
|
||||||
|
* @param ch character to validate
|
||||||
|
* @returns true if argument valid, false otherwise
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
xmlIsBaseChar(unsigned int ch) {
|
||||||
|
return(xmlIsBaseCharQ(ch));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use #xmlIsBlank_ch or #xmlIsBlankQ.
|
||||||
|
*
|
||||||
|
* @param ch character to validate
|
||||||
|
* @returns true if argument valid, false otherwise
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
xmlIsBlank(unsigned int ch) {
|
||||||
|
return(xmlIsBlankQ(ch));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use #xmlIsChar_ch or #xmlIsCharQ.
|
||||||
|
*
|
||||||
|
* @param ch character to validate
|
||||||
|
* @returns true if argument valid, false otherwise
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
xmlIsChar(unsigned int ch) {
|
||||||
|
return(xmlIsCharQ(ch));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use #xmlIsCombiningQ.
|
||||||
|
*
|
||||||
|
* @param ch character to validate
|
||||||
|
* @returns true if argument valid, false otherwise
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
xmlIsCombining(unsigned int ch) {
|
||||||
|
return(xmlIsCombiningQ(ch));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use #xmlIsDigit_ch or #xmlIsDigitQ.
|
||||||
|
*
|
||||||
|
* @param ch character to validate
|
||||||
|
* @returns true if argument valid, false otherwise
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
xmlIsDigit(unsigned int ch) {
|
||||||
|
return(xmlIsDigitQ(ch));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use #xmlIsExtender_ch or #xmlIsExtenderQ.
|
||||||
|
*
|
||||||
|
* @param ch character to validate
|
||||||
|
* @returns true if argument valid, false otherwise
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
xmlIsExtender(unsigned int ch) {
|
||||||
|
return(xmlIsExtenderQ(ch));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use #xmlIsIdeographicQ.
|
||||||
|
*
|
||||||
|
* @param ch character to validate
|
||||||
|
* @returns true if argument valid, false otherwise
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
xmlIsIdeographic(unsigned int ch) {
|
||||||
|
return(xmlIsIdeographicQ(ch));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use #xmlIsPubidChar_ch or #xmlIsPubidCharQ.
|
||||||
|
*
|
||||||
|
* @param ch character to validate
|
||||||
|
* @returns true if argument valid, false otherwise
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
xmlIsPubidChar(unsigned int ch) {
|
||||||
|
return(xmlIsPubidCharQ(ch));
|
||||||
|
}
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,66 @@
|
|||||||
|
static const char xmlEscapeContent[] = {
|
||||||
|
8, '&', '#', 'x', 'F', 'F', 'F', 'D', ';', 4, '&', '#',
|
||||||
|
'9', ';', 5, '&', '#', '1', '0', ';', 5, '&', '#', '1',
|
||||||
|
'3', ';', 6, '&', 'q', 'u', 'o', 't', ';', 5, '&', 'a',
|
||||||
|
'm', 'p', ';', 4, '&', 'l', 't', ';', 4, '&', 'g', 't',
|
||||||
|
';',
|
||||||
|
};
|
||||||
|
|
||||||
|
static const signed char xmlEscapeTab[128] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 20, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
-1, -1, -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39, -1, 44, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const signed char xmlEscapeTabQuot[128] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 20, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
-1, -1, 26, -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39, -1, 44, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const signed char xmlEscapeTabAttr[128] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 14, 0, 0, 20, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
-1, -1, 26, -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39, -1, 44, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef LIBXML_HTML_ENABLED
|
||||||
|
|
||||||
|
static const signed char htmlEscapeTab[128] = {
|
||||||
|
0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39, -1, 44, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const signed char htmlEscapeTabAttr[128] = {
|
||||||
|
0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, 26, -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39, -1, 44, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* LIBXML_HTML_ENABLED */
|
||||||
@@ -0,0 +1,379 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
def printHexTable(out, width, data):
|
||||||
|
s = ''
|
||||||
|
|
||||||
|
for i in range(len(data)):
|
||||||
|
if i % 8 == 0:
|
||||||
|
s += ' '
|
||||||
|
else:
|
||||||
|
s += ' '
|
||||||
|
|
||||||
|
s += f'0x{data[i]:{f"0{width}x"}},'
|
||||||
|
|
||||||
|
if i % 8 == 7:
|
||||||
|
out.write(s + '\n')
|
||||||
|
s = ''
|
||||||
|
|
||||||
|
def genTranscodeTable(out, name, chars):
|
||||||
|
# For two-byte sequences, we look up a row with 64 entries.
|
||||||
|
row_ids = [ 0 ] * 32
|
||||||
|
# For three-byte sequences, we look up a plane with 64 entries,
|
||||||
|
# indexing into rows.
|
||||||
|
plane_ids = [ 0 ] * 16
|
||||||
|
data = [ 0 ] * 64
|
||||||
|
|
||||||
|
o = 0x80
|
||||||
|
for cp in chars:
|
||||||
|
if cp != 0:
|
||||||
|
if cp < 0x0800:
|
||||||
|
# The lower five bits of the first byte in a
|
||||||
|
# two-byte sequence are used to find the row.
|
||||||
|
i = cp // 64
|
||||||
|
index = row_ids[i]
|
||||||
|
if index == 0:
|
||||||
|
index = len(data) // 64
|
||||||
|
data += [ 0 ] * 64
|
||||||
|
row_ids[i] = index
|
||||||
|
else:
|
||||||
|
# The lower four bits of the first byte in a
|
||||||
|
# three-byte sequence are used to find the plane.
|
||||||
|
i = cp // (64 * 64)
|
||||||
|
index2 = plane_ids[i]
|
||||||
|
if index2 == 0:
|
||||||
|
index2 = len(data) // 64
|
||||||
|
data += [ 0 ] * 64
|
||||||
|
plane_ids[i] = index2
|
||||||
|
|
||||||
|
# The lower six bits of the second byte in a
|
||||||
|
# three-byte sequence are used to find the row.
|
||||||
|
i = index2 * 64 + cp // 64 % 64
|
||||||
|
index = data[i]
|
||||||
|
if index == 0:
|
||||||
|
index = len(data) // 64
|
||||||
|
data += [ 0 ] * 64
|
||||||
|
data[i] = index
|
||||||
|
|
||||||
|
# The lower six bits in the last byte are
|
||||||
|
# used to lookup the codepoint.
|
||||||
|
data[index * 64 + cp % 64] = o
|
||||||
|
|
||||||
|
o += 1
|
||||||
|
|
||||||
|
out.write('static const unsigned short ')
|
||||||
|
out.write(f'xmlunicodetable_{name} [128] = {{\n')
|
||||||
|
printHexTable(out, 4, chars)
|
||||||
|
out.write('};\n\n')
|
||||||
|
|
||||||
|
num_chunks = len(data) // 64
|
||||||
|
out.write('static const unsigned char ')
|
||||||
|
out.write(f'xmltranscodetable_{name} [48 + {num_chunks} * 64] = {{\n')
|
||||||
|
printHexTable(out, 2, row_ids)
|
||||||
|
printHexTable(out, 2, plane_ids)
|
||||||
|
printHexTable(out, 2, data)
|
||||||
|
out.write('};\n\n')
|
||||||
|
|
||||||
|
out = open(f'codegen/charset.inc', 'w')
|
||||||
|
|
||||||
|
out.write('''/*
|
||||||
|
* Lookup tables for transcoding of 8-bit character sets.
|
||||||
|
*
|
||||||
|
* Generated with tools/genTranscode.py.
|
||||||
|
*/
|
||||||
|
|
||||||
|
''')
|
||||||
|
|
||||||
|
genTranscodeTable(out, 'windows_1252', [
|
||||||
|
0x20ac, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
|
||||||
|
0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x017d, 0x008f,
|
||||||
|
0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
|
||||||
|
0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x017e, 0x0178,
|
||||||
|
0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
|
||||||
|
0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
|
||||||
|
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
|
||||||
|
0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
|
||||||
|
0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
|
||||||
|
0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
|
||||||
|
0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
|
||||||
|
0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
|
||||||
|
0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
|
||||||
|
0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
|
||||||
|
0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
|
||||||
|
0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff,
|
||||||
|
])
|
||||||
|
|
||||||
|
out.write(r'''#if !defined(LIBXML_ICONV_ENABLED) && \
|
||||||
|
!defined(LIBXML_ICU_ENABLED) && \
|
||||||
|
defined(LIBXML_ISO8859X_ENABLED)
|
||||||
|
|
||||||
|
''')
|
||||||
|
|
||||||
|
genTranscodeTable(out, 'ISO8859_2', [
|
||||||
|
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
|
||||||
|
0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
|
||||||
|
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
|
||||||
|
0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
|
||||||
|
0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7,
|
||||||
|
0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b,
|
||||||
|
0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7,
|
||||||
|
0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c,
|
||||||
|
0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7,
|
||||||
|
0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e,
|
||||||
|
0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7,
|
||||||
|
0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df,
|
||||||
|
0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7,
|
||||||
|
0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f,
|
||||||
|
0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7,
|
||||||
|
0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9,
|
||||||
|
])
|
||||||
|
|
||||||
|
genTranscodeTable(out, 'ISO8859_3', [
|
||||||
|
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
|
||||||
|
0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
|
||||||
|
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
|
||||||
|
0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
|
||||||
|
0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0x0000, 0x0124, 0x00a7,
|
||||||
|
0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0x0000, 0x017b,
|
||||||
|
0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7,
|
||||||
|
0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0x0000, 0x017c,
|
||||||
|
0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x010a, 0x0108, 0x00c7,
|
||||||
|
0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
|
||||||
|
0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7,
|
||||||
|
0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df,
|
||||||
|
0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x010b, 0x0109, 0x00e7,
|
||||||
|
0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
|
||||||
|
0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7,
|
||||||
|
0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9,
|
||||||
|
])
|
||||||
|
|
||||||
|
genTranscodeTable(out, 'ISO8859_4', [
|
||||||
|
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
|
||||||
|
0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
|
||||||
|
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
|
||||||
|
0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
|
||||||
|
0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7,
|
||||||
|
0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af,
|
||||||
|
0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7,
|
||||||
|
0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b,
|
||||||
|
0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e,
|
||||||
|
0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a,
|
||||||
|
0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
|
||||||
|
0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df,
|
||||||
|
0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f,
|
||||||
|
0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b,
|
||||||
|
0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
|
||||||
|
0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9,
|
||||||
|
])
|
||||||
|
|
||||||
|
genTranscodeTable(out, 'ISO8859_5', [
|
||||||
|
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
|
||||||
|
0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
|
||||||
|
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
|
||||||
|
0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
|
||||||
|
0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
|
||||||
|
0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f,
|
||||||
|
0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
|
||||||
|
0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
|
||||||
|
0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
|
||||||
|
0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
|
||||||
|
0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
|
||||||
|
0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
|
||||||
|
0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
|
||||||
|
0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
|
||||||
|
0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
|
||||||
|
0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f,
|
||||||
|
])
|
||||||
|
|
||||||
|
genTranscodeTable(out, 'ISO8859_6', [
|
||||||
|
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
|
||||||
|
0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
|
||||||
|
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
|
||||||
|
0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
|
||||||
|
0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x060c, 0x00ad, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f,
|
||||||
|
0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
|
||||||
|
0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f,
|
||||||
|
0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637,
|
||||||
|
0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647,
|
||||||
|
0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f,
|
||||||
|
0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
])
|
||||||
|
|
||||||
|
genTranscodeTable(out, 'ISO8859_7', [
|
||||||
|
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
|
||||||
|
0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
|
||||||
|
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
|
||||||
|
0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
|
||||||
|
0x00a0, 0x2018, 0x2019, 0x00a3, 0x0000, 0x0000, 0x00a6, 0x00a7,
|
||||||
|
0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x2015,
|
||||||
|
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7,
|
||||||
|
0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f,
|
||||||
|
0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
|
||||||
|
0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f,
|
||||||
|
0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
|
||||||
|
0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
|
||||||
|
0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
|
||||||
|
0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
|
||||||
|
0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7,
|
||||||
|
0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000,
|
||||||
|
])
|
||||||
|
|
||||||
|
genTranscodeTable(out, 'ISO8859_8', [
|
||||||
|
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
|
||||||
|
0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
|
||||||
|
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
|
||||||
|
0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
|
||||||
|
0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
|
||||||
|
0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
|
||||||
|
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
|
||||||
|
0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017,
|
||||||
|
0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7,
|
||||||
|
0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df,
|
||||||
|
0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7,
|
||||||
|
0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x200e, 0x200f, 0x0000,
|
||||||
|
])
|
||||||
|
|
||||||
|
genTranscodeTable(out, 'ISO8859_9', [
|
||||||
|
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
|
||||||
|
0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
|
||||||
|
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
|
||||||
|
0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
|
||||||
|
0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
|
||||||
|
0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
|
||||||
|
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
|
||||||
|
0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
|
||||||
|
0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
|
||||||
|
0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
|
||||||
|
0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
|
||||||
|
0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df,
|
||||||
|
0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
|
||||||
|
0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
|
||||||
|
0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
|
||||||
|
0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff,
|
||||||
|
])
|
||||||
|
|
||||||
|
genTranscodeTable(out, 'ISO8859_10', [
|
||||||
|
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
|
||||||
|
0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
|
||||||
|
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
|
||||||
|
0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
|
||||||
|
0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7,
|
||||||
|
0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a,
|
||||||
|
0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7,
|
||||||
|
0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b,
|
||||||
|
0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e,
|
||||||
|
0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf,
|
||||||
|
0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168,
|
||||||
|
0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
|
||||||
|
0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f,
|
||||||
|
0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef,
|
||||||
|
0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169,
|
||||||
|
0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138,
|
||||||
|
])
|
||||||
|
|
||||||
|
genTranscodeTable(out, 'ISO8859_11', [
|
||||||
|
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
|
||||||
|
0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
|
||||||
|
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
|
||||||
|
0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
|
||||||
|
0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07,
|
||||||
|
0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f,
|
||||||
|
0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17,
|
||||||
|
0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f,
|
||||||
|
0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27,
|
||||||
|
0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f,
|
||||||
|
0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37,
|
||||||
|
0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e3f,
|
||||||
|
0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47,
|
||||||
|
0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f,
|
||||||
|
0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57,
|
||||||
|
0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
])
|
||||||
|
|
||||||
|
genTranscodeTable(out, 'ISO8859_13', [
|
||||||
|
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
|
||||||
|
0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
|
||||||
|
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
|
||||||
|
0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
|
||||||
|
0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7,
|
||||||
|
0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6,
|
||||||
|
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7,
|
||||||
|
0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6,
|
||||||
|
0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112,
|
||||||
|
0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b,
|
||||||
|
0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7,
|
||||||
|
0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df,
|
||||||
|
0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113,
|
||||||
|
0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c,
|
||||||
|
0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7,
|
||||||
|
0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019,
|
||||||
|
])
|
||||||
|
|
||||||
|
genTranscodeTable(out, 'ISO8859_14', [
|
||||||
|
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
|
||||||
|
0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
|
||||||
|
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
|
||||||
|
0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
|
||||||
|
0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7,
|
||||||
|
0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178,
|
||||||
|
0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56,
|
||||||
|
0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61,
|
||||||
|
0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
|
||||||
|
0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
|
||||||
|
0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a,
|
||||||
|
0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df,
|
||||||
|
0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
|
||||||
|
0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
|
||||||
|
0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b,
|
||||||
|
0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff,
|
||||||
|
])
|
||||||
|
|
||||||
|
genTranscodeTable(out, 'ISO8859_15', [
|
||||||
|
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
|
||||||
|
0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
|
||||||
|
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
|
||||||
|
0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
|
||||||
|
0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7,
|
||||||
|
0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
|
||||||
|
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7,
|
||||||
|
0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf,
|
||||||
|
0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
|
||||||
|
0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
|
||||||
|
0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
|
||||||
|
0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
|
||||||
|
0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
|
||||||
|
0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
|
||||||
|
0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
|
||||||
|
0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff,
|
||||||
|
])
|
||||||
|
|
||||||
|
genTranscodeTable(out, 'ISO8859_16', [
|
||||||
|
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
|
||||||
|
0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
|
||||||
|
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
|
||||||
|
0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
|
||||||
|
0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7,
|
||||||
|
0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b,
|
||||||
|
0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7,
|
||||||
|
0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c,
|
||||||
|
0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7,
|
||||||
|
0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
|
||||||
|
0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a,
|
||||||
|
0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df,
|
||||||
|
0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7,
|
||||||
|
0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
|
||||||
|
0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b,
|
||||||
|
0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff,
|
||||||
|
])
|
||||||
|
|
||||||
|
out.write('#endif /* LIBXML_ISO8859X_ENABLED */\n')
|
||||||
|
|
||||||
|
out.close()
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
entities = [
|
||||||
|
[ '', '�' ],
|
||||||
|
[ '\t', '	' ],
|
||||||
|
[ '\n', ' ' ],
|
||||||
|
[ '\r', ' ' ],
|
||||||
|
[ '"', '"' ],
|
||||||
|
[ '&', '&' ],
|
||||||
|
[ '<', '<' ],
|
||||||
|
[ '>', '>' ],
|
||||||
|
]
|
||||||
|
|
||||||
|
offset = [ None ] * 128
|
||||||
|
|
||||||
|
def gen_content(out):
|
||||||
|
pos = 0
|
||||||
|
r = ''
|
||||||
|
|
||||||
|
for rec in entities:
|
||||||
|
char, repl = rec
|
||||||
|
|
||||||
|
if char:
|
||||||
|
offset[ord(char)] = pos
|
||||||
|
|
||||||
|
if pos % 12 == 0: r += '\n '
|
||||||
|
else: r += ' '
|
||||||
|
r += '%3d,' % len(repl)
|
||||||
|
pos += 1
|
||||||
|
|
||||||
|
for c in repl:
|
||||||
|
if pos % 12 == 0: r += '\n '
|
||||||
|
else: r += ' '
|
||||||
|
r += "'%s'," % c
|
||||||
|
pos += 1
|
||||||
|
|
||||||
|
out.write('static const char xmlEscapeContent[] = {%s\n};\n\n' % r)
|
||||||
|
|
||||||
|
def gen_tab(out, name, escape, is_xml):
|
||||||
|
r = ''
|
||||||
|
|
||||||
|
for i in range(0x80):
|
||||||
|
|
||||||
|
if chr(i) in escape:
|
||||||
|
v = offset[i]
|
||||||
|
elif i == 0:
|
||||||
|
v = 0
|
||||||
|
elif is_xml and i < 32 and i != 9 and i != 10:
|
||||||
|
v = 0
|
||||||
|
else:
|
||||||
|
v = -1
|
||||||
|
|
||||||
|
if i % 16 == 0: r += '\n '
|
||||||
|
else: r += ' '
|
||||||
|
r += '%2d,' % v
|
||||||
|
|
||||||
|
out.write('static const signed char %s[128] = {%s\n};\n\n' % (name, r))
|
||||||
|
|
||||||
|
with open('codegen/escape.inc', 'w') as out:
|
||||||
|
gen_content(out)
|
||||||
|
|
||||||
|
gen_tab(out, 'xmlEscapeTab', '\r&<>', True)
|
||||||
|
gen_tab(out, 'xmlEscapeTabQuot', '\r"&<>', True)
|
||||||
|
gen_tab(out, 'xmlEscapeTabAttr', '\t\n\r"&<>', True)
|
||||||
|
|
||||||
|
out.write('#ifdef LIBXML_HTML_ENABLED\n\n')
|
||||||
|
gen_tab(out, 'htmlEscapeTab', '&<>', False)
|
||||||
|
gen_tab(out, 'htmlEscapeTabAttr', '"&<>', False)
|
||||||
|
out.write('#endif /* LIBXML_HTML_ENABLED */\n')
|
||||||
@@ -0,0 +1,170 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
# The basic idea is to find named character references using binary
|
||||||
|
# search. Since entity strings may not have a terminator, this doesn't
|
||||||
|
# work if one entity string is a prefix of another. In this case,
|
||||||
|
# we branch to a subtable after matching the prefix.
|
||||||
|
#
|
||||||
|
# We create separate initial tables based on the first character
|
||||||
|
# of the entity name.
|
||||||
|
#
|
||||||
|
# The following tables are generated:
|
||||||
|
#
|
||||||
|
# htmlEntAlpha: start and end of initial tables, indexing into
|
||||||
|
# htmlEntValues
|
||||||
|
# htmlEntValues: concatenation of all table values, which index into
|
||||||
|
# htmlEntStrings
|
||||||
|
# htmlEntStrings: variable sized records containing entity name,
|
||||||
|
# replacement and optionally the position of a
|
||||||
|
# subtable
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open('entities.json') as json_data:
|
||||||
|
ents = json.load(json_data)
|
||||||
|
except FileNotFoundError:
|
||||||
|
print('entities.json not found, try curl -LJO',
|
||||||
|
'https://html.spec.whatwg.org/entities.json')
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def to_cchars(s):
|
||||||
|
r = []
|
||||||
|
|
||||||
|
for c in s.encode():
|
||||||
|
if c >= 0x20 and c <= 0x7E and c != ord("'") and c != ord('\\'):
|
||||||
|
v = f"'{chr(c)}'"
|
||||||
|
else:
|
||||||
|
v = c
|
||||||
|
r += [ v ]
|
||||||
|
|
||||||
|
return r
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class PrefixStackEntry:
|
||||||
|
prefix: str
|
||||||
|
table_id: int
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class AlphaFixup:
|
||||||
|
table_id: int
|
||||||
|
char: int
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class StringFixup:
|
||||||
|
table_id: int
|
||||||
|
string_index: int
|
||||||
|
super_table_id: int
|
||||||
|
super_offset: int
|
||||||
|
|
||||||
|
# Remove entity strings without trailing semicolon
|
||||||
|
keys = (key for key in ents.keys() if key.endswith(';'))
|
||||||
|
|
||||||
|
# Sort entity strings
|
||||||
|
keys = sorted(keys, key=lambda k: k[1:-1])
|
||||||
|
|
||||||
|
strings = []
|
||||||
|
tables = []
|
||||||
|
prefix_stack = []
|
||||||
|
alpha_fixups = []
|
||||||
|
string_fixups = []
|
||||||
|
for i in range(64):
|
||||||
|
tables.append([])
|
||||||
|
|
||||||
|
for i, key in enumerate(keys):
|
||||||
|
name = key[1:-1]
|
||||||
|
|
||||||
|
next_name = None
|
||||||
|
if i + 1 < len(keys):
|
||||||
|
next_name = keys[i+1][1:-1]
|
||||||
|
|
||||||
|
while prefix_stack and not name.startswith(prefix_stack[-1].prefix):
|
||||||
|
prefix_stack.pop()
|
||||||
|
|
||||||
|
# First character is initial prefix
|
||||||
|
if not prefix_stack:
|
||||||
|
table_id = len(tables)
|
||||||
|
tables.append([])
|
||||||
|
|
||||||
|
prefix_stack.append(PrefixStackEntry(name[0], table_id))
|
||||||
|
alpha_fixups.append(AlphaFixup(table_id, ord(name[0]) % 64))
|
||||||
|
|
||||||
|
string_index = len(strings)
|
||||||
|
table = tables[prefix_stack[-1].table_id]
|
||||||
|
table_index = len(table)
|
||||||
|
table.append(string_index)
|
||||||
|
|
||||||
|
name_offset = len(prefix_stack[-1].prefix)
|
||||||
|
name_chars = to_cchars(name[name_offset:])
|
||||||
|
repl_chars = to_cchars(ents[key]['characters'])
|
||||||
|
semicolon_flag = 0
|
||||||
|
if key[:-1] in ents:
|
||||||
|
semicolon_flag = 0x80
|
||||||
|
|
||||||
|
if next_name and next_name.startswith(name):
|
||||||
|
# Create subtable
|
||||||
|
|
||||||
|
strings += [
|
||||||
|
len(name_chars) | semicolon_flag | 0x40, *name_chars,
|
||||||
|
0, 0, # subtable position, to be fixed up
|
||||||
|
len(repl_chars), *repl_chars,
|
||||||
|
]
|
||||||
|
|
||||||
|
table_id = len(tables)
|
||||||
|
tables.append([])
|
||||||
|
|
||||||
|
fixup_index = string_index + 1 + len(name_chars)
|
||||||
|
string_fixups.append(StringFixup(
|
||||||
|
table_id, fixup_index, prefix_stack[-1].table_id, table_index,
|
||||||
|
))
|
||||||
|
|
||||||
|
prefix_stack.append(PrefixStackEntry(name, table_id))
|
||||||
|
else:
|
||||||
|
strings += [
|
||||||
|
len(name_chars) | semicolon_flag, *name_chars,
|
||||||
|
len(repl_chars), *repl_chars,
|
||||||
|
]
|
||||||
|
|
||||||
|
# Concat tables and record ranges
|
||||||
|
ranges = [ 0 ]
|
||||||
|
values = []
|
||||||
|
for table in tables:
|
||||||
|
values += table
|
||||||
|
ranges.append(len(values))
|
||||||
|
|
||||||
|
# Create alpha table
|
||||||
|
alpha = [ 0 ] * (59 * 3)
|
||||||
|
for fixup in alpha_fixups:
|
||||||
|
table_id, c = fixup.table_id, fixup.char
|
||||||
|
start = ranges[table_id]
|
||||||
|
end = ranges[table_id+1]
|
||||||
|
alpha[c*3:c*3+3] = [ start & 0xFF, start >> 8, end - start ]
|
||||||
|
|
||||||
|
# Fix up subtable positions
|
||||||
|
for fixup in string_fixups:
|
||||||
|
table_id, i = fixup.table_id, fixup.string_index
|
||||||
|
start = ranges[table_id]
|
||||||
|
end = ranges[table_id+1]
|
||||||
|
super_index = ranges[fixup.super_table_id] + fixup.super_offset
|
||||||
|
strings[i:i+2] = [ start - super_index, end - start ]
|
||||||
|
|
||||||
|
# Print tables
|
||||||
|
|
||||||
|
def gen_table(ctype, cname, values, fmt, elems_per_line):
|
||||||
|
count = len(values)
|
||||||
|
r = ''
|
||||||
|
|
||||||
|
for i in range(count):
|
||||||
|
if i != 0: r += ','
|
||||||
|
if i % elems_per_line == 0: r += '\n '
|
||||||
|
else: r += ' '
|
||||||
|
r += fmt % values[i]
|
||||||
|
|
||||||
|
return f'static const {ctype} {cname}[{count}] = {{{r}\n}};\n\n'
|
||||||
|
|
||||||
|
with open('codegen/html5ent.inc', 'w') as out:
|
||||||
|
out.write(gen_table('unsigned char', 'htmlEntAlpha', alpha, '%3d', 15))
|
||||||
|
out.write(gen_table('unsigned short', 'htmlEntValues', values, '%5d', 10))
|
||||||
|
out.write(gen_table('unsigned char', 'htmlEntStrings', strings, '%3s', 15))
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import glob
|
||||||
|
import json
|
||||||
|
import re
|
||||||
|
|
||||||
|
state_map = {
|
||||||
|
'Data state': 0,
|
||||||
|
'RCDATA state': 1,
|
||||||
|
'RAWTEXT state': 2,
|
||||||
|
'PLAINTEXT state': 3,
|
||||||
|
'Script data state': 4,
|
||||||
|
'CDATA section state': 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
for filename in sorted(glob.glob('../html5lib-tests/tokenizer/*.test')):
|
||||||
|
match = re.search('/([^/]*).test$', filename)
|
||||||
|
if match is None:
|
||||||
|
continue
|
||||||
|
testname = match[1]
|
||||||
|
if testname == 'xmlViolation':
|
||||||
|
continue
|
||||||
|
|
||||||
|
with open(filename) as json_data:
|
||||||
|
root = json.load(json_data)
|
||||||
|
|
||||||
|
test_out = open(f'test/html-tokenizer/{testname}.test', 'w')
|
||||||
|
result_out = open(f'result/html-tokenizer/{testname}.test', 'w')
|
||||||
|
|
||||||
|
counter = 0
|
||||||
|
|
||||||
|
for tests in root.values():
|
||||||
|
for test in tests:
|
||||||
|
input = test['input']
|
||||||
|
|
||||||
|
# Skip surrogate tests
|
||||||
|
if re.search(r'\\uD[89A-F]', input, re.I):
|
||||||
|
continue
|
||||||
|
|
||||||
|
input = re.sub(r'\\u([A-Fa-f0-9]{4})',
|
||||||
|
lambda m: chr(int(m[1], 16)),
|
||||||
|
input)
|
||||||
|
|
||||||
|
output = ''
|
||||||
|
for token in test['output']:
|
||||||
|
if token[1] == '\0':
|
||||||
|
continue
|
||||||
|
|
||||||
|
output += token[0] + '\n'
|
||||||
|
|
||||||
|
if token[0] == 'DOCTYPE':
|
||||||
|
for i in range(1, 4):
|
||||||
|
if token[i] is None:
|
||||||
|
output += '<none>\n'
|
||||||
|
else:
|
||||||
|
output += token[i] + '\n'
|
||||||
|
else:
|
||||||
|
output += token[1]
|
||||||
|
if token[0] == 'StartTag':
|
||||||
|
for name, value in token[2].items():
|
||||||
|
output += f' {name}={value}'
|
||||||
|
output += '\n'
|
||||||
|
|
||||||
|
output = re.sub(r'\\u([A-Fa-f0-9]{4})',
|
||||||
|
lambda m: chr(int(m[1], 16)),
|
||||||
|
output)
|
||||||
|
|
||||||
|
# The HTML5 spec splits handling of U+0000 across
|
||||||
|
# tokenizer and tree builder. We already ignore
|
||||||
|
# U+0000 in body text when tokenizing.
|
||||||
|
output = re.sub(r'\x00', '', output)
|
||||||
|
|
||||||
|
for state in test.get('initialStates', ['Data state']):
|
||||||
|
state_no = state_map.get(state)
|
||||||
|
if state_no is None:
|
||||||
|
raise Exception(f'{filename}: unknown state: {state}')
|
||||||
|
if state_no == 5:
|
||||||
|
continue
|
||||||
|
|
||||||
|
start_tag = test.get('lastStartTag', '-')
|
||||||
|
|
||||||
|
test_out.write(f'{counter} {start_tag} {state_no} '
|
||||||
|
f'{len(input.encode())}\n')
|
||||||
|
test_out.write(input)
|
||||||
|
test_out.write('\n')
|
||||||
|
|
||||||
|
result_out.write(f'{counter}\n')
|
||||||
|
result_out.write(output)
|
||||||
|
|
||||||
|
counter += 1
|
||||||
|
|
||||||
|
test_out.close()
|
||||||
|
result_out.close()
|
||||||
@@ -0,0 +1,222 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
#
|
||||||
|
# Portions of this script have been (shamelessly) stolen from the
|
||||||
|
# prior work of Daniel Veillard (genUnicode.py)
|
||||||
|
#
|
||||||
|
# I, however, take full credit for any bugs, errors or difficulties :-)
|
||||||
|
#
|
||||||
|
# William Brack
|
||||||
|
# October 2003
|
||||||
|
#
|
||||||
|
# 18 October 2003
|
||||||
|
# Modified to maintain binary compatibility with previous library versions
|
||||||
|
# by adding a suffix 'Q' ('quick') to the macro generated for the original,
|
||||||
|
# function, and adding generation of a function (with the original name) which
|
||||||
|
# instantiates the macro.
|
||||||
|
#
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import rangetab
|
||||||
|
|
||||||
|
#
|
||||||
|
# A routine to take a list of yes/no (1, 0) values and turn it
|
||||||
|
# into a list of ranges. This will later be used to determine whether
|
||||||
|
# to generate single-byte lookup tables, or inline comparisons
|
||||||
|
#
|
||||||
|
def makeRange(lst):
|
||||||
|
ret = []
|
||||||
|
pos = 0
|
||||||
|
while pos < len(lst):
|
||||||
|
try: # index generates exception if not present
|
||||||
|
s = lst[pos:].index(1) # look for start of next range
|
||||||
|
except:
|
||||||
|
break # if no more, finished
|
||||||
|
pos += s # pointer to start of possible range
|
||||||
|
try:
|
||||||
|
e = lst[pos:].index(0) # look for end of range
|
||||||
|
e += pos
|
||||||
|
except: # if no end, set to end of list
|
||||||
|
e = len(lst)
|
||||||
|
ret.append((pos, e-1)) # append range tuple to list
|
||||||
|
pos = e + 1 # ready to check for next range
|
||||||
|
return ret
|
||||||
|
|
||||||
|
# minTableSize gives the minimum number of ranges which must be present
|
||||||
|
# before a 256-byte lookup table is produced. If there are less than this
|
||||||
|
# number, a macro with inline comparisons is generated
|
||||||
|
minTableSize = 6
|
||||||
|
|
||||||
|
# dictionary of functions, key=name, element contains char-map and range-list
|
||||||
|
Functs = {}
|
||||||
|
|
||||||
|
state = 0
|
||||||
|
|
||||||
|
try:
|
||||||
|
defines = open("codegen/ranges.def", "r")
|
||||||
|
except:
|
||||||
|
print("Missing codegen/ranges.def, aborting ...")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
#
|
||||||
|
# The lines in the .def file have three types:-
|
||||||
|
# name: Defines a new function block
|
||||||
|
# ur: Defines individual or ranges of unicode values
|
||||||
|
# end: Indicates the end of the function block
|
||||||
|
#
|
||||||
|
# These lines are processed below.
|
||||||
|
#
|
||||||
|
for line in defines.readlines():
|
||||||
|
# ignore blank lines, or lines beginning with '#'
|
||||||
|
if line[0] == '#':
|
||||||
|
continue
|
||||||
|
line = line.strip()
|
||||||
|
if line == '':
|
||||||
|
continue
|
||||||
|
# split line into space-separated fields, then split on type
|
||||||
|
try:
|
||||||
|
fields = line.split(' ')
|
||||||
|
#
|
||||||
|
# name line:
|
||||||
|
# validate any previous function block already ended
|
||||||
|
# validate this function not already defined
|
||||||
|
# initialize an entry in the function dicitonary
|
||||||
|
# including a mask table with no values yet defined
|
||||||
|
#
|
||||||
|
if fields[0] == 'name':
|
||||||
|
name = fields[1]
|
||||||
|
if state != 0:
|
||||||
|
print("'name' %s found before previous name" \
|
||||||
|
"completed" % (fields[1]))
|
||||||
|
continue
|
||||||
|
state = 1
|
||||||
|
if name in Functs:
|
||||||
|
print("name '%s' already present - may give" \
|
||||||
|
" wrong results" % (name))
|
||||||
|
else:
|
||||||
|
# dict entry with two list elements (chdata, rangedata)
|
||||||
|
Functs[name] = [ [], [] ]
|
||||||
|
for v in range(256):
|
||||||
|
Functs[name][0].append(0)
|
||||||
|
#
|
||||||
|
# end line:
|
||||||
|
# validate there was a preceding function name line
|
||||||
|
# set state to show no current function active
|
||||||
|
#
|
||||||
|
elif fields[0] == 'end':
|
||||||
|
if state == 0:
|
||||||
|
print("'end' found outside of function block")
|
||||||
|
continue
|
||||||
|
state = 0
|
||||||
|
|
||||||
|
#
|
||||||
|
# ur line:
|
||||||
|
# validate function has been defined
|
||||||
|
# process remaining fields on the line, which may be either
|
||||||
|
# individual unicode values or ranges of values
|
||||||
|
#
|
||||||
|
elif fields[0] == 'ur':
|
||||||
|
if state != 1:
|
||||||
|
raise Exception("'ur' found outside of 'name' block")
|
||||||
|
for el in fields[1:]:
|
||||||
|
pos = el.find('..')
|
||||||
|
# pos <=0 means not a range, so must be individual value
|
||||||
|
if pos <= 0:
|
||||||
|
# cheap handling of hex or decimal values
|
||||||
|
if el[0:2] == '0x':
|
||||||
|
value = int(el[2:],16)
|
||||||
|
elif el[0] == "'":
|
||||||
|
value = ord(el[1])
|
||||||
|
else:
|
||||||
|
value = int(el)
|
||||||
|
if ((value < 0) | (value > 0x1fffff)):
|
||||||
|
raise Exception('Illegal value (%s) in ch for'\
|
||||||
|
' name %s' % (el,name))
|
||||||
|
# for ur we have only ranges (makes things simpler),
|
||||||
|
# so convert val to range
|
||||||
|
currange = (value, value)
|
||||||
|
# pos > 0 means this is a range, so isolate/validate
|
||||||
|
# the interval
|
||||||
|
else:
|
||||||
|
# split the range into it's first-val, last-val
|
||||||
|
(first, last) = el.split("..")
|
||||||
|
# convert values from text into binary
|
||||||
|
if first[0:2] == '0x':
|
||||||
|
start = int(first[2:],16)
|
||||||
|
elif first[0] == "'":
|
||||||
|
start = ord(first[1])
|
||||||
|
else:
|
||||||
|
start = int(first)
|
||||||
|
if last[0:2] == '0x':
|
||||||
|
end = int(last[2:],16)
|
||||||
|
elif last[0] == "'":
|
||||||
|
end = ord(last[1])
|
||||||
|
else:
|
||||||
|
end = int(last)
|
||||||
|
if (start < 0) | (end > 0x1fffff) | (start > end):
|
||||||
|
raise Exception("Invalid range '%s'" % el)
|
||||||
|
currange = (start, end)
|
||||||
|
# common path - 'currange' has the range, now take care of it
|
||||||
|
# We split on single-byte values vs. multibyte
|
||||||
|
if currange[1] < 0x100: # single-byte
|
||||||
|
for ch in range(currange[0],currange[1]+1):
|
||||||
|
# validate that value not previously defined
|
||||||
|
if Functs[name][0][ch]:
|
||||||
|
msg = "Duplicate ch value '%s' for name '%s'" % (el, name)
|
||||||
|
raise Exception(msg)
|
||||||
|
Functs[name][0][ch] = 1
|
||||||
|
else: # multi-byte
|
||||||
|
if currange in Functs[name][1]:
|
||||||
|
raise Exception("range already defined in" \
|
||||||
|
" function")
|
||||||
|
else:
|
||||||
|
Functs[name][1].append(currange)
|
||||||
|
|
||||||
|
except:
|
||||||
|
print("Failed to process line: %s" % (line))
|
||||||
|
raise
|
||||||
|
|
||||||
|
try:
|
||||||
|
output = open("codegen/ranges.inc", "w")
|
||||||
|
except:
|
||||||
|
print("Failed to open codegen/ranges.inc")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Now output the generated data.
|
||||||
|
#
|
||||||
|
|
||||||
|
fkeys = sorted(Functs.keys())
|
||||||
|
|
||||||
|
for f in fkeys:
|
||||||
|
|
||||||
|
# First we convert the specified single-byte values into a group of ranges.
|
||||||
|
if max(Functs[f][0]) > 0: # only check if at least one entry
|
||||||
|
rangeTable = makeRange(Functs[f][0])
|
||||||
|
numRanges = len(rangeTable)
|
||||||
|
if numRanges >= minTableSize: # table is worthwhile
|
||||||
|
# write the constant data to the code file
|
||||||
|
output.write("const unsigned char %s_tab[256] = {\n" % f)
|
||||||
|
pline = " "
|
||||||
|
for n in range(255):
|
||||||
|
pline += " 0x%02x," % Functs[f][0][n]
|
||||||
|
if len(pline) > 72:
|
||||||
|
output.write(pline + "\n")
|
||||||
|
pline = " "
|
||||||
|
output.write(pline + " 0x%02x };\n\n" % Functs[f][0][255])
|
||||||
|
|
||||||
|
#
|
||||||
|
# Next we do the unicode ranges
|
||||||
|
#
|
||||||
|
|
||||||
|
for f in fkeys:
|
||||||
|
if len(Functs[f][1]) > 0: # only generate if unicode ranges present
|
||||||
|
rangeTable = Functs[f][1]
|
||||||
|
rangeTable.sort() # ascending tuple sequence
|
||||||
|
group = rangetab.gen_range_tables(output, f, '_srng', '_lrng',
|
||||||
|
rangeTable)
|
||||||
|
|
||||||
|
output.write("const xmlChRangeGroup %sGroup =\n\t%s;\n\n" %
|
||||||
|
(f, group))
|
||||||
|
|
||||||
|
output.close()
|
||||||
|
|
||||||
@@ -0,0 +1,285 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
#
|
||||||
|
# generate a test program for the API
|
||||||
|
#
|
||||||
|
|
||||||
|
import xml.etree.ElementTree as etree
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import xmlmod
|
||||||
|
|
||||||
|
# Globals
|
||||||
|
|
||||||
|
dtors = {
|
||||||
|
'htmlDoc *': 'xmlFreeDoc',
|
||||||
|
'htmlParserCtxt *': 'htmlFreeParserCtxt',
|
||||||
|
'xmlAutomata *': 'xmlFreeAutomata',
|
||||||
|
'xmlBuffer *': 'xmlBufferFree',
|
||||||
|
'xmlCatalog *': 'xmlFreeCatalog',
|
||||||
|
'xmlChar *': 'xmlFree',
|
||||||
|
'xmlDOMWrapCtxt *': 'xmlDOMWrapFreeCtxt',
|
||||||
|
'xmlDict *': 'xmlDictFree',
|
||||||
|
'xmlDoc *': 'xmlFreeDoc',
|
||||||
|
'xmlDtd *': 'xmlFreeDtd',
|
||||||
|
'xmlEntitiesTable *': 'xmlFreeEntitiesTable',
|
||||||
|
'xmlElementContent *': 'xmlFreeElementContent',
|
||||||
|
'xmlEnumeration *': 'xmlFreeEnumeration',
|
||||||
|
'xmlList *': 'xmlListDelete',
|
||||||
|
'xmlModule *': 'xmlModuleFree',
|
||||||
|
'xmlMutex *': 'xmlFreeMutex',
|
||||||
|
'xmlNode *': 'xmlFreeNode',
|
||||||
|
'xmlNodeSet *': 'xmlXPathFreeNodeSet',
|
||||||
|
'xmlNs *': 'xmlFreeNs',
|
||||||
|
'xmlOutputBuffer *': 'xmlOutputBufferClose',
|
||||||
|
'xmlParserCtxt *': 'xmlFreeParserCtxt',
|
||||||
|
'xmlParserInputBuffer *': 'xmlFreeParserInputBuffer',
|
||||||
|
'xmlParserInput *': 'xmlFreeInputStream',
|
||||||
|
'xmlRMutex *': 'xmlFreeRMutex',
|
||||||
|
'xmlRelaxNGValidCtxt *': 'xmlRelaxNGFreeValidCtxt',
|
||||||
|
'xmlSaveCtxt *': 'xmlSaveClose',
|
||||||
|
'xmlSchemaFacet *': 'xmlSchemaFreeFacet',
|
||||||
|
'xmlSchemaVal *': 'xmlSchemaFreeValue',
|
||||||
|
'xmlSchemaValidCtxt *': 'xmlSchemaFreeValidCtxt',
|
||||||
|
'xmlTextWriter *': 'xmlFreeTextWriter',
|
||||||
|
'xmlURI *': 'xmlFreeURI',
|
||||||
|
'xmlValidCtxt *': 'xmlFreeValidCtxt',
|
||||||
|
'xmlXPathContext *': 'xmlXPathFreeContext',
|
||||||
|
'xmlXPathParserContext *': 'xmlXPathFreeParserContext',
|
||||||
|
'xmlXPathObject *': 'xmlXPathFreeObject',
|
||||||
|
}
|
||||||
|
|
||||||
|
blockList = {
|
||||||
|
# init/cleanup
|
||||||
|
'xmlCleanupParser': True,
|
||||||
|
'xmlInitParser': True,
|
||||||
|
|
||||||
|
# arg must be non-NULL
|
||||||
|
'xmlMemStrdupLoc': True,
|
||||||
|
'xmlMemoryStrdup': True,
|
||||||
|
|
||||||
|
# Returns void pointer which must be freed
|
||||||
|
'xmlMallocAtomicLoc': True,
|
||||||
|
'xmlMallocLoc': True,
|
||||||
|
'xmlMemMalloc': True,
|
||||||
|
'xmlMemRealloc': True,
|
||||||
|
'xmlReallocLoc': True,
|
||||||
|
|
||||||
|
# Would reset the error handler
|
||||||
|
'xmlSetStructuredErrorFunc': True,
|
||||||
|
|
||||||
|
# Prints errors
|
||||||
|
'xmlCatalogGetPublic': True,
|
||||||
|
'xmlCatalogGetSystem': True,
|
||||||
|
'xmlDebugDumpDTD': True,
|
||||||
|
'xmlDebugDumpDocument': True,
|
||||||
|
'xmlDebugDumpNode': True,
|
||||||
|
'xmlDebugDumpString': True,
|
||||||
|
'xmlParserError': True,
|
||||||
|
'xmlParserWarning': True,
|
||||||
|
'xmlParserValidityError': True,
|
||||||
|
'xmlParserValidityWarning': True,
|
||||||
|
|
||||||
|
# Internal parser unctions, ctxt must be non-NULL
|
||||||
|
'xmlParseAttribute': True,
|
||||||
|
'xmlParseAttributeListDecl': True,
|
||||||
|
'xmlParseAttributeType': True,
|
||||||
|
'xmlParseCDSect': True,
|
||||||
|
'xmlParseCharData': True,
|
||||||
|
'xmlParseCharRef': True,
|
||||||
|
'xmlParseComment': True,
|
||||||
|
'xmlParseDefaultDecl': True,
|
||||||
|
'xmlParseDocTypeDecl': True,
|
||||||
|
'xmlParseEndTag': True,
|
||||||
|
'xmlParseElement': True,
|
||||||
|
'xmlParseElementChildrenContentDecl': True,
|
||||||
|
'xmlParseElementContentDecl': True,
|
||||||
|
'xmlParseElementDecl': True,
|
||||||
|
'xmlParseElementMixedContentDecl': True,
|
||||||
|
'xmlParseEncName': True,
|
||||||
|
'xmlParseEncodingDecl': True,
|
||||||
|
'xmlParseEntityDecl': True,
|
||||||
|
'xmlParseEntityValue': True,
|
||||||
|
'xmlParseEnumeratedType': True,
|
||||||
|
'xmlParseEnumerationType': True,
|
||||||
|
'xmlParseExternalID': True,
|
||||||
|
'xmlParseExternalSubset': True,
|
||||||
|
'xmlParseMarkupDecl': True,
|
||||||
|
'xmlParseMisc': True,
|
||||||
|
'xmlParseName': True,
|
||||||
|
'xmlParseNmtoken': True,
|
||||||
|
'xmlParseNotationDecl': True,
|
||||||
|
'xmlParseNotationType': True,
|
||||||
|
'xmlParsePEReference': True,
|
||||||
|
'xmlParsePI': True,
|
||||||
|
'xmlParsePITarget': True,
|
||||||
|
'xmlParsePubidLiteral': True,
|
||||||
|
'xmlParseReference': True,
|
||||||
|
'xmlParseSDDecl': True,
|
||||||
|
'xmlParseStartTag': True,
|
||||||
|
'xmlParseSystemLiteral': True,
|
||||||
|
'xmlParseTextDecl': True,
|
||||||
|
'xmlParseVersionInfo': True,
|
||||||
|
'xmlParseVersionNum': True,
|
||||||
|
'xmlParseXMLDecl': True,
|
||||||
|
'xmlParserHandlePEReference': True,
|
||||||
|
'xmlSkipBlankChars': True,
|
||||||
|
|
||||||
|
# reads from stdin
|
||||||
|
'htmlReadFd': True,
|
||||||
|
'xmlReadFd': True,
|
||||||
|
'xmlReaderForFd': True,
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse document
|
||||||
|
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
buildDir = sys.argv[1]
|
||||||
|
else:
|
||||||
|
buildDir = '.'
|
||||||
|
|
||||||
|
xmlDocDir = buildDir + '/doc/xml'
|
||||||
|
|
||||||
|
filenames = {}
|
||||||
|
functions = {}
|
||||||
|
|
||||||
|
for file in os.listdir(xmlDocDir):
|
||||||
|
if not file.endswith('_8h.xml'):
|
||||||
|
continue
|
||||||
|
|
||||||
|
doc = etree.parse(xmlDocDir + '/' + file)
|
||||||
|
|
||||||
|
compound = doc.find('compounddef')
|
||||||
|
module = compound.find('compoundname').text
|
||||||
|
if not module.endswith('.h'):
|
||||||
|
continue
|
||||||
|
module = module[:-2]
|
||||||
|
|
||||||
|
for section in compound.findall('sectiondef'):
|
||||||
|
if section.get('kind') != 'func':
|
||||||
|
continue
|
||||||
|
|
||||||
|
for func in section.findall('memberdef'):
|
||||||
|
name = func.find('name').text
|
||||||
|
if name in blockList:
|
||||||
|
continue
|
||||||
|
|
||||||
|
module1, module2 = xmlmod.findModules(module, name)
|
||||||
|
|
||||||
|
cargs = []
|
||||||
|
skip = False
|
||||||
|
for arg in func.findall('param'):
|
||||||
|
atype = etree.tostring(arg.find('type'),
|
||||||
|
method='text', encoding='unicode').rstrip()
|
||||||
|
if atype == 'void':
|
||||||
|
continue
|
||||||
|
if atype == 'va_list':
|
||||||
|
skip = True
|
||||||
|
break
|
||||||
|
if re.search(r'(Ptr|\*)$', atype):
|
||||||
|
cargs.append('NULL')
|
||||||
|
else:
|
||||||
|
cargs.append('0')
|
||||||
|
|
||||||
|
if skip:
|
||||||
|
continue
|
||||||
|
|
||||||
|
mfunc = functions.get(module1)
|
||||||
|
if mfunc is None:
|
||||||
|
mfunc = {}
|
||||||
|
functions[module1] = mfunc
|
||||||
|
|
||||||
|
mmfunc = mfunc.get(module2)
|
||||||
|
if mmfunc is None:
|
||||||
|
mmfunc = {}
|
||||||
|
mfunc[module2] = mmfunc
|
||||||
|
|
||||||
|
code = f'{name}({', '.join(cargs)})'
|
||||||
|
|
||||||
|
rtype = etree.tostring(func.find('type'),
|
||||||
|
method='text', encoding='unicode').rstrip()
|
||||||
|
dtor = dtors.get(rtype)
|
||||||
|
if dtor is not None:
|
||||||
|
code = f'{dtor}({code})'
|
||||||
|
elif rtype == 'xmlHashTable *':
|
||||||
|
code = f'xmlHashFree({code}, NULL)'
|
||||||
|
|
||||||
|
mmfunc[name] = f' {code};\n'
|
||||||
|
|
||||||
|
# Write output
|
||||||
|
|
||||||
|
test = open('testapi.c', 'w')
|
||||||
|
|
||||||
|
test.write("""/*
|
||||||
|
* testapi.c: libxml2 API tester program.
|
||||||
|
*
|
||||||
|
* Automatically generated by gentest.py
|
||||||
|
*
|
||||||
|
* See Copyright for the status of this software.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Disable deprecation warnings */
|
||||||
|
#define XML_DEPRECATED
|
||||||
|
|
||||||
|
#include "libxml.h"
|
||||||
|
#include <libxml/HTMLparser.h>
|
||||||
|
#include <libxml/HTMLtree.h>
|
||||||
|
#include <libxml/c14n.h>
|
||||||
|
#include <libxml/catalog.h>
|
||||||
|
#include <libxml/debugXML.h>
|
||||||
|
#include <libxml/parserInternals.h>
|
||||||
|
#include <libxml/pattern.h>
|
||||||
|
#include <libxml/relaxng.h>
|
||||||
|
#include <libxml/schematron.h>
|
||||||
|
#include <libxml/uri.h>
|
||||||
|
#include <libxml/xinclude.h>
|
||||||
|
#include <libxml/xlink.h>
|
||||||
|
#include <libxml/xmlmodule.h>
|
||||||
|
#include <libxml/xmlreader.h>
|
||||||
|
#include <libxml/xmlsave.h>
|
||||||
|
#include <libxml/xmlschemas.h>
|
||||||
|
#include <libxml/xmlschemastypes.h>
|
||||||
|
#include <libxml/xmlwriter.h>
|
||||||
|
#include <libxml/xpathInternals.h>
|
||||||
|
#include <libxml/xpointer.h>
|
||||||
|
|
||||||
|
static void
|
||||||
|
ignoreError(void *userData ATTRIBUTE_UNUSED,
|
||||||
|
const xmlError *error ATTRIBUTE_UNUSED) {
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
|
||||||
|
xmlInitParser();
|
||||||
|
xmlSetStructuredErrorFunc(NULL, ignoreError);
|
||||||
|
|
||||||
|
""")
|
||||||
|
|
||||||
|
for module1 in sorted(functions.keys()):
|
||||||
|
mfunc = functions[module1]
|
||||||
|
|
||||||
|
if module1 != '':
|
||||||
|
test.write(f'#ifdef LIBXML_{module1}_ENABLED\n')
|
||||||
|
|
||||||
|
for module2 in sorted(mfunc.keys()):
|
||||||
|
mmfunc = mfunc[module2]
|
||||||
|
|
||||||
|
if module2 != '':
|
||||||
|
test.write(f'#ifdef LIBXML_{module2}_ENABLED\n')
|
||||||
|
|
||||||
|
for name in sorted(mmfunc.keys()):
|
||||||
|
test.write(mmfunc[name])
|
||||||
|
|
||||||
|
if module2 != '':
|
||||||
|
test.write(f'#endif /* LIBXML_{module2}_ENABLED */\n')
|
||||||
|
|
||||||
|
if module1 != '':
|
||||||
|
test.write(f'#endif /* LIBXML_{module1}_ENABLED */\n')
|
||||||
|
|
||||||
|
test.write('\n')
|
||||||
|
|
||||||
|
test.write(""" xmlCleanupParser();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
""")
|
||||||
@@ -0,0 +1,252 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
#
|
||||||
|
# Original script modified in November 2003 to take advantage of
|
||||||
|
# the character-validation range routines, and updated to the
|
||||||
|
# current Unicode information (Version 4.0.1)
|
||||||
|
#
|
||||||
|
# NOTE: there is an 'alias' facility for blocks which are not present in
|
||||||
|
# the current release, but are needed for ABI compatibility. This
|
||||||
|
# must be accomplished MANUALLY! Please see the comments below under
|
||||||
|
# 'blockAliases'
|
||||||
|
#
|
||||||
|
import sys
|
||||||
|
import string
|
||||||
|
import rangetab
|
||||||
|
|
||||||
|
#
|
||||||
|
# blockAliases is a small hack - it is used for mapping block names which
|
||||||
|
# were were used in the 3.1 release, but are missing or changed in the current
|
||||||
|
# release. The format is "OldBlockName:NewBlockName1[,NewBlockName2[,...]]"
|
||||||
|
blockAliases = []
|
||||||
|
blockAliases.append("CombiningMarksforSymbols:CombiningDiacriticalMarksforSymbols")
|
||||||
|
blockAliases.append("Greek:GreekandCoptic")
|
||||||
|
blockAliases.append("PrivateUse:PrivateUseArea,SupplementaryPrivateUseArea-A," +
|
||||||
|
"SupplementaryPrivateUseArea-B")
|
||||||
|
|
||||||
|
# minTableSize gives the minimum number of ranges which must be present
|
||||||
|
# before a range table is produced. If there are less than this
|
||||||
|
# number, inline comparisons are generated
|
||||||
|
minTableSize = 8
|
||||||
|
|
||||||
|
blockfile = "Blocks-4.0.1.txt"
|
||||||
|
catfile = "UnicodeData-4.0.1.txt"
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Now process the "blocks" file, reducing it to a dictionary
|
||||||
|
# indexed by blockname, containing a tuple with the applicable
|
||||||
|
# block range
|
||||||
|
#
|
||||||
|
BlockNames = {}
|
||||||
|
try:
|
||||||
|
blocks = open(blockfile, "r")
|
||||||
|
except:
|
||||||
|
print("Missing %s, aborting ..." % blockfile)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
for line in blocks.readlines():
|
||||||
|
if line[0] == '#':
|
||||||
|
continue
|
||||||
|
line = line.strip()
|
||||||
|
if line == '':
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
fields = line.split(';')
|
||||||
|
range = fields[0].strip()
|
||||||
|
(start, end) = range.split("..")
|
||||||
|
name = fields[1].strip()
|
||||||
|
name = name.replace(' ', '')
|
||||||
|
except:
|
||||||
|
print("Failed to process line: %s" % (line))
|
||||||
|
continue
|
||||||
|
start = int(start, 16)
|
||||||
|
end = int(end, 16)
|
||||||
|
try:
|
||||||
|
BlockNames[name].append((start, end))
|
||||||
|
except:
|
||||||
|
BlockNames[name] = [(start, end)]
|
||||||
|
blocks.close()
|
||||||
|
print("Parsed %d blocks descriptions" % (len(BlockNames.keys())))
|
||||||
|
|
||||||
|
for block in blockAliases:
|
||||||
|
alias = block.split(':')
|
||||||
|
alist = alias[1].split(',')
|
||||||
|
for comp in alist:
|
||||||
|
if comp in BlockNames:
|
||||||
|
if alias[0] not in BlockNames:
|
||||||
|
BlockNames[alias[0]] = []
|
||||||
|
for r in BlockNames[comp]:
|
||||||
|
BlockNames[alias[0]].append(r)
|
||||||
|
else:
|
||||||
|
print("Alias %s: %s not in Blocks" % (alias[0], comp))
|
||||||
|
continue
|
||||||
|
|
||||||
|
#
|
||||||
|
# Next process the Categories file. This is more complex, since
|
||||||
|
# the file is in code sequence, and we need to invert it. We use
|
||||||
|
# a dictionary with index category-name, with each entry containing
|
||||||
|
# all the ranges (codepoints) of that category. Note that category
|
||||||
|
# names comprise two parts - the general category, and the "subclass"
|
||||||
|
# within that category. Therefore, both "general category" (which is
|
||||||
|
# the first character of the 2-character category-name) and the full
|
||||||
|
# (2-character) name are entered into this dictionary.
|
||||||
|
#
|
||||||
|
try:
|
||||||
|
data = open(catfile, "r")
|
||||||
|
except:
|
||||||
|
print("Missing %s, aborting ..." % catfile)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
nbchar = 0;
|
||||||
|
Categories = {}
|
||||||
|
for line in data.readlines():
|
||||||
|
if line[0] == '#':
|
||||||
|
continue
|
||||||
|
line = line.strip()
|
||||||
|
if line == '':
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
fields = line.split(';')
|
||||||
|
point = fields[0].strip()
|
||||||
|
value = 0
|
||||||
|
while point != '':
|
||||||
|
value = value * 16
|
||||||
|
if point[0] >= '0' and point[0] <= '9':
|
||||||
|
value = value + ord(point[0]) - ord('0')
|
||||||
|
elif point[0] >= 'A' and point[0] <= 'F':
|
||||||
|
value = value + 10 + ord(point[0]) - ord('A')
|
||||||
|
elif point[0] >= 'a' and point[0] <= 'f':
|
||||||
|
value = value + 10 + ord(point[0]) - ord('a')
|
||||||
|
point = point[1:]
|
||||||
|
name = fields[2]
|
||||||
|
except:
|
||||||
|
print("Failed to process line: %s" % (line))
|
||||||
|
continue
|
||||||
|
|
||||||
|
nbchar = nbchar + 1
|
||||||
|
# update entry for "full name"
|
||||||
|
try:
|
||||||
|
Categories[name].append(value)
|
||||||
|
except:
|
||||||
|
try:
|
||||||
|
Categories[name] = [value]
|
||||||
|
except:
|
||||||
|
print("Failed to process line: %s" % (line))
|
||||||
|
# update "general category" name
|
||||||
|
try:
|
||||||
|
Categories[name[0]].append(value)
|
||||||
|
except:
|
||||||
|
try:
|
||||||
|
Categories[name[0]] = [value]
|
||||||
|
except:
|
||||||
|
print("Failed to process line: %s" % (line))
|
||||||
|
|
||||||
|
data.close()
|
||||||
|
print("Parsed %d char generating %d categories" % (nbchar, len(Categories.keys())))
|
||||||
|
|
||||||
|
#
|
||||||
|
# The data is now all read. Time to process it into a more useful form.
|
||||||
|
#
|
||||||
|
# reduce the number list into ranges
|
||||||
|
for cat in Categories.keys():
|
||||||
|
list = Categories[cat]
|
||||||
|
start = -1
|
||||||
|
prev = -1
|
||||||
|
end = -1
|
||||||
|
ranges = []
|
||||||
|
for val in list:
|
||||||
|
if start == -1:
|
||||||
|
start = val
|
||||||
|
prev = val
|
||||||
|
continue
|
||||||
|
elif val == prev + 1:
|
||||||
|
prev = val
|
||||||
|
continue
|
||||||
|
elif prev == start:
|
||||||
|
ranges.append((prev, prev))
|
||||||
|
start = val
|
||||||
|
prev = val
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
ranges.append((start, prev))
|
||||||
|
start = val
|
||||||
|
prev = val
|
||||||
|
continue
|
||||||
|
if prev == start:
|
||||||
|
ranges.append((prev, prev))
|
||||||
|
else:
|
||||||
|
ranges.append((start, prev))
|
||||||
|
Categories[cat] = ranges
|
||||||
|
|
||||||
|
#
|
||||||
|
# Assure all data is in alphabetic order, since we will be doing binary
|
||||||
|
# searches on the tables.
|
||||||
|
#
|
||||||
|
bkeys = sorted(BlockNames.keys())
|
||||||
|
|
||||||
|
ckeys = sorted(Categories.keys())
|
||||||
|
|
||||||
|
#
|
||||||
|
# Generate the resulting files
|
||||||
|
#
|
||||||
|
try:
|
||||||
|
output = open("codegen/unicode.inc", "w")
|
||||||
|
except:
|
||||||
|
print("Failed to open codegen/unicode.inc")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
#
|
||||||
|
# For any categories with more than minTableSize ranges we generate
|
||||||
|
# a range table suitable for xmlCharInRange
|
||||||
|
#
|
||||||
|
for name in ckeys:
|
||||||
|
if len(Categories[name]) <= minTableSize or name == 'Cs':
|
||||||
|
continue
|
||||||
|
ranges = Categories[name]
|
||||||
|
group = rangetab.gen_range_tables(output, 'xml' + name, 'S', 'L', ranges)
|
||||||
|
output.write("static const xmlChRangeGroup xml%sG = %s;\n\n" %
|
||||||
|
(name, group))
|
||||||
|
|
||||||
|
for name in ckeys:
|
||||||
|
if name == 'Cs':
|
||||||
|
continue
|
||||||
|
ranges = Categories[name]
|
||||||
|
output.write("static int\nxmlUCSIsCat%s(int code) {\n" % name)
|
||||||
|
if len(Categories[name]) > minTableSize:
|
||||||
|
output.write(" return(xmlCharInRange((unsigned int)code, &xml%sG)"
|
||||||
|
% name)
|
||||||
|
else:
|
||||||
|
start = 1
|
||||||
|
for range in ranges:
|
||||||
|
(begin, end) = range;
|
||||||
|
if start:
|
||||||
|
output.write(" return(");
|
||||||
|
start = 0
|
||||||
|
else:
|
||||||
|
output.write(" ||\n ");
|
||||||
|
if (begin == end):
|
||||||
|
output.write("(code == %s)" % (hex(begin)))
|
||||||
|
else:
|
||||||
|
output.write("((code >= %s) && (code <= %s))" % (
|
||||||
|
hex(begin), hex(end)))
|
||||||
|
output.write(");\n}\n\n")
|
||||||
|
|
||||||
|
#
|
||||||
|
# Range tables for blocks
|
||||||
|
#
|
||||||
|
|
||||||
|
blockGroups = ''
|
||||||
|
for block in bkeys:
|
||||||
|
name = block.replace('-', '')
|
||||||
|
ranges = BlockNames[block]
|
||||||
|
group = rangetab.gen_range_tables(output, 'xml' + name, 'S', 'L', ranges)
|
||||||
|
output.write("\n")
|
||||||
|
if blockGroups != '':
|
||||||
|
blockGroups += ",\n"
|
||||||
|
blockGroups += ' {"%s",\n %s}' % (block, group)
|
||||||
|
|
||||||
|
output.write("static const xmlUnicodeRange xmlUnicodeBlocks[] = {\n")
|
||||||
|
output.write(blockGroups)
|
||||||
|
output.write("\n};\n\n")
|
||||||
|
|
||||||
|
output.close()
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,361 @@
|
|||||||
|
name xmlIsChar
|
||||||
|
ur 0x9
|
||||||
|
ur 0xA
|
||||||
|
ur 0xD
|
||||||
|
ur 0x20..0xFF
|
||||||
|
ur 0x0100..0xD7FF
|
||||||
|
ur 0xE000..0xFFFD
|
||||||
|
ur 0x10000..0x10FFFF
|
||||||
|
end xmlIsChar
|
||||||
|
|
||||||
|
name xmlIsPubidChar
|
||||||
|
ur 0x20 0x0d 0x0a 'a'..'z' 'A'..'Z' '0'..'9'
|
||||||
|
ur '-' 0x27 '(' ')' '+' ',' '.' '/'
|
||||||
|
ur ':' '=' '?' ';' '!' '*' '#' '@'
|
||||||
|
ur '$' '_' '%'
|
||||||
|
end
|
||||||
|
|
||||||
|
name xmlIsBlank
|
||||||
|
ur 0x09 0x0a 0x0d 0x20
|
||||||
|
end xmlIsBlank
|
||||||
|
|
||||||
|
name xmlIsBaseChar
|
||||||
|
ur 0x0041..0x005A
|
||||||
|
ur 0x0061..0x007A
|
||||||
|
ur 0x00C0..0x00D6
|
||||||
|
ur 0x00D8..0x00F6
|
||||||
|
ur 0x00F8..0x00FF
|
||||||
|
ur 0x0100..0x0131
|
||||||
|
ur 0x0134..0x013E
|
||||||
|
ur 0x0141..0x0148
|
||||||
|
ur 0x014A..0x017E
|
||||||
|
ur 0x0180..0x01C3
|
||||||
|
ur 0x01CD..0x01F0
|
||||||
|
ur 0x01F4..0x01F5
|
||||||
|
ur 0x01FA..0x0217
|
||||||
|
ur 0x0250..0x02A8
|
||||||
|
ur 0x02BB..0x02C1
|
||||||
|
ur 0x0386
|
||||||
|
ur 0x0388..0x038A
|
||||||
|
ur 0x038C
|
||||||
|
ur 0x038E..0x03A1
|
||||||
|
ur 0x03A3..0x03CE
|
||||||
|
ur 0x03D0..0x03D6
|
||||||
|
ur 0x03DA
|
||||||
|
ur 0x03DC
|
||||||
|
ur 0x03DE
|
||||||
|
ur 0x03E0
|
||||||
|
ur 0x03E2..0x03F3
|
||||||
|
ur 0x0401..0x040C
|
||||||
|
ur 0x040E..0x044F
|
||||||
|
ur 0x0451..0x045C
|
||||||
|
ur 0x045E..0x0481
|
||||||
|
ur 0x0490..0x04C4
|
||||||
|
ur 0x04C7..0x04C8
|
||||||
|
ur 0x04CB..0x04CC
|
||||||
|
ur 0x04D0..0x04EB
|
||||||
|
ur 0x04EE..0x04F5
|
||||||
|
ur 0x04F8..0x04F9
|
||||||
|
ur 0x0531..0x0556
|
||||||
|
ur 0x0559
|
||||||
|
ur 0x0561..0x0586
|
||||||
|
ur 0x05D0..0x05EA
|
||||||
|
ur 0x05F0..0x05F2
|
||||||
|
ur 0x0621..0x063A
|
||||||
|
ur 0x0641..0x064A
|
||||||
|
ur 0x0671..0x06B7
|
||||||
|
ur 0x06BA..0x06BE
|
||||||
|
ur 0x06C0..0x06CE
|
||||||
|
ur 0x06D0..0x06D3
|
||||||
|
ur 0x06D5
|
||||||
|
ur 0x06E5..0x06E6
|
||||||
|
ur 0x0905..0x0939
|
||||||
|
ur 0x093D
|
||||||
|
ur 0x0958..0x0961
|
||||||
|
ur 0x0985..0x098C
|
||||||
|
ur 0x098F..0x0990
|
||||||
|
ur 0x0993..0x09A8
|
||||||
|
ur 0x09AA..0x09B0
|
||||||
|
ur 0x09B2
|
||||||
|
ur 0x09B6..0x09B9
|
||||||
|
ur 0x09DC..0x09DD
|
||||||
|
ur 0x09DF..0x09E1
|
||||||
|
ur 0x09F0..0x09F1
|
||||||
|
ur 0x0A05..0x0A0A
|
||||||
|
ur 0x0A0F..0x0A10
|
||||||
|
ur 0x0A13..0x0A28
|
||||||
|
ur 0x0A2A..0x0A30
|
||||||
|
ur 0x0A32..0x0A33
|
||||||
|
ur 0x0A35..0x0A36
|
||||||
|
ur 0x0A38..0x0A39
|
||||||
|
ur 0x0A59..0x0A5C
|
||||||
|
ur 0x0A5E
|
||||||
|
ur 0x0A72..0x0A74
|
||||||
|
ur 0x0A85..0x0A8B
|
||||||
|
ur 0x0A8D
|
||||||
|
ur 0x0A8F..0x0A91
|
||||||
|
ur 0x0A93..0x0AA8
|
||||||
|
ur 0x0AAA..0x0AB0
|
||||||
|
ur 0x0AB2..0x0AB3
|
||||||
|
ur 0x0AB5..0x0AB9
|
||||||
|
ur 0x0ABD
|
||||||
|
ur 0x0AE0
|
||||||
|
ur 0x0B05..0x0B0C
|
||||||
|
ur 0x0B0F..0x0B10
|
||||||
|
ur 0x0B13..0x0B28
|
||||||
|
ur 0x0B2A..0x0B30
|
||||||
|
ur 0x0B32..0x0B33
|
||||||
|
ur 0x0B36..0x0B39
|
||||||
|
ur 0x0B3D
|
||||||
|
ur 0x0B5C..0x0B5D
|
||||||
|
ur 0x0B5F..0x0B61
|
||||||
|
ur 0x0B85..0x0B8A
|
||||||
|
ur 0x0B8E..0x0B90
|
||||||
|
ur 0x0B92..0x0B95
|
||||||
|
ur 0x0B99..0x0B9A
|
||||||
|
ur 0x0B9C
|
||||||
|
ur 0x0B9E..0x0B9F
|
||||||
|
ur 0x0BA3..0x0BA4
|
||||||
|
ur 0x0BA8..0x0BAA
|
||||||
|
ur 0x0BAE..0x0BB5
|
||||||
|
ur 0x0BB7..0x0BB9
|
||||||
|
ur 0x0C05..0x0C0C
|
||||||
|
ur 0x0C0E..0x0C10
|
||||||
|
ur 0x0C12..0x0C28
|
||||||
|
ur 0x0C2A..0x0C33
|
||||||
|
ur 0x0C35..0x0C39
|
||||||
|
ur 0x0C60..0x0C61
|
||||||
|
ur 0x0C85..0x0C8C
|
||||||
|
ur 0x0C8E..0x0C90
|
||||||
|
ur 0x0C92..0x0CA8
|
||||||
|
ur 0x0CAA..0x0CB3
|
||||||
|
ur 0x0CB5..0x0CB9
|
||||||
|
ur 0x0CDE
|
||||||
|
ur 0x0CE0..0x0CE1
|
||||||
|
ur 0x0D05..0x0D0C
|
||||||
|
ur 0x0D0E..0x0D10
|
||||||
|
ur 0x0D12..0x0D28
|
||||||
|
ur 0x0D2A..0x0D39
|
||||||
|
ur 0x0D60..0x0D61
|
||||||
|
ur 0x0E01..0x0E2E
|
||||||
|
ur 0x0E30
|
||||||
|
ur 0x0E32..0x0E33
|
||||||
|
ur 0x0E40..0x0E45
|
||||||
|
ur 0x0E81..0x0E82
|
||||||
|
ur 0x0E84
|
||||||
|
ur 0x0E87..0x0E88
|
||||||
|
ur 0x0E8A
|
||||||
|
ur 0x0E8D
|
||||||
|
ur 0x0E94..0x0E97
|
||||||
|
ur 0x0E99..0x0E9F
|
||||||
|
ur 0x0EA1..0x0EA3
|
||||||
|
ur 0x0EA5
|
||||||
|
ur 0x0EA7
|
||||||
|
ur 0x0EAA..0x0EAB
|
||||||
|
ur 0x0EAD..0x0EAE
|
||||||
|
ur 0x0EB0
|
||||||
|
ur 0x0EB2..0x0EB3
|
||||||
|
ur 0x0EBD
|
||||||
|
ur 0x0EC0..0x0EC4
|
||||||
|
ur 0x0F40..0x0F47
|
||||||
|
ur 0x0F49..0x0F69
|
||||||
|
ur 0x10A0..0x10C5
|
||||||
|
ur 0x10D0..0x10F6
|
||||||
|
ur 0x1100
|
||||||
|
ur 0x1102..0x1103
|
||||||
|
ur 0x1105..0x1107
|
||||||
|
ur 0x1109
|
||||||
|
ur 0x110B..0x110C
|
||||||
|
ur 0x110E..0x1112
|
||||||
|
ur 0x113C
|
||||||
|
ur 0x113E
|
||||||
|
ur 0x1140
|
||||||
|
ur 0x114C
|
||||||
|
ur 0x114E
|
||||||
|
ur 0x1150
|
||||||
|
ur 0x1154..0x1155
|
||||||
|
ur 0x1159
|
||||||
|
ur 0x115F..0x1161
|
||||||
|
ur 0x1163
|
||||||
|
ur 0x1165
|
||||||
|
ur 0x1167
|
||||||
|
ur 0x1169
|
||||||
|
ur 0x116D..0x116E
|
||||||
|
ur 0x1172..0x1173
|
||||||
|
ur 0x1175
|
||||||
|
ur 0x119E
|
||||||
|
ur 0x11A8
|
||||||
|
ur 0x11AB
|
||||||
|
ur 0x11AE..0x11AF
|
||||||
|
ur 0x11B7..0x11B8
|
||||||
|
ur 0x11BA
|
||||||
|
ur 0x11BC..0x11C2
|
||||||
|
ur 0x11EB
|
||||||
|
ur 0x11F0
|
||||||
|
ur 0x11F9
|
||||||
|
ur 0x1E00..0x1E9B
|
||||||
|
ur 0x1EA0..0x1EF9
|
||||||
|
ur 0x1F00..0x1F15
|
||||||
|
ur 0x1F18..0x1F1D
|
||||||
|
ur 0x1F20..0x1F45
|
||||||
|
ur 0x1F48..0x1F4D
|
||||||
|
ur 0x1F50..0x1F57
|
||||||
|
ur 0x1F59
|
||||||
|
ur 0x1F5B
|
||||||
|
ur 0x1F5D
|
||||||
|
ur 0x1F5F..0x1F7D
|
||||||
|
ur 0x1F80..0x1FB4
|
||||||
|
ur 0x1FB6..0x1FBC
|
||||||
|
ur 0x1FBE
|
||||||
|
ur 0x1FC2..0x1FC4
|
||||||
|
ur 0x1FC6..0x1FCC
|
||||||
|
ur 0x1FD0..0x1FD3
|
||||||
|
ur 0x1FD6..0x1FDB
|
||||||
|
ur 0x1FE0..0x1FEC
|
||||||
|
ur 0x1FF2..0x1FF4
|
||||||
|
ur 0x1FF6..0x1FFC
|
||||||
|
ur 0x2126
|
||||||
|
ur 0x212A..0x212B
|
||||||
|
ur 0x212E
|
||||||
|
ur 0x2180..0x2182
|
||||||
|
ur 0x3041..0x3094
|
||||||
|
ur 0x30A1..0x30FA
|
||||||
|
ur 0x3105..0x312C
|
||||||
|
ur 0xAC00..0xD7A3
|
||||||
|
end xmlIsBaseChar
|
||||||
|
|
||||||
|
name xmlIsIdeographic
|
||||||
|
ur 0x4E00..0x9FA5
|
||||||
|
ur 0x3007
|
||||||
|
ur 0x3021..0x3029
|
||||||
|
end xmlIsIdeographic
|
||||||
|
|
||||||
|
name xmlIsCombining
|
||||||
|
ur 0x0300..0x0345
|
||||||
|
ur 0x0360..0x0361
|
||||||
|
ur 0x0483..0x0486
|
||||||
|
ur 0x0591..0x05A1
|
||||||
|
ur 0x05A3..0x05B9
|
||||||
|
ur 0x05BB..0x05BD
|
||||||
|
ur 0x05BF
|
||||||
|
ur 0x05C1..0x05C2
|
||||||
|
ur 0x05C4
|
||||||
|
ur 0x064B..0x0652
|
||||||
|
ur 0x0670
|
||||||
|
ur 0x06D6..0x06DC
|
||||||
|
ur 0x06DD..0x06DF
|
||||||
|
ur 0x06E0..0x06E4
|
||||||
|
ur 0x06E7..0x06E8
|
||||||
|
ur 0x06EA..0x06ED
|
||||||
|
ur 0x0901..0x0903
|
||||||
|
ur 0x093C
|
||||||
|
ur 0x093E..0x094C
|
||||||
|
ur 0x094D
|
||||||
|
ur 0x0951..0x0954
|
||||||
|
ur 0x0962..0x0963
|
||||||
|
ur 0x0981..0x0983
|
||||||
|
ur 0x09BC
|
||||||
|
ur 0x09BE
|
||||||
|
ur 0x09BF
|
||||||
|
ur 0x09C0..0x09C4
|
||||||
|
ur 0x09C7..0x09C8
|
||||||
|
ur 0x09CB..0x09CD
|
||||||
|
ur 0x09D7
|
||||||
|
ur 0x09E2..0x09E3
|
||||||
|
ur 0x0A02
|
||||||
|
ur 0x0A3C
|
||||||
|
ur 0x0A3E
|
||||||
|
ur 0x0A3F
|
||||||
|
ur 0x0A40..0x0A42
|
||||||
|
ur 0x0A47..0x0A48
|
||||||
|
ur 0x0A4B..0x0A4D
|
||||||
|
ur 0x0A70..0x0A71
|
||||||
|
ur 0x0A81..0x0A83
|
||||||
|
ur 0x0ABC
|
||||||
|
ur 0x0ABE..0x0AC5
|
||||||
|
ur 0x0AC7..0x0AC9
|
||||||
|
ur 0x0ACB..0x0ACD
|
||||||
|
ur 0x0B01..0x0B03
|
||||||
|
ur 0x0B3C
|
||||||
|
ur 0x0B3E..0x0B43
|
||||||
|
ur 0x0B47..0x0B48
|
||||||
|
ur 0x0B4B..0x0B4D
|
||||||
|
ur 0x0B56..0x0B57
|
||||||
|
ur 0x0B82..0x0B83
|
||||||
|
ur 0x0BBE..0x0BC2
|
||||||
|
ur 0x0BC6..0x0BC8
|
||||||
|
ur 0x0BCA..0x0BCD
|
||||||
|
ur 0x0BD7
|
||||||
|
ur 0x0C01..0x0C03
|
||||||
|
ur 0x0C3E..0x0C44
|
||||||
|
ur 0x0C46..0x0C48
|
||||||
|
ur 0x0C4A..0x0C4D
|
||||||
|
ur 0x0C55..0x0C56
|
||||||
|
ur 0x0C82..0x0C83
|
||||||
|
ur 0x0CBE..0x0CC4
|
||||||
|
ur 0x0CC6..0x0CC8
|
||||||
|
ur 0x0CCA..0x0CCD
|
||||||
|
ur 0x0CD5..0x0CD6
|
||||||
|
ur 0x0D02..0x0D03
|
||||||
|
ur 0x0D3E..0x0D43
|
||||||
|
ur 0x0D46..0x0D48
|
||||||
|
ur 0x0D4A..0x0D4D
|
||||||
|
ur 0x0D57
|
||||||
|
ur 0x0E31
|
||||||
|
ur 0x0E34..0x0E3A
|
||||||
|
ur 0x0E47..0x0E4E
|
||||||
|
ur 0x0EB1
|
||||||
|
ur 0x0EB4..0x0EB9
|
||||||
|
ur 0x0EBB..0x0EBC
|
||||||
|
ur 0x0EC8..0x0ECD
|
||||||
|
ur 0x0F18..0x0F19
|
||||||
|
ur 0x0F35
|
||||||
|
ur 0x0F37
|
||||||
|
ur 0x0F39
|
||||||
|
ur 0x0F3E
|
||||||
|
ur 0x0F3F
|
||||||
|
ur 0x0F71..0x0F84
|
||||||
|
ur 0x0F86..0x0F8B
|
||||||
|
ur 0x0F90..0x0F95
|
||||||
|
ur 0x0F97
|
||||||
|
ur 0x0F99..0x0FAD
|
||||||
|
ur 0x0FB1..0x0FB7
|
||||||
|
ur 0x0FB9
|
||||||
|
ur 0x20D0..0x20DC
|
||||||
|
ur 0x20E1
|
||||||
|
ur 0x302A..0x302F
|
||||||
|
ur 0x3099
|
||||||
|
ur 0x309A
|
||||||
|
end xmlIsCombining
|
||||||
|
|
||||||
|
name xmlIsDigit
|
||||||
|
ur 0x0030..0x0039
|
||||||
|
ur 0x0660..0x0669
|
||||||
|
ur 0x06F0..0x06F9
|
||||||
|
ur 0x0966..0x096F
|
||||||
|
ur 0x09E6..0x09EF
|
||||||
|
ur 0x0A66..0x0A6F
|
||||||
|
ur 0x0AE6..0x0AEF
|
||||||
|
ur 0x0B66..0x0B6F
|
||||||
|
ur 0x0BE7..0x0BEF
|
||||||
|
ur 0x0C66..0x0C6F
|
||||||
|
ur 0x0CE6..0x0CEF
|
||||||
|
ur 0x0D66..0x0D6F
|
||||||
|
ur 0x0E50..0x0E59
|
||||||
|
ur 0x0ED0..0x0ED9
|
||||||
|
ur 0x0F20..0x0F29
|
||||||
|
end xmlIsDigit
|
||||||
|
|
||||||
|
name xmlIsExtender
|
||||||
|
ur 0x00B7
|
||||||
|
ur 0x02D0
|
||||||
|
ur 0x02D1
|
||||||
|
ur 0x0387
|
||||||
|
ur 0x0640
|
||||||
|
ur 0x0E46
|
||||||
|
ur 0x0EC6
|
||||||
|
ur 0x3005
|
||||||
|
ur 0x3031..0x3035
|
||||||
|
ur 0x309D..0x309E
|
||||||
|
ur 0x30FC..0x30FE
|
||||||
|
end xmlIsExtender
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
const unsigned char xmlIsPubidChar_tab[256] = {
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
|
||||||
|
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01,
|
||||||
|
0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01,
|
||||||
|
0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00 };
|
||||||
|
|
||||||
|
static const xmlChSRange xmlIsBaseChar_srng[] = {{0x100, 0x131},
|
||||||
|
{0x134, 0x13e}, {0x141, 0x148}, {0x14a, 0x17e}, {0x180, 0x1c3},
|
||||||
|
{0x1cd, 0x1f0}, {0x1f4, 0x1f5}, {0x1fa, 0x217}, {0x250, 0x2a8},
|
||||||
|
{0x2bb, 0x2c1}, {0x386, 0x386}, {0x388, 0x38a}, {0x38c, 0x38c},
|
||||||
|
{0x38e, 0x3a1}, {0x3a3, 0x3ce}, {0x3d0, 0x3d6}, {0x3da, 0x3da},
|
||||||
|
{0x3dc, 0x3dc}, {0x3de, 0x3de}, {0x3e0, 0x3e0}, {0x3e2, 0x3f3},
|
||||||
|
{0x401, 0x40c}, {0x40e, 0x44f}, {0x451, 0x45c}, {0x45e, 0x481},
|
||||||
|
{0x490, 0x4c4}, {0x4c7, 0x4c8}, {0x4cb, 0x4cc}, {0x4d0, 0x4eb},
|
||||||
|
{0x4ee, 0x4f5}, {0x4f8, 0x4f9}, {0x531, 0x556}, {0x559, 0x559},
|
||||||
|
{0x561, 0x586}, {0x5d0, 0x5ea}, {0x5f0, 0x5f2}, {0x621, 0x63a},
|
||||||
|
{0x641, 0x64a}, {0x671, 0x6b7}, {0x6ba, 0x6be}, {0x6c0, 0x6ce},
|
||||||
|
{0x6d0, 0x6d3}, {0x6d5, 0x6d5}, {0x6e5, 0x6e6}, {0x905, 0x939},
|
||||||
|
{0x93d, 0x93d}, {0x958, 0x961}, {0x985, 0x98c}, {0x98f, 0x990},
|
||||||
|
{0x993, 0x9a8}, {0x9aa, 0x9b0}, {0x9b2, 0x9b2}, {0x9b6, 0x9b9},
|
||||||
|
{0x9dc, 0x9dd}, {0x9df, 0x9e1}, {0x9f0, 0x9f1}, {0xa05, 0xa0a},
|
||||||
|
{0xa0f, 0xa10}, {0xa13, 0xa28}, {0xa2a, 0xa30}, {0xa32, 0xa33},
|
||||||
|
{0xa35, 0xa36}, {0xa38, 0xa39}, {0xa59, 0xa5c}, {0xa5e, 0xa5e},
|
||||||
|
{0xa72, 0xa74}, {0xa85, 0xa8b}, {0xa8d, 0xa8d}, {0xa8f, 0xa91},
|
||||||
|
{0xa93, 0xaa8}, {0xaaa, 0xab0}, {0xab2, 0xab3}, {0xab5, 0xab9},
|
||||||
|
{0xabd, 0xabd}, {0xae0, 0xae0}, {0xb05, 0xb0c}, {0xb0f, 0xb10},
|
||||||
|
{0xb13, 0xb28}, {0xb2a, 0xb30}, {0xb32, 0xb33}, {0xb36, 0xb39},
|
||||||
|
{0xb3d, 0xb3d}, {0xb5c, 0xb5d}, {0xb5f, 0xb61}, {0xb85, 0xb8a},
|
||||||
|
{0xb8e, 0xb90}, {0xb92, 0xb95}, {0xb99, 0xb9a}, {0xb9c, 0xb9c},
|
||||||
|
{0xb9e, 0xb9f}, {0xba3, 0xba4}, {0xba8, 0xbaa}, {0xbae, 0xbb5},
|
||||||
|
{0xbb7, 0xbb9}, {0xc05, 0xc0c}, {0xc0e, 0xc10}, {0xc12, 0xc28},
|
||||||
|
{0xc2a, 0xc33}, {0xc35, 0xc39}, {0xc60, 0xc61}, {0xc85, 0xc8c},
|
||||||
|
{0xc8e, 0xc90}, {0xc92, 0xca8}, {0xcaa, 0xcb3}, {0xcb5, 0xcb9},
|
||||||
|
{0xcde, 0xcde}, {0xce0, 0xce1}, {0xd05, 0xd0c}, {0xd0e, 0xd10},
|
||||||
|
{0xd12, 0xd28}, {0xd2a, 0xd39}, {0xd60, 0xd61}, {0xe01, 0xe2e},
|
||||||
|
{0xe30, 0xe30}, {0xe32, 0xe33}, {0xe40, 0xe45}, {0xe81, 0xe82},
|
||||||
|
{0xe84, 0xe84}, {0xe87, 0xe88}, {0xe8a, 0xe8a}, {0xe8d, 0xe8d},
|
||||||
|
{0xe94, 0xe97}, {0xe99, 0xe9f}, {0xea1, 0xea3}, {0xea5, 0xea5},
|
||||||
|
{0xea7, 0xea7}, {0xeaa, 0xeab}, {0xead, 0xeae}, {0xeb0, 0xeb0},
|
||||||
|
{0xeb2, 0xeb3}, {0xebd, 0xebd}, {0xec0, 0xec4}, {0xf40, 0xf47},
|
||||||
|
{0xf49, 0xf69}, {0x10a0, 0x10c5}, {0x10d0, 0x10f6}, {0x1100, 0x1100},
|
||||||
|
{0x1102, 0x1103}, {0x1105, 0x1107}, {0x1109, 0x1109}, {0x110b, 0x110c},
|
||||||
|
{0x110e, 0x1112}, {0x113c, 0x113c}, {0x113e, 0x113e}, {0x1140, 0x1140},
|
||||||
|
{0x114c, 0x114c}, {0x114e, 0x114e}, {0x1150, 0x1150}, {0x1154, 0x1155},
|
||||||
|
{0x1159, 0x1159}, {0x115f, 0x1161}, {0x1163, 0x1163}, {0x1165, 0x1165},
|
||||||
|
{0x1167, 0x1167}, {0x1169, 0x1169}, {0x116d, 0x116e}, {0x1172, 0x1173},
|
||||||
|
{0x1175, 0x1175}, {0x119e, 0x119e}, {0x11a8, 0x11a8}, {0x11ab, 0x11ab},
|
||||||
|
{0x11ae, 0x11af}, {0x11b7, 0x11b8}, {0x11ba, 0x11ba}, {0x11bc, 0x11c2},
|
||||||
|
{0x11eb, 0x11eb}, {0x11f0, 0x11f0}, {0x11f9, 0x11f9}, {0x1e00, 0x1e9b},
|
||||||
|
{0x1ea0, 0x1ef9}, {0x1f00, 0x1f15}, {0x1f18, 0x1f1d}, {0x1f20, 0x1f45},
|
||||||
|
{0x1f48, 0x1f4d}, {0x1f50, 0x1f57}, {0x1f59, 0x1f59}, {0x1f5b, 0x1f5b},
|
||||||
|
{0x1f5d, 0x1f5d}, {0x1f5f, 0x1f7d}, {0x1f80, 0x1fb4}, {0x1fb6, 0x1fbc},
|
||||||
|
{0x1fbe, 0x1fbe}, {0x1fc2, 0x1fc4}, {0x1fc6, 0x1fcc}, {0x1fd0, 0x1fd3},
|
||||||
|
{0x1fd6, 0x1fdb}, {0x1fe0, 0x1fec}, {0x1ff2, 0x1ff4}, {0x1ff6, 0x1ffc},
|
||||||
|
{0x2126, 0x2126}, {0x212a, 0x212b}, {0x212e, 0x212e}, {0x2180, 0x2182},
|
||||||
|
{0x3041, 0x3094}, {0x30a1, 0x30fa}, {0x3105, 0x312c}, {0xac00, 0xd7a3}};
|
||||||
|
const xmlChRangeGroup xmlIsBaseCharGroup =
|
||||||
|
{197,0,xmlIsBaseChar_srng,NULL};
|
||||||
|
|
||||||
|
static const xmlChSRange xmlIsChar_srng[] = {{0x100, 0xd7ff},
|
||||||
|
{0xe000, 0xfffd}};
|
||||||
|
static const xmlChLRange xmlIsChar_lrng[] = {{0x10000, 0x10ffff}};
|
||||||
|
const xmlChRangeGroup xmlIsCharGroup =
|
||||||
|
{2,1,xmlIsChar_srng,xmlIsChar_lrng};
|
||||||
|
|
||||||
|
static const xmlChSRange xmlIsCombining_srng[] = {{0x300, 0x345},
|
||||||
|
{0x360, 0x361}, {0x483, 0x486}, {0x591, 0x5a1}, {0x5a3, 0x5b9},
|
||||||
|
{0x5bb, 0x5bd}, {0x5bf, 0x5bf}, {0x5c1, 0x5c2}, {0x5c4, 0x5c4},
|
||||||
|
{0x64b, 0x652}, {0x670, 0x670}, {0x6d6, 0x6dc}, {0x6dd, 0x6df},
|
||||||
|
{0x6e0, 0x6e4}, {0x6e7, 0x6e8}, {0x6ea, 0x6ed}, {0x901, 0x903},
|
||||||
|
{0x93c, 0x93c}, {0x93e, 0x94c}, {0x94d, 0x94d}, {0x951, 0x954},
|
||||||
|
{0x962, 0x963}, {0x981, 0x983}, {0x9bc, 0x9bc}, {0x9be, 0x9be},
|
||||||
|
{0x9bf, 0x9bf}, {0x9c0, 0x9c4}, {0x9c7, 0x9c8}, {0x9cb, 0x9cd},
|
||||||
|
{0x9d7, 0x9d7}, {0x9e2, 0x9e3}, {0xa02, 0xa02}, {0xa3c, 0xa3c},
|
||||||
|
{0xa3e, 0xa3e}, {0xa3f, 0xa3f}, {0xa40, 0xa42}, {0xa47, 0xa48},
|
||||||
|
{0xa4b, 0xa4d}, {0xa70, 0xa71}, {0xa81, 0xa83}, {0xabc, 0xabc},
|
||||||
|
{0xabe, 0xac5}, {0xac7, 0xac9}, {0xacb, 0xacd}, {0xb01, 0xb03},
|
||||||
|
{0xb3c, 0xb3c}, {0xb3e, 0xb43}, {0xb47, 0xb48}, {0xb4b, 0xb4d},
|
||||||
|
{0xb56, 0xb57}, {0xb82, 0xb83}, {0xbbe, 0xbc2}, {0xbc6, 0xbc8},
|
||||||
|
{0xbca, 0xbcd}, {0xbd7, 0xbd7}, {0xc01, 0xc03}, {0xc3e, 0xc44},
|
||||||
|
{0xc46, 0xc48}, {0xc4a, 0xc4d}, {0xc55, 0xc56}, {0xc82, 0xc83},
|
||||||
|
{0xcbe, 0xcc4}, {0xcc6, 0xcc8}, {0xcca, 0xccd}, {0xcd5, 0xcd6},
|
||||||
|
{0xd02, 0xd03}, {0xd3e, 0xd43}, {0xd46, 0xd48}, {0xd4a, 0xd4d},
|
||||||
|
{0xd57, 0xd57}, {0xe31, 0xe31}, {0xe34, 0xe3a}, {0xe47, 0xe4e},
|
||||||
|
{0xeb1, 0xeb1}, {0xeb4, 0xeb9}, {0xebb, 0xebc}, {0xec8, 0xecd},
|
||||||
|
{0xf18, 0xf19}, {0xf35, 0xf35}, {0xf37, 0xf37}, {0xf39, 0xf39},
|
||||||
|
{0xf3e, 0xf3e}, {0xf3f, 0xf3f}, {0xf71, 0xf84}, {0xf86, 0xf8b},
|
||||||
|
{0xf90, 0xf95}, {0xf97, 0xf97}, {0xf99, 0xfad}, {0xfb1, 0xfb7},
|
||||||
|
{0xfb9, 0xfb9}, {0x20d0, 0x20dc}, {0x20e1, 0x20e1}, {0x302a, 0x302f},
|
||||||
|
{0x3099, 0x3099}, {0x309a, 0x309a}};
|
||||||
|
const xmlChRangeGroup xmlIsCombiningGroup =
|
||||||
|
{95,0,xmlIsCombining_srng,NULL};
|
||||||
|
|
||||||
|
static const xmlChSRange xmlIsDigit_srng[] = {{0x660, 0x669},
|
||||||
|
{0x6f0, 0x6f9}, {0x966, 0x96f}, {0x9e6, 0x9ef}, {0xa66, 0xa6f},
|
||||||
|
{0xae6, 0xaef}, {0xb66, 0xb6f}, {0xbe7, 0xbef}, {0xc66, 0xc6f},
|
||||||
|
{0xce6, 0xcef}, {0xd66, 0xd6f}, {0xe50, 0xe59}, {0xed0, 0xed9},
|
||||||
|
{0xf20, 0xf29}};
|
||||||
|
const xmlChRangeGroup xmlIsDigitGroup =
|
||||||
|
{14,0,xmlIsDigit_srng,NULL};
|
||||||
|
|
||||||
|
static const xmlChSRange xmlIsExtender_srng[] = {{0x2d0, 0x2d0},
|
||||||
|
{0x2d1, 0x2d1}, {0x387, 0x387}, {0x640, 0x640}, {0xe46, 0xe46},
|
||||||
|
{0xec6, 0xec6}, {0x3005, 0x3005}, {0x3031, 0x3035}, {0x309d, 0x309e},
|
||||||
|
{0x30fc, 0x30fe}};
|
||||||
|
const xmlChRangeGroup xmlIsExtenderGroup =
|
||||||
|
{10,0,xmlIsExtender_srng,NULL};
|
||||||
|
|
||||||
|
static const xmlChSRange xmlIsIdeographic_srng[] = {{0x3007, 0x3007},
|
||||||
|
{0x3021, 0x3029}, {0x4e00, 0x9fa5}};
|
||||||
|
const xmlChRangeGroup xmlIsIdeographicGroup =
|
||||||
|
{3,0,xmlIsIdeographic_srng,NULL};
|
||||||
|
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
def gen_range_tables(out, name, s_suffix, l_suffix, ranges):
|
||||||
|
numshort = 0
|
||||||
|
numlong = 0
|
||||||
|
sptr = "NULL"
|
||||||
|
lptr = "NULL"
|
||||||
|
|
||||||
|
for range in ranges:
|
||||||
|
(low, high) = range
|
||||||
|
if high < 0x10000:
|
||||||
|
if numshort == 0:
|
||||||
|
sptr = name + s_suffix
|
||||||
|
pline = "static const xmlChSRange %s[] = {" % sptr
|
||||||
|
else:
|
||||||
|
pline += ","
|
||||||
|
numshort += 1
|
||||||
|
else:
|
||||||
|
if numlong == 0:
|
||||||
|
if numshort > 0:
|
||||||
|
out.write(pline + "};\n")
|
||||||
|
lptr = name + l_suffix
|
||||||
|
pline = "static const xmlChLRange %s[] = {" % lptr
|
||||||
|
else:
|
||||||
|
pline += ","
|
||||||
|
numlong += 1
|
||||||
|
if len(pline) > 60:
|
||||||
|
out.write(pline + "\n")
|
||||||
|
pline = " "
|
||||||
|
elif pline[-1:] == ",":
|
||||||
|
pline += " "
|
||||||
|
pline += "{%s, %s}" % (hex(low), hex(high))
|
||||||
|
|
||||||
|
out.write(pline + "};\n")
|
||||||
|
|
||||||
|
return "{%s,%s,%s,%s}" % (numshort, numlong, sptr, lptr)
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,146 @@
|
|||||||
|
# Symbol to module mapping
|
||||||
|
#
|
||||||
|
# This relies on a few tables and some regexes.
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
moduleMap = {
|
||||||
|
'HTMLtree': 'HTML',
|
||||||
|
'HTMLparser': 'HTML',
|
||||||
|
'c14n': 'C14N',
|
||||||
|
'catalog': 'CATALOG',
|
||||||
|
'debugXML': 'DEBUG',
|
||||||
|
'nanohttp': 'HTTP',
|
||||||
|
'pattern': 'PATTERN',
|
||||||
|
'relaxng': 'RELAXNG',
|
||||||
|
'schemasInternals': 'SCHEMAS',
|
||||||
|
'schematron': 'SCHEMATRON',
|
||||||
|
'xinclude': 'XINCLUDE',
|
||||||
|
'xlink': 'XPTR',
|
||||||
|
'xmlautomata': 'REGEXP',
|
||||||
|
'xmlmodule': 'MODULES',
|
||||||
|
'xmlreader': 'READER',
|
||||||
|
'xmlregexp': 'REGEXP',
|
||||||
|
'xmlsave': 'OUTPUT',
|
||||||
|
'xmlschemas': 'SCHEMAS',
|
||||||
|
'xmlschemastypes': 'SCHEMAS',
|
||||||
|
'xmlwriter': 'WRITER',
|
||||||
|
'xpath': 'XPATH',
|
||||||
|
'xpathInternals': 'XPATH',
|
||||||
|
'xpointer': 'XPTR',
|
||||||
|
}
|
||||||
|
|
||||||
|
symbolMap1 = {
|
||||||
|
# not VALID
|
||||||
|
'xmlValidateNCName': '',
|
||||||
|
'xmlValidateNMToken': '',
|
||||||
|
'xmlValidateName': '',
|
||||||
|
'xmlValidateQName': '',
|
||||||
|
|
||||||
|
'htmlDefaultSAXHandlerInit': 'HTML',
|
||||||
|
'xmlSAX2InitHtmlDefaultSAXHandler': 'HTML',
|
||||||
|
|
||||||
|
'xmlRegisterHTTPPostCallbacks': 'HTTP',
|
||||||
|
|
||||||
|
'__xmlOutputBufferCreateFilename': 'OUTPUT',
|
||||||
|
'xmlAttrSerializeTxtContent': 'OUTPUT',
|
||||||
|
'xmlUTF8ToIsolat1': 'OUTPUT',
|
||||||
|
'xmlSprintfElementContent': 'OUTPUT',
|
||||||
|
|
||||||
|
'xmlCreatePushParserCtxt': 'PUSH',
|
||||||
|
'xmlParseChunk': 'PUSH',
|
||||||
|
|
||||||
|
'xmlParseBalancedChunkMemory': 'SAX1',
|
||||||
|
'xmlParseBalancedChunkMemoryRecover': 'SAX1',
|
||||||
|
'xmlParseDoc': 'SAX1',
|
||||||
|
'xmlParseEntity': 'SAX1',
|
||||||
|
'xmlParseExternalEntity': 'SAX1',
|
||||||
|
'xmlParseFile': 'SAX1',
|
||||||
|
'xmlParseMemory': 'SAX1',
|
||||||
|
'xmlSAXDefaultVersion': 'SAX1',
|
||||||
|
'xmlSetupParserForBuffer': 'SAX1',
|
||||||
|
|
||||||
|
'xmlCtxtGetValidCtxt': 'VALID',
|
||||||
|
'xmlFreeValidCtxt': 'VALID',
|
||||||
|
'xmlNewValidCtxt': 'VALID',
|
||||||
|
|
||||||
|
'xmlCatalogConvert': 'SGML_CATALOG',
|
||||||
|
'xmlConvertSGMLCatalog': 'SGML_CATALOG',
|
||||||
|
'xmlLoadSGMLSuperCatalog': 'SGML_CATALOG',
|
||||||
|
}
|
||||||
|
|
||||||
|
symbolMap2 = {
|
||||||
|
# not OUTPUT (should be fixed in xmlIO.h)
|
||||||
|
'xmlOutputBufferCreateFilenameDefault': '',
|
||||||
|
|
||||||
|
'xmlXPathDebugDumpCompExpr': 'DEBUG',
|
||||||
|
'xmlXPathDebugDumpObject': 'DEBUG',
|
||||||
|
'xmlSchemaDump': 'DEBUG',
|
||||||
|
'xmlRelaxNGDump': 'DEBUG',
|
||||||
|
|
||||||
|
'xmlACatalogDump': 'OUTPUT',
|
||||||
|
'xmlCatalogDump': 'OUTPUT',
|
||||||
|
'xmlIOHTTPOpenW': 'OUTPUT',
|
||||||
|
'xmlNanoHTTPSave': 'OUTPUT',
|
||||||
|
'xmlRegisterHTTPPostCallbacks': 'OUTPUT',
|
||||||
|
'xmlRelaxNGDumpTree': 'OUTPUT',
|
||||||
|
|
||||||
|
'xmlTextReaderPreservePattern': 'PATTERN',
|
||||||
|
|
||||||
|
'htmlCreatePushParserCtxt': 'PUSH',
|
||||||
|
'htmlParseChunk': 'PUSH',
|
||||||
|
|
||||||
|
'xmlValidBuildContentModel': 'REGEXP',
|
||||||
|
'xmlValidatePopElement': 'REGEXP',
|
||||||
|
'xmlValidatePushCData': 'REGEXP',
|
||||||
|
'xmlValidatePushElement': 'REGEXP',
|
||||||
|
|
||||||
|
'xmlTextReaderRelaxNGSetSchema': 'RELAXNG',
|
||||||
|
'xmlTextReaderRelaxNGValidate': 'RELAXNG',
|
||||||
|
'xmlTextReaderRelaxNGValidateCtxt': 'RELAXNG',
|
||||||
|
|
||||||
|
'xmlTextReaderSchemaValidate': 'SCHEMAS',
|
||||||
|
'xmlTextReaderSchemaValidateCtxt': 'SCHEMAS',
|
||||||
|
'xmlTextReaderSetSchema': 'SCHEMAS',
|
||||||
|
|
||||||
|
'xmlTextReaderReadInnerXml': 'WRITER',
|
||||||
|
'xmlTextReaderReadOuterXml': 'WRITER',
|
||||||
|
}
|
||||||
|
|
||||||
|
outputRegex = '|'.join((
|
||||||
|
'^(html|xml(Buf)?)(Doc(Content|Format)?|Elem|Node)Dump',
|
||||||
|
'^(html|xml)Save(Format)?File',
|
||||||
|
'^xmlDump.*(Decl|Table)',
|
||||||
|
'^xml(Alloc)?OutputBuffer',
|
||||||
|
'^xml.*OutputCallbacks',
|
||||||
|
))
|
||||||
|
|
||||||
|
def findModules(filename, symbol):
|
||||||
|
module1 = symbolMap1.get(symbol)
|
||||||
|
|
||||||
|
if module1 is None:
|
||||||
|
module1 = moduleMap.get(filename)
|
||||||
|
|
||||||
|
if module1 is None:
|
||||||
|
if re.search('^xml(Ctxt)?Valid|Parse(DTD|Dtd)', symbol):
|
||||||
|
module1 = 'VALID'
|
||||||
|
elif re.search('^xml(Recover|SAX(User)?Parse)', symbol):
|
||||||
|
module1 = 'SAX1'
|
||||||
|
elif re.search('^xmlIOHTTP', symbol):
|
||||||
|
module1 = 'HTTP'
|
||||||
|
|
||||||
|
module2 = symbolMap2.get(symbol)
|
||||||
|
|
||||||
|
if module2 is None:
|
||||||
|
if re.search(outputRegex, symbol):
|
||||||
|
if module1 is None:
|
||||||
|
module1 = 'OUTPUT'
|
||||||
|
else:
|
||||||
|
module2 = 'OUTPUT'
|
||||||
|
|
||||||
|
if module1 is None:
|
||||||
|
module1 = ''
|
||||||
|
if module2 is None:
|
||||||
|
module2 = ''
|
||||||
|
|
||||||
|
return module1, module2
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
/* Define to 1 if you have the declaration of 'getentropy', and to 0 if you
|
||||||
|
don't. */
|
||||||
|
#cmakedefine01 HAVE_DECL_GETENTROPY
|
||||||
|
|
||||||
|
/* Define to 1 if you have the declaration of 'glob', and to 0 if you don't.
|
||||||
|
*/
|
||||||
|
#cmakedefine01 HAVE_DECL_GLOB
|
||||||
|
|
||||||
|
/* Define to 1 if you have the declaration of 'mmap', and to 0 if you don't.
|
||||||
|
*/
|
||||||
|
#cmakedefine01 HAVE_DECL_MMAP
|
||||||
|
|
||||||
|
/* Define if __attribute__((destructor)) is accepted */
|
||||||
|
#cmakedefine HAVE_FUNC_ATTRIBUTE_DESTRUCTOR 1
|
||||||
|
|
||||||
|
/* Have dlopen based dso */
|
||||||
|
#cmakedefine HAVE_DLOPEN 1
|
||||||
|
|
||||||
|
/* Define if history library is there (-lhistory) */
|
||||||
|
#cmakedefine HAVE_LIBHISTORY 1
|
||||||
|
|
||||||
|
/* Define if readline library is there (-lreadline) */
|
||||||
|
#cmakedefine HAVE_LIBREADLINE 1
|
||||||
|
|
||||||
|
/* Have shl_load based dso */
|
||||||
|
#cmakedefine HAVE_SHLLOAD 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdint.h> header file. */
|
||||||
|
#cmakedefine HAVE_STDINT_H 1
|
||||||
|
|
||||||
|
/* System configuration directory (/etc) */
|
||||||
|
#cmakedefine XML_SYSCONFDIR "@XML_SYSCONFDIR@"
|
||||||
|
|
||||||
|
/* TLS specifier */
|
||||||
|
#cmakedefine XML_THREAD_LOCAL @XML_THREAD_LOCAL@
|
||||||
File diff suppressed because it is too large
Load Diff
+1523
File diff suppressed because it is too large
Load Diff
+1037
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,2 @@
|
|||||||
|
/html/
|
||||||
|
/xml/
|
||||||
@@ -0,0 +1,110 @@
|
|||||||
|
PROJECT_NAME = libxml2
|
||||||
|
OUTPUT_DIRECTORY = $(BUILD_ROOT)doc
|
||||||
|
STRIP_FROM_PATH = $(SOURCE_ROOT)include/libxml \
|
||||||
|
$(BUILD_ROOT)include/libxml
|
||||||
|
JAVADOC_AUTOBRIEF = YES
|
||||||
|
OPTIMIZE_OUTPUT_FOR_C = YES
|
||||||
|
EXTRACT_LOCAL_CLASSES = NO
|
||||||
|
HIDE_UNDOC_MEMBERS = YES
|
||||||
|
CASE_SENSE_NAMES = YES
|
||||||
|
HIDE_SCOPE_NAMES = YES
|
||||||
|
SHOW_INCLUDE_FILES = NO
|
||||||
|
WARN_NO_PARAMDOC = YES
|
||||||
|
WARN_AS_ERROR = $(DOXYGEN_WARN_AS_ERROR)
|
||||||
|
INPUT = $(SOURCE_ROOT)doc/mainpage.md \
|
||||||
|
$(SOURCE_ROOT)include/libxml/c14n.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/catalog.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/chvalid.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/debugXML.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/dict.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/encoding.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/entities.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/hash.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/HTMLparser.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/HTMLtree.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/list.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/parser.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/parserInternals.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/pattern.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/relaxng.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/SAX2.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/schemasInternals.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/schematron.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/threads.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/tree.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/uri.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/valid.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xinclude.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xlink.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xmlautomata.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xmlerror.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xmlIO.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xmlmemory.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xmlmodule.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xmlreader.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xmlregexp.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xmlsave.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xmlschemas.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xmlschemastypes.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xmlstring.h \
|
||||||
|
$(BUILD_ROOT)include/libxml/xmlversion.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xmlwriter.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xpath.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xpathInternals.h \
|
||||||
|
$(SOURCE_ROOT)include/libxml/xpointer.h \
|
||||||
|
$(SOURCE_ROOT)buf.c \
|
||||||
|
$(SOURCE_ROOT)c14n.c \
|
||||||
|
$(SOURCE_ROOT)catalog.c \
|
||||||
|
$(SOURCE_ROOT)chvalid.c \
|
||||||
|
$(SOURCE_ROOT)debugXML.c \
|
||||||
|
$(SOURCE_ROOT)dict.c \
|
||||||
|
$(SOURCE_ROOT)encoding.c \
|
||||||
|
$(SOURCE_ROOT)entities.c \
|
||||||
|
$(SOURCE_ROOT)error.c \
|
||||||
|
$(SOURCE_ROOT)globals.c \
|
||||||
|
$(SOURCE_ROOT)hash.c \
|
||||||
|
$(SOURCE_ROOT)HTMLparser.c \
|
||||||
|
$(SOURCE_ROOT)HTMLtree.c \
|
||||||
|
$(SOURCE_ROOT)list.c \
|
||||||
|
$(SOURCE_ROOT)parser.c \
|
||||||
|
$(SOURCE_ROOT)parserInternals.c \
|
||||||
|
$(SOURCE_ROOT)pattern.c \
|
||||||
|
$(SOURCE_ROOT)relaxng.c \
|
||||||
|
$(SOURCE_ROOT)SAX2.c \
|
||||||
|
$(SOURCE_ROOT)schematron.c \
|
||||||
|
$(SOURCE_ROOT)threads.c \
|
||||||
|
$(SOURCE_ROOT)tree.c \
|
||||||
|
$(SOURCE_ROOT)uri.c \
|
||||||
|
$(SOURCE_ROOT)valid.c \
|
||||||
|
$(SOURCE_ROOT)xinclude.c \
|
||||||
|
$(SOURCE_ROOT)xlink.c \
|
||||||
|
$(SOURCE_ROOT)xmlcatalog.c \
|
||||||
|
$(SOURCE_ROOT)xmlIO.c \
|
||||||
|
$(SOURCE_ROOT)xmlmemory.c \
|
||||||
|
$(SOURCE_ROOT)xmlmodule.c \
|
||||||
|
$(SOURCE_ROOT)xmlreader.c \
|
||||||
|
$(SOURCE_ROOT)xmlregexp.c \
|
||||||
|
$(SOURCE_ROOT)xmlsave.c \
|
||||||
|
$(SOURCE_ROOT)xmlschemas.c \
|
||||||
|
$(SOURCE_ROOT)xmlschemastypes.c \
|
||||||
|
$(SOURCE_ROOT)xmlstring.c \
|
||||||
|
$(SOURCE_ROOT)xmlwriter.c \
|
||||||
|
$(SOURCE_ROOT)xpath.c \
|
||||||
|
$(SOURCE_ROOT)xpointer.c
|
||||||
|
EXCLUDE_SYMLINKS = YES
|
||||||
|
USE_MDFILE_AS_MAINPAGE = $(SOURCE_ROOT)doc/mainpage.md
|
||||||
|
VERBATIM_HEADERS = NO
|
||||||
|
HTML_EXTRA_STYLESHEET = $(SOURCE_ROOT)doc/libxml2.css
|
||||||
|
DISABLE_INDEX = NO
|
||||||
|
GENERATE_TREEVIEW = NO
|
||||||
|
ENUM_VALUES_PER_LINE = 0
|
||||||
|
GENERATE_LATEX = NO
|
||||||
|
GENERATE_XML = YES
|
||||||
|
XML_PROGRAMLISTING = NO
|
||||||
|
MACRO_EXPANSION = YES
|
||||||
|
INCLUDE_PATH = $(SOURCE_ROOT). \
|
||||||
|
$(SOURCE_ROOT)include \
|
||||||
|
$(BUILD_ROOT). \
|
||||||
|
$(BUILD_ROOT)include
|
||||||
|
PREDEFINED = XML_TREE_INTERNALS
|
||||||
|
HAVE_DOT = NO
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
EXTRA_DIST = \
|
||||||
|
Doxyfile \
|
||||||
|
libxml2.css \
|
||||||
|
mainpage.md \
|
||||||
|
meson.build \
|
||||||
|
xml2-config.1 \
|
||||||
|
xmlcatalog.xml \
|
||||||
|
xmllint.xml
|
||||||
|
|
||||||
|
all-local: html.stamp
|
||||||
|
|
||||||
|
html.stamp: Doxyfile
|
||||||
|
SOURCE_ROOT=$(top_srcdir)/ BUILD_ROOT=$(top_builddir)/ \
|
||||||
|
$(DOXYGEN) -q $<
|
||||||
|
@touch $@
|
||||||
|
|
||||||
|
CLEANFILES = html.stamp
|
||||||
|
|
||||||
|
clean-local:
|
||||||
|
rm -rf html xml
|
||||||
|
|
||||||
|
if WITH_DOCS
|
||||||
|
|
||||||
|
man_MANS = xml2-config.1 xmllint.1
|
||||||
|
doc_DATA = xmllint.html
|
||||||
|
CLEANFILES += xmllint.1 xmllint.html
|
||||||
|
|
||||||
|
if WITH_CATALOG_SOURCES
|
||||||
|
if WITH_OUTPUT_SOURCES
|
||||||
|
man_MANS += xmlcatalog.1
|
||||||
|
doc_DATA += xmlcatalog.html
|
||||||
|
CLEANFILES += xmlcatalog.1 xmlcatalog.html
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
DOCBOOK_MAN = http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl
|
||||||
|
DOCBOOK_HTML = http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl
|
||||||
|
|
||||||
|
.xml.1:
|
||||||
|
$(XSLTPROC) --nonet --novalid --param man.output.quietly 1 \
|
||||||
|
-o $@ $(DOCBOOK_MAN) $<
|
||||||
|
|
||||||
|
.xml.html:
|
||||||
|
$(XSLTPROC) --nonet --novalid -o $@ $(DOCBOOK_HTML) $<
|
||||||
|
|
||||||
|
install-data-local:
|
||||||
|
$(MKDIR_P) "$(DESTDIR)$(docdir)/html/search"
|
||||||
|
$(INSTALL_DATA) html/*.* "$(DESTDIR)$(docdir)/html"
|
||||||
|
$(INSTALL_DATA) html/search/*.* "$(DESTDIR)$(docdir)/html/search"
|
||||||
|
|
||||||
|
uninstall-local:
|
||||||
|
-rm -rf "$(DESTDIR)$(docdir)/html"
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
# Redirects for GitLab pages
|
||||||
|
|
||||||
|
# Start page
|
||||||
|
/libxml2/ /libxml2/html/index.html 302
|
||||||
|
|
||||||
|
# Old documentation
|
||||||
|
|
||||||
|
/libxml2/devhelp/libxml2-c14n.html /libxml2/html/c14n_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-catalog.html /libxml2/html/catalog_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-chvalid.html /libxml2/html/chvalid_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-debugXML.html /libxml2/html/debugXML_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-dict.html /libxml2/html/dict_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-encoding.html /libxml2/html/encoding_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-entities.html /libxml2/html/entities_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-hash.html /libxml2/html/hash_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-HTMLparser.html /libxml2/html/HTMLparser_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-HTMLtree.html /libxml2/html/HTMLtree_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-list.html /libxml2/html/list_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-parser.html /libxml2/html/parser_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-parserInternals.html /libxml2/html/parserInternals_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-pattern.html /libxml2/html/pattern_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-relaxng.html /libxml2/html/relaxng_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-SAX2.html /libxml2/html/SAX2_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-schemasInternals.html /libxml2/html/schemasInternals_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-schematron.html /libxml2/html/schematron_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-threads.html /libxml2/html/threads_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-tree.html /libxml2/html/tree_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-uri.html /libxml2/html/uri_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-valid.html /libxml2/html/valid_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xinclude.html /libxml2/html/xinclude_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xlink.html /libxml2/html/xlink_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xmlautomata.html /libxml2/html/xmlautomata_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xmlerror.html /libxml2/html/xmlerror_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xmlIO.html /libxml2/html/xmlIO_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xmlmemory.html /libxml2/html/xmlmemory_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xmlmodule.html /libxml2/html/xmlmodule_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xmlreader.html /libxml2/html/xmlreader_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xmlregexp.html /libxml2/html/xmlregexp_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xmlsave.html /libxml2/html/xmlsave_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xmlschemas.html /libxml2/html/xmlschemas_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xmlschemastypes.html /libxml2/html/xmlschemastypes_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xmlstring.html /libxml2/html/xmlstring_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xmlversion.html /libxml2/html/xmlversion_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xmlwriter.html /libxml2/html/xmlwriter_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xpath.html /libxml2/html/xpath_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xpathInternals.html /libxml2/html/xpathInternals_8h.html
|
||||||
|
/libxml2/devhelp/libxml2-xpointer.html /libxml2/html/xpointer_8h.html
|
||||||
|
|
||||||
|
/libxml2/devhelp/general.html /libxml2/html/files.html
|
||||||
|
/libxml2/devhelp/* /libxml2/html/index.html
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
div.contents {
|
||||||
|
max-width: 60em;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
font-size: 1.25em;
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
# API Documentation
|
||||||
|
|
||||||
|
See [File List](files.html) for API documentation sorted by
|
||||||
|
public header files.
|
||||||
|
|
||||||
|
## About
|
||||||
|
|
||||||
|
libxml2 is an XML toolkit implemented in C, originally developed for
|
||||||
|
the GNOME Project.
|
||||||
|
|
||||||
|
Official releases can be downloaded from
|
||||||
|
<https://download.gnome.org/sources/libxml2/>
|
||||||
|
|
||||||
|
The git repository is hosted on GNOME's GitLab server:
|
||||||
|
<https://gitlab.gnome.org/GNOME/libxml2>
|
||||||
|
|
||||||
|
Bugs should be reported at
|
||||||
|
<https://gitlab.gnome.org/GNOME/libxml2/-/issues>
|
||||||
|
|
||||||
|
Other documentation is available at
|
||||||
|
<https://gitlab.gnome.org/GNOME/libxml2/-/wikis>
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This code is released under the MIT License, see the Copyright file.
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
# Doxygen
|
||||||
|
|
||||||
|
doxygen = find_program('doxygen')
|
||||||
|
|
||||||
|
# TODO: To make the xml directory work as dependency of the
|
||||||
|
# Python target, we must make sure that its timestamp changes
|
||||||
|
# whenever the docs are rebuilt. Either delete the directory
|
||||||
|
# before generating, or touch it afterward?
|
||||||
|
doxygen_docs = custom_target(
|
||||||
|
'Doxygen documentation',
|
||||||
|
input: [
|
||||||
|
xml_src_files, libxml_headers,
|
||||||
|
files('libxml2.css', 'mainpage.md'),
|
||||||
|
],
|
||||||
|
output: [ 'html', 'xml' ],
|
||||||
|
command: [ doxygen, '-q', files('Doxyfile') ],
|
||||||
|
env: {
|
||||||
|
'SOURCE_ROOT': meson.project_source_root() + '/',
|
||||||
|
'BUILD_ROOT': meson.project_build_root() + '/',
|
||||||
|
},
|
||||||
|
install: true,
|
||||||
|
install_dir: [ want_docs ? dir_doc : false, false ],
|
||||||
|
)
|
||||||
|
|
||||||
|
if want_docs
|
||||||
|
# xml2-config
|
||||||
|
|
||||||
|
install_man('xml2-config.1')
|
||||||
|
|
||||||
|
# Docbook
|
||||||
|
|
||||||
|
xsltproc = find_program('xsltproc')
|
||||||
|
types = [
|
||||||
|
[ 'manpages', '.1', dir_man / 'man1' ],
|
||||||
|
[ 'html', '.html', dir_doc ],
|
||||||
|
]
|
||||||
|
programs = [ 'xmllint' ]
|
||||||
|
if want_catalog and want_output
|
||||||
|
programs += 'xmlcatalog'
|
||||||
|
endif
|
||||||
|
|
||||||
|
foreach prog : programs
|
||||||
|
foreach type : types
|
||||||
|
format = type[0]
|
||||||
|
ext = type[1]
|
||||||
|
install_dir = type[2]
|
||||||
|
|
||||||
|
xsl = 'http://docbook.sourceforge.net' + \
|
||||||
|
f'/release/xsl/current/@format@/docbook.xsl'
|
||||||
|
output = prog + ext
|
||||||
|
|
||||||
|
custom_target(
|
||||||
|
output,
|
||||||
|
input: prog + '.xml',
|
||||||
|
output: output,
|
||||||
|
command: [xsltproc,
|
||||||
|
'--nonet', '--novalid',
|
||||||
|
'--param', 'man.output.quietly', '1',
|
||||||
|
'-o', '@OUTPUT@',
|
||||||
|
xsl, '@INPUT@'
|
||||||
|
],
|
||||||
|
install: true,
|
||||||
|
install_dir: install_dir
|
||||||
|
)
|
||||||
|
endforeach
|
||||||
|
endforeach
|
||||||
|
endif
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
.TH xml2-config 1 "3 April 2022" Version 1.2.0
|
||||||
|
.SH NAME
|
||||||
|
xml2-config - script to get information about the installed version of libxml2
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B xml2-config
|
||||||
|
[\-\-prefix\fI[=DIR]\fP] [\-\-libs] [\-\-cflags] [\-\-version] [\-\-help]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
\fIxml2-config\fP is a tool that is used to determine the compile and
|
||||||
|
linker flags that should be used to compile and link programs that use
|
||||||
|
\fIlibxml2\fP.
|
||||||
|
.SH OPTIONS
|
||||||
|
\fIxml2-config\fP accepts the following options:
|
||||||
|
.TP 8
|
||||||
|
.B \-\-version
|
||||||
|
Print the currently installed version of \fIlibxml2\fP on the standard output.
|
||||||
|
.TP 8
|
||||||
|
.B \-\-libs
|
||||||
|
Print the linker flags that are necessary to link a \fIlibxml2\fP program.
|
||||||
|
Add \-\-dynamic after \-\-libs to print only shared library linking
|
||||||
|
information.
|
||||||
|
.TP 8
|
||||||
|
.B \-\-cflags
|
||||||
|
Print the compiler flags that are necessary to compile a \fIlibxml2\fP program.
|
||||||
|
.TP 8
|
||||||
|
.B \-\-prefix=PREFIX
|
||||||
|
If specified, use PREFIX instead of the installation prefix that
|
||||||
|
\fIlibxml2\fP was built with when computing the output for the
|
||||||
|
\-\-cflags and \-\-libs options. This option must be specified before
|
||||||
|
any \-\-libs or \-\-cflags options.
|
||||||
|
.SH AUTHOR
|
||||||
|
This manual page was written by Fredrik Hallenberg <hallon@lysator.liu.se>,
|
||||||
|
for the Debian GNU/linux system (but may be used by others).
|
||||||
@@ -0,0 +1,476 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<?xml-stylesheet type="text/xsl"
|
||||||
|
href="http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl"?>
|
||||||
|
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
||||||
|
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
|
||||||
|
|
||||||
|
<!ENTITY xmlcatalog "<command>xmlcatalog</command>">
|
||||||
|
]>
|
||||||
|
|
||||||
|
<refentry>
|
||||||
|
|
||||||
|
<refentryinfo>
|
||||||
|
<title>xmlcatalog Manual</title>
|
||||||
|
<productname>libxml2</productname>
|
||||||
|
<copyright>
|
||||||
|
<year>2001</year>
|
||||||
|
<year>2004</year>
|
||||||
|
</copyright>
|
||||||
|
<author>
|
||||||
|
<firstname>John</firstname>
|
||||||
|
<surname>Fleck</surname>
|
||||||
|
<contrib></contrib>
|
||||||
|
<affiliation>
|
||||||
|
<address>
|
||||||
|
<email>jfleck@inkstain.net</email>
|
||||||
|
</address>
|
||||||
|
</affiliation>
|
||||||
|
</author>
|
||||||
|
<!-- still a bit buggy output, will talk to docbook-xsl upstream to fix this -->
|
||||||
|
<!-- <releaseinfo>This is release 0.3 of the xmlcatalog Manual.</releaseinfo> -->
|
||||||
|
<!-- <edition>0.3</edition> -->
|
||||||
|
</refentryinfo>
|
||||||
|
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>xmlcatalog</refentrytitle>
|
||||||
|
<manvolnum>1</manvolnum>
|
||||||
|
</refmeta>
|
||||||
|
|
||||||
|
<refnamediv>
|
||||||
|
<refname>xmlcatalog</refname>
|
||||||
|
<refpurpose>
|
||||||
|
Command line tool to parse and manipulate <acronym>XML</acronym>
|
||||||
|
or <acronym>SGML</acronym> catalog files.
|
||||||
|
</refpurpose>
|
||||||
|
</refnamediv>
|
||||||
|
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<cmdsynopsis>
|
||||||
|
<command>xmlcatalog</command>
|
||||||
|
<group choice="opt">
|
||||||
|
<arg choice="plain"><option>--sgml</option></arg>
|
||||||
|
<arg choice="plain"><option>--shell</option></arg>
|
||||||
|
<arg choice="plain"><option>--convert</option></arg>
|
||||||
|
<arg choice="plain"><option>--create</option></arg>
|
||||||
|
<arg choice="plain"><option>--del <replaceable>VALUE(S)</replaceable></option></arg>
|
||||||
|
<arg choice="plain">
|
||||||
|
<group choice="opt">
|
||||||
|
<arg choice="plain">
|
||||||
|
<option>--add
|
||||||
|
<replaceable>TYPE</replaceable>
|
||||||
|
<replaceable>ORIG</replaceable>
|
||||||
|
<replaceable>REPLACE</replaceable>
|
||||||
|
</option>
|
||||||
|
</arg>
|
||||||
|
<arg choice="plain"><option>--add <replaceable>FILENAME</replaceable></option></arg>
|
||||||
|
</group>
|
||||||
|
</arg>
|
||||||
|
<arg choice="plain"><option>--noout</option></arg>
|
||||||
|
<arg choice="plain"><option>--no-super-update</option></arg>
|
||||||
|
<arg choice="plain">
|
||||||
|
<group choice="opt">
|
||||||
|
<arg choice="plain"><option>-v</option></arg>
|
||||||
|
<arg choice="plain"><option>--verbose</option></arg>
|
||||||
|
</group>
|
||||||
|
</arg>
|
||||||
|
</group>
|
||||||
|
<arg choice="req" rep="norepeat"><replaceable>CATALOGFILE</replaceable></arg>
|
||||||
|
<arg choice="req" rep="repeat"><replaceable>ENTITIES</replaceable></arg>
|
||||||
|
</cmdsynopsis>
|
||||||
|
</refsynopsisdiv>
|
||||||
|
|
||||||
|
<refsect1 id="description">
|
||||||
|
<title>DESCRIPTION</title>
|
||||||
|
<para>
|
||||||
|
&xmlcatalog; is a command line application allowing users to monitor and
|
||||||
|
manipulate <acronym>XML</acronym> and <acronym>SGML</acronym> catalogs. It
|
||||||
|
is included in <citerefentry>
|
||||||
|
<refentrytitle>libxml</refentrytitle>
|
||||||
|
<manvolnum>3</manvolnum>
|
||||||
|
</citerefentry>.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Its functions can be invoked from a single command from the command line,
|
||||||
|
or it can perform multiple functions in interactive mode. It can operate
|
||||||
|
on both <acronym>XML</acronym> and <acronym>SGML</acronym> files.
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="options">
|
||||||
|
<title>OPTIONS</title>
|
||||||
|
<para>
|
||||||
|
&xmlcatalog; accepts the following options (in alphabetical order):
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term>
|
||||||
|
<option>--add
|
||||||
|
<replaceable>TYPE</replaceable>
|
||||||
|
<replaceable>ORIG</replaceable>
|
||||||
|
<replaceable>REPLACE</replaceable>
|
||||||
|
</option>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Add an entry to <filename>CATALOGFILE</filename>. <replaceable>TYPE</replaceable>
|
||||||
|
indicates the type of entry. Possible types are: <simplelist type="inline">
|
||||||
|
<member><parameter>public</parameter></member>
|
||||||
|
<member><parameter>system</parameter></member>
|
||||||
|
<member><parameter>uri</parameter></member>
|
||||||
|
<member><parameter>rewriteSystem</parameter></member>
|
||||||
|
<member><parameter>rewriteURI</parameter></member>
|
||||||
|
<member><parameter>delegatePublic</parameter></member>
|
||||||
|
<member><parameter>delegateSystem</parameter></member>
|
||||||
|
<member><parameter>delegateURI</parameter></member>
|
||||||
|
<member><parameter>nextCatalog</parameter></member>
|
||||||
|
</simplelist>. <replaceable>ORIG</replaceable> is the original
|
||||||
|
reference to be replaced, and <replaceable>REPLACE</replaceable>
|
||||||
|
is the <acronym>URI</acronym> of the replacement entity to be
|
||||||
|
used. The <option>--add</option> option will not overwrite
|
||||||
|
<filename>CATALOGFILE</filename>, outputting
|
||||||
|
to <filename class="devicefile">stdout</filename>, unless
|
||||||
|
<option>--noout</option> is used. The <option>--add</option> will
|
||||||
|
always take three parameters even if some of the <acronym>XML</acronym>
|
||||||
|
catalog constructs will have only a single argument.
|
||||||
|
</para>
|
||||||
|
<!--
|
||||||
|
FIXME - Is my list of possible types correct? Are SGML types the same?
|
||||||
|
-->
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--add <replaceable>FILENAME</replaceable></option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
If the <option>--add</option> option is used following
|
||||||
|
the <option>--sgml</option> option, only a single argument,
|
||||||
|
a <replaceable>FILENAME</replaceable>, is used. This is used to add
|
||||||
|
the name of a catalog file to an <acronym>SGML</acronym> supercatalog,
|
||||||
|
a file that contains references to other included <acronym>SGML</acronym>
|
||||||
|
catalog files.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--convert</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Convert SGML catalog to XML.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--create</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Create a new <acronym>XML</acronym> catalog. Outputs
|
||||||
|
to <filename class="devicefile">stdout</filename>,
|
||||||
|
ignoring <replaceable>filename</replaceable> unless <option>--noout</option> is
|
||||||
|
used, in which case it creates a new catalog
|
||||||
|
file <replaceable>filename</replaceable>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--del <replaceable>VALUE(S)</replaceable></option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Remove entries from <replaceable>CATALOGFILE</replaceable>
|
||||||
|
matching <replaceable>VALUE(S)</replaceable>. The <option>--del</option>
|
||||||
|
option will not overwrite <replaceable>CATALOGFILE</replaceable>,
|
||||||
|
outputting to <filename class="devicefile">stdout</filename>,
|
||||||
|
unless <option>--noout</option> is used.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--noout</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Save output to the named file rather than outputting
|
||||||
|
to <filename class="devicefile">stdout</filename>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--no-super-update</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Do not update the <acronym>SGML</acronym> super catalog.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--shell</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Run a shell allowing interactive queries on catalog
|
||||||
|
file <replaceable>CATALOGFILE</replaceable>. For the set of available
|
||||||
|
commands see <xref linkend="shell"/>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--sgml</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Uses <acronym>SGML</acronym> super catalogs for <option>--add</option>
|
||||||
|
and <option>--del</option> options.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>-v</option></term>
|
||||||
|
<term><option>--verbose</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Output debugging information.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
</variablelist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Invoking &xmlcatalog; non-interactively without a designated action
|
||||||
|
(imposed with options like <option>--add</option>) will result in a lookup
|
||||||
|
of the catalog entry for <replaceable>ENTITIES</replaceable> in the
|
||||||
|
catalog denoted with <replaceable>CATALOGFILE</replaceable>. The
|
||||||
|
corresponding entries will be output to the command line. This mode of
|
||||||
|
operation, together with <option>--shell</option> mode and non-modifying
|
||||||
|
(i.e. without <option>--noout</option>) direct actions, allows for
|
||||||
|
a special shortcut of the void <replaceable>CATALOGFILE</replaceable>
|
||||||
|
specification (possibly expressed as "" in the shell
|
||||||
|
environment) appointing the default system catalog. That simplifies the
|
||||||
|
handling when its exact location is irrelevant but the respective built-in
|
||||||
|
still needs to be consulted.
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="shell">
|
||||||
|
<title>SHELL COMMANDS</title>
|
||||||
|
<para>
|
||||||
|
Invoking &xmlcatalog; with
|
||||||
|
the <option>--shell <replaceable>CATALOGFILE</replaceable></option> option opens
|
||||||
|
a command line shell allowing interactive access to the catalog file
|
||||||
|
identified by <replaceable>CATALOGFILE</replaceable>. Invoking the shell
|
||||||
|
provides a command line prompt after which the following commands (described in
|
||||||
|
alphabetical order) can be entered.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term>
|
||||||
|
<option>add
|
||||||
|
<replaceable>TYPE</replaceable>
|
||||||
|
<replaceable>ORIG</replaceable>
|
||||||
|
<replaceable>REPLACE</replaceable>
|
||||||
|
</option>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Add an entry to the catalog file. <replaceable>TYPE</replaceable>
|
||||||
|
indicates the type of entry. Possible types are: <simplelist type="inline">
|
||||||
|
<member><parameter>public</parameter></member>
|
||||||
|
<member><parameter>system</parameter></member>
|
||||||
|
<member><parameter>uri</parameter></member>
|
||||||
|
<member><parameter>rewriteSystem</parameter></member>
|
||||||
|
<member><parameter>rewriteURI</parameter></member>
|
||||||
|
<member><parameter>delegatePublic</parameter></member>
|
||||||
|
<member><parameter>delegateSystem</parameter></member>
|
||||||
|
<member><parameter>delegateURI</parameter></member>
|
||||||
|
<member><parameter>nextCatalog</parameter></member>
|
||||||
|
</simplelist>. <replaceable>ORIG</replaceable> is the original
|
||||||
|
reference to be replaced, and <replaceable>REPLACE</replaceable>
|
||||||
|
is the <acronym>URI</acronym> of the replacement entity to be
|
||||||
|
used. The <option>--add</option> option will not overwrite
|
||||||
|
<filename>CATALOGFILE</filename>, outputting
|
||||||
|
to <filename class="devicefile">stdout</filename>, unless
|
||||||
|
<option>--noout</option> is used. The <option>--add</option> will
|
||||||
|
always take three parameters even if some of the <acronym>XML</acronym>
|
||||||
|
catalog constructs will have only a single argument.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>debug</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Print debugging statements showing the steps &xmlcatalog; is executing.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>del <replaceable>VALUE(S)</replaceable></option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Remove the catalog entry corresponding to <replaceable>VALUE(S)</replaceable>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>dump</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Print the current catalog.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>exit</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Quit the shell.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>public <replaceable>PUBLIC-ID</replaceable></option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Execute a Formal Public Identifier lookup of the catalog entry
|
||||||
|
for <replaceable>PUBLIC-ID</replaceable>. The corresponding entry will be
|
||||||
|
output to the command line.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>quiet</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Stop printing debugging statements.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>system <replaceable>SYSTEM-ID</replaceable></option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Execute a Formal Public Identifier lookup of the catalog entry
|
||||||
|
for <replaceable>SYSTEM-ID</replaceable>. The corresponding entry will be
|
||||||
|
output to the command line.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="environment">
|
||||||
|
<title>ENVIRONMENT</title>
|
||||||
|
<variablelist>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><envar>XML_CATALOG_FILES</envar></term>
|
||||||
|
<listitem>
|
||||||
|
<para><acronym>XML</acronym> catalog behavior can be changed by redirecting
|
||||||
|
queries to the user's own set of catalogs. This can be done by setting
|
||||||
|
the <envar>XML_CATALOG_FILES</envar> environment variable to a space-separated
|
||||||
|
list of catalogs. Use percent-encoding to escape spaces or other characters.
|
||||||
|
An empty variable should deactivate loading the default catalog from
|
||||||
|
<filename>/etc/xml/catalog</filename> or, more specifically,
|
||||||
|
<filename>${sysconfdir}/xml/catalog</filename>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="diagnostics">
|
||||||
|
<title>DIAGNOSTICS</title>
|
||||||
|
<para>
|
||||||
|
&xmlcatalog; return codes provide information that can be used when
|
||||||
|
calling it from scripts.
|
||||||
|
</para>
|
||||||
|
<variablelist>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><errorcode>0</errorcode></term>
|
||||||
|
<listitem>
|
||||||
|
<para>No error</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><errorcode>1</errorcode></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Failed to remove an entry from the catalog</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><errorcode>2</errorcode></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Failed to save to the catalog, check file permissions</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><errorcode>3</errorcode></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Failed to add an entry to the catalog</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><errorcode>4</errorcode></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Failed to look up an entry in the catalog</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="seealso">
|
||||||
|
<title>SEE ALSO</title>
|
||||||
|
<para><citerefentry>
|
||||||
|
<refentrytitle>libxml</refentrytitle>
|
||||||
|
<manvolnum>3</manvolnum>
|
||||||
|
</citerefentry>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
More information can be found at
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para><citerefentry>
|
||||||
|
<refentrytitle>libxml</refentrytitle>
|
||||||
|
<manvolnum>3</manvolnum>
|
||||||
|
</citerefentry> web page <ulink url="https://gitlab.gnome.org/GNOME/libxml2"/>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para><citerefentry>
|
||||||
|
<refentrytitle>libxml</refentrytitle>
|
||||||
|
<manvolnum>3</manvolnum>
|
||||||
|
</citerefentry> catalog support web page
|
||||||
|
at <ulink url="https://gitlab.gnome.org/GNOME/libxml2/-/wikis/Catalog-support"/>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>James Clark's <acronym>SGML</acronym> catalog
|
||||||
|
page <ulink url="http://www.jclark.com/sp/catalog.htm"/>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para><acronym>OASIS</acronym> <acronym>XML</acronym> catalog specification
|
||||||
|
<ulink url="http://www.oasis-open.org/committees/entity/spec.html"/>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
</refentry>
|
||||||
File diff suppressed because it is too large
Load Diff
+3003
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,728 @@
|
|||||||
|
/*
|
||||||
|
* entities.c : implementation for the XML entities handling
|
||||||
|
*
|
||||||
|
* See Copyright for the status of this software.
|
||||||
|
*
|
||||||
|
* Author: Daniel Veillard
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* To avoid EBCDIC trouble when parsing on zOS */
|
||||||
|
#if defined(__MVS__)
|
||||||
|
#pragma convert("ISO8859-1")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define IN_LIBXML
|
||||||
|
#include "libxml.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <libxml/xmlmemory.h>
|
||||||
|
#include <libxml/hash.h>
|
||||||
|
#include <libxml/entities.h>
|
||||||
|
#include <libxml/parser.h>
|
||||||
|
#include <libxml/parserInternals.h>
|
||||||
|
#include <libxml/xmlerror.h>
|
||||||
|
#include <libxml/dict.h>
|
||||||
|
#include <libxml/xmlsave.h>
|
||||||
|
|
||||||
|
#include "private/entities.h"
|
||||||
|
#include "private/error.h"
|
||||||
|
#include "private/io.h"
|
||||||
|
#include "private/tree.h"
|
||||||
|
|
||||||
|
#ifndef SIZE_MAX
|
||||||
|
#define SIZE_MAX ((size_t) -1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The XML predefined entities.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static xmlEntity xmlEntityLt = {
|
||||||
|
NULL, XML_ENTITY_DECL, BAD_CAST "lt",
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
BAD_CAST "<", BAD_CAST "<", 1,
|
||||||
|
XML_INTERNAL_PREDEFINED_ENTITY,
|
||||||
|
NULL, NULL, NULL, NULL, 0, 0, 0
|
||||||
|
};
|
||||||
|
static xmlEntity xmlEntityGt = {
|
||||||
|
NULL, XML_ENTITY_DECL, BAD_CAST "gt",
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
BAD_CAST ">", BAD_CAST ">", 1,
|
||||||
|
XML_INTERNAL_PREDEFINED_ENTITY,
|
||||||
|
NULL, NULL, NULL, NULL, 0, 0, 0
|
||||||
|
};
|
||||||
|
static xmlEntity xmlEntityAmp = {
|
||||||
|
NULL, XML_ENTITY_DECL, BAD_CAST "amp",
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
BAD_CAST "&", BAD_CAST "&", 1,
|
||||||
|
XML_INTERNAL_PREDEFINED_ENTITY,
|
||||||
|
NULL, NULL, NULL, NULL, 0, 0, 0
|
||||||
|
};
|
||||||
|
static xmlEntity xmlEntityQuot = {
|
||||||
|
NULL, XML_ENTITY_DECL, BAD_CAST "quot",
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
BAD_CAST "\"", BAD_CAST "\"", 1,
|
||||||
|
XML_INTERNAL_PREDEFINED_ENTITY,
|
||||||
|
NULL, NULL, NULL, NULL, 0, 0, 0
|
||||||
|
};
|
||||||
|
static xmlEntity xmlEntityApos = {
|
||||||
|
NULL, XML_ENTITY_DECL, BAD_CAST "apos",
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
BAD_CAST "'", BAD_CAST "'", 1,
|
||||||
|
XML_INTERNAL_PREDEFINED_ENTITY,
|
||||||
|
NULL, NULL, NULL, NULL, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frees the entity.
|
||||||
|
*
|
||||||
|
* @param entity an entity
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
xmlFreeEntity(xmlEntity *entity)
|
||||||
|
{
|
||||||
|
xmlDictPtr dict = NULL;
|
||||||
|
|
||||||
|
if (entity == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (entity->doc != NULL)
|
||||||
|
dict = entity->doc->dict;
|
||||||
|
|
||||||
|
|
||||||
|
if ((entity->children) &&
|
||||||
|
(entity == (xmlEntityPtr) entity->children->parent))
|
||||||
|
xmlFreeNodeList(entity->children);
|
||||||
|
if ((entity->name != NULL) &&
|
||||||
|
((dict == NULL) || (!xmlDictOwns(dict, entity->name))))
|
||||||
|
xmlFree((char *) entity->name);
|
||||||
|
if (entity->ExternalID != NULL)
|
||||||
|
xmlFree((char *) entity->ExternalID);
|
||||||
|
if (entity->SystemID != NULL)
|
||||||
|
xmlFree((char *) entity->SystemID);
|
||||||
|
if (entity->URI != NULL)
|
||||||
|
xmlFree((char *) entity->URI);
|
||||||
|
if (entity->content != NULL)
|
||||||
|
xmlFree((char *) entity->content);
|
||||||
|
if (entity->orig != NULL)
|
||||||
|
xmlFree((char *) entity->orig);
|
||||||
|
xmlFree(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* internal routine doing the entity node structures allocations
|
||||||
|
*/
|
||||||
|
static xmlEntityPtr
|
||||||
|
xmlCreateEntity(xmlDocPtr doc, const xmlChar *name, int type,
|
||||||
|
const xmlChar *publicId, const xmlChar *systemId,
|
||||||
|
const xmlChar *content) {
|
||||||
|
xmlEntityPtr ret;
|
||||||
|
|
||||||
|
ret = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity));
|
||||||
|
if (ret == NULL)
|
||||||
|
return(NULL);
|
||||||
|
memset(ret, 0, sizeof(xmlEntity));
|
||||||
|
ret->doc = doc;
|
||||||
|
ret->type = XML_ENTITY_DECL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* fill the structure.
|
||||||
|
*/
|
||||||
|
ret->etype = (xmlEntityType) type;
|
||||||
|
if ((doc == NULL) || (doc->dict == NULL))
|
||||||
|
ret->name = xmlStrdup(name);
|
||||||
|
else
|
||||||
|
ret->name = xmlDictLookup(doc->dict, name, -1);
|
||||||
|
if (ret->name == NULL)
|
||||||
|
goto error;
|
||||||
|
if (publicId != NULL) {
|
||||||
|
ret->ExternalID = xmlStrdup(publicId);
|
||||||
|
if (ret->ExternalID == NULL)
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if (systemId != NULL) {
|
||||||
|
ret->SystemID = xmlStrdup(systemId);
|
||||||
|
if (ret->SystemID == NULL)
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if (content != NULL) {
|
||||||
|
ret->length = xmlStrlen(content);
|
||||||
|
ret->content = xmlStrndup(content, ret->length);
|
||||||
|
if (ret->content == NULL)
|
||||||
|
goto error;
|
||||||
|
} else {
|
||||||
|
ret->length = 0;
|
||||||
|
ret->content = NULL;
|
||||||
|
}
|
||||||
|
ret->URI = NULL; /* to be computed by the layer knowing
|
||||||
|
the defining entity */
|
||||||
|
ret->orig = NULL;
|
||||||
|
|
||||||
|
return(ret);
|
||||||
|
|
||||||
|
error:
|
||||||
|
xmlFreeEntity(ret);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a new entity for this document.
|
||||||
|
*
|
||||||
|
* @since 2.13.0
|
||||||
|
*
|
||||||
|
* @param doc the document
|
||||||
|
* @param extSubset add to the external or internal subset
|
||||||
|
* @param name the entity name
|
||||||
|
* @param type an xmlEntityType value
|
||||||
|
* @param publicId the publid identifier (optional)
|
||||||
|
* @param systemId the system identifier (URL) (optional)
|
||||||
|
* @param content the entity content
|
||||||
|
* @param out pointer to resulting entity (optional)
|
||||||
|
* @returns an xmlParserErrors error code.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
xmlAddEntity(xmlDoc *doc, int extSubset, const xmlChar *name, int type,
|
||||||
|
const xmlChar *publicId, const xmlChar *systemId,
|
||||||
|
const xmlChar *content, xmlEntity **out) {
|
||||||
|
xmlDtdPtr dtd;
|
||||||
|
xmlDictPtr dict = NULL;
|
||||||
|
xmlEntitiesTablePtr table = NULL;
|
||||||
|
xmlEntityPtr ret, predef;
|
||||||
|
int res;
|
||||||
|
|
||||||
|
if (out != NULL)
|
||||||
|
*out = NULL;
|
||||||
|
if ((doc == NULL) || (name == NULL))
|
||||||
|
return(XML_ERR_ARGUMENT);
|
||||||
|
dict = doc->dict;
|
||||||
|
|
||||||
|
if (extSubset)
|
||||||
|
dtd = doc->extSubset;
|
||||||
|
else
|
||||||
|
dtd = doc->intSubset;
|
||||||
|
if (dtd == NULL)
|
||||||
|
return(XML_DTD_NO_DTD);
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case XML_INTERNAL_GENERAL_ENTITY:
|
||||||
|
case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
|
||||||
|
case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
|
||||||
|
predef = xmlGetPredefinedEntity(name);
|
||||||
|
if (predef != NULL) {
|
||||||
|
int valid = 0;
|
||||||
|
|
||||||
|
/* 4.6 Predefined Entities */
|
||||||
|
if ((type == XML_INTERNAL_GENERAL_ENTITY) &&
|
||||||
|
(content != NULL)) {
|
||||||
|
int c = predef->content[0];
|
||||||
|
|
||||||
|
if (((content[0] == c) && (content[1] == 0)) &&
|
||||||
|
((c == '>') || (c == '\'') || (c == '"'))) {
|
||||||
|
valid = 1;
|
||||||
|
} else if ((content[0] == '&') && (content[1] == '#')) {
|
||||||
|
if (content[2] == 'x') {
|
||||||
|
xmlChar *hex = BAD_CAST "0123456789ABCDEF";
|
||||||
|
xmlChar ref[] = "00;";
|
||||||
|
|
||||||
|
ref[0] = hex[c / 16 % 16];
|
||||||
|
ref[1] = hex[c % 16];
|
||||||
|
if (xmlStrcasecmp(&content[3], ref) == 0)
|
||||||
|
valid = 1;
|
||||||
|
} else {
|
||||||
|
xmlChar ref[] = "00;";
|
||||||
|
|
||||||
|
ref[0] = '0' + c / 10 % 10;
|
||||||
|
ref[1] = '0' + c % 10;
|
||||||
|
if (xmlStrEqual(&content[2], ref))
|
||||||
|
valid = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!valid)
|
||||||
|
return(XML_ERR_REDECL_PREDEF_ENTITY);
|
||||||
|
}
|
||||||
|
if (dtd->entities == NULL) {
|
||||||
|
dtd->entities = xmlHashCreateDict(0, dict);
|
||||||
|
if (dtd->entities == NULL)
|
||||||
|
return(XML_ERR_NO_MEMORY);
|
||||||
|
}
|
||||||
|
table = dtd->entities;
|
||||||
|
break;
|
||||||
|
case XML_INTERNAL_PARAMETER_ENTITY:
|
||||||
|
case XML_EXTERNAL_PARAMETER_ENTITY:
|
||||||
|
if (dtd->pentities == NULL) {
|
||||||
|
dtd->pentities = xmlHashCreateDict(0, dict);
|
||||||
|
if (dtd->pentities == NULL)
|
||||||
|
return(XML_ERR_NO_MEMORY);
|
||||||
|
}
|
||||||
|
table = dtd->pentities;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return(XML_ERR_ARGUMENT);
|
||||||
|
}
|
||||||
|
ret = xmlCreateEntity(dtd->doc, name, type, publicId, systemId, content);
|
||||||
|
if (ret == NULL)
|
||||||
|
return(XML_ERR_NO_MEMORY);
|
||||||
|
|
||||||
|
res = xmlHashAdd(table, name, ret);
|
||||||
|
if (res < 0) {
|
||||||
|
xmlFreeEntity(ret);
|
||||||
|
return(XML_ERR_NO_MEMORY);
|
||||||
|
} else if (res == 0) {
|
||||||
|
/*
|
||||||
|
* entity was already defined at another level.
|
||||||
|
*/
|
||||||
|
xmlFreeEntity(ret);
|
||||||
|
return(XML_WAR_ENTITY_REDEFINED);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Link it to the DTD
|
||||||
|
*/
|
||||||
|
ret->parent = dtd;
|
||||||
|
ret->doc = dtd->doc;
|
||||||
|
if (dtd->last == NULL) {
|
||||||
|
dtd->children = dtd->last = (xmlNodePtr) ret;
|
||||||
|
} else {
|
||||||
|
dtd->last->next = (xmlNodePtr) ret;
|
||||||
|
ret->prev = dtd->last;
|
||||||
|
dtd->last = (xmlNodePtr) ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (out != NULL)
|
||||||
|
*out = ret;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Look up a predefined entity.
|
||||||
|
*
|
||||||
|
* @param name the entity name
|
||||||
|
* @returns the entity, or NULL if not found.
|
||||||
|
*/
|
||||||
|
xmlEntity *
|
||||||
|
xmlGetPredefinedEntity(const xmlChar *name) {
|
||||||
|
if (name == NULL) return(NULL);
|
||||||
|
switch (name[0]) {
|
||||||
|
case 'l':
|
||||||
|
if (xmlStrEqual(name, BAD_CAST "lt"))
|
||||||
|
return(&xmlEntityLt);
|
||||||
|
break;
|
||||||
|
case 'g':
|
||||||
|
if (xmlStrEqual(name, BAD_CAST "gt"))
|
||||||
|
return(&xmlEntityGt);
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
if (xmlStrEqual(name, BAD_CAST "amp"))
|
||||||
|
return(&xmlEntityAmp);
|
||||||
|
if (xmlStrEqual(name, BAD_CAST "apos"))
|
||||||
|
return(&xmlEntityApos);
|
||||||
|
break;
|
||||||
|
case 'q':
|
||||||
|
if (xmlStrEqual(name, BAD_CAST "quot"))
|
||||||
|
return(&xmlEntityQuot);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new entity to the document's external subset.
|
||||||
|
*
|
||||||
|
* #xmlAddEntity offers better error handling.
|
||||||
|
*
|
||||||
|
* @param doc the document
|
||||||
|
* @param name the entity name
|
||||||
|
* @param type an xmlEntityType value
|
||||||
|
* @param publicId the publid identifier (optional)
|
||||||
|
* @param systemId the system identifier (URL) (optional)
|
||||||
|
* @param content the entity content
|
||||||
|
* @returns a pointer to the entity or NULL in case of error
|
||||||
|
*/
|
||||||
|
xmlEntity *
|
||||||
|
xmlAddDtdEntity(xmlDoc *doc, const xmlChar *name, int type,
|
||||||
|
const xmlChar *publicId, const xmlChar *systemId,
|
||||||
|
const xmlChar *content) {
|
||||||
|
xmlEntityPtr ret;
|
||||||
|
|
||||||
|
xmlAddEntity(doc, 1, name, type, publicId, systemId, content, &ret);
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new entity to the document's internal subset.
|
||||||
|
*
|
||||||
|
* #xmlAddEntity offers better error handling.
|
||||||
|
*
|
||||||
|
* @param doc the document
|
||||||
|
* @param name the entity name
|
||||||
|
* @param type an xmlEntityType value
|
||||||
|
* @param publicId the publid identifier (optional)
|
||||||
|
* @param systemId the system identifier (URL) (optional)
|
||||||
|
* @param content the entity content
|
||||||
|
* @returns a pointer to the entity or NULL in case of error
|
||||||
|
*/
|
||||||
|
xmlEntity *
|
||||||
|
xmlAddDocEntity(xmlDoc *doc, const xmlChar *name, int type,
|
||||||
|
const xmlChar *publicId, const xmlChar *systemId,
|
||||||
|
const xmlChar *content) {
|
||||||
|
xmlEntityPtr ret;
|
||||||
|
|
||||||
|
xmlAddEntity(doc, 0, name, type, publicId, systemId, content, &ret);
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new entity.
|
||||||
|
*
|
||||||
|
* Like #xmlAddDocEntity, but if `doc` is NULL or has no internal
|
||||||
|
* subset defined, an unlinked entity will be returned. It is then
|
||||||
|
* the responsibility of the caller to link it to the document later
|
||||||
|
* or free it when not needed anymore.
|
||||||
|
*
|
||||||
|
* @param doc the document (optional)
|
||||||
|
* @param name the entity name
|
||||||
|
* @param type an xmlEntityType value
|
||||||
|
* @param publicId the publid identifier (optional)
|
||||||
|
* @param systemId the system identifier (URL) (optional)
|
||||||
|
* @param content the entity content
|
||||||
|
* @returns a pointer to the entity or NULL in case of error
|
||||||
|
*/
|
||||||
|
xmlEntity *
|
||||||
|
xmlNewEntity(xmlDoc *doc, const xmlChar *name, int type,
|
||||||
|
const xmlChar *publicId, const xmlChar *systemId,
|
||||||
|
const xmlChar *content) {
|
||||||
|
if ((doc != NULL) && (doc->intSubset != NULL)) {
|
||||||
|
return(xmlAddDocEntity(doc, name, type, publicId, systemId, content));
|
||||||
|
}
|
||||||
|
if (name == NULL)
|
||||||
|
return(NULL);
|
||||||
|
return(xmlCreateEntity(doc, name, type, publicId, systemId, content));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Look up an entity in a table.
|
||||||
|
*
|
||||||
|
* @param table an entity table
|
||||||
|
* @param name the entity name
|
||||||
|
* @returns a pointer to the entity or NULL if not found.
|
||||||
|
*/
|
||||||
|
static xmlEntityPtr
|
||||||
|
xmlGetEntityFromTable(xmlEntitiesTablePtr table, const xmlChar *name) {
|
||||||
|
return((xmlEntityPtr) xmlHashLookup(table, name));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Look up a paramater entity in the internal and external subset
|
||||||
|
* of `doc`.
|
||||||
|
*
|
||||||
|
* @param doc the document
|
||||||
|
* @param name the entity name
|
||||||
|
* @returns a pointer to the entity or NULL if not found.
|
||||||
|
*/
|
||||||
|
xmlEntity *
|
||||||
|
xmlGetParameterEntity(xmlDoc *doc, const xmlChar *name) {
|
||||||
|
xmlEntitiesTablePtr table;
|
||||||
|
xmlEntityPtr ret;
|
||||||
|
|
||||||
|
if (doc == NULL)
|
||||||
|
return(NULL);
|
||||||
|
if ((doc->intSubset != NULL) && (doc->intSubset->pentities != NULL)) {
|
||||||
|
table = (xmlEntitiesTablePtr) doc->intSubset->pentities;
|
||||||
|
ret = xmlGetEntityFromTable(table, name);
|
||||||
|
if (ret != NULL)
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
if ((doc->extSubset != NULL) && (doc->extSubset->pentities != NULL)) {
|
||||||
|
table = (xmlEntitiesTablePtr) doc->extSubset->pentities;
|
||||||
|
return(xmlGetEntityFromTable(table, name));
|
||||||
|
}
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Look up a general entity in the external subset of `doc`.
|
||||||
|
*
|
||||||
|
* @param doc the document
|
||||||
|
* @param name the entity name
|
||||||
|
* @returns a pointer to the entity or NULL if not found.
|
||||||
|
*/
|
||||||
|
xmlEntity *
|
||||||
|
xmlGetDtdEntity(xmlDoc *doc, const xmlChar *name) {
|
||||||
|
xmlEntitiesTablePtr table;
|
||||||
|
|
||||||
|
if (doc == NULL)
|
||||||
|
return(NULL);
|
||||||
|
if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) {
|
||||||
|
table = (xmlEntitiesTablePtr) doc->extSubset->entities;
|
||||||
|
return(xmlGetEntityFromTable(table, name));
|
||||||
|
}
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Look up a general entity in the internal and external subset
|
||||||
|
* of `doc`. Also checks for predefined entities.
|
||||||
|
*
|
||||||
|
* @param doc the document referencing the entity
|
||||||
|
* @param name the entity name
|
||||||
|
* @returns a pointer to the entity or NULL if not found.
|
||||||
|
*/
|
||||||
|
xmlEntity *
|
||||||
|
xmlGetDocEntity(const xmlDoc *doc, const xmlChar *name) {
|
||||||
|
xmlEntityPtr cur;
|
||||||
|
xmlEntitiesTablePtr table;
|
||||||
|
|
||||||
|
if (doc != NULL) {
|
||||||
|
if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) {
|
||||||
|
table = (xmlEntitiesTablePtr) doc->intSubset->entities;
|
||||||
|
cur = xmlGetEntityFromTable(table, name);
|
||||||
|
if (cur != NULL)
|
||||||
|
return(cur);
|
||||||
|
}
|
||||||
|
if (doc->standalone != 1) {
|
||||||
|
if ((doc->extSubset != NULL) &&
|
||||||
|
(doc->extSubset->entities != NULL)) {
|
||||||
|
table = (xmlEntitiesTablePtr) doc->extSubset->entities;
|
||||||
|
cur = xmlGetEntityFromTable(table, name);
|
||||||
|
if (cur != NULL)
|
||||||
|
return(cur);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(xmlGetPredefinedEntity(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace special characters with predefined entities or numeric
|
||||||
|
* character references.
|
||||||
|
*
|
||||||
|
* If `doc` is NULL or an XML document, replaces `<`, `>` and `&`
|
||||||
|
* with predefined entities. Carriage return is replaced with
|
||||||
|
* ` `. If `doc` or its encoding are NULL, non-ASCII
|
||||||
|
* characters are replaced with a hexadecimal character reference.
|
||||||
|
*
|
||||||
|
* If `doc` is an HTML document, follows the HTML serialization
|
||||||
|
* rules.
|
||||||
|
*
|
||||||
|
* Silently removes some invalid characters like ASCII control
|
||||||
|
* codes.
|
||||||
|
*
|
||||||
|
* See #xmlEncodeSpecialChars for an alternative.
|
||||||
|
*
|
||||||
|
* @param doc the document containing the string (optional)
|
||||||
|
* @param input A string to convert to XML.
|
||||||
|
* @returns a newly allocated string with substitutions.
|
||||||
|
*/
|
||||||
|
xmlChar *
|
||||||
|
xmlEncodeEntitiesReentrant(xmlDoc *doc, const xmlChar *input) {
|
||||||
|
int flags = 0;
|
||||||
|
|
||||||
|
if (input == NULL)
|
||||||
|
return(NULL);
|
||||||
|
|
||||||
|
if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE))
|
||||||
|
flags |= XML_ESCAPE_HTML;
|
||||||
|
else if ((doc == NULL) || (doc->encoding == NULL))
|
||||||
|
flags |= XML_ESCAPE_NON_ASCII;
|
||||||
|
|
||||||
|
return(xmlEscapeText(input, flags));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace special characters with predefined entities or numeric
|
||||||
|
* character references.
|
||||||
|
*
|
||||||
|
* Replaces `<`, `>`, `&` and `"` with predefined entities. Carriage
|
||||||
|
* return is replaced with ` `.
|
||||||
|
*
|
||||||
|
* @param doc unused
|
||||||
|
* @param input A string to convert to XML.
|
||||||
|
* @returns a newly allocated string with substitutions.
|
||||||
|
*/
|
||||||
|
xmlChar *
|
||||||
|
xmlEncodeSpecialChars(const xmlDoc *doc ATTRIBUTE_UNUSED,
|
||||||
|
const xmlChar *input) {
|
||||||
|
if (input == NULL)
|
||||||
|
return(NULL);
|
||||||
|
|
||||||
|
return(xmlEscapeText(input, XML_ESCAPE_QUOT));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create and initialize an empty entities hash table.
|
||||||
|
*
|
||||||
|
* @deprecated Internal function, don't use.
|
||||||
|
*
|
||||||
|
* @returns the xmlEntitiesTable just created or NULL in case of error.
|
||||||
|
*/
|
||||||
|
xmlEntitiesTable *
|
||||||
|
xmlCreateEntitiesTable(void) {
|
||||||
|
return((xmlEntitiesTablePtr) xmlHashCreate(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deallocate the memory used by an entities in the hash table.
|
||||||
|
*
|
||||||
|
* @param entity An entity
|
||||||
|
* @param name its name
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
xmlFreeEntityWrapper(void *entity, const xmlChar *name ATTRIBUTE_UNUSED) {
|
||||||
|
if (entity != NULL)
|
||||||
|
xmlFreeEntity((xmlEntityPtr) entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deallocate the memory used by an entities hash table.
|
||||||
|
*
|
||||||
|
* @deprecated Internal function, don't use.
|
||||||
|
*
|
||||||
|
* @param table An entity table
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
xmlFreeEntitiesTable(xmlEntitiesTable *table) {
|
||||||
|
xmlHashFree(table, xmlFreeEntityWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build a copy of an entity
|
||||||
|
*
|
||||||
|
* @param payload An entity
|
||||||
|
* @param name unused
|
||||||
|
* @returns the new xmlEntities or NULL in case of error.
|
||||||
|
*/
|
||||||
|
static void *
|
||||||
|
xmlCopyEntity(void *payload, const xmlChar *name ATTRIBUTE_UNUSED) {
|
||||||
|
xmlEntityPtr ent = (xmlEntityPtr) payload;
|
||||||
|
xmlEntityPtr cur;
|
||||||
|
|
||||||
|
cur = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity));
|
||||||
|
if (cur == NULL)
|
||||||
|
return(NULL);
|
||||||
|
memset(cur, 0, sizeof(xmlEntity));
|
||||||
|
cur->type = XML_ENTITY_DECL;
|
||||||
|
|
||||||
|
cur->etype = ent->etype;
|
||||||
|
if (ent->name != NULL) {
|
||||||
|
cur->name = xmlStrdup(ent->name);
|
||||||
|
if (cur->name == NULL)
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if (ent->ExternalID != NULL) {
|
||||||
|
cur->ExternalID = xmlStrdup(ent->ExternalID);
|
||||||
|
if (cur->ExternalID == NULL)
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if (ent->SystemID != NULL) {
|
||||||
|
cur->SystemID = xmlStrdup(ent->SystemID);
|
||||||
|
if (cur->SystemID == NULL)
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if (ent->content != NULL) {
|
||||||
|
cur->content = xmlStrdup(ent->content);
|
||||||
|
if (cur->content == NULL)
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if (ent->orig != NULL) {
|
||||||
|
cur->orig = xmlStrdup(ent->orig);
|
||||||
|
if (cur->orig == NULL)
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if (ent->URI != NULL) {
|
||||||
|
cur->URI = xmlStrdup(ent->URI);
|
||||||
|
if (cur->URI == NULL)
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
/* Handle XML_TEXT_NODE children for XML_ENTITY_DECL */
|
||||||
|
if (ent->children != NULL) {
|
||||||
|
cur->children = xmlStaticCopyNodeList(ent->children, cur->doc, (xmlNodePtr)cur);
|
||||||
|
/* Update last pointers */
|
||||||
|
cur->last = cur->children;
|
||||||
|
while (cur->last && cur->last->next) cur->last = cur->last->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(cur);
|
||||||
|
|
||||||
|
error:
|
||||||
|
xmlFreeEntity(cur);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build a copy of an entity table.
|
||||||
|
*
|
||||||
|
* @deprecated Internal function, don't use.
|
||||||
|
*
|
||||||
|
* @param table An entity table
|
||||||
|
* @returns the new xmlEntitiesTable or NULL in case of error.
|
||||||
|
*/
|
||||||
|
xmlEntitiesTable *
|
||||||
|
xmlCopyEntitiesTable(xmlEntitiesTable *table) {
|
||||||
|
return(xmlHashCopySafe(table, xmlCopyEntity, xmlFreeEntityWrapper));
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef LIBXML_OUTPUT_ENABLED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This will dump the content of the entity table as an XML DTD
|
||||||
|
* definition.
|
||||||
|
*
|
||||||
|
* @deprecated Internal function, don't use.
|
||||||
|
*
|
||||||
|
* @param buf An XML buffer.
|
||||||
|
* @param ent An entity table
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
xmlDumpEntityDecl(xmlBuffer *buf, xmlEntity *ent) {
|
||||||
|
xmlSaveCtxtPtr save;
|
||||||
|
|
||||||
|
if ((buf == NULL) || (ent == NULL))
|
||||||
|
return;
|
||||||
|
|
||||||
|
save = xmlSaveToBuffer(buf, NULL, 0);
|
||||||
|
xmlSaveTree(save, (xmlNodePtr) ent);
|
||||||
|
if (xmlSaveFinish(save) != XML_ERR_OK)
|
||||||
|
xmlFree(xmlBufferDetach(buf));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When using the hash table scan function, arguments need to be
|
||||||
|
* reversed.
|
||||||
|
*
|
||||||
|
* @param ent an entity table
|
||||||
|
* @param save a save context
|
||||||
|
* @param name unused
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
xmlDumpEntityDeclScan(void *ent, void *save,
|
||||||
|
const xmlChar *name ATTRIBUTE_UNUSED) {
|
||||||
|
xmlSaveTree(save, ent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This will dump the content of the entity table as an XML DTD
|
||||||
|
* definition.
|
||||||
|
*
|
||||||
|
* @deprecated Internal function, don't use.
|
||||||
|
*
|
||||||
|
* @param buf An XML buffer.
|
||||||
|
* @param table An entity table
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
xmlDumpEntitiesTable(xmlBuffer *buf, xmlEntitiesTable *table) {
|
||||||
|
xmlSaveCtxtPtr save;
|
||||||
|
|
||||||
|
if ((buf == NULL) || (table == NULL))
|
||||||
|
return;
|
||||||
|
|
||||||
|
save = xmlSaveToBuffer(buf, NULL, 0);
|
||||||
|
xmlHashScan(table, xmlDumpEntityDeclScan, save);
|
||||||
|
if (xmlSaveFinish(save) != XML_ERR_OK)
|
||||||
|
xmlFree(xmlBufferDetach(buf));
|
||||||
|
}
|
||||||
|
#endif /* LIBXML_OUTPUT_ENABLED */
|
||||||
+1379
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,16 @@
|
|||||||
|
/gjobread
|
||||||
|
/io1
|
||||||
|
/io2
|
||||||
|
/parse1
|
||||||
|
/parse2
|
||||||
|
/parse3
|
||||||
|
/parse4
|
||||||
|
/reader1
|
||||||
|
/reader2
|
||||||
|
/reader3
|
||||||
|
/reader4
|
||||||
|
/testWriter
|
||||||
|
/tree1
|
||||||
|
/tree2
|
||||||
|
/xpath1
|
||||||
|
/xpath2
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
EXTRA_DIST = \
|
||||||
|
gjobs.xml \
|
||||||
|
meson.build \
|
||||||
|
test1.xml \
|
||||||
|
test2.xml \
|
||||||
|
test3.xml
|
||||||
|
|
||||||
|
check_PROGRAMS = \
|
||||||
|
gjobread \
|
||||||
|
io1 \
|
||||||
|
io2 \
|
||||||
|
parse1 \
|
||||||
|
parse2 \
|
||||||
|
parse3 \
|
||||||
|
parse4 \
|
||||||
|
reader1 \
|
||||||
|
reader2 \
|
||||||
|
reader3 \
|
||||||
|
reader4 \
|
||||||
|
testWriter \
|
||||||
|
tree1 \
|
||||||
|
tree2 \
|
||||||
|
xpath1 \
|
||||||
|
xpath2
|
||||||
|
|
||||||
|
AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include
|
||||||
|
LDADD = $(top_builddir)/libxml2.la
|
||||||
|
|
||||||
|
gjobread_SOURCES=gjobread.c
|
||||||
|
io1_SOURCES = io1.c
|
||||||
|
io2_SOURCES = io2.c
|
||||||
|
parse1_SOURCES = parse1.c
|
||||||
|
parse2_SOURCES = parse2.c
|
||||||
|
parse3_SOURCES = parse3.c
|
||||||
|
parse4_SOURCES = parse4.c
|
||||||
|
reader1_SOURCES = reader1.c
|
||||||
|
reader2_SOURCES = reader2.c
|
||||||
|
reader3_SOURCES = reader3.c
|
||||||
|
reader4_SOURCES = reader4.c
|
||||||
|
testWriter_SOURCES = testWriter.c
|
||||||
|
tree1_SOURCES = tree1.c
|
||||||
|
tree2_SOURCES = tree2.c
|
||||||
|
xpath1_SOURCES = xpath1.c
|
||||||
|
xpath2_SOURCES = xpath2.c
|
||||||
@@ -0,0 +1,301 @@
|
|||||||
|
/*
|
||||||
|
* gjobread.c : a small test program for gnome jobs XML format
|
||||||
|
*
|
||||||
|
* See Copyright for the status of this software.
|
||||||
|
*
|
||||||
|
* Daniel.Veillard@w3.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This example should compile and run indifferently with libxml-1.8.8 +
|
||||||
|
* and libxml2-2.1.0 +
|
||||||
|
* Check the COMPAT comments below
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* COMPAT using xml-config --cflags to get the include path this will
|
||||||
|
* work with both
|
||||||
|
*/
|
||||||
|
#include <libxml/xmlmemory.h>
|
||||||
|
#include <libxml/parser.h>
|
||||||
|
|
||||||
|
#define DEBUG(x) printf(x)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A person record
|
||||||
|
* an xmlChar * is really an UTF8 encoded char string (0 terminated)
|
||||||
|
*/
|
||||||
|
typedef struct person {
|
||||||
|
xmlChar *name;
|
||||||
|
xmlChar *email;
|
||||||
|
xmlChar *company;
|
||||||
|
xmlChar *organisation;
|
||||||
|
xmlChar *smail;
|
||||||
|
xmlChar *webPage;
|
||||||
|
xmlChar *phone;
|
||||||
|
} person, *personPtr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* And the code needed to parse it
|
||||||
|
*/
|
||||||
|
static personPtr
|
||||||
|
parsePerson(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) {
|
||||||
|
personPtr ret = NULL;
|
||||||
|
|
||||||
|
DEBUG("parsePerson\n");
|
||||||
|
/*
|
||||||
|
* allocate the struct
|
||||||
|
*/
|
||||||
|
ret = (personPtr) malloc(sizeof(person));
|
||||||
|
if (ret == NULL) {
|
||||||
|
fprintf(stderr,"out of memory\n");
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
memset(ret, 0, sizeof(person));
|
||||||
|
|
||||||
|
/* We don't care what the top level element name is */
|
||||||
|
/* COMPAT xmlChildrenNode is a macro unifying libxml1 and libxml2 names */
|
||||||
|
cur = cur->xmlChildrenNode;
|
||||||
|
while (cur != NULL) {
|
||||||
|
if ((!xmlStrcmp(cur->name, (const xmlChar *)"Person")) &&
|
||||||
|
(cur->ns == ns))
|
||||||
|
ret->name = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
||||||
|
if ((!xmlStrcmp(cur->name, (const xmlChar *)"Email")) &&
|
||||||
|
(cur->ns == ns))
|
||||||
|
ret->email = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
||||||
|
cur = cur->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* and to print it
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
printPerson(personPtr cur) {
|
||||||
|
if (cur == NULL) return;
|
||||||
|
printf("------ Person\n");
|
||||||
|
if (cur->name) printf(" name: %s\n", cur->name);
|
||||||
|
if (cur->email) printf(" email: %s\n", cur->email);
|
||||||
|
if (cur->company) printf(" company: %s\n", cur->company);
|
||||||
|
if (cur->organisation) printf(" organisation: %s\n", cur->organisation);
|
||||||
|
if (cur->smail) printf(" smail: %s\n", cur->smail);
|
||||||
|
if (cur->webPage) printf(" Web: %s\n", cur->webPage);
|
||||||
|
if (cur->phone) printf(" phone: %s\n", cur->phone);
|
||||||
|
printf("------\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* a Description for a Job
|
||||||
|
*/
|
||||||
|
typedef struct job {
|
||||||
|
xmlChar *projectID;
|
||||||
|
xmlChar *application;
|
||||||
|
xmlChar *category;
|
||||||
|
personPtr contact;
|
||||||
|
int nbDevelopers;
|
||||||
|
personPtr developers[100]; /* using dynamic alloc is left as an exercise */
|
||||||
|
} job, *jobPtr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* And the code needed to parse it
|
||||||
|
*/
|
||||||
|
static jobPtr
|
||||||
|
parseJob(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) {
|
||||||
|
jobPtr ret = NULL;
|
||||||
|
|
||||||
|
DEBUG("parseJob\n");
|
||||||
|
/*
|
||||||
|
* allocate the struct
|
||||||
|
*/
|
||||||
|
ret = (jobPtr) malloc(sizeof(job));
|
||||||
|
if (ret == NULL) {
|
||||||
|
fprintf(stderr,"out of memory\n");
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
memset(ret, 0, sizeof(job));
|
||||||
|
|
||||||
|
/* We don't care what the top level element name is */
|
||||||
|
cur = cur->xmlChildrenNode;
|
||||||
|
while (cur != NULL) {
|
||||||
|
|
||||||
|
if ((!xmlStrcmp(cur->name, (const xmlChar *) "Project")) &&
|
||||||
|
(cur->ns == ns)) {
|
||||||
|
ret->projectID = xmlGetProp(cur, (const xmlChar *) "ID");
|
||||||
|
if (ret->projectID == NULL) {
|
||||||
|
fprintf(stderr, "Project has no ID\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((!xmlStrcmp(cur->name, (const xmlChar *) "Application")) &&
|
||||||
|
(cur->ns == ns))
|
||||||
|
ret->application =
|
||||||
|
xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
||||||
|
if ((!xmlStrcmp(cur->name, (const xmlChar *) "Category")) &&
|
||||||
|
(cur->ns == ns))
|
||||||
|
ret->category =
|
||||||
|
xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
|
||||||
|
if ((!xmlStrcmp(cur->name, (const xmlChar *) "Contact")) &&
|
||||||
|
(cur->ns == ns))
|
||||||
|
ret->contact = parsePerson(doc, ns, cur);
|
||||||
|
cur = cur->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* and to print it
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
printJob(jobPtr cur) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (cur == NULL) return;
|
||||||
|
printf("======= Job\n");
|
||||||
|
if (cur->projectID != NULL) printf("projectID: %s\n", cur->projectID);
|
||||||
|
if (cur->application != NULL) printf("application: %s\n", cur->application);
|
||||||
|
if (cur->category != NULL) printf("category: %s\n", cur->category);
|
||||||
|
if (cur->contact != NULL) printPerson(cur->contact);
|
||||||
|
printf("%d developers\n", cur->nbDevelopers);
|
||||||
|
|
||||||
|
for (i = 0;i < cur->nbDevelopers;i++) printPerson(cur->developers[i]);
|
||||||
|
printf("======= \n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A pool of Gnome Jobs
|
||||||
|
*/
|
||||||
|
typedef struct gjob {
|
||||||
|
int nbJobs;
|
||||||
|
jobPtr jobs[500]; /* using dynamic alloc is left as an exercise */
|
||||||
|
} gJob, *gJobPtr;
|
||||||
|
|
||||||
|
|
||||||
|
static gJobPtr
|
||||||
|
parseGjobFile(char *filename) {
|
||||||
|
xmlDocPtr doc;
|
||||||
|
gJobPtr ret;
|
||||||
|
jobPtr curjob;
|
||||||
|
xmlNsPtr ns;
|
||||||
|
xmlNodePtr cur;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* build an XML tree from a the file;
|
||||||
|
*/
|
||||||
|
doc = xmlReadFile(filename, NULL, XML_PARSE_NOBLANKS);
|
||||||
|
if (doc == NULL) return(NULL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check the document is of the right kind
|
||||||
|
*/
|
||||||
|
|
||||||
|
cur = xmlDocGetRootElement(doc);
|
||||||
|
if (cur == NULL) {
|
||||||
|
fprintf(stderr,"empty document\n");
|
||||||
|
xmlFreeDoc(doc);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
ns = xmlSearchNsByHref(doc, cur,
|
||||||
|
(const xmlChar *) "http://www.gnome.org/some-location");
|
||||||
|
if (ns == NULL) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"document of the wrong type, GJob Namespace not found\n");
|
||||||
|
xmlFreeDoc(doc);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
if (xmlStrcmp(cur->name, (const xmlChar *) "Helping")) {
|
||||||
|
fprintf(stderr,"document of the wrong type, root node != Helping");
|
||||||
|
xmlFreeDoc(doc);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate the structure to be returned.
|
||||||
|
*/
|
||||||
|
ret = (gJobPtr) malloc(sizeof(gJob));
|
||||||
|
if (ret == NULL) {
|
||||||
|
fprintf(stderr,"out of memory\n");
|
||||||
|
xmlFreeDoc(doc);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
memset(ret, 0, sizeof(gJob));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now, walk the tree.
|
||||||
|
*/
|
||||||
|
/* First level we expect just Jobs */
|
||||||
|
cur = cur->xmlChildrenNode;
|
||||||
|
while ( cur && xmlIsBlankNode ( cur ) ) {
|
||||||
|
cur = cur -> next;
|
||||||
|
}
|
||||||
|
if ( cur == 0 ) {
|
||||||
|
xmlFreeDoc(doc);
|
||||||
|
free(ret);
|
||||||
|
return ( NULL );
|
||||||
|
}
|
||||||
|
if ((xmlStrcmp(cur->name, (const xmlChar *) "Jobs")) || (cur->ns != ns)) {
|
||||||
|
fprintf(stderr,"document of the wrong type, was '%s', Jobs expected",
|
||||||
|
cur->name);
|
||||||
|
fprintf(stderr,"xmlDocDump follows\n");
|
||||||
|
#ifdef LIBXML_OUTPUT_ENABLED
|
||||||
|
xmlDocDump ( stderr, doc );
|
||||||
|
fprintf(stderr,"xmlDocDump finished\n");
|
||||||
|
#endif /* LIBXML_OUTPUT_ENABLED */
|
||||||
|
xmlFreeDoc(doc);
|
||||||
|
free(ret);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Second level is a list of Job, but be laxist */
|
||||||
|
cur = cur->xmlChildrenNode;
|
||||||
|
while (cur != NULL) {
|
||||||
|
if ((!xmlStrcmp(cur->name, (const xmlChar *) "Job")) &&
|
||||||
|
(cur->ns == ns)) {
|
||||||
|
curjob = parseJob(doc, ns, cur);
|
||||||
|
if (curjob != NULL)
|
||||||
|
ret->jobs[ret->nbJobs++] = curjob;
|
||||||
|
if (ret->nbJobs >= 500) break;
|
||||||
|
}
|
||||||
|
cur = cur->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handleGjob(gJobPtr cur) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Do whatever you want and free the structure.
|
||||||
|
*/
|
||||||
|
printf("%d Jobs registered\n", cur->nbJobs);
|
||||||
|
for (i = 0; i < cur->nbJobs; i++) printJob(cur->jobs[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
int i;
|
||||||
|
gJobPtr cur;
|
||||||
|
|
||||||
|
/* COMPAT: Do not generate nodes for formatting spaces */
|
||||||
|
LIBXML_TEST_VERSION
|
||||||
|
|
||||||
|
for (i = 1; i < argc ; i++) {
|
||||||
|
cur = parseGjobFile(argv[i]);
|
||||||
|
if ( cur )
|
||||||
|
handleGjob(cur);
|
||||||
|
else
|
||||||
|
fprintf( stderr, "Error parsing file '%s'\n", argv[i]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clean up everything else before quitting. */
|
||||||
|
xmlCleanupParser();
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<gjob:Helping xmlns:gjob="http://www.gnome.org/some-location">
|
||||||
|
<gjob:Jobs>
|
||||||
|
|
||||||
|
<gjob:Job>
|
||||||
|
<gjob:Project ID="3"/>
|
||||||
|
<gjob:Application>GBackup</gjob:Application>
|
||||||
|
<gjob:Category>Development</gjob:Category>
|
||||||
|
|
||||||
|
<gjob:Update>
|
||||||
|
<gjob:Status>Open</gjob:Status>
|
||||||
|
<gjob:Modified>Mon, 07 Jun 1999 20:27:45 -0400 MET DST</gjob:Modified>
|
||||||
|
<gjob:Salary>USD 0.00</gjob:Salary>
|
||||||
|
</gjob:Update>
|
||||||
|
|
||||||
|
<gjob:Developers>
|
||||||
|
<gjob:Developer>
|
||||||
|
</gjob:Developer>
|
||||||
|
</gjob:Developers>
|
||||||
|
|
||||||
|
<gjob:Contact>
|
||||||
|
<gjob:Person>Nathan Clemons</gjob:Person>
|
||||||
|
<gjob:Email>nathan@windsofstorm.net</gjob:Email>
|
||||||
|
<gjob:Company>
|
||||||
|
</gjob:Company>
|
||||||
|
<gjob:Organisation>
|
||||||
|
</gjob:Organisation>
|
||||||
|
<gjob:Webpage>
|
||||||
|
</gjob:Webpage>
|
||||||
|
<gjob:Snailmail>
|
||||||
|
</gjob:Snailmail>
|
||||||
|
<gjob:Phone>
|
||||||
|
</gjob:Phone>
|
||||||
|
</gjob:Contact>
|
||||||
|
|
||||||
|
<gjob:Requirements>
|
||||||
|
The program should be released as free software, under the GPL.
|
||||||
|
</gjob:Requirements>
|
||||||
|
|
||||||
|
<gjob:Skills>
|
||||||
|
</gjob:Skills>
|
||||||
|
|
||||||
|
<gjob:Details>
|
||||||
|
A GNOME based system that will allow a superuser to configure
|
||||||
|
compressed and uncompressed files and/or file systems to be backed
|
||||||
|
up with a supported media in the system. This should be able to
|
||||||
|
perform via find commands generating a list of files that are passed
|
||||||
|
to tar, dd, cpio, cp, gzip, etc., to be directed to the tape machine
|
||||||
|
or via operations performed on the filesystem itself. Email
|
||||||
|
notification and GUI status display very important.
|
||||||
|
</gjob:Details>
|
||||||
|
|
||||||
|
</gjob:Job>
|
||||||
|
|
||||||
|
</gjob:Jobs>
|
||||||
|
</gjob:Helping>
|
||||||
|
|
||||||
@@ -0,0 +1,241 @@
|
|||||||
|
/*
|
||||||
|
* icu.c: Example how to use ICU for character encoding conversion
|
||||||
|
*
|
||||||
|
* This example shows how to use ICU by installing a custom character
|
||||||
|
* encoding converter with xmlCtxtSetCharEncConvImpl, available
|
||||||
|
* since libxml2 2.14.
|
||||||
|
*
|
||||||
|
* This approach makes it possible to use ICU even if libxml2 is
|
||||||
|
* compiled without ICU support. It also makes sure that *only* ICU
|
||||||
|
* is used. Many Linux distros currently ship libxml2 with support
|
||||||
|
* for both ICU and iconv which makes the library's behavior hard to
|
||||||
|
* predict.
|
||||||
|
*
|
||||||
|
* The long-term plan is to make libxml2 only support a single
|
||||||
|
* conversion library internally (iconv on POSIX).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <libxml/parser.h>
|
||||||
|
#include <unicode/ucnv.h>
|
||||||
|
|
||||||
|
#define ICU_PIVOT_BUF_SIZE 1024
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UConverter *uconv; /* for conversion between an encoding and UTF-16 */
|
||||||
|
UConverter *utf8; /* for conversion between UTF-8 and UTF-16 */
|
||||||
|
UChar *pivot_source;
|
||||||
|
UChar *pivot_target;
|
||||||
|
int isInput;
|
||||||
|
UChar pivot_buf[ICU_PIVOT_BUF_SIZE];
|
||||||
|
} myConvCtxt;
|
||||||
|
|
||||||
|
static xmlCharEncError
|
||||||
|
icuConvert(void *vctxt, unsigned char *out, int *outlen,
|
||||||
|
const unsigned char *in, int *inlen, int flush) {
|
||||||
|
myConvCtxt *cd = vctxt;
|
||||||
|
const char *ucv_in = (const char *) in;
|
||||||
|
char *ucv_out = (char *) out;
|
||||||
|
UConverter *target, *source;
|
||||||
|
UErrorCode err = U_ZERO_ERROR;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) {
|
||||||
|
if (outlen != NULL)
|
||||||
|
*outlen = 0;
|
||||||
|
return XML_ENC_ERR_INTERNAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The ICU API can consume input, including partial sequences,
|
||||||
|
* even if the output buffer would overflow. The remaining input
|
||||||
|
* must be processed by calling ucnv_convertEx with a possibly
|
||||||
|
* empty input buffer.
|
||||||
|
*/
|
||||||
|
if (cd->isInput) {
|
||||||
|
source = cd->uconv;
|
||||||
|
target = cd->utf8;
|
||||||
|
} else {
|
||||||
|
source = cd->utf8;
|
||||||
|
target = cd->uconv;
|
||||||
|
}
|
||||||
|
|
||||||
|
ucnv_convertEx(target, source, &ucv_out, ucv_out + *outlen,
|
||||||
|
&ucv_in, ucv_in + *inlen, cd->pivot_buf,
|
||||||
|
&cd->pivot_source, &cd->pivot_target,
|
||||||
|
cd->pivot_buf + ICU_PIVOT_BUF_SIZE,
|
||||||
|
/* reset */ 0, flush, &err);
|
||||||
|
|
||||||
|
*inlen = ucv_in - (const char*) in;
|
||||||
|
*outlen = ucv_out - (char *) out;
|
||||||
|
|
||||||
|
if (U_SUCCESS(err)) {
|
||||||
|
ret = XML_ENC_ERR_SUCCESS;
|
||||||
|
} else {
|
||||||
|
switch (err) {
|
||||||
|
case U_TRUNCATED_CHAR_FOUND:
|
||||||
|
/* Should only happen with flush */
|
||||||
|
ret = XML_ENC_ERR_INPUT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U_BUFFER_OVERFLOW_ERROR:
|
||||||
|
ret = XML_ENC_ERR_SPACE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U_INVALID_CHAR_FOUND:
|
||||||
|
case U_ILLEGAL_CHAR_FOUND:
|
||||||
|
case U_ILLEGAL_ESCAPE_SEQUENCE:
|
||||||
|
case U_UNSUPPORTED_ESCAPE_SEQUENCE:
|
||||||
|
ret = XML_ENC_ERR_INPUT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case U_MEMORY_ALLOCATION_ERROR:
|
||||||
|
ret = XML_ENC_ERR_MEMORY;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ret = XML_ENC_ERR_INTERNAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static xmlParserErrors
|
||||||
|
icuOpen(const char* name, int isInput, myConvCtxt **out)
|
||||||
|
{
|
||||||
|
UErrorCode status;
|
||||||
|
myConvCtxt *cd;
|
||||||
|
|
||||||
|
*out = NULL;
|
||||||
|
|
||||||
|
cd = xmlMalloc(sizeof(myConvCtxt));
|
||||||
|
if (cd == NULL)
|
||||||
|
return XML_ERR_NO_MEMORY;
|
||||||
|
|
||||||
|
cd->isInput = isInput;
|
||||||
|
cd->pivot_source = cd->pivot_buf;
|
||||||
|
cd->pivot_target = cd->pivot_buf;
|
||||||
|
|
||||||
|
status = U_ZERO_ERROR;
|
||||||
|
cd->uconv = ucnv_open(name, &status);
|
||||||
|
if (U_FAILURE(status))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
status = U_ZERO_ERROR;
|
||||||
|
if (isInput) {
|
||||||
|
ucnv_setToUCallBack(cd->uconv, UCNV_TO_U_CALLBACK_STOP,
|
||||||
|
NULL, NULL, NULL, &status);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ucnv_setFromUCallBack(cd->uconv, UCNV_FROM_U_CALLBACK_STOP,
|
||||||
|
NULL, NULL, NULL, &status);
|
||||||
|
}
|
||||||
|
if (U_FAILURE(status))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
status = U_ZERO_ERROR;
|
||||||
|
cd->utf8 = ucnv_open("UTF-8", &status);
|
||||||
|
if (U_FAILURE(status))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
*out = cd;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
if (cd->uconv)
|
||||||
|
ucnv_close(cd->uconv);
|
||||||
|
xmlFree(cd);
|
||||||
|
|
||||||
|
if (status == U_FILE_ACCESS_ERROR)
|
||||||
|
return XML_ERR_UNSUPPORTED_ENCODING;
|
||||||
|
if (status == U_MEMORY_ALLOCATION_ERROR)
|
||||||
|
return XML_ERR_NO_MEMORY;
|
||||||
|
return XML_ERR_SYSTEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
icuClose(myConvCtxt *cd)
|
||||||
|
{
|
||||||
|
if (cd == NULL)
|
||||||
|
return;
|
||||||
|
ucnv_close(cd->uconv);
|
||||||
|
ucnv_close(cd->utf8);
|
||||||
|
xmlFree(cd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
icuConvCtxtDtor(void *vctxt) {
|
||||||
|
icuClose(vctxt);
|
||||||
|
}
|
||||||
|
|
||||||
|
static xmlParserErrors
|
||||||
|
icuConvImpl(void *vctxt, const char *name, xmlCharEncFlags flags,
|
||||||
|
xmlCharEncodingHandler **result) {
|
||||||
|
xmlCharEncConvFunc inFunc = NULL, outFunc = NULL;
|
||||||
|
myConvCtxt *inputCtxt = NULL;
|
||||||
|
myConvCtxt *outputCtxt = NULL;
|
||||||
|
xmlParserErrors ret;
|
||||||
|
|
||||||
|
if (flags & XML_ENC_INPUT) {
|
||||||
|
ret = icuOpen(name, 1, &inputCtxt);
|
||||||
|
if (ret != 0)
|
||||||
|
goto error;
|
||||||
|
inFunc = icuConvert;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & XML_ENC_OUTPUT) {
|
||||||
|
ret = icuOpen(name, 0, &outputCtxt);
|
||||||
|
if (ret != 0)
|
||||||
|
goto error;
|
||||||
|
outFunc = icuConvert;
|
||||||
|
}
|
||||||
|
|
||||||
|
return xmlCharEncNewCustomHandler(name, inFunc, outFunc, icuConvCtxtDtor,
|
||||||
|
inputCtxt, outputCtxt, result);
|
||||||
|
|
||||||
|
error:
|
||||||
|
if (inputCtxt != NULL)
|
||||||
|
icuClose(inputCtxt);
|
||||||
|
if (outputCtxt != NULL)
|
||||||
|
icuClose(outputCtxt);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void) {
|
||||||
|
xmlParserCtxtPtr ctxt;
|
||||||
|
xmlDocPtr doc;
|
||||||
|
const char *xml;
|
||||||
|
xmlChar *content;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We use IBM-1051, an alias for HP Roman, as a simple example that
|
||||||
|
* ICU supports, but iconv (typically) doesn't.
|
||||||
|
*
|
||||||
|
* Character code 0xDE is U+00DF Latin Small Letter Sharp S.
|
||||||
|
*/
|
||||||
|
xml = "<doc>\xDE</doc>";
|
||||||
|
|
||||||
|
ctxt = xmlNewParserCtxt();
|
||||||
|
xmlCtxtSetCharEncConvImpl(ctxt, icuConvImpl, NULL);
|
||||||
|
doc = xmlCtxtReadDoc(ctxt, BAD_CAST xml, NULL, "IBM-1051", 0);
|
||||||
|
xmlFreeParserCtxt(ctxt);
|
||||||
|
|
||||||
|
content = xmlNodeGetContent((xmlNodePtr) doc);
|
||||||
|
|
||||||
|
printf("content: %s\n", content);
|
||||||
|
|
||||||
|
if (!xmlStrEqual(content, BAD_CAST "\xC3\x9F")) {
|
||||||
|
fprintf(stderr, "conversion failed\n");
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlFree(content);
|
||||||
|
xmlFreeDoc(doc);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user