// /home/daniel/Projects/Directory/Directory/Main.cs created with MonoDevelop // User: daniel at 02:03 a 15/01/2008 // // To change standard headers go to Edit->Preferences->Coding->Standard Headers // // project created on 15/01/2008 at 02:03 a using System; using System.IO; using System.Text; using System.Collections.Specialized; namespace DirectorySmart { /** * Esta clase permite obtener Listados de Directorios y realizar * operaciones asociadas a ellos. **/ class DirectoryListing{ /** * Permite obtener el listado de todos los archivos visibles en el directorio especificado * @param path Ruta a revisar **/ public String[] listing (String path){ String [] files = Directory.GetFiles(path); return files; } /** * Permite obtener el listado de archivos del directorio actual **/ public Array listing (){ return listing("."); } /** * Permite obtener el listado de archivos del directorio especificado utilizando un patrón como * *.c * @param path Directorio a listar * @param pattern Patrón a buscar **/ public String[] listing(String path,String pattern){ String []files = Directory.GetFiles(path,pattern); return files; } /** * Genera un directorio con el nombre de archivo particular según el filtro * especificado. * Util para generar los esquemas de proyecto necesarios para * el DevCpp y similares. * Guarda automáticamente una copia del archivo generador dentro. * No sobreescribe los archivos dentro de las carpetas. * @param path Directorio donde se crearán las carpetas y se leerán los archivos * @param pattern Patrón de búsqueda. **/ public void createDirectoryForFile(String path,String pattern){ String []files = listing(path,pattern); String name=""; String dest=""; String code = ""; foreach (String file in files){ name = file.Substring(0,file.IndexOf('.')); dest = name + Path.AltDirectorySeparatorChar + Path.GetFileName(file); Console.WriteLine(name); if (!Directory.Exists(name)) Directory.CreateDirectory(name); if (!File.Exists(dest)){ /** Convertimos el código de Borland C a DevCpp **/ code = File.ReadAllText(file); code = Compiler.translateDevCpp(code); File.WriteAllText(dest, code); } } } } /** * Esta clase Permite generar Archivos de Proyecto para DevCpp **/ static class DevCppProject { private static String Pattern = ".c"; /** Pattern almacena el tipo de archivos que vamos a procesar**/ public static void setPattern (String pattern){ Pattern = pattern; } /** * Generamos la configuración del Proyecto DevCpp * @param filename Nombre del Archivo de Proyecto **/ public static String ProjectSettings(String filename){ StringBuilder s = new StringBuilder(); s.Append("[Project]\n"); s.Append("Filename="+filename+".dev\n"); s.Append("UnitCount=1\n"); s.Append("Type=1\n"); s.Append("Linker=-lbgi -lgdi32 -luser32\n"); s.Append("Ver=3\n"); s.Append("IsCpp=1\n"); s.Append("Folders=\n"); s.Append("CommandLine=\n"); s.Append("CompilerSettings=0000000000000000000000\n"); s.Append("PchHead=-1\n"); s.Append("PchSource=-1\n"); s.Append("ProfilesCount=1\n"); s.Append("ProfileIndex=0\n"); return s.ToString(); } /** * Permite agregar unidades de compilación (archivos fuente) * @param folder Directorio donde se ecncuetran * @param name Nombre del archivo * @param index Numero de Unidad de Compilación **/ public static String addUnit(String folder, String name, int index){ StringBuilder s = new StringBuilder(); s.Append("[Unit"+index+"]\n"); s.Append("FileName="+name+Pattern+"\n"); s.Append("CompileCpp=1\n"); s.Append("Folder="+name+"\n"); s.Append("Compile=1\n"); s.Append("Link=1\n"); s.Append("Priority=1000\n"); s.Append("OverrideBuildCmd=0\n"); s.Append("BuildCmd=\n"); return s.ToString(); } /**Método para abreviar cuando solamente hay un archivo fuente**/ public static String addUnit(String folder,String name){ return addUnit(folder,name,1); } /** * Agrega un profile para la compilación **/ public static String addProfile(){ StringBuilder s = new StringBuilder(); s.Append("[Profile1]\n"); s.Append("ProfileName=Default Profile\n"); s.Append("Type=1\n"); s.Append("ObjFiles=\n"); s.Append("Includes=\n"); s.Append("Libs=\n"); s.Append("PrivateResource=\n"); s.Append("ResourceIncludes=\n"); s.Append("MakeIncludes=\n"); s.Append("Compiler=\n"); s.Append("CppCompiler=\n"); s.Append("Linker=-lbgi -lgdi32 -luser32\n"); s.Append("PreprocDefines=\n"); s.Append("CompilerSettings=0000000000000000000000\n"); s.Append("Icon=\n"); s.Append("ExeOutput=Default Profile\n"); s.Append("ObjectOutput=Default Profile\n"); s.Append("OverrideOutput=0\n"); s.Append("OverrideOutputName=\n"); s.Append("HostApplication=\n"); s.Append("CommandLine=\n"); s.Append("UseCustomMakefile=0\n"); s.Append("CustomMakefile=\n"); s.Append("IncludeVersionInfo=0\n"); s.Append("SupportXPThemes=0\n"); s.Append("CompilerSet=0\n"); s.Append("compilerType=0\n"); return s.ToString(); } /** * Nos permite generar los archivos de Proyecto necesarios * para DevCpp utilizando los flags del compilador apropiados*/ public static void saveToFile(String folder, String name){ System.IO.StreamWriter writer; writer = File.CreateText(folder+ Path.DirectorySeparatorChar+ name + ".dev"); writer.Write(ProjectSettings(name)); writer.Write(addUnit(folder,name)); writer.Write(addProfile()); writer.Close(); } } /** * Esta clase hace toda las traducciones de código * **/ public class Compiler{ /** * Esta es la salida compatible con el DevCpp * Posteriormente se puede agregar soporte a otros compiladores y * sistemas operativos. * @param code Código fuente a traducir * **/ public static string translateDevCpp(string code) { StringCollection source = new StringCollection(); source.Add(@"#\s*include\s+<\s*graphics.h\s*>");//Limpiar graphics.h source.Add(@"/closegraph\s*();/");//Buscamos el closegraph y agregamos un return EXIT_SUCCESS source.Add(@"void\s+main\s*\(");//Cambiamos el tipo de dato de la función main source.Add(@"#\s*include\s+<\s*dos.h\s*>");//Limpiar dos.h source.Add(@"randomize\s*(\s*)\s*;"); StringCollection dest = new StringCollection(); dest.Add("#include "); dest.Add("closegraph();\nreturn EXIT_SUCCESS"); dest.Add("int main ("); dest.Add("//#include"); dest.Add("rand();"); StringEnumerator destEnumerator = dest.GetEnumerator(); destEnumerator.Reset(); foreach (string s in source) { destEnumerator.MoveNext(); code = System.Text.RegularExpressions.Regex.Replace(code, s, destEnumerator.Current); } return code; } } class MainClass { public static void Main(string[] args) { Console.WriteLine("Hello World!"); DirectoryListing l = new DirectoryListing(); Array r = l.listing("C:\\programas","*.cpp"); foreach(String i in r){ Console.WriteLine(i); l.createDirectoryForFile("C:\\programas","*.cpp"); DevCppProject.setPattern(".cpp"); String name = Path.GetFileName(i).Substring(0,Path.GetFileName(i).IndexOf('.')); DevCppProject.saveToFile(Path.GetDirectoryName(i)+Path.DirectorySeparatorChar+name,name); } } } }