On Wednesday 10 September 2014 5:07:03 PM Fernando Rodriguez wrote:
> On Wednesday 10 September 2014 7:37:28 PM Geert Janssens wrote:
> > Hi,
> > 
> > I'm stuck on the following issue. Program is GnuCash on Windows.
> > 
> > Consider the following code snippet:
> > 
> > struct stat statbuf;
> > gchar* dirname = g_strdup(g_getenv("GNC_DOTGNUCASH_DIR");
> > gint rc = g_stat (dirname, &statbuf);
> > 
> > switch (errno)
> > {
> > 
> >   case ENOENT:
> >     // Directory doesn't exist
> >     // Here is code to create it which I cut for brevity
> >     break;
> >   
> >   case EACCES:
> >     // Directory can't be accessed
> >     exit(1);
> >   
> >   case ENOTDIR:
> >     // Not a directory
> >     exit(1);
> >   
> >   default:
> >     // Unknown error
> >     exit(1);
> > 
> > }
> > 
> > // Continue code with valid, existing directory
> > ...
> > 
> > So this snippet reads the value of environment variable GNC_DOTGNUCASH_DIR
> > and tests whether this is a valid directory.
> > 
> > This works fine when GNC_DOTGNUCASH_DIR uses a limited character set like
> > ascii. For example when set to "c:\gcdev\geert" this works well and the
> > code continues.
> > 
> > However if set to for example:
> > c:\gcdev\Łukasz
> > Things go wrong (note the unusual Ł).
> > 
> > In this case the code branches into case ENOENT and creates a directory
> > named c:\gcdev\Lukasz (note the plain L now)
> > Before it continues.
> > 
> > Setting a breakpoint at rc=g_stat... and examining the value of dirname at
> > that point also shows it to have a value of c:\gcdev\Lukasz (with plain
> > L).
> > 
> > So it seems I'm losing diacritical information here and I can't pass the
> > right directory to my code to use.
> > 
> > What should I do to get the real value from the environment to be able to
> > access the true directory ?
> > 
> > Thanks,
> > 
> > Geert
> > 
> > P.S. my locale settings are all "Dutch_Belgium.1252" except for LC_ALL
> > which is empty. _______________________________________________
> > gtk-app-devel-list mailing list
> > gtk-app-devel-list@gnome.org
> > https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
> 
> Well gchar is a typedef for char so it only supports ascii. I think you'll
> probably have to use Win32 API calls on Windows to access multibyte file
> names.
> 
> Also according to the documentation you should use GStatBuf instead of
> struct stat on Windows to get consistent behaviour on different compilers.
> 
> 
> 
> _______________________________________________
> gtk-app-devel-list mailing list
> gtk-app-devel-list@gnome.org
> https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Actually try using g_utf8_strncpy() instead of g_strdup(). I'm not sure if 
that'll get you all the way as the docs say g_stat calls the standard library 
functions and AFAIK those dont support unicode/multibyte filenames.



_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to