aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Winston2024-06-07 22:38:06 -0400
committerBen Winston2024-06-07 22:38:06 -0400
commit1513ad9beb5f5f69133e7588d2f17f878b7fd038 (patch)
treeb53d7f6f37f883bf108ca9fb369f84fce28dd8bc
parente3ab5c15ec7c8b26ec66b66604871c2d2c224d12 (diff)
when printing, lookup the type of field and print that way
-rw-r--r--booki.c73
1 files changed, 51 insertions, 22 deletions
diff --git a/booki.c b/booki.c
index aa25090..28cb2c3 100644
--- a/booki.c
+++ b/booki.c
@@ -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");