[metapost] Still experimenting with MPlib
Nicola
nvitacolonna at gmail.com
Tue Dec 13 10:29:46 CET 2016
Hi,
I'm still experimenting with MPlib, and there is something that I do not
understand. I hope you can help me. I have tried the following program:
void imp_init_mp_instance()
{
MP_options *opt = mp_options();
opt->ini_version = 0;
opt->mem_name = "mpost";
opt->command_line = NULL;
opt->noninteractive = 1;
imp = mp_initialize(opt);
if (!imp) { exit(EXIT_FAILURE); }
mp_execute(imp, "\\", 1); // Flush MetaPost introductory text
}
int main(void)
{
imp_init_mp_instance();
char *line[] = {
"if 1=0:",
"message \"tsk\";",
"fi;"
};
for (int i = 0; i < 3; i++) {
mp_execute(imp, line[i], strlen(line[i]));
mp_run_data *cmd_result = mp_rundata(imp);
printf("%s", cmd_result->term_out.data);
printf("Status: %d\n", mp_status(imp));
}
}
This results in the MP instance being in an error state, and the error
message is the following:
! Missing `:' has been inserted.
<inserted text>
:
<to be read again>
fi
<*> fi
;
! A statement can't begin with `:'.
<to be read again>
:
<to be read again>
fi
<*> fi
;
! Extra tokens will be flushed.
<to be read again>
:
<to be read again>
fi
<*> fi
;
Of course, this doesn't work as in mpost's prompt, as I had naïvely
expected. So, should mp_execute() be fed with complete statements only?
It is not clear to me what happens internally when mp_execute() is
passed an incomplete statement. For example, if I call:
mp_execute(imp, "x=1", 3); // Note the missing semi-colon
mp_execute(imp, "show x;", 7);
this acts as if x=1 was ignored (`show x` prints `>> x`). But the
example above seems to indicate that this is not the case (if incomplete
statements were ignored, I'd get an `! Extra fi.` error after the third
invocation).
Nicola
More information about the metapost
mailing list