Use base32 instead of base64+extended-identifiers

Extended identifiers have proved to cause more problems than they solve.
Switch to base32 which, while less commonly supported, is available in
Python and uses an alphabet that is almost a subset of the C identifier
alphabet.  Padding characters are still a problem, but can be remapped
to a valid C identifier that is not a valid base32 character.
This commit is contained in:
Kp 2019-12-29 22:24:20 +00:00
parent e20152da11
commit e2a108bbf5
2 changed files with 14 additions and 31 deletions

View file

@ -3,6 +3,7 @@
# needed imports
from collections import (defaultdict, Counter as collections_counter)
import base64
import binascii
import errno
import itertools
@ -139,7 +140,7 @@ class Git(StaticSubprocess):
self.revparse_HEAD = revparse_HEAD
def __repr__(self):
return 'ComputedExtraVersion(%r,%r,%r,%r)' % (self.describe, self.status, self.diffstat_HEAD, self.revparse_HEAD)
UnknownExtraVersion = ComputedExtraVersion('', None, None, None)
UnknownExtraVersion = ComputedExtraVersion(None, None, None, None)
# None when unset. Instance of ComputedExtraVersion once cached.
__computed_extra_version = None
__path_git = None
@ -1466,25 +1467,6 @@ variables to their default-constructed value.
raise SCons.Errors.StopError("C++ compiler errors on {} initialization, even with -Wno-missing-field-initializers.")
@_custom_test
def check_compiler_extended_identifiers(self,context,main=r'''
#define DXX_RENAME_IDENTIFIER2(I,N) I##$##N
#define DXX_RENAME_IDENTIFIER(I,N) DXX_RENAME_IDENTIFIER2(I,N)
#define DXX_extended a\u012b\u012f\u013d
#define var DXX_RENAME_IDENTIFIER(var, DXX_extended)
int var;
(void)var;
#undef var
#undef DXX_extended
#undef DXX_RENAME_IDENTIFIER
#undef DXX_RENAME_IDENTIFIER2
''',_successflags={'CXXFLAGS' : ['-fextended-identifiers']}):
Compile = self.Compile
if Compile(context, text='', main=main, msg='whether compiler accepts extended identifiers by default') or \
Compile(context, text='', main=main, msg='whether compiler accepts extended identifiers with -fextended-identifiers', successflags=_successflags):
return
user_settings = self.user_settings
user_settings._dxx_extended_identifiers = user_settings._dxx_disable_extended_identifiers
@_custom_test
def check_attribute_error(self,context):
"""
Test whether the compiler accepts and properly implements gcc's function
@ -3494,9 +3476,6 @@ class DXXCommon(LazyObjectConstructor):
_default_prefix = '/usr/local'
__stdout_is_not_a_tty = None
__has_git_dir = None
# +/=
_dxx_extended_identifiers = (r'\u012b', r'\u012f', r'\u013d')
_dxx_disable_extended_identifiers = ('_2b', '_2f', '_3d')
def default_poison(self):
return 'overwrite' if self.debug else 'none'
def default_builddir(self):
@ -4175,14 +4154,15 @@ class DXXCommon(LazyObjectConstructor):
return '\\"%s\\"' % r
@staticmethod
def _encode_cppdefine_for_identifier(user_settings,s,b2a_base64=binascii.b2a_base64):
extended_identifiers = user_settings._dxx_extended_identifiers
return '"%s"' % (b2a_base64(s.encode()) \
def _encode_cppdefine_for_identifier(s,b32encode=base64.b32encode):
# Identifiers cannot contain `=`; `z` is not generated by
# b32encode, so use it in place of the pad character.
if not s:
return s
return (b32encode(s.encode()) \
.rstrip() \
.decode() \
.replace('+', extended_identifiers[0]) \
.replace('/', extended_identifiers[1]) \
.replace('=', extended_identifiers[2]) \
.replace('=', 'z') \
)
def prepare_environment(self):
@ -4946,7 +4926,10 @@ class DXXProgram(DXXCommon):
static_archive_construction = self.static_archive_construction[user_settings.builddir]
objects = static_archive_construction.get_objects_common()
git_describe_version = Git.compute_extra_version() if user_settings.git_describe_version else Git.UnknownExtraVersion
env.__dxx_CPPDEFINE_git_version = [('DXX_git_commit', git_describe_version.revparse_HEAD), ('DXX_git_describe', self._encode_cppdefine_for_identifier(user_settings,git_describe_version.describe))]
env.__dxx_CPPDEFINE_git_version = [
('DXX_git_commit', git_describe_version.revparse_HEAD),
('DXX_git_describe', self._encode_cppdefine_for_identifier(git_describe_version.describe))
]
objects.extend(self.get_objects_common())
if user_settings.sdlmixer:
objects.extend(static_archive_construction.get_objects_arch_sdlmixer())

View file

@ -429,7 +429,7 @@ namespace dsx {
#define DXX_RENAME_IDENTIFIER2(I,N) I##$##N
#define DXX_RENAME_IDENTIFIER(I,N) DXX_RENAME_IDENTIFIER2(I,N)
#define argc DXX_RENAME_IDENTIFIER(argc_gc, DXX_git_commit)
#define argv DXX_RENAME_IDENTIFIER(argv_gd, DXX_git_describe)
#define argv DXX_RENAME_IDENTIFIER(argv_gd$b32, DXX_git_describe)
// DESCENT by Parallax Software
// DESCENT II by Parallax Software