2 #ifndef _ATALK_UNICODE_H
3 #define _ATALK_UNICODE_H 1
7 #define ucs2_t u_int16_t
10 #define MIN(a,b) ((a)<(b)?(a):(b))
14 #define MAX(a,b) ((a)>(b)?(a):(b))
17 #define SAFE_FREE(x) do { if ((x) != NULL) {free(x); x=NULL;} } while(0)
20 #define EILSEQ 84 /* Illegal byte sequence. */
23 /* generic iconv conversion structure */
25 size_t (*direct)(void *cd, char **inbuf, size_t *inbytesleft,
26 char **outbuf, size_t *outbytesleft);
27 size_t (*pull)(void *cd, char **inbuf, size_t *inbytesleft,
28 char **outbuf, size_t *outbytesleft);
29 size_t (*push)(void *cd, char **inbuf, size_t *inbytesleft,
30 char **outbuf, size_t *outbytesleft);
31 void *cd_direct, *cd_pull, *cd_push;
32 char *from_name, *to_name;
35 #define CHARSET_CLIENT 1
36 #define CHARSET_VOLUME 2
37 #define CHARSET_PRECOMPOSED 4
38 #define CHARSET_DECOMPOSED 8
39 #define CHARSET_MULTIBYTE 16
40 #define CHARSET_WIDECHAR 32
41 #define CHARSET_ICONV 64
43 #define IGNORE_CHAR '_'
45 /* conversion flags */
46 #define CONV_IGNORE (1<<0) /* ignore EILSEQ, replace with IGNORE_CHAR */
47 #define CONV_ESCAPEHEX (1<<1) /* escape unconvertable chars with :[UCS2HEX] */
48 #define CONV_ESCAPEDOTS (1<<2) /* escape leading dots with :2600 */
49 #define CONV_UNESCAPEHEX (1<<3)
50 #define CONV_TOUPPER (1<<4) /* convert to UPPERcase */
51 #define CONV_TOLOWER (1<<5) /* convert to lowercase */
52 #define CONV_PRECOMPOSE (1<<6) /* precompose */
53 #define CONV_DECOMPOSE (1<<7) /* precompose */
55 /* conversion return flags */
56 #define CONV_REQMANGLE (1<<14) /* mangling of returned name is required */
57 #define CONV_REQESCAPE (1<<15) /* espace unconvertable chars with :[UCS2HEX] */
59 /* this defines the charset types used in samba */
60 typedef enum {CH_UCS2=0, CH_UTF8=1, CH_MAC=2, CH_UNIX=3, CH_UTF8_MAC=4} charset_t;
62 #define NUM_CHARSETS 5
65 * for each charset we have a function that pulls from that charset to
66 * a ucs2 buffer, and a function that pushes to a ucs2 buffer
69 struct charset_functions {
71 const long kTextEncoding;
72 size_t (*pull)(void *, char **inbuf, size_t *inbytesleft,
73 char **outbuf, size_t *outbytesleft);
74 size_t (*push)(void *, char **inbuf, size_t *inbytesleft,
75 char **outbuf, size_t *outbytesleft);
77 struct charset_functions *prev, *next;
81 extern atalk_iconv_t atalk_iconv_open __P((const char *, const char *));
82 extern size_t atalk_iconv __P((atalk_iconv_t, const char **, size_t *, char **, size_t *));
83 extern int atalk_iconv_close __P((atalk_iconv_t));
84 extern struct charset_functions *find_charset_functions(const char *name);
86 /* from util_unistr.c */
87 extern ucs2_t toupper_w __P((ucs2_t));
88 extern ucs2_t tolower_w __P((ucs2_t));
89 extern int strupper_w __P((ucs2_t *));
90 extern int strlower_w __P((ucs2_t *));
91 extern int islower_w __P((ucs2_t));
92 extern int islower_w __P((ucs2_t));
93 extern size_t strlen_w __P((const ucs2_t *));
94 extern size_t strnlen_w __P((const ucs2_t *, size_t));
95 extern ucs2_t* strchr_w __P((const ucs2_t *, ucs2_t));
96 extern int strcmp_w __P((const ucs2_t *, const ucs2_t *));
97 extern int strncmp_w __P((const ucs2_t *, const ucs2_t *, size_t));
98 extern int strcasecmp_w __P((const ucs2_t *, const ucs2_t *));
99 extern int strncasecmp_w __P((const ucs2_t *, const ucs2_t *, size_t));
100 extern ucs2_t *strcasestr_w __P((const ucs2_t *, const ucs2_t *));
101 extern ucs2_t *strndup_w __P((const ucs2_t *, size_t));
102 extern ucs2_t *strdup_w __P((const ucs2_t *));
103 extern ucs2_t *strncpy_w __P((ucs2_t *, const ucs2_t *, const size_t));
104 extern ucs2_t *strncat_w __P((ucs2_t *, const ucs2_t *, const size_t));
105 extern ucs2_t *strcat_w __P((ucs2_t *, const ucs2_t *));
106 extern size_t precompose_w __P((ucs2_t *, size_t, ucs2_t *,size_t *));
107 extern size_t decompose_w __P((ucs2_t *, size_t, ucs2_t *,size_t *));
108 extern size_t utf8_charlen __P(( char* ));
109 extern size_t utf8_strlen_validate __P(( char *));
112 extern void init_iconv __P((void));
113 extern size_t convert_string __P((charset_t, charset_t, void const *, size_t, void *, size_t));
114 extern size_t convert_string_allocate __P((charset_t, charset_t, void const *, size_t, char **));
115 extern size_t utf8_strupper __P((const char *, size_t, char *, size_t));
116 extern size_t utf8_strlower __P((const char *, size_t, char *, size_t));
117 extern size_t unix_strupper __P((const char *, size_t, char *, size_t));
118 extern size_t unix_strlower __P((const char *, size_t, char *, size_t));
119 extern size_t charset_strupper __P((charset_t, const char *, size_t, char *, size_t));
120 extern size_t charset_strlower __P((charset_t, const char *, size_t, char *, size_t));
122 extern size_t charset_to_ucs2_allocate __P((charset_t, ucs2_t **dest, const char *src));
123 extern size_t charset_to_utf8_allocate __P((charset_t, char **dest, const char *src));
124 extern size_t ucs2_to_charset_allocate __P((charset_t, char **dest, const ucs2_t *src));
125 extern size_t utf8_to_charset_allocate __P((charset_t, char **dest, const char *src));
126 extern size_t ucs2_to_charset __P((charset_t, const ucs2_t *src, char *dest, size_t));
128 extern size_t convert_charset __P((charset_t, charset_t, charset_t, char *, size_t, char *, size_t, u_int16_t *));
130 extern size_t charset_precompose __P(( charset_t, char *, size_t, char *, size_t));
131 extern size_t charset_decompose __P(( charset_t, char *, size_t, char *, size_t));
132 extern size_t utf8_precompose __P(( char *, size_t, char *, size_t));
133 extern size_t utf8_decompose __P(( char *, size_t, char *, size_t));
135 extern charset_t add_charset __P((char* name));