In .:
[mono.git] / mcs / class / Mono.Globalization / write-source.cs
1 using System;
2 using System.IO;
3 using System.Text;
4 using System.Xml;
5
6 class ClassWriter {
7
8         public StreamWriter writer;
9         XmlDocument document;
10         static readonly string ns = "Mono.Globalization";
11         static readonly string path = "MonoCultures.cs";
12
13         public ClassWriter ()
14         {
15                 this.writer = new StreamWriter (path);
16                 this.document = new XmlDocument ();
17         }
18
19         public void WriteStartNamespaceDecl ()
20         {
21                 writer.Write ("namespace {0} {{\n", ns);
22         }
23
24         public void WriteEndNamespaceDecl ()
25         {
26                 writer.Write ("}");
27         }
28
29         public void WriteStartClassDef (string class_name, string base_class)
30         {
31                 writer.Write ("\tclass {0} : {1}\n\t{{\n", class_name, base_class);
32         }
33
34         public void WriteEndClassDef ()
35         {
36                 writer.Write ("\t}\n\n");
37         }
38
39         public void WriteStartMethod (string method)
40         {
41                 writer.Write ("\t\tvoid {0} ()\n\t\t{{\n", method);
42         }
43
44         public void WriteEndMethod ()
45         {
46                 writer.Write ("\t\t}\n");
47         }
48
49         public void WriteConstructor (string name)
50         {
51                 writer.Write ("\t\tprivate {0} () : base (0) {{}}\n", name);
52         }
53
54         public void WriteStartConstructor (string class_name)
55         {
56                 writer.Write ("\t\tpublic {0} ()\n\t\t{{\n", class_name);
57         }
58
59         public void WriteEndConstructor ()
60         {
61                 writer.Write ("\t\t}\n");
62         }
63
64         public void WriteMember (string member)
65         {
66                 string expression = String.Format ("/CultureInfo/{0}", member);
67                 XmlNode result = document.SelectSingleNode (expression);
68                 if (result == null)
69                         return;
70
71                 WriteMember (member, result);
72         }
73
74         public void WriteMember (string member, XmlNode node)
75         {
76                 string value;
77
78                 if (member.EndsWith ("Name") || member.EndsWith ("Separator") || 
79                         member.EndsWith ("Symbol") || member.EndsWith ("Sign")) 
80
81                         value = String.Format ("\"{0}\"", node.InnerXml);
82                 else
83                         value = node.InnerXml;
84
85                 writer.Write ("\t\t\t{0} = {1};\n", member, value);
86         }
87
88         public void WriteCalendar ()
89         {
90                 string expression = String.Format ("/CultureInfo/Calendar");
91                 XmlNode result = document.SelectSingleNode (expression);
92
93                 writer.Write ("\t\t\tCalendar = new {0} ();\n", result.InnerXml);
94         }
95
96         public void WriteCompareInfo ()
97         {
98                 XmlNode compare_info_lcid = document.SelectSingleNode ("/CultureInfo/CompareInfo/@LCID");
99                 WriteMember ("CompareInfo_LCID", compare_info_lcid);
100         }
101         
102         public void WriteTextInfo ()
103         {
104                 XmlNode info = document.SelectSingleNode ("/CultureInfo/TextInfo");
105                 
106                 WriteMember ("TextInfo_ANSICodePage", info.SelectSingleNode ("ANSICodePage"));
107                 WriteMember ("TextInfo_EBCDICCodePage", info.SelectSingleNode ("EBCDICCodePage"));
108                 WriteMember ("TextInfo_MacCodePage", info.SelectSingleNode ("MacCodePage"));
109                 WriteMember ("TextInfo_OEMCodePage", info.SelectSingleNode ("OEMCodePage"));
110                 WriteMember ("TextInfo_ListSeparator", info.SelectSingleNode ("ListSeparator"));
111         }
112
113         public string WriteArray (XmlNode node)
114         {
115                 string value = String.Format ("new int [{0}] {{", node.ChildNodes.Count);
116
117                 foreach (XmlNode n in node.ChildNodes)
118                         value += n.InnerText;
119                 
120                 value = value + " }";
121
122                 return value;
123         }
124
125         public string WriteString (XmlNode node)
126         {
127                 return "\"" + node.InnerText + "\"";
128         }
129
130         public void WriteNumberFormatInfo ()
131         {
132                 XmlNode info = document.SelectSingleNode ("/CultureInfo/NumberFormat");
133                 
134                 if (info == null)
135                         return;
136                 
137                 string number_format = 
138                         String.Format (
139                         @"NumberFormat = new System.Globalization.NumberFormatInfo (
140                                 {0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, 
141                                 {10}, {11}, {12}, {13}, {14}, {15}, {16}, {17}, {18}, {19}, {20},
142                                 {21}, {22}, {23});",
143                                 info.SelectSingleNode ("CurrencyDecimalDigits").InnerXml,
144                                 WriteString (info.SelectSingleNode ("CurrencyDecimalSeparator")),
145                                 WriteString (info.SelectSingleNode ("CurrencyGroupSeparator")),
146                                 WriteArray (info.SelectSingleNode ("CurrencyGroupSizes")),
147                                 info.SelectSingleNode ("CurrencyNegativePattern").InnerXml,
148                                 info.SelectSingleNode ("CurrencyPositivePattern").InnerXml,
149                                 WriteString (info.SelectSingleNode ("CurrencySymbol")), 
150                                 WriteString (info.SelectSingleNode ("NaNSymbol")), 
151                                 WriteString (info.SelectSingleNode ("NegativeInfinitySymbol")),
152                                 WriteString (info.SelectSingleNode ("NegativeSign")),
153                                 info.SelectSingleNode ("NumberDecimalDigits").InnerXml, 
154                                 WriteString (info.SelectSingleNode ("NumberDecimalSeparator")),
155                                 WriteArray (info.SelectSingleNode ("NumberGroupSizes")),
156                                 info.SelectSingleNode ("NumberNegativePattern").InnerXml, 
157                                 info.SelectSingleNode ("PercentDecimalDigits").InnerXml,
158                                 WriteString (info.SelectSingleNode ("PercentDecimalSeparator")), 
159                                 WriteString (info.SelectSingleNode ("PercentGroupSeparator")), 
160                                 WriteArray (info.SelectSingleNode ("PercentGroupSizes")), 
161                                 info.SelectSingleNode ("PercentNegativePattern").InnerXml, 
162                                 info.SelectSingleNode ("PercentPositivePattern").InnerXml,
163                                 WriteString (info.SelectSingleNode ("PercentSymbol")), 
164                                 WriteString (info.SelectSingleNode ("PerMilleSymbol")), 
165                                 WriteString (info.SelectSingleNode ("PositiveInfinitySymbol")), 
166                                 WriteString (info.SelectSingleNode ("PositiveSign")));
167                 
168                 writer.Write ("\t\t\t" + number_format + "\n");
169         }
170
171         public void WriteParent ()
172         {
173                 string expression = String.Format ("/CultureInfo/Parent");
174                 XmlNode result = document.SelectSingleNode (expression);
175
176                 if (result == null)
177                         return;
178
179                 WriteMember ("ParentName", result);
180         }
181
182         public void WriteComment (string comment)
183         {
184                 writer.Write ("\t\t// {0}\n", comment);
185         }
186
187         public void Load (string file)
188         {
189                 document.Load (file);
190         }
191
192         public void Write ()
193         {
194                 WriteStartClassDef (ClassName, "System.Globalization.CultureInfo.MonoCulture");
195
196                 WriteStartConstructor (ClassName);
197
198                 WriteCalendar ();
199                 WriteMember ("EnglishName");
200                 WriteMember ("LCID");
201                 WriteMember ("Name");
202                 WriteMember ("NativeName");
203                 WriteParent ();
204                 WriteMember ("ThreeLetterISOLanguageName");
205                 WriteMember ("ThreeLetterWindowsLanguageName"); 
206                 WriteMember ("TwoLetterISOLanguageName");
207                 WriteTextInfo ();
208                 WriteCompareInfo ();
209                 WriteNumberFormatInfo ();
210
211                 WriteEndConstructor ();
212                 WriteEndClassDef ();
213                 writer.Flush ();
214         }
215
216         public string ClassName {
217                 get {
218                         string culture =  document.SelectSingleNode ("/CultureInfo/LCID").InnerText;
219                         return String.Format ("MonoCulture__{0}", culture);
220                 }
221         }
222 }
223
224 class Driver {
225         static void Main ()
226         {
227                 int i = 0;
228                 ClassWriter w = new ClassWriter ();
229                 w.WriteStartNamespaceDecl ();
230                 w.WriteStartClassDef ("MonoCultureInfo", "System.Globalization.CultureInfo");
231                 w.WriteComment ("This should never be invoked");
232                 w.WriteConstructor ("MonoCultureInfo");
233
234                 foreach (string file in Directory.GetFiles ("./Data", "*.xml")) {
235                         Console.WriteLine (file);
236                         w.Load (file);
237                         w.Write ();
238                 }
239
240                 w.WriteEndClassDef ();
241                 w.WriteEndNamespaceDecl ();
242
243                 w.writer.Flush ();
244                 Console.WriteLine ("Done");
245         }
246 }