INIファイル

INIファイル

Windows の世界でよく使われているファイル形式です。 悪名高い WIN.INISYSTEM.INI を筆頭に、 各種応用の設定を保存するのが主な用途です。

Win32 の治世になってからは INI ファイルの代わりに レジストリに設定情報を保存することが推奨されてます。 しかし Win32API でも INI ファイルを扱う関数は依然として 用意されています (古い時代のものゆえ結構制限があるけど (けち臭いことせずなおせよ))。で、レジストリ・データベースは 汚くなるのが嫌われる(笑)ので、無料ソフトウェアを中心に 根強い人気(謎)があります。

また、その他の INFファイルインターネット・ショートカット の形式にも用いられているなど、 Windoze の逝きもとい生き続ける限り 不滅のデータ形式かもしれません(藁)。

正式な仕様はしりません。 M$SDK にでもついてるんでしょうか? 最近は無料で見れるらしいですが (いい時代になったもんです。) とても見る気になりませんな・・・。

以下で使う用語は、 Win32API の関数名の定義なんかに出てくる よーなのとか、それを使った実装とかから推定した名称に、 必要に応じてでっちあげた用語を補っております。 どーせ M$ のことだから、用語に一貫性なんてないでしょうし、 別にいいでしょ? (その内ネガチブなんとかとかなんとか♭って名前で 復活するかもよ?)

もちろん、 BNF もでっち上げです。

構造

  1. ini-document = [preamble] *section
  2. comment = *WSP [ ";" *ctext ]
  3. ctext = %x00-09 / %x0B-0C / %x0E-FF

基本的には、節 section と呼ばれる領域が連なった構造に なってます。一番最初に、どの節にも属さないデータが 入ることがあります。「レジストリの項目 (*.reg)」という 形式では、「REGEDIT4」みたいに、版情報が入ったりします。

文字コードはてきとーです。その動いている Windoze が使っているもの。つまり可搬性が無い・・。 昔昔のそういう時代に設計されたんですからしゃーないですが。

注釈 comment は、大体どこでも書けます。ただ、処理系によっては 注釈をちゃんと処理せず、値の一部にするかもしれません。

行末の WSP はたぶん無視されます。

前書き preamble

  1. preamble = section-content

どの節にも属さない最初の部分を、(正式な名前があるのか 知りませんが) 前書きと呼ぶことにします。

前書きの中身は、他の節とかわりありません。 前書きはばっさり省略可能です。

節 section

  1. section = section-name section-content *empty-line
  2. section-name = "[" stext "]" [comment] CRLF
  3. stext = %x00-5B / %x5D-FF / obs-stext
  4. obs-stext = "[" / "]"
  5. section-content = entry-list / line-list
  6. empty-line = [comment] CRLF

INI ファイルの主となる部分です。各ファイルに任意の個数 入れられます。 (Win32API 的には個数制限があったかも。 それから、中身の大きさ制限とかもあったな・・・。)

節名には、 "[" や "]" を入れると、 Win32API はいかれた かもしれません。とはいえその辺触ってたのは昔の話なんで、 よく覚えてません。なんせ、使わないほうがよさげ。

節は入れ子に出来ません。どうしても必要なら節名を工夫して擬似的に するとか。

節の中身は、通常は行ごとに名前=値なんですけど、 INF ファイルとかで、そうでないこともしばしばあります。

節の中身の形式を知る方法はありません。 実装(用途)ごとに決めうちでしょう。

節の終わりには、任意個の空行を入れられます。これは 人間編集者のみやすさのためで、実装は節の内容一部の空行 として扱うものもあるみたいです。

項目達 entry-list

  1. entry-list = *(entry / empty-line)
  2. entry = entry-name "=" entry-value [comment] CRLF / obs-entry
  3. obs-entry = entry-name *WSP "=" *WSP entry-value [comment] CRLF
  4. entry-name = *etext / quoted-string
  5. entry-value = *etext / quoted-string
  6. etext = %x00-08 / %x0B-0C / %x0E-1F / %x21 / %x23-3A / %x3C / %x3E-5A / %x5C-FF ;; OCTET except CR, LF, WSP, ";", "=", "["
  7. quoted-string = <"> qtext <">
  8. qtext = %x00-08 / %x0B-0C / %x0E-1F / %x21 / %x23-%x5B / %x5D-FF / quoted-pair
  9. quoted-pair = "\" <">

正統的(?)な節の中身です。

quoted-pair は、「レジストリの項目」で使われてます。 <"> 以外の文字にも使えるのかは不明です。

行達 line-list

  1. line-list = *(line / empty-line)
  2. line = *(lcontent / quoted-string) [comment] CRLF
  3. lcontent = *ltext
  4. ltext = %x00-%x09 / %x0B-0C / %x0E-21 / %x23-3A / %x3C-5B / %x5D-FF ;; OCTET except CR, LF, ";", "["

構造の無い行の連続です。まあ構造は無いとは言っても、 実際には命令の集合だったり、 CSV だったり、 その場その場で色々です。下手に構造を仮定して構文解析すると 危険かも。

実装によっては注釈[行]を認めていなかったりだし。

応用

他にも沢山ある。