summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenedict <benedict@0xb8000.de>2016-11-12 19:23:06 +0100
committerBenedict <benedict@0xb8000.de>2016-11-12 19:29:59 +0100
commite51b8220dc700eed259e4b25f23820da2683d7a5 (patch)
treebc2f9ff4924e79b77d3de5c27579aee7316e01f3
parent2aaff9278c5011468fa5b0e7981dda4e9244377c (diff)
loc: added new flag --summaryHEADmaster
With this new flag the lines of code for each file type and the total lines of code will be printed at the end.
-rw-r--r--Cargo.toml2
-rw-r--r--src/main.rs63
2 files changed, 48 insertions, 17 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 3ab30ca..02a5b64 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,7 +1,7 @@
[package]
name = "loc"
version = "0.1.0"
-authors = ["Benedict Boerger <benedict.boerger@cs.tu-dortmund.de>"]
+authors = ["Benedict <benedict@0xb8000.de>"]
[dependencies]
clap = "2.7.0"
diff --git a/src/main.rs b/src/main.rs
index a19e43d..c07ad3a 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -8,6 +8,12 @@ use clap::{App, Arg};
mod config;
+
+struct FileTypeStats{
+ file_type: String,
+ count: i64,
+}
+
fn omit_line(line: String, in_comment_section: &mut bool, comment_tokens: &config::CommentTokens) -> bool {
let s = line.trim();
let begin_comment_section = s.starts_with(comment_tokens.begin_comment_block.as_str());
@@ -37,14 +43,14 @@ fn get_config<'a>(config: &'a Vec<config::CommentTokens>, extension: &str) -> Op
None
}
-fn count_lines(filename: &str, config: &mut Vec<config::CommentTokens>) -> Result<i32>{
+fn count_lines(filename: &str, file_type_stats: &mut Vec<FileTypeStats>,
+ config: &mut Vec<config::CommentTokens>) -> Result<i64>{
let mut sum = 0;
let mut in_comment_section = false;
- // do we have config for this type of file?
let extension = match Path::new(filename).extension() {
Some(ext) => ext.to_str().unwrap(),
- None => return Err(Error::new(std::io::ErrorKind::Other, "could not get extension")),
+ None => return Err(Error::new(std::io::ErrorKind::Other, "could not get file extension")),
};
let comment_tokens = match get_config(&config, extension) {
@@ -59,22 +65,35 @@ fn count_lines(filename: &str, config: &mut Vec<config::CommentTokens>) -> Resul
}
sum += 1;
}
+
+ let mut to_add = false;
+ {
+ let file = file_type_stats.iter_mut().find(|x| x.file_type == extension);
+ match file {
+ Some(mut e) => e.count += sum,
+ None => to_add = true,
+ }
+ }
+ if to_add {
+ file_type_stats.push(FileTypeStats { file_type: extension.to_string(), count: sum });
+ }
Ok(sum)
}
-fn count_files_for_dir(dir: PathBuf, mut sum: &mut i32, mut config: &mut Vec<config::CommentTokens>) {
+fn count_files_for_dir(dir: PathBuf, mut file_types: &mut Vec<FileTypeStats>,
+ mut config: &mut Vec<config::CommentTokens>) {
match dir.read_dir() {
Ok(iter) => {
for entry in iter {
match entry {
Ok(i) => {
if i.path().is_dir() {
- count_files_for_dir(i.path(), &mut sum,
- &mut config);
+ count_files_for_dir(i.path(),
+ &mut file_types, &mut config);
}
else {
count_lines_for_file(i.path().to_str().unwrap(),
- &mut sum, &mut config);
+ &mut file_types, &mut config);
} },
Err(e) => println!("error: {}", e),
}
@@ -84,28 +103,33 @@ fn count_files_for_dir(dir: PathBuf, mut sum: &mut i32, mut config: &mut Vec<con
}
}
-fn count_lines_for_file(filename: &str, sum: &mut i32, mut config: &mut Vec<config::CommentTokens>) {
- match count_lines(filename, &mut config) {
+fn count_lines_for_file(filename: &str, mut file_type_stats: &mut Vec<FileTypeStats>,
+ mut config: &mut Vec<config::CommentTokens>) {
+ match count_lines(filename, &mut file_type_stats, &mut config) {
Ok(i) => {
println!("{}\t: {}", i, filename);
- *sum += i; },
+ },
Err(e) => println!("error for file {}: {}", filename, e),
}
}
fn main() {
- let m = App::new("loc").about("Count lines of code. Without parameter read recursive all
+ let m = App::new("loc").about("Count lines of code. Without parameter read recursive all \
files from current directory and count lines of code\
for each")
.version(crate_version!())
- .author("Benedict Börger <benedict@0xb8000.de>")
+ .author(crate_authors!())
.arg(Arg::with_name("file")
.help("files to count lines of code")
.short("f")
.long("file")
.takes_value(true)
.multiple(true))
+ .arg(Arg::with_name("summary")
+ .help("Print a summary for each file type")
+ .short("s")
+ .long("summary"))
.get_matches();
let mut config = match config::read_config() {
@@ -113,19 +137,26 @@ fn main() {
Ok(i) => i,
};
- let mut sum = 0;
+ let mut file_types = Vec::new();
if let Some(files) = m.values_of("file") {
for file in files {
- count_lines_for_file(file, &mut sum, &mut config)
+ count_lines_for_file(file, &mut file_types, &mut config)
}
}
else {
match std::env::current_dir() {
- Ok(i) => count_files_for_dir(i, &mut sum, &mut config),
+ Ok(i) => count_files_for_dir(i, &mut file_types, &mut config),
Err(e) => panic!("could not determine current dir: {}", e),
}
}
- println!("{}\t: total", sum);
+ if m.is_present("summary") {
+ let mut sum = 0;
+ for f in file_types {
+ println!("{}\t: *.{}", f.count, f.file_type);
+ sum += f.count;
+ }
+ println!("{}\t: total", sum);
+ }
}