This source file includes following definitions.
- test_u32_grapheme_prev
 
- main
 
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 #include <config.h>
  20 
  21 
  22 #include <unigbrk.h>
  23 
  24 #include <stdio.h>
  25 #include <stdarg.h>
  26 #include <stdlib.h>
  27 
  28 #include "macros.h"
  29 
  30 static void
  31 test_u32_grapheme_prev (size_t len, ...)
     
  32 {
  33   const uint32_t *prev;
  34   const uint32_t *end;
  35   uint32_t s[16];
  36   va_list args;
  37   size_t n;
  38 
  39   va_start (args, len);
  40   n = 0;
  41   for (;;)
  42     {
  43       int unit = va_arg (args, int);
  44       if (unit == -1)
  45         break;
  46       else if (n >= sizeof s / sizeof *s)
  47         abort ();
  48 
  49       s[n++] = unit;
  50     }
  51   va_end (args);
  52 
  53   end = s + n;
  54   prev = u32_grapheme_prev (end, s);
  55   if (prev != end - len)
  56     {
  57       size_t i;
  58 
  59       if (prev == NULL)
  60         fputs ("u32_grapheme_prev returned NULL", stderr);
  61       else
  62         fprintf (stderr, "u32_grapheme_prev skipped %zu units", end - prev);
  63       fprintf (stderr, ", expected %zu:\n", len);
  64       for (i = 0; i < n; i++)
  65         fprintf (stderr, " %04x", s[i]);
  66       putc ('\n', stderr);
  67       abort ();
  68     }
  69 }
  70 
  71 int
  72 main (void)
     
  73 {
  74   static const uint32_t s[] = { 'a', 'b', 'c' };
  75 
  76   
  77   ASSERT (u32_grapheme_prev (NULL, NULL) == NULL);
  78   ASSERT (u32_grapheme_prev (s, s) == NULL);
  79 
  80   
  81   test_u32_grapheme_prev (1, 'a', -1);
  82   test_u32_grapheme_prev (1, 'a', 'b', -1);
  83   test_u32_grapheme_prev (1, 'a', 'b', 'c', -1);
  84 
  85   
  86 #define HIRAGANA_A 0x3042       
  87   test_u32_grapheme_prev (1, HIRAGANA_A, -1);
  88   test_u32_grapheme_prev (1, HIRAGANA_A, 'x', -1);
  89   test_u32_grapheme_prev (1, HIRAGANA_A, HIRAGANA_A, -1);
  90 
  91   
  92 #define GRAVE 0x0300            
  93 #define ACUTE 0x0301            
  94   test_u32_grapheme_prev (2, 'e', ACUTE, -1);
  95   test_u32_grapheme_prev (3, 'e', ACUTE, GRAVE, -1);
  96   test_u32_grapheme_prev (1, 'e', ACUTE, 'x', -1);
  97   test_u32_grapheme_prev (2, 'e', ACUTE, 'e', ACUTE, -1);
  98 
  99   
 100 #define NEUTRAL_FACE 0x1f610    
 101   test_u32_grapheme_prev (1, NEUTRAL_FACE, -1);
 102   test_u32_grapheme_prev (2, NEUTRAL_FACE, GRAVE, -1);
 103 
 104   return 0;
 105 }