LCOV - code coverage report
Current view: top level - lib/gl/unistr/unistr - u8-uctomb-aux.c (source / functions) Hit Total Coverage
Test: GNU Libidn Lines: 20 20 100.0 %
Date: 2020-07-22 17:53:13 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* Conversion UCS-4 to UTF-8.
       2             :    Copyright (C) 2002, 2006-2007, 2009-2020 Free Software Foundation, Inc.
       3             :    Written by Bruno Haible <bruno@clisp.org>, 2002.
       4             : 
       5             :    This program is free software: you can redistribute it and/or modify it
       6             :    under the terms of the GNU Lesser General Public License as published
       7             :    by the Free Software Foundation; either version 2.1 of the License, or
       8             :    (at your option) any later version.
       9             : 
      10             :    This program is distributed in the hope that it will be useful,
      11             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      12             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13             :    Lesser General Public License for more details.
      14             : 
      15             :    You should have received a copy of the GNU Lesser General Public License
      16             :    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      17             : 
      18             : #include <config.h>
      19             : 
      20             : /* Specification.  */
      21             : #include "unistr.h"
      22             : 
      23             : #include "attribute.h"
      24             : 
      25             : int
      26         165 : u8_uctomb_aux (uint8_t *s, ucs4_t uc, int n)
      27             : {
      28             :   int count;
      29             : 
      30         165 :   if (uc < 0x80)
      31             :     /* The case n >= 1 is already handled by the caller.  */
      32         128 :     return -2;
      33          37 :   else if (uc < 0x800)
      34           3 :     count = 2;
      35          34 :   else if (uc < 0x10000)
      36             :     {
      37          24 :       if (uc < 0xd800 || uc >= 0xe000)
      38           4 :         count = 3;
      39             :       else
      40          20 :         return -1;
      41             :     }
      42          10 :   else if (uc < 0x110000)
      43           5 :     count = 4;
      44             :   else
      45           5 :     return -1;
      46             : 
      47          12 :   if (n < count)
      48           9 :     return -2;
      49             : 
      50           3 :   switch (count) /* note: code falls through cases! */
      51             :     {
      52           1 :     case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000;
      53             :       FALLTHROUGH;
      54           2 :     case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800;
      55             :       FALLTHROUGH;
      56           3 :     case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0;
      57           3 :   /*case 1:*/ s[0] = uc;
      58             :     }
      59           3 :   return count;
      60             : }

Generated by: LCOV version 1.13