/ lib / libedit / src / chartype.h
chartype.h
  1  /*	$NetBSD: chartype.h,v 1.7 2010/12/16 17:42:28 wiz Exp $	*/
  2  
  3  /*-
  4   * Copyright (c) 2009 The NetBSD Foundation, Inc.
  5   * All rights reserved.
  6   *
  7   * Redistribution and use in source and binary forms, with or without
  8   * modification, are permitted provided that the following conditions
  9   * are met:
 10   * 1. Redistributions of source code must retain the above copyright
 11   *    notice, this list of conditions and the following disclaimer.
 12   * 2. Redistributions in binary form must reproduce the above copyright
 13   *    notice, this list of conditions and the following disclaimer in the
 14   *    documentation and/or other materials provided with the distribution.
 15   * 3. All advertising materials mentioning features or use of this software
 16   *    must display the following acknowledgement:
 17   *        This product includes software developed by the NetBSD
 18   *        Foundation, Inc. and its contributors.
 19   * 4. Neither the name of The NetBSD Foundation nor the names of its
 20   *    contributors may be used to endorse or promote products derived
 21   *    from this software without specific prior written permission.
 22   *
 23   * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 24   * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 25   * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 26   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 27   * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 28   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 29   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 30   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 31   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 32   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 33   * POSSIBILITY OF SUCH DAMAGE.
 34   */
 35  
 36  #ifndef _h_chartype_f
 37  #define _h_chartype_f
 38  
 39  
 40  
 41  #ifdef WIDECHAR
 42  
 43  /* Ideally we should also test the value of the define to see if it
 44   * supports non-BMP code points without requiring UTF-16, but nothing
 45   * seems to actually advertise this properly, despite Unicode 3.1 having
 46   * been around since 2001... */
 47  #if !defined(__NetBSD__) && !defined(__sun) && !(defined(__APPLE__) && defined(__MACH__))
 48  #ifndef __STDC_ISO_10646__
 49  /* In many places it is assumed that the first 127 code points are ASCII
 50   * compatible, so ensure wchar_t indeed does ISO 10646 and not some other
 51   * funky encoding that could break us in weird and wonderful ways. */
 52  	#error wchar_t must store ISO 10646 characters
 53  #endif
 54  #endif
 55  
 56  /* Oh for a <uchar.h> with char32_t and __STDC_UTF_32__ in it...
 57   * ref: ISO/IEC DTR 19769
 58   */
 59  #if WCHAR_MAX < INT32_MAX
 60  #warning Build environment does not support non-BMP characters
 61  #endif
 62  
 63  #ifndef HAVE_WCSDUP
 64  wchar_t *wcsdup(const wchar_t *s);
 65  #endif
 66  
 67  #define ct_mbtowc            mbtowc
 68  #define ct_mbtowc_reset      mbtowc(0,0,0)
 69  #define ct_wctomb            wctomb
 70  #define ct_wctomb_reset      wctomb(0,0)
 71  #define ct_wcstombs          wcstombs
 72  #define ct_mbstowcs          mbstowcs
 73  
 74  #define Char			wchar_t
 75  #define Int			wint_t
 76  #define FUN(prefix,rest)	prefix ## _w ## rest
 77  #define FUNW(type)		type ## _w
 78  #define TYPE(type)		type ## W
 79  #define FSTR			"%ls"
 80  #define STR(x) 			L ## x
 81  #define UC(c)			c
 82  #define Isalpha(x)  iswalpha(x)
 83  #define Isalnum(x)  iswalnum(x)
 84  #define Isgraph(x)  iswgraph(x)
 85  #define Isspace(x)  iswspace(x)
 86  #define Isdigit(x)  iswdigit(x)
 87  #define Iscntrl(x)  iswcntrl(x)
 88  #define Isprint(x)  iswprint(x)
 89  
 90  #define Isupper(x)  iswupper(x)
 91  #define Islower(x)  iswlower(x)
 92  #define Toupper(x)  towupper(x)
 93  #define Tolower(x)  towlower(x)
 94  
 95  #define IsASCII(x)  (x < 0x100)
 96  
 97  #define Strlen(x)       wcslen(x)
 98  #define Strchr(s,c)     wcschr(s,c)
 99  #define Strrchr(s,c)    wcsrchr(s,c)
