williamr@2: /* gunicode.h - Unicode manipulation functions williamr@2: * williamr@2: * Copyright (C) 1999, 2000 Tom Tromey williamr@2: * Copyright 2000, 2005 Red Hat, Inc. williamr@2: * Portions copyright (c) 2006 Nokia Corporation. All rights reserved. williamr@2: * williamr@2: * The Gnome Library is free software; you can redistribute it and/or williamr@2: * modify it under the terms of the GNU Lesser General Public License as williamr@2: * published by the Free Software Foundation; either version 2 of the williamr@2: * License, or (at your option) any later version. williamr@2: * williamr@2: * The Gnome Library is distributed in the hope that it will be useful, williamr@2: * but WITHOUT ANY WARRANTY; without even the implied warranty of williamr@2: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU williamr@2: * Lesser General Public License for more details. williamr@2: * williamr@2: * You should have received a copy of the GNU Lesser General Public williamr@2: * License along with the Gnome Library; see the file COPYING.LIB. If not, williamr@2: * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, williamr@2: * Boston, MA 02111-1307, USA. williamr@2: */ williamr@2: williamr@2: #ifndef __G_UNICODE_H__ williamr@2: #define __G_UNICODE_H__ williamr@2: williamr@2: #include <_ansi.h> williamr@2: #include williamr@2: #include williamr@2: williamr@2: G_BEGIN_DECLS williamr@2: williamr@2: typedef guint32 gunichar; williamr@2: typedef guint16 gunichar2; williamr@2: williamr@2: /* These are the possible character classifications. williamr@2: * See http://www.unicode.org/Public/UNIDATA/UCD.html#General_Category_Values williamr@2: */ williamr@2: typedef enum williamr@2: { williamr@2: G_UNICODE_CONTROL, williamr@2: G_UNICODE_FORMAT, williamr@2: G_UNICODE_UNASSIGNED, williamr@2: G_UNICODE_PRIVATE_USE, williamr@2: G_UNICODE_SURROGATE, williamr@2: G_UNICODE_LOWERCASE_LETTER, williamr@2: G_UNICODE_MODIFIER_LETTER, williamr@2: G_UNICODE_OTHER_LETTER, williamr@2: G_UNICODE_TITLECASE_LETTER, williamr@2: G_UNICODE_UPPERCASE_LETTER, williamr@2: G_UNICODE_COMBINING_MARK, williamr@2: G_UNICODE_ENCLOSING_MARK, williamr@2: G_UNICODE_NON_SPACING_MARK, williamr@2: G_UNICODE_DECIMAL_NUMBER, williamr@2: G_UNICODE_LETTER_NUMBER, williamr@2: G_UNICODE_OTHER_NUMBER, williamr@2: G_UNICODE_CONNECT_PUNCTUATION, williamr@2: G_UNICODE_DASH_PUNCTUATION, williamr@2: G_UNICODE_CLOSE_PUNCTUATION, williamr@2: G_UNICODE_FINAL_PUNCTUATION, williamr@2: G_UNICODE_INITIAL_PUNCTUATION, williamr@2: G_UNICODE_OTHER_PUNCTUATION, williamr@2: G_UNICODE_OPEN_PUNCTUATION, williamr@2: G_UNICODE_CURRENCY_SYMBOL, williamr@2: G_UNICODE_MODIFIER_SYMBOL, williamr@2: G_UNICODE_MATH_SYMBOL, williamr@2: G_UNICODE_OTHER_SYMBOL, williamr@2: G_UNICODE_LINE_SEPARATOR, williamr@2: G_UNICODE_PARAGRAPH_SEPARATOR, williamr@2: G_UNICODE_SPACE_SEPARATOR williamr@2: } GUnicodeType; williamr@2: williamr@2: /* These are the possible line break classifications. williamr@2: * Note that new types may be added in the future. williamr@2: * Implementations may regard unknown values like G_UNICODE_BREAK_UNKNOWN williamr@2: * See http://www.unicode.org/unicode/reports/tr14/ williamr@2: */ williamr@2: typedef enum williamr@2: { williamr@2: G_UNICODE_BREAK_MANDATORY, williamr@2: G_UNICODE_BREAK_CARRIAGE_RETURN, williamr@2: G_UNICODE_BREAK_LINE_FEED, williamr@2: G_UNICODE_BREAK_COMBINING_MARK, williamr@2: G_UNICODE_BREAK_SURROGATE, williamr@2: G_UNICODE_BREAK_ZERO_WIDTH_SPACE, williamr@2: G_UNICODE_BREAK_INSEPARABLE, williamr@2: G_UNICODE_BREAK_NON_BREAKING_GLUE, williamr@2: G_UNICODE_BREAK_CONTINGENT, williamr@2: G_UNICODE_BREAK_SPACE, williamr@2: G_UNICODE_BREAK_AFTER, williamr@2: G_UNICODE_BREAK_BEFORE, williamr@2: G_UNICODE_BREAK_BEFORE_AND_AFTER, williamr@2: G_UNICODE_BREAK_HYPHEN, williamr@2: G_UNICODE_BREAK_NON_STARTER, williamr@2: G_UNICODE_BREAK_OPEN_PUNCTUATION, williamr@2: G_UNICODE_BREAK_CLOSE_PUNCTUATION, williamr@2: G_UNICODE_BREAK_QUOTATION, williamr@2: G_UNICODE_BREAK_EXCLAMATION, williamr@2: G_UNICODE_BREAK_IDEOGRAPHIC, williamr@2: G_UNICODE_BREAK_NUMERIC, williamr@2: G_UNICODE_BREAK_INFIX_SEPARATOR, williamr@2: G_UNICODE_BREAK_SYMBOL, williamr@2: G_UNICODE_BREAK_ALPHABETIC, williamr@2: G_UNICODE_BREAK_PREFIX, williamr@2: G_UNICODE_BREAK_POSTFIX, williamr@2: G_UNICODE_BREAK_COMPLEX_CONTEXT, williamr@2: G_UNICODE_BREAK_AMBIGUOUS, williamr@2: G_UNICODE_BREAK_UNKNOWN, williamr@2: G_UNICODE_BREAK_NEXT_LINE, williamr@2: G_UNICODE_BREAK_WORD_JOINER, williamr@2: G_UNICODE_BREAK_HANGUL_L_JAMO, williamr@2: G_UNICODE_BREAK_HANGUL_V_JAMO, williamr@2: G_UNICODE_BREAK_HANGUL_T_JAMO, williamr@2: G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, williamr@2: G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE williamr@2: } GUnicodeBreakType; williamr@2: williamr@2: /* Returns TRUE if current locale uses UTF-8 charset. If CHARSET is williamr@2: * not null, sets *CHARSET to the name of the current locale's williamr@2: * charset. This value is statically allocated, and should be copied williamr@2: * in case the locale's charset will be changed later using setlocale() williamr@2: * or in some other way. williamr@2: */ williamr@2: IMPORT_C gboolean g_get_charset (G_CONST_RETURN char **charset); williamr@2: williamr@2: /* These are all analogs of the functions. williamr@2: */ williamr@2: IMPORT_C gboolean g_unichar_isalnum (gunichar c) G_GNUC_CONST; williamr@2: IMPORT_C gboolean g_unichar_isalpha (gunichar c) G_GNUC_CONST; williamr@2: IMPORT_C gboolean g_unichar_iscntrl (gunichar c) G_GNUC_CONST; williamr@2: IMPORT_C gboolean g_unichar_isdigit (gunichar c) G_GNUC_CONST; williamr@2: IMPORT_C gboolean g_unichar_isgraph (gunichar c) G_GNUC_CONST; williamr@2: IMPORT_C gboolean g_unichar_islower (gunichar c) G_GNUC_CONST; williamr@2: IMPORT_C gboolean g_unichar_isprint (gunichar c) G_GNUC_CONST; williamr@2: IMPORT_C gboolean g_unichar_ispunct (gunichar c) G_GNUC_CONST; williamr@2: IMPORT_C gboolean g_unichar_isspace (gunichar c) G_GNUC_CONST; williamr@2: IMPORT_C gboolean g_unichar_isupper (gunichar c) G_GNUC_CONST; williamr@2: IMPORT_C gboolean g_unichar_isxdigit (gunichar c) G_GNUC_CONST; williamr@2: IMPORT_C gboolean g_unichar_istitle (gunichar c) G_GNUC_CONST; williamr@2: IMPORT_C gboolean g_unichar_isdefined (gunichar c) G_GNUC_CONST; williamr@2: IMPORT_C gboolean g_unichar_iswide (gunichar c) G_GNUC_CONST; williamr@2: williamr@2: /* More functions. These convert between the three cases. williamr@2: * See the Unicode book to understand title case. */ williamr@2: IMPORT_C gunichar g_unichar_toupper (gunichar c) G_GNUC_CONST; williamr@2: IMPORT_C gunichar g_unichar_tolower (gunichar c) G_GNUC_CONST; williamr@2: IMPORT_C gunichar g_unichar_totitle (gunichar c) G_GNUC_CONST; williamr@2: williamr@2: /* If C is a digit (according to `g_unichar_isdigit'), then return its williamr@2: numeric value. Otherwise return -1. */ williamr@2: IMPORT_C gint g_unichar_digit_value (gunichar c) G_GNUC_CONST; williamr@2: williamr@2: IMPORT_C gint g_unichar_xdigit_value (gunichar c) G_GNUC_CONST; williamr@2: williamr@2: /* Return the Unicode character type of a given character. */ williamr@2: IMPORT_C GUnicodeType g_unichar_type (gunichar c) G_GNUC_CONST; williamr@2: williamr@2: /* Return the line break property for a given character */ williamr@2: IMPORT_C GUnicodeBreakType g_unichar_break_type (gunichar c) G_GNUC_CONST; williamr@2: williamr@2: williamr@2: /* Compute canonical ordering of a string in-place. This rearranges williamr@2: decomposed characters in the string according to their combining williamr@2: classes. See the Unicode manual for more information. */ williamr@2: IMPORT_C void g_unicode_canonical_ordering (gunichar *string, williamr@2: gsize len); williamr@2: williamr@2: /* Compute canonical decomposition of a character. Returns g_malloc()d williamr@2: string of Unicode characters. RESULT_LEN is set to the resulting williamr@2: length of the string. */ williamr@2: IMPORT_C gunichar *g_unicode_canonical_decomposition (gunichar ch, williamr@2: gsize *result_len) G_GNUC_MALLOC; williamr@2: williamr@2: /* Array of skip-bytes-per-initial character. williamr@2: */ williamr@2: #ifdef __SYMBIAN32__ williamr@2: IMPORT_C const gchar * const * _g_utf8_skip(); williamr@2: #endif /* __SYMBIAN32__ */ williamr@2: GLIB_VAR const gchar * const g_utf8_skip; williamr@2: williamr@2: #define g_utf8_next_char(p) (char *)((p) + g_utf8_skip[*(guchar *)(p)]) williamr@2: williamr@2: IMPORT_C gunichar g_utf8_get_char (const gchar *p); williamr@2: IMPORT_C gunichar g_utf8_get_char_validated (const gchar *p, williamr@2: gssize max_len); williamr@2: williamr@2: IMPORT_C gchar* g_utf8_offset_to_pointer (const gchar *str, williamr@2: glong offset); williamr@2: IMPORT_C glong g_utf8_pointer_to_offset (const gchar *str, williamr@2: const gchar *pos); williamr@2: IMPORT_C gchar* g_utf8_prev_char (const gchar *p); williamr@2: IMPORT_C gchar* g_utf8_find_next_char (const gchar *p, williamr@2: const gchar *end); williamr@2: IMPORT_C gchar* g_utf8_find_prev_char (const gchar *str, williamr@2: const gchar *p); williamr@2: williamr@2: IMPORT_C glong g_utf8_strlen (const gchar *p, williamr@2: gssize max); williamr@2: williamr@2: /* Copies n characters from src to dest */ williamr@2: IMPORT_C gchar* g_utf8_strncpy (gchar *dest, williamr@2: const gchar *src, williamr@2: gsize n); williamr@2: williamr@2: /* Find the UTF-8 character corresponding to ch, in string p. These williamr@2: functions are equivalants to strchr and strrchr */ williamr@2: IMPORT_C gchar* g_utf8_strchr (const gchar *p, williamr@2: gssize len, williamr@2: gunichar c); williamr@2: IMPORT_C gchar* g_utf8_strrchr (const gchar *p, williamr@2: gssize len, williamr@2: gunichar c); williamr@2: IMPORT_C gchar* g_utf8_strreverse (const gchar *str, williamr@2: gssize len); williamr@2: williamr@2: IMPORT_C gunichar2 *g_utf8_to_utf16 (const gchar *str, williamr@2: glong len, williamr@2: glong *items_read, williamr@2: glong *items_written, williamr@2: GError **error) G_GNUC_MALLOC; williamr@2: IMPORT_C gunichar * g_utf8_to_ucs4 (const gchar *str, williamr@2: glong len, williamr@2: glong *items_read, williamr@2: glong *items_written, williamr@2: GError **error) G_GNUC_MALLOC; williamr@2: IMPORT_C gunichar * g_utf8_to_ucs4_fast (const gchar *str, williamr@2: glong len, williamr@2: glong *items_written) G_GNUC_MALLOC; williamr@2: IMPORT_C gunichar * g_utf16_to_ucs4 (const gunichar2 *str, williamr@2: glong len, williamr@2: glong *items_read, williamr@2: glong *items_written, williamr@2: GError **error) G_GNUC_MALLOC; williamr@2: IMPORT_C gchar* g_utf16_to_utf8 (const gunichar2 *str, williamr@2: glong len, williamr@2: glong *items_read, williamr@2: glong *items_written, williamr@2: GError **error) G_GNUC_MALLOC; williamr@2: IMPORT_C gunichar2 *g_ucs4_to_utf16 (const gunichar *str, williamr@2: glong len, williamr@2: glong *items_read, williamr@2: glong *items_written, williamr@2: GError **error) G_GNUC_MALLOC; williamr@2: IMPORT_C gchar* g_ucs4_to_utf8 (const gunichar *str, williamr@2: glong len, williamr@2: glong *items_read, williamr@2: glong *items_written, williamr@2: GError **error) G_GNUC_MALLOC; williamr@2: williamr@2: /* Convert a single character into UTF-8. outbuf must have at williamr@2: * least 6 bytes of space. Returns the number of bytes in the williamr@2: * result. williamr@2: */ williamr@2: IMPORT_C gint g_unichar_to_utf8 (gunichar c, williamr@2: gchar *outbuf); williamr@2: williamr@2: /* Validate a UTF8 string, return TRUE if valid, put pointer to williamr@2: * first invalid char in **end williamr@2: */ williamr@2: williamr@2: IMPORT_C gboolean g_utf8_validate (const gchar *str, williamr@2: gssize max_len, williamr@2: const gchar **end); williamr@2: williamr@2: /* Validate a Unicode character */ williamr@2: IMPORT_C gboolean g_unichar_validate (gunichar ch); williamr@2: williamr@2: IMPORT_C gchar *g_utf8_strup (const gchar *str, williamr@2: gssize len) G_GNUC_MALLOC; williamr@2: IMPORT_C gchar *g_utf8_strdown (const gchar *str, williamr@2: gssize len) G_GNUC_MALLOC; williamr@2: IMPORT_C gchar *g_utf8_casefold (const gchar *str, williamr@2: gssize len) G_GNUC_MALLOC; williamr@2: williamr@2: typedef enum { williamr@2: G_NORMALIZE_DEFAULT, williamr@2: G_NORMALIZE_NFD = G_NORMALIZE_DEFAULT, williamr@2: G_NORMALIZE_DEFAULT_COMPOSE, williamr@2: G_NORMALIZE_NFC = G_NORMALIZE_DEFAULT_COMPOSE, williamr@2: G_NORMALIZE_ALL, williamr@2: G_NORMALIZE_NFKD = G_NORMALIZE_ALL, williamr@2: G_NORMALIZE_ALL_COMPOSE, williamr@2: G_NORMALIZE_NFKC = G_NORMALIZE_ALL_COMPOSE williamr@2: } GNormalizeMode; williamr@2: williamr@2: IMPORT_C gchar *g_utf8_normalize (const gchar *str, williamr@2: gssize len, williamr@2: GNormalizeMode mode) G_GNUC_MALLOC; williamr@2: williamr@2: IMPORT_C gint g_utf8_collate (const gchar *str1, williamr@2: const gchar *str2); williamr@2: IMPORT_C gchar *g_utf8_collate_key (const gchar *str, williamr@2: gssize len) G_GNUC_MALLOC; williamr@2: IMPORT_C gchar *g_utf8_collate_key_for_filename (const gchar *str, williamr@2: gssize len) G_GNUC_MALLOC; williamr@2: williamr@2: IMPORT_C gboolean g_unichar_get_mirror_char (gunichar ch, williamr@2: gunichar *mirrored_ch); williamr@2: williamr@2: G_END_DECLS williamr@2: williamr@2: #endif /* __G_UNICODE_H__ */