Implement 99% of what moonlight needs to run on eglib
authorChris Toshok <toshok@gmail.com>
Mon, 18 Apr 2011 20:54:14 +0000 (13:54 -0700)
committerChris Toshok <toshok@gmail.com>
Mon, 18 Apr 2011 21:12:43 +0000 (14:12 -0700)
Add a bunch of typedefs/enums/#defines to glib.h, as well as many implementations of glib functions:

    g_array_set_size
    g_array_sized_new
    g_list_remove_all
    g_string_erase
    g_string_insert
    g_string_set_size
    g_utf8_offset_to_pointer
    g_utf8_pointer_to_offset
    g_utf8_to_ucs4_fast
    g_unichar_is_space
    g_unicode_break_type (stubbed, always returns G_UNICODE_BREAK_UNKNOWN at the moment)
    g_utf8_offset_to_pointer
    g_utf8_pointer_to_offset
    g_utf8_to_ucs4_fast

eglib/src/eglib-remap.h
eglib/src/garray.c
eglib/src/glib.h
eglib/src/glist.c
eglib/src/gstring.c
eglib/src/gunicode.c
eglib/src/gutf8.c

index 6674c2abaded5b53b490166df4a3701e4ce9729e..ebdca55a02a43afb4dd56aeabb2d19db936bd1ec 100644 (file)
@@ -5,11 +5,16 @@
 #define g_array_new monoeg_g_array_new
 #define g_array_remove_index monoeg_g_array_remove_index
 #define g_array_remove_index_fast monoeg_g_array_remove_index_fast
+#define g_array_set_size monoeg_g_array_set_size
+#define g_array_sized_new monoeg_g_array_sized_new
 #define g_ascii_strdown monoeg_g_ascii_strdown
 #define g_ascii_strncasecmp monoeg_g_ascii_strncasecmp
 #define g_ascii_tolower monoeg_g_ascii_tolower
 #define g_ascii_xdigit_value monoeg_g_ascii_xdigit_value
 #define g_build_path monoeg_g_build_path
+#define g_byte_array_append monoeg_g_byte_array_append
+#define g_byte_array_free monoeg_g_byte_array_free
+#define g_byte_array_new monoeg_g_byte_array_new
 #define g_clear_error monoeg_g_clear_error
 #define g_convert monoeg_g_convert
 #define g_convert_error_quark monoeg_g_convert_error_quark
@@ -80,6 +85,7 @@
 #define g_list_nth_data monoeg_g_list_nth_data
 #define g_list_prepend monoeg_g_list_prepend
 #define g_list_remove monoeg_g_list_remove
+#define g_list_remove_all monoeg_g_list_remove_all
 #define g_list_remove_link monoeg_g_list_remove_link
 #define g_list_reverse monoeg_g_list_reverse
 #define g_list_sort monoeg_g_list_sort
 #define g_string_append_len monoeg_g_string_append_len
 #define g_string_append_unichar monoeg_g_string_append_unichar
 #define g_string_append_printf monoeg_g_string_append_printf
+#define g_string_append_vprintf monoeg_g_string_append_vprintf
+#define g_string_erase monoeg_g_string_erase
 #define g_string_free monoeg_g_string_free
+#define g_string_insert monoeg_g_string_insert
 #define g_string_new monoeg_g_string_new
 #define g_string_new_len monoeg_g_string_new_len
 #define g_string_prepend monoeg_g_string_prepend
 #define g_string_printf monoeg_g_string_printf
+#define g_string_set_size monoeg_g_string_set_size
 #define g_string_sized_new monoeg_g_string_sized_new
 #define g_string_truncate monoeg_g_string_truncate
 #define g_strjoin monoeg_g_strjoin
 #define g_utf16_to_ucs4 monoeg_g_utf16_to_ucs4
 #define g_utf16_to_utf8 monoeg_g_utf16_to_utf8
 #define g_utf8_get_char monoeg_g_utf8_get_char
+#define g_utf8_offset_to_pointer monoeg_g_utf8_offset_to_pointer
+#define g_utf8_pointer_to_offset monoeg_g_utf8_pointer_to_offset
 #define g_utf8_strdown monoeg_g_utf8_strdown
 #define g_utf8_strlen monoeg_g_utf8_strlen
 #define g_utf8_strup monoeg_g_utf8_strup
+#define g_utf8_to_ucs4_fast monoeg_g_utf8_to_ucs4_fast
 #define g_utf8_to_utf16 monoeg_g_utf8_to_utf16
 #define g_utf8_validate monoeg_g_utf8_validate
 #define g_unichar_to_utf8 monoeg_g_unichar_to_utf8
