1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-06 00:54:21 +03:00
inform7/inter/pipeline-module/Chapter 2/Read, Move, Stop Stages.w
2022-02-03 15:51:44 +00:00

58 lines
1.7 KiB
OpenEdge ABL

[SimpleStages::] Read, Move, Stop Stages.
Four simple pipeline stages.
@ =
void SimpleStages::create_pipeline_stages(void) {
ParsingPipelines::new_stage(I"stop", SimpleStages::run_stop_stage, NO_STAGE_ARG, FALSE);
ParsingPipelines::new_stage(I"read", SimpleStages::run_read_stage, FILE_STAGE_ARG, TRUE);
ParsingPipelines::new_stage(I"move", SimpleStages::run_move_stage, GENERAL_STAGE_ARG, TRUE);
}
@h Read.
=
int SimpleStages::run_read_stage(pipeline_step *step) {
filename *F = step->ephemera.parsed_filename;
if (Inter::Binary::test_file(F)) Inter::Binary::read(step->ephemera.tree, F);
else Inter::Textual::read(step->ephemera.tree, F);
return TRUE;
}
@h Move.
=
int SimpleStages::run_move_stage(pipeline_step *step) {
match_results mr = Regexp::create_mr();
inter_package *pack = NULL;
if (Regexp::match(&mr, step->step_argument, L"(%d):(%c+)")) {
int from_rep = Str::atoi(mr.exp[0], 0);
if (step->ephemera.pipeline->ephemera.trees[from_rep] == NULL) {
PipelineErrors::error_with(step, "there is no Inter tree in slot %S", mr.exp[0]);
return FALSE;
}
pack = InterPackage::from_URL(
step->ephemera.pipeline->ephemera.trees[from_rep], mr.exp[1]);
if (pack == NULL) {
PipelineErrors::error_with(step, "that tree has no such package as '%S'", mr.exp[1]);
return FALSE;
}
} else {
PipelineErrors::error_with(step,
"destination should take the form 'N:URL', not '%S'", mr.exp[1]);
return FALSE;
}
Regexp::dispose_of(&mr);
Inter::Transmigration::move(pack, LargeScale::main_package(step->ephemera.tree), FALSE);
return TRUE;
}
@h Stop.
The "stop" stage is special, in that it always returns false, thus stopping
the pipeline:
=
int SimpleStages::run_stop_stage(pipeline_step *step) {
return FALSE;
}