第11章 smb.confファイル

Chris Hertel

November 1997

目次

Lexical Analysis
空白の取り扱い
継続行の取り扱い
偶然による行の結合
文法
params.cについて

Lexical Analysis

基本的に、ファイルは行単位で処理される。構文解析ルーチン(param.c)によって認識される 4つのタイプの行がある。

  1. 空白行 - 空白のみを含む行。

  2. コメント行 - セミコロンかシャープ記号で始まる行(';' か '#')。

  3. セクションヘッダー行 - 左大括弧で始まる行('[')。

  4. パラメーター行 - その他の文字で始まる行。 (既定値の行タイプ)

最初の2つはもっぱら構文解釈ルーチンによって無視される。残りの2つのタイプは、 以下を解釈する。

  1. - セクション名

  2. - パラメーター名

  3. - パラメーター値

パラメーターローダー(loadparm.c)にトークンのみが渡される。パラメーター名と値はそれぞれを 等号('=')で分離される。

空白の取り扱い

空白は改行文字('\n')以外、isspace()関数(ctype(3C)参照)によって、認識されるすべての 文字として定義される。行末を識別するという理由で、改行は除外される。

  1. 構文解析ルーチンは行の先頭からの空白を読み飛ばす。

  2. セクションとパラメーター名は内部に空白を含むことが出来る。名前の中にあるすべての空白は、 単一の空白文字に圧縮される。

  3. パラメーター値内部の空白は、それらすべてが削除されるキャリッジリターン文字('\r')を除き、 そのまま保持される。

  4. 名前と値の先頭およびそのあとの空白は削除される。

継続行の取り扱い

流しセクションヘッダーとパラメーター行は、バックスラッシュ文字('\\')を使って、 複数の行に継続しても良い。継続行は、空白とコメント行に対しては無視される。

もしも、セクションヘッダー内か、パラメーター行上にある最後の(非空白)文字は、バックスラッシュ 文字であり、次に、次の行が、構文解析ルーチンによって、(論理的に)現在の行に対して 結合される。例は以下の通り:

	param name = parameter value string \
	with line continuation.

は以下と同値である

    param name = parameter value string     with line continuation.

単語'string'の後に5つの空白があり、最初の行中の'stging'と'\\'の間に1つの空白があり、 さらに、2番目の行の'with'の前に4つの空白があることに注意(もちろん、 インデントをカウントしている)。

継続行文字は空白行とコメントの最後では無視される。セクションとパラメーター行*のみで* 解釈される。

偶然による行の結合

以下の例に注意:

	param name = parameter value string \
    \
    with line continuation.

真ん中の行は、最初の行の行に結合されるため、空白行としては*処理されない*。 結果は以下のようになる。

param name = parameter value string         with line continuation.

コメントラインに対してもこのことは成立する。

	param name = parameter value string \
	; comment \
    with a comment.

これは以下のようになる:

param name = parameter value string     ; comment     with a comment.

セクションヘッダー行状に置いて、閉じ大括弧(']')は終端文字として考慮され、行の残りの 部分は無視される。以下のような例

	[ section   name ] garbage \
    param  name  = value

は下記のように解釈される。

	[section name]
    param name = value

文法

smb.confファイルの文法は以下のようになる:

  <file>            :==  { <section> } EOF
  <section>         :==  <section header> { <parameter line> }
  <section header>  :==  '[' NAME ']'
  <parameter line>  :==  NAME '=' VALUE NL

基本的に、これの意味は以下のようになる

  1. ファイルは0個以上のセクションからなり、EOF(それを知っているので)によって 終端する。

  2. セクションは0行以上のパラメーターが続くセクションヘッダーからなる。

  3. セクションヘッダーは左大括弧により定義され、右大括弧により閉じる。囲まれた 名前がセクションを識別する。

  4. パラメーター行は名前と値に分割される。行中の*最初の*等号は、名前と値を分割する。 値は改行文字(NL = '\n')によって終端する。

params.cについて

configファイルの解析は、もしもlex,yacc,bisonなどを使っていた場合、独特なものと 感じるだろう。構文解析(スキャン)はparams.cによって行われる。loadparm.cにコールバック することでロードされる。