+#define g_unichar_is_space monoeg_g_unichar_is_space
+#define g_unicode_break_type monoeg_g_unicode_break_type
+#define g_utf8_offset_to_pointer monoeg_g_utf8_offset_to_pointer
+#define g_utf8_pointer_to_offset monoeg_g_utf8_pointer_to_offset
+#define g_utf8_to_ucs4_fast monoeg_g_utf8_to_ucs4_fast
 #define g_win32_getlocale monoeg_g_win32_getlocale
 #define g_assertion_message monoeg_assertion_message
 #define g_malloc monoeg_malloc
 #define g_strdup monoeg_strdup
 #define g_ucs4_to_utf16_len monoeg_ucs4_to_utf16_len
 #define g_utf16_to_ucs4_len monoeg_utf16_to_ucs4_len
-#define g_byte_array_free monoeg_g_byte_array_free
-#define g_byte_array_new monoeg_g_byte_array_new
 
index 99ebf6e278e30942d887b69d7105635d983ed637..4a4049e5603c236b1456b477cd4684e35cf595dc 100644 (file)
@@ -80,6 +80,22 @@ g_array_new (gboolean zero_terminated,
        return (GArray*)rv;
 }
 
+GArray *
+g_array_sized_new (gboolean zero_terminated,
+            gboolean clear_,
+            guint element_size,
+                guint reserved_size)
+{
+       GArrayPriv *rv = g_new0 (GArrayPriv, 1);
+       rv->zero_terminated = zero_terminated;
+       rv->clear_ = clear_;
+       rv->element_size = element_size;
+
+       ensure_capacity (rv, reserved_size);
+
+       return (GArray*)rv;
+}
+
 gchar*
 g_array_free (GArray *array,
              gboolean free_segment)
@@ -204,3 +220,21 @@ g_array_remove_index_fast (GArray *array,
        return array;
 }
 
+void
+g_array_set_size (GArray *array, gint length)
+{
+       g_return_if_fail (array != NULL);
+       g_return_if_fail (length >= 0);
+
+       GArrayPriv *priv = (GArrayPriv*)array;
+
+       if (length == priv->capacity)
+               return; // nothing to be done
+
+       if (length > priv->capacity) {
+               // grow the array
+               ensure_capacity (priv, length);
+       }
+
+       array->len = length;
+}
index af6b1a95026dce0fd9b5775b9ae5d367a8c97198..0f8f8e74ec92388cd39fc9c149320b46df08e6c6 100644 (file)
@@ -113,6 +113,7 @@ typedef guint32 gunichar;
 #define G_MAXINT             INT_MAX
 #define G_MININT             INT_MIN
 #define G_MAXINT32           INT32_MAX
+#define G_MAXUINT32          UINT32_MAX
 #define G_MININT32           INT32_MIN
 #define G_MININT64           INT64_MIN
 #define G_MAXINT64          INT64_MAX
@@ -187,6 +188,7 @@ gchar*           g_win32_getlocale(void);
 /*
  * Precondition macros
  */
+#define g_warn_if_fail(x)  G_STMT_START { if (!(x)) { g_warning ("%s:%d: assertion '%s' failed", __FILE__, __LINE__, #x); } } G_STMT_END
 #define g_return_if_fail(x)  G_STMT_START { if (!(x)) { g_critical ("%s:%d: assertion '%s' failed", __FILE__, __LINE__, #x); return; } } G_STMT_END
 #define g_return_val_if_fail(x,e)  G_STMT_START { if (!(x)) { g_critical ("%s:%d: assertion '%s' failed", __FILE__, __LINE__, #x); return (e); } } G_STMT_END
 
@@ -323,6 +325,7 @@ gint    g_ascii_xdigit_value (gchar c);
 #define g_strncasecmp strncasecmp
 #define g_strstrip(a) g_strchug (g_strchomp (a))
 #endif
+#define g_ascii_strdup strdup
 
 
 #define        G_STR_DELIMITERS "_-|> <."
@@ -350,6 +353,9 @@ GString     *g_string_append        (GString *string, const gchar *val);
 GString     *g_string_append_len    (GString *string, const gchar *val, gssize len);
 GString     *g_string_truncate      (GString *string, gsize len);
 GString     *g_string_prepend       (GString *string, const gchar *val);
+GString     *g_string_insert        (GString *string, gssize pos, const gchar *val);
+GString     *g_string_set_size      (GString *string, gsize len);
+GString     *g_string_erase         (GString *string, gssize pos, gssize len);
 
 #define g_string_sprintfa g_string_append_printf
 
