1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 #ifndef _SYS_KICONV_H
  27 #define _SYS_KICONV_H
  28 
  29 #ifdef __cplusplus
  30 extern "C" {
  31 #endif
  32 
  33 #include <sys/types.h>
  34 
  35 #ifdef  _KERNEL
  36 
  37 /*
  38  * Supported fromcode/tocode values are saved in the following component type
  39  * of (name, id) pair. The id values of fromcode and tocode are used to
  40  * find out the corresponding code conversions.
  41  */
  42 typedef struct {
  43         char            *name;
  44         size_t          id;
  45 } kiconv_code_list_t;
  46 
  47 /*
  48  * Each unique kiconv code conversion identified by tocode and fromcode ids
  49  * have corresponding module id and internal function pointers to open(),
  50  * kiconv(), close(), and kiconvstr().
  51  */
  52 typedef struct {
  53         uint16_t        tid;            /* tocode id. */
  54         uint16_t        fid;            /* fromcode id. */
  55         uint16_t        mid;            /* module id. */
  56         void            *(*open)(void);
  57         size_t          (*kiconv)(void *, char **, size_t *, char **, size_t *,
  58                         int *);
  59         int             (*close)(void *);
  60         size_t          (*kiconvstr)(char *, size_t *, char *, size_t *, int,
  61                         int *);
  62 } kiconv_conv_list_t;
  63 
  64 /*
  65  * Each module id has a corresponding module name that is used to load
  66  * the module as needed and a reference counter.
  67  */
  68 typedef struct {
  69         char            *name;
  70         uint_t          refcount;
  71 } kiconv_mod_list_t;
  72 
  73 /*
  74  * The following two data structures are being used to transfer information
  75  * on the supported kiconv code conversions from a module to the framework.
  76  *
  77  * Details can be found from kiconv_ops(9S) and kiconv_module_info(9S)
  78  * man pages at PSARC/2007/173.
  79  */
  80 typedef struct {
  81         char            *tocode;
  82         char            *fromcode;
  83         void            *(*kiconv_open)(void);
  84         size_t          (*kiconv)(void *, char **, size_t *, char **, size_t *,
  85                         int *);
  86         int             (*kiconv_close)(void *);
  87         size_t          (*kiconvstr)(char *, size_t *, char *, size_t *, int,
  88                         int *);
  89 } kiconv_ops_t;
  90 
  91 typedef struct kiconv_mod_info {
  92         char            *module_name;
  93         size_t          kiconv_num_convs;
  94         kiconv_ops_t    *kiconv_ops_tbl;
  95         size_t          kiconv_num_aliases;
  96         char            **aliases;
  97         char            **canonicals;
  98         int             nowait;
  99 } kiconv_module_info_t;
 100 
 101 /* The kiconv code conversion descriptor data structure. */
 102 typedef struct {
 103         void            *handle;        /* Handle from the actual open(). */
 104         size_t          id;             /* Index to the conv_list[]. */
 105 } kiconv_data_t, *kiconv_t;
 106 
 107 /* Common conversion state data structure. */
 108 typedef struct {
 109         uint8_t         id;
 110         uint8_t         bom_processed;
 111 } kiconv_state_data_t, *kiconv_state_t;
 112 
 113 /* Common component types for possible code conversion mapping tables. */
 114 typedef struct {
 115         uchar_t         u8[3];
 116 } kiconv_to_utf8_tbl_comp_t;
 117 
 118 typedef struct {
 119         uint32_t        u8:24;
 120         uint32_t        sb:8;
 121 } kiconv_to_sb_tbl_comp_t;
 122 
 123 /*
 124  * The maximum name length for any given codeset or alias names; the following
 125  * should be plenty big enough.
 126  */
 127 #define KICONV_MAX_CODENAME_LEN         63
 128 
 129 /* The following characters do not exist in the normalized code names. */
 130 #define KICONV_SKIPPABLE_CHAR(c)        \
 131         ((c) == '-' || (c) == '_' || (c) == '.' || (c) == '@')
 132 
 133 /*
 134  * When we encounter non-identical characters, as like iconv(3C) we have,
 135  * map them into either one of the replacement characters based on what is
 136  * the current target tocde.
 137  *
 138  * The 0xefbfdb in UTF-8 is U+FFFD in Unicode scalar value.
 139  */
 140 #define KICONV_ASCII_REPLACEMENT_CHAR   ('?')
 141 #define KICONV_UTF8_REPLACEMENT_CHAR    (0xefbfbd)
 142 
 143 /* Numeric ids for kiconv modules. */
 144 #define KICONV_EMBEDDED                 (0)
 145 #define KICONV_MODULE_ID_JA             (1)
 146 #define KICONV_MODULE_ID_SC             (2)
 147 #define KICONV_MODULE_ID_KO             (3)
 148 #define KICONV_MODULE_ID_TC             (4)
 149 #define KICONV_MODULE_ID_EMEA           (5)
 150 
 151 #define KICONV_MAX_MODULE_ID            KICONV_MODULE_ID_EMEA
 152 
 153 /* Functions used in kiconv conversion and module management. */
 154 extern void     kiconv_init();
 155 extern int      kiconv_register_module(kiconv_module_info_t *);
 156 extern int      kiconv_unregister_module(kiconv_module_info_t *);
 157 extern size_t   kiconv_module_ref_count(size_t);
 158 
 159 #endif  /* _KERNEL */
 160 
 161 #ifdef __cplusplus
 162 }
 163 #endif
 164 
 165 #endif /* _SYS_KICONV_H */