Blame lib/mbchar.h

Packit Service fdd496
/* Multibyte character data type.
Packit Service fdd496
   Copyright (C) 2001, 2005-2007, 2009-2017 Free Software Foundation, Inc.
Packit Service fdd496
Packit Service fdd496
   This program is free software: you can redistribute it and/or modify
Packit Service fdd496
   it under the terms of the GNU General Public License as published by
Packit Service fdd496
   the Free Software Foundation; either version 3 of the License, or
Packit Service fdd496
   (at your option) any later version.
Packit Service fdd496
Packit Service fdd496
   This program is distributed in the hope that it will be useful,
Packit Service fdd496
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fdd496
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service fdd496
   GNU General Public License for more details.
Packit Service fdd496
Packit Service fdd496
   You should have received a copy of the GNU General Public License
Packit Service fdd496
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service fdd496
Packit Service fdd496
/* Written by Bruno Haible <bruno@clisp.org>.  */
Packit Service fdd496
Packit Service fdd496
/* A multibyte character is a short subsequence of a char* string,
Packit Service fdd496
   representing a single wide character.
Packit Service fdd496
Packit Service fdd496
   We use multibyte characters instead of wide characters because of
Packit Service fdd496
   the following goals:
Packit Service fdd496
   1) correct multibyte handling, i.e. operate according to the LC_CTYPE
Packit Service fdd496
      locale,
Packit Service fdd496
   2) ease of maintenance, i.e. the maintainer needs not know all details
Packit Service fdd496
      of the ISO C 99 standard,
Packit Service fdd496
   3) don't fail grossly if the input is not in the encoding set by the
Packit Service fdd496
      locale, because often different encodings are in use in the same
Packit Service fdd496
      countries (ISO-8859-1/UTF-8, EUC-JP/Shift_JIS, ...),
Packit Service fdd496
   4) fast in the case of ASCII characters,
Packit Service fdd496
   5) portability, i.e. don't make unportable assumptions about wchar_t.
Packit Service fdd496
Packit Service fdd496
   Multibyte characters are only accessed through the mb* macros.
Packit Service fdd496
Packit Service fdd496
   mb_ptr (mbc)
Packit Service fdd496
     return a pointer to the beginning of the multibyte sequence.
Packit Service fdd496
Packit Service fdd496
   mb_len (mbc)
Packit Service fdd496
     returns the number of bytes occupied by the multibyte sequence.
Packit Service fdd496
     Always > 0.
Packit Service fdd496
Packit Service fdd496
   mb_iseq (mbc, sc)
Packit Service fdd496
     returns true if mbc is the standard ASCII character sc.
Packit Service fdd496
Packit Service fdd496
   mb_isnul (mbc)
Packit Service fdd496
     returns true if mbc is the nul character.
Packit Service fdd496
Packit Service fdd496
   mb_cmp (mbc1, mbc2)
Packit Service fdd496
     returns a positive, zero, or negative value depending on whether mbc1
Packit Service fdd496
     sorts after, same or before mbc2.
Packit Service fdd496
Packit Service fdd496
   mb_casecmp (mbc1, mbc2)
Packit Service fdd496
     returns a positive, zero, or negative value depending on whether mbc1
Packit Service fdd496
     sorts after, same or before mbc2, modulo upper/lowercase conversion.
Packit Service fdd496
Packit Service fdd496
   mb_equal (mbc1, mbc2)
Packit Service fdd496
     returns true if mbc1 and mbc2 are equal.
Packit Service fdd496
Packit Service fdd496
   mb_caseequal (mbc1, mbc2)
Packit Service fdd496
     returns true if mbc1 and mbc2 are equal modulo upper/lowercase conversion.
Packit Service fdd496
Packit Service fdd496
   mb_isalnum (mbc)
Packit Service fdd496
     returns true if mbc is alphanumeric.
Packit Service fdd496
Packit Service fdd496
   mb_isalpha (mbc)
Packit Service fdd496
     returns true if mbc is alphabetic.
Packit Service fdd496
Packit Service fdd496
   mb_isascii(mbc)
Packit Service fdd496
     returns true if mbc is plain ASCII.
Packit Service fdd496
Packit Service fdd496
   mb_isblank (mbc)
Packit Service fdd496
     returns true if mbc is a blank.
Packit Service fdd496
Packit Service fdd496
   mb_iscntrl (mbc)
Packit Service fdd496
     returns true if mbc is a control character.
Packit Service fdd496
Packit Service fdd496
   mb_isdigit (mbc)
Packit Service fdd496
     returns true if mbc is a decimal digit.
Packit Service fdd496
Packit Service fdd496
   mb_isgraph (mbc)
Packit Service fdd496
     returns true if mbc is a graphic character.
Packit Service fdd496
Packit Service fdd496
   mb_islower (mbc)
Packit Service fdd496
     returns true if mbc is lowercase.
Packit Service fdd496
Packit Service fdd496
   mb_isprint (mbc)
Packit Service fdd496
     returns true if mbc is a printable character.
Packit Service fdd496
Packit Service fdd496
   mb_ispunct (mbc)
Packit Service fdd496
     returns true if mbc is a punctuation character.
Packit Service fdd496
Packit Service fdd496
   mb_isspace (mbc)
Packit Service fdd496
     returns true if mbc is a space character.
Packit Service fdd496
Packit Service fdd496
   mb_isupper (mbc)
Packit Service fdd496
     returns true if mbc is uppercase.
Packit Service fdd496
Packit Service fdd496
   mb_isxdigit (mbc)
Packit Service fdd496
     returns true if mbc is a hexadecimal digit.
Packit Service fdd496
Packit Service fdd496
   mb_width (mbc)
Packit Service fdd496
     returns the number of columns on the output device occupied by mbc.
Packit Service fdd496
     Always >= 0.
Packit Service fdd496
Packit Service fdd496
   mb_putc (mbc, stream)
Packit Service fdd496
     outputs mbc on stream, a byte oriented FILE stream opened for output.
Packit Service fdd496
Packit Service fdd496
   mb_setascii (&mbc, sc)
Packit Service fdd496
     assigns the standard ASCII character sc to mbc.
Packit Service fdd496
Packit Service fdd496
   mb_copy (&destmbc, &srcmbc)
Packit Service fdd496
     copies srcmbc to destmbc.
Packit Service fdd496
Packit Service fdd496
   Here are the function prototypes of the macros.
Packit Service fdd496
Packit Service fdd496
   extern const char *  mb_ptr (const mbchar_t mbc);
Packit Service fdd496
   extern size_t        mb_len (const mbchar_t mbc);
Packit Service fdd496
   extern bool          mb_iseq (const mbchar_t mbc, char sc);
Packit Service fdd496
   extern bool          mb_isnul (const mbchar_t mbc);
Packit Service fdd496
   extern int           mb_cmp (const mbchar_t mbc1, const mbchar_t mbc2);
Packit Service fdd496
   extern int           mb_casecmp (const mbchar_t mbc1, const mbchar_t mbc2);
Packit Service fdd496
   extern bool          mb_equal (const mbchar_t mbc1, const mbchar_t mbc2);
Packit Service fdd496
   extern bool          mb_caseequal (const mbchar_t mbc1, const mbchar_t mbc2);
Packit Service fdd496
   extern bool          mb_isalnum (const mbchar_t mbc);
Packit Service fdd496
   extern bool          mb_isalpha (const mbchar_t mbc);
Packit Service fdd496
   extern bool          mb_isascii (const mbchar_t mbc);
Packit Service fdd496
   extern bool          mb_isblank (const mbchar_t mbc);
Packit Service fdd496
   extern bool          mb_iscntrl (const mbchar_t mbc);
Packit Service fdd496
   extern bool          mb_isdigit (const mbchar_t mbc);
Packit Service fdd496
   extern bool          mb_isgraph (const mbchar_t mbc);
Packit Service fdd496
   extern bool          mb_islower (const mbchar_t mbc);
Packit Service fdd496
   extern bool          mb_isprint (const mbchar_t mbc);
Packit Service fdd496
   extern bool          mb_ispunct (const mbchar_t mbc);
Packit Service fdd496
   extern bool          mb_isspace (const mbchar_t mbc);
Packit Service fdd496
   extern bool          mb_isupper (const mbchar_t mbc);
Packit Service fdd496
   extern bool          mb_isxdigit (const mbchar_t mbc);
Packit Service fdd496
   extern int           mb_width (const mbchar_t mbc);
Packit Service fdd496
   extern void          mb_putc (const mbchar_t mbc, FILE *stream);
Packit Service fdd496
   extern void          mb_setascii (mbchar_t *new, char sc);
Packit Service fdd496
   extern void          mb_copy (mbchar_t *new, const mbchar_t *old);
Packit Service fdd496
 */
