1 /*
2 Copyright (C) 2001-2012, 2014-2020 Free Software Foundation, Inc.
3 Written by Keisuke Nishida, Roger While, Simon Sobisch, Edward Hart
4
5 This file is part of GnuCOBOL.
6
7 The GnuCOBOL compiler is free software: you can redistribute it
8 and/or modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation, either version 3 of the
10 License, or (at your option) any later version.
11
12 GnuCOBOL is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GnuCOBOL. If not, see <https://www.gnu.org/licenses/>.
19 */
20
21
22 #include <config.h>
23
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <stddef.h>
27 #include <string.h>
28 #include <ctype.h>
29
30 #include "cobc.h"
31 #include "tree.h"
32 #include <parser.h>
33
34 /* Local variables */
35
36 struct system_name_struct {
37 const char *name;
38 const enum cb_system_name_category category;
39 const int token;
40 enum cb_feature_mode active;
41 };
42
43 /* TODO: allow these to not only be enabled/disabled but defined by compiler configuration
44 removing duplicates from this list (especially concerning the switches) */
45 static struct system_name_struct system_name_table[] = {
46 {"SYSIN", CB_DEVICE_NAME, CB_DEVICE_SYSIN, CB_FEATURE_ACTIVE},
47 {"SYSIPT", CB_DEVICE_NAME, CB_DEVICE_SYSIN, CB_FEATURE_ACTIVE},
48 {"STDIN", CB_DEVICE_NAME, CB_DEVICE_SYSIN, CB_FEATURE_ACTIVE},
49 {"SYSOUT", CB_DEVICE_NAME, CB_DEVICE_SYSOUT, CB_FEATURE_ACTIVE},
50 {"SYSLIST", CB_DEVICE_NAME, CB_DEVICE_SYSOUT, CB_FEATURE_ACTIVE},
51 {"SYSLST", CB_DEVICE_NAME, CB_DEVICE_SYSOUT, CB_FEATURE_ACTIVE},
52 {"SYSPCH", CB_DEVICE_NAME, CB_DEVICE_SYSPCH, CB_FEATURE_ACTIVE},
53 {"SYSPUNCH", CB_DEVICE_NAME, CB_DEVICE_SYSPCH, CB_FEATURE_ACTIVE},
54 {"STDOUT", CB_DEVICE_NAME, CB_DEVICE_SYSOUT, CB_FEATURE_ACTIVE},
55 {"PRINT", CB_DEVICE_NAME, CB_DEVICE_SYSOUT, CB_FEATURE_ACTIVE},
56 {"PRINTER", CB_DEVICE_NAME, CB_DEVICE_PRINTER, CB_FEATURE_ACTIVE},
57 {"PRINTER-1", CB_DEVICE_NAME, CB_DEVICE_PRINTER, CB_FEATURE_ACTIVE},
58 {"SYSERR", CB_DEVICE_NAME, CB_DEVICE_SYSERR, CB_FEATURE_ACTIVE},
59 {"STDERR", CB_DEVICE_NAME, CB_DEVICE_SYSERR, CB_FEATURE_ACTIVE},
60 {"CONSOLE", CB_DEVICE_NAME, CB_DEVICE_CONSOLE, CB_FEATURE_ACTIVE},
61 {"C01", CB_FEATURE_NAME, CB_FEATURE_C01, CB_FEATURE_ACTIVE},
62 {"C02", CB_FEATURE_NAME, CB_FEATURE_C02, CB_FEATURE_ACTIVE},
63 {"C03", CB_FEATURE_NAME, CB_FEATURE_C03, CB_FEATURE_ACTIVE},
64 {"C04", CB_FEATURE_NAME, CB_FEATURE_C04, CB_FEATURE_ACTIVE},
65 {"C05", CB_FEATURE_NAME, CB_FEATURE_C05, CB_FEATURE_ACTIVE},
66 {"C06", CB_FEATURE_NAME, CB_FEATURE_C06, CB_FEATURE_ACTIVE},
67 {"C07", CB_FEATURE_NAME, CB_FEATURE_C07, CB_FEATURE_ACTIVE},
68 {"C08", CB_FEATURE_NAME, CB_FEATURE_C08, CB_FEATURE_ACTIVE},
69 {"C09", CB_FEATURE_NAME, CB_FEATURE_C09, CB_FEATURE_ACTIVE},
70 {"C10", CB_FEATURE_NAME, CB_FEATURE_C10, CB_FEATURE_ACTIVE},
71 {"C11", CB_FEATURE_NAME, CB_FEATURE_C11, CB_FEATURE_ACTIVE},
72 {"C12", CB_FEATURE_NAME, CB_FEATURE_C12, CB_FEATURE_ACTIVE},
73 {"S01", CB_FEATURE_NAME, CB_FEATURE_FORMFEED, CB_FEATURE_ACTIVE},
74 {"S02", CB_FEATURE_NAME, CB_FEATURE_FORMFEED, CB_FEATURE_ACTIVE},
75 {"S03", CB_FEATURE_NAME, CB_FEATURE_FORMFEED, CB_FEATURE_ACTIVE},
76 {"S04", CB_FEATURE_NAME, CB_FEATURE_FORMFEED, CB_FEATURE_ACTIVE},
77 {"S05", CB_FEATURE_NAME, CB_FEATURE_FORMFEED, CB_FEATURE_ACTIVE},
78 /*{"AFP-5A ", CB_FEATURE_NAME, CB_FEATURE_AFP_5A , CB_FEATURE_ACTIVE},*/
79 {"CSP", CB_FEATURE_NAME, CB_FEATURE_FORMFEED, CB_FEATURE_ACTIVE},
80 {"FORMFEED", CB_FEATURE_NAME, CB_FEATURE_FORMFEED, CB_FEATURE_ACTIVE},
81 {"TOP", CB_FEATURE_NAME, CB_FEATURE_FORMFEED, CB_FEATURE_ACTIVE},
82 {"CALL-CONVENTION", CB_FEATURE_NAME, CB_FEATURE_CONVENTION, CB_FEATURE_ACTIVE},
83 {"SWITCH-0", CB_SWITCH_NAME, CB_SWITCH_0, CB_FEATURE_ACTIVE},
84 {"SWITCH-1", CB_SWITCH_NAME, CB_SWITCH_1, CB_FEATURE_ACTIVE},
85 {"SWITCH-2", CB_SWITCH_NAME, CB_SWITCH_2, CB_FEATURE_ACTIVE},
86 {"SWITCH-3", CB_SWITCH_NAME, CB_SWITCH_3, CB_FEATURE_ACTIVE},
87 {"SWITCH-4", CB_SWITCH_NAME, CB_SWITCH_4, CB_FEATURE_ACTIVE},
88 {"SWITCH-5", CB_SWITCH_NAME, CB_SWITCH_5, CB_FEATURE_ACTIVE},
89 {"SWITCH-6", CB_SWITCH_NAME, CB_SWITCH_6, CB_FEATURE_ACTIVE},
90 {"SWITCH-7", CB_SWITCH_NAME, CB_SWITCH_7, CB_FEATURE_ACTIVE},
91 {"SWITCH-8", CB_SWITCH_NAME, CB_SWITCH_8, CB_FEATURE_ACTIVE},
92 {"SWITCH-9", CB_SWITCH_NAME, CB_SWITCH_9, CB_FEATURE_ACTIVE},
93 {"SWITCH-10", CB_SWITCH_NAME, CB_SWITCH_10, CB_FEATURE_ACTIVE},
94 {"SWITCH-11", CB_SWITCH_NAME, CB_SWITCH_11, CB_FEATURE_ACTIVE},
95 {"SWITCH-12", CB_SWITCH_NAME, CB_SWITCH_12, CB_FEATURE_ACTIVE},
96 {"SWITCH-13", CB_SWITCH_NAME, CB_SWITCH_13, CB_FEATURE_ACTIVE},
97 {"SWITCH-14", CB_SWITCH_NAME, CB_SWITCH_14, CB_FEATURE_ACTIVE},
98 {"SWITCH-15", CB_SWITCH_NAME, CB_SWITCH_15, CB_FEATURE_ACTIVE},
99 {"SWITCH-16", CB_SWITCH_NAME, CB_SWITCH_16, CB_FEATURE_ACTIVE},
100 {"SWITCH-17", CB_SWITCH_NAME, CB_SWITCH_17, CB_FEATURE_ACTIVE},
101 {"SWITCH-18", CB_SWITCH_NAME, CB_SWITCH_18, CB_FEATURE_ACTIVE},
102 {"SWITCH-19", CB_SWITCH_NAME, CB_SWITCH_19, CB_FEATURE_ACTIVE},
103 {"SWITCH-20", CB_SWITCH_NAME, CB_SWITCH_20, CB_FEATURE_ACTIVE},
104 {"SWITCH-21", CB_SWITCH_NAME, CB_SWITCH_21, CB_FEATURE_ACTIVE},
105 {"SWITCH-22", CB_SWITCH_NAME, CB_SWITCH_22, CB_FEATURE_ACTIVE},
106 {"SWITCH-23", CB_SWITCH_NAME, CB_SWITCH_23, CB_FEATURE_ACTIVE},
107 {"SWITCH-24", CB_SWITCH_NAME, CB_SWITCH_24, CB_FEATURE_ACTIVE},
108 {"SWITCH-25", CB_SWITCH_NAME, CB_SWITCH_25, CB_FEATURE_ACTIVE},
109 {"SWITCH-26", CB_SWITCH_NAME, CB_SWITCH_26, CB_FEATURE_ACTIVE},
110 {"SWITCH-27", CB_SWITCH_NAME, CB_SWITCH_27, CB_FEATURE_ACTIVE},
111 {"SWITCH-28", CB_SWITCH_NAME, CB_SWITCH_28, CB_FEATURE_ACTIVE},
112 {"SWITCH-29", CB_SWITCH_NAME, CB_SWITCH_29, CB_FEATURE_ACTIVE},
113 {"SWITCH-30", CB_SWITCH_NAME, CB_SWITCH_30, CB_FEATURE_ACTIVE},
114 {"SWITCH-31", CB_SWITCH_NAME, CB_SWITCH_31, CB_FEATURE_ACTIVE},
115 {"SWITCH-32", CB_SWITCH_NAME, CB_SWITCH_32, CB_FEATURE_ACTIVE},
116 {"SWITCH-33", CB_SWITCH_NAME, CB_SWITCH_33, CB_FEATURE_ACTIVE},
117 {"SWITCH-34", CB_SWITCH_NAME, CB_SWITCH_34, CB_FEATURE_ACTIVE},
118 {"SWITCH-35", CB_SWITCH_NAME, CB_SWITCH_35, CB_FEATURE_ACTIVE},
119 {"SWITCH-36", CB_SWITCH_NAME, CB_SWITCH_36, CB_FEATURE_ACTIVE},
120 {"SW0", CB_SWITCH_NAME, CB_SWITCH_0, CB_FEATURE_DISABLED},
121 {"SW1", CB_SWITCH_NAME, CB_SWITCH_1, CB_FEATURE_DISABLED},
122 {"SW2", CB_SWITCH_NAME, CB_SWITCH_2, CB_FEATURE_DISABLED},
123 {"SW3", CB_SWITCH_NAME, CB_SWITCH_3, CB_FEATURE_DISABLED},
124 {"SW4", CB_SWITCH_NAME, CB_SWITCH_4, CB_FEATURE_DISABLED},
125 {"SW5", CB_SWITCH_NAME, CB_SWITCH_5, CB_FEATURE_DISABLED},
126 {"SW6", CB_SWITCH_NAME, CB_SWITCH_6, CB_FEATURE_DISABLED},
127 {"SW7", CB_SWITCH_NAME, CB_SWITCH_7, CB_FEATURE_DISABLED},
128 {"SW8", CB_SWITCH_NAME, CB_SWITCH_8, CB_FEATURE_DISABLED},
129 {"SW9", CB_SWITCH_NAME, CB_SWITCH_9, CB_FEATURE_DISABLED},
130 {"SW10", CB_SWITCH_NAME, CB_SWITCH_10, CB_FEATURE_DISABLED},
131 {"SW11", CB_SWITCH_NAME, CB_SWITCH_11, CB_FEATURE_DISABLED},
132 {"SW12", CB_SWITCH_NAME, CB_SWITCH_12, CB_FEATURE_DISABLED},
133 {"SW13", CB_SWITCH_NAME, CB_SWITCH_13, CB_FEATURE_DISABLED},
134 {"SW14", CB_SWITCH_NAME, CB_SWITCH_14, CB_FEATURE_DISABLED},
135 {"SW15", CB_SWITCH_NAME, CB_SWITCH_15, CB_FEATURE_DISABLED},
136 {"SWITCH 0", CB_SWITCH_NAME, CB_SWITCH_0, CB_FEATURE_DISABLED},
137 {"SWITCH 1", CB_SWITCH_NAME, CB_SWITCH_1, CB_FEATURE_DISABLED},
138 {"SWITCH 2", CB_SWITCH_NAME, CB_SWITCH_2, CB_FEATURE_DISABLED},
139 {"SWITCH 3", CB_SWITCH_NAME, CB_SWITCH_3, CB_FEATURE_DISABLED},
140 {"SWITCH 4", CB_SWITCH_NAME, CB_SWITCH_4, CB_FEATURE_DISABLED},
141 {"SWITCH 5", CB_SWITCH_NAME, CB_SWITCH_5, CB_FEATURE_DISABLED},
142 {"SWITCH 6", CB_SWITCH_NAME, CB_SWITCH_6, CB_FEATURE_DISABLED},
143 {"SWITCH 7", CB_SWITCH_NAME, CB_SWITCH_7, CB_FEATURE_DISABLED},
144 {"SWITCH 8", CB_SWITCH_NAME, CB_SWITCH_8, CB_FEATURE_DISABLED},
145 {"SWITCH 9", CB_SWITCH_NAME, CB_SWITCH_9, CB_FEATURE_DISABLED},
146 {"SWITCH 10", CB_SWITCH_NAME, CB_SWITCH_10, CB_FEATURE_DISABLED},
147 {"SWITCH 11", CB_SWITCH_NAME, CB_SWITCH_11, CB_FEATURE_DISABLED},
148 {"SWITCH 12", CB_SWITCH_NAME, CB_SWITCH_12, CB_FEATURE_DISABLED},
149 {"SWITCH 13", CB_SWITCH_NAME, CB_SWITCH_13, CB_FEATURE_DISABLED},
150 {"SWITCH 14", CB_SWITCH_NAME, CB_SWITCH_14, CB_FEATURE_DISABLED},
151 {"SWITCH 15", CB_SWITCH_NAME, CB_SWITCH_15, CB_FEATURE_DISABLED},
152 {"SWITCH 16", CB_SWITCH_NAME, CB_SWITCH_16, CB_FEATURE_DISABLED},
153 {"SWITCH 17", CB_SWITCH_NAME, CB_SWITCH_17, CB_FEATURE_DISABLED},
154 {"SWITCH 18", CB_SWITCH_NAME, CB_SWITCH_18, CB_FEATURE_DISABLED},
155 {"SWITCH 19", CB_SWITCH_NAME, CB_SWITCH_19, CB_FEATURE_DISABLED},
156 {"SWITCH 20", CB_SWITCH_NAME, CB_SWITCH_20, CB_FEATURE_DISABLED},
157 {"SWITCH 21", CB_SWITCH_NAME, CB_SWITCH_21, CB_FEATURE_DISABLED},
158 {"SWITCH 22", CB_SWITCH_NAME, CB_SWITCH_22, CB_FEATURE_DISABLED},
159 {"SWITCH 23", CB_SWITCH_NAME, CB_SWITCH_23, CB_FEATURE_DISABLED},
160 {"SWITCH 24", CB_SWITCH_NAME, CB_SWITCH_24, CB_FEATURE_DISABLED},
161 {"SWITCH 25", CB_SWITCH_NAME, CB_SWITCH_25, CB_FEATURE_DISABLED},
162 {"SWITCH 26", CB_SWITCH_NAME, CB_SWITCH_26, CB_FEATURE_DISABLED},
163 {"SWITCH A", CB_SWITCH_NAME, CB_SWITCH_1, CB_FEATURE_DISABLED},
164 {"SWITCH B", CB_SWITCH_NAME, CB_SWITCH_2, CB_FEATURE_DISABLED},
165 {"SWITCH C", CB_SWITCH_NAME, CB_SWITCH_3, CB_FEATURE_DISABLED},
166 {"SWITCH D", CB_SWITCH_NAME, CB_SWITCH_4, CB_FEATURE_DISABLED},
167 {"SWITCH E", CB_SWITCH_NAME, CB_SWITCH_5, CB_FEATURE_DISABLED},
168 {"SWITCH F", CB_SWITCH_NAME, CB_SWITCH_6, CB_FEATURE_DISABLED},
169 {"SWITCH G", CB_SWITCH_NAME, CB_SWITCH_7, CB_FEATURE_DISABLED},
170 {"SWITCH H", CB_SWITCH_NAME, CB_SWITCH_8, CB_FEATURE_DISABLED},
171 {"SWITCH I", CB_SWITCH_NAME, CB_SWITCH_9, CB_FEATURE_DISABLED},
172 {"SWITCH J", CB_SWITCH_NAME, CB_SWITCH_10, CB_FEATURE_DISABLED},
173 {"SWITCH K", CB_SWITCH_NAME, CB_SWITCH_11, CB_FEATURE_DISABLED},
174 {"SWITCH L", CB_SWITCH_NAME, CB_SWITCH_12, CB_FEATURE_DISABLED},
175 {"SWITCH M", CB_SWITCH_NAME, CB_SWITCH_13, CB_FEATURE_DISABLED},
176 {"SWITCH N", CB_SWITCH_NAME, CB_SWITCH_14, CB_FEATURE_DISABLED},
177 {"SWITCH O", CB_SWITCH_NAME, CB_SWITCH_15, CB_FEATURE_DISABLED},
178 {"SWITCH P", CB_SWITCH_NAME, CB_SWITCH_16, CB_FEATURE_DISABLED},
179 {"SWITCH Q", CB_SWITCH_NAME, CB_SWITCH_17, CB_FEATURE_DISABLED},
180 {"SWITCH R", CB_SWITCH_NAME, CB_SWITCH_18, CB_FEATURE_DISABLED},
181 {"SWITCH S", CB_SWITCH_NAME, CB_SWITCH_19, CB_FEATURE_DISABLED},
182 {"SWITCH T", CB_SWITCH_NAME, CB_SWITCH_20, CB_FEATURE_DISABLED},
183 {"SWITCH U", CB_SWITCH_NAME, CB_SWITCH_21, CB_FEATURE_DISABLED},
184 {"SWITCH V", CB_SWITCH_NAME, CB_SWITCH_22, CB_FEATURE_DISABLED},
185 {"SWITCH W", CB_SWITCH_NAME, CB_SWITCH_23, CB_FEATURE_DISABLED},
186 {"SWITCH X", CB_SWITCH_NAME, CB_SWITCH_24, CB_FEATURE_DISABLED},
187 {"SWITCH Y", CB_SWITCH_NAME, CB_SWITCH_25, CB_FEATURE_DISABLED},
188 {"SWITCH Z", CB_SWITCH_NAME, CB_SWITCH_26, CB_FEATURE_DISABLED},
189 {"UPSI-0", CB_SWITCH_NAME, CB_SWITCH_0, CB_FEATURE_DISABLED},
190 {"UPSI-1", CB_SWITCH_NAME, CB_SWITCH_1, CB_FEATURE_DISABLED},
191 {"UPSI-2", CB_SWITCH_NAME, CB_SWITCH_2, CB_FEATURE_DISABLED},
192 {"UPSI-3", CB_SWITCH_NAME, CB_SWITCH_3, CB_FEATURE_DISABLED},
193 {"UPSI-4", CB_SWITCH_NAME, CB_SWITCH_4, CB_FEATURE_DISABLED},
194 {"UPSI-5", CB_SWITCH_NAME, CB_SWITCH_5, CB_FEATURE_DISABLED},
195 {"UPSI-6", CB_SWITCH_NAME, CB_SWITCH_6, CB_FEATURE_DISABLED},
196 {"UPSI-7", CB_SWITCH_NAME, CB_SWITCH_7, CB_FEATURE_DISABLED},
197 {"UPSI-8", CB_SWITCH_NAME, CB_SWITCH_8, CB_FEATURE_DISABLED},
198 /* TO-DO: Figure out how TSW switches differ from USW switches and add them. */
199 {"USW-0", CB_SWITCH_NAME, CB_SWITCH_0, CB_FEATURE_DISABLED},
200 {"USW-1", CB_SWITCH_NAME, CB_SWITCH_1, CB_FEATURE_DISABLED},
201 {"USW-2", CB_SWITCH_NAME, CB_SWITCH_2, CB_FEATURE_DISABLED},
202 {"USW-3", CB_SWITCH_NAME, CB_SWITCH_3, CB_FEATURE_DISABLED},
203 {"USW-4", CB_SWITCH_NAME, CB_SWITCH_4, CB_FEATURE_DISABLED},
204 {"USW-5", CB_SWITCH_NAME, CB_SWITCH_5, CB_FEATURE_DISABLED},
205 {"USW-6", CB_SWITCH_NAME, CB_SWITCH_6, CB_FEATURE_DISABLED},
206 {"USW-7", CB_SWITCH_NAME, CB_SWITCH_7, CB_FEATURE_DISABLED},
207 {"USW-8", CB_SWITCH_NAME, CB_SWITCH_8, CB_FEATURE_DISABLED},
208 {"USW-9", CB_SWITCH_NAME, CB_SWITCH_9, CB_FEATURE_DISABLED},
209 {"USW-10", CB_SWITCH_NAME, CB_SWITCH_10, CB_FEATURE_DISABLED},
210 {"USW-11", CB_SWITCH_NAME, CB_SWITCH_11, CB_FEATURE_DISABLED},
211 {"USW-12", CB_SWITCH_NAME, CB_SWITCH_12, CB_FEATURE_DISABLED},
212 {"USW-13", CB_SWITCH_NAME, CB_SWITCH_13, CB_FEATURE_DISABLED},
213 {"USW-14", CB_SWITCH_NAME, CB_SWITCH_14, CB_FEATURE_DISABLED},
214 {"USW-15", CB_SWITCH_NAME, CB_SWITCH_15, CB_FEATURE_DISABLED},
215 {"USW-16", CB_SWITCH_NAME, CB_SWITCH_16, CB_FEATURE_DISABLED},
216 {"USW-17", CB_SWITCH_NAME, CB_SWITCH_17, CB_FEATURE_DISABLED},
217 {"USW-18", CB_SWITCH_NAME, CB_SWITCH_18, CB_FEATURE_DISABLED},
218 {"USW-19", CB_SWITCH_NAME, CB_SWITCH_19, CB_FEATURE_DISABLED},
219 {"USW-20", CB_SWITCH_NAME, CB_SWITCH_20, CB_FEATURE_DISABLED},
220 {"USW-21", CB_SWITCH_NAME, CB_SWITCH_21, CB_FEATURE_DISABLED},
221 {"USW-22", CB_SWITCH_NAME, CB_SWITCH_22, CB_FEATURE_DISABLED},
222 {"USW-23", CB_SWITCH_NAME, CB_SWITCH_23, CB_FEATURE_DISABLED},
223 {"USW-24", CB_SWITCH_NAME, CB_SWITCH_24, CB_FEATURE_DISABLED},
224 {"USW-25", CB_SWITCH_NAME, CB_SWITCH_25, CB_FEATURE_DISABLED},
225 {"USW-26", CB_SWITCH_NAME, CB_SWITCH_26, CB_FEATURE_DISABLED},
226 {"USW-27", CB_SWITCH_NAME, CB_SWITCH_27, CB_FEATURE_DISABLED},
227 {"USW-28", CB_SWITCH_NAME, CB_SWITCH_28, CB_FEATURE_DISABLED},
228 {"USW-29", CB_SWITCH_NAME, CB_SWITCH_29, CB_FEATURE_DISABLED},
229 {"USW-30", CB_SWITCH_NAME, CB_SWITCH_30, CB_FEATURE_DISABLED},
230 {"USW-31", CB_SWITCH_NAME, CB_SWITCH_31, CB_FEATURE_DISABLED}
231 };
232
233 #define SYSTEM_TAB_SIZE sizeof(system_name_table) / sizeof(struct system_name_struct)
234
235 static struct system_name_struct *lookup_system_name (const char *, const int);
236
237 /* Reserved word table, note: this list is sorted on startup in
238 (initialize_reserved_words_if_needed), no need to care for EBCDIC */
239 /* Description */
240
241 /* Word # Statement has terminator # Is context sensitive (only for printing)
242 # Token # Special context set # Special context test */
243
244 static struct cobc_reserved default_reserved_words[] = {
245 { "3-D", 0, 1, THREEDIMENSIONAL, /* ACU extension */
246 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
247 },
248 { "ABSENT", 0, 0, ABSENT, /* IBM RW */
249 0, 0
250 },
251 { "ACCEPT", 1, 0, ACCEPT, /* 2002 */
252 CB_CS_ACCEPT, 0
253 },
254 { "ACCESS", 0, 0, ACCESS, /* 2002 */
255 0, 0
256 },
257 { "ACTION", 0, 1, ACTION, /* ACU extension */
258 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
259 },
260 { "ACTIVE-CLASS", 0, 0, -1, /* 2002 */
261 0, 0
262 },
263 { "ACTIVE-X", 1, 1, ACTIVEX, /* ACU extension, very unlikely to be implemented */
264 CB_CS_GRAPHICAL_CONTROL, CB_CS_DISPLAY | CB_CS_SCREEN
265 },
266 { "ACTUAL", 0, 1, ACTUAL, /* OS/VS extension */
267 0, CB_CS_SELECT
268 },
269 { "ADD", 1, 0, ADD, /* 2002 */
270 0, 0
271 },
272 { "ADDRESS", 0, 0, ADDRESS, /* 2002 */
273 0, 0
274 },
275 { "ADJUSTABLE-COLUMNS", 0, 1, ADJUSTABLE_COLUMNS, /* ACU extension */
276 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
277 },
278 { "ADVANCING", 0, 0, ADVANCING, /* 2002 */
279 0, 0
280 },
281 { "AFTER", 0, 0, AFTER, /* 2002 */
282 0, 0
283 },
284 { "ALIGNMENT", 0, 1, ALIGNMENT, /* ACU extension */
285 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
286 },
287 { "ALIGNED", 0, 0, -1, /* 2002 */
288 0, 0
289 },
290 { "ALL", 0, 0, ALL, /* 2002 */
291 0, 0
292 },
293 { "ALLOCATE", 0, 0, ALLOCATE, /* 2002 */
294 CB_CS_ALLOCATE, 0
295 },
296 { "ALLOWING", 0, 1, ALLOWING, /* ACU extension */
297 0, CB_CS_OPEN
298 },
299 { "ALPHABET", 1, 0, ALPHABET, /* 2002 */
300 CB_CS_ALPHABET, 0
301 },
302 { "ALPHABETIC", 0, 0, ALPHABETIC, /* 2002 */
303 0, 0
304 },
305 { "ALPHABETIC-LOWER", 0, 0, ALPHABETIC_LOWER, /* 2002 */
306 0, 0
307 },
308 { "ALPHABETIC-UPPER", 0, 0, ALPHABETIC_UPPER, /* 2002 */
309 0, 0
310 },
311 { "ALPHANUMERIC", 0, 0, ALPHANUMERIC, /* 2002 */
312 0, 0
313 },
314 { "ALPHANUMERIC-EDITED", 0, 0, ALPHANUMERIC_EDITED, /* 2002 */
315 0, 0
316 },
317 { "ALSO", 0, 0, ALSO, /* 2002 */
318 0, 0
319 },
320 { "ALTER", 0, 0, ALTER, /* 85 */
321 0, 0
322 },
323 { "ALTERNATE", 0, 0, ALTERNATE, /* 2002 */
324 0, 0
325 },
326 { "AND", 0, 0, AND, /* 2002 */
327 0, 0
328 },
329 { "ANY", 0, 0, ANY, /* 2002 */
330 0, 0
331 },
332 { "ANYCASE", 0, 0, -1, /* 2002 */
333 0, 0
334 },
335 { "APPLY", 0, 1, APPLY, /* 202x pending (C/S) */
336 0, CB_CS_I_O_CONTROL
337 },
338 { "ARE", 0, 0, ARE, /* 2002 */
339 0, 0
340 },
341 { "AREA", 0, 0, AREA, /* 2002 */
342 0, 0
343 },
344 { "AREAS", 0, 0, AREA, /* 2002 */
345 0, 0
346 },
347 { "ARGUMENT-NUMBER", 0, 0, ARGUMENT_NUMBER, /* Extension */
348 0, 0
349 },
350 { "ARGUMENT-VALUE", 0, 0, ARGUMENT_VALUE, /* Extension */
351 0, 0
352 },
353 { "ARITHMETIC", 0, 1, ARITHMETIC, /* 2002 (C/S) */
354 0, CB_CS_OPTIONS
355 },
356 { "AS", 0, 0, AS, /* 2002 */
357 0, 0
358 },
359 { "ASCENDING", 0, 0, ASCENDING, /* 2002 */
360 0, 0
361 },
362 { "ASCII", 0, 1, ASCII, /* Extension */
363 0, CB_CS_ALPHABET
364 },
365 { "ASSIGN", 1, 0, ASSIGN, /* 2002 */
366 CB_CS_ASSIGN, 0
367 },
368 { "AT", 0, 0, AT, /* 2002 */
369 0, 0
370 },
371 { "ATTRIBUTE", 0, 1, ATTRIBUTE, /* 2002 (C/S) */
372 0, CB_CS_SET | CB_CS_XML_GENERATE
373 },
374 { "ATTRIBUTES", 0, 1, ATTRIBUTES, /* IBM extension */
375 0, CB_CS_XML_GENERATE
376 },
377 { "AUTO", 0, 1, AUTO, /* 2002 (C/S), extension */
378 0, CB_CS_ACCEPT | CB_CS_SCREEN | CB_CS_CALL
379 },
380 { "AUTO-DECIMAL", 0, 1, AUTO_DECIMAL, /* ACU extension */
381 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
382 },
383 { "AUTO-SPIN", 0, 1, AUTO_SPIN, /* ACU extension */
384 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
385 },
386 { "AUTOMATIC", 0, 0, AUTOMATIC, /* 2002 */
387 0, 0
388 /* FIXME: 2014 Context-sensitive to LOCK MODE clause */
389 },
390 { "AWAY-FROM-ZERO", 0, 1, AWAY_FROM_ZERO, /* 2014 (C/S) */
391 0, CB_CS_ROUNDED
392 },
393 { "B-AND", 0, 0, -1, /* 2002 */
394 0, 0
395 },
396 { "B-NOT", 0, 0, -1, /* 2002 */
397 0, 0
398 },
399 { "B-OR", 0, 0, -1, /* 2002 */
400 0, 0
401 },
402 { "B-XOR", 0, 0, -1, /* 2002 */
403 0, 0
404 },
405 { "BACKGROUND-COLOR", 0, 1, BACKGROUND_COLOR, /* 2002 (C/S) */
406 0, CB_CS_ACCEPT | CB_CS_DISPLAY | CB_CS_SCREEN
407 },
408 { "BACKGROUND-HIGH", 0, 0, BACKGROUND_HIGH, /* ACU extension */
409 0, 0
410 },
411 { "BACKGROUND-LOW", 0, 0, BACKGROUND_LOW, /* ACU extension */
412 0, 0
413 },
414 { "BACKGROUND-STANDARD", 0, 0, BACKGROUND_STANDARD, /* ACU extension */
415 0, 0
416 },
417 { "BAR", 1, 1, BAR, /* ACU extension */
418 CB_CS_GRAPHICAL_CONTROL, CB_CS_DISPLAY | CB_CS_SCREEN
419 },
420 { "BASED", 0, 0, BASED, /* 2002 */
421 0, 0
422 },
423 { "BEFORE", 0, 0, BEFORE, /* 2002 */
424 0, 0
425 },
426 { "BELL", 0, 1, BELL, /* 2002 (C/S) */
427 0, CB_CS_ACCEPT | CB_CS_DISPLAY | CB_CS_SCREEN | CB_CS_SET
428 },
429 { "BINARY", 0, 0, BINARY, /* 2002 */
430 0, 0
431 },
432 { "BINARY-C-LONG", 0, 0, BINARY_C_LONG, /* Extension */
433 0, 0
434 },
435 { "BINARY-CHAR", 0, 0, BINARY_CHAR, /* 2002 */
436 0, 0
437 },
438 { "BINARY-DOUBLE", 0, 0, BINARY_DOUBLE, /* 2002 */
439 0, 0
440 },
441 { "BINARY-LONG", 0, 0, BINARY_LONG, /* 2002 */
442 0, 0
443 },
444 { "BINARY-SEQUENTIAL", 0, 1, BINARY_SEQUENTIAL, /* Extension */
445 0, CB_CS_DELIMITER
446 },
447 { "BINARY-SHORT", 0, 0, BINARY_SHORT, /* 2002 */
448 0, 0
449 },
450 { "BIT", 0, 0, BIT, /* 2002 */
451 0, 0
452 },
453 { "BITMAP", 1, 1, BITMAP, /* ACU extension */
454 CB_CS_GRAPHICAL_CONTROL, CB_CS_DISPLAY | CB_CS_SCREEN
455 },
456 { "BITMAP-END", 0, 1, BITMAP_END, /* ACU extension */
457 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
458 },
459 { "BITMAP-HANDLE", 0, 1, BITMAP_HANDLE, /* ACU extension */
460 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
461 },
462 { "BITMAP-NUMBER", 0, 1, BITMAP_NUMBER, /* ACU extension */
463 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
464 },
465 { "BITMAP-START", 0, 1, BITMAP_START, /* ACU extension */
466 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
467 },
468 { "BITMAP-TIMER", 0, 1, BITMAP_TIMER, /* ACU extension */
469 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
470 },
471 { "BITMAP-TRAILING", 0, 1, BITMAP_TRAILING, /* ACU extension */
472 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
473 },
474 { "BITMAP-TRANSPARENT-COLOR", 0, 1, BITMAP_TRANSPARENT_COLOR, /* ACU extension */
475 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
476 },
477 { "BITMAP-WIDTH", 0, 1, BITMAP_WIDTH, /* ACU extension */
478 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
479 },
480 { "BLANK", 0, 0, BLANK, /* 2002 */
481 0, 0
482 },
483 { "BLINK", 0, 1, BLINK, /* 2002 (C/S) */
484 0, CB_CS_ACCEPT | CB_CS_DISPLAY | CB_CS_SCREEN | CB_CS_SET
485 },
486 { "BLOCK", 0, 0, BLOCK, /* 2002 */
487 0, 0
488 },
489 { "BOOLEAN", 0, 0, -1, /* 2002 */
490 0, 0
491 },
492 { "BOTTOM", 0, 0, BOTTOM, /* 2002 */
493 0, 0
494 },
495 { "BOX", 0, 1, BOX, /* ACU extension */
496 0, CB_CS_DISPLAY
497 },
498 { "BOXED", 0, 1, BOXED, /* ACU extension */
499 0, CB_CS_DISPLAY
500 },
501 { "BULK-ADDITION", 0, 1, BULK_ADDITION, /* ACU extension */
502 0, CB_CS_OPEN
503 },
504 { "BUSY", 0, 1, BUSY, /* ACU extension */
505 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
506 },
507 { "BUTTONS", 0, 1, BUTTONS, /* ACU extension */
508 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
509 },
510 { "BY", 0, 0, BY, /* 2002 */
511 0, 0
512 },
513 { "BYTE-LENGTH", 0, 1, BYTE_LENGTH, /* 2002 (C/S) */
514 0, CB_CS_CONSTANT
515 },
516 { "C", 0, 1, C, /* Extension: implicit defined CALL-CONVENTION */
517 0, CB_CS_CALL | CB_CS_OPTIONS
518 },
519 { "CALENDAR-FONT", 0, 1, CALENDAR_FONT, /* ACU extension */
520 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
521 },
522 { "CALL", 1, 0, CALL, /* 2002 */
523 CB_CS_CALL, 0
524 },
525 { "CANCEL", 0, 0, CANCEL, /* 2002 */
526 0, 0
527 },
528 { "CANCEL-BUTTON", 0, 1, CANCEL_BUTTON, /* ACU extension */
529 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
530 },
531 { "CAPACITY", 0, 1, CAPACITY, /* 2014 */
532 0, CB_CS_OCCURS
533 },
534 { "CARD-PUNCH", 0, 1, CARD_PUNCH, /* Extension */
535 0, CB_CS_ASSIGN
536 },
537 { "CARD-READER", 0, 1, CARD_READER, /* Extension */
538 0, CB_CS_ASSIGN
539 },
540 { "CASSETTE", 0, 1, CASSETTE, /* Extension */
541 0, CB_CS_ASSIGN
542 },
543 { "CCOL", 0, 1, CCOL, /* ACU extension */
544 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
545 },
546 { "CD", 0, 0, CD, /* Communication Section */
547 0, 0
548 },
549 { "CELL", 0, 1, CELL, /* ACU extension */
550 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
551 },
552 { "CELL-COLOR", 0, 1, CELL_COLOR, /* ACU extension */
553 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
554 },
555 { "CELL-DATA", 0, 1, CELL_DATA, /* ACU extension */
556 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
557 },
558 { "CELL-FONT", 0, 1, CELL_FONT, /* ACU extension */
559 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
560 },
561 { "CELL-PROTECTION", 0, 1, CELL_PROTECTION, /* ACU extension */
562 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
563 },
564 { "CENTER", 0, 1, CENTER, /* 2002 (C/S) */
565 0, 0
566 /* FIXME + Check: 2014 Context-sensitive to COLUMN clause */
567 },
568 { "CENTERED", 0, 1, CENTERED, /* ACU extension */
569 0, CB_CS_DISPLAY
570 },
571 { "CENTERED-HEADINGS", 0, 1, CENTERED_HEADINGS, /* ACU extension */
572 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
573 },
574 { "CENTURY-DATE", 0, 1, CENTURY_DATE, /* ACU extension */
575 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
576 },
577 { "CF", 0, 0, CF, /* 2002 */
578 0, 0
579 },
580 { "CH", 0, 0, CH, /* 2002 */
581 0, 0
582 },
583 { "CHAIN", 0, 0, -1, /* Extension */
584 0, 0
585 },
586 { "CHAINING", 0, 0, CHAINING, /* Extension */
587 0, 0
588 },
589 { "CHANGED", 0, 1, CHANGED, /* OSVS/MF */
590 0, CB_CS_EXHIBIT
591 },
592 { "CHARACTER", 0, 0, CHARACTER, /* 2002 */
593 0, 0
594 },
595 { "CHARACTERS", 0, 0, CHARACTERS, /* 85 (OBJECT-COMPUTER) 2002 */
596 0, 0
597 },
598 { "CHECK-BOX", 1, 1, CHECK_BOX, /* ACU extension */
599 CB_CS_GRAPHICAL_CONTROL, CB_CS_DISPLAY | CB_CS_SCREEN
600 },
601 { "CLASS", 0, 0, CLASS, /* 2002 */
602 0, 0
603 },
604 { "CLASS-ID", 0, 0, -1, /* 2002 */
605 0, 0
606 },
607 { "CLASSIFICATION", 0, 1, CLASSIFICATION, /* 2002 (C/S) */
608 0, 0
609 /* FIXME + Check: 2014 Context-sensitive to OBJECT-COMPUTER paragraph */
610 },
611 { "CLEAR-SELECTION", 0, 1, CLEAR_SELECTION, /* ACU extension */
612 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
613 },
614 { "CLINE", 0, 1, CLINE, /* ACU extension */
615 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
616 },
617 { "CLINES", 0, 1, CLINES, /* ACU extension */
618 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
619 },
620 { "CLOSE", 0, 0, CLOSE, /* 2002 */
621 0, 0
622 },
623 { "COBOL", 0, 1, COBOL, /* 2002
624 Extension: implicit defined CALL-CONVENTION */
625 0, CB_CS_CALL | CB_CS_OPTIONS
626 },
627 { "CODE", 0, 0, CODE, /* 2002 */
628 0, 0
629 },
630 { "CODE-SET", 0, 0, CODE_SET, /* 2002 */
631 0, 0
632 },
633 { "COL", 0, 0, COL, /* 2002 */
634 0, 0
635 },
636 { "COLLATING", 0, 0, COLLATING, /* 2002 */
637 0, 0
638 },
639 { "COLOR", 0, 0, COLOR, /* Extension */
640 0, 0
641 },
642 { "COLORS", 0, 1, COLORS, /* ACU extension */
643 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
644 },
645 { "COLS", 0, 0, COLS, /* 2002 */
646 0, 0
647 },
648 { "COLUMN", 0, 0, COLUMN, /* 2002 */
649 0, 0
650 },
651 { "COLUMN-COLOR", 0, 1, COLUMN_COLOR, /* ACU extension */
652 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
653 },
654 { "COLUMN-DIVIDERS", 0, 1, COLUMN_DIVIDERS, /* ACU extension */
655 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
656 },
657 { "COLUMN-FONT", 0, 1, COLUMN_FONT, /* ACU extension */
658 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
659 },
660 { "COLUMN-HEADINGS", 0, 1, COLUMN_HEADINGS, /* ACU extension */
661 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
662 },
663 { "COLUMN-PROTECTION", 0, 1, COLUMN_PROTECTION, /* ACU extension */
664 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
665 },
666 { "COLUMNS", 0, 0, COLUMNS, /* 2002 */
667 0, 0
668 },
669 { "COMBO-BOX", 1, 1, COMBO_BOX, /* ACU extension */
670 CB_CS_GRAPHICAL_CONTROL, CB_CS_DISPLAY | CB_CS_SCREEN
671 },
672 { "COMMA", 0, 0, COMMA, /* 2002 */
673 0, 0
674 },
675 { "COMMAND-LINE", 0, 0, COMMAND_LINE, /* Extension */
676 0, 0
677 },
678 { "COMMIT", 0, 0, COMMIT, /* Extension */
679 0, 0
680 },
681 { "COMMON", 0, 0, COMMON, /* 2002 */
682 0, 0
683 },
684 { "COMMUNICATION", 0, 0, COMMUNICATION, /* Communication Section */
685 0, 0
686 },
687 { "COMP", 0, 0, COMP, /* 2002 */
688 0, 0
689 },
690 { "COMP-0", 0, 0, COMP_0, /* Extension */
691 0, 0
692 },
693 { "COMP-1", 0, 0, COMP_1, /* Extension */
694 0, 0
695 },
696 { "COMP-2", 0, 0, COMP_2, /* Extension */
697 0, 0
698 },
699 { "COMP-3", 0, 0, COMP_3, /* Extension */
700 0, 0
701 },
702 { "COMP-4", 0, 0, COMP_4, /* Extension */
703 0, 0
704 },
705 { "COMP-5", 0, 0, COMP_5, /* Extension */
706 0, 0
707 },
708 { "COMP-6", 0, 0, COMP_6, /* Extension */
709 0, 0
710 },
711 { "COMP-N", 0, 0, COMP_N, /* Extension */
712 0, 0
713 },
714 { "COMP-X", 0, 0, COMP_X, /* Extension */
715 0, 0
716 },
717 { "COMPUTATIONAL", 0, 0, COMP, /* 2002 */
718 0, 0
719 },
720 { "COMPUTATIONAL-0", 0, 0, COMP_0, /* Extension */
721 0, 0
722 },
723 { "COMPUTATIONAL-1", 0, 0, COMP_1, /* Extension */
724 0, 0
725 },
726 { "COMPUTATIONAL-2", 0, 0, COMP_2, /* Extension */
727 0, 0
728 },
729 { "COMPUTATIONAL-3", 0, 0, COMP_3, /* Extension */
730 0, 0
731 },
732 { "COMPUTATIONAL-4", 0, 0, COMP_4, /* Extension */
733 0, 0
734 },
735 { "COMPUTATIONAL-5", 0, 0, COMP_5, /* Extension */
736 0, 0
737 },
738 { "COMPUTATIONAL-6", 0, 0, COMP_6, /* Extension */
739 0, 0
740 },
741 { "COMPUTATIONAL-N", 0, 0, COMP_N, /* Extension */
742 0, 0
743 },
744 { "COMPUTATIONAL-X", 0, 0, COMP_X, /* Extension */
745 0, 0
746 },
747 { "COMPUTE", 1, 0, COMPUTE, /* 2002 */
748 0, 0
749 },
750 { "CONDITION", 0, 0, CONDITION, /* 2002 */
751 0, 0
752 },
753 { "CONFIGURATION", 0, 0, CONFIGURATION, /* 2002 */
754 0, 0
755 },
756 { "CONSTANT", 0, 0, CONSTANT, /* 2002 */
757 CB_CS_CONSTANT, 0
758 },
759 { "CONTAINS", 0, 0, CONTAINS, /* 2002 */
760 0, 0
761 },
762 { "CONTENT", 0, 0, CONTENT, /* 2002 */
763 0, 0
764 },
765 { "CONTINUE", 0, 0, CONTINUE, /* 2002 */
766 0, 0
767 },
768 { "CONTROL", 0, 0, CONTROL, /* 2002 */
769 0, 0
770 },
771 { "CONTROLS", 0, 0, CONTROLS, /* 2002 */
772 0, 0
773 },
774 { "CONVERSION", 0, 1, CONVERSION, /* Extension */
775 0, CB_CS_ACCEPT
776 },
777 { "CONVERTING", 0, 0, CONVERTING, /* 2002 */
778 0, 0
779 },
780 { "COPY", 0, 0, COPY, /* 2002 */
781 0, 0
782 },
783 { "COPY-SELECTION", 0, 1, COPY_SELECTION, /* ACU extension */
784 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
785 },
786 { "CORE-INDEX", 0, 1, CORE_INDEX, /* OS/VS extension */
787 0, CB_CS_I_O_CONTROL
788 },
789 { "CORR", 0, 0, CORRESPONDING, /* 2002 */
790 0, 0
791 },
792 { "CORRESPONDING", 0, 0, CORRESPONDING, /* 2002 */
793 0, 0
794 },
795 { "COUNT", 0, 0, COUNT, /* 2002 */
796 0, 0
797 },
798 { "CRT", 0, 0, CRT, /* 2002 */
799 0, 0
800 },
801 { "CRT-UNDER", 0, 0, CRT_UNDER, /* Extension */
802 0, 0
803 },
804 { "CSIZE", 0, 1, CSIZE, /* ACU extension */
805 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
806 },
807 { "CURRENCY", 0, 0, CURRENCY, /* 2002 */
808 0, 0
809 },
810 { "CURSOR", 0, 0, CURSOR, /* 2002 */
811 0, 0
812 },
813 { "CURSOR-COL", 0, 1, CURSOR_COL, /* ACU extension */
814 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
815 },
816 { "CURSOR-COLOR", 0, 1, CURSOR_COLOR, /* ACU extension */
817 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
818 },
819 { "CURSOR-FRAME-WIDTH", 0, 1, CURSOR_FRAME_WIDTH, /* ACU extension */
820 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
821 },
822 { "CURSOR-ROW", 0, 1, CURSOR_ROW, /* ACU extension */
823 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
824 },
825 { "CURSOR-X", 0, 1, CURSOR_X, /* ACU extension */
826 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
827 },
828 { "CURSOR-Y", 0, 1, CURSOR_Y, /* ACU extension */
829 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
830 },
831 { "CUSTOM-PRINT-TEMPLATE", 0, 1, CUSTOM_PRINT_TEMPLATE, /* ACU extension */
832 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
833 },
834 { "CYCLE", 0, 1, CYCLE, /* 2002 (C/S) */
835 0, CB_CS_EXIT
836 },
837 { "CYL-INDEX", 0, 1, CYL_INDEX, /* OS/VS extension */
838 0, CB_CS_I_O_CONTROL
839 },
840 { "CYL-OVERFLOW", 0, 1, CYL_OVERFLOW, /* OS/VS extension */
841 0, CB_CS_I_O_CONTROL
842 },
843 { "DASHED", 0, 1, DASHED, /* ACU extension */
844 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
845 },
846 { "DATA", 0, 0, DATA, /* 2002 */
847 0, 0
848 },
849 { "DATA-COLUMNS", 0, 1, DATA_COLUMNS, /* ACU extension */
850 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
851 },
852 { "DATA-POINTER", 0, 0, -1, /* 2002 */
853 0, 0
854 },
855 { "DATA-TYPES", 0, 1, DATA_TYPES, /* ACU extension */
856 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
857 },
858 { "DATE", 0, 0, DATE, /* 2002 */
859 CB_CS_DATE, 0
860 },
861 { "DATE-ENTRY", 1, 1, DATE_ENTRY, /* ACU extension */
862 CB_CS_GRAPHICAL_CONTROL, CB_CS_DISPLAY | CB_CS_SCREEN
863 },
864 { "DAY", 0, 0, DAY, /* 2002 */
865 CB_CS_DAY, 0
866 },
867 { "DAY-OF-WEEK", 0, 0, DAY_OF_WEEK, /* 2002 */
868 0, 0
869 },
870 { "DE", 0, 0, DE, /* 2002 */
871 0, 0
872 },
873 { "DEBUGGING", 0, 0, DEBUGGING, /* 2002 */
874 0, 0
875 },
876 { "DECIMAL-POINT", 0, 0, DECIMAL_POINT, /* 2002 */
877 0, 0
878 },
879 { "DECLARATIVES", 0, 0, DECLARATIVES, /* 2002 */
880 0, 0
881 },
882 { "DEFAULT", 0, 0, DEFAULT, /* 2002 */
883 0, 0
884 },
885 { "DEFAULT-BUTTON", 0, 1, DEFAULT_BUTTON, /* ACU extension */
886 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
887 },
888 { "DEFAULT-FONT", 0, 0, DEFAULT_FONT, /* ACU extension */
889 0, 0 /* Checkme: likely context sensitive */
890 },
891 { "DELETE", 1, 0, DELETE, /* 2002 */
892 0, 0
893 },
894 { "DELIMITED", 0, 0, DELIMITED, /* 2002 */
895 0, 0
896 },
897 { "DELIMITER", 0, 0, DELIMITER, /* 2002 */
898 CB_CS_DELIMITER, 0
899 },
900 { "DEPENDING", 0, 0, DEPENDING, /* 2002 */
901 0, 0
902 },
903 { "DESCENDING", 0, 0, DESCENDING, /* 2002 */
904 0, 0
905 },
906 { "DESTINATION", 0, 0, DESTINATION, /* 2002 */
907 0, 0
908 },
909 { "DESTROY", 0, 0, DESTROY, /* ACU extension */
910 0, 0
911 },
912 { "DETAIL", 0, 0, DETAIL, /* 2002 */
913 0, 0
914 },
915 { "DISABLE", 0, 0, DISABLE, /* Communication Section */
916 0, 0
917 },
918 { "DISC", 0, 1, DISC, /* Extension */
919 0, CB_CS_ASSIGN
920 },
921 { "DISK", 0, 1, DISK, /* Extension */
922 0, CB_CS_ASSIGN
923 },
924 { "DISP", 0, 1, DISP, /* OS/VS extension */
925 0, CB_CS_OPEN
926 },
927 { "DISPLAY", 1, 0, DISPLAY, /* 2002 */
928 0, 0
929 },
930 { "DISPLAY-COLUMNS", 0, 1, DISPLAY_COLUMNS, /* ACU extension */
931 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
932 },
933 { "DISPLAY-FORMAT", 0, 1, DISPLAY_FORMAT, /* ACU extension */
934 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
935 },
936 { "DIVIDE", 1, 0, DIVIDE, /* 2002 */
937 0, 0
938 },
939 { "DIVIDER-COLOR", 0, 1, DIVIDER_COLOR, /* ACU extension */
940 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
941 },
942 { "DIVIDERS", 0, 1, DIVIDERS, /* ACU extension */
943 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
944 },
945 { "DIVISION", 0, 0, DIVISION, /* 2002 */
946 0, 0
947 },
948 { "DOTDASH", 0, 1, DOTDASH, /* ACU extension */
949 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
950 },
951 { "DOTTED", 0, 1, DOTTED, /* ACU extension */
952 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
953 },
954 { "DOUBLE", 0, 0, FLOAT_LONG, /* ACU extension */
955 0, 0
956 },
957 { "DOWN", 0, 0, DOWN, /* 2002 */
958 0, 0
959 },
960 { "DRAG-COLOR", 0, 1, DRAG_COLOR, /* ACU extension */
961 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
962 },
963 { "DROP-DOWN", 0, 1, DROP_DOWN, /* ACU extension */
964 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
965 },
966 { "DROP-LIST", 0, 1, DROP_LIST, /* ACU extension */
967 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
968 },
969 { "DUPLICATES", 0, 0, DUPLICATES, /* 2002 */
970 0, 0
971 },
972 { "DYNAMIC", 0, 0, DYNAMIC, /* 2002 */
973 0, 0
974 },
975 { "EBCDIC", 0, 1, EBCDIC, /* Extension */
976 0, CB_CS_ALPHABET
977 },
978 { "EC", 0, 0, EC, /* 2002 */
979 0, 0
980 },
981 { "ECHO", 0, 0, ECHO, /* Extension */
982 0, 0
983 },
984 { "EGI", 0, 0, EGI, /* Communication Section */
985 0, 0
986 },
987 { "ELEMENT", 0, 1, ELEMENT, /* IBM extension */
988 0, CB_CS_XML_GENERATE
989 },
990 { "ELSE", 0, 0, ELSE, /* 2002 */
991 0, 0
992 },
993 { "EMI", 0, 0, EMI, /* Communication Section */
994 0, 0
995 },
996 { "ENABLE", 0, 0, ENABLE, /* Communication Section */
997 0, 0
998 },
999 { "ENCODING", 0, 1, ENCODING, /* IBM extension */
1000 0, CB_CS_XML_GENERATE | CB_CS_XML_PARSE
1001 },
1002 { "ENCRYPTION", 0, 1, ENCRYPTION, /* ACU extension */
1003 0, CB_CS_SELECT
1004 },
1005 { "END", 0, 0, END, /* 2002 */
1006 0, 0
1007 },
1008 { "END-ACCEPT", 0, 0, END_ACCEPT, /* 2002 */
1009 0, 0
1010 },
1011 { "END-ADD", 0, 0, END_ADD, /* 2002 */
1012 0, 0
1013 },
1014 { "END-CALL", 0, 0, END_CALL, /* 2002 */
1015 0, 0
1016 },
1017 { "END-CHAIN", 0, 0, -1, /* Extension */
1018 0, 0
1019 },
1020 { "END-COLOR", 0, 1, END_COLOR, /* ACU extension */
1021 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1022 },
1023 { "END-COMPUTE", 0, 0, END_COMPUTE, /* 2002 */
1024 0, 0
1025 },
1026 { "END-DELETE", 0, 0, END_DELETE, /* 2002 */
1027 0, 0
1028 },
1029 { "END-DISPLAY", 0, 0, END_DISPLAY, /* 2002 */
1030 0, 0
1031 },
1032 { "END-DIVIDE", 0, 0, END_DIVIDE, /* 2002 */
1033 0, 0
1034 },
1035 { "END-EVALUATE", 0, 0, END_EVALUATE, /* 2002 */
1036 0, 0
1037 },
1038 { "END-IF", 0, 0, END_IF, /* 2002 */
1039 0, 0
1040 },
1041 { "END-JSON", 0, 0, END_JSON, /* IBM extension */
1042 0, 0
1043 },
1044 { "END-MODIFY", 0, 1, END_MODIFY, /* ACU extension */
1045 0, CB_CS_INQUIRE_MODIFY
1046 },
1047 { "END-MULTIPLY", 0, 0, END_MULTIPLY, /* 2002 */
1048 0, 0
1049 },
1050 { "END-OF-PAGE", 0, 0, EOP, /* 2002 */
1051 0, 0
1052 },
1053 { "END-PERFORM", 0, 0, END_PERFORM, /* 2002 */
1054 0, 0
1055 },
1056 { "END-READ", 0, 0, END_READ, /* 2002 */
1057 0, 0
1058 },
1059 { "END-RECEIVE", 0, 0, END_RECEIVE, /* Communication Section */
1060 0, 0
1061 },
1062 { "END-RETURN", 0, 0, END_RETURN, /* 2002 */
1063 0, 0
1064 },
1065 { "END-REWRITE", 0, 0, END_REWRITE, /* 2002 */
1066 0, 0
1067 },
1068 { "END-SEARCH", 0, 0, END_SEARCH, /* 2002 */
1069 0, 0
1070 },
1071 { "END-START", 0, 0, END_START, /* 2002 */
1072 0, 0
1073 },
1074 { "END-STRING", 0, 0, END_STRING, /* 2002 */
1075 0, 0
1076 },
1077 { "END-SUBTRACT", 0, 0, END_SUBTRACT, /* 2002 */
1078 0, 0
1079 },
1080 { "END-UNSTRING", 0, 0, END_UNSTRING, /* 2002 */
1081 0, 0
1082 },
1083 { "END-WRITE", 0, 0, END_WRITE, /* 2002 */
1084 0, 0
1085 },
1086 { "END-XML", 0, 0, END_XML, /* IBM extension */
1087 0, 0
1088 },
1089 { "ENGRAVED", 0, 1, ENGRAVED, /* ACU extension */
1090 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1091 },
1092 { "ENSURE-VISIBLE", 0, 1, ENSURE_VISIBLE, /* ACU extension */
1093 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1094 },
1095 { "ENTRY", 0, 0, ENTRY, /* Extension */
1096 0, 0
1097 },
1098 { "ENTRY-CONVENTION", 0, 1, ENTRY_CONVENTION, /* 2002 (C/S) */
1099 0, CB_CS_OPTIONS
1100 },
1101 { "ENTRY-FIELD", 1, 1, ENTRY_FIELD, /* ACU extension */
1102 CB_CS_GRAPHICAL_CONTROL, CB_CS_DISPLAY | CB_CS_SCREEN
1103 },
1104 { "ENTRY-REASON", 0, 1, ENTRY_REASON, /* ACU extension */
1105 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1106 },
1107 { "ENVIRONMENT", 0, 0, ENVIRONMENT, /* 2002 */
1108 0, 0
1109 },
1110 { "ENVIRONMENT-NAME", 0, 0, ENVIRONMENT_NAME, /* Extension */
1111 0, 0
1112 },
1113 { "ENVIRONMENT-VALUE", 0, 0, ENVIRONMENT_VALUE, /* Extension */
1114 0, 0
1115 },
1116 { "EO", 0, 0, -1, /* 2002 */
1117 0, 0
1118 },
1119 { "EOL", 0, 1, EOL, /* 2002 (C/S) */
1120 0, CB_CS_ERASE
1121 },
1122 { "EOP", 0, 0, EOP, /* 2002 */
1123 0, 0
1124 },
1125 { "EOS", 0, 1, EOS, /* 2002 (C/S) */
1126 0, CB_CS_ERASE
1127 },
1128 { "EQUAL", 0, 0, EQUAL, /* 2002 */
1129 0, 0
1130 },
1131 { "ERASE", 0, 1, ERASE, /* 2002 (C/S) */
1132 CB_CS_ERASE, CB_CS_ACCEPT | CB_CS_DISPLAY | CB_CS_SCREEN | CB_CS_EXHIBIT
1133 },
1134 { "ERROR", 0, 0, ERROR, /* 2002 */
1135 0, 0
1136 },
1137 { "ESCAPE", 0, 0, ESCAPE, /* Extension */
1138 0, 0
1139 },
1140 { "ESCAPE-BUTTON", 0, 1, ESCAPE_BUTTON, /* ACU extension */
1141 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1142 },
1143 { "ESI", 0, 0, ESI, /* Communication Section */
1144 0, 0
1145 },
1146 { "EVALUATE", 1, 0, EVALUATE, /* 2002 */
1147 0, 0
1148 },
1149 { "EVENT", 1, 0, EVENT, /* ACU extension */
1150 0, 0
1151 },
1152 { "EVENT-LIST", 0, 1, EVENT_LIST, /* ACU extension */
1153 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1154 },
1155 { "EVERY", 0, 1, EVERY, /* IBM extension */
1156 0, CB_CS_I_O_CONTROL | CB_CS_XML_GENERATE
1157 },
1158 { "EXCEPTION", 0, 0, EXCEPTION, /* 2002 */
1159 0, 0
1160 },
1161 { "EXCEPTION-OBJECT", 0, 0, -1, /* 2002 */
1162 0, 0
1163 },
1164 { "EXCEPTION-VALUE", 0, 1, EXCEPTION_VALUE, /* ACU extension */
1165 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1166 },
1167 { "EXCLUSIVE", 0, 0, EXCLUSIVE, /* 2002 */
1168 0, 0
1169 },
1170 { "EXHIBIT", 1, 0, EXHIBIT, /* OSVS/MF */
1171 CB_CS_EXHIBIT, 0
1172 },
1173 { "EXIT", 0, 0, EXIT, /* 2002 */
1174 CB_CS_EXIT, 0
1175 },
1176 { "EXPAND", 0, 1, EXPAND, /* ACU extension */
1177 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1178 },
1179 { "EXPANDS", 0, 1, -1, /* 2002 (C/S) */
1180 0, 0
1181 /* FIXME: 2014 Context-sensitive to class-specifier and
1182 interface-specifier of REPOSITORY paragraph */
1183 },
1184 { "EXTEND", 0, 0, EXTEND, /* 2002 */
1185 0, 0
1186 },
1187 { "EXTENDED-SEARCH", 0, 1, EXTENDED_SEARCH, /* OS/VS extension */
1188 0, CB_CS_I_O_CONTROL
1189 },
1190 { "EXTERN", 0, 1, TOK_EXTERN, /* 2002 Implementor specific ENTRY-CONVENTION,
1191 Extension: implicit defined CALL-CONVENTION */
1192 0, CB_CS_CALL | CB_CS_OPTIONS
1193 },
1194 { "EXTERNAL", 0, 0, EXTERNAL, /* 2002 */
1195 0, 0
1196 },
1197 { "EXTERNAL-FORM", 0, 0, EXTERNAL_FORM, /* ACU CGI extension */
1198 0, 0
1199 },
1200 { "F", 0, 1, F, /* Extension */
1201 0, CB_CS_RECORDING
1202 },
1203 { "FACTORY", 0, 0, -1, /* 2002 */
1204 0, 0
1205 },
1206 { "FALSE", 0, 0, TOK_FALSE, /* 2002 */
1207 0, 0
1208 },
1209 { "FD", 0, 0, FD, /* 2002 */
1210 0, 0
1211 },
1212 { "FH--FCD", 0, 1, FH__FCD, /* MF extension */
1213 0, CB_CS_SET
1214 },
1215 { "FH--KEYDEF", 0, 1, FH__KEYDEF, /* MF extension */
1216 0, CB_CS_SET
1217 },
1218 { "FILE", 0, 0, TOK_FILE, /* 2002 */
1219 0, 0
1220 },
1221 { "FILE-CONTROL", 0, 0, FILE_CONTROL, /* 2002 */
1222 0, 0
1223 },
1224 { "FILE-ID", 0, 0, FILE_ID, /* Extension */
1225 0, 0
1226 },
1227 { "FILE-LIMIT", 0, 1, FILE_LIMIT, /* OS/VS extension */
1228 0, CB_CS_SELECT
1229 },
1230 { "FILE-LIMITS", 0, 1, FILE_LIMITS, /* OS/VS extension */
1231 0, CB_CS_SELECT
1232 },
1233 { "FILE-NAME", 0, 1, FILE_NAME, /* ACU extension */
1234 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1235 },
1236 { "FILE-POS", 0, 1, FILE_POS, /* ACU extension */
1237 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1238 },
1239 { "FILL-COLOR", 0, 1, FILL_COLOR, /* ACU extension */
1240 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1241 },
1242 { "FILL-COLOR2", 0, 1, FILL_COLOR2, /* ACU extension */
1243 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1244 },
1245 { "FILL-PERCENT", 0, 1, FILL_PERCENT, /* ACU extension */
1246 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1247 },
1248 { "FILLER", 0, 0, FILLER, /* 2002 */
1249 0, 0
1250 },
1251 { "FINAL", 0, 0, FINAL, /* 2002 */
1252 0, 0
1253 },
1254 { "FINISH-REASON", 0, 1, FINISH_REASON, /* ACU extension */
1255 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1256 },
1257 { "FIRST", 0, 0, FIRST, /* 2002 */
1258 0, 0
1259 },
1260 { "FIXED", 0, 0, FIXED, /* Extension */
1261 0, CB_CS_RECORDING
1262 },
1263 { "FIXED-FONT", 0, 0, FIXED_FONT, /* ACU extension */
1264 0, 0 /* Checkme: likely context sensitive */
1265 },
1266 { "FIXED-WIDTH", 0, 1, FIXED_WIDTH, /* ACU extension */
1267 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1268 },
1269 { "FLAT", 0, 1, FLAT, /* ACU extension */
1270 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1271 },
1272 { "FLAT-BUTTONS", 0, 1, FLAT_BUTTONS, /* ACU extension */
1273 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1274 },
1275 { "FLOAT", 0, 0, FLOAT_SHORT, /* ACU extension */
1276 0, 0
1277 },
1278 { "FLOAT-BINARY-128", 0, 0, -1, /* 2014 */
1279 0, 0
1280 },
1281 { "FLOAT-BINARY-32", 0, 0, -1, /* 2014 */
1282 0, 0
1283 },
1284 { "FLOAT-BINARY-64", 0, 0, -1, /* 2014 */
1285 0, 0
1286 },
1287 { "FLOAT-DECIMAL-16", 0, 0, FLOAT_DECIMAL_16, /* 2014 */
1288 0, 0
1289 },
1290 { "FLOAT-DECIMAL-34", 0, 0, FLOAT_DECIMAL_34, /* 2014 */
1291 0, 0
1292 },
1293 #if 0 /* RXWRXW - FP Decimal */
1294 { "FLOAT-DECIMAL-7", 0, 0, -1, /* Extension */
1295 0, 0
1296 },
1297 #endif
1298 /* note: may be set as alias for FLOAT-LONG to enable compilation,
1299 the actual precision seems to be compiler (version) specific */
1300 { "FLOAT-EXTENDED", 0, 0, -1, /* 2002 */
1301 0, 0
1302 },
1303 { "FLOAT-INFINITY", 0, 0, -1, /* 2014 */
1304 0, 0
1305 },
1306 { "FLOAT-LONG", 0, 0, FLOAT_LONG, /* 2002 */
1307 0, 0
1308 },
1309 { "FLOAT-NOT-A-NUMBER", 0, 1, -1, /* 2014 */
1310 0, 0
1311 },
1312 { "FLOAT-SHORT", 0, 0, FLOAT_SHORT, /* 2002 */
1313 0, 0
1314 },
1315 { "FLOATING", 0, 0, FLOATING, /* ACU extension */
1316 0, CB_CS_DISPLAY
1317 },
1318 { "FONT", 0, 0, FONT, /* ACU extension */
1319 0, 0 /* Checkme: likely context sensitive */
1320 },
1321 { "FOOTING", 0, 0, FOOTING, /* 2002 */
1322 0, 0
1323 },
1324 { "FOR", 0, 0, FOR, /* 2002 */
1325 0, 0
1326 },
1327 { "FOREGROUND-COLOR", 0, 1, FOREGROUND_COLOR, /* 2002 (C/S) */
1328 0, CB_CS_ACCEPT | CB_CS_DISPLAY | CB_CS_SCREEN
1329 },
1330 { "FOREVER", 0, 1, FOREVER, /* 2002 (C/S) */
1331 0, CB_CS_PERFORM | CB_CS_RETRY
1332 },
1333 { "FORMAT", 0, 0, -1, /* 2002 */
1334 0, 0
1335 },
1336 { "FRAME", 1, 1, FRAME, /* ACU extension */
1337 CB_CS_GRAPHICAL_CONTROL, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1338 },
1339 { "FRAMED", 0, 1, FRAMED, /* ACU extension */
1340 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1341 },
1342 { "FREE", 0, 0, FREE, /* 2002 */
1343 0, 0
1344 },
1345 { "FROM", 0, 0, FROM, /* 2002 */
1346 CB_CS_FROM, 0
1347 },
1348 { "FULL", 0, 1, FULL, /* 2002 (C/S) */
1349 0, CB_CS_ACCEPT | CB_CS_DISPLAY | CB_CS_SCREEN
1350 },
1351 { "FULL-HEIGHT", 0, 1, FULL_HEIGHT, /* ACU extension */
1352 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1353 },
1354 { "FUNCTION", 0, 0, FUNCTION, /* 2002 */
1355 0, 0
1356 },
1357 { "FUNCTION-ID", 0, 0, FUNCTION_ID, /* 2002 */
1358 0, 0
1359 },
1360 { "FUNCTION-POINTER", 0, 0, -1, /* 2014 */
1361 0, 0
1362 },
1363 { "GENERATE", 0, 0, GENERATE, /* 2002 */
1364 0, 0
1365 },
1366 { "GET", 0, 0, -1, /* 2002 */
1367 0, 0
1368 },
1369 { "GIVING", 0, 0, GIVING, /* 2002 */
1370 0, 0
1371 },
1372 { "GLOBAL", 0, 0, GLOBAL, /* 2002 */
1373 0, 0
1374 },
1375 { "GO", 0, 0, GO, /* 2002 */
1376 0, 0
1377 },
1378 { "GO-BACK", 0, 1, GO_BACK, /* ACU extension */
1379 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1380 },
1381 { "GO-FORWARD", 0, 1, GO_FORWARD, /* ACU extension */
1382 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1383 },
1384 { "GO-HOME", 0, 1, GO_HOME, /* ACU extension */
1385 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1386 },
1387 { "GO-SEARCH", 0, 1, GO_SEARCH, /* ACU extension */
1388 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1389 },
1390 { "GOBACK", 0, 0, GOBACK, /* 2002 */
1391 0, 0
1392 },
1393 { "GRAPHICAL", 0, 1, GRAPHICAL, /* ACU extension */
1394 0, CB_CS_DISPLAY
1395 },
1396 { "GREATER", 0, 0, GREATER, /* 2002 */
1397 0, 0
1398 },
1399 { "GRID", 1, 1, GRID, /* Extension (ACU control, MF) */
1400 CB_CS_GRAPHICAL_CONTROL, CB_CS_SCREEN
1401 },
1402 { "GROUP", 0, 0, GROUP, /* 2002 */
1403 0, 0
1404 },
1405 { "GROUP-USAGE", 0, 0, -1, /* 2002 */
1406 0, 0
1407 },
1408 { "GROUP-VALUE", 0, 1, GROUP_VALUE, /* ACU extension */
1409 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1410 },
1411 { "HANDLE", 0, 0, HANDLE, /* ACU extension */
1412 0, 0
1413 },
1414 { "HAS-CHILDREN", 0, 1, HAS_CHILDREN, /* ACU extension */
1415 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1416 },
1417 { "HEADING", 0, 0, HEADING, /* 2002 */
1418 0, 0
1419 },
1420 { "HEADING-COLOR", 0, 1, HEADING_COLOR, /* ACU extension */
1421 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1422 },
1423 { "HEADING-DIVIDER-COLOR", 0, 1, HEADING_DIVIDER_COLOR, /* ACU extension */
1424 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1425 },
1426 { "HEADING-FONT", 0, 1, HEADING_FONT, /* ACU extension */
1427 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1428 },
1429 { "HEAVY", 0, 1, HEAVY, /* ACU extension */
1430 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1431 },
1432 { "HEIGHT-IN-CELLS", 0, 1, HEIGHT_IN_CELLS, /* ACU extension */
1433 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1434 },
1435 { "HIDDEN-DATA", 0, 1, HIDDEN_DATA, /* ACU extension */
1436 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1437 },
1438 { "HIGH-COLOR", 0, 1, HIGH_COLOR, /* ACU extension */
1439 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1440 },
1441 { "HIGH-VALUE", 0, 0, HIGH_VALUE, /* 2002 */
1442 0, 0
1443 },
1444 { "HIGHLIGHT", 0, 1, HIGHLIGHT, /* 2002 (C/S) */
1445 0, CB_CS_ACCEPT | CB_CS_DISPLAY | CB_CS_SCREEN | CB_CS_SET
1446 },
1447 { "HOT-TRACK", 0, 1, HOT_TRACK, /* ACU extension */
1448 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1449 },
1450 { "HSCROLL", 0, 1, HSCROLL, /* ACU extension */
1451 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1452 },
1453 { "HSCROLL-POS", 0, 1, HSCROLL_POS, /* ACU extension */
1454 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1455 },
1456 { "I-O", 0, 0, I_O, /* 2002 */
1457 0, 0
1458 },
1459 { "I-O-CONTROL", 1, 0, I_O_CONTROL, /* 2002 */
1460 CB_CS_I_O_CONTROL, 0
1461 },
1462 { "ICON", 0, 1, ICON, /* ACU extension */
1463 0, CB_CS_DISPLAY
1464 },
1465 { "ID", 0, 0, ID, /* Extension */
1466 0, 0
1467 },
1468 { "IDENTIFICATION", 0, 0, IDENTIFICATION, /* 2002 */
1469 0, 0
1470 },
1471 { "IDENTIFIED", 0, 0, IDENTIFIED, /* ACU CGI extension */
1472 0, 0
1473 },
1474 { "IF", 1, 0, IF, /* 2002 */
1475 0, 0
1476 },
1477 { "IGNORE", 0, 0, IGNORE, /* Extension */
1478 0, 0
1479 },
1480 { "IGNORING", 0, 1, IGNORING, /* 2002 (C/S) */
1481 0, CB_CS_READ
1482 },
1483 { "IMPLEMENTS", 0, 1, -1, /* 2002 (C/S) */
1484 0, 0
1485 /* FIXME: 2014 Context-sensitive to FACTORY and OBJECT paragraph */
1486 },
1487 { "IN", 0, 0, IN, /* 2002 */
1488 0, 0
1489 },
1490 { "INDEPENDENT", 0, 1, INDEPENDENT, /* ACU extension */
1491 0, CB_CS_DISPLAY
1492 },
1493 { "INDEX", 0, 0, INDEX, /* 2002 */
1494 0, 0
1495 },
1496 { "INDEXED", 0, 0, INDEXED, /* 2002 */
1497 0, 0
1498 },
1499 { "INDICATE", 0, 0, INDICATE, /* 2002 */
1500 0, 0
1501 },
1502 { "INHERITS", 0, 0, -1, /* 2002 */
1503 0, 0
1504 },
1505 { "INITIAL", 0, 0, TOK_INITIAL, /* 2002 */
1506 0, 0
1507 },
1508 { "INITIALIZE", 0, 0, INITIALIZE, /* 2002 */
1509 0, 0
1510 },
1511 { "INITIALIZED", 0, 1, INITIALIZED, /* 2002 */
1512 0, CB_CS_ALLOCATE | CB_CS_OCCURS
1513 },
1514 { "INITIATE", 0, 0, INITIATE, /* 2002 */
1515 0, 0
1516 },
1517 { "INPUT", 0, 0, INPUT, /* 2002 */
1518 0, 0
1519 },
1520 { "INPUT-OUTPUT", 0, 0, INPUT_OUTPUT, /* 2002 */
1521 0, 0
1522 },
1523 { "INQUIRE", 1, 0, INQUIRE, /* ACU extension */
1524 CB_CS_INQUIRE_MODIFY, 0
1525 },
1526 { "INSERTION-INDEX", 0, 1, INSERTION_INDEX, /* ACU extension */
1527 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1528 },
1529 { "INSERT-ROWS", 0, 1, INSERT_ROWS, /* ACU extension */
1530 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1531 },
1532 { "INSPECT", 0, 0, INSPECT, /* 2002 */
1533 0, 0
1534 },
1535 { "INTERFACE", 0, 0, -1, /* 2002 */
1536 0, 0
1537 },
1538 { "INTERFACE-ID", 0, 0, -1, /* 2002 */
1539 0, 0
1540 },
1541 { "INTERMEDIATE", 0, 1, INTERMEDIATE, /* 2014 (C/S) */
1542 0, CB_CS_OPTIONS
1543 },
1544 { "INTO", 0, 0, INTO, /* 2002 */
1545 0, 0
1546 },
1547 { "INTRINSIC", 0, 1, INTRINSIC, /* 2002 (C/S) */
1548 0, 0
1549 /* FIXME: 2014 Context-sensitive to function-specifier of the REPOSITORY paragraph */
1550 },
1551 { "INVALID", 0, 0, INVALID, /* 2002 */
1552 0, 0
1553 },
1554 { "INVOKE", 0, 0, -1, /* 2002 */
1555 0, 0
1556 },
1557 { "IS", 0, 0, IS, /* 2002 */
1558 0, 0
1559 },
1560 { "ITEM", 0, 1, ITEM, /* ACU extension */
1561 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1562 },
1563 { "ITEM-TEXT", 0, 1, ITEM_TEXT, /* ACU extension */
1564 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1565 },
1566 { "ITEM-TO-ADD", 0, 1, ITEM_TO_ADD, /* ACU extension */
1567 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1568 },
1569 { "ITEM-TO-DELETE", 0, 1, ITEM_TO_DELETE, /* ACU extension */
1570 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1571 },
1572 { "ITEM-TO-EMPTY", 0, 1, ITEM_TO_EMPTY, /* ACU extension */
1573 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1574 },
1575 { "ITEM-VALUE", 0, 1, ITEM_VALUE, /* ACU extension */
1576 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1577 },
1578 { "JSON", 1, 0, JSON, /* IBM extension */
1579 0, 0
1580 },
1581 { "JUST", 0, 0, JUSTIFIED, /* 2002 */
1582 0, 0
1583 },
1584 { "JUSTIFIED", 0, 0, JUSTIFIED, /* 2002 */
1585 0, 0
1586 },
1587 { "KEPT", 0, 0, KEPT, /* Extension */
1588 0, 0
1589 },
1590 { "KEY", 0, 0, KEY, /* 2002 */
1591 0, 0
1592 },
1593 { "KEYBOARD", 0, 1, KEYBOARD, /* Extension */
1594 0, CB_CS_ASSIGN
1595 },
1596 { "LABEL", 0, 0, LABEL, /* 85, ACU extension */
1597 0, 0
1598 },
1599 { "LABEL-OFFSET", 0, 1, LABEL_OFFSET, /* ACU extension */
1600 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1601 },
1602 { "LARGE-FONT", 0, 0, LARGE_FONT, /* ACU extension */
1603 0, 0 /* Checkme: likely context sensitive */
1604 },
1605 { "LARGE-OFFSET", 0, 1, LARGE_OFFSET, /* ACU extension */
1606 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1607 },
1608 { "LAST", 0, 0, LAST, /* 2002 */
1609 0, 0
1610 },
1611 { "LAST-ROW", 0, 1, LAST_ROW, /* ACU extension */
1612 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1613 },
1614 { "LAYOUT-DATA", 0, 1, LAYOUT_DATA, /* ACU extension */
1615 0, CB_CS_INQUIRE_MODIFY /* likely wrong context, fix later */
1616 },
1617 { "LAYOUT-MANAGER", 0, 0, LAYOUT_MANAGER, /* ACU extension */
1618 0, 0 /* Check me: likely context sensitive */
1619 },
1620 { "LC_ALL", 0, 1, -1, /* 2002 (C/S) */
1621 0, CB_CS_SET
1622 },
1623 { "LC_COLLATE", 0, 1, -1, /* 2002 (C/S) */
1624 0, CB_CS_SET
1625 },
1626 { "LC_CTYPE", 0, 1, -1, /* 2002 (C/S) */
1627 0, CB_CS_SET
1628 },
1629 { "LC_MESSAGES", 0, 1, -1, /* 2002 (C/S) */
1630 0, CB_CS_SET
1631 },
1632 { "LC_MONETARY", 0, 1, -1, /* 2002 (C/S) */
1633 0, CB_CS_SET
1634 },
1635 { "LC_NUMERIC", 0, 1, -1, /* 2002 (C/S) */
1636 0, CB_CS_SET
1637 },
1638 { "LC_TIME", 0, 1, -1, /* 2002 (C/S) */
1639 0, CB_CS_SET
1640 },
1641 { "LEADING", 0, 0, LEADING, /* 2002 */
1642 0, 0
1643 },
1644 { "LEADING-SHIFT", 0, 1, LEADING_SHIFT, /* ACU extension */
1645 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1646 },
1647 { "LEAVE", 0, 1, LEAVE, /* OS/VS extension */
1648 0, CB_CS_OPEN
1649 },
1650 { "LEFT", 0, 0, LEFT, /* 2002 */
1651 0, 0
1652 },
1653 { "LEFT-JUSTIFY", 0, 0, -1, /* Extension */
1654 0, 0
1655 },
1656 { "LEFT-TEXT", 0, 1, LEFT_TEXT, /* ACU extension */
1657 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1658 },
1659 { "LEFTLINE", 0, 0, LEFTLINE, /* Extension */
1660 0, 0
1661 },
1662 { "LENGTH", 0, 0, LENGTH, /* 2002 */
1663 0, 0
1664 },
1665 { "LESS", 0, 0, LESS, /* 2002 */
1666 0, 0
1667 },
1668 { "LIKE", 0, 0, LIKE, /* ILE COBOL */
1669 0, 0
1670 },
1671 { "LIMIT", 0, 0, LIMIT, /* 2002 */
1672 0, 0
1673 },
1674 { "LIMITS", 0, 0, LIMITS, /* 2002 */
1675 0, 0
1676 },
1677 { "LINAGE", 0, 0, LINAGE, /* 2002 */
1678 0, 0
1679 },
1680 { "LINAGE-COUNTER", 0, 0, LINAGE_COUNTER, /* 2002 */
1681 0, 0
1682 },
1683 { "LINE", 0, 0, LINE, /* 2002 */
1684 0, 0
1685 },
1686 { "LINE-COUNTER", 0, 0, LINE_COUNTER, /* 2002 */
1687 0, 0
1688 },
1689 { "LINE-SEQUENTIAL", 0, 1, LINE_SEQUENTIAL, /* Extension */
1690 0, CB_CS_DELIMITER
1691 },
1692 { "LINES", 0, 0, LINES, /* 2002 */
1693 0, 0
1694 },
1695 { "LINES-AT-ROOT", 0, 1, LINES_AT_ROOT, /* ACU extension */
1696 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1697 },
1698 { "LINKAGE", 0, 0, LINKAGE, /* 2002 */
1699 0, 0
1700 },
1701 { "LIST-BOX", 1, 1, LIST_BOX, /* ACU extension */
1702 CB_CS_GRAPHICAL_CONTROL, CB_CS_DISPLAY | CB_CS_SCREEN
1703 },
1704 { "LM-RESIZE", 0, 0, LM_RESIZE, /* ACU extension */
1705 0, 0 /* Checkme: likely context sensitive */
1706 },
1707 { "LOC", 0, 1, LOC, /* IBM extension (ignored) */
1708 0, CB_CS_ALLOCATE
1709 },
1710 { "LOCAL-STORAGE", 0, 0, LOCAL_STORAGE, /* 2002 */
1711 0, 0
1712 },
1713 { "LOCALE", 0, 0, LOCALE, /* 2002 */
1714 0, 0
1715 },
1716 { "LOCK", 0, 0, LOCK, /* 2002 */
1717 0, 0
1718 },
1719 { "LOCK-HOLDING", 0, 1, LOCK_HOLDING, /* ACU extension */
1720 0, CB_CS_I_O_CONTROL
1721 },
1722 { "LONG-DATE", 0, 1, LONG_DATE, /* ACU extension */
1723 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1724 },
1725 { "LOW-COLOR", 0, 1, LOW_COLOR, /* ACU extension */
1726 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1727 },
1728 { "LOW-VALUE", 0, 0, LOW_VALUE, /* 2002 */
1729 0, 0
1730 },
1731 { "LOWER", 0, 1, LOWER, /* Extension */
1732 0, CB_CS_ACCEPT
1733 },
1734 { "LOWERED", 0, 1, LOWERED, /* ACU extension */
1735 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1736 },
1737 { "LOWLIGHT", 0, 1, LOWLIGHT, /* 2002 (C/S) */
1738 0, CB_CS_ACCEPT | CB_CS_DISPLAY | CB_CS_SCREEN | CB_CS_SET
1739 },
1740 { "MAGNETIC-TAPE", 0, 1, MAGNETIC_TAPE, /* Extension */
1741 0, CB_CS_ASSIGN
1742 },
1743 { "MANUAL", 0, 0, MANUAL, /* 2002 */
1744 0, 0
1745 /* FIXME: 2014 Context-sensitive to LOCK MODE clause */
1746 },
1747 { "MASS-UPDATE", 0, 1, MASS_UPDATE, /* ACU extension */
1748 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY | CB_CS_SELECT | CB_CS_OPEN
1749 },
1750 { "MASTER-INDEX", 0, 1, MASTER_INDEX, /* OS/VS extension */
1751 0, CB_CS_I_O_CONTROL
1752 },
1753 { "MAX-LINES", 0, 1, MAX_LINES, /* ACU extension */
1754 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1755 },
1756 { "MAX-PROGRESS", 0, 1, MAX_PROGRESS, /* ACU extension */
1757 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1758 },
1759 { "MAX-TEXT", 0, 1, MAX_TEXT, /* ACU extension */
1760 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1761 },
1762 { "MAX-VAL", 0, 1, MAX_VAL, /* ACU extension */
1763 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1764 },
1765 { "MEDIUM-FONT", 0, 0, MEDIUM_FONT, /* ACU extension */
1766 0, 0 /* Checkme: likely context sensitive */
1767 },
1768 { "MEMORY", 0, 1, MEMORY, /* 85 */
1769 0, CB_CS_OBJECT_COMPUTER
1770 },
1771 { "MENU", 0, 0, MENU, /* ACU extension */
1772 0, 0 /* Checkme: likely context sensitive */
1773 },
1774 { "MERGE", 0, 0, MERGE, /* 2002 */
1775 0, 0
1776 },
1777 { "MESSAGE", 0, 0, MESSAGE, /* Communication Section */
1778 0, 0
1779 },
1780 { "METHOD", 0, 0, -1, /* 2002 */
1781 0, 0
1782 },
1783 { "METHOD-ID", 0, 0, -1, /* 2002 */
1784 0, 0
1785 },
1786 { "MIN-VAL", 0, 1, MIN_VAL, /* ACU extension */
1787 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1788 },
1789 { "MINUS", 0, 0, MINUS, /* 2002 */
1790 0, 0
1791 },
1792 { "MODE", 0, 0, MODE, /* 2002 */
1793 0, 0
1794 },
1795 { "MODIFY", 1, 0, MODIFY, /* ACU extension */
1796 CB_CS_INQUIRE_MODIFY, 0
1797 },
1798 { "MODULES", 0, 1, MODULES, /* 85 */
1799 0, CB_CS_OBJECT_COMPUTER
1800 },
1801 { "MOVE", 0, 0, MOVE, /* 2002 */
1802 0, 0
1803 },
1804 { "MULTILINE", 0, 1, MULTILINE, /* ACU extension */
1805 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1806 },
1807 { "MULTIPLE", 0, 0, MULTIPLE, /* 2002 (C/S) */
1808 0, 0
1809 /* FIXME: 2014 Context-sensitive to LOCK ON phrase */
1810 },
1811 { "MULTIPLY", 1, 0, MULTIPLY, /* 2002 */
1812 0, 0
1813 },
1814 { "NAME", 0, 1, NAME, /* Extension */
1815 0, CB_CS_FROM | CB_CS_XML_GENERATE | CB_CS_JSON_GENERATE
1816 },
1817 { "NAMED", 0, 1, NAMED, /* OSVS/MF */
1818 0, CB_CS_EXHIBIT
1819 },
1820 { "NAMESPACE", 0, 1, NAMESPACE, /* IBM extension */
1821 0, CB_CS_XML_GENERATE
1822 },
1823 { "NAMESPACE-PREFIX", 0, 1, NAMESPACE_PREFIX, /* IBM extension */
1824 0, CB_CS_XML_GENERATE
1825 },
1826 { "NATIONAL", 0, 0, NATIONAL, /* 2002 */
1827 0, 0
1828 },
1829 { "NATIONAL-EDITED", 0, 0, NATIONAL_EDITED, /* 2002 */
1830 0, 0
1831 },
1832 { "NATIVE", 0, 0, NATIVE, /* 2002 */
1833 0, 0
1834 },
1835 { "NAVIGATE-URL", 0, 1, NAVIGATE_URL, /* ACU extension */
1836 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1837 },
1838 { "NEAREST-AWAY-FROM-ZERO", 0, 1, NEAREST_AWAY_FROM_ZERO, /* 2014 (C/S) */
1839 0, CB_CS_ROUNDED
1840 /* FIXME: 2014 ... and INTERMEDIATE ROUNDING clause */
1841 },
1842 { "NEAREST-EVEN", 0, 1, NEAREST_EVEN, /* 2014 (C/S) */
1843 0, CB_CS_ROUNDED
1844 /* FIXME: 2014 ... and INTERMEDIATE ROUNDING clause */
1845 },
1846 { "NEAREST-TOWARD-ZERO", 0, 1, NEAREST_TOWARD_ZERO, /* 2014 (C/S) */
1847 0, CB_CS_ROUNDED
1848 /* FIXME: 2014 ... and INTERMEDIATE ROUNDING clause */
1849 },
1850 { "NEGATIVE", 0, 0, NEGATIVE, /* 2002 */
1851 0, 0
1852 },
1853 { "NESTED", 0, 0, NESTED, /* 2002 */
1854 0, 0
1855 },
1856 { "NEW", 0, 0, NEW, /* 2002 */
1857 0, 0
1858 },
1859 { "NEXT", 0, 0, NEXT, /* 2002 */
1860 0, 0
1861 },
1862 { "NEXT-ITEM", 0, 1, NEXT_ITEM, /* ACU extension */
1863 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1864 },
1865 { "NO", 0, 0, NO, /* 2002 */
1866 0, 0
1867 },
1868 { "NO-AUTOSEL", 0, 1, NO_AUTOSEL, /* ACU extension */
1869 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1870 },
1871 { "NO-AUTO-DEFAULT", 0, 1, NO_AUTO_DEFAULT, /* ACU extension */
1872 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1873 },
1874 { "NO-BOX", 0, 1, NO_BOX, /* ACU extension */
1875 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1876 },
1877 { "NO-DIVIDERS", 0, 1, NO_DIVIDERS, /* ACU extension */
1878 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1879 },
1880 { "NO-ECHO", 0, 0, NO_ECHO, /* Extension */
1881 0, 0
1882 },
1883 { "NO-F4", 0, 1, NO_F4, /* ACU extension */
1884 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1885 },
1886 { "NO-FOCUS", 0, 1, NO_FOCUS, /* ACU extension */
1887 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1888 },
1889 { "NO-GROUP-TAB", 0, 1, NO_GROUP_TAB, /* ACU extension */
1890 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1891 },
1892 { "NO-KEY-LETTER", 0, 1, NO_KEY_LETTER, /* ACU extension */
1893 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1894 },
1895 { "NOMINAL", 0, 1, NOMINAL, /* OS/VS extension */
1896 0, CB_CS_SELECT
1897 },
1898 { "NO-SEARCH", 0, 1, NO_SEARCH, /* ACU extension */
1899 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1900 },
1901 { "NO-UPDOWN", 0, 1, NO_UPDOWN, /* ACU extension */
1902 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1903 },
1904 { "NONE", 0, 1, -1, /* 2002 (C/S) */
1905 0, 0
1906 },
1907 { "NONNUMERIC", 0, 1, NONNUMERIC, /* IBM extension */
1908 0, CB_CS_XML_GENERATE
1909 },
1910 { "NORMAL", 0, 1, NORMAL, /* 2002 (C/S) */
1911 0, CB_CS_STOP
1912 },
1913 { "NOT", 0, 0, NOT, /* 2002 */
1914 0, 0
1915 },
1916 { "NOTAB", 0, 1, NOTAB, /* ACU extension */
1917 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1918 },
1919 { "NOTHING", 0, 0, NOTHING, /* Extension */
1920 0, 0
1921 },
1922 { "NOTIFY", 0, 1, NOTIFY, /* ACU extension */
1923 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1924 },
1925 { "NOTIFY-CHANGE", 0, 1, NOTIFY_CHANGE, /* ACU extension */
1926 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1927 },
1928 { "NOTIFY-DBLCLICK", 0, 1, NOTIFY_DBLCLICK, /* ACU extension */
1929 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1930 },
1931 { "NOTIFY-SELCHANGE", 0, 1, NOTIFY_SELCHANGE, /* ACU extension */
1932 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1933 },
1934 { "NULL", 0, 0, TOK_NULL, /* 2002 */
1935 0, 0
1936 },
1937 { "NULLS", 0, 0, TOK_NULL, /* Extension */
1938 0, 0
1939 },
1940 { "NUM-COL-HEADINGS", 0, 1, NUM_COL_HEADINGS, /* ACU extension */
1941 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1942 },
1943 { "NUM-ROWS", 0, 1, NUM_ROWS, /* ACU extension */
1944 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1945 },
1946 { "NUMBER", 0, 0, NUMBER, /* 2002 */
1947 0, 0
1948 },
1949 { "NUMBERS", 0, 0, NUMBERS, /* 2002 (C/S) */
1950 0, 0
1951 /* FIXME: 2014 Context-sensitive to LINE and COLUMN clause */
1952 },
1953 { "NUMERIC", 0, 0, NUMERIC, /* 2002 */
1954 0, 0
1955 },
1956 { "NUMERIC-EDITED", 0, 0, NUMERIC_EDITED, /* 2002 */
1957 0, 0
1958 },
1959 { "OBJECT", 0, 0, OBJECT, /* 2002, ACU extension */
1960 0, 0
1961 },
1962 { "OBJECT-COMPUTER", 0, 0, OBJECT_COMPUTER, /* 2002 */
1963 CB_CS_OBJECT_COMPUTER, 0
1964 },
1965 { "OBJECT-REFERENCE", 0, 0, -1, /* 2002 */
1966 0, 0
1967 },
1968 { "OCCURS", 0, 0, OCCURS, /* 2002 */
1969 CB_CS_OCCURS, 0
1970 },
1971 { "OF", 0, 0, OF, /* 2002 */
1972 0, 0
1973 },
1974 { "OFF", 0, 0, OFF, /* 2002 */
1975 0, 0
1976 },
1977 { "OK-BUTTON", 0, 1, OK_BUTTON, /* ACU extension */
1978 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
1979 },
1980 { "OMITTED", 0, 0, OMITTED, /* 2002 */
1981 0, 0
1982 },
1983 { "ON", 0, 0, ON, /* 2002 */
1984 0, 0
1985 },
1986 { "ONLY", 0, 0, ONLY, /* 2002 (C/S) */
1987 0, 0
1988 /* FIXME: 2014 Context-sensitive to Object-view, SHARING clause, SHARING phrase, and USAGE clause */
1989 },
1990 { "OPEN", 1, 0, OPEN, /* 2002 */
1991 CB_CS_OPEN, 0
1992 },
1993 { "OPTIONAL", 0, 0, OPTIONAL, /* 2002 */
1994 0, 0
1995 },
1996 { "OPTIONS", 0, 0, OPTIONS, /* 2002 */
1997 CB_CS_OPTIONS, 0
1998 },
1999 { "OR", 0, 0, OR, /* 2002 */
2000 0, 0
2001 },
2002 { "ORDER", 0, 0, ORDER, /* 2002 */
2003 0, 0
2004 },
2005 { "ORGANIZATION", 0, 0, ORGANIZATION, /* 2002 */
2006 0, 0
2007 },
2008 { "OTHER", 0, 0, OTHER, /* 2002 */
2009 0, 0
2010 },
2011 { "OTHERS", 0, 1, OTHERS, /* ACU extension */
2012 0, CB_CS_OPEN
2013 },
2014 { "OUTPUT", 0, 0, OUTPUT, /* 2002 */
2015 0, 0
2016 },
2017 { "OVERFLOW", 0, 0, TOK_OVERFLOW, /* 2002 */
2018 0, 0
2019 },
2020 { "OVERLAP-LEFT", 0, 1, OVERLAP_LEFT, /* ACU extension */
2021 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2022 },
2023 { "OVERLAP-TOP", 0, 1, OVERLAP_LEFT, /* ACU extension */
2024 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2025 },
2026 { "OVERLINE", 0, 0, OVERLINE, /* Extension */
2027 0, 0
2028 },
2029 { "OVERRIDE", 0, 0, -1, /* 2002 */
2030 0, 0
2031 },
2032 { "PACKED-DECIMAL", 0, 0, PACKED_DECIMAL, /* 2002 */
2033 0, 0
2034 },
2035 { "PADDING", 0, 0, PADDING, /* 2002 */
2036 0, 0
2037 },
2038 { "PAGE", 0, 0, PAGE, /* 2002 */
2039 0, 0
2040 },
2041 { "PAGE-COUNTER", 0, 0, PAGE_COUNTER, /* 2002 */
2042 0, 0
2043 },
2044 { "PAGE-SETUP", 0, 1, PAGE_SETUP, /* ACU extension */
2045 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2046 },
2047 { "PAGED", 0, 1, PAGED, /* ACU extension */
2048 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2049 },
2050 { "PARAGRAPH", 0, 1, PARAGRAPH, /* 2002 (C/S) */
2051 0, CB_CS_EXIT
2052 },
2053 { "PARENT", 0, 1, PARENT, /* ACU extension */
2054 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2055 },
2056 { "PARSE", 0, 1, PARSE, /* IBM extension */
2057 0, 0
2058 },
2059 {"PASCAL", 0, 1, PASCAL, /* Extension: implicit defined CALL-CONVENTION */
2060 0, CB_CS_CALL | CB_CS_OPTIONS
2061 },
2062 { "PASSWORD", 0, 1, PASSWORD, /* IBM extension */
2063 0, CB_CS_SELECT
2064 },
2065 { "PERFORM", 1, 0, PERFORM, /* 2002 */
2066 CB_CS_PERFORM, 0
2067 },
2068 { "PERMANENT", 0, 1, PERMANENT, /* ACU extension */
2069 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2070 },
2071 { "PF", 0, 0, PF, /* 2002 */
2072 0, 0
2073 },
2074 { "PH", 0, 0, PH, /* 2002 */
2075 0, 0
2076 },
2077 { "PHYSICAL", 0, 0, PHYSICAL, /* 2014, note:
2078 only listed as argument for LENGTH FUNCTIONS... */
2079 0, 0
2080 },
2081 { "PIC", 0, 0, PICTURE, /* 2002 */
2082 0, 0
2083 },
2084 { "PICTURE", 0, 0, PICTURE, /* 2002 */
2085 0, 0
2086 },
2087 { "PIXEL", 0, 1, PIXEL, /* ACU extension */
2088 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2089 },
2090 { "PLACEMENT", 0, 1, PLACEMENT, /* ACU extension */
2091 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2092 },
2093 { "PLUS", 0, 0, PLUS, /* 2002 */
2094 0, 0
2095 },
2096 { "POINTER", 0, 0, POINTER, /* 2002 */
2097 0, 0
2098 },
2099 { "POP-UP", 0, 1, POP_UP, /* ACU extension */
2100 0, CB_CS_DISPLAY
2101 },
2102 { "POS", 0, 0, POS, /* ACU extension for AT POSITION */
2103 0, 0
2104 },
2105 { "POSITION", 0, 0, POSITION, /* 85 */
2106 0, 0
2107 },
2108 { "POSITION-SHIFT", 0, 1, POSITION_SHIFT, /* ACU extension */
2109 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2110 },
2111 { "POSITIVE", 0, 0, POSITIVE, /* 2002 */
2112 0, 0
2113 },
2114 { "PREFIXED", 0, 1, -1, /* 2014 (C/S) */
2115 0, 0
2116 /* FIXME: 2014 Context-sensitive to ANY LENGTH STRUCTURE clause */
2117 },
2118 { "PRESENT", 0, 0, PRESENT, /* 2002 */
2119 0, 0
2120 },
2121 { "PREVIOUS", 0, 1, PREVIOUS, /* 2002 (C/S) */
2122 0, CB_CS_READ
2123 },
2124 { "PRINT", 0, 1, PRINT, /* Extension */
2125 0, CB_CS_ASSIGN
2126 },
2127 { "PRINT-NO-PROMPT", 0, 1, PRINT_NO_PROMPT, /* ACU extension */
2128 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2129 },
2130 { "PRINT-PREVIEW", 0, 1, PRINT_PREVIEW, /* ACU extension */
2131 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2132 },
2133 { "PRINTER", 0, 1, PRINTER, /* Extension */
2134 0, CB_CS_ASSIGN
2135 },
2136 { "PRINTER-1", 0, 1, PRINTER_1, /* Extension */
2137 0, CB_CS_ASSIGN
2138 },
2139 { "PRINTING", 0, 0, PRINTING, /* 2002 */
2140 0, 0
2141 },
2142 { "PRIORITY", 0, 0, PRIORITY, /* ACU extension */
2143 0, 0 /* Checkme: likely context sensitive */
2144 },
2145 { "PROCEDURE", 0, 0, PROCEDURE, /* 2002 */
2146 0, 0
2147 },
2148 { "PROCEDURE-POINTER", 0, 0, PROGRAM_POINTER, /* Extension */
2149 0, 0
2150 },
2151 { "PROCEDURES", 0, 0, PROCEDURES, /* Extension */
2152 0, 0
2153 },
2154 { "PROCEED", 0, 0, PROCEED, /* 85 */
2155 0, 0
2156 },
2157 { "PROCESSING", 0, 1, PROCESSING, /* IBM extension */
2158 0, CB_CS_XML_PARSE
2159 },
2160 { "PROGRAM", 0, 0, PROGRAM, /* 2002 */
2161 0, 0
2162 },
2163 { "PROGRAM-ID", 0, 0, PROGRAM_ID, /* 2002 */
2164 0, 0
2165 },
2166 { "PROGRAM-POINTER", 0, 0, PROGRAM_POINTER, /* 2002 */
2167 0, 0
2168 },
2169 { "PROGRESS", 0, 1, PROGRESS, /* ACU extension */
2170 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2171 },
2172 { "PROHIBITED", 0, 1, PROHIBITED, /* 2014 (C/S) */
2173 0, CB_CS_ROUNDED
2174 /* FIXME: 2014 ... and INTERMEDIATE ROUNDING clause clause */
2175 },
2176 { "PROMPT", 0, 0, PROMPT, /* Extension */
2177 0, 0
2178 },
2179 { "PROPERTIES", 0, 1, PROPERTIES, /* ACU extension */
2180 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2181 },
2182 { "PROPERTY", 0, 0, PROPERTY, /* 2002, ACU extension */
2183 0, 0
2184 },
2185 { "PROTECTED", 0, 1, PROTECTED, /* Extension PROTECTED SIZE */
2186 0, CB_CS_ACCEPT
2187 },
2188 { "PROTOTYPE", 0, 0, -1, /* 2002 */
2189 0, 0
2190 },
2191 { "PURGE", 0, 0, PURGE, /* Communication Section */
2192 0, 0
2193 },
2194 { "PUSH-BUTTON", 1, 1, PUSH_BUTTON, /* ACU extension */
2195 CB_CS_GRAPHICAL_CONTROL, CB_CS_DISPLAY | CB_CS_SCREEN
2196 },
2197 { "QUERY-INDEX", 0, 1, QUERY_INDEX, /* ACU extension */
2198 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2199 },
2200 { "QUEUE", 0, 0, QUEUE, /* Communication Section */
2201 0, 0
2202 },
2203 { "QUOTE", 0, 0, QUOTE, /* 2002 */
2204 0, 0
2205 },
2206 { "QUOTES", 0, 0, QUOTE, /* 2002 */
2207 0, 0
2208 },
2209 { "RADIO-BUTTON", 1, 1, RADIO_BUTTON, /* ACU extension */
2210 CB_CS_GRAPHICAL_CONTROL, CB_CS_DISPLAY | CB_CS_SCREEN
2211 },
2212 { "RAISE", 0, 0, RAISE, /* 2002 */
2213 0, 0
2214 },
2215 { "RAISED", 0, 1, RAISED, /* ACU extension */
2216 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2217 },
2218 { "RAISING", 0, 0, -1, /* 2002 */
2219 0, 0
2220 },
2221 { "RANDOM", 0, 0, RANDOM, /* 2002 */
2222 0, 0
2223 },
2224 { "RD", 0, 0, RD, /* 2002 */
2225 0, 0
2226 },
2227 { "READ", 1, 0, READ, /* 2002 */
2228 CB_CS_READ, 0
2229 },
2230 { "READ-ONLY", 0, 1, READ_ONLY, /* ACU extension */
2231 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2232 },
2233 { "READERS", 0, 1, READERS, /* ACU extension */
2234 0, CB_CS_OPEN
2235 },
2236 { "RECEIVE", 1, 0, RECEIVE, /* Communication Section */
2237 0, 0
2238 },
2239 { "RECORD", 0, 0, RECORD, /* 2002 */
2240 0, 0
2241 },
2242 { "RECORD-DATA", 0, 1, RECORD_DATA, /* ACU extension */
2243 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2244 },
2245 { "RECORD-OVERFLOW", 0, 1, RECORD_OVERFLOW, /* OS/VS extension */
2246 0, CB_CS_I_O_CONTROL
2247 },
2248 { "RECORD-TO-ADD", 0, 1, RECORD_TO_ADD, /* ACU extension */
2249 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2250 },
2251 { "RECORD-TO-DELETE", 0, 1, RECORD_TO_DELETE, /* ACU extension */
2252 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2253 },
2254 { "RECORDING", 0, 0, RECORDING, /* Extension */
2255 CB_CS_RECORDING, 0
2256 },
2257 { "RECORDS", 0, 0, RECORDS, /* 2002 */
2258 0, 0
2259 },
2260 { "RECURSIVE", 0, 1, RECURSIVE, /* 2002 (C/S) */
2261 0, CB_CS_PROGRAM_ID
2262 },
2263 { "REDEFINES", 0, 0, REDEFINES, /* 2002 */
2264 0, 0
2265 },
2266 { "REEL", 0, 0, REEL, /* 2002 */
2267 0, 0
2268 },
2269 { "REFERENCE", 0, 0, REFERENCE, /* 2002 */
2270 0, 0
2271 },
2272 { "REFERENCES", 0, 0, REFERENCES, /* Obsolete */
2273 0, 0
2274 },
2275 { "REFRESH", 0, 1, REFRESH, /* ACU extension */
2276 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2277 },
2278 { "REGION-COLOR", 0, 1, REGION_COLOR, /* ACU extension */
2279 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2280 },
2281 { "RELATION", 0, 1, -1, /* 2002 (C/S) */
2282 0, 0
2283 /* FIXME: 2014 Context-sensitive to VALIDATE-STATUS clause */
2284 },
2285 { "RELATIVE", 0, 0, RELATIVE, /* 2002 */
2286 0, 0
2287 },
2288 { "RELEASE", 0, 0, RELEASE, /* 2002 */
2289 0, 0
2290 },
2291 { "REMAINDER", 0, 0, REMAINDER, /* 2002 */
2292 0, 0
2293 },
2294 { "REMOVAL", 0, 0, REMOVAL, /* 2002 */
2295 0, 0
2296 },
2297 { "RENAMES", 0, 0, RENAMES, /* 2002 */
2298 0, 0
2299 },
2300 { "REORG-CRITERIA", 0, 1, REORG_CRITERIA, /* OS/VS extension */
2301 0, CB_CS_I_O_CONTROL
2302 },
2303 { "REPLACE", 0, 0, REPLACE, /* 2002 */
2304 0, 0
2305 },
2306 { "REPLACING", 0, 0, REPLACING, /* 2002 */
2307 0, 0
2308 },
2309 { "REPORT", 0, 0, REPORT, /* 2002 */
2310 0, 0
2311 },
2312 { "REPORTING", 0, 0, REPORTING, /* 2002 */
2313 0, 0
2314 },
2315 { "REPORTS", 0, 0, REPORTS, /* 2002 */
2316 0, 0
2317 },
2318 { "REPOSITORY", 0, 0, REPOSITORY, /* 2002 */
2319 0, 0
2320 },
2321 { "REQUIRED", 0, 1, REQUIRED, /* 2002 (C/S) */
2322 0, CB_CS_ACCEPT | CB_CS_SCREEN
2323 },
2324 { "REREAD", 0, 1, REREAD, /* OS/VS extension */
2325 0, CB_CS_OPEN
2326 },
2327 { "RERUN", 0, 1, RERUN, /* IBM extension */
2328 0, CB_CS_I_O_CONTROL
2329 },
2330 { "RESERVE", 0, 0, RESERVE, /* 2002 */
2331 0, 0
2332 },
2333 { "RESET", 0, 0, RESET, /* 2002 */
2334 0, 0
2335 },
2336 { "RESET-GRID", 0, 1, RESET_GRID, /* ACU extension */
2337 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2338 },
2339 { "RESET-LIST", 0, 1, RESET_LIST, /* ACU extension */
2340 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2341 },
2342 { "RESET-TABS", 0, 1, RESET_TABS, /* ACU extension */
2343 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2344 },
2345 { "RESUME", 0, 0, -1, /* 2002 */
2346 0, 0
2347 },
2348 { "RETRY", 0, 0, RETRY, /* 2002 */
2349 CB_CS_RETRY, 0
2350 },
2351 { "RETURN", 1, 0, RETURN, /* 2002 */
2352 0, 0
2353 },
2354 { "RETURNING", 0, 0, RETURNING, /* 2002 */
2355 0, 0
2356 },
2357 { "REVERSE", 0, 0, REVERSE, /* Extension */
2358 0, 0
2359 },
2360 { "REVERSE-VIDEO", 0, 1, REVERSE_VIDEO, /* 2002 (C/S) */
2361 0, CB_CS_ACCEPT | CB_CS_DISPLAY | CB_CS_SCREEN | CB_CS_SET
2362 },
2363 { "REVERSED", 0, 0, REVERSED, /* Obsolete */
2364 0, 0
2365 },
2366 { "REWIND", 0, 0, REWIND, /* 2002 */
2367 0, 0
2368 },
2369 { "REWRITE", 1, 0, REWRITE, /* 2002 */
2370 0, 0
2371 },
2372 { "RF", 0, 0, RF, /* 2002 */
2373 0, 0
2374 },
2375 { "RH", 0, 0, RH, /* 2002 */
2376 0, 0
2377 },
2378 { "RIGHT", 0, 0, RIGHT, /* 2002 */
2379 0, 0
2380 },
2381 { "RIGHT-ALIGN", 0, 1, RIGHT_ALIGN, /* ACU extension */
2382 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2383 },
2384 { "RIGHT-JUSTIFY", 0, 0, -1, /* Extension */
2385 0, 0
2386 },
2387 { "RIMMED", 0, 1, RIMMED, /* ACU extension */
2388 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2389 },
2390 { "ROLLBACK", 0, 0, ROLLBACK, /* Extension */
2391 0, 0
2392 },
2393 { "ROUNDED", 0, 0, ROUNDED, /* 2002 */
2394 CB_CS_ROUNDED, 0
2395 },
2396 { "ROUNDING", 0, 1, ROUNDING, /* 2002 (C/S) */
2397 0, CB_CS_OPTIONS
2398 },
2399 { "ROW-COLOR", 0, 1, ROW_COLOR, /* ACU extension */
2400 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2401 },
2402 { "ROW-COLOR-PATTERN", 0, 1, ROW_COLOR_PATTERN, /* ACU extension */
2403 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2404 },
2405 { "ROW-DIVIDERS", 0, 1, ROW_DIVIDERS, /* ACU extension */
2406 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2407 },
2408 { "ROW-FONT", 0, 1, ROW_FONT, /* ACU extension */
2409 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2410 },
2411 { "ROW-HEADINGS", 0, 1, ROW_HEADINGS, /* ACU extension */
2412 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2413 },
2414 { "ROW-PROTECTION", 0, 1, ROW_PROTECTION, /* ACU extension */
2415 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2416 },
2417 { "RUN", 0, 0, RUN, /* 2002 */
2418 0, 0
2419 },
2420 { "S", 0, 1, S, /* Extension */
2421 0, CB_CS_RECORDING
2422 },
2423 { "SAME", 0, 0, SAME, /* 2002 */
2424 0, 0
2425 },
2426 { "SAVE-AS", 0, 1, SAVE_AS, /* ACU extension */
2427 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2428 },
2429 { "SAVE-AS-NO-PROMPT", 0, 1, SAVE_AS_NO_PROMPT, /* ACU extension */
2430 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2431 },
2432 { "SCREEN", 0, 0, SCREEN, /* 2002 */
2433 0, 0
2434 },
2435 { "SCROLL", 0, 1, SCROLL, /* Extension */
2436 0, CB_CS_ACCEPT | CB_CS_DISPLAY
2437 },
2438 { "SCROLL-BAR", 1, 1, SCROLL_BAR, /* ACU extension */
2439 CB_CS_GRAPHICAL_CONTROL, CB_CS_DISPLAY | CB_CS_SCREEN
2440 },
2441 { "SD", 0, 0, SD, /* 2002 */
2442 0, 0
2443 },
2444 { "SEARCH", 1, 0, SEARCH, /* 2002 */
2445 0, 0
2446 },
2447 { "SEARCH-OPTIONS", 0, 1, SEARCH_OPTIONS, /* ACU extension */
2448 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2449 },
2450 { "SEARCH-TEXT", 0, 1, SEARCH_TEXT, /* ACU extension */
2451 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2452 },
2453 { "SECONDS", 0, 1, SECONDS, /* 2002 (C/S) */
2454 0, CB_CS_RETRY
2455 },
2456 { "SECTION", 0, 0, SECTION, /* 2002 */
2457 0, 0
2458 },
2459 { "SECURE", 0, 1, SECURE, /* 2002 (C/S) */
2460 0, CB_CS_ACCEPT | CB_CS_DISPLAY | CB_CS_SCREEN
2461 },
2462 { "SEGMENT", 0, 0, SEGMENT, /* Communication Section */
2463 0, 0
2464 },
2465 { "SEGMENT-LIMIT", 0, 0, SEGMENT_LIMIT, /* 85 */
2466 0, 0
2467 },
2468 { "SELECT", 1, 0, SELECT, /* 2002 */
2469 CB_CS_SELECT, 0
2470 },
2471 { "SELECT-ALL", 0, 1, SELECT_ALL, /* ACU extension */
2472 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2473 },
2474 { "SELECTION-INDEX", 0, 1, SELECTION_INDEX, /* ACU extension */
2475 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2476 },
2477 { "SELECTION-TEXT", 0, 1, SELECTION_TEXT, /* ACU extension */
2478 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2479 },
2480 { "SELF", 0, 0, -1, /* 2002 */
2481 0, 0
2482 },
2483 { "SELF-ACT", 0, 1, SELF_ACT, /* ACU extension */
2484 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2485 },
2486 { "SEND", 0, 0, SEND, /* Communication Section */
2487 0, 0
2488 },
2489 { "SENTENCE", 0, 0, SENTENCE, /* 2002 */
2490 0, 0
2491 },
2492 { "SEPARATE", 0, 0, SEPARATE, /* 2002 */
2493 0, 0
2494 },
2495 { "SEPARATION", 0, 1, SEPARATION, /* ACU extension */
2496 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2497 },
2498 { "SEQUENCE", 0, 0, SEQUENCE, /* 2002 */
2499 0, 0
2500 },
2501 { "SEQUENTIAL", 0, 0, SEQUENTIAL, /* 2002 */
2502 0, 0
2503 },
2504 { "SET", 0, 0, SET, /* 2002 */
2505 0, 0
2506 },
2507 { "SHADING", 0, 1, SHADING, /* ACU extension */
2508 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2509 },
2510 { "SHADOW", 0, 1, SHADOW, /* ACU extension */
2511 0, CB_CS_DISPLAY
2512 },
2513 { "SHARING", 0, 0, SHARING, /* 2002 */
2514 0, 0
2515 },
2516 #if 0 /* FIXME: 2014 Context-sensitive to ANY LENGTH STRUCTURE clause */
2517 { "SHORT", 0, 0, -1, /* 2014 */
2518 0, 0
2519 },
2520 #endif
2521 { "SHORT-DATE", 0, 1, SHORT_DATE, /* ACU extension */
2522 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2523 },
2524 { "SHOW-LINES", 0, 1, SHOW_LINES, /* ACU extension */
2525 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2526 },
2527 { "SHOW-NONE", 0, 1, SHOW_NONE, /* ACU extension */
2528 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2529 },
2530 { "SHOW-SEL-ALWAYS", 0, 1, SHOW_SEL_ALWAYS, /* ACU extension */
2531 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2532 },
2533 { "SIGN", 0, 0, SIGN, /* 2002 */
2534 0, 0
2535 },
2536 { "SIGNED", 0, 0, SIGNED, /* 2002 (C/S) */
2537 0, 0
2538 /* FIXME: 2014 Context-sensitive to ANY LENGTH STRUCTURE clause
2539 and USAGE clause */
2540 },
2541 { "SIGNED-INT", 0, 0, SIGNED_INT, /* Extension */
2542 0, 0
2543 },
2544 { "SIGNED-LONG", 0, 0, SIGNED_LONG, /* Extension */
2545 0, 0
2546 },
2547 { "SIGNED-SHORT", 0, 0, SIGNED_SHORT, /* Extension */
2548 0, 0
2549 },
2550 { "SIZE", 0, 0, SIZE, /* 2002 */
2551 0, 0
2552 },
2553 { "SMALL-FONT", 0, 0, SMALL_FONT, /* ACU extension */
2554 0, 0 /* Checkme: likely context sensitive */
2555 },
2556 { "SORT", 0, 0, SORT, /* 2002 */
2557 0, 0
2558 },
2559 { "SORT-MERGE", 0, 0, SORT_MERGE, /* 2002 */
2560 0, 0
2561 },
2562 { "SORT-ORDER", 0, 1, SORT_ORDER, /* ACU extension */
2563 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2564 },
2565 { "SOURCE", 0, 0, SOURCE, /* 2002 */
2566 0, 0
2567 },
2568 { "SOURCE-COMPUTER", 0, 0, SOURCE_COMPUTER, /* 2002 */
2569 0, 0
2570 },
2571 { "SOURCES", 0, 0, -1, /* 2002 */
2572 0, 0
2573 },
2574 { "SPACE", 0, 0, SPACE, /* 2002 */
2575 0, 0
2576 },
2577 { "SPACE-FILL", 0, 0, -1, /* Extension */
2578 0, 0
2579 },
2580 { "SPACES", 0, 0, SPACE, /* 2002 */
2581 0, 0
2582 },
2583 { "SPECIAL-NAMES", 0, 0, SPECIAL_NAMES, /* 2002 */
2584 0, 0
2585 },
2586 { "SPINNER", 0, 1, SPINNER, /* ACU extension */
2587 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2588 },
2589 { "SQUARE", 0, 1, SQUARE, /* ACU extension */
2590 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2591 },
2592 { "STANDARD", 0, 0, STANDARD, /* 2002 */
2593 0, 0
2594 },
2595 { "STANDARD-1", 0, 0, STANDARD_1, /* 2002 */
2596 0, 0
2597 },
2598 { "STANDARD-2", 0, 0, STANDARD_2, /* 2002 */
2599 0, 0
2600 },
2601 { "STANDARD-BINARY", 0, 1, STANDARD_BINARY, /* 2014 (C/S) */
2602 0, CB_CS_OPTIONS
2603 },
2604 { "STANDARD-DECIMAL", 0, 1, STANDARD_DECIMAL, /* 2014 (C/S) */
2605 0, CB_CS_OPTIONS
2606 },
2607 { "START", 1, 0, START, /* 2002 */
2608 0, 0
2609 },
2610 { "START-X", 0, 1, START_X, /* ACU extension */
2611 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2612 },
2613 { "START-Y", 0, 1, START_Y, /* ACU extension */
2614 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2615 },
2616 { "STATEMENT", 0, 1, -1, /* 2002 (C/S) */
2617 0, 0
2618 /* FIXME: 2014 Context-sensitive to RESUME statement */
2619 },
2620 { "STATIC", 0, 1, STATIC, /* Extension: implicit defined CALL-CONVENTION */
2621 0, CB_CS_CALL
2622 },
2623 { "STATIC-LIST", 0, 1, STATIC_LIST, /* ACU extension */
2624 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2625 },
2626 { "STATUS", 0, 0, STATUS, /* 2002 */
2627 0, 0
2628 },
2629 { "STATUS-BAR", 1, 1, STATUS_BAR, /* ACU extension */
2630 CB_CS_GRAPHICAL_CONTROL, CB_CS_DISPLAY | CB_CS_SCREEN
2631 },
2632 { "STATUS-TEXT", 0, 1, STATUS_TEXT, /* ACU extension */
2633 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2634 },
2635 { "STDCALL", 0, 1, STDCALL, /* Extension: implicit defined CALL-CONVENTION */
2636 0, CB_CS_CALL | CB_CS_OPTIONS
2637 },
2638 { "STEP", 0, 1, STEP, /* 2002 (C/S) */
2639 0, CB_CS_OCCURS
2640 },
2641 { "STOP", 0, 0, STOP, /* 2002 */
2642 CB_CS_STOP, 0
2643 },
2644 { "STRING", 1, 0, STRING, /* 2002 */
2645 0, 0
2646 },
2647 { "STRONG", 0, 1, STRONG, /* 2002 (C/S) */
2648 0, CB_CS_TYPEDEF
2649 },
2650 { "STYLE", 0, 1, STYLE, /* ACU extension */
2651 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2652 },
2653 { "SUB-QUEUE-1", 0, 0, SUB_QUEUE_1, /* Communication Section */
2654 0, 0
2655 },
2656 { "SUB-QUEUE-2", 0, 0, SUB_QUEUE_2, /* Communication Section */
2657 0, 0
2658 },
2659 { "SUB-QUEUE-3", 0, 0, SUB_QUEUE_3, /* Communication Section */
2660 0, 0
2661 },
2662 { "SUBTRACT", 1, 0, SUBTRACT, /* 2002 */
2663 0, 0
2664 },
2665 { "SUBWINDOW", 0, 0, SUBWINDOW, /* ACU extension */
2666 0, 0 /* Checkme: likely context sensitive */
2667 },
2668 { "SUM", 0, 0, SUM, /* 2002 */
2669 0, 0
2670 },
2671 { "SUPER", 0, 0, -1, /* 2002 */
2672 0, 0
2673 },
2674 { "SUPPRESS", 0, 0, SUPPRESS, /* 2002 */
2675 0, 0
2676 },
2677 { "SYMBOL", 0, 1, -1, /* 2002 (C/S) */
2678 0, 0
2679 /* FIXME: 2014 Context-sensitive to CURRENCY clause */
2680 },
2681 { "SYMBOLIC", 0, 0, SYMBOLIC, /* 2002 */
2682 0, 0
2683 },
2684 { "SYNC", 0, 0, SYNCHRONIZED, /* 2002 */
2685 0, 0
2686 },
2687 { "SYNCHRONIZED", 0, 0, SYNCHRONIZED, /* 2002 */
2688 0, 0
2689 },
2690 { "SYSTEM-DEFAULT", 0, 0, SYSTEM_DEFAULT, /* 2002 */
2691 0, 0
2692 },
2693 { "SYSTEM-INFO", 0, 1, SYSTEM_INFO, /* ACU extension */
2694 0, CB_CS_ACCEPT
2695 },
2696 { "SYSTEM-OFFSET", 0, 0, SYSTEM_OFFSET, /* Extension */
2697 0, 0
2698 },
2699 { "TAB", 1, 1, TAB, /* Extension */
2700 CB_CS_GRAPHICAL_CONTROL, CB_CS_ACCEPT | CB_CS_DISPLAY | CB_CS_SCREEN
2701 },
2702 { "TAB-TO-ADD", 0, 1, TAB_TO_ADD, /* ACU extension */
2703 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2704 },
2705 { "TAB-TO-DELETE", 0, 1, TAB_TO_DELETE, /* ACU extension */
2706 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2707 },
2708 { "TABLE", 0, 0, TABLE, /* Communication Section */
2709 0, 0
2710 },
2711 { "TALLYING", 0, 0, TALLYING, /* 2002 */
2712 0, 0
2713 },
2714 { "TAPE", 0, 1, TAPE, /* 85 */
2715 0, CB_CS_ASSIGN
2716 },
2717 { "TEMPORARY", 0, 1, TEMPORARY, /* ACU extension */
2718 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2719 },
2720 { "TERMINAL", 0, 0, TERMINAL, /* Communication Section */
2721 0, 0
2722 },
2723 { "TERMINAL-INFO", 0, 1, TERMINAL_INFO, /* ACU extension */
2724 0, CB_CS_ACCEPT
2725 },
2726 { "TERMINATE", 0, 0, TERMINATE, /* 2002 */
2727 0, 0
2728 },
2729 { "TERMINATION-VALUE", 0, 1, TERMINATION_VALUE, /* ACU extension */
2730 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2731 },
2732 { "TEST", 0, 0, TEST, /* 2002 */
2733 0, 0
2734 },
2735 { "TEXT", 0, 0, TEXT, /* Communication Section */
2736 0, 0
2737 },
2738 { "THAN", 0, 0, THAN, /* 2002 */
2739 0, 0
2740 },
2741 { "THEN", 0, 0, THEN, /* 2002 */
2742 0, 0
2743 },
2744 { "THREAD", 0, 0, THREAD, /* ACU extension */
2745 0, 0
2746 },
2747 { "THREADS", 0, 0, THREADS, /* ACU extension */
2748 0, 0
2749 },
2750 { "THROUGH", 0, 0, THRU, /* 2002 */
2751 0, 0
2752 },
2753 { "THRU", 0, 0, THRU, /* 2002 */
2754 0, 0
2755 },
2756 { "THUMB-POSITION", 0, 1, THUMB_POSITION, /* ACU extension */
2757 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2758 },
2759 { "TILED-HEADINGS", 0, 1, TILED_HEADINGS, /* ACU extension */
2760 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2761 },
2762 { "TIME", 0, 0, TIME, /* 2002 */
2763 0, 0
2764 },
2765 { "TIME-OUT", 0, 1, TIME_OUT, /* Ext (C/S) */
2766 0, CB_CS_ACCEPT
2767 },
2768 { "TIMES", 0, 0, TIMES, /* 2002 */
2769 0, 0
2770 },
2771 { "TITLE", 0, 1, TITLE, /* ACU extension */
2772 0, CB_CS_DISPLAY | CB_CS_INQUIRE_MODIFY
2773 },
2774 { "TITLE-POSITION", 0, 1, TITLE_POSITION, /* ACU extension */
2775 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2776 },
2777 { "TO", 0, 0, TO, /* 2002 */
2778 0, 0
2779 },
2780 { "TOP", 0, 0, TOP, /* 2002 */
2781 0, 0
2782 },
2783 { "TOWARD-GREATER", 0, 1, TOWARD_GREATER, /* 2014 (C/S) */
2784 0, CB_CS_ROUNDED
2785 },
2786 { "TOWARD-LESSER", 0, 1, TOWARD_LESSER, /* 2014 (C/S) */
2787 0, CB_CS_ROUNDED
2788 },
2789 { "TRACK", 0, 1, TRACK, /* OS/VS extension */
2790 0, CB_CS_SELECT | CB_CS_I_O_CONTROL
2791 },
2792 { "TRACKS", 0, 1, TRACKS, /* OS/VS extension */
2793 0, CB_CS_SELECT | CB_CS_I_O_CONTROL
2794 },
2795 { "TRACK-AREA", 0, 1, TRACK_AREA, /* OS/VS extension */
2796 0, CB_CS_SELECT
2797 },
2798 { "TRACK-LIMIT", 0, 1, TRACK_LIMIT, /* OS/VS extension */
2799 0, CB_CS_SELECT
2800 },
2801 { "TRADITIONAL-FONT", 0, 0, TRADITIONAL_FONT, /* ACU extension */
2802 0, 0 /* Checkme: likely context sensitive */
2803 },
2804 { "TRAILING", 0, 0, TRAILING, /* 2002 */
2805 0, 0
2806 },
2807 { "TRAILING-SHIFT", 0, 1, TRAILING_SHIFT, /* ACU extension */
2808 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2809 },
2810 { "TRAILING-SIGN", 0, 0, -1, /* Extension */
2811 0, 0
2812 },
2813 { "TRANSFORM", 0, 0, TRANSFORM, /* OSVS */
2814 0, 0
2815 },
2816 { "TRANSPARENT", 0, 1, TRANSPARENT, /* ACU extension */
2817 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2818 },
2819 { "TREE-VIEW", 1, 1, TREE_VIEW, /* ACU extension */
2820 CB_CS_GRAPHICAL_CONTROL, CB_CS_DISPLAY | CB_CS_SCREEN
2821 },
2822 { "TRUE", 0, 0, TOK_TRUE, /* 2002 */
2823 0, 0
2824 },
2825 { "TRUNCATION", 0, 1, TRUNCATION, /* 2014 (C/S) */
2826 0, CB_CS_ROUNDED
2827 /* FIXME: 2014 ... and INTERMEDIATE ROUNDING phrase */
2828 },
2829 { "TYPE", 0, 0, TYPE, /* 2002 */
2830 0, 0
2831 },
2832 { "TYPEDEF", 0, 0, TYPEDEF, /* 2002 */
2833 CB_CS_TYPEDEF, 0
2834 },
2835 { "U", 0, 1, U, /* Extension */
2836 0, CB_CS_RECORDING
2837 },
2838 { "UCS-4", 0, 1, UCS_4, /* 2002 (C/S) */
2839 0, CB_CS_ALPHABET
2840 },
2841 { "UNBOUNDED", 0, 1, UNBOUNDED, /* IBM V5 */
2842 0, CB_CS_OCCURS
2843 },
2844 { "UNDERLINE", 0, 1, UNDERLINE, /* 2002 (C/S) */
2845 0, CB_CS_ACCEPT | CB_CS_DISPLAY | CB_CS_SCREEN | CB_CS_SET
2846 },
2847 { "UNFRAMED", 0, 1, UNFRAMED, /* ACU extension */
2848 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2849 },
2850 { "UNIT", 0, 0, UNIT, /* 2002 */
2851 0, 0
2852 },
2853 { "UNIVERSAL", 0, 0, -1, /* 2002 */
2854 0, 0
2855 },
2856 { "UNLOCK", 0, 0, UNLOCK, /* 2002 */
2857 0, 0
2858 },
2859 { "UNSIGNED", 0, 0, UNSIGNED, /* 2002 (C/S) */
2860 0, 0
2861 },
2862 { "UNSIGNED-INT", 0, 0, UNSIGNED_INT, /* Extension */
2863 0, 0
2864 },
2865 { "UNSIGNED-LONG", 0, 0, UNSIGNED_LONG, /* Extension */
2866 0, 0
2867 },
2868 { "UNSIGNED-SHORT", 0, 0, UNSIGNED_SHORT, /* Extension */
2869 0, 0
2870 },
2871 { "UNSORTED", 0, 1, UNSORTED, /* ACU extension */
2872 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2873 },
2874 { "UNSTRING", 1, 0, UNSTRING, /* 2002 */
2875 0, 0
2876 },
2877 { "UNTIL", 0, 0, UNTIL, /* 2002 */
2878 0, 0
2879 },
2880 { "UP", 0, 0, UP, /* 2002 */
2881 0, 0
2882 },
2883 { "UPDATE", 0, 0, UPDATE, /* Extension */
2884 0, 0
2885 },
2886 { "UPDATERS", 0, 1, UPDATERS, /* ACU extension */
2887 0, CB_CS_OPEN
2888 },
2889 { "UPON", 0, 0, UPON, /* 2002 */
2890 0, 0
2891 },
2892 { "UPPER", 0, 1, UPPER, /* Extension */
2893 0, CB_CS_ACCEPT
2894 },
2895 { "USAGE", 0, 0, USAGE, /* 2002 */
2896 0, 0
2897 },
2898 { "USE", 0, 0, USE, /* 2002 */
2899 0, 0
2900 },
2901 { "USE-ALT", 0, 1, USE_ALT, /* ACU extension */
2902 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2903 },
2904 { "USE-RETURN", 0, 1, USE_RETURN, /* ACU extension */
2905 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2906 },
2907 { "USE-TAB", 0, 1, USE_TAB, /* ACU extension */
2908 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2909 },
2910 { "USER", 0, 1, USER, /* Extension */
2911 0, CB_CS_FROM
2912 },
2913 { "USER-DEFAULT", 0, 0, USER_DEFAULT, /* 2002 */
2914 0, 0
2915 },
2916 { "USING", 0, 0, USING, /* 2002 */
2917 0, 0
2918 },
2919 { "UTF-16", 0, 1, UTF_16, /* 2002 (C/S) */
2920 0, CB_CS_ALPHABET
2921 },
2922 { "UTF-8", 0, 1, UTF_8, /* 2002 (C/S) */
2923 0, CB_CS_ALPHABET
2924 },
2925 { "V", 0, 1, V, /* Extension */
2926 0, CB_CS_RECORDING
2927 },
2928 { "VAL-STATUS", 0, 0, -1, /* 2002 */
2929 0, 0
2930 },
2931 { "VALID", 0, 0, -1, /* 2002 */
2932 0, 0
2933 },
2934 { "VALIDATE", 0, 0, VALIDATE, /* 2002 */
2935 0, 0
2936 },
2937 { "VALIDATE-STATUS", 0, 0, -1, /* 2002 */
2938 0, 0
2939 },
2940 { "VALIDATING", 0, 1, VALIDATING, /* IBM extension */
2941 0, CB_CS_XML_PARSE
2942 },
2943 { "VALUE", 0, 0, VALUE, /* 2002 */
2944 0, 0
2945 },
2946 { "VALUE-FORMAT", 0, 1, VALUE_FORMAT, /* ACU extension */
2947 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2948 },
2949 { "VARIABLE", 0, 1, VARIABLE, /* Extension */
2950 0, CB_CS_RECORDING
2951 },
2952 { "VARIANT", 0, 0, VARIANT, /* ACU extension */
2953 0, 0
2954 },
2955 { "VARYING", 0, 0, VARYING, /* 2002 */
2956 0, 0
2957 },
2958 { "VERTICAL", 0, 1, VERTICAL, /* ACU extension */
2959 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2960 },
2961 { "VERY-HEAVY", 0, 1, VERY_HEAVY, /* ACU extension */
2962 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2963 },
2964 { "VIRTUAL-WIDTH", 0, 1, VIRTUAL_WIDTH, /* ACU extension */
2965 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2966 },
2967 { "VOLATILE", 0, 0, VOLATILE, /* IBM Extension */
2968 0, 0
2969 },
2970 { "VPADDING", 0, 1, VPADDING, /* ACU extension */
2971 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2972 },
2973 { "VSCROLL", 0, 1, VSCROLL, /* ACU extension */
2974 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2975 },
2976 { "VSCROLL-BAR", 0, 1, VSCROLL_BAR, /* ACU extension */
2977 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2978 },
2979 { "VSCROLL-POS", 0, 1, VSCROLL_POS, /* ACU extension */
2980 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2981 },
2982 { "VTOP", 0, 1, VTOP, /* ACU extension */
2983 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2984 },
2985 { "WAIT", 0, 0, WAIT, /* Extension */
2986 0, 0
2987 },
2988 { "WEB-BROWSER", 1, 1, WEB_BROWSER, /* ACU extension */
2989 CB_CS_GRAPHICAL_CONTROL, CB_CS_DISPLAY | CB_CS_SCREEN
2990 },
2991 { "WHEN", 0, 0, WHEN, /* 2002 */
2992 0, 0
2993 },
2994 { "WIDTH", 0, 1, WIDTH, /* ACU extension */
2995 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2996 },
2997 { "WIDTH-IN-CELLS", 0, 1, WIDTH_IN_CELLS, /* ACU extension */
2998 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
2999 },
3000 { "WINDOW", 0, 0, WINDOW, /* ACU extension */
3001 0, 0
3002 },
3003 { "WITH", 0, 0, WITH, /* 2002 */
3004 0, 0
3005 },
3006 { "WORDS", 0, 0, WORDS, /* 85 */
3007 0, 0
3008 },
3009 { "WORKING-STORAGE", 0, 0, WORKING_STORAGE, /* 2002 */
3010 0, 0
3011 },
3012 { "WRAP", 0, 1, WRAP, /* Extension */
3013 0, CB_CS_ACCEPT | CB_CS_DISPLAY
3014 },
3015 { "WRITE", 1, 0, WRITE, /* 2002 */
3016 0, 0
3017 },
3018 { "WRITE-ONLY", 0, 1, WRITE_ONLY, /* IBM extension */
3019 0, CB_CS_I_O_CONTROL
3020 },
3021 { "WRITE-VERIFY", 0, 1, WRITE_VERIFY, /* OS/VS extension */
3022 0, CB_CS_I_O_CONTROL
3023 },
3024 { "WRITERS", 0, 1, WRITERS, /* ACU extension */
3025 0, CB_CS_OPEN
3026 },
3027 { "X", 0, 1, X, /* ACU extension */
3028 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
3029 },
3030 { "XML", 1, 0, XML, /* IBM extension */
3031 0, 0
3032 },
3033 { "XML-DECLARATION", 0, 1, XML_DECLARATION, /* IBM extension */
3034 0, CB_CS_XML_GENERATE
3035 },
3036 { "Y", 0, 1, Y, /* ACU extension */
3037 0, CB_CS_GRAPHICAL_CONTROL | CB_CS_INQUIRE_MODIFY
3038 },
3039 { "YYYYDDD", 0, 1, YYYYDDD, /* 2002 (C/S) */
3040 0, CB_CS_DAY
3041 },
3042 { "YYYYMMDD", 0, 1, YYYYMMDD, /* 2002 (C/S) */
3043 0, CB_CS_DATE
3044 },
3045 { "ZERO", 0, 0, ZERO, /* 2002 */
3046 0, 0
3047 },
3048 { "ZERO-FILL", 0, 1, -1, /* Extension */
3049 0, CB_CS_SCREEN
3050 }
3051 };
3052
3053 static unsigned int num_reserved_words;
3054 #define NUM_DEFAULT_RESERVED_WORDS \
3055 sizeof (default_reserved_words) / sizeof (struct cobc_reserved)
3056
3057 struct amendment_list {
3058 struct amendment_list *next; /* next pointer */
3059 char *word;
3060 char *alias_for;
3061 #if 0 /* FIXME: store reference to origin */
3062 char *defined_by;
3063 #endif
3064 int is_context_sensitive;
3065 int to_add;
3066 };
3067
3068 struct register_struct {
3069 const char *name;
3070 const char *definition;
3071 enum cb_feature_mode active;
3072 };
3073
3074 static size_t current_register = 0;
3075
3076 static struct register_struct register_list[] = {
3077 {"ADDRESS OF", "USAGE POINTER", CB_FEATURE_ACTIVE}, /* FIXME: currently not handled the "normal" register way */
3078 {"COB-CRT-STATUS", "PICTURE 9(4) USAGE DISPLAY VALUE ZERO", CB_FEATURE_ACTIVE}, /* FIXME: currently not handled the "normal" register way */
3079 {"DEBUG-ITEM", "PICTURE X(n) USAGE DISPLAY", CB_FEATURE_ACTIVE}, /* FIXME: currently not handled the "normal" register way */
3080 {"LENGTH OF", "CONSTANT USAGE BINARY-LONG", CB_FEATURE_ACTIVE}, /* FIXME: currently not handled the "normal" register way */
3081 {"NUMBER-OF-CALL-PARAMETERS", "USAGE BINARY-LONG", CB_FEATURE_ACTIVE}, /* OpenCOBOL / GnuCOBOL extension, at least from 1.0+ */
3082 {"RETURN-CODE", "GLOBAL USAGE BINARY-LONG VALUE ZERO", CB_FEATURE_ACTIVE},
3083 {"SORT-RETURN", "GLOBAL USAGE BINARY-LONG VALUE ZERO", CB_FEATURE_ACTIVE},
3084 {"TALLY", "GLOBAL PICTURE 9(5) USAGE BINARY VALUE ZERO", CB_FEATURE_ACTIVE},
3085 {"COL", "PIC S9(4) USAGE COMP", CB_FEATURE_MUST_BE_ENABLED}, /* rare, normally conflicting --> must be explicit enabled */
3086 {"LIN", "PIC S9(4) USAGE COMP", CB_FEATURE_MUST_BE_ENABLED}, /* rare, only in combination with COL */
3087 {"WHEN-COMPILED", "CONSTANT PICTURE X(16) USAGE DISPLAY", CB_FEATURE_ACTIVE},
3088 {"XML-CODE", "GLOBAL PICTURE S9(9) USAGE BINARY VALUE 0", CB_FEATURE_ACTIVE},
3089 /* {"XML-EVENT", "USAGE DISPLAY PICTURE X(30) VALUE SPACE", CB_FEATURE_ACTIVE}, */
3090 /* {"XML-INFORMATION", "PICTURE S9(9) USAGE BINARY VALUE 0", CB_FEATURE_ACTIVE}, */
3091 /* {"XML-NAMESPACE", "PIC X ANY LENGTH", CB_FEATURE_ACTIVE}, /\* FIXME: currently not handled the "normal" register way *\/ */
3092 /* {"XML-NAMESPACE-PREFIX", "PIC X ANY LENGTH", CB_FEATURE_ACTIVE}, /\* FIXME: currently not handled the "normal" register way *\/ */
3093 /* {"XML-NNAMESPACE", "PIC N ANY LENGTH", CB_FEATURE_ACTIVE}, /\* FIXME: currently not handled the "normal" register way *\/ */
3094 /* {"XML-NNAMESPACE-PREFIX", "PIC N ANY LENGTH", CB_FEATURE_ACTIVE}, /\* FIXME: currently not handled the "normal" register way *\/ */
3095 /* {"XML-NTEXT", "PIC N ANY LENGTH", CB_FEATURE_ACTIVE}, /\* FIXME: currently not handled the "normal" register way *\/ */
3096 /* {"XML-TEXT", "PIC X ANY LENGTH", CB_FEATURE_ACTIVE} /\* FIXME: currently not handled the "normal" register way *\/ */
3097 {"JSON-CODE", "GLOBAL PICTURE S9(9) USAGE BINARY VALUE 0", CB_FEATURE_ACTIVE}
3098 /* {"JSON-STATUS", "PIC X ANY LENGTH", CB_FEATURE_ACTIVE} /\* FIXME: currently not handled the "normal" register way *\/ */
3099 };
3100
3101 #define NUM_REGISTERS sizeof(register_list) / sizeof(struct register_struct)
3102
3103 /* Intrinsic Function List */
3104 /* Must be ordered on name for binary search */
3105
3106 /* Name, Routine, */
3107 /* Token, Parser token, */
3108 /* Implemented, Number of arguments: Max [-1 = unlimited], Min, */
3109 /* Category, Can refmod */
3110
3111 static struct cb_intrinsic_table function_list[] = {
3112 { "ABS", "cob_intr_abs",
3113 CB_INTR_ABS, FUNCTION_NAME,
3114 CB_FEATURE_ACTIVE, 1, 1,
3115 CB_CATEGORY_NUMERIC, 0
3116 },
3117 /* ACUCOBOL-extension (synonym for ABS) */
3118 { "ABSOLUTE-VALUE", "cob_intr_abs",
3119 CB_INTR_ABS, FUNCTION_NAME,
3120 CB_FEATURE_DISABLED, 1, 1,
3121 CB_CATEGORY_NUMERIC, 0
3122 },
3123 { "ACOS", "cob_intr_acos",
3124 CB_INTR_ACOS, FUNCTION_NAME,
3125 CB_FEATURE_ACTIVE, 1, 1,
3126 CB_CATEGORY_NUMERIC, 0
3127 },
3128 { "ANNUITY", "cob_intr_annuity",
3129 CB_INTR_ANNUITY, FUNCTION_NAME,
3130 CB_FEATURE_ACTIVE, 2, 2,
3131 CB_CATEGORY_NUMERIC, 0
3132 },
3133 { "ASIN", "cob_intr_asin",
3134 CB_INTR_ASIN, FUNCTION_NAME,
3135 CB_FEATURE_ACTIVE, 1, 1,
3136 CB_CATEGORY_NUMERIC, 0
3137 },
3138 { "ATAN", "cob_intr_atan",
3139 CB_INTR_ATAN, FUNCTION_NAME,
3140 CB_FEATURE_ACTIVE, 1, 1,
3141 CB_CATEGORY_NUMERIC, 0
3142 },
3143 { "BOOLEAN-OF-INTEGER", "cob_intr_boolean_of_integer",
3144 CB_INTR_BOOLEAN_OF_INTEGER, FUNCTION_NAME,
3145 CB_FEATURE_NOT_IMPLEMENTED, 2, 2,
3146 CB_CATEGORY_NUMERIC, 0
3147 },
3148 { "BYTE-LENGTH", "cob_intr_byte_length",
3149 CB_INTR_BYTE_LENGTH, LENGTH_FUNC,
3150 CB_FEATURE_ACTIVE, 2, 1,
3151 CB_CATEGORY_NUMERIC, 0
3152 },
3153 { "CHAR", "cob_intr_char",
3154 CB_INTR_CHAR, FUNCTION_NAME,
3155 CB_FEATURE_ACTIVE, 1, 1,
3156 CB_CATEGORY_ALPHANUMERIC, 0
3157 },
3158 { "CHAR-NATIONAL", "cob_intr_char_national",
3159 CB_INTR_CHAR_NATIONAL, FUNCTION_NAME,
3160 CB_FEATURE_NOT_IMPLEMENTED, 1, 1,
3161 CB_CATEGORY_NATIONAL, 0
3162 },
3163 { "COMBINED-DATETIME", "cob_intr_combined_datetime",
3164 CB_INTR_COMBINED_DATETIME, FUNCTION_NAME,
3165 CB_FEATURE_ACTIVE, 2, 2,
3166 CB_CATEGORY_NUMERIC, 0
3167 },
3168 /* COBOL 202x */
3169 { "CONCAT", "cob_intr_concatenate",
3170 CB_INTR_CONCATENATE, CONCATENATE_FUNC,
3171 CB_FEATURE_ACTIVE, -1, 1,
3172 CB_CATEGORY_ALPHANUMERIC, 1
3173 /* Note: category changed to alphabetic/national
3174 depending on the content, see cb_build_intrinsic */
3175 },
3176 /* OpenCOBOL */
3177 { "CONCATENATE", "cob_intr_concatenate",
3178 CB_INTR_CONCATENATE, CONCATENATE_FUNC,
3179 CB_FEATURE_ACTIVE, -1, 1,
3180 CB_CATEGORY_ALPHANUMERIC, 1
3181 /* Note: category changed to alphabetic/national
3182 depending on the content, see cb_build_intrinsic */
3183 },
3184 { "CONTENT-LENGTH", "cob_intr_content_length",
3185 CB_INTR_CONTENT_LENGTH, CONTENT_LENGTH_FUNC,
3186 CB_FEATURE_ACTIVE, 1, 1,
3187 CB_CATEGORY_NUMERIC, 0
3188 },
3189 /* GnuCOBOL */
3190 { "CONTENT-OF", "cob_intr_content_of",
3191 CB_INTR_CONTENT_OF, CONTENT_OF_FUNC,
3192 CB_FEATURE_ACTIVE, 2, 1,
3193 CB_CATEGORY_ALPHANUMERIC, 1
3194 },
3195 { "COS", "cob_intr_cos",
3196 CB_INTR_COS, FUNCTION_NAME,
3197 CB_FEATURE_ACTIVE, 1, 1,
3198 CB_CATEGORY_NUMERIC, 0
3199 },
3200 { "CURRENCY-SYMBOL", "cob_intr_currency_symbol",
3201 CB_INTR_CURRENCY_SYMBOL, FUNCTION_NAME,
3202 CB_FEATURE_ACTIVE, 0, 0,
3203 CB_CATEGORY_ALPHANUMERIC, 0
3204 },
3205 { "CURRENT-DATE", "cob_intr_current_date",
3206 CB_INTR_CURRENT_DATE, CURRENT_DATE_FUNC,
3207 CB_FEATURE_ACTIVE, 0, 0,
3208 CB_CATEGORY_ALPHANUMERIC, 1
3209 },
3210 { "DATE-OF-INTEGER", "cob_intr_date_of_integer",
3211 CB_INTR_DATE_OF_INTEGER, FUNCTION_NAME,
3212 CB_FEATURE_ACTIVE, 1, 1,
3213 CB_CATEGORY_NUMERIC, 0
3214 },
3215 { "DATE-TO-YYYYMMDD", "cob_intr_date_to_yyyymmdd",
3216 CB_INTR_DATE_TO_YYYYMMDD, FUNCTION_NAME,
3217 CB_FEATURE_ACTIVE, 3, 1,
3218 CB_CATEGORY_NUMERIC, 0
3219 },
3220 { "DAY-OF-INTEGER", "cob_intr_day_of_integer",
3221 CB_INTR_DAY_OF_INTEGER, FUNCTION_NAME,
3222 CB_FEATURE_ACTIVE, 1, 1,
3223 CB_CATEGORY_NUMERIC, 0
3224 },
3225 { "DAY-TO-YYYYDDD", "cob_intr_day_to_yyyyddd",
3226 CB_INTR_DAY_TO_YYYYDDD, FUNCTION_NAME,
3227 CB_FEATURE_ACTIVE, 3, 1,
3228 CB_CATEGORY_NUMERIC, 0
3229 },
3230 { "DISPLAY-OF", "cob_intr_display_of",
3231 CB_INTR_DISPLAY_OF, DISPLAY_OF_FUNC,
3232 CB_FEATURE_NOT_IMPLEMENTED, 2, 1,
3233 CB_CATEGORY_ALPHANUMERIC, 1
3234 },
3235 { "E", "cob_intr_e",
3236 CB_INTR_E, FUNCTION_NAME,
3237 CB_FEATURE_ACTIVE, 0, 0,
3238 CB_CATEGORY_NUMERIC, 0
3239 },
3240 { "EXCEPTION-FILE", "cob_intr_exception_file",
3241 CB_INTR_EXCEPTION_FILE, FUNCTION_NAME,
3242 CB_FEATURE_ACTIVE, 0, 0,
3243 CB_CATEGORY_ALPHANUMERIC, 0
3244 },
3245 { "EXCEPTION-FILE-N", "cob_intr_exception_file_n",
3246 CB_INTR_EXCEPTION_FILE_N, FUNCTION_NAME,
3247 CB_FEATURE_NOT_IMPLEMENTED, 0, 0,
3248 CB_CATEGORY_NATIONAL, 0
3249 },
3250 { "EXCEPTION-LOCATION", "cob_intr_exception_location",
3251 CB_INTR_EXCEPTION_LOCATION, FUNCTION_NAME,
3252 CB_FEATURE_ACTIVE, 0, 0,
3253 CB_CATEGORY_ALPHANUMERIC, 0
3254 },
3255 { "EXCEPTION-LOCATION-N", "cob_intr_exception_location_n",
3256 CB_INTR_EXCEPTION_LOCATION_N, FUNCTION_NAME,
3257 CB_FEATURE_NOT_IMPLEMENTED, 0, 0,
3258 CB_CATEGORY_NATIONAL, 0
3259 },
3260 { "EXCEPTION-STATEMENT", "cob_intr_exception_statement",
3261 CB_INTR_EXCEPTION_STATEMENT, FUNCTION_NAME,
3262 CB_FEATURE_ACTIVE, 0, 0,
3263 CB_CATEGORY_ALPHANUMERIC, 0
3264 },
3265 { "EXCEPTION-STATUS", "cob_intr_exception_status",
3266 CB_INTR_EXCEPTION_STATUS, FUNCTION_NAME,
3267 CB_FEATURE_ACTIVE, 0, 0,
3268 CB_CATEGORY_ALPHANUMERIC, 0
3269 },
3270 { "EXP", "cob_intr_exp",
3271 CB_INTR_EXP, FUNCTION_NAME,
3272 CB_FEATURE_ACTIVE, 1, 1,
3273 CB_CATEGORY_NUMERIC, 0
3274 },
3275 { "EXP10", "cob_intr_exp10",
3276 CB_INTR_EXP10, FUNCTION_NAME,
3277 CB_FEATURE_ACTIVE, 1, 1,
3278 CB_CATEGORY_NUMERIC, 0
3279 },
3280 { "FACTORIAL", "cob_intr_factorial",
3281 CB_INTR_FACTORIAL, FUNCTION_NAME,
3282 CB_FEATURE_ACTIVE, 1, 1,
3283 CB_CATEGORY_NUMERIC, 0
3284 },
3285 { "FORMATTED-CURRENT-DATE", "cob_intr_formatted_current_date",
3286 CB_INTR_FORMATTED_CURRENT_DATE, FUNCTION_NAME,
3287 CB_FEATURE_ACTIVE, 1, 1,
3288 CB_CATEGORY_ALPHANUMERIC, 1
3289 /* Note: category changed to national depending on the content,
3290 see cb_build_intrinsic */
3291 },
3292 { "FORMATTED-DATE", "cob_intr_formatted_date",
3293 CB_INTR_FORMATTED_DATE, FORMATTED_DATE_FUNC,
3294 CB_FEATURE_ACTIVE, 2, 2,
3295 CB_CATEGORY_ALPHANUMERIC, 1
3296 /* Note: category changed to national depending on the content,
3297 see cb_build_intrinsic */
3298 },
3299 { "FORMATTED-DATETIME", "cob_intr_formatted_datetime",
3300 CB_INTR_FORMATTED_DATETIME, FORMATTED_DATETIME_FUNC,
3301 /* including implicit SYSTEM-OFFSET arg */
3302 CB_FEATURE_ACTIVE, 5, 4,
3303 CB_CATEGORY_ALPHANUMERIC, 1
3304 /* Note: category changed to national depending on the content,
3305 see cb_build_intrinsic */
3306 },
3307 { "FORMATTED-TIME", "cob_intr_formatted_time",
3308 CB_INTR_FORMATTED_TIME, FORMATTED_TIME_FUNC,
3309 /* including implicit SYSTEM-OFFSET arg */
3310 CB_FEATURE_ACTIVE, 4, 3,
3311 CB_CATEGORY_ALPHANUMERIC, 1
3312 /* Note: category changed to national depending on the content,
3313 see cb_build_intrinsic */
3314 },
3315 { "FRACTION-PART", "cob_intr_fraction_part",
3316 CB_INTR_FRACTION_PART, FUNCTION_NAME,
3317 CB_FEATURE_ACTIVE, 1, 1,
3318 CB_CATEGORY_NUMERIC, 0
3319 },
3320 { "HIGHEST-ALGEBRAIC", "cob_intr_highest_algebraic",
3321 CB_INTR_HIGHEST_ALGEBRAIC, FUNCTION_NAME,
3322 CB_FEATURE_ACTIVE, 1, 1,
3323 CB_CATEGORY_NUMERIC, 0
3324 },
3325 { "INTEGER", "cob_intr_integer",
3326 CB_INTR_INTEGER, FUNCTION_NAME,
3327 CB_FEATURE_ACTIVE, 1, 1,
3328 CB_CATEGORY_NUMERIC, 0
3329 },
3330 { "INTEGER-OF-BOOLEAN", "cob_intr_integer_of_boolean",
3331 CB_INTR_INTEGER_OF_BOOLEAN, FUNCTION_NAME,
3332 CB_FEATURE_NOT_IMPLEMENTED, 1, 1,
3333 CB_CATEGORY_NUMERIC, 0
3334 },
3335 { "INTEGER-OF-DATE", "cob_intr_integer_of_date",
3336 CB_INTR_INTEGER_OF_DATE, FUNCTION_NAME,
3337 CB_FEATURE_ACTIVE, 1, 1,
3338 CB_CATEGORY_NUMERIC, 0
3339 },
3340 { "INTEGER-OF-DAY", "cob_intr_integer_of_day",
3341 CB_INTR_INTEGER_OF_DAY, FUNCTION_NAME,
3342 CB_FEATURE_ACTIVE, 1, 1,
3343 CB_CATEGORY_NUMERIC, 0
3344 },
3345 { "INTEGER-OF-FORMATTED-DATE", "cob_intr_integer_of_formatted_date",
3346 CB_INTR_INTEGER_OF_FORMATTED_DATE, FUNCTION_NAME,
3347 CB_FEATURE_ACTIVE, 2, 2,
3348 CB_CATEGORY_NUMERIC, 0
3349 },
3350 { "INTEGER-PART", "cob_intr_integer_part",
3351 CB_INTR_INTEGER_PART, FUNCTION_NAME,
3352 CB_FEATURE_ACTIVE, 1, 1,
3353 CB_CATEGORY_NUMERIC, 0
3354 },
3355 { "LENGTH", "cob_intr_length",
3356 CB_INTR_LENGTH, LENGTH_FUNC,
3357 CB_FEATURE_ACTIVE, 2, 1,
3358 CB_CATEGORY_NUMERIC, 0
3359 },
3360 { "LENGTH-AN", "cob_intr_byte_length",
3361 CB_INTR_BYTE_LENGTH, LENGTH_FUNC,
3362 CB_FEATURE_ACTIVE, 1, 1,
3363 CB_CATEGORY_NUMERIC, 0
3364 },
3365 { "LOCALE-COMPARE", "cob_intr_locale_compare",
3366 CB_INTR_LOCALE_COMPARE, FUNCTION_NAME,
3367 CB_FEATURE_ACTIVE, 3, 2,
3368 CB_CATEGORY_ALPHANUMERIC, 0
3369 },
3370 { "LOCALE-DATE", "cob_intr_locale_date",
3371 CB_INTR_LOCALE_DATE, LOCALE_DATE_FUNC,
3372 CB_FEATURE_ACTIVE, 2, 1,
3373 CB_CATEGORY_ALPHANUMERIC, 1
3374 },
3375 { "LOCALE-TIME", "cob_intr_locale_time",
3376 CB_INTR_LOCALE_TIME, LOCALE_TIME_FUNC,
3377 CB_FEATURE_ACTIVE, 2, 1,
3378 CB_CATEGORY_ALPHANUMERIC, 1
3379 },
3380 { "LOCALE-TIME-FROM-SECONDS", "cob_intr_lcl_time_from_secs",
3381 CB_INTR_LOCALE_TIME_FROM_SECS, LOCALE_TIME_FROM_FUNC,
3382 CB_FEATURE_ACTIVE, 2, 1,
3383 CB_CATEGORY_ALPHANUMERIC, 1
3384 },
3385 { "LOG", "cob_intr_log",
3386 CB_INTR_LOG, FUNCTION_NAME,
3387 CB_FEATURE_ACTIVE, 1, 1,
3388 CB_CATEGORY_NUMERIC, 0
3389 },
3390 { "LOG10", "cob_intr_log10",
3391 CB_INTR_LOG10, FUNCTION_NAME,
3392 CB_FEATURE_ACTIVE, 1, 1,
3393 CB_CATEGORY_NUMERIC, 0
3394 },
3395 { "LOWER-CASE", "cob_intr_lower_case",
3396 CB_INTR_LOWER_CASE, LOWER_CASE_FUNC,
3397 CB_FEATURE_ACTIVE, 1, 1,
3398 CB_CATEGORY_ALPHANUMERIC, 1
3399 /* Note: category changed to national depending on the content,
3400 see cb_build_intrinsic */
3401 },
3402 { "LOWEST-ALGEBRAIC", "cob_intr_lowest_algebraic",
3403 CB_INTR_LOWEST_ALGEBRAIC, FUNCTION_NAME,
3404 CB_FEATURE_ACTIVE, 1, 1,
3405 CB_CATEGORY_NUMERIC, 0
3406 },
3407 { "MAX", "cob_intr_max",
3408 CB_INTR_MAX, FUNCTION_NAME,
3409 CB_FEATURE_ACTIVE, -1, 1,
3410 CB_CATEGORY_NUMERIC, 0
3411 /* Note: category changed to alphanumeric/index/national depending on the content,
3412 see cb_build_intrinsic */
3413 },
3414 { "MEAN", "cob_intr_mean",
3415 CB_INTR_MEAN, FUNCTION_NAME,
3416 CB_FEATURE_ACTIVE, -1, 1,
3417 CB_CATEGORY_NUMERIC, 0
3418 },
3419 { "MEDIAN", "cob_intr_median",
3420 CB_INTR_MEDIAN, FUNCTION_NAME,
3421 CB_FEATURE_ACTIVE, -1, 1,
3422 CB_CATEGORY_NUMERIC, 0
3423 },
3424 { "MIDRANGE", "cob_intr_midrange",
3425 CB_INTR_MIDRANGE, FUNCTION_NAME,
3426 CB_FEATURE_ACTIVE, -1, 1,
3427 CB_CATEGORY_NUMERIC, 0
3428 },
3429 { "MIN", "cob_intr_min",
3430 CB_INTR_MIN, FUNCTION_NAME,
3431 CB_FEATURE_ACTIVE, -1, 1,
3432 CB_CATEGORY_NUMERIC, 0
3433 /* Note: category changed to alphanumeric/index/national depending on the content,
3434 see cb_build_intrinsic */
3435 },
3436 { "MOD", "cob_intr_mod",
3437 CB_INTR_MOD, FUNCTION_NAME,
3438 CB_FEATURE_ACTIVE, 2, 2,
3439 CB_CATEGORY_NUMERIC, 0
3440 },
3441 { "MODULE-CALLER-ID", "cob_intr_module_caller_id",
3442 CB_INTR_MODULE_CALLER_ID, FUNCTION_NAME,
3443 CB_FEATURE_ACTIVE, 0, 0,
3444 CB_CATEGORY_ALPHANUMERIC, 0
3445 },
3446 { "MODULE-DATE", "cob_intr_module_date",
3447 CB_INTR_MODULE_DATE, FUNCTION_NAME,
3448 CB_FEATURE_ACTIVE, 0, 0,
3449 CB_CATEGORY_NUMERIC, 0
3450 },
3451 { "MODULE-FORMATTED-DATE", "cob_intr_module_formatted_date",
3452 CB_INTR_MODULE_FORMATTED_DATE, FUNCTION_NAME,
3453 CB_FEATURE_ACTIVE, 0, 0,
3454 CB_CATEGORY_ALPHANUMERIC, 0
3455 },
3456 { "MODULE-ID", "cob_intr_module_id",
3457 CB_INTR_MODULE_ID, FUNCTION_NAME,
3458 CB_FEATURE_ACTIVE, 0, 0,
3459 CB_CATEGORY_ALPHANUMERIC, 0
3460 },
3461 { "MODULE-PATH", "cob_intr_module_path",
3462 CB_INTR_MODULE_PATH, FUNCTION_NAME,
3463 CB_FEATURE_ACTIVE, 0, 0,
3464 CB_CATEGORY_ALPHANUMERIC, 0
3465 },
3466 { "MODULE-SOURCE", "cob_intr_module_source",
3467 CB_INTR_MODULE_SOURCE, FUNCTION_NAME,
3468 CB_FEATURE_ACTIVE, 0, 0,
3469 CB_CATEGORY_ALPHANUMERIC, 0
3470 },
3471 { "MODULE-TIME", "cob_intr_module_time",
3472 CB_INTR_MODULE_TIME, FUNCTION_NAME,
3473 CB_FEATURE_ACTIVE, 0, 0,
3474 CB_CATEGORY_NUMERIC, 0
3475 },
3476 { "MONETARY-DECIMAL-POINT", "cob_intr_mon_decimal_point",
3477 CB_INTR_MON_DECIMAL_POINT, FUNCTION_NAME,
3478 CB_FEATURE_ACTIVE, 0, 0,
3479 CB_CATEGORY_ALPHANUMERIC, 0
3480 },
3481 { "MONETARY-THOUSANDS-SEPARATOR", "cob_intr_mon_thousands_sep",
3482 CB_INTR_MON_THOUSANDS_SEP, FUNCTION_NAME,
3483 CB_FEATURE_ACTIVE, 0, 0,
3484 CB_CATEGORY_ALPHANUMERIC, 0
3485 },
3486 { "NATIONAL-OF", "cob_intr_national_of",
3487 CB_INTR_NATIONAL_OF, NATIONAL_OF_FUNC,
3488 CB_FEATURE_NOT_IMPLEMENTED, 2, 1,
3489 CB_CATEGORY_NATIONAL, 1
3490 },
3491 { "NUMERIC-DECIMAL-POINT", "cob_intr_num_decimal_point",
3492 CB_INTR_NUM_DECIMAL_POINT, FUNCTION_NAME,
3493 CB_FEATURE_ACTIVE, 0, 0,
3494 CB_CATEGORY_ALPHANUMERIC, 0
3495 },
3496 { "NUMERIC-THOUSANDS-SEPARATOR", "cob_intr_num_thousands_sep",
3497 CB_INTR_NUM_THOUSANDS_SEP, FUNCTION_NAME,
3498 CB_FEATURE_ACTIVE, 0, 0,
3499 CB_CATEGORY_ALPHANUMERIC, 0
3500 },
3501 { "NUMVAL", "cob_intr_numval",
3502 CB_INTR_NUMVAL, FUNCTION_NAME,
3503 CB_FEATURE_ACTIVE, 1, 1,
3504 CB_CATEGORY_NUMERIC, 0
3505 },
3506 { "NUMVAL-C", "cob_intr_numval_c",
3507 CB_INTR_NUMVAL_C, NUMVALC_FUNC,
3508 CB_FEATURE_ACTIVE, 2, 2,
3509 CB_CATEGORY_NUMERIC, 0
3510 },
3511 { "NUMVAL-F", "cob_intr_numval_f",
3512 CB_INTR_NUMVAL_F, FUNCTION_NAME,
3513 CB_FEATURE_ACTIVE, 1, 1,
3514 CB_CATEGORY_NUMERIC, 0
3515 },
3516 { "ORD", "cob_intr_ord",
3517 CB_INTR_ORD, FUNCTION_NAME,
3518 CB_FEATURE_ACTIVE, 1, 1,
3519 CB_CATEGORY_NUMERIC, 0
3520 },
3521 { "ORD-MAX", "cob_intr_ord_max",
3522 CB_INTR_ORD_MAX, FUNCTION_NAME,
3523 CB_FEATURE_ACTIVE, -1, 1,
3524 CB_CATEGORY_NUMERIC, 0
3525 },
3526 { "ORD-MIN", "cob_intr_ord_min",
3527 CB_INTR_ORD_MIN, FUNCTION_NAME,
3528 CB_FEATURE_ACTIVE, -1, 1,
3529 CB_CATEGORY_NUMERIC, 0
3530 },
3531 { "PI", "cob_intr_pi",
3532 CB_INTR_PI, FUNCTION_NAME,
3533 CB_FEATURE_ACTIVE, 0, 0,
3534 CB_CATEGORY_NUMERIC, 0
3535 },
3536 { "PRESENT-VALUE", "cob_intr_present_value",
3537 CB_INTR_PRESENT_VALUE, FUNCTION_NAME,
3538 CB_FEATURE_ACTIVE, -1, 2,
3539 CB_CATEGORY_NUMERIC, 0
3540 },
3541 { "RANDOM", "cob_intr_random",
3542 CB_INTR_RANDOM, FUNCTION_NAME,
3543 CB_FEATURE_ACTIVE, 1, 0,
3544 CB_CATEGORY_NUMERIC, 0
3545 },
3546 { "RANGE", "cob_intr_range",
3547 CB_INTR_RANGE, FUNCTION_NAME,
3548 CB_FEATURE_ACTIVE, -1, 1,
3549 CB_CATEGORY_NUMERIC, 0
3550 },
3551 { "REM", "cob_intr_rem",
3552 CB_INTR_REM, FUNCTION_NAME,
3553 CB_FEATURE_ACTIVE, 2, 2,
3554 CB_CATEGORY_NUMERIC, 0
3555 },
3556 { "REVERSE", "cob_intr_reverse",
3557 CB_INTR_REVERSE, REVERSE_FUNC,
3558 CB_FEATURE_ACTIVE, 1, 1,
3559 CB_CATEGORY_ALPHANUMERIC, 1
3560 /* Note: category changed to national depending on the content,
3561 see cb_build_intrinsic */
3562 },
3563 { "SECONDS-FROM-FORMATTED-TIME", "cob_intr_seconds_from_formatted_time",
3564 CB_INTR_SECONDS_FROM_FORMATTED_TIME, FUNCTION_NAME,
3565 CB_FEATURE_ACTIVE, 2, 2,
3566 CB_CATEGORY_NUMERIC, 0
3567 },
3568 { "SECONDS-PAST-MIDNIGHT", "cob_intr_seconds_past_midnight",
3569 CB_INTR_SECONDS_PAST_MIDNIGHT, FUNCTION_NAME,
3570 CB_FEATURE_ACTIVE, 0, 0,
3571 CB_CATEGORY_NUMERIC, 0
3572 },
3573 { "SIGN", "cob_intr_sign",
3574 CB_INTR_SIGN, FUNCTION_NAME,
3575 CB_FEATURE_ACTIVE, 1, 1,
3576 CB_CATEGORY_NUMERIC, 0
3577 },
3578 { "SIN", "cob_intr_sin",
3579 CB_INTR_SIN, FUNCTION_NAME,
3580 CB_FEATURE_ACTIVE, 1, 1,
3581 CB_CATEGORY_NUMERIC, 0
3582 },
3583 { "SQRT", "cob_intr_sqrt",
3584 CB_INTR_SQRT, FUNCTION_NAME,
3585 CB_FEATURE_ACTIVE, 1, 1,
3586 CB_CATEGORY_NUMERIC, 0
3587 },
3588 { "STANDARD-COMPARE", "cob_intr_standard_compare",
3589 CB_INTR_STANDARD_COMPARE, FUNCTION_NAME,
3590 CB_FEATURE_NOT_IMPLEMENTED, 4, 2,
3591 CB_CATEGORY_ALPHANUMERIC, 0
3592 },
3593 { "STANDARD-DEVIATION", "cob_intr_standard_deviation",
3594 CB_INTR_STANDARD_DEVIATION, FUNCTION_NAME,
3595 CB_FEATURE_ACTIVE, -1, 1,
3596 CB_CATEGORY_NUMERIC, 0
3597 },
3598 { "STORED-CHAR-LENGTH", "cob_intr_stored_char_length",
3599 CB_INTR_STORED_CHAR_LENGTH, FUNCTION_NAME,
3600 CB_FEATURE_ACTIVE, 1, 1,
3601 CB_CATEGORY_NUMERIC, 0
3602 },
3603 /* GnuCOBOL (added incompatible to COBOL 202x CCP 1.3) */
3604 { "SUBSTITUTE", "cob_intr_substitute",
3605 CB_INTR_SUBSTITUTE, SUBSTITUTE_FUNC,
3606 CB_FEATURE_ACTIVE, -1, 3,
3607 CB_CATEGORY_ALPHANUMERIC, 1
3608 /* Note: category changed to alphabetic/national depending on the content,
3609 see cb_build_intrinsic */
3610 },
3611 /* GnuCOBOL */
3612 { "SUBSTITUTE-CASE", "cob_intr_substitute_case",
3613 CB_INTR_SUBSTITUTE_CASE, SUBSTITUTE_CASE_FUNC,
3614 CB_FEATURE_ACTIVE, -1, 3,
3615 CB_CATEGORY_ALPHANUMERIC, 1
3616 /* Note: category changed to alphabetic/national depending on the content,
3617 see cb_build_intrinsic */
3618 },
3619 { "SUM", "cob_intr_sum",
3620 CB_INTR_SUM, FUNCTION_NAME,
3621 CB_FEATURE_ACTIVE, -1, 1,
3622 CB_CATEGORY_NUMERIC, 0
3623 },
3624 { "TAN", "cob_intr_tan",
3625 CB_INTR_TAN, FUNCTION_NAME,
3626 CB_FEATURE_ACTIVE, 1, 1,
3627 CB_CATEGORY_NUMERIC, 0
3628 },
3629 { "TEST-DATE-YYYYMMDD", "cob_intr_test_date_yyyymmdd",
3630 CB_INTR_TEST_DATE_YYYYMMDD, FUNCTION_NAME,
3631 CB_FEATURE_ACTIVE, 1, 1,
3632 CB_CATEGORY_NUMERIC, 0
3633 },
3634 { "TEST-DAY-YYYYDDD", "cob_intr_test_day_yyyyddd",
3635 CB_INTR_TEST_DAY_YYYYDDD, FUNCTION_NAME,
3636 CB_FEATURE_ACTIVE, 1, 1,
3637 CB_CATEGORY_NUMERIC, 0
3638 },
3639 { "TEST-FORMATTED-DATETIME", "cob_intr_test_formatted_datetime",
3640 CB_INTR_TEST_FORMATTED_DATETIME, FUNCTION_NAME,
3641 CB_FEATURE_ACTIVE, 2, 2,
3642 CB_CATEGORY_NUMERIC, 0
3643 },
3644 { "TEST-NUMVAL", "cob_intr_test_numval",
3645 CB_INTR_TEST_NUMVAL, FUNCTION_NAME,
3646 CB_FEATURE_ACTIVE, 1, 1,
3647 CB_CATEGORY_NUMERIC, 0
3648 },
3649 { "TEST-NUMVAL-C", "cob_intr_test_numval_c",
3650 CB_INTR_TEST_NUMVAL_C, NUMVALC_FUNC,
3651 CB_FEATURE_ACTIVE, 2, 2,
3652 CB_CATEGORY_NUMERIC, 0
3653 },
3654 { "TEST-NUMVAL-F", "cob_intr_test_numval_f",
3655 CB_INTR_TEST_NUMVAL_F, FUNCTION_NAME,
3656 CB_FEATURE_ACTIVE, 1, 1,
3657 CB_CATEGORY_NUMERIC, 0
3658 },
3659 { "TRIM", "cob_intr_trim",
3660 CB_INTR_TRIM, TRIM_FUNC,
3661 CB_FEATURE_ACTIVE, 2, 1,
3662 CB_CATEGORY_ALPHANUMERIC, 1
3663 /* Note: category changed to national depending on the content,
3664 see cb_build_intrinsic */
3665 },
3666 { "UPPER-CASE", "cob_intr_upper_case",
3667 CB_INTR_UPPER_CASE, UPPER_CASE_FUNC,
3668 CB_FEATURE_ACTIVE, 1, 1,
3669 CB_CATEGORY_ALPHANUMERIC, 1
3670 /* Note: category changed to national depending on the content,
3671 see cb_build_intrinsic */
3672 },
3673 { "VARIANCE", "cob_intr_variance",
3674 CB_INTR_VARIANCE, FUNCTION_NAME,
3675 CB_FEATURE_ACTIVE, -1, 1,
3676 CB_CATEGORY_NUMERIC, 0
3677 },
3678 { "WHEN-COMPILED", "cob_intr_when_compiled",
3679 CB_INTR_WHEN_COMPILED, WHEN_COMPILED_FUNC,
3680 CB_FEATURE_ACTIVE, 0, 0,
3681 CB_CATEGORY_ALPHANUMERIC, 1
3682 },
3683 { "YEAR-TO-YYYY", "cob_intr_year_to_yyyy",
3684 CB_INTR_YEAR_TO_YYYY, FUNCTION_NAME,
3685 CB_FEATURE_ACTIVE, 3, 1,
3686 CB_CATEGORY_NUMERIC, 0
3687 }
3688 };
3689
3690 #define NUM_INTRINSICS sizeof(function_list) / sizeof(struct cb_intrinsic_table)
3691
3692 #ifdef HAVE_DESIGNATED_INITS
3693 static const unsigned char cob_lower_tab[256] = {
3694 ['a'] = 'A',
3695 ['b'] = 'B',
3696 ['c'] = 'C',
3697 ['d'] = 'D',
3698 ['e'] = 'E',
3699 ['f'] = 'F',
3700 ['g'] = 'G',
3701 ['h'] = 'H',
3702 ['i'] = 'I',
3703 ['j'] = 'J',
3704 ['k'] = 'K',
3705 ['l'] = 'L',
3706 ['m'] = 'M',
3707 ['n'] = 'N',
3708 ['o'] = 'O',
3709 ['p'] = 'P',
3710 ['q'] = 'Q',
3711 ['r'] = 'R',
3712 ['s'] = 'S',
3713 ['t'] = 'T',
3714 ['u'] = 'U',
3715 ['v'] = 'V',
3716 ['w'] = 'W',
3717 ['x'] = 'X',
3718 ['y'] = 'Y',
3719 ['z'] = 'Z'
3720 };
3721 #else
3722 static unsigned char cob_lower_tab[256];
3723 static const unsigned char pcob_lower_tab[] = "abcdefghijklmnopqrstuvwxyz";
3724 static const unsigned char pcob_lower_val[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
3725 #endif
3726
3727 struct list_reserved_line {
3728 char *word_and_status;
3729 char *aliases;
3730 };
3731
3732 /* Local functions */
3733
3734 static int
cb_strcasecmp(const void * s1,const void * s2)3735 cb_strcasecmp (const void *s1, const void *s2)
3736 {
3737 const unsigned char *p1;
3738 const unsigned char *p2;
3739 unsigned char c1;
3740 unsigned char c2;
3741
3742 p1 = (const unsigned char *)s1;
3743 p2 = (const unsigned char *)s2;
3744
3745 for (;;) {
3746 if (cob_lower_tab[*p1]) {
3747 c1 = cob_lower_tab[*p1++];
3748 } else {
3749 c1 = *p1++;
3750 }
3751
3752 if (cob_lower_tab[*p2]) {
3753 c2 = cob_lower_tab[*p2++];
3754 } else {
3755 c2 = *p2++;
3756 }
3757
3758 if (c1 != c2) {
3759 return c1 < c2 ? -1 : 1;
3760 }
3761 if (!c1) {
3762 break;
3763 }
3764 }
3765 return 0;
3766 }
3767
3768 static int
reserve_comp(const void * p1,const void * p2)3769 reserve_comp (const void *p1, const void *p2)
3770 {
3771 /* For efficiency, we use strcmp here instead of cb_strcasecmp. */
3772 return strcmp(((struct cobc_reserved *)p1)->name,
3773 ((struct cobc_reserved *)p2)->name);
3774 }
3775
3776 static int
intrinsic_comp(const void * p1,const void * p2)3777 intrinsic_comp (const void *p1, const void *p2)
3778 {
3779 /* For efficiency, we use strcmp here instead of cb_strcasecmp. */
3780 return strcmp (p1, ((struct cb_intrinsic_table *)p2)->name);
3781 }
3782
3783 static const char *
res_get_feature(const enum cb_system_name_category category)3784 res_get_feature (const enum cb_system_name_category category)
3785 {
3786 const char *s;
3787
3788 switch (category) {
3789 case CB_DEVICE_NAME:
3790 s = _("device name");
3791 break;
3792 case CB_SWITCH_NAME:
3793 s = _("switch name");
3794 break;
3795 case CB_FEATURE_NAME:
3796 s = _("feature name");
3797 break;
3798 /* LCOV_EXCL_START */
3799 default:
3800 s = _("unknown");
3801 break;
3802 /* LCOV_EXCL_STOP */
3803 }
3804 return s;
3805 }
3806
3807 static struct cobc_reserved
create_dummy_reserved(const char * word)3808 create_dummy_reserved (const char *word)
3809 {
3810 struct cobc_reserved ret;
3811
3812 ret.name = word;
3813 ret.nodegen = 0;
3814 ret.context_sens = 0;
3815 ret.token = -1;
3816 ret.context_set = 0;
3817 ret.context_test = 0;
3818
3819 return ret;
3820 }
3821
3822 static void
free_amendment_content(struct amendment_list * to_free)3823 free_amendment_content (struct amendment_list *to_free)
3824 {
3825 cobc_main_free (to_free->word);
3826 if (to_free->alias_for) {
3827 cobc_main_free (to_free->alias_for);
3828 }
3829 }
3830
3831 static void
free_amendment(struct amendment_list * to_free)3832 free_amendment (struct amendment_list *to_free)
3833 {
3834 free_amendment_content (to_free);
3835 cobc_main_free (to_free);
3836 }
3837
3838 static COB_INLINE COB_A_INLINE int
has_context_sensitive_indicator(const char * word,const size_t size)3839 has_context_sensitive_indicator (const char *word, const size_t size)
3840 {
3841 return word[size - 1] == '*';
3842 }
3843
3844 /*
3845 Copy the first len characters of source, uppercased, to dest. We use
3846 cob_lower_tab instead of toupper for efficiency.
3847 */
3848 static void
strncpy_upper(char * dest,const char * const source,const size_t len)3849 strncpy_upper (char *dest, const char * const source, const size_t len)
3850 {
3851 size_t i;
3852
3853 for (i = 0; i < len; ++i) {
3854 if (cob_lower_tab[(int)source[i]]) {
3855 dest[i] = cob_lower_tab[(int)source[i]];
3856 } else {
3857 dest[i] = source[i];
3858 }
3859 }
3860 }
3861
3862 static void
allocate_upper_case_str_removing_asterisk(const char * word,const size_t size,char ** const out_str)3863 allocate_upper_case_str_removing_asterisk (const char *word, const size_t size,
3864 char ** const out_str)
3865 {
3866 size_t chars_to_copy;
3867
3868 if (has_context_sensitive_indicator (word, size)) {
3869 /* Don't copy the trailing asterisk */
3870 chars_to_copy = size - 1;
3871 } else {
3872 chars_to_copy = size;
3873 }
3874
3875 *out_str = cobc_main_malloc (chars_to_copy + 1U);
3876 strncpy_upper (*out_str, word, chars_to_copy);
3877 (*out_str)[chars_to_copy] = '\0';
3878 }
3879
3880 static COB_INLINE COB_A_INLINE void
initialize_word(const char * word,const size_t size,struct amendment_list * const reserved)3881 initialize_word (const char *word, const size_t size,
3882 struct amendment_list * const reserved)
3883 {
3884 allocate_upper_case_str_removing_asterisk (word, size, &reserved->word);
3885 }
3886
3887 static int
is_invalid_word(const char * word,const int size,const char * fname,const int line)3888 is_invalid_word (const char *word, const int size,
3889 const char *fname, const int line)
3890 {
3891 /* FIXME: Should use the current (dialect specific) maximum word length,
3892 not the absolute maximum, check order of reading and add test case */
3893 if (size > COB_MAX_WORDLEN) {
3894 configuration_error (fname, line, 1,
3895 _("reserved word must have less than %d characters"),
3896 COB_MAX_WORDLEN);
3897 return 1;
3898 }
3899 /* TO-DO: add more checks here */
3900 COB_UNUSED(word);
3901 return 0;
3902 }
3903
3904 static void
initialize_alias_for(const char * alias_for,struct amendment_list * const reserved,const char * fname,const int line)3905 initialize_alias_for (const char *alias_for,
3906 struct amendment_list * const reserved,
3907 const char *fname, const int line)
3908 {
3909 size_t size = strlen (alias_for);
3910
3911 if (has_context_sensitive_indicator (alias_for, size)) {
3912 size--;
3913 configuration_warning (fname, line,
3914 _("ignored asterisk at end of alias target"));
3915 }
3916 if (is_invalid_word (alias_for, size, fname, line)) {
3917 reserved->alias_for = NULL;
3918 } else {
3919 allocate_upper_case_str_removing_asterisk (alias_for, size, &reserved->alias_for);
3920 }
3921 }
3922
3923 static struct cobc_reserved *
search_reserved_list(const char * const word,const int needs_uppercasing,const struct cobc_reserved * const list,size_t list_len)3924 search_reserved_list (const char * const word, const int needs_uppercasing,
3925 const struct cobc_reserved * const list, size_t list_len)
3926 {
3927 static char upper_word[43];
3928 size_t word_len;
3929 const char *sought_word;
3930 struct cobc_reserved to_find;
3931
3932 if (needs_uppercasing) {
3933 word_len = strlen (word);
3934 if (word_len > sizeof(upper_word) - 1) {
3935 return NULL;
3936 }
3937
3938 /* copy including terminating byte */
3939 strncpy_upper (upper_word, word, word_len + 1);
3940 sought_word = upper_word;
3941 } else {
3942 sought_word = word;
3943 }
3944
3945 to_find = create_dummy_reserved (sought_word);
3946 return bsearch (&to_find, list, list_len, sizeof (struct cobc_reserved),
3947 reserve_comp);
3948 }
3949
3950 static struct cobc_reserved *
find_default_reserved_word(const char * const word,const int needs_uppercasing)3951 find_default_reserved_word (const char * const word, const int needs_uppercasing)
3952 {
3953 return search_reserved_list (word, needs_uppercasing,
3954 default_reserved_words,
3955 NUM_DEFAULT_RESERVED_WORDS);
3956 }
3957
3958 static struct cobc_reserved
get_user_specified_reserved_word(struct amendment_list user_reserved)3959 get_user_specified_reserved_word (struct amendment_list user_reserved)
3960 {
3961 struct cobc_reserved cobc_reserved = create_dummy_reserved (NULL);
3962 struct cobc_reserved *p;
3963
3964 cobc_reserved.name = cobc_main_malloc (strlen (user_reserved.word) + 1);
3965 strcpy ((char *) cobc_reserved.name, user_reserved.word);
3966
3967 if (!user_reserved.alias_for) {
3968 cobc_reserved.context_sens
3969 = !!user_reserved.is_context_sensitive;
3970 } else {
3971 p = find_default_reserved_word (user_reserved.alias_for, 0);
3972 if (p) {
3973 cobc_reserved.token = p->token;
3974 } else {
3975 /* FIXME: can we point to the fname originally defining the word? */
3976 configuration_error (NULL, 0, 1,
3977 _("alias target '%s' is not a default reserved word"),
3978 user_reserved.alias_for);
3979 }
3980 }
3981
3982 return cobc_reserved;
3983 }
3984
3985 static int
followed_by_addition_for_same_word(const struct amendment_list * const addition)3986 followed_by_addition_for_same_word (const struct amendment_list * const addition)
3987 {
3988 struct amendment_list *l;
3989
3990 /* Walk through the list after the first addition. */
3991 for (l = addition->next; l; l = l->next) {
3992 /* Look for elements with the same word. */
3993 /* NB: We can use strcmp instead of cb_strcasecmp because
3994 everything is already uppercase. */
3995 if (!strcmp (addition->word, l->word)
3996 && l->to_add) {
3997 return 1;
3998 }
3999 }
4000
4001 return 0;
4002 }
4003
4004 /*
4005 Returns 1 if a removal for the same word as addition is found (and removed).
4006 */
4007 static int
try_remove_removal(struct amendment_list * const addition)4008 try_remove_removal (struct amendment_list * const addition)
4009 {
4010 struct amendment_list *l = addition->next;
4011 struct amendment_list *prev = addition;
4012
4013 while (l) {
4014 /* Look for elements with the same word. */
4015 if (strcmp (addition->word, l->word)) {
4016 prev = l;
4017 l = l->next;
4018 continue;
4019 }
4020
4021 if (!l->to_add) {
4022 prev->next = l->next;
4023 free_amendment (l);
4024 l = prev->next;
4025
4026 return 1;
4027 }
4028 }
4029
4030 return 0;
4031 }
4032
4033 /*
4034 Reduce the amendment list to a list of additions. Any removals which are not
4035 cancelled out are deleted.
4036 */
4037 static void
reduce_amendment_list(struct amendment_list ** amendment_list)4038 reduce_amendment_list (struct amendment_list **amendment_list)
4039 {
4040 struct amendment_list *l = *amendment_list;
4041 struct amendment_list *prev = NULL;
4042 struct amendment_list *next;
4043 int delete_current_elt = 0;
4044
4045 while (l) {
4046 if (l->to_add) {
4047 /*
4048 Later duplicate additions take overwrite previous ones
4049 and a removal and the previous addition cancel each
4050 other out.
4051 */
4052 delete_current_elt = followed_by_addition_for_same_word (l)
4053 || try_remove_removal (l);
4054 } else {
4055 delete_current_elt = 1;
4056 }
4057
4058 if (delete_current_elt) {
4059 next = l->next;
4060 if (prev) {
4061 prev->next = next;
4062 }
4063 if (l == *amendment_list) {
4064 *amendment_list = next;
4065 }
4066 free_amendment (l);
4067 l = next;
4068
4069 delete_current_elt = 0;
4070 } else {
4071 prev = l;
4072 l = l->next;
4073 }
4074 }
4075 }
4076
4077 static int
hash_word(const cob_c8_t * word,const cob_u32_t mod)4078 hash_word (const cob_c8_t *word, const cob_u32_t mod)
4079 {
4080 cob_u32_t result = 0x811c9dc5;
4081
4082 /* Perform 32-bit FNV1a hash */
4083 for (; *word; ++word) {
4084 result ^= toupper (*word);
4085 result *= (cob_u32_t) 0x1677619;
4086 }
4087
4088 return result % mod;
4089 }
4090
4091 #define HASHMAP(type, type_struct, word_member) \
4092 static struct type_struct **type##_map; \
4093 static size_t type##_map_arr_size; \
4094 static unsigned int num_##type##s; \
4095 \
4096 static void \
4097 init_##type##_map (void) \
4098 { \
4099 type##_map_arr_size = 512; \
4100 num_##type##s = 0; \
4101 type##_map = cobc_main_malloc (type##_map_arr_size * sizeof (void *)); \
4102 } \
4103 \
4104 static COB_INLINE COB_A_INLINE int \
4105 type##_hash (const char *word) \
4106 { \
4107 return hash_word ((const cob_c8_t *) word, type##_map_arr_size); \
4108 } \
4109 \
4110 static COB_INLINE COB_A_INLINE int \
4111 next_##type##_key (const unsigned int key) \
4112 { \
4113 if (key < type##_map_arr_size - 1) { \
4114 return key + 1; \
4115 } else { \
4116 return 0; \
4117 } \
4118 } \
4119 \
4120 static unsigned int \
4121 find_key_for_##type (const char * const word) \
4122 { \
4123 unsigned int key; \
4124 \
4125 for (key = type##_hash (word); \
4126 type##_map[key] && cb_strcasecmp (type##_map[key]->word_member, word); \
4127 key = next_##type##_key (key)); \
4128 \
4129 return key; \
4130 } \
4131 \
4132 static void \
4133 realloc_##type##_map (const size_t new_size) \
4134 { \
4135 struct type_struct **new_map = cobc_main_malloc (new_size * sizeof(void *)); \
4136 struct type_struct **old_map = type##_map; \
4137 size_t old_size = type##_map_arr_size; \
4138 unsigned int i; \
4139 unsigned int key; \
4140 \
4141 type##_map_arr_size = new_size; \
4142 type##_map = new_map; \
4143 \
4144 for (i = 0; i < old_size; ++i) { \
4145 if (old_map[i]) { \
4146 key = find_key_for_##type (old_map[i]->word_member); \
4147 type##_map[key] = old_map[i]; \
4148 } \
4149 } \
4150 \
4151 cobc_main_free (old_map); \
4152 } \
4153 \
4154 static void \
4155 delete_##type##_with_key (const int key) \
4156 { \
4157 cobc_main_free (type##_map[key]); \
4158 type##_map[key] = NULL; \
4159 } \
4160 \
4161 static int \
4162 add_##type##_to_map (const struct type_struct val, const int overwrite) \
4163 { \
4164 unsigned int key; \
4165 int entry_already_there; \
4166 \
4167 if (!type##_map) { \
4168 init_##type##_map (); \
4169 } \
4170 /* \
4171 The "- 1" is there so there is always one NULL entry in the \
4172 array. If there is not one and the array is full, \
4173 find_##type will not terminate when given a word which \
4174 shares a hash with a different word. \
4175 */ \
4176 if (num_##type##s == type##_map_arr_size - 1) { \
4177 realloc_##type##_map (type##_map_arr_size * 2); \
4178 } \
4179 \
4180 key = find_key_for_##type (val.word_member); \
4181 entry_already_there = !!type##_map[key]; \
4182 if (entry_already_there) { \
4183 if (overwrite) { \
4184 delete_##type##_with_key (key); \
4185 } else { \
4186 return 1; \
4187 } \
4188 } else { \
4189 ++num_##type##s; \
4190 } \
4191 \
4192 type##_map[key] = cobc_main_malloc (sizeof (struct type_struct)); \
4193 *type##_map[key] = val; \
4194 return entry_already_there; \
4195 }
4196
4197 /* These functions are separate to suppress "unused function" warnings. */
4198 #define HASHMAP_EXTRA(type, type_struct) \
4199 static void \
4200 remove_##type##_from_map (const char * const word) \
4201 { \
4202 int key = find_key_for_##type (word); \
4203 \
4204 if (type##_map[key]) { \
4205 delete_##type##_with_key (key); \
4206 } \
4207 } \
4208 static struct type_struct * \
4209 find_##type (const char * const word) \
4210 { \
4211 return type##_map[find_key_for_##type (word)]; \
4212 } \
4213 \
4214
4215
HASHMAP(reserved_word,cobc_reserved,name)4216 HASHMAP(reserved_word, cobc_reserved, name)
4217 HASHMAP_EXTRA(reserved_word, cobc_reserved)
4218 HASHMAP(amendment, amendment_list, word)
4219
4220 static void
4221 get_reserved_words_with_amendments (void)
4222 {
4223 unsigned int i;
4224 struct amendment_list *amendment;
4225 unsigned int key;
4226 struct cobc_reserved reserved;
4227 struct cobc_reserved *p;
4228
4229 if (cb_reserved_words == NULL) {
4230 /*
4231 Prepend the default reserved words to the amendment list as
4232 additions.
4233 */
4234 for (i = 0; i < NUM_DEFAULT_RESERVED_WORDS; ++i) {
4235 amendment = cobc_main_malloc (sizeof (struct amendment_list));
4236 amendment->word = cobc_main_malloc (strlen (default_reserved_words[i].name) + 1);
4237 strcpy (amendment->word, default_reserved_words[i].name);
4238 amendment->to_add = 1;
4239 amendment->is_context_sensitive = default_reserved_words[i].context_sens;
4240
4241 if (add_amendment_to_map (*amendment, 0)) {
4242 key = find_key_for_amendment (amendment->word);
4243 amendment->next = amendment_map[key];
4244 amendment_map[key] = amendment;
4245 }
4246 }
4247 }
4248
4249 /*
4250 Populate reserved_word_map with data from default_reserved_words,
4251 where possible. Free each word once processed.
4252 */
4253 for (i = 0; i < amendment_map_arr_size; ++i) {
4254 reduce_amendment_list (&amendment_map[i]);
4255
4256 if (!amendment_map[i]) {
4257 continue;
4258 }
4259
4260 p = find_default_reserved_word (amendment_map[i]->word, 0);
4261 if (p && !amendment_map[i]->alias_for) {
4262 reserved = *p;
4263 if (!amendment_map[i]->is_context_sensitive) {
4264 /*
4265 We only preserve context-sensitivity if the
4266 user specifically asks for it.
4267 */
4268 reserved.context_sens = 0;
4269 reserved.context_test = 0;
4270 }
4271 } else {
4272 reserved = get_user_specified_reserved_word (*amendment_map[i]);
4273 }
4274 add_reserved_word_to_map (reserved, 0);
4275
4276 free_amendment_content (amendment_map[i]);
4277 delete_amendment_with_key (i);
4278 }
4279 }
4280
4281 static void
get_reserved_words_from_default_list(void)4282 get_reserved_words_from_default_list (void)
4283 {
4284 int i;
4285
4286 init_reserved_word_map ();
4287
4288 for (i = 0; i < NUM_DEFAULT_RESERVED_WORDS; ++i) {
4289 add_reserved_word_to_map (default_reserved_words[i], 0);
4290 }
4291 }
4292
4293 static void
initialize_reserved_words_if_needed(void)4294 initialize_reserved_words_if_needed (void)
4295 {
4296 if (!reserved_word_map) {
4297 /* The default reserved words list should be sorted, but
4298 assuming so causes abstruse errors when a word is put in the
4299 wrong place (e.g. when dealing with EBCDIC or hyphens). */
4300 qsort (default_reserved_words, NUM_DEFAULT_RESERVED_WORDS,
4301 sizeof (struct cobc_reserved), reserve_comp);
4302
4303 if (num_amendments) {
4304 get_reserved_words_with_amendments ();
4305 } else {
4306 get_reserved_words_from_default_list ();
4307 }
4308 }
4309 }
4310
4311 static int
list_line_cmp(const void * l,const void * r)4312 list_line_cmp (const void *l, const void *r)
4313 {
4314 return strcmp (((const struct list_reserved_line *)l)->word_and_status,
4315 ((const struct list_reserved_line *)r)->word_and_status);
4316 }
4317
4318 static int
strcmp_for_qsort(const void * l,const void * r)4319 strcmp_for_qsort (const void *l, const void *r)
4320 {
4321 return strcmp ((const char *)l, (const char *)r);
4322 }
4323
4324 static void
get_aliases(const unsigned int key,struct list_reserved_line * line)4325 get_aliases (const unsigned int key, struct list_reserved_line *line)
4326 {
4327 int given_token = reserved_word_map[key]->token;
4328 unsigned int i;
4329 unsigned int j;
4330 unsigned int num_aliases = 0;
4331 unsigned int aliases_str_len = 0;
4332 char (*aliases)[COB_MAX_WORDLEN + 1];
4333 char *aliases_str;
4334
4335 if (given_token <= 0) {
4336 line->aliases = NULL;
4337 return;
4338 }
4339
4340 /* Count number of aliases and their total length. */
4341 for (i = 0; i < reserved_word_map_arr_size; ++i) {
4342 if (i != key
4343 && reserved_word_map[i]
4344 && reserved_word_map[i]->token == given_token) {
4345 ++num_aliases;
4346 aliases_str_len += strlen (reserved_word_map[i]->name);
4347 }
4348 }
4349
4350 if (num_aliases == 0) {
4351 return;
4352 }
4353
4354 /* Create array of aliases, then sort it. */
4355 aliases = cobc_malloc ((size_t)num_aliases * (COB_MAX_WORDLEN + 1) * sizeof (char));
4356 j = 0;
4357 for (i = 0; i < reserved_word_map_arr_size; ++i) {
4358 if (i != key
4359 && reserved_word_map[i]
4360 && reserved_word_map[i]->token == given_token) {
4361 strncpy (aliases[j], reserved_word_map[i]->name,
4362 COB_MAX_WORDLEN);
4363 ++j;
4364 }
4365 }
4366 qsort (aliases, num_aliases, COB_MAX_WORDLEN + 1, &strcmp_for_qsort);
4367
4368 /* Build aliases string */
4369 aliases_str = cobc_malloc (strlen ("(aliased with ")
4370 + aliases_str_len
4371 + (num_aliases - 1) * strlen (", ")
4372 + strlen (")")
4373 + 1);
4374 strcpy (aliases_str, "(aliased with ");
4375 for (j = 0; j < num_aliases; ++j) {
4376 if (j != 0) {
4377 strcat (aliases_str, ", ");
4378 }
4379 strcat (aliases_str, aliases[j]);
4380 }
4381 strcat (aliases_str, ")");
4382 cobc_free (aliases);
4383 line->aliases = aliases_str;
4384 }
4385
4386 /* Global functions */
4387
4388 /* TO-DO: Duplication with lookup_reserved_word */
4389 int
is_reserved_word(const char * word)4390 is_reserved_word (const char *word)
4391 {
4392 initialize_reserved_words_if_needed ();
4393 return !!find_reserved_word (word);
4394 }
4395
4396 int
is_default_reserved_word(const char * word)4397 is_default_reserved_word (const char *word)
4398 {
4399 return !!find_default_reserved_word (word, 1);
4400 }
4401
4402 void
remove_context_sensitivity(const char * word,const int context)4403 remove_context_sensitivity (const char *word, const int context)
4404 {
4405 struct cobc_reserved *reserved =
4406 find_default_reserved_word (word, 1);
4407
4408 if (reserved) {
4409 reserved->context_test ^= context;
4410 }
4411 }
4412
4413 cb_tree
get_system_name(const char * name)4414 get_system_name (const char *name)
4415 {
4416 struct system_name_struct *system_name = lookup_system_name (name, 0);
4417
4418 if (system_name != NULL) {
4419 return cb_build_system_name (system_name->category,
4420 system_name->token);
4421 }
4422 return NULL;
4423 }
4424
4425 /* get system name, revert word-combination of scanner.l,
4426 if necessary (e.g. SWITCH A <--> SWITCH_A) */
4427 cb_tree
get_system_name_translated(cb_tree word)4428 get_system_name_translated (cb_tree word)
4429 {
4430 char system_name[COB_MAX_WORDLEN + 1];
4431 cb_tree res;
4432
4433 system_name[COB_MAX_WORDLEN] = 0;
4434 strncpy(system_name, CB_NAME (word), COB_MAX_WORDLEN);
4435 if (system_name [6] == '_') {
4436 system_name [6] = ' ';
4437 }
4438
4439 res = get_system_name(system_name);
4440 if (!res) {
4441 cb_error_x (word, _("invalid system-name '%s'"), system_name);
4442 }
4443
4444 return res;
4445 }
4446
4447 static void
append_amendment_at_word(struct amendment_list amendment)4448 append_amendment_at_word (struct amendment_list amendment)
4449 {
4450 int key;
4451 struct amendment_list *l;
4452
4453 if (add_amendment_to_map (amendment, 0)) {
4454 /*
4455 If there is already an amendment for this word, append the
4456 amendment to the word's amendment list.
4457 */
4458 key = find_key_for_amendment (amendment.word);
4459 for (l = amendment_map[key]; l->next; l = l->next);
4460 l->next = cobc_main_malloc (sizeof (struct amendment_list));
4461 *(l->next) = amendment;
4462 }
4463 }
4464
4465 /*
4466 parameter *word has no white space, may include context sensitive indicator
4467 and/or alias definition: a* a=b a*=b
4468
4469 *word is a static char * when line < 0 !
4470 */
4471 static void
add_amendment(const char * word,const char * fname,const int line,const int to_add)4472 add_amendment (const char *word, const char *fname, const int line,
4473 const int to_add)
4474 {
4475 struct amendment_list amendment;
4476 size_t size;
4477 char *equal_sign_pos;
4478 int context_sensitive;
4479
4480 /* Check for alias and context sensitive indicator,
4481 get and check the length of the word */
4482 equal_sign_pos = strchr (word, '=');
4483 if (equal_sign_pos) {
4484 size = equal_sign_pos - word;
4485 } else {
4486 size = strlen (word);
4487 }
4488 context_sensitive = has_context_sensitive_indicator (word, size);
4489 if (context_sensitive) {
4490 size--;
4491 }
4492
4493 /*
4494 Only verify entries that don't come from the default word list. Line 0
4495 means the entry came from the command line. Line -1 means it came from
4496 the default word list.
4497 */
4498 if (line >= 0 && is_invalid_word (word, size, fname, line)) {
4499 return;
4500 }
4501
4502 amendment.is_context_sensitive = context_sensitive;
4503 amendment.to_add = to_add;
4504 amendment.next = NULL;
4505 initialize_word (word, size, &amendment);
4506
4507 /* If it is an alias, copy what it is an alias for */
4508 if (to_add && equal_sign_pos) {
4509 initialize_alias_for (equal_sign_pos + 1, &amendment, fname,
4510 line);
4511 } else {
4512 amendment.alias_for = NULL;
4513 }
4514
4515 append_amendment_at_word (amendment);
4516 }
4517
4518 void
add_reserved_word(const char * word,const char * fname,const int line)4519 add_reserved_word (const char *word, const char *fname, const int line)
4520 {
4521 add_amendment (word, fname, line, 1);
4522 }
4523
4524 void
remove_reserved_word(const char * word,const char * fname,const int line)4525 remove_reserved_word (const char *word, const char *fname, const int line)
4526 {
4527 add_amendment (word, fname, line, 0);
4528 }
4529
4530 /* add reserved word to the current list, called as "target" of
4531 reserved word directives */
4532 void
add_reserved_word_now(char * const word,char * const alias_for)4533 add_reserved_word_now (char * const word, char * const alias_for)
4534 {
4535 struct amendment_list amendment;
4536
4537 /* Nothing to do if the word is already reserved */
4538 if (is_reserved_word (word)) {
4539 return;
4540 }
4541
4542 /* LCOV_EXCL_START */
4543 if (alias_for && !is_default_reserved_word (alias_for)) {
4544 /* Should not happen */
4545 COBC_ABORT ();
4546 }
4547 /* LCOV_EXCL_STOP */
4548
4549 amendment.word = word;
4550 amendment.alias_for = alias_for;
4551 amendment.is_context_sensitive = 0;
4552 amendment.to_add = 1;
4553 add_reserved_word_to_map (get_user_specified_reserved_word (amendment), 0);
4554 }
4555
4556 void
remove_reserved_word_now(char * const word)4557 remove_reserved_word_now (char * const word)
4558 {
4559 remove_reserved_word_from_map (word);
4560 }
4561
4562 struct cobc_reserved *
lookup_reserved_word(const char * name)4563 lookup_reserved_word (const char *name)
4564 {
4565 struct cobc_reserved *p;
4566
4567 initialize_reserved_words_if_needed ();
4568
4569 p = find_reserved_word (name);
4570 if (!p) {
4571 return NULL;
4572 }
4573
4574 /* Check word is implemented */
4575 if (unlikely(p->token <= 0)) {
4576 /* Not implemented - If context sensitive, no error */
4577 if (!p->context_sens) {
4578 cb_error (_("'%s' is a reserved word, but isn't supported"), name);
4579 }
4580 return NULL;
4581 }
4582
4583 /* Special actions / Context sensitive */
4584 if (p->context_set) {
4585 if (unlikely(p->context_test)) {
4586 /* Dependent words */
4587 if (!(cobc_cs_check & p->context_test)) {
4588 return NULL;
4589 }
4590 }
4591 cobc_cs_check |= p->context_set;
4592 return p;
4593 }
4594
4595 if (p->context_test) {
4596 if (!(cobc_cs_check & p->context_test)) {
4597 return NULL;
4598 }
4599 /*
4600 The only context-sensitive phrases outside the procedure division
4601 we expect to manually reset cobc_cs_check are OPTIONS, SELECT,
4602 I-O-CONTROL and SCREEN.
4603
4604 Note: Everything in the environment and identification division can
4605 (and does) reset cobc_cs_check.
4606 */
4607 if (!cobc_in_procedure
4608 && !(cobc_cs_check & CB_CS_OPTIONS)
4609 && !(cobc_cs_check & CB_CS_SELECT)
4610 && !(cobc_cs_check & CB_CS_I_O_CONTROL)
4611 && !(cobc_cs_check & CB_CS_SCREEN)) {
4612 cobc_cs_check = 0;
4613 }
4614 return p;
4615 }
4616
4617 if (p->token == FUNCTION_ID) {
4618 cobc_cs_check = 0;
4619 cobc_force_literal = 1;
4620 } else if (p->token == INTRINSIC) {
4621 if (!cobc_in_repository) {
4622 return NULL;
4623 }
4624 } else if (p->token == PROGRAM_ID) {
4625 cobc_cs_check = CB_CS_PROGRAM_ID;
4626 cobc_force_literal = 1;
4627 } else if (p->token == REPOSITORY) {
4628 cobc_in_repository = 1;
4629 }
4630
4631 return p;
4632 }
4633
4634 struct cb_intrinsic_table *
lookup_intrinsic(const char * name,const int checkimpl)4635 lookup_intrinsic (const char *name, const int checkimpl)
4636 {
4637 struct cb_intrinsic_table *cbp;
4638 static char upper_name[43];
4639 size_t name_len = strlen (name);
4640
4641 if (name_len > sizeof (upper_name) - 1) {
4642 return NULL;
4643 }
4644
4645 /* copy including terminating byte */
4646 strncpy_upper (upper_name, name, name_len + 1);
4647
4648 cbp = bsearch (upper_name, function_list, NUM_INTRINSICS,
4649 sizeof (struct cb_intrinsic_table), intrinsic_comp);
4650 if (cbp && (checkimpl || cbp->active == CB_FEATURE_ACTIVE)) {
4651 return cbp;
4652 }
4653 return NULL;
4654 }
4655
4656 static void
set_intrinsic_mode(struct cb_intrinsic_table * cbp,enum cb_feature_mode mode)4657 set_intrinsic_mode (struct cb_intrinsic_table *cbp, enum cb_feature_mode mode)
4658 {
4659 /* FIXME: doesn't cater for not implemented -> disabled -> active [should be not implemented again] */
4660 if (cbp->active == CB_FEATURE_NOT_IMPLEMENTED && mode == CB_FEATURE_ACTIVE) {
4661 return;
4662 }
4663 cbp->active = mode;
4664 }
4665
4666 static void
change_intrinsic(const char * name,const char * fname,const int line,enum cb_feature_mode mode)4667 change_intrinsic (const char *name, const char *fname, const int line, enum cb_feature_mode mode)
4668 {
4669 struct cb_intrinsic_table *cbp;
4670 size_t i;
4671
4672 /* Group "ALL" intrinsics */
4673 if (cb_strcasecmp (name, "DIALECT-ALL") == 0) {
4674 for (i = 0; i < NUM_INTRINSICS; ++i) {
4675 set_intrinsic_mode (&function_list[i], mode);
4676 }
4677 return;
4678 }
4679
4680 cbp = lookup_intrinsic (name, 1);
4681 if (!cbp) {
4682 if (mode == CB_FEATURE_ACTIVE) {
4683 configuration_error (fname, line, 1, _("intrinsic function %s is unknown"), name);
4684 }
4685 return;
4686 }
4687 set_intrinsic_mode (cbp, mode);
4688 }
4689
4690 void
activate_intrinsic(const char * name,const char * fname,const int line)4691 activate_intrinsic (const char *name, const char *fname, const int line)
4692 {
4693 change_intrinsic (name, fname, line, CB_FEATURE_ACTIVE);
4694 }
4695
4696 void
deactivate_intrinsic(const char * name,const char * fname,const int line)4697 deactivate_intrinsic (const char *name, const char *fname, const int line)
4698 {
4699 change_intrinsic (name, fname, line, CB_FEATURE_DISABLED);
4700 }
4701
4702 void
cb_list_intrinsics(void)4703 cb_list_intrinsics (void)
4704 {
4705 const char *t;
4706 char argnum [20];
4707 size_t i;
4708
4709 putchar ('\n');
4710 printf ("%-32s%-16s%s\n",
4711 _("Intrinsic Function"), _("Implemented"), _("Parameters"));
4712 for (i = 0; i < NUM_INTRINSICS; ++i) {
4713 switch (function_list[i].active) {
4714 case CB_FEATURE_ACTIVE:
4715 t = _("Yes");
4716 break;
4717 case CB_FEATURE_NOT_IMPLEMENTED:
4718 t = _("No");
4719 break;
4720 default: /* CB_FEATURE_DISABLED */
4721 continue;
4722 }
4723 if (function_list[i].args == -1) {
4724 snprintf (argnum, sizeof (argnum) - 1, "%s", _("Unlimited"));
4725 } else if (function_list[i].args != function_list[i].min_args) {
4726 snprintf (argnum, sizeof (argnum) - 1, "%d - %d",
4727 (int)function_list[i].min_args, (int)function_list[i].args);
4728 } else {
4729 snprintf (argnum, sizeof (argnum) - 1, "%d", (int)function_list[i].args);
4730 }
4731 printf ("%-32s%-16s%s\n", function_list[i].name, t, argnum);
4732 }
4733 }
4734
4735 static struct register_struct *
lookup_register(const char * name,const int checkimpl)4736 lookup_register (const char *name, const int checkimpl)
4737 {
4738 size_t i;
4739 static char upper_name[43];
4740 size_t name_len = strlen (name);
4741
4742 if (name_len > sizeof (upper_name) - 1) {
4743 return NULL;
4744 }
4745
4746 /* copy including terminating byte */
4747 strncpy_upper (upper_name, name, name_len + 1);
4748
4749 for (i = 0; i < NUM_REGISTERS; ++i) {
4750 /* For efficiency, we use strcmp instead of cb_strcasecmp. */
4751 if (strcmp (register_list[i].name, upper_name) == 0) {
4752 if (checkimpl || register_list[i].active == CB_FEATURE_MUST_BE_ENABLED) {
4753 return ®ister_list[i];
4754 }
4755 break;
4756 }
4757 }
4758 return NULL;
4759 }
4760
4761 /* add an entry to the register list, currently the definition is ignored,
4762 TODO: check definition and add a new special register accordingly */
4763
4764 void
add_register(const char * name_and_definition,const char * fname,const int line)4765 add_register (const char *name_and_definition, const char *fname, const int line)
4766 {
4767 const char *name = name_and_definition;
4768 int i;
4769 char *definition;
4770 struct register_struct *special_register;
4771
4772 /* Enable all registers, if requested. */
4773 if (cb_strcasecmp (name, "DIALECT-ALL") == 0) {
4774 for (i = 0; i < NUM_REGISTERS; ++i) {
4775 if (register_list[i].active != CB_FEATURE_MUST_BE_ENABLED) {
4776 /* TODO: add register here */
4777 register_list[i].active = CB_FEATURE_ACTIVE;
4778 /* Disable reserved word with same name. */
4779 remove_reserved_word (register_list[i].name, fname, line);
4780 }
4781 }
4782 return;
4783 }
4784
4785 /* Otherwise enable a named register. */
4786
4787 /* note: we don't break at space as this would kill "ADDRESS OF"
4788 and "PIC 9(05) USAGE ..." */
4789 definition = strpbrk (name_and_definition, "\t:=");
4790 if (definition) {
4791 *definition++ = 0;
4792 }
4793
4794 special_register = lookup_register (name, 1);
4795 if (!special_register) {
4796 if (!definition || *definition == 0) {
4797 configuration_error (fname, line, 1,
4798 _("special register %s is unknown, needs a definition"), name);
4799 return;
4800 }
4801 #if 0 /* must be extended and tested before use... */
4802 cb_build_generic_register (name, definition);
4803 #else
4804 configuration_error (fname, line, 1, _("special register %s is unknown"), name);
4805 #endif
4806 return;
4807 }
4808 special_register->active = CB_FEATURE_ACTIVE;
4809
4810 /* Disable reserved word with same name. */
4811 remove_reserved_word (name, fname, line);
4812 }
4813
4814 void
remove_register(const char * name,const char * fname,const int line)4815 remove_register (const char *name, const char *fname, const int line)
4816 {
4817 struct register_struct *special_register;
4818 int i;
4819
4820 COB_UNUSED (fname);
4821 COB_UNUSED (line);
4822
4823 if (cb_strcasecmp (name, "DIALECT-ALL") == 0) {
4824 for (i = 0; i < NUM_REGISTERS; ++i) {
4825 if (register_list[i].active != CB_FEATURE_MUST_BE_ENABLED) {
4826 /* TODO: when user-defined registers are possible: do
4827 memory cleanup here */
4828 register_list[i].active = CB_FEATURE_DISABLED;
4829 /* Disable reserved word with same name. */
4830 remove_reserved_word (register_list[i].name, fname,
4831 line);
4832 }
4833 }
4834 } else {
4835 special_register = lookup_register (name, 1);
4836 if (!special_register) {
4837 return;
4838 }
4839 /* TODO: when user-defined registers are possible: do memory
4840 cleanup here */
4841 special_register->active = CB_FEATURE_DISABLED;
4842 /* Disable reserved word with same name. */
4843 remove_reserved_word (name, fname, line);
4844 }
4845 }
4846
4847 const char *
cb_register_list_get_first(const char ** definition)4848 cb_register_list_get_first (const char **definition)
4849 {
4850 current_register = 0;
4851 return cb_register_list_get_next (definition);
4852 }
4853
4854 const char *
cb_register_list_get_next(const char ** definition)4855 cb_register_list_get_next (const char **definition)
4856 {
4857 for (; current_register < NUM_REGISTERS; ++current_register) {
4858 if (register_list[current_register].active == CB_FEATURE_ACTIVE) {
4859 *definition = register_list[current_register].definition;
4860 return register_list[current_register++].name;
4861 }
4862 }
4863 return NULL;
4864 }
4865
4866 const char *
cb_get_register_definition(const char * name)4867 cb_get_register_definition (const char *name)
4868 {
4869 struct register_struct *special_register = lookup_register (name, 0);
4870
4871 if (!special_register) {
4872 return NULL;
4873 }
4874 return special_register->definition;
4875 }
4876
4877 void
cb_list_registers(void)4878 cb_list_registers (void)
4879 {
4880 size_t i;
4881 const char *name, *t;
4882 char name_display[COB_MINI_BUFF];
4883
4884 /* TODO: implement creation from user-specified list (currently only enable/disable)
4885 Note: will still be able to be referenced if not implemented,
4886 but not set/read by libcob [still helps compilation but should raise a warning]
4887 */
4888
4889 putchar ('\n');
4890 printf ("%-32s%-16s%s\n",
4891 _("Internal registers"), _("Implemented"), _("Definition"));
4892 for (i = 0; i < NUM_REGISTERS; ++i) {
4893 switch (register_list[i].active) {
4894 case CB_FEATURE_ACTIVE:
4895 t = _("Yes");
4896 break;
4897 case CB_FEATURE_NOT_IMPLEMENTED:
4898 t = _("No");
4899 break;
4900 default: /* CB_FEATURE_DISABLED */
4901 continue;
4902 }
4903 if (strcmp (register_list[i].name, "LENGTH OF") != 0
4904 && strcmp (register_list[i].name, "ADDRESS OF") != 0) {
4905 name = register_list[i].name;
4906 } else {
4907 snprintf (name_display, COB_MINI_MAX, "'%s' phrase", register_list[i].name);
4908 name = (const char *)&name_display;
4909 }
4910 printf ("%-32s%-16s%s\n", name, t, register_list[i].definition);
4911 }
4912 }
4913
4914 static struct system_name_struct *
lookup_system_name(const char * name,const int checkimpl)4915 lookup_system_name (const char *name, const int checkimpl)
4916 {
4917 size_t i;
4918
4919 for (i = 0; i < SYSTEM_TAB_SIZE; ++i) {
4920 if (cb_strcasecmp (system_name_table[i].name, name) == 0) {
4921 if (checkimpl || system_name_table[i].active != CB_FEATURE_DISABLED) {
4922 return &system_name_table[i];
4923 }
4924 break;
4925 }
4926 }
4927 return NULL;
4928 }
4929
4930 static void
set_system_name_mode(struct system_name_struct * system_name,enum cb_feature_mode mode)4931 set_system_name_mode (struct system_name_struct *system_name, enum cb_feature_mode mode)
4932 {
4933 /* FIXME: doesn't cater for not implemented -> disabled -> active [should be not implemented again] */
4934 if (system_name->active == CB_FEATURE_NOT_IMPLEMENTED && mode == CB_FEATURE_ACTIVE) {
4935 return;
4936 }
4937 system_name->active = mode;
4938 }
4939
4940 static void
change_system_name(const char * name,const char * fname,const int line,enum cb_feature_mode mode)4941 change_system_name (const char *name, const char *fname, const int line, enum cb_feature_mode mode)
4942 {
4943 struct system_name_struct *system_name;
4944 size_t i;
4945
4946
4947 /* some predefined groups first */
4948 if (cb_strcasecmp (name, "DIALECT-ALL") == 0) {
4949 for (i = 0; i < SYSTEM_TAB_SIZE; ++i) {
4950 set_system_name_mode (&system_name_table[i], mode);
4951 }
4952 return;
4953 } else if (cb_strcasecmp (name, "DIALECT-ALL-DEVICES") == 0) {
4954 for (i = 0; i < SYSTEM_TAB_SIZE; ++i) {
4955 if (system_name_table[i].category == CB_DEVICE_NAME) {
4956 set_system_name_mode (&system_name_table[i], mode);
4957 }
4958 }
4959 return;
4960 } else if (cb_strcasecmp (name, "DIALECT-ALL-SWITCHES") == 0) {
4961 for (i = 0; i < SYSTEM_TAB_SIZE; ++i) {
4962 if (system_name_table[i].category == CB_SWITCH_NAME) {
4963 set_system_name_mode (&system_name_table[i], mode);
4964 }
4965 }
4966 return;
4967 } else if (cb_strcasecmp (name, "DIALECT-ALL-FEATURES") == 0) {
4968 for (i = 0; i < SYSTEM_TAB_SIZE; ++i) {
4969 if (system_name_table[i].category == CB_FEATURE_NAME) {
4970 set_system_name_mode (&system_name_table[i], mode);
4971 }
4972 }
4973 return;
4974 }
4975
4976 system_name = lookup_system_name (name, 1);
4977 if (!system_name) {
4978 if (mode == CB_FEATURE_ACTIVE) {
4979 configuration_error (fname, line, 1, _("unknown system-name '%s'"), name);
4980 }
4981 return;
4982 }
4983 set_system_name_mode (system_name, mode);
4984 }
4985
4986 void
activate_system_name(const char * name,const char * fname,const int line)4987 activate_system_name (const char *name, const char *fname, const int line)
4988 {
4989 change_system_name (name, fname, line, CB_FEATURE_ACTIVE);
4990 }
4991
4992 void
deactivate_system_name(const char * name,const char * fname,const int line)4993 deactivate_system_name (const char *name, const char *fname, const int line)
4994 {
4995 change_system_name (name, fname, line, CB_FEATURE_DISABLED);
4996 }
4997
4998 void
cb_list_system_names(void)4999 cb_list_system_names (void)
5000 {
5001 const char *feature;
5002 size_t i;
5003
5004 putchar ('\n');
5005 puts (_("System names"));
5006 for (i = 0; i < SYSTEM_TAB_SIZE; ++i) {
5007 if (system_name_table[i].active == CB_FEATURE_DISABLED) {
5008 continue;
5009 }
5010 feature = res_get_feature (system_name_table[i].category);
5011 printf ("%-32s%s\n", system_name_table[i].name, feature);
5012 }
5013 }
5014
5015
5016 void
cb_list_reserved(void)5017 cb_list_reserved (void)
5018 {
5019 struct list_reserved_line *word_descriptions;
5020 const char *p;
5021 size_t i;
5022 size_t j;
5023
5024 initialize_reserved_words_if_needed ();
5025
5026 /* Output header */
5027 putchar ('\n');
5028 printf ("%-32s%s\n", _("Reserved Words"), _("Implemented"));
5029
5030 /* Build list of reserved words */
5031 word_descriptions = cobc_malloc (num_reserved_words * sizeof (struct list_reserved_line));
5032 j = -1; /* planned integer overflow with the +1 below expected to be zero */
5033 for (i = 0; i < num_reserved_words; ++i) {
5034 do {
5035 ++j;
5036 } while (!reserved_word_map[j]);
5037
5038 if (reserved_word_map[j]->token > 0) {
5039 if (reserved_word_map[j]->context_sens) {
5040 p = _("Yes (Context sensitive)");
5041 } else {
5042 p = _("Yes");
5043 }
5044 } else {
5045 if (reserved_word_map[j]->context_sens) {
5046 p = _("No (Context sensitive)");
5047 } else {
5048 p = _("No");
5049 }
5050 }
5051 word_descriptions[i].word_and_status = cobc_malloc (COB_MAX_WORDLEN + 1);
5052 snprintf (word_descriptions[i].word_and_status, COB_MAX_WORDLEN,
5053 "%-32s%s", reserved_word_map[j]->name, p);
5054 get_aliases (j, &word_descriptions[i]);
5055 }
5056
5057 /* Display sorted list with aliases. */
5058 qsort (word_descriptions, num_reserved_words,
5059 sizeof (struct list_reserved_line), &list_line_cmp);
5060 for (i = 0; i < num_reserved_words; ++i) {
5061 printf ("%s", word_descriptions[i].word_and_status);
5062 cobc_free (word_descriptions[i].word_and_status);
5063 if (word_descriptions[i].aliases) {
5064 printf (" %s", word_descriptions[i].aliases);
5065 cobc_free (word_descriptions[i].aliases);
5066 }
5067 putchar ('\n');
5068 }
5069 cobc_free (word_descriptions);
5070
5071 /* Output other words and registers. */
5072 putchar ('\n');
5073 /* FIXME: handle these as normal context sensitive words by
5074 checking in scanner.l if these are reserved */
5075 puts (_("Extra (obsolete) context sensitive words"));
5076 puts ("AUTHOR");
5077 puts ("DATE-COMPILED");
5078 puts ("DATE-MODIFIED");
5079 puts ("DATE-WRITTEN");
5080 puts ("INSTALLATION");
5081 puts ("REMARKS");
5082 puts ("SECURITY");
5083
5084 /* note: starts with an empty line */
5085 cb_list_registers ();
5086 }
5087
5088 #ifndef HAVE_DESIGNATED_INITS
5089 void
cobc_init_reserved(void)5090 cobc_init_reserved (void)
5091 {
5092 const unsigned char *p;
5093 const unsigned char *v;
5094
5095 memset (cob_lower_tab, 0, sizeof(cob_lower_tab));
5096 p = pcob_lower_tab;
5097 v = pcob_lower_val;
5098 for (; *p; ++p, ++v) {
5099 cob_lower_tab[*p] = *v;
5100 }
5101 }
5102 #endif
5103