ok

img

Compiler

class Compiler
{
	private $c_cpp;
	private $version;
	private $mode;
	private $compiler;
	private $project;
	private $includes;
	private $library_paths;
	private $libraries;
	
	public function __construct()
	{
		$this->top();
		if(!isset($_GET["prj"])) // se non è definito il nome del progetto da compilare
		{
			$this->form(); // compare il form di selezione
		}
		else
		{
			$this->init(); // inizializzazione
			if(isset($_GET["clr"])) // pulisce e ricompila soluzione
			{
				$files = glob($this->path . "/debug/*");
				foreach($files as $file)
				{
					if(is_file($file))
					{
						unlink($file);
					}
				}
			}
			$this->compileProject(); // compilazione
			$this->linkProject(); // link
			$this->executeProject(); // execute
		}
		$this->bottom();
	}
	
	private function top()
	{
		print"<!DOCTYPE html>\n";
		print"<html>\n";
		print"<head>\n";
		print"<style>\n";
		print"body{font-family:Arial, Helvetica, sans-serif; background-color:#111; color:#ccc;}\n";
		print"table, th, td{border:1px solid #333;padding:2px;}\n";
		print"div{margin:10px;}\n";
		print"input[type=submit]{background-color:#05f; color:#fff; padding:5px; cursor:pointer; border:0;}\n";
		print".top{position:fixed; top:0; left:0; background-color:#05f; color:#fff; margin:0; width:100%; padding-left:10px;}\n";
		print".main{margin-top:150px;}\n";
		print".code{font-family:Courier New, monospace;}\n";
		print"</style>\n";
		print"</head>\n";
		print"<body>\n";
		print"<div class=\"top\"><h1>MinGW C/C++</h1>\n";
		print"<h6>Cosimo Saccone</h6></div>\n";
		print"<div class=\"main\">\n";
	}
	
	private function form()
	{
		print"<h3>project</h3>\n";
		print"<form action=\"index.php\" method=\"GET\">\n";
		print"<input type=\"text\" name=\"prj\">\n";
		print"<input type=\"submit\" value=\"open\">\n";
		print"</form>\n";
	}

	private function bottom()
	{
		print"</div>\n";
		print"</body>\n";
		print"</html>";
	}
	
	private function getName($str)
	{
		$p = strrpos($str, "/");
		$q = strpos($str, ".");
		return substr($str, $p + 1, $q - $p - 1); // dalla stringa del file elimina il percorso e il formato 
	}
	
