LCOV - code coverage report
Current view: top level - basic - gunicode.c (source / functions) Hit Total Coverage
Test: systemd_full.info Lines: 16 16 100.0 %
Date: 2019-08-23 13:36:53 Functions: 3 3 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 8 8 100.0 %

           Branch data     Line data    Source code
       1                 :            : /* gunicode.c - Unicode manipulation functions
       2                 :            :  *
       3                 :            :  *  Copyright (C) 1999, 2000 Tom Tromey
       4                 :            :  *  Copyright © 2000, 2005 Red Hat, Inc.
       5                 :            :  */
       6                 :            : 
       7                 :            : #include "gunicode.h"
       8                 :            : 
       9                 :            : #define unichar uint32_t
      10                 :            : 
      11                 :            : /**
      12                 :            :  * g_utf8_prev_char:
      13                 :            :  * @p: a pointer to a position within a UTF-8 encoded string
      14                 :            :  *
      15                 :            :  * Finds the previous UTF-8 character in the string before @p.
      16                 :            :  *
      17                 :            :  * @p does not have to be at the beginning of a UTF-8 character. No check
      18                 :            :  * is made to see if the character found is actually valid other than
      19                 :            :  * it starts with an appropriate byte. If @p might be the first
      20                 :            :  * character of the string, you must use g_utf8_find_prev_char() instead.
      21                 :            :  *
      22                 :            :  * Return value: a pointer to the found character.
      23                 :            :  **/
      24                 :            : char *
      25                 :      31916 : utf8_prev_char (const char *p)
      26                 :            : {
      27                 :            :   for (;;)
      28                 :            :     {
      29                 :      18292 :       p--;
      30         [ +  + ]:      31916 :       if ((*p & 0xc0) != 0x80)
      31                 :      13624 :         return (char *)p;
      32                 :            :     }
      33                 :            : }
      34                 :            : 
      35                 :            : struct Interval
      36                 :            : {
      37                 :            :   unichar start, end;
      38                 :            : };
      39                 :            : 
      40                 :            : static int
      41                 :    1279708 : interval_compare (const void *key, const void *elt)
      42                 :            : {
      43                 :    1279708 :   unichar c = (unichar) (long) (key);
      44                 :    1279708 :   struct Interval *interval = (struct Interval *)elt;
      45                 :            : 
      46         [ +  + ]:    1279708 :   if (c < interval->start)
      47                 :    1200456 :     return -1;
      48         [ +  + ]:      79252 :   if (c > interval->end)
      49                 :      60752 :     return +1;
      50                 :            : 
      51                 :      18500 :   return 0;
      52                 :            : }
      53                 :            : 
      54                 :            : /*
      55                 :            :  * NOTE:
      56                 :            :  *
      57                 :            :  * The tables for g_unichar_iswide() and g_unichar_iswide_cjk() are
      58                 :            :  * generated from the Unicode Character Database's file
      59                 :            :  * extracted/DerivedEastAsianWidth.txt using the gen-iswide-table.py
      60                 :            :  * in this way:
      61                 :            :  *
      62                 :            :  *   ./gen-iswide-table.py < path/to/ucd/extracted/DerivedEastAsianWidth.txt | fmt
      63                 :            :  *
      64                 :            :  * Last update for Unicode 6.0.
      65                 :            :  */
      66                 :            : 
      67                 :            : /**
      68                 :            :  * g_unichar_iswide:
      69                 :            :  * @c: a Unicode character
      70                 :            :  *
      71                 :            :  * Determines if a character is typically rendered in a double-width
      72                 :            :  * cell.
      73                 :            :  *
      74                 :            :  * Return value: %TRUE if the character is wide
      75                 :            :  **/
      76                 :            : bool
      77                 :     216368 : unichar_iswide (unichar c)
      78                 :            : {
      79                 :            :   /* See NOTE earlier for how to update this table. */
      80                 :            :   static const struct Interval wide[] = {
      81                 :            :     {0x1100, 0x115F}, {0x2329, 0x232A}, {0x2E80, 0x2E99}, {0x2E9B, 0x2EF3},
      82                 :            :     {0x2F00, 0x2FD5}, {0x2FF0, 0x2FFB}, {0x3000, 0x303E}, {0x3041, 0x3096},
      83                 :            :     {0x3099, 0x30FF}, {0x3105, 0x312D}, {0x3131, 0x318E}, {0x3190, 0x31BA},
      84                 :            :     {0x31C0, 0x31E3}, {0x31F0, 0x321E}, {0x3220, 0x3247}, {0x3250, 0x32FE},
      85                 :            :     {0x3300, 0x4DBF}, {0x4E00, 0xA48C}, {0xA490, 0xA4C6}, {0xA960, 0xA97C},
      86                 :            :     {0xAC00, 0xD7A3}, {0xF900, 0xFAFF}, {0xFE10, 0xFE19}, {0xFE30, 0xFE52},
      87                 :            :     {0xFE54, 0xFE66}, {0xFE68, 0xFE6B}, {0xFF01, 0xFF60}, {0xFFE0, 0xFFE6},
      88                 :            :     {0x1B000, 0x1B001}, {0x1F200, 0x1F202}, {0x1F210, 0x1F23A},
      89                 :            :     {0x1F240, 0x1F248}, {0x1F250, 0x1F251},
      90                 :            :     {0x1F300, 0x1F567}, /* Miscellaneous Symbols and Pictographs */
      91                 :            :     {0x20000, 0x2FFFD}, {0x30000, 0x3FFFD},
      92                 :            :   };
      93                 :            : 
      94         [ +  + ]:     216368 :   if (bsearch ((void *)(uintptr_t)c, wide, (sizeof (wide) / sizeof ((wide)[0])), sizeof wide[0],
      95                 :            :                interval_compare))
      96                 :      18500 :     return true;
      97                 :            : 
      98                 :     197868 :   return false;
      99                 :            : }
     100                 :            : 
     101                 :            : const char utf8_skip_data[256] = {
     102                 :            :   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
     103                 :            :   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
     104                 :            :   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
     105                 :            :   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
     106                 :            :   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
     107                 :            :   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
     108                 :            :   2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
     109                 :            :   3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1
     110                 :            : };

Generated by: LCOV version 1.14