foxbin2prg

This commit is contained in:
2026-06-15 12:50:06 +03:00
parent 189ee3b000
commit d9bf25016f
2 changed files with 141 additions and 0 deletions

View File

@@ -29,6 +29,25 @@ user-facing strings, comments, and changelog entries.
- The compiler error log is `roaacnpro.ERR`; the runtime log is `log.txt`. Many entries in - The compiler error log is `roaacnpro.ERR`; the runtime log is `log.txt`. Many entries in
`roaacnpro.ERR` are benign cross-references resolved at runtime from `COMUN` libraries. `roaacnpro.ERR` are benign cross-references resolved at runtime from `COMUN` libraries.
## Searching code inside `.vcx`/`.scx` (binary) libraries
Most class/form code lives **inside binaries** (`.vcx`+`.vct`, `.scx`+`.sct`, …), not in `.prg`,
so plain grep can't read it cleanly. To search method/procedure bodies, convert the binaries to
their TEXT form first and grep the text. **At the start of a session (when work may touch
classes/forms), refresh the text cache** by running the helper, then search in the cache:
```powershell
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 # incremental
```
By default it is **project-driven**: it reads `roaacnpro.PJX` and converts only the `.vcx`/`.scx`
the project actually uses (~78 files), **not** all of `COMUN\` (most of which is unused). It writes
a mirrored, read-only text tree to `D:\ROA\UTIL\foxbin2prg\_textcache\`
(e.g. `_textcache\Clase\oacnpro.vc2`, `_textcache\comun\clase\_frm_base.vc2`); then `Grep` there.
Useful flags: `-Types vcx,scx,frx,mnx` (also reports/menus), `-Source <file|folder>` (one-off,
even outside the project), `-Force`, `-Clean`. The text is **only for reading/search** — edit code
in the VFP IDE. Full guide: **`docs/cautare_vcx_vct.md`**.
## The COMUN shared framework ## The COMUN shared framework
`COMUN/` (and the sibling `..\COMUNROA\`) is **shared, framework-level code used by every ROA `COMUN/` (and the sibling `..\COMUNROA\`) is **shared, framework-level code used by every ROA

122
docs/cautare_vcx_vct.md Normal file
View File

@@ -0,0 +1,122 @@
# Căutare în codul din librăriile/formele VFP (`.vcx`/`.vct`, `.scx`/`.sct`, ...)
Cum se caută cod-sursă (proceduri, metode, parametri) care **nu** stă în fișiere `.prg`, ci
în interiorul fișierelor binare VFP: librării de clase (`.vcx`+`.vct`), forme (`.scx`+`.sct`),
rapoarte (`.frx`+`.frt`), meniuri (`.mnx`+`.mnt`), baze de date (`.dbc`+`.dct`).
## De ce e nevoie de asta
Un `.vcx` este de fapt o **tabelă DBF**: codul metodelor stă în câmpuri memo în `.vct`. Un
`grep` direct pe `.vct` *găsește* textul, dar îl vede ca fișier binar (octeți `\0` între linii),
fără numere de linie utile și greu de citit. Soluția: convertim binarul în reprezentarea lui
**TEXT** (`.vc2`, `.sc2`, …) — un PRG-style lizibil, cu metode sortate alfabetic — și căutăm
în text cu `grep`/`Grep`.
> **Regula de aur:** textul generat e **doar pentru citire/căutare**. Modificările de cod se fac
> tot în **IDE-ul VFP** (vezi `CLAUDE.md`). Nu edita `.vcx/.vct` pe text și nu pune textul înapoi
> în binar pentru aceste scopuri.
## Unelte disponibile (verificate)
| Unealtă | Cale | Rol | Recomandare |
|---|---|---|---|
| **FoxBin2Prg** | `D:\ROA\UTIL\foxbin2prg\FoxBin2Prg.EXE` | Binar VFP ⇄ text bidirecțional (`.vc2/.sc2/.fr2/.mn2/.dc2/.lb2`) | **De folosit.** Complet, fidel, include corpul metodelor, parametri, comentarii |
| vcx2prg | `D:\ROA\UTIL\vcx2prg\x2prg.prg` | Doar `.vcx``.prg` *compilabil* | Alternativă; mai vechi, doar clase, necesită IDE VFP deschis pentru a rula forma |
| prgtovcx | `D:\ROA\UTIL\prgtovcx\prgtovcx.PRG` | Invers: `.prg``.vcx` | **Nu** pentru căutare (e direcția opusă) |
FoxBin2Prg e prima alegere: rulează din linia de comandă fără IDE deschis (EXE compilat), acoperă
toate tipurile de container, și produce text mult mai fidel decât vcx2prg.
> Dacă `FoxBin2Prg.EXE` lipsește, se compilează o singură dată: deschide
> `D:\ROA\UTIL\foxbin2prg\foxbin2prg.pj2` în VFP 9 și *Build > Build Executable*. Lângă EXE trebuie
> să existe `filename_caps.exe` și fișierele `props*.txt` (sunt deja în folder).
## Mod recomandat: scriptul `vcx2txt.ps1`
`D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1` automatizează tot: copiază binarul + memo-ul într-un
**cache** care oglindește structura proiectului (ca să nu murdărească arborele SVN), rulează
FoxBin2Prg, păstrează doar fișierul text. E **incremental** (sare peste ce e deja la zi).
**Implicit e „project mode"**: citește `roaacnpro.PJX` și convertește **doar** fișierele
`.vcx`/`.scx` pe care le folosește efectiv proiectul (~78), **nu** tot `COMUN\` (care are zeci de
librării nefolosite în ROAACNPRO — pierdere de timp). Lista de fișiere vine direct din proiect, deci
e exactă.
```powershell
# DOAR fișierele proiectului (recomandat, rapid) -> cache text
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1
# include și rapoartele (.frx) și meniurile (.mnx)
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 -Types vcx,scx,frx,mnx
# conversie punctuală a unui fișier sau folder (chiar dacă NU e în proiect)
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 -Source D:\ROA\ROAACNPRO\COMUN\clase\caut.vcx
# rebuild curat (șterge cache-ul întâi) / forțează reconversia
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 -Clean
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 -Force
```
Parametri utili: `-Project <alt.pjx>` (alt proiect, ex. `importroris.pjx`), `-Types`,
`-Source`, `-Clean`, `-Force`.
Rezultatul ajunge în `D:\ROA\UTIL\foxbin2prg\_textcache\` cu aceeași structură de directoare ca
proiectul (ex.: `_textcache\Clase\oacnpro.vc2`, `_textcache\comun\clase\_frm_base.vc2`). Apoi:
```bash
# cu unealta Grep (preferat) sau grep:
grep -rn "PROCEDURE do_calcul_tarife" "D:\ROA\UTIL\foxbin2prg\_textcache"
grep -rln "factura_salvare" "D:\ROA\UTIL\foxbin2prg\_textcache" # ce clase ating subiectul
```
Flux tipic pentru o problemă: rulează scriptul fără parametri o dată (populează cache-ul), apoi
caută cu `Grep` în `_textcache`. La sesiuni următoare rescrie doar ce s-a schimbat (incremental).
Dacă ai nevoie de o librărie din `COMUN\` care nu e în proiect, convertește-o punctual cu `-Source`.
## Alternativă manuală (fără script)
FoxBin2Prg scrie textul **lângă sursă**. Ca să nu murdărești `Clase/`, copiază perechea
binar+memo într-un folder temporar și convertește acolo:
```powershell
# .vcx -> .vc2 (cType gol = extensia decide direcția BIN2PRG)
Copy-Item D:\ROA\ROAACNPRO\Clase\oacnpro.vcx, D:\ROA\ROAACNPRO\Clase\oacnpro.vct D:\tmp\
& 'D:\ROA\UTIL\foxbin2prg\FoxBin2Prg.EXE' 'D:\tmp\oacnpro.vcx' '' '' '' '1' '0' '1'
# => D:\tmp\oacnpro.vc2
```
Pozițiile parametrilor folosite: `fișier, cType, cTextName, lGenText, cDontShowErrors=1,
cDebug=0, cDontShowProgress=1`. **Lasă `cType` gol** — extensia (`.vcx`) determină direcția.
(Nu da explicit `"BIN2PRG"` pentru un singur fișier: în acel mod EXE-ul așteaptă un *director*.)
Detalii complete de parametri: `D:\ROA\UTIL\foxbin2prg\docs\FoxBin2Prg_Run.md`.
## Soluție rapidă „murdară" (un singur fișier, fără conversie)
Pentru o verificare rapidă „există metoda X undeva în librărie?", `grep` merge direct pe `.vct`
(o vede ca binar, dar găsește potrivirile):
```bash
grep -c "PROCEDURE" "D:\ROA\ROAACNPRO\Clase\oacnpro.VCT"
grep -a -o "PROCEDURE [a-zA-Z0-9_]*" "D:\ROA\ROAACNPRO\Clase\oacnpro.VCT"
```
Bun pentru „da/nu" și nume de metode; pentru citit corpul/contextul, folosește conversia în text.
## Corespondență extensii binar → text
| Container | Binar (+memo) | Text |
|---|---|---|
| Librărie clase | `.vcx` + `.vct` | `.vc2` |
| Formă | `.scx` + `.sct` | `.sc2` |
| Raport | `.frx` + `.frt` | `.fr2` |
| Etichetă | `.lbx` + `.lbt` | `.lb2` |
| Meniu | `.mnx` + `.mnt` | `.mn2` |
| Bază de date | `.dbc` + `.dct` | `.dc2` |
## Note
- Codul aplicației stă mai ales în `Clase\*.vcx`; cea mai mare parte din `.vcx`-uri sunt în
`COMUN\` (framework partajat — vezi `CLAUDE.md`).
- `_textcache\` e regenerabil și e în afara arborelui SVN — poate fi șters oricând.
- Conversia **nu** necesită IDE-ul VFP deschis (folosește EXE-ul compilat).