Print this page
2964 need POSIX 2008 locale object support
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Approved by: TBD
*** 1,6 ****
--- 1,7 ----
/*
+ * Copyright 2013 Garrett D'Amore <garrett@damore.org>
* Copyright 2010 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 1995 Alex Tatmanjants <alex@elvisti.kiev.ua>
* at Electronni Visti IA, Kiev, Ukraine.
* All rights reserved.
*
*** 31,40 ****
--- 32,43 ----
#include <alloca.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <wchar.h>
+ #include <xlocale.h>
+ #include "localeimpl.h"
#include "collate.h"
#define ALLOCA_LIMIT 16
/*
*** 42,61 ****
* convert to wide characters and then use wcscoll. However if an
* error occurs, we gracefully fall back to simple strcmp. Caller
* should check errno.
*/
int
! strcoll(const char *s1, const char *s2)
{
int ret;
wchar_t *t1 = NULL, *t2 = NULL;
wchar_t *w1 = NULL, *w2 = NULL;
size_t sz1, sz2;
! if (_collate_load_error)
! goto error;
sz1 = strlen(s1) + 1;
sz2 = strlen(s2) + 1;
/*
* Simple assumption: conversion to wide format is strictly
--- 45,68 ----
* convert to wide characters and then use wcscoll. However if an
* error occurs, we gracefully fall back to simple strcmp. Caller
* should check errno.
*/
int
! strcoll_l(const char *s1, const char *s2, locale_t loc)
{
int ret;
wchar_t *t1 = NULL, *t2 = NULL;
wchar_t *w1 = NULL, *w2 = NULL;
size_t sz1, sz2;
+ const struct lc_collate *lcc = loc->collate;
! mbstate_t mbs1 = { 0 }; /* initial states */
! mbstate_t mbs2 = { 0 };
+ if (lcc->lc_is_posix)
+ return (strcmp(s1, s2));
+
sz1 = strlen(s1) + 1;
sz2 = strlen(s2) + 1;
/*
* Simple assumption: conversion to wide format is strictly
*** 80,96 ****
} else {
if ((w2 = alloca(sz2 * sizeof (wchar_t))) == NULL)
goto error;
}
! if ((mbstowcs(w1, s1, sz1)) == (size_t)-1)
goto error;
! if ((mbstowcs(w2, s2, sz2)) == (size_t)-1)
goto error;
! ret = wcscoll(w1, w2);
if (t1)
free(t1);
if (t2)
free(t2);
--- 87,103 ----
} else {
if ((w2 = alloca(sz2 * sizeof (wchar_t))) == NULL)
goto error;
}
! if ((mbsrtowcs_l(w1, &s1, sz1, &mbs1, loc)) == (size_t)-1)
goto error;
! if ((mbsrtowcs_l(w2, &s2, sz2, &mbs2, loc)) == (size_t)-1)
goto error;
! ret = wcscoll_l(w1, w2, loc);
if (t1)
free(t1);
if (t2)
free(t2);
*** 100,105 ****
--- 107,118 ----
if (t1)
free(t1);
if (t2)
free(t2);
return (strcmp(s1, s2));
+ }
+
+ int
+ strcoll(const char *s1, const char *s2)
+ {
+ return (strcoll_l(s1, s2, uselocale(NULL)));
}