[Utilitaire] Compteur de lignes
| Darktib |
Posté le 16 Mai 2010 à 15:59
|
|
![]() Messages : 4017 GCPoints : 347288 |
J'avais 15 minutes sur l'ordi et le nombre de lignes de code d'un de mes projet à compter, du coup j'ai fait un petit programme en dbp pour compter les lignes dans des fichiers. Je trouve que c'est plus rapide que créer un projet Code::Blocks pour utiliser son plugin de comptage de lignes. Il y a un filtre sur les fichiers traités (par exemple c;cpp;h;hpp ou dba;dbpro;bak) Voici l'exe: http://www.mediafire.com/?mgjy1yl5jt5 Dézippez dans le dossier ou sont les fichier, puis suivez les instructions après avoir lancé l'exe. Je précise que je n'utilise pas les commandes fichier de dbp^^ |
|
| graphiboc |
Posté le 17 Mai 2010 à 08:04
|
|
![]() Messages : 262 GCPoints : 40352 |
sympa, j'avais également fait un truc dans le même genre mais qui en plus listait le nombre de fonctions et les inscrivait toutes avec leur paramètres dans un fichier. Ca peut peut être t'inspirer ;-)
L'Homme est un créateur...
|
|
| SEB |
Posté le 17 Mai 2010 à 10:53
|
|
![]() Messages : 554 GCPoints : 103313 |
Très pratique comme petit utilitaire le seul et unique problème est annoncé dans le logiciel lui même : il ne peut pas etre récursif (snif) pas grave j'ai été au bout quand meme en copiant le logiciel a chaque fois dans le répertoire a comptabiliser. ^^
NextGine : 3D games engine
Nombre de lignes actuel : 77683 |
|
| graphiboc |
Posté le 17 Mai 2010 à 21:48
|
|
![]() Messages : 262 GCPoints : 40352 |
pourquoi ne pas le faire récursif ?
L'Homme est un créateur...
|
|
| Darktib |
Posté le 18 Mai 2010 à 19:46
|
|
![]() Messages : 4017 GCPoints : 347288 |
Merci des coms' dbp ne supporte pas les fonctions récursives, et j'avais pas envie de me casser la tête à écrire 100 lignes de plus @Seb: courageux! ^^
Dernière édition le 18 Mai 2010 à 19:47
|
|
| graphiboc |
Posté le 20 Mai 2010 à 07:30
|
|
![]() Messages : 262 GCPoints : 40352 |
sisi dbp peut faire de la récursion ;-)
L'Homme est un créateur...
|
|
| Darktib |
Posté le 21 Mai 2010 à 18:18
|
|
![]() Messages : 4017 GCPoints : 347288 |
Autant pour moi, j'ai parlé trop vite. Dans ce cas, je vais le faire en récursif (c'est clair que c'est beaucoup plus pratique) C'est fait: http://www.mediafire.com/?mgjy1yl5jt5 Premier post mis à jour.
Dernière édition le 21 Mai 2010 à 19:27
|
|
| Scheindorf |
Posté le 05 Juin 2010 à 16:13
|
|
![]() Messages : 77 GCPoints : 30404 |
J'en ai fait un l'autre jour en haskell tiens, Spoiler - Cliquez pour afficher Code :
import System.Posix.Files
import System.Directory
import System.IO
import System.Environment
import System.FilePath.Glob
import Debug.Trace
directory "" = return []
directory dir = do filename <- b
valid <- c
return (zip filename valid)
where
a = getDirectoryContents dir >>=
return . filter (\\x -> x /= "." && x /= "..")
b = a >>=
mapM (return.((dir++"/")++))
c = b >>=
mapM (\\x -> getFileStatus x) >>=
mapM (return . isDirectory)
exclude _ [] = False
exclude [] s = True
exclude (f:filtres) s = if not $ match (compile f) s
then exclude filtres s
else False
file name = do putStr (name)
handle <- openFile name ReadMode
content <- hGetContents handle
nbln <- (return . length . lines) content
putStrLn (" ... "++show(nbln))
hClose handle
return nbln
decision ex (a,False) = if not $ exclude ex a then return 0 else file a
decision ex (a,True) = directory a >>= mapM (decisionAcc ex 0) >>= return . sum
decisionAcc ex acc param = decision ex param >>= (\\x -> return (acc+x))
exec = do cdir <- getCurrentDirectory
liste <- directory cdir
excl <- getArgs
res <- mapM (decisionAcc excl 0) liste
putStr "Total : "
putStrLn $ (show . sum) res
{- execdbg x = do cdir <- getCurrentDirectory
liste <- directory cdir
excl <- return x
res <- mapM (decisionAcc excl 0) liste
putStr "Total : "
putStrLn $ (show) res -}
main = exec
et quelqu'un m'a gentillement reecrit comme ça : Spoiler - Cliquez pour afficher Code :
import Control.Monad
import Control.Monad.Trans
import Control.Monad.List
import Control.Monad.State
import System.Directory
import System.Environment
import System.IO
import System.Posix.Files
directory :: FilePath -> ListT (StateT Int IO) FilePath
directory "" = mzero
directory dir = do file <- ListT $ lift $ getDirectoryContents dir
guard $ not_point file
return $ dir ++ "/" ++ file
where
not_point "." = False
not_point ".." = False
not_point _ = True
linesOfFile :: String -> IO Int
linesOfFile name = do contents <- openBinaryFile name ReadMode >>= hGetContents
return $ length $ lines contents
printNbLines :: String -> IO Int
printNbLines fp = do putStr fp
n <- linesOfFile fp
putStrLn (" ... " ++ (show n))
return n
decision :: FilePath -> ListT (StateT Int IO) ()
decision fp = do status <- lift $ liftIO $ getFileStatus fp
if isDirectory status
then do file <- directory fp
decision file
else if isRegularFile status
then do n <- lift $ liftIO $ printNbLines fp
lift $ modify (+n)
else lift$ liftIO $ putStrLn (fp ++ " ... Not a regular file")
run :: FilePath -> IO ()
run fp = do putStrLn ("\\nEntering " ++ fp)
(_,i) <- runStateT (runListT $ decision fp) 0
putStrLn ("\\nTotal of " ++ fp ++ " : " ++ (show i))
main :: IO ()
main = do args <- getArgs
mapM run args
return ()
qui met plusieurs secondes de moins... il sont recursifs et supporte l'exclusion (pour le premier, pas la reecriture)
Studios Corridor
--Participez a la constitution de la base de donnée Triathlon!-- http://triathlon.lecorridor.net/question.php |
|
| Darktib |
Posté le 05 Juin 2010 à 17:13
|
|
![]() Messages : 4017 GCPoints : 347288 |
Interessant! Pour l'exclusion, tu entend sélectionner que certains types de fichiers ? Par contre j'ai beaucoup de mal à lire du code Haskell^^ (pas étonnant, vu que je programme pas en Haskell). Pour la source dba, Spoiler - Cliquez pour afficher Code : rem line counter
startsf
set window on
set display mode 800,600,32
set text font "courier"
set text size 22
set text to bold
rem introduction message
print "------ Line Counter ------"
print "Coded in 2010 by Darktib"
print "--------------------------"
print ""
rem global variables
global dim extensions(0) as string
global nbExtensions as integer
global lineCount as integer
global emptyLineCount as integer
global foundFiles as integer
global filesearched as integer
global dirsearched as integer
global patherror as integer
patherror=0
filesearched=0
dirsearched=0
lineCount = 0
emptyLineCount = 0
nbExtensions = 0
foundFiles=0
rem types
type FOLDER
path as string
name as string
endtype
rem fill extensions
res$=""
repeat
print ""
print "Input an extension WITHOUT the dot; enter"
print "a dot to finish extension input ; do not"
print "enter backspace or special characters ."
input "Extension: ",res$
if res$ <> "."
array insert at bottom extensions(0)
extensions(nbExtensions) = res$
inc nbExtensions
endif
until res$ = "."
rem start counting lines
cls
recurseFolder(get dir$())
rem search synopsis
print ""
print "-------------------------------------------------------"
print "The has been limited to the specified extensions:"
exts$=""
for t = 0 to nbExtensions
if extensions(t)<>"" then exts$ = exts$ + extensions(t) + ";"
next t
print exts$
rem results
print ""
print "-------------------------------------------------------"
print "Search result:"
print "Search in " + str$(dirsearched) + " subfolders for " + str$(filesearched) + " files (" + str$(patherror) + " path error)"
print "Files found: ";foundFiles
print "Total lines: ";lineCount
print "Hit a key to exit"
wait key
end
rem -------- FUNCTIONS -----------
function recurseFolder(dir$)
set dir dir$
local dim folders(0) as FOLDER
find first
while get file type()<>-1
if get file type() = 1
array insert at bottom folders(0)
folders(array count(folders(0))-1).path = dir$ + "\\" + get file name$()
folders(array count(folders(0))-1).name = get file name$()
endif
if get file type() = 0 then filesearched = filesearched + 1
if get file type() = 0 and canCount(get file name$())
foundFiles = foundFiles + 1
countLines(get file name$())
endif
find next
cls
print filesearched;" files..."
endwhile
for t = 0 to array count(folders(0))-1
if folders(t).name <> "." and folders(t).name <> ".."
if path exist(folders(t).path)=1
dirsearched = dirsearched + 1
recurseFolder(folders(t).path)
else
dirsearched = dirsearched + 1
patherror = patherror + 1
endif
endif
next t
endfunction
function countLines(filename$)
remstart SLOW METHOD
open to read 1,filename$
last$=""
readBytes=0
while file end(1)=0
read byte 1,octet
inc readBytes
if octet = 13
inc lineCount
if last$ = "" then inc emptyLineCount
last$=""
else
last$ = last$ + chr$(octet)
endif
endwhile
if readBytes=0
inc lineCount
inc emptyLineCount
else
inc lineCount
endif
close file 1
remend
readfilef filename$,1
lineCount = lineCount + linesf(1)
closef 1
endfunction
function canCount(filename$)
res = 0
ext$ = getExtension$(filename$)
for t = 0 to nbExtensions
if extensions(t) = ext$ then res = 1
next t
endfunction res
function sub$( substr$, start, length )
if length = -1
res$ = right$(substr$,len(substr$)-start)
else
res$ = left$(right$(substr$,len(substr$)-start), length)
endif
endfunction res$
function indexOf( substr$, iOf$ )
res = -1
ok = 0
for t = 0 to len(substr$)
if sub$(substr$,t,len(iOf$)) = iOf$ and ok = 0
ok = 1
res = t
endif
next t
endfunction res
function lastIndexOf( substr$, iOf$ )
res = -1
for t = 0 to len(substr$)
if sub$(substr$,t,len(iOf$)) = iOf$ then res = t
next t
endfunction res
function getExtension$( filename$ )
rem remove the path
res_str$ = sub$(filename$,lastIndexOf(filename$,"\\")+1,-1)
rem retrieve the last extension without the dot
res_str$ = sub$(res_str$,lastIndexOf(res_str$,".")+1,-1)
endfunction res_str$Ya des fonctions que j'ai codé pour le fun, donc ne vous étonnez pas si certaines fonctions ne sont pas utilisées^^ |
|