@@ -448,6 +454,8 @@ GList *g_list_find_custom   (GList     *list,
                             GCompareFunc   func);
 GList *g_list_remove        (GList         *list,
                             gconstpointer  data);
+GList *g_list_remove_all    (GList         *list,
+                            gconstpointer  data);
 GList *g_list_reverse       (GList         *list);
 GList *g_list_remove_link   (GList         *list,
                             GList         *link);
@@ -487,11 +495,13 @@ struct _GArray {
 };
 
 GArray *g_array_new               (gboolean zero_terminated, gboolean clear_, guint element_size);
+GArray *g_array_sized_new         (gboolean zero_terminated, gboolean clear_, guint element_size, guint reserved_size);
 gchar*  g_array_free              (GArray *array, gboolean free_segment);
 GArray *g_array_append_vals       (GArray *array, gconstpointer data, guint len);
 GArray* g_array_insert_vals       (GArray *array, guint index_, gconstpointer data, guint len);
 GArray* g_array_remove_index      (GArray *array, guint index_);
 GArray* g_array_remove_index_fast (GArray *array, guint index_);
+void    g_array_set_size          (GArray *array, gint length);
 
 #define g_array_append_val(a,v)   (g_array_append_vals((a),&(v),1))
 #define g_array_insert_val(a,i,v) (g_array_insert_vals((a),(i),&(v),1))
@@ -639,12 +649,53 @@ typedef enum {
        G_UNICODE_SPACE_SEPARATOR
 } GUnicodeType;
 
+typedef enum {
+       G_UNICODE_BREAK_MANDATORY,
+       G_UNICODE_BREAK_CARRIAGE_RETURN,
+       G_UNICODE_BREAK_LINE_FEED,
+       G_UNICODE_BREAK_COMBINING_MARK,
+       G_UNICODE_BREAK_SURROGATE,
+       G_UNICODE_BREAK_ZERO_WIDTH_SPACE,
+       G_UNICODE_BREAK_INSEPARABLE,
+       G_UNICODE_BREAK_NON_BREAKING_GLUE,
+       G_UNICODE_BREAK_CONTINGENT,
+       G_UNICODE_BREAK_SPACE,
+       G_UNICODE_BREAK_AFTER,
+       G_UNICODE_BREAK_BEFORE,
+       G_UNICODE_BREAK_BEFORE_AND_AFTER,
+       G_UNICODE_BREAK_HYPHEN,
+       G_UNICODE_BREAK_NON_STARTER,
+       G_UNICODE_BREAK_OPEN_PUNCTUATION,
+       G_UNICODE_BREAK_CLOSE_PUNCTUATION,
+       G_UNICODE_BREAK_QUOTATION,
+       G_UNICODE_BREAK_EXCLAMATION,
+       G_UNICODE_BREAK_IDEOGRAPHIC,
+       G_UNICODE_BREAK_NUMERIC,
+       G_UNICODE_BREAK_INFIX_SEPARATOR,
+       G_UNICODE_BREAK_SYMBOL,
+       G_UNICODE_BREAK_ALPHABETIC,
+       G_UNICODE_BREAK_PREFIX,
+       G_UNICODE_BREAK_POSTFIX,
+       G_UNICODE_BREAK_COMPLEX_CONTEXT,
+       G_UNICODE_BREAK_AMBIGUOUS,
+       G_UNICODE_BREAK_UNKNOWN,
+       G_UNICODE_BREAK_NEXT_LINE,
+       G_UNICODE_BREAK_WORD_JOINER,
+       G_UNICODE_BREAK_HANGUL_L_JAMO,
+       G_UNICODE_BREAK_HANGUL_V_JAMO,
+       G_UNICODE_BREAK_HANGUL_T_JAMO,
+       G_UNICODE_BREAK_HANGUL_LV_SYLLABLE,
+       G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+} GUnicodeBreakType;
+
 gunichar       g_unichar_toupper (gunichar c);
 gunichar       g_unichar_tolower (gunichar c);
 gunichar       g_unichar_totitle (gunichar c);
 GUnicodeType   g_unichar_type    (gunichar c);
+gboolean       g_unichar_isspace (gunichar c);
 gboolean       g_unichar_isxdigit (gunichar c);
 gint           g_unichar_xdigit_value (gunichar c);
+GUnicodeBreakType   g_unichar_break_type (gunichar c);
 
 #ifndef MAX
 #define MAX(a,b) (((a)>(b)) ? (a) : (b))
