2001-09-07 18:14:57 +04:00
/*
2002-01-30 09:08:46 +03:00
Unix SMB / CIFS implementation .
2001-09-07 18:14:57 +04:00
charset defines
Copyright ( C ) Andrew Tridgell 2001
2003-04-16 17:09:00 +04:00
Copyright ( C ) Jelmer Vernooij 2002
2001-09-07 18:14:57 +04:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-09 23:25:36 +04:00
the Free Software Foundation ; either version 3 of the License , or
2001-09-07 18:14:57 +04:00
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
/* this defines the charset types used in samba */
2006-09-21 22:37:09 +04:00
typedef enum { CH_UTF16LE = 0 , CH_UTF16 = 0 , CH_UNIX = 1 , CH_DISPLAY = 2 , CH_DOS = 3 , CH_UTF8 = 4 , CH_UTF16BE = 5 } charset_t ;
2006-09-08 18:28:06 +04:00
2006-09-21 22:37:09 +04:00
# define NUM_CHARSETS 6
2003-04-16 17:09:00 +04:00
2003-07-22 18:43:05 +04:00
/*
* for each charset we have a function that pushes from that charset to a ucs2
* buffer , and a function that pulls from ucs2 buffer to that charset .
2003-04-16 17:09:00 +04:00
* */
struct charset_functions {
const char * name ;
2004-08-31 01:35:43 +04:00
size_t ( * pull ) ( void * , const char * * inbuf , size_t * inbytesleft ,
2003-04-16 17:09:00 +04:00
char * * outbuf , size_t * outbytesleft ) ;
2004-08-31 01:35:43 +04:00
size_t ( * push ) ( void * , const char * * inbuf , size_t * inbytesleft ,
2003-04-16 17:09:00 +04:00
char * * outbuf , size_t * outbytesleft ) ;
struct charset_functions * prev , * next ;
} ;
2003-08-28 21:16:27 +04:00
/*
* This is auxiliary struct used by source / script / gen - 8 - bit - gap . sh script
* during generation of an encoding table for charset module
* */
struct charset_gap_table {
uint16 start ;
uint16 end ;
int32 idx ;
} ;
/*
* Define stub for charset module which implements 8 - bit encoding with gaps .
* Encoding tables for such module should be produced from glibc ' s CHARMAPs
* using script source / script / gen - 8 bit - gap . sh
* CHARSETNAME is CAPITALIZED charset name
*
* */
# define SMB_GENERATE_CHARSET_MODULE_8_BIT_GAP(CHARSETNAME) \
2004-08-31 01:35:43 +04:00
static size_t CHARSETNAME # # _push ( void * cd , const char * * inbuf , size_t * inbytesleft , \
2003-08-28 21:16:27 +04:00
char * * outbuf , size_t * outbytesleft ) \
{ \
while ( * inbytesleft > = 2 & & * outbytesleft > = 1 ) { \
int i ; \
int done = 0 ; \
\
uint16 ch = SVAL ( * inbuf , 0 ) ; \
\
for ( i = 0 ; from_idx [ i ] . start ! = 0xffff ; i + + ) { \
if ( ( from_idx [ i ] . start < = ch ) & & ( from_idx [ i ] . end > = ch ) ) { \
( ( unsigned char * ) ( * outbuf ) ) [ 0 ] = from_ucs2 [ from_idx [ i ] . idx + ch ] ; \
( * inbytesleft ) - = 2 ; \
( * outbytesleft ) - = 1 ; \
( * inbuf ) + = 2 ; \
( * outbuf ) + = 1 ; \
done = 1 ; \
break ; \
} \
} \
if ( ! done ) { \
errno = EINVAL ; \
return - 1 ; \
} \
\
} \
\
if ( * inbytesleft = = 1 ) { \
errno = EINVAL ; \
return - 1 ; \
} \
\
if ( * inbytesleft > 1 ) { \
errno = E2BIG ; \
return - 1 ; \
} \
\
return 0 ; \
} \
\
2004-08-31 01:35:43 +04:00
static size_t CHARSETNAME # # _pull ( void * cd , const char * * inbuf , size_t * inbytesleft , \
2003-08-28 21:16:27 +04:00
char * * outbuf , size_t * outbytesleft ) \
{ \
while ( * inbytesleft > = 1 & & * outbytesleft > = 2 ) { \
* ( uint16 * ) ( * outbuf ) = to_ucs2 [ ( ( unsigned char * ) ( * inbuf ) ) [ 0 ] ] ; \
( * inbytesleft ) - = 1 ; \
( * outbytesleft ) - = 2 ; \
( * inbuf ) + = 1 ; \
( * outbuf ) + = 2 ; \
} \
\
if ( * inbytesleft > 0 ) { \
errno = E2BIG ; \
return - 1 ; \
} \
\
return 0 ; \
} \
\
struct charset_functions CHARSETNAME # # _functions = \
{ # CHARSETNAME , CHARSETNAME # # _pull , CHARSETNAME # # _push } ; \
\
2006-12-20 04:07:21 +03:00
NTSTATUS charset_ # # CHARSETNAME # # _init ( void ) ; \
2003-08-28 21:16:27 +04:00
NTSTATUS charset_ # # CHARSETNAME # # _init ( void ) \
{ \
return smb_register_charset ( & CHARSETNAME # # _functions ) ; \
} \