mirror of
https://github.com/python/cpython.git
synced 2025-08-30 05:35:08 +00:00
Merge
This commit is contained in:
commit
7f7902ce9c
15 changed files with 1876 additions and 9766 deletions
|
@ -53,6 +53,10 @@ def get_platform ():
|
|||
return 'win-ia64'
|
||||
return sys.platform
|
||||
|
||||
# Set for cross builds explicitly
|
||||
if "_PYTHON_HOST_PLATFORM" in os.environ:
|
||||
return os.environ["_PYTHON_HOST_PLATFORM"]
|
||||
|
||||
if os.name != "posix" or not hasattr(os, 'uname'):
|
||||
# XXX what about the architecture? NT is Intel or Alpha,
|
||||
# Mac OS is M68k or PPC, etc.
|
||||
|
|
|
@ -138,6 +138,10 @@ if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower():
|
|||
if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower():
|
||||
_PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir))
|
||||
|
||||
# set for cross builds
|
||||
if "_PYTHON_PROJECT_BASE" in os.environ:
|
||||
_PROJECT_BASE = _safe_realpath(os.environ["_PYTHON_PROJECT_BASE"])
|
||||
|
||||
def _is_python_source_dir(d):
|
||||
for fn in ("Setup.dist", "Setup.local"):
|
||||
if os.path.isfile(os.path.join(d, "Modules", fn)):
|
||||
|
@ -673,6 +677,10 @@ def get_platform():
|
|||
# Mac OS is M68k or PPC, etc.
|
||||
return sys.platform
|
||||
|
||||
# Set for cross builds explicitly
|
||||
if "_PYTHON_HOST_PLATFORM" in os.environ:
|
||||
return os.environ["_PYTHON_HOST_PLATFORM"]
|
||||
|
||||
# Try to distinguish various flavours of Unix
|
||||
osname, host, release, version, machine = os.uname()
|
||||
|
||||
|
|
|
@ -34,6 +34,7 @@ MAINCC= @MAINCC@
|
|||
LINKCC= @LINKCC@
|
||||
AR= @AR@
|
||||
RANLIB= @RANLIB@
|
||||
READELF= @READELF@
|
||||
SOABI= @SOABI@
|
||||
LDVERSION= @LDVERSION@
|
||||
HGVERSION= @HGVERSION@
|
||||
|
@ -193,6 +194,10 @@ LIBOBJS= @LIBOBJS@
|
|||
PYTHON= python$(EXE)
|
||||
BUILDPYTHON= python$(BUILDEXE)
|
||||
|
||||
PYTHON_FOR_BUILD=@PYTHON_FOR_BUILD@
|
||||
_PYTHON_HOST_PLATFORM=@_PYTHON_HOST_PLATFORM@
|
||||
HOST_GNU_TYPE= @host@
|
||||
|
||||
# The task to run while instrument when building the profile-opt target
|
||||
PROFILE_TASK= $(srcdir)/Tools/pybench/pybench.py -n 2 --with-gc --with-syscheck
|
||||
#PROFILE_TASK= $(srcdir)/Lib/test/regrtest.py
|
||||
|
@ -445,6 +450,7 @@ build_all_generate_profile:
|
|||
$(MAKE) all CFLAGS="$(CFLAGS) -fprofile-generate" LIBS="$(LIBS) -lgcov"
|
||||
|
||||
run_profile_task:
|
||||
: # FIXME: can't run for a cross build
|
||||
$(RUNSHARED) ./$(BUILDPYTHON) $(PROFILE_TASK)
|
||||
|
||||
build_all_use_profile:
|
||||
|
@ -461,18 +467,17 @@ $(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
|
|||
$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
|
||||
|
||||
platform: $(BUILDPYTHON) $(SYSCONFIGDATA)
|
||||
$(RUNSHARED) ./$(BUILDPYTHON) -E -c 'import sys ; from sysconfig import get_platform ; print(get_platform()+"-"+sys.version[0:3])' >platform
|
||||
$(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from sysconfig import get_platform ; print(get_platform()+"-"+sys.version[0:3])' >platform
|
||||
|
||||
# Generate the sysconfig build-time data
|
||||
$(SYSCONFIGDATA): $(BUILDPYTHON)
|
||||
$(RUNSHARED) ./$(BUILDPYTHON) -SE -m sysconfig --generate-posix-vars
|
||||
$(RUNSHARED) $(PYTHON_FOR_BUILD) -S -m sysconfig --generate-posix-vars
|
||||
|
||||
# Build the shared modules
|
||||
sharedmods: $(BUILDPYTHON) $(SYSCONFIGDATA)
|
||||
@case $$MAKEFLAGS in \
|
||||
*s*) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' ./$(BUILDPYTHON) -E $(srcdir)/setup.py -q build;; \
|
||||
*) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' ./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
|
||||
esac
|
||||
case $$MAKEFLAGS in *s*) quiet=-q; esac; \
|
||||
$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
|
||||
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
|
||||
|
||||
# Build static library
|
||||
# avoid long command lines, same as LIBRARY_OBJS
|
||||
|
@ -1072,25 +1077,25 @@ libinstall: build_all $(srcdir)/Lib/$(PLATDIR) $(srcdir)/Modules/xxmodule.c
|
|||
$(DESTDIR)$(LIBDEST)/distutils/tests ; \
|
||||
fi
|
||||
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
|
||||
./$(BUILDPYTHON) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
|
||||
$(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
|
||||
-d $(LIBDEST) -f \
|
||||
-x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
|
||||
$(DESTDIR)$(LIBDEST)
|
||||
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
|
||||
./$(BUILDPYTHON) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
|
||||
$(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
|
||||
-d $(LIBDEST) -f \
|
||||
-x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
|
||||
$(DESTDIR)$(LIBDEST)
|
||||
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
|
||||
./$(BUILDPYTHON) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
|
||||
$(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
|
||||
-d $(LIBDEST)/site-packages -f \
|
||||
-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
|
||||
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
|
||||
./$(BUILDPYTHON) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
|
||||
$(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
|
||||
-d $(LIBDEST)/site-packages -f \
|
||||
-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
|
||||
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
|
||||
./$(BUILDPYTHON) -Wi -c "import lib2to3.pygram, lib2to3.patcomp;lib2to3.patcomp.PatternCompiler()"
|
||||
$(PYTHON_FOR_BUILD) -Wi -c "import lib2to3.pygram, lib2to3.patcomp;lib2to3.patcomp.PatternCompiler()"
|
||||
|
||||
# Create the PLATDIR source directory, if one wasn't distributed..
|
||||
$(srcdir)/Lib/$(PLATDIR):
|
||||
|
@ -1184,7 +1189,7 @@ libainstall: all python-config
|
|||
# Install the dynamically loadable modules
|
||||
# This goes into $(exec_prefix)
|
||||
sharedinstall: sharedmods
|
||||
$(RUNSHARED) ./$(BUILDPYTHON) -E $(srcdir)/setup.py install \
|
||||
$(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/setup.py install \
|
||||
--prefix=$(prefix) \
|
||||
--install-scripts=$(BINDIR) \
|
||||
--install-platlib=$(DESTSHARED) \
|
||||
|
@ -1256,7 +1261,7 @@ frameworkinstallextras:
|
|||
# This installs a few of the useful scripts in Tools/scripts
|
||||
scriptsinstall:
|
||||
SRCDIR=$(srcdir) $(RUNSHARED) \
|
||||
./$(BUILDPYTHON) $(srcdir)/Tools/scripts/setup.py install \
|
||||
$(PYTHON_FOR_BUILD) $(srcdir)/Tools/scripts/setup.py install \
|
||||
--prefix=$(prefix) \
|
||||
--install-scripts=$(BINDIR) \
|
||||
--root=$(DESTDIR)/
|
||||
|
|
|
@ -42,6 +42,13 @@ Tools/Demos
|
|||
* C frames that are garbage-collecting
|
||||
* C frames that are due to the invocation of a PyCFunction
|
||||
|
||||
Build
|
||||
-----
|
||||
|
||||
- Issue #14330: For cross builds, don't use host python, use host search paths
|
||||
for host compiler.
|
||||
|
||||
|
||||
What's New in Python 3.3.0 Beta 1?
|
||||
==================================
|
||||
|
||||
|
|
9437
Modules/_ctypes/libffi/aclocal.m4
vendored
9437
Modules/_ctypes/libffi/aclocal.m4
vendored
File diff suppressed because it is too large
Load diff
1065
Modules/_ctypes/libffi/configure
vendored
1065
Modules/_ctypes/libffi/configure
vendored
File diff suppressed because it is too large
Load diff
|
@ -3203,7 +3203,8 @@ static PyObject *
|
|||
dec_as_long(PyObject *dec, PyObject *context, int round)
|
||||
{
|
||||
PyLongObject *pylong;
|
||||
size_t maxsize, n;
|
||||
digit *ob_digit;
|
||||
size_t n;
|
||||
Py_ssize_t i;
|
||||
mpd_t *x;
|
||||
mpd_context_t workctx;
|
||||
|
@ -3234,32 +3235,33 @@ dec_as_long(PyObject *dec, PyObject *context, int round)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
maxsize = mpd_sizeinbase(x, PyLong_BASE);
|
||||
if (maxsize > PY_SSIZE_T_MAX) {
|
||||
mpd_del(x);
|
||||
status = 0;
|
||||
ob_digit = NULL;
|
||||
#if PYLONG_BITS_IN_DIGIT == 30
|
||||
n = mpd_qexport_u32(&ob_digit, 0, PyLong_BASE, x, &status);
|
||||
#elif PYLONG_BITS_IN_DIGIT == 15
|
||||
n = mpd_qexport_u16(&ob_digit, 0, PyLong_BASE, x, &status);
|
||||
#else
|
||||
#error "PYLONG_BITS_IN_DIGIT should be 15 or 30"
|
||||
#endif
|
||||
|
||||
if (n == SIZE_MAX) {
|
||||
PyErr_NoMemory();
|
||||
return NULL;
|
||||
}
|
||||
pylong = _PyLong_New(maxsize);
|
||||
if (pylong == NULL) {
|
||||
mpd_del(x);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status = 0;
|
||||
#if PYLONG_BITS_IN_DIGIT == 30
|
||||
n = mpd_qexport_u32(pylong->ob_digit, maxsize, PyLong_BASE, x, &status);
|
||||
#elif PYLONG_BITS_IN_DIGIT == 15
|
||||
n = mpd_qexport_u16(pylong->ob_digit, maxsize, PyLong_BASE, x, &status);
|
||||
#else
|
||||
#error "PYLONG_BITS_IN_DIGIT should be 15 or 30"
|
||||
#endif
|
||||
if (dec_addstatus(context, status)) {
|
||||
Py_DECREF((PyObject *) pylong);
|
||||
assert(n > 0);
|
||||
pylong = _PyLong_New(n);
|
||||
if (pylong == NULL) {
|
||||
mpd_free(ob_digit);
|
||||
mpd_del(x);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memcpy(pylong->ob_digit, ob_digit, n * sizeof(digit));
|
||||
mpd_free(ob_digit);
|
||||
|
||||
i = n;
|
||||
while ((i > 0) && (pylong->ob_digit[i-1] == 0)) {
|
||||
i--;
|
||||
|
|
|
@ -583,8 +583,30 @@ _mpd_shortadd_b(mpd_uint_t *w, mpd_size_t m, mpd_uint_t v, mpd_uint_t b)
|
|||
return carry;
|
||||
}
|
||||
|
||||
/* w := product of u (len n) and v (single word). Return carry. */
|
||||
mpd_uint_t
|
||||
_mpd_shortmul_c(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n, mpd_uint_t v)
|
||||
{
|
||||
mpd_uint_t hi, lo;
|
||||
mpd_uint_t carry = 0;
|
||||
mpd_size_t i;
|
||||
|
||||
assert(n > 0);
|
||||
|
||||
for (i=0; i < n; i++) {
|
||||
|
||||
_mpd_mul_words(&hi, &lo, u[i], v);
|
||||
lo = carry + lo;
|
||||
if (lo < carry) hi++;
|
||||
|
||||
_mpd_div_words_r(&carry, &w[i], hi, lo);
|
||||
}
|
||||
|
||||
return carry;
|
||||
}
|
||||
|
||||
/* w := product of u (len n) and v (single word) */
|
||||
void
|
||||
mpd_uint_t
|
||||
_mpd_shortmul_b(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n,
|
||||
mpd_uint_t v, mpd_uint_t b)
|
||||
{
|
||||
|
@ -602,7 +624,8 @@ _mpd_shortmul_b(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n,
|
|||
|
||||
_mpd_div_words(&carry, &w[i], hi, lo, b);
|
||||
}
|
||||
w[i] = carry;
|
||||
|
||||
return carry;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -49,8 +49,10 @@ void _mpd_basemul(mpd_uint_t *w, const mpd_uint_t *u, const mpd_uint_t *v,
|
|||
mpd_size_t m, mpd_size_t n);
|
||||
void _mpd_shortmul(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n,
|
||||
mpd_uint_t v);
|
||||
void _mpd_shortmul_b(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n,
|
||||
mpd_uint_t v, mpd_uint_t b);
|
||||
mpd_uint_t _mpd_shortmul_c(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n,
|
||||
mpd_uint_t v);
|
||||
mpd_uint_t _mpd_shortmul_b(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n,
|
||||
mpd_uint_t v, mpd_uint_t b);
|
||||
mpd_uint_t _mpd_shortdiv(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n,
|
||||
mpd_uint_t v);
|
||||
mpd_uint_t _mpd_shortdiv_b(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n,
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
#include "bits.h"
|
||||
#include "convolute.h"
|
||||
#include "crt.h"
|
||||
#include "errno.h"
|
||||
#include "memory.h"
|
||||
#include "typearith.h"
|
||||
#include "umodarith.h"
|
||||
|
@ -52,9 +51,6 @@
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__x86_64__) && defined(__GLIBC__) && !defined(__INTEL_COMPILER)
|
||||
#define USE_80BIT_LONG_DOUBLE
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#define ALWAYS_INLINE __forceinline
|
||||
|
@ -7567,270 +7563,449 @@ finish:
|
|||
/* Base conversions */
|
||||
/******************************************************************************/
|
||||
|
||||
/*
|
||||
* Returns the space needed to represent an integer mpd_t in base 'base'.
|
||||
* The result is undefined for non-integers.
|
||||
*
|
||||
* Max space needed:
|
||||
*
|
||||
* base^n >= 10^(digits+exp)
|
||||
* n >= log10(10^(digits+exp))/log10(base) = (digits+exp) / log10(base)
|
||||
*/
|
||||
/* Space needed to represent an integer mpd_t in base 'base'. */
|
||||
size_t
|
||||
mpd_sizeinbase(mpd_t *a, uint32_t base)
|
||||
mpd_sizeinbase(const mpd_t *a, uint32_t base)
|
||||
{
|
||||
size_t x;
|
||||
double x;
|
||||
size_t digits;
|
||||
|
||||
assert(mpd_isinteger(a));
|
||||
assert(base >= 2);
|
||||
|
||||
if (mpd_iszero(a)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
x = a->digits+a->exp;
|
||||
digits = a->digits+a->exp;
|
||||
assert(digits > 0);
|
||||
|
||||
#ifdef CONFIG_64
|
||||
#ifdef USE_80BIT_LONG_DOUBLE
|
||||
return (long double)x / log10(base) + 3;
|
||||
#else
|
||||
/* x > floor(((1ULL<<53)-3) * log10(2)) */
|
||||
if (x > 2711437152599294ULL) {
|
||||
/* ceil(2711437152599294 / log10(2)) + 4 == 2**53 */
|
||||
if (digits > 2711437152599294ULL) {
|
||||
return SIZE_MAX;
|
||||
}
|
||||
return (size_t)((double)x / log10(base) + 3);
|
||||
#endif
|
||||
#else /* CONFIG_32 */
|
||||
{
|
||||
double y = x / log10(base) + 3;
|
||||
return (y > SIZE_MAX) ? SIZE_MAX : (size_t)y;
|
||||
}
|
||||
#endif
|
||||
|
||||
x = (double)digits / log10(base);
|
||||
return (x > SIZE_MAX-1) ? SIZE_MAX : (size_t)x + 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the space needed to import a base 'base' integer of length 'srclen'.
|
||||
*/
|
||||
static inline mpd_ssize_t
|
||||
/* Space needed to import a base 'base' integer of length 'srclen'. */
|
||||
static mpd_ssize_t
|
||||
_mpd_importsize(size_t srclen, uint32_t base)
|
||||
{
|
||||
#if SIZE_MAX == UINT64_MAX
|
||||
#ifdef USE_80BIT_LONG_DOUBLE
|
||||
long double x = (long double)srclen * (log10(base)/MPD_RDIGITS) + 3;
|
||||
#else
|
||||
double x;
|
||||
|
||||
assert(srclen > 0);
|
||||
assert(base >= 2);
|
||||
|
||||
#if SIZE_MAX == UINT64_MAX
|
||||
if (srclen > (1ULL<<53)) {
|
||||
return MPD_SSIZE_MAX;
|
||||
}
|
||||
x = (double)srclen * (log10(base)/MPD_RDIGITS) + 3;
|
||||
#endif
|
||||
#else
|
||||
double x = srclen * (log10(base)/MPD_RDIGITS) + 3;
|
||||
#endif
|
||||
return (x > MPD_MAXIMPORT) ? MPD_SSIZE_MAX : (mpd_ssize_t)x;
|
||||
|
||||
x = (double)srclen * (log10(base)/MPD_RDIGITS);
|
||||
return (x >= MPD_MAXIMPORT) ? MPD_SSIZE_MAX : (mpd_ssize_t)x + 1;
|
||||
}
|
||||
|
||||
static uint8_t
|
||||
mpd_resize_u16(uint16_t **w, size_t nmemb)
|
||||
{
|
||||
uint8_t err = 0;
|
||||
*w = mpd_realloc(*w, nmemb, sizeof **w, &err);
|
||||
return !err;
|
||||
}
|
||||
|
||||
static inline size_t
|
||||
_to_base_u16(uint16_t *w, size_t wlen, mpd_uint_t wbase,
|
||||
mpd_uint_t *u, mpd_ssize_t ulen)
|
||||
static uint8_t
|
||||
mpd_resize_u32(uint32_t **w, size_t nmemb)
|
||||
{
|
||||
uint8_t err = 0;
|
||||
*w = mpd_realloc(*w, nmemb, sizeof **w, &err);
|
||||
return !err;
|
||||
}
|
||||
|
||||
static size_t
|
||||
_baseconv_to_u16(uint16_t **w, size_t wlen, mpd_uint_t wbase,
|
||||
mpd_uint_t *u, mpd_ssize_t ulen)
|
||||
{
|
||||
size_t n = 0;
|
||||
|
||||
assert(wlen > 0 && ulen > 0);
|
||||
assert(wbase <= (1U<<16));
|
||||
|
||||
do {
|
||||
w[n++] = (uint16_t)_mpd_shortdiv(u, u, ulen, wbase);
|
||||
/* ulen will be at least 1. u[ulen-1] can only be zero if ulen == 1 */
|
||||
if (n >= wlen) {
|
||||
if (!mpd_resize_u16(w, n+1)) {
|
||||
return SIZE_MAX;
|
||||
}
|
||||
wlen = n+1;
|
||||
}
|
||||
(*w)[n++] = (uint16_t)_mpd_shortdiv(u, u, ulen, wbase);
|
||||
/* ulen is at least 1. u[ulen-1] can only be zero if ulen == 1. */
|
||||
ulen = _mpd_real_size(u, ulen);
|
||||
|
||||
} while (u[ulen-1] != 0 && n < wlen);
|
||||
|
||||
/* proper termination condition */
|
||||
assert(u[ulen-1] == 0);
|
||||
} while (u[ulen-1] != 0);
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
static inline void
|
||||
_from_base_u16(mpd_uint_t *w, mpd_ssize_t wlen,
|
||||
const mpd_uint_t *u, size_t ulen, uint32_t ubase)
|
||||
static size_t
|
||||
_coeff_from_u16(mpd_t *w, mpd_ssize_t wlen,
|
||||
const mpd_uint_t *u, size_t ulen, uint32_t ubase,
|
||||
uint32_t *status)
|
||||
{
|
||||
mpd_ssize_t m = 1;
|
||||
mpd_ssize_t n = 0;
|
||||
mpd_uint_t carry;
|
||||
|
||||
assert(wlen > 0 && ulen > 0);
|
||||
assert(ubase <= (1U<<16));
|
||||
|
||||
w[0] = u[--ulen];
|
||||
while (--ulen != SIZE_MAX && m < wlen) {
|
||||
_mpd_shortmul(w, w, m, ubase);
|
||||
m = _mpd_real_size(w, m+1);
|
||||
carry = _mpd_shortadd(w, m, u[ulen]);
|
||||
if (carry) w[m++] = carry;
|
||||
w->data[n++] = u[--ulen];
|
||||
while (--ulen != SIZE_MAX) {
|
||||
carry = _mpd_shortmul_c(w->data, w->data, n, ubase);
|
||||
if (carry) {
|
||||
if (n >= wlen) {
|
||||
if (!mpd_qresize(w, n+1, status)) {
|
||||
return SIZE_MAX;
|
||||
}
|
||||
wlen = n+1;
|
||||
}
|
||||
w->data[n++] = carry;
|
||||
}
|
||||
carry = _mpd_shortadd(w->data, n, u[ulen]);
|
||||
if (carry) {
|
||||
if (n >= wlen) {
|
||||
if (!mpd_qresize(w, n+1, status)) {
|
||||
return SIZE_MAX;
|
||||
}
|
||||
wlen = n+1;
|
||||
}
|
||||
w->data[n++] = carry;
|
||||
}
|
||||
}
|
||||
|
||||
/* proper termination condition */
|
||||
assert(ulen == SIZE_MAX);
|
||||
return n;
|
||||
}
|
||||
|
||||
/* target base wbase <= source base ubase */
|
||||
static inline size_t
|
||||
_baseconv_to_smaller(uint32_t *w, size_t wlen, mpd_uint_t wbase,
|
||||
/* target base wbase < source base ubase */
|
||||
static size_t
|
||||
_baseconv_to_smaller(uint32_t **w, size_t wlen, uint32_t wbase,
|
||||
mpd_uint_t *u, mpd_ssize_t ulen, mpd_uint_t ubase)
|
||||
{
|
||||
size_t n = 0;
|
||||
|
||||
assert(wlen > 0 && ulen > 0);
|
||||
assert(wbase < ubase);
|
||||
|
||||
do {
|
||||
w[n++] = (uint32_t)_mpd_shortdiv_b(u, u, ulen, wbase, ubase);
|
||||
/* ulen will be at least 1. u[ulen-1] can only be zero if ulen == 1 */
|
||||
if (n >= wlen) {
|
||||
if (!mpd_resize_u32(w, n+1)) {
|
||||
return SIZE_MAX;
|
||||
}
|
||||
wlen = n+1;
|
||||
}
|
||||
(*w)[n++] = (uint32_t)_mpd_shortdiv_b(u, u, ulen, wbase, ubase);
|
||||
/* ulen is at least 1. u[ulen-1] can only be zero if ulen == 1. */
|
||||
ulen = _mpd_real_size(u, ulen);
|
||||
|
||||
} while (u[ulen-1] != 0 && n < wlen);
|
||||
|
||||
/* proper termination condition */
|
||||
assert(u[ulen-1] == 0);
|
||||
} while (u[ulen-1] != 0);
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
/* target base wbase >= source base ubase */
|
||||
static inline void
|
||||
_baseconv_to_larger(mpd_uint_t *w, mpd_ssize_t wlen, mpd_uint_t wbase,
|
||||
#ifdef CONFIG_32
|
||||
/* target base 'wbase' == source base 'ubase' */
|
||||
static size_t
|
||||
_copy_equal_base(uint32_t **w, size_t wlen,
|
||||
const uint32_t *u, size_t ulen)
|
||||
{
|
||||
if (wlen < ulen) {
|
||||
if (!mpd_resize_u32(w, ulen)) {
|
||||
return SIZE_MAX;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(*w, u, ulen * (sizeof **w));
|
||||
return ulen;
|
||||
}
|
||||
|
||||
/* target base 'wbase' > source base 'ubase' */
|
||||
static size_t
|
||||
_baseconv_to_larger(uint32_t **w, size_t wlen, mpd_uint_t wbase,
|
||||
const mpd_uint_t *u, size_t ulen, mpd_uint_t ubase)
|
||||
{
|
||||
mpd_ssize_t m = 1;
|
||||
size_t n = 0;
|
||||
mpd_uint_t carry;
|
||||
|
||||
assert(wlen > 0 && ulen > 0);
|
||||
assert(ubase < wbase);
|
||||
|
||||
w[0] = u[--ulen];
|
||||
while (--ulen != SIZE_MAX && m < wlen) {
|
||||
_mpd_shortmul_b(w, w, m, ubase, wbase);
|
||||
m = _mpd_real_size(w, m+1);
|
||||
carry = _mpd_shortadd_b(w, m, u[ulen], wbase);
|
||||
if (carry) w[m++] = carry;
|
||||
(*w)[n++] = u[--ulen];
|
||||
while (--ulen != SIZE_MAX) {
|
||||
carry = _mpd_shortmul_b(*w, *w, n, ubase, wbase);
|
||||
if (carry) {
|
||||
if (n >= wlen) {
|
||||
if (!mpd_resize_u32(w, n+1)) {
|
||||
return SIZE_MAX;
|
||||
}
|
||||
wlen = n+1;
|
||||
}
|
||||
(*w)[n++] = carry;
|
||||
}
|
||||
carry = _mpd_shortadd_b(*w, n, u[ulen], wbase);
|
||||
if (carry) {
|
||||
if (n >= wlen) {
|
||||
if (!mpd_resize_u32(w, n+1)) {
|
||||
return SIZE_MAX;
|
||||
}
|
||||
wlen = n+1;
|
||||
}
|
||||
(*w)[n++] = carry;
|
||||
}
|
||||
}
|
||||
|
||||
/* proper termination condition */
|
||||
assert(ulen == SIZE_MAX);
|
||||
return n;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Converts an integer mpd_t to a multiprecision integer with
|
||||
* base <= UINT16_MAX+1. The least significant word of the result
|
||||
* is rdata[0].
|
||||
*/
|
||||
size_t
|
||||
mpd_qexport_u16(uint16_t *rdata, size_t rlen, uint32_t rbase,
|
||||
const mpd_t *src, uint32_t *status)
|
||||
/* target base wbase < source base ubase */
|
||||
static size_t
|
||||
_coeff_from_larger_base(mpd_t *w, size_t wlen, mpd_uint_t wbase,
|
||||
mpd_uint_t *u, mpd_ssize_t ulen, mpd_uint_t ubase,
|
||||
uint32_t *status)
|
||||
{
|
||||
mpd_t *tsrc;
|
||||
size_t n;
|
||||
size_t n = 0;
|
||||
|
||||
assert(rbase <= (1U<<16));
|
||||
assert(rlen <= SIZE_MAX/(sizeof *rdata));
|
||||
assert(wlen > 0 && ulen > 0);
|
||||
assert(wbase < ubase);
|
||||
|
||||
if (mpd_isspecial(src) || !_mpd_isint(src)) {
|
||||
*status |= MPD_Invalid_operation;
|
||||
return SIZE_MAX;
|
||||
}
|
||||
|
||||
memset(rdata, 0, rlen * (sizeof *rdata));
|
||||
|
||||
if (mpd_iszero(src)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ((tsrc = mpd_qnew()) == NULL) {
|
||||
*status |= MPD_Malloc_error;
|
||||
return SIZE_MAX;
|
||||
}
|
||||
|
||||
if (src->exp >= 0) {
|
||||
if (!mpd_qshiftl(tsrc, src, src->exp, status)) {
|
||||
mpd_del(tsrc);
|
||||
return SIZE_MAX;
|
||||
do {
|
||||
if (n >= wlen) {
|
||||
if (!mpd_qresize(w, n+1, status)) {
|
||||
return SIZE_MAX;
|
||||
}
|
||||
wlen = n+1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (mpd_qshiftr(tsrc, src, -src->exp, status) == MPD_UINT_MAX) {
|
||||
mpd_del(tsrc);
|
||||
return SIZE_MAX;
|
||||
w->data[n++] = (uint32_t)_mpd_shortdiv_b(u, u, ulen, wbase, ubase);
|
||||
/* ulen is at least 1. u[ulen-1] can only be zero if ulen == 1. */
|
||||
ulen = _mpd_real_size(u, ulen);
|
||||
|
||||
} while (u[ulen-1] != 0);
|
||||
|
||||
return n;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* target base 'wbase' > source base 'ubase' */
|
||||
static size_t
|
||||
_coeff_from_smaller_base(mpd_t *w, mpd_ssize_t wlen, mpd_uint_t wbase,
|
||||
const uint32_t *u, size_t ulen, mpd_uint_t ubase,
|
||||
uint32_t *status)
|
||||
{
|
||||
mpd_ssize_t n = 0;
|
||||
mpd_uint_t carry;
|
||||
|
||||
assert(wlen > 0 && ulen > 0);
|
||||
assert(wbase > ubase);
|
||||
|
||||
w->data[n++] = u[--ulen];
|
||||
while (--ulen != SIZE_MAX) {
|
||||
carry = _mpd_shortmul_b(w->data, w->data, n, ubase, wbase);
|
||||
if (carry) {
|
||||
if (n >= wlen) {
|
||||
if (!mpd_qresize(w, n+1, status)) {
|
||||
return SIZE_MAX;
|
||||
}
|
||||
wlen = n+1;
|
||||
}
|
||||
w->data[n++] = carry;
|
||||
}
|
||||
carry = _mpd_shortadd_b(w->data, n, u[ulen], wbase);
|
||||
if (carry) {
|
||||
if (n >= wlen) {
|
||||
if (!mpd_qresize(w, n+1, status)) {
|
||||
return SIZE_MAX;
|
||||
}
|
||||
wlen = n+1;
|
||||
}
|
||||
w->data[n++] = carry;
|
||||
}
|
||||
}
|
||||
|
||||
n = _to_base_u16(rdata, rlen, rbase, tsrc->data, tsrc->len);
|
||||
|
||||
mpd_del(tsrc);
|
||||
return n;
|
||||
}
|
||||
|
||||
/*
|
||||
* Converts an integer mpd_t to a multiprecision integer with
|
||||
* base <= UINT32_MAX. The least significant word of the result
|
||||
* is rdata[0].
|
||||
* Convert an integer mpd_t to a multiprecision integer with base <= 2**16.
|
||||
* The least significant word of the result is (*rdata)[0].
|
||||
*
|
||||
* If rdata is NULL, space is allocated by the function and rlen is irrelevant.
|
||||
* In case of an error any allocated storage is freed and rdata is set back to
|
||||
* NULL.
|
||||
*
|
||||
* If rdata is non-NULL, it MUST be allocated by one of libmpdec's allocation
|
||||
* functions and rlen MUST be correct. If necessary, the function will resize
|
||||
* rdata. In case of an error the caller must free rdata.
|
||||
*
|
||||
* Return value: In case of success, the exact length of rdata, SIZE_MAX
|
||||
* otherwise.
|
||||
*/
|
||||
size_t
|
||||
mpd_qexport_u32(uint32_t *rdata, size_t rlen, uint32_t rbase,
|
||||
mpd_qexport_u16(uint16_t **rdata, size_t rlen, uint32_t rbase,
|
||||
const mpd_t *src, uint32_t *status)
|
||||
{
|
||||
mpd_t *tsrc;
|
||||
MPD_NEW_STATIC(tsrc,0,0,0,0);
|
||||
int alloc = 0; /* rdata == NULL */
|
||||
size_t n;
|
||||
|
||||
assert(rbase <= (1U<<16));
|
||||
|
||||
if (mpd_isspecial(src) || !_mpd_isint(src)) {
|
||||
*status |= MPD_Invalid_operation;
|
||||
return SIZE_MAX;
|
||||
}
|
||||
|
||||
if (*rdata == NULL) {
|
||||
rlen = mpd_sizeinbase(src, rbase);
|
||||
if (rlen == SIZE_MAX) {
|
||||
*status |= MPD_Invalid_operation;
|
||||
return SIZE_MAX;
|
||||
}
|
||||
*rdata = mpd_alloc(rlen, sizeof **rdata);
|
||||
if (*rdata == NULL) {
|
||||
goto malloc_error;
|
||||
}
|
||||
alloc = 1;
|
||||
}
|
||||
|
||||
if (mpd_iszero(src)) {
|
||||
**rdata = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (src->exp >= 0) {
|
||||
if (!mpd_qshiftl(&tsrc, src, src->exp, status)) {
|
||||
goto malloc_error;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (mpd_qshiftr(&tsrc, src, -src->exp, status) == MPD_UINT_MAX) {
|
||||
goto malloc_error;
|
||||
}
|
||||
}
|
||||
|
||||
n = _baseconv_to_u16(rdata, rlen, rbase, tsrc.data, tsrc.len);
|
||||
if (n == SIZE_MAX) {
|
||||
goto malloc_error;
|
||||
}
|
||||
|
||||
|
||||
out:
|
||||
mpd_del(&tsrc);
|
||||
return n;
|
||||
|
||||
malloc_error:
|
||||
if (alloc) {
|
||||
mpd_free(*rdata);
|
||||
*rdata = NULL;
|
||||
}
|
||||
n = SIZE_MAX;
|
||||
*status |= MPD_Malloc_error;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert an integer mpd_t to a multiprecision integer with base<=UINT32_MAX.
|
||||
* The least significant word of the result is (*rdata)[0].
|
||||
*
|
||||
* If rdata is NULL, space is allocated by the function and rlen is irrelevant.
|
||||
* In case of an error any allocated storage is freed and rdata is set back to
|
||||
* NULL.
|
||||
*
|
||||
* If rdata is non-NULL, it MUST be allocated by one of libmpdec's allocation
|
||||
* functions and rlen MUST be correct. If necessary, the function will resize
|
||||
* rdata. In case of an error the caller must free rdata.
|
||||
*
|
||||
* Return value: In case of success, the exact length of rdata, SIZE_MAX
|
||||
* otherwise.
|
||||
*/
|
||||
size_t
|
||||
mpd_qexport_u32(uint32_t **rdata, size_t rlen, uint32_t rbase,
|
||||
const mpd_t *src, uint32_t *status)
|
||||
{
|
||||
MPD_NEW_STATIC(tsrc,0,0,0,0);
|
||||
int alloc = 0; /* rdata == NULL */
|
||||
size_t n;
|
||||
|
||||
if (mpd_isspecial(src) || !_mpd_isint(src)) {
|
||||
*status |= MPD_Invalid_operation;
|
||||
return SIZE_MAX;
|
||||
}
|
||||
#if MPD_SIZE_MAX < SIZE_MAX
|
||||
if (rlen > MPD_SSIZE_MAX) {
|
||||
*status |= MPD_Invalid_operation;
|
||||
return SIZE_MAX;
|
||||
}
|
||||
#endif
|
||||
|
||||
assert(rlen <= SIZE_MAX/(sizeof *rdata));
|
||||
memset(rdata, 0, rlen * (sizeof *rdata));
|
||||
if (*rdata == NULL) {
|
||||
rlen = mpd_sizeinbase(src, rbase);
|
||||
if (rlen == SIZE_MAX) {
|
||||
*status |= MPD_Invalid_operation;
|
||||
return SIZE_MAX;
|
||||
}
|
||||
*rdata = mpd_alloc(rlen, sizeof **rdata);
|
||||
if (*rdata == NULL) {
|
||||
goto malloc_error;
|
||||
}
|
||||
alloc = 1;
|
||||
}
|
||||
|
||||
if (mpd_iszero(src)) {
|
||||
**rdata = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ((tsrc = mpd_qnew()) == NULL) {
|
||||
*status |= MPD_Malloc_error;
|
||||
return SIZE_MAX;
|
||||
}
|
||||
|
||||
if (src->exp >= 0) {
|
||||
if (!mpd_qshiftl(tsrc, src, src->exp, status)) {
|
||||
mpd_del(tsrc);
|
||||
return SIZE_MAX;
|
||||
if (!mpd_qshiftl(&tsrc, src, src->exp, status)) {
|
||||
goto malloc_error;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (mpd_qshiftr(tsrc, src, -src->exp, status) == MPD_UINT_MAX) {
|
||||
mpd_del(tsrc);
|
||||
return SIZE_MAX;
|
||||
if (mpd_qshiftr(&tsrc, src, -src->exp, status) == MPD_UINT_MAX) {
|
||||
goto malloc_error;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_64
|
||||
n = _baseconv_to_smaller(rdata, rlen, rbase,
|
||||
tsrc->data, tsrc->len, MPD_RADIX);
|
||||
tsrc.data, tsrc.len, MPD_RADIX);
|
||||
#else
|
||||
if (rbase <= MPD_RADIX) {
|
||||
if (rbase == MPD_RADIX) {
|
||||
n = _copy_equal_base(rdata, rlen, tsrc.data, tsrc.len);
|
||||
}
|
||||
else if (rbase < MPD_RADIX) {
|
||||
n = _baseconv_to_smaller(rdata, rlen, rbase,
|
||||
tsrc->data, tsrc->len, MPD_RADIX);
|
||||
tsrc.data, tsrc.len, MPD_RADIX);
|
||||
}
|
||||
else {
|
||||
_baseconv_to_larger(rdata, (mpd_ssize_t)rlen, rbase,
|
||||
tsrc->data, tsrc->len, MPD_RADIX);
|
||||
n = _mpd_real_size(rdata, (mpd_ssize_t)rlen);
|
||||
n = _baseconv_to_larger(rdata, rlen, rbase,
|
||||
tsrc.data, tsrc.len, MPD_RADIX);
|
||||
}
|
||||
#endif
|
||||
|
||||
mpd_del(tsrc);
|
||||
if (n == SIZE_MAX) {
|
||||
goto malloc_error;
|
||||
}
|
||||
|
||||
|
||||
out:
|
||||
mpd_del(&tsrc);
|
||||
return n;
|
||||
|
||||
malloc_error:
|
||||
if (alloc) {
|
||||
mpd_free(*rdata);
|
||||
*rdata = NULL;
|
||||
}
|
||||
n = SIZE_MAX;
|
||||
*status |= MPD_Malloc_error;
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
|
@ -7846,20 +8021,19 @@ mpd_qimport_u16(mpd_t *result,
|
|||
{
|
||||
mpd_uint_t *usrc; /* uint16_t src copied to an mpd_uint_t array */
|
||||
mpd_ssize_t rlen; /* length of the result */
|
||||
size_t n = 0;
|
||||
size_t n;
|
||||
|
||||
assert(srclen > 0);
|
||||
assert(srcbase <= (1U<<16));
|
||||
|
||||
if ((rlen = _mpd_importsize(srclen, srcbase)) == MPD_SSIZE_MAX) {
|
||||
rlen = _mpd_importsize(srclen, srcbase);
|
||||
if (rlen == MPD_SSIZE_MAX) {
|
||||
mpd_seterror(result, MPD_Invalid_operation, status);
|
||||
return;
|
||||
}
|
||||
if (srclen > MPD_SIZE_MAX/(sizeof *usrc)) {
|
||||
mpd_seterror(result, MPD_Invalid_operation, status);
|
||||
return;
|
||||
}
|
||||
if ((usrc = mpd_alloc((mpd_size_t)srclen, sizeof *usrc)) == NULL) {
|
||||
|
||||
usrc = mpd_alloc((mpd_size_t)srclen, sizeof *usrc);
|
||||
if (usrc == NULL) {
|
||||
mpd_seterror(result, MPD_Malloc_error, status);
|
||||
return;
|
||||
}
|
||||
|
@ -7867,16 +8041,18 @@ mpd_qimport_u16(mpd_t *result,
|
|||
usrc[n] = srcdata[n];
|
||||
}
|
||||
|
||||
/* result->data is initialized to zero */
|
||||
if (!mpd_qresize_zero(result, rlen, status)) {
|
||||
if (!mpd_qresize(result, rlen, status)) {
|
||||
goto finish;
|
||||
}
|
||||
|
||||
_from_base_u16(result->data, rlen, usrc, srclen, srcbase);
|
||||
n = _coeff_from_u16(result, rlen, usrc, srclen, srcbase, status);
|
||||
if (n == SIZE_MAX) {
|
||||
goto finish;
|
||||
}
|
||||
|
||||
mpd_set_flags(result, srcsign);
|
||||
result->exp = 0;
|
||||
result->len = _mpd_real_size(result->data, rlen);
|
||||
result->len = n;
|
||||
mpd_setdigits(result);
|
||||
|
||||
mpd_qresize(result, result->len, status);
|
||||
|
@ -7897,58 +8073,66 @@ mpd_qimport_u32(mpd_t *result,
|
|||
uint8_t srcsign, uint32_t srcbase,
|
||||
const mpd_context_t *ctx, uint32_t *status)
|
||||
{
|
||||
mpd_uint_t *usrc; /* uint32_t src copied to an mpd_uint_t array */
|
||||
mpd_ssize_t rlen; /* length of the result */
|
||||
size_t n = 0;
|
||||
size_t n;
|
||||
|
||||
assert(srclen > 0);
|
||||
|
||||
if ((rlen = _mpd_importsize(srclen, srcbase)) == MPD_SSIZE_MAX) {
|
||||
rlen = _mpd_importsize(srclen, srcbase);
|
||||
if (rlen == MPD_SSIZE_MAX) {
|
||||
mpd_seterror(result, MPD_Invalid_operation, status);
|
||||
return;
|
||||
}
|
||||
if (srclen > MPD_SIZE_MAX/(sizeof *usrc)) {
|
||||
mpd_seterror(result, MPD_Invalid_operation, status);
|
||||
return;
|
||||
}
|
||||
if ((usrc = mpd_alloc((mpd_size_t)srclen, sizeof *usrc)) == NULL) {
|
||||
mpd_seterror(result, MPD_Malloc_error, status);
|
||||
return;
|
||||
}
|
||||
for (n = 0; n < srclen; n++) {
|
||||
usrc[n] = srcdata[n];
|
||||
}
|
||||
|
||||
/* result->data is initialized to zero */
|
||||
if (!mpd_qresize_zero(result, rlen, status)) {
|
||||
goto finish;
|
||||
if (!mpd_qresize(result, rlen, status)) {
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_64
|
||||
_baseconv_to_larger(result->data, rlen, MPD_RADIX,
|
||||
usrc, srclen, srcbase);
|
||||
n = _coeff_from_smaller_base(result, rlen, MPD_RADIX,
|
||||
srcdata, srclen, srcbase,
|
||||
status);
|
||||
#else
|
||||
if (srcbase <= MPD_RADIX) {
|
||||
_baseconv_to_larger(result->data, rlen, MPD_RADIX,
|
||||
usrc, srclen, srcbase);
|
||||
if (srcbase == MPD_RADIX) {
|
||||
if (!mpd_qresize(result, srclen, status)) {
|
||||
return;
|
||||
}
|
||||
memcpy(result->data, srcdata, srclen * (sizeof *srcdata));
|
||||
n = srclen;
|
||||
}
|
||||
else if (srcbase < MPD_RADIX) {
|
||||
n = _coeff_from_smaller_base(result, rlen, MPD_RADIX,
|
||||
srcdata, srclen, srcbase,
|
||||
status);
|
||||
}
|
||||
else {
|
||||
_baseconv_to_smaller(result->data, rlen, MPD_RADIX,
|
||||
usrc, (mpd_ssize_t)srclen, srcbase);
|
||||
mpd_uint_t *usrc = mpd_alloc((mpd_size_t)srclen, sizeof *usrc);
|
||||
if (usrc == NULL) {
|
||||
mpd_seterror(result, MPD_Malloc_error, status);
|
||||
return;
|
||||
}
|
||||
for (n = 0; n < srclen; n++) {
|
||||
usrc[n] = srcdata[n];
|
||||
}
|
||||
|
||||
n = _coeff_from_larger_base(result, rlen, MPD_RADIX,
|
||||
usrc, (mpd_ssize_t)srclen, srcbase,
|
||||
status);
|
||||
mpd_free(usrc);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (n == SIZE_MAX) {
|
||||
return;
|
||||
}
|
||||
|
||||
mpd_set_flags(result, srcsign);
|
||||
result->exp = 0;
|
||||
result->len = _mpd_real_size(result->data, rlen);
|
||||
result->len = n;
|
||||
mpd_setdigits(result);
|
||||
|
||||
mpd_qresize(result, result->len, status);
|
||||
mpd_qfinalize(result, ctx, status);
|
||||
|
||||
|
||||
finish:
|
||||
mpd_free(usrc);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -511,16 +511,16 @@ void mpd_qsqrt(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t
|
|||
void mpd_qinvroot(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);
|
||||
|
||||
|
||||
size_t mpd_sizeinbase(mpd_t *a, uint32_t base);
|
||||
size_t mpd_sizeinbase(const mpd_t *a, uint32_t base);
|
||||
void mpd_qimport_u16(mpd_t *result, const uint16_t *srcdata, size_t srclen,
|
||||
uint8_t srcsign, uint32_t srcbase,
|
||||
const mpd_context_t *ctx, uint32_t *status);
|
||||
void mpd_qimport_u32(mpd_t *result, const uint32_t *srcdata, size_t srclen,
|
||||
uint8_t srcsign, uint32_t srcbase,
|
||||
const mpd_context_t *ctx, uint32_t *status);
|
||||
size_t mpd_qexport_u16(uint16_t *rdata, size_t rlen, uint32_t base,
|
||||
size_t mpd_qexport_u16(uint16_t **rdata, size_t rlen, uint32_t base,
|
||||
const mpd_t *src, uint32_t *status);
|
||||
size_t mpd_qexport_u32(uint32_t *rdata, size_t rlen, uint32_t base,
|
||||
size_t mpd_qexport_u32(uint32_t **rdata, size_t rlen, uint32_t base,
|
||||
const mpd_t *src, uint32_t *status);
|
||||
|
||||
|
||||
|
@ -531,8 +531,8 @@ size_t mpd_qexport_u32(uint32_t *rdata, size_t rlen, uint32_t base,
|
|||
char * mpd_format(const mpd_t *dec, const char *fmt, mpd_context_t *ctx);
|
||||
void mpd_import_u16(mpd_t *result, const uint16_t *srcdata, size_t srclen, uint8_t srcsign, uint32_t base, mpd_context_t *ctx);
|
||||
void mpd_import_u32(mpd_t *result, const uint32_t *srcdata, size_t srclen, uint8_t srcsign, uint32_t base, mpd_context_t *ctx);
|
||||
size_t mpd_export_u16(uint16_t *rdata, size_t rlen, uint32_t base, const mpd_t *src, mpd_context_t *ctx);
|
||||
size_t mpd_export_u32(uint32_t *rdata, size_t rlen, uint32_t base, const mpd_t *src, mpd_context_t *ctx);
|
||||
size_t mpd_export_u16(uint16_t **rdata, size_t rlen, uint32_t base, const mpd_t *src, mpd_context_t *ctx);
|
||||
size_t mpd_export_u32(uint32_t **rdata, size_t rlen, uint32_t base, const mpd_t *src, mpd_context_t *ctx);
|
||||
void mpd_finalize(mpd_t *result, mpd_context_t *ctx);
|
||||
int mpd_check_nan(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);
|
||||
int mpd_check_nans(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);
|
||||
|
|
232
configure
vendored
232
configure
vendored
|
@ -646,6 +646,8 @@ INSTALL_SCRIPT
|
|||
INSTALL_PROGRAM
|
||||
HAS_PYTHON
|
||||
DISABLE_ASDLGEN
|
||||
ac_ct_READELF
|
||||
READELF
|
||||
ARFLAGS
|
||||
ac_ct_AR
|
||||
AR
|
||||
|
@ -680,6 +682,7 @@ CC
|
|||
EXPORT_MACOSX_DEPLOYMENT_TARGET
|
||||
CONFIGURE_MACOSX_DEPLOYMENT_TARGET
|
||||
SGI_ABI
|
||||
_PYTHON_HOST_PLATFORM
|
||||
MACHDEP
|
||||
FRAMEWORKINSTALLAPPSPREFIX
|
||||
FRAMEWORKUNIXTOOLSPREFIX
|
||||
|
@ -698,6 +701,7 @@ UNIVERSALSDK
|
|||
CONFIG_ARGS
|
||||
SOVERSION
|
||||
VERSION
|
||||
PYTHON_FOR_BUILD
|
||||
host_os
|
||||
host_vendor
|
||||
host_cpu
|
||||
|
@ -2878,6 +2882,29 @@ case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
|
|||
|
||||
|
||||
|
||||
if test "$cross_compiling" = yes; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for python interpreter for cross build" >&5
|
||||
$as_echo_n "checking for python interpreter for cross build... " >&6; }
|
||||
if test -z "$PYTHON_FOR_BUILD"; then
|
||||
for interp in python$PACKAGE_VERSION python3 python; do
|
||||
which $interp >/dev/null 2>&1 || continue
|
||||
if $interp -c 'import sys;sys.exit(not sys.version_info[:2] >= (3,3))'; then
|
||||
break
|
||||
fi
|
||||
interp=
|
||||
done
|
||||
if test x$interp = x; then
|
||||
as_fn_error $? "python$PACKAGE_VERSION interpreter not found" "$LINENO" 5
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $interp" >&5
|
||||
$as_echo "$interp" >&6; }
|
||||
PYTHON_FOR_BUILD="_PYTHON_PROJECT_BASE=$srcdir"' _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(srcdir)/Lib:$(srcdir)/Lib/plat-$(MACHDEP) '$interp
|
||||
fi
|
||||
else
|
||||
PYTHON_FOR_BUILD='./$(BUILDPYTHON) -E'
|
||||
fi
|
||||
|
||||
|
||||
|
||||
if test "$prefix" != "/"; then
|
||||
prefix=`echo "$prefix" | sed -e 's/\/$//g'`
|
||||
|
@ -3216,6 +3243,29 @@ then
|
|||
esac
|
||||
fi
|
||||
|
||||
|
||||
if test "$cross_compiling" = yes; then
|
||||
case "$host" in
|
||||
*-*-linux*)
|
||||
case "$host_cpu" in
|
||||
arm*)
|
||||
_host_cpu=arm
|
||||
;;
|
||||
*)
|
||||
_host_cpu=$host_cpu
|
||||
esac
|
||||
;;
|
||||
*-*-cygwin*)
|
||||
_host_cpu=
|
||||
;;
|
||||
*)
|
||||
# for now, limit cross builds to known configurations
|
||||
MACHDEP="unknown"
|
||||
as_fn_error $? "cross build not supported for $host" "$LINENO" 5
|
||||
esac
|
||||
_PYTHON_HOST_PLATFORM="$MACHDEP${_host_cpu:+-$_host_cpu}"
|
||||
fi
|
||||
|
||||
# Some systems cannot stand _XOPEN_SOURCE being defined at all; they
|
||||
# disable features if it is defined, without any means to access these
|
||||
# features as extensions. For these systems, we skip the definition of
|
||||
|
@ -5538,6 +5588,10 @@ else # shared is disabled
|
|||
esac
|
||||
fi
|
||||
|
||||
if test "$cross_compiling" = yes; then
|
||||
RUNSHARED=
|
||||
fi
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $LDLIBRARY" >&5
|
||||
$as_echo "$LDLIBRARY" >&6; }
|
||||
|
||||
|
@ -5742,6 +5796,115 @@ then
|
|||
ARFLAGS="rc"
|
||||
fi
|
||||
|
||||
if test -n "$ac_tool_prefix"; then
|
||||
for ac_prog in readelf
|
||||
do
|
||||
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
|
||||
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
$as_echo_n "checking for $ac_word... " >&6; }
|
||||
if ${ac_cv_prog_READELF+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
if test -n "$READELF"; then
|
||||
ac_cv_prog_READELF="$READELF" # Let the user override the test.
|
||||
else
|
||||
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
for as_dir in $PATH
|
||||
do
|
||||
IFS=$as_save_IFS
|
||||
test -z "$as_dir" && as_dir=.
|
||||
for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
|
||||
ac_cv_prog_READELF="$ac_tool_prefix$ac_prog"
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
break 2
|
||||
fi
|
||||
done
|
||||
done
|
||||
IFS=$as_save_IFS
|
||||
|
||||
fi
|
||||
fi
|
||||
READELF=$ac_cv_prog_READELF
|
||||
if test -n "$READELF"; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $READELF" >&5
|
||||
$as_echo "$READELF" >&6; }
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
fi
|
||||
|
||||
|
||||
test -n "$READELF" && break
|
||||
done
|
||||
fi
|
||||
if test -z "$READELF"; then
|
||||
ac_ct_READELF=$READELF
|
||||
for ac_prog in readelf
|
||||
do
|
||||
# Extract the first word of "$ac_prog", so it can be a program name with args.
|
||||
set dummy $ac_prog; ac_word=$2
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
$as_echo_n "checking for $ac_word... " >&6; }
|
||||
if ${ac_cv_prog_ac_ct_READELF+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
if test -n "$ac_ct_READELF"; then
|
||||
ac_cv_prog_ac_ct_READELF="$ac_ct_READELF" # Let the user override the test.
|
||||
else
|
||||
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
for as_dir in $PATH
|
||||
do
|
||||
IFS=$as_save_IFS
|
||||
test -z "$as_dir" && as_dir=.
|
||||
for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
|
||||
ac_cv_prog_ac_ct_READELF="$ac_prog"
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
break 2
|
||||
fi
|
||||
done
|
||||
done
|
||||
IFS=$as_save_IFS
|
||||
|
||||
fi
|
||||
fi
|
||||
ac_ct_READELF=$ac_cv_prog_ac_ct_READELF
|
||||
if test -n "$ac_ct_READELF"; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_READELF" >&5
|
||||
$as_echo "$ac_ct_READELF" >&6; }
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
fi
|
||||
|
||||
|
||||
test -n "$ac_ct_READELF" && break
|
||||
done
|
||||
|
||||
if test "x$ac_ct_READELF" = x; then
|
||||
READELF=":"
|
||||
else
|
||||
case $cross_compiling:$ac_tool_warned in
|
||||
yes:)
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
|
||||
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
|
||||
ac_tool_warned=yes ;;
|
||||
esac
|
||||
READELF=$ac_ct_READELF
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$cross_compiling" = yes; then
|
||||
case "$READELF" in
|
||||
readelf|:)
|
||||
as_fn_error $? "readelf for the host is required for cross builds" "$LINENO" 5
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
|
||||
|
||||
DISABLE_ASDLGEN=""
|
||||
# Extract the first word of "python", so it can be a program name with args.
|
||||
|
@ -14341,34 +14504,73 @@ $as_echo "no" >&6; }
|
|||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for device files" >&5
|
||||
$as_echo "$as_me: checking for device files" >&6;}
|
||||
|
||||
if test "x$cross_compiling" = xyes; then
|
||||
if test "${ac_cv_file__dev_ptmx+set}" != set; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptmx" >&5
|
||||
$as_echo_n "checking for /dev/ptmx... " >&6; }
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not set" >&5
|
||||
$as_echo "not set" >&6; }
|
||||
as_fn_error $? "set ac_cv_file__dev_ptmx to yes/no in your CONFIG_SITE file when cross compiling" "$LINENO" 5
|
||||
fi
|
||||
if test "${ac_cv_file__dev_ptc+set}" != set; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptc" >&5
|
||||
$as_echo_n "checking for /dev/ptc... " >&6; }
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not set" >&5
|
||||
$as_echo "not set" >&6; }
|
||||
as_fn_error $? "set ac_cv_file__dev_ptc to yes/no in your CONFIG_SITE file when cross compiling" "$LINENO" 5
|
||||
fi
|
||||
fi
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptmx" >&5
|
||||
$as_echo_n "checking for /dev/ptmx... " >&6; }
|
||||
if ${ac_cv_file__dev_ptmx+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
test "$cross_compiling" = yes &&
|
||||
as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5
|
||||
if test -r "/dev/ptmx"; then
|
||||
ac_cv_file__dev_ptmx=yes
|
||||
else
|
||||
ac_cv_file__dev_ptmx=no
|
||||
fi
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file__dev_ptmx" >&5
|
||||
$as_echo "$ac_cv_file__dev_ptmx" >&6; }
|
||||
if test "x$ac_cv_file__dev_ptmx" = xyes; then :
|
||||
|
||||
if test -r /dev/ptmx
|
||||
then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
$as_echo "yes" >&6; }
|
||||
fi
|
||||
|
||||
if test "x$ac_cv_file__dev_ptmx" = xyes; then
|
||||
|
||||
$as_echo "#define HAVE_DEV_PTMX 1" >>confdefs.h
|
||||
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
fi
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptc" >&5
|
||||
$as_echo_n "checking for /dev/ptc... " >&6; }
|
||||
if ${ac_cv_file__dev_ptc+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
test "$cross_compiling" = yes &&
|
||||
as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5
|
||||
if test -r "/dev/ptc"; then
|
||||
ac_cv_file__dev_ptc=yes
|
||||
else
|
||||
ac_cv_file__dev_ptc=no
|
||||
fi
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file__dev_ptc" >&5
|
||||
$as_echo "$ac_cv_file__dev_ptc" >&6; }
|
||||
if test "x$ac_cv_file__dev_ptc" = xyes; then :
|
||||
|
||||
if test -r /dev/ptc
|
||||
then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
$as_echo "yes" >&6; }
|
||||
fi
|
||||
|
||||
if test "x$ac_cv_file__dev_ptc" = xyes; then
|
||||
|
||||
$as_echo "#define HAVE_DEV_PTC 1" >>confdefs.h
|
||||
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
fi
|
||||
|
||||
if test "$have_long_long" = yes
|
||||
|
|
95
configure.ac
95
configure.ac
|
@ -35,6 +35,27 @@ AC_CONFIG_HEADER(pyconfig.h)
|
|||
|
||||
AC_CANONICAL_HOST
|
||||
|
||||
if test "$cross_compiling" = yes; then
|
||||
AC_MSG_CHECKING([for python interpreter for cross build])
|
||||
if test -z "$PYTHON_FOR_BUILD"; then
|
||||
for interp in python$PACKAGE_VERSION python3 python; do
|
||||
which $interp >/dev/null 2>&1 || continue
|
||||
if $interp -c 'import sys;sys.exit(not sys.version_info@<:@:2@:>@ >= (3,3))'; then
|
||||
break
|
||||
fi
|
||||
interp=
|
||||
done
|
||||
if test x$interp = x; then
|
||||
AC_MSG_ERROR([python$PACKAGE_VERSION interpreter not found])
|
||||
fi
|
||||
AC_MSG_RESULT($interp)
|
||||
PYTHON_FOR_BUILD="_PYTHON_PROJECT_BASE=$srcdir"' _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(srcdir)/Lib:$(srcdir)/Lib/plat-$(MACHDEP) '$interp
|
||||
fi
|
||||
else
|
||||
PYTHON_FOR_BUILD='./$(BUILDPYTHON) -E'
|
||||
fi
|
||||
AC_SUBST(PYTHON_FOR_BUILD)
|
||||
|
||||
dnl Ensure that if prefix is specified, it does not end in a slash. If
|
||||
dnl it does, we get path names containing '//' which is both ugly and
|
||||
dnl can cause trouble.
|
||||
|
@ -352,6 +373,29 @@ then
|
|||
'') MACHDEP="unknown";;
|
||||
esac
|
||||
fi
|
||||
|
||||
AC_SUBST(_PYTHON_HOST_PLATFORM)
|
||||
if test "$cross_compiling" = yes; then
|
||||
case "$host" in
|
||||
*-*-linux*)
|
||||
case "$host_cpu" in
|
||||
arm*)
|
||||
_host_cpu=arm
|
||||
;;
|
||||
*)
|
||||
_host_cpu=$host_cpu
|
||||
esac
|
||||
;;
|
||||
*-*-cygwin*)
|
||||
_host_cpu=
|
||||
;;
|
||||
*)
|
||||
# for now, limit cross builds to known configurations
|
||||
MACHDEP="unknown"
|
||||
AC_MSG_ERROR([cross build not supported for $host])
|
||||
esac
|
||||
_PYTHON_HOST_PLATFORM="$MACHDEP${_host_cpu:+-$_host_cpu}"
|
||||
fi
|
||||
|
||||
# Some systems cannot stand _XOPEN_SOURCE being defined at all; they
|
||||
# disable features if it is defined, without any means to access these
|
||||
|
@ -913,6 +957,10 @@ else # shared is disabled
|
|||
esac
|
||||
fi
|
||||
|
||||
if test "$cross_compiling" = yes; then
|
||||
RUNSHARED=
|
||||
fi
|
||||
|
||||
AC_MSG_RESULT($LDLIBRARY)
|
||||
|
||||
AC_PROG_RANLIB
|
||||
|
@ -926,6 +974,16 @@ then
|
|||
ARFLAGS="rc"
|
||||
fi
|
||||
|
||||
AC_CHECK_TOOLS([READELF], [readelf], [:])
|
||||
if test "$cross_compiling" = yes; then
|
||||
case "$READELF" in
|
||||
readelf|:)
|
||||
AC_MSG_ERROR([readelf for the host is required for cross builds])
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
AC_SUBST(READELF)
|
||||
|
||||
AC_SUBST(DISABLE_ASDLGEN)
|
||||
DISABLE_ASDLGEN=""
|
||||
AC_CHECK_PROG(HAS_PYTHON, python, found, not-found)
|
||||
|
@ -4202,26 +4260,31 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <curses.h>]], [[void *x=resizeterm
|
|||
[AC_MSG_RESULT(no)]
|
||||
)
|
||||
|
||||
AC_MSG_CHECKING(for /dev/ptmx)
|
||||
AC_MSG_NOTICE([checking for device files])
|
||||
|
||||
if test -r /dev/ptmx
|
||||
then
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_DEV_PTMX, 1,
|
||||
[Define if we have /dev/ptmx.])
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
dnl NOTE: Inform user how to proceed with files when cross compiling.
|
||||
if test "x$cross_compiling" = xyes; then
|
||||
if test "${ac_cv_file__dev_ptmx+set}" != set; then
|
||||
AC_MSG_CHECKING([for /dev/ptmx])
|
||||
AC_MSG_RESULT([not set])
|
||||
AC_MSG_ERROR([set ac_cv_file__dev_ptmx to yes/no in your CONFIG_SITE file when cross compiling])
|
||||
fi
|
||||
if test "${ac_cv_file__dev_ptc+set}" != set; then
|
||||
AC_MSG_CHECKING([for /dev/ptc])
|
||||
AC_MSG_RESULT([not set])
|
||||
AC_MSG_ERROR([set ac_cv_file__dev_ptc to yes/no in your CONFIG_SITE file when cross compiling])
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING(for /dev/ptc)
|
||||
|
||||
if test -r /dev/ptc
|
||||
then
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_CHECK_FILE(/dev/ptmx, [], [])
|
||||
if test "x$ac_cv_file__dev_ptmx" = xyes; then
|
||||
AC_DEFINE(HAVE_DEV_PTMX, 1,
|
||||
[Define to 1 if you have the /dev/ptmx device file.])
|
||||
fi
|
||||
AC_CHECK_FILE(/dev/ptc, [], [])
|
||||
if test "x$ac_cv_file__dev_ptc" = xyes; then
|
||||
AC_DEFINE(HAVE_DEV_PTC, 1,
|
||||
[Define if we have /dev/ptc.])
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
[Define to 1 if you have the /dev/ptc device file.])
|
||||
fi
|
||||
|
||||
if test "$have_long_long" = yes
|
||||
|
|
|
@ -168,10 +168,10 @@
|
|||
/* Define to 1 if you have the device macros. */
|
||||
#undef HAVE_DEVICE_MACROS
|
||||
|
||||
/* Define if we have /dev/ptc. */
|
||||
/* Define to 1 if you have the /dev/ptc device file. */
|
||||
#undef HAVE_DEV_PTC
|
||||
|
||||
/* Define if we have /dev/ptmx. */
|
||||
/* Define to 1 if you have the /dev/ptmx device file. */
|
||||
#undef HAVE_DEV_PTMX
|
||||
|
||||
/* Define to 1 if you have the <direct.h> header file. */
|
||||
|
|
104
setup.py
104
setup.py
|
@ -15,7 +15,12 @@ from distutils.command.install_lib import install_lib
|
|||
from distutils.command.build_scripts import build_scripts
|
||||
from distutils.spawn import find_executable
|
||||
|
||||
cross_compiling = "_PYTHON_HOST_PLATFORM" in os.environ
|
||||
|
||||
def get_platform():
|
||||
# cross build
|
||||
if "_PYTHON_HOST_PLATFORM" in os.environ:
|
||||
return os.environ["_PYTHON_HOST_PLATFORM"]
|
||||
# Get value of sys.platform
|
||||
if sys.platform.startswith('osf1'):
|
||||
return 'osf1'
|
||||
|
@ -23,7 +28,7 @@ def get_platform():
|
|||
host_platform = get_platform()
|
||||
|
||||
# Were we compiled --with-pydebug or with #define Py_DEBUG?
|
||||
COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount')
|
||||
COMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_ARGS"))
|
||||
|
||||
# This global variable is used to hold the list of modules to be disabled.
|
||||
disabled_module_list = []
|
||||
|
@ -334,6 +339,10 @@ class PyBuildExt(build_ext):
|
|||
# cached. Clear that cache before trying to import.
|
||||
sys.path_importer_cache.clear()
|
||||
|
||||
# Don't try to load extensions for cross builds
|
||||
if cross_compiling:
|
||||
return
|
||||
|
||||
try:
|
||||
imp.load_dynamic(ext.name, ext_filename)
|
||||
except ImportError as why:
|
||||
|
@ -370,12 +379,15 @@ class PyBuildExt(build_ext):
|
|||
# https://wiki.ubuntu.com/MultiarchSpec
|
||||
if not find_executable('dpkg-architecture'):
|
||||
return
|
||||
opt = ''
|
||||
if cross_compiling:
|
||||
opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
|
||||
tmpfile = os.path.join(self.build_temp, 'multiarch')
|
||||
if not os.path.exists(self.build_temp):
|
||||
os.makedirs(self.build_temp)
|
||||
ret = os.system(
|
||||
'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
|
||||
tmpfile)
|
||||
'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
|
||||
(opt, tmpfile))
|
||||
try:
|
||||
if ret >> 8 == 0:
|
||||
with open(tmpfile) as fp:
|
||||
|
@ -387,12 +399,46 @@ class PyBuildExt(build_ext):
|
|||
finally:
|
||||
os.unlink(tmpfile)
|
||||
|
||||
def add_gcc_paths(self):
|
||||
gcc = sysconfig.get_config_var('CC')
|
||||
tmpfile = os.path.join(self.build_temp, 'gccpaths')
|
||||
if not os.path.exists(self.build_temp):
|
||||
os.makedirs(self.build_temp)
|
||||
ret = os.system('%s -E -v - </dev/null 2>%s 1>/dev/null' % (gcc, tmpfile))
|
||||
is_gcc = False
|
||||
in_incdirs = False
|
||||
inc_dirs = []
|
||||
lib_dirs = []
|
||||
try:
|
||||
if ret >> 8 == 0:
|
||||
with open(tmpfile) as fp:
|
||||
for line in fp.readlines():
|
||||
if line.startswith("gcc version"):
|
||||
is_gcc = True
|
||||
elif line.startswith("#include <...>"):
|
||||
in_incdirs = True
|
||||
elif line.startswith("End of search list"):
|
||||
in_incdirs = False
|
||||
elif is_gcc and line.startswith("LIBRARY_PATH"):
|
||||
for d in line.strip().split("=")[1].split(":"):
|
||||
d = os.path.normpath(d)
|
||||
if '/gcc/' not in d:
|
||||
add_dir_to_list(self.compiler.library_dirs,
|
||||
d)
|
||||
elif is_gcc and in_incdirs and '/gcc/' not in line:
|
||||
add_dir_to_list(self.compiler.include_dirs,
|
||||
line.strip())
|
||||
finally:
|
||||
os.unlink(tmpfile)
|
||||
|
||||
def detect_modules(self):
|
||||
# Ensure that /usr/local is always used, but the local build
|
||||
# directories (i.e. '.' and 'Include') must be first. See issue
|
||||
# 10520.
|
||||
add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
|
||||
add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
|
||||
if not cross_compiling:
|
||||
add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
|
||||
add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
|
||||
self.add_gcc_paths()
|
||||
self.add_multiarch_paths()
|
||||
|
||||
# Add paths specified in the environment variables LDFLAGS and
|
||||
|
@ -443,11 +489,18 @@ class PyBuildExt(build_ext):
|
|||
# lib_dirs and inc_dirs are used to search for files;
|
||||
# if a file is found in one of those directories, it can
|
||||
# be assumed that no additional -I,-L directives are needed.
|
||||
lib_dirs = self.compiler.library_dirs + [
|
||||
'/lib64', '/usr/lib64',
|
||||
'/lib', '/usr/lib',
|
||||
]
|
||||
inc_dirs = self.compiler.include_dirs + ['/usr/include']
|
||||
inc_dirs = self.compiler.include_dirs[:]
|
||||
lib_dirs = self.compiler.library_dirs[:]
|
||||
if not cross_compiling:
|
||||
for d in (
|
||||
'/usr/include',
|
||||
):
|
||||
add_dir_to_list(inc_dirs, d)
|
||||
for d in (
|
||||
'/lib64', '/usr/lib64',
|
||||
'/lib', '/usr/lib',
|
||||
):
|
||||
add_dir_to_list(lib_dirs, d)
|
||||
exts = []
|
||||
missing = []
|
||||
|
||||
|
@ -590,13 +643,20 @@ class PyBuildExt(build_ext):
|
|||
do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
|
||||
readline_termcap_library = ""
|
||||
curses_library = ""
|
||||
# Cannot use os.popen here in py3k.
|
||||
tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
|
||||
if not os.path.exists(self.build_temp):
|
||||
os.makedirs(self.build_temp)
|
||||
# Determine if readline is already linked against curses or tinfo.
|
||||
if do_readline and find_executable('ldd'):
|
||||
# Cannot use os.popen here in py3k.
|
||||
tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
|
||||
if not os.path.exists(self.build_temp):
|
||||
os.makedirs(self.build_temp)
|
||||
ret = os.system("ldd %s > %s" % (do_readline, tmpfile))
|
||||
if do_readline:
|
||||
if cross_compiling:
|
||||
ret = os.system("%s -d %s | grep '(NEEDED)' > %s" \
|
||||
% (sysconfig.get_config_var('READELF'),
|
||||
do_readline, tmpfile))
|
||||
elif find_executable('ldd'):
|
||||
ret = os.system("ldd %s > %s" % (do_readline, tmpfile))
|
||||
else:
|
||||
ret = 256
|
||||
if ret == 0:
|
||||
with open(tmpfile) as fp:
|
||||
for ln in fp:
|
||||
|
@ -830,6 +890,9 @@ class PyBuildExt(build_ext):
|
|||
db_inc_paths.append('/pkg/db-3.%d/include' % x)
|
||||
db_inc_paths.append('/opt/db-3.%d/include' % x)
|
||||
|
||||
if cross_compiling:
|
||||
db_inc_paths = []
|
||||
|
||||
# Add some common subdirectories for Sleepycat DB to the list,
|
||||
# based on the standard include directories. This way DB3/4 gets
|
||||
# picked up when it is installed in a non-standard prefix and
|
||||
|
@ -966,7 +1029,9 @@ class PyBuildExt(build_ext):
|
|||
'/usr/local/include',
|
||||
'/usr/local/include/sqlite',
|
||||
'/usr/local/include/sqlite3',
|
||||
]
|
||||
]
|
||||
if cross_compiling:
|
||||
sqlite_inc_paths = []
|
||||
MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
|
||||
MIN_SQLITE_VERSION = ".".join([str(x)
|
||||
for x in MIN_SQLITE_VERSION_NUMBER])
|
||||
|
@ -1701,7 +1766,8 @@ class PyBuildExt(build_ext):
|
|||
ffi_configfile):
|
||||
from distutils.dir_util import mkpath
|
||||
mkpath(ffi_builddir)
|
||||
config_args = []
|
||||
config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split()
|
||||
if (('--host=' in arg) or ('--build=' in arg))]
|
||||
|
||||
# Pass empty CFLAGS because we'll just append the resulting
|
||||
# CFLAGS to Python's; -g or -O2 is to be avoided.
|
||||
|
@ -1811,7 +1877,7 @@ class PyBuildExt(build_ext):
|
|||
|
||||
def _decimal_ext(self):
|
||||
extra_compile_args = []
|
||||
undef_macros=['NDEBUG']
|
||||
undef_macros = ['NDEBUG']
|
||||
if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
|
||||
include_dirs = []
|
||||
libraries = ['mpdec']
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue