Programma di esempio REMC.PRT |
; REMC
;
; Programma per Proteus
;
; (C) 1998-2003 Simone Zanella Productions
;
; Rimuove i commenti C.
;
; Algoritmo:
; - se NON siamo dentro un commento, controlla se c'è un commento sulla
; linea;
; SI: trova dove finisce il commento (se sulla riga), trascrivi la
; parte fuori commento, salta alla prossima parte fuori commento;
; alla fine, imposta InRem a 1 se siamo ancora dentro un commento;
; NO: scrive la linea com'è;
; - se siamo dentro un commento, trascrivi solo la parte che è fuori
; commento (se esiste), impostando InRem alla fine a 0 se siamo ancora
; fuori commento.
;
; Nota: i token "/*" e "*/" non possono apparire dentro stringhe.
; Inizializza
FUNCTION ONSTART()
IF STREQ(ARGV(3), "..")
CONSOLELN "Sintassi: " ARGV(1) " " ARGV(2) " sorgente destinazione"
CONSOLELN ""
CONSOLELN "Scopo: rimuove i commenti C da sorgente"
ABORT 0
FI
_InRem = 0
RETURN
IF EQ(InRem, 0)
; Trova l'inizio del commento
Pos = STRSTR(L, "/*")
; Crea una copia della linea
PL = STRDUP(L)
; Nuovo commento?
IF NEQ(Pos, 0)
; Flag: scritto qualcosa?
W = 0
REPEAT
; Pos è dove finisce la parte da trascrivere
DEC(@Pos)
; PL2 è la sottostringa da trascrivere
PL2 = LEFT(PL, Pos)
; Scrive PL2 se non vuota
IF ISNOTEMPTY(PL2)
PRINT PL2
W = 1
FI
; Pos2 è dove finisce il commento (se sulla riga)
Pos2 = STRSTR(PL, "*/")
; Imposta il flag: siamo dentro un commento
InRem = 1
; Il commento finisce sulla riga?
IF NEQ(Pos2, 0)
; Azzera il flag
InRem = 0
; Pos2 è dove inizia la parte da trascrivere
ADD(@Pos2, 2)
; C'è qualcos'altro da trascrivere?
IF NEQ(Pos2, 0)
PL = SUBSTR(PL, Pos2, STRLEN(PL))
ELSE
BREAK
FI
ELSE
BREAK
FI
Pos = STRSTR(PL, "/*")
UNTIL EQ(Pos, 0)
; Ho scritto qualcosa: scrive CR+LF
IF W
PRINTLN ""
FI
ELSE
PRINTLN L
FI
ELSE
; Trova la fine del commento
Pos = STRSTR(L, "*/")
; Crea una copia della linea
PL = STRDUP(L)
; Trovata
IF NEQ(Pos, 0)
; Flag: è stato scritto qualcosa?
W = 0
REPEAT
; Pos è dove inizia la parte da trascrivere
ADD(@Pos, 2)
; PL è la sottostringa da trascrivere
PL = SUBSTR(PL, Pos, STRLEN(PL))
; Trova l'inizio del commento in PL
Pos2 = STRSTR(PL, "/*")
; Imposta a 0 il flag 'dentro commento'
InRem = 0
; Trovato un nuovo commento?
IF NEQ(Pos2, 0)
; Pos2 è dove termina la parte da trascrivere
DEC(@Pos2)
; PL2 è la sottostringa da trascrivere
PL2 = LEFT(PL, Pos2)
; Scrive PL2
IF ISNOTEMPTY(PL2)
PRINT PL2
W = 1
FI
; Trova il prossimo fine commento
Pos = STRSTR(PL, "*/")
; Trovato: aggiorna PL
IF NEQ(Pos, 0)
DEC(@Pos)
PL = SUBSTR(PL, Pos, STRLEN(PL))
ELSE
; Siamo di nuovo dentro un commento
InRem = 1
FI
ELSE
; Il resto della linea è fuori commento
IF ISNOTEMPTY(PL)
PRINT PL
W = 1
FI
FI
Pos = STRSTR(PL, "*/")
UNTIL EQ(Pos, 0)
; Ho scritto qualcosa: scrive CR+LF
IF W
PRINTLN ""
FI
FI
FI