Works with ->?

This commit is contained in:
Neil 2023-04-30 15:31:10 -07:00
parent fd2b3afc70
commit 72385093bd

View File

@ -170,7 +170,7 @@ static int scan_day(struct scan *const scan, union date32 date,
/*fprintf(stderr, "map: <<%.*s>> out of %s\n", (int)(s1 - s0), s0, /*fprintf(stderr, "map: <<%.*s>> out of %s\n", (int)(s1 - s0), s0,
pair_map_table_to_string(&scan->places.map));*/ pair_map_table_to_string(&scan->places.map));*/
if(!(i = pair_map_table_get(&scan->places.map, keyword))) if(!(i = pair_map_table_get(&scan->places.map, keyword)))
{ fail = "keyword not introduced"; /*goto catch;*/ continue; } { fail = "keyword not introduced"; goto catch; }
switch(linemap_tree_bulk_assign(&scan->places.dates, key, &pi)) { switch(linemap_tree_bulk_assign(&scan->places.dates, key, &pi)) {
case TREE_PRESENT: fail = "duplicate"; case TREE_ERROR: goto catch; case TREE_PRESENT: fail = "duplicate"; case TREE_ERROR: goto catch;
case TREE_ABSENT: *pi = i; break; case TREE_ABSENT: *pi = i; break;
@ -198,6 +198,23 @@ static int scan_day(struct scan *const scan, union date32 date,
datestr, line, (int)(s1 - s0), s0, x, y, *idx); datestr, line, (int)(s1 - s0), s0, x, y, *idx);
goto also_place; goto also_place;
} }
// anonymous place: bypass map and have a 1:1 correspondence
<place> "(" @t0 decimal "," @t1 decimal ")" / "\n" => skip {
size_t *idx;
struct place *place;
const double x = strtod(t0, 0), y = strtod(t1, 0); /* Safe? */
const union line64 key = { { (uint32_t)line, date } };
if(!(place = place_array_new(&scan->places.array))) goto catch;
place->name.a = place->name.b = 0;
place->x = x, place->y = y;
switch(linemap_tree_bulk_assign(&scan->places.dates, key, &idx)) {
case TREE_PRESENT: fail = "duplicate"; case TREE_ERROR: goto catch;
case TREE_ABSENT: break;
}
*idx = (size_t)(place - scan->places.array.data);
continue;
}
<source> * { fail = "source unrecognized"; goto catch; } <source> * { fail = "source unrecognized"; goto catch; }
@ -614,6 +631,11 @@ struct scan scan(struct journal *const jrnl) {
if(!(nul = source_array_new(&scan.sources.array))) goto catch; if(!(nul = source_array_new(&scan.sources.array))) goto catch;
*nul = (struct source){0}; *nul = (struct source){0};
} }
{
struct place *nul;
if(!(nul = place_array_new(&scan.places.array))) goto catch;
*nul = (struct place){0};
}
{ {
struct score *nul; struct score *nul;
if(!(nul = score_array_new(&scan.scores.array))) goto catch; if(!(nul = score_array_new(&scan.scores.array))) goto catch;