File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / readline / rlmbutil.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jul 30 08:16:45 2014 UTC (9 years, 11 months ago) by misho
Branches: readline, MAIN
CVS tags: v6_3p10_cross, v6_3p10, v6_3, p6, HEAD
readline 6.3

    1: /* rlmbutil.h -- utility functions for multibyte characters. */
    2: 
    3: /* Copyright (C) 2001-2009 Free Software Foundation, Inc.
    4: 
    5:    This file is part of the GNU Readline Library (Readline), a library
    6:    for reading lines of text with interactive input and history editing.      
    7: 
    8:    Readline is free software: you can redistribute it and/or modify
    9:    it under the terms of the GNU General Public License as published by
   10:    the Free Software Foundation, either version 3 of the License, or
   11:    (at your option) any later version.
   12: 
   13:    Readline is distributed in the hope that it will be useful,
   14:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   15:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   16:    GNU General Public License for more details.
   17: 
   18:    You should have received a copy of the GNU General Public License
   19:    along with Readline.  If not, see <http://www.gnu.org/licenses/>.
   20: */
   21: 
   22: #if !defined (_RL_MBUTIL_H_)
   23: #define _RL_MBUTIL_H_
   24: 
   25: #include "rlstdc.h"
   26: 
   27: /************************************************/
   28: /* check multibyte capability for I18N code     */
   29: /************************************************/
   30: 
   31: /* For platforms which support the ISO C amendement 1 functionality we
   32:    support user defined character classes.  */
   33:    /* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
   34: #if defined (HAVE_WCTYPE_H) && defined (HAVE_WCHAR_H) && defined (HAVE_LOCALE_H)
   35: #  include <wchar.h>
   36: #  include <wctype.h>
   37: #  if defined (HAVE_ISWCTYPE) && \
   38:       defined (HAVE_ISWLOWER) && \
   39:       defined (HAVE_ISWUPPER) && \
   40:       defined (HAVE_MBSRTOWCS) && \
   41:       defined (HAVE_MBRTOWC) && \
   42:       defined (HAVE_MBRLEN) && \
   43:       defined (HAVE_TOWLOWER) && \
   44:       defined (HAVE_TOWUPPER) && \
   45:       defined (HAVE_WCHAR_T) && \
   46:       defined (HAVE_WCWIDTH)
   47:      /* system is supposed to support XPG5 */
   48: #    define HANDLE_MULTIBYTE      1
   49: #  endif
   50: #endif
   51: 
   52: /* If we don't want multibyte chars even on a system that supports them, let
   53:    the configuring user turn multibyte support off. */
   54: #if defined (NO_MULTIBYTE_SUPPORT)
   55: #  undef HANDLE_MULTIBYTE
   56: #endif
   57: 
   58: /* Some systems, like BeOS, have multibyte encodings but lack mbstate_t.  */
   59: #if HANDLE_MULTIBYTE && !defined (HAVE_MBSTATE_T)
   60: #  define wcsrtombs(dest, src, len, ps) (wcsrtombs) (dest, src, len, 0)
   61: #  define mbsrtowcs(dest, src, len, ps) (mbsrtowcs) (dest, src, len, 0)
   62: #  define wcrtomb(s, wc, ps) (wcrtomb) (s, wc, 0)
   63: #  define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0)
   64: #  define mbrlen(s, n, ps) (mbrlen) (s, n, 0)
   65: #  define mbstate_t int
   66: #endif
   67: 
   68: /* Make sure MB_LEN_MAX is at least 16 on systems that claim to be able to
   69:    handle multibyte chars (some systems define MB_LEN_MAX as 1) */
   70: #ifdef HANDLE_MULTIBYTE
   71: #  include <limits.h>
   72: #  if defined(MB_LEN_MAX) && (MB_LEN_MAX < 16)
   73: #    undef MB_LEN_MAX
   74: #  endif
   75: #  if !defined (MB_LEN_MAX)
   76: #    define MB_LEN_MAX 16
   77: #  endif
   78: #endif
   79: 
   80: /************************************************/
   81: /* end of multibyte capability checks for I18N  */
   82: /************************************************/
   83: 
   84: /*
   85:  * Flags for _rl_find_prev_mbchar and _rl_find_next_mbchar:
   86:  *
   87:  * MB_FIND_ANY		find any multibyte character
   88:  * MB_FIND_NONZERO	find a non-zero-width multibyte character
   89:  */
   90: 
   91: #define MB_FIND_ANY	0x00
   92: #define MB_FIND_NONZERO	0x01
   93: 
   94: extern int _rl_find_prev_mbchar PARAMS((char *, int, int));
   95: extern int _rl_find_next_mbchar PARAMS((char *, int, int, int));
   96: 
   97: #ifdef HANDLE_MULTIBYTE
   98: 
   99: extern int _rl_compare_chars PARAMS((char *, int, mbstate_t *, char *, int, mbstate_t *));
  100: extern int _rl_get_char_len PARAMS((char *, mbstate_t *));
  101: extern int _rl_adjust_point PARAMS((char *, int, mbstate_t *));
  102: 
  103: extern int _rl_read_mbchar PARAMS((char *, int));
  104: extern int _rl_read_mbstring PARAMS((int, char *, int));
  105: 
  106: extern int _rl_is_mbchar_matched PARAMS((char *, int, int, char *, int));
  107: 
  108: extern wchar_t _rl_char_value PARAMS((char *, int));
  109: extern int _rl_walphabetic PARAMS((wchar_t));
  110: 
  111: #define _rl_to_wupper(wc)	(iswlower (wc) ? towupper (wc) : (wc))
  112: #define _rl_to_wlower(wc)	(iswupper (wc) ? towlower (wc) : (wc))
  113: 
  114: #define MB_NEXTCHAR(b,s,c,f) \
  115: 	((MB_CUR_MAX > 1 && rl_byte_oriented == 0) \
  116: 		? _rl_find_next_mbchar ((b), (s), (c), (f)) \
  117: 		: ((s) + (c)))
  118: #define MB_PREVCHAR(b,s,f) \
  119: 	((MB_CUR_MAX > 1 && rl_byte_oriented == 0) \
  120: 		? _rl_find_prev_mbchar ((b), (s), (f)) \
  121: 		: ((s) - 1))
  122: 
  123: #define MB_INVALIDCH(x)		((x) == (size_t)-1 || (x) == (size_t)-2)
  124: #define MB_NULLWCH(x)		((x) == 0)
  125: 
  126: /* Unicode combining characters range from U+0300 to U+036F */
  127: #define UNICODE_COMBINING_CHAR(x) ((x) >= 768 && (x) <= 879)
  128: 
  129: #if defined (WCWIDTH_BROKEN)
  130: #  define WCWIDTH(wc)	((_rl_utf8locale && UNICODE_COMBINING_CHAR(wc)) ? 0 : wcwidth(wc))
  131: #else
  132: #  define WCWIDTH(wc)	wcwidth(wc)
  133: #endif
  134: 
  135: #else /* !HANDLE_MULTIBYTE */
  136: 
  137: #undef MB_LEN_MAX
  138: #undef MB_CUR_MAX
  139: 
  140: #define MB_LEN_MAX	1
  141: #define MB_CUR_MAX	1
  142: 
  143: #define _rl_find_prev_mbchar(b, i, f)		(((i) == 0) ? (i) : ((i) - 1))
  144: #define _rl_find_next_mbchar(b, i1, i2, f)	((i1) + (i2))
  145: 
  146: #define _rl_char_value(buf,ind)	((buf)[(ind)])
  147: 
  148: #define _rl_walphabetic(c)	(rl_alphabetic (c))
  149: 
  150: #define _rl_to_wupper(c)	(_rl_to_upper (c))
  151: #define _rl_to_wlower(c)	(_rl_to_lower (c))
  152: 
  153: #define MB_NEXTCHAR(b,s,c,f)	((s) + (c))
  154: #define MB_PREVCHAR(b,s,f)	((s) - 1)
  155: 
  156: #define MB_INVALIDCH(x)		(0)
  157: #define MB_NULLWCH(x)		(0)
  158: 
  159: #endif /* !HANDLE_MULTIBYTE */
  160: 
  161: extern int rl_byte_oriented;
  162: 
  163: #endif /* _RL_MBUTIL_H_ */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>