On Saturday 25 October 2003 17:23, you wrote:
> I don't think the problem is retrieving the value from g_list_nth_data.
> This is simple to check -- compare the value returned from
> g_list_nth_data against the value you put into the g_list.

That was because the data pointer was keeping the value of the previous 
allocation. This new sample code shows that both the first call to 
g_utf16_to_utf8 and memmove work OK, but either g_list_append or 
g_list_nth_data aren't working.
This is unless I'm doing something stupid.


------------------------------------------------------------------------------
using System;
using System.Runtime.InteropServices;

class testbug {

public const string GLIB_LIBRARY        = "glib-2.0";
public const string STRLEN_LIBRARY      = "pango-1.0";
public const string MEMMOVE_LIBRARY     = "gtk-x11-2.0";

[DllImport(GLIB_LIBRARY, CharSet = CharSet.Unicode)]
public static extern IntPtr g_utf16_to_utf8(char[] str, int len, out int 
items_read, out int items_written, IntPtr error);
[DllImport(GLIB_LIBRARY, CharSet = CharSet.Unicode)]
public static extern IntPtr g_utf8_to_utf16(byte[] str, int len, out int 
items_read, out int items_written, IntPtr error);

[DllImport(STRLEN_LIBRARY, CharSet = CharSet.Unicode)]
public static extern int strlen(IntPtr str);

[DllImport(MEMMOVE_LIBRARY, CharSet = CharSet.Unicode)]
public static extern void memmove(IntPtr dest, byte[] src, int size);
[DllImport(MEMMOVE_LIBRARY, CharSet = CharSet.Unicode)]
public static extern void memmove([In, Out] byte[] dest, IntPtr src, int 
size);
[DllImport(MEMMOVE_LIBRARY, CharSet = CharSet.Unicode)]
public static extern void memmove([In, Out] char[] dest, IntPtr src, int 
size);

[DllImport(GLIB_LIBRARY, CharSet = CharSet.Unicode)]
public static extern void g_free(IntPtr mem);
[DllImport(GLIB_LIBRARY, CharSet = CharSet.Unicode)]
public static extern IntPtr g_malloc(int size);

[DllImport(GLIB_LIBRARY, CharSet = CharSet.Unicode)]
static extern void g_printf (IntPtr format);

[DllImport(GLIB_LIBRARY, CharSet = CharSet.Unicode)]
public static extern IntPtr g_list_append(IntPtr list, IntPtr data);
[DllImport(GLIB_LIBRARY, CharSet = CharSet.Unicode)]
public static extern IntPtr g_list_nth_data(IntPtr list, int n);

public static void Main ()
{
        string str = "Let's i18n, baby...do it hard!";
        IntPtr glist = IntPtr.Zero;
        bool terminate = true;
        char [] strchar = str.ToCharArray();

        int read, written;
        IntPtr ptr = g_utf16_to_utf8 (strchar, str.Length, out read, out written, 
IntPtr.Zero);

        if (read != strchar.Length) written++;
        byte [] buffer = new byte [written + (terminate ? 1 : 0)];
        memmove (buffer, ptr, written);
        g_free (ptr);

        string newl = "\n";
        IntPtr data = g_malloc (buffer.Length);
        memmove (data, buffer, buffer.Length);
        g_printf (data);
        g_printf (Marshal.StringToHGlobalAnsi (newl));

        glist = g_list_append (glist, data);
        g_free (data);

        IntPtr data2 = g_list_nth_data (glist, 0);
        g_printf (data2);
        g_printf (Marshal.StringToHGlobalAnsi (newl));
        int length = strlen (data2);

        byte [] buffer1 = new byte [length];
        memmove (buffer1, data2, length);

        ptr = g_utf8_to_utf16 (buffer1, buffer1.Length, out read, out written, 
IntPtr.Zero);

        char [] chars = new char [written];
        memmove (chars, ptr, written * 2);

        Console.WriteLine (chars);

        g_free (ptr);
}

}
------------------------------------------------------------------------------------------------------------

_______________________________________________
Mono-list maillist  -  [EMAIL PROTECTED]
http://lists.ximian.com/mailman/listinfo/mono-list

Reply via email to