Packit Service fdd496
Packit Service fdd496
#ifndef _MBCHAR_H
Packit Service fdd496
#define _MBCHAR_H 1
Packit Service fdd496
Packit Service fdd496
#include <stdbool.h>
Packit Service fdd496
#include <string.h>
Packit Service fdd496
Packit Service fdd496
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
Packit Service fdd496
   <wchar.h>.
Packit Service fdd496
   BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
Packit Service fdd496
   <wchar.h>.  */
Packit Service fdd496
#include <stdio.h>
Packit Service fdd496
#include <time.h>
Packit Service fdd496
#include <wchar.h>
Packit Service fdd496
#include <wctype.h>
Packit Service fdd496
Packit Service fdd496
#ifndef _GL_INLINE_HEADER_BEGIN
Packit Service fdd496
 #error "Please include config.h first."
Packit Service fdd496
#endif
Packit Service fdd496
_GL_INLINE_HEADER_BEGIN
Packit Service fdd496
#ifndef MBCHAR_INLINE
Packit Service fdd496
# define MBCHAR_INLINE _GL_INLINE
Packit Service fdd496
#endif
Packit Service fdd496
Packit Service fdd496
#define MBCHAR_BUF_SIZE 24
Packit Service fdd496
Packit Service fdd496
struct mbchar
Packit Service fdd496
{
Packit Service fdd496
  const char *ptr;      /* pointer to current character */
Packit Service fdd496
  size_t bytes;         /* number of bytes of current character, > 0 */
Packit Service fdd496
  bool wc_valid;        /* true if wc is a valid wide character */
Packit Service fdd496
  wchar_t wc;           /* if wc_valid: the current character */
Packit Service fdd496
  char buf[MBCHAR_BUF_SIZE]; /* room for the bytes, used for file input only */
Packit Service fdd496
};
Packit Service fdd496
Packit Service fdd496
/* EOF (not a real character) is represented with bytes = 0 and
Packit Service fdd496
   wc_valid = false.  */
