using System; using System.IO; using System.Text.RegularExpressions; using System.Windows.Forms; namespace fmtxml { /// /// Summary description for GenToXml. /// 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(""); 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+"\n\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\n\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(""); 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\n\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\n\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(""); 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+"\n\""); 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\n"); // 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\n\n"); } strGenXml.Write(""); } } }