scan place in progress

This commit is contained in:
Neil 2023-04-30 13:27:47 -07:00
parent bfd8d797f9
commit fd2b3afc70
1 changed files with 54 additions and 30 deletions

View File

@ -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,
<place> * { fail = "place unrecognized"; goto catch; }
<place> @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; }
<place> "(" @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;
}
<place> @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;
}
<source> * { fail = "source unrecognized"; goto catch; }
<source> @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. */
<source> @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. */
<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;
}
<score_name> * { fail = "name unrecognized"; goto catch; }
@ -295,10 +323,9 @@ static int scan_day(struct scan *const scan, union date32 date,
<glider_launch> * { fail = "glider launch"; goto catch; }
<glider_launch> 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;
}
<glider_how> * { 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;
}
<flight_pic> * { 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;
}