diff -pruN 1.7.1-2/Changelog 3.0.2-1/Changelog --- 1.7.1-2/Changelog 2015-03-25 12:55:54.000000000 +0000 +++ 3.0.2-1/Changelog 2016-06-17 19:16:18.000000000 +0000 @@ -1,4 +1,7 @@ -# $Id: Changelog 1818 2015-03-25 12:55:54Z rpgoldman $ +# $Id: Changelog 2269 2016-06-17 19:16:18Z mboldt $ + +1.8 + * Added optional error suppression when items aren't found. 1.7.1 * Fixed a bug that caused breakage on Lispworks. diff -pruN 1.7.1-2/clnet-page.shtml 3.0.2-1/clnet-page.shtml --- 1.7.1-2/clnet-page.shtml 2015-03-26 14:48:36.000000000 +0000 +++ 3.0.2-1/clnet-page.shtml 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ - - - - - -xmls - a small xml parser for common lisp - - - - - -

XMLS, a simple XML parser for Common Lisp

-

Downloads

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
latest --> Bugfixes, support for XML prolog.xmls-1.7.1sourcesignaturemd5changelog
 xmls-1.5sourcesignaturemd5
 xmls-1.4sourcesignaturemd5
 xmls-1.3sourcesignaturemd5
 xmls-1.2sourcesignaturemd5
 xmls-1.1sourcesignaturemd5
 xmls-1.0sourcesignaturemd5
- -

Source repository

- -

There is no publicly-accessible source repository for XMLS. Please submit -patches to the maintainer. The likelihood of getting patches doesn't justify -the effort of maintaining such a source repository. If this is a real problem -for you, please contact the maintainer and we will arrange to provide you access to -the private repository.

