パターンマッチ#1

文字列から正規表現を使ってパターンマッチをするには、string-matchを使う。
バッファを対象にパターンマッチは、re-search-forwardのようね。

CIIフォーマットでは、データレコードで類似のパターンがあるので、
パターンマッチの照合順序を気をつけないと別の種類のデータレコード
と識別されてしまう。

  1. 可変データ長250バイト以下固定長レコード(MGD_monoTR)
  2. 固定データ長のデータレコード(MGD_ffmtTR)
  3. 可変データ長251バイト以上固定長レコードの最終レコード(MGD_termTR)

この順序でパターンマッチするぜよ。

(defvar MGH_vlt "^0C.\\\(............\\\)\\\(............\\\)\\\(............\\\)\\\(............\\\)\\\(............\\\)\\\(............\\\)............\\\(....\\\)\\\(...\\\)\\\(...\\\)10.*")
(defvar MGH_flt "^0C.\\\(............\\\)\\\(............\\\)\\\(............\\\)\\\(............\\\)\\\(............\\\)\\\(............\\\)............\\\(....\\\)\\\(...\\\)\\\(...\\\)11.*")
(defvar MGH_ff  "^0C.\\\(............\\\)\\\(............\\\)\\\(............\\\)\\\(............\\\)\\\(............\\\)\\\(............\\\)............\\\(....\\\)\\\(...\\\)\\\(...\\\)20.*")
(defvar MGD_monoTR "^9D\\\([0-9][0-9][0-9][0-9][0-9]\\\).*\xfe.*")
(defvar MGD_initTR "^1D\\\([0-9][0-9][0-9][0-9][0-9]\\\).*")
(defvar MGD_extrTR "^[1-8].*")
(defvar MGD_termTR "^9.*")
(defvar MGD_ffmtTR "^9D\\\([0-9][0-9][0-9][0-9][0-9]\\\).*")
(defvar MGT        "^0E\\\([0-9][0-9][0-9][0-9][0-9]\\\).*")
(defvar Invalid    "^.*")
(defvar EOF        nil)

ちゃんと照合できたか確かめるために、結果出力用の関数を定義する。

(defun to_s (o)
  (if (eq o EOF)
      ""
    (cond ((string-match MGH_vlt o)
	   (symbol-name 'MGH_vlt))
	  ((string-match MGH_flt o)
	   (symbol-name 'MGH_flt))
	  ((string-match MGH_ff o)
	   (symbol-name 'MGH_ff))
	  ((string-match MGD_monoTR o)
	   (symbol-name 'MGD_monoTR))
	  ((string-match MGD_ffmtTR o)
	   (symbol-name 'MGD_ffmtTR))
	  ((string-match MGD_initTR o)
	   (symbol-name 'MGD_initTR))
	  ((string-match MGD_extrTR o)
	   (symbol-name 'MGD_extrTR))
	  ((string-match MGD_termTR o)
	   (symbol-name 'MGD_termTR))
	  ((string-match MGT o)
	   (symbol-name 'MGT))
	  ((string-match Invalid o)
	   (symbol-name 'Invalid))
	  )
    ))

(setq f (find-file-noselect "~/test.cii"))
(while (setq a (seq-read f))
  (insert (to_s a) "\n")
  )

MGH_flt
MGD_monoTR
MGD_initTR
MGD_termTR
MGD_initTR
MGD_extrTR
MGD_extrTR
MGD_extrTR
MGD_extrTR
MGD_extrTR
MGD_extrTR
MGD_extrTR
MGD_extrTR
MGD_termTR
MGT
MGH_ff
MGD_ffmtTR
MGD_ffmtTR
MGD_ffmtTR
MGT
nil

OK。OK。