1 /*
   2  * Copyright 2015 Nexenta Systmes, Inc.  All rights reserved.
   3  * Copyright 2013 Garrett D'Amore <garrett@damore.org>
   4  * Copyright (c) 1995 Alex Tatmanjants <alex@elvisti.kiev.ua>
   5  *              at Electronni Visti IA, Kiev, Ukraine.
   6  *                      All rights reserved.
   7  *
   8  * Redistribution and use in source and binary forms, with or without
   9  * modification, are permitted provided that the following conditions
  10  * are met:
  11  * 1. Redistributions of source code must retain the above copyright
  12  *    notice, this list of conditions and the following disclaimer.
  13  * 2. Redistributions in binary form must reproduce the above copyright
  14  *    notice, this list of conditions and the following disclaimer in the
  15  *    documentation and/or other materials provided with the distribution.
  16  *
  17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
  18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
  21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  27  * SUCH DAMAGE.
  28  */
  29 
  30 #ifndef _COLLATE_H_
  31 #define _COLLATE_H_
  32 
  33 /*
  34  * This file defines the libc interface to LC_COLLATE data.
  35  */
  36 
  37 #include <sys/types.h>
  38 #include <limits.h>
  39 #include "collatefile.h"
  40 #include "localeimpl.h"
  41 
  42 /*
  43  * This is the run-time (in-memory) form of LC_COLLATE data.
  44  */
  45 struct lc_collate {
  46         int             lc_is_posix;
  47 
  48         uint8_t         lc_directive_count;
  49         uint8_t         lc_directive[COLL_WEIGHTS_MAX];
  50         int32_t         lc_pri_count[COLL_WEIGHTS_MAX];
  51         int32_t         lc_flags;
  52         int32_t         lc_chain_count;
  53         int32_t         lc_large_count;
  54         int32_t         lc_subst_count[COLL_WEIGHTS_MAX];
  55         int32_t         lc_undef_pri[COLL_WEIGHTS_MAX];
  56 
  57         collate_info_t  *lc_info;
  58         collate_char_t  *lc_char_table;
  59         collate_large_t *lc_large_table;
  60         collate_chain_t *lc_chain_table;
  61         collate_subst_t *lc_subst_table[COLL_WEIGHTS_MAX];
  62 };
  63 
  64 void    _collate_lookup(const struct lc_collate *, const wchar_t *,
  65     int *, int *, int, const int **);
  66 size_t  _collate_wxfrm(const struct lc_collate *, const wchar_t *,
  67     wchar_t *, size_t);
  68 size_t  _collate_sxfrm(const wchar_t *, char *, size_t, locale_t);
  69 int     _collate_range_cmp(wchar_t, wchar_t, locale_t);
  70 
  71 int     __collate_equiv_value(locale_t, const wchar_t *, size_t);
  72 
  73 #endif /* !_COLLATE_H_ */