何かを書き込む場所を知るために構成ファイルを読み取るデーモンがあります。構成ファイルには、次のような行があります。
output = /tmp/foo/%d/%s/output
または、次のようになります。
output = /tmp/foo/%s/output/%d
...または単にこのように:
output = /tmp/foo/%s/output
...または最後に:
output = /tmp/output
プログラム内にcfg->pathfmtとしてその行があります。私が今やろうとしているのは、それを賢く使う方法を考え出すことです。
もう少し説明すると、パスにはフォーマットするコンポーネントを最大2つ含めることができます。%dはジョブID(int)として展開され、%sはジョブ名(string)として展開されます。ユーザーは、構成ファイルで1つ、両方、または何も使用したくない場合があります。最終的にsnprintf()に渡す前に、彼らが何をどのような順序で望んでいるかを知る必要があります。少し絞り込むことはできますが、strtok()と話したいので、醜いようです。
私はユーザーにこの種の柔軟性を提供したいのですが、それを実装するための賢明でポータブルな方法を探すことに迷っています。私はまた、これを探し始める方法について完全にそして完全に途方に暮れています。
次の場合はとても嬉しいです:
- 誰かが私が良い例を見つけるために検索フレーズを絞り込むのを手伝ってくれるかもしれません
- 誰かがこれを実装するOSSプロジェクトへのリンクを投稿する可能性があります
- 誰かが疑似コードを投稿する可能性があります
私は自分のためにコードを書いてほしくありません。私は(私が思うに)非常に単純なものであるべきものに本当に固執していて、最初の一口を取るのに助けが必要です。当たり前のことを考えすぎて見落としているような気がします。
最終結果は、次のようなブール関数になります。
bool output_sugar(const char *fmt, int jobid, const char *jobname, struct job *j);
次に、j-> outpathでsnprintf()を(適切に)呼び出し、ある種のガベージ(つまり、%の後にs、d、または%以外のものが続く)が構成行(またはそのnull)にある場合はfalseを返します。健全性チェックは簡単です。フォーマットを正しくするための引数の数(および順序)を取得するのに少し時間がかかっています。
前もって感謝します。また、評判がよければ、このタイトルを自由に編集してください。私が言ったように、1行で質問する方法がよくわかりません。必要なのはパーサーだと思いますが、本格的なレクサー/パーサーを使用して1つの単純な文字列を処理するのは厄介です。