2013-04-16 00:09:45 +04:00
# include <linux/ucs2_string.h>
# include <linux/module.h>
/* Return the number of unicode characters in data */
unsigned long
ucs2_strnlen ( const ucs2_char_t * s , size_t maxlength )
{
unsigned long length = 0 ;
while ( * s + + ! = 0 & & length < maxlength )
length + + ;
return length ;
}
EXPORT_SYMBOL ( ucs2_strnlen ) ;
unsigned long
ucs2_strlen ( const ucs2_char_t * s )
{
return ucs2_strnlen ( s , ~ 0UL ) ;
}
EXPORT_SYMBOL ( ucs2_strlen ) ;
/*
* Return the number of bytes is the length of this string
* Note : this is NOT the same as the number of unicode characters
*/
unsigned long
ucs2_strsize ( const ucs2_char_t * data , unsigned long maxlength )
{
return ucs2_strnlen ( data , maxlength / sizeof ( ucs2_char_t ) ) * sizeof ( ucs2_char_t ) ;
}
EXPORT_SYMBOL ( ucs2_strsize ) ;
int
ucs2_strncmp ( const ucs2_char_t * a , const ucs2_char_t * b , size_t len )
{
while ( 1 ) {
if ( len = = 0 )
return 0 ;
if ( * a < * b )
return - 1 ;
if ( * a > * b )
return 1 ;
if ( * a = = 0 ) /* implies *b == 0 */
return 0 ;
a + + ;
b + + ;
len - - ;
}
}
EXPORT_SYMBOL ( ucs2_strncmp ) ;
2016-02-08 22:48:11 +03:00
unsigned long
ucs2_utf8size ( const ucs2_char_t * src )
{
unsigned long i ;
unsigned long j = 0 ;
for ( i = 0 ; i < ucs2_strlen ( src ) ; i + + ) {
u16 c = src [ i ] ;
2016-02-13 02:13:33 +03:00
if ( c > = 0x800 )
2016-02-08 22:48:11 +03:00
j + = 3 ;
2016-02-13 02:13:33 +03:00
else if ( c > = 0x80 )
2016-02-08 22:48:11 +03:00
j + = 2 ;
else
j + = 1 ;
}
return j ;
}
EXPORT_SYMBOL ( ucs2_utf8size ) ;
/*
* copy at most maxlength bytes of whole utf8 characters to dest from the
* ucs2 string src .
*
* The return value is the number of characters copied , not including the
* final NUL character .
*/
unsigned long
ucs2_as_utf8 ( u8 * dest , const ucs2_char_t * src , unsigned long maxlength )
{
unsigned int i ;
unsigned long j = 0 ;
unsigned long limit = ucs2_strnlen ( src , maxlength ) ;
for ( i = 0 ; maxlength & & i < limit ; i + + ) {
u16 c = src [ i ] ;
2016-02-13 02:13:33 +03:00
if ( c > = 0x800 ) {
2016-02-08 22:48:11 +03:00
if ( maxlength < 3 )
break ;
maxlength - = 3 ;
dest [ j + + ] = 0xe0 | ( c & 0xf000 ) > > 12 ;
2016-02-13 02:13:33 +03:00
dest [ j + + ] = 0x80 | ( c & 0x0fc0 ) > > 6 ;
2016-02-08 22:48:11 +03:00
dest [ j + + ] = 0x80 | ( c & 0x003f ) ;
2016-02-13 02:13:33 +03:00
} else if ( c > = 0x80 ) {
2016-02-08 22:48:11 +03:00
if ( maxlength < 2 )
break ;
maxlength - = 2 ;
2016-02-13 02:13:33 +03:00
dest [ j + + ] = 0xc0 | ( c & 0x7c0 ) > > 6 ;
dest [ j + + ] = 0x80 | ( c & 0x03f ) ;
2016-02-08 22:48:11 +03:00
} else {
maxlength - = 1 ;
dest [ j + + ] = c & 0x7f ;
}
}
if ( maxlength )
dest [ j ] = ' \0 ' ;
return j ;
}
EXPORT_SYMBOL ( ucs2_as_utf8 ) ;