@portll/cobolwork 0.2.117 → 0.2.140
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/card.mjs +18 -0
- package/lib/cics-commands.mjs +136 -125
- package/lib/control.mjs +118 -1
- package/lib/dataflow.mjs +67 -84
- package/lib/embedded-sql.mjs +110 -0
- package/lib/evidence/journal.mjs +11 -2
- package/lib/explain.mjs +5 -4
- package/lib/ftp.mjs +136 -0
- package/lib/ironwork.mjs +4 -6
- package/lib/jcl.mjs +27 -7
- package/lib/layout.mjs +202 -0
- package/lib/parser.mjs +52 -203
- package/lib/precompile.mjs +5 -88
- package/lib/revision.json +1 -1
- package/lib/sbom.mjs +94 -6
- package/lib/sets/cics.mjs +5 -2
- package/lib/sets/copybook.mjs +2 -1
- package/lib/sets/hidden.mjs +4 -8
- package/lib/sets/jcl.mjs +16 -119
- package/lib/sets/recon.mjs +2 -1
- package/lib/sets/zowe.mjs +34 -8
- package/lib/utilities.mjs +146 -4
- package/package.json +1 -1
- package/rules/compliance-dora.json +1 -1
- package/rules/compliance-ffiec.json +1 -1
- package/rules/compliance-nist80053.json +1 -1
- package/schema/cobolwork.policy.schema.json +94 -17
package/lib/card.mjs
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
// Where a source line's fields sit on the card. COBOL in fixed or variable reference format has a
|
|
3
|
+
// sequence area (columns 1-6), an indicator (7), program text (8-72, or 8-250 in variable format) and
|
|
4
|
+
// what follows, which the compiler ignores. A JCL or utility control statement is columns 1-72, with
|
|
5
|
+
// its sequence number after. Free-format COBOL is text from end to end.
|
|
6
|
+
|
|
7
|
+
export const TEXT_END = { fixed: 72, variable: 250 };
|
|
8
|
+
export const STATEMENT_END = 72;
|
|
9
|
+
|
|
10
|
+
export function cobolCard(line, format) {
|
|
11
|
+
const end = TEXT_END[format];
|
|
12
|
+
if (!end) return { sequence: '', indicator: '', text: line, ignored: '' };
|
|
13
|
+
return { sequence: line.slice(0, 6), indicator: line[6] || ' ', text: line.slice(7, end), ignored: line.slice(end) };
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function statementCard(line) {
|
|
17
|
+
return { text: line.slice(0, STATEMENT_END), sequence: line.slice(STATEMENT_END) };
|
|
18
|
+
}
|
package/lib/cics-commands.mjs
CHANGED
|
@@ -106,45 +106,48 @@ export const DFHRESP = {
|
|
|
106
106
|
|
|
107
107
|
export const DFHVALUE = {
|
|
108
108
|
ABEND: 900, ACQFAIL: 515, ACQUIRED: 69, ACQUIRING: 71, ACTIVE: 181, ACTIVITY: 1002, ADD: 291,
|
|
109
|
-
ADDABLE: 41, ADDFAIL: 519, ADVANCE: 265, AINIT: 282, ALARM: 501, ALL: 856,
|
|
110
|
-
ALLOCATD: 81, ALLOCATED: 81, ALLQUERY: 431, ALLVALUES: 860, ALTERABLE: 52,
|
|
111
|
-
ALTPRTCOPY: 446, ANALYZER: 1126, AND: 1005, ANY: 158, APLKYBD: 391, APLTEXT: 393,
|
|
112
|
-
APPCPARALLEL: 374, APPCSINGLE: 373, APPEND: 1036, APPLICATION: 559, APPLID: 303,
|
|
113
|
-
ASACTL: 224, ASCII7: 616, ASCII8: 617,
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
109
|
+
ADDABLE: 41, ADDFAIL: 519, ADDRESS: 859, ADVANCE: 265, AINIT: 282, ALARM: 501, ALL: 856,
|
|
110
|
+
ALLCONN: 169, ALLOCATD: 81, ALLOCATED: 81, ALLQUERY: 431, ALLVALUES: 860, ALTERABLE: 52,
|
|
111
|
+
ALTERNATE: 197, ALTPRTCOPY: 446, ANALYZER: 1126, AND: 1005, ANY: 158, APLKYBD: 391, APLTEXT: 393,
|
|
112
|
+
APPC: 124, APPCPARALLEL: 374, APPCSINGLE: 373, APPEND: 1036, APPLICATION: 559, APPLID: 303,
|
|
113
|
+
APPLNAME: 338, ASACTL: 224, ASCII7: 616, ASCII8: 617, ASRUNTRAN: 1209, ASSEMBLER: 150,
|
|
114
|
+
ASSERTED: 1104, ASYNCHRONOUS: 570, ASYNCSERVICE: 1213, ATI: 75, ATOM: 1119, ATOMSERVICE: 1179,
|
|
115
|
+
ATTACH: 576, ATTENTION: 524, ATTLSAWARE: 1205, AUDALARM: 395, AUTOACTIVE: 630, AUTOARCH: 262,
|
|
116
|
+
AUTOAUTH: 1095, AUTOCONN: 170, AUTOINACTIVE: 631, AUTOINIT: 284, AUTOINSTALL: 1140, AUTOPAGE: 80,
|
|
117
|
+
AUTOPAGEABLE: 80, AUTOREGISTER: 1094, AUTOSTART: 618, AUTOTERMID: 1120, AUXILIARY: 247,
|
|
118
|
+
AUXPAUSE: 313, AUXSTART: 312, AUXSTOP: 314, AVAILABLE: 95, AWARE: 1256, BACKOUT: 192,
|
|
119
|
+
BACKTRANS: 397, BACKUPNONBWO: 800, BASE: 10, BASE64: 50, BASEAPI: 1052, BASESPACE: 664,
|
|
120
|
+
BASICAUTH: 1092, BDAM: 2, BEGINSESSION: 510, BELOW: 159, BGAM: 63, BINARY: 1038, BINIT: 283,
|
|
121
|
+
BIT: 1020, BLK: 47, BLOCKED: 16, BOTH: 1100, BRIDGE: 935, BROWSABLE: 39, BSAM: 61, BTAM: 62,
|
|
122
|
+
BUNDLE: 1180, BUSY: 612, C: 149, CACHE: 791, CANCEL: 526, CANCELLED: 624, CANCELLING: 1025,
|
|
123
|
+
CAPTURESPEC: 1195, CATEGORY: 474, CBE: 582, CBER: 581, CCE: 583, CD: 491, CEDF: 370,
|
|
124
|
+
CERTIFICAUTH: 1093, CERTUSER: 1061, CFE: 584, CFTABLE: 833, CGROUP: 902, CHANNEL: 1047,
|
|
125
|
+
CHAR: 1019, CHECK: 1241, CHUNKEND: 737, CHUNKNO: 735, CHUNKYES: 736, CICS: 660, CICSAPI: 1052,
|
|
125
126
|
CICSDATAKEY: 379, CICSECURITY: 195, CICSEXECKEY: 381, CICSTABLE: 101, CKOPEN: 1055,
|
|
126
127
|
CLASSCACHE: 1075, CLEAR: 640, CLICONVERT: 743, CLIENT: 1122, CLIENTAUTH: 1032, CLIENTCERT: 1087,
|
|
127
128
|
CLOSE: 741, CLOSED: 19, CLOSEFAILED: 349, CLOSELEAVE: 261, CLOSEREQ: 22, CLOSEREQUEST: 22,
|
|
128
129
|
CLOSING: 21, CLOUD: 848, CMDPROT: 673, CMDSECEXT: 207, CMDSECNO: 205, CMDSECYES: 207, COBOL: 151,
|
|
129
130
|
COBOLII: 375, COLD: 788, COLDACQ: 72, COLDQUERY: 433, COLDSTART: 266, COLLECTION: 473, COLOR: 399,
|
|
130
131
|
COMMAREA: 1048, COMMIT: 208, COMMITFAIL: 792, COMPAT: 107, COMPLETE: 1026, COMPOSITE: 1003,
|
|
131
|
-
COMPRESS: 1130, CONFFREE: 82, CONFRECEIVE: 83, CONFRECV: 83, CONFSEND: 84,
|
|
132
|
-
CONNECTED: 690, CONNECTING: 904, CONNECTION: 755, CONSISTENT: 723, CONSOLE: 66,
|
|
133
|
-
CONTENTION: 836, CONTEXT: 574, CONTROLSHUT: 623, CONVERSE: 600, CONVIDLE: 518,
|
|
134
|
-
COPID: 908, COPY: 401, CORBA: 1101, CORBASERVER: 1141, CPLUSPLUS: 148,
|
|
135
|
-
CRITICAL: 11, CSDAPI: 840, CSDBATCH: 841, CSIGN: 905, CTERM: 906,
|
|
136
|
-
CTLGNONE: 634, CTRLABLE: 56, CTX: 907, CURRENT: 260,
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
132
|
+
COMPRESS: 1130, CONFFREE: 82, CONFIG: 1232, CONFRECEIVE: 83, CONFRECV: 83, CONFSEND: 84,
|
|
133
|
+
CONNECT: 903, CONNECTED: 690, CONNECTING: 904, CONNECTION: 755, CONSISTENT: 723, CONSOLE: 66,
|
|
134
|
+
CONTAINER: 869, CONTENTION: 836, CONTEXT: 574, CONTROLSHUT: 623, CONVERSE: 600, CONVIDLE: 518,
|
|
135
|
+
COORDINATOR: 770, COPID: 908, COPY: 401, CORBA: 1101, CORBASERVER: 1141, CPLUSPLUS: 148,
|
|
136
|
+
CREATE: 67, CREATESPI: 844, CRITICAL: 11, CSDAPI: 840, CSDBATCH: 841, CSIGN: 905, CTERM: 906,
|
|
137
|
+
CTLGALL: 632, CTLGMODIFY: 633, CTLGNONE: 634, CTRLABLE: 56, CTX: 907, CURRENT: 260,
|
|
138
|
+
CURRENTPGM: 870, CUSERID: 909, CUSTOM: 579, DAE: 684, DAEOPT: 684, DATA: 508, DATASET: 756,
|
|
139
|
+
DATASETFULL: 793, DATASTREAM: 543, DB2CONN: 1142, DB2ENTRY: 1143, DB2TRAN: 1184, DBTRAN: 1184,
|
|
140
|
+
DEADLOCK: 794, DEBUG: 1082, DEC: 46, DEFAULT: 198, DEFAULTUSER: 1070, DEFINITION: 990,
|
|
141
|
+
DEFRESP1: 497, DEFRESP1OR2: 528, DEFRESP2: 498, DEFRESP3: 499, DELAY: 637, DELETABLE: 43,
|
|
142
|
+
DELETE: 292, DELETEFAIL: 520, DELEXITERROR: 795, DEREGERROR: 679, DEREGISTERED: 678, DEST: 235,
|
|
143
|
+
DIAGNOSTICS: 1231, DISABLED: 24, DISABLEDHOST: 1125, DISABLING: 25, DISCARD: 1254,
|
|
144
|
+
DISCARDFAIL: 513, DISCARDING: 1118, DISCONNECT: 1247, DISCONNING: 910, DISCOVER: 1252,
|
|
145
|
+
DISCREQ: 444, DISK1: 252, DISK2: 253, DISK2PAUSE: 254, DISPATCHABLE: 228, DISPATCHER: 1144,
|
|
146
|
+
DJAR: 1189, DOCDELETE: 295, DOCTEMPLATE: 1145, DOESNOTEQUAL: 861, DOESNOTEXIST: 872,
|
|
147
|
+
DOESNOTSTART: 862, DORMANT: 1024, DPLSUBSET: 383, DRAINING: 619, DREPAPI: 843, DREPBATCH: 845,
|
|
148
|
+
DS3270: 615, DSIE: 1206, DUALCASE: 403, DUMMY: 781, DUMP: 1223, DUMPCODE: 1218, DUPERROR: 106,
|
|
149
|
+
DUPNOREPLACE: 105, DUPREPLACE: 104, DYNAMIC: 178, EB: 490, EBCDIC: 1039, ECI: 1098, EJB: 1102,
|
|
150
|
+
EMERGENCY: 268, EMPTY: 210, EMPTYREQ: 31, ENABLED: 23, ENABLING: 51, ENDAFFINITY: 790,
|
|
148
151
|
ENQMODEL: 1188, ENQUEUE: 1146, ENTRYPOINT: 993, EPADAPTER: 1196, EPADAPTERSET: 1200, EQUAL: 911,
|
|
149
152
|
EQUALS: 863, ESDS: 5, EVENT: 334, EVENTBINDING: 1191, EVENTPROCESS: 1192, EVENTUAL: 3,
|
|
150
153
|
EXCEPT: 332, EXCEPTRESP: 523, EXCI: 650, EXCTL: 48, EXECENQ: 751, EXECENQADDR: 752,
|
|
@@ -155,116 +158,124 @@ export const DFHVALUE = {
|
|
|
155
158
|
FIXED: 12, FLUSH: 783, FMH: 502, FMHPARM: 385, FOPEN: 272, FORCE: 342, FORCECANCEL: 655,
|
|
156
159
|
FORCECLOSE: 351, FORCECLOSING: 353, FORCED: 1013, FORCEPURGE: 237, FORCLOSING: 353,
|
|
157
160
|
FORMATEDF: 606, FORMATTED: 542, FORMFEED: 407, FOUTPUT: 271, FREE: 85, FREEING: 94, FROMEPR: 850,
|
|
158
|
-
FULL: 212, FULLAPI: 384, FULLAUTO: 1073, FWDRECOVABLE: 354, GENERIC: 651, GET: 748,
|
|
159
|
-
GOHIGHERTHAN: 873, GOINGOUT: 172, GOLOWERTHAN: 874, GREATERTHAN: 864, GROUP: 913,
|
|
160
|
-
GROUPRESYNC: 947, GRPLIST: 842, GTFSTART: 317, GTFSTOP: 318, HEAD: 750,
|
|
161
|
-
HEURCOMMIT: 757, HEX: 45, HFORM: 409, HFSFILE: 1040, HIGH: 914, HILIGHT: 413,
|
|
162
|
-
HOME: 1103, HOSTNAME: 302, HTTP: 1096, HTTPNO: 1034, HTTPS: 1029, HTTPYES: 1033,
|
|
163
|
-
IDNTY: 328, IGNORE: 1, IGNORERR: 816, IIOP: 1097, IMMCLOSE: 350, IMMCLOSING: 352,
|
|
164
|
-
IMMQUIESCED: 706, IMPORT: 992, INACTIVE: 378, INBOUND: 547, INCOMPLETE: 1014,
|
|
165
|
-
INDIRECT: 122, INDOUBT: 620, INFLIGHT: 621, INITCOMPLETE: 628, INITIAL: 789,
|
|
166
|
-
INOUT: 532, INPUT: 226, INSERVICE: 73, INSTALLED: 550,
|
|
167
|
-
INTRA: 222, INTSTART: 310, INTSTOP: 311, INVALID: 359,
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
161
|
+
FULL: 212, FULLAPI: 384, FULLAUTO: 1073, FWDRECOVABLE: 354, GATHER: 1224, GENERIC: 651, GET: 748,
|
|
162
|
+
GMT: 604, GOHIGHERTHAN: 873, GOINGOUT: 172, GOLOWERTHAN: 874, GREATERTHAN: 864, GROUP: 913,
|
|
163
|
+
GROUPRESYNC: 947, GRPLIST: 842, GTFSTART: 317, GTFSTOP: 318, HEAD: 750, HEAP: 1229,
|
|
164
|
+
HEURBACKOUT: 758, HEURCOMMIT: 757, HEX: 45, HFORM: 409, HFSFILE: 1040, HIGH: 914, HILIGHT: 413,
|
|
165
|
+
HOLD: 163, HOME: 1103, HOSTNAME: 302, HTTP: 1096, HTTPNO: 1034, HTTPS: 1029, HTTPYES: 1033,
|
|
166
|
+
IDENTIFY: 1074, IDNTY: 328, IGNORE: 1, IGNORERR: 816, IIOP: 1097, IMMCLOSE: 350, IMMCLOSING: 352,
|
|
167
|
+
IMMEDIATE: 2, IMMQUIESCED: 706, IMPORT: 992, INACTIVE: 378, INBOUND: 547, INCOMPLETE: 1014,
|
|
168
|
+
INDEXRECFULL: 796, INDIRECT: 122, INDOUBT: 620, INFLIGHT: 621, INITCOMPLETE: 628, INITIAL: 789,
|
|
169
|
+
INITING: 1112, INITPROP: 1261, INOUT: 532, INPUT: 226, INSERVICE: 73, INSTALLED: 550,
|
|
170
|
+
INSTALLFAIL: 512, INTERNAL: 1058, INTRA: 222, INTSTART: 310, INTSTOP: 311, INVALID: 359,
|
|
171
|
+
IOERROR: 797, IPCONN: 1176, IPECI: 936, IPIC: 1089, IPV4: 300, IPV6: 301, IRC: 121,
|
|
172
|
+
ISNOTGREATER: 865, ISNOTLESS: 866, ISOLATE: 658, JAVA: 147, JAVACORE: 1228, JMS: 1239,
|
|
173
|
+
JOURNALMODEL: 1185, JOURNALNAME: 1147, JOURNALNUM: 1148, JVM: 1080, JVMPOOL: 1149,
|
|
174
|
+
JVMPROFILE: 1150, JVMPROGRAM: 1151, JVMSERVER: 1193, JWT: 1217, KATAKANA: 415, KEEP: 786,
|
|
175
|
+
KERBEROS: 1105, KEYED: 8, KILL: 232, KSDS: 6, LCKSTRUCFULL: 832, LE370: 377, LEAVE: 811,
|
|
176
|
+
LESSTHAN: 867, LIBERTY: 1222, LIBRARY: 1177, LIC: 493, LIGHTPEN: 417, LINK: 577, LOAD: 834,
|
|
177
|
+
LOC24: 159, LOC31: 158, LOCAL: 605, LOCKING: 837, LOG: 54, LOGICAL: 216, LOGREPLICATE: 1198,
|
|
178
|
+
LOGTERM: 269, LOSE: 544, LOW: 915, LPA: 165, LSRPOOL: 1152, LU61: 125, LUP: 541, LUSTAT: 525,
|
|
179
|
+
LUW: 246, MAIN: 248, MAP: 155, MAPSET: 155, MCHCTL: 241, MDT: 506, MESSAGE: 1245, MESSAGEID: 1197,
|
|
180
|
+
METADATA: 857, MIXED: 403, MNPS: 999, MOD: 813, MODE24: 190, MODE31: 191, MODEANY: 189,
|
|
181
|
+
MODEL: 370, MODIFY: 1242, MONITOR: 1153, MORE: 492, MQCONN: 1175, MQMONITOR: 1207, MRO: 938,
|
|
182
|
+
MSRCONTROL: 419, MTOM: 460, MTOMNOXOP: 469, MVS: 780, MVSTCB: 1154, N906: 931, N906D: 921,
|
|
183
|
+
NEGATIVE: 530, NEW: 28, NEWCOPY: 167, NEWSESSION: 485, NOALARM: 500, NOALTPRTCOPY: 447,
|
|
184
|
+
NOANALYZER: 1127, NOAPLKYBD: 392, NOAPLTEXT: 394, NOAPPEND: 1037, NOAPPLNAME: 339, NOATI: 76,
|
|
185
|
+
NOAUDALARM: 396, NOAUTHENTIC: 1091, NOAUTO: 1071, NOAUTOARCH: 263, NOAUTOSTART: 1208,
|
|
186
|
+
NOBACKOUT: 193, NOBACKTRANS: 398, NOCEDF: 371, NOCHECK: 1240, NOCLASSCACHE: 1076, NOCLEAR: 641,
|
|
182
187
|
NOCLICONVERT: 744, NOCLOSE: 742, NOCMDPROT: 674, NOCOLOR: 400, NOCOMPAT: 108, NOCOMPRESS: 1131,
|
|
183
188
|
NOCONNECT: 916, NOCONV: 556, NOCONVERSE: 601, NOCONVERT: 734, NOCOPY: 402, NOCREATE: 68,
|
|
184
|
-
NOCTL: 223, NODAE: 685, NODAEOPT: 685, NODE: 1155, NODEBUG: 1083,
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
NONCRITICAL: 1090, NONE: 496, NONLE370: 1084, NONRESIDENT: 1202,
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
189
|
+
NOCTL: 223, NODAE: 685, NODAEOPT: 685, NODE: 1155, NODEBUG: 1083, NODEJSAPP: 1215,
|
|
190
|
+
NODISCOVER: 1253, NODISCREQ: 445, NODOCDELETE: 296, NODUALCASE: 404, NOEMIT: 1262, NOEMPTYREQ: 32,
|
|
191
|
+
NOEVENT: 335, NOEXCEPT: 333, NOEXCTL: 49, NOEXIT: 917, NOEXITTRACE: 363, NOEXTENDEDDS: 406,
|
|
192
|
+
NOFMH: 503, NOFMHPARM: 386, NOFORCE: 1054, NOFORMATEDF: 607, NOFORMFEED: 408, NOHFORM: 410,
|
|
193
|
+
NOHILIGHT: 414, NOHOLD: 164, NOIDNTY: 329, NOINCONVERT: 745, NOISOLATE: 657, NOJVM: 1081,
|
|
194
|
+
NOKATAKANA: 416, NOKEEP: 787, NOLIGHTPEN: 418, NOLOAD: 835, NOLOG: 55, NOLOGREPLICA: 1199,
|
|
195
|
+
NOLOSTLOCKS: 710, NOMDT: 507, NOMSGJRNL: 531, NOMSRCONTROL: 420, NOMTOM: 461, NOMTOMNOXOP: 470,
|
|
196
|
+
NONAUTOCONN: 171, NONCICS: 661, NONCRITICAL: 1090, NONE: 496, NONLE370: 1084, NONRESIDENT: 1202,
|
|
197
|
+
NONTRANS: 572, NOOBFORMAT: 422, NOOBOPERID: 388, NOOTELTRACE: 1258, NOOUTCONVERT: 746,
|
|
198
|
+
NOOUTLINE: 424, NOPARTITIONS: 426, NOPERF: 331, NOPHASEOUT: 1110, NOPRESETSEC: 243,
|
|
199
|
+
NOPRINTADAPT: 428, NOPROGSYMBOL: 430, NOPROP: 1259, NOPRTCOPY: 449, NOPS: 997, NOQUERY: 432,
|
|
200
|
+
NORECOVDATA: 700, NOREENTPROT: 681, NORELEASE: 918, NORELREQ: 443, NOREPLICATOR: 1212,
|
|
195
201
|
NORESRCE: 337, NORESYNC: 934, NORETAINED: 711, NOREUSE: 294, NORMAL: 1016, NORMALBKOUT: 356,
|
|
196
202
|
NORMALRESP: 522, NORMI: 775, NOROLLBACK: 919, NOSECURITY: 196, NOSENDMTOM: 464, NOSHUTDOWN: 289,
|
|
197
203
|
NOSOSI: 435, NOSPI: 694, NOSRVCONVERT: 739, NOSSL: 1031, NOSTSN: 487, NOSWITCH: 285,
|
|
198
204
|
NOSYNCPOINT: 603, NOSYSDUMP: 185, NOSYSLOG: 784, NOTADDABLE: 42, NOTALLOWED: 327,
|
|
199
|
-
NOTALTERABLE: 53, NOTAPPLIC: 1, NOTASKSTART: 608,
|
|
200
|
-
NOTCDEB: 495, NOTCONNECTED: 691, NOTCTRLABLE: 57, NOTDEFINED: 659, NOTDELBLE: 44,
|
|
205
|
+
NOTALTERABLE: 53, NOTAPPLIC: 1, NOTASKSTART: 608, NOTAWARE: 1257, NOTBROWSABLE: 40, NOTBRWBLE: 40,
|
|
206
|
+
NOTBUSY: 613, NOTCDEB: 495, NOTCONNECTED: 691, NOTCTRLABLE: 57, NOTDEFINED: 659, NOTDELBLE: 44,
|
|
201
207
|
NOTDELETABLE: 44, NOTDYNAMIC: 1021, NOTEMPTY: 211, NOTERMINAL: 214, NOTEXTENDED: 1129,
|
|
202
208
|
NOTEXTKYBD: 437, NOTEXTPRINT: 439, NOTFIRED: 1000, NOTFWDRCVBLE: 361, NOTHOTPOOL: 1066,
|
|
203
209
|
NOTINBOUND: 546, NOTINIT: 376, NOTINSTALLED: 551, NOTKEYED: 9, NOTLPA: 166, NOTPENDING: 127,
|
|
204
210
|
NOTPURGEABLE: 161, NOTRANDUMP: 187, NOTREADABLE: 36, NOTREADY: 259, NOTRECOVABLE: 30,
|
|
205
|
-
NOTREQUIRED: 667, NOTRLS: 721, NOTROUTABLE: 1022, NOTSOS: 669, NOTSUPPORTED: 15,
|
|
206
|
-
NOTSUSPENDED: 1027, NOTTABLE: 100, NOTTI: 78, NOTUPDATABLE: 38, NOTUPDBLE: 38,
|
|
207
|
-
NOUCTRAN: 451, NOUSER: 1011, NOVALIDATION: 441, NOVFORM: 412, NOWAIT: 341,
|
|
208
|
-
NOXOPDIRECT: 466, NOXOPSUPPORT: 468, NOZCPTRACE: 365, NRS: 774, OBFORMAT: 421,
|
|
209
|
-
OBTAINING: 96, OFF: 200, OK: 274, OLD: 26, OLDCOPY: 162, OLDSESSION: 486, ON: 201,
|
|
210
|
-
OPENAPI: 1053, OPENERROR: 798, OPENING: 20, OPENINPUT: 256, OPENOUTPUT: 257, OPID: 933,
|
|
211
|
-
OPTIONAL: 326, OPTIONS: 759, OR: 1006,
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
211
|
+
NOTREQUIRED: 667, NOTRLS: 721, NOTROUTABLE: 1022, NOTSHARED: 1238, NOTSOS: 669, NOTSUPPORTED: 15,
|
|
212
|
+
NOTSUSPENDED: 1027, NOTTABLE: 100, NOTTI: 78, NOTUPDATABLE: 38, NOTUPDBLE: 38, NOTUSED: 1248,
|
|
213
|
+
NOTWAIT: 920, NOUCTRAN: 451, NOUSER: 1011, NOVALIDATION: 441, NOVFORM: 412, NOWAIT: 341,
|
|
214
|
+
NOWRITE: 275, NOXOPDIRECT: 466, NOXOPSUPPORT: 468, NOZCPTRACE: 365, NRS: 774, OBFORMAT: 421,
|
|
215
|
+
OBOPERID: 387, OBTAINING: 96, OFF: 200, OK: 274, OLD: 26, OLDCOPY: 162, OLDSESSION: 486, ON: 201,
|
|
216
|
+
OPEN: 18, OPENAPI: 1053, OPENERROR: 798, OPENING: 20, OPENINPUT: 256, OPENOUTPUT: 257, OPID: 933,
|
|
217
|
+
OPTIONAL: 326, OPTIONS: 759, OR: 1006, OSGI: 1221, OTELTRACE: 1263, OTS: 1107, OUTLINE: 423,
|
|
218
|
+
OUTPUT: 227, OUTSERVICE: 74, OVERRIDE: 1236, OWNER: 753, PAGEABLE: 79, PARTITIONS: 425,
|
|
219
|
+
PARTITIONSET: 156, PARTNER: 1182, PATCH: 1220, PATH: 11, PAUSED: 1233, PDSMEMBER: 1035,
|
|
220
|
+
PENDBEGIN: 558, PENDDATA: 560, PENDFREE: 86, PENDING: 126, PENDINIT: 1113, PENDPASS: 565,
|
|
221
|
+
PENDRECEIVE: 87, PENDRELEASE: 562, PENDRESOLVE: 1114, PENDSTART: 561, PENDSTSN: 557,
|
|
222
|
+
PENDUNSOL: 564, PERF: 330, PERMANENT: 484, PHASEIN: 168, PHASEOUT: 1111, PHYSICAL: 215,
|
|
223
|
+
PIPELINE: 1124, PL1: 152, PLI: 152, POLICY: 1243, POLICYRULE: 1244, POLICYSCOPE: 994, POOL: 922,
|
|
224
|
+
POSITIVE: 529, POST: 636, POSTCOMMAND: 697, PRECOMMAND: 696, PRESETSEC: 242, PRIMARY: 110,
|
|
225
|
+
PRINCIPAL: 199, PRINTADAPT: 427, PRIVATE: 174, PROCESS: 1010, PROCESSTYPE: 1190, PROFILE: 157,
|
|
226
|
+
PROGAUTO: 1072, PROGRAM: 154, PROGRAMDEF: 1178, PROGRAMINIT: 698, PROGSYMBOL: 429, PROPONLY: 1260,
|
|
227
|
+
PROTECTED: 504, PROVIDER: 1041, PRTCOPY: 448, PUBLISH: 1085, PURGE: 236, PURGEABLE: 160, PUT: 749,
|
|
228
|
+
QR: 1057, QUASIRENT: 1050, QUEUE: 814, QUIESCED: 707, QUIESCING: 708, READABLE: 35, READBACK: 209,
|
|
229
|
+
READONLY: 275, READY: 258, REBUILD: 923, RECEIVE: 88, RECEIVER: 1046, RECONNECT: 924,
|
|
230
|
+
RECOVDATA: 701, RECOVERABLE: 29, RECOVERED: 277, RECOVERLOCKS: 712, RECOVERY: 1156,
|
|
231
|
+
REENTPROT: 680, REFPARMS: 858, REFRESH: 1227, REFRESHPKGS: 1225, REGERROR: 677, REGION: 575,
|
|
232
|
+
REGISTERED: 670, REJECT: 815, RELATED: 675, RELEASE: 563, RELEASED: 70, RELEASING: 549,
|
|
233
|
+
RELOAD: 1078, RELOADING: 1079, RELREQ: 442, REMLOSTLOCKS: 713, REMOTE: 4, REMOVE: 276,
|
|
234
|
+
REMSESSION: 740, REMTABLE: 103, REPEATABLE: 724, REPLICATOR: 1211, REPLYTOEPR: 852,
|
|
235
|
+
REQCONTEXT: 854, REQUEST: 249, REQUESTER: 1042, REQUESTMODEL: 1157, REQUIRED: 666, REREAD: 812,
|
|
236
|
+
RESET: 290, RESETLOCKS: 714, RESIDENT: 1201, RESOLVED: 347, RESOLVING: 1115, RESPCONTEXT: 855,
|
|
229
237
|
RESPECTED: 1109, RESRCE: 336, RESSECEXT: 204, RESSECINT: 203, RESSECNO: 202, RESSECYES: 204,
|
|
230
|
-
RESYNC: 702, RETAINED: 715, RETRACT: 1086, RETRY: 716, REUSE: 293, REVERTED: 264,
|
|
231
|
-
RFC3339: 647, RLS: 720, RLSACTIVE: 730, RLSGONE: 799, RLSINACTIVE: 731,
|
|
232
|
-
ROLLBACK: 89, ROUTABLE: 1023, ROUTE: 638, RPG: 153, RRCOMMITFAIL: 830,
|
|
233
|
-
RRMS: 1063, RRSUR: 939, RTR: 527, RU: 494, RUNNING: 229,
|
|
234
|
-
|
|
235
|
-
|
|
238
|
+
RESUMED: 1234, RESYNC: 702, RETAINED: 715, RETRACT: 1086, RETRY: 716, REUSE: 293, REVERTED: 264,
|
|
239
|
+
RFC1123: 646, RFC3339: 647, RLS: 720, RLSACTIVE: 730, RLSGONE: 799, RLSINACTIVE: 731,
|
|
240
|
+
RLSSERVER: 761, RMI: 771, ROLLBACK: 89, ROUTABLE: 1023, ROUTE: 638, RPG: 153, RRCOMMITFAIL: 830,
|
|
241
|
+
RRDS: 7, RREPL: 1210, RRINDOUBT: 831, RRMS: 1063, RRSUR: 939, RTR: 527, RU: 494, RUNNING: 229,
|
|
242
|
+
RZINSTOR: 940, SAMESENDMTOM: 462, SCAN: 1088, SCHEDULER: 941, SCS: 614, SECERROR: 1214,
|
|
243
|
+
SECONDINIT: 626, SECURITY: 1216, SECUSER: 1060, SEND: 90, SENDER: 1045, SENDMTOM: 463,
|
|
244
|
+
SERVER: 1123, SERVERDUMP: 1226, SERVICE: 475, SESSION: 372, SESSIONFAIL: 517, SESSIONLOST: 516,
|
|
236
245
|
SESSIONS: 1187, SETFAIL: 514, SHARE: 27, SHARED: 173, SHUNTED: 762, SHUTDISABLED: 645,
|
|
237
246
|
SHUTDOWN: 288, SHUTENABLED: 644, SIGN: 925, SIGNEDOFF: 245, SIGNEDON: 244, SINGLEOFF: 324,
|
|
238
|
-
SINGLEON: 323, SKIP: 810, SMF: 255, SNPS: 998, SOAP: 1044, SOCKET: 942,
|
|
239
|
-
SOSABOVE: 683, SOSBELOW: 682, SOSI: 434, SPECIAL: 98, SPECIFIC: 652,
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
247
|
+
SINGLEON: 323, SKIP: 810, SMF: 255, SNAPTRACE: 1230, SNPS: 998, SOAP: 1044, SOCKET: 942,
|
|
248
|
+
SOMEAVAIL: 1204, SOS: 668, SOSABOVE: 683, SOSBELOW: 682, SOSI: 434, SPECIAL: 98, SPECIFIC: 652,
|
|
249
|
+
SPECTRACE: 177, SPI: 693, SPRSTRACE: 175, SQLCODE: 926, SRRACTIVE: 1250, SRRINACTIVE: 1251,
|
|
250
|
+
SRVCONVERT: 738, SSL: 1030, STACKTRACE: 1237, STANDARD: 97, STANDBY: 629, STANTRACE: 176,
|
|
251
|
+
START: 635, STARTED: 609, STARTING: 772, STARTSWITH: 868, STARTTERM: 943, STARTUP: 180,
|
|
252
|
+
STATIC: 179, STATS: 1158, STOPPED: 610, STOPPING: 348, STORAGE: 1159, STREAMNAME: 1160, STSN: 509,
|
|
253
|
+
STSNSET: 488, STSNTEST: 489, SUBORDINATE: 773, SUBPOOL: 1161, SUBSPACE: 663, SUMMUNLIKE: 566,
|
|
254
|
+
SUPPORTED: 1106, SURROGATE: 371, SUSPENDED: 231, SWITCH: 188, SWITCHALL: 287, SWITCHING: 225,
|
|
255
|
+
SWITCHNEXT: 286, SYNCFREE: 91, SYNCHRONOUS: 571, SYNCPOINT: 602, SYNCRECEIVE: 92, SYNCRECV: 92,
|
|
256
|
+
SYNCSEND: 93, SYSCONNECT: 653, SYSDUMP: 184, SYSDUMPCODE: 1162, SYSLOG: 785, SYSPLEX: 656,
|
|
257
|
+
SYSTEM: 643, SYSTEMOFF: 320, SYSTEMON: 319, T3278M2: 533, T3278M3: 534, T3278M4: 535,
|
|
258
|
+
T3278M5: 536, T3279M2: 537, T3279M3: 538, T3279M4: 539, T3279M5: 540, TABLE: 847, TABLEMGR: 1163,
|
|
259
|
+
TABLEONLY: 1219, TAKEOVER: 111, TAPE1: 250, TAPE2: 251, TASK: 233, TASKEND: 1264, TASKSTART: 611,
|
|
250
260
|
TASKSUBPOOL: 1164, TCAM: 64, TCAMSNA: 65, TCEXITALL: 366, TCEXITALLOFF: 369, TCEXITNONE: 368,
|
|
251
261
|
TCEXITSYSTEM: 367, TCLASS: 239, TCPIP: 802, TCPIPSERVICE: 1166, TDQ: 767, TDQUEUE: 767,
|
|
252
262
|
TEMPLATENAME: 1168, TEMPORARY: 483, TERM: 234, TERMINAL: 213, TERMINATE: 1077, TEXTKYBD: 436,
|
|
253
263
|
TEXTPRINT: 438, THIRDINIT: 627, THREADSAFE: 1051, TIME: 240, TIMEOUT: 511, TIMER: 1004,
|
|
254
264
|
TOEPR: 851, TPOOL: 932, TPS55M2: 552, TPS55M3: 553, TPS55M4: 554, TPS55M5: 555, TRACE: 760,
|
|
255
|
-
TRANCLASS: 1169, TRANDATA: 944, TRANDUMP: 186, TRANDUMPCODE: 1170, TRANIDONLY: 452,
|
|
256
|
-
TRANSACTION: 1171, TRANSTART: 580, TSMODEL: 1183, TSQ: 768, TSQUEUE: 768, TTI: 77,
|
|
257
|
-
TX: 929, TXID: 928, TYPETERM: 1186, UCTRAN: 450, UKOPEN: 1056, UNATTEMPTED: 820,
|
|
258
|
-
UNBLOCKED: 17, UNCOMMITTED: 722, UNCONNECTED: 703, UNDEFINED: 14,
|
|
259
|
-
UNENABLED: 33, UNENABLING: 34, UNEXPECTED: 1015, UNEXPIRED: 1018,
|
|
260
|
-
|
|
261
|
-
UNUSABLE: 1117, UOW: 246, UPDATABLE: 37, UPDATING: 1049,
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
265
|
+
TRAN: 1235, TRANCLASS: 1169, TRANDATA: 944, TRANDUMP: 186, TRANDUMPCODE: 1170, TRANIDONLY: 452,
|
|
266
|
+
TRANS: 573, TRANSACTION: 1171, TRANSTART: 580, TSMODEL: 1183, TSQ: 768, TSQUEUE: 768, TTI: 77,
|
|
267
|
+
TWAIT: 927, TX: 929, TXID: 928, TYPETERM: 1186, UCTRAN: 450, UKOPEN: 1056, UNATTEMPTED: 820,
|
|
268
|
+
UNAVAILABLE: 672, UNBLOCKED: 17, UNCOMMITTED: 722, UNCONNECTED: 703, UNDEFINED: 14,
|
|
269
|
+
UNDETERMINED: 355, UNENABLED: 33, UNENABLING: 34, UNEXPECTED: 1015, UNEXPIRED: 1018,
|
|
270
|
+
UNINSTALLED: 548, UNKNOWN: 774, UNPROTECTED: 505, UNQUIESCED: 709, UNREGISTERED: 671,
|
|
271
|
+
UNRESOLVED: 1116, UNSOLDATA: 521, UNUSABLE: 1117, UOW: 246, UPDATABLE: 37, UPDATING: 1049,
|
|
272
|
+
URIMAP: 1173, URMTERMID: 1121, USED: 1249, USER: 642, USERDATAKEY: 380, USEREXECKEY: 382,
|
|
273
|
+
USERID: 930, USEROFF: 322, USERON: 321, USERTABLE: 102, UTC: 1203, VALID: 360, VALIDATEWARN: 1266,
|
|
274
|
+
VALIDATEYES: 1265, VALIDATION: 440, VARIABLE: 13, VERIFY: 1099, VFORM: 411, VRRDS: 732, VSAM: 3,
|
|
275
|
+
VTAM: 60, WAIT: 340, WAITCOMMIT: 763, WAITER: 754, WAITFORGET: 622, WAITING: 765, WAITRMI: 766,
|
|
276
|
+
WAITRRMS: 1063, WARMSTART: 267, WBE: 585, WEB: 945, WEBSERVICE: 1174, WIN: 545, WLMHEALTH: 1246,
|
|
277
|
+
WMQ: 578, WRITE: 1255, XCF: 665, XM: 123, XMLTRANSFORM: 1194, XMRUNTRAN: 946, XNOTDONE: 144,
|
|
278
|
+
XOK: 143, XOPDIRECT: 465, XOPSUPPORT: 467, XPLINK: 1068, ZCPTRACE: 364,
|
|
268
279
|
};
|
|
269
280
|
|
|
270
281
|
export const DFHAID_NAMES = `
|
package/lib/control.mjs
CHANGED
|
@@ -574,7 +574,7 @@ export function buildControl(prog, resolve, { extra = null } = {}) {
|
|
|
574
574
|
const body = n.k === 'perform' ? add('call', { st: n.st, range: rangeOf(n.target, n.thru), succ: [step] }) : lowerList(n.body, step, loopCtx);
|
|
575
575
|
nodes[t].succ = [outcome(t, true, next), outcome(t, false, body)];
|
|
576
576
|
nodes[head].succ = [n.testAfter ? body : t];
|
|
577
|
-
if (n.st.loops) loopHeads.push({ head, step, loops: n.st.loops });
|
|
577
|
+
if (n.st.loops) loopHeads.push({ head, step, loops: n.st.loops, test: t, testAfter: n.testAfter, body: n.k === 'inline' ? n.body : null });
|
|
578
578
|
return head;
|
|
579
579
|
}
|
|
580
580
|
case 'goto': {
|
|
@@ -1486,6 +1486,118 @@ export function buildControl(prog, resolve, { extra = null } = {}) {
|
|
|
1486
1486
|
// so the pair is joined at whichever of the two checks comes last.
|
|
1487
1487
|
const outcomeAt = new Map();
|
|
1488
1488
|
for (const node of nodes) if (node.kind === 'outcome') outcomeAt.set(`${node.test}|${node.value}`, node);
|
|
1489
|
+
// A backward scan for the last byte past the spaces, VARYING I FROM the field's length BY -1 UNTIL
|
|
1490
|
+
// I < 1 OR F(I:1) > SPACE, leaves I from 1 to that length where F > SPACES held as it began: a
|
|
1491
|
+
// field that compares above spaces has a byte above a space, under any collating sequence, and the
|
|
1492
|
+
// scan meets it before 0. The witness dies with a write to F or to anything its subscript reads.
|
|
1493
|
+
const keptOnStep = new Map();
|
|
1494
|
+
const isSpaces = (toks) => toks.length === 1 && (WORD(toks[0], 'SPACE') || WORD(toks[0], 'SPACES') || (toks[0].t === 'lit' && !toks[0].prefix && /^ +$/.test(String(toks[0].v))));
|
|
1495
|
+
const textOf = (toks) => toks.map((t) => (t.t === 'word' ? t.u : String(t.v))).join(' ');
|
|
1496
|
+
// A whole alphanumeric item or table element, with the fields its subscript reads.
|
|
1497
|
+
const scanned = (toks) => {
|
|
1498
|
+
const base = toks[0] && toks[0].t === 'word' ? resolve(toks[0]) : null;
|
|
1499
|
+
if (!base || base.index || base.level === 88 || base.size == null || categoryOf(base)?.k !== 'A' || variableLength(base)) return null;
|
|
1500
|
+
let i = 1;
|
|
1501
|
+
while (i + 1 < toks.length && (WORD(toks[i], 'OF') || WORD(toks[i], 'IN')) && toks[i + 1].t === 'word') i += 2;
|
|
1502
|
+
const reads = [];
|
|
1503
|
+
if (i < toks.length) {
|
|
1504
|
+
if (toks[i].v !== '(' || toks[toks.length - 1].v !== ')') return null;
|
|
1505
|
+
let depth = 0;
|
|
1506
|
+
for (let j = i; j < toks.length; j++) {
|
|
1507
|
+
const t = toks[j];
|
|
1508
|
+
if (t.v === ':') return null;
|
|
1509
|
+
if (t.v === '(' || t.v === ')') { depth += t.v === '(' ? 1 : -1; if (!depth && j < toks.length - 1) return null; continue; }
|
|
1510
|
+
const f = t.t === 'word' ? resolve(t) : null;
|
|
1511
|
+
if (f) reads.push(f.level === 88 && f.parent ? f.parent : f);
|
|
1512
|
+
}
|
|
1513
|
+
}
|
|
1514
|
+
return { base, reads };
|
|
1515
|
+
};
|
|
1516
|
+
// What an outcome says is above spaces (`above`) or only not all spaces.
|
|
1517
|
+
const notBlank = (tree, outcome, out = []) => {
|
|
1518
|
+
if (tree.k === 'not') return notBlank(tree.a, !outcome, out);
|
|
1519
|
+
if ((tree.k === 'and' && outcome) || (tree.k === 'or' && !outcome)) { notBlank(tree.a, outcome, out); notBlank(tree.b, outcome, out); return out; }
|
|
1520
|
+
if (tree.k !== 'rel') return out;
|
|
1521
|
+
const op = outcome ? tree.op : NEGATE[tree.op];
|
|
1522
|
+
if (isSpaces(tree.right) && (op === '>' || op === '<>')) out.push({ toks: tree.left, above: op === '>' });
|
|
1523
|
+
else if (isSpaces(tree.left) && (op === '<' || op === '<>')) out.push({ toks: tree.right, above: op === '<' });
|
|
1524
|
+
return out;
|
|
1525
|
+
};
|
|
1526
|
+
const scans = [];
|
|
1527
|
+
for (const { head, step, test, testAfter, body, loops } of loopHeads) {
|
|
1528
|
+
if (testAfter || !body || loops.length !== 1 || !body.every((el) => el.k === 'stmt' && el.st.verb === 'CONTINUE')) continue;
|
|
1529
|
+
const loop = loops[0];
|
|
1530
|
+
const counter = loop.counter ? resolve(loop.counter) : null;
|
|
1531
|
+
const cap = intCap(counter);
|
|
1532
|
+
const tree = nodes[test].tree;
|
|
1533
|
+
if (cap == null || !tree || tree.k !== 'or' || !loop.by || loop.by.map((t) => t.v).join('') !== '-1') continue;
|
|
1534
|
+
const from = loop.from || [];
|
|
1535
|
+
let start = numberOf(constValue(from));
|
|
1536
|
+
if (start == null && WORD(from[0], 'LENGTH') && WORD(from[1], 'OF')) start = scanned(from.slice(2))?.base.size ?? null;
|
|
1537
|
+
if (start == null || !Number.isInteger(start) || start < 1 || start > cap) continue;
|
|
1538
|
+
const isCounter = (toks) => toks.length === 1 && toks[0].t === 'word' && resolve(toks[0]) === counter;
|
|
1539
|
+
const done = (r) => r.k === 'rel' && isCounter(r.left) && (r.op === '<' ? numberOf(constValue(r.right)) === 1 : (r.op === '<=' || r.op === '=') && numberOf(constValue(r.right)) === 0);
|
|
1540
|
+
const probe = (r) => {
|
|
1541
|
+
if (r.k !== 'rel') return null;
|
|
1542
|
+
const [el, op] = isSpaces(r.right) ? [r.left, r.op] : isSpaces(r.left) ? [r.right, FLIP[r.op]] : [null, null];
|
|
1543
|
+
if (!el || (op !== '>' && op !== '<>') || el.length < 6) return null;
|
|
1544
|
+
const tail = el.slice(-5);
|
|
1545
|
+
if (tail[0].v !== '(' || !isCounter([tail[1]]) || tail[2].v !== ':' || numberOf(constValue([tail[3]])) !== 1 || tail[4].v !== ')') return null;
|
|
1546
|
+
const toks = el.slice(0, -5);
|
|
1547
|
+
const s = scanned(toks);
|
|
1548
|
+
return s && s.base.size === start ? { toks, above: op === '>' } : null;
|
|
1549
|
+
};
|
|
1550
|
+
const p = done(tree.a) ? probe(tree.b) : done(tree.b) ? probe(tree.a) : null;
|
|
1551
|
+
const exit = p && outcomeAt.get(`${test}|true`);
|
|
1552
|
+
if (exit) scans.push({ ...p, counter, start, exit, head, step, at: loop.counter });
|
|
1553
|
+
}
|
|
1554
|
+
// The scan's counter never passes its start: the step runs only once I < 1 has failed, so it
|
|
1555
|
+
// cannot wrap, and the body writes nothing.
|
|
1556
|
+
for (const s of scans) {
|
|
1557
|
+
const key = fieldKey(s.counter);
|
|
1558
|
+
noteField(key, s.counter);
|
|
1559
|
+
const h = { id: checks.length, key, field: s.counter, file: s.at.file, line: s.at.line, tCons: { hi: s.start, hiInc: true }, fCons: null, restricts: false, x: null, t: nFacts++, f: null };
|
|
1560
|
+
checks.push(h);
|
|
1561
|
+
nodes[s.head].genStmt = [...(nodes[s.head].genStmt || []), h.t];
|
|
1562
|
+
keptOnStep.set(s.step, [...(keptOnStep.get(s.step) || []), h.t]);
|
|
1563
|
+
}
|
|
1564
|
+
if (scans.length) {
|
|
1565
|
+
const witness = new Map();
|
|
1566
|
+
const bitFor = (toks, above) => {
|
|
1567
|
+
const k = `${above ? '>' : '<>'}|${textOf(toks)}`;
|
|
1568
|
+
if (witness.has(k)) return witness.get(k);
|
|
1569
|
+
const s = scanned(toks);
|
|
1570
|
+
const bit = nFacts++;
|
|
1571
|
+
for (const f of [s.base, ...s.reads]) {
|
|
1572
|
+
const key = fieldKey(f);
|
|
1573
|
+
noteField(key, f);
|
|
1574
|
+
checks.push({ pseudo: true, key, field: f, x: null, t: bit, f: null });
|
|
1575
|
+
}
|
|
1576
|
+
witness.set(k, bit);
|
|
1577
|
+
return bit;
|
|
1578
|
+
};
|
|
1579
|
+
const wanted = new Set(scans.map((s) => textOf(s.toks)));
|
|
1580
|
+
for (const id of tests) {
|
|
1581
|
+
const n = nodes[id];
|
|
1582
|
+
if (!n.tree) continue;
|
|
1583
|
+
for (const outcome of [true, false]) {
|
|
1584
|
+
for (const nb of notBlank(n.tree, outcome)) {
|
|
1585
|
+
if (!wanted.has(textOf(nb.toks)) || !scanned(nb.toks)) continue;
|
|
1586
|
+
n.gen[String(outcome)].push(bitFor(nb.toks, false));
|
|
1587
|
+
if (nb.above) n.gen[String(outcome)].push(bitFor(nb.toks, true));
|
|
1588
|
+
}
|
|
1589
|
+
}
|
|
1590
|
+
}
|
|
1591
|
+
for (const s of scans) {
|
|
1592
|
+
const bit = witness.get(`${s.above ? '>' : '<>'}|${textOf(s.toks)}`);
|
|
1593
|
+
if (bit == null) continue;
|
|
1594
|
+
const key = fieldKey(s.counter);
|
|
1595
|
+
noteField(key, s.counter);
|
|
1596
|
+
const y = { id: checks.length, key, field: s.counter, file: s.at.file, line: s.at.line, tCons: { numeric: true, lo: 1, loInc: true, hi: s.start, hiInc: true }, fCons: null, restricts: false, x: null, t: nFacts++, f: null, bounds: { lo: 1, hi: s.start } };
|
|
1597
|
+
checks.push(y);
|
|
1598
|
+
(s.exit.implies ||= []).push([bit, y.t]);
|
|
1599
|
+
}
|
|
1600
|
+
}
|
|
1489
1601
|
const MAX_BOUNDS_PER_RELATION = 8;
|
|
1490
1602
|
for (const c of [...checks]) {
|
|
1491
1603
|
if (c.pseudo || c.test == null) continue;
|
|
@@ -2049,6 +2161,11 @@ export function buildControl(prog, resolve, { extra = null } = {}) {
|
|
|
2049
2161
|
} else if (n.kind === 'step' && stepped.has(id)) {
|
|
2050
2162
|
keepAcross(n, [{ ...stepped.get(id), sizeError: false }]);
|
|
2051
2163
|
}
|
|
2164
|
+
if (n.kind === 'step' && keptOnStep.has(id)) {
|
|
2165
|
+
const bits = new Uint32Array(words);
|
|
2166
|
+
for (const b of keptOnStep.get(id)) bits[b >>> 5] |= 1 << (b & 31);
|
|
2167
|
+
(n.keeps ||= []).push({ bits, guards: null });
|
|
2168
|
+
}
|
|
2052
2169
|
});
|
|
2053
2170
|
|
|
2054
2171
|
// ---- must-analysis ----
|