Programma di esempio HEXDUMP.PRT |
; HEXDUMP
;
; Programma per Proteus
;
; (C) 1998-2003 Simone Zanella Productions
;
; Questo programma stampa in formato leggibile (esadecimale) il contenuto del file specificato,
; secondo lo schema seguente:
;
; 1234: 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 | 123456789012345678
#!proteus -z
IF LT(ARGC, 6)
CONSOLELN "Sintassi: proteus HEXDUMP.PRT <file_sorgente> <destinazione>"
ABORT 0
FI
H = FOPEN(ARGV(5), 4)
D = FOPEN(ARGV(6), 26)
L = FSIZE(H)
; Crea una mappatura su spazio per tutti i caratteri non stampabili
S = ""
FOR X = 0 TO 31
S = S CHR(X)
NEXT
MP = MAPNEW(S, REPLICATE(" ", 32))
; Calcola la lunghezza del contatore ad inizio riga
M = STRLEN(PFORMAT("X", L))
B = 0
WHILE NOT(FEOF(H))
SB = FREAD(H, 16)
; Stampa il contatore ad inizio riga
S = PFORMAT("0" M "X", B) ": "
; Trasforma nell'equivalente esadecimale i caratteri da visualizzare sulla riga
FOR X = 1 TO STRLEN(SB)
S = S PFORMAT("02X", ASC(SUBSTR(SB, X, 1))) " "
IF EQ(X, 8)
S = S " "
FI
NEXT
; Riempie la riga
X = STRLEN(SB)
IF LT(X, 16)
Y = MUL(3, SUB(16, X))
IF LT(X, 9)
Y = ADD(Y, 2)
FI
S = S REPLICATE(" ", Y)
FI
; Stampa la riga in caratteri leggibili, mappando opportunamente i caratteri non stampabili
S = S " | " MAP(MP, SB)
FWRITELN(D, S)
ADD(@B, STRLEN(SB))
LOOP
FCLOSE(H)
FCLOSE(D)
ABORT 0