@@ -687,6 +738,7 @@ typedef enum {
 gchar     *g_utf8_strup (const gchar *str, gssize len);
 gchar     *g_utf8_strdown (const gchar *str, gssize len);
 gint       g_unichar_to_utf8 (gunichar c, gchar *outbuf);
+gunichar*  g_utf8_to_ucs4_fast (const gchar *str, glong len, glong *items_written);
 gunichar2 *g_utf8_to_utf16 (const gchar *str, glong len, glong *items_read, glong *items_written, GError **error);
 gchar     *g_utf16_to_utf8 (const gunichar2 *str, glong len, glong *items_read, glong *items_written, GError **error);
 gunichar  *g_utf16_to_ucs4 (const gunichar2 *str, glong len, glong *items_read, glong *items_written, GError **error);
@@ -818,6 +870,13 @@ gboolean   g_file_test (const gchar *filename, GFileTest test);
 #define g_rename rename
 #define g_stat stat
 #define g_unlink unlink
+#define g_fopen fopen
+#define g_lstat lstat
+#define g_rmdir rmdir
+#define g_mkstemp mkstemp
+#define g_ascii_isdigit isdigit
+#define g_ascii_strtod strtod
+#define g_ascii_isalnum isalnum
 
 /*
  * Pattern matching
@@ -917,6 +976,14 @@ gboolean  g_utf8_validate      (const gchar *str, gssize max_len, const gchar **
 gunichar  g_utf8_get_char      (const gchar *src);
 glong     g_utf8_strlen        (const gchar *str, gssize max);
 #define   g_utf8_next_char(p) p + (g_trailingBytesForUTF8[(guchar)(*p)] + 1)
+gchar *   g_utf8_offset_to_pointer (const gchar *str, glong offset);
+glong     g_utf8_pointer_to_offset (const gchar *str, const gchar *pos);
+
+/*
+ * priorities
+ */
+#define G_PRIORITY_DEFAULT 0
+#define G_PRIORITY_DEFAULT_IDLE 200
 
 /*
  * Empty thread functions, not used by eglib
index 0e5eb3ac4d20d54e5e1304e586ebb2acc6ed4fa7..882fda48ec9b75772bd8f780d2f1fbef9266ab54 100644 (file)
@@ -125,6 +125,25 @@ g_list_remove (GList *list, gconstpointer data)
        return list;
 }
 
+GList*
+g_list_remove_all (GList *list, gconstpointer data)
+{
+       GList *current = g_list_find (list, data);
+
+       if (!current)
+               return list;
+
+       while (current) {
+               if (current == list)
+                       list = list->next;
+               g_list_free_1 (disconnect_node (current));
+
+               current = g_list_find (list, data);
+       }
+
+       return list;
+}
+
 GList*
 g_list_remove_link (GList *list, GList *link)
 {
index 7aecb6234f85ee4c210d150b3d8b158aea484ebb..9df5d73c28ef89a6bb83a7976cf88c1d97cfadf4 100644 (file)
@@ -163,6 +163,24 @@ g_string_prepend (GString *string, const gchar *val)
        return string;
 }
 
+GString *
+g_string_insert (GString *string, gssize pos, const gchar *val)
+{
+       gssize len;
+       
+       g_return_val_if_fail (string != NULL, string);
+       g_return_val_if_fail (val != NULL, string);
+       g_return_val_if_fail (pos <= string->len, string);
+
+       len = strlen (val);
+       
+       GROW_IF_NECESSARY(string, len); 
+       memmove(string->str + pos + len, string->str + pos, string->len - pos - len + 1);
+       memcpy(string->str + pos, val, len);
+
+       return string;
+}
+
 void
 g_string_append_printf (GString *string, const gchar *format, ...)
 {
@@ -226,3 +244,34 @@ g_string_truncate (GString *string, gsize len)
        return string;
 }
 
+GString *
+g_string_set_size (GString *string, gsize len)
+{
+       g_return_val_if_fail (string != NULL, string);
+
+       GROW_IF_NECESSARY(string, len);
+       
+       string->len = len;
+       string->str[len] = 0;
+       return string;
+}
+
+GString *
+g_string_erase (GString *string, gssize pos, gssize len)
+{
+       g_return_val_if_fail (string != NULL, string);
+
+       /* Silent return */
+       if (pos >= string->len)
+               return string;
+
+       if (len == -1 || (pos + len) >= string->len) {
+               string->str[pos] = 0;
+       }
+       else {
+               memmove (string->str + pos, string->str + pos + len, string->len - (pos + len) + 1);
+               string->len -= len;
+       }
+
+       return string;
+}
index 442ef428bfc4e25cbf9f8ce6b8ce6390c7d46a70..d49fb968d7a1adee256e4395a3b8b260af76ad69 100644 (file)
@@ -130,6 +130,13 @@ int i;
        return 0;
 }
 
