1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 10:04:21 +03:00
inform7/inter/pipeline-module/Chapter 5/Activities.w

87 lines
3.9 KiB
OpenEdge ABL
Raw Normal View History

2021-04-28 11:14:20 +03:00
[SynopticActivities::] Activities.
2021-05-06 11:59:32 +03:00
To compile the main/synoptic/activities submodule.
2021-04-28 11:14:20 +03:00
@ Our inventory |inv| already contains a list |inv->activity_nodes| of all packages
in the tree with type |_activity|.
2021-04-28 11:14:20 +03:00
=
2021-11-15 01:40:33 +02:00
void SynopticActivities::compile(inter_tree *I, pipeline_step *step, tree_inventory *inv) {
2022-02-03 01:35:38 +02:00
if (InterNodeList::array_len(inv->activity_nodes) > 0) @<Assign unique activity ID numbers@>;
@<Define ACTIVITY_AFTER_RULEBOOKS array@>;
@<Define ACTIVITY_ATB_RULEBOOKS array@>;
@<Define ACTIVITY_BEFORE_RULEBOOKS array@>;
@<Define ACTIVITY_FOR_RULEBOOKS array@>;
@<Define ACTIVITY_VAR_CREATORS array@>;
2021-04-28 11:14:20 +03:00
}
@ Each activity package contains a numeric constant with the symbol name |activity_id|.
We want to ensure that these ID numbers are contiguous from 0 and never duplicated,
so we change the values of these constants accordingly.
In addition, each activity has an ID used to identify itself as the owner of a slate
of variables, and we set this to the activity ID plus 10000. (This scheme assumes
there are never more than 10000 rules, or 10000 activities, or 10000 actions.)
@<Assign unique activity ID numbers@> =
2022-02-03 01:35:38 +02:00
InterNodeList::array_sort(inv->activity_nodes, MakeSynopticModuleStage::module_order);
for (int i=0; i<InterNodeList::array_len(inv->activity_nodes); i++) {
2022-03-01 02:41:22 +02:00
inter_package *pack = PackageInstruction::at_this_head(inv->activity_nodes->list[i].node);
inter_tree_node *D = Synoptic::get_definition(pack, I"activity_id");
ConstantInstruction::set_constant(D, InterValuePairs::number((inter_ti) i));
D = Synoptic::get_optional_definition(pack, I"var_id");
if (D) ConstantInstruction::set_constant(D,
2022-02-27 20:14:05 +02:00
InterValuePairs::number((inter_ti) i+10000));
}
@<Define ACTIVITY_AFTER_RULEBOOKS array@> =
2022-01-16 01:49:25 +02:00
inter_name *iname = HierarchyLocations::iname(I, ACTIVITY_AFTER_RULEBOOKS_HL);
2021-11-15 01:40:33 +02:00
Synoptic::begin_array(I, step, iname);
2022-02-03 01:35:38 +02:00
for (int i=0; i<InterNodeList::array_len(inv->activity_nodes); i++) {
2022-03-01 02:41:22 +02:00
inter_package *pack = PackageInstruction::at_this_head(inv->activity_nodes->list[i].node);
inter_symbol *vc_s = Metadata::required_symbol(pack, I"^after_rulebook");
Synoptic::symbol_entry(vc_s);
2021-04-28 11:14:20 +03:00
}
Synoptic::end_array(I);
2021-04-28 11:14:20 +03:00
@<Define ACTIVITY_ATB_RULEBOOKS array@> =
2022-01-16 01:49:25 +02:00
inter_name *iname = HierarchyLocations::iname(I, ACTIVITY_ATB_RULEBOOKS_HL);
Synoptic::begin_byte_array(I, step, iname);
2022-02-03 01:35:38 +02:00
for (int i=0; i<InterNodeList::array_len(inv->activity_nodes); i++) {
2022-03-01 02:41:22 +02:00
inter_package *pack = PackageInstruction::at_this_head(inv->activity_nodes->list[i].node);
2021-04-28 11:14:20 +03:00
inter_ti ubf = Metadata::read_numeric(pack, I"^used_by_future");
Synoptic::numeric_entry(ubf);
2021-04-28 11:14:20 +03:00
}
Synoptic::end_array(I);
2021-04-28 11:14:20 +03:00
@<Define ACTIVITY_BEFORE_RULEBOOKS array@> =
2022-01-16 01:49:25 +02:00
inter_name *iname = HierarchyLocations::iname(I, ACTIVITY_BEFORE_RULEBOOKS_HL);
2021-11-15 01:40:33 +02:00
Synoptic::begin_array(I, step, iname);
2022-02-03 01:35:38 +02:00
for (int i=0; i<InterNodeList::array_len(inv->activity_nodes); i++) {
2022-03-01 02:41:22 +02:00
inter_package *pack = PackageInstruction::at_this_head(inv->activity_nodes->list[i].node);
inter_symbol *vc_s = Metadata::required_symbol(pack, I"^before_rulebook");
Synoptic::symbol_entry(vc_s);
2021-04-28 11:14:20 +03:00
}
Synoptic::end_array(I);
2021-04-28 11:14:20 +03:00
@<Define ACTIVITY_FOR_RULEBOOKS array@> =
2022-01-16 01:49:25 +02:00
inter_name *iname = HierarchyLocations::iname(I, ACTIVITY_FOR_RULEBOOKS_HL);
2021-11-15 01:40:33 +02:00
Synoptic::begin_array(I, step, iname);
2022-02-03 01:35:38 +02:00
for (int i=0; i<InterNodeList::array_len(inv->activity_nodes); i++) {
2022-03-01 02:41:22 +02:00
inter_package *pack = PackageInstruction::at_this_head(inv->activity_nodes->list[i].node);
inter_symbol *vc_s = Metadata::required_symbol(pack, I"^for_rulebook");
Synoptic::symbol_entry(vc_s);
2021-04-28 11:14:20 +03:00
}
Synoptic::end_array(I);
2021-04-28 11:14:20 +03:00
@<Define ACTIVITY_VAR_CREATORS array@> =
2022-01-16 01:49:25 +02:00
inter_name *iname = HierarchyLocations::iname(I, ACTIVITY_VAR_CREATORS_HL);
2021-11-15 01:40:33 +02:00
Synoptic::begin_array(I, step, iname);
2022-02-03 01:35:38 +02:00
for (int i=0; i<InterNodeList::array_len(inv->activity_nodes); i++) {
2022-03-01 02:41:22 +02:00
inter_package *pack = PackageInstruction::at_this_head(inv->activity_nodes->list[i].node);
inter_symbol *vc_s = Metadata::optional_symbol(pack, I"^var_creator");
if (vc_s) Synoptic::symbol_entry(vc_s);
else Synoptic::numeric_entry(0);
2021-04-28 11:14:20 +03:00
}
Synoptic::end_array(I);