X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=libraries%2Flibldap%2Futf-8-conv.c;h=63430a88128114654740bd26cf844e063c5616d1;hb=1d841e47c877842433dc11aaec9da36191fed960;hp=146e906781315030a01a3a0e5edc8bd01123cd88;hpb=6abba139bb64df9ed5b762c29ce29acd051f57cd;p=openldap diff --git a/libraries/libldap/utf-8-conv.c b/libraries/libldap/utf-8-conv.c index 146e906781..63430a8812 100644 --- a/libraries/libldap/utf-8-conv.c +++ b/libraries/libldap/utf-8-conv.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2004 The OpenLDAP Foundation. + * Copyright 1998-2008 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -79,8 +79,8 @@ ASCII chars 7 bits Unicode address space (0 - 0x10FFFF) 21 bits ISO-10646 address space (0 - 0x7FFFFFFF) 31 bits -Note: This code does not prevent UTF-8 sequences which are longer than - necessary from being decoded. +Note: This code does not prevent UTF-8 sequences which are longer than + necessary from being decoded. */ /*----------------------------------------------------------------------------- @@ -93,31 +93,25 @@ ldap_x_utf8_to_wc ( wchar_t *wchar, const char *utf8char ) int utflen, i; wchar_t ch; - /* If input ptr is NULL, treat it as empty string. */ - if (utf8char == NULL) - utf8char = ""; + if (utf8char == NULL) return -1; /* Get UTF-8 sequence length from 1st byte */ utflen = LDAP_UTF8_CHARLEN2(utf8char, utflen); - if( utflen==0 || utflen > (int)LDAP_MAX_UTF8_LEN ) - return -1; /* Invalid input */ + if( utflen==0 || utflen > (int)LDAP_MAX_UTF8_LEN ) return -1; /* First byte minus length tag */ ch = (wchar_t)(utf8char[0] & mask[utflen]); - for(i=1; i < utflen; i++) - { + for(i=1; i < utflen; i++) { /* Subsequent bytes must start with 10 */ - if ((utf8char[i] & 0xc0) != 0x80) - return -1; + if ((utf8char[i] & 0xc0) != 0x80) return -1; ch <<= 6; /* 6 bits of data in each subsequent byte */ ch |= (wchar_t)(utf8char[i] & 0x3f); } - if (wchar) - *wchar = ch; + if (wchar) *wchar = ch; return utflen; } @@ -135,42 +129,39 @@ ldap_x_utf8s_to_wcs ( wchar_t *wcstr, const char *utf8str, size_t count ) wchar_t ch; - /* If input ptr is NULL, treat it as empty string. */ - if (utf8str == NULL) - utf8str = ""; + /* If input ptr is NULL or empty... */ + if (utf8str == NULL || !*utf8str) { + if ( wcstr ) + *wcstr = 0; + return 0; + } /* Examine next UTF-8 character. If output buffer is NULL, ignore count */ - while ( *utf8str && (wcstr==NULL || wclen (int)LDAP_MAX_UTF8_LEN ) - return -1; /* Invalid input */ + if( utflen==0 || utflen > (int)LDAP_MAX_UTF8_LEN ) return -1; /* First byte minus length tag */ ch = (wchar_t)(utf8str[0] & mask[utflen]); - for(i=1; i < utflen; i++) - { + for(i=1; i < utflen; i++) { /* Subsequent bytes must start with 10 */ - if ((utf8str[i] & 0xc0) != 0x80) - return -1; + if ((utf8str[i] & 0xc0) != 0x80) return -1; ch <<= 6; /* 6 bits of data in each subsequent byte */ ch |= (wchar_t)(utf8str[i] & 0x3f); } - if (wcstr) - wcstr[wclen] = ch; + if (wcstr) wcstr[wclen] = ch; - utf8str += utflen; /* Move to next UTF-8 character */ - wclen++; /* Count number of wide chars stored/required */ + utf8str += utflen; /* Move to next UTF-8 character */ + wclen++; /* Count number of wide chars stored/required */ } /* Add null terminator if there's room in the buffer. */ - if (wcstr && wclen < count) - wcstr[wclen] = 0; + if (wcstr && wclen < count) wcstr[wclen] = 0; return wclen; }