xyzzy lisp
リージョンの文字コード変換
jisとeucの相互変換が出来ません。(関数がない)
元の文字コードの自動判別が出来ない。(関数が分からない)
- ソース
(defun set-region-encoding (from to) "リージョンの文字コード変換(jis, euc,sjis)" (interactive "*s元の文字コード(jis, euc, sjis): \ns変換先文字コード(jis, euc, sjis): ") (save-excursion (save-restriction (let ((cb (selected-buffer))(tmp)) (widen) (narrow-to-region (point) (mark)) (create-new-buffer " region-encoding-buffer") (goto-char (point-min)) (set-buffer " region-encoding-buffer") (delete-region (point-min) (point-max)) (set-buffer cb) (setq tmp (buffer-substring (point-min) (point-max))) (set-buffer " region-encoding-buffer") (insert (cond ((string= from "jis") (cond ((string= to "jis") (message "同じです")(return)) ((string= to "euc") (message "出来ません")(return)) ((string= to "sjis") (map-jis-to-sjis tmp)) (t (message "文字コード不明です")(return)))) ((string= from "euc") (cond ((string= to "jis") (message "出来ません")(return)) ((string= to "euc") (message "同じです")(return)) ((string= to "sjis") (map-euc-to-sjis tmp)) (t (message "文字コード不明です")(return)))) ((string= from "sjis") (cond ((string= to "jis") (map-internal-to-jis tmp)) ((string= to "euc") (map-internal-to-euc tmp)) ((string= to "sjis") (message "おなじです")(return)) (t (message "文字コード不明です")(return)))) )) (set-buffer cb) (delete-region (point-min) (point-max)) (set-buffer " region-encoding-buffer") (goto-char (point-min)) (setq tmp (buffer-substring (point-min) (point-max))) (set-buffer cb) (insert tmp) (set-buffer " region-encoding-buffer") (delete-buffer " region-encoding-buffer")))))
lightwaveシーンファイル(lws)を解析する
- ソース
(defun scan-lws (fn) "lightwaveシーンファイルを解析する" (interactive "F") (with-output-to-temp-buffer ("*lws解析結果*") (let ((sbuffer (buffer-stream-buffer *standard-output*))) (save-excursion (with-open-file (in fn :direction :input) (let ((tmp "")(tmp2)) (while (setq tmp (read-line in nil)) (if (string-match "AddNullObject \\(.+\\)" tmp) ; null object (princ (concat "nullオブジェクト: " (match-string 1) "\n")) ) (if (string-match "LoadObjectLayer \\w+ \\(.+\\)" tmp) ; object layer (princ (concat "オブジェクト・レイヤ: " (match-string 1) "\n")) ) )))))))
- 結果
オブジェクト・レイヤ: Objects/Food/Apple.lwo オブジェクト・レイヤ: Objects/Food/Banana.lwo nullオブジェクト: lemon
lightwaveオブジェクトファイル(lwo)を解析する
とりあえずタグ名が分かることだけ出来る。
今はタグ名が分かればOKなので。
- ソース
(defun print-chunck-tag (in) (let ((name "")(ch)) (dotimes (cnt 4) (setq ch (read-char in nil)) (if (not ch) (return)) (setq name (concat name (format nil "~C" ch)))) (if ch (progn (princ (format nil "tag: ~A\n" name)) (print-chunck-length in name))))) (defun print-chunck-length (in name) (let ((ch)(val 0)) (dotimes (cnt 4) (setq ch (read-char in nil)) (if (= cnt 0) (setq val (char-code ch)) (setq val (+ (* #x100 val) (char-code ch))))) (princ (format nil "\tlength: ~D\n" val)) (if (string= name "FORM") (progn (skip-stream in 4) (print-chunck-tag in)) ) (if (string= name "TAGS") (progn (print-tags-name in val) (print-chunck-tag in)) ) (if (string= name "LAYR") (progn (skip-stream in 16) (print-tags-name in (- val 18)) (skip-stream in 2) (print-chunck-tag in)) ) (if (string= name "PNTS") (progn (skip-stream in val) (print-chunck-tag in)) ) (if (string= name "BBOX") (progn (skip-stream in val) (print-chunck-tag in)) ) (if (string= name "POLS") (progn (skip-stream in val) (print-chunck-tag in)) ) (if (string= name "PTAG") (progn (skip-stream in val) (print-chunck-tag in)) ) (if (string= name "SURF") (progn (skip-stream in val) (print-chunck-tag in)) ) )) (defun print-tags-name (in len) (let ((ch)(tmp "")) (dotimes (cnt len) (setq ch (read-char in nil)) (if (= 0 (char-code ch)) (setq tmp (concat tmp "_")) (setq tmp (concat tmp (format nil "~C" ch))))) (princ (format nil "\ttagname: ~A\n" tmp)))) (defun skip-stream (in cnt) (dotimes (x cnt) (read-char in nil))) (defun scan-lwo (fn) "lightwaveオブジェクトファイル解析" (interactive "F") (with-output-to-temp-buffer ("*lwo解析結果*") (with-open-file (in fn :direction :input :encoding :binary) (let ((ch)(stat 0)(cnt 0)(val 0)(tag "")(tmp)) (print-chunck-tag in)))))
- 結果
tag: FORM length: 382 tag: TAGS length: 14 tagname: DkBlu_Default_ tag: LAYR length: 18 tagname: tag: PNTS length: 96 tag: BBOX length: 24 tag: POLS length: 64 tag: PTAG length: 28 tag: PTAG length: 28 tag: SURF length: 42