TOML ใน c99; สอดคล้องกับเวอร์ชัน 1.0
หากคุณกำลังมองหาไลบรารี C++ คุณอาจลองใช้ wrapper นี้: https://github.com/cktan/tomlcpp
โปรดดูไฟล์ toml.h
สำหรับรายละเอียด ต่อไปนี้เป็นตัวอย่างง่ายๆ ที่แยกวิเคราะห์ไฟล์กำหนดค่านี้:
[ server ]
host = " www.example.com "
port = [ 8080 , 8181 , 8282 ]
ขั้นตอนปกติในการรับค่าจากไฟล์มีดังนี้
ด้านล่างนี้เป็นตัวอย่างการแยกวิเคราะห์ค่าจากตารางตัวอย่าง
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include "toml.h"
static void error ( const char * msg , const char * msg1 )
{
fprintf ( stderr , "ERROR: %s%sn" , msg , msg1 ? msg1 : "" );
exit ( 1 );
}
int main ()
{
FILE * fp ;
char errbuf [ 200 ];
// 1. Read and parse toml file
fp = fopen ( "sample.toml" , "r" );
if (! fp ) {
error ( "cannot open sample.toml - " , strerror ( errno ));
}
toml_table_t * conf = toml_parse_file ( fp , errbuf , sizeof ( errbuf ));
fclose ( fp );
if (! conf ) {
error ( "cannot parse - " , errbuf );
}
// 2. Traverse to a table.
toml_table_t * server = toml_table_in ( conf , "server" );
if (! server ) {
error ( "missing [server]" , "" );
}
// 3. Extract values
toml_datum_t host = toml_string_in ( server , "host" );
if (! host . ok ) {
error ( "cannot read server.host" , "" );
}
toml_array_t * portarray = toml_array_in ( server , "port" );
if (! portarray ) {
error ( "cannot read server.port" , "" );
}
printf ( "host: %sn" , host . u . s );
printf ( "port: " );
for ( int i = 0 ; ; i ++ ) {
toml_datum_t port = toml_int_at ( portarray , i );
if (! port . ok ) break ;
printf ( "%d " , ( int ) port . u . i );
}
printf ( "n" );
// 4. Free memory
free ( host . u . s );
toml_free ( conf );
return 0 ;
}
ตาราง TOML เป็นพจนานุกรมที่ใช้ค้นหาโดยใช้คีย์สตริง โดยทั่วไปแล้ว ฟังก์ชันการเข้าถึงทั้งหมดบนตารางจะมีชื่อว่า toml_*_in(...)
ในกรณีปกติ คุณจะทราบคีย์และประเภทเนื้อหา และการดึงข้อมูลสามารถทำได้โดยใช้ฟังก์ชันอย่างใดอย่างหนึ่งต่อไปนี้
toml_string_in ( tab , key );
toml_bool_in ( tab , key );
toml_int_in ( tab , key );
toml_double_in ( tab , key );
toml_timestamp_in ( tab , key );
toml_table_in ( tab , key );
toml_array_in ( tab , key );
คุณยังสามารถซักถามคีย์ในตารางโดยใช้ดัชนีจำนวนเต็ม:
toml_table_t * tab = toml_parse_file (...);
for ( int i = 0 ; ; i ++ ) {
const char * key = toml_key_in ( tab , i );
if (! key ) break ;
printf ( "key %d: %sn" , i , key );
}
อาร์เรย์ TOML สามารถยกเลิกการแก้ไขได้โดยใช้ดัชนีจำนวนเต็ม โดยทั่วไป วิธีการเข้าถึงทั้งหมดบนอาร์เรย์จะมีชื่อว่า toml_*_at()
วิธีรับขนาดของอาร์เรย์:
int size = toml_array_nelem ( arr );
หากต้องการรับเนื้อหาของอาร์เรย์ ให้ใช้ดัชนีที่ถูกต้องและเรียกใช้หนึ่งในฟังก์ชันเหล่านี้:
toml_string_at ( arr , idx );
toml_bool_at ( arr , idx );
toml_int_at ( arr , idx );
toml_double_at ( arr , idx );
toml_timestamp_at ( arr , idx );
toml_table_at ( arr , idx );
toml_array_at ( arr , idx );
ฟังก์ชัน toml_*_at
และ toml_*_in
บางฟังก์ชันส่งคืนโครงสร้าง toml_datum_t ค่าสถานะ ok
ในโครงสร้างบ่งชี้ว่าการเรียกใช้ฟังก์ชันสำเร็จหรือไม่ หากเป็นเช่นนั้น คุณสามารถอ่านค่าที่สอดคล้องกับประเภทของเนื้อหาต่อไปได้
ตัวอย่างเช่น:
toml_datum_t host = toml_string_in(tab, "host");
if (host.ok) {
printf("host: %sn", host.u.s);
free(host.u.s); /* FREE applies to string and timestamp types only */
}
** สำคัญ: หากค่าที่เข้าถึงเป็นสตริงหรือการประทับเวลา คุณต้องโทร free(datum.us)
หรือ free(datum.u.ts)
ตามลำดับหลังการใช้งาน -
ธรรมดา ก็ เพียงพอแล้ว คุณยังสามารถรวมไฟล์ toml.c
และ toml.h
ในโปรเจ็กต์ของคุณได้
การเรียกใช้ make install
จะติดตั้งส่วนหัวและไฟล์ไลบรารีลงใน /usr/local/{include,lib}
หรือระบุ make install prefix=/a/file/path
ที่จะติดตั้งลงใน /a/file/path/{include,lib}
หากต้องการทดสอบกับชุดการทดสอบมาตรฐานที่จัดทำโดย toml-lang/toml-test:
% make
% cd test1
% bash build.sh # do this once
% bash run.sh # this will run the test suite
วิธีทดสอบกับชุดทดสอบมาตรฐานที่ iarna/toml ให้มา:
% make
% cd test2
% bash build.sh # do this once
% bash run.sh # this will run the test suite