From dfa758e1dd36149a03a285e4731741da64eb1236 Mon Sep 17 00:00:00 2001 From: Ben Winston Date: Tue, 18 Jun 2024 12:01:42 -0400 Subject: refactor: search with a loop through fields instead of ifs --- booki.c | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) (limited to 'booki.c') diff --git a/booki.c b/booki.c index 34cd4c1..682f333 100644 --- a/booki.c +++ b/booki.c @@ -923,32 +923,27 @@ void search(int argc, char* argv[], char* booki_file) { for (i = 0; i < search_opts.count; i++) { field = search_opts.opts[i]; - // compare fields - if (ATTR_MATCH(field, "title")) { - if (!match_string(search_opts.args[i], book.title)) - break; - } else if (ATTR_MATCH(field, "author")) { - if (!match_string(search_opts.args[i], book.author)) - break; - } else if (ATTR_MATCH(field, "language")) { - if (!match_string(search_opts.args[i], book.language)) - break; - } else if (ATTR_MATCH(field, "translator")) { - if (!match_string(search_opts.args[i], book.translator)) - break; - } else if (ATTR_MATCH(field, "on")) { - if (!match_string(search_opts.args[i], book.on)) - break; - } else if (ATTR_MATCH(field, "pages")) { - if (!match_int(search_opts.args[i], book.pages)) - break; - } else if (ATTR_MATCH(field, "published")) { - if (!match_int(search_opts.args[i], book.published)) - break; - } else { - printf("unsupported field: %s\n", field); - break; + // loop through all datafields + DataField datafield; + int j; + for (j = 0; j < BOOK_FIELDS_COUNT; j++) { + datafield = BOOK_FIELDS[j]; + if (!ATTR_MATCH(field, datafield.name)) + continue; + + if (datafield.type == booki_string) { + if (!match_string(search_opts.args[i], *(get_string_field(&book, datafield.name)))) + break; + } else if (datafield.type == booki_number) { + if (!match_int(search_opts.args[i], *(get_number_field(&book, datafield.name)))) + break; + } } + + // if we found something, break out of the search loop + if (j != BOOK_FIELDS_COUNT) + break; + } match = i == search_opts.count; -- cgit v1.2.3