m_wchar.h revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1996, by Sun Microsystems, Inc.
* All rights reserved.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
/*
* ISO/IEC 9899: 1990/Add.3: 1993 (E): Wide character header file
*
* Copyright 1992, 1993 by Mortice Kern Systems Inc. All rights reserved.
*
* $Header: /rd/h/rcs/m_wchar.h 1.51 1995/09/20 19:17:54 ant Exp $
*
*/
#ifndef __M_M_WCHAR_H__
#define __M_M_WCHAR_H__ 1
/*
* m_wchar.h:
* configuration file for multi-byte vs. single byte enablement
*/
#include <wchar.h>
#include <wctype.h>
#include <limits.h> /* Fetch MB_LEN_MAX */
#ifdef M_I18N_LOCKING_SHIFT
extern char *m_strsanitize (char *);
#else
#define m_strsanitize(str) (str)
#endif /* M_I18N_LOCKING_SHIFT */
#ifdef M_I18N_MB
# ifndef MB_LEN_MAX
# error M_I18N_MB defined; but the local system does not support multibyte
# endif /* MB_LEN_MAX */
#define MB_BEGIN if (MB_CUR_MAX > 1) {
#define MB_ELSE } else {
#define MB_END }
#define M_MB_L(s) L##s
#ifndef _WUCHAR_T
#define _WUCHAR_T
/* a typedef to allow single byte distinction between char and uchar
* in MKS environment
*/
typedef wchar_t wuchar_t;
#endif /*_WUCHAR_T*/
extern wint_t m_escapewc(wchar_t **);
extern int m_fputmbs(FILE* fp, char *mbs, int wid, int prec, int ljust);
extern int m_fgetws (wchar_t *, size_t, FILE *);
extern FILE *m_fwopen (wchar_t *, char *);
extern wchar_t *m_wcsdup (const wchar_t *);
extern wchar_t *m_mbstowcsdup (const char *s);
extern char *m_wcstombsdup (const wchar_t *w);
extern char *m_mbschr (const char *, int);
extern char *m_mbsrchr (const char *, int);
extern char *m_mbspbrk (const char *, const char *);
extern wchar_t *m_wcsset (wchar_t *, wchar_t, size_t);
extern int iswabsname (wchar_t *);
#define m_smalls(s) (s)
#define wctomb_init() wctomb(NULL,0)
#else /* !M_I18N_MB */
/* include <stdlib.h> here,
* We must include the multibyte function prototypes (in <stdlib.h>) before
* redefining the prototype function names below.
*
* AND including <stdlib.h> DOES NOT cause a problem with wchar_t.
*
* ANSI says that the typedef of wchar_t should be defined in stdlib.h.
* Thus, the prototypes in stdlib.h are declared using stdlib's definition
* of wchar_t.
*/
#include <stdlib.h> /* DO NOT MOVE THIS include - THIS must be first */
#undef m_escapewc
#undef m_fgetws
#undef m_fwopen
#undef m_wcsdup
#undef m_mbstowcsdup
#undef m_wcstombsdup
#undef m_mbschr
#undef m_mbsrchr
#undef m_mbspbrk
#undef m_wcsset
#undef iswabsname
#undef m_fputmbs
#define m_escapewc m_escapec
#define m_fgetws m_fgets
#define m_fwopen fopen
#define m_wcsdup strdup
#define m_mbstowcsdup strdup
#define m_wcstombsdup strdup
#define m_mbschr strchr
#define m_mbsrchr strrchr
#define m_mbspbrk strpbrk
#define m_wcsset memset
#define iswabsname(s) isabsname(s)
#define m_fputmbs(fp, str, wid, prec, ljust) \
fprintf((fp), (ljust) ? "%-*.*s" : "%*.*s", wid, prec, str)
#define MB_BEGIN if (0) {
#define MB_ELSE } else {
#define MB_END }
#define M_MB_L(s) s
/*
* Types and Macros
*/
#undef WEOF
#undef wint_t
#undef wuchar_t
#undef wchar_t
#define WEOF EOF
#define wchar_t char /* ensures we never use the wchar_t typedef */
#define wint_t int /* type as large as either wchar_t or WEOF */
#define wuchar_t unsigned char /* Force override of typedef */
/*
* Must define _WCHAR_T, _WINT_T and _WUCHAR_T to avoid typedefs collisions
* in other system headers.
* Most systems do something like this:
* #ifndef _WCHAR_T
* #define _WCHAR_T
* typedef unsigned short wchar_t
* #endif
* in their system headers to avoid multiple declarations of wchar_t
*/
#undef _WCHAR_T
#undef _WINT_T
#undef _WUCHAR_T
#define _WCHAR_T
#define _WINT_T
#define _WUCHAR_T
/*
* Input/Output
*/
#undef fgetwc
#undef getwc
#undef getwchar
#undef fputwc
#undef putwc
#undef putwchar
#undef fputws
#undef puts
#undef fgetwx
#undef getws
#undef ungetwc
#undef fwprintf
#undef fwscanf
#undef wprintf
#undef wscanf
#undef swscanf
#undef vfwprintf
#undef vwprintf
#undef vswprintf
#define fgetwc fgetc
#define getwc getc
#define getwchar getchar
#define fputwc fputc
#define putwc putc
#define putwchar putchar
#define fputws fputs
#define fgetws fgets
#define getws gets
#define ungetwc ungetc
#define fwprintf fprintf
#define fwscanf fscanf
#define wprintf printf
#define wscanf scanf
#define swscanf sscanf
#define vfwprintf vfprintf
#define vwprintf vprintf
/* NOTE:
* In single byte mode, both swprintf() and vswprintf() are converted to
* similar, but NOT IDENTICAL, functions that have slightly different
* semantics.
* The 2nd argument to both these routines (e.g the size_t arg)
* is not used in the singlebyte environment since sprintf() and vsprintf()
* do not support this argument.
* One has to be careful when using this routine to not depend on
* the enforcement/safety of this 2nd argument.
*
* swprintf() is converted to m_swprintf(), which is a C function
* (because it can use a variable number of args),
* which is implemented as a call to vsprint()
* vswprintf() is converted to vsprintf()
*
*/
#define swprintf m_swprintf
#define vswprintf(w,n,f,v) vsprintf((char*)w,(const char*)f, v)
#ifndef m_smalls
extern wchar_t *m_smalls (const wchar_t *);
#endif /*m_smalls*/
/*
* General Utilities
*/
#undef wcstod
#undef wcstol
#undef wcstoul
#undef wctomb_init
#define wcstod strtod
#define wcstol strtol
#define wcstoul strtoul
#define wctomb_init() (0) /* No state dependency for nonmultibyte. */
/*
* Wide string handling
*/
#undef wcscpy
#undef wcsncpy
#undef wcscat
#undef wcsncat
#undef wcscoll
#undef wcscmp
#undef wcsncmp
#undef wcsxfrm
#undef wcschr
#undef wcscspn
#undef wcspbrk
#undef wcsrchr
#undef wcsspn
#undef wcsstr
#undef wcstok
#undef wcslen
#undef wcswidth
#undef wcwidth
#define wcscpy strcpy
#define wcsncpy strncpy
#define wcscat strcat
#define wcsncat strncat
#define wcscoll strcoll
#define wcscmp strcmp
#define wcsncmp strncmp
#define wcsxfrm strxfrm
#define wcschr strchr
#define wcscspn strcspn
#define wcspbrk strpbrk
#define wcsrchr strrchr
#define wcsspn strspn
#define wcsstr strstr
#define wcstok(x, y, z) strtok(x, y)
#define wcslen strlen
#define wcswidth(s1, n) strlen(s1) /* Need a strnlen? */
#define wcwidth(c) 1
/*
* Date and time
*/
#undef wcsftime
#define wcsftime strftime
/*
* Extended Multibyte functions
*/
#undef wctob
#undef sisinit
#define wctob(c) ((int) (wint_t) (c))
#define sisinit(p) (1) /* Always in initial state */
/*
* Define prototypes for singlebyte equivalents of multibyte functions.
* We have to use macros to map them to other function names, so that
* they do not conflict with the prototypes from <stdlib.h> that may have
* used a different definition of wchar_t. The restartable functions are
* mapped to their non-restartable counterparts, since there is no state
* information to be preserved.
*/
#undef mblen
#undef mbrlen
#undef mbtowc
#undef mbrtowc
#undef wctomb
#undef wcrtomb
#undef mbstowcs
#undef mbsrtowcs
#undef wcstombs
#undef wcsrtombs
#define mblen(s, n) m_sb_mblen(s, n)
#define mbrlen(s, n, ps) m_sb_mblen(s, n)
#define mbtowc(pwc, s, n) m_sb_mbtowc(pwc, s, n)
#define mbrtowc(pwc, s, n, ps) m_sb_mbtowc(pwc, s, n)
#define wctomb(s, wc) m_sb_wctomb(s, wc)
#define wcrtomb(s, wc, ps) m_sb_wctomb(s, wc)
#define mbstowcs(pwcs, s, n) m_sb_mbstowcs(pwcs, s, n)
#define mbsrtowcs(pwcs, s, n, ps) m_sb_mbstowcs(pwcs, s, n)
#define wcstombs(s, pwcs, n) m_sb_wcstombs(s, pwcs, n)
#define wcsrtombs(s, pwcs, n, ps) m_sb_wcstombs(s, pwcs, n)
extern int m_sb_mblen(const char *s, size_t n);
extern int m_sb_mbtowc(wchar_t *pwc, const char *s, size_t n);
extern int m_sb_wctomb(char *s, wchar_t wc);
extern size_t m_sb_mbstowcs(wchar_t *pwcs, const char *s, size_t n);
extern size_t m_sb_wcstombs(char *s, const wchar_t *pwcs, size_t n);
/*
* convert definitions from <wctype.h>
*/
#undef iswalnum
#undef iswalpha
#undef iswcntrl
#undef iswdigit
#undef iswgraph
#undef iswlower
#undef iswprint
#undef iswpunct
#undef iswspace
#undef iswupper
#undef iswxdigit
#undef iswblank
#undef towlower
#undef towupper
#define iswalnum(c) isalnum(c)
#define iswalpha(c) isalpha(c)
#define iswcntrl(c) iscntrl(c)
#define iswdigit(c) isdigit(c)
#define iswgraph(c) isgraph(c)
#define iswlower(c) islower(c)
#define iswprint(c) isprint(c)
#define iswpunct(c) ispunct(c)
#define iswspace(c) isspace(c)
#define iswupper(c) isupper(c)
#define iswxdigit(c) isxdigit(c)
#define iswblank(c) isblank(c)
#define towlower(c) tolower(c)
#define towupper(c) toupper(c)
/*
* Note: MKS libc/gen/iswctype.c contains the system independent version
* of wctype() and iswctype().
*
* In single byte mode, we can't use the names wctype() and iswctype().
* These may have been defined in the system's headers (e.g <wctype.h>)
* using the system definition of wint_t and wctype_t.
* BUT we have just changed the meaning of wint_t above, to an 'int'
* which may not be the same size as wint_t.
* Thus, we rename them so that we don't get any prototype conflicts
*/
#undef wctype
#undef iswctype
#define wctype _m_wctype
#define iswctype _m_iswctype
extern wctype_t wctype(const char *property);
extern int iswctype(wint_t wc, wctype_t desc);
/*
* .2 Functions
*/
#include <fnmatch.h>
#undef fnwwmatch
#undef fnwnmatch
#define fnwwmatch fnmatch
#define fnwnmatch fnmatch
#include <regex.h>
#undef regwcomp
#undef regwexec
#undef regwdosub
#undef regwdosuba
#undef regwmatch_t
#define regwcomp regcomp
#define regwexec regexec
#define regwdosub regdosub
#define regwdosuba regdosuba
#define regwmatch_t regmatch_t
#endif /* M_I18N_MB */
/*
* prototypes that are common to both SingleByte and MultiByte
*/
extern int m_mbswidth (const char *, size_t);
extern int m_mbsrwidth (const char *, size_t, mbstate_t *);
#endif /*__M_M_WCHAR_H__*/