Newsgroup: it.comp.programmare.win32
Titolo: Decommentare file

Salve,
devo "esplorare" i sorgenti di una libreria e lo sto facendo in maniera
automatica (tramite degli scripts).
Mi sarebbe però utile dare in pasto agli scripts questi sorgenti
privati dei commenti.
Qualcuno mi sà indicare se esiste un'utility in grado di decommentare
automaticamente dei file .h, .cpp?
Visto che si tratta di esaminare circa 500 file sarebbe qualcosa
di estremamente utile (magari che lavora in background).
Grazie
Chef

 automaticamente dei file .h, .cpp?
Non credo che esista in giro niente di pronto che faccia cio'
che chiedi. C'e' anche da dire che, nel caso generale, una
utility del genere non e' banalissima da fare: l'obbrobrio di
sotto e' una valido commento in C/C++
/\
\
\
\
\
\
*
\
\
\
\
Incredibile ma vero, questo e' un commento valido\
\
\
\
\
*\
\
\
\
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 sotto e' una valido commento in C/C++
Sicuro? A me non risulta.
Enrico

Salve,
devo "esplorare" i sorgenti di una libreria e lo sto facendo in maniera
automatica (tramite degli scripts).
Mi sarebbe però utile dare in pasto agli scripts questi sorgenti
privati dei commenti.
Qualcuno mi sà indicare se esiste un'utility in grado di decommentare
automaticamente dei file .h, .cpp?
Forse qualcosa esiste (cerca decomment C++) però forse fai prima a
modificare i tuoi scripts per togliere i commenti.
Ciao, Enrico

 Sicuro? A me non risulta.
Riguardo a cosa? Al fatto che non esista un utility del genere
o che quello e' un commento valido in C?
Nel primo caso ho gia' detto che non ne sono sicuro,
nel secondo caso fattelo risultare: e' un commento
valido (a meno che non ci siano spazi dopo il carattere
di continuazione sulla riga suiccessiva).


 wrote in
news:1120035948.0...@g47g2000cwa.googlegroups.com
: 

Non so se fa al caso tuo, ma se devi "esplorare" i sorgenti generando 
l'indice di funzioni e classi, gli alberi di derivazioni delle classi e 
cose del genere, puoi usare doxygen, che digerisce i commenti (e anzi, 
volendo, li usa per documentare il codice).
www.doxygen.org
-- 
Valter Minute
vmi...@inwind.it
 (the reply address of this message is invalid)

 di continuazione sulla riga suiccessiva).
Mi pare manchi la chiusura alla fine, o sbaglio?
Comunque una regular expression non dovrebbe essere difficile da scrivere
per i commenti in C. Non ho tempo di provarci e quindi forse mi inganno :-)
Ciao, Enrico

 automaticamente dei file .h, .cpp?
L'ho fatto in cinque minuti, quindi sarà pieno di errori, però come traccia 
dovrebbe andare bene. Ah, l'ho provato anche sull'esempio di Angelo Paolitto 
(dopo averci aggiunto un terminatore che mancava) e funziona.
Dimmi se ti serve a qualcosa.
#include <stdio.h>
#define STATO_NIENTE   0
#define STATO_SLASH    1
#define STATO_COMMENTO_C  2
#define STATO_COMMENTO_C_STAR 3
#define STATO_STRINGA   4
#define STATO_BACKSLASH   5
#define STATO_COMMENTO_CPP  6
void main (void)
{
 int i,iStato,iLastState;
 iStato = STATO_NIENTE;
 while ((i=getchar())!=EOF) {
  switch (iStato) {
  case STATO_NIENTE:
   if (i=='/')
    iStato = STATO_SLASH;
   else if (i=='"') {
    putchar (i);
    iStato = STATO_STRINGA;
   }
   else
    putchar (i);
   break;
  case STATO_STRINGA:
   putchar (i);
   if (i=='"')
    iStato = STATO_NIENTE;
   break;
  case STATO_SLASH:
   if (i=='*')
    iStato = STATO_COMMENTO_C;
   else if (i=='/')
    iStato = STATO_COMMENTO_CPP;
   else if (i=='\\') {
    iLastState = STATO_SLASH;
    iStato = STATO_BACKSLASH;
   }
   else {
    ungetc (i,stdin);
    iStato = STATO_NIENTE;
   }
   break;
  case STATO_BACKSLASH:
   if (i!='\n')
    ungetc (i,stdin);
   iStato = iLastState;
   break;
  case STATO_COMMENTO_C:
   if (i=='*')
    iStato = STATO_COMMENTO_C_STAR;
   break;
  case STATO_COMMENTO_C_STAR:
   if (i=='/')
    iStato = STATO_NIENTE;
   else if (i=='\\') {
    iLastState = STATO_COMMENTO_C_STAR;
    iStato = STATO_BACKSLASH;
   }
   else {
    ungetc (i,stdin);
    iStato = STATO_COMMENTO_C;
   }
   break;
  case STATO_COMMENTO_CPP:
   if (i=='\n')
    iStato = STATO_NIENTE;
   else if (i=='\\') {
    iLastState = STATO_SLASH;
    iStato = STATO_BACKSLASH;
   }
   break;
  }
 }
}
-- 
/* Costantino Grana                                */
main(int c,char**o){char*s=c?"+L7?+;:7?+:OKIK+9?;9=;"
":+9?;:<:;+9?;;;:;+9<:;<::;+RLJ;K9+":1[o],t,a=!c,m;do
for (m=*s-'0',t=a?m/c:m%c;m>>7?c=1<<m+8,!a&&puts(&a)*
*&a:t--;printf("  \0/*"+a));while ((a^=3)||a[++s]);;}
/* Original code due to Chris Brown... impressive! */

 Mi pare manchi la chiusura alla fine, o sbaglio?
Si, manca la chiusura.


 Dimmi se ti serve a qualcosa.
Non l'ho testato estensivamente, ma il programma cambia la
formattazione del codice.
Ad es. questo
<CODE>
int msgsLst_insertMessage
(
   void*  pMsgsP,     // RW | lista in cui inserire il messaggio
   char*  pMsgStrP    // R  | stringa da inserire.
)
</CODE>
viene cambiato in questo
<CODE>
int msgsLst_insertMessage
(
   void*  pMsgsP,        char*  pMsgStrP    )
</CODE>
e non, come mi aspetterei, in
<CODE>
int msgsLst_insertMessage
(
   void*  pMsgsP,
   char*  pMsgStrP
)
</CODE>
La cosa potrebbe essere fastidiosa...


 formattazione del codice.
Hai perfettamente ragione. il problema era che non stampavo il '\n' dopo i 
commenti C++.
Cosě dovrebbe funzionare meglio (ho aggiunto un'ungetc):
#include <stdio.h>
#define STATO_NIENTE   0
#define STATO_SLASH    1
#define STATO_COMMENTO_C  2
#define STATO_COMMENTO_C_STAR 3
#define STATO_STRINGA   4
#define STATO_BACKSLASH   5
#define STATO_COMMENTO_CPP  6
void main (void)
{
 int i,iStato,iLastState;
 freopen("esempio.c","rt",stdin);
// freopen("decommented.c","wt",stdout);

   if (i=='\n') {
    ungetc (i,stdin);
    iStato = STATO_NIENTE;
   }


perchè scrivere qualcosa che già esiste..... I love sed :)
ciao
PP
