+ (cond
+ ((characterp object)
+ (mount-char-attribute-table latest-feature)
+ (or (char-feature object latest-feature)
+ (char-feature object feature))
+ )
+ (t
+ (or (concord-object-get object latest-feature)
+ (concord-object-get object feature))
+ ))))
+
+(defun get-previous-code-point (ccs code)
+ (let ((chars (charset-chars ccs))
+ (dim (charset-dimension ccs))
+ (i 0)
+ mask byte-min byte-max
+ bytes dest)
+ (cond
+ ((= chars 94)
+ (setq mask #x7F
+ byte-min 33
+ byte-max 126)
+ )
+ ((= chars 96)
+ (setq mask #x7F
+ byte-min 32
+ byte-max 127)
+ )
+ ((= chars 128)
+ (setq mask #x7F
+ byte-min 0
+ byte-max #xFF)
+ )
+ (t ; (= chars 256)
+ (setq mask #xFF
+ byte-min 0
+ byte-max #xFF)
+ ))
+ (setq bytes (make-vector dim 0))
+ (while (< i dim)
+ (aset bytes i (logand (lsh code (* i -8)) mask))
+ (setq i (1+ i)))
+ (setq i 0)
+ (while (and (< i dim)
+ (progn
+ (aset bytes i (1- (aref bytes i)))
+ (< (aref bytes i) byte-min)))
+ (aset bytes i byte-max)
+ (setq i (1+ i)))
+ (when (< i dim)
+ (setq dest (aref bytes 0)
+ i 1)
+ (while (< i dim)
+ (setq dest (logior dest (lsh (aref bytes i) (* i 8)))
+ i (1+ i)))
+ dest)))
+
+(defun get-next-code-point (ccs code)
+ (let ((chars (charset-chars ccs))
+ (dim (charset-dimension ccs))
+ (i 0)
+ mask byte-min byte-max
+ bytes dest)
+ (cond
+ ((= chars 94)
+ (setq mask #x7F
+ byte-min 33
+ byte-max 126)
+ )
+ ((= chars 96)
+ (setq mask #x7F
+ byte-min 32
+ byte-max 127)
+ )
+ ((= chars 128)
+ (setq mask #x7F
+ byte-min 0
+ byte-max #xFF)
+ )
+ (t ; (= chars 256)
+ (setq mask #xFF
+ byte-min 0
+ byte-max #xFF)
+ ))
+ (setq bytes (make-vector dim 0))
+ (while (< i dim)
+ (aset bytes i (logand (lsh code (* i -8)) mask))
+ (setq i (1+ i)))
+ (setq i 0)
+ (while (and (< i dim)
+ (progn
+ (aset bytes i (1+ (aref bytes i)))
+ (> (aref bytes i) byte-max)))
+ (aset bytes i byte-min)
+ (setq i (1+ i)))
+ (when (< i dim)
+ (setq dest (aref bytes 0)
+ i 1)
+ (while (< i dim)
+ (setq dest (logior dest (lsh (aref bytes i) (* i 8)))
+ i (1+ i)))
+ dest)))
+
+(defun find-previous-defined-code-point (ccs code)
+ (let ((i (get-previous-code-point ccs code))
+ char)
+ (cond
+ ((eq ccs '=jis-x0208)
+ (setq ccs '=jis-x0208@1990))
+ ((eq ccs '=jis-x0213-1)
+ (setq ccs '=jis-x0213-1@2004)))
+ (while (and i
+ (>= i 0)
+ (null (setq char (decode-char ccs i
+ (unless (eq ccs '=ucs)
+ 'defined-only)))))
+ (setq i (get-previous-code-point ccs i)))
+ char))
+
+(defun find-next-defined-code-point (ccs code)
+ (let ((i (get-next-code-point ccs code))
+ max char)
+ (setq max (+ code 1000))
+ (cond
+ ((eq ccs '=jis-x0208)
+ (setq ccs '=jis-x0208@1990))
+ ((eq ccs '=jis-x0213-1)
+ (setq ccs '=jis-x0213-1@2004)))
+ (while (and i
+ (<= i max)
+ (null (setq char (decode-char ccs i
+ (unless (eq ccs '=ucs)
+ 'defined-only)))))
+ (setq i (get-next-code-point ccs i)))
+ char))