Posted at

C言語でTOMLファイルを読み込むプログラムを作ってみた

More than 1 year has passed since last update.


きっかけ

Rust の学習中に TOMLファイル形式に出会いました。

最初は「iniファイルにそっくりだなー」って印象しかなかったけれど、改めて考えてみると記述されている内容が読みやすいということを理解できました。

以下は設定例です。

[owner]

name = "Tom Preston-Werner"
dob = 1979-05-27T07:32:00-08:00 # First class dates

[database]
server = "192.168.1.1"
ports = [ 8001, 8001, 8002 ]
connection_max = 5000
enabled = true

設定情報が [ ] で囲まれた名称で段落で纏められているのがイメージできると思います。

json形式の代替と考えられていますが、実際は完全に置き換えるのではなく、使い分けかなと思います(jsonはデータ構造の表現に優れていると思います)

C言語では XML/jsonではなく、ini/confファイルを使うのが通例ですが、配列表現など不適であり、自分はこれからはTOMLを使おうと実装してみました。


開発環境

GitHubにソースファイルを公開しています。

Windows、Visual Studio 2017で開発しているため環境依存な部分も許容しています。

例えば、


  • mallocは失敗したらアプリケーションがアボートします

  • メモリの使用量は大目に使えるとして実装しています

  • リトルエンディアンを前提にしています


TOMLは面白いなー

設定ファイル記述向けとして必要とされているためか面白い記述方法がありますね。

str1 = "The quick brown fox jumps over the lazy dog."

str3 = """\
The quick brown \
fox jumps over \
the lazy dog.\
"""

上記の str1 と str2 は同じ値になります \ が次の空白、改行以外の文字を見つけれまで読み飛ばすという仕様があるため不要な空白を無くしてくれます。

XMLで改行を含む文字列を使用する場合、エスケープ文字を使わない場合ネストが崩れてしまいますが、可読性を損ねずシンプルに文字列を表現できていると思います。

また、数値の区切りに _ が使用できること。

int5 = 1_000

int6 = 5_349_221

これも設定ファイルの読みやすさを支える機能でしょう。

しばらく C言語でアルゴリズムを記述する機会はないと思いますが、使う機会を楽しみにしています。