r2947: *** empty log message ***
[umlisp.git] / utils.lisp
1 ;;;; $Id: utils.lisp,v 1.1 2002/10/05 20:17:14 kevin Exp $
2  
3 (in-package :umlisp)
4
5 (declaim (inline xml-cdata make-cuisui make-cuilui parse-ui parse-cui))
6 (declaim (optimize (speed 3) (safety 1)))
7
8 (defmacro def-metaclass-reader (field)
9   "Create function for reading slot of metaclass"
10   `(defun ,field (cl)
11      (car (slot-value (class-of cl) ',field))))
12
13 (defmacro def-metaclass-reader-car (field)
14   "Create function for reading slot of metaclass"
15   `(defun ,field (cl)
16      (car (slot-value (class-of cl) ',field))))
17
18 ;;; Field transformations
19
20 (defun parse-ui (s &optional (nullvalue 0))
21   "Return integer value for a UMLS unique identifier."
22   (if (< (length s) 2)
23       nullvalue
24     (parse-integer s :start 1)))
25
26 (defun parse-cui (cui)
27   (if (stringp cui)
28       (let ((ch (aref cui 0)))
29         (if (eql ch #\C)
30             (parse-ui cui)
31           (parse-integer cui)))
32     cui))
33     
34 (defun parse-lui (lui)
35   (if (stringp lui)
36       (let ((ch (aref lui 0)))
37         (if (eql ch #\L)
38             (parse-ui lui)
39           (parse-integer lui)))
40     lui))
41     
42 (defun parse-sui (sui)
43   (if (stringp sui)
44       (let ((ch (aref sui 0)))
45         (if (eql ch #\S)
46             (parse-ui sui)
47           (parse-integer sui)))
48     sui))
49     
50 (defun parse-tui (tui)
51   (if (stringp tui)
52       (let ((ch (aref tui 0)))
53         (if (eql ch #\T)
54             (parse-ui tui)
55           (parse-integer tui)))
56     tui))
57
58 (defun parse-eui (eui)
59   (if (stringp eui)
60       (let ((ch (aref eui 0)))
61         (if (eql ch #\E)
62             (parse-ui eui)
63           (parse-integer eui)))
64     eui))
65     
66 (defun xml-cdata (str)
67   (concatenate 'string "<![CDATA[" str "]]>"))
68
69 (defconstant +cuisui-scale+ 10000000)
70
71 (defun make-cuisui (cui sui)
72   (declare (fixnum cui sui))
73   (the integer (+ (* +cuisui-scale+ cui) sui)))
74
75 (defun make-cuilui (cui lui)
76   (declare (fixnum cui lui))
77   (the integer (+ (* +cuisui-scale+ cui) lui)))
78
79 (defun decompose-cuisui (cuisui)
80   (declare (integer cuisui))
81   (let* ((cui (the fixnum (truncate (/ cuisui +cuisui-scale+))))
82         (sui (the fixnum (- cuisui (* cui +cuisui-scale+)))))
83     (values cui sui)))