[libxml2] Fix a Relaxng bug raised by libvirt test suite



commit 9332b48f16123cac16a207425b3a0206e5da35c1
Author: Daniel Veillard <veillard redhat com>
Date:   Wed Sep 23 18:28:43 2009 +0200

    Fix a Relaxng bug raised by libvirt test suite
    
    * xmlregexp.c: other fixes in 2.7.4 raised this internal error
      when comparing ranges, this affects among others detection of
      the determinism
    * test/relaxng/libvirt* result/relaxng/libvirt*: add a test case
      based on libvirt schemas and tests

 result/relaxng/libvirt_0.err |    1 +
 result/relaxng/libvirt_err   |    1 +
 test/relaxng/libvirt.rng     | 1258 ++++++++++++++++++++++++++++++++++++++++++
 test/relaxng/libvirt_0.xml   |   23 +
 xmlregexp.c                  |   11 +-
 5 files changed, 1289 insertions(+), 5 deletions(-)
---
diff --git a/result/relaxng/libvirt_0 b/result/relaxng/libvirt_0
new file mode 100644
index 0000000..e69de29
diff --git a/result/relaxng/libvirt_0.err b/result/relaxng/libvirt_0.err
new file mode 100644
index 0000000..29535b8
--- /dev/null
+++ b/result/relaxng/libvirt_0.err
@@ -0,0 +1 @@
+./test/relaxng/libvirt_0.xml validates
diff --git a/result/relaxng/libvirt_err b/result/relaxng/libvirt_err
new file mode 100644
index 0000000..4acf3ed
--- /dev/null
+++ b/result/relaxng/libvirt_err
@@ -0,0 +1 @@
+./test/relaxng/libvirt.rng validates
diff --git a/result/relaxng/libvirt_valid b/result/relaxng/libvirt_valid
new file mode 100644
index 0000000..e69de29
diff --git a/test/relaxng/libvirt.rng b/test/relaxng/libvirt.rng
new file mode 100644
index 0000000..c1f586e
--- /dev/null
+++ b/test/relaxng/libvirt.rng
@@ -0,0 +1,1258 @@
+<?xml version="1.0"?>
+<grammar xmlns="http://relaxng.org/ns/structure/1.0"; datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes";>
+  <!-- We handle only document defining a domain -->
+  <start>
+    <ref name="domain"/>
+  </start>
+
+  <!--
+      We handle only document defining a domain
+    -->
+  <define name="domain">
+    <element name="domain">
+      <ref name="hvs"/>
+      <ref name="ids"/>
+      <interleave>
+        <ref name="os"/>
+        <ref name="clock"/>
+        <ref name="resources"/>
+        <ref name="features"/>
+        <ref name="termination"/>
+        <optional>
+          <ref name="devices"/>
+        </optional>
+        <optional>
+          <ref name="seclabel"/>
+        </optional>
+      </interleave>
+    </element>
+  </define>
+  <define name="seclabel">
+    <element name="seclabel">
+      <attribute name="model">
+        <text/>
+      </attribute>
+      <attribute name="type">
+        <choice>
+          <value>dynamic</value>
+          <value>static</value>
+        </choice>
+      </attribute>
+      <element name="label">
+        <text/>
+      </element>
+    </element>
+  </define>
+  <define name="hvs">
+    <attribute name="type">
+      <choice>
+        <value>xen</value>
+        <value>kvm</value>
+        <value>kqemu</value>
+        <value>qemu</value>
+        <value>lxc</value>
+        <value>openvz</value>
+        <value>test</value>
+      </choice>
+    </attribute>
+  </define>
+  <define name="os">
+    <choice>
+      <ref name="osxen"/>
+      <ref name="oshvm"/>
+      <ref name="osexe"/>
+    </choice>
+  </define>
+  <define name="osxen">
+    <choice>
+      <group>
+        <optional>
+          <ref name="bootloader"/>
+        </optional>
+        <element name="os">
+          <ref name="ostypexen"/>
+          <ref name="osbootkernel"/>
+        </element>
+      </group>
+      <group>
+        <ref name="bootloader"/>
+        <optional>
+          <element name="os">
+            <ref name="ostypexen"/>
+            <optional>
+              <ref name="osbootkernel"/>
+            </optional>
+          </element>
+        </optional>
+      </group>
+    </choice>
+  </define>
+  <define name="oshvm">
+    <element name="os">
+      <ref name="ostypehvm"/>
+      <interleave>
+        <optional>
+          <element name="loader">
+            <ref name="absFilePath"/>
+          </element>
+        </optional>
+        <choice>
+          <ref name="osbootkernel"/>
+          <ref name="osbootdev"/>
+        </choice>
+      </interleave>
+    </element>
+  </define>
+  <define name="ostypexen">
+    <element name="type">
+      <optional>
+        <attribute name="arch">
+          <choice>
+            <value>i686</value>
+            <value>x86_64</value>
+            <value>ia64</value>
+          </choice>
+        </attribute>
+      </optional>
+      <optional>
+        <attribute name="machine">
+          <choice>
+            <value>xenpv</value>
+            <value>xenner</value>
+          </choice>
+        </attribute>
+      </optional>
+      <choice>
+        <value>xen</value>
+        <value>linux</value>
+      </choice>
+    </element>
+  </define>
+  <define name="ostypehvm">
+    <element name="type">
+      <optional>
+        <choice>
+          <ref name="hvmx86"/>
+          <ref name="hvmmips"/>
+          <ref name="hvmsparc"/>
+          <ref name="hvmppc"/>
+        </choice>
+      </optional>
+      <value>hvm</value>
+    </element>
+  </define>
+  <define name="hvmx86">
+    <group>
+      <attribute name="arch">
+        <choice>
+          <value>i686</value>
+          <value>x86_64</value>
+        </choice>
+      </attribute>
+      <attribute name="machine">
+        <choice>
+          <value>xenfv</value>
+          <value>pc</value>
+          <value>isapc</value>
+        </choice>
+      </attribute>
+    </group>
+  </define>
+  <define name="hvmmips">
+    <group>
+      <attribute name="arch">
+        <value>mips</value>
+      </attribute>
+      <attribute name="machine">
+        <value>mips</value>
+      </attribute>
+    </group>
+  </define>
+  <define name="hvmsparc">
+    <group>
+      <attribute name="arch">
+        <value>sparc</value>
+      </attribute>
+      <attribute name="machine">
+        <value>sun4m</value>
+      </attribute>
+    </group>
+  </define>
+  <define name="hvmppc">
+    <group>
+      <attribute name="arch">
+        <value>ppc</value>
+      </attribute>
+      <attribute name="machine">
+        <choice>
+          <value>g3beige</value>
+          <value>mac99</value>
+          <value>prep</value>
+        </choice>
+      </attribute>
+    </group>
+  </define>
+  <define name="osexe">
+    <element name="os">
+      <element name="type">
+        <value>exe</value>
+      </element>
+      <interleave>
+        <optional>
+          <element name="init">
+            <ref name="absFilePath"/>
+          </element>
+        </optional>
+      </interleave>
+    </element>
+  </define>
+  <!--
+      The Identifiers can be:
+      - an optional id attribute with a number on the domain element
+      - a mandatory name
+      - an optional uuid
+    -->
+  <define name="ids">
+    <optional>
+      <attribute name="id">
+        <ref name="unsignedInt"/>
+      </attribute>
+    </optional>
+    <interleave>
+      <element name="name">
+        <ref name="domainName"/>
+      </element>
+      <optional>
+        <element name="uuid">
+          <ref name="UUID"/>
+        </element>
+      </optional>
+    </interleave>
+  </define>
+  <!--
+      Resources usage defines the amount of memory (maximum and possibly
+      current usage) and number of virtual CPUs used by that domain.
+      We can't check here the rule that currentMemory <= memory
+    -->
+  <define name="resources">
+    <interleave>
+      <element name="memory">
+        <ref name="memoryKB"/>
+      </element>
+      <optional>
+        <element name="currentMemory">
+          <ref name="memoryKB"/>
+        </element>
+      </optional>
+      <optional>
+	<element name="memoryBacking">
+	  <optional>
+	    <element name="hugepages">
+	      <empty/>
+	    </element>
+	  </optional>
+	</element>
+      </optional>
+      <optional>
+        <element name="vcpu">
+          <optional>
+            <attribute name="cpuset"/>
+          </optional>
+          <ref name="countCPU"/>
+        </element>
+      </optional>
+    </interleave>
+  </define>
+  <define name="clock">
+    <optional>
+      <element name="clock">
+        <attribute name="offset">
+          <choice>
+            <value>localtime</value>
+            <value>utc</value>
+          </choice>
+        </attribute>
+        <empty/>
+      </element>
+    </optional>
+  </define>
+  <!--
+      A bootloader may be used to extract the OS information instead of
+      defining the OS parameter in the instance. It points just to the
+      binary or script used to extract the data from the first disk device.
+    -->
+  <define name="bootloader">
+    <interleave>
+      <element name="bootloader">
+        <choice>
+          <ref name="absFilePath"/>
+          <empty/>
+        </choice>
+      </element>
+      <optional>
+        <element name="bootloader_args">
+          <text/>
+        </element>
+      </optional>
+    </interleave>
+  </define>
+  <define name="osbootkernel">
+    <interleave>
+      <element name="kernel">
+        <ref name="absFilePath"/>
+      </element>
+      <optional>
+        <element name="initrd">
+          <ref name="absFilePath"/>
+        </element>
+      </optional>
+      <optional>
+        <element name="root">
+          <ref name="devicePath"/>
+        </element>
+      </optional>
+      <optional>
+        <element name="cmdline">
+          <text/>
+        </element>
+      </optional>
+    </interleave>
+  </define>
+  <define name="osbootdev">
+    <element name="boot">
+      <attribute name="dev">
+        <choice>
+          <value>hd</value>
+          <value>fd</value>
+          <value>cdrom</value>
+          <value>network</value>
+        </choice>
+      </attribute>
+      <empty/>
+    </element>
+  </define>
+  <define name="diskspec">
+    <optional>
+      <ref name="driver"/>
+    </optional>
+    <ref name="target"/>
+    <optional>
+      <element name="readonly">
+        <empty/>
+      </element>
+    </optional>
+    <optional>
+      <element name="shareable">
+        <empty/>
+      </element>
+    </optional>
+    <optional>
+      <element name="serial">
+        <ref name="diskSerial"/>
+      </element>
+    </optional>
+  </define>
+  <!--
+      A disk description can be either of type file or block
+      The name of the attribute on the source element depends on the type
+
+    -->
+  <define name="disk">
+    <element name="disk">
+      <optional>
+        <attribute name="device">
+          <choice>
+            <value>floppy</value>
+            <value>disk</value>
+            <value>cdrom</value>
+          </choice>
+        </attribute>
+      </optional>
+      <choice>
+        <group>
+          <attribute name="type">
+            <value>file</value>
+          </attribute>
+          <interleave>
+            <optional>
+              <element name="source">
+                <attribute name="file">
+                  <ref name="absFilePath"/>
+                </attribute>
+                <empty/>
+              </element>
+            </optional>
+            <ref name="diskspec"/>
+          </interleave>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>block</value>
+          </attribute>
+          <interleave>
+            <optional>
+              <element name="source">
+                <attribute name="dev">
+                  <ref name="deviceName"/>
+                </attribute>
+                <empty/>
+              </element>
+            </optional>
+            <ref name="diskspec"/>
+          </interleave>
+        </group>
+        <ref name="diskspec"/>
+      </choice>
+    </element>
+  </define>
+  <define name="target">
+    <element name="target">
+      <attribute name="dev">
+        <ref name="deviceName"/>
+      </attribute>
+      <optional>
+        <attribute name="bus">
+          <choice>
+            <value>ide</value>
+            <value>fdc</value>
+            <value>scsi</value>
+            <value>virtio</value>
+            <value>xen</value>
+            <value>usb</value>
+            <value>uml</value>
+          </choice>
+        </attribute>
+      </optional>
+    </element>
+  </define>
+  <!--
+      Disk may use a special driver for access. Currently this is
+      only defined for Xen for tap/aio and file, but will certainly be
+      extended in the future, and libvirt doesn't look for specific values.
+    -->
+  <define name="driver">
+    <element name="driver">
+      <choice>
+        <group>
+          <ref name="driverFormat"/>
+          <optional>
+            <ref name="driverCache"/>
+          </optional>
+        </group>
+        <group>
+          <optional>
+            <ref name="driverFormat"/>
+          </optional>
+          <ref name="driverCache"/>
+        </group>
+      </choice>
+      <empty/>
+    </element>
+  </define>
+  <define name="driverFormat">
+    <attribute name="name">
+      <ref name="genericName"/>
+    </attribute>
+    <optional>
+      <attribute name="type">
+        <ref name="genericName"/>
+      </attribute>
+    </optional>
+  </define>
+  <define name="driverCache">
+    <attribute name="cache">
+      <choice>
+        <value>none</value>
+        <value>writeback</value>
+        <value>writethrough</value>
+      </choice>
+    </attribute>
+  </define>
+  <define name="filesystem">
+    <element name="filesystem">
+      <choice>
+        <group>
+          <attribute name="type">
+            <value>file</value>
+          </attribute>
+          <interleave>
+            <element name="source">
+              <attribute name="file">
+                <ref name="absFilePath"/>
+              </attribute>
+              <empty/>
+            </element>
+            <ref name="filesystemtgt"/>
+          </interleave>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>block</value>
+          </attribute>
+          <interleave>
+            <element name="source">
+              <attribute name="dev">
+                <ref name="deviceName"/>
+              </attribute>
+              <empty/>
+            </element>
+            <ref name="filesystemtgt"/>
+          </interleave>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>mount</value>
+          </attribute>
+          <interleave>
+            <element name="source">
+              <attribute name="dir">
+                <ref name="absFilePath"/>
+              </attribute>
+              <empty/>
+            </element>
+            <ref name="filesystemtgt"/>
+          </interleave>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>template</value>
+          </attribute>
+          <interleave>
+            <element name="source">
+              <attribute name="name">
+                <ref name="genericName"/>
+              </attribute>
+              <empty/>
+            </element>
+            <ref name="filesystemtgt"/>
+          </interleave>
+        </group>
+      </choice>
+    </element>
+  </define>
+  <define name="filesystemtgt">
+    <element name="target">
+      <attribute name="dir">
+        <ref name="absDirPath"/>
+      </attribute>
+      <empty/>
+    </element>
+  </define>
+  <!--
+      An interface description can either be of type bridge in which case
+      it will use a bridging source, or of type ethernet which uses a device
+      source and a device target instead. They both share a set of interface
+      options. FIXME
+    -->
+  <define name="interface">
+    <element name="interface">
+      <choice>
+        <group>
+          <attribute name="type">
+            <value>bridge</value>
+          </attribute>
+          <interleave>
+            <optional>
+              <element name="source">
+                <attribute name="bridge">
+                  <ref name="deviceName"/>
+                </attribute>
+                <empty/>
+              </element>
+            </optional>
+            <ref name="interface-options"/>
+          </interleave>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>ethernet</value>
+          </attribute>
+          <interleave>
+            <optional>
+              <element name="source">
+                <attribute name="dev">
+                  <ref name="deviceName"/>
+                </attribute>
+                <empty/>
+              </element>
+            </optional>
+            <ref name="interface-options"/>
+          </interleave>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>network</value>
+          </attribute>
+          <interleave>
+            <element name="source">
+              <attribute name="network">
+                <ref name="deviceName"/>
+              </attribute>
+              <empty/>
+            </element>
+            <ref name="interface-options"/>
+          </interleave>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>user</value>
+          </attribute>
+          <interleave>
+            <ref name="interface-options"/>
+          </interleave>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>internal</value>
+          </attribute>
+          <interleave>
+            <element name="source">
+              <attribute name="name">
+                <ref name="deviceName"/>
+              </attribute>
+              <empty/>
+            </element>
+            <ref name="interface-options"/>
+          </interleave>
+        </group>
+      </choice>
+    </element>
+  </define>
+  <!--
+      The interface options possible are:
+        - the MAC address
+        - the IP address bound to the interface
+        - the name of the script used to set up the binding
+        - the target device used
+    -->
+  <define name="interface-options">
+    <interleave>
+      <optional>
+        <element name="target">
+          <attribute name="dev">
+            <ref name="deviceName"/>
+          </attribute>
+          <empty/>
+        </element>
+      </optional>
+      <optional>
+        <element name="mac">
+          <attribute name="address">
+            <ref name="addrMAC"/>
+          </attribute>
+          <empty/>
+        </element>
+      </optional>
+      <optional>
+        <element name="ip">
+          <attribute name="address">
+            <ref name="addrIP"/>
+          </attribute>
+          <empty/>
+        </element>
+      </optional>
+      <optional>
+        <element name="script">
+          <attribute name="path">
+            <ref name="filePath"/>
+          </attribute>
+          <empty/>
+        </element>
+      </optional>
+      <optional>
+        <element name="model">
+          <attribute name="type"/>
+          <empty/>
+        </element>
+      </optional>
+    </interleave>
+  </define>
+  <!--
+      An emulator description is just a path to the binary used for the task
+    -->
+  <define name="emulator">
+    <element name="emulator">
+      <ref name="absFilePath"/>
+    </element>
+  </define>
+  <!--
+      A graphic description, currently in Xen only 2 types are supported:
+        - sdl with optional display, xauth and fullscreen
+        - vnc with a required port and optional listen IP address, password
+          and keymap
+    -->
+  <define name="graphic">
+    <element name="graphics">
+      <choice>
+        <group>
+          <attribute name="type">
+            <value>sdl</value>
+          </attribute>
+          <optional>
+            <attribute name="display">
+              <text/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="xauth">
+              <text/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="fullscreen">
+              <choice>
+                <value>yes</value>
+                <value>no</value>
+              </choice>
+            </attribute>
+          </optional>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>vnc</value>
+          </attribute>
+          <optional>
+            <attribute name="port">
+              <ref name="PortNumber"/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="autoport">
+              <choice>
+                <value>yes</value>
+                <value>no</value>
+              </choice>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="listen">
+              <ref name="addrIP"/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="passwd">
+              <text/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="keymap">
+              <text/>
+            </attribute>
+          </optional>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>rdp</value>
+          </attribute>
+          <optional>
+            <attribute name="port">
+              <ref name="PortNumber"/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="autoport">
+              <choice>
+                <value>yes</value>
+                <value>no</value>
+              </choice>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="replaceUser">
+              <choice>
+                <value>yes</value>
+                <value>no</value>
+              </choice>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="multiUser">
+              <choice>
+                <value>yes</value>
+                <value>no</value>
+              </choice>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="listen">
+              <ref name="addrIP"/>
+            </attribute>
+          </optional>
+        </group>
+        <group>
+          <attribute name="type">
+            <value>desktop</value>
+          </attribute>
+          <optional>
+            <attribute name="display">
+              <text/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="fullscreen">
+              <choice>
+                <value>yes</value>
+                <value>no</value>
+              </choice>
+            </attribute>
+          </optional>
+        </group>
+      </choice>
+    </element>
+  </define>
+  <!--
+     A graphic description, currently in Xen only 2 types are supported:
+       - sdl with optional display, xauth and fullscreen
+       - vnc with a required port and optional listen IP address, password
+         and keymap
+   -->
+  <define name="video">
+    <element name="video">
+      <optional>
+	<element name="model">
+          <attribute name="type">
+            <choice>
+              <value>vga</value>
+              <value>cirrus</value>
+              <value>vmvga</value>
+              <value>xen</value>
+              <value>vbox</value>
+            </choice>
+          </attribute>
+          <optional>
+            <attribute name="vram">
+              <ref name="unsignedInt"/>
+            </attribute>
+          </optional>
+          <optional>
+            <attribute name="heads">
+              <ref name="unsignedInt"/>
+            </attribute>
+          </optional>
+          <optional>
+            <element name="acceleration">
+              <optional>
+                <attribute name="accel3d">
+                  <choice>
+                    <value>yes</value>
+                    <value>no</value>
+                  </choice>
+                </attribute>
+              </optional>
+              <optional>
+                <attribute name="accel2d">
+                  <choice>
+                    <value>yes</value>
+                    <value>no</value>
+                  </choice>
+                </attribute>
+              </optional>
+            </element>
+          </optional>
+	</element>
+      </optional>
+    </element>
+  </define>
+  <!--
+      When a domain terminates multiple policies can be applied depending
+      on how it ended:
+    -->
+  <define name="termination">
+    <interleave>
+      <optional>
+        <element name="on_reboot">
+          <ref name="offOptions"/>
+        </element>
+      </optional>
+      <optional>
+        <element name="on_poweroff">
+          <ref name="offOptions"/>
+        </element>
+      </optional>
+      <optional>
+        <element name="on_crash">
+          <ref name="offOptions"/>
+        </element>
+      </optional>
+    </interleave>
+  </define>
+  <!--
+      Options when a domain terminates:
+      destroy: The domain is cleaned up
+      restart: A new domain is started in place of the old one
+      preserve: The domain will remain in memory until it is destroyed manually
+      rename-restart: a variant of the previous one but where the old domain is
+                      renamed before being saved to allow a restart
+    -->
+  <define name="offOptions">
+    <choice>
+      <value>destroy</value>
+      <value>restart</value>
+      <value>preserve</value>
+      <value>rename-restart</value>
+    </choice>
+  </define>
+  <!--
+      Specific setup for a qemu emulated character device.  Note: this
+      definition doesn't fully specify the constraints on this node.
+    -->
+  <define name="qemucdev">
+    <attribute name="type">
+      <choice>
+        <value>dev</value>
+        <value>file</value>
+        <value>pipe</value>
+        <value>unix</value>
+        <value>tcp</value>
+        <value>udp</value>
+        <value>null</value>
+        <value>stdio</value>
+        <value>vc</value>
+        <value>pty</value>
+      </choice>
+    </attribute>
+    <interleave>
+      <optional>
+        <oneOrMore>
+          <element name="source">
+            <optional>
+              <attribute name="mode"/>
+            </optional>
+            <optional>
+              <attribute name="path"/>
+            </optional>
+            <optional>
+              <attribute name="host"/>
+            </optional>
+            <optional>
+              <attribute name="service"/>
+            </optional>
+            <optional>
+              <attribute name="wiremode"/>
+            </optional>
+          </element>
+        </oneOrMore>
+      </optional>
+      <optional>
+        <element name="protocol">
+          <optional>
+            <attribute name="type"/>
+          </optional>
+        </element>
+      </optional>
+      <optional>
+        <element name="target">
+          <optional>
+            <attribute name="port"/>
+          </optional>
+        </element>
+      </optional>
+    </interleave>
+  </define>
+  <!--
+      The description for a console
+      just a tty device
+    -->
+  <define name="console">
+    <element name="console">
+      <choice>
+        <group>
+          <optional>
+            <attribute name="tty">
+              <ref name="devicePath"/>
+            </attribute>
+          </optional>
+          <empty/>
+        </group>
+        <ref name="qemucdev"/>
+      </choice>
+    </element>
+  </define>
+  <define name="sound">
+    <element name="sound">
+      <attribute name="model">
+        <choice>
+          <value>sb16</value>
+          <value>es1370</value>
+          <value>pcspk</value>
+          <value>ac97</value>
+        </choice>
+      </attribute>
+    </element>
+  </define>
+  <define name="parallel">
+    <element name="parallel">
+      <ref name="qemucdev"/>
+    </element>
+  </define>
+  <define name="serial">
+    <element name="serial">
+      <ref name="qemucdev"/>
+    </element>
+  </define>
+  <define name="input">
+    <element name="input">
+      <attribute name="type">
+        <choice>
+          <value>tablet</value>
+          <value>mouse</value>
+        </choice>
+      </attribute>
+      <optional>
+        <attribute name="bus">
+          <choice>
+            <value>ps2</value>
+            <value>usb</value>
+            <value>xen</value>
+          </choice>
+        </attribute>
+      </optional>
+    </element>
+  </define>
+  <define name="hostdev">
+    <element name="hostdev">
+      <optional>
+        <attribute name="mode">
+          <choice>
+            <value>subsystem</value>
+            <value>capabilities</value>
+          </choice>
+        </attribute>
+        <attribute name="type">
+          <choice>
+            <value>usb</value>
+            <value>pci</value>
+          </choice>
+        </attribute>
+        <attribute name="managed">
+          <choice>
+            <value>yes</value>
+            <value>no</value>
+          </choice>
+        </attribute>
+      </optional>
+      <group>
+        <element name="source">
+          <choice>
+            <ref name="usbproduct"/>
+            <ref name="usbaddress"/>
+            <ref name="pciaddress"/>
+          </choice>
+        </element>
+      </group>
+    </element>
+  </define>
+  <define name="usbproduct">
+    <element name="vendor">
+      <attribute name="id">
+        <ref name="usbId"/>
+      </attribute>
+    </element>
+    <element name="product">
+      <attribute name="id">
+        <ref name="usbId"/>
+      </attribute>
+    </element>
+  </define>
+  <define name="usbaddress">
+    <element name="address">
+      <attribute name="bus">
+        <ref name="usbAddr"/>
+      </attribute>
+      <attribute name="device">
+        <ref name="usbAddr"/>
+      </attribute>
+    </element>
+  </define>
+  <define name="pciaddress">
+    <element name="address">
+      <optional>
+        <attribute name="domain">
+          <ref name="pciDomain"/>
+        </attribute>
+      </optional>
+      <attribute name="bus">
+        <ref name="pciBus"/>
+      </attribute>
+      <attribute name="slot">
+        <ref name="pciSlot"/>
+      </attribute>
+      <attribute name="function">
+        <ref name="pciFunc"/>
+      </attribute>
+    </element>
+  </define>
+  <!--
+      Devices attached to a domain.
+    -->
+  <define name="devices">
+    <element name="devices">
+      <interleave>
+        <optional>
+          <ref name="emulator"/>
+        </optional>
+        <zeroOrMore>
+          <choice>
+            <ref name="disk"/>
+            <ref name="filesystem"/>
+            <ref name="interface"/>
+            <ref name="input"/>
+            <ref name="sound"/>
+            <ref name="hostdev"/>
+            <ref name="graphic"/>
+            <ref name="video"/>
+            <ref name="console"/>
+            <ref name="parallel"/>
+            <ref name="serial"/>
+          </choice>
+        </zeroOrMore>
+      </interleave>
+    </element>
+  </define>
+  <!--
+      A set of optional features: PAE, APIC and ACPI support
+    -->
+  <define name="features">
+    <optional>
+      <element name="features">
+        <interleave>
+          <optional>
+            <element name="pae">
+              <empty/>
+            </element>
+          </optional>
+          <optional>
+            <element name="apic">
+              <empty/>
+            </element>
+          </optional>
+          <optional>
+            <element name="acpi">
+              <empty/>
+            </element>
+          </optional>
+        </interleave>
+      </element>
+    </optional>
+  </define>
+  <!--
+       Type library
+
+       Our unsignedInt doesn't allow a leading '+' in its lexical form
+       A domain name shoul be made of ascii, numbers, _-+ and is non-empty
+       UUID currently allows only the 32 characters strict syntax
+       memoryKB request at least 4Mbytes though Xen will grow bigger if too low
+    -->
+  <define name="unsignedInt">
+    <data type="unsignedInt">
+      <param name="pattern">[0-9]+</param>
+    </data>
+  </define>
+  <define name="countCPU">
+    <data type="unsignedShort">
+      <param name="pattern">[0-9]+</param>
+      <param name="minInclusive">1</param>
+    </data>
+  </define>
+  <define name="PortNumber">
+    <data type="short">
+      <param name="minInclusive">-1</param>
+    </data>
+  </define>
+  <define name="memoryKB">
+    <data type="unsignedInt">
+      <param name="pattern">[0-9]+</param>
+      <param name="minInclusive">4000</param>
+    </data>
+  </define>
+  <define name="domainName">
+    <data type="string">
+      <param name="pattern">[A-Za-z0-9_\.\+\-&amp;:/]+</param>
+    </data>
+  </define>
+  <define name="diskSerial">
+    <data type="string">
+      <param name="pattern">[A-Za-z0-9_\.\+\-]+</param>
+    </data>
+  </define>
+  <define name="genericName">
+    <data type="string">
+      <param name="pattern">[a-zA-Z0-9_\+\-]+</param>
+    </data>
+  </define>
+  <define name="UUID">
+    <choice>
+      <data type="string">
+        <param name="pattern">[a-fA-F0-9]{32}</param>
+      </data>
+      <data type="string">
+        <param name="pattern">[a-fA-F0-9]{8}\-([a-fA-F0-9]{4}\-){3}[a-fA-F0-9]{12}</param>
+      </data>
+    </choice>
+  </define>
+  <define name="filePath">
+    <data type="string">
+      <param name="pattern">[a-zA-Z0-9_\.\+\-&amp;/%]+</param>
+    </data>
+  </define>
+  <define name="absFilePath">
+    <data type="string">
+      <param name="pattern">/[a-zA-Z0-9_\.\+\-&amp;/%]+</param>
+    </data>
+  </define>
+  <define name="absDirPath">
+    <data type="string">
+      <param name="pattern">/[a-zA-Z0-9_\.\+\-&amp;/%]*</param>
+    </data>
+  </define>
+  <define name="devicePath">
+    <data type="string">
+      <param name="pattern">/[a-zA-Z0-9_\+\-/%]+</param>
+    </data>
+  </define>
+  <define name="deviceName">
+    <data type="string">
+      <param name="pattern">[a-zA-Z0-9_\.\-:/]+</param>
+    </data>
+  </define>
+  <define name="addrMAC">
+    <data type="string">
+      <param name="pattern">([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}</param>
+    </data>
+  </define>
+  <define name="addrIP">
+    <data type="string">
+      <param name="pattern">([0-2]?[0-9]?[0-9]\.){3}[0-2]?[0-9]?[0-9]</param>
+    </data>
+  </define>
+  <define name="usbId">
+    <data type="string">
+      <param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
+    </data>
+  </define>
+  <define name="usbAddr">
+    <data type="string">
+      <param name="pattern">(0x)?[0-9a-fA-F]{1,3}</param>
+    </data>
+  </define>
+  <define name="pciDomain">
+    <data type="string">
+      <param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
+    </data>
+  </define>
+  <define name="pciBus">
+    <data type="string">
+      <param name="pattern">(0x)?[0-9a-fA-F]{1,2}</param>
+    </data>
+  </define>
+  <define name="pciSlot">
+    <data type="string">
+      <param name="pattern">(0x)?[0-1]?[0-9a-fA-F]</param>
+    </data>
+  </define>
+  <define name="pciFunc">
+    <data type="string">
+      <param name="pattern">(0x)?[0-7]</param>
+    </data>
+  </define>
+</grammar>
diff --git a/test/relaxng/libvirt_0.xml b/test/relaxng/libvirt_0.xml
new file mode 100644
index 0000000..c17d9d5
--- /dev/null
+++ b/test/relaxng/libvirt_0.xml
@@ -0,0 +1,23 @@
+<domain type='xen' id='6'>
+  <name>pvtest</name>
+  <uuid>596a5d2171f48fb2e068e2386a5c413e</uuid>
+  <os>
+    <type>linux</type>
+    <kernel>/var/lib/xen/vmlinuz.2Dn2YT</kernel>
+    <initrd>/var/lib/xen/initrd.img.0u-Vhq</initrd>
+    <cmdline> method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os  </cmdline>
+  </os>
+  <memory>430080</memory>
+  <vcpu>2</vcpu>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>destroy</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <disk type='file' device='disk'>
+      <driver name='file'/>
+      <source file='/root/some.img'/>
+      <target dev='xvda'/>
+    </disk>
+    <graphics type='vnc' port='-1' autoport='yes' listen="127.0.0.1" passwd="123456" keymap="ja"/>
+  </devices>
+</domain>
diff --git a/xmlregexp.c b/xmlregexp.c
index a10bf6b..2a501ad 100644
--- a/xmlregexp.c
+++ b/xmlregexp.c
@@ -2095,12 +2095,13 @@ xmlFACompareRanges(xmlRegRangePtr range1, xmlRegRangePtr range2) {
                (range2->type == XML_REGEXP_EPSILON)) {
 	return(0);
     } else if (range1->type == range2->type) {
-        if ((range1->type != XML_REGEXP_CHARVAL) ||
-	    (range1->end < range2->start) ||
-	    (range2->end < range1->start))
-	    ret = 1;
-	else
+        if (range1->type != XML_REGEXP_CHARVAL)
+            ret = 1;
+        else if ((range1->end < range2->start) ||
+	         (range2->end < range1->start))
 	    ret = 0;
+	else
+	    ret = 1;
     } else if (range1->type == XML_REGEXP_CHARVAL) {
         int codepoint;
 	int neg = 0;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]