summaryrefslogtreecommitdiff
path: root/src/inc/genheaders.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/inc/genheaders.cs')
-rw-r--r--src/inc/genheaders.cs222
1 files changed, 222 insertions, 0 deletions
diff --git a/src/inc/genheaders.cs b/src/inc/genheaders.cs
new file mode 100644
index 0000000000..af33b1d17f
--- /dev/null
+++ b/src/inc/genheaders.cs
@@ -0,0 +1,222 @@
+using System;
+using System.Xml;
+using System.Xml.Schema;
+using System.IO;
+
+public class GenerateHeaders {
+
+ public static void Main(string[] args) {
+
+ if (args.Length != 3) {
+ Console.WriteLine("Usage:genheaders XML-file header-file resorce-file");
+ return;
+ }
+
+ ValidateXML(args[0]);
+ String Message=null;
+ String SymbolicName=null;
+ String NumericValue=null;
+ String tempheaderfile = "temp.h";
+ String temprcfile = "temp.rc";
+
+ StreamWriter HSW=File.CreateText(tempheaderfile);
+ StreamWriter RSW=File.CreateText(temprcfile);
+
+ int FaciltyUrt=0x13;
+ int SeveritySuccess=0;
+ int SeverityError=1;
+
+ int minSR = MakeHresult(SeveritySuccess,FaciltyUrt,0);
+ int maxSR = MakeHresult(SeveritySuccess,FaciltyUrt,0xffff);
+ int minHR = MakeHresult(SeverityError,FaciltyUrt,0);
+ int maxHR = MakeHresult(SeverityError,FaciltyUrt,0xffff);
+
+
+ PrintHeader(HSW);
+ PrintResourceHeader(RSW);
+
+ XmlTextReader rdr = new XmlTextReader(args[0]);
+ rdr.WhitespaceHandling = WhitespaceHandling.None;
+
+ while (rdr.Read()) {
+
+ switch (rdr.NodeType) {
+
+ case XmlNodeType.Element:
+
+ if (rdr.Name.ToString() == "HRESULT") {
+ NumericValue=rdr.GetAttribute("NumericValue");
+ }
+ if (rdr.Name.ToString() == "Message") {
+ Message = rdr.ReadString();
+ }
+ if (rdr.Name.ToString() == "SymbolicName") {
+ SymbolicName = rdr.ReadString();
+ }
+
+ break;
+
+ case XmlNodeType.EndElement:
+ if(rdr.Name.ToString() == "HRESULT"){
+
+ // For CLR Hresult's we take the last 4 digits as the resource strings.
+
+ if ( (NumericValue.StartsWith("0x")) || (NumericValue.StartsWith("0X")) ) {
+
+ String HexResult = NumericValue.Substring(2);
+ int num = int.Parse(HexResult, System.Globalization.NumberStyles.HexNumber);
+
+ if ((num>minSR) && (num <= maxSR)) {
+ num = num & 0xffff;
+ HSW.WriteLine("#define " + SymbolicName + " SMAKEHR(0x" + num.ToString("x") + ")");
+ } else if ((num>minHR) && (num <= maxHR)) {
+ num = num & 0xffff;
+ HSW.WriteLine("#define " + SymbolicName + " EMAKEHR(0x" + num.ToString("x") + ")");
+ } else {
+ HSW.WriteLine("#define " + SymbolicName + " " + NumericValue );
+ }
+
+
+
+ } else {
+ HSW.WriteLine("#define " + SymbolicName + " " + NumericValue );
+ }
+
+ if (Message != null) {
+ RSW.Write("\tMSG_FOR_URT_HR(" + SymbolicName + ") ");
+ RSW.WriteLine(Message);
+ }
+
+ SymbolicName = null;
+ NumericValue = null;
+ Message = null;
+ }
+ break;
+
+ }
+ }
+
+ PrintFooter(HSW);
+ PrintResourceFooter(RSW);
+
+ HSW.Close();
+ RSW.Close();
+
+ bool AreFilesEqual = false;
+
+ if (File.Exists(args[1])) {
+ StreamReader sr1 = new StreamReader(tempheaderfile);
+ StreamReader sr2 = new StreamReader(args[1]);
+ AreFilesEqual = CompareFiles(sr1, sr2);
+ sr1.Close();
+ sr2.Close();
+ }
+
+ if (!AreFilesEqual) {
+ File.Copy(tempheaderfile, args[1], true);
+ File.Copy(temprcfile, args[2], true);
+ }
+
+ if (!File.Exists(args[2])) {
+ File.Copy(temprcfile, args[2], true);
+ }
+
+ File.Delete(tempheaderfile);
+ File.Delete(temprcfile);
+ }
+
+ private static void ValidateXML (String XMLFile) {
+
+ // Set the validation settings on the XmlReaderSettings object.
+ XmlReaderSettings settings = new XmlReaderSettings();
+
+ settings.ValidationType = ValidationType.Schema;
+ settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
+
+ settings.ValidationEventHandler += new ValidationEventHandler (ValidationCallBack);
+
+ // Create the XmlReader object.
+ XmlReader reader = XmlReader.Create(XMLFile, settings);
+
+ // Parse the file.
+
+ while (reader.Read()) {
+ }
+ }
+
+ // Display any validation errors.
+ private static void ValidationCallBack(object sender, ValidationEventArgs e) {
+ Console.WriteLine("Validation Error: {0}", e.Message);
+ Environment.Exit(-1);
+ }
+
+
+ private static void PrintHeader(StreamWriter SW) {
+
+ SW.WriteLine("#ifndef __COMMON_LANGUAGE_RUNTIME_HRESULTS__");
+ SW.WriteLine("#define __COMMON_LANGUAGE_RUNTIME_HRESULTS__");
+ SW.WriteLine();
+ SW.WriteLine("#include <winerror.h>");
+ SW.WriteLine();
+ SW.WriteLine();
+ SW.WriteLine("//");
+ SW.WriteLine("//This file is AutoGenerated -- Do Not Edit by hand!!!");
+ SW.WriteLine("//");
+ SW.WriteLine("//Add new HRESULTS along with their corresponding error messages to");
+ SW.WriteLine("//corerror.xml");
+ SW.WriteLine("//");
+ SW.WriteLine();
+ SW.WriteLine("#ifndef FACILITY_URT");
+ SW.WriteLine("#define FACILITY_URT 0x13");
+ SW.WriteLine("#endif");
+ SW.WriteLine("#ifndef EMAKEHR");
+ SW.WriteLine("#define SMAKEHR(val) MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_URT, val)");
+ SW.WriteLine("#define EMAKEHR(val) MAKE_HRESULT(SEVERITY_ERROR, FACILITY_URT, val)");
+ SW.WriteLine("#endif");
+ SW.WriteLine();
+ }
+
+ private static void PrintFooter(StreamWriter SW) {
+ SW.WriteLine();
+ SW.WriteLine();
+ SW.WriteLine("#endif // __COMMON_LANGUAGE_RUNTIME_HRESULTS__");
+ }
+
+ private static void PrintResourceHeader(StreamWriter SW) {
+ SW.WriteLine("STRINGTABLE DISCARDABLE");
+ SW.WriteLine("BEGIN");
+ }
+
+ private static void PrintResourceFooter(StreamWriter SW) {
+ SW.WriteLine("END");
+ }
+
+ private static bool CompareFiles(StreamReader sr1, StreamReader sr2) {
+ String line1,line2;
+
+ while (true) {
+ line1 = sr1.ReadLine();
+ line2 = sr2.ReadLine();
+
+ if ( (line1 == null) && (line2 == null) ) {
+ return true;
+ }
+
+ if (line1 != line2) {
+ return false;
+ }
+
+ }
+
+ }
+
+ private static int MakeHresult(int sev, int fac, int code) {
+ return ((sev<<31) | (fac<<16) | (code));
+ }
+}
+
+
+
+
+
+