summaryrefslogtreecommitdiff
path: root/Build/source/utils/xindy/src/idxstyle.lsp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/xindy/src/idxstyle.lsp')
-rw-r--r--Build/source/utils/xindy/src/idxstyle.lsp2131
1 files changed, 2131 insertions, 0 deletions
diff --git a/Build/source/utils/xindy/src/idxstyle.lsp b/Build/source/utils/xindy/src/idxstyle.lsp
new file mode 100644
index 00000000000..299d513aad9
--- /dev/null
+++ b/Build/source/utils/xindy/src/idxstyle.lsp
@@ -0,0 +1,2131 @@
+;; line 289 "idxstyle.nw"
+;; $Id: idxstyle.nw,v 1.19 1997/03/26 16:18:23 kehr Exp $
+;;
+
+(lisp:defpackage "IDXSTYLE")
+(lisp:in-package "IDXSTYLE")
+(lisp:provide "idxstyle")
+
+#+CLISP (lisp:require "base")
+#+CLISP (lisp:require "locref")
+
+(eval-when (compile load eval)
+ (lisp:use-package "CLOS")
+ (lisp:use-package "COMMON-LISP")
+ #+CLISP (lisp:use-package "EXT")
+ #+(and :XP CLISP) (lisp:use-package "XP")
+ #-CLISP (lisp:require "base")
+ #-CLISP (lisp:require "locref")
+ (lisp:use-package "BASE")
+ (lisp:use-package "LOCREF")
+
+;; line 472 "intface.nw"
+(eval-when (eval load compile)
+ (when (find-package "ORDRULES")
+ (pushnew :ORDRULES *features*)))
+;; line 306 "idxstyle.nw"
+ ;; see submodule intface
+ )
+
+;; line 78 "idxstyle.nw"
+(defparameter *indexstyle* nil)
+(defparameter *indexstyle-readtable* (copy-readtable))
+(defparameter *included-files* '())
+(defvar *load-paths* "")
+(defparameter *default-load-paths* *load-paths*)
+
+(defparameter *default-minimum-range-length* 2)
+(defparameter *default-locref-hierdepth* 0)
+
+;; line 1151 "intface.nw"
+;; $Id: intface.nw,v 1.30 1997/10/20 11:25:09 kehr Exp $
+
+;; line 1016 "intface.nw"
+;;; $Id: intface.nw,v 1.30 1997/10/20 11:25:09 kehr Exp $
+;;;----------------------------------------------------------------------
+
+;;;
+;;; util-lib LISP Utitlity Library
+;;;
+;;; (history at end)
+
+
+;(provide 'util-lib)
+;(in-package 'util-lib)
+
+(defvar whole)
+(eval-when (compile load eval)
+ (export '(destructuring-switch-bind &switch whole)))
+
+(defmacro destructuring-switch-bind (lambdalist expr . body)
+ "Similar to 'destructuring-bind' but also allows switch options at the
+end of LAMBDALIST with the following syntax:
+
+ &switch { var | (var key [defval]) | (var ({ key }*) [defval]) }*
+
+In all cases VAR will be accessible in BODY as a variable.
+
+If only VAR is specified, it is bound to the keyword with the same
+name, if that keyword occured in EXPR. Otherwise it is bound to NIL.
+
+If both a VAR and KEY were specified, VAR will be bound to KEY, if KEY
+occured in EXPR and to NIL otherwise.
+
+If VAR and a list of KEYs were specified, VAR will be bound to the
+first KEY, which occured in EXPR. If none of the KEYS occured within
+EXPR, VAR will be bound to NIL.
+
+If DEFVAL was specified, variable will be bound to DEFVAL instead of
+NIL in cases where no switch keyword was found in EXPR.
+"
+
+ (let* ((switchlist (member '&switch lambdalist))
+
+ ;; 'remove' switches from lambdalist
+ (lambdalist (ldiff lambdalist switchlist))
+
+ ;; drop &switch keyword
+ (switches (when switchlist (cdr switchlist)))
+
+ ;; construct bindings for each switch and collect valid
+ ;; keywords in 'switchkeys'
+ (switchkeys '())
+ (bindings
+ (mapcar
+ #'(lambda (spec)
+ (cond
+
+ ;; spec simply consists of VAR
+ ((symbolp spec)
+ (let ((key (intern (symbol-name spec) 'keyword)))
+ (push key switchkeys)
+ `(,spec (FIND ,key <DESTRUCTURING-SWITCH-FORM>))
+ ))
+
+ ;; spec is (VAR form)
+ ((and (listp spec) (>= (list-length spec) 2))
+ (let ((var (first spec))
+ (keyspec (second spec))
+ (defval (when (cddr spec) (third spec))))
+ (cond
+ ;; spec is (VAR (KEY1 KEY2 ...))
+ ((listp keyspec)
+ `(,var
+ (COND
+ ,@(mapcar
+ #'(lambda (key)
+ (push key switchkeys)
+ `((FIND ,key <DESTRUCTURING-SWITCH-FORM>)
+ ,key))
+ keyspec)
+ (T ,defval))))
+
+ ;; spec is (VAR KEY)
+ (t
+ (push keyspec switchkeys)
+ ` (,var (OR
+ (FIND ,keyspec <DESTRUCTURING-SWITCH-FORM>)
+ ,defval)))
+ )))
+
+ ;; illegal spec
+ (t (error "~A is not a valid switch specifier." spec))
+ ))
+ switches))
+ )
+
+ ;; construct the expansion form
+ ` (LET ((<DESTRUCTURING-SWITCH-FORM> ,expr))
+ (LET ,bindings
+ (HANDLER-CASE
+ (DESTRUCTURING-BIND ,lambdalist
+ (SET-DIFFERENCE-KEEP-ORIGINAL-ORDER
+ <DESTRUCTURING-SWITCH-FORM>
+ ',switchkeys)
+ ,@body)
+ (ERROR (COND)
+ (DECLARE (IGNORE COND))
+ (ERROR "~&Syntax Error in ~S." WHOLE)
+ )
+ )
+ )
+ )
+ ))
+
+(defun set-difference-keep-original-order (set1 set2)
+ (mapcan #'(lambda (elt)
+ (unless (member elt set2)
+ (list elt)))
+ set1))
+
+#|
+(destructuring-switch-bind (name &rest args &key foo bar
+ &switch
+ on ; simple form
+ (started :start)
+ (speed (:fast :slow))
+ (off :turn-off :turn-on) ; with switch key
+ (choose (:one :two :three) :three))
+ '(width :foo 5 :bar 7 :on :turn-off :one)
+ (list name foo bar args on started speed off choose))
+|#
+;; line 111 "intface.nw"
+(eval-when (compile load eval)
+ (defun stringify (name)
+ (declare (inline))
+ (etypecase name
+ (symbol (symbol-name name))
+ (string name)
+ (number (write-to-string name)))))
+
+(defun list-of-strings-p (x)
+ (cond ((not (listp x)) nil)
+ ((every #'(lambda (elt)
+ (or (stringp elt) (symbolp elt) (numberp elt)))
+ x))))
+;; line 136 "intface.nw"
+(defun make-well-formed-list (attr-list)
+ (mapcar #'(lambda (x)
+ (cond ((null x)
+ (error "empty lists are not allowed !"))
+ ((or (symbolp x) (stringp x) (numberp x))
+ (list (stringify x)))
+ ((listp x)
+ (map-to-strings x))))
+ attr-list))
+
+(defun map-to-strings (slist)
+ (mapcar #'(lambda (x)
+ (cond ((null x)
+ (error "empty lists are not allowed !"))
+ ((or (symbolp x) (stringp x) (numberp x))
+ (stringify x))
+ ((listp x)
+ (error "nesting level too deep !"))
+ (t (error "~S is not a string !" x))))
+ slist))
+;; line 185 "intface.nw"
+(defun c-string-reader (stream char)
+ (declare (ignore char))
+ (let ((ch nil)
+ (str (make-array 32
+ :element-type
+ #+CLISP 'string-char
+ #-CLISP 'base-char
+ :adjustable t
+ :fill-pointer 0)))
+ (loop
+ (setq ch (read-char stream t #\Newline t))
+ (case ch
+ (#\" (let ((nextch (read-char-no-hang stream t #\Newline t)))
+ (when nextch
+ (unread-char nextch stream)
+ (case nextch
+ (#\Newline)
+ (#\t)
+ (#\Space)
+ (#\))
+ (t (nraw "~&Possible read-error due to ill-formed string \"~A\" ~S"
+ str *))))
+ (return str)))
+ (#\~ (setq ch (read-char stream t #\Newline t))
+ (case ch
+ (#\n (vector-push-extend #\Newline str))
+ (#\t (vector-push-extend #\Tab str))
+ (#\b (vector-push-extend (character 1) str))
+ (#\e (vector-push-extend (character 255) str))
+ (t (vector-push-extend ch str))))
+ (t (vector-push-extend ch str))))))
+
+(set-macro-character #\" #'c-string-reader nil *indexstyle-readtable*)
+
+#|
+(let ((x #\Null))
+ (loop for i from 1 to 255
+ do (progn (print (character i))
+ (when (char>= x (character i))
+ (print "Whee!"))
+ (setq x (character i)))))
+|#
+;; line 254 "intface.nw"
+(defmacro define-alphabet (&whole whole &optional name string-list)
+ (cond
+;; line 239 "intface.nw"
+((null name)
+ (error "missing argument <name> in `~S' !" whole))
+((not (or (symbolp name) (stringp name)))
+ (error "~S is not a symbol or a string in `~S' !" name whole))
+;; line 256 "intface.nw"
+ ((not (listp string-list))
+ (error "missing argument <string-list> !"))
+ ((not (list-of-strings-p string-list))
+ (error "~S is not a list of strings" string-list))
+ (t `(LET ((NAME (STRINGIFY ',name)))
+ (WHEN (LOOKUP-BASETYPE *indexstyle* NAME)
+ (NRAW "redefining alphabet `~S'" NAME))
+ (ADD *indexstyle* (MAKE-ALPHABET NAME ',string-list))))))
+
+(defmacro define-alphabet* (&whole whole &optional name string-list)
+ (cond
+;; line 239 "intface.nw"
+((null name)
+ (error "missing argument <name> in `~S' !" whole))
+((not (or (symbolp name) (stringp name)))
+ (error "~S is not a symbol or a string in `~S' !" name whole))
+;; line 267 "intface.nw"
+ ((not (listp string-list))
+ (error "missing argument <string-list> !"))
+ (t (let ((scar (car string-list)))
+ (if (and (symbolp scar) (fboundp scar))
+ `(LET ((NAME (STRINGIFY ',name))
+ (STRING-LIST ,string-list)) #| evaluates string-list |#
+ (UNLESS (LIST-OF-STRINGS-P STRING-LIST)
+ (ERROR "~S is not a list of strings" STRING-LIST))
+ (WHEN (LOOKUP-BASETYPE *indexstyle* NAME)
+ (NRAW "redefining alphabet `~S'" NAME))
+ (ADD *indexstyle* (MAKE-ALPHABET NAME STRING-LIST))))))))
+;; line 284 "intface.nw"
+(defmacro define-enumeration (&whole
+ whole
+ &optional
+ name prefix-match-func base-alphabet)
+ (cond
+;; line 239 "intface.nw"
+((null name)
+ (error "missing argument <name> in `~S' !" whole))
+((not (or (symbolp name) (stringp name)))
+ (error "~S is not a symbol or a string in `~S' !" name whole))
+;; line 289 "intface.nw"
+ ((null prefix-match-func)
+ (error "missing argument <prefix-match-function> !"))
+ (t (let* ((name (stringify name))
+ (symbol (make-symbol
+ (concatenate 'string "ENUMERATION-" name))))
+ `(LET () #| PROGN instead of LET () yields a runtime error !? |#
+ (IF (LOOKUP-BASETYPE *indexstyle* ,name)
+ (NRAW "redefining alphabet `~S'" ,name)
+ (PROGN
+ (DEFCLASS ,symbol (ENUMERATION) ())
+ (ADD *indexstyle*
+ (MAKE-ENUMERATION ',symbol ,name ,base-alphabet))))
+ (DEFMETHOD PREFIX-MATCH ((STR STRING) (ENUM ,symbol))
+ (FUNCALL ,prefix-match-func STR)))))))
+;; line 312 "intface.nw"
+(defmacro define-location-class (&whole whole &rest args)
+ (destructuring-switch-bind (name
+ layer-list
+ &key
+ (min-range-length *default-minimum-range-length*)
+ (hierdepth 0) ;no hierarchies are to be formed
+ &switch
+ (var :var))
+ args
+ (cond
+ ((null name)
+ (error "missing argument <name> in~%~S" whole))
+ ((null layer-list)
+ (error "missing argument <layer-list> in~%~S" whole))
+ ;;((not (list-of-strings-p layer-list))
+ ;; (error "~S is not a list of strings in~%~S" layer-list whole))
+ ((not (numberp hierdepth))
+ (error "~S is not a number! in~%~S" hierdepth whole))
+ ((not (or (numberp min-range-length)
+ (eql 'none min-range-length)))
+ (error "~S must be a number or the keyword `none' in~%~S"
+ min-range-length whole))
+ (t (when (eql 'none min-range-length)
+ (setq min-range-length 0))
+ `(LET ((NAME (STRINGIFY ',name))
+ (LAYERS (BUILD-LOCCLASS-LAYERS ',layer-list ',whole)))
+ ;;(GOL T "~&define-location-class: ~S" LAYERS)
+ (COND ((LOOKUP-CROSSREF-CLASS *indexstyle* NAME)
+ (OOPS "replacing cross-reference-class `~S' is not allowed !"
+ NAME))
+ (t (WHEN (LOOKUP-LOCATION-CLASS *indexstyle* NAME)
+ (NRAW "redefining location-reference-class `~S' !" NAME))
+ (ADD *indexstyle*
+ ,(if var
+ `(CHECKED-MAKE-VAR-LOCATION-CLASS NAME LAYERS
+ ,hierdepth)
+ `(CHECKED-MAKE-STANDARD-LOCATION-CLASS NAME LAYERS
+ ,min-range-length ,hierdepth))))
+ ))))))
+;; line 354 "intface.nw"
+(defun build-locclass-layers (layers whole)
+ (let ((res-list '()))
+ (loop
+ ;;(gol t "~&build-locclass-layers: ~S" layers)
+ (when (endp layers) (return (nreverse res-list)))
+ (cond ((eql :sep (car layers))
+ (setq layers (cdr layers))
+ (if (endp layers)
+ (error "Reached end of list in~%~S" whole)
+ (push (make-loccls-separator (stringify (car layers)))
+ res-list)))
+ (t (let* ((layer (stringify (car layers)))
+ (basetype (lookup-basetype *indexstyle* layer)))
+ (if basetype
+ (push (make-loccls-layer basetype) res-list)
+ (error "Unknown basetype ~S in~%~S" layer whole)))))
+ (setq layers (cdr layers)))))
+;; line 377 "intface.nw"
+(defmacro define-crossref-class (&whole whole &rest args)
+ (destructuring-switch-bind (name
+ &switch (verified :unverified))
+ args
+ (cond
+;; line 239 "intface.nw"
+((null name)
+ (error "missing argument <name> in `~S' !" whole))
+((not (or (symbolp name) (stringp name)))
+ (error "~S is not a symbol or a string in `~S' !" name whole))
+;; line 382 "intface.nw"
+ (t `(LET ((NAME (STRINGIFY ',name)))
+ (cond ((LOOKUP-LOCATION-CLASS *indexstyle* NAME)
+ (OOPS "replacing location-reference-class `~S' is not allowed !"
+ NAME))
+ (t (WHEN (LOOKUP-CROSSREF-CLASS *indexstyle* NAME)
+ (NRAW "redefining crossref-location-class `~S'" NAME))
+ (ADD *indexstyle*
+ ,(if verified
+ `(MAKE-UNVERIFIED-CROSSREF-LOCATION-CLASS NAME)
+ `(MAKE-VERIFIED-CROSSREF-LOCATION-CLASS NAME))))))))))
+;; line 398 "intface.nw"
+(defmacro define-location-class-order (olist)
+ (cond ((not (listp olist))
+ (error "missing argument <list> !"))
+ ((not (list-of-strings-p olist))
+ (error "~S is not a list of strings" olist))
+ (t `(LET ((CTR 1))
+ (MAPC #'(LAMBDA (NAME)
+ (LET* ((NEW-NAME (STRINGIFY NAME))
+ (LOCCLS
+ (CDR (LOOKUP-LOCATION-CLASS *indexstyle*
+ NEW-NAME))))
+ (INCF CTR)
+ (COND (LOCCLS (SET-ORDNUM CTR LOCCLS))
+ (t (OOPS "unknown location-class `~S'"
+ NEW-NAME)))))
+ ',olist)))))
+;; line 423 "intface.nw"
+(defmacro define-attributes (&whole whole &optional attr-list)
+ (cond ((null attr-list)
+ (error "missing argument <attribute-list> in~&~S" whole))
+ (t (let* ((wf-attr-list (make-well-formed-list attr-list))
+ (plain-list (apply #'concatenate 'list wf-attr-list))
+ )
+ `(PROGN
+ (MAPCAR
+ #'(LAMBDA (CATATTR)
+ (IF (LOOKUP-CATATTR *indexstyle* CATATTR)
+ (NRAW "ignoring redefinition of attribute ~S in~&~S"
+ CATATTR ',whole)
+ (ADD *indexstyle*
+ (MAKE-CATEGORY-ATTRIBUTE CATATTR))))
+ ',plain-list)
+ (INITIALIZE-CATEGORY-ATTRIBUTES ',wf-attr-list *indexstyle*))
+ ))))
+;; line 488 "intface.nw"
+#+:ORDRULES
+(defmacro merge-rule (&whole whole &rest args)
+ (destructuring-switch-bind (pattern
+ replacement
+ &switch
+ (again :again)
+ (string :string)
+ (extended-regexp :eregexp)
+ (basic-regexp :bregexp))
+ args
+ (cond ((null pattern)
+ (error "missing argument <pattern> !"))
+ ((or (and string extended-regexp) (and string basic-regexp)
+ (and extended-regexp basic-regexp))
+ (error "~&Only one of (:string :bregexp :eregexp) allowed in:~&~S !"
+ whole))
+ ((null replacement)
+ (error "~&Missing argument <replacement> in:~&~S!" whole))
+ (t `(PROGN
+ (UNLESS
+ (ZEROP
+ (ORDRULES:ADD-KEYWORD-MERGE-RULE ,pattern ,replacement
+ ,(if again 1 0)
+ ,(cond (string 1)
+ (basic-regexp 2)
+ (extended-regexp 3)
+ (t 0))))
+ (OOPS "~&Wrong regular expression ~S in:~%~S." ',pattern ',whole))
+ (FLUSH-ORDRULES-MESSAGE-BUFFER))))))
+
+#-:ORDRULES
+(defmacro merge-rule (&rest args)
+ (declare (ignore args))
+ (oops "merge-rule not supported! ignoring definition"))
+;; line 525 "intface.nw"
+#+:ORDRULES
+(defparameter *sort-rule-orientations*
+ '(forward forward forward forward
+ forward forward forward forward))
+
+#+:ORDRULES
+(defmacro define-sort-rule-orientations (&whole whole &rest args)
+ (destructuring-switch-bind (&optional
+ (orientations *sort-rule-orientations*))
+ args
+ (unless (every #'(lambda (run)
+ (member run '(forward backward)))
+ orientations)
+ (error "~&Elements of ~S must be one of {forward,backward}!"
+ orientations))
+ `(PROGN
+ (SETQ *SORT-RULE-ORIENTATIONS* ',orientations)
+ (ORDRULES:INITIALIZE (LENGTH *SORT-RULE-ORIENTATIONS*))
+ (FLUSH-ORDRULES-MESSAGE-BUFFER))))
+
+#+:ORDRULES
+(defmacro define-rule-set (&whole whole &rest args)
+ (destructuring-bind (&optional
+ name
+ &key
+ inherit-from
+ rules)
+ args
+ (cond
+;; line 239 "intface.nw"
+((null name)
+ (error "missing argument <name> in `~S' !" whole))
+((not (or (symbolp name) (stringp name)))
+ (error "~S is not a symbol or a string in `~S' !" name whole))
+;; line 554 "intface.nw"
+ ((not (listp rules))
+ (error "missing argument <rules-list> !"))
+ (t `(LET ((RS (MAKE-RULE-SET ',name ',inherit-from ',rules)))
+ (MAPC #'(LAMBDA (INH-NAME)
+ (INHERIT-RULE-SET RS (LOOKUP-RULE-SET *INDEXSTYLE*
+ INH-NAME)))
+ ',inherit-from)
+ (ADD-RULE-SET *INDEXSTYLE* RS))))))
+
+#-:ORDRULES
+(defmacro define-rule-set (&rest args)
+ (declare (ignore args))
+ (oops "define-rule-sets not supported! ignoring definition"))
+
+#+:ORDRULES
+(defmacro use-rule-set (&whole whole &rest args)
+ ;; FIXME: if we use destructuring-switch-bind-here an error occurs
+ (destructuring-bind (&key
+ run
+ rule-set)
+ args
+ (cond ((not (integerp run))
+ (error "incorrect argument <run> !"))
+ ((not rule-set)
+ (error "missing argument <rule-set> !"))
+ ((not (or (listp rule-set)
+ (stringp rule-set)))
+ (error "wrong argument to <rule-set> !"))
+ (t `(INSTANTIATE-RULE-SET ,run ,rule-set)))))
+
+#-:ORDRULES
+(defmacro use-rule-set (&rest args)
+ (declare (ignore args))
+ (oops "use-rule-sets not supported! ignoring definition"))
+
+#+:ORDRULES
+(defmacro sort-rule (&whole whole &rest args)
+ (destructuring-switch-bind (pattern
+ replacement
+ &key
+ (run 0)
+ &switch
+ (again :again)
+ (string :string)
+ (extended-regexp :eregexp)
+ (basic-regexp :bregexp))
+ args
+ (cond ((null pattern)
+ (error "missing argument <pattern> !"))
+ ((or (< run 0) (>= run (length *sort-rule-orientations*)))
+ (error "~&Argument of :run must be in the interval [0..~A]!"
+ (length *sort-rule-orientations*)))
+ ((or (and string extended-regexp) (and string basic-regexp)
+ (and extended-regexp basic-regexp))
+ (error "~&Only one of (:string :bregexp :eregexp) allowed in:~&~S !"
+ whole))
+ ((null replacement)
+ (error "missing argument <replacement> !"))
+ (t `(PROGN
+ (UNLESS
+ (ZEROP
+ (ORDRULES:ADD-KEYWORD-SORT-RULE ,run ,pattern ,replacement
+ ,(if again 1 0)
+ ,(cond (string 1)
+ (basic-regexp 2)
+ (extended-regexp 3)
+ (t 0))))
+ (OOPS "~&Wrong regular expression ~S in:~%~S." ',pattern ',whole))
+ (FLUSH-ORDRULES-MESSAGE-BUFFER))))))
+
+#-:ORDRULES
+(defmacro define-sort-rule-orientations (&rest args)
+ (declare (ignore args))
+ (oops "define-sort-rule-orientations not supported! ignoring definition"))
+
+#-:ORDRULES
+(defmacro sort-rule (&rest args)
+ (declare (ignore args))
+ (oops "sort-rule not supported! ignoring definition"))
+
+(defun flush-ordrules-message-buffer ()
+ #+:ORDRULES
+ (when (and *mappings-trace* ordrules::*message-logging*)
+ (gol t "~A" ordrules::*message-buffer*)
+ (setq ordrules::*message-buffer-ptr* 0)))
+;; line 696 "intface.nw"
+(defmacro define-letter-group
+ (&whole whole name &key prefixes before after)
+ (cond
+;; line 239 "intface.nw"
+((null name)
+ (error "missing argument <name> in `~S' !" whole))
+((not (or (symbolp name) (stringp name)))
+ (error "~S is not a symbol or a string in `~S' !" name whole))
+;; line 699 "intface.nw"
+ ((and before
+ (not (lookup-letter-group-definition *indexstyle* before)))
+ (error "~S does not name a letter group in~%~S" before whole))
+ ((and after
+ (not (lookup-letter-group-definition *indexstyle* after)))
+ (error "~S does not name a letter group in~%~S" after whole))
+ ((not (list-of-strings-p prefixes))
+ (error "argument <prefixes> is not a list of strings in~%~S"
+ whole))
+ (t `(LET ()
+ (ADD-LETTER-GROUPS *INDEXSTYLE*
+ ,name ',(or prefixes (list name))
+ :BEFORE ,before :AFTER ,after)))))
+;; line 718 "intface.nw"
+(defmacro define-letter-groups (&whole whole &optional letter-groups)
+ (cond ((not (list-of-strings-p letter-groups))
+ (error "~S is not a list of strings in~%~S" letter-groups whole))
+ (t `(LET ()
+ (ADD-LETTER-GROUPS *INDEXSTYLE*
+ ,(car letter-groups) ',(list (car letter-groups)))
+ ,@(let ((last (car letter-groups)))
+ (mapcar #'(lambda (letter-group)
+ (prog1
+ `(ADD-LETTER-GROUPS *INDEXSTYLE*
+ ,letter-group ',(list letter-group)
+ :AFTER ,last)
+ (setq last letter-group)))
+ (cdr letter-groups)))))))
+;; line 650 "intface.nw"
+(defmacro merge-to (&whole whole &rest args)
+ (destructuring-switch-bind (from to &switch drop)
+ args
+ (let ((from-attr (lookup-catattr *indexstyle* from))
+ (to-attr (lookup-catattr *indexstyle* to)))
+ (cond ((not from-attr)
+ (nraw "`~S' is not a known attribute in:~&~A" from whole))
+ ((not to-attr)
+ (nraw "`~S' is not a known attribute in:~&~A" to whole))
+ (t (if drop
+ `(ADD-DROP-IF-MERGED-RULE *INDEXSTYLE*
+ ',from-attr ',to-attr)
+ `(ADD-MERGE-RULE *INDEXSTYLE*
+ ',from-attr ',to-attr)))))))
+;; line 740 "intface.nw"
+;;; we remove the inherited symbol and establish a new one
+(eval-when (compile load eval)
+ (shadow 'require))
+
+(defmacro require (&rest args)
+ (cond ((null args)
+ (error "missing argument <filename> !"))
+ ((not (stringp (car args)))
+ (error "(require ~S): expected <filename> !" (car args)))
+ (t `(LET ((FILENAME (STRINGIFY ',(car args))))
+ (DO-REQUIRE FILENAME)))))
+
+(defun do-require (filename)
+ (let ((file (find-file filename)))
+ (unless (member file *included-files* :test #'equalp)
+ (push file *included-files*)
+ (info "~&Loading module ~S..." filename)
+ (watched-load file :echo t)
+ (info "~&Finished loading module ~S.~%" filename))))
+
+#|
+(defun do-require (filename)
+ (let ((file (find-file filename)))
+ (unless (member file *included-files* :test #'equalp)
+ (push file *included-files*)
+ (info "~&Loading module ~S..." filename)
+ (let ((*standard-output* (make-string-output-stream)))
+ (handler-case
+ (load file :verbose nil :echo t)
+; (stream-error (cond)
+; (step
+; (progn
+; (oops*
+; (simple-condition-format-string cond)
+; (simple-condition-format-arguments cond))
+; (exit))
+; )
+; )
+ (error (condition)
+ (info "~&~%~A~%" ";;;;;;;;;;;;;;;;;;;;;;;;")
+ (info "~A~%" ";; ERROR SECTION START")
+ (info "~%~A~%" (get-output-stream-string *standard-output*))
+ (info "~%~A~%" ";; ERROR SECTION END")
+ (info "~A~%~%" ";;;;;;;;;;;;;;;;;;;;;;;;")
+ (oops* (simple-condition-format-string condition)
+ (simple-condition-format-arguments condition))
+ (error-exit))
+ )
+ )
+ (info "~&Finished loading module ~S.~%" filename))))
+|#
+;; line 802 "intface.nw"
+(defun find-file (filename)
+ (let ((file (parse-namestring filename)))
+ (when (equal (file-namestring file) "")
+ (error "~S is not a valid filename !" filename))
+ (let ((found (some #'(lambda (path)
+ (and (probe-file (append-pathnames path file))))
+ *load-paths*)))
+ (or found (error "Could not find file ~S !" filename)))))
+;; line 813 "intface.nw"
+(defvar *wl-fmt* "~&~%Error in line ~S:~%~A~%")
+(defun watched-load (filename
+ &key
+ (print *load-print*)
+ (if-does-not-exist t)
+ echo)
+ (let ((stream (open (setq filename (pathname filename))
+ :direction
+ #+CLISP :input-immutable
+ #-CLISP :input
+ :element-type
+ #+CLISP 'string-char
+ #-CLISP 'base-char
+ :if-does-not-exist nil))
+ (lineno 1))
+ (if stream
+ (let* ((load-stream (make-string-output-stream))
+ (input-stream (if echo
+ (make-echo-stream stream load-stream)
+ stream
+ ))
+ (*load-pathname* (if (pathnamep filename) filename nil))
+ (*load-truename* (if (pathnamep filename) (truename filename) nil))
+ (*package* *package*) ; *PACKAGE* binden
+ (*readtable* *readtable*) ; *READTABLE* binden
+ (end-of-file "EOF")) ; einmaliges Objekt
+ ;;(setq sys::*load-input-stream* input-stream)
+ (block nil
+ (unwind-protect
+ (tagbody weiter
+ (let* ((obj
+ (handler-case (read input-stream nil end-of-file)
+ (error (cond)
+ (when echo
+ (let* ((str (get-output-stream-string load-stream))
+ (cnt (count #\Newline str)))
+ (info *wl-fmt* (+ cnt lineno) str)
+ (oops* (simple-condition-format-string cond)
+ (simple-condition-format-arguments cond))
+ (error-exit))))))
+ (str (get-output-stream-string load-stream))
+ (cnt (count #\Newline str)))
+ (incf lineno cnt)
+ (when (eql obj end-of-file)
+ (return-from nil))
+ (setq obj
+ (multiple-value-list
+ (cond ((compiled-function-p obj) (funcall obj))
+ ;;(compiling (funcall (compile-form obj nil nil nil nil nil)))
+ (t (handler-case (eval obj)
+ (error (cond)
+ (info *wl-fmt* lineno str)
+ (oops* (simple-condition-format-string cond)
+ (simple-condition-format-arguments cond))
+ (error-exit)))
+ (get-output-stream-string load-stream)
+ ))))
+ (when print (when obj (print (first obj))))
+ )
+ (go weiter)
+ )
+ (close stream) (close input-stream)
+ ) )
+ t)
+ (if if-does-not-exist
+ (error "A file with name ~A does not exist" filename)
+ nil)
+ ) ))
+;; line 891 "intface.nw"
+(defmacro searchpath (&rest args)
+ (cond ((null args)
+ (error "missing argument <pathlist> !"))
+ ((stringp (car args))
+ `(SET-SEARCHPATH-BY-STRING ,(car args)))
+ ((listp args)
+ `(SET-SEARCHPATH ',(car args)))))
+
+(defun set-searchpath-by-string (searchpath-str)
+ (set-searchpath (string-to-searchlist searchpath-str)))
+;; line 913 "intface.nw"
+(defun string-to-searchlist (str)
+ (let ((paths '())
+ pos)
+ (nreverse
+ (loop (when (equalp str "")
+ (return (push :default paths)))
+ (setq pos (position #+UNIX #\:
+ #+OS/2 #\;
+ str))
+ (if pos
+ (progn
+ (push (subseq str 0 pos) paths)
+ (setq str (subseq str (1+ pos))))
+ (return (push str paths)))))))
+
+(defun set-searchpath (path-list)
+ (setq *load-paths*
+ (apply #'nconc
+ (mapcar
+ #'(lambda (elt)
+ (cond ((stringp elt)
+ (list (make-real-pathname elt)))
+ ((eq elt :default)
+ *default-load-paths*)
+ ((eq elt :last)
+ *load-paths*)
+ (t (oops "~&searchpath: invalid argument ~S in~%~S"
+ elt path-list))))
+ path-list))))
+;; line 954 "intface.nw"
+#+CLISP
+(defun make-real-pathname (pathname-str)
+ (let* ((pn (pathname pathname-str))
+ (fname (file-namestring pn)))
+ (if (string/= fname "")
+ (make-pathname :device (pathname-device pn)
+ :directory (append (or (pathname-directory pn)
+ '(:relative))
+ (list fname)))
+ pn)))
+;; line 966 "intface.nw"
+#-CLISP
+(defun make-real-pathname (pathname-str)
+ (let ((pn (parse-namestring
+ (if (eql (elt pathname-str (1- (length pathname-str))) #\/)
+ pathname-str
+ (concatenate 'string pathname-str "/")))))
+ (if (pathname-directory pn)
+ pn
+ (make-pathname :directory (list :relative (pathname-name pn))))))
+;; line 986 "intface.nw"
+(defun append-pathnames (pn-dir pn-sub)
+ (let ((dir-dir (pathname-directory pn-dir))
+ (dir-sub (pathname-directory pn-sub)))
+ (cond ((eq :absolute (car dir-sub)) pn-sub)
+ (t (make-pathname :device (pathname-device pn-dir)
+ :directory (append dir-dir (cdr dir-sub))
+ :name (pathname-name pn-sub)
+ :type (pathname-type pn-sub))))))
+
+;; line 62 "intface.nw"
+(defparameter *idxstyle-user-interface-definitions*
+ '(
+ *default-minimum-range-length*
+ *included-files*
+ *indexstyle-readtable*
+ define-alphabet
+ define-alphabet*
+ define-attributes
+ define-crossref-class
+ define-enumeration
+ define-letter-group
+ define-letter-groups
+ define-location-class
+ define-location-class-order
+ define-rule-set
+ define-sort-rule-orientations
+ forward backward
+ info
+ merge-rule
+ merge-to
+ require
+ searchpath
+ sort-rule
+ use-rule-set
+ *indexstyle*
+ ))
+
+;; line 1168 "intface.nw"
+(eval-when (compile load eval)
+
+;; line 91 "intface.nw"
+(export '(*indexstyle*
+ *indexstyle-readtable*
+ do-require
+ set-searchpath-by-string
+ *sort-rule-orientations*
+ forward backward
+ *idxstyle-user-interface-definitions*
+ ))
+;; line 159 "intface.nw"
+(export '(stringify list-of-strings-p
+ make-well-formed-list map-to-strings))
+;; line 642 "intface.nw"
+(export 'flush-ordrules-message-buffer)
+;; line 1170 "intface.nw"
+ )
+;; line 557 "idxrule.nw"
+;; $Id: idxrule.nw,v 1.10 1997/03/26 16:18:19 kehr Exp $
+
+;; line 323 "idxrule.nw"
+(defclass relation ()
+ ((rel-sets :accessor get-rel-sets
+ :initform '() )
+ (rel-hash :accessor get-rel-hash
+ :initform (make-hash-table :test #'equal))))
+
+(defun make-relation ()
+ (make-instance 'relation))
+;; line 344 "idxrule.nw"
+(defmethod rel-insert ((rel relation) x y)
+ (let* ((rel-sets (get-rel-sets rel))
+ (x-node (assoc x rel-sets))
+ (y-node (assoc y rel-sets)))
+ (cond ((null x-node) (setf (get-rel-sets rel) (cons (list x y) rel-sets)))
+ ((member y (cdr x-node)))
+ (t (rplacd x-node (cons y (cdr x-node)))))
+ (when (and (null y-node) (not (eql x y)))
+ (setf (get-rel-sets rel) (cons (list y) (get-rel-sets rel)))))
+ rel)
+
+(defmethod rel-simple-insert ((rel relation) x)
+ (let* ((rel-sets (get-rel-sets rel))
+ (x-node (assoc x rel-sets)))
+ (unless x-node (setf (get-rel-sets rel) (cons (list x) rel-sets))))
+ rel)
+;; line 366 "idxrule.nw"
+(defmethod rel-merge ((rel-1 relation) x)
+ (declare (ignore x))
+ rel-1)
+
+(defmethod rel-merge ((rel-1 relation) (rel-2 relation))
+ (mapc #'(lambda (r-2)
+ (let ((r-1 (assoc (car r-2) (get-rel-sets rel-1))))
+ (cond ((null r-1)
+ (setf (get-rel-sets rel-1)
+ (cons r-2 (get-rel-sets rel-1))))
+ (t (rplacd r-1 (union (cdr r-1) (cdr r-2)))))))
+ (get-rel-sets rel-2))
+ rel-1)
+;; line 387 "idxrule.nw"
+(defmacro relation-set (rel x)
+ `(CDR (ASSOC ,x (SLOT-VALUE ,rel 'REL-SETS))))
+;; line 408 "idxrule.nw"
+(defmethod make-ready ((rel relation))
+ (let ((ht (get-rel-hash rel)))
+ (mapc #'(lambda (node)
+ (mapc #'(lambda (succ-node)
+ (setf (gethash (cons (car node) succ-node) ht)
+ t))
+ (cdr node)))
+ (get-rel-sets rel)))
+ rel)
+;; line 423 "idxrule.nw"
+(defmacro relation-p (rel x y)
+ `(GETHASH (CONS ,x ,y) (SLOT-VALUE ,rel 'REL-HASH)))
+;; line 439 "idxrule.nw"
+(defun print-relation (rel-sets stream printfunc
+ &key open close headsep listsep)
+ (mapc #'(lambda (from)
+ (when open (format stream open))
+ (write (funcall printfunc (car from)) :stream stream)
+ (when headsep (format stream headsep))
+ (mapc #'(lambda (to)
+ (write (funcall printfunc to) :stream stream)
+ (when listsep (format stream listsep)))
+ (cdr from))
+ (when close (format stream close)))
+ rel-sets))
+;; line 467 "idxrule.nw"
+(defmethod topsort ((rel relation))
+ (let ((rel-set (copy-tree (get-rel-sets rel)))
+ (topsort-list '()))
+ (loop
+ (let ((zero-indeg (find-if #'(lambda (x) (null (cdr x))) rel-set)))
+ (when (null zero-indeg) (return))
+ (let ((zero-indeg-elt (car zero-indeg)))
+ (setq topsort-list (cons zero-indeg-elt topsort-list))
+ (setq rel-set (delete zero-indeg rel-set :test #'equal))
+ (mapc #'(lambda (x)
+ (rplacd x (delete zero-indeg-elt (cdr x) :test #'equal)))
+ rel-set)))
+ )
+ (if (null rel-set)
+ (values topsort-list t)
+ (values nil rel-set))))
+;; line 494 "idxrule.nw"
+(defmethod transform-relation ((rel relation) transform-func)
+ (let ((new-rel (make-relation)))
+ (mapc #'(lambda (x)
+ (let ((transformed-x (funcall transform-func (car x))))
+ (mapc #'(lambda (y)
+ (rel-insert new-rel
+ transformed-x
+ (funcall transform-func y)))
+ (cdr x))))
+ (get-rel-sets rel))
+ new-rel))
+;; line 511 "idxrule.nw"
+(defmethod remove-reflexivity ((rel relation))
+ (mapc #'(lambda (x)
+ (rplacd x (delete (car x) (cdr x) :test #'equal)))
+ (get-rel-sets rel))
+ rel)
+;; line 529 "idxrule.nw"
+(defmethod transitive-hull ((rel relation))
+ (setf (get-rel-sets rel)
+ (let ((rel-sets (get-rel-sets rel)))
+ (mapc #'(lambda (j)
+ (mapc #'(lambda (i)
+ (when (member (car j) (cdr i))
+ (mapc #'(lambda (k)
+ (when (and
+ (member (car k) (cdr j))
+ (not (member (car k)
+ (cdr i))))
+ (rplacd (last i)
+ (list (car k)))))
+ rel-sets)))
+ rel-sets))
+ rel-sets)))
+ rel)
+;; line 61 "idxrule.nw"
+(defclass index-rule ()
+ ())
+
+(defclass relation-rule (index-rule relation)
+ ())
+;; line 88 "idxrule.nw"
+(defclass merge-rule (relation-rule)
+ ())
+
+(defun make-merge-rule ()
+ (make-instance 'merge-rule))
+;; line 117 "idxrule.nw"
+(defclass drop-if-merged-rule (relation-rule)
+ ())
+
+(defun make-drop-if-merged-rule ()
+ (make-instance 'drop-if-merged-rule))
+;; line 278 "idxrule.nw"
+(defclass substitution-rule (relation-rule)
+ ())
+
+(defun make-substitution-rule ()
+ (make-instance 'substitution-rule))
+;; line 164 "idxrule.nw"
+(defclass catattr-groups (index-rule)
+ ((attribute-list :reader get-attribute-list
+ :writer set-attribute-list
+ :initform nil)
+ (attribute-table :reader get-attribute-table
+ :initform (make-hash-table :test #'equal
+ :size 16))))
+
+(defun make-catattr-groups ()
+ (make-instance 'catattr-groups))
+
+(defmethod add ((catattr-grp catattr-groups)
+ (catattr category-attribute))
+ (setf (gethash (get-name catattr) (get-attribute-table catattr-grp))
+ catattr))
+
+(defmacro lookup-catattr-name (catattr-grp catattr-name)
+ `(GETHASH ,catattr-name (SLOT-VALUE ,catattr-grp 'ATTRIBUTE-TABLE)))
+;; line 217 "idxrule.nw"
+(defun initialize-category-attributes (attribute-list idxcls)
+ (let ((catattr-grps (get-cat-attrs idxcls))
+ (impl-subst-rule (get-implicit-subst-rules idxcls)))
+ (set-attribute-list attribute-list catattr-grps)
+ (let ((catattr-grp-counter 0)
+ (sort-ordnum-counter 0))
+ (mapc
+ #'(lambda (sublist)
+ (incf catattr-grp-counter)
+ (let ((last-in-group (lookup-catattr-name catattr-grps
+ (car (last sublist))))
+ (prev-catattr nil))
+ (mapc
+ #'(lambda (catattr)
+ (cond ((stringp catattr)
+ (let ((ca (lookup-catattr-name catattr-grps
+ catattr)))
+ (incf sort-ordnum-counter)
+ (set-sort-ordnum sort-ordnum-counter ca)
+ (set-catattr-grp-ordnum catattr-grp-counter ca)
+ (set-last-in-group last-in-group ca)
+ (when prev-catattr
+ (rel-insert impl-subst-rule
+ (lookup-catattr-name catattr-grps
+ prev-catattr)
+ (lookup-catattr-name catattr-grps
+ catattr)))
+ (setq prev-catattr catattr)))
+ (t (error "~A is not a string" catattr))))
+ sublist)))
+ attribute-list))
+ catattr-grps))
+
+;; line 566 "idxrule.nw"
+(eval-when (compile load eval)
+
+;; line 69 "idxrule.nw"
+(export '(index-rule relation-rule))
+;; line 96 "idxrule.nw"
+(export '(merge-rule make-merge-rule))
+;; line 125 "idxrule.nw"
+(export '(drop-if-merged-rule make-drop-if-merged-rule))
+;; line 185 "idxrule.nw"
+(export '(catattr-groups make-catattr-groups lookup-catattr-name))
+;; line 252 "idxrule.nw"
+(export '(initialize-category-attributes catattr-single catattr-mixed))
+;; line 286 "idxrule.nw"
+(export '(substitution-rule make-substitution-rule))
+;; line 428 "idxrule.nw"
+(export '(relation make-relation get-rel-sets
+ rel-insert rel-merge make-ready
+ relation-set relation-p))
+;; line 549 "idxrule.nw"
+(export '(topsort transform-relation remove-reflexivity transitive-hull))
+;; line 568 "idxrule.nw"
+ )
+;; line 873 "idxclass.nw"
+;; $Id: idxclass.nw,v 1.20 1997/03/26 16:18:16 kehr Exp $
+;;
+
+;; line 129 "idxclass.nw"
+(defparameter *locref-cache-size* 1000)
+(defparameter *locref-cache-rehash-size* 2)
+(defparameter *locref-cache-hits* 0)
+(defparameter *locref-cache-misses* 0)
+;; line 80 "idxclass.nw"
+(defclass indexclass ()
+ ((name :initarg :name :type string)
+ (basetypes :accessor get-basetypes
+ :initform (make-hash-table :test #'equal :size 10))
+ (cat-attrs :accessor get-cat-attrs
+ :initform (make-catattr-groups))
+ (locref-classes :accessor get-locref-classes
+ :initform '() :type list)
+ (xref-classes :accessor get-xref-classes
+ :initform '() :type list)
+ (letter-groups :reader get-letter-groups
+ :initform (make-letter-group-manager))
+ (partial-order-dict :reader get-partial-order-dict
+ :initform (make-partial-order-dict))
+ (letter-dict :reader get-letter-dict
+ :initform (make-letter-dict))
+ (rule-sets :reader get-rule-sets
+ :initform (make-hash-table :test #'equal :size 20))
+
+;; line 136 "idxclass.nw"
+ (locref-cache :initform (initialize-locref-cache))
+;; line 99 "idxclass.nw"
+ ;; (succ-table :accessor get-succ-table
+ ;; :initform (make-hash-table))
+
+;; line 219 "idxclass.nw"
+ (merge-rules :reader get-merge-rules
+ :initform (make-merge-rule))
+ (drop-if-merged-rules :reader get-drop-if-merged-rules
+ :initform (make-drop-if-merged-rule))
+;; (merge-rule-topsort :reader get-merge-rule-topsort
+;; :writer set-merge-rule-topsort
+;; :initform '())
+
+
+;; line 724 "idxclass.nw"
+ (merge-drop-hook :reader get-merge-drop-hook
+ :writer set-merge-drop-hook
+ :initform #'set-state-deleted)
+
+;; line 229 "idxclass.nw"
+ (implicit-subst-rules :reader get-implicit-subst-rules
+ :initform (make-substitution-rule))
+ (explicit-subst-rules :reader get-explicit-subst-rules
+ :writer set-explicit-subst-rules
+ :initform (make-substitution-rule))
+
+;; line 776 "idxclass.nw"
+ (implicit-subst-hook :reader get-implicit-subst-hook
+ :writer set-implicit-subst-hook
+ :initform #'transitive-hull)
+ (explicit-subst-hook :reader get-explicit-subst-hook
+ :writer set-explicit-subst-hook
+ :initform #'identity)
+ (global-subst-hook :reader get-global-subst-hook
+ :writer set-global-subst-hook
+ :initform #'identity)
+ (substitution-subst-hook :reader get-substitution-subst-hook
+ :writer set-substitution-subst-hook
+ :initform #'null)
+;; line 102 "idxclass.nw"
+ ))
+
+(defun make-indexclass (name)
+ (make-instance 'indexclass :name name))
+;; line 253 "idxclass.nw"
+(defparameter *default-letter-group-definition* "default")
+
+(defclass letter-group-definition ()
+ ((name :initarg :name :type string)
+ (ordnum :initarg :ordnum :type number)))
+
+(defun make-letter-group-definition (name)
+ (make-instance 'letter-group-definition :name name :ordnum 0))
+
+(defclass letter-group-manager ()
+ ((prefixes :accessor get-prefixes
+ :initform (make-hash-table :test #'equal))
+ (letter-groups :accessor get-letter-groups
+ :initform (make-hash-table :test #'equal))
+ (sort-relation :accessor get-sort-relation
+ :initform (make-relation))
+ (lookup-list :accessor get-lookup-list :initform '())))
+
+(defun make-letter-group-manager ()
+ (let* ((lgm (make-instance 'letter-group-manager))
+ (letter-groups (get-letter-groups lgm))
+ (default-group (make-letter-group-definition
+ *default-letter-group-definition*)))
+ (setf (gethash *default-letter-group-definition* letter-groups)
+ default-group)
+ (rel-simple-insert (get-sort-relation lgm) default-group)
+ lgm))
+;; line 295 "idxclass.nw"
+(defun make-lookup-list (lgm)
+ (setf (get-lookup-list lgm)
+ (let ((lookup-list '()))
+ (maphash #'(lambda (key elt)
+ (push (cons key elt) lookup-list))
+ (get-prefixes lgm))
+ (sort lookup-list #'prefix<))))
+
+(defun prefix< (x y)
+ (let ((cx (car x))
+ (cy (car y)))
+ (let ((same-prefix (string/= cx cy)))
+ (cond ((null same-prefix))
+ ((> same-prefix 0)
+ (and (= same-prefix (length (car y)))))
+ (t (string< cx cy))))))
+;; line 326 "idxclass.nw"
+(defun add-letter-group-to-manager (lgm name prefix &key before after)
+ (let* ((prefixes (get-prefixes lgm))
+ (letter-groups (get-letter-groups lgm))
+ (letter-group (gethash name letter-groups)))
+ (unless letter-group;; this letter group is unknown -- create one!
+ (setq letter-group (make-letter-group-definition name))
+ (setf (gethash name letter-groups) letter-group)
+ (rel-simple-insert (get-sort-relation lgm) letter-group))
+ (let ((current-binding (gethash prefix prefixes)))
+ (and current-binding
+ (not (equal name (get-name current-binding)))
+ (warn "define-letter-group: prefix ~S now maps to letter group ~S"
+ prefix name)))
+ (setf (gethash prefix prefixes) letter-group)
+ (when before
+ (rel-insert (get-sort-relation lgm)
+ letter-group
+ (lookup-letter-group-definition *indexstyle* before)))
+ (when after
+ (rel-insert (get-sort-relation lgm)
+ (lookup-letter-group-definition *indexstyle* after)
+ letter-group)))
+ lgm)
+
+(defmethod lookup-letter-group-definition ((idxcls indexclass) (letter string))
+ (gethash letter (get-letter-groups (get-letter-groups idxcls))))
+;; line 360 "idxclass.nw"
+(defmethod make-ready ((lgm letter-group-manager))
+ (make-lookup-list lgm)
+ (let ((sort-relation (get-sort-relation lgm)))
+ (multiple-value-bind (topsorted-list remaining-relation)
+ (topsort sort-relation)
+ (if topsorted-list
+ (let ((ctr 0))
+ (mapc #'(lambda (grp-def)
+ (setf (get-ordnum grp-def) (incf ctr)))
+ topsorted-list))
+ (error
+ (concatenate 'string
+ "The user-defined relations for the letter-groups contains cycles!~%The part of the relation containing cycles is"
+ (with-output-to-string (s)
+ (print-relation remaining-relation s
+ #'(lambda (lgdef)
+ (get-name lgdef))
+ :open "~%" :headsep " before "
+ :listsep " "))))))))
+;; line 388 "idxclass.nw"
+(defmethod match-letter-group ((idxcls indexclass) (letter string))
+ (let* ((lgm (get-letter-groups idxcls))
+ (lookup-list (get-lookup-list lgm))
+ (match (find-if #'(lambda (prefix-cons)
+ (let* ((prefix (car prefix-cons))
+ (match-len (string/= prefix letter)))
+ (or (not match-len) #| full match |#
+ (= match-len #| full match with lg |#
+ (length prefix)))))
+ lookup-list))
+ (letter-group-definition
+ (if match
+ (cdr match);; the corresponding letter-grp-def
+ (lookup-letter-group-definition
+ *indexstyle* *default-letter-group-definition*))))
+ (gol t "~&Letter-group: ~S -> ~S"
+ letter (get-name letter-group-definition))
+ letter-group-definition))
+;; line 549 "idxclass.nw"
+(defclass rule-set ()
+ ((name :initarg :name)
+ (rules-list :accessor rules-list :initarg :rules-list)
+ (rules-hash :reader rules-hash
+ :initform (make-hash-table :test #'equal :size 32))
+ ))
+
+(defun make-rule-set (name inherit rules)
+ (unless (every #'(lambda (rule)
+ (and (stringp (car rule));; pattern
+ (stringp (cadr rule)));; replacement
+ )
+ rules)
+ (error "not a valid rule-set definition!"))
+ (let ((rs (make-instance 'rule-set :name name :rules-list rules)))
+ (let ((rh (rules-hash rs)))
+ (mapc #'(lambda (rule)
+ (setf (gethash (car rule) rh) rule))
+ rules)
+ (mapc #'(lambda (inh-name)
+ (let ((inh-rs (lookup-rule-set *indexstyle* inh-name)))
+ (when inh-rs
+ (inherit-rule-set rs inh-rs))))
+ inherit)
+ rs)))
+
+#|
+(add-rule-set *indexstyle*
+ (make-rule-set "foo" '() '(("foo" "bar" :again)
+ ("baz" "bam" :string)
+ ("1" "3"))))
+
+(add-rule-set *indexstyle*
+ (make-rule-set "bar" '() '(("1" "bar" :again)
+ ("2" "bam" :string))))
+|#
+
+(defmacro instantiate-rule-set (run rule-set-names)
+ (let ((rs (make-rule-set "temporary rule-set" rule-set-names '())))
+ (when rs
+ (cons 'progn
+ (mapcar #'(lambda (rule)
+ `(SORT-RULE ,@rule :RUN ,RUN))
+ (rules-list rs))))))
+
+
+
+(defun inherit-rule-set (rs parent)
+ (let ((rs-hash (rules-hash rs)))
+ (mapc #'(lambda (rule)
+ (let ((pattern (car rule)))
+ (unless (gethash pattern rs-hash)
+ (setf (gethash pattern rs-hash) rule)
+ (setf (rules-list rs)
+ (append (rules-list rs) (list rule))))))
+ (rules-list parent))
+ rs))
+;; line 140 "idxclass.nw"
+(defun initialize-locref-cache ()
+ (setq *locref-cache-hits* 0)
+ (setq *locref-cache-misses* 0)
+ (make-hash-table :test #'equal
+ :size *locref-cache-size*
+ :rehash-size *locref-cache-rehash-size*))
+
+(defmethod clear-locref-cache ((idxclass indexclass))
+ (setf (get-locref-cache idxclass)
+ (initialize-locref-cache)))
+
+(defun set-locref-cache-parameters (&key (size 1000) (rehash-size 3))
+ (when (< size 100) (setq size 100))
+ (when (< rehash-size 1.5) (setq rehash-size 1.5))
+ (setq *locref-cache-size* size)
+ (setq *locref-cache-rehash-size* rehash-size))
+;; line 165 "idxclass.nw"
+(defmacro lookup-locref-cache (idxcls locref-string)
+ `(LET ((LOCREF-LOOKUP (GETHASH ,locref-string
+ (SLOT-VALUE ,idxcls 'LOCREF-CACHE))))
+ (IF LOCREF-LOOKUP
+ (PROGN
+ (INCF *LOCREF-CACHE-HITS*)
+ (VALUES (CAR LOCREF-LOOKUP) (CDR LOCREF-LOOKUP)))
+ (PROGN
+ (INCF *LOCREF-CACHE-MISSES*)
+ (VALUES NIL NIL)))))
+
+(defmethod add-locref-cache ((idxcls indexclass)
+ (locref-string string)
+ (num number)
+ ;; the next one is typeless, since we
+ ;; also want to store the value NIL into
+ ;; it, to denote a mismatch
+ locref)
+ (setf (gethash locref-string (get-locref-cache idxcls))
+ (cons num locref))
+ (values num locref))
+
+(defmethod locref-statistics ((idxcls indexclass))
+ (let ((ht (get-locref-cache idxcls)))
+ (with-output-to-string (s)
+ (format
+ s "Statistics for locref-cache of indexclass ~S:~%" (get-name idxcls))
+ (format
+ s
+ "Hash-table: size=~A, count=~A, cache-hits=~A, cache-misses=~A, hits=~4,1,,'*F%~%"
+ (hash-table-size ht) (hash-table-count ht)
+ *locref-cache-hits* *locref-cache-misses*
+ (if (> *locref-cache-misses* 0)
+ (* 100 (/ *locref-cache-hits* (+ *locref-cache-hits*
+ *locref-cache-misses*)))
+ 100.0 #| produces an invalid value |#)))))
+;; line 430 "idxclass.nw"
+(defmethod add ((idxcls indexclass) (basetype basetype))
+ (setf (gethash (get-name basetype) (get-basetypes idxcls))
+ basetype)
+ idxcls)
+
+(defmethod add-alias ((idxcls indexclass) basetype alias-name)
+ (let ((new-basetype (make-copy (lookup-basetype idxcls basetype)
+ alias-name)))
+ (add idxcls new-basetype)))
+
+(defmethod add ((idxcls indexclass) (catattr category-attribute))
+ (add (get-cat-attrs idxcls) catattr)
+ idxcls)
+;; line 446 "idxclass.nw"
+(defun add-letter-groups (idxcls name prefixes &key before after)
+ (let ((lgm (get-letter-groups idxcls)))
+ (mapc #'(lambda (prefix)
+ (add-letter-group-to-manager lgm name prefix
+ :before before
+ :after after))
+ prefixes)))
+;; line 462 "idxclass.nw"
+(defmethod add ((idxcls indexclass) (loccls layered-location-class))
+ (let* ((loccls-name (get-name loccls))
+ (old-loccls (cdr (lookup-locref-class idxcls loccls-name))))
+ (when old-loccls
+ (remove-location-class idxcls old-loccls))
+ (if (get-locref-classes idxcls) #| if it is empty, we can't rplacd |#
+ (rplacd (last (get-locref-classes idxcls))
+ (acons loccls-name loccls nil))
+ (setf (get-locref-classes idxcls)
+ (acons loccls-name loccls nil))))
+ idxcls)
+
+(defmethod remove-location-class ((idxcls indexclass)
+ (loccls layered-location-class))
+ (setf (get-locref-classes idxcls)
+ (delete-if #'(lambda (elt)
+ (eq (cdr elt) loccls))
+ (get-locref-classes idxcls)))
+ idxcls)
+;; line 484 "idxclass.nw"
+(defmethod add ((idxcls indexclass) (xrefcls crossref-location-class))
+ (let ((xrefcls-name (get-name xrefcls)))
+ (setf (get-xref-classes idxcls)
+ (acons xrefcls-name xrefcls (get-xref-classes idxcls)))
+ idxcls))
+;; line 495 "idxclass.nw"
+(defmethod add-merge-rule ((idxcls indexclass)
+ (catattr-1 category-attribute)
+ (catattr-2 category-attribute))
+ (rel-insert (get-merge-rules idxcls) catattr-1 catattr-2)
+ idxcls)
+
+(defmethod add-drop-if-merged-rule ((idxcls indexclass)
+ (catattr-1 category-attribute)
+ (catattr-2 category-attribute))
+ (rel-insert (get-merge-rules idxcls) catattr-1 catattr-2)
+ (rel-insert (get-drop-if-merged-rules idxcls) catattr-1 catattr-2)
+ idxcls)
+;; line 512 "idxclass.nw"
+(defmethod add-implicit-substitution-rule (
+ (idxcls indexclass)
+ (catattr-1 category-attribute)
+ (catattr-2 category-attribute))
+ (rel-insert (get-implicit-subst-rules idxcls) catattr-1 catattr-2)
+ idxcls)
+
+
+(defmethod add-explicit-substitution-rule (
+ (idxcls indexclass)
+ (catattr-1 category-attribute)
+ (catattr-2 category-attribute))
+ (rel-insert (get-explicit-subst-rules idxcls) catattr-1 catattr-2)
+ idxcls)
+;; line 609 "idxclass.nw"
+(defmethod add-rule-set ((idxcls indexclass) (rs rule-set))
+ (let ((rule-sets (get-rule-sets idxcls))
+ (rs-name (get-name rs)))
+ (setf (gethash rs-name rule-sets) rs)))
+;; line 635 "idxclass.nw"
+(defmethod lookup-basetype ((idxcls indexclass) (basetype-name string))
+ (gethash basetype-name (get-basetypes idxcls)))
+
+(defmethod lookup-catattr ((idxcls indexclass) (catattr-name string))
+ (lookup-catattr-name (slot-value idxcls 'cat-attrs) catattr-name))
+
+(defmethod lookup-location-class ((idxcls indexclass) (loccls-name string))
+ (or (lookup-crossref-class idxcls loccls-name)
+ (lookup-locref-class idxcls loccls-name)))
+
+(defmethod lookup-crossref-class ((idxcls indexclass) (xref-name string))
+ (assoc xref-name (slot-value idxcls 'xref-classes) :test #'equal))
+
+(defmethod lookup-locref-class ((idxcls indexclass) (loccls-name string))
+ (assoc loccls-name (slot-value idxcls 'locref-classes) :test #'equal))
+
+(defmethod lookup-rule-set ((idxcls indexclass) (rule-set-name string))
+ (gethash rule-set-name (get-rule-sets idxcls)))
+;; line 685 "idxclass.nw"
+(defmacro map-location-classes (idxcls apply-func &rest arguments)
+ `(LET ()
+ (APPLY #'NCONC
+ (MAPCAR
+ #'(LAMBDA (ELT)
+ (LET ((RES
+ (FUNCALL ,apply-func
+ ,idxcls
+ (CDR ELT) #|ELT is ("name".<LOCATION-CLASS>))|#
+ ,@arguments)))
+ (WHEN RES (LIST RES))))
+ (GET-LOCREF-CLASSES ,idxcls)))))
+
+;; line 800 "idxclass.nw"
+(defmethod apply-substitution-hooks ((idxcls indexclass))
+ (let ((impl (get-implicit-subst-rules idxcls))
+ (expl (get-explicit-subst-rules idxcls)))
+ (funcall (get-implicit-subst-hook idxcls) impl)
+ (funcall (get-explicit-subst-hook idxcls) expl)
+ (rel-merge impl expl)
+ (set-explicit-subst-rules nil idxcls)
+ (funcall (get-global-subst-hook idxcls) impl)
+ (make-ready impl)
+ ))
+;; line 838 "idxclass.nw"
+(defmethod make-ready ((idxcls indexclass))
+ (apply-substitution-hooks idxcls)
+ (make-ready (get-merge-rules idxcls))
+ (make-ready (get-drop-if-merged-rules idxcls))
+ (make-ready (get-letter-groups idxcls))
+
+
+;; (set-merge-rule-topsort (topsort
+;; (remove-reflexivity
+;; (transform-relation
+;; (get-drop-if-merged-rules idxcls)
+;; #'(lambda (attr)
+;; (get-ordnum attr)))))
+;; *indexstyle*)
+
+ ;;(pprint (get-drop-if-merged-rules idxcls))
+ ;;(pprint (topsort (get-drop-if-merged-rules idxcls)))
+
+ (let ((counter 0))
+ (mapc #'(lambda (catattr)
+ (set-processing-ordnum (incf counter) catattr))
+ (reverse (topsort (get-drop-if-merged-rules idxcls)))))
+
+ idxcls)
+
+;; line 888 "idxclass.nw"
+(eval-when (compile load eval)
+
+;; line 109 "idxclass.nw"
+(export '(indexclass make-indexclass
+ get-name get-basetypes
+ get-cat-attrs get-xref-classes
+ get-succ-table get-locref-classes
+ get-rule-sets
+
+;; line 241 "idxclass.nw"
+ get-merge-rules
+ get-drop-if-merged-rules
+; get-merge-rule-topsort set-merge-rule-topsort
+ get-implicit-subst-rules set-implicit-subst-rules
+ get-explicit-subst-rules set-explicit-subst-rules
+;; line 115 "idxclass.nw"
+ ))
+;; line 204 "idxclass.nw"
+(export '(locref-cache-size* *locref-cache-rehash-size*
+ initialize-locref-cache clear-locref-cache
+ lookup-locref-cache add-locref-cache
+ locref-statistics))
+;; line 409 "idxclass.nw"
+(export '(letter-group-definition match-letter-group))
+;; line 530 "idxclass.nw"
+(export '(add set
+ add-letter-groups
+ add-merge-rule
+ add-drop-if-merged-rule
+ add-implict-substitution-rule
+ add-explicit-substitution-rule))
+;; line 616 "idxclass.nw"
+(export '(rule-set
+ make-rule-set
+ add-rule-set
+ instantiate-rule-set
+ inherit-rule-set))
+;; line 656 "idxclass.nw"
+(export '(lookup-basetype
+ lookup-catattr
+ lookup-letter-group-definition
+ lookup-location-class
+ lookup-crossref-class
+ lookup-locref-class
+ lookup-rule-set))
+;; line 700 "idxclass.nw"
+(export 'map-location-classes)
+;; line 730 "idxclass.nw"
+(export '(get-merge-drop-hook set-merge-drop-hook))
+;; line 791 "idxclass.nw"
+(export '(get-implicit-subst-hook set-implicit-subst-hook
+ get-explicit-subst-hook set-explicit-subst-hook
+ get-global-subst-hook set-global-subst-hook
+ get-substitution-subst-hook set-substitution-subst-hook))
+;; line 823 "idxclass.nw"
+(export '(apply-substitution-hooks))
+;; line 865 "idxclass.nw"
+(export '(make-ready))
+;; line 890 "idxclass.nw"
+ )
+;; line 54 "idxstyle.nw"
+(defun create-indexclass (idxcls-name)
+ (setq *indexstyle* (make-indexclass idxcls-name)))
+;; line 259 "letters.nw"
+;; $Id$
+
+;; line 37 "letters.nw"
+(defclass letter ()
+ ((name :initarg :name :type string)
+ (props :initarg :props :type list)))
+
+(defun make-letter (name properties inherits-from)
+ (make-instance 'letter
+ :name name
+ :props (if inherits-from
+ (append properties (get-props inherits-from))
+ properties)))
+
+(defun find-prop (letter prop)
+ (assoc prop (get-props letter)))
+;; line 53 "letters.nw"
+(defclass letter-dictionary ()
+ ((letters :initform (make-hash-table :test #'equal))))
+
+(defun make-letter-dict ()
+ (make-instance 'letter-dictionary))
+
+(defun find-letter* (dict-ht letter)
+ (gethash letter dict-ht))
+
+(defun find-letter (dict letter)
+ (gethash letter (get-letters dict)))
+
+(defun add-letter-to-dict (letter-dict
+ po-dict
+ name props
+ &optional
+ inherits)
+ (let ((dict-ht (get-letters letter-dict)))
+ (when (gethash name dict-ht)
+ (nraw "Letter `~S' redefined!" name))
+ (setf (gethash name dict-ht)
+ (make-letter name
+ (pre-calculate-props props po-dict)
+ (when inherits
+ (find-letter* dict-ht name))))))
+;; line 85 "letters.nw"
+(defun pre-calculate-props (props po-dict)
+ (mapc #'(lambda (po-spec)
+ (let ((po-name (car po-spec))
+ (po-val (cadr po-spec)))
+ (setf (cdr (last po-spec))
+ (list (find-prop-weight
+ (find-partial-order po-dict po-name)
+ po-val)))))
+ props)
+ props)
+;; line 98 "letters.nw"
+(defmacro define-letter (&whole whole &rest rest)
+ (destructuring-switch-bind (name &rest proplist)
+ rest
+ (cond
+;; line 239 "intface.nw"
+((null name)
+ (error "missing argument <name> in `~S' !" whole))
+((not (or (symbolp name) (stringp name)))
+ (error "~S is not a symbol or a string in `~S' !" name whole))
+;; line 102 "letters.nw"
+ ((not (listp proplist))
+ (error "~S is not a property list in ~S." proplist whole))
+ (t `(LET ((NAME (STRINGIFY ',name)))
+ (ADD-LETTER-TO-DICT
+ (GET-LETTER-DICT *INDEXSTYLE*)
+ (GET-PARTIAL-ORDER-DICT *INDEXSTYLE*)
+ ,name ',proplist))))))
+;; line 119 "letters.nw"
+(defclass partial-order ()
+ ((name :initarg :name :type string)
+ (order :initform (make-hash-table :test #'equal))
+ (direct :initarg :direct :type symbol)))
+
+(defun make-partial-order (name order &optional (direct :from-start))
+ (let* ((po (make-instance 'partial-order :name name :direct direct))
+ (po-ht (get-order po))
+ (ctr 0))
+ (mapc #'(lambda (elt)
+ (when (gethash elt po-ht)
+ (error "Element ~S doubly defined in partial order ~S."
+ elt name))
+ (setf (gethash elt po-ht) (incf ctr)))
+ order)
+ po))
+;; line 140 "letters.nw"
+(defclass partial-order-dictionary ()
+ ((order :initform (make-hash-table :test #'equal))))
+
+(defun make-partial-order-dict ()
+ (make-instance 'partial-order-dictionary))
+
+(defun find-partial-order (dict po-name)
+ (gethash po-name (get-order dict)))
+
+(defun find-prop-weight (po po-name)
+ (gethash po-name (get-order po)))
+
+(defun add-partial-order-to-dict (dict po-name po-order po-direct)
+ (let ((dict-ht (get-order dict)))
+ (when (gethash po-name dict-ht)
+ (nraw "Partial order ~S redefined!" po-name))
+ (setf (gethash po-name dict-ht)
+ (make-partial-order po-name po-order po-direct))))
+;; line 161 "letters.nw"
+(defmacro define-partial-order (&whole whole &rest rest)
+ (destructuring-switch-bind (name
+ ordlist
+ &switch
+ from-start
+ from-end)
+ rest
+ (cond
+;; line 239 "intface.nw"
+((null name)
+ (error "missing argument <name> in `~S' !" whole))
+((not (or (symbolp name) (stringp name)))
+ (error "~S is not a symbol or a string in `~S' !" name whole))
+;; line 169 "letters.nw"
+ ((not (listp ordlist))
+ (error "~S is not a partial order list in ~S." ordlist whole))
+ ((and from-start from-end)
+ (error "Only one of :from-start or :from-end is allowed in ~S."
+ whole))
+ (t `(LET ((NAME (STRINGIFY ',name)))
+ (ADD-PARTIAL-ORDER-TO-DICT
+ (GET-PARTIAL-ORDER-DICT *INDEXSTYLE*)
+ ,name ',ordlist
+ ,(if (or from-start (not from-end))
+ :from-start :from-end)))))))
+;; line 194 "letters.nw"
+(defun word-cmp (word1 word2 po)
+ (let ((po-name (get-name po))
+ let1 let2 weight1 weight2)
+ (loop
+ (cond
+ ((and (endp word1) (endp word2)) (return :equal))
+ ((endp word1) (return :less))
+ ((endp word2) (return :greater))
+ (t (setq let1 (car word1))
+ (setq word1 (cdr word1))
+ (setq let2 (car word2))
+ (setq word2 (cdr word2))
+ (setq weight1 (lookup-letter-weight let1 po-name))
+ (setq weight2 (lookup-letter-weight let2 po-name))
+ (when (< weight1 weight2) (return :less))
+ (when (> weight1 weight2) (return :greater)))))))
+
+(defun calc-list-of-weights (word po)
+ (let ((po-name (get-name po)))
+ (mapcar #'(lambda (letter)
+ (lookup-letter-weight letter po-name))
+ word)))
+;; line 227 "letters.nw"
+(defun lookup-letter-weight (letter po-name)
+ (let ((prop (find-prop letter po-name)))
+ (if prop
+ (car (last prop))
+ (find-prop-weight
+ (find-partial-order (get-partial-order-dict *indexstyle*) po-name)
+ 'others))))
+;; line 237 "letters.nw"
+(defun make-word (letter-list)
+ (let ((dict (get-letter-dict *indexstyle*)))
+ (mapcar #'(lambda (str)
+ (find-letter dict str))
+ letter-list)))
+
+(defun sort-words (word-list po)
+ (split-list #'(lambda (word)
+ (calc-list-of-weights word po))
+ word-list))
+
+
+
+;; line 99 "idxstyle.nw"
+(create-indexclass "default")
+;; line 107 "idxstyle.nw"
+(defmacro string-expand (str)
+ (let ((str-expansion
+ (map 'list
+ #'(lambda (c)
+ (make-string 1 :initial-element c))
+ str)))
+ `(QUOTE ,str-expansion)))
+
+(define-alphabet* "ALPHA" (string-expand "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
+(define-alphabet* "alpha" (string-expand "abcdefghijklmnopqrstuvwxyz"))
+(define-alphabet* "digits" (string-expand "0123456789"))
+;; line 128 "idxstyle.nw"
+(defun prefix-match-for-radix-numbers (str radix)
+ (let* ((n nil)
+ (strlen (length str))
+ (len-match (do ((i 0 (1+ i)))
+ ((or (>= i strlen)
+ (not (digit-char-p (char str i) radix)))
+ i)
+ (setq n (+ (* (if n n 0) radix)
+ (digit-char-p (char str i) radix))))))
+ (values (subseq str 0 len-match)
+ (subseq str len-match)
+ n)))
+;; line 155 "idxstyle.nw"
+(define-enumeration "arabic-numbers"
+ #'(lambda (str)
+ (prefix-match-for-radix-numbers str 10))
+ "0123456789")
+;; line 178 "idxstyle.nw"
+(defparameter *lowercase-roman-numbers-lookup-table*
+ '((#\i ("ix" . 9) ("iv" . 4) ("iiii" . 4) ("iii". 3) ("ii" . 2) ("i" . 1))
+ (#\v ("viiii" . 9) ("viii" . 8) ("vii" . 7) ("vi" . 6) ("v" . 5))
+ (#\x ("xc" . 90) ("xl" . 40) ("x" . 10))
+ (#\m ("m" . 1000))
+ (#\c ("cm" . 900) ("cd" . 400) ("c" . 100))
+ (#\l ("lxxxx" . 90) ("lxxx" . 80) ("lxx" . 70) ("lx" . 60) ("l" . 50))
+ (#\d ("dcccc" . 900) ("dccc" . 800) ("dcc" . 700) ("dc" . 600) ("d" . 500))
+ ))
+
+(defparameter *uppercase-roman-numbers-lookup-table*
+ '((#\I ("IX" . 9) ("IV" . 4) ("IIII" . 4) ("III". 3) ("II" . 2) ("I" . 1))
+ (#\V ("VIIII" . 9) ("VIII" . 8) ("VII" . 7) ("VI" . 6) ("V" . 5))
+ (#\X ("XC" . 90) ("XL" . 40) ("X" . 10))
+ (#\M ("M" . 1000))
+ (#\C ("CM" . 900) ("CD" . 400) ("C" . 100))
+ (#\L ("LXXXX" . 90) ("LXXX" . 80) ("LXX" . 70) ("LX" . 60) ("L" . 50))
+ (#\D ("DCCCC" . 900) ("DCCC" . 800) ("DCC" . 700) ("DC" . 600) ("D" . 500))
+ ))
+;; line 206 "idxstyle.nw"
+(defun roman-number-prefix-match (roman-number-string *table*)
+ (let ((result 0)
+ (str roman-number-string)
+ (last-val 100000) #| hope that's enough |#
+ (str-len (length roman-number-string))
+ ch table match-cons curr-val
+ )
+ (loop (when (= 0 (length str))
+ (return (values roman-number-string "" result)))
+ (setq ch (aref str 0))
+ (setq table (cdr (assoc ch *table*)))
+ (setq match-cons
+ (find-if #'(lambda (cons)
+ (let* ((prefix (car cons))
+ (match-len (string/= prefix str)))
+ (or (not match-len)
+ (= match-len (length prefix)))))
+ table))
+ (unless match-cons
+ (return (if (= 0 result)
+ (values nil nil nil)
+ (values (subseq roman-number-string
+ 0 (- str-len (length str)))
+ str result))))
+ (setq curr-val (cdr match-cons))
+ (when (> curr-val last-val)
+ (return (values (subseq roman-number-string
+ 0 (- str-len (length str)))
+ str result)))
+ (incf result curr-val)
+ (setq last-val curr-val)
+ (setq str (subseq str (length (car match-cons)))))))
+;; line 241 "idxstyle.nw"
+(define-enumeration "roman-numbers-uppercase"
+ #'(lambda (str)
+ (roman-number-prefix-match
+ str
+ *uppercase-roman-numbers-lookup-table*))
+ "IVXLCDM")
+
+(add-alias *indexstyle* "roman-numbers-uppercase" "ROMAN")
+(add-alias *indexstyle* "roman-numbers-uppercase" "roman-numerals-uppercase")
+
+(define-enumeration "roman-numbers-lowercase"
+ #'(lambda (str)
+ (roman-number-prefix-match
+ str
+ *lowercase-roman-numbers-lookup-table*))
+ "ivxlcdm")
+
+(add-alias *indexstyle* "roman-numbers-lowercase" "roman")
+(add-alias *indexstyle* "roman-numbers-lowercase" "roman-numerals-lowercase")
+
+
+;; line 902 "idxclass.nw"
+#+:XP
+(defmacro pprint-slot-block (slot-name body)
+ `(progn
+ (pprint-logical-block (s nil :suffix " }")
+ (pprint-indent :block 2 s)
+ (write-string ,slot-name s)
+ (pprint-newline :mandatory s)
+ ,body)
+ (pprint-newline :mandatory s)))
+
+#+:XP
+(defmacro pprint-slot-block-line (slot-name body)
+ `(progn
+ (pprint-logical-block (s nil :suffix " }")
+ (pprint-indent :block 2 s)
+ (write-string ,slot-name s)
+ (pprint-newline :linear s)
+ ,body)
+ (pprint-newline :mandatory s)))
+;; line 924 "idxclass.nw"
+#+:XP
+(set-pprint-dispatch 'indexclass
+ #'(lambda (s idxcls)
+ (pprint-logical-block
+ (s nil :suffix "}")
+ (pprint-indent :block 2 s)
+ (write-string "indexclass " s)
+ (write (get-name idxcls) :stream s)
+ (write-string " {" s)
+ (pprint-newline :mandatory s)
+ (pprint-slot-block
+ "basetypes {"
+ (maphash #'(lambda (key bt)
+ (declare (ignore key))
+ (write (get-name bt) :stream s)
+ (write-string " " s)
+ (pprint-newline :linear s))
+ (get-basetypes idxcls)))
+ (pprint-slot-block
+ "cat-attrs {"
+ (write (get-cat-attrs idxcls) :stream s))
+ (pprint-slot-block
+ "locclasses {"
+ (mapc #'(lambda (lc)
+ (write (get-name (cdr lc)) :stream s)
+ (write-string " [" s)
+ (write (get-ordnum (cdr lc)) :stream s)
+ (write-string "] " s)
+ (pprint-newline :linear s))
+ (get-locref-classes idxcls)))
+ (pprint-slot-block
+ "xrefclasses {"
+ (mapc #'(lambda (lc)
+ (write (get-name (cdr lc)) :stream s)
+ (write-string " [" s)
+ (write (get-ordnum (cdr lc)) :stream s)
+ (write-string "] " s)
+ (pprint-newline :linear s))
+ (get-xref-classes idxcls)))
+
+ (write (get-letter-dict idxcls) :stream s)
+ (pprint-newline :mandatory s)
+ (write (get-partial-order-dict idxcls) :stream s)
+ (pprint-newline :mandatory s)
+
+ (pprint-slot-block
+ "merge-rules {"
+ (write (get-merge-rules idxcls) :stream s))
+ (pprint-slot-block
+ "drop-if-merged-rules {"
+ (write (get-drop-if-merged-rules idxcls) :stream s))
+ ;; (pprint-slot-block-line
+ ;; "merge-rule-topsort { "
+ ;; (write (get-merge-rule-topsort idxcls) :stream s))
+ (pprint-slot-block
+ "implicit-subst-rules {"
+ (write (get-implicit-subst-rules idxcls) :stream s))
+ (pprint-slot-block
+ "explicit-subst-rules {"
+ (write (get-explicit-subst-rules idxcls) :stream s))
+
+ (pprint-slot-block-line
+ "implicit-subst-hook {"
+ (write (get-implicit-subst-hook idxcls) :stream s))
+ (pprint-slot-block-line
+ "explicit-subst-hook {"
+ (write (get-explicit-subst-hook idxcls) :stream s))
+ (pprint-slot-block-line
+ "global-subst-hook {"
+ (write (get-global-subst-hook idxcls) :stream s))
+ (pprint-slot-block-line
+ "substitution-subst-hook {"
+ (write (get-substitution-subst-hook idxcls) :stream s))
+ (pprint-slot-block-line
+ "merge-drop-hook {"
+ (write (get-merge-drop-hook idxcls) :stream s))
+
+ ; (pprint-slot-block
+ ; "keyword-markup {"
+ ; (write (get-keyword-markup idxcls) :stream s))
+ )))
+;; line 580 "idxrule.nw"
+#+:XP
+(defun pprint-relation (s rel)
+ (pprint-logical-block
+ (s nil :suffix "}")
+ (pprint-indent :block 2 s)
+ (write-string "Relation { " s)
+ (pprint-logical-block (s nil)
+ (pprint-indent :block 2)
+ (mapc #'(lambda (x)
+ (when x
+ (write (car x) :stream s)
+ (write-string " ->" s)
+ (mapc #'(lambda (y)
+ (write-string " " s)
+ (write y :stream s))
+ (cdr x))
+ (pprint-newline :mandatory s)))
+ (get-rel-sets rel)))))
+
+#+:XP
+(set-pprint-dispatch 'relation-rule #'pprint-relation)
+#+:XP
+(set-pprint-dispatch 'relation #'pprint-relation)
+;; line 606 "idxrule.nw"
+#+:XP
+(set-pprint-dispatch
+ 'catattr-groups
+ #'(lambda (s catgrp)
+ (pprint-logical-block
+ (s nil :suffix "}")
+ (pprint-indent :block 2 s)
+ (write-string "Category-attribute-group { " s)
+ (pprint-newline :mandatory s)
+ (write (get-attribute-list catgrp) :stream s)
+ (pprint-newline :mandatory s)
+ (write (get-attribute-table catgrp) :stream s))))
+;; line 277 "letters.nw"
+#+:XP
+(set-pprint-dispatch 'letter
+ #'(lambda (s lt)
+ (pprint-logical-block
+ (s nil :suffix ">")
+ (pprint-indent :block 2 s)
+ (write-string "<" s)
+ (write (get-name lt) :stream s)
+ (write-string " " s)
+ (pprint-newline :linear s)
+ (write (get-props lt) :stream s))))
+
+#+:XP
+(set-pprint-dispatch 'letter-dictionary
+ #'(lambda (s dict)
+ (pprint-logical-block
+ (s nil :suffix "}")
+ (pprint-indent :block 2 s)
+ (write-string "letters {" s)
+ (maphash #'(lambda (key lt)
+ (declare (ignore key))
+ (write lt :stream s)
+ (write-string " " s)
+ (pprint-newline :linear s))
+ (get-letters dict)))))
+
+#+:XP
+(set-pprint-dispatch 'partial-order
+ #'(lambda (s po)
+ (pprint-logical-block
+ (s nil :suffix ">")
+ (pprint-indent :block 2 s)
+ (write-string "<" s)
+ (write (get-name po) :stream s)
+ (pprint-newline :linear s)
+ (maphash #'(lambda (key po)
+ (write-string " [" s)
+ (write key :stream s)
+ (write-string " " s)
+ (write po :stream s)
+ (write-string "]" s)
+ (pprint-newline :linear s))
+ (get-order po)))))
+
+
+#+:XP
+(set-pprint-dispatch 'partial-order-dictionary
+ #'(lambda (s dict)
+ (pprint-logical-block
+ (s nil :suffix "}")
+ (pprint-indent :block 2 s)
+ (write-string "partial-orders {" s)
+ (maphash #'(lambda (key po)
+ (declare (ignore key))
+ (write po :stream s)
+ (write-string " " s)
+ (pprint-newline :linear s))
+ (get-order dict)))))
+
+;; line 321 "idxstyle.nw"
+(defvar *RCS-Identifier* '(
+;; line 894 "idxclass.nw"
+("idxclass" . "$Id: idxclass.nw,v 1.20 1997/03/26 16:18:16 kehr Exp $")
+;; line 572 "idxrule.nw"
+("idxrule" . "$Id: idxrule.nw,v 1.10 1997/03/26 16:18:19 kehr Exp $")
+;; line 335 "idxstyle.nw"
+("idxstyle" . "$Id: idxstyle.nw,v 1.19 1997/03/26 16:18:23 kehr Exp $")
+;; line 1174 "intface.nw"
+("intface" . "$Id: intface.nw,v 1.30 1997/10/20 11:25:09 kehr Exp $")
+;; line 269 "letters.nw"
+("letters" . "$Id$")
+;; line 321 "idxstyle.nw"
+ ))
+
+(eval-when (compile load eval)
+
+;; line 59 "idxstyle.nw"
+(export 'create-indexclass)
+;; line 89 "idxstyle.nw"
+(export '*load-paths*)
+;; line 325 "idxstyle.nw"
+ )