remove
This commit is contained in:
		
							parent
							
								
									07846d0635
								
							
						
					
					
						commit
						7c5ee2e70a
					
				
					 1 changed files with 0 additions and 220 deletions
				
			
		
							
								
								
									
										220
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										220
									
								
								src/main.rs
									
									
									
									
									
								
							| 
						 | 
					@ -1,220 +0,0 @@
 | 
				
			||||||
use std::io;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
fn recurse_through_c_files(dir: &str) -> io::Result<()> {
 | 
					 | 
				
			||||||
    let dir = std::fs::read_dir(dir)?;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for file in dir {
 | 
					 | 
				
			||||||
        let file = file?;
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
        let file_path = file.path();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if file.path().is_dir() {
 | 
					 | 
				
			||||||
            recurse_through_c_files(file_path.to_str()
 | 
					 | 
				
			||||||
                     .expect("filepath should be converted to string slice"))?;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        let ext = file_path.extension()
 | 
					 | 
				
			||||||
            .and_then(|v| v.to_str())
 | 
					 | 
				
			||||||
            .unwrap_or_else(|| "");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if ext != "c" {
 | 
					 | 
				
			||||||
            continue;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        println!("{:?}", file.path().with_extension("o").file_name().expect("files should have names"));
 | 
					 | 
				
			||||||
        todo!()
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<<<<<<< Updated upstream
 | 
					 | 
				
			||||||
    Ok(())
 | 
					 | 
				
			||||||
=======
 | 
					 | 
				
			||||||
    fn contains_objdir_def(&self) -> bool {
 | 
					 | 
				
			||||||
        let re = Regex::new(r"\s+OBJDIR = ").unwrap();
 | 
					 | 
				
			||||||
        re.is_match(&(self.prologue)) || re.is_match(&(self.epilogue))
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
     
 | 
					 | 
				
			||||||
    fn write_new_generated_content(&self, generated_content: String) -> std::io::Result<()> {
 | 
					 | 
				
			||||||
        let content = [&self.prologue, START_KEY, &generated_content, END_KEY, &self.epilogue].concat();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        fs::write(&self.path, &content)?;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Ok(())
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
fn join_build_rule_vec(vector: &Vec<BuildRule>, seperator: &str) -> String{
 | 
					 | 
				
			||||||
    let mut ret = String::new();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (i, rule) in vector.iter().enumerate() {
 | 
					 | 
				
			||||||
        if i != 0 {
 | 
					 | 
				
			||||||
            ret.push_str(seperator);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        ret.push_str(&rule.to_string());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ret
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
impl ToString for RuleList {
 | 
					 | 
				
			||||||
    fn to_string(&self) -> String {
 | 
					 | 
				
			||||||
        let targets = join_build_rule_vec(&self.get_target_rules(), "");
 | 
					 | 
				
			||||||
        let objects = join_build_rule_vec(&self.get_object_rules(), "");
 | 
					 | 
				
			||||||
        let directories = join_build_rule_vec(&self.get_directory_rules(), "");
 | 
					 | 
				
			||||||
        let conveniences = join_build_rule_vec(&self.get_convenience_rules(), "");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        [targets, objects, directories, conveniences].concat()
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
impl RuleList {
 | 
					 | 
				
			||||||
    fn new() -> RuleList{
 | 
					 | 
				
			||||||
        RuleList(vec![])
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fn recursively_gen_objects(&mut self, proj_dir_path: &str) -> std::io::Result<()>{
 | 
					 | 
				
			||||||
        let files = fs::read_dir(proj_dir_path)?;
 | 
					 | 
				
			||||||
        for file in files {
 | 
					 | 
				
			||||||
            let file = file?;
 | 
					 | 
				
			||||||
            let is_dir = file.metadata()?.is_dir();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // ignore hidden files
 | 
					 | 
				
			||||||
            if file_is_hidden(&file) {
 | 
					 | 
				
			||||||
                continue;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            let path = file.path();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if is_dir {
 | 
					 | 
				
			||||||
                self.recursively_gen_objects(path.to_str().unwrap())?;
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                match path.extension() {
 | 
					 | 
				
			||||||
                    Some(v) => {
 | 
					 | 
				
			||||||
                        let v = v.to_str().unwrap();
 | 
					 | 
				
			||||||
                        if v != "c" {
 | 
					 | 
				
			||||||
                            continue;
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                        let path = path.to_str().unwrap();
 | 
					 | 
				
			||||||
                        self.0.push(BuildRuleKind::Object(BuildRule::new_from_c_file(path)));
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    None => {
 | 
					 | 
				
			||||||
                        continue;
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        Ok(())
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fn get_obj_targets(&self) -> Vec<String>{
 | 
					 | 
				
			||||||
        let mut ret: Vec<String> = Vec::new();
 | 
					 | 
				
			||||||
        for rule in &self.0 {
 | 
					 | 
				
			||||||
            match rule {
 | 
					 | 
				
			||||||
                BuildRuleKind::Object(r) => ret.push(r.target.clone()),
 | 
					 | 
				
			||||||
                _ => break,
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        ret
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fn add_target_rule(&mut self) {
 | 
					 | 
				
			||||||
        let mut objects = self.get_obj_targets();
 | 
					 | 
				
			||||||
        let target_comm = String::from(
 | 
					 | 
				
			||||||
            format!("$(CC) $(LDFLAGS) -o $(BUILDDIR)/$(TARGET) {} $(LDLIBS)", objects.join(" "))
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        objects.push(String::from("| $(OBJDIR) $(BUILDDIR)"));
 | 
					 | 
				
			||||||
        let prereqs = objects;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        self.0.push(BuildRuleKind::Target(BuildRule {
 | 
					 | 
				
			||||||
            target: String::from("$(BUILDDIR)/$(TARGET)"),
 | 
					 | 
				
			||||||
            prerequisites: prereqs,
 | 
					 | 
				
			||||||
            recipe_commands: vec![target_comm],
 | 
					 | 
				
			||||||
        }))
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fn add_directory_rule(&mut self, dir: &str) {
 | 
					 | 
				
			||||||
        self.0.push(BuildRuleKind::Directory(BuildRule {
 | 
					 | 
				
			||||||
            target: dir.to_string(),
 | 
					 | 
				
			||||||
            prerequisites: vec![],
 | 
					 | 
				
			||||||
            recipe_commands: vec![format!("mkdir -p {dir}").to_string()]
 | 
					 | 
				
			||||||
        }));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fn add_clean_rule(&mut self) {
 | 
					 | 
				
			||||||
        self.0.push(BuildRuleKind::Convenience(BuildRule {
 | 
					 | 
				
			||||||
            target: String::from(".PHONY: clean\nclean"),
 | 
					 | 
				
			||||||
            prerequisites: vec![],
 | 
					 | 
				
			||||||
            recipe_commands: vec![String::from("rm -r $(OBJDIR)"), String::from("rm -r $(BUILDDIR)")]
 | 
					 | 
				
			||||||
        }));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fn add_run_rule(&mut self) {
 | 
					 | 
				
			||||||
        self.0.push(BuildRuleKind::Convenience(BuildRule {
 | 
					 | 
				
			||||||
            target: String::from(".PHONY: run\nrun"),
 | 
					 | 
				
			||||||
            prerequisites: vec![String::from("$(BUILDDIR)/$(TARGET)")],
 | 
					 | 
				
			||||||
            recipe_commands: vec![String::from("./$(BUILDDIR)/$(TARGET) $(args)")]
 | 
					 | 
				
			||||||
        }));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fn get_target_rules(&self) -> Vec<BuildRule> {
 | 
					 | 
				
			||||||
        let mut ret: Vec<BuildRule> = Vec::new();
 | 
					 | 
				
			||||||
        for rule in &self.0 {
 | 
					 | 
				
			||||||
            match rule {
 | 
					 | 
				
			||||||
                BuildRuleKind::Target(r) => ret.push(r.clone()),
 | 
					 | 
				
			||||||
                _ => continue,
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        ret
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fn get_object_rules(&self) -> Vec<BuildRule> {
 | 
					 | 
				
			||||||
        let mut ret: Vec<BuildRule> = Vec::new();
 | 
					 | 
				
			||||||
        for rule in &self.0 {
 | 
					 | 
				
			||||||
            match rule {
 | 
					 | 
				
			||||||
                BuildRuleKind::Object(r) => ret.push(r.clone()),
 | 
					 | 
				
			||||||
                _ => continue,
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        ret
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fn get_directory_rules(&self) -> Vec<BuildRule> {
 | 
					 | 
				
			||||||
        let mut ret: Vec<BuildRule> = Vec::new();
 | 
					 | 
				
			||||||
        for rule in &self.0 {
 | 
					 | 
				
			||||||
            match rule {
 | 
					 | 
				
			||||||
                BuildRuleKind::Directory(r) => ret.push(r.clone()),
 | 
					 | 
				
			||||||
                _ => continue,
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        ret
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fn get_convenience_rules(&self) -> Vec<BuildRule> {
 | 
					 | 
				
			||||||
        let mut ret: Vec<BuildRule> = Vec::new();
 | 
					 | 
				
			||||||
        for rule in &self.0 {
 | 
					 | 
				
			||||||
            match rule {
 | 
					 | 
				
			||||||
                BuildRuleKind::Convenience(r) => ret.push(r.clone()),
 | 
					 | 
				
			||||||
                _ => continue,
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        ret
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
fn file_is_hidden(file: &DirEntry) -> bool{
 | 
					 | 
				
			||||||
    let file_name = file.file_name();
 | 
					 | 
				
			||||||
    let str_name = file_name.to_str().unwrap();
 | 
					 | 
				
			||||||
    let first_char = str_name.chars().nth(0).unwrap();
 | 
					 | 
				
			||||||
    if first_char == '.' {
 | 
					 | 
				
			||||||
        true
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        false
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
>>>>>>> Stashed changes
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
fn main() {
 | 
					 | 
				
			||||||
    recurse_through_c_files(".").unwrap_or_else(|e| {
 | 
					 | 
				
			||||||
        panic!("error: could not recurse through directory: {e}");
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
		Loading…
	
		Reference in a new issue