Programma di esempio DOC.PRT |
; DOC
;
; Programma per Proteus
;
; (C) 1998-2003 Simone Zanella Productions
;
; Estrae documentazione e (opzionalmente) commenti dai file Proteus indicati;
; elimina le direttive ed il carattere di commento iniziale (; e #).
; Parametri impliciti: input e output predefiniti nulli
;!proteus -z
Str_BDOC = "!bdoc"
Str_EDOC = "!edoc"
SourceDir = STRIPQUOTES(ARGV(5))
IF ISEMPTY(SourceDir)
CONSOLELN "Sintassi: " ARGV(1) " " ARGV(2) " [\"filespec\" [REM]]"
CONSOLELN ""
CONSOLELN "Scopo: estrae a console i blocchi di documentazione nei file"
CONSOLELN "specificati ed i commenti (se REM e' specificato)"
ABORT 0
FI
Remarks = STRIEQ(ARGV(6), "REM")
; Determina il separatore di directory sulla base del sistema operativo
!ifdef UNIX
DirSep = "/"
!else
DirSep = "\\"
!endif
; Isola la directory base e la specifica dei file
X = STRRSTR(SourceDir, DirSep)
IF X
BaseDir = LEFT(SourceDir, X)
Spec = RESTFROM(SourceDir, INC(X))
ELSE
BaseDir = ""
Spec = SourceDir
FI
; Costruisce un albero AVL dei file da processare
H = DIROPEN(SourceDir, 1)
F = IIF(NEQ(H, -1), 1, 0)
A = AVLNEW()
WHILE GT(F, 0)
AVLSET(A, DIRLAST(H, 1), 0)
F = DIRNEXT(H)
LOOP
DIRCLOSE(H)
; Trasforma l'albero in un vettore, per semplicità operativa.
; Nessun ordinamento è richiesto, in quanto le chiavi sono già ordinate
VF = AVLKEYS(A)
AVLFREE(A)
; Processa tutti i file
FOR X = 1 TO VECLEN(VF)
H = FOPEN(BaseDir IIF(ISNOTEMPTY(BaseDir), DirSep, "") \
VECGET(VF, X), 1)
IF EQ(H, -1)
CONSOLELN "Errore: impossibile aprire " VECGET(VF, X)
CONTINUE
FI
InDoc = 0
First = 1
N = 0
WHILE NOT(FEOF(H))
S = FREADLN(H)
INC(@N)
CheckLine(S, @First, VECGET(VF, X), N)
LOOP
FCLOSE(H)
CONSOLELN ""
NEXT
ABORT 0
FUNCTION CheckLine(s, first, filename, n)
; Controlla se la linea è un commento oppure se è contenuta
; in un blocco di documentazione
s = ALLTRIM(s, " ")
IF IN(LEFT(s, 1), ";#")
IF _Remarks
IF first
CONSOLELN "File: " filename
first = 0
FI
CONSOLELN n ": " LTRIM(s, ";# ")
RETURN
FI
ELSE
IF STRIEQ(LEFT(s, STRLEN(_Str_BDOC)), _Str_BDOC)
INC(@_InDoc)
ELSE
IF STRIEQ(LEFT(s, STRLEN(_Str_EDOC)), _Str_EDOC)
DEC(@_InDoc)
ELSE
IF _InDoc
CONSOLELN n ": " s
FI
FI
FI
FI
RETURN