- - - - - - - \ No newline at end of file diff -pruN 1.7.1-2/debian/changelog 3.0.2-1/debian/changelog --- 1.7.1-2/debian/changelog 2018-04-11 10:39:47.000000000 +0000 +++ 3.0.2-1/debian/changelog 2019-02-09 15:42:07.000000000 +0000 @@ -1,3 +1,22 @@ +cl-xmls (3.0.2-1) unstable; urgency=medium + + * Team upload + * New upstream release + * Bump to debhelper compat level 12 + * Rewrite d/rules using dh + * Rewrite d/copyright in machine-readable format 1.0 + * Expand long description + * Remove upstream GPG key, the signature is not in detached format + * Add Rules-Requires-Root: no + * Add M-A: foreign + * Bump to S-V 4.3.0 + * Add Depends on cl-flexi-streams and cl-ppcre, needed by xmls/octets + system + * Add Recommends on cl-fiveam, needed for the testsuite + * Add autopkgtests that runs testsuite in sbcl, ecl and clisp + + -- Sébastien Villemot Sat, 09 Feb 2019 16:42:07 +0100 + cl-xmls (1.7.1-2) unstable; urgency=medium * Team upload. diff -pruN 1.7.1-2/debian/compat 3.0.2-1/debian/compat --- 1.7.1-2/debian/compat 2018-04-11 10:34:44.000000000 +0000 +++ 3.0.2-1/debian/compat 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -7 diff -pruN 1.7.1-2/debian/control 3.0.2-1/debian/control --- 1.7.1-2/debian/control 2018-04-11 10:38:00.000000000 +0000 +++ 3.0.2-1/debian/control 2019-02-09 15:17:18.000000000 +0000 @@ -3,15 +3,22 @@ Section: lisp Priority: optional Maintainer: Debian Common Lisp Team Uploaders: Peter Van Eynde , Christoph Egger -Build-Depends: debhelper (>> 7) +Build-Depends: debhelper-compat (= 12) Vcs-Git: https://salsa.debian.org/common-lisp-team/cl-xmls.git Vcs-Browser: https://salsa.debian.org/common-lisp-team/cl-xmls Homepage: https://common-lisp.net/project/xmls/ -Standards-Version: 3.9.6 +Standards-Version: 4.3.0 +Rules-Requires-Root: no Package: cl-xmls Architecture: all -Depends: ${misc:Depends} +Multi-Arch: foreign +Depends: ${misc:Depends}, + cl-flexi-streams, + cl-ppcre +Recommends: cl-fiveam Description: XML Simple Parser for Common Lisp - XMLS provides a simple parser of XML that covers a very useful subset - of XML. + XMLS is a small, simple, non-validating XML parser for Common Lisp. It's + designed to be a self-contained, easily embedded parser that recognizes a + useful subset of the XML spec. It provides a simple mapping from XML to Lisp + structures or S-expressions and back. diff -pruN 1.7.1-2/debian/copyright 3.0.2-1/debian/copyright --- 1.7.1-2/debian/copyright 2018-04-11 10:38:13.000000000 +0000 +++ 3.0.2-1/debian/copyright 2019-02-09 15:12:53.000000000 +0000 @@ -1,41 +1,43 @@ -Debian Copyright Section -======================== - -Upstream Source URL: https://common-lisp.net/project/xmls/ -Upstream Author: Miles Egan -Initial Debian Maintainer: Kevin M. Rosenberg - - -Upstream Copyright Statement -============================ - -Copyright (c) 2003, Miles Egan -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * The name of the author may not be used to endorse or promote - products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: XMLS +Upstream-Contact: Robert P. Goldman +Source: https://common-lisp.net/project/xmls/ + +Files: * +Copyright: 2003 Miles Egan + 2004-2015 Robert P. Goldman, Mike Boldt, and SIFT, LLC +License: BSD-3-clause + +Files: debian/* +Copyright: 2003-2004 Kevin M. Rosenberg + 2005-2009 Peter Van Eynde + 2010-2015 Christoph Egger + 2018-2019 Sébastien Villemot +License: BSD-3-clause + +License: BSD-3-clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + . + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + . + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + . + * The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + . + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS + IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -pruN 1.7.1-2/debian/docs 3.0.2-1/debian/docs --- 1.7.1-2/debian/docs 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/debian/docs 2019-02-09 15:12:51.000000000 +0000 @@ -0,0 +1 @@ +README.html diff -pruN 1.7.1-2/debian/install 3.0.2-1/debian/install --- 1.7.1-2/debian/install 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/debian/install 2019-02-09 15:27:02.000000000 +0000 @@ -0,0 +1 @@ +*.asd *.lisp version.lisp-expr tests/ octets-tests/ /usr/share/common-lisp/source/xmls diff -pruN 1.7.1-2/debian/lintian-overrides 3.0.2-1/debian/lintian-overrides --- 1.7.1-2/debian/lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/debian/lintian-overrides 2019-02-09 15:23:17.000000000 +0000 @@ -0,0 +1,3 @@ +# These files are for the testsuite and are not meant to be loaded in browsers +cl-xmls: privacy-breach-logo usr/share/common-lisp/source/xmls/tests/* +cl-xmls: privacy-breach-generic usr/share/common-lisp/source/xmls/tests/* diff -pruN 1.7.1-2/debian/rules 3.0.2-1/debian/rules --- 1.7.1-2/debian/rules 2018-04-11 10:37:41.000000000 +0000 +++ 3.0.2-1/debian/rules 2019-02-09 14:51:34.000000000 +0000 @@ -1,54 +1,8 @@ #!/usr/bin/make -f -configure: configure-stamp -configure-stamp: - dh_testdir - # Add here commands to configure the package. - touch configure-stamp +%: + dh $@ +override_dh_auto_build: -build: build-stamp - -build-stamp: configure-stamp - dh_testdir - # Add here commands to compile the package. - touch build-stamp - -clean: - dh_testdir - dh_testroot - rm -f build-stamp configure-stamp - # Add here commands to clean up after the build process. - dh_clean - -install: build - dh_testdir - dh_testroot - dh_prep - # Add here commands to install the package into debian/xmls. - dh_installdirs usr/share/common-lisp/source/xmls - dh_install xmls.asd $(shell echo *.lisp) usr/share/common-lisp/source/xmls - - -# Build architecture-dependent files here. -binary-arch: build install - -# Build architecture-independent files here. -binary-indep: build install - dh_testdir - dh_testroot - dh_installdocs README.html - dh_installexamples - dh_installchangelogs Changelog - dh_strip - dh_compress - dh_fixperms - dh_installdeb - dh_shlibdeps - dh_gencontrol - dh_md5sums - dh_builddeb - -binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install configure - +override_dh_auto_clean: diff -pruN 1.7.1-2/debian/tests/control 3.0.2-1/debian/tests/control --- 1.7.1-2/debian/tests/control 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/debian/tests/control 2019-02-09 15:24:18.000000000 +0000 @@ -0,0 +1,11 @@ +Test-Command: sbcl --script debian/tests/runtests.lisp +Depends: @, sbcl, cl-fiveam +Restrictions: allow-stderr + +Test-Command: ecl -norc -shell debian/tests/runtests.lisp +Depends: @, ecl, cl-fiveam +Restrictions: allow-stderr + +Test-Command: clisp -norc debian/tests/runtests.lisp +Depends: @, clisp, cl-fiveam +Restrictions: allow-stderr diff -pruN 1.7.1-2/debian/tests/runtests.lisp 3.0.2-1/debian/tests/runtests.lisp --- 1.7.1-2/debian/tests/runtests.lisp 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/debian/tests/runtests.lisp 2019-02-09 15:38:21.000000000 +0000 @@ -0,0 +1,21 @@ +(require "asdf") + +(let ((asdf:*user-cache* (uiop:getenv "AUTOPKGTEST_TMP"))) ; Store FASL in some temporary dir + (asdf:load-system "xmls/test") + (asdf:load-system "xmls/unit-test") + (asdf:load-system "xmls/octets")) + +;; Can't use ASDF:TEST-SYSTEM, its return value is meaningless +(let ((results (5am:run 'xmls-test::xmls-test))) + (5am:explain! results) + (unless (5am:results-status results) + (uiop:quit 1))) + +#-ecl +(unless (xmls::test) + (print "Failed XMLS test.") + (uiop:quit 1)) + +(unless (xmls/octets::test) + (print "Test failures in XMLS/octets.") + (uiop:quit 1)) diff -pruN 1.7.1-2/debian/upstream/signing-key.asc 3.0.2-1/debian/upstream/signing-key.asc --- 1.7.1-2/debian/upstream/signing-key.asc 2018-04-11 10:34:44.000000000 +0000 +++ 3.0.2-1/debian/upstream/signing-key.asc 1970-01-01 00:00:00.000000000 +0000 @@ -1,244 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1 - -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 -YNHfg/BcGcuJASIEEAECAAwFAkLRDy0FAwASdQAACgkQlxC4m8pXrXzbZgf/VsZ1 -DO0Na6BaMUMBpt6v2jXIKbYuog5+Z3t6WP0bDB2Ags/MRFqopDjqihCACEzO43Ay -AYm/KmZ6XyCmr1uld8Um3lRlB1v9HvJma2T9enofHstDUZbHevJckOMJfAPZjh74 -khJfGksmZACEyOvk3SJ1f0fHss5PRG8Oos349A8WhSPgiyVdWFDDRhuaD9B4yOeh -6PDcGMh6xyafvmktpUoMpCzb/s8BIWBl8UssAq457uvVVHtHNQJLNxD1E+Et14dw -sh+2qnXCPVrTnFzw67LJmUGmiAHLuYvmEYiHQS9eNlyzr7Oo5+RRe75kgqyX6rVy -wxnaSTzCKwp767pDVIkBIgQQAQIADAUCQtG0tAUDABJ1AAAKCRCXELibyletfDJ7 -B/9M0iiQstbY78mdt67RZ62QSqVjFAwkKhnGdeTxL6AloZmxetWeTESJSWRJV0X1 -EbhRIvL1+SBs0NshSYqgx+GuG6iUyoWAad29KSGKp2XCA1bn1tOn9ddYQJ+UXJPL -r35n+JJSJO5u89XMPH02JCN6qiP8dEpkrirKDdMPFQtfOuyf1n8tYp2MIrJl+4YB -nZ5n3NzYYdOVESDTb7azsJrF+U/HQ1bHOA/LXOx48FArrTTQU/HVEgIGsHHoYYhi -Pj/lHrz4FDY+5dtdPWQvn2GYmVxDis3UeSj5mxUK6bscYRI15pgGuDk6kO3J7jI/ -ztSmvYOJNQ/uWnW3aJUeDCAhtEFSb2JlcnQgUC4gR29sZG1hbiAoQWx0ZXJuYXRl -IGVtYWlsIGFkZHJlc3MuKSA8cnBnb2xkbWFuQHNpZnQubmV0PohGBBARAgAGBQJN -XrIRAAoJEG7CXidwCsrXjmEAoJJbx/DMV10DLZH74wPAA2+/7OvlAJ0WctICQgJ/ -E6R13LWLlHRuVTg8DIhiBBMRAgAiBQJNVDSqAhsjBgsJCAcDAgYVCAIJCgsEFgID -AQIeAQIXgAAKCRCd+Oj7UsUW/AP/AKCg4AZxblDmgFtMUKa6P+cS7ncIQwCfWNKO -vhDa5IPEGQeOTzkulh08bzO0TFJvYmVydCBQLiBHb2xkbWFuIChBbm90aGVyIGFs -dGVybmF0ZSBlbWFpbCBhZGRyZXNzLikgPHJwZ29sZG1hbkBzaWZ0ZWNoLmNvbT6I -RgQQEQIABgUCTV6yEQAKCRBuwl4ncArK13PPAJ9l5PVmG3XMsHOUyHZiCKeHEzwB -lQCdFF9mqlrkTUtRA+a2t7Hk7HPy/8yIYgQTEQIAIgUCTVQ08wIbIwYLCQgHAwIG -FQgCCQoLBBYCAwECHgECF4AACgkQnfjo+1LFFvziXACfZICgO2EmJSLRbZ3Eg8Mk -rNKqeNUAniqwggg9XrIsfXLikTimFiEeE1iauQENBDlIOvwQBADYsTTAIVhT0G7w -HhYCJ4Hxp++SweTLoZqUIxAK6+1dq8jnI0/p3I7zkYi0f6VqoTZG+/lfYrEeCS30 -IsZSPRE3QWAHTKq+TMSmmiu1TLlOjyLg5MTJCqXzbPZ9JjKAA4lBUdkCaq1jcO34 -e+S/Nb9BRhI+WJaC9y4U+qrgXBawFwADBQQAjoCqr4QE8PoJ5dLscxcWIg88qmto -HGl8IgivsOVccquT9HHNj4qMInMYt8l7eDGDY/VRvZS79y9Kp0hwkV2/LThMMC19 -2tCX5pfatEWaodKY46Z0BPmhu6d1QQqg87ACDndv5NrZ/KCoQ5ZWgZb/WM+mDKHS -249Vnt3lLeTsw4GITgQYEQIABgUCOUg6/AASCRCd+Oj7UsUW/AdlR1BHAAEBRaUA -nig/eranyrifZA/XGVdnxIL/WBVPAJ9lRX5o3sjGYbIWrIQaiY5HU/O6wg== -=zNBW ------END PGP PUBLIC KEY BLOCK----- diff -pruN 1.7.1-2/debian/watch 3.0.2-1/debian/watch --- 1.7.1-2/debian/watch 2018-04-11 10:38:40.000000000 +0000 +++ 3.0.2-1/debian/watch 2019-02-09 15:12:54.000000000 +0000 @@ -1,3 +1,2 @@ version=4 -opts="pgpsigurlmangle=s/$/.asc/" \ https://common-lisp.net/project/xmls/ xmls@ANY_VERSION@@ARCHIVE_EXT@ diff -pruN 1.7.1-2/fiveam-tests.lisp 3.0.2-1/fiveam-tests.lisp --- 1.7.1-2/fiveam-tests.lisp 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/fiveam-tests.lisp 2017-11-22 17:32:06.000000000 +0000 @@ -0,0 +1,50 @@ +(in-package :common-lisp-user) +(defpackage xmls-test + (:use :common-lisp :fiveam :xmls) + ) + +(in-package :xmls-test) + +(def-suite xmls-test) + +(in-suite xmls-test) + +(test check-cdata-backtrack + (is (equalp (make-node :name "name" :children (list "x]")) + (parse "")))) + +(test bigger-check-cdata-backtrack + (is (equalp (make-node :name "description" + :children + (list + "Link to Catalog In this sequel to 2010's surprise hit, Greg Heffley, the kid who made \"wimpy\" cool is back in an all-new family comedy based on the best-selling follow-up novel by Jeff Kinney. (Kinney's Wimpy Kid\" series has thus far sold 42 million books.) As he begins seventh grade, Greg and his older brother [...]")) + (parse "")))) + +(test simple-nodelist-translator + (is (equalp (nodelist->node (list "description" nil + "Link to Catalog In this sequel to 2010's surprise hit, Greg Heffley, the kid who made \"wimpy\" cool is back in an all-new family comedy based on the best-selling follow-up novel by Jeff Kinney. (Kinney's Wimpy Kid\" series has thus far sold 42 million books.) As he begins seventh grade, Greg and his older brother [...]")) + (parse "")))) + +(def-fixture parsed-greeting () + (let ((node + (with-open-file (str (asdf:system-relative-pathname "xmls" "tests/beep/greeting1.xml") + :direction :input) + (parse str)))) + (&body))) + +(test check-accessors + (with-fixture parsed-greeting () + (is (equal "greeting" (node-name node))) + (is (= 3 (length (node-children node)))) + (is (null (node-attrs node))) + (is (equal (list "profile" "profile" "profile") + (mapcar #'node-name (node-children node)))))) + +(test check-xmlrep-accessors + (with-fixture parsed-greeting () + (is (equal "greeting" (xmlrep-tag node))) + (is (= 3 (length (xmlrep-children node)))) + (is (null (xmlrep-attribs node))) + (is (equal (list "profile" "profile" "profile") + (mapcar #'xmlrep-tag (xmlrep-children node)))))) + diff -pruN 1.7.1-2/Makefile 3.0.2-1/Makefile --- 1.7.1-2/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/Makefile 2017-12-14 19:04:16.000000000 +0000 @@ -0,0 +1,47 @@ +system := xmls +webhome_dir := /project/${system}/public_html/ +webhome_private := common-lisp.net:${webhome_dir} +webhome_public := "http://common-lisp.net/project/${system}/" +sourceDirectory := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) +webfiles := web-page/clnet-page.shtml web-page/styles.css README.html +ifeq (${user},) +userat := +else +userat := ${user}@ +endif +website:=${userat}common-lisp.net:/project/${system}/public_html/ +version := $(shell cat "version.lisp-expr") +XMLSDIR := "${system}-$(version)" +TARBALL := "build/${XMLSDIR}.tar.gz" + + + +.PHONY: archive publish-archive website publish-latest + +archive: ; + mkdir -p build + svn export . build/$(XMLSDIR) + tar zcf ${TARBALL} -C build $(XMLSDIR) + gpg -o ${TARBALL}.asc --sign ${TARBALL} + md5sum --binary ${TARBALL} > ${TARBALL}.md5 + +# must be done after archive +publish-archive: + $(eval GPGSIG := ${TARBALL}.asc) + $(eval MD5SUM := ${TARBALL}.md5) + rsync --times --chmod=a+rX,ug+w ${TARBALL} ${GPGSIG} ${MD5SUM} ${website} + +# must be done after archive +publish-latest: + rsync --times --recursive --chmod=a+rX,ug+w build/${XMLSDIR} ${website} + ssh common-lisp.net "cd ${webhome_dir}; ln -sf ${XMLSDIR} latest;" + +website: ; + rsync -lt --no-g ${webfiles} ${website} + ssh common-lisp.net "cd ${webhome_dir}; cp clnet-page.shtml index.shtml;" + +publish: archive publish-archive publish-latest website + +clean: + rm -r build + diff -pruN 1.7.1-2/nst-tests.lisp 3.0.2-1/nst-tests.lisp --- 1.7.1-2/nst-tests.lisp 2011-02-23 21:12:06.000000000 +0000 +++ 3.0.2-1/nst-tests.lisp 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -(defpackage xmls-nst - (:nicknames xmls-test) - (:use :common-lisp :nst :xmls) - ) - -(in-package :xmls-nst) - -(def-test-group xmls-test () - (def-test check-cdata-backtrack (:equalp (list "name" nil "x]")) - (parse "")) - (def-test bigger-check-cdata-backtrack (:equalp (list "description" NIL - "Link to Catalog In this sequel to 2010's surprise hit, Greg Heffley, the kid who made \"wimpy\" cool is back in an all-new family comedy based on the best-selling follow-up novel by Jeff Kinney. (Kinney's Wimpy Kid\" series has thus far sold 42 million books.) As he begins seventh grade, Greg and his older brother [...]")) - (parse "")) - ) \ No newline at end of file diff -pruN 1.7.1-2/octets-tests/flux/flux-test-iso-8859-1.xml 3.0.2-1/octets-tests/flux/flux-test-iso-8859-1.xml --- 1.7.1-2/octets-tests/flux/flux-test-iso-8859-1.xml 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/octets-tests/flux/flux-test-iso-8859-1.xml 2017-11-22 03:23:18.000000000 +0000 @@ -0,0 +1,23 @@ + + + +Les derniers documents du CERTA. +http://www.certa.ssi.gouv.fr +CERTA (Centre d'Expertise gouvernemental de Reponse et de Traitement des Attaques informatiques). +fr + +CERTA-2011-AVI-110 : Vulnrabilit dans IBM WepSphere Portal (24 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-110/CERTA-2011-AVI-110.htmlUne vulnrabilit a t corrige dans IBM WebSphere Portal et permet un utilisateur malintentionn de porter atteinte la confidentialit des donnes. +CERTA-2011-AVI-109 : Multiples vulnrabilits dans Cisco ASA srie 5500 (24 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-109/CERTA-2011-AVI-109.htmlQuatre vulnrabilits ont t corriges dans les appareils Cisco ASA srie 5500. Trois d'entre elles permettent de raliser un dni de service distance, et la quatrime permet d'accder des donnes confidentielles sur le systme de fichiers. +CERTA-2011-AVI-108 : Vulnrabilit dans Microsoft Malware Protection Engine (24 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-108/CERTA-2011-AVI-108.htmlUne vulnrabilit dans Microsoft Malware Protection Engine permet une personne malintentionne d'lever ses privilges. +CERTA-2011-AVI-107 : Vulnrabilit dans Novell Netware (24 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-107/CERTA-2011-AVI-107.htmlUne vulnrabilit dans Novell Netware permet une personne distante malintentionne d'excuter du code arbitraire. +CERTA-2011-AVI-106 : Vulnrabilit dans CA HIPS (24 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-106/CERTA-2011-AVI-106.htmlUne vulnrabilit dans CA HIPS permet l'excution de code arbitraire distance. +CERTA-2011-AVI-105 : Multiples vulnrabilits dans les logiciels Cisco TelePresence (24 fvrier +2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-105/CERTA-2011-AVI-105.htmlDe multiples vulnrabilits touchent la ligne de produits Cisco TelePresence, elles permettent notamment d'excuter du code arbitraire ou de provoquer un dni de service distance. +CERTA-2011-AVI-104 : Vulnrabilit dans Cisco Firewall Services Module (24 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-104/CERTA-2011-AVI-104.htmlUne vulnrabilit permettant d'effectuer un dni de service distance a t identifie dans le produit Cisco Firewall Services Module (FWSM). +CERTA-2011-AVI-079 : Vulnrabilit dans plusieurs implmentations de Java (24 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-079/CERTA-2011-AVI-079.htmlUne vulnrabilit affecte plusieurs implmentations de Java, elle permet un dni de service distance. +CERTA-2011-AVI-103 : Vulnrabilit dans ISC Bind (23 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-103/CERTA-2011-AVI-103.htmlUne vulnrabilit dans le serveur DNS ISC Bind permet un utilisateur malintentionn de provoquer un dni de service distance. +CERTA-2011-AVI-102 : Vulnrabilits dans RedHat Directory Server (23 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-102/CERTA-2011-AVI-102.htmlPlusieurs vulnrabilits dans l'annuaire RedHat Directory Server permettent un utilisateur malveillant de provoquer un dni de service distance ou d'lever ses privilges. +CERTA-2011-AVI-101 : Multiples vulnrabilits dans Ruby (22 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-101/CERTA-2011-AVI-101.htmlDeux vulnrabilits dans Ruby ont t corriges. La premire permet de contourner la politique de scurit et la seconde de porter atteinte l'intgrit des donnes. +CERTA-2011-AVI-100 : Vulnrabilits dans Mailman (22 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-100/CERTA-2011-AVI-100.htmlDeux vulnrabilits prsentes dans Mailman permettent un utilisateur distant de conduire des attaques de type injection de code indirecte. + + diff -pruN 1.7.1-2/octets-tests/flux/flux-test.sexp 3.0.2-1/octets-tests/flux/flux-test.sexp --- 1.7.1-2/octets-tests/flux/flux-test.sexp 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/octets-tests/flux/flux-test.sexp 2017-11-22 22:54:12.000000000 +0000 @@ -0,0 +1,2 @@ +("rss" (("version" "2.0")) ("channel" nil ("title" nil "Les derniers documents du CERTA.") ("link" nil "http://www.certa.ssi.gouv.fr") ("description" nil "CERTA (Centre d'Expertise gouvernemental de Reponse et de Traitement des Attaques informatiques).") ("language" nil "fr") ("item" nil ("title" nil "CERTA-2011-AVI-110 : Vulnérabilité dans IBM WepSphere Portal (24 février 2011)") ("link" nil "http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-110/CERTA-2011-AVI-110.html") ("description" nil "Une vulnérabilité a été corrigée dans IBM WebSphere Portal et permet à un utilisateur malintentionné de porter atteinte à la confidentialité des données.")) ("item" nil ("title" nil "CERTA-2011-AVI-109 : Multiples vulnérabilités dans Cisco ASA série 5500 (24 février 2011)") ("link" nil "http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-109/CERTA-2011-AVI-109.html") ("description" nil "Quatre vulnérabilités ont été corrigées dans les appareils Cisco ASA série 5500. Trois d'entre elles permettent de réaliser un déni de service à distance, et la quatrième permet d'accéder à des données confidentielles sur le système de fichiers.")) ("item" nil ("title" nil "CERTA-2011-AVI-108 : Vulnérabilité dans Microsoft Malware Protection Engine (24 février 2011)") ("link" nil "http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-108/CERTA-2011-AVI-108.html") ("description" nil "Une vulnérabilité dans Microsoft Malware Protection Engine permet à une personne malintentionnée d'élever ses privilèges.")) ("item" nil ("title" nil "CERTA-2011-AVI-107 : Vulnérabilité dans Novell Netware (24 février 2011)") ("link" nil "http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-107/CERTA-2011-AVI-107.html") ("description" nil "Une vulnérabilité dans Novell Netware permet à une personne distante malintentionnée d'exécuter du code arbitraire.")) ("item" nil ("title" nil "CERTA-2011-AVI-106 : Vulnérabilité dans CA HIPS (24 février 2011)") ("link" nil "http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-106/CERTA-2011-AVI-106.html") ("description" nil "Une vulnérabilité dans CA HIPS permet l'exécution de code arbitraire à distance.")) ("item" nil ("title" nil "CERTA-2011-AVI-105 : Multiples vulnérabilités dans les logiciels Cisco TelePresence (24 février +2011)") ("link" nil "http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-105/CERTA-2011-AVI-105.html") ("description" nil "De multiples vulnérabilités touchent la ligne de produits Cisco TelePresence, elles permettent notamment d'exécuter du code arbitraire ou de provoquer un déni de service à distance.")) ("item" nil ("title" nil "CERTA-2011-AVI-104 : Vulnérabilité dans Cisco Firewall Services Module (24 février 2011)") ("link" nil "http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-104/CERTA-2011-AVI-104.html") ("description" nil "Une vulnérabilité permettant d'effectuer un déni de service à distance a été identifiée dans le produit Cisco Firewall Services Module (FWSM).")) ("item" nil ("title" nil "CERTA-2011-AVI-079 : Vulnérabilité dans plusieurs implémentations de Java (24 février 2011)") ("link" nil "http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-079/CERTA-2011-AVI-079.html") ("description" nil "Une vulnérabilité affecte plusieurs implémentations de Java, elle permet un déni de service à distance.")) ("item" nil ("title" nil "CERTA-2011-AVI-103 : Vulnérabilité dans ISC Bind (23 février 2011)") ("link" nil "http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-103/CERTA-2011-AVI-103.html") ("description" nil "Une vulnérabilité dans le serveur DNS ISC Bind permet à un utilisateur malintentionné de provoquer un déni de service à distance.")) ("item" nil ("title" nil "CERTA-2011-AVI-102 : Vulnérabilités dans RedHat Directory Server (23 février 2011)") ("link" nil "http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-102/CERTA-2011-AVI-102.html") ("description" nil "Plusieurs vulnérabilités dans l'annuaire RedHat Directory Server permettent à un utilisateur malveillant de provoquer un déni de service à distance ou d'élever ses privilèges.")) ("item" nil ("title" nil "CERTA-2011-AVI-101 : Multiples vulnérabilités dans Ruby (22 février 2011)") ("link" nil "http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-101/CERTA-2011-AVI-101.html") ("description" nil "Deux vulnérabilités dans Ruby ont été corrigées. La première permet de contourner la politique de sécurité et la seconde de porter atteinte à l'intégrité des données.")) ("item" nil ("title" nil "CERTA-2011-AVI-100 : Vulnérabilités dans Mailman (22 février 2011)") ("link" nil "http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-100/CERTA-2011-AVI-100.html") ("description" nil "Deux vulnérabilités présentes dans Mailman permettent à un utilisateur distant de conduire des attaques de type injection de code indirecte.")))) \ No newline at end of file Binary files 1.7.1-2/octets-tests/flux/flux-test-utf-16be.xml and 3.0.2-1/octets-tests/flux/flux-test-utf-16be.xml differ Binary files 1.7.1-2/octets-tests/flux/flux-test-utf-16le.xml and 3.0.2-1/octets-tests/flux/flux-test-utf-16le.xml differ diff -pruN 1.7.1-2/octets-tests/flux/flux-test-utf-8.xml 3.0.2-1/octets-tests/flux/flux-test-utf-8.xml --- 1.7.1-2/octets-tests/flux/flux-test-utf-8.xml 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/octets-tests/flux/flux-test-utf-8.xml 2017-11-22 03:23:18.000000000 +0000 @@ -0,0 +1,22 @@ + + +Les derniers documents du CERTA. +http://www.certa.ssi.gouv.fr +CERTA (Centre d'Expertise gouvernemental de Reponse et de Traitement des Attaques informatiques). +fr + +CERTA-2011-AVI-110 : Vulnérabilité dans IBM WepSphere Portal (24 février 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-110/CERTA-2011-AVI-110.htmlUne vulnérabilité a été corrigée dans IBM WebSphere Portal et permet à un utilisateur malintentionné de porter atteinte à la confidentialité des données. +CERTA-2011-AVI-109 : Multiples vulnérabilités dans Cisco ASA série 5500 (24 février 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-109/CERTA-2011-AVI-109.htmlQuatre vulnérabilités ont été corrigées dans les appareils Cisco ASA série 5500. Trois d'entre elles permettent de réaliser un déni de service à distance, et la quatrième permet d'accéder à des données confidentielles sur le système de fichiers. +CERTA-2011-AVI-108 : Vulnérabilité dans Microsoft Malware Protection Engine (24 février 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-108/CERTA-2011-AVI-108.htmlUne vulnérabilité dans Microsoft Malware Protection Engine permet à une personne malintentionnée d'élever ses privilèges. +CERTA-2011-AVI-107 : Vulnérabilité dans Novell Netware (24 février 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-107/CERTA-2011-AVI-107.htmlUne vulnérabilité dans Novell Netware permet à une personne distante malintentionnée d'exécuter du code arbitraire. +CERTA-2011-AVI-106 : Vulnérabilité dans CA HIPS (24 février 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-106/CERTA-2011-AVI-106.htmlUne vulnérabilité dans CA HIPS permet l'exécution de code arbitraire à distance. +CERTA-2011-AVI-105 : Multiples vulnérabilités dans les logiciels Cisco TelePresence (24 février +2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-105/CERTA-2011-AVI-105.htmlDe multiples vulnérabilités touchent la ligne de produits Cisco TelePresence, elles permettent notamment d'exécuter du code arbitraire ou de provoquer un déni de service à distance. +CERTA-2011-AVI-104 : Vulnérabilité dans Cisco Firewall Services Module (24 février 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-104/CERTA-2011-AVI-104.htmlUne vulnérabilité permettant d'effectuer un déni de service à distance a été identifiée dans le produit Cisco Firewall Services Module (FWSM). +CERTA-2011-AVI-079 : Vulnérabilité dans plusieurs implémentations de Java (24 février 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-079/CERTA-2011-AVI-079.htmlUne vulnérabilité affecte plusieurs implémentations de Java, elle permet un déni de service à distance. +CERTA-2011-AVI-103 : Vulnérabilité dans ISC Bind (23 février 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-103/CERTA-2011-AVI-103.htmlUne vulnérabilité dans le serveur DNS ISC Bind permet à un utilisateur malintentionné de provoquer un déni de service à distance. +CERTA-2011-AVI-102 : Vulnérabilités dans RedHat Directory Server (23 février 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-102/CERTA-2011-AVI-102.htmlPlusieurs vulnérabilités dans l'annuaire RedHat Directory Server permettent à un utilisateur malveillant de provoquer un déni de service à distance ou d'élever ses privilèges. +CERTA-2011-AVI-101 : Multiples vulnérabilités dans Ruby (22 février 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-101/CERTA-2011-AVI-101.htmlDeux vulnérabilités dans Ruby ont été corrigées. La première permet de contourner la politique de sécurité et la seconde de porter atteinte à l'intégrité des données. +CERTA-2011-AVI-100 : Vulnérabilités dans Mailman (22 février 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-100/CERTA-2011-AVI-100.htmlDeux vulnérabilités présentes dans Mailman permettent à un utilisateur distant de conduire des attaques de type injection de code indirecte. + + diff -pruN 1.7.1-2/octets-xml.lisp 3.0.2-1/octets-xml.lisp --- 1.7.1-2/octets-xml.lisp 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/octets-xml.lisp 2017-12-13 00:24:23.000000000 +0000 @@ -0,0 +1,93 @@ +;;;; Octet stream support for XMLS with automatic encoding detection. +;;;; +;;;; FIXME: Could/should use parser rules native to XMLS to parse the XML +;;;; declaration. + +(defpackage xmls/octets + (:use :cl + :flexi-streams + :cl-ppcre) + (:export :make-xml-stream)) + +(in-package :xmls/octets) + +;;; XML defines heuristics to determine the encoding of a document represented +;;; by an octet stream: https://www.w3.org/TR/xml/#charencoding + +(defparameter *pi-start* (string-to-octets "" :external-format :ascii)) +(defparameter *xml* (string-to-octets "xml" :external-format :ascii)) + +(defparameter *max-decl-size* 2000 ; extra gracious margin + "XML declarations exceeding *MAX-DECL-SIZE* bytes are ignored.") +(defvar *encoding-scanner*) + +(eval-when (:load-toplevel :execute) + (let ((s "[\\s\\r]*") ; (#x20 | #x9 | #xD | #xA)+? + (enc-name "[A-Za-z0-9\\._-]+")) ; [A-Za-z] ([A-Za-z0-9._] | '-')* + (setf *encoding-scanner* + ;; S 'encoding' Eq ('"' EncName '"' | "'" EncName "'") + (create-scanner (format nil "encoding~a=~a(\"(~a)\"|'(~a)')" + s s enc-name enc-name))))) + +(defun xml-encoding-decl (string) + (register-groups-bind (() a b) (*encoding-scanner* string) + (external-format-name (make-external-format (or a b))))) + +(defun xml-encoding (in) + (let ((buffer (make-array *max-decl-size* :element-type '(unsigned-byte 8))) + (pos 0)) + (labels ((fill-buffer (n) + (setf pos (read-sequence buffer in :start pos :end (+ pos n)))) + (buffer-to-ascii () + (octets-to-string buffer :end pos :external-format :ascii)) + (return-encoding (&optional (encoding :utf-8) + (read (buffer-to-ascii))) + (return-from xml-encoding (values encoding read)))) + (fill-buffer 2) + (when (search #(#xFE #xFF) buffer :end2 pos) + (return-encoding :utf-16be "")) + (when (search #(#xFF #xFE) buffer :end2 pos) + (return-encoding :utf-16le "")) + (unless (search *pi-start* buffer :end2 pos) + (return-encoding)) + (fill-buffer 3) + (unless (search *xml* buffer :start2 2 :end2 pos) + (return-encoding)) + (loop when (= pos (fill-buffer 1)) do (return-encoding) + until (search *pi-end* buffer :start2 (- pos 2) :end2 pos)) + (let ((read (buffer-to-ascii))) + (return-encoding (xml-encoding-decl read) read))))) + +(defun make-xml-stream (octet-stream) + "Determine character encoding and return an XML stream for OCTET-STREAM." + (multiple-value-bind (encoding read) (xml-encoding octet-stream) + (make-concatenated-stream (make-string-input-stream read) + (make-flexi-stream octet-stream + :external-format encoding + :element-type 'character)))) + + +;;; Test cases + +(defun test () + (let* ((flux-test (asdf:system-relative-pathname + :xmls/octets "octets-tests/flux/flux-test.sexp")) + (reference (with-open-file (in flux-test :external-format :utf-8) + (read in)))) + (loop with success-p = t + for test-case in (mapcar #'(lambda (x) + (asdf:system-relative-pathname "xmls" (format nil "octets-tests/flux/~a" x))) + '("flux-test-iso-8859-1.xml" + "flux-test-utf-16le.xml" + "flux-test-utf-16be.xml" + "flux-test-utf-8.xml")) + for parsed = (with-open-file (octets (asdf:system-relative-pathname + :xmls/octets test-case) + :element-type '(unsigned-byte 8)) + (xmls:parse (make-xml-stream octets) :quash-errors t)) + as parsed-list = (xmls:node->nodelist parsed) + do (when (not (equal parsed-list reference)) + (setf success-p nil) + (format *error-output* "~&Test failure: ~a~%Output was: ~s~%~%" test-case parsed)) + finally (return success-p)))) diff -pruN 1.7.1-2/README.html 3.0.2-1/README.html --- 1.7.1-2/README.html 2015-03-20 22:14:30.000000000 +0000 +++ 3.0.2-1/README.html 2017-12-17 22:54:32.000000000 +0000 @@ -1,15 +1,32 @@ + - + + XMLS: Common Lisp XML Parser +

