; DISTRIB
;
; Programma per Proteus
;
; (C) 1998 Simone Zanella Productions
;
; Crea una distribuzione a partire da qualsiasi altra distribuzione
; di Proteus, convertendo i terminatori di riga e rimappando
; (se necessario) da CodePage 437 a ISO Latin 1; i file HTML non
; sono mai rimappati.
; Dimostra l'impiego di UDF e di varie funzioni su file e directory;
; utilizza !endprog e quindi i dati appesi allo script (partendo da
; PROG_DATA) per determinare la tabella codici della distribuzione.
;
; Il primo parametro utente deve essere:
; DOS crea la distribuzione Dos
; UNX crea la distribuzione Unix
; W95 crea la distribuzione Windows 95
; Parametri impliciti: input e output predefiniti nulli
;!proteus -z
FUNCTION ProcessFile(name)
; Ritorna 1 se il file deve essere processato, 0 altrimenti.
; Solo i seguenti tipi di file sono convertiti:
; *.c *.h *.hlp *.txt *.man *.def *.bat *.prt *.htm configure README
SET p = STRRSTR(name, ".")
IF p
SWITCH RESTFROM(name, p) STRIEQ
ON ".C"
RETURN 1
ON ".H"
RETURN 1
ON ".HLP"
RETURN 1
ON ".TXT"
RETURN 1
ON ".MAN"
RETURN 1
ON ".DEF"
RETURN 1
ON ".BAT"
RETURN 1
ON ".PRT"
RETURN 1
ON ".HTM"
RETURN 1
OFF
ELSE
SWITCH name STRIEQ
ON "README"
RETURN 1
ON "CONFIGURE"
RETURN 1
OFF
FI
RETURN 0
SET H = FOPEN(ARGV(2), 1)
IF EQ(H, -1)
CONSOLELN "Errore: specificare percorso completo ed " \
"estensione per lo script"
ABORT 0
FI
FSEEK(H, PROG_DATA, 0)
SET ISO_Dist = IIF(STREQ(RIGHT(FREAD(H, 2), 1), "\x8A"), 0, 1)
FCLOSE(H)
; Verifica che il programma sia invocato con i corretti parametri
SWITCH ARGV(5) STRIEQ
ON "UNX"
SET EOL = "\n"
SET ISO_New = 1
SET Dir = "protunx"
CONSOLELN "Creazione della distribuzione Unix.."
ON "DOS"
SET EOL = "\r\n"
SET ISO_New = 0
SET Dir = "protdos"
CONSOLELN "Creazione della distribuzione Dos.."
ON "W95"
SET EOL = "\r\n"
SET ISO_New = 1
SET Dir = "protw95"
CONSOLELN "Creazione della distribuzione Windows 95.."
OTHER
CONSOLELN "Sintassi: " ARGV(1) " " ARGV(2) " [DOS | UNX | W95]"
CONSOLELN "Scopo: crea una distribuzione di Proteus"
ABORT 0
OFF
SET Remap = NEQ(ISO_Dist, ISO_New)
IF Remap
IF AND(ISO_Dist, NOT(ISO_New))
; Mappatura Iso Latin 1 -> Pc-437
SET Map = MAPNEW("\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE" \
"\xEC\xC4\xC5\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6" \
"\xDC\xA2\xA3\xA5\x83\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA" \
"\xBF\xAC\xBD\xBC\xA1\xAB\xBB\x7F\xA6\xB5\x9C\xF8\xB1" \
"\xF7\xB0\xB7\xB7\xB2\x95\xA0", \
"\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C" \
"\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99" \
"\x9A\x9B\x9C\x9D\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7" \
"\xA8\xAA\xAB\xAC\xAD\xAE\xAF\xB1\xB3\xE6\xEC\xED\xF1" \
"\xF6\xF8\xF9\xFA\xFD\xFE\xFF")
ELSE
; Mappatura Pc-437 -> Iso Latin 1
SET Map = MAPNEW("\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C" \
"\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99" \
"\x9A\x9B\x9C\x9D\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7" \
"\xA8\xAA\xAB\xAC\xAD\xAE\xAF\xB1\xB3\xE6\xEC\xED\xF0" \
"\xF1\xF6\xF8\xF9\xFA\xFD\xFE\xFF", \
"\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE" \
"\xEC\xC4\xC5\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6" \
"\xDC\xA2\xA3\xA5\x83\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA" \
"\xBF\xAC\xBD\xBC\xA1\xAB\xBB\x7F\xA6\xB5\x9C\xF8\x3D" \
"\xB1\xF7\xB0\xB7\xB7\xB2\x95\xA0")
FI
FI
; Imposta il separatore di directory in base al sistema operativo
!ifdef MS_DOS
SET DirSep = "\\"
!else
SET DirSep = "/"
!endif
SET BaseDir = "." DirSep
SET DD = VECCREATE("." DirSep, "test" DirSep, \
"samples" DirSep, "language" DirSep, "html" DirSep)
; Stampa il nome della directory, per informare l'utente di ciņ
; che sta succedendo
CONSOLELN TRUENAME(Dir)
; Crea le sottodirectory
DIRMAKE(Dir)
DIRMAKE(Dir DirSep "test")
DIRMAKE(Dir DirSep "samples")
DIRMAKE(Dir DirSep "html")
DIRMAKE(Dir DirSep "language")
FOR X = 1 TO VECLEN(DD)
SET BaseDir = VECGET(DD, X)
IF STREQ(LEFT(VECGET(DD, X), 4), "html")
; Disabilita il remapping per i file HTML
SET Remap = 0
FI
; Stampa il nome della directory, per informare l'utente di ciņ
; che sta succedendo
CONSOLELN TRUENAME(BaseDir)
; Apre ed elabora la directory
SET H = DIROPEN(BaseDir "*.*", 1)
SET F = IIF(NEQ(H, -1), 1, 0)
WHILE GT(F, 0)
; File trovato
IF ProcessFile(DIRLAST(H, 1))
; Stampa il nome del file, per tenere informato l'utente
SET Name = Dir DirSep BaseDir DIRLAST(H, 1)
CONSOLELN Name
; Apre per lettura
SET FH = FOPEN(BaseDir DIRLAST(H, 1), 1)
IF NEQ(FH, -1)
SET DH = FOPEN(Name, 26)
; Apertura ok - fino alla fine del file..
WHILE 1
; Copia la linea appendendo il corretto terminatore di riga
SET L = FREADLN(FH)
IF OR(NOT(FEOF(FH)), ISNOTEMPTY(L))
IF Remap
MAP(Map, @L)
FI
FWRITELN(DH, L)
ELSE
BREAK
FI
LOOP
FCLOSE(FH)
FCLOSE(DH)
FI
FI
SET F = DIRNEXT(H)
LOOP
DIRCLOSE(H)
NEXT
CONSOLELN "La distribuzione si trova in " Dir
ABORT 0
!endprog
#č# <- non modificare! Usato per determinare la mappatura della distribuzione