diff options
author | Vincent Ambo <tazjin@google.com> | 2020-01-22T00·49+0000 |
---|---|---|
committer | Vincent Ambo <tazjin@google.com> | 2020-01-22T00·49+0000 |
commit | 437efa7686f62c88f6b377a255715fa0c28ed2c7 (patch) | |
tree | caba3ba35513c9fc794ff8d78c82b67b274bcd52 /third_party/lisp/s-xml/examples/counter.lisp | |
parent | fe3ea06cbc32c9b727549a6505e69234f3072f6f (diff) |
feat(third_party/lisp/s-xml): Check in sources & derivation r/438
Checked in the sources for this because it is tracked upstream in CVS and I can't be bothered to deal with that right now.
Diffstat (limited to 'third_party/lisp/s-xml/examples/counter.lisp')
-rw-r--r-- | third_party/lisp/s-xml/examples/counter.lisp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/third_party/lisp/s-xml/examples/counter.lisp b/third_party/lisp/s-xml/examples/counter.lisp new file mode 100644 index 000000000000..b26453e6ea66 --- /dev/null +++ b/third_party/lisp/s-xml/examples/counter.lisp @@ -0,0 +1,47 @@ +;;;; -*- mode: lisp -*- +;;;; +;;;; $Id: counter.lisp,v 1.2 2004/06/11 11:14:43 scaekenberghe Exp $ +;;;; +;;;; A simple SSAX counter example that can be used as a performance test +;;;; +;;;; Copyright (C) 2004 Sven Van Caekenberghe, Beta Nine BVBA. +;;;; +;;;; You are granted the rights to distribute and use this software +;;;; as governed by the terms of the Lisp Lesser General Public License +;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL. + +(in-package :s-xml) + +(defclass count-xml-seed () + ((elements :initform 0) + (attributes :initform 0) + (characters :initform 0))) + +(defun count-xml-new-element-hook (name attributes seed) + (declare (ignore name)) + (incf (slot-value seed 'elements)) + (incf (slot-value seed 'attributes) (length attributes)) + seed) + +(defun count-xml-text-hook (string seed) + (incf (slot-value seed 'characters) (length string)) + seed) + +(defun count-xml (in) + "Parse a toplevel XML element from stream in, counting elements, attributes and characters" + (start-parse-xml in + (make-instance 'xml-parser-state + :seed (make-instance 'count-xml-seed) + :new-element-hook #'count-xml-new-element-hook + :text-hook #'count-xml-text-hook))) + +(defun count-xml-file (pathname) + "Parse XMl from the file at pathname, counting elements, attributes and characters" + (with-open-file (in pathname) + (let ((result (count-xml in))) + (with-slots (elements attributes characters) result + (format t + "~a contains ~d XML elements, ~d attributes and ~d characters.~%" + pathname elements attributes characters))))) + +;;;; eof |