directory tree parsing done (and its a mess)
This commit is contained in:
parent
a1bcfa5a94
commit
c7e42eba71
3 changed files with 72 additions and 4 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -19,3 +19,7 @@ Cargo.lock
|
||||||
# Added by cargo
|
# Added by cargo
|
||||||
|
|
||||||
/target
|
/target
|
||||||
|
|
||||||
|
# Testing files
|
||||||
|
test/
|
||||||
|
Makefile
|
||||||
|
|
|
@ -6,3 +6,4 @@ edition = "2021"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
regex = "1.9.5"
|
||||||
|
|
71
src/main.rs
71
src/main.rs
|
@ -1,15 +1,78 @@
|
||||||
use std::fs;
|
use std::fs;
|
||||||
|
use std::io::Read;
|
||||||
|
use std::path::Path;
|
||||||
|
use regex::Regex;
|
||||||
|
|
||||||
fn main() {
|
#[derive(Debug)]
|
||||||
let files = fs::read_dir("./").unwrap();
|
struct CFile {
|
||||||
|
path: String,
|
||||||
|
filename: String,
|
||||||
|
headers: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_c_file(path: &Path, re: &Regex) -> CFile {
|
||||||
|
let strpath = path.to_str().unwrap();
|
||||||
|
let filename = path.file_stem().unwrap().to_str().unwrap();
|
||||||
|
|
||||||
|
let mut file_handle = fs::File::open(path).unwrap();
|
||||||
|
let mut contents = String::new();
|
||||||
|
file_handle.read_to_string(&mut contents).unwrap();
|
||||||
|
|
||||||
|
let mut headers: Vec<String> = Vec::new();
|
||||||
|
let caps = re.captures_iter(&contents);
|
||||||
|
for (_, [include_file]) in caps.map(|c| c.extract()) {
|
||||||
|
headers.push(path.parent().unwrap().join(Path::new(include_file)).to_str().unwrap().to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
return CFile { path: strpath.to_string(), filename: filename.to_string(), headers }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fn recurse_into_dir<F: FnMut(fs::DirEntry)>(path: &Path, file_callback: &mut F) {
|
||||||
|
let files = fs::read_dir(path).unwrap();
|
||||||
for file in files {
|
for file in files {
|
||||||
let file = file.unwrap();
|
let file = file.unwrap();
|
||||||
|
let meta = file.metadata().unwrap();
|
||||||
|
let is_dir = meta.is_dir();
|
||||||
|
let is_file = meta.is_file();
|
||||||
|
let path = file.path();
|
||||||
|
let name = file.file_name();
|
||||||
|
|
||||||
let is_dir = file.metadata().unwrap().is_dir();
|
// ignore hidden files
|
||||||
|
if name.to_str().unwrap().chars().nth(0).unwrap() == '.' {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if is_dir {
|
if is_dir {
|
||||||
println!("{}", file.path().to_str().unwrap());
|
recurse_into_dir(&path, file_callback);
|
||||||
|
} else if is_file {
|
||||||
|
file_callback(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut project_files: Vec<CFile> = Vec::new();
|
||||||
|
let includes_regex = Regex::new(r#"#include\s+"(.*?)""#).unwrap();
|
||||||
|
|
||||||
|
recurse_into_dir(Path::new("./"), &mut |file| {
|
||||||
|
let path = file.path();
|
||||||
|
match path.extension() {
|
||||||
|
Some(v) => {
|
||||||
|
let v = v.to_str().unwrap();
|
||||||
|
if v != "c" {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
project_files.push(parse_c_file(&path, &includes_regex));
|
||||||
|
},
|
||||||
|
None => {
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for file in project_files.iter() {
|
||||||
|
println!("{:?}", file);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue