unnecessary comments and print statements removed
[pazpar2-moved-to-github.git] / src / icu_bug_2.c
index dbba9b9..d283d9d 100644 (file)
@@ -1,8 +1,8 @@
 // Make command on debian 64 bit testing dist  
 /*
-gcc -g -Wall `icu-config --cppflags`  `icu-config --ldflags` -o icu_bug icu_bug.c
+gcc -g -Wall `icu-config --cppflags`  `icu-config --ldflags` -o icu_bug_2 icu_bug_2.c
 snatched from http://www.icu-project.org/userguide/Collate_API.html 
-and corrected for compile errors
+and changed.
 added a struct icu_termmap such that I actually can see the output
 */
 
@@ -24,9 +24,6 @@ added a struct icu_termmap such that I actually can see the output
 
 
 #define MAX_KEY_SIZE 256
-//#define MAX_BUFFER_SIZE 10000
-//#define MAX_LIST_LENGTH 5
 
 struct icu_buf_utf16
 {
@@ -47,6 +44,7 @@ struct icu_buf_utf16 * icu_buf_utf16_create(size_t capacity)
 
   if (capacity > 0){
     buf16->utf16 = (UChar *) malloc(sizeof(UChar) * capacity);
+    buf16->utf16[0] = (UChar) 0;
     buf16->utf16_cap = capacity;
   }
   return buf16;
@@ -56,7 +54,6 @@ struct icu_buf_utf16 * icu_buf_utf16_create(size_t capacity)
 struct icu_buf_utf16 * icu_buf_utf16_resize(struct icu_buf_utf16 * buf16,
                                             size_t capacity)
 {
-  printf("buf16 resize: %d\n", (int)capacity);
   if (buf16){
     if (capacity >  0){
       if (0 == buf16->utf16)
@@ -64,6 +61,7 @@ struct icu_buf_utf16 * icu_buf_utf16_resize(struct icu_buf_utf16 * buf16,
       else
         buf16->utf16 
           = (UChar *) realloc(buf16->utf16, sizeof(UChar) * capacity);
+      buf16->utf16[0] = (UChar) 0;
       buf16->utf16_len = 0;
       buf16->utf16_cap = capacity;
     } 
@@ -111,6 +109,7 @@ struct icu_buf_utf8 * icu_buf_utf8_create(size_t capacity)
 
   if (capacity > 0){
     buf8->utf8 = (uint8_t *) malloc(sizeof(uint8_t) * capacity);
+    buf8->utf8[0] = (uint8_t) 0;
     buf8->utf8_cap = capacity;
   }
   return buf8;
@@ -121,7 +120,6 @@ struct icu_buf_utf8 * icu_buf_utf8_create(size_t capacity)
 struct icu_buf_utf8 * icu_buf_utf8_resize(struct icu_buf_utf8 * buf8,
                                           size_t capacity)
 {
-  printf("buf8  resize: %d\n", (int)capacity);
   if (buf8){
     if (capacity >  0){
       if (0 == buf8->utf8)
@@ -129,6 +127,7 @@ struct icu_buf_utf8 * icu_buf_utf8_resize(struct icu_buf_utf8 * buf8,
       else
         buf8->utf8 
           = (uint8_t *) realloc(buf8->utf8, sizeof(uint8_t) * capacity);
+      buf8->utf8[0] = (uint8_t) 0;
       buf8->utf8_len = 0;
       buf8->utf8_cap = capacity;
     } 
@@ -161,14 +160,14 @@ UErrorCode icu_utf16_from_utf8(struct icu_buf_utf16 * dest16,
                                struct icu_buf_utf8 * src8,
                                UErrorCode * status)
 {
-  if(!U_SUCCESS(*status))
-    return *status;
+  printf("icu_utf16_from_utf8 - needs correcting, see icu_utf16_from_utf8_cstr\n");
 
   u_strFromUTF8(dest16->utf16, dest16->utf16_cap, &(dest16->utf16_len),
                 (const char *) src8->utf8, src8->utf8_len, status);
 
   // check for buffer overflow, resize and retry
   if (dest16->utf16_len > dest16->utf16_cap){
+    printf("icu_utf16_from_utf8 need resize\n");
     icu_buf_utf16_resize(dest16, dest16->utf16_len * 2);
     *status = U_ZERO_ERROR;
     u_strFromUTF8(dest16->utf16, dest16->utf16_cap, &(dest16->utf16_len),
@@ -185,22 +184,34 @@ UErrorCode icu_utf16_from_utf8_cstr(struct icu_buf_utf16 * dest16,
                                     UErrorCode * status)
 {
   size_t src8cstr_len = 0;
-  
-  if(!U_SUCCESS(status))
-    return *status;
-  
+  int32_t utf16_len = 0;
+
   src8cstr_len = strlen(src8cstr);
   
-  u_strFromUTF8(dest16->utf16, dest16->utf16_cap, &(dest16->utf16_len),
+  u_strFromUTF8(dest16->utf16, dest16->utf16_cap,
+                &utf16_len,
+                //&(dest16->utf16_len),
                 src8cstr, src8cstr_len, status);
   
   // check for buffer overflow, resize and retry
-  if (dest16->utf16_len > dest16->utf16_cap){
-    icu_buf_utf16_resize(dest16, dest16->utf16_len * 2);
+  if (*status == U_BUFFER_OVERFLOW_ERROR
+      //|| dest16->utf16_len > dest16->utf16_cap
+      ){
+    icu_buf_utf16_resize(dest16, utf16_len * 2);
     *status = U_ZERO_ERROR;
-    u_strFromUTF8(dest16->utf16, dest16->utf16_cap, &(dest16->utf16_len),
+    u_strFromUTF8(dest16->utf16, dest16->utf16_cap,
+                  &utf16_len,
+                  //&(dest16->utf16_len),
                   src8cstr, src8cstr_len, status);
   }
+
+  if (*status != U_BUFFER_OVERFLOW_ERROR
+      && utf16_len < dest16->utf16_cap)
+    dest16->utf16_len = utf16_len;
+  else {
+    dest16->utf16[0] = (UChar) 0;
+    dest16->utf16_len = 0;
+  }
   
   return *status;
 };
@@ -213,19 +224,20 @@ UErrorCode icu_sortkey8_from_utf16(UCollator *coll,
 { 
   
   int32_t sortkey_len = 0;
-  if(!U_SUCCESS(status))
-    return *status;
-  
+
   sortkey_len = ucol_getSortKey(coll, src16->utf16, src16->utf16_len,
-                                dest8->utf8, dest8->utf8_len);
-  
+                                dest8->utf8, dest8->utf8_cap);
+
   // check for buffer overflow, resize and retry
   if (sortkey_len > dest8->utf8_cap) {
     icu_buf_utf8_resize(dest8, sortkey_len * 2);
-    ucol_getSortKey(coll, src16->utf16, src16->utf16_len,
-                    dest8->utf8, dest8->utf8_len);
+    sortkey_len = ucol_getSortKey(coll, src16->utf16, src16->utf16_len,
+                                  dest8->utf8, dest8->utf8_cap);
   }
 
+  if (sortkey_len > 0)
+    dest8->utf8_len = sortkey_len;
   return *status;
 };
 
@@ -299,6 +311,8 @@ int icu_coll_sort(const char * locale, int src_list_len,
     
       // assigning sortkeys
       memcpy(list[i]->sort_key, buf8->utf8, buf8->utf8_len);    
+      //strncpy(list[i]->sort_key, buf8->utf8, buf8->utf8_len);    
+      //strcpy((char *) list[i]->sort_key, (const char *) buf8->utf8);
     } 
 
   printf("\n"); 
@@ -316,6 +330,7 @@ int icu_coll_sort(const char * locale, int src_list_len,
   printf("ICU sort:  '%s' : ", locale); 
   for (i = 0; i < src_list_len; i++) {
     printf(" '%s'", list[i]->disp_term); 
+    //printf("(%d|%d)", list[i]->sort_key[0],list[i]->sort_key[1]); 
   }
   printf("\n");