|
Packit Service |
21b5d1 |
#ifndef __UnicodeInlines_incl_cpp__
|
|
Packit Service |
21b5d1 |
#define __UnicodeInlines_incl_cpp__
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
// =================================================================================================
|
|
Packit Service |
21b5d1 |
// Copyright 2002-2007 Adobe Systems Incorporated
|
|
Packit Service |
21b5d1 |
// All Rights Reserved.
|
|
Packit Service |
21b5d1 |
//
|
|
Packit Service |
21b5d1 |
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
|
|
Packit Service |
21b5d1 |
// of the Adobe license agreement accompanying it.
|
|
Packit Service |
21b5d1 |
// =================================================================================================
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
#include "UnicodeConversions.hpp"
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
// =================================================================================================
|
|
Packit Service |
21b5d1 |
// Inner loop utilities that need to be inlined.
|
|
Packit Service |
21b5d1 |
// =================================================================================================
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
static inline XMP_Uns32 GetCodePoint ( const XMP_Uns8 ** utf8Str_io )
|
|
Packit Service |
21b5d1 |
{
|
|
Packit Service |
21b5d1 |
const XMP_Uns8 * u8Ptr = *utf8Str_io;
|
|
Packit Service |
21b5d1 |
XMP_Uns32 cp;
|
|
Packit Service |
21b5d1 |
size_t u8Len;
|
|
Packit Service |
21b5d1 |
CodePoint_from_UTF8 ( u8Ptr, 4, &cp, &u8Len ); // Throws an exception for errors.
|
|
Packit Service |
21b5d1 |
*utf8Str_io = u8Ptr + u8Len;
|
|
Packit Service |
21b5d1 |
return cp;
|
|
Packit Service |
21b5d1 |
}
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
// =================================================================================================
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
static inline bool IsStartChar_ASCII ( XMP_Uns32 cp )
|
|
Packit Service |
21b5d1 |
{
|
|
Packit Service |
21b5d1 |
// ASCII starting characters for an XML name.
|
|
Packit Service |
21b5d1 |
if ( (('a' <= cp) && (cp <= 'z')) || (('A' <= cp) && (cp <= 'Z')) || (cp == '_') ) return true;
|
|
Packit Service |
21b5d1 |
return false;
|
|
Packit Service |
21b5d1 |
}
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
// -------------------------------------------------------------------------------------------------
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
static inline bool IsStartChar_NonASCII ( XMP_Uns32 cp )
|
|
Packit Service |
21b5d1 |
{
|
|
Packit Service |
21b5d1 |
// Non-ASCII starting characters for an XML name.
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
if ( ((0xC0 <= cp) && (cp <= 0xD6)) || ((0xD8 <= cp) && (cp <= 0xF6)) ) return true;
|
|
Packit Service |
21b5d1 |
if ( ((0xF8 <= cp) && (cp <= 0x2FF)) || ((0x370 <= cp) && (cp <= 0x37D)) ) return true;
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
if ( ((0x37F <= cp) && (cp <= 0x1FFF)) || ((0x200C <= cp) && (cp <= 0x200D)) ) return true;
|
|
Packit Service |
21b5d1 |
if ( ((0x2070 <= cp) && (cp <= 0x218F)) || ((0x2C00 <= cp) && (cp <= 0x2FEF)) ) return true;
|
|
Packit Service |
21b5d1 |
if ( ((0x3001 <= cp) && (cp <= 0xD7FF)) || ((0xF900 <= cp) && (cp <= 0xFDCF)) ) return true;
|
|
Packit Service |
21b5d1 |
if ( ((0xFDF0 <= cp) && (cp <= 0xFFFD)) || ((0x10000 <= cp) && (cp <= 0xEFFFF)) ) return true;
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
return false;
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
}
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
// -------------------------------------------------------------------------------------------------
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
static inline bool IsOtherChar_ASCII ( XMP_Uns32 cp )
|
|
Packit Service |
21b5d1 |
{
|
|
Packit Service |
21b5d1 |
// ASCII following characters for an XML name.
|
|
Packit Service |
21b5d1 |
if ( (('0' <= cp) && (cp <= '9')) || (cp == '-') || (cp == '.') ) return true;
|
|
Packit Service |
21b5d1 |
return false;
|
|
Packit Service |
21b5d1 |
}
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
// -------------------------------------------------------------------------------------------------
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
static inline bool IsOtherChar_NonASCII ( XMP_Uns32 cp )
|
|
Packit Service |
21b5d1 |
{
|
|
Packit Service |
21b5d1 |
// Non-ASCII following characters for an XML name.
|
|
Packit Service |
21b5d1 |
if ( (cp == 0xB7) || ((0x300 <= cp) && (cp <= 0x36F)) || ((0x203F <= cp) && (cp <= 0x2040)) ) return true;
|
|
Packit Service |
21b5d1 |
return false;
|
|
Packit Service |
21b5d1 |
}
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
// -------------------------------------------------------------------------------------------------
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
static inline void VerifyUTF8 ( XMP_StringPtr str )
|
|
Packit Service |
21b5d1 |
{
|
|
Packit Service |
21b5d1 |
const XMP_Uns8 * utf8Str = (XMP_Uns8*)str;
|
|
Packit Service |
21b5d1 |
while ( *utf8Str != 0 ) {
|
|
Packit Service |
21b5d1 |
while ( (*utf8Str != 0) && (*utf8Str < 0x80) ) ++utf8Str;
|
|
Packit Service |
21b5d1 |
if ( *utf8Str >= 0x80 ) (void) GetCodePoint ( &utf8Str ); // Throws for bad UTF-8.
|
|
Packit Service |
21b5d1 |
}
|
|
Packit Service |
21b5d1 |
}
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
// -------------------------------------------------------------------------------------------------
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
static inline void VerifySimpleXMLName ( XMP_StringPtr _nameStart, XMP_StringPtr _nameEnd )
|
|
Packit Service |
21b5d1 |
{
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
const XMP_Uns8 * nameStart = (const XMP_Uns8 *) _nameStart;
|
|
Packit Service |
21b5d1 |
const XMP_Uns8 * nameEnd = (const XMP_Uns8 *) _nameEnd;
|
|
Packit Service |
21b5d1 |
const XMP_Uns8 * namePos = nameStart;
|
|
Packit Service |
21b5d1 |
XMP_Uns32 cp;
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
// The first character is more restricted.
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
if ( nameStart >= nameEnd ) XMP_Throw ( "Empty XML name", kXMPErr_BadXPath );
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
cp = *namePos;
|
|
Packit Service |
21b5d1 |
if ( cp < 0x80 ) {
|
|
Packit Service |
21b5d1 |
++namePos;
|
|
Packit Service |
21b5d1 |
if ( ! IsStartChar_ASCII(cp) ) goto NameError;
|
|
Packit Service |
21b5d1 |
} else {
|
|
Packit Service |
21b5d1 |
cp = GetCodePoint ( &namePos );
|
|
Packit Service |
21b5d1 |
if ( ! IsStartChar_NonASCII(cp) ) goto NameError;
|
|
Packit Service |
21b5d1 |
}
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
// Check the rest of the name.
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
while ( namePos < nameEnd ) {
|
|
Packit Service |
21b5d1 |
cp = *namePos;
|
|
Packit Service |
21b5d1 |
if ( cp < 0x80 ) {
|
|
Packit Service |
21b5d1 |
++namePos;
|
|
Packit Service |
21b5d1 |
if ( (! IsStartChar_ASCII(cp)) && (! IsOtherChar_ASCII(cp)) ) goto NameError;
|
|
Packit Service |
21b5d1 |
} else {
|
|
Packit Service |
21b5d1 |
cp = GetCodePoint ( &namePos );
|
|
Packit Service |
21b5d1 |
if ( (! IsStartChar_NonASCII(cp)) && (! IsOtherChar_NonASCII(cp)) ) goto NameError;
|
|
Packit Service |
21b5d1 |
}
|
|
Packit Service |
21b5d1 |
}
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
return;
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
NameError:
|
|
Packit Service |
21b5d1 |
XMP_Throw ( "Bad XML name", kXMPErr_BadXPath );
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
} // VerifySimpleXMLName
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
// =================================================================================================
|
|
Packit Service |
21b5d1 |
|
|
Packit Service |
21b5d1 |
#endif // __UnicodeInlines_incl_cpp__
|