diff options
| author | Ben Winston | 2024-06-07 22:38:06 -0400 |
|---|---|---|
| committer | Ben Winston | 2024-06-07 22:38:06 -0400 |
| commit | 1513ad9beb5f5f69133e7588d2f17f878b7fd038 (patch) | |
| tree | b53d7f6f37f883bf108ca9fb369f84fce28dd8bc | |
| parent | e3ab5c15ec7c8b26ec66b66604871c2d2c224d12 (diff) | |
when printing, lookup the type of field and print that way
| -rw-r--r-- | booki.c | 73 |
1 files changed, 51 insertions, 22 deletions
@@ -408,6 +408,34 @@ void init_book(BOOK* book) { book->published = 0; } +#define ATTR_MATCH(cand, attr) (strncmp(cand, attr, strlen(attr)) == 0) + +ES get_string_field(BOOK book, char* name) { + if (ATTR_MATCH(name, "title")) + return book.title; + else if (ATTR_MATCH(name, "author")) + return book.author; + else if (ATTR_MATCH(name, "isbn")) + return book.isbn; + else if (ATTR_MATCH(name, "language")) + return book.language; + else if (ATTR_MATCH(name, "translator")) + return book.translator; + else if (ATTR_MATCH(name, "on")) + return book.on; + else + return default_es; +} + +int get_number_field(BOOK book, char* name) { + if (ATTR_MATCH(name, "pages")) + return book.pages; + else if (ATTR_MATCH(name, "published")) + return book.published; + else + return -1; +} + void print_book(BOOK book, bool all_fields) { char str[100]; int size = concat_es_print(&(book.author), str); @@ -415,26 +443,29 @@ void print_book(BOOK book, bool all_fields) { if (all_fields) { char* esfmt = " - %s: %.*s\n"; char* intfmt = " - %s: %d\n"; - if (book.isbn.ptr) { - printf(esfmt, "isbn", book.isbn.len, book.isbn.ptr); - } - if (book.language.ptr) { - size = concat_es_print(&(book.language), str); - printf(esfmt, "language", size, str); - } - if (book.translator.ptr) { - size = concat_es_print(&(book.translator), str); - printf(esfmt, "translator", size, str); - } - if (book.pages) { - printf(intfmt, "pages", book.pages); - } - if (book.published) { - printf(intfmt, "published", book.published); - } - if (book.on.ptr) { - size = concat_es_print(&(book.on), str); - printf(esfmt, "on", size, str); + + // loop through BOOK_FIELDs, skipping title and author + DataField datafield; + ES string_field; + int number_field; + for (int i = 2; i < BOOK_FIELDS_COUNT; i++) { + datafield = BOOK_FIELDS[i]; + + // string fields + if (datafield.type == booki_string) { + string_field = get_string_field(book, datafield.name); + // if we don't have anything in this field, don't print it + if (!string_field.ptr) + continue; + size = concat_es_print(&string_field, str); + printf(esfmt, datafield.name, size, str); + // number fields + } else if (datafield.type == booki_number) { + number_field = get_number_field(book, datafield.name); + if (!number_field) + continue; + printf(intfmt, datafield.name, number_field); + } } } } @@ -596,7 +627,6 @@ ES parse_strings(char* current_pos, char** new_pos) { } } -#define ATTR_MATCH(cand, attr) (strncmp(cand, attr, strlen(attr)) == 0) void parse_book(char* current_pos, BOOK* book) { char* attr; @@ -982,7 +1012,6 @@ void help(bool err) { /*** the main event ***/ int main(int argc, char* argv[]) { - char* booki_file = getenv("BOOKI_FILE"); if (!booki_file) { printf("expecting BOOKI_FILE variable\n"); |
