home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / i18nv104.zip / SAMPLE / COLLATE / COLLATE.C < prev    next >
C/C++ Source or Header  |  1996-02-13  |  7KB  |  145 lines

  1. /*****************************************************************************/
  2. /***     Include files                                                     ***/
  3. /*****************************************************************************/
  4.  
  5. #include <stdio.h>                      /* Standard IO functions.            */
  6.  
  7. #include <wchar.h>                      /* I18N library header file.         */
  8. #include <locale.h>                     /* Locale definitions.               */
  9.  
  10. /*****************************************************************************/
  11. /***     Global defines                                                    ***/
  12. /*****************************************************************************/
  13.  
  14. #define E_ACCUTE 130                    /* Character for french e accute.    */
  15. #define O_CIRCUM 147                    /* Character for french o circumflex.*/
  16.  
  17. typedef char    a_string[200];          /* New type for 200 byte strings.    */
  18. typedef wchar_t w_string[100];          /* New type for 100 char wide strings*/
  19.  
  20. /*****************************************************************************/
  21. /***     Global variables                                                  ***/
  22. /*****************************************************************************/
  23.  
  24. a_string str_arr[4];                    /* An array of four strings.         */
  25. int loop1, loop2;                       /* Two general loop variables.       */
  26.  
  27. /*****************************************************************************/
  28. /***     Do collations on strings                                          ***/
  29. /*****************************************************************************/
  30.  
  31. void print_str_array(void);             /* Function prototype.               */
  32.  
  33.                                         /* This routine will sort culturally */
  34.                                         /*  four strings in the str_arr array*/
  35. void do_str_collate(void)
  36. {
  37.   a_string str_xfrm, str_swap;          /* Strings for strxfrm and swaps.    */
  38.   char *p;
  39.  
  40.                                         /* Create the four strings to sort.  */
  41.   sprintf(str_arr[0], "%c%c%c%c", 'c', O_CIRCUM, 't', 'e');
  42.   sprintf(str_arr[1], "%c%c%c%c", 'c', O_CIRCUM, 't', E_ACCUTE);
  43.   sprintf(str_arr[2], "%c%c%c%c", 'c', 'o', 't', E_ACCUTE);
  44.   sprintf(str_arr[3], "%c%c%c%c", 'c', 'o', 't', 'e');
  45.  
  46.                                         /* Print a header.                   */
  47.                                         /* Print out the initial array.      */
  48.   printf("\nFunctions with multibyte strings:\n");
  49.   printf("---------------------------------\n");
  50.   printf("Initial array: ");
  51.   print_str_array();
  52.  
  53.                                         /* Do a simple little bubble sort.   */
  54.                                         /* Loop through all elements...      */
  55.                                         /*  Loop through remaining unsorted  */
  56.                                         /*   elements...                     */
  57.                                         /*   If they are out of order...     */
  58.                                         /*    Swap them.                     */
  59.                                         /* Print out results after sort.     */
  60.   for (loop1 = 0; loop1 < 3; loop1++)
  61.   {
  62.       for (loop2 = 0; loop2 < (3 - loop1); loop2++)
  63.       {
  64.           if (strcoll(str_arr[loop2], str_arr[loop2 + 1]) > 0)
  65.           {
  66.              strcpy(str_swap, str_arr[loop2]);
  67.              strcpy(str_arr[loop2], str_arr[loop2 + 1]);
  68.              strcpy(str_arr[loop2 + 1], str_swap);
  69.           }
  70.       }
  71.   }
  72.   printf("After sorting: ");
  73.   print_str_array();
  74.  
  75.                                         /* Do a transform on one string.     */
  76.                                         /* Print results (collation weights
  77.                                          * are not printable as characters). */
  78.   strxfrm(str_xfrm, str_arr[3], 200);
  79.   printf("\nstrxfrm on string: '%s' is: 0x", str_arr[3]);
  80.   for (p = str_xfrm; *p; p++) {
  81.      printf("%02x", *p);
  82.   }
  83. }
  84.  
  85. void print_str_array(void)
  86. {
  87.                                         /* For all four array values...      */
  88.                                         /*  Print out the string.            */
  89.                                         /* Print out a newline when done.    */
  90.   for (loop1 = 0; loop1 < 4; loop1++)
  91.   {
  92.       printf("%s ", str_arr[loop1]);
  93.   }
  94.   printf("\n");
  95. }
  96.  
  97. /*****************************************************************************/
  98. /***     Do collations on wide strings                                     ***/
  99. /*****************************************************************************/
  100.  
  101. void do_wcs_collate(void)
  102. {
  103.   w_string w1, w2, wcs_xfrm;            /* Declare wide strings needed.      */
  104.   wchar_t *wp;
  105.  
  106.                                         /* Print a header.                   */
  107.   printf("\nFunctions with wide strings:\n");
  108.   printf("----------------------------\n");
  109.  
  110.                                         /* Copy values into two wide strings.*/
  111.                                         /* Print out values in strings.      */
  112.                                         /* Print out collation weight for the*/
  113.                                         /*  two strings.                     */
  114.   wcscpy(w1, L"hello");
  115.   wcscpy(w2, L"Hello");
  116.   printf("Two strings are: '%S' and '%S'\n", w1, w2);
  117.   printf("Collation on those two strings is: %d\n", wcscoll(w1, w2));
  118.  
  119.                                         /* Do a transform on one wide string.*/
  120.                                         /* Print results (collation weights
  121.                                          * are not printable as characters). */
  122.   wcsxfrm(wcs_xfrm, w1, 100);
  123.   printf("\nwcsxfrm on string: '%S' is: 0x", w1);
  124.   for (wp = wcs_xfrm; *wp; wp++) {
  125.      printf("%04x", *wp);
  126.   }
  127.   printf("\n");
  128. }
  129.  
  130. /*****************************************************************************/
  131. /***     Main program                                                      ***/
  132. /*****************************************************************************/
  133.  
  134. void main(void)
  135. {
  136.                                         /* Set the locale based on env var.  */
  137.                                         /* Print the locale value.           */
  138.   setlocale(LC_ALL, "");
  139.   printf("\nLocale setting: %s\n", setlocale(LC_COLLATE, NULL));
  140.  
  141.                                         /* Do collations.                    */
  142.   do_str_collate();
  143.   do_wcs_collate();
  144. }
  145.