Repository navigation
Expand file tree
/
Copy pathglobals.m
More file actions
210 lines (151 loc) · 7.01 KB
/
Copy pathglobals.m
File metadata and controls
210 lines (151 loc) · 7.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
%-----------------------------------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et wm=0 tw=0
%-----------------------------------------------------------------------------%
% Copyright (C) 1994-1998, 2001, 2006, 2011 The University of Melbourne.
% Copyright (C) 2015, 2024 The Mercury team.
% This file may only be copied under the terms of the GNU General
% Public License - see the file COPYING in the Mercury distribution.
%-----------------------------------------------------------------------------%
%
% File: globals.m.
% Main author: conway, bromage.
%
% This module exports the `globals' type and associated access predicates.
% The globals type is used to collect together all the various data
% that would be global variables in an imperative language.
% This global data is stored in a mutable attached to the I/O state.
%
%-----------------------------------------------------------------------------%
%-----------------------------------------------------------------------------%
:- module globals.
:- interface.
:- import_module diff_out.
:- import_module options.
:- import_module bool.
:- import_module getopt.
:- import_module io.
:- import_module list.
%-----------------------------------------------------------------------------%
:- type globals.
% Access predicates for the `globals' structure.
:- pred init(option_table::in, globals::out) is det.
:- pred get_options(globals::in, option_table::out) is det.
:- pred set_options(option_table::in, globals::in, globals::out) is det.
:- pred get_output_style(globals::in, output_style::out) is det.
:- pred set_output_style(output_style::in, globals::in, globals::out) is det.
:- pred lookup_option(globals::in, option::in, option_data::out) is det.
:- pred lookup_bool_option(globals::in, option::in, bool::out) is det.
:- pred lookup_int_option(globals::in, option::in, int::out) is det.
:- pred lookup_string_option(globals::in, option::in, string::out) is det.
:- pred lookup_accumulating_option(globals::in, option::in, list(string)::out)
is det.
%-----------------------------------------------------------------------------%
% Access predicates for storing a `globals' structure in a mutable
% attached to the I/O state.
:- pred io_init(option_table::in, io::di, io::uo) is det.
:- pred io_get_output_style(output_style::out, io::di, io::uo) is det.
:- pred io_set_output_style(output_style::in, io::di, io::uo) is det.
:- pred io_lookup_option(option::in, option_data::out,
io::di, io::uo) is det.
:- pred io_set_option(option::in, option_data::in,
io::di, io::uo) is det.
:- pred io_lookup_bool_option(option::in, bool::out,
io::di, io::uo) is det.
:- pred io_lookup_int_option(option::in, int::out,
io::di, io::uo) is det.
:- pred io_lookup_string_option(option::in, string::out,
io::di, io::uo) is det.
:- pred io_lookup_accumulating_option(option::in, list(string)::out,
io::di, io::uo) is det.
%-----------------------------------------------------------------------------%
%-----------------------------------------------------------------------------%
:- implementation.
:- import_module map.
:- import_module require.
%-----------------------------------------------------------------------------%
:- mutable(globals_var, globals, globals(map.init, normal), ground,
[attach_to_io_state, untrailed]).
%-----------------------------------------------------------------------------%
:- type globals
---> globals(
option_table, % Current options.
output_style % Current output style.
).
init(Options, globals(Options, OutputType)) :-
default_output_style(OutputType).
get_options(globals(Options, _), Options).
set_options(Options, globals(_, Scanner), globals(Options, Scanner)).
get_output_style(globals(_, Output), Output).
set_output_style(Output, globals(A, _), globals(A, Output)).
lookup_option(Globals, Option, OptionData) :-
globals.get_options(Globals, OptionTable),
map.lookup(OptionTable, Option, OptionData).
%-----------------------------------------------------------------------------%
lookup_bool_option(Globals, Option, Value) :-
globals.lookup_option(Globals, Option, OptionData),
( if OptionData = bool(Bool) then
Value = Bool
else
error("globals.lookup_bool_option: invalid bool option")
).
lookup_string_option(Globals, Option, Value) :-
globals.lookup_option(Globals, Option, OptionData),
( if OptionData = string(String) then
Value = String
else
error("globals.lookup_string_option: invalid string option")
).
lookup_int_option(Globals, Option, Value) :-
globals.lookup_option(Globals, Option, OptionData),
( if OptionData = int(Int) then
Value = Int
else
error("globals.lookup_int_option: invalid int option")
).
lookup_accumulating_option(Globals, Option, Value) :-
globals.lookup_option(Globals, Option, OptionData),
( if OptionData = accumulating(Accumulating) then
Value = Accumulating
else
error("globals.lookup_accumulating_option: invalid accumulating option")
).
%-----------------------------------------------------------------------------%
%-----------------------------------------------------------------------------%
io_init(Options, !IO) :-
globals.init(Options, Globals),
set_globals_var(Globals, !IO).
%-----------------------------------------------------------------------------%
io_lookup_option(Option, OptionData, !IO) :-
get_globals_var(Globals, !IO),
globals.get_options(Globals, OptionTable),
map.lookup(OptionTable, Option, OptionData).
io_set_option(Option, OptionData, !IO) :-
get_globals_var(Globals0, !IO),
globals.get_options(Globals0, OptionTable0),
map.set(Option, OptionData, OptionTable0, OptionTable),
globals.set_options(OptionTable, Globals0, Globals),
set_globals_var(Globals, !IO).
%-----------------------------------------------------------------------------%
io_lookup_bool_option(Option, Value, !IO) :-
get_globals_var(Globals, !IO),
globals.lookup_bool_option(Globals, Option, Value).
io_lookup_int_option(Option, Value, !IO) :-
get_globals_var(Globals, !IO),
globals.lookup_int_option(Globals, Option, Value).
io_lookup_string_option(Option, Value, !IO) :-
get_globals_var(Globals, !IO),
globals.lookup_string_option(Globals, Option, Value).
io_lookup_accumulating_option(Option, Value, !IO) :-
get_globals_var(Globals, !IO),
globals.lookup_accumulating_option(Globals, Option, Value).
%-----------------------------------------------------------------------------%
io_get_output_style(Output, !IO) :-
get_globals_var(Globals, !IO),
globals.get_output_style(Globals, Output).
io_set_output_style(Output, !IO) :-
get_globals_var(Globals0, !IO),
globals.set_output_style(Output, Globals0, Globals),
set_globals_var(Globals, !IO).
%-----------------------------------------------------------------------------%
:- end_module globals.
%-----------------------------------------------------------------------------%