(root)/
grep-3.11/
lib/
unistr/
u8-uctomb-aux.c
       1  /* Conversion UCS-4 to UTF-8.
       2     Copyright (C) 2002, 2006-2007, 2009-2023 Free Software Foundation, Inc.
       3     Written by Bruno Haible <bruno@clisp.org>, 2002.
       4  
       5     This file is free software: you can redistribute it and/or modify
       6     it under the terms of the GNU Lesser General Public License as
       7     published by the Free Software Foundation; either version 2.1 of the
       8     License, or (at your option) any later version.
       9  
      10     This file 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
      13     GNU 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  u8_uctomb_aux (uint8_t *s, ucs4_t uc, ptrdiff_t n)
      27  {
      28    int count;
      29  
      30    if (uc < 0x80)
      31      /* The case n >= 1 is already handled by the caller.  */
      32      return -2;
      33    else if (uc < 0x800)
      34      count = 2;
      35    else if (uc < 0x10000)
      36      {
      37        if (uc < 0xd800 || uc >= 0xe000)
      38          count = 3;
      39        else
      40          return -1;
      41      }
      42    else if (uc < 0x110000)
      43      count = 4;
      44    else
      45      return -1;
      46  
      47    if (n < count)
      48      return -2;
      49  
      50    switch (count) /* note: code falls through cases! */
      51      {
      52      case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000;
      53        FALLTHROUGH;
      54      case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800;
      55        FALLTHROUGH;
      56      case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0;
      57    /*case 1:*/ s[0] = uc;
      58      }
      59    return count;
      60  }