Bug 665685 — Add a #define for the max length of a Unicode decomposition
authorPhilip Withnall <philip@tecnocode.co.uk>
Tue, 6 Dec 2011 18:30:43 +0000 (18:30 +0000)
committerPhilip Withnall <philip@tecnocode.co.uk>
Tue, 6 Dec 2011 19:09:01 +0000 (19:09 +0000)
Add G_UNICHAR_MAX_DECOMPOSITION_LEN for the maximum length of the
decomposition of a single Unicode character.

Closes: bgo#665685

glib/gunicode.h
glib/gunidecomp.c
glib/guniprop.c

index 213b38f..f89c07c 100644 (file)
@@ -551,6 +551,18 @@ gsize g_unichar_fully_decompose (gunichar  ch,
                                  gunichar *result,
                                  gsize     result_len);
 
+/**
+ * G_UNICHAR_MAX_COMPAT_DECOMPOSITION_LEN:
+ *
+ * The maximum length (in codepoints) of a compatibility or canonical
+ * decomposition of a single Unicode character.
+ *
+ * This is as defined by Unicode 6.1.
+ *
+ * Since: 2.31.3
+ */
+#define G_UNICHAR_MAX_DECOMPOSITION_LEN 18 /* codepoints */
+
 /* Compute canonical ordering of a string in-place.  This rearranges
    decomposed characters in the string according to their combining
    classes.  See the Unicode manual for more information.  */
index 6cbc2df..090b42d 100644 (file)
@@ -700,8 +700,8 @@ g_unichar_compose (gunichar  a,
  * currently all decompositions are of length at most 4, but
  * this may change in the future (very unlikely though).
  * At any rate, Unicode does guarantee that a buffer of length
- * 18 is always enough for both compatibility and canonical
- * decompositions, so that is the size recommended.
+ * %G_UNICHAR_MAX_DECOMPOSITION_LEN is always enough for both compatibility and
+ * canonical decompositions, so that is the size recommended.
  *
  * See <ulink url="http://unicode.org/reports/tr15/">UAX#15</ulink>
  * for details.
index 8b139ae..5b818e3 100644 (file)
@@ -855,9 +855,9 @@ real_toupper (const gchar *str,
                   * which could simplify this considerably.
                   */
                  gsize decomp_len, i;
-                 gunichar decomp[18];
+                 gunichar decomp[G_UNICHAR_MAX_DECOMPOSITION_LEN];
 
-                 decomp_len = g_unichar_fully_decompose (c, FALSE, decomp, 18);
+                 decomp_len = g_unichar_fully_decompose (c, FALSE, decomp, G_N_ELEMENTS (decomp));
                  for (i=0; i < decomp_len; i++)
                    {
                      if (decomp[i] != 0x307 /* COMBINING DOT ABOVE */)