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 2012 Milan Jurik. All rights reserved.
  * Copyright (c) 1992, 1993, 1994 Henry Spencer.
  * Copyright (c) 1992, 1993, 1994
  *      The Regents of the University of California.  All rights reserved.

@@ -723,10 +724,11 @@
 p_b_term(struct parse *p, cset *cs)
 {
         char c;
         wint_t start, finish;
         wint_t i;
+        locale_t loc = uselocale(NULL);
 
         /* classify what we've got */
         switch ((MORE()) ? PEEK() : '\0') {
         case '[':
                 c = (MORE2()) ? PEEK2() : '\0';

@@ -770,20 +772,22 @@
                 } else
                         finish = start;
                 if (start == finish)
                         CHadd(p, cs, start);
                 else {
-                        if (_collate_load_error) {
+                        if (loc->collate->lc_is_posix) {
                                 (void) REQUIRE((uch)start <= (uch)finish,
                                     REG_ERANGE);
                                 CHaddrange(p, cs, start, finish);
                         } else {
                                 (void) REQUIRE(_collate_range_cmp(start,
-                                    finish) <= 0, REG_ERANGE);
+                                    finish, loc) <= 0, REG_ERANGE);
                                 for (i = 0; i <= UCHAR_MAX; i++) {
-                                        if (_collate_range_cmp(start, i) <= 0 &&
-                                            _collate_range_cmp(i, finish) <= 0)
+                                        if (_collate_range_cmp(start, i, loc)
+                                            <= 0 &&
+                                            _collate_range_cmp(i, finish, loc)
+                                            <= 0)
                                                 CHadd(p, cs, i);
                                 }
                         }
                 }
                 break;

@@ -1365,10 +1369,11 @@
         char *cp;
         int offset;
         char buf[MB_LEN_MAX];
         size_t clen;
         mbstate_t mbs;
+        locale_t loc = uselocale(NULL);
 
         /* avoid making error situations worse */
         if (p->error != 0)
                 return;
 

@@ -1376,11 +1381,11 @@
          * It's not generally safe to do a ``char'' substring search on
          * multibyte character strings, but it's safe for at least
          * UTF-8 (see RFC 3629).
          */
         if (MB_CUR_MAX > 1 &&
-            strcmp(_CurrentRuneLocale->__encoding, "UTF-8") != 0)
+            strcmp(loc->runelocale->__encoding, "UTF-8") != 0)
                 return;
 
         /* find the longest OCHAR sequence in strip */
         newlen = 0;
         offset = 0;