+GUnicodeBreakType
+g_unichar_break_type (gunichar c)
+{
+       // MOONLIGHT_FIXME
+       return G_UNICODE_BREAK_UNKNOWN;
+}
+
 gunichar
 g_unichar_case (gunichar c, gboolean upper)
 {
@@ -203,6 +210,18 @@ g_unichar_xdigit_value (gunichar c)
        return -1;
 }
 
+gboolean
+g_unichar_isspace (gunichar c)
+{
+       GUnicodeType type = g_unichar_type (c);
+       if (type == G_UNICODE_LINE_SEPARATOR ||
+           type == G_UNICODE_PARAGRAPH_SEPARATOR ||
+           type == G_UNICODE_SPACE_SEPARATOR)
+               return TRUE;
+
+       return FALSE;
+}
+
 gchar *
 g_convert (const gchar *str, gssize len,
           const gchar *to_codeset, const gchar *from_codeset,
index c9cd375bfe21b414c116919a26c41d756067318b..4ed723fe74ea95cbdf3695eaa5fd2bd92378b242 100644 (file)
@@ -675,6 +675,124 @@ g_utf16_to_ucs4 (const gunichar2 *str, glong len, glong *items_read, glong *item
        return retstr;
 }
 
+gchar *
+g_utf8_offset_to_pointer (const gchar *str, glong offset)
+{
+       if (offset == 0)
+               return str;
+
+       if (offset > 0) {
+               gchar *p = (gchar*)str;
+               do {
+                       p = g_utf8_next_char (p);
+                       offset --;
+               } while (offset > 0);
+
+               return p;
+       }
+       else {
+               // MOONLIGHT_FIXME
+               g_assert_not_reached();
+       }
+}
+
+glong
+g_utf8_pointer_to_offset (const gchar *str, const gchar *pos)
+{
+       const gchar *inptr, *inend;
+       glong offset = 0;
+       glong sign = 1;
+       
+       if (pos == str)
+               return 0;
+       
+       if (str < pos) {
+               inptr = str;
+               inend = pos;
+       } else {
+               inptr = pos;
+               inend = str;
+               sign = -1;
+       }
+       
+       do {
+               inptr = g_utf8_next_char (inptr);
+               offset++;
+       } while (inptr < inend);
+       
+       return offset * sign;
+}
+
+gunichar*
+g_utf8_to_ucs4_fast (const gchar *str, glong len, glong *items_written)
+{
+       gunichar* ucs4;
+       int ucs4_index;
+       const char *p;
+       int mb_size;
+       gunichar codepoint;
+
+       g_return_val_if_fail (str != NULL, NULL);
+       
+       if (len < 0) {
+               /* we need to find the length of str, as len < 0 means it must be 0 terminated */
+
+               len = 0;
+               p = str;
+               while (*p) {
+                       len ++;
+                       p = g_utf8_next_char(p);
+               }
+       }
+
+       ucs4 = g_malloc (sizeof(gunichar)*len);
+       if (items_written)
+               *items_written = len;
+
+       p = str;
+       ucs4_index = 0;
+       while (len) {
+               guint8 c = *p++;
+
+
+               if (c < 0x80) {
+                       mb_size = 1;
+               }
+               else if ((c & 0xE0) == 0xC0) {
+                       c &= 0x1f;
+
+                       mb_size = 2;
+               }
+               else if ((c & 0xF0) == 0xE0) {
+                       c &= 0x0f;
+                       mb_size = 3;
+               }
+               else if ((c & 0xF8) == 0xF0) {
+                       c &= 0x07;
+                       mb_size = 4;
+               }
+               else if ((c & 0xFC) == 0xF8) {
+                       c &= 0x03;
+                       mb_size = 5;
+               }
+               else if ((c & 0xFE) == 0xFC) {
+                       c &= 0x01;
+                       mb_size = 6;
+               }
+
+               codepoint = c;
+               while (--mb_size) {
+                       codepoint <<= 6 | ((*p)&0x3f);
+                       p++;
+               }
+
+               ucs4[ucs4_index++] = codepoint;
+               len --;
+       }
+
+       return ucs4;
+}
+
 /**
  * from http://home.tiscali.nl/t876506/utf8tbl.html
  *