Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'tools/locale-builder/Entry.cs')
-rw-r--r--tools/locale-builder/Entry.cs84
1 files changed, 84 insertions, 0 deletions
diff --git a/tools/locale-builder/Entry.cs b/tools/locale-builder/Entry.cs
new file mode 100644
index 00000000000..07beccdb53e
--- /dev/null
+++ b/tools/locale-builder/Entry.cs
@@ -0,0 +1,84 @@
+//
+//
+//
+
+using System;
+using System.Text;
+using System.Collections;
+
+namespace Mono.Tools.LocaleBuilder {
+
+ public class Entry {
+
+ // maps strings to indexes
+ static Hashtable hash;
+ static ArrayList string_order;
+ // idx 0 is reserved to indicate null
+ static int curpos = 1;
+
+ // serialize the strings in Hashtable.
+ public static string GetStrings () {
+ Console.WriteLine ("Total string data size: {0}", curpos);
+ if (curpos > UInt16.MaxValue)
+ throw new Exception ("need to increase idx size in culture-info.h");
+ StringBuilder ret = new StringBuilder ();
+ // the null entry
+ ret.Append ("\"\\0\"\n");
+ foreach (string s in string_order) {
+ ret.Append ("\t\"");
+ ret.Append (s);
+ ret.Append ("\\0\"\n");
+ }
+ return ret.ToString ();
+ }
+ static Entry () {
+ hash = new Hashtable ();
+ string_order = new ArrayList ();
+ }
+ static int AddString (string s, int size) {
+ object o = hash [s];
+ if (o == null) {
+ int ret;
+ string_order.Add (s);
+ ret = curpos;
+ hash [s] = curpos;
+ curpos += size + 1; // null terminator
+ return ret;
+ } else {
+ return (int)o;
+ }
+ }
+
+ protected static String EncodeStringIdx (string str)
+ {
+ if (str == null)
+ return "0";
+
+ StringBuilder ret = new StringBuilder ();
+ byte [] ba = new UTF8Encoding ().GetBytes (str);
+ bool in_hex = false;
+ foreach (byte b in ba) {
+ if (b > 127 || (in_hex && is_hex (b))) {
+ ret.AppendFormat ("\\x{0:x}", b);
+ in_hex = true;
+ } else {
+ if (b == '\\')
+ ret.Append ('\\');
+ ret.Append ((char) b);
+ in_hex = false;
+ }
+ }
+ int res = AddString (ret.ToString (), ba.Length);
+ return res.ToString ();
+ }
+
+ private static bool is_hex (int e)
+ {
+ return (e >= '0' && e <= '9') || (e >= 'A' && e <= 'F') || (e >= 'a' && e <= 'f');
+ }
+ }
+}
+
+
+
+