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 &register_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