Revert "Remove all uses of G_CONST_RETURN"
[platform/upstream/glib.git] / glib / gconvert.c
index 520c32a..b363bca 100644 (file)
@@ -21,8 +21,7 @@
  */
 
 #include "config.h"
-
-#include "glib.h"
+#include "glibconfig.h"
 
 #ifndef G_OS_WIN32
 #include <iconv.h>
 #include <string.h>
 #include <stdlib.h>
 
-#include "gprintfint.h"
-#include "gthreadprivate.h"
-#include "gunicode.h"
-
 #ifdef G_OS_WIN32
 #include "win_iconv.c"
 #endif
 #undef STRICT
 #endif
 
+#include "gconvert.h"
+
+#include "gprintfint.h"
+#include "gslist.h"
+#include "gstrfuncs.h"
+#include "gtestutils.h"
+#include "gthread.h"
+#include "gthreadprivate.h"
+#include "gunicode.h"
+
+#ifdef NEED_ICONV_CACHE
+#include "glist.h"
+#include "ghash.h"
+#endif
+
 #include "glibintl.h"
 
 #if defined(USE_LIBICONV_GNU) && !defined (_LIBICONV_H)
 #error GNU libiconv not in use but included iconv.h is from libiconv
 #endif
 
-#include "galias.h"
+
+/**
+ * SECTION:conversions
+ * @title: Character Set Conversion
+ * @short_description: Convert strings between different character sets
+ *
+ * The g_convert() family of function wraps the functionality of iconv(). In
+ * addition to pure character set conversions, GLib has functions to deal
+ * with the extra complications of encodings for file names.
+ *
+ * <refsect2 id="file-name-encodings">
+ * <title>File Name Encodings</title>
+ * <para>
+ * Historically, Unix has not had a defined encoding for file
+ * names:  a file name is valid as long as it does not have path
+ * separators in it ("/").  However, displaying file names may
+ * require conversion:  from the character set in which they were
+ * created, to the character set in which the application
+ * operates.  Consider the Spanish file name
+ * "<filename>Presentaci&oacute;n.sxi</filename>".  If the
+ * application which created it uses ISO-8859-1 for its encoding,
+ * </para>
+ * <programlisting id="filename-iso8859-1">
+ * Character:  P  r  e  s  e  n  t  a  c  i  &oacute;  n  .  s  x  i
+ * Hex code:   50 72 65 73 65 6e 74 61 63 69 f3 6e 2e 73 78 69
+ * </programlisting>
+ * <para>
+ * However, if the application use UTF-8, the actual file name on
+ * disk would look like this:
+ * </para>
+ * <programlisting id="filename-utf-8">
+ * Character:  P  r  e  s  e  n  t  a  c  i  &oacute;     n  .  s  x  i
+ * Hex code:   50 72 65 73 65 6e 74 61 63 69 c3 b3 6e 2e 73 78 69
+ * </programlisting>
+ * <para>
+ * Glib uses UTF-8 for its strings, and GUI toolkits like GTK+
+ * that use Glib do the same thing.  If you get a file name from
+ * the file system, for example, from readdir(3) or from g_dir_read_name(),
+ * and you wish to display the file name to the user, you
+ * <emphasis>will</emphasis> need to convert it into UTF-8.  The
+ * opposite case is when the user types the name of a file he
+ * wishes to save:  the toolkit will give you that string in
+ * UTF-8 encoding, and you will need to convert it to the
+ * character set used for file names before you can create the
+ * file with open(2) or fopen(3).
+ * </para>
+ * <para>
+ * By default, Glib assumes that file names on disk are in UTF-8
+ * encoding.  This is a valid assumption for file systems which
+ * were created relatively recently:  most applications use UTF-8
+ * encoding for their strings, and that is also what they use for
+ * the file names they create.  However, older file systems may
+ * still contain file names created in "older" encodings, such as
+ * ISO-8859-1. In this case, for compatibility reasons, you may
+ * want to instruct Glib to use that particular encoding for file
+ * names rather than UTF-8.  You can do this by specifying the
+ * encoding for file names in the <link
+ * linkend="G_FILENAME_ENCODING"><envar>G_FILENAME_ENCODING</envar></link>
+ * environment variable.  For example, if your installation uses
+ * ISO-8859-1 for file names, you can put this in your
+ * <filename>~/.profile</filename>:
+ * </para>
+ * <programlisting>
+ * export G_FILENAME_ENCODING=ISO-8859-1
+ * </programlisting>
+ * <para>
+ * Glib provides the functions g_filename_to_utf8() and
+ * g_filename_from_utf8() to perform the necessary conversions. These
+ * functions convert file names from the encoding specified in
+ * <envar>G_FILENAME_ENCODING</envar> to UTF-8 and vice-versa.
+ * <xref linkend="file-name-encodings-diagram"/> illustrates how
+ * these functions are used to convert between UTF-8 and the
+ * encoding for file names in the file system.
+ * </para>
+ * <figure id="file-name-encodings-diagram">
+ * <title>Conversion between File Name Encodings</title>
+ * <graphic fileref="file-name-encodings.png" format="PNG"/>
+ * </figure>
+ * <refsect3 id="file-name-encodings-checklist">
+ * <title>Checklist for Application Writers</title>
+ * <para>
+ * This section is a practical summary of the detailed
+ * description above.  You can use this as a checklist of
+ * things to do to make sure your applications process file
+ * name encodings correctly.
+ * </para>
+ * <orderedlist>
+ * <listitem><para>
+ * If you get a file name from the file system from a function
+ * such as readdir(3) or gtk_file_chooser_get_filename(),
+ * you do not need to do any conversion to pass that
+ * file name to functions like open(2), rename(2), or
+ * fopen(3) &mdash; those are "raw" file names which the file
+ * system understands.
+ * </para></listitem>
+ * <listitem><para>
+ * If you need to display a file name, convert it to UTF-8 first by
+ * using g_filename_to_utf8(). If conversion fails, display a string like
+ * "<literal>Unknown file name</literal>". <emphasis>Do not</emphasis>
+ * convert this string back into the encoding used for file names if you
+ * wish to pass it to the file system; use the original file name instead.
+ * For example, the document window of a word processor could display
+ * "Unknown file name" in its title bar but still let the user save the
+ * file, as it would keep the raw file name internally. This can happen
+ * if the user has not set the <envar>G_FILENAME_ENCODING</envar>
+ * environment variable even though he has files whose names are not
+ * encoded in UTF-8.
+ * </para></listitem>
+ * <listitem><para>
+ * If your user interface lets the user type a file name for saving or
+ * renaming, convert it to the encoding used for file names in the file
+ * system by using g_filename_from_utf8(). Pass the converted file name
+ * to functions like fopen(3). If conversion fails, ask the user to enter
+ * a different file name. This can happen if the user types Japanese
+ * characters when <envar>G_FILENAME_ENCODING</envar> is set to
+ * <literal>ISO-8859-1</literal>, for example.
+ * </para></listitem>
+ * </orderedlist>
+ * </refsect3>
+ * </refsect2>
+ */
 
 /* We try to terminate strings in unknown charsets with this many zero bytes
  * to ensure that multibyte strings really are nul-terminated when we return
@@ -639,13 +769,14 @@ g_convert_with_iconv (const gchar *str,
              have_error = TRUE;
              break;
            default:
-              {
-                int errsv = errno;
-                
-                g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
-                             _("Error during conversion: %s"),
-                             g_strerror (errsv));
-              }
+             if (error)
+                {
+                  int errsv = errno;
+
+                  g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
+                               _("Error during conversion: %s"),
+                               g_strerror (errsv));
+                }
              have_error = TRUE;
              break;
            }
@@ -2125,6 +2256,3 @@ g_filename_display_name (const gchar *filename)
 
   return display_name;
 }
-
-#define __G_CONVERT_C__
-#include "galiasdef.c"