]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/unicode/charcnv.c
remove a 'discard const ...' warning in papd cups
[netatalk.git] / libatalk / unicode / charcnv.c
index d592f9eb3ef838b285a46cb111d2f776c191fdfe..9e4ec67acfcd8bfd04b2d98ff8ca3e1ed3415afc 100644 (file)
@@ -191,7 +191,7 @@ static void lazy_initialize_conv(void)
     }
 }
 
-charset_t add_charset(char* name)
+charset_t add_charset(const char* name)
 {
     static charset_t max_charset_t = NUM_CHARSETS-1;
     charset_t cur_charset_t = max_charset_t+1;
@@ -367,42 +367,29 @@ size_t convert_string(charset_t from, charset_t to,
     ucs2_t *u;
     ucs2_t buffer[MAXPATHLEN];
     ucs2_t buffer2[MAXPATHLEN];
-    int composition = 0;
-
-    lazy_initialize_conv();
 
     /* convert from_set to UCS2 */
-    if ((size_t)(-1) == ( o_len = convert_string_internal( from, CH_UCS2, src, srclen,
+    if ((size_t)-1 == ( o_len = convert_string_internal( from, CH_UCS2, src, srclen,
                                                            (char*) buffer, sizeof(buffer))) ) {
         LOG(log_error, logtype_default, "Conversion failed ( %s to CH_UCS2 )", charset_name(from));
         return (size_t) -1;
     }
 
     /* Do pre/decomposition */
-    if ( ((!(charsets[to])   || !(charsets[to]->flags & CHARSET_DECOMPOSED)) &&
-          (!(charsets[from]) || (charsets[from]->flags & CHARSET_DECOMPOSED))))
-        composition = 1;
-    if ((charsets[to] && charsets[to]->flags & CHARSET_DECOMPOSED) )
-        composition = 2;
-
     i_len = sizeof(buffer2);
     u = buffer2;
-
-    switch (composition) {
-    case 0:
+    if (charsets[to] && (charsets[to]->flags & CHARSET_DECOMPOSED) ) {
+        if ( (size_t)-1 == (i_len = decompose_w(buffer, o_len, u, &i_len)) )
+            return (size_t)-1;
+    }
+    else if (!charsets[from] || (charsets[from]->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;
-        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;
     }
-
     /* Convert UCS2 to to_set */
     if ((size_t)(-1) == ( o_len = convert_string_internal( CH_UCS2, to, (char*) u, i_len, dest, destlen)) ) {
         LOG(log_error, logtype_default, "Conversion failed (CH_UCS2 to %s):%s", charset_name(to), strerror(errno));
@@ -517,9 +504,6 @@ size_t convert_string_allocate(charset_t from, charset_t to,
     ucs2_t *u;
     ucs2_t buffer[MAXPATHLEN];
     ucs2_t buffer2[MAXPATHLEN];
-    int composition = 0;
-
-    lazy_initialize_conv();
 
     *dest = NULL;
 
@@ -531,32 +515,23 @@ size_t convert_string_allocate(charset_t from, charset_t to,
     }
 
     /* Do pre/decomposition */
-    if ( ((!(charsets[to])   || !(charsets[to]->flags & CHARSET_DECOMPOSED)) &&
-          (!(charsets[from]) || (charsets[from]->flags & CHARSET_DECOMPOSED))))
-        composition = 1;
-    if ((charsets[to] && charsets[to]->flags & CHARSET_DECOMPOSED) )
-        composition = 2;
-
     i_len = sizeof(buffer2);
     u = buffer2;
-
-    switch (composition) {
-    case 0:
+    if (charsets[to] && (charsets[to]->flags & CHARSET_DECOMPOSED) ) {
+        if ( (size_t)-1 == (i_len = decompose_w(buffer, o_len, u, &i_len)) )
+            return (size_t)-1;
+    }
+    else if ( !charsets[from] || (charsets[from]->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;
-        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;
     }
 
     /* Convert UCS2 to to_set */
-    if ((size_t)(-1) == ( o_len = convert_string_allocate_internal( CH_UCS2, to, (char*)u, i_len, dest)) )
+    if ((size_t)-1 == ( o_len = convert_string_allocate_internal( CH_UCS2, to, (char*)u, i_len, dest)) )
         LOG(log_error, logtype_default, "Conversion failed (CH_UCS2 to %s):%s", charset_name(to), strerror(errno));
 
     return o_len;
@@ -806,8 +781,6 @@ static size_t pull_charset_flags (charset_t from_set, charset_t cap_set, const c
     if (srclen == (size_t)-1)
         srclen = strlen(src) + 1;
 
-    lazy_initialize_conv();
-
     descriptor = conv_handles[from_set][CH_UCS2];
     descriptor_cap = conv_handles[cap_set][CH_UCS2];
 
@@ -916,8 +889,7 @@ static size_t push_charset_flags (charset_t to_set, charset_t cap_set, char* src
     char* outbuf = (char*)dest;
     atalk_iconv_t descriptor;
     atalk_iconv_t descriptor_cap;
-
-    lazy_initialize_conv();
+    char escch;
 
     descriptor = conv_handles[CH_UCS2][to_set];
     descriptor_cap = conv_handles[CH_UCS2][cap_set];
@@ -949,13 +921,21 @@ static size_t push_charset_flags (charset_t to_set, charset_t cap_set, char* src
         if ((option & CONV_ESCAPEHEX)) {
             for (i = 0; i < i_len; i += 2) {
                 ucs2_t c = SVAL(inbuf, i);
-                if (c == 0x002f) { /* 0x002f = / */
+                switch (c) {
+                case 0x003a: /* 0x003a = ':' */
+                    if ( ! (option & CONV_ALLOW_COLON)) {
+                        errno = EILSEQ;
+                        goto end;
+                    }
+                    escch = c;
+                    j = i_len - i;
+                    i_len = i;
+                    break;
+                case 0x002f: /* 0x002f = '/' */
+                    escch = c;
                     j = i_len - i;
                     i_len = i;
                     break;
-                } else if (c == 0x003a) { /* 0x003a = : */
-                    errno = EILSEQ;
-                    goto end;
                 }
             }
         }
@@ -1014,9 +994,27 @@ static size_t push_charset_flags (charset_t to_set, charset_t cap_set, char* src
                 errno = E2BIG;
                 goto end;
             }
-            *outbuf++ = ':';
-            *outbuf++ = '2';
-            *outbuf++ = 'f';
+            switch (escch) {
+            case '/':
+                *outbuf++ = ':';
+                *outbuf++ = '2';
+                *outbuf++ = 'f';
+                break;
+            case ':':
+                *outbuf++ = ':';
+                *outbuf++ = '3';
+                *outbuf++ = 'a';
+                break;
+            default:
+                /*
+                 *  THIS SHOULD NEVER BE REACHED !!!
+                 *  As a safety net I put in a ' ' here
+                 */
+                *outbuf++ = ':';
+                *outbuf++ = '2';
+                *outbuf++ = '0';
+                break;
+            }
             o_len -= 3;
             inbuf += 2;
             i_len -= 2;
@@ -1037,7 +1035,6 @@ size_t convert_charset ( charset_t from_set, charset_t to_set, charset_t cap_cha
     ucs2_t *u;
     ucs2_t buffer[MAXPATHLEN +2];
     ucs2_t buffer2[MAXPATHLEN +2];
-    int composition = 0;
 
     lazy_initialize_conv();
 
@@ -1052,29 +1049,19 @@ size_t convert_charset ( charset_t from_set, charset_t to_set, charset_t cap_cha
         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 (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);
-        break;
+    }
+    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;
@@ -1084,7 +1071,7 @@ size_t convert_charset ( charset_t from_set, charset_t to_set, charset_t cap_cha
     if (CHECK_FLAGS(flags, CONV_TOUPPER)) {
         strupper_w(u);
     }
-    if (CHECK_FLAGS(flags, CONV_TOLOWER)) {
+    else if (CHECK_FLAGS(flags, CONV_TOLOWER)) {
         strlower_w(u);
     }