2007-10-19 Nagappan A <anagappan@novell.com>
[mono.git] / eglib / src / gunicode.c
index 8692dd1fb05c4906108214ad231507ed63215411..d9e680994ec45ea82ae5f9ca2a0e5e07d85add99 100644 (file)
  */
 #include <stdio.h>
 #include <glib.h>
+#include <errno.h>
+#ifdef _MSC_VER
+/* FIXME */
+#define CODESET 1
+typedef int iconv_t;
+#else
 #include <langinfo.h>
 #include <iconv.h>
-#include <errno.h>
+#endif
 
 static char *my_charset;
 static gboolean is_utf8;
@@ -45,27 +51,49 @@ static gboolean is_utf8;
 GUnicodeType 
 g_unichar_type (gunichar c)
 {
-       g_error ("g_unichar_type is not implemented");
+       g_error ("%s", "g_unichar_type is not implemented");
        return 0;
 }
 
 gunichar
 g_unichar_tolower (gunichar c)
 {
-       g_error ("g_unichar_type is not implemented");
+       g_error ("%s", "g_unichar_type is not implemented");
        return 0;
 }
 
+gboolean
+g_unichar_isxdigit (gunichar c)
+{
+       return (g_unichar_xdigit_value (c) != -1);
+
+}
+
+gint
+g_unichar_xdigit_value (gunichar c)
+{
+       if (c >= 0x30 && c <= 0x39) /*0-9*/
+               return (c - 0x30);
+       if (c >= 0x41 && c <= 0x46) /*A-F*/
+               return (c - 0x37);
+       if (c >= 0x61 && c <= 0x66) /*a-f*/
+               return (c - 0x57);
+       return -1;
+}
+
 gchar *
 g_convert (const gchar *str, gssize len,
           const gchar *to_codeset, const gchar *from_codeset,
           gsize *bytes_read, gsize *bytes_written, GError **error)
 {
+       char *result = NULL;
+#ifdef G_OS_WIN32
+#else
        iconv_t convertor;
-       char *buffer, *result, *output;
+       char *buffer, *output;
        const char *strptr = (const char *) str;
-       int str_len = len == -1 ? strlen (str) : len;
-       int buffer_size;
+       size_t str_len = len == -1 ? strlen (str) : len;
+       size_t buffer_size;
        size_t left, out_left;
        
        convertor = iconv_open (to_codeset, from_codeset);
@@ -85,8 +113,8 @@ g_convert (const gchar *str, gssize len,
                if (res == (size_t) -1){
                        if (errno == E2BIG){
                                char *n;
-                               int extra_space = 8 + left;
-                               int output_used = output - buffer;
+                               size_t extra_space = 8 + left;
+                               size_t output_used = output - buffer;
                                
                                buffer_size += extra_space;
                                
@@ -125,6 +153,7 @@ g_convert (const gchar *str, gssize len,
        result = buffer;
  leave:
        iconv_close (convertor);
+#endif
        return result;
 }
 
@@ -140,13 +169,15 @@ g_filename_from_utf8 (const gchar *utf8string, gssize len, gsize *bytes_read, gs
                len = strlen (utf8string);
 
        res = g_malloc (len + 1);
-       g_strlcpy (res, utf8string, len);
+       g_strlcpy (res, utf8string, len + 1);
        return res;
 }
 
 gboolean
-g_get_charset (char **charset)
+g_get_charset (G_CONST_RETURN char **charset)
 {
+#ifdef G_OS_WIN32
+#else
        if (my_charset == NULL){
                my_charset = g_strdup (nl_langinfo (CODESET));
                is_utf8 = strcmp (my_charset, "UTF-8") == 0;
@@ -155,6 +186,7 @@ g_get_charset (char **charset)
        if (charset != NULL)
                *charset = my_charset;
 
+#endif
        return is_utf8;
 }