ECL Format
Indice
Codifica dei tipi
All'interno del file, sono condificati dati di più tipi primitivi a cui si farà riferimento successivamente. Le codifiche finora individuate sono:
- stringa a lunghezza fissa: La lunghezza è indicata preventivamente all'interno del blocco che ne fa uso o altrove. È rappresentata da un numero fisso di bytes, dove quelli non utilizzati sono impostati a NULL.
- stringa a lunghezza variabile: Si tratta di un numero variabile di bytes stringa di cui l'ultimo è sempre NULL e rappresenta la fine della stringa stessa
- numero intero: gli interi sono codificati sempre come 4 bytes, ordinati dal meno al più significativo (quindi invertiti, da un punto di vista algebrico). Sono sempre signed: il valore massimo per un intero è 0x7FFFFFFF, rappresentato come FF FF FF 7F. I valori negativi sono rappresentati partendo da FF FF FF FF che significa -1 e poi sottraendo la rappresentazione del valore come se fosse (intero - 1); ad esempio -255 è rappresentato come 01 FF FF FF.
- numeri a virgola mobile (float): i numeri a virgola mobile sono codificati sempre come 8 bytes (da chiarire in che formato, probabilmente 4 bytes base + 4 bytes esponente)
Struttura
Il file ECL sembra avere una struttura a blocchi. Di seguito sono elencati quelli noti, riportati nello stesso ordine in cui compariranno all'interno del file.
Header
L'header sembra essere fisso: 43 45 02 00 00 00, e sono i primi 6 bytes di ogni file.
I primi due bytes rappresentano il magic number del formato ("CE").
Il terzo byte probabilmente è il numero di versione (02 per POL093).
Program - codice 04 00
Questo blocco definisce la direttiva program.
Non è sempre presente: ad esempio, non è usato nello script generale di startup start.ecl.
I primi 6 bytes sono 04 00 10 00 00 00, segue un blocco di 13 bytes di cui solo il primo sembra essere usato ed indica il numero di argomenti accettati dal blocco program (01, 02, etc...).
Gli altri bytes sono lasciati a NULL.
Usages - codice 01 00
I file .em contenenti le funzioni di sistema importati con la direttiva use sono specificate immediatamente dopo l'header. Ogni blocco use ha una dimensione variabile.
I primi 6 bytes sono 01 00 00 00 00 00, segue un blocco di 13 bytes così suddiviso:
- bytes 1-9: contengono il nome dell'usage sotto forma di stringa a lunghezza fissa
- byte 10: indica il numero di funzioni utilizzate da questo file
- bytes 11-13: sempre NULL
Segue la lista delle funzioni utilizzate da questo file, sotto forma 34 bytes ripetuti per il numero di volte indicato dal byte 10. Di questi 34 bytes, i primi 32 rappresentano una stringa a lunghezza fissa contenente il nome della funzione, mentre gli ultimi due sono sempre 00 01.
"basic" e "basicio" sembrano essere sempre i primi due usages e sono inclusi implicitamente, e ribaditi quindi nel file ECL, anche se non dichiarati nello script sorgente.
Fine Istruzioni -codice 00 0F
Il blocco di istruzioni sembra terminare sempre con 00 0F 20 00 00 00
Costanti - codice 03 00
In questo blocco, l'ultimo del file, sono contenute le costanti usate all'interno del file stesso.
L'inizio del blocco è indicato dai 6 bytes 03 00 XX XX XX XX: dove XX rappresenta la lunghezza del blocco, in formato intero: sembra sempre uguale all'intero indicato dai successivi 4 bytes + 4.
I successivi 4 bytes rappresentano un intero che indica il numero di bytes da cui è composta la sezione delle costanti + 1 (ovvero indica 1 per 0 bytes, 2 per 1 byte, etc...).
Ad esempio, un blocco costanti contenente 4 bytes di dati puri inizierà con: 03 00 - 09 00 00 00 - 05 00 00 00.
Possono essere presenti i seguenti tipi di dati:
- stringhe a lunghezza variabile
- interi
- float