1/*- 2 * Copyright (c) 1992, 1993, 1994 3 * The Regents of the University of California. All rights reserved. 4 * Copyright (c) 1992, 1993, 1994, 1995, 1996 5 * Keith Bostic. All rights reserved. 6 * 7 * See the LICENSE file for redistribution information. 8 */ 9 10#ifndef MULTIBYTE_H 11#define MULTIBYTE_H 12 13/* 14 * Fundamental character types. 15 * 16 * CHAR_T An integral type that can hold any character. 17 * ARG_CHAR_T The type of a CHAR_T when passed as an argument using 18 * traditional promotion rules. It should also be able 19 * to be compared against any CHAR_T for equality without 20 * problems. 21 * UCHAR_T The shortest unified character type (8-bit clean). 22 * RCHAR_T The character type used by the internal regex engine. 23 * 24 * If no integral type can hold a character, don't even try the port. 25 */ 26typedef int ARG_CHAR_T; 27 28#ifdef USE_WIDECHAR 29#include <wchar.h> 30#include <wctype.h> 31 32typedef wchar_t CHAR_T; 33typedef wint_t UCHAR_T; 34typedef wchar_t RCHAR_T; 35#define REOF WEOF 36 37#define STRLEN wcslen 38#define STRTOL wcstol 39#define STRTOUL wcstoul 40#define SPRINTF swprintf 41#define STRCMP wcscmp 42#define STRPBRK wcspbrk 43#define ISBLANK iswblank 44#define ISCNTRL iswcntrl 45#define ISDIGIT iswdigit 46#define ISXDIGIT iswxdigit 47#define ISGRAPH iswgraph 48#define ISLOWER iswlower 49#define ISPRINT iswprint 50#define ISPUNCT iswpunct 51#define ISSPACE iswspace 52#define ISUPPER iswupper 53#define TOLOWER towlower 54#define TOUPPER towupper 55#define STRSET wmemset 56#define STRCHR wcschr 57#define STRRCHR wcsrchr 58#define GETC getwc 59 60#define L(ch) L ## ch 61#define WS "%ls" 62#define WVS "%*ls" 63#define WC "%lc" 64 65#else 66typedef u_char CHAR_T; 67typedef u_char UCHAR_T; 68typedef char RCHAR_T; 69#define REOF EOF 70 71#define STRLEN strlen 72#define STRTOL(a,b,c) (strtol(a,(char**)b,c)) 73#define STRTOUL(a,b,c) (strtoul(a,(char**)b,c)) 74#define SPRINTF snprintf 75#define STRCMP strcmp 76#define STRPBRK strpbrk 77#define ISBLANK isblank 78#define ISCNTRL iscntrl 79#define ISDIGIT isdigit 80#define ISXDIGIT isxdigit 81#define ISGRAPH isgraph 82#define ISLOWER islower 83#define ISPRINT isprint 84#define ISPUNCT ispunct 85#define ISSPACE isspace 86#define ISUPPER isupper 87#define TOLOWER tolower 88#define TOUPPER toupper 89#define STRSET memset 90#define STRCHR strchr 91#define STRRCHR strrchr 92#define GETC getc 93 94#define L(ch) ch 95#define WS "%s" 96#define WVS "%*s" 97#define WC "%c" 98 99#endif 100 101#if defined(USE_WIDECHAR) && defined(DEBUG) 102#define MEMCPY wmemcpy 103#define MEMMOVE wmemmove 104#define MEMCMP wmemcmp 105#else 106#define MEMCPY(p, t, len) memcpy(p, t, (len) * sizeof(CHAR_T)) 107#define MEMMOVE(p, t, len) memmove(p, t, (len) * sizeof(CHAR_T)) 108#define MEMCMP(p, t, len) memcmp(p, t, (len) * sizeof(CHAR_T)) 109#endif 110 111#define SIZE(w) (sizeof(w) / sizeof(*w)) 112 113/* 114 * Locale insensitive character category detection. 115 */ 116 117static __inline int 118isatoz(CHAR_T c) 119{ 120 return 'a' <= c && c <= 'z'; 121} 122 123static __inline int 124isAtoZ(CHAR_T c) 125{ 126 return 'A' <= c && c <= 'Z'; 127} 128 129static __inline int 130is0to9(CHAR_T c) 131{ 132 return '0' <= c && c <= '9'; 133} 134 135static __inline int 136isazAZ(CHAR_T c) 137{ 138 return isatoz(c) || isAtoZ(c); 139} 140 141static __inline int 142is09azAZ(CHAR_T c) 143{ 144 return is0to9(c) || isazAZ(c); 145} 146 147#endif 148