update readme (#21797)
[mono-project.git] / mcs / class / Microsoft.Build.Tasks / Mono.XBuild.Tasks.GenerateResourceInternal / PoResourceReader.cs
blob1cb77bb20476b101dc6d1451fa4e50ea4905629b
1 //
2 // PoResourceReader.cs: Reader from monoresgen.
3 //
4 // Author:
5 // Marek Sieradzki (marek.sieradzki@gmail.com)
6 // Paolo Molaro (lupus@ximian.com)
7 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
8 //
9 // (C) 2005 Marek Sieradzki
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System;
32 using System.Collections;
33 using System.IO;
34 using System.Resources;
35 using System.Text;
37 namespace Mono.XBuild.Tasks.GenerateResourceInternal {
38 internal class PoResourceReader : IResourceReader {
39 Hashtable data;
40 Stream s;
41 int line_num;
43 public PoResourceReader (Stream stream)
45 data = new Hashtable ();
46 s = stream;
47 Load ();
50 public virtual void Close ()
52 s.Close ();
55 public IDictionaryEnumerator GetEnumerator()
57 return data.GetEnumerator ();
60 string GetValue (string line)
62 int begin = line.IndexOf ('"');
63 if (begin == -1)
64 throw new FormatException (String.Format ("No begin quote at line {0}: {1}", line_num, line));
66 int end = line.LastIndexOf ('"');
67 if (end == -1)
68 throw new FormatException (String.Format ("No closing quote at line {0}: {1}", line_num, line));
70 return line.Substring (begin + 1, end - begin - 1);
73 void Load ()
75 StreamReader reader = new StreamReader (s);
76 string line;
77 string msgid = null;
78 string msgstr = null;
79 bool ignoreNext = false;
81 while ((line = reader.ReadLine ()) != null) {
82 line_num++;
83 line = line.Trim ();
84 if (line.Length == 0)
85 continue;
87 if (line [0] == '#') {
88 if (line.Length == 1 || line [1] != ',')
89 continue;
91 if (line.IndexOf ("fuzzy") != -1) {
92 ignoreNext = true;
93 if (msgid != null) {
94 if (msgstr == null)
95 throw new FormatException ("Error. Line: " + line_num);
96 data.Add (msgid, msgstr);
97 msgid = null;
98 msgstr = null;
101 continue;
104 if (line.StartsWith ("msgid ")) {
105 if (msgid == null && msgstr != null)
106 throw new FormatException ("Found 2 consecutive msgid. Line: " + line_num);
108 if (msgstr != null) {
109 if (!ignoreNext)
110 data.Add (msgid, msgstr);
112 ignoreNext = false;
113 msgid = null;
114 msgstr = null;
117 msgid = GetValue (line);
118 continue;
121 if (line.StartsWith ("msgstr ")) {
122 if (msgid == null)
123 throw new FormatException ("msgstr with no msgid. Line: " + line_num);
125 msgstr = GetValue (line);
126 continue;
129 if (line [0] == '"') {
130 if (msgid == null || msgstr == null)
131 throw new FormatException ("Invalid format. Line: " + line_num);
133 msgstr += GetValue (line);
134 continue;
137 throw new FormatException ("Unexpected data. Line: " + line_num);
140 if (msgid != null) {
141 if (msgstr == null)
142 throw new FormatException ("Expecting msgstr. Line: " + line_num);
144 if (!ignoreNext)
145 data.Add (msgid, msgstr);
149 IEnumerator IEnumerable.GetEnumerator ()
151 return GetEnumerator();
154 void IDisposable.Dispose ()
156 if (data != null)
157 data = null;
159 if (s != null) {
160 s.Close ();
161 s = null;