Print this page
9083 replace regex implementation with tre

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libc/port/locale/collate.c
          +++ new/usr/src/lib/libc/port/locale/collate.c
↓ open down ↓ 642 lines elided ↑ open up ↑
 643  643  end:
 644  644          if (tr)
 645  645                  free(tr);
 646  646          return (need);
 647  647  
 648  648  fail:
 649  649          if (tr)
 650  650                  free(tr);
 651  651          return ((size_t)(-1));
 652  652  }
      653 +
      654 +/*
      655 + * __collate_equiv_value returns the primary collation value for the given
      656 + * collating symbol specified by str and len.  Zero or negative is returned
      657 + * if the collating symbol was not found.
      658 + */
      659 +int
      660 +__collate_equiv_value(locale_t loc, const wchar_t *str, size_t len)
      661 +{
      662 +        const struct lc_collate *lcc = loc->collate;
      663 +        int32_t e;
      664 +
      665 +        if (len < 1 || len >= COLLATE_STR_LEN)
      666 +                return (-1);
      667 +
      668 +        if (lcc->lc_is_posix)
      669 +                return ((len == 1 && *str <= UCHAR_MAX) ? *str : -1);
      670 +
      671 +        if (len == 1) {
      672 +                e = -1;
      673 +                if (*str <= UCHAR_MAX)
      674 +                        e = lcc->lc_char_table[*str].pri[0];
      675 +                else if (lcc->lc_large_count > 0) {
      676 +                        collate_large_t *match_large;
      677 +
      678 +                        match_large = largesearch(lcc, *str);
      679 +                        if (match_large != NULL)
      680 +                                e = match_large->pri.pri[0];
      681 +                }
      682 +                if (e == 0)
      683 +                        return (1);
      684 +                return (e > 0 ? e : 0);
      685 +        }
      686 +        if (lcc->lc_chain_count > 0) {
      687 +                wchar_t name[COLLATE_STR_LEN];
      688 +                collate_chain_t *match_chain;
      689 +                int clen;
      690 +
      691 +                wcsncpy(name, str, len);
      692 +                name[len] = 0;
      693 +                match_chain = chainsearch(lcc, name, &clen);
      694 +                if (match_chain != NULL) {
      695 +                        e = match_chain->pri[0];
      696 +                        if (e == 0)
      697 +                                return (1);
      698 +                        return (e < 0 ? -e : e);
      699 +                }
      700 +        }
      701 +
      702 +        return (0);
      703 +}
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX