Coverage Report

Created: 2026-04-12 06:53

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/exiv2/xmpsdk/src/UnicodeInlines.incl_cpp
Line
Count
Source
1
#ifndef __UnicodeInlines_incl_cpp__
2
#define __UnicodeInlines_incl_cpp__
3
4
// =================================================================================================
5
// Copyright 2002-2007 Adobe Systems Incorporated
6
// All Rights Reserved.
7
//
8
// NOTICE:  Adobe permits you to use, modify, and distribute this file in accordance with the terms
9
// of the Adobe license agreement accompanying it.
10
// =================================================================================================
11
12
#include "UnicodeConversions.hpp"
13
14
// =================================================================================================
15
// Inner loop utilities that need to be inlined.
16
// =================================================================================================
17
18
static inline XMP_Uns32 GetCodePoint ( const XMP_Uns8 ** utf8Str_io )
19
23.3k
{
20
23.3k
  const XMP_Uns8 * u8Ptr = *utf8Str_io;
21
23.3k
  XMP_Uns32 cp;
22
23.3k
  size_t u8Len;
23
23.3k
  CodePoint_from_UTF8 ( u8Ptr, 4, &cp, &u8Len );  // Throws an exception for errors.
24
23.3k
  *utf8Str_io = u8Ptr + u8Len;
25
23.3k
  return cp;
26
23.3k
}
XMPCore_Impl.cpp:GetCodePoint(unsigned char const**)
Line
Count
Source
19
11.1k
{
20
11.1k
  const XMP_Uns8 * u8Ptr = *utf8Str_io;
21
11.1k
  XMP_Uns32 cp;
22
11.1k
  size_t u8Len;
23
11.1k
  CodePoint_from_UTF8 ( u8Ptr, 4, &cp, &u8Len );  // Throws an exception for errors.
24
11.1k
  *utf8Str_io = u8Ptr + u8Len;
25
11.1k
  return cp;
26
11.1k
}
XMPMeta-GetSet.cpp:GetCodePoint(unsigned char const**)
Line
Count
Source
19
7.35k
{
20
7.35k
  const XMP_Uns8 * u8Ptr = *utf8Str_io;
21
7.35k
  XMP_Uns32 cp;
22
7.35k
  size_t u8Len;
23
7.35k
  CodePoint_from_UTF8 ( u8Ptr, 4, &cp, &u8Len );  // Throws an exception for errors.
24
7.35k
  *utf8Str_io = u8Ptr + u8Len;
25
7.35k
  return cp;
26
7.35k
}
Unexecuted instantiation: XMPMeta-Parse.cpp:GetCodePoint(unsigned char const**)
Unexecuted instantiation: XMPMeta-Serialize.cpp:GetCodePoint(unsigned char const**)
XMPMeta.cpp:GetCodePoint(unsigned char const**)
Line
Count
Source
19
4.86k
{
20
4.86k
  const XMP_Uns8 * u8Ptr = *utf8Str_io;
21
4.86k
  XMP_Uns32 cp;
22
4.86k
  size_t u8Len;
23
4.86k
  CodePoint_from_UTF8 ( u8Ptr, 4, &cp, &u8Len );  // Throws an exception for errors.
24
4.86k
  *utf8Str_io = u8Ptr + u8Len;
25
4.86k
  return cp;
26
4.86k
}
27
28
// =================================================================================================
29
30
static inline bool IsStartChar_ASCII ( XMP_Uns32 cp )
31
72.3M
{
32
  // ASCII starting characters for an XML name.
33
72.3M
  if ( (('a' <= cp) && (cp <= 'z')) || (('A' <= cp) && (cp <= 'Z')) || (cp == '_') ) return true;
34
333k
  return false;
35
72.3M
}
XMPCore_Impl.cpp:IsStartChar_ASCII(unsigned int)
Line
Count
Source
31
66.0M
{
32
  // ASCII starting characters for an XML name.
33
66.0M
  if ( (('a' <= cp) && (cp <= 'z')) || (('A' <= cp) && (cp <= 'Z')) || (cp == '_') ) return true;
34
299k
  return false;
35
66.0M
}
Unexecuted instantiation: XMPMeta-GetSet.cpp:IsStartChar_ASCII(unsigned int)
Unexecuted instantiation: XMPMeta-Parse.cpp:IsStartChar_ASCII(unsigned int)
Unexecuted instantiation: XMPMeta-Serialize.cpp:IsStartChar_ASCII(unsigned int)
XMPMeta.cpp:IsStartChar_ASCII(unsigned int)
Line
Count
Source
31
6.34M
{
32
  // ASCII starting characters for an XML name.
33
6.34M
  if ( (('a' <= cp) && (cp <= 'z')) || (('A' <= cp) && (cp <= 'Z')) || (cp == '_') ) return true;
34
33.6k
  return false;
35
6.34M
}
36
37
// -------------------------------------------------------------------------------------------------
38
39
static inline bool IsStartChar_NonASCII ( XMP_Uns32 cp )
40
16.0k
{
41
  // Non-ASCII starting characters for an XML name.
42
  
43
16.0k
  if ( ((0xC0 <= cp) && (cp <= 0xD6))  || ((0xD8 <= cp) && (cp <= 0xF6)) ) return true;
44
10.9k
  if ( ((0xF8 <= cp) && (cp <= 0x2FF)) || ((0x370 <= cp) && (cp <= 0x37D)) ) return true;
45
46
6.11k
  if ( ((0x37F <= cp) && (cp <= 0x1FFF))  || ((0x200C <= cp) && (cp <= 0x200D)) ) return true;
47
4.96k
  if ( ((0x2070 <= cp) && (cp <= 0x218F)) || ((0x2C00 <= cp) && (cp <= 0x2FEF)) ) return true;
48
4.96k
  if ( ((0x3001 <= cp) && (cp <= 0xD7FF)) || ((0xF900 <= cp) && (cp <= 0xFDCF)) ) return true;
49
4.39k
  if ( ((0xFDF0 <= cp) && (cp <= 0xFFFD)) || ((0x10000 <= cp) && (cp <= 0xEFFFF)) ) return true;
50
51
4.39k
  return false;
52
53
4.39k
}
XMPCore_Impl.cpp:IsStartChar_NonASCII(unsigned int)
Line
Count
Source
40
11.1k
{
41
  // Non-ASCII starting characters for an XML name.
42
  
43
11.1k
  if ( ((0xC0 <= cp) && (cp <= 0xD6))  || ((0xD8 <= cp) && (cp <= 0xF6)) ) return true;
44
6.66k
  if ( ((0xF8 <= cp) && (cp <= 0x2FF)) || ((0x370 <= cp) && (cp <= 0x37D)) ) return true;
45
46
3.91k
  if ( ((0x37F <= cp) && (cp <= 0x1FFF))  || ((0x200C <= cp) && (cp <= 0x200D)) ) return true;
47
3.17k
  if ( ((0x2070 <= cp) && (cp <= 0x218F)) || ((0x2C00 <= cp) && (cp <= 0x2FEF)) ) return true;
48
3.17k
  if ( ((0x3001 <= cp) && (cp <= 0xD7FF)) || ((0xF900 <= cp) && (cp <= 0xFDCF)) ) return true;
49
2.85k
  if ( ((0xFDF0 <= cp) && (cp <= 0xFFFD)) || ((0x10000 <= cp) && (cp <= 0xEFFFF)) ) return true;
50
51
2.85k
  return false;
52
53
2.85k
}
Unexecuted instantiation: XMPMeta-GetSet.cpp:IsStartChar_NonASCII(unsigned int)
Unexecuted instantiation: XMPMeta-Parse.cpp:IsStartChar_NonASCII(unsigned int)
Unexecuted instantiation: XMPMeta-Serialize.cpp:IsStartChar_NonASCII(unsigned int)
XMPMeta.cpp:IsStartChar_NonASCII(unsigned int)
Line
Count
Source
40
4.86k
{
41
  // Non-ASCII starting characters for an XML name.
42
  
43
4.86k
  if ( ((0xC0 <= cp) && (cp <= 0xD6))  || ((0xD8 <= cp) && (cp <= 0xF6)) ) return true;
44
4.25k
  if ( ((0xF8 <= cp) && (cp <= 0x2FF)) || ((0x370 <= cp) && (cp <= 0x37D)) ) return true;
45
46
2.20k
  if ( ((0x37F <= cp) && (cp <= 0x1FFF))  || ((0x200C <= cp) && (cp <= 0x200D)) ) return true;
47
1.78k
  if ( ((0x2070 <= cp) && (cp <= 0x218F)) || ((0x2C00 <= cp) && (cp <= 0x2FEF)) ) return true;
48
1.78k
  if ( ((0x3001 <= cp) && (cp <= 0xD7FF)) || ((0xF900 <= cp) && (cp <= 0xFDCF)) ) return true;
49
1.54k
  if ( ((0xFDF0 <= cp) && (cp <= 0xFFFD)) || ((0x10000 <= cp) && (cp <= 0xEFFFF)) ) return true;
50
51
1.54k
  return false;
52
53
1.54k
}
54
55
// -------------------------------------------------------------------------------------------------
56
57
static inline bool IsOtherChar_ASCII ( XMP_Uns32 cp )
58
333k
{
59
  // ASCII following characters for an XML name.
60
333k
  if ( (('0' <= cp) && (cp <= '9')) || (cp == '-') || (cp == '.') ) return true;
61
0
  return false;
62
333k
}
XMPCore_Impl.cpp:IsOtherChar_ASCII(unsigned int)
Line
Count
Source
58
299k
{
59
  // ASCII following characters for an XML name.
60
299k
  if ( (('0' <= cp) && (cp <= '9')) || (cp == '-') || (cp == '.') ) return true;
61
0
  return false;
62
299k
}
Unexecuted instantiation: XMPMeta-GetSet.cpp:IsOtherChar_ASCII(unsigned int)
Unexecuted instantiation: XMPMeta-Parse.cpp:IsOtherChar_ASCII(unsigned int)
Unexecuted instantiation: XMPMeta-Serialize.cpp:IsOtherChar_ASCII(unsigned int)
XMPMeta.cpp:IsOtherChar_ASCII(unsigned int)
Line
Count
Source
58
33.6k
{
59
  // ASCII following characters for an XML name.
60
33.6k
  if ( (('0' <= cp) && (cp <= '9')) || (cp == '-') || (cp == '.') ) return true;
61
0
  return false;
62
33.6k
}
63
64
// -------------------------------------------------------------------------------------------------
65
66
static inline bool IsOtherChar_NonASCII ( XMP_Uns32 cp )
67
4.39k
{
68
  // Non-ASCII following characters for an XML name.
69
4.39k
  if ( (cp == 0xB7) || ((0x300 <= cp) && (cp <= 0x36F))  || ((0x203F <= cp) && (cp <= 0x2040)) ) return true;
70
0
  return false;
71
4.39k
}
XMPCore_Impl.cpp:IsOtherChar_NonASCII(unsigned int)
Line
Count
Source
67
2.85k
{
68
  // Non-ASCII following characters for an XML name.
69
2.85k
  if ( (cp == 0xB7) || ((0x300 <= cp) && (cp <= 0x36F))  || ((0x203F <= cp) && (cp <= 0x2040)) ) return true;
70
0
  return false;
71
2.85k
}
Unexecuted instantiation: XMPMeta-GetSet.cpp:IsOtherChar_NonASCII(unsigned int)
Unexecuted instantiation: XMPMeta-Parse.cpp:IsOtherChar_NonASCII(unsigned int)
Unexecuted instantiation: XMPMeta-Serialize.cpp:IsOtherChar_NonASCII(unsigned int)
XMPMeta.cpp:IsOtherChar_NonASCII(unsigned int)
Line
Count
Source
67
1.54k
{
68
  // Non-ASCII following characters for an XML name.
69
1.54k
  if ( (cp == 0xB7) || ((0x300 <= cp) && (cp <= 0x36F))  || ((0x203F <= cp) && (cp <= 0x2040)) ) return true;
70
0
  return false;
71
1.54k
}
72
73
// -------------------------------------------------------------------------------------------------
74
75
static inline void VerifyUTF8 ( XMP_StringPtr str )
76
0
{
77
0
  const XMP_Uns8 * utf8Str = (XMP_Uns8*)str;
78
0
  while ( *utf8Str != 0 ) {
79
0
    while ( (*utf8Str != 0) && (*utf8Str < 0x80) ) ++utf8Str;
80
0
    if ( *utf8Str >= 0x80 ) (void) GetCodePoint ( &utf8Str ); // Throws for bad UTF-8.
81
0
  }
82
0
}
Unexecuted instantiation: XMPCore_Impl.cpp:VerifyUTF8(char const*)
Unexecuted instantiation: XMPMeta-GetSet.cpp:VerifyUTF8(char const*)
Unexecuted instantiation: XMPMeta-Parse.cpp:VerifyUTF8(char const*)
Unexecuted instantiation: XMPMeta-Serialize.cpp:VerifyUTF8(char const*)
Unexecuted instantiation: XMPMeta.cpp:VerifyUTF8(char const*)
83
84
// -------------------------------------------------------------------------------------------------
85
86
static inline void VerifySimpleXMLName ( XMP_StringPtr _nameStart, XMP_StringPtr _nameEnd )
87
935k
{
88
89
935k
  const XMP_Uns8 * nameStart = (const XMP_Uns8 *) _nameStart;
90
935k
  const XMP_Uns8 * nameEnd   = (const XMP_Uns8 *) _nameEnd;
91
935k
  const XMP_Uns8 * namePos   = nameStart;
92
935k
  XMP_Uns32 cp;
93
  
94
  // The first character is more restricted.
95
  
96
935k
  if ( nameStart >= nameEnd ) XMP_Throw ( "Empty XML name", kXMPErr_BadXPath );
97
98
935k
  cp = *namePos;
99
935k
  if ( cp < 0x80 ) {
100
934k
    ++namePos;
101
934k
    if ( ! IsStartChar_ASCII(cp) ) goto NameError;
102
934k
  } else {
103
536
    cp = GetCodePoint ( &namePos );
104
536
    if ( ! IsStartChar_NonASCII(cp) ) goto NameError;
105
536
  }
106
107
  // Check the rest of the name.
108
  
109
72.3M
  while ( namePos < nameEnd ) {
110
71.4M
    cp = *namePos;
111
71.4M
    if ( cp < 0x80 ) {
112
71.4M
      ++namePos;
113
71.4M
      if ( (! IsStartChar_ASCII(cp)) && (! IsOtherChar_ASCII(cp)) ) goto NameError;
114
71.4M
    } else {
115
15.4k
      cp = GetCodePoint ( &namePos );
116
15.4k
      if ( (! IsStartChar_NonASCII(cp)) && (! IsOtherChar_NonASCII(cp)) ) goto NameError;
117
15.4k
    }
118
71.4M
  }
119
120
935k
  return;
121
122
935k
NameError:
123
0
  XMP_Throw ( "Bad XML name", kXMPErr_BadXPath );
124
  
125
0
}  // VerifySimpleXMLName
XMPCore_Impl.cpp:VerifySimpleXMLName(char const*, char const*)
Line
Count
Source
87
895k
{
88
89
895k
  const XMP_Uns8 * nameStart = (const XMP_Uns8 *) _nameStart;
90
895k
  const XMP_Uns8 * nameEnd   = (const XMP_Uns8 *) _nameEnd;
91
895k
  const XMP_Uns8 * namePos   = nameStart;
92
895k
  XMP_Uns32 cp;
93
  
94
  // The first character is more restricted.
95
  
96
895k
  if ( nameStart >= nameEnd ) XMP_Throw ( "Empty XML name", kXMPErr_BadXPath );
97
98
895k
  cp = *namePos;
99
895k
  if ( cp < 0x80 ) {
100
894k
    ++namePos;
101
894k
    if ( ! IsStartChar_ASCII(cp) ) goto NameError;
102
894k
  } else {
103
251
    cp = GetCodePoint ( &namePos );
104
251
    if ( ! IsStartChar_NonASCII(cp) ) goto NameError;
105
251
  }
106
107
  // Check the rest of the name.
108
  
109
66.0M
  while ( namePos < nameEnd ) {
110
65.1M
    cp = *namePos;
111
65.1M
    if ( cp < 0x80 ) {
112
65.1M
      ++namePos;
113
65.1M
      if ( (! IsStartChar_ASCII(cp)) && (! IsOtherChar_ASCII(cp)) ) goto NameError;
114
65.1M
    } else {
115
10.9k
      cp = GetCodePoint ( &namePos );
116
10.9k
      if ( (! IsStartChar_NonASCII(cp)) && (! IsOtherChar_NonASCII(cp)) ) goto NameError;
117
10.9k
    }
118
65.1M
  }
119
120
895k
  return;
121
122
895k
NameError:
123
0
  XMP_Throw ( "Bad XML name", kXMPErr_BadXPath );
124
  
125
0
}  // VerifySimpleXMLName
Unexecuted instantiation: XMPMeta-GetSet.cpp:VerifySimpleXMLName(char const*, char const*)
Unexecuted instantiation: XMPMeta-Parse.cpp:VerifySimpleXMLName(char const*, char const*)
Unexecuted instantiation: XMPMeta-Serialize.cpp:VerifySimpleXMLName(char const*, char const*)
XMPMeta.cpp:VerifySimpleXMLName(char const*, char const*)
Line
Count
Source
87
40.0k
{
88
89
40.0k
  const XMP_Uns8 * nameStart = (const XMP_Uns8 *) _nameStart;
90
40.0k
  const XMP_Uns8 * nameEnd   = (const XMP_Uns8 *) _nameEnd;
91
40.0k
  const XMP_Uns8 * namePos   = nameStart;
92
40.0k
  XMP_Uns32 cp;
93
  
94
  // The first character is more restricted.
95
  
96
40.0k
  if ( nameStart >= nameEnd ) XMP_Throw ( "Empty XML name", kXMPErr_BadXPath );
97
98
40.0k
  cp = *namePos;
99
40.0k
  if ( cp < 0x80 ) {
100
39.7k
    ++namePos;
101
39.7k
    if ( ! IsStartChar_ASCII(cp) ) goto NameError;
102
39.7k
  } else {
103
285
    cp = GetCodePoint ( &namePos );
104
285
    if ( ! IsStartChar_NonASCII(cp) ) goto NameError;
105
285
  }
106
107
  // Check the rest of the name.
108
  
109
6.34M
  while ( namePos < nameEnd ) {
110
6.30M
    cp = *namePos;
111
6.30M
    if ( cp < 0x80 ) {
112
6.30M
      ++namePos;
113
6.30M
      if ( (! IsStartChar_ASCII(cp)) && (! IsOtherChar_ASCII(cp)) ) goto NameError;
114
6.30M
    } else {
115
4.57k
      cp = GetCodePoint ( &namePos );
116
4.57k
      if ( (! IsStartChar_NonASCII(cp)) && (! IsOtherChar_NonASCII(cp)) ) goto NameError;
117
4.57k
    }
118
6.30M
  }
119
120
40.0k
  return;
121
122
40.0k
NameError:
123
0
  XMP_Throw ( "Bad XML name", kXMPErr_BadXPath );
124
  
125
0
}  // VerifySimpleXMLName
126
127
// =================================================================================================
128
129
#endif  // __UnicodeInlines_incl_cpp__