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
Indice esempi Prossimo esempio Esempio precedente Indice per argomenti Indice analitico