Packit Service fdd496
Packit Service fdd496
typedef struct mbchar mbchar_t;
Packit Service fdd496
Packit Service fdd496
/* Access the current character.  */
Packit Service fdd496
#define mb_ptr(mbc) ((mbc).ptr)
Packit Service fdd496
#define mb_len(mbc) ((mbc).bytes)
Packit Service fdd496
Packit Service fdd496
/* Comparison of characters.  */
Packit Service fdd496
#define mb_iseq(mbc, sc) ((mbc).wc_valid && (mbc).wc == (sc))
Packit Service fdd496
#define mb_isnul(mbc) ((mbc).wc_valid && (mbc).wc == 0)
Packit Service fdd496
#define mb_cmp(mbc1, mbc2) \
Packit Service fdd496
  ((mbc1).wc_valid                                                      \
Packit Service fdd496
   ? ((mbc2).wc_valid                                                   \
Packit Service fdd496
      ? (int) (mbc1).wc - (int) (mbc2).wc                               \
Packit Service fdd496
      : -1)                                                             \
Packit Service fdd496
   : ((mbc2).wc_valid                                                   \
Packit Service fdd496
      ? 1                                                               \
Packit Service fdd496
      : (mbc1).bytes == (mbc2).bytes                                    \
Packit Service fdd496
        ? memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes)                 \
Packit Service fdd496
        : (mbc1).bytes < (mbc2).bytes                                   \
Packit Service fdd496
          ? (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) > 0 ? 1 : -1) \
Packit Service fdd496
          : (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc2).bytes) >= 0 ? 1 : -1)))
Packit Service fdd496
#define mb_casecmp(mbc1, mbc2) \
Packit Service fdd496
  ((mbc1).wc_valid                                                      \
Packit Service fdd496
   ? ((mbc2).wc_valid                                                   \
Packit Service fdd496
      ? (int) towlower ((mbc1).wc) - (int) towlower ((mbc2).wc)         \
Packit Service fdd496
      : -1)                                                             \
Packit Service fdd496
   : ((mbc2).wc_valid                                                   \
Packit Service fdd496
      ? 1                                                               \
Packit Service fdd496
      : (mbc1).bytes == (mbc2).bytes                                    \
Packit Service fdd496
        ? memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes)                 \
Packit Service fdd496
        : (mbc1).bytes < (mbc2).bytes                                   \
Packit Service fdd496
          ? (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) > 0 ? 1 : -1) \
Packit Service fdd496
          : (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc2).bytes) >= 0 ? 1 : -1)))
Packit Service fdd496
#define mb_equal(mbc1, mbc2) \
Packit Service fdd496
  ((mbc1).wc_valid && (mbc2).wc_valid                                   \
Packit Service fdd496
   ? (mbc1).wc == (mbc2).wc                                             \
Packit Service fdd496
   : (mbc1).bytes == (mbc2).bytes                                       \
Packit Service fdd496
     && memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) == 0)
