From c061061966ee12a7d6ace672b7798257eeb22cfd Mon Sep 17 00:00:00 2001 From: KyleMiles Date: Thu, 11 Jul 2019 16:18:32 -0400 Subject: Support encoding/decoding of unicode strings between the API and the core --- python/__init__.py | 62 +--------------------------------- python/compatibility.py | 90 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 61 deletions(-) create mode 100644 python/compatibility.py (limited to 'python') diff --git a/python/__init__.py b/python/__init__.py index f572bdef..25543dc9 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -26,68 +26,8 @@ import ctypes from time import gmtime import os -# 2-3 compatibility -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -try: - import builtins # __builtins__ for python2 -except ImportError: - pass - -def range(*args): - """ A Python2 and Python3 Compatible Range Generator """ - try: - return xrange(*args) - except NameError: - return builtins.range(*args) - -def valid_import(mod_name): - if PY2: - import imp - try: - imp.find_module(mod_name) - found = True - except ImportError: - found = False - elif PY34: - import importlib.util - mod_spec = importlib.util.find_spec(mod_name) - found = mod_spec is not None - elif PY3: - import importlib - mod_loader = importlib.find_loader(mod_name) - found = mod_loader is not None - else: - return False - return found - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - class metaclass(type): - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - - @classmethod - def __prepare__(cls, name, this_bases): - return meta.__prepare__(name, bases) - return type.__new__(metaclass, 'temporary_class', (), {}) - -def cstr(arg): - if isinstance(arg, bytes) or arg is None: - return arg - else: - return arg.encode('charmap') - - -def pyNativeStr(arg): - if isinstance(arg, str): - return arg - else: - return arg.decode('charmap') +from binaryninja.compatibility import * # Binary Ninja components diff --git a/python/compatibility.py b/python/compatibility.py new file mode 100644 index 00000000..0a40328a --- /dev/null +++ b/python/compatibility.py @@ -0,0 +1,90 @@ +# Copyright (c) 2015-2019 Vector 35 Inc +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +# 2-3 compatibility +import sys + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + + +if PY2: + def range(*args): + return xrange(*args) + + def valid_import(mod_name): + import imp + try: + imp.find_module(mod_name) + found = True + except ImportError: + found = False + return found + + def pyNativeStr(arg): + return arg + + +if PY3: + range = range # Range needs to explicitly be defined or it's an error + + def valid_import(mod_name): + import importlib + mod_loader = importlib.find_loader(mod_name) + found = mod_loader is not None + return found + + def pyNativeStr(arg): + if isinstance(arg, str): + return arg + else: + try: + return arg.decode('utf8') + except UnicodeDecodeError: + return arg.decode('charmap') + + +if PY34: + def valid_import(mod_name): + import importlib.util + return importlib.util.find_spec(mod_name) is not None + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + class metaclass(type): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def cstr(arg): + if isinstance(arg, bytes) or arg is None: + return arg + else: + try: + return arg.encode('charmap') + except UnicodeEncodeError: + return arg.encode('utf8') -- cgit v1.3.1