/** @license 2022 Neil Edelman, distributed under the terms of the [MIT License](https://opensource.org/licenses/MIT). Scan journal entries for kjv references. */ #include "../src/journal.h" #include "../src/kjv.h" #include "../src/helper.h" #include #include #include #include /*!conditions:re2c*/ static int scan(union date32 date, const char *const buffer, struct kjv *const kj) { const char *YYCURSOR, *YYMARKER, *yyt1, *yyt2, *yyt3, *s0, *s1, *t0, *t1; enum kjv_book book = Revelation; uint32_t chapter, verse; enum YYCONDTYPE condition = yycline; size_t line = 1; char datestr[12] = {0}; assert(buffer && kj); YYCURSOR = YYMARKER = yyt1 = buffer; /*!re2c /**/ re2c:define:YYCTYPE = char; re2c:yyfill:enable = 0; re2c:define:YYGETCONDITION = "condition"; re2c:define:YYSETCONDITION = "condition = @@;"; re2c:define:YYGETCONDITION:naked = 1; re2c:define:YYSETCONDITION:naked = 1; unix_control = [\x01-\x08\x0a-\x1f\x7f]; ws = [ \t]; glyph = [^] \ ("\x00" | "\n" | unix_control | ws); natural = [1-9][0-9]*; lookat = ws* natural ":" natural [ab]? ("-" (natural ":")? natural [ab]?)? ws* "--"; */ for( ; ; ) { /*!re2c /**/ * { goto catch; } "\x00" { return 1; } "\n" { line++; continue; } * :=> skip "Genesis" / lookat => book { book = Genesis; continue; } "Exodus" / lookat => book { book = Exodus; continue; } /*| "Leviticus" | "Numbers" | "Deuteronomy" | "Joshua" | "Judges" | "Ruth" | "I"{1,2} " Samuel" | "I"{1,2} " Kings" | "I"{1,2} " Chronicles" | "Ezra" | "Nehemiah" | "Esther" | "Job" | "Psalms" | "Proverbs" | "Ecclesiastes" | "Song of Solomon" | "Isaiah" | "Jeremiah" | "Lamentations" | "Ezekiel" | "Daniel" | "Hosea" | "Joel" | "Amos" | "Obadiah" | "Jonah" | "Micah" | "Nahum" | "Habakkuk" | "Zephaniah" | "Haggai" | "Zechariah" | "Malachi" | "Matthew" | "Mark" | "Luke" | "John" | "Acts" | */ "Romans" / lookat => book { book = Romans; continue; } /*| "I"{1,2} " Corinthians" | "Galatians" | "Ephesians" | "Philippians" | "Colossians" | "I"{1,2} " Thessalonians" | "I"{1,2} " Timothy" | "Titus" | "Philemon" | "Hebrews" | "James" | "I"{1,2} " Peter" | "I"{1,3} " John" | "Jude" | "Revelation") @s1 ws* / bible_ref ws+ "--" ws+ "``" */ // [^\n\x00]* newline { printf("throw\n"); line++; continue; } ws+ @s0 natural @s1 ":" @t0 natural @t1 [ab]? => skip { if(!helper_natural(s0, s1, &chapter) || !helper_natural(t0, t1, &verse)) goto catch; union kjvcite cite = { .book = book, .chapter = chapter, .verse = verse }; const size_t old_set_words = kj->set_words; char citestr[12]; if(!kjv_add(kj, cite)) goto catch; if(!*datestr) date32_to_string(date, &datestr); kjvcite_to_string(cite, &citestr); printf("%s\t%zu\t%zu\t# %s\n", datestr, old_set_words, kj->set_words, citestr); continue; } [^\n\x00]* "\n" => line { line++; continue; } //=> bible { x->s0 = s0, x->s1 = s1; return x->symbol = KJV_BOOK, 1; } */ } catch: if(!errno) errno = EILSEQ; { char a[12]; date32_to_string(date, &a); fprintf(stderr, "%s line %zu: unexpected.\n", a, line); } return 0; } int main(void) { int success = EXIT_SUCCESS; struct journal j; struct journal_iterator it; struct kjv kj = kjv(); union date32 k; union load *v; size_t i; /*scan((union date32){.year=2000, .month=1, .day=1}, "\n\n\n" "Romans 3:23 -- ``For all have sinned, " "and come short of the glory of God.''\n", &kj);*/ j = journal(); if(!journal_is_valid(&j)) goto catch; fprintf(stderr, "Journal: %s.\n", journal_to_string(&j)); printf("# date\told\tnew / %zu\n", kj.total_words); it = journal_begin(&j), i = 0; while(journal_next(&it, &k, &v)) { if(!scan(k, v->text, &kj)) goto catch; if(++i > 32) break; } goto finally; catch: success = EXIT_FAILURE; perror("journal"); finally: journal_(&j); return success; }