示例#1
0
        public static void Init(string package, string localedir)
        {
            IntPtr intPtr;
            IntPtr intPtr1;
            IntPtr intPtr2;

            Catalog.MarshalStrings(package, out intPtr, localedir, out intPtr1, "UTF-8", out intPtr2);
            try
            {
                if (Catalog.bindtextdomain(intPtr, intPtr1) == IntPtr.Zero)
                {
                    throw new UnixIOException(Errno.ENOMEM);
                }
                if (Catalog.bind_textdomain_codeset(intPtr, intPtr2) == IntPtr.Zero)
                {
                    throw new UnixIOException(Errno.ENOMEM);
                }
                if (Catalog.textdomain(intPtr) == IntPtr.Zero)
                {
                    throw new UnixIOException(Errno.ENOMEM);
                }
            }
            finally
            {
                UnixMarshal.FreeHeap(intPtr);
                UnixMarshal.FreeHeap(intPtr1);
                UnixMarshal.FreeHeap(intPtr2);
            }
        }
示例#2
0
        private static void MarshalStrings(string s1, out IntPtr p1, string s2, out IntPtr p2, string s3, out IntPtr p3)
        {
            IntPtr zero   = IntPtr.Zero;
            IntPtr intPtr = zero;

            p3 = zero;
            IntPtr intPtr1 = intPtr;

            intPtr = intPtr1;
            p2     = intPtr1;
            p1     = intPtr;
            bool flag = true;

            try
            {
                p1 = UnixMarshal.StringToHeap(s1);
                p2 = UnixMarshal.StringToHeap(s2);
                if (s3 != null)
                {
                    p3 = UnixMarshal.StringToHeap(s3);
                }
                flag = false;
            }
            finally
            {
                if (flag)
                {
                    UnixMarshal.FreeHeap((void *)p1);
                    UnixMarshal.FreeHeap((void *)p2);
                    UnixMarshal.FreeHeap((void *)p3);
                }
            }
        }
示例#3
0
        public static string GetPluralString(string s, string p, int n)
        {
            IntPtr intPtr;
            IntPtr intPtr1;
            IntPtr intPtr2;
            string str;

            Catalog.MarshalStrings(s, out intPtr, p, out intPtr1, null, out intPtr2);
            try
            {
                IntPtr intPtr3 = Catalog.ngettext(intPtr, intPtr1, n);
                if (intPtr3 != intPtr)
                {
                    str = (intPtr3 != intPtr1 ? UnixMarshal.PtrToStringUnix(intPtr3) : p);
                }
                else
                {
                    str = s;
                }
            }
            finally
            {
                UnixMarshal.FreeHeap(intPtr);
                UnixMarshal.FreeHeap(intPtr1);
            }
            return(str);
        }
示例#4
0
        private static void MarshalStrings(string s1, out IntPtr p1,
                                           string s2, out IntPtr p2, string s3, out IntPtr p3)
        {
            p1 = p2 = p3 = IntPtr.Zero;

            bool cleanup = true;

            try {
                p1 = UnixMarshal.StringToHeap(s1);
                p2 = UnixMarshal.StringToHeap(s2);
                if (s3 != null)
                {
                    p3 = UnixMarshal.StringToHeap(s3);
                }
                cleanup = false;
            }
            finally {
                if (cleanup)
                {
                    UnixMarshal.FreeHeap(p1);
                    UnixMarshal.FreeHeap(p2);
                    UnixMarshal.FreeHeap(p3);
                }
            }
        }
示例#5
0
        public static void Init(String package, String localedir)
        {
            IntPtr ipackage, ilocaledir, iutf8;

            MarshalStrings(package, out ipackage, localedir, out ilocaledir,
                           "UTF-8", out iutf8);
            try {
                if (bindtextdomain(ipackage, ilocaledir) == IntPtr.Zero)
                {
                    throw new UnixIOException(Native.Errno.ENOMEM);
                }
                if (bind_textdomain_codeset(ipackage, iutf8) == IntPtr.Zero)
                {
                    throw new UnixIOException(Native.Errno.ENOMEM);
                }
                if (textdomain(ipackage) == IntPtr.Zero)
                {
                    throw new UnixIOException(Native.Errno.ENOMEM);
                }
            }
            finally {
                UnixMarshal.FreeHeap(ipackage);
                UnixMarshal.FreeHeap(ilocaledir);
                UnixMarshal.FreeHeap(iutf8);
            }
        }
示例#6
0
        public static String GetPluralString(String s, String p, Int32 n)
        {
            IntPtr ints, intp, _ignore;

            MarshalStrings(s, out ints, p, out intp, null, out _ignore);

            try
            {
                // ngettext(3) returns an input pointer if no translation is found
                IntPtr r = ngettext(ints, intp, n);
                if (r == ints)
                {
                    return(s);
                }
                if (r == intp)
                {
                    return(p);
                }
                return(UnixMarshal.PtrToStringUnix(r));
            }
            finally
            {
                UnixMarshal.FreeHeap(ints);
                UnixMarshal.FreeHeap(intp);
            }
        }
示例#7
0
        public static string GetString(string s)
        {
            string str;
            IntPtr heap = UnixMarshal.StringToHeap(s);

            try
            {
                IntPtr intPtr = Catalog.gettext(heap);
                str = (intPtr == heap ? s : UnixMarshal.PtrToStringUnix(intPtr));
            }
            finally
            {
                UnixMarshal.FreeHeap(heap);
            }
            return(str);
        }
示例#8
0
        public static String GetString(String s)
        {
            IntPtr ints = UnixMarshal.StringToHeap(s);

            try {
                // gettext(3) returns the input pointer if no translation is found
                IntPtr r = gettext(ints);
                if (r != ints)
                {
                    return(UnixMarshal.PtrToStringUnix(r));
                }
                return(s);
            }
            finally {
                UnixMarshal.FreeHeap(ints);
            }
        }
示例#9
0
        public static IntPtr StringToHeap(string s, int index, int count, Encoding encoding)
        {
            if (s == null)
            {
                return(IntPtr.Zero);
            }
            if (encoding == null)
            {
                throw new ArgumentNullException("encoding");
            }
            int maxByteCount = encoding.GetMaxByteCount(1);

            char[] charArray = s.ToCharArray(index, count);
            byte[] numArray  = new byte[encoding.GetByteCount(charArray) + maxByteCount];
            if (encoding.GetBytes(charArray, 0, (int)charArray.Length, numArray, 0) != (int)numArray.Length - maxByteCount)
            {
                throw new NotSupportedException("encoding.GetBytes() doesn't equal encoding.GetByteCount()!");
            }
            IntPtr intPtr = UnixMarshal.AllocHeap((long)((int)numArray.Length));

            if (intPtr == IntPtr.Zero)
            {
                throw new UnixIOException(Errno.ENOMEM);
            }
            bool flag = false;

            try
            {
                Marshal.Copy(numArray, 0, intPtr, (int)numArray.Length);
                flag = true;
            }
            finally
            {
                if (!flag)
                {
                    UnixMarshal.FreeHeap(intPtr);
                }
            }
            return(intPtr);
        }