diff --git a/hello/config.txt b/hello/config.txt new file mode 100644 index 0000000..7771d71 --- /dev/null +++ b/hello/config.txt @@ -0,0 +1,33 @@ +# Example application configuration file + +version = "1.0"; + +application: +{ + window: + { + title = "My Application"; + size = { w = 640; h = 480; }; + pos = { x = 350; y = 250; }; + }; + + list = ( ( "abc", 123, true ), 1.234, ( /* an empty list */ ) ); + + books = ( { title = "Treasure Island"; + author = "Robert Louis Stevenson"; + price = 29.95; + qty = 5; }, + { title = "Snow Crash"; + author = "Neal Stephenson"; + price = 9.99; + qty = 8; } ); + + misc: + { + pi = 3.141592654; + bigint = 9223372036854775807L; + columns = [ "Last Name", "First Name", "MI" ]; + bitmask = 0x1FC3; // hex + umask = 0027; // octal. Range limited to that of "int" + }; +}; diff --git a/hello/example.cfg b/hello/example.cfg new file mode 100644 index 0000000..13cb6b4 --- /dev/null +++ b/hello/example.cfg @@ -0,0 +1,46 @@ +// An example configuration file that stores information about a store. + +// Basic store information: +name = "Books, Movies & More"; + +// Store inventory: +inventory = +{ + books = ( { title = "Treasure Island"; + author = "Robert Louis Stevenson"; + price = 29.99; + qty = 5; }, + { title = "Snow Crash"; + author = "Neal Stephenson"; + price = 9.99; + qty = 8; } + ); + + movies = ( { title = "Brazil"; + media = "DVD"; + price = 19.99; + qty = 11; }, + { title = "The City of Lost Children"; + media = "DVD"; + price = 18.99; + qty = 5; }, + { title = "Memento"; + media = "Blu-Ray"; + price = 24.99; + qty = 20; + }, + { title = "Howard the Duck"; } + ); +}; + +// Store hours: +hours = +{ + mon = { open = 9; close = 18; }; + tue = { open = 9; close = 18; }; + wed = { open = 9; close = 18; }; + thu = { open = 9; close = 18; }; + fri = { open = 9; close = 20; }; + sat = { open = 9; close = 20; }; + sun = { open = 11; close = 16; }; +}; \ No newline at end of file diff --git a/hello/main.c b/hello/main.c new file mode 100644 index 0000000..fea2a10 --- /dev/null +++ b/hello/main.c @@ -0,0 +1,103 @@ +#include +//for use of exit() +#include +//for use of libconfig +#include + +int main(int argc, char *argv[]) { + fprintf(stdout,"main() Started...\n"); + + /*read command line*/ + if (argc > 1){ + printf("main() argv[1]: %s\n", argv[1]); + }else{ + fprintf(stderr, "Usage: %s \n", argv[0]); + exit(1); + } + + config_t cfg; + config_setting_t *setting; + const char *str; + + /*initialise new and EMPTY config*/ + config_init(&cfg); + + /* Read the file. If there is an error, report it and exit. */ + if(! config_read_file(&cfg, argv[1])) + { + fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg), + config_error_line(&cfg), config_error_text(&cfg)); + /*destroy config, BUT NOT the structure*/ + config_destroy(&cfg); + return(EXIT_FAILURE); + } + + /* Get the store name. */ + if(config_lookup_string(&cfg, "name", &str)) + printf("Store name: %s\n\n", str); + else + fprintf(stderr, "No 'name' setting in configuration file.\n"); + + /* Output a list of all books in the inventory. */ + setting = config_lookup(&cfg, "inventory.books"); + if(setting != NULL) + { + int count = config_setting_length(setting); + fprintf(stdout, "count: %d\n", count); + int i; + + printf("%-30s %-30s %-6s %s\n", "TITLE", "AUTHOR", "PRICE", "QTY"); + + for(i = 0; i < count; ++i) + { + config_setting_t *book = config_setting_get_elem(setting, i); + + /* Only output the record if all of the expected fields are present. */ + const char *title, *author; + double price; + int qty; + + if(!(config_setting_lookup_string(book, "title", &title) + && config_setting_lookup_string(book, "author", &author) + && config_setting_lookup_float(book, "price", &price) + && config_setting_lookup_int(book, "qty", &qty))) + continue; + + printf("%-30s %-30s $%6.2f %3d\n", title, author, price, qty); + } + putchar('\n'); + } + + /* Output a list of all movies in the inventory. */ + setting = config_lookup(&cfg, "inventory.movies"); + if(setting != NULL) + { + unsigned int count = config_setting_length(setting); + fprintf(stdout, "count: %d\n", count); + unsigned int i; + + printf("%-30s %-10s %-6s %s\n", "TITLE", "MEDIA", "PRICE", "QTY"); + for(i = 0; i < count; ++i) + { + config_setting_t *movie = config_setting_get_elem(setting, i); + + /* Only output the record if all of the expected fields are present. */ + const char *title, *media; + double price; + int qty; + + if(!(config_setting_lookup_string(movie, "title", &title) + && config_setting_lookup_string(movie, "media", &media) + && config_setting_lookup_float(movie, "price", &price) + && config_setting_lookup_int(movie, "qty", &qty))) + continue; + + printf("%-30s %-10s $%6.2f %3d\n", title, media, price, qty); + } + putchar('\n'); + } + + config_destroy(&cfg); + fprintf(stdout,"main() Done.\n"); + return(EXIT_SUCCESS); +} diff --git a/hello/makefile b/hello/makefile new file mode 100644 index 0000000..24a0576 --- /dev/null +++ b/hello/makefile @@ -0,0 +1,24 @@ +# Docu +# +#$@ is the name of the file to be made +#$? is the names of the changed dependents +#$< the name of the related file that caused the action +#$* the prefix shared by target and dependent files +# +# Others +RM = /bin/rm -f +# +# Source, Executable, Includes, Library Defines +EXE = main +# +# Compiler, Linker Defines +CC = /usr/bin/gcc +# +all: main.o + $(CC) main.c -L/usr/lib/x86_64-linux-gnu -lconfig -Wall -o $(EXE) +# +main.o: + $(CC) -c main.c +# Clean Up Objects, Exectuables, Dumps out of source directory +clean: + $(RM) *.o $(EXE) *~ diff --git a/hello/readme.md b/hello/readme.md new file mode 100644 index 0000000..7037178 --- /dev/null +++ b/hello/readme.md @@ -0,0 +1,23 @@ +* install dependencies on Debian Bullseye + +``` +sudo apt install libconfig-dev --no-install-recommends +``` + +* build + +``` +make clean all +``` + +* cleanup + +``` +make clean +``` + +* run + +``` +./main +```