156 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.IO;
 | 
						|
using System.Text.RegularExpressions;
 | 
						|
using System.Windows.Forms;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
namespace fmtxml
 | 
						|
{
 | 
						|
	/// <summary>
 | 
						|
	/// Summary description for GenToXml.
 | 
						|
	/// </summary>
 | 
						|
	public class GenToXml
 | 
						|
	{
 | 
						|
		private StreamWriter strGenXml;
 | 
						|
		private string genName;
 | 
						|
 | 
						|
		private string MyPath;
 | 
						|
		private string MyResPath;
 | 
						|
		public GenToXml(string nm, string path, string resPath)
 | 
						|
		{
 | 
						|
			MyPath = path;
 | 
						|
			MyResPath = resPath;
 | 
						|
			genName = nm;
 | 
						|
			try
 | 
						|
			{
 | 
						|
				OpenFiles();
 | 
						|
				ConvertGenToXml();
 | 
						|
				CloseFiles();
 | 
						|
			}
 | 
						|
			catch (Exception ex)
 | 
						|
			{
 | 
						|
				MessageBox.Show("Genmac name = " + nm, ex.Message);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public void OpenFiles()
 | 
						|
		{
 | 
						|
			if (!Directory.Exists(MyResPath + @"\genmacall\convert"))
 | 
						|
				Directory.CreateDirectory(MyResPath + @"\genmacall\convert");
 | 
						|
			string fnm = MyResPath + @"\genmacall\convert" + @"\" + genName;
 | 
						|
			string outnm = fnm.Substring(0,fnm.LastIndexOf(".")) + ".xml";
 | 
						|
			strGenXml = new StreamWriter(outnm,false,System.Text.Encoding.ASCII);
 | 
						|
		}
 | 
						|
 | 
						|
		public void CloseFiles()
 | 
						|
		{
 | 
						|
			strGenXml.Close();
 | 
						|
		}
 | 
						|
 | 
						|
		public void ConvertGenToXml()
 | 
						|
		{
 | 
						|
			string linein;
 | 
						|
			try
 | 
						|
			{
 | 
						|
				// use regular expressions to read in the genmac C file and convert to XML.
 | 
						|
				StreamReader sr = new StreamReader(MyPath + @"\preproc\"+genName);
 | 
						|
				linein = sr.ReadToEnd(); 
 | 
						|
				sr.Close();
 | 
						|
			}
 | 
						|
			catch (Exception e) 
 | 
						|
			{
 | 
						|
				// Let the user know what went wrong.
 | 
						|
				MessageBox.Show("File cannot be written " + genName + " error is " + e.Message);
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			if (linein==null)return;
 | 
						|
			int indxb = linein.IndexOf("BEGIN");
 | 
						|
			string line = linein.Substring(indxb,linein.Length-indxb);
 | 
						|
			linein=null;
 | 
						|
			// first Find defmac - endmac -> convert these do an element.
 | 
						|
			Regex defmacs = new Regex(@"DEFMAC(\s*|.*?)*ENDMAC",RegexOptions.IgnoreCase|RegexOptions.Compiled);
 | 
						|
			Match m;
 | 
						|
			strGenXml.Write("<" + genName.Substring(0,genName.LastIndexOf(".")) + "_GENMAC>\n");
 | 
						|
			for (m = defmacs.Match(line); m.Success; m = m.NextMatch())
 | 
						|
			{
 | 
						|
				strGenXml.Write("<MACRO><NAME>");				
 | 
						|
				string mt = line.Substring(m.Index,m.Length);
 | 
						|
				//Find the macro name, i.e. DEFMAC(xyz)
 | 
						|
				int indxend = mt.IndexOf(")");
 | 
						|
				string macname = mt.Substring(7,indxend-7);
 | 
						|
				strGenXml.Write(macname+"</NAME>\n<DEFINITION>\n");
 | 
						|
				// the '+3' is to remove the \n\r also. The -9 is to account for the +3 &
 | 
						|
				// also remove the endmac
 | 
						|
				string macstr = mt.Substring(indxend+3,mt.Length-indxend-9);
 | 
						|
				// take x chars for the name & put out the name & definition.
 | 
						|
				string macnocomment = Regex.Replace(macstr, @"(\/\*(\s*|.*?)*\*\/)|(\/\/.*)", "");
 | 
						|
				mt = Regex.Replace(macnocomment,";","");
 | 
						|
				macnocomment = Regex.Replace(mt,@"\r\n",";");
 | 
						|
				mt = Regex.Replace(macnocomment,@";+",";");  // eliminate multiple ';'
 | 
						|
				macnocomment = mt;
 | 
						|
				if (mt.IndexOf("&")>-1)
 | 
						|
					macnocomment = mt.Replace("&","&");
 | 
						|
				strGenXml.Write(macnocomment);
 | 
						|
				strGenXml.Write("\n</DEFINITION>\n</MACRO>\n");
 | 
						|
			}
 | 
						|
			// next find userdef - endmac -> convert these do an element.
 | 
						|
			defmacs = new Regex(@"USERDEF(\s*|.*?)*ENDMAC",RegexOptions.IgnoreCase|RegexOptions.Compiled);
 | 
						|
			for (m = defmacs.Match(line); m.Success; m = m.NextMatch())
 | 
						|
			{
 | 
						|
				strGenXml.Write("<USERDEF><NAME>");				
 | 
						|
				string mt = line.Substring(m.Index,m.Length);
 | 
						|
				//Find the macro name, i.e. USERDEF(xyz)
 | 
						|
				int indxend = mt.IndexOf(")");
 | 
						|
				string macname = mt.Substring(8,indxend-8);
 | 
						|
				strGenXml.Write(macname+"\n</NAME>\n<DEFINITION>\n");
 | 
						|
				// the '+3' is to remove the \n\r also. The -9 is to account for the +3 &
 | 
						|
				// also remove the endmac
 | 
						|
				string macstr = mt.Substring(indxend+3,mt.Length-indxend-9);
 | 
						|
				// take x chars for the name & put out the name & definition.
 | 
						|
				string macnocomment = Regex.Replace(macstr, @"(\/\*(\s*|.*?)*\*\/)|(\/\/.*)", "");
 | 
						|
				mt = Regex.Replace(macnocomment,";","");
 | 
						|
				macnocomment = Regex.Replace(mt,@"\r\n",";");
 | 
						|
				mt = Regex.Replace(macnocomment,@";+",";");  // eliminate multiple ';'
 | 
						|
				macnocomment = mt;
 | 
						|
				if (mt.IndexOf("&")>-1)
 | 
						|
					macnocomment = mt.Replace("&","&");
 | 
						|
				strGenXml.Write(macnocomment);
 | 
						|
				strGenXml.Write("\n</DEFINITION>\n</USERDEF>\n");
 | 
						|
			}
 | 
						|
			// last find static functions - these have macro definitions too.
 | 
						|
			Regex defmacf = new Regex(@"static void (\s*|.*?)*}",RegexOptions.IgnoreCase|RegexOptions.Compiled);
 | 
						|
			for (m = defmacf.Match(line); m.Success; m = m.NextMatch())
 | 
						|
			{
 | 
						|
				strGenXml.Write("<STATICVOID><NAME>");
 | 
						|
				string mt = line.Substring(m.Index,m.Length);
 | 
						|
				//Find the function name, i.e. static void boxx. Parameters are on an different node(int i)
 | 
						|
				int indxbeg= mt.IndexOf("(");
 | 
						|
				string fnname = mt.Substring(12,indxbeg-12);
 | 
						|
				strGenXml.Write(fnname+"</NAME>\n<PARAMETERS>\"");
 | 
						|
				int indxend=mt.IndexOf(")");
 | 
						|
				string param = null;
 | 
						|
				if (indxend-1==indxbeg)
 | 
						|
					param = "none";
 | 
						|
				else
 | 
						|
					param = mt.Substring(indxbeg+1,indxend-1-indxbeg);
 | 
						|
 | 
						|
				strGenXml.Write(param+"\"\n</PARAMETERS>\n<DEFINITION>");
 | 
						|
				// now get past the opening curly.
 | 
						|
				indxbeg = mt.IndexOf("{");
 | 
						|
				string fnstr = mt.Substring(indxbeg+2,mt.Length-indxbeg-3);
 | 
						|
				string macnocomment = Regex.Replace(fnstr, @"(\/\*(\s*|.*?)*\*\/)|(\/\/.*)", ""); // matches multi/single line comments: (\/\*(\s*|.*?)*\*\/)|(\/\/.*)
 | 
						|
				mt = Regex.Replace(macnocomment,";","");
 | 
						|
				macnocomment = Regex.Replace(mt,@"\r\n",";");
 | 
						|
				mt = Regex.Replace(macnocomment,@";+",";");
 | 
						|
				if (mt.IndexOf("&")>-1)
 | 
						|
					mt = mt.Replace("&","&");
 | 
						|
				strGenXml.Write(mt);
 | 
						|
				strGenXml.Write("\n</DEFINITION>\n</STATICVOID>\n");
 | 
						|
			}
 | 
						|
			
 | 
						|
			strGenXml.Write("</" + genName.Substring(0,genName.LastIndexOf(".")) + "_GENMAC>");
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |