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
*** 29,54 ****
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
#include <wchar.h>
#include "mblocal.h"
size_t
! mbsnrtowcs(wchar_t *_RESTRICT_KYWD dst, const char **_RESTRICT_KYWD src,
! size_t nms, size_t len, mbstate_t *_RESTRICT_KYWD ps)
{
static mbstate_t mbs;
if (ps == NULL)
ps = &mbs;
! return (__mbsnrtowcs(dst, src, nms, len, ps));
}
size_t
! __mbsnrtowcs_std(wchar_t *_RESTRICT_KYWD dst, const char **_RESTRICT_KYWD src,
size_t nms, size_t len, mbstate_t *_RESTRICT_KYWD ps)
{
const char *s;
size_t nchr;
wchar_t wc;
size_t nb;
--- 30,65 ----
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
#include <wchar.h>
#include "mblocal.h"
+ #include "localeimpl.h"
+ #include "lctype.h"
size_t
! mbsnrtowcs_l(wchar_t *_RESTRICT_KYWD dst, const char **_RESTRICT_KYWD src,
! size_t nms, size_t len, mbstate_t *_RESTRICT_KYWD ps, locale_t loc)
{
static mbstate_t mbs;
if (ps == NULL)
ps = &mbs;
! return (loc->ctype->lc_mbsnrtowcs(dst, src, nms, len, ps));
}
size_t
! mbsnrtowcs(wchar_t *_RESTRICT_KYWD dst, const char **_RESTRICT_KYWD src,
size_t nms, size_t len, mbstate_t *_RESTRICT_KYWD ps)
{
+ return (mbsnrtowcs_l(dst, src, nms, len, ps, uselocale(NULL)));
+ }
+
+ size_t
+ __mbsnrtowcs_std(wchar_t *_RESTRICT_KYWD dst, const char **_RESTRICT_KYWD src,
+ size_t nms, size_t len, mbstate_t *_RESTRICT_KYWD ps,
+ mbrtowc_pfn_t pmbrtowc)
+ {
const char *s;
size_t nchr;
wchar_t wc;
size_t nb;
*** 55,65 ****
s = *src;
nchr = 0;
if (dst == NULL) {
for (;;) {
! if ((nb = __mbrtowc(&wc, s, nms, ps)) == (size_t)-1)
/* Invalid sequence - mbrtowc() sets errno. */
return ((size_t)-1);
else if (nb == 0 || nb == (size_t)-2)
return (nchr);
s += nb;
--- 66,76 ----
s = *src;
nchr = 0;
if (dst == NULL) {
for (;;) {
! if ((nb = pmbrtowc(&wc, s, nms, ps)) == (size_t)-1)
/* Invalid sequence - mbrtowc() sets errno. */
return ((size_t)-1);
else if (nb == 0 || nb == (size_t)-2)
return (nchr);
s += nb;
*** 68,78 ****
}
/*NOTREACHED*/
}
while (len-- > 0) {
! if ((nb = __mbrtowc(dst, s, nms, ps)) == (size_t)-1) {
*src = s;
return ((size_t)-1);
} else if (nb == (size_t)-2) {
*src = s + nms;
return (nchr);
--- 79,89 ----
}
/*NOTREACHED*/
}
while (len-- > 0) {
! if ((nb = pmbrtowc(dst, s, nms, ps)) == (size_t)-1) {
*src = s;
return ((size_t)-1);
} else if (nb == (size_t)-2) {
*src = s + nms;
return (nchr);