XMLS

+
Manual For Version 3

Summary

Xmls is a small, simple, non-validating xml parser for Common Lisp. It's designed to be a self-contained, easily embedded parser that recognizes a useful subset of the XML spec. It provides a simple mapping from xml to lisp - s-expressions and back. + structures or s-expressions and back.

+

Since XMLS was first released it has gained some additional +complications/features. In particular:

+
    +
  • Now XMLS by default parses XML documents into lisp structures, + rather than s-expressions. This makes accessing the structures + simpler and more reliable. See section on backward compatibility.
  • +
  • We have added clearly named accessors to further improve + extraction of information from parsed XML.
  • +
  • Thanks to Max Rottenkolber, we now have the affiliated library, + xmls/octets that will open streams for the XMLS parser, + processing any content-type declarations in the process.
  • +
+

Features

    @@ -46,15 +63,53 @@
  • No detailed error reporting.
  • +
  • + Hand-built LR parser, meaning the parser structure is a little hard + to understand, and can be hard to modify. Use of CL-YACC or similar + might be a preferable route for a rewrite. +

XML Representation

- Parsed xml is represented as a lisp list. A node is represented as follows: + Parsed xml is represented as a nested lisp structure, unlike in the + original version, where it was a lisp list. The s-expression + representation is still maintained, and there are functions to + translate to and from this notation. +

+ +

XML representation as lisp structures

+ +

In the structure representation, a node, corresponding to an XML +element, is defined as follows: +

+ +
(defstruct (node (:constructor %make-node))
+  name
+  ns
+  attrs
+  children)
+ +

+ Xmls also includes a helper function, make-node for creating xml nodes + of this form:

+(make-node &key name ns attrs children)
+
+ +

+ Xmls provides the corresponding accessor functions node-name, node-ns + node-attrs, and node-children. +

+ +

XML representation as s-expressions

+ +

In the s-expression representation, a node is represented as follows:

+ +
 (name (attributes) children*)
 
@@ -93,39 +148,47 @@ Would parse as: (("subject" . "http://bookinfo") (("rank" "1")) "\"Cybernetic Fables\"")) -

- Xmls also includes a helper function, make-node for creating xml nodes - of this form: -

+

Backward Compatibility

-
-(make-node &key name ns attrs children)
-
+

To detect whether in this version of XMLS the return value of PARSE will be a +list or a structure, check for the feature :XMLS-NODES-ARE-STRUCTS. -

- Xmls provides the corresponding accessor functions node-name, node-ns - node-attrs, and node-children. -

+

For old code that wants XML parsed into lists, instead of +structures, you may replace calls to (parse str) with +(node->nodelist (parse str)).

+ +

For greater convenience, we offer PARSE-TO-LIST, which +performs the same function.

Usage

- The interface is straightforward. The two main functions are parse and toxml. + The interface is straightforward. The two main functions are + PARSE and TOXML.

