基本的に、ファイルは行単位で処理される。構文解析ルーチン(param.c)によって認識される 4つのタイプの行がある。
空白行 - 空白のみを含む行。
コメント行 - セミコロンかシャープ記号で始まる行(';' か '#')。
セクションヘッダー行 - 左大括弧で始まる行('[')。
パラメーター行 - その他の文字で始まる行。 (既定値の行タイプ)
最初の2つはもっぱら構文解釈ルーチンによって無視される。残りの2つのタイプは、 以下を解釈する。
- セクション名
- パラメーター名
- パラメーター値
パラメーターローダー(loadparm.c)にトークンのみが渡される。パラメーター名と値はそれぞれを 等号('=')で分離される。
空白は改行文字('\n')以外、isspace()関数(ctype(3C)参照)によって、認識されるすべての 文字として定義される。行末を識別するという理由で、改行は除外される。
構文解析ルーチンは行の先頭からの空白を読み飛ばす。
セクションとパラメーター名は内部に空白を含むことが出来る。名前の中にあるすべての空白は、 単一の空白文字に圧縮される。
パラメーター値内部の空白は、それらすべてが削除されるキャリッジリターン文字('\r')を除き、 そのまま保持される。
名前と値の先頭およびそのあとの空白は削除される。
流しセクションヘッダーとパラメーター行は、バックスラッシュ文字('\\')を使って、 複数の行に継続しても良い。継続行は、空白とコメント行に対しては無視される。
もしも、セクションヘッダー内か、パラメーター行上にある最後の(非空白)文字は、バックスラッシュ 文字であり、次に、次の行が、構文解析ルーチンによって、(論理的に)現在の行に対して 結合される。例は以下の通り:
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
基本的に、これの意味は以下のようになる
ファイルは0個以上のセクションからなり、EOF(それを知っているので)によって 終端する。
セクションは0行以上のパラメーターが続くセクションヘッダーからなる。
セクションヘッダーは左大括弧により定義され、右大括弧により閉じる。囲まれた 名前がセクションを識別する。
パラメーター行は名前と値に分割される。行中の*最初の*等号は、名前と値を分割する。 値は改行文字(NL = '\n')によって終端する。