Print this page
2964 need POSIX 2008 locale object support
Reviewed by: Robert Mustacchi <rm@joyent.com>
*** 1,6 ****
--- 1,7 ----
/*
+ * Copyright 2013 Garrett D'Amore <garrett@damore.org>
* Copyright 2010 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2002-2004 Tim J. Robbins.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
*** 33,58 ****
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include "mblocal.h"
#include "stdiom.h"
/*
* Non-MT-safe version.
*/
wint_t
! _fgetwc_unlocked(FILE *fp)
{
wchar_t wc;
size_t nconv;
int c;
mbstate_t *statep;
if ((c = GETC(fp)) == EOF)
return (WEOF);
! if (MB_CUR_MAX == 1) {
/* Fast path for single-byte encodings. */
return ((wint_t)c);
}
if ((statep = _getmbstate(fp)) == NULL) {
fp->_flag = _IOERR;
--- 34,63 ----
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include "mblocal.h"
#include "stdiom.h"
+ #include "localeimpl.h"
+ #include "lctype.h"
/*
* Non-MT-safe version.
*/
wint_t
! _fgetwc_unlocked_l(FILE *fp, locale_t loc)
{
wchar_t wc;
size_t nconv;
int c;
mbstate_t *statep;
+ const struct lc_ctype *lct;
if ((c = GETC(fp)) == EOF)
return (WEOF);
! lct = loc->ctype;
! if (lct->lc_max_mblen == 1) {
/* Fast path for single-byte encodings. */
return ((wint_t)c);
}
if ((statep = _getmbstate(fp)) == NULL) {
fp->_flag = _IOERR;
*** 59,69 ****
errno = EBADF;
return (WEOF);
}
do {
char x = (char)c;
! nconv = __mbrtowc(&wc, &x, 1, statep);
if (nconv == (size_t)-1) {
break;
} else if (nconv == (size_t)-2) {
/* Incompletely decoded, consume another char */
continue;
--- 64,74 ----
errno = EBADF;
return (WEOF);
}
do {
char x = (char)c;
! nconv = lct->lc_mbrtowc(&wc, &x, 1, statep);
if (nconv == (size_t)-1) {
break;
} else if (nconv == (size_t)-2) {
/* Incompletely decoded, consume another char */
continue;
*** 87,139 ****
fp->_flag |= _IOERR;
errno = EILSEQ;
return (WEOF);
}
/*
* MT safe version
*/
wint_t
fgetwc(FILE *fp)
{
wint_t r;
rmutex_t *l;
FLOCKFILE(l, fp);
! r = _fgetwc_unlocked(fp);
FUNLOCKFILE(l);
return (r);
}
- #undef getwc
- wint_t
- getwc(FILE *fp)
- {
- return (getwc(fp));
- }
-
/*
* XPG5 version.
*/
wint_t
__fgetwc_xpg5(FILE *fp)
{
wint_t r;
rmutex_t *l;
FLOCKFILE(l, fp);
if (GET_NO_MODE(fp))
_setorientation(fp, _WC_MODE);
! r = _fgetwc_unlocked(fp);
FUNLOCKFILE(l);
return (r);
}
! #undef __getwc_xpg5
wint_t
! __getwc_xpg5(FILE *fp)
{
! return (__fgetwc_xpg5(fp));
}
--- 92,157 ----
fp->_flag |= _IOERR;
errno = EILSEQ;
return (WEOF);
}
+ wint_t
+ _fgetwc_unlocked(FILE *fp)
+ {
+ return (_fgetwc_unlocked_l(fp, uselocale(NULL)));
+ }
+
/*
* MT safe version
*/
+ #undef getwc
+ #pragma weak getwc = fgetwc
wint_t
fgetwc(FILE *fp)
{
wint_t r;
rmutex_t *l;
+ locale_t loc = uselocale(NULL);
FLOCKFILE(l, fp);
! r = _fgetwc_unlocked_l(fp, loc);
FUNLOCKFILE(l);
return (r);
}
/*
* XPG5 version.
*/
+ #undef __getwc_xpg5
+ #pragma weak __getwc_xpg5 = __fgetwc_xpg5
wint_t
__fgetwc_xpg5(FILE *fp)
{
wint_t r;
rmutex_t *l;
+ locale_t loc = uselocale(NULL);
FLOCKFILE(l, fp);
if (GET_NO_MODE(fp))
_setorientation(fp, _WC_MODE);
! r = _fgetwc_unlocked_l(fp, loc);
FUNLOCKFILE(l);
return (r);
}
! #pragma weak getwc_l = fgetwc_l
wint_t
! fgetwc_l(FILE *fp, locale_t loc)
{
! wint_t r;
! rmutex_t *l;
! FLOCKFILE(l, fp);
! if (GET_NO_MODE(fp))
! _setorientation(fp, _WC_MODE);
! r = _fgetwc_unlocked_l(fp, loc);
! FUNLOCKFILE(l);
!
! return (r);
}