Coverage Report

Created: 2024-06-20 06:28

/src/gnutls/lib/unistring/unistr/u16-mbtoucr.c
Line
Count
Source (jump to first uncovered line)
1
/* Look at first character in UTF-16 string, returning an error code.
2
   Copyright (C) 1999-2002, 2006-2007, 2009-2023 Free Software Foundation, Inc.
3
   Written by Bruno Haible <bruno@clisp.org>, 2001.
4
5
   This file is free software.
6
   It is dual-licensed under "the GNU LGPLv3+ or the GNU GPLv2+".
7
   You can redistribute it and/or modify it under either
8
     - the terms of the GNU Lesser General Public License as published
9
       by the Free Software Foundation, either version 3, or (at your
10
       option) any later version, or
11
     - the terms of the GNU General Public License as published by the
12
       Free Software Foundation; either version 2, or (at your option)
13
       any later version, or
14
     - the same dual license "the GNU LGPLv3+ or the GNU GPLv2+".
15
16
   This file is distributed in the hope that it will be useful,
17
   but WITHOUT ANY WARRANTY; without even the implied warranty of
18
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19
   Lesser General Public License and the GNU General Public License
20
   for more details.
21
22
   You should have received a copy of the GNU Lesser General Public
23
   License and of the GNU General Public License along with this
24
   program.  If not, see <https://www.gnu.org/licenses/>.  */
25
26
#include <config.h>
27
28
/* Specification.  */
29
#include "unistr.h"
30
31
int
32
u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n)
33
0
{
34
0
  uint16_t c = *s;
35
36
0
  if (c < 0xd800 || c >= 0xe000)
37
0
    {
38
0
      *puc = c;
39
0
      return 1;
40
0
    }
41
0
  if (c < 0xdc00)
42
0
    {
43
0
      if (n >= 2)
44
0
        {
45
0
          if (s[1] >= 0xdc00 && s[1] < 0xe000)
46
0
            {
47
0
              *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
48
0
              return 2;
49
0
            }
50
          /* invalid multibyte character */
51
0
        }
52
0
      else
53
0
        {
54
          /* incomplete multibyte character */
55
0
          *puc = 0xfffd;
56
0
          return -2;
57
0
        }
58
0
    }
59
  /* invalid multibyte character */
60
0
  *puc = 0xfffd;
61
0
  return -1;
62
0
}