Packit Service fdd496
#define mb_caseequal(mbc1, mbc2) \
Packit Service fdd496
  ((mbc1).wc_valid && (mbc2).wc_valid                                   \
Packit Service fdd496
   ? towlower ((mbc1).wc) == towlower ((mbc2).wc)                       \
Packit Service fdd496
   : (mbc1).bytes == (mbc2).bytes                                       \
Packit Service fdd496
     && memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) == 0)
Packit Service fdd496
Packit Service fdd496
/* <ctype.h>, <wctype.h> classification.  */
Packit Service fdd496
#define mb_isascii(mbc) \
Packit Service fdd496
  ((mbc).wc_valid && (mbc).wc >= 0 && (mbc).wc <= 127)
Packit Service fdd496
#define mb_isalnum(mbc) ((mbc).wc_valid && iswalnum ((mbc).wc))
Packit Service fdd496
#define mb_isalpha(mbc) ((mbc).wc_valid && iswalpha ((mbc).wc))
Packit Service fdd496
#define mb_isblank(mbc) ((mbc).wc_valid && iswblank ((mbc).wc))
Packit Service fdd496
#define mb_iscntrl(mbc) ((mbc).wc_valid && iswcntrl ((mbc).wc))
Packit Service fdd496
#define mb_isdigit(mbc) ((mbc).wc_valid && iswdigit ((mbc).wc))
Packit Service fdd496
#define mb_isgraph(mbc) ((mbc).wc_valid && iswgraph ((mbc).wc))
Packit Service fdd496
#define mb_islower(mbc) ((mbc).wc_valid && iswlower ((mbc).wc))
Packit Service fdd496
#define mb_isprint(mbc) ((mbc).wc_valid && iswprint ((mbc).wc))
Packit Service fdd496
#define mb_ispunct(mbc) ((mbc).wc_valid && iswpunct ((mbc).wc))
Packit Service fdd496
#define mb_isspace(mbc) ((mbc).wc_valid && iswspace ((mbc).wc))
Packit Service fdd496
#define mb_isupper(mbc) ((mbc).wc_valid && iswupper ((mbc).wc))
Packit Service fdd496
#define mb_isxdigit(mbc) ((mbc).wc_valid && iswxdigit ((mbc).wc))
Packit Service fdd496
Packit Service fdd496
/* Extra <wchar.h> function.  */
Packit Service fdd496
Packit Service fdd496
/* Unprintable characters appear as a small box of width 1.  */
Packit Service fdd496
#define MB_UNPRINTABLE_WIDTH 1
Packit Service fdd496
Packit Service fdd496
MBCHAR_INLINE int
Packit Service fdd496
mb_width_aux (wint_t wc)
Packit Service fdd496
{
Packit Service fdd496
  int w = wcwidth (wc);
Packit Service fdd496
  /* For unprintable characters, arbitrarily return 0 for control characters
Packit Service fdd496
     and MB_UNPRINTABLE_WIDTH otherwise.  */
Packit Service fdd496
  return (w >= 0 ? w : iswcntrl (wc) ? 0 : MB_UNPRINTABLE_WIDTH);
Packit Service fdd496
}
Packit Service fdd496
Packit Service fdd496
#define mb_width(mbc) \
Packit Service fdd496
  ((mbc).wc_valid ? mb_width_aux ((mbc).wc) : MB_UNPRINTABLE_WIDTH)
Packit Service fdd496
Packit Service fdd496
/* Output.  */
Packit Service fdd496
#define mb_putc(mbc, stream)  fwrite ((mbc).ptr, 1, (mbc).bytes, (stream))
Packit Service fdd496
Packit Service fdd496
/* Assignment.  */
Packit Service fdd496
#define mb_setascii(mbc, sc) \
Packit Service fdd496
  ((mbc)->ptr = (mbc)->buf, (mbc)->bytes = 1, (mbc)->wc_valid = 1, \
Packit Service fdd496
   (mbc)->wc = (mbc)->buf[0] = (sc))
