inline name_t name_read( const char* name ){
const char* end = name + strlen( name );
+
+#if GDEF_OS_MACOS
+ /* HACK: Apple shipped a clang built for macOS with an optimization enabled
+ that is not available on macOS. This compiler error may then be faced:
+
+ ld: Undefined symbols:
+ _memrchr, referenced from:
+ name_read(char const*) in map.cpp.o
+
+ This is a compiler error:
+
+ > On Mac OSX (macOS version 12.4, sdk version 12.1) llvm can replace call
+ > to strrchr() with call to memrchr() when string length is known at
+ > compile time. This results in link error, because memrchr is not present
+ > in libSystem.
+ > -- https://github.com/llvm/llvm-project/issues/62254
+
+ We workaround this by making the string length not known at build time
+ on macOS to avoid triggering the unavailable compiler optimization. */
+
+ const char* volatile numbers = "1234567890";
+#else
+ const char* numbers = "1234567890";
+#endif
+
for ( const char* p = end; end != name; --p )
{
- if ( strrchr( "1234567890", *p ) == NULL ) {
+ if ( strrchr( numbers, *p ) == NULL ) {
break;
}
end = p;
char buf[80];
name_t r( "","" );
name_write( buf, name );
+ #ifdef _DEBUG
globalErrorStream() << "find unique name for " << buf << "\n";
globalErrorStream() << "> currently registered names:\n";
+ #endif
for ( names_t::const_iterator i = m_names.begin(); i != m_names.end(); ++i )
{
+ #ifdef _DEBUG
globalErrorStream() << ">> " << i->first.c_str() << ": ";
+ #endif
for ( PostFixes::postfixes_t::const_iterator j = i->second.m_postfixes.begin(); j != i->second.m_postfixes.end(); ++j )
{
j->first.write( buf );
+ #ifdef _DEBUG
globalErrorStream() << " '" << buf << "'";
+ #endif
}
+ #ifdef _DEBUG
globalErrorStream() << "\n";
+ #endif
}
names_t::const_iterator i = m_names.find( name.first );
if ( i == m_names.end() ) {
r = name_t( name.first, ( *i ).second.make_unique( name.second ) );
}
name_write( buf, r );
+ #ifdef _DEBUG
globalErrorStream() << "> unique name is " << buf << "\n";
+ #endif
return r;
}