diff options
author | Jeff Layton <jlayton@redhat.com> | 2009-04-30 06:46:32 -0400 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2009-04-30 15:45:00 +0000 |
commit | 69f801fcaa03be83d58c564f00913b7c172808e4 (patch) | |
tree | 35e359acc85bef8669b001ccb412afb96d256a82 /fs/cifs/cifs_unicode.c | |
parent | 7fabf0c9479fef9fdb9528a5fbdb1cb744a744a4 (diff) | |
download | lwn-69f801fcaa03be83d58c564f00913b7c172808e4.tar.gz lwn-69f801fcaa03be83d58c564f00913b7c172808e4.zip |
cifs: add new function to get unicode string length in bytes
Working in units of words means we do a lot of unnecessary conversion back
and forth. Standardize on bytes instead since that's more useful for
allocating buffers and such. Also, remove hostlen_fromUCS since the new
function has a similar purpose.
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Acked-by: Suresh Jayaraman <sjayaraman@suse.de>
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs/cifs_unicode.c')
-rw-r--r-- | fs/cifs/cifs_unicode.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c index 8389f359b03d..614512573c67 100644 --- a/fs/cifs/cifs_unicode.c +++ b/fs/cifs/cifs_unicode.c @@ -26,6 +26,37 @@ #include "cifs_debug.h" /* + * cifs_ucs2_bytes - how long will a string be after conversion? + * @ucs - pointer to input string + * @maxbytes - don't go past this many bytes of input string + * @codepage - destination codepage + * + * Walk a ucs2le string and return the number of bytes that the string will + * be after being converted to the given charset, not including any null + * termination required. Don't walk past maxbytes in the source buffer. + */ +int +cifs_ucs2_bytes(const __le16 *from, int maxbytes, + const struct nls_table *codepage) +{ + int i; + int charlen, outlen = 0; + int maxwords = maxbytes / 2; + char tmp[NLS_MAX_CHARSET_SIZE]; + + for (i = 0; from[i] && i < maxwords; i++) { + charlen = codepage->uni2char(le16_to_cpu(from[i]), tmp, + NLS_MAX_CHARSET_SIZE); + if (charlen > 0) + outlen += charlen; + else + outlen++; + } + + return outlen; +} + +/* * cifs_mapchar - convert a little-endian char to proper char in codepage * @target - where converted character should be copied * @src_char - 2 byte little-endian source character |