Packit Service fdd496
Packit Service fdd496
/* Copying a character.  */
Packit Service fdd496
MBCHAR_INLINE void
Packit Service fdd496
mb_copy (mbchar_t *new_mbc, const mbchar_t *old_mbc)
Packit Service fdd496
{
Packit Service fdd496
  if (old_mbc->ptr == &old_mbc->buf[0])
Packit Service fdd496
    {
Packit Service fdd496
      memcpy (&new_mbc->buf[0], &old_mbc->buf[0], old_mbc->bytes);
Packit Service fdd496
      new_mbc->ptr = &new_mbc->buf[0];
Packit Service fdd496
    }
Packit Service fdd496
  else
Packit Service fdd496
    new_mbc->ptr = old_mbc->ptr;
Packit Service fdd496
  new_mbc->bytes = old_mbc->bytes;
Packit Service fdd496
  if ((new_mbc->wc_valid = old_mbc->wc_valid))
Packit Service fdd496
    new_mbc->wc = old_mbc->wc;
Packit Service fdd496
}
Packit Service fdd496
Packit Service fdd496
Packit Service fdd496
/* is_basic(c) tests whether the single-byte character c is in the
Packit Service fdd496
   ISO C "basic character set".
Packit Service fdd496
   This is a convenience function, and is in this file only to share code
Packit Service fdd496
   between mbiter_multi.h and mbfile_multi.h.  */
Packit Service fdd496
#if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
Packit Service fdd496
    && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
Packit Service fdd496
    && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
Packit Service fdd496
    && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
Packit Service fdd496
    && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
Packit Service fdd496
    && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
Packit Service fdd496
    && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
Packit Service fdd496
    && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
Packit Service fdd496
    && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
Packit Service fdd496
    && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
Packit Service fdd496
    && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
Packit Service fdd496
    && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
Packit Service fdd496
    && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
Packit Service fdd496
    && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
Packit Service fdd496
    && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
Packit Service fdd496
    && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
Packit Service fdd496
    && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
Packit Service fdd496
    && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
Packit Service fdd496
    && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
Packit Service fdd496
    && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
Packit Service fdd496
    && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
Packit Service fdd496
    && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
Packit Service fdd496
    && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)
Packit Service fdd496
/* The character set is ISO-646, not EBCDIC. */
Packit Service fdd496
# define IS_BASIC_ASCII 1
Packit Service fdd496
Packit Service fdd496
extern const unsigned int is_basic_table[];
Packit Service fdd496
Packit Service fdd496
MBCHAR_INLINE bool
Packit Service fdd496
is_basic (char c)
Packit Service fdd496
{
Packit Service fdd496
  return (is_basic_table [(unsigned char) c >> 5] >> ((unsigned char) c & 31))
Packit Service fdd496
         & 1;
Packit Service fdd496
}
Packit Service fdd496
Packit Service fdd496
#else
Packit Service fdd496
Packit Service fdd496
MBCHAR_INLINE bool
Packit Service fdd496
is_basic (char c)
Packit Service fdd496
{
Packit Service fdd496
  switch (c)
Packit Service fdd496
    {
Packit Service fdd496
    case '\t': case '\v': case '\f':
Packit Service fdd496
    case ' ': case '!': case '"': case '#': case '%':
Packit Service fdd496
    case '&': case '\'': case '(': case ')': case '*':
Packit Service fdd496
    case '+': case ',': case '-': case '.': case '/':
Packit Service fdd496
    case '0': case '1': case '2': case '3': case '4':
Packit Service fdd496
    case '5': case '6': case '7': case '8': case '9':
Packit Service fdd496
    case ':': case ';': case '<': case '=': case '>':
Packit Service fdd496
    case '?':
Packit Service fdd496
    case 'A': case 'B': case 'C': case 'D': case 'E':
Packit Service fdd496
    case 'F': case 'G': case 'H': case 'I': case 'J':
Packit Service fdd496
    case 'K': case 'L': case 'M': case 'N': case 'O':
Packit Service fdd496
    case 'P': case 'Q': case 'R': case 'S': case 'T':
Packit Service fdd496
    case 'U': case 'V': case 'W': case 'X': case 'Y':
Packit Service fdd496
    case 'Z':
Packit Service fdd496
    case '[': case '\\': case ']': case '^': case '_':
Packit Service fdd496
    case 'a': case 'b': case 'c': case 'd': case 'e':
Packit Service fdd496
    case 'f': case 'g': case 'h': case 'i': case 'j':
Packit Service fdd496
    case 'k': case 'l': case 'm': case 'n': case 'o':
Packit Service fdd496
    case 'p': case 'q': case 'r': case 's': case 't':
Packit Service fdd496
    case 'u': case 'v': case 'w': case 'x': case 'y':
Packit Service fdd496
    case 'z': case '{': case '|': case '}': case '~':
Packit Service fdd496
      return 1;
Packit Service fdd496
    default:
Packit Service fdd496
      return 0;
Packit Service fdd496
    }
Packit Service fdd496
}
Packit Service fdd496
Packit Service fdd496
#endif
Packit Service fdd496
Packit Service fdd496
_GL_INLINE_HEADER_END
Packit Service fdd496
Packit Service fdd496
#endif /* _MBCHAR_H */