-(parse source &key (compress-whitespace t))
+(parse source &key (compress-whitespace t) (quash-errors t)
 

Parse accepts either a string or an input stream and attempts to parse the xml document contained therein. It will return the s-expr parse tree if it's - successful or nil if parsing fails. + successful or nil if parsing fails.

- If compress-whitespace is t, content nodes will be trimmed of whitespace and +

+ If COMPRESS-WHITESPACE is non-NIL, content nodes will be trimmed of whitespace and empty whitespace strings between nodes will be discarded.

+ +
+(parse-to-list source (&rest args))
+
+ +

Functions as PARSE, but returns a list representation +of the XML document, instead of a structure.

+
 (write-prologue xml-decl doctype stream)
 
@@ -144,7 +207,7 @@ Would parse as: (write-prolog xml-decl doctype stream)

-U.S. spelling alternative to

write-prologue
. +U.S. spelling alternative to write-prologue.

@@ -165,97 +228,136 @@ U.S. spelling alternative to 
write-
 

- Toxml is a convenience wrapper around write-xml that returns the in a newly + TOXML is a convenience wrapper around write-xml that returns the in a newly allocated string.

+

Translating to and from s-expressions

+ +

XMLS provides two exported functions to translate between the CL +structure representation of the XML tree and the s-expression +representation:

+
+
node->nodelist
+
Translate the structure representation into s-expressions.
+ +
nodelist->nodes
+
Translate the s-expression representation of an XMLS parse tree + into lisp structures.
+
+ +

Helper functions

These are intended to allow programmers to avoid direct manipulation of the - s-expression representation. If you use these, your code should be easier to + XMLS element representation. If you use these, your code should be easier to read and you will avoid problems if there is a change in internal representation (such changes would be hard to even find, much less correct, if using the lists directly).

- make-xmlrep (tag &key attribs children) + make-xmlrep (tag &key attribs children)
Constructor function.
-
- xmlrep-add-child! (xmlrep child) - -
-
Add a new child node to the XMLREP node.
-
- xmlrep-tag (xmlrep) - -
+
+ xmlrep-add-child! (xmlrep child) +
+
Add a new child node to the XMLREP node.
+ +
+ xmlrep-tag (xmlrep) +
Extract the tag from XMLREP.
-
xmlrep-tagmatch (tag treenode) -
-
Returns true if TAG is the tag of TREENODE. Match is - case insensitive (quite possibly this is the Wrong Thing).
-
- xmlrep-attribs (xmlrep) - -
-
Extract the attributes from an XMLREP node.
-
- xmlrep-children (xmlrep) - -
-
Extract the children from an XMLREP node.
-
- xmlrep-find-child-tags (tag treenode) - -
-
Return all of the (direct) children of TREENODE whose tags are TAG. - Matching done by xmlrep-tagmatch. -
- xmlrep-find-child-tag (tag treenode - &optional (if-unfound :error)) - -
-
Find a single child of TREENODE with TAG. Returns an error -if there is more or less than one such child.
-
-
- xmlrep-string-child (treenode) -
-
Find the single string-valued child of TREENODE. Returns an - error if there is more than one child, or if a single child is not - string-valued.
-
-
-
- xmlrep-integer-child (treenode) -
-
Find the single child of TREENODE whose value is a string that + +
+ xmlrep-tagmatch (tag treenode) +
+
Returns true if TAG is the tag of TREENODE. Match is + case insensitive (quite possibly this is the Wrong Thing).
+ +
+ xmlrep-attribs (xmlrep) +
+
Extract the attributes from an XMLREP node.
+ +
+ xmlrep-children (xmlrep) +
+
Extract the children from an XMLREP node.
+ +
+ xmlrep-find-child-tags (tag treenode) +
+
+ Return all of the (direct) children of TREENODE whose tags are TAG. + Matching done by xmlrep-tagmatch. +
+ +
+ xmlrep-find-child-tag (tag treenode &optional (if-unfound :error)) +
+
+ Find a single child of TREENODE with TAG. Returns an error + if there is more or less than one such child. +
+ +
+ xmlrep-string-child (treenode &optional (if-unfound :error)) +
+
+ Returns the single string-valued child of TREENODE. + If there is more than one child, or if a single child is not + a simple value, returns IF-UNFOUND, which defaults to :ERROR. +
+ +
+ xmlrep-integer-child (treenode) +
+
+ Find the single child of TREENODE whose value is a string that can be parsed into an integer. Returns an error if there is more than one child, or if a single child is not - appropriately valued.
-
-
- xmlrep-attrib-value (attrib treenode - &optional (if-undefined :error)) - -
-
Find the value of ATTRIB, a string, in TREENODE. -if there is no ATTRIB, will return the value of IF-UNDEFINED, -which defaults to :ERROR.
-
- xmlrep-boolean-attrib-value (attrib treenode - &optional (if-undefined :error)) - -
-
Find the value of ATTRIB, a string, in TREENODE. -The value should be either "true" or "false". The -function will return T or NIL, accordingly. If there is no ATTRIB, - will return the value of IF-UNDEFINED, which defaults to :ERROR.
+ appropriately valued. + + +
+ xmlrep-attrib-value (attrib treenode &optional (if-undefined :error)) +
+
+ Find the value of ATTRIB, a string, in TREENODE. + if there is no ATTRIB, will return the value of IF-UNDEFINED, + which defaults to :ERROR. +
+ +
+ xmlrep-boolean-attrib-value (attrib treenode &optional (if-undefined :error)) +
+
+ Find the value of ATTRIB, a string, in TREENODE. + The value should be either "true" or "false". The + function will return T or NIL, accordingly. If there is no ATTRIB, + will return the value of IF-UNDEFINED, which defaults to :ERROR. +
+ +

XMLS/Octets

+

+XMLS itself simply processes strings or streams. This means that it +does not provide native support for handling character encodings, as +declared in the XML headers. The system xmls/octets, +which depends on xmls provides that support with the +exported function make-xml-stream, which takes an +octet-stream as argument, processes its header, choosing the +appropriate character encoding, and then returns a stream suitable for +passing to xmls:parse.

+ +

Probably make-xml-stream should be made generic, and support +arguments of other types (e.g., strings interpreted as filenames, +pathnames, etc.).

+

Installation

@@ -268,7 +370,7 @@ function will return T or NIL, according

Contact Information

- Please contact Robert Goldman, rpgoldman AT sift.info with any + Please contact Robert Goldman, rpgoldman AT sift.net with any questions or bug reports.

diff -pruN 1.7.1-2/run-tests.lisp 3.0.2-1/run-tests.lisp --- 1.7.1-2/run-tests.lisp 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/run-tests.lisp 2017-12-13 00:24:43.000000000 +0000 @@ -0,0 +1,111 @@ +(defpackage xmls-test-runner + (:use :common-lisp)) + +(in-package :xmls-test-runner) + +(require :asdf) +(format t "ASDF version is ~a~%" (asdf:asdf-version)) +(defparameter *quicklisp-p* (not (zerop (parse-integer (uiop:getenv "QUICKLISP")))) ) +(when *quicklisp-p* + (load (merge-pathnames "quicklisp/setup.lisp" + (user-homedir-pathname)))) +(defmacro quit-on-error (&body body) + (let ((code 1)) + (when (numberp (first body)) + (setf code (pop body))) + `(call-quitting-on-error (lambda () ,@body) ,code))) + +(defun call-quitting-on-error (thunk &optional (code 1)) + "Unless the environment variable DEBUG_ASDF_TEST +is bound, write a message and exit on an error. If +*asdf-test-debug* is true, enter the debugger." + (flet ((quit (c desc) + (uiop:safe-format! *error-output* "~&Encountered ~a during test.~%~a~%" desc c) + (cond + ;; decline to handle the error. + ((ignore-errors (funcall (find-symbol "GETENV" :asdf) "DEBUG_ASDF_TEST")) + (format t "~&Interactive mode (DEBUG_ASDF_TEST) -- Invoke debugger.~%") + (invoke-debugger c)) + (t + (finish-output *standard-output*) + (finish-output *trace-output*) + (uiop:safe-format! *error-output* "~&ABORTING:~% ~S~%" c) + (uiop:print-condition-backtrace c) + (uiop:safe-format! *error-output* "~&ABORTING:~% ~S~%" c) + (uiop:safe-format! *error-output* "~&Script failed~%") + (finish-output *error-output*) + (uiop:quit code t))))) + (handler-bind + ((error (lambda (c) + (quit c "ERROR"))) + (storage-condition + (lambda (c) (quit c "STORAGE-CONDITION"))) + (serious-condition (lambda (c) + (quit c "Other SERIOUS-CONDIITON")))) + (funcall thunk) + (format t "~&Script succeeded~%") + t))) + + +;; for this to work, we must ensure that ASDF gets an OK configuration +;; on startup. +(setf asdf:*compile-file-failure-behaviour* :error) +(quit-on-error + (macrolet ((load-system (s) + (if *quicklisp-p* `(uiop:symbol-call '#:ql '#:quickload ,s)`(asdf:load-system ,s)))) + (load-system :flexi-streams) + (load-system :fiveam) + (load-system "cl-ppcre"))) ; need to do this here because it doesn't build without warnings. +(setf asdf:*compile-file-warnings-behaviour* :error) +(defvar *build-warning* nil) +(defvar *build-error* nil) +(catch 'build-fail + (handler-bind ((warning #'(lambda (x) + ;; this is necessary because on SBCL + ;; there's an EXTERNAL handler for some + ;; uninteresting warnings. + (signal x) + (push x *build-warning*) + (throw 'build-fail :fail))) + (error #'(lambda (x) + (push x *build-error*) + (throw 'build-fail :warn)))) + (asdf:load-system "xmls" :force t))) +(cond (*build-error* + (uiop:die 1 "XMLS build failed with error(s):~%~{~a~%~}" + *build-error*)) + (*build-warning* + (uiop:die 1 "XMLS build failed with warning(s):~%~{~a~%~}" + *build-warning*))) + +(catch 'build-fail + (handler-bind ((warning #'(lambda (x) + ;; this is necessary because on SBCL + ;; there's an EXTERNAL handler for some + ;; uninteresting warnings. + (signal x) + (push x *build-warning*) + (throw 'build-fail :fail))) + (error #'(lambda (x) + (push x *build-error*) + (throw 'build-fail :warn)))) + (asdf:load-system "xmls/octets" :force t))) +(cond (*build-error* + (uiop:die 2 "XMLS/OCTETS build failed with error(s):~%~{~a~%~}" + *build-error*)) + (*build-warning* + (uiop:die 2 "XMLS/OCTETS build failed with warning(s):~%~{~a~%~}" + *build-warning*))) + + +(quit-on-error + 3 + (format t "~&;;; Testing XMLS.~%") + (asdf:test-system "xmls")) + +(quit-on-error + 4 + (format t "~&;;; Testing XMLS/OCTETS.~%") + (asdf:test-system "xmls/octets")) + +(uiop:quit 0) diff -pruN 1.7.1-2/run-tests.pl 3.0.2-1/run-tests.pl --- 1.7.1-2/run-tests.pl 2015-03-20 22:14:11.000000000 +0000 +++ 3.0.2-1/run-tests.pl 2017-12-13 00:24:43.000000000 +0000 @@ -5,25 +5,34 @@ use FindBin; use File::Find; our $FORM = "(xmls::test)"; +our $EVAL = "--eval"; our $SEPARATOR=""; +our $quicklisp = 0; our $usage = <<'USAGE'; -usage: run-tests.sh [options] [tests] +usage: run-tests.pl [options] options: - --sbcl run tests with sbcl (default) - --cmucl run tests with cmucl --abcl run tests with abcl - --ccl run tests with clozure common lisp --allegro run tests with Allegro Common Lisp, ANSI mode --allegromodern run tests with Allegro Common Lisp, modern case-sensitive mode - --all run all tests in tests directory + --ccl run tests with clozure common lisp + --cmucl run tests with cmucl + --sbcl run tests with sbcl (default) + --quicklisp run against quicklisp --verbose output parsed xml + +Note, there are two ways to run this system: either you can run it in an environment +where Quicklisp is available, and the ancillary libraries needed for the tests are +available that way, or you can use the CL_SOURCE_REGISTRY configuration to set up +ASDF to find the ancillary libraries. USAGE our $command = $ENV{SBCL} || "sbcl"; -our $CMDLINE="${command} --no-userinit --eval \'(require :asdf)\' --eval \'(progn (load \"xmls.asd\") (asdf:load-system \"xmls\"))\' --eval"; - +our $CMDLINE="${command} --no-userinit "; +our $SEPARATOR="--"; +our $LOAD="--load"; my $help = 0; my $verbose = 0; +$ENV{"CL_SOURCE_REGISTRY"}=$FindBin::RealBin . ":" unless $ENV{"CL_SOURCE_REGISTRY"}; GetOptions ( "abcl" => \&lisp_handler, "ccl" => \&lisp_handler, "cmucl" => \&lisp_handler, @@ -34,19 +43,48 @@ GetOptions ( "abcl" => \&lisp_handler, "help" => \$help, "usage" => \$help, "verbose" => \&set_verbose, - "all" => \&set_all_tests, + "quicklisp" => \$quicklisp ); +$ENV{"QUICKLISP"} = $quicklisp; -unless ( $TESTS ) { - set_all_tests(); +if ($help) { + print $usage; + exit 0; +} + +# unless ( $TESTS ) { +# set_all_tests(); +# } + +# { +# my $command = "$CMDLINE $EVAL \"(require :asdf)\" $EVAL \"(asdf:load-system :xmls)\" $EVAL \"$FORM\" $SEPARATOR $TESTS"; +# print "$command\n" if $verbose; +# my $code = system $command; +# if ($code != 0) { +# print "XMLS parsing tests failed.\n"; +# exit $code +# } else { +# if ($verbose) { +# } +# } +# } + +{ +print STDERR "Running ASDF tests.\n"; +my $cmd = "$CMDLINE $LOAD $FindBin::RealBin/run-tests.lisp"; +print STDERR "Command for 5AM tests is:\n\t$cmd\n"; +my $code = system $cmd; +print STDERR "ASDF test output code is: $code\n"; +if ($code) { + $code = $code >> 8; + print STDERR "Exiting script with code $code\n"; + # this is going wrong... + exit $code; } - -{ my $command = "$CMDLINE \"$FORM\" $SEPARATOR $TESTS"; - print "$command\n" if $verbose; - system $command; +print STDERR "Done running ASDF tests.\n"; +exit 0; } - # subroutines from here on down... sub set_verbose { @@ -54,22 +92,22 @@ sub set_verbose { $verbose = 1; } -our @all_tests; -sub set_all_tests { - File::Find::find({wanted => \&wanted}, $FindBin::RealBin); - if ($verbose) { - print STDERR "Test list is:\n"; - foreach my $test (@all_tests) { - print STDERR "\t$test\n"; - } - } - $TESTS = join(" ", @all_tests); -} - -sub wanted { - /^.*\.xml\z/s - && push @all_tests, $File::Find::name; -} +# our @all_tests; +# sub set_all_tests { +# File::Find::find({wanted => \&wanted}, "$FindBin::RealBin/tests/"); +# if ($verbose) { +# print STDERR "Test list is:\n"; +# foreach my $test (@all_tests) { +# print STDERR "\t$test\n"; +# } +# } +# $TESTS = join(" ", @all_tests); +# } + +# sub wanted { +# /^.*\.xml\z/s +# && push @all_tests, $File::Find::name; +# } sub usage { print $usage; @@ -79,27 +117,33 @@ sub lisp_handler { my $lisp = shift; if ( $lisp eq "abcl" ) { $command=$ENV{ABCL} || "abcl"; - $CMDLINE="${command} --noinit --noinform --eval \'(require :asdf)\' --load xmls.asd --eval \'(asdf:load-system :xmls)\' --eval"; + $CMDLINE="${command} --noinit --noinform"; # --eval \'(require :asdf)\' --load xmls.asd --eval \'(asdf:load-system :xmls)\' "; } elsif ( $lisp eq "ccl" ) { $command=$ENV{CCL} || "ccl"; - $CMDLINE="${command} --no-init --quiet --eval \'(require :asdf)\' --load xmls.asd --eval '(asdf:load-system :xmls)' --eval"; + $CMDLINE="${command} --no-init --quiet"; # --eval \'(require :asdf)\' --load xmls.asd --eval '(asdf:load-system :xmls)' "; $SEPARATOR="--"; } elsif ( $lisp eq "cmucl" ) { $command=$ENV{CMUCL} || "lisp"; - $CMDLINE="${command} -eval \'(require :asdf)\' -load xmls.asd -eval \'(asdf:load-system :xmls)\' -eval"; + $EVAL="-eval"; $LOAD="-load"; + $CMDLINE="${command} -noinit " #-eval \'(require :asdf)\' -load xmls.asd -eval \'(asdf:load-system :xmls)\' "; } elsif ($lisp eq "allegro") { $command=$ENV{ALLEGRO} || "alisp"; - $CMDLINE="${command} -q -e \'(require :asdf)\' -L xmls.asd -e \'(asdf:load-system :xmls)\' -e"; + $EVAL = "-e"; $LOAD="-L"; + $CMDLINE="${command} -q"; # -e \'(require :asdf)\' -L xmls.asd -e \'(asdf:load-system :xmls)\' "; $SEPARATOR="--"; } elsif ($lisp eq "allegromodern") { $command=$ENV{ALLEGROMODERN} || "mlisp"; - $CMDLINE="${command} -q -e \'(require :asdf)\' -L xmls.asd -e \'(asdf:load-system :xmls)\' -e"; + $EVAL = "-e"; + $LOAD = "-L"; + $CMDLINE="${command} -q "; #-e \'(require :asdf)\' -L xmls.asd -e \'(asdf:load-system :xmls)\' "; $SEPARATOR="--"; } elsif ($lisp eq "sbcl") { # the default... } elsif ($lisp eq "clisp") { $command=$ENV{CLISP} || "clisp"; - $CMDLINE="${command} -norc -ansi -x \'(require :asdf)\' -i xmls.asd -x \'(asdf:load-system :xmls)\' -x"; + $EVAL = "-x"; + $LOAD = "-i"; + $CMDLINE="${command} -norc -ansi"; # -x \'(require :asdf)\' -i xmls.asd -x \'(asdf:load-system :xmls)\' "; $SEPARATOR="--"; } } diff -pruN 1.7.1-2/tests/char-encoding/flux-test-iso-8859-1.xml 3.0.2-1/tests/char-encoding/flux-test-iso-8859-1.xml --- 1.7.1-2/tests/char-encoding/flux-test-iso-8859-1.xml 2011-02-25 16:21:37.000000000 +0000 +++ 3.0.2-1/tests/char-encoding/flux-test-iso-8859-1.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ - - - -Les derniers documents du CERTA. -http://www.certa.ssi.gouv.fr -CERTA (Centre d'Expertise gouvernemental de Reponse et de Traitement des Attaques informatiques). -fr - -CERTA-2011-AVI-110 : Vulnrabilit dans IBM WepSphere Portal (24 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-110/CERTA-2011-AVI-110.htmlUne vulnrabilit a t corrige dans IBM WebSphere Portal et permet un utilisateur malintentionn de porter atteinte la confidentialit des donnes. -CERTA-2011-AVI-109 : Multiples vulnrabilits dans Cisco ASA srie 5500 (24 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-109/CERTA-2011-AVI-109.htmlQuatre vulnrabilits ont t corriges dans les appareils Cisco ASA srie 5500. Trois d'entre elles permettent de raliser un dni de service distance, et la quatrime permet d'accder des donnes confidentielles sur le systme de fichiers. -CERTA-2011-AVI-108 : Vulnrabilit dans Microsoft Malware Protection Engine (24 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-108/CERTA-2011-AVI-108.htmlUne vulnrabilit dans Microsoft Malware Protection Engine permet une personne malintentionne d'lever ses privilges. -CERTA-2011-AVI-107 : Vulnrabilit dans Novell Netware (24 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-107/CERTA-2011-AVI-107.htmlUne vulnrabilit dans Novell Netware permet une personne distante malintentionne d'excuter du code arbitraire. -CERTA-2011-AVI-106 : Vulnrabilit dans CA HIPS (24 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-106/CERTA-2011-AVI-106.htmlUne vulnrabilit dans CA HIPS permet l'excution de code arbitraire distance. -CERTA-2011-AVI-105 : Multiples vulnrabilits dans les logiciels Cisco TelePresence (24 fvrier -2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-105/CERTA-2011-AVI-105.htmlDe multiples vulnrabilits touchent la ligne de produits Cisco TelePresence, elles permettent notamment d'excuter du code arbitraire ou de provoquer un dni de service distance. -CERTA-2011-AVI-104 : Vulnrabilit dans Cisco Firewall Services Module (24 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-104/CERTA-2011-AVI-104.htmlUne vulnrabilit permettant d'effectuer un dni de service distance a t identifie dans le produit Cisco Firewall Services Module (FWSM). -CERTA-2011-AVI-079 : Vulnrabilit dans plusieurs implmentations de Java (24 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-079/CERTA-2011-AVI-079.htmlUne vulnrabilit affecte plusieurs implmentations de Java, elle permet un dni de service distance. -CERTA-2011-AVI-103 : Vulnrabilit dans ISC Bind (23 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-103/CERTA-2011-AVI-103.htmlUne vulnrabilit dans le serveur DNS ISC Bind permet un utilisateur malintentionn de provoquer un dni de service distance. -CERTA-2011-AVI-102 : Vulnrabilits dans RedHat Directory Server (23 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-102/CERTA-2011-AVI-102.htmlPlusieurs vulnrabilits dans l'annuaire RedHat Directory Server permettent un utilisateur malveillant de provoquer un dni de service distance ou d'lever ses privilges. -CERTA-2011-AVI-101 : Multiples vulnrabilits dans Ruby (22 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-101/CERTA-2011-AVI-101.htmlDeux vulnrabilits dans Ruby ont t corriges. La premire permet de contourner la politique de scurit et la seconde de porter atteinte l'intgrit des donnes. -CERTA-2011-AVI-100 : Vulnrabilits dans Mailman (22 fvrier 2011)http://www.certa.ssi.gouv.fr/site/CERTA-2011-AVI-100/CERTA-2011-AVI-100.htmlDeux vulnrabilits prsentes dans Mailman permettent un utilisateur distant de conduire des attaques de type injection de code indirecte. - - diff -pruN 1.7.1-2/tests/nxml/genetics-article.xml 3.0.2-1/tests/nxml/genetics-article.xml --- 1.7.1-2/tests/nxml/genetics-article.xml 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/tests/nxml/genetics-article.xml 2015-05-14 20:51:41.000000000 +0000 @@ -0,0 +1,1538 @@ +2015-05-06T21:47:12Zhttp://www.ncbi.nlm.nih.gov/oai/oai.cgi
oai:pubmedcentral.nih.gov:39029072014-01-27narpmc-open
+ + + + Nucleic Acids Res + Nucleic Acids Res + nar + nar + + Nucleic Acids Research + + 0305-1048 + 1362-4962 + + Oxford University Press + + + + PMC3902907 + PMC3902907 + 3902907 + 24106086 + 10.1093/nar/gkt903 + gkt903 + + + RNA + + + + Tyrosine phosphorylation of HuR by JAK3 triggers dissociation and degradation of HuR target mRNAs + + + + + Yoon + Je-Hyun + + + + + Abdelmohsen + Kotb + + * + + + + Srikantan + Subramanya + + + + + Guo + Rong + + + + + Yang + Xiaoling + + + + + Martindale + Jennifer L. + + + + + Gorospe + Myriam + + * + + + Laboratory of Genetics, National Institute on Aging-Intramural Research Program, NIH, Baltimore, MD 21224, USA + + *To whom correspondence should be addressed. Tel: +1 410 558 8589; Fax: +1 410 558 8331; Email: abdelmohsenk@mail.nih.gov + Correspondence may also be addressed to Myriam Gorospe. Tel: +1 410 558 8443; Fax: +1 410 558 8331; Email: gorospem@grc.nia.nih.gov + +

The authors wish it to be known that, in their opinion, the first two authors should be regarded as Joint First Authors.

+
+
+ + 1 + 2014 + + + 6 + 10 + 2013 + + + 6 + 10 + 2013 + + + 42 + 2 + 1196 + 1208 + + + 24 + 3 + 2013 + + + 13 + 9 + 2013 + + + 16 + 9 + 2013 + + + + Published by Oxford University Press 2013. This work is written by US Government employees and is in the public domain in the US. + 2013 + + +

In response to stress conditions, many mammalian mRNAs accumulate in stress granules (SGs) together with numerous RNA-binding proteins that control mRNA turnover and translation. However, the signaling cascades that modulate the presence of ribonucleoprotein (RNP) complexes in SGs are poorly understood. Here, we investigated the localization of human antigen R (HuR), an mRNA-stabilizing RNA-binding protein, in SGs following exposure to the stress agent arsenite. Unexpectedly, the mobilization of HuR to SGs was prevented through the activation of Janus kinase 3 (JAK3) by the vitamin K3 analog menadione. JAK3 phosphorylated HuR at tyrosine 200, in turn inhibiting HuR localization in SGs, reducing HuR interaction with targets SIRT1 and VHL mRNAs, and accelerating target mRNA decay. Our findings indicate that HuR is tyrosine-phosphorylated by JAK3, and link this modification to HuR subcytoplasmic localization and to the fate of HuR target mRNAs.

+
+ + + +
+
+ INTRODUCTION

Following transcription, RNA-binding proteins (RBPs) regulate post-transcriptional steps of gene expression, including pre-mRNA splicing, and mRNA transport, storage, stability and translation (1,2). Although some RBPs have general housekeeping functions on mRNAs [e.g. bind the mRNA 5′ cap or poly(A) tail], other specialized RBPs form ribonucleoprotein (RNP) interactions with discrete subsets of mRNAs which share specific sequence elements, and affect their post-transcriptional fate (3). The latter group includes RBPs such as human antigen R (HuR), AU-binding factor 1 (AUF1), nucleolin and T-cell intracellular antigen (TIA)-1 and TIA-1-related (TIAR) proteins, which associate with subsets of target mRNAs and modulate their stability and/or translation rates (1,2). Specialized RBPs are directly involved in changing the patterns of expressed proteins in response to stress conditions, and such stress-response functions often require RBP post-translational modification (as reviewed in 4–6).

HuR has three RNA-recognition motifs (RRMs) through which it binds to a large collection of protein-coding and noncoding RNAs. Although it can interact with pre-mRNA intron sequences and has been linked to regulated splicing (7–9), HuR is best known for stabilizing and modulating the translation of mature mRNAs with which it associates via the 3′-untranslated region (UTR), typically at U-rich sites (9,10). Through binding to subsets of mRNAs encoding proliferative, stress-response and cell survival proteins, HuR has been implicated in cellular processes, such as cell division, survival, senescence and the stress-response, and with pathologies such as cancer (11,12).

HuR function is regulated at the levels of protein abundance, localization and post-translational modification. HuR levels are reduced by specific microRNAs (e.g. miR-519 and miR-125), by ubiquitination in response to mild heat shock and by caspase-mediated cleavage in response to severe stress (reviewed in 13). HuR is predominantly localized in the nucleus, but its effects on mRNA stability and translation are linked to its transport to the cytoplasm, which requires the HuR nucleocytoplasmic shuttling domain (HNS) and transport proteins such as transportins 1 and 2, the chromosome region maintenance 1 and importin-1α (14–17). The transport of HuR across the nuclear envelope is influenced by kinases including the cell cycle-dependent kinase (Cdk)1, AMP-activated protein kinase (AMPK), protein kinase (PK)C and the mitogen-activated protein kinase p38 (18–21). The interaction of HuR with target transcripts is modulated through phosphorylation of serine and threonine residues by several kinases; phosphorylation by checkpoint kinase (Chk)2 generally reduced HuR interaction with mRNAs (22,23), whereas phosphorylation by activated p38 and PKC generally promoted HuR binding to mRNAs (4,24,25).

Besides altering the ratio of cytoplasmic-to-nuclear HuR and the interaction of HuR with target mRNAs, a number of stress agents (e.g. heat shock, irradiation with ultraviolet light and treatment with hydrogen peroxide) can also enhance the aggregation of HuR in cytoplasmic RNP foci named stress granules (SGs) (14,26–29). SGs assemble in response to cell-damaging conditions to halt the translation of housekeeping mRNAs and to selectively allow stress-response and repair proteins to be translated (30). Besides HuR, SGs also contain numerous other RBPs, such as poly(A)-binding protein (PABP), staufen, tristetraprolin, TIA-1, TIAR, RasGAP-associated endoribonuclease (G3BP), fragile X mental retardation syndrome, survival of motor neuron and cytoplasmic polyadenylation element binding proteins (30). SGs are dynamic RNP structures that assemble rapidly when the cell encounters stress and disassemble in a timely manner after the stress discontinues. SGs are believed to be the sites of mRNA ‘triage’ where decisions are made on the stability of individual mRNAs while the global cellular translation is halted.

Despite the key role of HuR in the cellular stress-response, the mechanisms that control HuR localization in SGs and their possible impact on expression of HuR target stress-response mRNAs are unknown. Here, we report that in human cervical carcinoma cells, the arsenite-triggered accumulation of HuR in SGs is accompanied by increased HuR binding to target transcripts SIRT1 and VHL mRNAs and by stabilization of these mRNAs. Unexpectedly, the accumulation of HuR in SGs was blocked by treatment with menadione, a drug that activated the tyrosine kinase Janus kinase 3 (JAK3). JAK3 phosphorylated three HuR tyrosine residues in vitro; mutagenesis to prevent HuR phosphorylation specifically at Y200 restored HuR accumulation in SGs, preserved HuR binding to SIRT1 and VHL mRNAs and rescued their stability. These studies link HuR presence in SGs with the fate of target mRNAs, and highlight a novel function of tyrosine kinase JAK3 as regulator of HuR function.

MATERIALS AND METHODSCell culture, chemicals, transfection, small interfering RNAs and plasmids

Human HeLa cells were cultured in Dulbecco’s modified Eagle’s medium (Invitrogen) supplemented with 10% (v/v) Fetal Bovine Serum (FBS) and antibiotics. All plasmids were transfected using Lipofectamine-2000 (Invitrogen) and analyzed 48 h later. JAK3 and Chk2 siRNAs were from Santa Cruz Biotechnology. For mRNA stability assays, HeLa cells were treated with actinomycin D (2.5 μg/ml) to inhibit de novo transcription. Actinomycin D, arsenite (sodium arsenite) and menadione were from Sigma; pateamine A (used at 50 nM) was a gift from I.E. Gallouzi. A site-directed mutagenesis kit (Stratagene) was used to introduce point mutations in HuR expression vectors.

Western blot analysis

Whole-cell lysates, prepared in Radioimmunoprecipitation assay (RIPA) buffer, were separated by sodium dodecyl sulphate-polyacrylamide gel electrophoresis, and transferred onto Polyvinylidene fluoride (PVDF) membranes (Invitrogen iBlot Stack). Primary antibodies recognizing HuR, PABP, TIA-1, JAK3, p(Y980)JAK3, p(T68)Chk2, Chk2, Tubulin, eIF2α and phosphorylated (p-)eIF2α were from Santa Cruz Biotechnology. Antibodies recognizing phosphotyrosine (pY) residues and Flag were from Cell Signaling and Sigma, respectively. HRP-conjugated secondary antibodies were from GE Healthcare.

Immunoprecipitation assays

For immunoprecipitation (IP) of endogenous RNP complexes from whole-cell extracts (22), cells were lysed in 20 mM Tris-HCl at pH 7.5, 100 mM KCl, 5 mM MgCl2 and 0.5% NP-40 for 10 min on ice and centrifuged at 10 000 g for 15 min at 4°C. The supernatants were incubated with protein A-Sepharose beads coated with antibodies that recognized HuR, Jak3 or Flag or with control IgG (Santa Cruz Biotechnology) for 1 h at 4°C. After the beads were washed with NT2 buffer (50 mM Tris-HCl at pH 7.5, 150 mM NaCl, 1 mM MgCl2 and 0.05% NP-40), the complexes were incubated with 20 U of RNase-free DNase I (15 min at 37°C) and further incubated with 0.1% sodium dodecyl sulphate/0.5 mg/ml proteinase K (15 min at 55°C) to remove DNA and proteins, respectively. The RNPs isolated from the IP materials were further assessed by reverse transcription (RT) using random hexamers and Maxima Reverse Transcriptase (Thermo Scientific) and real-time, quantitative (q) polymerase chain reaction (PCR) using gene-specific primers (Supplementary Table S1) as well as by western blot (WB) analysis.

RNA analysis

Trizol (Invitrogen) was used to extract total RNA, and acidic phenol (Ambion) was used to extract RNA for RIP analysis (22). RT-qPCR analysis was performed using gene-specific primers (Supplementary Table S1) and SYBR green master mix (Kapa Biosystems), in an Applied Biosystems 7300 instrument. For polyribosome distribution analysis, cells were treated with cycloheximide (100 μg/ml, 15 min), and the resulting lysates (500 μl) were separated by ultracentrifugation through 10–50% linear sucrose gradients. The relative absorbance at UV 254 nm was recorded to trace the amount of RNAs throughout the gradients.

Biotin pulldown analysis

Recombinant maltose-binding protein (MBP)-HuR was incubated with a buffer containing 20 mM Tris-HCl at pH 7.5, 100 mM KCl, 5 mM MgCl2 and 0.5% NP-40. Biotinylated SIRT1 and GAPDH 3′-untranslated regions were synthesized by PCR amplification of cDNA using forward primers that contained the T7 RNA polymerase promoter sequence (Supplementary Table S1) in the presence of biotinylated CTP and T7 RNA polymerase, as described (22,31). Proteins present in the pulldown material were studied by WB analysis.

<italic>In vitro</italic> kinase assay

To analyze the phosphorylation of HuR in vitro, MBP-HuR purified from Escherichia coli was incubated with JAK3 protein immunoprecipitated from HeLa cells or purchased from Millipore. The assay was performed in kinase reaction buffer as described previously (31).

Liquid chromatography-tandem mass spectrometry analysis

Protein samples were processed using the ‘Filter-Assisted Sample Preparation’ (FASP) method (32). Briefly, protein samples were dissolved in urea (9 M) and subjected to reduction [5 mM Tris-(2-Carboxyethyl)phosphine, hydrochloride (TCEP), Sigma] at 60°C for 45 min and to alkylation (20 mM C2H4INO, Sigma) at 25°C for 15 min. Protein samples were cleaned using a 30-kDa Amicon Filter (UFC503096, Millipore) with urea (9 M) and NH4HCO3 (30 mM). Samples were then proteolyzed with trypsin (Promega) and chymotrypsin (Roche) for 12 h at 37°C (1: 20 ratio). The digested peptides were desalted and eluted with 0.1% trifluoroacetic acid in 60% acetonitrile. Dry extracted peptides were resuspended in 7 µl 0.1% formic acid for Liquid chromatography-tandem mass spectrometry (LC–MS/MS) analysis. Tandem mass spectrometry analysis of the peptides was conducted on LTQ-Orbitrap Velos interfaced with a 2D nanoLC system nanoACQUITY UltraPerformance LC System. Precursor and fragment ions were analyzed at 30 000 and 7500 resolutions, respectively. Peptide sequences were identified from isotopically resolved masses in MS and MS/MS spectra extracted with and without deconvolution using Thermo Scientific Xtract software. The data were analyzed using Proteome Discoverer 1.3 (Thermo Scientific) software configured with Mascot and Sequest search nodes and searched against Refseq version 46, human entries with oxidation on methionine, deamidation on residues N and Q, phosphorylation of Ser/Thr/Tyr residues as different variable modifications and carbamidomethyl group on cysteine residue as fixed modification. Mass tolerances on precursor and fragment masses were set to 15 ppm and 0.03 Da, respectively. Peptide validator node was used for peptide confirmation, and a 1% false discovery rate cutoff was used to filter the data.

Immunofluorescence assay

Cells were fixed with 2% (v/v) formaldehyde, permeabilized with 0.2% (v/v) Triton X-100, blocked with 5% (w/v) bovine serum albumin and incubated with primary antibodies recognizing HuR (Santa Cruz Biotechnology), TIA-1 (Santa Cruz Biotechnology), eIF3b (Santa Cruz Biotechnology), G3BP (BD biosciences) or Flag (Sigma). Alexa 488- or Alexa 568-conjugated secondary antibodies (Invitrogen) were used to detect primary antibody-antigen complexes with different color combinations as needed. Images were acquired using Axio Observer microscope (ZEISS) with AxioVision 4.7 Zeiss image-processing software or with LSM 510 Meta (ZEISS).

RESULTSJAK3 phosphorylates HuR and prevents its accumulation in SGs

HuR is normally a nuclear protein, as seen in HeLa cells (Figure 1A, control), but it can translocate to the cytoplasm on stress. In response to specific stress conditions, such as arsenite treatment, HuR was further mobilized to cytoplasmic SGs (Figure 1A). While performing experiments to test the presence of HuR in SGs after stress, we made the serendipitous discovery that 15 μM menadione (a chemotherapeutic agent that causes oxidative damage) enhanced HuR presence in the cytoplasm, but did not trigger HuR-positive SGs. Unexpectedly, menadione also prevented SG formation following exposure to 250 μM arsenite (Figure 1A, Supplementary Figure S1A). The combined treatment with arsenite and menadione caused oxidative damage, as assessed by monitoring fluorescence after incubation with dihydrocalcein, an indicator of reactive oxygen species (Supplementary Figure S1B). Although treatment with arsenite and menadione did not elicit immediate signs of apoptotic cell death by 4 h after treatment (Supplementary Figure S1C and D), some cell loss and evidence of apoptosis were detectable by 24 h following treatment (Supplementary Figure S1C and D). The formation of SGs appeared to be generally suppressed under these conditions, as other markers used to visualize SGs [e.g. G3BP and TIA-1 (Figure 1B)] similarly failed to aggregate in SGs. However, we could not exclude the possibility that SGs might have been visualized by testing for other SG markers, that SG formation was delayed or that SGs were too small for detection. Arsenite treatment blocked translation globally (33); however, despite impairing SG formation, menadione did not rescue the translationally inhibited state, as evidenced by the fact that polysomes remained globally suppressed, eIF2α was still phosphorylated and HuR remained bound to PABP (Supplementary Figure S2). To test whether menadione prevented the recruitment of HuR to SGs that formed in an eIF2α-dependent or -independent manner, we studied the effect of 50 nM pateamine A, a drug that induces SG formation independently of eIF2α phosphorylation (34). As shown (Figure 1C), pateamine A-triggered SGs were not blocked by menadione treatment, suggesting that menadione blocked the recruitment of HuR to SGs triggered by eIF2α phosphorylation. +

Menadione prevents the accumulation of HuR in arsenite-triggered SGs. (A) HeLa cells were treated with sodium arsenite (250 μM) with or without menadione (15 µM) for 45 min, and SGs (arrowheads) were assessed by microscopy. HuR was visualized by immunofluorescence (green), and nuclei were visualized by staining with 4′,6-Diamidino-2-Phenylindole, Dihydrochloride (DAPI) (blue). (B) SG markers TIA-1 and G3BP were visualized by immunofluorescence staining (Materials and Methods) in cells treated as explained in (A); nuclei were visualized with DAPI. (C) HeLa cells were treated with menadione and/or pateamine A (50 nM), whereupon SG formation was assessed by immunofluorescence.

To investigate the mechanisms underlying the dynamics of HuR assembly in SGs, we screened a library of kinase inhibitors (described in 35) for restoration of HuR-positive SGs. Among the compounds in the library, only the JAK3 inhibitor ZM 449829 was capable of reversing the effect of menadione and restoring SGs in cells treated concomitantly with arsenite and menadione (Figure 2A andB). Because inhibitors are not totally specific, we also tested whether reducing JAK3 levels [achieved by using small interfering (si)RNAs] influenced SG formation after arsenite and menadione treatments. As shown in Figure 2C, 48 h after transfecting JAK3 siRNA in HeLa cells, JAK3 abundance was substantially lower. Importantly, in these cells, menadione treatment no longer blocked arsenite-triggered HuR-containing SGs, whereas in control (Ctrl) siRNA-transfected cells, menadione continued to block the formation of arsenite-triggered SGs (Figure 2D). In contrast, another stress-activated kinase that can phosphorylate HuR, Chk2, was not found to be implicated in the effects of arsenite and/or menadione (Supplementary Figure S3). The finding that JAK3 silencing mirrored the effect of inhibiting JAK3 lends further support to the notion that activation of JAK3 by menadione prevents the assembly of HuR-containing SGs. +

JAK3 inhibits HuR presence in SGs. (A) HeLa cells were pre-incubated for 1 h with the JAK3 inhibitor ZM449829 (10 μM) before treatment with arsenite and/or menadione and immunostaining as described in Figure 1A. (B) Percentage of HeLa cells with visible SGs (at least one SG per cell) after treatment as in (A); data are the means + SD from three independent experiments. (C and D) Forty-eight hours after transfection of HeLa cells with either JAK3 or Ctrl siRNAs, the levels of JAK3 (as well as the levels of loading control tubulin) were assessed by WB analysis (C); the formation of SGs was visualized after treating and staining cells as explained in Figure 1D.

The rescue of HuR-positive SGs in HeLa cells after inhibiting JAK3, a tyrosine kinase, raised the intriguing possibility that tyrosine phosphorylation might affect HuR localization in response to arsenite treatment. Even though HuR has not been previously reported to be a tyrosine-phosphorylated protein, we examined whether phosphotyrosine (pY)-HuR was detected in HeLa cells treated with arsenite, with menadione or with both compounds. As shown in Figure 3A, IP of HuR from HeLa cells followed by WB analysis of phosphotyrosine residues using an anti-pY antibody revealed positive pY-HuR signals in menadione-treated cells. To gain further evidence that JAK3 might directly phosphorylate HuR, lysates from HeLa cells that had been treated with arsenite and/or menadione were used to immunoprecipitate JAK3 and recombinant purified MBP-HuR was used as substrate in an in vitro kinase assay. This analysis revealed that MBP-HuR was preferentially phosphorylated by JAK3 prepared by IP from menadione-treated cells and further showed that menadione treatment triggered the phosphorylation of JAK3 at residue Y980 (Figure 3B). In addition, IP followed by WB analysis revealed that pY-HuR levels were strongly suppressed in HeLa cells treated with the JAK3 inhibitor ZM 449829 and in HeLa cells in which JAK3 levels were lowered by silencing (Figure 3C). Together, these results indicate that the menadione-activated JAK3 phosphorylates HuR at one or several tyrosines and that this modification is linked to the loss of HuR-positive SGs. +

JAK3 phosphorylates HuR at tyrosine residues. (A) After treatment with arsenite and/or menadione, HeLa cell lysates were subjected to IP using anti-HuR antibody, and the resulting IP material was assayed by WB analysis using anti-phosphotyrosine (pY) antibody. (B) After treatment of cells as in (A), JAK3 was isolated by IP from HeLa cell lysates, and the IP material was used for an in vitro kinase assay using recombinant MBP-HuR protein (2 μg) in the presence of ATP; the reaction product was subjected to WB analysis to detect tyrosine-phosphorylated HuR as well as JAK3 phosphorylation at Y980. (C) After treatment with menadione and/or JAK3 inhibitor (left), and menadione and/or JAK3 siRNA (right), pY-HuR was detected by IP using anti-HuR antibody and WB using anti-pY antibody. (D) Recombinant purified JAK3 kinase (Millipore) was used in in vitro kinase assay using recombinant MBP-HuR protein (2 μg) in the presence of ATP; the reaction mixtures were subjected to WB analysis to detect tyrosine-phosphorylated HuR. (E) Top: LC–MS/MS analysis to map pY HuR residues phosphorylated by JAK3. MBP-HuR was incubated with or without JAK3 kinase domain (Millipore) in the presence of ATP. The resulting reaction mixtures were digested with trypsin for mass spectrometry analysis. Mass shifts after phosphorylation were shown as Y + 80. Bottom: schematic representation of pY sites on HuR; RRM, RNA-recognition motif; HNS, HuR nucleocytoplasmic shuttling domain. Data in (A–D) are representative of three independent experiments.

JAK3 phosphorylates HuR at tyrosine residues

To identify the tyrosine residues of HuR that were phosphorylated by JAK3, we performed an in vitro kinase assay using recombinant purified JAK3 kinase (Millipore) and MBP-HuR purified from E. coli (Figure 3D). Mass spectrometry analysis (Materials and Methods) of the phosphorylated HuR revealed three tyrosines phosphorylated by JAK3: two residing in the RNA-recognition motif 1 (RRM1), Y63 and Y68, and one residing within the hinge region (Y200) surrounding the HNS (Figure 3E).

To investigate the possible impact of these modifications on HuR function, we changed the tyrosines into phenylalanines by site-directed mutagenesis (Y200F, Y68F and Y63F) and expressed the respective point mutants as Flag-HuR proteins from plasmids pFlag-HuR[wild-type (WT)], pFlag-HuR(Y63F), pFlag-HuR(Y68F) and pFlag-HuR(Y200F). Transfection of each plasmid followed by menadione treatment revealed that Flag-HuR(WT) and Flag-HuR(Y63F) were still tyrosine phosphorylated, but Flag-HuR(Y68F) and Flag-HuR(Y200F) were not (Figure 4A), suggesting that menadione elicited phosphorylation of HuR at Y68 and Y200 in vivo. It was interesting to note that Y68F and Y200F each completely inhibited phosphorylation, suggesting that perhaps phosphorylation of one of these two tyrosine residues facilitates or is required for phosphorylation of the other tyrosine residue. The basal and menadione-triggered tyrosine phosphorylation of Flag-HuR(WT), Flag-HuR(Y63F), Flag-HuR(Y68F) and Flag-HuR(Y200F) are shown (Figure 4B). Immunofluorescent detection of the Flag tag in cells transfected with these expression plasmids showed that all three Flag-tagged HuR proteins localized to SGs on arsenite treatment (Figure 4C). Interestingly, however, when cells were treated with both arsenite + menadione, Flag-HuR(WT) and Flag-HuR(Y68F) did not localize in visible SGs, whereas Flag-HuR(Y200F) mutant did (Figure 4C). The SG marker TIA-1 colocalized with HuR(Y200F) in SGs of cells treated with arsenite + menadione, supporting the notion that the HuR foci seen under these conditions were bona fide SGs (Supplementary Figure S4A). Technical limitations associated with the ability to detect endogenous and ectopic proteins in this experiment precluded a more definitive analysis of SGs (kinetics of assembly/disassembly, size and number) forming in the presence of WT and Y200F mutant HuR. Thus, the extent to which menadione inhibited the recruitment of HuR to SGs or more broadly impaired SG formation could not be determined. However, our results did show that menadione induces the phosphorylation of HuR by JAK3 on tyrosine residues and that phosphorylation at HuR Y200 specifically impacts on HuR subcellular localization. +

HuR phosphorylation at Y200 blocks its localization in SGs. (A) Top: schematic representation of Flag-tagged HuR WT and point mutants Y63F, Y68F and Y200F. (B) Forty-eight hours after transfecting HeLa cells with the plasmids shown in (A), cell lysates were prepared, and pY-HuR signals were detected for each Flag-HuR mutant under the conditions shown. (C) Plasmids expressing Flag-tagged HuR WT and tyrosine mutants (A) were transfect into HeLa cells; 48 h later, cells were treated with arsenite and/or menadione and distribution of Flag-HuR (WT or point mutants Y68F or Y200F) was characterized using anti-Flag antibody; DAPI staining was included to visualize the nuclei. Data in (A–C) are representative of three independent experiments.

Phosphorylation at Y200 influences HuR binding to target mRNAs

Because phosphorylation of HuR by other kinases affects HuR binding to target mRNAs, as explained above, we investigated whether phosphorylation by JAK3 influenced HuR binding to target mRNAs. For this, we focused on two well-established HuR target transcripts with abundant expression in HeLa cells, SIRT1 and VHL mRNAs (22,36), encoding the protein deacetylase sirtuin 1 (Sirt1) and the tumor suppressor protein von Hippel-Lindau, respectively. We studied the interaction of HuR with these mRNAs by RIP (ribonucleoprotein immunoprecipitation) analysis of endogenous HuR using an anti-HuR antibody; the efficiency of IP of the endogenous HuR protein was assessed (Supplementary Figure S4B). After isolation of the RNA present in HuR RNP complexes, the levels of specific mRNAs were measured by RT followed by real-time quantitative (q)PCR analysis. As shown (Figure 5A and B), endogenous HuR displayed robust binding to these mRNAs in the absence of additional treatments (‘Control’ group), but the concentration of these complexes increased strongly after arsenite treatment [and increased even further at higher doses, Supplementary Figure S5)]. Following the addition of menadione, with or without arsenite, this heightened interaction was lost and HuR binding to SIRT1 and VHL mRNAs returned to the levels seen in the ‘Control’ group. +

Tyrosine phosphorylation of HuR at Y200 reduces its interactions with target mRNAs. (A, B) After treatment of HeLa cells with arsenite and/or menadione as explained in Figure 1, RIP (IP followed by RT-qPCR) analysis was used to measure the levels of enrichment of SIRT1 mRNA (A) and VHL mRNA (B) associated with HuR; the samples were normalized using GAPDH mRNA, and the data represented as enrichment of each mRNA in HuR IP were compared with IgG IP. (C, D) After transfection and treatment, RIP analysis was used to measure the interaction between Flag-HuR (WT, Y68F, Y200F) and SIRT1 mRNA (C) and VHL mRNA (D); GAPDH mRNA was measured for normalization, and data are represented as enrichment of the mRNAs in Flag IP samples relative to the levels in IgG IP samples. The graphs represent the means and SD from three independent experiments.

To examine whether HuR phosphorylation at Y200 was involved in these interactions, we transfected plasmids pFlag-HuR(WT), pFlag-HuR(Y68F) and pFlag-HuR(Y200F) and tested the binding of the tagged HuR with SIRT1 mRNA (left) and VHL mRNA (right) again by RIP analysis, but by using anti-Flag antibody. The efficiency of IP of the Flag-tagged proteins was also monitored (Supplementary Figure S4B). Interestingly, although proteins Flag-HuR(WT) and Flag-HuR(Y68F) showed the same pattern of binding as the endogenous HuR, Flag-HuR(Y200F) binding to the mRNAs was no longer repressed after menadione treatment (Figure 5C andD). These results suggest that HuR phosphorylation at Y200 not only prevented HuR localization in SGs, but it also reduced binding of HuR with target SIRT1 and VHL mRNAs.

HuR tyrosine phosphorylation influences target mRNA turnover

Because HuR is known to stabilize SIRT1 and VHL mRNAs (22,36), we examined the effect of HuR tyrosine phosphorylation on the stability of these target mRNAs. We measured their half-lives by quantifying the rate of decay after transcription was inhibited through the addition of actinomycin D (‘Materials and Methods’ section). Arsenite treatment, which enhanced HuR binding to these mRNAs, also increased their half-lives (by about twofold; Figure 6A). Menadione alone did not change the stability of target mRNAs, but cells in the menadione + arsenite treatment group showed lower stability for both mRNAs relative to the arsenite alone group (Figure 6A). By contrast, the stability of a control stable transcript, GAPDH mRNA, encoding a housekeeping protein, was not influenced by the above-mentioned treatments, demonstrating that not all mRNAs decreased rapidly in the presence of actinomycin D, and only select labile mRNAs displayed reduced stability (Figure 6A, bottom). The levels of a control short-lived mRNA (MYC mRNA, encoding the proto-oncogene c-Myc) showed reduced half-life in the absence of arsenite (Figure 6A, bottom). These results support the view that HuR binding increases the half-lives of SIRT1 and VHL mRNAs. +

Arsenite and menadione affect the levels and stability of HuR target mRNAs. (A) After treatment of arsenite and/or menadione, the half-lives (t1/2) of SIRT1 and VHL mRNAs (top), as well as the half-lives of a control stable mRNA (GAPDH mRNAs) and a control labile mRNA (MYC mRNA) (bottom) were quantified by measuring the time required to achieve a 50% reduction in transcript levels after adding actinomycin D at time 0 h. (B) Forty-eight hours after transfecting HeLa cells with plasmids to express Flag-HuR(WT) or Flag-HuR(Y200F), the steady-state levels of SIRT1 and VHL mRNAs were measured by RT-qPCR and normalized to the levels of GAPDH mRNA. The graphs represent the means and SD from three independent experiments.

Given the documented levels of HuR association with SIRT1 and VHL mRNAs (Figure 5) and the SIRT1 and VHL mRNA half-lives (Figure 6A), we investigated the influence of non-phosphorylatable HuR Y200F mutant on the abundance of these mRNAs. When Flag-HuR(WT) was expressed in HeLa cells, the levels of SIRT1 and VHL mRNAs rose after treatment with arsenite, but this increase was lost if cells were co-treated with menadione (Figure 6B). In contrast, when Flag-HuR(Y200F) was expressed, the arsenite-elicited increase in SIRT1 mRNA and VHL mRNA levels was refractory to menadione treatment, and the mRNAs remained significantly elevated (Figure 6B). In sum, these results indicate that HuR tyrosine phosphorylation at Y200, which excludes HuR from SGs, also promotes the dissociation of HuR from target transcripts (SIRT1 mRNA and VHL mRNA), or perhaps mobilizes HuR-SIRT1 mRNA and HuR-VHL mRNA complexes away from SGs, accelerating their degradation (Figure 7). +

Schematic representation of the proposed influence of JAK3 on HuR localization and RNA-binding activity. See text for details.

DISCUSSIONTyrosine-phosphorylation of HuR by JAK3

We have reported that tyrosine phosphorylation of HuR reduces its interaction with target mRNAs, leading to lower mRNA stability. The phosphorylation at a tyrosine was unexpected, as earlier work had only identified HuR as the substrate of serine and threonine phosphorylation by PKC, Chk2, p38 and Cdk1 [reviewed in (18)]. In contrast to the earlier phosphorylation events, HuR tyrosine phosphorylation is found to influence mRNA fate linked to the absence of HuR in SGs. JAK3, identified here as a kinase responsible for the tyrosine phosphorylation of HuR, is best known in immune cells, where it is activated following exposure to cytokines (37). However, JAK3 is also expressed in HeLa cells and its inhibition by ZM 449829 lowers pY-HuR levels. As identified by mass spec analysis, JAK3 phosphorylates three HuR residues (Y63, Y68, Y200), but it remains possible that other tyrosine kinases besides JAK3 can also phosphorylate HuR at tyrosines, although no such kinases have been identified to date. Because the ubiquitous HuR is abundant in immune cells, it will be interesting to test whether tyrosine phosphorylation of HuR at Y200 influences the response of immune cells to cytokines.

Treatment with arsenite or menadione for 45 min caused oxidative stress, and this effect was enhanced by joint treatment with both chemicals (Supplementary Figure S1B). Nonetheless, by 4 h after the drugs were removed from the culture medium, assessments of cell numbers and annexin V-positive cells revealed little or no toxicity (Supplementary Figure S1A, C and D). By 24 h after removing the drugs, cells treated with arsenite did not exhibit much toxicity, as measured by modest cell loss and the absence of annexin V-positive cells (Supplementary Figure S1C and D); however, simultaneous addition of menadione to arsenite-treated cells did prove toxic, as evidenced by the enhanced cell loss and the high percentage of annexin V-positive cells (Supplementary Figure S1C and D). These results indicate that SGs are a component of the stress-response program triggered by arsenite, which ultimately the cells survived. The concomitant treatment with menadione modified this stress-response program (in part by antagonizing the formation of HuR-positive SGs) and potentiated the toxicity of arsenite. It is plausible that the chemotherapeutic actions of menadione (38) are linked to the cytotoxicity caused by menadione, as it interferes with the cellular response to stress conditions.

HNS phosphorylation affects HuR localization and binding to mRNAs

It was somewhat surprising to discover that HuR binding to SIRT1 and VHL mRNAs was influenced by phosphorylation at Y200 (Figure 5), as this residue lies within the shuttling domain of HuR (the HNS) and not within one of the three RRMs. For example, previous reports had shown that phosphorylation at RRMs (S88 in RRM1, T118 in RRM2, S100 between RRM1 and RRM2 and S318 in RRM3) affected HuR binding to numerous mRNAs (18), while phosphorylation in the HNS region (S202, S221, S242), generally altered HuR the relative abundance of HuR in the nucleus compared with the cytoplasm (19–21). The finding that phosphorylation near the shuttling domain affects HuR binding suggests that pY200 could change the conformation of the RRMs in ways that lower their binding affinity for RNA. Alternatively, Y200 phosphorylation could mobilize HuR to areas of the cell that have reduced concentration of HuR target transcripts, and thus binding is reduced because mRNAs are unavailable. Distinguishing between these possibilities awaits further study.

The finding that the non-phosphorylatable HuR(Y200F) is found in SGs after arsenite + menadione, whereas the phosphorylatable counterpart, HuR(WT), is not, suggests that phosphorylation at Y200 actively excludes HuR from SGs. Although the molecular mediators of HuR exclusion from SGs are not identified in our experiments, we have evidence that menadione may block the assembly of other SG components, including TIA-1, G3BP and eIF3b (Figure 1B; Supplementary Figure S6A; data not shown). In fact, it is possible that JAK3 may block the assembly of multiple SG components, perhaps by phosphorylating them in a coordinated manner. In this regard, JAK3 was capable of phosphorylating TIA-1 in vitro (Supplementary Figure S6B). Therefore, it remains formally possible that in cells that form SGs, HuR is mobilized to SGs because the mRNAs that HuR associates with are actively recruited to, or ‘pulled to’, SGs. It is unknown at present whether JAK3 impairs the binding of HuR to mRNAs and for this reason, HuR is not mobilized to SGs, or instead JAK3 inhibits the mobilization of HuR to SGs and this in turn affects HuR binding to mRNAs locally enriched in SGs. Both possibilities agree with the notion that SGs are sites of mRNA reassortment and ‘triage’ (30), where mRNA-binding factors form different RNPs to accomplish molecular decisions on mRNA turnover and translational status.

HuR binding to mRNAs increased by stress, linked to stabilization

The discovery that treatment with arsenite, a strong oxidant, increased HuR binding to SIRT1 and VHL mRNAs was also against our expectation (Figure 5A and B; Supplementary Figure S5), as other stress agents (e.g. ionizing radiation and the oxidant hydrogen peroxide) instead triggered the dissociation of HuR from bound mRNAs (22). As dissociation of mRNAs was linked to the phosphorylation of HuR by Chk2, it is possible that arsenite inhibits Chk2 activity, while menadione reverses this inhibition in HeLa cells. Of course, arsenite and/or menadione could also affect the phosphorylation of HuR by other kinases (p38, PKC), which influence HuR–mRNA interactions. Studies are underway to investigate these possibilities, particularly given earlier reports documenting an increase in HuR binding to some mRNAs in response to certain stresses [e.g. HIF1A mRNA after hypoxia, MKP1 mRNA after hydrogen peroxide treatment (39,40)]. In sum, our findings add to a growing body of evidence that underscores the complex regulation of HuR by phosphorylation, and the impact of this modification on HuR localization, HuR binding to mRNAs and the fate of HuR target transcripts.

SUPPLEMENTARY DATA

Supplementary Data are available at NAR Online.

FUNDING

Funding for open access charge: National Institute on Aging-Intramural Research Program, National Institutes of Health.

Conflict of interest statement. None declared.

+ +Supplementary Material + + +Supplementary Data + + + + + + + + + ACKNOWLEDGEMENTS +

The authors thank P. Anderson (Brigham and Women's Hospital) for providing reagents and advice, and C.Y. Sasaki (NIA, NIH) for assistance with experiments. This work was entirely supported by the NIA-IRP, NIH.

+
+ + REFERENCES + + + + + + Wilkie + GS + + + Dickson + KS + + + Gray + NK + + + Regulation of mRNA translation by 5′- and 3′-UTR-binding factors + Trends Biochemi. Sci. + 2003 + 28 + 182 + 188 + + + + + + + + Wilusz + CJ + + + Wilusz + J + + + Bringing the role of mRNA decay in the control of gene expression into focus + Trends Genet. + 2004 + 20 + 491 + 497 + 15363903 + + + + + + + + Moore + MJ + + + From birth to death: the complex lives of eukaryotic mRNAs + Sci. Signal. + 2005 + 309 + 1514 + + + + + + + + Abdelmohsen + K + + + Kuwano + Y + + + Kim + HH + + + Gorospe + M + + + Posttranscriptional gene regulation by RNA-binding proteins during oxidative stress: implications for cellular senescence + Biol. Chem. + 2008 + 389 + 243 + 255 + 18177264 + + + + + + + + Lee + EK + + + Post-translational modifications of RNA-binding proteins and their roles in RNA granules + Curr. Protein Pept. Sci. + 2012 + 13 + 331 + 336 + 22708487 + + + + + + + + Srikantan + S + + + Gorospe + M + + + + + Bradshaw + RA + + + Dennis + EA + + + Regulation of mRNA turnover by cellular stress + Handbook of Cell Signaling + 2008 + Chapter 270 + + + + + + + + Izquierdo + JM + + + Hu antigen R (HuR) functions as an alternative pre-mRNA splicing regulator of Fas apoptosis, promoting receptor on exon definition + J. Biol. Chem. + 2008 + 283 + 19077 + 19084 + 18463097 + + + + + + + + Wang + H + + + Molfenter + J + + + Zhu + H + + + Lou + H + + + Promotion of exon 6 inclusion in HuD pre-mRNA by Hu protein family members + Nucleic Acids Res. + 2010 + 38 + 3760 + 3770 + 20159993 + + + + + + + + Mukherjee + N + + + Corcoran + DL + + + Nusbaum + JD + + + Reid + DW + + + Georgiev + S + + + Hafner + M + + + Ascano + M + Jr + + + Tuschl + T + + + Ohler + U + + + Keene + JD + + + Integrative regulatory mapping indicates that the RNA-binding protein HuR couples pre-mRNA processing and mRNA stability + Mol. Cell + 2011 + 43 + 327 + 339 + 21723170 + + + + + + + + López de Silanes + I + + + Zhan + M + + + Lal + A + + + Yang + X + + + Gorospe + M + + + Identification of a target RNA motif for RNA-binding protein HuR + Proc. Natl Acad. Sci. USA + 2004 + 101 + 2987 + 2992 + 14981256 + + + + + + + + Brennan + CM + + + Steitz + JA + + + HuR and mRNA stability + Cell. Mol. Life Sci. + 2001 + 58 + 266 + 277 + 11289308 + + + + + + + + Abdelmohsen + K + + + Gorospe + M + + + Posttranscriptional regulation of cancer traits by HuR + Wiley Interdiscip. Rev. RNA + 2010 + 1 + 214 + 229 + 21935886 + + + + + + + + Srikantan + S + + + Gorospe + M + + + HuR function in disease + Front. Biosci. + 2012 + 17 + 189 + 205 + + + + + + + + Gallouzi + IE + + + Steitz + JA + + + Delineation of mRNA export pathways by the use of cell-permeable peptides + Science + 2001 + 294 + 1895 + 1901 + 11729309 + + + + + + + + Fan + XC + + + Steitz + JA + + + HNS, a nuclearcytoplasmic shuttling sequence in HuR + Proc. Natl Acad. Sci. USA + 1998 + 95 + 15293 + 15298 + 9860962 + + + + + + + + Güttinger + S + + + Mühlhäusser + P + + + Koller-Eichhorn + R + + + Brennecke + J + + + Kutay + U + + + Transportin2 functions as importin and mediates nuclear import of HuR + Proc. Natl Acad. Sci. USA + 2004 + 101 + 2918 + 2923 + 14981248 + + + + + + + + Rebane + A + + + Aab + A + + + Steitz + JA + + + Transportins 1 and 2 are redundant nuclear import factors for hnRNP A1 and HuR + RNA + 2004 + 10 + 590 + 599 + 15037768 + + + + + + + + Eberhardt + W + + + Doller + A + + + Pfeilschifter + J + + + Regulation of the mRNA-binding protein HuR by posttranslational modification: spotlight on phosphorylation + Curr. Protein Pept. Sci. + 2012 + 13 + 380 + 390 + 22708484 + + + + + + + + Kim + HH + + + Abdelmohsen + K + + + Lal + A + + + Pullmann + R + Jr + + + Yang + X + + + Galban + S + + + Srikantan + S + + + Martindale + JL + + + Blethrow + J + + + Shokat + KM + + + + Nuclear HuR accumulation through phosphorylation by Cdk1 + Genes Dev. + 2008 + 22 + 1804 + 1815 + 18593881 + + + + + + + + Kim + HH + + + Yang + X + + + Kuwano + Y + + + Gorospe + M + + + Modification at HuR(S242) alters HuR localization and proliferative influence + Cell Cycle + 2008 + 7 + 3371 + 3377 + 18948743 + + + + + + + + Kim + HH + + + Gorospe + M + + + Phosphorylated HuR shuttles in cycles + Cell Cycle + 2008 + 7 + 3124 + 3126 + 18927508 + + + + + + + + Abdelmohsen + K + + + Pullmann + R + Jr + + + Lal + A + + + Kim + HH + + + Galban + S + + + Yang + X + + + Blethrow + JD + + + Walker + M + + + Shubert + J + + + Gillespie + DA + + + + Phosphorylation of HuR by Chk2 regulates SIRT1 expression + Mol. Cell + 2007 + 25 + 543 + 557 + 17317627 + + + + + + + + Masuda + K + + + Abdelmohsen + K + + + Kim + MM + + + Srikantan + S + + + Lee + EK + + + Tominaga + K + + + Selimyan + R + + + Martindale + JL + + + Yang + X + + + Lehrmann + E + + + + Global dissociation of HuR-mRNA complexes promotes cell survival after ionizing radiation + EMBO J. + 2011 + 30 + 1040 + 1053 + 21317874 + + + + + + + + Piecyk + M + + + Wax + S + + + Beck + AR + + + Kedersha + N + + + Gupta + M + + + Maritim + B + + + Chen + S + + + Gueydan + C + + + Kruys + V + + + Streuli + M + + + + TIA-1 is a translational silencer that selectively regulates the expression of TNF-α + EMBO J. + 2000 + 19 + 4154 + 4163 + 10921895 + + + + + + + + Hinman + MN + + + Lou + H + + + Diverse molecular functions of Hu proteins + Cell Mol. Life Sci. + 2008 + 65 + 3168 + 3181 + 18581050 + + + + + + + + Lian + XJ + + + Gallouzi + IE + + + Oxidative stress increases the number of stress granules in senescent cells and triggers a rapid decrease in p21waf1/cip1 translation + J. Biol. Chem. + 2009 + 284 + 8877 + 8887 + 19176530 + + + + + + + + Lu + L + + + Wang + S + + + Zheng + L + + + Li + X + + + Suswam + EA + + + Zhang + X + + + Wheeler + CG + + + Nabors + LB + + + Filippova + N + + + King + PH + + + Amyotrophic lateral sclerosis-linked mutant SOD1 sequesters Hu antigen R (HuR) and TIA-1-related protein (TIAR): implications for impaired post-transcriptional regulation of vascular endothelial growth factor + J. Biol. Chem. + 2009 + 284 + 33989 + 33998 + 19805546 + + + + + + + + Bhattacharyya + SN + + + Habermacher + R + + + Martine + U + + + Closs + EI + + + Filipowicz + W + + + Relief of microRNA-mediated translational repression in human cells subjected to stress + Cell + 2006 + 125 + 1111 + 1124 + 16777601 + + + + + + + + Stoecklin + G + + + Stubbs + T + + + Kedersha + N + + + Wax + S + + + Rigby + WF + + + Blackwell + TK + + + Anderson + P + + + MK2-induced tristetraprolin:14–3-3 complexes prevent stress granule association and ARE-mRNA decay + EMBO J. + 2004 + 23 + 1313 + 1324 + 15014438 + + + + + + + + Anderson + P + + + Kedersha + N + + + RNA granules: post-transcriptional and epigenetic modulators of gene expression + Nat. Rev. Mol. Cell Biol. + 2009 + 10 + 430 + 436 + 19461665 + + + + + + + + Yoon + JH + + + Choi + EJ + + + Parker + R + + + Dcp2 phosphorylation by Ste20 modulates stress granule assembly and mRNA decay in Saccharomyces cerevisiae + J. Cell Biol. + 2010 + 189 + 813 + 827 + 20513766 + + + + + + + + Wiśniewski + JR + + + Zougman + A + + + Nagaraj + N + + + Mann + M + + + Universal sample preparation method for proteome analysis + Nat. Methods. + 2009 + 6 + 359 + 362 + 19377485 + + + + + + + + Kedersha + N + + + Chen + S + + + Gilks + N + + + Li + W + + + Miller + IJ + + + Stahl + J + + + Anderson + P + + + Evidence that ternary complex (eIF2-GTP-tRNA(i)(Met))-deficient preinitiation complexes are core constituents of mammalian stress granules + Mol. Biol. Cell + 2002 + 13 + 195 + 210 + 11809833 + + + + + + + + Dang + Y + + + Kedersha + N + + + Low + WK + + + Romo + D + + + Gorospe + M + + + Kaufman + R + + + Anderson + P + + + Liu + JO + + + Eukaryotic initiation factor 2alpha-independent pathway of stress granule induction by the natural product pateamine A + J. Biol. Chem. + 2006 + 281 + 32870 + 32878 + 16951406 + + + + + + + + Abdelmohsen + K + + + Srikantan + S + + + Tominaga + K + + + Kang + MJ + + + Yaniv + Y + + + Martindale + JL + + + Yang + X + + + Park + SS + + + Becker + KG + + + Subramanian + M + + + + Growth inhibition by miR-519 via multiple p21-inducing pathways + Mol. Cell. Biol. + 2012 + 32 + 2530 + 2548 + 22547681 + + + + + + + + Abdelmohsen + K + + + Srikantan + S + + + Yang + X + + + Lal + A + + + Kim + HH + + + Kuwano + Y + + + Galban + S + + + Becker + KG + + + Kamara + D + + + de Cabo + R + + + + Ubiquitin-mediated proteolysis of HuR by heat shock + EMBO J. + 2009 + 28 + 1271 + 1282 + 19322201 + + + + + + + + O'Shea + JJ + + + Holland + SM + + + Staudt + LM + + + JAKs and STATs in immunity, immunodeficiency, and cancer + N. Engl. J. Med. + 2013 + 368 + 161 + 170 + 23301733 + + + + + + + + Nutter + LM + + + Cheng + AL + + + Hung + HL + + + Hsieh + RK + + + Ngo + EO + + + Liu + TW + + + Menadione: spectrum of anticancer activity and effects on nucleotide metabolism in human neoplastic cell lines + Biochem. Pharmacol. + 1991 + 41 + 1283 + 1292 + 2018560 + + + + + + + + Galbán + S + + + Kuwano + Y + + + Pullmann + R + Jr + + + Martindale + JL + + + Kim + HH + + + Lal + A + + + Abdelmohsen + K + + + Yang + X + + + Dang + Y + + + Liu + JO + + + + RNA-binding proteins HuR and PTB promote the translation of hypoxia-inducible factor 1α + Mol. Cell. Biol. + 2008 + 28 + 93 + 107 + 17967866 + + + + + + + + Kuwano + Y + + + Kuwano + Y + + + Pullmann + R + Jr + + + Martindale + JL + + + Kim + HH + + + Lal + A + + + Abdelmohsen + K + + + Yang + X + + + Dang + Y + + + Liu + JO + + + + MKP-1 mRNA stabilization and translational control by RNA-binding proteins HuR and NF90 + Mol. Cell. Biol. + 2008 + 28 + 4562 + 4575 + 18490444 + + + +
+
+ +
\ No newline at end of file diff -pruN 1.7.1-2/tests/nxml/no-processing-instructions.xml 3.0.2-1/tests/nxml/no-processing-instructions.xml --- 1.7.1-2/tests/nxml/no-processing-instructions.xml 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/tests/nxml/no-processing-instructions.xml 2015-05-14 20:34:50.000000000 +0000 @@ -0,0 +1,39 @@ + + + 2015-05-06T21:47:12Z + http://www.ncbi.nlm.nih.gov/oai/oai.cgi + + +
+ oai:pubmedcentral.nih.gov:3902907 + 2014-01-27 + nar + pmc-open +
+ +
+ + + Nucleic Acids Res + Nucleic Acids Res + nar + nar + + Nucleic Acids Research + + 0305-1048 + 1362-4962 + + Oxford University Press + + + +
+
+
+
+
diff -pruN 1.7.1-2/tests/nxml/processing-instructions.xml 3.0.2-1/tests/nxml/processing-instructions.xml --- 1.7.1-2/tests/nxml/processing-instructions.xml 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/tests/nxml/processing-instructions.xml 2015-05-14 20:34:50.000000000 +0000 @@ -0,0 +1,24 @@ +2015-05-06T21:47:12Zhttp://www.ncbi.nlm.nih.gov/oai/oai.cgi
oai:pubmedcentral.nih.gov:39029072014-01-27narpmc-open
+ + + + Nucleic Acids Res + Nucleic Acids Res + nar + nar + + Nucleic Acids Research + + 0305-1048 + 1362-4962 + + Oxford University Press + + + +
+
+
+
+
+ diff -pruN 1.7.1-2/version.lisp-expr 3.0.2-1/version.lisp-expr --- 1.7.1-2/version.lisp-expr 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/version.lisp-expr 2017-12-18 00:20:17.000000000 +0000 @@ -0,0 +1 @@ +"3.0.2" diff -pruN 1.7.1-2/web-page/clnet-page.shtml 3.0.2-1/web-page/clnet-page.shtml --- 1.7.1-2/web-page/clnet-page.shtml 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/web-page/clnet-page.shtml 2017-12-18 00:19:57.000000000 +0000 @@ -0,0 +1,123 @@ + + + + + +xmls - a small xml parser for common lisp + + + + + +

XMLS, a simple XML parser for Common Lisp

+

Downloads

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
latest --> Better backwards + compatibility (see manual for details). Additional export over 3.0.1xmls-3.0.2sourcesignaturemd5
Better backwards + compatibility (see manual for details).xmls-3.0.1sourcesignaturemd5
+ xmls-3.0sourcesignaturemd5
 xmls-1.7.1sourcesignaturemd5
 xmls-1.5sourcesignaturemd5
 xmls-1.4sourcesignaturemd5
 xmls-1.3sourcesignaturemd5
 xmls-1.2sourcesignaturemd5
 xmls-1.1sourcesignaturemd5
 xmls-1.0sourcesignaturemd5
+ +

Source repository

+ +

There is no publicly-accessible source repository for XMLS. Please submit +patches to the maintainer. The likelihood of getting patches doesn't justify +the effort of maintaining such a source repository. If this is a real problem +for you, please contact the maintainer and we will arrange to provide you access to +the private repository.

+ + + + + + + \ No newline at end of file diff -pruN 1.7.1-2/web-page/styles.css 3.0.2-1/web-page/styles.css --- 1.7.1-2/web-page/styles.css 1970-01-01 00:00:00.000000000 +0000 +++ 3.0.2-1/web-page/styles.css 2017-12-14 03:20:17.000000000 +0000 @@ -0,0 +1,110 @@ +/* $Id: mcp.css,v 1.7 2002/07/26 22:29:27 miles Exp $ */ + +/* + * global styles + */ +body +{ + background: white; + color: black; + font-size: 15px; + font-family: serif; + margin: 0; padding: 0; +} + +a[href] +{ + border-bottom: 1px dotted rgb(192,72,23); + color: rgb(240,156,0); + font-weight: bold; + text-decoration: none; +} +a[href]:hover { color: #fff; background: black; font-weight: bold; text-decoration: none } +a[href]:visited { color: rgb(255,176,20); font-weight: bold; text-decoration: none } + +img { border: 1px solid black } + +h1 { color: rgb(192,72,23) } +h2,h3 { color: #777; } +h2, h3 { text-transform: lowercase } + +ul { list-style-type: square; } + +pre +{ + background: #ffd; + border: 1px solid #bba; + display: table; + margin: 0.25em 1em; + padding: 0.25em; +} + +.logo +{ + display: block; + float: left; + font-family: verdana; + padding: 0.1em; +} +.logo span +{ + color: rgb(255,180,0); + font-size: 300%; font-variant: small-caps; font-weight: bold; + padding: 5px 10px; +} + +/* + * general layout stuff + */ +div#nav +{ + background: rgb(124,113,81); + color: white; + border-bottom: 5px solid black; + font-family: sans-serif; + margin: 0; padding: 0 1em; + height: 4em; +} +div#nav a +{ + border: 0; + color: rgb(203,189,168); + display: block; + float: left; + font-size: 120%; + font-family: sans-serif; + margin: 1em 1em; padding: 0; + text-align: center; + text-decoration: none; + width: 6em; height: 1.5em; +} +div#nav a:hover +{ + background: transparent; + color: white; + text-decoration: none +} + +div#content +{ + margin: 0 auto; padding: 0 2em; +} + +#footer { border-top: 1px solid #ccc; padding: 0.5em 1em; margin: 1em } +#footer img { border: 0; } +#footer a[href] { border: 0; } +#footer a[href]:hover { background: transparent; } + +/* + * rpm pages + */ +table.rpmtable +{ + margin: 1em; +} +table.rpmtable td +{ + padding: 2px 0.5em; +} +.note { color: red; font-weight: bold; font-size: 80%; font-style: italic; } + diff -pruN 1.7.1-2/xmlrep-helpers.lisp 3.0.2-1/xmlrep-helpers.lisp --- 1.7.1-2/xmlrep-helpers.lisp 2014-05-14 16:26:47.000000000 +0000 +++ 3.0.2-1/xmlrep-helpers.lisp 2016-11-21 19:24:06.000000000 +0000 @@ -13,16 +13,19 @@ (in-package :xmls) (defun make-xmlrep (tag &key attribs children) - `(,tag ,attribs ,@children)) + (make-node :name tag :attrs attribs :children children)) (defun xmlrep-add-child! (xmlrep child) - (nconc xmlrep (list child))) + (setf (node-children xmlrep) + (append (node-children xmlrep) + (list child)))) (defun xmlrep-tag (treenode) (node-name treenode)) (defun xmlrep-tagmatch (tag treenode) - (string-equal tag (xmlrep-tag treenode))) + (unless (stringp treenode) ; child nodes to XMLREPs could be strings or nodes + (string-equal tag (xmlrep-tag treenode)))) (defun xmlrep-attribs (treenode) (node-attrs treenode)) @@ -31,16 +34,19 @@ (setf (node-attrs treenode) attribs)) (defun xmlrep-children (treenode) - (cddr treenode)) + (node-children treenode)) (defun (setf xmlrep-children) (children treenode) - (setf (cddr treenode) children)) + (setf (node-children treenode) children)) -(defun xmlrep-string-child (treenode) +(defun xmlrep-string-child (treenode &optional (if-unfound :error)) (let ((children (xmlrep-children treenode))) (if (and (eq (length children) 1) (typep (first children) 'string)) (first children) - (error "Cound't find value of ~A" treenode)))) + (if (eq if-unfound :error) + (error "Node does not have a single string child: ~a" treenode) + if-unfound) + ))) (defun xmlrep-integer-child (treenode) (parse-integer (xmlrep-string-child treenode))) diff -pruN 1.7.1-2/xmls.asd 3.0.2-1/xmls.asd --- 1.7.1-2/xmls.asd 2015-03-25 12:55:54.000000000 +0000 +++ 3.0.2-1/xmls.asd 2017-12-17 22:55:24.000000000 +0000 @@ -1,5 +1,5 @@ ;;; -*- Lisp -*- -;;; $Id: xmls.asd 1818 2015-03-25 12:55:54Z rpgoldman $ +;;; $Id: xmls.asd 2399 2017-12-17 22:55:24Z rpgoldman $ (defpackage #:xmls-system (:use #:cl #:asdf)) (in-package :xmls-system) @@ -9,6 +9,8 @@ (:documentation "Component class to quash some ACL warnings.") ) +(pushnew :xmls-nodes-are-structs *features*) + ;#+allegro ;(defmethod perform :around ((op compile-op) (file xmls-source-file)) ; "Quash ACL warning about nested reader macros." @@ -16,8 +18,10 @@ ; (call-next-method))) ; (defsystem :xmls - :version "1.7.1" - :in-order-to ((test-op (test-op "xmls/test"))) + :version (:read-file-form "version.lisp-expr") + :license "BSD" + :maintainer "Robert P. Goldman " + :in-order-to ((test-op (test-op "xmls/test") (test-op "xmls/unit-test"))) :components ((:file "xmls" #+asdf-unicode :encoding #+asdf-unicode :utf-8) (:file "xmlrep-helpers" @@ -27,11 +31,25 @@ (defsystem :xmls/test :perform (test-op (op c) (declare (ignorable op c)) - (uiop:symbol-call :xmls :test t)) + (unless + (uiop:symbol-call :xmls :test :interactive t) + (error "Failed XMLS test."))) :depends-on (xmls)) +(defsystem xmls/unit-test + :depends-on (xmls fiveam) + :perform (test-op (op c) + (declare (ignorable op c)) + (uiop:symbol-call :fiveam :run! (uiop:find-symbol* '#:xmls-test :xmls-test))) + :components ((:file "fiveam-tests"))) - - - - +(defsystem :xmls/octets + :components ((:file "octets-xml")) + ;; detecting the encoding doesn't work properly with flexi-streams 1.0.14 + :depends-on ("xmls" (:version "flexi-streams" "1.0.15") "cl-ppcre") + :version (:read-file-form "version.lisp-expr") + :perform (test-op (op c) + (declare (ignorable op c)) + (unless + (uiop:symbol-call :xmls/octets :test) + (error "Test failures in XMLS/octets.")))) diff -pruN 1.7.1-2/xmls.lisp 3.0.2-1/xmls.lisp --- 1.7.1-2/xmls.lisp 2015-03-25 12:55:40.000000000 +0000 +++ 3.0.2-1/xmls.lisp 2017-12-18 00:17:36.000000000 +0000 @@ -1,4 +1,4 @@ -;;; $Id: xmls.lisp 1817 2015-03-25 12:55:40Z rpgoldman $ +;;; $Id: xmls.lisp 2400 2017-12-18 00:17:36Z rpgoldman $ ;;; xmls ;;; a simple xml parser for common lisp ;;; author: Miles Egan @@ -6,7 +6,20 @@ (defpackage xmls (:use :cl) ; :cl-user + (:shadow #:read-char #:unread-char) (:export node-name node-ns node-attrs node-children make-node parse toxml write-xml + node-p nodelist->node + node->nodelist + node ; needed to support use in typep + + ;; backwards compatibility + #:parse-to-list + + ;; processing instruction objects + proc-inst-p + proc-inst-target + proc-inst-contents + write-prologue write-prolog ;; additional helpers from Robert P. Goldman @@ -30,6 +43,7 @@ (defvar *strip-comments* t) (defvar *compress-whitespace* t) (defvar *test-verbose* nil) +(defvar *discard-processing-instructions*) (defvar *entities* #(("lt;" #\<) ("gt;" #\>) @@ -59,49 +73,94 @@ finally (return table)) table)) +;;;--------------------------------------------------------------------------- +;;; DYNAMIC VARIABLES +;;;--------------------------------------------------------------------------- +(defvar *parser-stream* nil + "The currently-being-parsed stream. Used so that we can appropriately track +the line number.") +(defvar *parser-line-number* nil) + + + ;;;----------------------------------------------------------------------------- ;;; CONDITIONS ;;;----------------------------------------------------------------------------- (define-condition xml-parse-error (error) ((line :initarg :line - :reader error-line))) + :initform nil + :reader error-line)) + (:report (lambda (xpe stream) + (format stream "XML-PARSE-ERROR~@[ at line ~d~]" + (error-line xpe))))) + +(defmethod initialize-instance :after ((obj xml-parse-error) &key) + (unless (slot-value obj 'line) + (when *parser-line-number* + (setf (slot-value obj 'line) *parser-line-number*)))) ;;;----------------------------------------------------------------------------- ;;; NODE INTERFACE ;;;----------------------------------------------------------------------------- +(defstruct (node (:constructor %make-node)) + name + ns + attrs + children) + (defun make-node (&key name ns attrs child children) "Convenience function for creating a new xml node." - (list* (if ns (cons name ns) name) - attrs - (if child - (list child) - children))) - -(defun node-name (elem) - (if (consp (car elem)) - (caar elem) - (car elem))) - -(defun node-ns (elem) - (if (consp (car elem)) - (cdar elem) - nil)) - -(defun (setf node-ns) (ns elem) - (setf (car elem) - (cons (node-name elem) ns))) - -(defun node-attrs (elem) (second elem)) - -(defun (setf node-attrs) (attrs elem) - (setf (second elem) attrs)) - -(defun node-children (elem) - (cddr elem)) - -(defun (setf node-children) (children elem) - (rplacd (cdr elem) children) - (node-children elem)) + (when (and child children) + (error "Cannot specify both :child and :children for MAKE-NODE.")) + (let ((children (if child + (list child) + children))) + (%make-node :name name :ns ns + :children children + :attrs attrs))) + +(defun nodelist->node (nodelist) + "Take old-style list representation of XMLS nodes and translate it +into a NODE." + (if (stringp nodelist) + ;; child is a string -- a literal child + ;; FIXME: is that the right XML jargon? + nodelist + (make-node :name (if (consp (car nodelist)) + (caar nodelist) + (car nodelist)) + :ns (if (consp (car nodelist)) + (cdar nodelist) + nil) + :children (mapcar 'nodelist->node (cddr nodelist)) + :attrs (second nodelist)))) + +(defun node->nodelist (node) + "Backwards compatibility function. Will take a NODE \(the output of +PARSE\), and translate it into a list structure that looks like the +output of PARSE from XMLS 1.x. This should only be needed if there's +client code that didn't obey the API and instead directly accessed the +Lisp list structures that XMLS used to produce. Such code should be +fixed." + (etypecase node + (string node) + (node + (list* (if (node-ns node) (cons (node-name node) (node-ns node)) + (node-name node)) + (node-attrs node) + (mapcar 'node->nodelist (node-children node)))))) + + +;;;----------------------------------------------------------------------------- + +;;;--------------------------------------------------------------------------- +;;; XML Processing Instruction +;;;--------------------------------------------------------------------------- +(defstruct proc-inst + (target "" :type string) + (contents "" :type string) + ) + ;;;----------------------------------------------------------------------------- ;;; UTILITY FUNCTIONS @@ -185,7 +244,7 @@ "Renders a lisp node tree to an xml string stream." (if (> indent 0) (incf indent)) (etypecase e - (list + (node (progn (dotimes (i (* 2 (- indent 2))) (write-char #\Space s)) @@ -267,6 +326,34 @@ character translation." until (char= char #\;) finally (return (resolve-entity (coerce ent 'simple-string))))))) +;;;--------------------------------------------------------------------------- +;;; Shadow READ-CHAR and UNREAD-CHAR so we can count lines while we parse... +;;;--------------------------------------------------------------------------- +(defun read-char (&optional (stream *standard-input*) (eof-error-p t) eof-value recursive-p) + (let ((eof-p nil)) + (let ((c + (catch 'char-return + (handler-bind + ((end-of-file + #'(lambda (e) + (declare (ignore e)) + (unless eof-error-p + (setf eof-p t) + (throw 'char-return eof-value))))) + (common-lisp:read-char stream t nil recursive-p))))) + (when (and (eq stream *parser-stream*) + (not eof-p) + (char= c #\newline)) + (incf *parser-line-number*)) + c))) + +(defun unread-char (char &optional (stream *standard-input*)) + (when (char= char #\newline) + (decf *parser-line-number*)) + (common-lisp:unread-char char stream)) + +;;;END shadowing-------------------------------------------------------------- + (define-symbol-macro next-char (peek-stream (state-stream s))) (defmacro eat () @@ -514,57 +601,9 @@ character translation." t) (make-element :type 'comment))) -;;; the following is buggy, because it does not properly back up when it gets a -;;; mismatch. An example buggy string is: "" -;;; [2011/02/21:rpg] -;; (defrule comment-or-cdata () -;; (and -;; (peek #\!) -;; (must (or (comment s) -;; (and -;; (match-seq #\[ #\C #\D #\A #\T #\A #\[) -;; (loop with data = (make-extendable-string 50) -;; with state = 0 -;; do (case state -;; (0 (cond ((match #\]) -;; (dbg :cdata "Match #\], go to state 1.") -;; (incf state)) -;; (t -;; (push-string (eat) data)))) -;; (1 (cond ((match #\]) -;; (dbg :cdata "Match second #\], go to state 2.") -;; (incf state)) -;; (t -;; (dbg :cdata "Fail to match second #\], go to state 0.") -;; (setf state 0) -;; ;; dump the first close-bracket -;; (push-string #\] data) -;; ;; just go back to the matching process [2011/02/21:rpg] -;; ;; (push-string (eat) data) -;; ))) -;; (2 (cond ((match #\>) -;; (dbg :cdata "Finish closing of CDATA.") -;; (incf state)) -;; (t -;; (dbg :cdata "Fail to find >, return to state 0.") -;; (setf state 0) -;; ;; the FIRST close-bracket doesn't start a match -;; (push-string #\] data) -;; ;; start reading again from the second close-bracket, which might -;; ;; start a match... [2011/02/21:rpg] -;; (puke #\]) -;; ;; (push-string (eat) data) -;; )))) -;; until (eql state 3) -;; finally (return (make-element -;; :type 'cdata -;; :val (coerce data 'simple-string))))))))) - -;;; I was unable to figure out how to rejigger this backtracking lexer because -;;; of the possible need to do multiple step backup. Instead, for the CDATA -;;; matching of ]]> I by hand generated an NFA, and then determinized it (also -;;; by hand). Then I did a simpler thing of just pushing ALL the data onto the -;;; data string, and truncating it when done. +;;; For the CDATA matching of ]]> I by hand generated an NFA, and then +;;; determinized it (also by hand). Then I did a simpler thing of just pushing +;;; ALL the data onto the data string, and truncating it when done. (defrule comment-or-cdata () (and (peek #\!) @@ -615,6 +654,7 @@ character translation." (defrule content () (if (match #\<) (must (or (comment-or-cdata s) + (processing-instruction s) (element s) (end-tag s))) (or (let (content) @@ -644,8 +684,13 @@ character translation." while c do (etypecase c (element (case (element-type c) - ('end-tag + (end-tag (return (setf end-name (element-val c)))) + ;; processing instructions may be discarded + (pi + (unless *discard-processing-instructions* + (when (element-val c) + (push (element-val c) children)))) (t (if (element-val c) (push (element-val c) children))))))) (string= (node-name elem) end-name))) @@ -654,26 +699,55 @@ character translation." (setf (node-children elem) (nreverse children)) (make-element :type 'elem :val elem))))) -(defrule processing-instruction-or-xmldecl () - (let (name) +(defrule processing-instruction () + (let (name contents) (and (match #\?) (setf name (name s)) - (none-or-more s #'ws-attr-or-nsdecl) - (match-seq #\? #\>) - (make-element :type 'pi :val name)))) - -(defrule processing-instruction () - (let ((p (processing-instruction-or-xmldecl s))) - (and p - (not (string= (element-val p) "xml")) - p))) + (not (string= name "xml")) + ;; contents of a processing instruction can be arbitrary stuff, as long + ;; as it doesn't contain ?>... + (setf contents (pi-contents s)) + ;; if we get here, we have eaten ?> off the input in the course of + ;; processing PI-CONTENTS + (make-element :type 'pi :val (make-proc-inst :target name :contents contents))))) + +(defrule pi-contents () + (loop with data = (make-extendable-string 50) + with state = 0 + for char = (eat) + do (push-string char data) + do (ecase state + (0 + (case char + (#\? + (dbg :pi-contents "State 0 Match #\?, go to state 1.") + (setf state 1)) + (otherwise + (dbg :pi-contents "State 0 ~c, go to (remain in) state 0." char)))) + (1 + (case char + (#\> + (dbg :pi-contents "State 1 Match #\>, done.") + (setf state 2)) + (otherwise + (dbg :pi-contents "State 1, ~c, do not match #\>, return to 0." char) + (setf state 0))))) + until (eql state 2) + finally (return (coerce + ;; rip the ?> off the end of the data and return it... + (subseq data 0 (max 0 (- (fill-pointer data) 2))) + 'simple-string)))) (defrule xmldecl () - (let ((p (processing-instruction-or-xmldecl s))) - (and p - (string= (element-val p) "xml") - p))) + (let (name contents) + (and + (match #\?) + (setf name (name s)) + (string= name "xml") + (setf contents (none-or-more s #'ws-attr-or-nsdecl)) + (match-seq #\? #\>) + (make-element :type 'xmldecl :val contents)))) (defrule comment-or-doctype () ;; skip dtd - bail out to comment if it's a comment @@ -702,13 +776,19 @@ character translation." (defrule document () (let (elem) (if (match #\<) - (must (or (processing-instruction-or-xmldecl s) + (must (or (xmldecl s) (comment-or-doctype s) (setf elem (element s))))) + ;; NOTE: I don't understand this: it seems to parse arbitrary crap (unless elem (loop for c = (misc s) - while c do (if (eql (element-type c) 'elem) - (return (setf elem c))))) + while c + do (cond ((eql (element-type c) 'elem) + (return (setf elem c))) + ((and (eql (element-type c) 'pi) + (not *discard-processing-instructions*)) + (return (setf elem c)))))) + (and elem (element-val elem)))) ;;;----------------------------------------------------------------------------- @@ -737,25 +817,66 @@ character translation." (with-output-to-string (s) (write-xml e s :indent indent))) -(defun parse (s &key (compress-whitespace t)) +(defun parse (s &key (compress-whitespace t) (quash-errors t)) "Parses the supplied stream or string into a lisp node tree." - (let ((*compress-whitespace* compress-whitespace) - (stream - (etypecase s - (string (make-string-input-stream s)) - (stream s)))) - (handler-case - (document (make-state :stream stream)) - (end-of-file () nil) - (xml-parse-error () nil)))) - -#+nil -(progn - (trace end-tag comment comment-or-doctype content name xmldecl misc) - (trace processing-instruction processing-instruction-or-xmldecl element start-tag ws element-val)) + (let* ((*compress-whitespace* compress-whitespace) + (*discard-processing-instructions* t) + (stream + (etypecase s + (string (make-string-input-stream s)) + (stream s))) + (*parser-stream* stream) + (*parser-line-number* 1)) + (if quash-errors + (handler-case + (document (make-state :stream stream)) + (end-of-file () nil) + (xml-parse-error () nil)) + (document (make-state :stream stream))))) + +(defun parse-to-list (&rest args) + (node->nodelist (apply #'parse args))) + +(defparameter *test-files* + (mapcar #'(lambda (x) (asdf:system-relative-pathname "xmls" (format nil "tests/~a" x))) + (list "ant/build.xml" + "beep/greeting1.xml" + "beep/msg1.xml" + "cdata/cdata1.xml" + "char-encoding/flux-test-utf-8.xml" + "dav/propfind1.xml" + "dav/propfind2r.xml" + "dav/propfind3.xml" + "large/two_gent.xml" + "misc/entity.xml" + "misc/example.xml" + "misc/minimal.xml" + "misc/minimal1.xml" + "misc/minimal2.xml" + "misc/minimal3.xml" + "misc/whitespace.xml" + "namespace/namespace1.xml" + "namespace/namespace2.xml" + "namespace/namespace3.xml" + "nxml/genetics-article.xml" + "nxml/no-processing-instructions.xml" + "nxml/processing-instructions.xml" + "rss.xml" + "soap/soap1.xml" + "soap/soap2.xml" + "soap/soap3.xml" + "soap/soap4.xml" + "soap/soap5.xml" + "soap/soap6.xml" + "xml-rpc/array.xml" + "xml-rpc/blogger1.xml" + "xml-rpc/fault.xml" + "xml-rpc/methodCall.xml" + "xml-rpc/methodResponse.xml" + "xml-rpc/struct.xml"))) #+(or sbcl cmu allegro abcl ccl clisp) -(defun test (&optional interactive) +(defun test (&key interactive (test-files *test-files*)) "Run the test suite. If it fails, either return NIL \(if INTERACTIVE\), otherwise exit with an error exit status." ;;(sb-profile:profile "XMLS") @@ -763,40 +884,63 @@ otherwise exit with an error exit status #+clisp (pprint ext:*args*) (let ((exit-code 0)) (dolist (test - #-(or ccl clisp) - (cdr - #+sbcl sb-ext:*posix-argv* - #+abcl extensions:*command-line-argument-list* - #+cmu (subseq extensions:*command-line-strings* 4) - #+allegro (sys:command-line-arguments)) - #+clisp ext:*args* - #+ccl - ccl:*unprocessed-command-line-arguments*) + (or test-files + #-(or ccl clisp) + (cdr + #+sbcl (member "--" sb-ext:*posix-argv* :test 'equal) + #+abcl extensions:*command-line-argument-list* + #+cmu (member "--" extensions:*command-line-strings* :test 'equal) + #+allegro (sys:command-line-arguments) + #+clisp ext:*args* + #+ccl + ccl:*unprocessed-command-line-arguments*))) + (catch 'test-failure + (handler-bind ((error #'(lambda (c) + (format t "FAILED with error:~%~a~%" c) + (setf exit-code 1) + (throw 'test-failure nil)))) + (with-open-file (str test :direction :input) + (if *test-verbose* + (let ((parsed (parse str :compress-whitespace t))) + (if parsed + (format t "~A~%" (toxml parsed :indent t)) + (progn + (format t "~&Failed to parse ~A~%" test) + (setf exit-code 1)))) + (progn + (format t "~40A" (concatenate 'string (namestring test) "... ")) + (force-output) + (cond ((parse str) + (format t "ok~%")) + (t + (setf exit-code 1) + (format t "FAILED!~%")))))) + (with-open-file (str test :direction :input) + (if *test-verbose* + (let ((parsed (parse-to-list str :compress-whitespace t))) + (if parsed + (format t "~A~%" (toxml parsed :indent t)) + (progn + (format t "~&Failed to parse ~A~%" test) + (setf exit-code 1)))) + (progn + (format t "~40A" (concatenate 'string (namestring test) "... ")) + (force-output) + (cond ((parse-to-list str) + (format t "ok~%")) + (t + (setf exit-code 1) + (format t "FAILED!~%"))))))))) + (catch 'test-failure (handler-bind ((error #'(lambda (c) (format t "FAILED with error:~%~S~%" c) + (setf exit-code 1) (throw 'test-failure nil)))) - (unless (search "CVS" test) - (catch 'test-failure - (if *test-verbose* - (format t "~A~%" (toxml (parse (open test) :compress-whitespace t) :indent t)) - (progn - (format t "~40A" (concatenate 'string test "... ")) - (force-output) - (cond ((parse (open test)) - (format t "ok~%")) - (t - (setf exit-code 1) - (format t "FAILED!~%"))))))))) - (handler-bind ((error #'(lambda (c) - (format t "FAILED with error:~%~S~%" c) - (setf exit-code 1) - (throw 'test-failure nil)))) - (catch 'test-failure - (format t "~40A" "Escaped writing...") - (force-output) - (with-output-to-string (str) - (write-escaped "ÄΩ" str)) - (format t "ok~%"))) + (format t "~40A" "Escaped writing...") + (force-output) + (with-output-to-string (str) + (write-escaped "ÄΩ" str)) + (format t "ok~%"))) (if interactive (zerop exit-code) - (uiop:quit exit-code)))) + (uiop:quit exit-code))))