@miguelduran14/knowflow 0.1.1
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/LICENSE +201 -0
- package/README.md +182 -0
- package/dist/advisories.d.ts +16 -0
- package/dist/advisories.js +364 -0
- package/dist/advisories.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +104 -0
- package/dist/cli.js.map +1 -0
- package/dist/copy-resolver.d.ts +22 -0
- package/dist/copy-resolver.js +74 -0
- package/dist/copy-resolver.js.map +1 -0
- package/dist/dataflow.d.ts +2 -0
- package/dist/dataflow.js +88 -0
- package/dist/dataflow.js.map +1 -0
- package/dist/dossier.d.ts +20 -0
- package/dist/dossier.js +331 -0
- package/dist/dossier.js.map +1 -0
- package/dist/explain/claude.d.ts +14 -0
- package/dist/explain/claude.js +91 -0
- package/dist/explain/claude.js.map +1 -0
- package/dist/explain/explain.d.ts +72 -0
- package/dist/explain/explain.js +126 -0
- package/dist/explain/explain.js.map +1 -0
- package/dist/explain/facts.d.ts +23 -0
- package/dist/explain/facts.js +266 -0
- package/dist/explain/facts.js.map +1 -0
- package/dist/explain/fake.d.ts +14 -0
- package/dist/explain/fake.js +27 -0
- package/dist/explain/fake.js.map +1 -0
- package/dist/explain/openai.d.ts +42 -0
- package/dist/explain/openai.js +102 -0
- package/dist/explain/openai.js.map +1 -0
- package/dist/explain/provider.d.ts +19 -0
- package/dist/explain/provider.js +2 -0
- package/dist/explain/provider.js.map +1 -0
- package/dist/explain/sse.d.ts +10 -0
- package/dist/explain/sse.js +44 -0
- package/dist/explain/sse.js.map +1 -0
- package/dist/flow-parser.d.ts +10 -0
- package/dist/flow-parser.js +503 -0
- package/dist/flow-parser.js.map +1 -0
- package/dist/glossary.d.ts +54 -0
- package/dist/glossary.js +340 -0
- package/dist/glossary.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/inventory.d.ts +7 -0
- package/dist/inventory.js +453 -0
- package/dist/inventory.js.map +1 -0
- package/dist/lines.d.ts +15 -0
- package/dist/lines.js +53 -0
- package/dist/lines.js.map +1 -0
- package/dist/linker.d.ts +17 -0
- package/dist/linker.js +56 -0
- package/dist/linker.js.map +1 -0
- package/dist/mermaid.d.ts +27 -0
- package/dist/mermaid.js +133 -0
- package/dist/mermaid.js.map +1 -0
- package/dist/parser.d.ts +19 -0
- package/dist/parser.js +442 -0
- package/dist/parser.js.map +1 -0
- package/dist/pic.d.ts +29 -0
- package/dist/pic.js +197 -0
- package/dist/pic.js.map +1 -0
- package/dist/references.d.ts +24 -0
- package/dist/references.js +906 -0
- package/dist/references.js.map +1 -0
- package/dist/source-lines.d.ts +56 -0
- package/dist/source-lines.js +114 -0
- package/dist/source-lines.js.map +1 -0
- package/dist/types.d.ts +499 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/gui/dist/assets/ChainCanvas-C37KyhnE.js +1 -0
- package/gui/dist/assets/FlowCanvas-BRklWBCp.js +3 -0
- package/gui/dist/assets/RobotProfessor-BtTDTBDq.js +4220 -0
- package/gui/dist/assets/fira-code-cyrillic-400-normal-UC0NFL4U.woff2 +0 -0
- package/gui/dist/assets/fira-code-cyrillic-400-normal-dc1q3VD7.woff +0 -0
- package/gui/dist/assets/fira-code-cyrillic-500-normal-Bu7VCL72.woff +0 -0
- package/gui/dist/assets/fira-code-cyrillic-500-normal-CX35h3Mg.woff2 +0 -0
- package/gui/dist/assets/fira-code-cyrillic-600-normal-BD56RyRT.woff +0 -0
- package/gui/dist/assets/fira-code-cyrillic-600-normal-CPRdbepc.woff2 +0 -0
- package/gui/dist/assets/fira-code-cyrillic-ext-400-normal-Buh61xzB.woff +0 -0
- package/gui/dist/assets/fira-code-cyrillic-ext-400-normal-txZ9Fk_1.woff2 +0 -0
- package/gui/dist/assets/fira-code-cyrillic-ext-500-normal-CYRspHgm.woff2 +0 -0
- package/gui/dist/assets/fira-code-cyrillic-ext-500-normal-CwtLmSFD.woff +0 -0
- package/gui/dist/assets/fira-code-cyrillic-ext-600-normal-B9wE0zmr.woff2 +0 -0
- package/gui/dist/assets/fira-code-cyrillic-ext-600-normal-DldcyWhZ.woff +0 -0
- package/gui/dist/assets/fira-code-greek-400-normal-B2Gh_Y8s.woff2 +0 -0
- package/gui/dist/assets/fira-code-greek-400-normal-DobhaxvF.woff +0 -0
- package/gui/dist/assets/fira-code-greek-500-normal-CVO0IRNt.woff2 +0 -0
- package/gui/dist/assets/fira-code-greek-500-normal-DEXIWiey.woff +0 -0
- package/gui/dist/assets/fira-code-greek-600-normal-D_h3X2X5.woff +0 -0
- package/gui/dist/assets/fira-code-greek-600-normal-Dxp52_By.woff2 +0 -0
- package/gui/dist/assets/fira-code-greek-ext-400-normal-DR7mBgIM.woff2 +0 -0
- package/gui/dist/assets/fira-code-greek-ext-400-normal-DSPUheWg.woff +0 -0
- package/gui/dist/assets/fira-code-greek-ext-500-normal-BO3iq16n.woff2 +0 -0
- package/gui/dist/assets/fira-code-greek-ext-500-normal-CMiNLXER.woff +0 -0
- package/gui/dist/assets/fira-code-greek-ext-600-normal-C-cQDoOk.woff +0 -0
- package/gui/dist/assets/fira-code-greek-ext-600-normal-DtBpFRLc.woff2 +0 -0
- package/gui/dist/assets/fira-code-latin-400-normal-C-QZfXAs.woff +0 -0
- package/gui/dist/assets/fira-code-latin-400-normal-DGosTW8U.woff2 +0 -0
- package/gui/dist/assets/fira-code-latin-500-normal-B6gioGu8.woff2 +0 -0
- package/gui/dist/assets/fira-code-latin-500-normal-aMLC2AMm.woff +0 -0
- package/gui/dist/assets/fira-code-latin-600-normal-BmSSHshu.woff +0 -0
- package/gui/dist/assets/fira-code-latin-600-normal-CvYZpPHg.woff2 +0 -0
- package/gui/dist/assets/fira-code-latin-ext-400-normal-DG73JjOf.woff +0 -0
- package/gui/dist/assets/fira-code-latin-ext-400-normal-KSMg0QLl.woff2 +0 -0
- package/gui/dist/assets/fira-code-latin-ext-500-normal-CaANqXjI.woff +0 -0
- package/gui/dist/assets/fira-code-latin-ext-500-normal-Crd9e_oI.woff2 +0 -0
- package/gui/dist/assets/fira-code-latin-ext-600-normal-0PFQL1eg.woff +0 -0
- package/gui/dist/assets/fira-code-latin-ext-600-normal-Cb7jxoAi.woff2 +0 -0
- package/gui/dist/assets/fira-code-symbols2-400-normal-_QEZCEwe.woff +0 -0
- package/gui/dist/assets/fira-code-symbols2-500-normal-DwsgbIjQ.woff +0 -0
- package/gui/dist/assets/fira-code-symbols2-600-normal-Dvq6IQE5.woff +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-300-normal-BO7tmGom.woff2 +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-300-normal-BtNmWoqn.woff +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-400-normal-CKu2TFQr.woff2 +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-400-normal-D9eUeF-O.woff +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-500-normal-CXfldnQ8.woff2 +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-500-normal-Daski1k2.woff +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-600-normal-CJ5P9t7t.woff +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-600-normal-JSBvCpTs.woff2 +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-700-normal-Bl-HczEO.woff2 +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-700-normal-KyW5QH4H.woff +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-ext-300-normal-BRn8Tsce.woff2 +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-ext-300-normal-DOtRq9zH.woff +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-ext-400-normal-Cycyekte.woff2 +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-ext-400-normal-Dd5dApAy.woff +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-ext-500-normal-Cixivk4R.woff +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-ext-500-normal-Dkk5LlrU.woff2 +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-ext-600-normal-BKgjRriM.woff +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-ext-600-normal-CE6oUZE1.woff2 +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-ext-700-normal-BfO9TR-w.woff2 +0 -0
- package/gui/dist/assets/fira-sans-cyrillic-ext-700-normal-Gcpdxicj.woff +0 -0
- package/gui/dist/assets/fira-sans-greek-300-normal-D3JfF3y9.woff2 +0 -0
- package/gui/dist/assets/fira-sans-greek-300-normal-DSgcXl_1.woff +0 -0
- package/gui/dist/assets/fira-sans-greek-400-normal-BFCFncbp.woff2 +0 -0
- package/gui/dist/assets/fira-sans-greek-400-normal-DQ8sF22y.woff +0 -0
- package/gui/dist/assets/fira-sans-greek-500-normal-C9KT8sAy.woff +0 -0
- package/gui/dist/assets/fira-sans-greek-500-normal-Cy-TUuxE.woff2 +0 -0
- package/gui/dist/assets/fira-sans-greek-600-normal-BlqpLOpF.woff2 +0 -0
- package/gui/dist/assets/fira-sans-greek-600-normal-DfHu91YF.woff +0 -0
- package/gui/dist/assets/fira-sans-greek-700-normal-BVfcrbV7.woff2 +0 -0
- package/gui/dist/assets/fira-sans-greek-700-normal-CJu31rC4.woff +0 -0
- package/gui/dist/assets/fira-sans-greek-ext-300-normal-CodlqOxk.woff +0 -0
- package/gui/dist/assets/fira-sans-greek-ext-300-normal-DVDwbKuK.woff2 +0 -0
- package/gui/dist/assets/fira-sans-greek-ext-400-normal-ByG7UNQ2.woff2 +0 -0
- package/gui/dist/assets/fira-sans-greek-ext-400-normal-ClCfNE6D.woff +0 -0
- package/gui/dist/assets/fira-sans-greek-ext-500-normal-Bem4H9fH.woff +0 -0
- package/gui/dist/assets/fira-sans-greek-ext-500-normal-nq-cjB3m.woff2 +0 -0
- package/gui/dist/assets/fira-sans-greek-ext-600-normal-DPxZoeHL.woff +0 -0
- package/gui/dist/assets/fira-sans-greek-ext-600-normal-fS0evUH3.woff2 +0 -0
- package/gui/dist/assets/fira-sans-greek-ext-700-normal-C1m6bE4Q.woff2 +0 -0
- package/gui/dist/assets/fira-sans-greek-ext-700-normal-C8J5qYMq.woff +0 -0
- package/gui/dist/assets/fira-sans-latin-300-normal-B2LrTgQS.woff2 +0 -0
- package/gui/dist/assets/fira-sans-latin-300-normal-Dwkm-oZ7.woff +0 -0
- package/gui/dist/assets/fira-sans-latin-400-normal-66xCkunx.woff +0 -0
- package/gui/dist/assets/fira-sans-latin-400-normal-a0AnQzuD.woff2 +0 -0
- package/gui/dist/assets/fira-sans-latin-500-normal-Bkfzcwmr.woff +0 -0
- package/gui/dist/assets/fira-sans-latin-500-normal-Bvbxc8ch.woff2 +0 -0
- package/gui/dist/assets/fira-sans-latin-600-normal-CXKlxLG9.woff2 +0 -0
- package/gui/dist/assets/fira-sans-latin-600-normal-DtSgd811.woff +0 -0
- package/gui/dist/assets/fira-sans-latin-700-normal-CRhwpWTq.woff2 +0 -0
- package/gui/dist/assets/fira-sans-latin-700-normal-DgqLm3Fi.woff +0 -0
- package/gui/dist/assets/fira-sans-latin-ext-300-normal-CAROBYR0.woff +0 -0
- package/gui/dist/assets/fira-sans-latin-ext-300-normal-GNF4Ac3G.woff2 +0 -0
- package/gui/dist/assets/fira-sans-latin-ext-400-normal-BCUwhuGB.woff +0 -0
- package/gui/dist/assets/fira-sans-latin-ext-400-normal-BLG_mAEf.woff2 +0 -0
- package/gui/dist/assets/fira-sans-latin-ext-500-normal-CFRf4jcC.woff +0 -0
- package/gui/dist/assets/fira-sans-latin-ext-500-normal-OO1QnNpY.woff2 +0 -0
- package/gui/dist/assets/fira-sans-latin-ext-600-normal-DLMQsaV4.woff +0 -0
- package/gui/dist/assets/fira-sans-latin-ext-600-normal-DTQBTt1m.woff2 +0 -0
- package/gui/dist/assets/fira-sans-latin-ext-700-normal-cfTxGFzJ.woff +0 -0
- package/gui/dist/assets/fira-sans-latin-ext-700-normal-g2Yrd4J5.woff2 +0 -0
- package/gui/dist/assets/fira-sans-vietnamese-300-normal-BO7He0nF.woff2 +0 -0
- package/gui/dist/assets/fira-sans-vietnamese-300-normal-CeyOCBN-.woff +0 -0
- package/gui/dist/assets/fira-sans-vietnamese-400-normal-DUVG35gE.woff +0 -0
- package/gui/dist/assets/fira-sans-vietnamese-400-normal-ljDTQFsx.woff2 +0 -0
- package/gui/dist/assets/fira-sans-vietnamese-500-normal-ChEXCnJy.woff2 +0 -0
- package/gui/dist/assets/fira-sans-vietnamese-500-normal-UV7M6ot_.woff +0 -0
- package/gui/dist/assets/fira-sans-vietnamese-600-normal-Bxjaclsw.woff +0 -0
- package/gui/dist/assets/fira-sans-vietnamese-600-normal-Dh2KAvU8.woff2 +0 -0
- package/gui/dist/assets/fira-sans-vietnamese-700-normal-DFi88MGY.woff +0 -0
- package/gui/dist/assets/fira-sans-vietnamese-700-normal-j5oLGLJY.woff2 +0 -0
- package/gui/dist/assets/index-CwQzep9r.js +413 -0
- package/gui/dist/assets/index-DUFjnEFT.css +1 -0
- package/gui/dist/assets/theme-BnuhLJ6X.css +1 -0
- package/gui/dist/assets/theme-G7EkTZY2.js +30 -0
- package/gui/dist/index.html +13 -0
- package/package.json +62 -0
package/dist/pic.js
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expande repeticiones en una cláusula PIC.
|
|
3
|
+
* "X(10)" → "XXXXXXXXXX", "9(3)V9(2)" → "999V99"
|
|
4
|
+
*/
|
|
5
|
+
function expandPic(raw) {
|
|
6
|
+
return raw.replace(/([XABSV9P0Z*+\-,./$])\((\d+)\)/gi, (_m, ch, n) => ch.repeat(Number(n)));
|
|
7
|
+
}
|
|
8
|
+
function normalizeUsage(usage) {
|
|
9
|
+
return (usage ?? 'DISPLAY').toUpperCase().replace(/[-\s]/g, '');
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Tamaño de un campo binario (COMP/BINARY) según el número de dígitos
|
|
13
|
+
* decimales que representa — convención estándar IBM Enterprise COBOL:
|
|
14
|
+
* 1-4 dígitos → halfword (2 bytes), 5-9 → fullword (4 bytes), 10-18 → doubleword (8 bytes).
|
|
15
|
+
*/
|
|
16
|
+
function binarySize(totalDigits) {
|
|
17
|
+
if (totalDigits <= 4)
|
|
18
|
+
return 2;
|
|
19
|
+
if (totalDigits <= 9)
|
|
20
|
+
return 4;
|
|
21
|
+
return 8;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Determina si un PIC expandido es numérico, editado-numérico o alfanumérico.
|
|
25
|
+
* Numérico puro: solo 9, S, V, P.
|
|
26
|
+
* Editado numérico: contiene algún carácter de edición — Z y * (supresión),
|
|
27
|
+
* + y - (signo), $ (moneda), coma, punto, barra, B (espacio), 0 (inserción
|
|
28
|
+
* de cero), o los sufijos CR/DB.
|
|
29
|
+
* Alfanumérico: contiene X o A.
|
|
30
|
+
*
|
|
31
|
+
* Se ejecuta sobre el PIC ya expandido, así que el 0 de `9(10)` no llega
|
|
32
|
+
* hasta aquí: solo se ve un 0 escrito como posición de inserción.
|
|
33
|
+
*/
|
|
34
|
+
function classifyPic(expanded) {
|
|
35
|
+
if (/[XA]/i.test(expanded))
|
|
36
|
+
return 'alphanumeric';
|
|
37
|
+
if (/[Z*+\-,./B0$]|CR|DB/i.test(expanded))
|
|
38
|
+
return 'numeric-edited';
|
|
39
|
+
return 'numeric';
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Cuenta bytes DISPLAY de un PIC expandido. Cada carácter posicional = 1 byte,
|
|
43
|
+
* excepto V (decimal implícito, 0 bytes), S (signo embebido, 0 bytes a menos
|
|
44
|
+
* que SIGN SEPARATE), y CR/DB (2 bytes cada uno — pero en el expandido cada
|
|
45
|
+
* letra ya está separada: C, R se cuentan individualmente, 1+1=2).
|
|
46
|
+
*/
|
|
47
|
+
function displayBytes(expanded, signSeparate) {
|
|
48
|
+
let bytes = 0;
|
|
49
|
+
for (const ch of expanded) {
|
|
50
|
+
const upper = ch.toUpperCase();
|
|
51
|
+
if (upper === 'V')
|
|
52
|
+
continue;
|
|
53
|
+
if (upper === 'S') {
|
|
54
|
+
if (signSeparate)
|
|
55
|
+
bytes++;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
// P (scaling) no ocupa byte físico
|
|
59
|
+
if (upper === 'P')
|
|
60
|
+
continue;
|
|
61
|
+
bytes++;
|
|
62
|
+
}
|
|
63
|
+
return bytes || 1;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Cuenta las posiciones de dígito de un PIC expandido: 9, Z y * (los dos
|
|
67
|
+
* últimos son dígitos suprimibles, no adornos) y P (scaling, que cuenta
|
|
68
|
+
* como dígito aunque no ocupe byte). El signo (S, + o -) y los caracteres
|
|
69
|
+
* de inserción (coma, barra, B, 0, CR, DB) NO son dígitos.
|
|
70
|
+
*
|
|
71
|
+
* La parte decimal se separa por V (decimal implícito) o por el punto de
|
|
72
|
+
* un PIC editado: en `ZZ,ZZ9.99` los dos últimos 9 son decimales, igual
|
|
73
|
+
* que en `9(5)V99`.
|
|
74
|
+
*/
|
|
75
|
+
function countDigits(expanded) {
|
|
76
|
+
const noSign = expanded.replace(/^S/i, '');
|
|
77
|
+
const parts = noSign.split(/[V.]/i);
|
|
78
|
+
const intPart = parts[0] ?? '';
|
|
79
|
+
const decPart = parts[1] ?? '';
|
|
80
|
+
function digitCount(s) {
|
|
81
|
+
let count = 0;
|
|
82
|
+
for (const ch of s) {
|
|
83
|
+
const upper = ch.toUpperCase();
|
|
84
|
+
if (upper === '9' || upper === 'Z' || upper === '*' || upper === 'P')
|
|
85
|
+
count++;
|
|
86
|
+
}
|
|
87
|
+
return count;
|
|
88
|
+
}
|
|
89
|
+
const intDigits = digitCount(intPart);
|
|
90
|
+
const decDigits = digitCount(decPart);
|
|
91
|
+
return { total: intDigits + decDigits, decimal: decDigits };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Parsea una cláusula PIC (y USAGE) y calcula tipo y longitud en bytes.
|
|
95
|
+
* COMP-1/COMP-2 no requieren PIC — su tamaño es fijo (float de 4/8 bytes).
|
|
96
|
+
*/
|
|
97
|
+
export function parsePic(rawPicture, usage, options) {
|
|
98
|
+
const normalizedUsage = normalizeUsage(usage);
|
|
99
|
+
const picture = (rawPicture ?? '').toUpperCase().replace(/\s+/g, '');
|
|
100
|
+
if (normalizedUsage === 'COMP1') {
|
|
101
|
+
return { type: 'float-single', picture, totalDigits: 0, decimalDigits: 0, lengthInBytes: 4 };
|
|
102
|
+
}
|
|
103
|
+
if (normalizedUsage === 'COMP2') {
|
|
104
|
+
return { type: 'float-double', picture, totalDigits: 0, decimalDigits: 0, lengthInBytes: 8 };
|
|
105
|
+
}
|
|
106
|
+
// Punteros e índices no llevan PIC: su tamaño lo fija el USAGE. Tamaños
|
|
107
|
+
// de IBM Enterprise COBOL en AMODE 31, que es el modo por defecto; en
|
|
108
|
+
// LP64 un POINTER son 8 bytes.
|
|
109
|
+
if (normalizedUsage === 'POINTER' || normalizedUsage === 'FUNCTIONPOINTER') {
|
|
110
|
+
return { type: 'pointer', picture, totalDigits: 0, decimalDigits: 0, lengthInBytes: 4 };
|
|
111
|
+
}
|
|
112
|
+
if (normalizedUsage === 'PROCEDUREPOINTER') {
|
|
113
|
+
return { type: 'pointer', picture, totalDigits: 0, decimalDigits: 0, lengthInBytes: 8 };
|
|
114
|
+
}
|
|
115
|
+
if (normalizedUsage === 'INDEX') {
|
|
116
|
+
return { type: 'index', picture, totalDigits: 0, decimalDigits: 0, lengthInBytes: 4 };
|
|
117
|
+
}
|
|
118
|
+
const expanded = expandPic(picture);
|
|
119
|
+
const classification = classifyPic(expanded);
|
|
120
|
+
if (classification === 'alphanumeric') {
|
|
121
|
+
const len = displayBytes(expanded, false);
|
|
122
|
+
return {
|
|
123
|
+
type: 'alphanumeric',
|
|
124
|
+
picture,
|
|
125
|
+
totalDigits: 0,
|
|
126
|
+
decimalDigits: 0,
|
|
127
|
+
lengthInBytes: len,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
const { total: totalDigits, decimal: decDigits } = countDigits(expanded);
|
|
131
|
+
if (normalizedUsage === 'COMP3' || normalizedUsage === 'PACKEDDECIMAL') {
|
|
132
|
+
const bytes = Math.ceil((totalDigits + 1) / 2);
|
|
133
|
+
return {
|
|
134
|
+
type: 'packed-decimal',
|
|
135
|
+
picture,
|
|
136
|
+
totalDigits,
|
|
137
|
+
decimalDigits: decDigits,
|
|
138
|
+
lengthInBytes: bytes,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (normalizedUsage === 'COMP' || normalizedUsage === 'BINARY') {
|
|
142
|
+
return {
|
|
143
|
+
type: 'binary',
|
|
144
|
+
picture,
|
|
145
|
+
totalDigits,
|
|
146
|
+
decimalDigits: decDigits,
|
|
147
|
+
lengthInBytes: binarySize(totalDigits),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
const bytes = displayBytes(expanded, options?.signSeparate === true);
|
|
151
|
+
return {
|
|
152
|
+
// Un PIC editado es un campo de presentación: los caracteres de
|
|
153
|
+
// inserción ocupan bytes reales pero no son dígitos con los que
|
|
154
|
+
// se pueda operar. Distinguirlo evita que la tabla de esquema
|
|
155
|
+
// sugiera que ZZ,ZZ9.99 se comporta como 9(7)V99.
|
|
156
|
+
type: classification === 'numeric-edited' ? 'numeric-edited' : 'numeric',
|
|
157
|
+
picture,
|
|
158
|
+
totalDigits,
|
|
159
|
+
decimalDigits: decDigits,
|
|
160
|
+
lengthInBytes: bytes,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/** USAGE que no requiere PIC para determinar su tamaño (floats, punteros, índices) */
|
|
164
|
+
export function usageImpliesFixedSize(usage) {
|
|
165
|
+
const n = normalizeUsage(usage);
|
|
166
|
+
return (n === 'COMP1' ||
|
|
167
|
+
n === 'COMP2' ||
|
|
168
|
+
n === 'POINTER' ||
|
|
169
|
+
n === 'PROCEDUREPOINTER' ||
|
|
170
|
+
n === 'FUNCTIONPOINTER' ||
|
|
171
|
+
n === 'INDEX');
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Frontera de alineación en bytes que exige un campo, o 1 si no exige
|
|
175
|
+
* ninguna. SYNCHRONIZED alinea los binarios y los flotantes; los punteros
|
|
176
|
+
* y los índices van alineados siempre, lleven SYNC o no.
|
|
177
|
+
*
|
|
178
|
+
* La alineación es relativa al principio del registro 01, y los bytes de
|
|
179
|
+
* relleno que deja delante no pertenecen a ningún campo — por eso hay que
|
|
180
|
+
* contarlos para que los offsets siguientes sean ciertos.
|
|
181
|
+
*/
|
|
182
|
+
export function alignmentOf(type, lengthInBytes, synchronized) {
|
|
183
|
+
if (type === 'pointer' || type === 'index')
|
|
184
|
+
return lengthInBytes >= 8 ? 8 : 4;
|
|
185
|
+
if (!synchronized)
|
|
186
|
+
return 1;
|
|
187
|
+
if (type === 'float-single')
|
|
188
|
+
return 4;
|
|
189
|
+
if (type === 'float-double')
|
|
190
|
+
return 8;
|
|
191
|
+
// Binario: media palabra, palabra o doble palabra según su tamaño.
|
|
192
|
+
if (type === 'binary')
|
|
193
|
+
return lengthInBytes >= 8 ? 8 : lengthInBytes >= 4 ? 4 : 2;
|
|
194
|
+
// DISPLAY y COMP-3 no se alinean: SYNC no les afecta.
|
|
195
|
+
return 1;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=pic.js.map
|
package/dist/pic.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pic.js","sourceRoot":"","sources":["../src/pic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ParseResult, ReferenceResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Where-used por campo: para cada data-name del esquema, dónde se LEE y
|
|
4
|
+
* dónde se ESCRIBE en la PROCEDURE DIVISION, anclado a párrafo y línea.
|
|
5
|
+
*
|
|
6
|
+
* Misma disciplina que el resto del motor (ADR-0003): se reconoce un
|
|
7
|
+
* subconjunto de verbos con reparto de roles bien definido (MOVE, COMPUTE,
|
|
8
|
+
* la aritmética, SET, INITIALIZE, STRING/UNSTRING, INSPECT, READ/RETURN
|
|
9
|
+
* INTO, WRITE/REWRITE FROM, PERFORM VARYING, los contextos de condición) y
|
|
10
|
+
* los host variables de EXEC SQL/CICS. Todo lo demás se MARCA, no se
|
|
11
|
+
* inventa:
|
|
12
|
+
* - un argumento BY REFERENCE de una CALL, un MOVE CORRESPONDING, un
|
|
13
|
+
* host variable de SQL dinámico o un homónimo del esquema → `uncertain`;
|
|
14
|
+
* - una ocurrencia real de un campo en un verbo que el motor no modela
|
|
15
|
+
* todavía → `unclassified` (se toca ahí, pero no se afirma el rol);
|
|
16
|
+
* - un nombre en posición de operando que no casa con el esquema →
|
|
17
|
+
* `unknownNames` (puede estar en un copybook ausente).
|
|
18
|
+
*
|
|
19
|
+
* El rol se decide por la SENTENCIA completa, no por la línea: una MOVE
|
|
20
|
+
* puede repartirse en varias líneas y el operando destino está tras el TO.
|
|
21
|
+
* Por eso se acumula el texto hasta el punto y se trocea por verbos, con
|
|
22
|
+
* un mapa offset→línea para anclar cada token a su línea real del fuente.
|
|
23
|
+
*/
|
|
24
|
+
export declare function collectReferences(source: string, data?: ParseResult | undefined): ReferenceResult;
|