100  #define Strstr(s,v)     wcsstr(s,v)
101  #define Strdup(x)       wcsdup(x)
102  #define Strcpy(d,s)     wcscpy(d,s)
103  #define Strncpy(d,s,n)  wcsncpy(d,s,n)
104  #define Strncat(d,s,n)  wcsncat(d,s,n)
105  
106  #define Strcmp(s,v)     wcscmp(s,v)
107  #define Strncmp(s,v,n)  wcsncmp(s,v,n)
108  #define Strcspn(s,r)    wcscspn(s,r)
109  
110  #define Strtol(p,e,b)   wcstol(p,e,b)
111  
112  #define Width(c)	wcwidth(c)
113  
114  #else /* NARROW */
115  
116  #define ct_mbtowc            error
117  #define ct_mbtowc_reset
118  #define ct_wctomb            error
119  #define ct_wctomb_reset
120  #define ct_wcstombs(a, b, c)    (strncpy(a, b, c), strlen(a))
121  #define ct_mbstowcs(a, b, c)    (strncpy(a, b, c), strlen(a))
122  
123  #define Char			char
124  #define Int			int
125  #define FUN(prefix,rest)	prefix ## _ ## rest
126  #define FUNW(type)		type
127  #define TYPE(type)		type
128  #define FSTR			"%s"
129  #define STR(x) 			x
130  #define UC(c)			(unsigned char)(c)
131  
132  #define Isalpha(x)  isalpha((unsigned char)x)
133  #define Isalnum(x)  isalnum((unsigned char)x)
134  #define Isgraph(x)  isgraph((unsigned char)x)
135  #define Isspace(x)  isspace((unsigned char)x)
136  #define Isdigit(x)  isdigit((unsigned char)x)
137  #define Iscntrl(x)  iscntrl((unsigned char)x)
138  #define Isprint(x)  isprint((unsigned char)x)
139  
140  #define Isupper(x)  isupper((unsigned char)x)
141  #define Islower(x)  islower((unsigned char)x)
142  #define Toupper(x)  toupper((unsigned char)x)
143  #define Tolower(x)  tolower((unsigned char)x)
144  
145  #define IsASCII(x)  isascii((unsigned char)x)
146  
147  #define Strlen(x)       strlen(x)
148  #define Strchr(s,c)     strchr(s,c)
149  #define Strrchr(s,c)    strrchr(s,c)
150  #define Strstr(s,v)     strstr(s,v)
151  #define Strdup(x)       strdup(x)
152  #define Strcpy(d,s)     strcpy(d,s)
153  #define Strncpy(d,s,n)  strncpy(d,s,n)
154  #define Strncat(d,s,n)  strncat(d,s,n)
155  
156  #define Strcmp(s,v)     strcmp(s,v)
157  #define Strncmp(s,v,n)  strncmp(s,v,n)
158  #define Strcspn(s,r)    strcspn(s,r)
159  
160  #define Strtol(p,e,b)   strtol(p,e,b)
161  
162  #define Width(c)	1
163  
164  #endif
165  
166  
167  #ifdef WIDECHAR
168  /*
169   * Conversion buffer
170   */
171  typedef struct ct_buffer_t {
172          char    *cbuff;
173          size_t  csize;
174          Char *wbuff;
175          size_t  wsize;
176  } ct_buffer_t;
177  
178  #define ct_encode_string __ct_encode_string
179  /* Encode a wide-character string and return the UTF-8 encoded result. */
180  public char *ct_encode_string(const Char *, ct_buffer_t *);
181  
182  #define ct_decode_string __ct_decode_string
183  /* Decode a (multi)?byte string and return the wide-character string result. */
184  public Char *ct_decode_string(const char *, ct_buffer_t *);
185  
186  /* Decode a (multi)?byte argv string array.
187   * The pointer returned must be free()d when done. */
188  protected Char **ct_decode_argv(int, const char *[],  ct_buffer_t *);
189  
190  /* Resizes the conversion buffer(s) if needed. */
191  protected void ct_conv_buff_resize(ct_buffer_t *, size_t, size_t);
192  protected ssize_t ct_encode_char(char *, size_t, Char);
193  protected size_t ct_enc_width(Char);
194  
195  #define ct_free_argv(s)	el_free(s)
196  
197  #else
198  #define	ct_encode_string(s, b)	(s)
199  #define ct_decode_string(s, b)	(s)
200  #define ct_decode_argv(l, s, b)	(s)
201  #define ct_conv_buff_resize(b, os, ns)
202  #define ct_encode_char(d, l, s)	(*d = s, 1)
203  #define ct_free_argv(s)
204  #endif
205  
206  #ifndef NARROWCHAR
207  /* Encode a characted into the destination buffer, provided there is sufficent
208   * buffer space available. Returns the number of bytes used up (zero if the
209   * character cannot be encoded, -1 if there was not enough space available). */
210  
211  /* The maximum buffer size to hold the most unwieldly visual representation,
212   * in this case \U+nnnnn. */
213  #define VISUAL_WIDTH_MAX 8
214  
215  /* The terminal is thought of in terms of X columns by Y lines. In the cases
216   * where a wide character takes up more than one column, the adjacent
217   * occupied column entries will contain this faux character. */
218  #define MB_FILL_CHAR ((Char)-1)
219  
220  /* Visual width of character c, taking into account ^? , \0177 and \U+nnnnn
221   * style visual expansions. */
222  protected int ct_visual_width(Char);
223  
224  /* Turn the given character into the appropriate visual format, matching
225   * the width given by ct_visual_width(). Returns the number of characters used
226   * up, or -1 if insufficient space. Buffer length is in count of Char's. */
227  protected ssize_t ct_visual_char(Char *, size_t, Char);
228  
229  /* Convert the given string into visual format, using the ct_visual_char()
230   * function. Uses a static buffer, so not threadsafe. */
231  protected const Char *ct_visual_string(const Char *);
232  
233  
234  /* printable character, use ct_visual_width() to find out display width */
235  #define CHTYPE_PRINT        ( 0)
236  /* control character found inside the ASCII portion of the charset */
237  #define CHTYPE_ASCIICTL     (-1)
238  /* a \t */
239  #define CHTYPE_TAB          (-2)
240  /* a \n */
241  #define CHTYPE_NL           (-3)
242  /* non-printable character */
243  #define CHTYPE_NONPRINT     (-4)
244  /* classification of character c, as one of the above defines */
245  protected int ct_chr_class(Char c);
246  #endif
247  
248  
249  #endif /* _chartype_f */