Files
mercury/tests/hard_coded/string_alignment_bug.m
Zoltan Somogyi 3364b69e34 Simplify a test.
2023-05-02 02:22:46 +10:00

149 lines
3.8 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
%
% mercury 0.8 failed this test on some architectures,
% because string literals were not aligned but deep_copy()
% was assuming that they were.
%
:- module string_alignment_bug.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module bool.
:- import_module int.
:- import_module list.
:- import_module map.
:- import_module maybe.
:- import_module pair.
:- import_module require.
:- import_module set_ordlist.
:- import_module solutions.
:- import_module string.
:- import_module univ.
main(!IO) :-
init_globals(!IO),
gen_tiles(10, 10, Tiles),
set_global("Tiles", Tiles, !IO),
init_selection(Selection),
set_global("Selection", Selection, !IO),
init_file(MFN),
set_global("CurrentFile", MFN, !IO).
% main(bedit.setup, ["robot"], !IO).
:- pred init_file(maybe(string)::out) is det.
init_file(no).
%---------------------------------------------------------------------------%
:- type pos == pair(int).
:- type selection == set_ordlist(pos).
:- pred init_selection(selection::out) is det.
init_selection(Sel) :-
set_ordlist.init(Sel).
%---------------------------------------------------------------------------%
:- type tile
---> tile(kind, list(int)).
:- type kind
---> plain.
:- pred gen_tiles(int::in, int::in, map(pos, tile)::out) is det.
gen_tiles(Xmax, Ymax, Tiles) :-
map.init(Tiles0),
AllPos =
( pred(Pos::out) is nondet :-
between(0, Xmax-1, X),
between(0, Ymax-1, Y),
Pos = X - Y
),
AddTile =
( pred(Pos::in, T0::in, T::out) is det :-
map.set(Pos, tile(plain, []), T0, T)
),
aggregate(AllPos, AddTile, Tiles0, Tiles).
%---------------------------------------------------------------------------%
:- pred between(int::in, int::in, int::out) is nondet.
between(Min, Max, I) :-
Min =< Max,
(
I = Min
;
Min1 = Min + 1,
between(Min1, Max, I)
).
%---------------------------------------------------------------------------%
:- pred init_globals(io::di, io::uo) is det.
init_globals(!IO) :-
my_map_init(Map),
type_to_univ(Map, UMap1),
copy(UMap1, UMap),
io.set_globals(UMap, !IO).
:- pred get_global(string::in, T::out, io::di, io::uo) is det.
get_global(Name, Value, !IO) :-
io.get_globals(UMap0, !IO),
( if univ_to_type(UMap0, Map0) then
( if map.search(Map0, Name, UValue) then
( if univ_to_type(UValue, Value0) then
Value = Value0
else
string.format("globals: value for `%s' has bad type",
[s(Name)], Str),
error(Str)
)
else
string.format("globals: %s not found", [s(Name)], Str),
error(Str)
)
else
error("globals: global store stuffed up")
).
:- pred set_global(string::in, T::in, io::di, io::uo) is det.
set_global(Name, Value, !IO) :-
io.get_globals(UMap0, !IO),
( if univ_to_type(UMap0, Map0) then
type_to_univ(Value, UValue),
io.write_string("Current global store:\n", !IO),
io.write_line(Map0, !IO),
io.format("Adding `%s': ", [s(Name)], !IO),
io.write_line(Value, !IO),
map.set(Name, UValue, Map0, Map),
io.write_string("New global store:\n", !IO),
io.write_line(Map, !IO),
type_to_univ(Map, UMap1),
copy(UMap1, UMap),
io.set_globals(UMap, !IO)
else
error("globals: global store stuffed up")
).
:- pred my_map_init(map(string, univ)::out) is det.
my_map_init(Map) :-
map.init(Map).