[m-users.] Segmentation violation on FFI wrapper for linenoise-ng
Julien Fischer
jfischer at opturion.com
Sun Jun 20 00:11:24 AEST 2021
On Sat, 19 Jun 2021, Sean Charles (emacstheviking) wrote:
> WAAAAAT!
>
> :facepalm:
>
> I took that print line out, removed ’the fix’/…….I don’t think I need tell you how it went.
>
> Sometimes it never fails to baffle me, after 35 years, that sometimes you can fail to read and understand your own code.
>
> :D
>
> Sigh… you live and learn. I hope.
>
> Thanks Julien, I am going outside to self-flagellate with some nettles I mowed down this morning…..
For the record, I would probably wrap the linenoise() function as in the
following (untested) code:
:- type ln_read_result
---> ok(string).
; eof.
:- pred ln_read(string::in, ln_read_result::out, io::di, io::uo) is det.
ln_read(Prompt, Result, !IO) :-
do_ln_read(Prompt, RawResult, Line, !IO),
(
RawResult = ok,
Result = ok(Line)
;
RawResult = eof,
Result = eof
).
:- type raw_ln_result
---> ln_result_ok
; ln_result_eof.
:- pragma foreign_export_enum("C", ln_result/0, [uppercase]).
:- pragma foreign_decl("C", "#include ""mercury_string.h""").
:- pred do_ln_read(string::in, raw_ln_result::out, string::out, io::di, io::uo)
is det.
:- pragma foreign_proc( "C",
do_ln_read(Prompt::in, Result::out, Line::out, _IO0::di, _IO::uo),
[will_not_throw_exception, promise_pure, tabled_for_io],
"
char* line = linenoise((const char*) Prompt);
if (line) {
linenoiseHistoryAdd(line);
Result = LN_RESULT_OK;
// Copy the string on to the Mercury heap.
MR_make_aligned_string_copy(Line, line);
} else {
Result = LN_RESULT_EOF;
// Set Line to a valid value so we do not crash the
// debugger.
Line = MR_make_string_const("""");
}
").
Julien.
More information about the users
mailing list