aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Winston2024-06-18 12:01:42 -0400
committerBen Winston2024-06-18 12:01:42 -0400
commitdfa758e1dd36149a03a285e4731741da64eb1236 (patch)
tree24a26b6a397886ea2f053f7eca5a0cd34cae95fd
parent10bbb7c6f91dc0cb434bb84409029316341d9826 (diff)
refactor: search with a loop through fields instead of ifs
-rw-r--r--booki.c45
1 files changed, 20 insertions, 25 deletions
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;