From fd2b3afc7001cc76cd14ffd453bcd09f9d2d0158 Mon Sep 17 00:00:00 2001 From: Neil Date: Sun, 30 Apr 2023 13:27:47 -0700 Subject: [PATCH] scan place in progress --- src/scan.re.c | 84 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 30 deletions(-) diff --git a/src/scan.re.c b/src/scan.re.c index cbc47ec..ec3b05a 100644 --- a/src/scan.re.c +++ b/src/scan.re.c @@ -128,14 +128,16 @@ static int scan_day(struct scan *const scan, union date32 date, re2c:define:YYSETCONDITION:naked = 1; ws = [ \t]; - glyph = [^\x00-\x20\x7f]; // [^\x00\n\t ] + all weird + glyph = [^\x00-\x20\x7f] | [\x80-\xff]; // [^\x00\n\t ] + all weird semitext = glyph \ ";"; natural = [1-9][0-9]*; zero_natural = [0-9]+; decimal = "-"? zero_natural ("." zero_natural?)?; uint = [0-9]+; keyword = [A-Za-z0-9][A-Za-z0-9_-]*; - label = semitext+ (" " semitext+)*; // perhaps??? do we want to include ;? + labelchar = glyph \ [;]; // perhaps? + labelchar0 = labelchar \ [()]; // because conflicts + label = (labelchar0 labelchar*) (" " labelchar+)*; date = natural "-" [0-1][0-9] "-" [0-3][0-9]; minutes = [0-5][0-9]; airport = [A-Z0-9]{4,4}; @@ -159,20 +161,45 @@ static int scan_day(struct scan *const scan, union date32 date, * { fail = "place unrecognized"; goto catch; } + @s0 label @s1 / "\n" => skip { also_place: { + const struct pair keyword = pair(s0, s1); + const union line64 key = { { (uint32_t)line, date } }; + size_t i, *pi; + if(line > UINT32_MAX) + { errno = ERANGE; fail = "too many lines of text"; goto catch; } + /*fprintf(stderr, "map: <<%.*s>> out of %s\n", (int)(s1 - s0), s0, + pair_map_table_to_string(&scan->places.map));*/ + if(!(i = pair_map_table_get(&scan->places.map, keyword))) + { fail = "keyword not introduced"; /*goto catch;*/ continue; } + switch(linemap_tree_bulk_assign(&scan->places.dates, key, &pi)) { + case TREE_PRESENT: fail = "duplicate"; case TREE_ERROR: goto catch; + case TREE_ABSENT: *pi = i; break; + } + fprintf(stderr, "%s[%zu]: place <<%.*s>>\n", + datestr, line, (int)(s1 - s0), s0); + } continue; } "(" @t0 decimal "," @t1 decimal ")" ws+ @s0 label @s1 / "\n" => skip { const struct pair keyword = pair(s0, s1); const double x = strtod(t0, 0), y = strtod(t1, 0); /* Safe? */ - fprintf(stderr, "%s: new place: (%.*s)(%f,%f) <<%.*s>>\n", - datestr, (int)(s0 - t0), t0 - 1, x, y, (int)(s1-s0), s0); - continue; - } - @s0 label @s1 / "\n" => skip { - const struct pair keyword = pair(s0, s1); - fprintf(stderr, "place: <<%.*s>>\n", (int)(s1-s0), s0); - continue; + size_t *idx; + struct place *place; + switch(pair_map_table_assign(&scan->places.map, keyword, &idx)) { + case TABLE_PRESENT: errno = EDOM; fail = "new keyword already used"; + case TABLE_ERROR: goto catch; /* /\ _Sic_. */ + case TABLE_ABSENT: *idx = 0; break; /* Good. */ + } + if(!(place = place_array_new(&scan->places.array))) goto catch; + *idx = (size_t)(place - scan->places.array.data); + place->name.a = s0, place->name.b = s1; + place->x = x, place->y = y; + fprintf(stderr, + "%s[%zu]: new place: <<%.*s>> at (%f,%f) stored at %zu.\n", + datestr, line, (int)(s1 - s0), s0, x, y, *idx); + goto also_place; } + * { fail = "source unrecognized"; goto catch; } @s0 keyword @s1 / "\n" => skip { also_source: { const struct pair keyword = pair(s0, s1); @@ -186,8 +213,8 @@ static int scan_day(struct scan *const scan, union date32 date, case TREE_PRESENT: fail = "duplicate"; case TREE_ERROR: goto catch; case TREE_ABSENT: *pi = i; break; } - fprintf(stderr, "%s: source <<%.*s>>\n", - datestr, (int)(s1 - s0), s0); + fprintf(stderr, "%s[%zu]: source <<%.*s>>\n", + datestr, line, (int)(s1 - s0), s0); } continue; } /* New source. fixme: desc not set. */ @s0 keyword @s1 ":" [^\x00\n]+ / "\n" => skip { @@ -202,9 +229,9 @@ static int scan_day(struct scan *const scan, union date32 date, if(!(source = source_array_new(&scan->sources.array))) goto catch; *idx = (size_t)(source - scan->sources.array.data); source->name.a = s0, source->name.b = s1; - source->desc.a = 0, source->desc.b = 0; - fprintf(stderr, "%s: new source <<%.*s>> stored in list at %zu.\n", - datestr, (int)(s1 - s0), s0, *idx); + source->desc.a = 0, source->desc.b = 0; /* fixme */ + fprintf(stderr, "%s[%zu]: new source <<%.*s>> stored at %zu.\n", + datestr, line, (int)(s1 - s0), s0, *idx); goto also_source; } @@ -228,7 +255,8 @@ static int scan_day(struct scan *const scan, union date32 date, case TREE_ERROR: goto catch; case TREE_ABSENT: *pidx = idx; break; } - fprintf(stderr, "%s: score <%.*s>\n", datestr, (int)(s1 - s0), s0); + fprintf(stderr, "%s[%zu]: score <%.*s>\n", + datestr, line, (int)(s1 - s0), s0); } continue; } /* New score. */ @s0 keyword @s1 ":" => score_name { @@ -249,8 +277,8 @@ static int scan_day(struct scan *const scan, union date32 date, new_score->name.a = 0, new_score->name.b = 0; new_score->date.u32 = new_score->last.u32 = 0; new_score->edges = 0, new_score->score = 0; - fprintf(stderr, "%s: new score <%.*s> stored in list at %zu.\n", - datestr, (int)(s1 - s0), s0, *idx); + fprintf(stderr, "%s[%zu]: new score <%.*s> stored at %zu.\n", + datestr, line, (int)(s1 - s0), s0, *idx); goto new_score; } * { fail = "name unrecognized"; goto catch; } @@ -295,10 +323,9 @@ static int scan_day(struct scan *const scan, union date32 date, * { fail = "glider launch"; goto catch; } ws* @s0 airport @s1 ws* ";" => glider_how { new_glider->launch.a = s0, new_glider->launch.b = s1; - fprintf(stderr, "%s: glider <%.*s> at <%.*s>\n", datestr, - (int)(new_glider->reg.b - new_glider->reg.a), - new_glider->reg.a, - (int)(s1 - s0), s0); + fprintf(stderr, "%s[%zu]: glider <<%.*s>> at <<%.*s>>\n", + datestr, line, (int)(new_glider->reg.b - new_glider->reg.a), + new_glider->reg.a, (int)(s1 - s0), s0); continue; } * { fail = "glider how"; goto catch; } @@ -370,10 +397,9 @@ static int scan_day(struct scan *const scan, union date32 date, ws* @t0 airport @t1 ws* ";" => flight_pic { new_flight->launch.a = s0, new_flight->launch.b = s1; new_flight->landing.a = t0, new_flight->landing.b = t1; - fprintf(stderr, "%s: flight <%.*s> at <%.*s>\n", datestr, - (int)(new_flight->reg.b - new_flight->reg.a), - new_flight->reg.a, - (int)(s1 - s0), s0); + fprintf(stderr, "%s[%zu]: flight <<%.*s>> at <<%.*s>>\n", + datestr, line, (int)(new_flight->reg.b - new_flight->reg.a), + new_flight->reg.a, (int)(s1 - s0), s0); continue; } * { fail = "flight pic"; goto catch; } @@ -537,12 +563,10 @@ static int scan_day(struct scan *const scan, union date32 date, value->verse_end = verse_end; break; } - fprintf(stderr, "%s: KJV %s %" PRIu32 ":%" PRIu32, - datestr, kjv_book_string[book], chapter, verse); + fprintf(stderr, "%s[%zu]: KJV %s %" PRIu32 ":%" PRIu32, + datestr, line, kjv_book_string[book], chapter, verse); if(verse_end) fprintf(stderr, "-%u", verse_end); fprintf(stderr, "\n"); - - fprintf(stderr, ""); book = Revelation, chapter = 0, verse = 0, verse_end = 0; continue; }