- size_t i_len, o_len;
- ucs2_t *u;
- ucs2_t buffer[MAXPATHLEN +2];
- ucs2_t buffer2[MAXPATHLEN +2];
- int composition = 0;
-
- lazy_initialize_conv();
-
- /* convert from_set to UCS2 */
- if ((size_t)(-1) == ( o_len = pull_charset_flags( from_set, cap_charset, src, src_len,
- (char *) buffer, sizeof(buffer) -2, flags)) ) {
- LOG(log_error, logtype_default, "Conversion failed ( %s to CH_UCS2 )", charset_name(from_set));
- return (size_t) -1;
- }
-
- if ( o_len == 0)
- return o_len;
-
- /* Do pre/decomposition */
- if (CHECK_FLAGS(flags, CONV_PRECOMPOSE) ||
- ((!(charsets[to_set]) || !(charsets[to_set]->flags & CHARSET_DECOMPOSED)) &&
- (!(charsets[from_set]) || (charsets[from_set]->flags & CHARSET_DECOMPOSED))))
- composition = 1;
- if (CHECK_FLAGS(flags, CONV_DECOMPOSE) || (charsets[to_set] && charsets[to_set]->flags & CHARSET_DECOMPOSED) )
- composition = 2;
-
- i_len = sizeof(buffer2) -2;
- u = buffer2;
-
- switch (composition) {
- case 0:
- u = buffer;
- i_len = o_len;
- break;
- case 1:
- if ( (size_t)-1 == (i_len = precompose_w(buffer, o_len, u, &i_len)) )
- return (size_t)(-1);
- break;
- case 2:
- if ( (size_t)-1 == (i_len = decompose_w(buffer, o_len, u, &i_len)) )
- return (size_t)(-1);
- break;
- }
- /* null terminate */
- u[i_len] = 0;
- u[i_len +1] = 0;
-
- /* Do case conversions */
- if (CHECK_FLAGS(flags, CONV_TOUPPER)) {
- strupper_w(u);
- }
- if (CHECK_FLAGS(flags, CONV_TOLOWER)) {
- strlower_w(u);
- }
-
- /* Convert UCS2 to to_set */
- if ((size_t)(-1) == ( o_len = push_charset_flags( to_set, cap_charset, (char *)u, i_len, dest, dest_len, flags )) ) {
- LOG(log_error, logtype_default,
- "Conversion failed (CH_UCS2 to %s):%s", charset_name(to_set), strerror(errno));
- return (size_t) -1;
- }
- /* null terminate */
- dest[o_len] = 0;
- dest[o_len +1] = 0;
-
- return o_len;
+ size_t i_len, o_len;
+ ucs2_t *u;
+ ucs2_t buffer[MAXPATHLEN +2];
+ ucs2_t buffer2[MAXPATHLEN +2];
+
+ lazy_initialize_conv();
+
+ /* convert from_set to UCS2 */
+ if ((size_t)(-1) == ( o_len = pull_charset_flags( from_set, cap_charset, src, src_len,
+ (char *) buffer, sizeof(buffer) -2, flags)) ) {
+ LOG(log_error, logtype_default, "Conversion failed ( %s to CH_UCS2 )", charset_name(from_set));
+ return (size_t) -1;
+ }
+
+ if ( o_len == 0)
+ return o_len;
+
+ /* Do pre/decomposition */
+ i_len = sizeof(buffer2) -2;
+ u = buffer2;
+ if (CHECK_FLAGS(flags, CONV_DECOMPOSE) || (charsets[to_set] && (charsets[to_set]->flags & CHARSET_DECOMPOSED)) ) {
+ if ( (size_t)-1 == (i_len = decompose_w(buffer, o_len, u, &i_len)) )
+ return (size_t)(-1);
+ }
+ else if (CHECK_FLAGS(flags, CONV_PRECOMPOSE) || !charsets[from_set] || (charsets[from_set]->flags & CHARSET_DECOMPOSED)) {
+ if ( (size_t)-1 == (i_len = precompose_w(buffer, o_len, u, &i_len)) )
+ return (size_t)(-1);
+ }
+ else {
+ u = buffer;
+ i_len = o_len;
+ }
+ /* null terminate */
+ u[i_len] = 0;
+ u[i_len +1] = 0;
+
+ /* Do case conversions */
+ if (CHECK_FLAGS(flags, CONV_TOUPPER)) {
+ strupper_w(u);
+ }
+ else if (CHECK_FLAGS(flags, CONV_TOLOWER)) {
+ strlower_w(u);
+ }
+
+ /* Convert UCS2 to to_set */
+ if ((size_t)(-1) == ( o_len = push_charset_flags( to_set, cap_charset, (char *)u, i_len, dest, dest_len, flags )) ) {
+ LOG(log_error, logtype_default,
+ "Conversion failed (CH_UCS2 to %s):%s", charset_name(to_set), strerror(errno));
+ return (size_t) -1;
+ }
+ /* null terminate */
+ dest[o_len] = 0;
+ dest[o_len +1] = 0;
+
+ return o_len;