port latest changes from SAMBA_3_0 tree
[ira/wip.git] / source3 / lib / charcnv.c
index 4e9c2c15923fa406af22a75b41fe4b6da993702c..ca5e378970cb59d7dc8a45e70c435f58bad211ed 100644 (file)
@@ -190,8 +190,8 @@ size_t convert_string(charset_t from, charset_t to,
                                break;
                        case E2BIG:
                                reason="No more room"; 
-                               DEBUG(0, ("convert_string: Required %d, available %d\n",
-                                       srclen, destlen));
+                               DEBUG(0, ("convert_string: Required %lu, available %lu\n",
+                                       (unsigned long)srclen, (unsigned long)destlen));
                                /* we are not sure we need srclen bytes,
                                  may be more, may be less.
                                  We only know we need more than destlen
@@ -319,8 +319,7 @@ size_t unix_strupper(const char *src, size_t srclen, char *dest, size_t destlen)
        size_t size;
        smb_ucs2_t *buffer;
        
-       size = convert_string_allocate(CH_UNIX, CH_UCS2, src, srclen,
-                                      (void **) &buffer);
+       size = push_ucs2_allocate(&buffer, src);
        if (size == -1) {
                smb_panic("failed to create UCS2 buffer");
        }
@@ -334,6 +333,33 @@ size_t unix_strupper(const char *src, size_t srclen, char *dest, size_t destlen)
        return size;
 }
 
+/**
+ strdup() a unix string to upper case.
+**/
+
+char *strdup_upper(const char *s)
+{
+       size_t size;
+       smb_ucs2_t *buffer;
+       char *out_buffer;
+       
+       size = push_ucs2_allocate(&buffer, s);
+       if (size == -1) {
+               return NULL;
+       }
+
+       strupper_w(buffer);
+       
+       size = pull_ucs2_allocate(&out_buffer, buffer);
+       SAFE_FREE(buffer);
+
+       if (size == -1) {
+               return NULL;
+       }
+       
+       return out_buffer;
+}
+
 size_t unix_strlower(const char *src, size_t srclen, char *dest, size_t destlen)
 {
        size_t size;
@@ -353,6 +379,32 @@ size_t unix_strlower(const char *src, size_t srclen, char *dest, size_t destlen)
        return size;
 }
 
+/**
+ strdup() a unix string to lower case.
+**/
+
+char *strdup_lower(const char *s)
+{
+       size_t size;
+       smb_ucs2_t *buffer;
+       char *out_buffer;
+       
+       size = push_ucs2_allocate(&buffer, s);
+       if (size == -1) {
+               return NULL;
+       }
+
+       strlower_w(buffer);
+       
+       size = pull_ucs2_allocate(&out_buffer, buffer);
+       SAFE_FREE(buffer);
+
+       if (size == -1) {
+               return NULL;
+       }
+       
+       return out_buffer;
+}
 
 static size_t ucs2_align(const void *base_ptr, const void *p, int flags)
 {
@@ -480,18 +532,11 @@ size_t push_ucs2(const void *base_ptr, void *dest, const char *src, size_t dest_
 {
        size_t len=0;
        size_t src_len = strlen(src);
-       pstring tmpbuf;
 
        /* treat a pstring as "unlimited" length */
        if (dest_len == (size_t)-1)
                dest_len = sizeof(pstring);
 
-       if (flags & STR_UPPER) {
-               pstrcpy(tmpbuf, src);
-               strupper_m(tmpbuf);
-               src = tmpbuf;
-       }
-
        if (flags & STR_TERMINATE)
                src_len++;
 
@@ -506,6 +551,18 @@ size_t push_ucs2(const void *base_ptr, void *dest, const char *src, size_t dest_
        dest_len &= ~1;
 
        len += convert_string(CH_UNIX, CH_UCS2, src, src_len, dest, dest_len);
+
+       if (flags & STR_UPPER) {
+               smb_ucs2_t *dest_ucs2 = dest;
+               size_t i;
+               for (i = 0; i < (dest_len / 2) && dest_ucs2[i]; i++) {
+                       smb_ucs2_t v = toupper_w(dest_ucs2[i]);
+                       if (v != dest_ucs2[i]) {
+                               dest_ucs2[i] = v;
+                       }
+               }
+       }
+
        return len;
 }
 
@@ -809,44 +866,3 @@ size_t align_string(const void *base_ptr, const char *p, int flags)
        return 0;
 }
 
-/**
- Convert from unix to ucs2 charset and return the
- allocated and converted string or NULL if an error occurred.
- You must provide a zero terminated string.
- The returning string will be zero terminated.
-**/
-
-smb_ucs2_t *acnv_uxu2(const char *src)
-{
-       size_t slen;
-       size_t dlen;
-       void *dest;
-       
-       slen = strlen(src) + 1;
-       dlen = convert_string_allocate(CH_UNIX, CH_UCS2, src, slen, &dest);
-       if (dlen == (size_t)-1)
-               return NULL;
-       else
-               return dest;
-}
-
-/**
- Convert from dos to ucs2 charset and return the
- allocated and converted string or NULL if an error occurred.
- You must provide a zero terminated string.
- The returning string will be zero terminated.
-**/
-
-smb_ucs2_t *acnv_dosu2(const char *src)
-{
-       size_t slen;
-       size_t dlen;
-       void *dest;
-       
-       slen = strlen(src) + 1;
-       dlen = convert_string_allocate(CH_DOS, CH_UCS2, src, slen, &dest);
-       if (dlen == (size_t)-1)
-               return NULL;
-       else
-               return dest;
-}