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 だったり、 その場その場で色々です。下手に構造を仮定して構文解析すると 危険かも。

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

応用

[4]

[3] 他にも沢山ある。

類似

[1] INIファイルと類似の構文のもの: EditorConfig

メモ

[2] Cloanto Implementation of INI File Format ( 版) http://cloanto.com/specs/ini/