manywaypark's Blog
개발, 검색, 함수

그냥 막연히 make-string-input-stream으로 input stream을 만들어서 cxml:parse-stream에 걸면 될 줄로 생각했는데, binary stream을 만들어야한다.
;;; simple binary stream for string parsing with cxml (just a wrapper for string).
(defclass bin-stream (fundamental-binary-input-stream)
((string-input-stream
:initarg :string-input-stream
:accessor string-input-stream)))

(defmethod stream-read-byte ((s bin-stream))
(char-code (or (read-char (string-input-stream s) nil)
(return-from stream-read-byte :eof))))

;;; makes binary stream of a string for parsing with cxml.
(defun make-bin-stream (string)
(assert (stringp string))
(make-instance 'bin-stream :string-input-stream (make-string-input-stream string)))
다음과 같이 테스트
CL-USER> (make-bin-stream "<foo><bar/></foo>")
#<BIN-STREAM {1002C69051}>
CL-USER> (dom:node-name (dom:document-element (cxml:parse-stream * (cxml-dom:make-dom-builder))))
"foo"
CL-USER>
binary stream wrapper를 만드는데 시간이 좀 걸렸다.

참고:
http://www.mikemac.com/mikemac/clim/gray-streams.html (맨 밑에 보면 binary stream을 만들려면, fundamental-binary-*-stream를 상속하고 stream-read-byte 또는 stream-write-byte method를 구현하라고 나온다).
http://www.cs.queensu.ca/software_docs/gnudev/gcl-ansi/gcl_1178.html (read-char의 optional parameter에 eof-error-p를 주의. nil로 설정!! nil로 설정하지 않으면 end-of-file condition error가 뜬다.)

happy hackin'


분류 전체보기 (306)
잡담 (20)
함수형 언어 (65)
emacs (16)
java (18)
tips & tricks (154)
사랑 (1)
가사 (0)
독서 (4)
mobile (6)
비함수형 언어 (2)

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

03-29 04:16