	private function newProject()
	{
		$str = "";
		$str .= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
		$str .= "<root>\n";
		$str .= "<c_cpp>g++</c_cpp>\n";
		$str .= "<version>-std=c++0x</version>\n";
		$str .= "<mode>exe</mode>\n";
		$str .= "<include>\n";
		$str .= "<path>C:/MinGW/include</path>\n";
		$str .= "<path>C:/Users/aquar/Desktop/cosimo/glm/glm</path>\n";
		$str .= "<path>C:/Users/aquar/Desktop/cosimo/glfw-3.3.6.bin.WIN32/include</path>\n";
		$str .= "<path>C:/Users/aquar/Desktop/cosimo/SFML-2.5.1/include</path>\n";
		$str .= "<path>C:/Users/aquar/Desktop/cosimo/freeglut/include</path>\n";
		$str .= "<path>C:/Users/aquar/Desktop/cosimo/freetype-2.3.5/include</path>\n";
		$str .= "<path>C:/Users/aquar/Desktop/cosimo/freetype-2.3.5/include/freetype2</path>\n";
		$str .= "<path>C:/Users/aquar/Desktop/cosimo/glew-2.1.0-win32/glew-2.1.0/include</path>\n";
		$str .= "</include>\n";
		$str .= "<library>\n";
		$str .= "<path>C:/MinGW/lib</path>\n";
		$str .= "<path>C:/Users/aquar/Desktop/cosimo/glfw-3.3.6.bin.WIN32/lib-mingw</path>\n";
		$str .= "<path>C:/Users/aquar/Desktop/cosimo/SFML-2.5.1/lib</path>\n";
		$str .= "<path>C:/Users/aquar/Desktop/cosimo/freeglut/lib</path>\n";
		$str .= "<path>C:/Users/aquar/Desktop/cosimo/freetype-2.3.5/lib</path>\n";
		$str .= "<path>C:/Users/aquar/Desktop/cosimo/glew-2.1.0-win32/glew-2.1.0/lib</path>\n";
		$str .= "<lib>glfw3dll</lib>\n";
		$str .= "<lib>sfml-graphics</lib>\n";
		$str .= "<lib>sfml-window</lib>\n";
		$str .= "<lib>sfml-system</lib>\n";
		$str .= "<lib>freeglut</lib>\n";
		$str .= "<lib>glew32</lib>\n";
		$str .= "<lib>glu32</lib>\n";
		$str .= "<lib>opengl32</lib>\n";
		$str .= "<lib>freetype</lib>\n";
		$str .= "</library>\n";
		$str .= "<compDec>\n";
		$str .= "-Wl,--disable-stdcall-fixup\n";
		$str .= "</compDec>\n";
		$str .= "<precompiled>\n";
		$str .= "windres C:/xampp/htdocs/compiler/g++/SFML/resource/my.rc C:/xampp/htdocs/compiler/g++/SFML/debug/my.o\n";
		$str .= "</precompiled>\n";
		$str .= "</root>\n";
		$file = fopen($this->path . "/make.xml", "w") or die("Unable to open file!");
		fwrite($file, $str);
		fclose($file);
		$str = "";
		$str .= "#include <gl/freeglut.h>\n";
		$str .= "\n";
		$str .= "void display()\n";
		$str .= "{\n";
		$str .= "\t// 2d\n";
		$str .= "\tglClearColor(0.0f, 0.0f, 0.0f, 0.0f);\n";
		$str .= "\tglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n";
		$str .= "\tGLint v[4];\n";
		$str .= "\tglGetIntegerv(GL_VIEWPORT, v);\n";
		$str .= "\tglMatrixMode(GL_PROJECTION);\n";
		$str .= "\tglLoadIdentity();\n";
		$str .= "\tglOrtho(0, v[2], v[3], 0, 0, 1);\n";
		$str .= "\tglMatrixMode(GL_MODELVIEW);\n";
		$str .= "\tglLoadIdentity();\n";
		$str .= "\t//\n";
		$str .= "\tglutSwapBuffers();\n";
		$str .= "}\n";
		$str .= "\n";
		$str .= "int main(int argc, char **argv)\n";
		$str .= "{\n";
		$str .= "\tglutInit(&argc, argv);\n";
		$str .= "\tglutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);\n";
		$str .= "\tglutInitWindowPosition(100,100);\n";
		$str .= "\tglutInitWindowSize(500, 500);\n";
		$str .= "\tglutCreateWindow(\"window\");\n";
		$str .= "\tglutDisplayFunc(display);\n";
		$str .= "\tglutMainLoop();\n";
		$str .= "}";
		$file = fopen($this->path . "/main.cpp", "w") or die("Unable to open file!");
		fwrite($file, $str);
		fclose($file);
	}
	
	private function init()
	{
		$this->compiler = str_replace(chr(92), chr(47), getcwd()) . "/"; // indirizzo del compiler
		$this->project = $_GET["prj"];
		$this->path = $this->compiler . $this->project;
		if(!is_dir($this->path)) // se la cartella manca viene creato un nuovo progetto
		{
			mkdir($this->path . "/debug", 0777, true); // creazione della cartella di debug
			mkdir($this->path . "/log", 0777, true); // creazione della cartella di log
			$this->newProject();
			header("Refresh:0");
		}
		else
		{
			$xml = simplexml_load_file($this->path . "/make.xml"); // xml
			$include_path = @$xml->include->path; // array con tutti gli include
			$library_path = @$xml->library->path; // array con tutti i percorsi per le librerie
			$library = @$xml->library->lib; // array con tutte le librerie
			$this->c_cpp = @$xml->c_cpp; // C o C++
			$this->version = @$xml->version; 
			$this->mode = @$xml->mode; // exe, dll, lib
			$this->preprocessing = @$xml->preprocessing->set;
			$this->precompiled = @$xml->precompiled;
			$this->compDec = @$xml->compDec;
			$this->linkDec = @$xml->linkDec;
			$this->includes = "";
			$this->library_paths = "";
			$this->libraries = "";
			$len = @count($include_path);
			for($i = 0; $i < $len; $i++)
			{
				if(strlen($include_path[$i]) > 0)
				{
					$this->includes .= "-I " . $include_path[$i] . " ";
				}
			}
			$len = @count($library_path);
			for($i = 0; $i < $len; $i++)
			{
				if(strlen($library_path[$i]) > 0)
				{
					$this->library_paths .= "-L " . $library_path[$i] . " ";
				}
			}
			$len = @count($library);
			for($i = 0; $i < $len; $i++)
			{
				if(strlen($library[$i]) > 0)
				{
					$this->libraries .= "-l" . $library[$i] . " ";
				}
			}
			print("<h3>" . $this->project . "</h3>");
		}
	}
	
