Newsgroup: it.comp.lang.c
Titolo: contare linee di codice

Qualcuno conosce un utility per conteggiare le linee di codice c/c++
escludendo commenti e linee vuote.
    grazie, ciao.
--
-------------------------------
Daniele Ziglioli
Signal s.r.l.
sig...@numerica.it
-------------------------------

 escludendo commenti e linee vuote.
Non mi dire che c'è ancora qualcuno che utilizza questo arcaico e ormai
ridicolo sistema di tariffazione!
EMG

,

Eggia`,
Ci si sente, come si dice dalle mie parti, valutati
"un tanto al sacco", ma tant'e`.
Se ti puo` consolare l'arcaico interesse viene da lontano,
dal Giappone, o almeno cosi` si e` giustifucato chi la richiesta
me l'ha presentata.
E cosi` non intendendo perdere nemmeno 5 minuti per scrivere un
programma in grado di soddisfarla ho pensato di verificare se qualche
anima pia, un poco piu` ligia al dovere di me fosse gia` passata sotto
le forche di tanto simpatiche richieste.
	riciao.
Sent via Deja.com 
http://www.deja.com/
Before you buy.

 "un tanto al sacco", ma tant'e`.
Allora rispondi "un tanto al kilo".
Ovvero, conta le tue linee di codice totali e, a seconda dei tuoi stili,
valuta un 80% di codice vero ed il resto di commenti e linee vuote :-)
Ciao
--
Alessandro Monti

escludendo commenti e linee vuote.
E' facile da scrivere.
In realta' basta creare 3 filtri, uno che tolga le linee bianche, uno
che tolga i commenti C/C++, ed uno che conti il numero di righe di un
file di testo.
Poi basta usarli mediante pipeline, con un comando del tipo :
nocomm < source.txt | nobline | lcount
i filtri che ho scritto sono :
nocomm   : elimina i commenti C/C++
nobline  : elimina le linee bianche
lcount   : conta le linee in input
Uno dei vantaggi che si ha con i filtri e' la capacita' di utilizzarli
insieme o separatamente.
------ nocomm.c ----- inizio
#include <stdio.h>
static int stato = 0 ;
main()
{
    int c ;
    while (( c = getchar() ) != EOF)
    {
          switch( stato )
          {
                case 0 : switch ( c )
                         {
                                case '/'  : stato = 1 ; break ;
                                case '\"' : putchar( '\"' ) ;
                                            stato = 2 ; break ;
                                default   : putchar( c ) ;
                         } ; break ;
                case 1 : if ( c == '*' )
                         {
                            stato = 4 ;
                         }
                         else
                         if ( c == '/' )
                         {
                            stato = 6 ;
                         }
                         else
                         {
                            putchar( '/' ) ;
                            putchar( c ) ;
                            stato = 0 ;
                         }
                         break ;
                case 2 : if ( c == '\\' )
                         {
                            stato = 3 ;
                         }
                         else
                         if ( c == '\"' )
                         {
                            putchar( '\"' ) ;
                            stato = 0 ;
                         }
                         else
                            putchar( c ) ;
                         break ;
                case 3 : putchar( '\\' ) ;
                         putchar( c ) ;
                         stato = 2 ;
                         break ;
                case 4 : if ( c == '*' ) stato = 5 ; break ;
                case 5 : if ( c == '/' )
                         {
                            stato = 0 ;
                         }
                         else
                         {
                            stato = 4 ;
                         }
                         break ;
                case 6 : if ( c == '\n' )
                         {
                            putchar( '\n' ) ;
                            stato = 0 ;
                         }
                         break ;
                default : putchar( c ) ;
          }
    }
    return 0 ;
}
------ nocomm.c ----- fine
------ nobline.c ----- inizio
#include <stdio.h>
#include <ctype.h>
int is_a_blank_line( const char * s )
{
    int i ;
    for ( i = 0 ; s[i] ; i++ )
        if ( isprint( s[i] ) )
           return 0 ;
    return 1 ;
}
main()
{
    char s[100] ;
    while ( fgets( s, sizeof s, stdin ) )
    {
          if ( ! is_a_blank_line( s ) )
          {
             fputs( s, stdout ) ;
          }
    }
    return 0 ;
}
------ nobline.c ----- fine
------ lcount.c ----- inizio
#include <stdio.h>
main()
{
    unsigned long n = 0L ;
    char s[100] ;
    while ( fgets( s, sizeof s, stdin ) )
    {
          ++n ;
    }
    printf("lines : %lu\n", n ) ;
    return 0 ;
}
------ lcount.c ----- fine
--
Andrea Laforgia 
andrea_...@bigfoot.com

ridicolo sistema di tariffazione!
In tal caso, so gia' come diventare ricco ;) :
p
r
i
n
t
f
(
"
h
e
l
l
o
w
o
r
l
d
\
n
"
)
;
--
Andrea Laforgia 
andrea_...@bigfoot.com

 file di testo.
Bellini! Io ho dei filtri di tipo vario realizzati come esercizio tempo fa.
Uno di questi, forse il piů complesso, restituisce il numero di riche, di
parole, di caratteri, effettua un conteggio della frequenza delle parole in
ordine di frequenza o alfabetico e forse qualcos'altro. Niente di specifico
per il C, i commenti e le linee vuote, ma se Laforgia non si offende,
copierň i suoi sorgenti per aumentare la mia piccola schiera.
Tra l'altro, se interessa, ecco quelli che ho io:
TAB.COM
:        Opera la sostituzione di 2 o piu' spazi con 1 tabulatore.
TABS21.COM
:     Sostituisce 2 o piu' tabulatori con 1 tabulatore.
FUPPER.COM
:     Cambia le lettere da minuscole a maiuscole.
FLOWER.COM
:     Cambia le lettere da maiuscole a minuscole.
oltre ad un piů classico CAT, che chi usa unix dovrebbe conoscere. Non trovo
piů, perň, lalibreria da includere per permettere l'espansione dei wildcard
nella linea di comando sotto DOS.
--
Alessandro Monti

 nella linea di comando sotto DOS.
Nel mio vecchio TurboC++ 1.01 bastava linkare WILDARGS.OBJ.
EMG

> Nel mio vecchio TurboC++ 1.01 bastava linkare WILDARGS.OBJ.
Infatti, solo che del mio Turbo C++ 3.0 ho solo i dischetti 5"1/4, gli altri
sembrano spariti. Dove averli prestati a nonsochi e mai più tornati :-(((
--
Alessandro Monti