]> arthur.barton.de Git - netatalk.git/blob - include/atalk/unicode.h
big merge for db frontend and unicode.
[netatalk.git] / include / atalk / unicode.h
1
2 #ifndef _ATALK_UNICODE_H
3 #define _ATALK_UNICODE_H 1
4
5 #include <atalk/list.h>
6
7 #define ucs2_t  u_int16_t
8
9 /* generic iconv conversion structure */
10 typedef struct {
11         size_t (*direct)(void *cd, char **inbuf, size_t *inbytesleft,
12                          char **outbuf, size_t *outbytesleft);
13         size_t (*pull)(void *cd, char **inbuf, size_t *inbytesleft,
14                        char **outbuf, size_t *outbytesleft);
15         size_t (*push)(void *cd, char **inbuf, size_t *inbytesleft,
16                        char **outbuf, size_t *outbytesleft);
17         void *cd_direct, *cd_pull, *cd_push;
18         char *from_name, *to_name;
19 } *atalk_iconv_t;
20
21 #define CHARSET_CLIENT 1
22 #define CHARSET_VOLUME 2
23 #define CHARSET_PRECOMPOSED 4
24 #define CHARSET_DECOMPOSED  8
25 #define CHARSET_MULTIBYTE   16
26 #define CHARSET_WIDECHAR    32
27 #define CHARSET_ICONV       64
28
29 #define IGNORE_CHAR     '_'
30
31 /* conversion flags */
32 #define CONV_IGNORE             (1<<0) /* ignore EILSEQ, replace with IGNORE_CHAR */
33 #define CONV_ESCAPEHEX          (1<<1) /* escape unconvertable chars with :[UCS2HEX] */
34 #define CONV_ESCAPEDOTS         (1<<2) /* escape leading dots with :2600 */
35 #define CONV_UNESCAPEHEX        (1<<3) 
36 #define CONV_TOUPPER            (1<<4) /* convert to UPPERcase */
37 #define CONV_TOLOWER            (1<<5) /* convert to lowercase */
38 #define CONV_PRECOMPOSE         (1<<6) /* precompose */
39 #define CONV_DECOMPOSE          (1<<7) /* precompose */
40
41 /* conversion return flags */
42 #define CONV_REQMANGLE  (1<<14) /* mangling of returned name is required */
43 #define CONV_REQESCAPE  (1<<15) /* espace unconvertable chars with :[UCS2HEX] */
44
45 /* this defines the charset types used in samba */
46 typedef enum {CH_UCS2=0, CH_UTF8=1, CH_MAC=2, CH_UNIX=3, CH_UTF8_MAC=4} charset_t;
47
48 #define NUM_CHARSETS 5
49
50 /*
51  *   for each charset we have a function that pulls from that charset to
52  *     a ucs2 buffer, and a function that pushes to a ucs2 buffer
53  *     */
54
55 struct charset_functions {
56         const char *name;
57         const long kTextEncoding;
58         size_t (*pull)(void *, char **inbuf, size_t *inbytesleft,
59                                    char **outbuf, size_t *outbytesleft);
60         size_t (*push)(void *, char **inbuf, size_t *inbytesleft,
61                                    char **outbuf, size_t *outbytesleft);
62         u_int32_t flags;
63         struct charset_functions *prev, *next;
64 };
65
66
67 extern atalk_iconv_t    atalk_iconv_open __P((const char *, const char *));
68 extern size_t           atalk_iconv __P((atalk_iconv_t, const char **, size_t *, char **, size_t *));
69 extern size_t           atalk_iconv_ignore __P((atalk_iconv_t, const char **, size_t *, char **, size_t *, int*));
70 extern int              atalk_iconv_close __P((atalk_iconv_t));
71 extern struct charset_functions *find_charset_functions(const char *name);
72
73 extern ucs2_t   toupper_w  __P((ucs2_t));
74 extern ucs2_t   tolower_w  __P((ucs2_t));
75 extern int      strupper_w __P((ucs2_t *));
76 extern int      strlower_w __P((ucs2_t *));
77 extern int      islower_w  __P((ucs2_t));
78 extern int      islower_w  __P((ucs2_t));
79 extern size_t   strlen_w   __P((const ucs2_t *));
80 extern size_t   strnlen_w  __P((const ucs2_t *, size_t));
81 extern ucs2_t*  strchr_w   __P((const ucs2_t *, ucs2_t));
82 extern int      strcmp_w   __P((const ucs2_t *, const ucs2_t *));
83 extern int      strncmp_w  __P((const ucs2_t *, const ucs2_t *, size_t));
84 extern int      strcasecmp_w  __P((const ucs2_t *, const ucs2_t *));
85 extern int      strncasecmp_w __P((const ucs2_t *, const ucs2_t *, size_t));
86 extern ucs2_t   *strcasestr_w __P((const ucs2_t *, const ucs2_t *));
87 extern ucs2_t   *strndup_w __P((const ucs2_t *, size_t));
88 extern ucs2_t   *strdup_w  __P((const ucs2_t *));
89 extern ucs2_t   *strncpy_w __P((ucs2_t *, const ucs2_t *, const size_t));
90 extern ucs2_t   *strncat_w __P((ucs2_t *, const ucs2_t *, const size_t));
91 extern ucs2_t   *strcat_w  __P((ucs2_t *, const ucs2_t *));
92
93 extern size_t   precompose_w __P((ucs2_t *, size_t, ucs2_t *,size_t *));
94 extern size_t   decompose_w  __P((ucs2_t *, size_t, ucs2_t *,size_t *));
95 extern size_t   utf8_charlen __P(( char* ));
96 extern size_t   utf8_strlen_validate __P(( char *));
97
98 extern void     init_iconv __P((void));
99 extern size_t   convert_string __P((charset_t, charset_t, void const *, size_t, void *, size_t));
100 extern size_t   convert_string_allocate __P((charset_t, charset_t, void const *, size_t, void **));
101
102 extern size_t   utf8_strupper __P((const char *, size_t, char *, size_t));
103 extern size_t   utf8_strlower __P((const char *, size_t, char *, size_t));
104 extern size_t    mac_strupper __P((const char *, size_t, char *, size_t));
105 extern size_t    mac_strlower __P((const char *, size_t, char *, size_t));
106 extern size_t   unix_strupper __P((const char *, size_t, char *, size_t));
107 extern size_t   unix_strlower __P((const char *, size_t, char *, size_t));
108 extern size_t   charset_strupper __P((charset_t, const char *, size_t, char *, size_t));
109 extern size_t   charset_strlower __P((charset_t, const char *, size_t, char *, size_t));
110
111 extern size_t   mac_to_ucs2_allocate __P((ucs2_t **dest, const char *src));
112 extern size_t   mac_to_utf8_allocate __P((char **dest, const char *src));
113 extern size_t   ucs2_to_mac_allocate __P((char **dest, const ucs2_t *src));
114 extern size_t   utf8_to_mac_allocate __P((void **dest, const char *src));
115
116 extern size_t   utf8_to_mac __P((char *, size_t, char *, size_t));
117 extern size_t   utf8_to_mac_charset __P((charset_t, char *, size_t, char *, size_t, int*));
118 extern size_t   vol_to_mac_charset __P((charset_t, charset_t, char *, size_t, char *, size_t, int*));
119 extern size_t   mac_to_vol_charset __P((charset_t, charset_t, char *, size_t, char *, size_t));
120 extern size_t   convert_charset __P((charset_t, charset_t, char *, size_t, char *, size_t, u_int16_t *));
121
122 extern size_t   encode_cap __P((charset_t, char*, size_t, char*, size_t));
123 extern size_t   decode_cap __P((charset_t, char*, size_t, char*, size_t, u_int16_t *));
124
125 extern size_t   utf8_precompose __P(( char *, size_t, char *, size_t));
126 extern size_t   utf8_decompose  __P(( char *, size_t, char *, size_t));
127
128 extern charset_t add_charset __P((char* name));
129
130
131 #define SAFE_FREE(x) do { if ((x) != NULL) {free(x); x=NULL;} } while(0)
132
133 #endif