	private function compileProject()
	{
		$count = 0;
		$str = "";
		foreach(glob($this->path . "/*.cpp") as $file)
		{
			$filename = $this->getName($file);
			$file_cpp = $this->path . "/" . $filename . ".cpp";
			$file_o = $this->path . "/debug/" . $filename . ".o";//print($file_cpp."<br>");
			if(file_exists($file_o))
			{
				$date_cpp = intval(date("YmdHis", filemtime($file_cpp)));
				$date_o = intval(date("YmdHis", filemtime($file_o)));
				if($date_cpp > $date_o) // se la data del file cpp è superiore a quella dell'obj il file va ricompilato
				{
					$str .= " -c " . $file_cpp;
					$count++;
				}
			}
			else
			{
				$str .= " -c " . $file_cpp;
				$count++;
			}
		}
		$str = $this->c_cpp . " -g " . $this->version . " " . @$this->preprocessing . " " . $this->includes . $str . " > " . $this->path . "/log/compiling.log 2>&1";
		print("<div class = \"code\">");
		if($count > 0)
		{
			shell_exec($str);
			clearstatcache();
			print($str . "<br><br>");
		}
		print($count . " file(s) compiled...<br><br></div>");
		foreach(glob($this->compiler . "*.o") as $file)
		{
			$filename = $this->getName($file);
			rename($file, $this->path . "/debug/" . $filename . ".o"); // trasferisce tutti i file .o nella cartella debug
		}
	}
	
	private function linkProject()
	{
		$str = "";
		$name = $this->path . "/" . $this->project; // definizione del nome
		if($this->mode == "exe")
		{
			$str .= $this->c_cpp . " " . $this->version . " -o " . $name . " "; // realizzazione di un eseguibile
		}
		else if($this->mode == "lib")
		{
			$str .= "ar -rcs " . $name . ".a "; // realizzazione di una libreria statica
		}
		else if($this->mode == "dll")
		{
			$str .= $this->c_cpp . " " . $this->version . " -shared -o " . $name . ".so "; // realizzazione di una libreria dinamica
		}
		else
		{
			print"mode ERROR<br>";
			exit();
		}
		$str .= " " . $this->path . "/debug/*.o "; // tutti i file .o nella cartella debug
		$str .= " " . $this->library_paths; // aggiunge i percorsi delle librerie
		$str .= " " . $this->libraries; // aggiunge le librerie
		$str .= " 2> " . $this->path . "/log/linking.log"; // scrive il log con gli errori
		$str .= " " . $this->linkDec;
		print("<div class=\"code\">" . $str . "<br><br>file(s) linked...<br><br></div>");
		shell_exec($str);
		clearstatcache();
		print("<form action=\"index.php\" method=\"GET\">\n");
		print("<input name=\"prj\" type=\"hidden\" value=\"" . $this->project . "\">\n");
		print("<input name=\"clr\" type=\"submit\" value=\"clear solution\">\n");
		print("</form>\n");
	}
	
	private function executeProject()
	{
		$str = $this->path . "/" . $this->project;
		$str = "C:/xampp/htdocs/compiler/g++/SFML/SFML";
		//system($str);
	}
}

new Compiler();

Biografia

Mi chiamo Cosimo Saccone e sono un programmatore napoletano di 44 anni con oltre 35 anni di esperienza nella programmazione (BASIC, Assembly). Realizzo progetti e programmi utilizzando i principali e più diffusi linguaggi (C, C++, PHP, Javascript, HTML) e software per la grafica (Photoshop, Illustrator, 3dsMax). Anche se la grafica rappresenta il mio principale settore di interesse, non disdegno il lavoro di back-end e di organizzazione dati e sono attento agli aspetti di efficienza e di risparmio delle risorse tipica della programmazione di basso livello (specie nel settore della grafica 3d). Realizzo siti internet, applicativi desktop e servizi di vario tipo. Ho una buona conoscenza della libreria OpenGL per lo sviluppo di applicazioni 3d interattive in C/C++. Cerco di adottare uno stile di programmazione fortemente ordinato e modulare. Possiedo, inoltre, una buona capacità di elaborazione della documentazione. Ho vari hobbies tra cui la pittura, la ginnastica e le lunghe passeggiate in solitudine.

facebook instagram youtube
HTML5 Template create by Cosimo Saccone 2022

Al fine di migliorare l’esperienza di navigazione sul nostro sito noi di cosimosaccone.com e i nostri partner selezionati elaboriamo i dati personali, compreso l’indirizzo IP e le pagine visitate, in relazione alla tua navigazione nei contenuti del sito, per i seguenti scopi:

Accesso alle informazioni
Dati precisi di geolocalizzazione
Misurazione del pubblico
Pubblicità e contenuti personalizzati
Ti ricordiamo che il termine cookie si riferisce a una porzione di dati inviati al tuo browser da un web server. Il cookie viene memorizzato sul tuo dispositivo e riconosciuto dal sito web che lo ha inviato in ogni navigazione successiva. Se vuoi saperne di più e compiere una scelta diversa, come il rifiuto del trattamento dei tuoi dati personali, clicca qui sulla nostra privacy policy. Potrai sempre modificare le tue scelte e impostare i singolo cookies selezionando il bottone qui sotto.
OK