Merged revisions 59541-59561 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r59544 | raymond.hettinger | 2007-12-18 01:13:45 +0100 (Tue, 18 Dec 2007) | 1 line Add more namedtuple() test cases. Neaten the code and comments. ........ r59545 | christian.heimes | 2007-12-18 04:38:03 +0100 (Tue, 18 Dec 2007) | 3 lines Fixed for #1601: IDLE not working correctly on Windows (Py30a2/IDLE30a1) Amaury's ideas works great. Should we build the Python core with WINVER=0x0500 and _WIN32_WINNT=0x0500, too? ........ r59546 | christian.heimes | 2007-12-18 10:00:13 +0100 (Tue, 18 Dec 2007) | 1 line Make it a bit easier to test Tcl/Tk and idle from a build dir. ........ r59547 | christian.heimes | 2007-12-18 10:12:10 +0100 (Tue, 18 Dec 2007) | 1 line Removed several unused files from the PCbuild9 directory. They are relics from the past. ........ r59548 | raymond.hettinger | 2007-12-18 19:26:18 +0100 (Tue, 18 Dec 2007) | 29 lines Speed-up dictionary constructor by about 10%. New opcode, STORE_MAP saves the compiler from awkward stack manipulations and specializes for dicts using PyDict_SetItem instead of PyObject_SetItem. Old disassembly: 0 BUILD_MAP 0 3 DUP_TOP 4 LOAD_CONST 1 (1) 7 ROT_TWO 8 LOAD_CONST 2 ('x') 11 STORE_SUBSCR 12 DUP_TOP 13 LOAD_CONST 3 (2) 16 ROT_TWO 17 LOAD_CONST 4 ('y') 20 STORE_SUBSCR New disassembly: 0 BUILD_MAP 0 3 LOAD_CONST 1 (1) 6 LOAD_CONST 2 ('x') 9 STORE_MAP 10 LOAD_CONST 3 (2) 13 LOAD_CONST 4 ('y') 16 STORE_MAP ........ r59549 | thomas.heller | 2007-12-18 20:00:34 +0100 (Tue, 18 Dec 2007) | 2 lines Issue #1642: Fix segfault in ctypes when trying to delete attributes. ........ r59551 | guido.van.rossum | 2007-12-18 21:10:42 +0100 (Tue, 18 Dec 2007) | 2 lines Issue #1645 by Alberto Bertogli. Fix a comment. ........ r59553 | raymond.hettinger | 2007-12-18 22:24:09 +0100 (Tue, 18 Dec 2007) | 12 lines Give meaning to the oparg for BUILD_MAP: estimated size of the dictionary. Allows dictionaries to be pre-sized (upto 255 elements) saving time lost to re-sizes with their attendant mallocs and re-insertions. Has zero effect on small dictionaries (5 elements or fewer), a slight benefit for dicts upto 22 elements (because they had to resize once anyway), and more benefit for dicts upto 255 elements (saving multiple resizes during the build-up and reducing the number of collisions on the first insertions). Beyond 255 elements, there is no addional benefit. ........ r59554 | christian.heimes | 2007-12-18 22:56:09 +0100 (Tue, 18 Dec 2007) | 1 line Fixed #1649: IDLE error: dictionary changed size during iteration ........ r59557 | raymond.hettinger | 2007-12-18 23:21:27 +0100 (Tue, 18 Dec 2007) | 1 line Simplify and speedup _asdict() for named tuples. ........ r59558 | christian.heimes | 2007-12-19 00:22:54 +0100 (Wed, 19 Dec 2007) | 3 lines Applied patch #1635: Float patch for inf and nan on Windows (and other platforms). The patch unifies float("inf") and repr(float("inf")) on all platforms. ........ r59559 | raymond.hettinger | 2007-12-19 00:51:15 +0100 (Wed, 19 Dec 2007) | 1 line Users demand iterable input for named tuples. The author capitulates. ........ r59560 | raymond.hettinger | 2007-12-19 01:21:06 +0100 (Wed, 19 Dec 2007) | 1 line Beef-up tests for dict literals ........ r59561 | raymond.hettinger | 2007-12-19 01:27:21 +0100 (Wed, 19 Dec 2007) | 1 line Zap a duplicate line ........
This commit is contained in:
parent
2c18161606
commit
99170a5dbf
|
@ -1047,6 +1047,22 @@ The following functions provide locale-independent string to number conversions.
|
||||||
|
|
||||||
See the Unix man page :manpage:`atof(2)` for details.
|
See the Unix man page :manpage:`atof(2)` for details.
|
||||||
|
|
||||||
|
|
||||||
|
.. cfunction:: char * PyOS_stricmp(char *s1, char *s2)
|
||||||
|
|
||||||
|
Case insensitive comparsion of strings. The functions works almost
|
||||||
|
identical to :cfunc:`strcmp` except that it ignores the case.
|
||||||
|
|
||||||
|
.. versionadded:: 2.6
|
||||||
|
|
||||||
|
|
||||||
|
.. cfunction:: char * PyOS_strnicmp(char *s1, char *s2, Py_ssize_t size)
|
||||||
|
|
||||||
|
Case insensitive comparsion of strings. The functions works almost
|
||||||
|
identical to :cfunc:`strncmp` except that it ignores the case.
|
||||||
|
|
||||||
|
.. versionadded:: 2.6
|
||||||
|
|
||||||
|
|
||||||
.. _reflection:
|
.. _reflection:
|
||||||
|
|
||||||
|
|
|
@ -421,27 +421,31 @@ Example::
|
||||||
|
|
||||||
__slots__ = ()
|
__slots__ = ()
|
||||||
|
|
||||||
_fields = ('x', 'y')
|
|
||||||
|
|
||||||
def __new__(cls, x, y):
|
def __new__(cls, x, y):
|
||||||
return tuple.__new__(cls, (x, y))
|
return tuple.__new__(cls, (x, y))
|
||||||
|
|
||||||
|
_cast = classmethod(tuple.__new__)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return 'Point(x=%r, y=%r)' % self
|
return 'Point(x=%r, y=%r)' % self
|
||||||
|
|
||||||
def _asdict(self):
|
def _asdict(t):
|
||||||
'Return a new dict which maps field names to their values'
|
'Return a new dict which maps field names to their values'
|
||||||
return dict(zip(('x', 'y'), self))
|
return {'x': t[0], 'y': t[1]}
|
||||||
|
|
||||||
def _replace(self, **kwds):
|
def _replace(self, **kwds):
|
||||||
'Return a new Point object replacing specified fields with new values'
|
'Return a new Point object replacing specified fields with new values'
|
||||||
return Point(*map(kwds.get, ('x', 'y'), self))
|
return Point._cast(map(kwds.get, ('x', 'y'), self))
|
||||||
|
|
||||||
|
@property
|
||||||
|
def _fields(self):
|
||||||
|
return ('x', 'y')
|
||||||
|
|
||||||
x = property(itemgetter(0))
|
x = property(itemgetter(0))
|
||||||
y = property(itemgetter(1))
|
y = property(itemgetter(1))
|
||||||
|
|
||||||
>>> p = Point(11, y=22) # instantiate with positional or keyword arguments
|
>>> p = Point(11, y=22) # instantiate with positional or keyword arguments
|
||||||
>>> p[0] + p[1] # indexable like the regular tuple (11, 22)
|
>>> p[0] + p[1] # indexable like the plain tuple (11, 22)
|
||||||
33
|
33
|
||||||
>>> x, y = p # unpack like a regular tuple
|
>>> x, y = p # unpack like a regular tuple
|
||||||
>>> x, y
|
>>> x, y
|
||||||
|
@ -456,34 +460,31 @@ by the :mod:`csv` or :mod:`sqlite3` modules::
|
||||||
|
|
||||||
EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
|
EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
|
||||||
|
|
||||||
from itertools import starmap
|
|
||||||
import csv
|
import csv
|
||||||
for record in starmap(EmployeeRecord, csv.reader(open("employees.csv", "rb"))):
|
for emp in map(EmployeeRecord._cast, csv.reader(open("employees.csv", "rb"))):
|
||||||
print(emp.name, emp.title)
|
print(emp.name, emp.title)
|
||||||
|
|
||||||
import sqlite3
|
import sqlite3
|
||||||
conn = sqlite3.connect('/companydata')
|
conn = sqlite3.connect('/companydata')
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
|
cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
|
||||||
for emp in starmap(EmployeeRecord, cursor.fetchall()):
|
for emp in map(EmployeeRecord._cast, cursor.fetchall()):
|
||||||
print emp.name, emp.title
|
print emp.name, emp.title
|
||||||
|
|
||||||
When casting a single record to a named tuple, use the star-operator [#]_ to unpack
|
In addition to the methods inherited from tuples, named tuples support
|
||||||
the values::
|
three additonal methods and a read-only attribute.
|
||||||
|
|
||||||
|
.. method:: namedtuple._cast(iterable)
|
||||||
|
|
||||||
|
Class method returning a new instance taking the positional arguments from the *iterable*.
|
||||||
|
Useful for casting existing sequences and iterables to named tuples:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
>>> t = [11, 22]
|
>>> t = [11, 22]
|
||||||
>>> Point(*t) # the star-operator unpacks any iterable object
|
>>> Point._cast(t)
|
||||||
Point(x=11, y=22)
|
Point(x=11, y=22)
|
||||||
|
|
||||||
When casting a dictionary to a named tuple, use the double-star-operator::
|
|
||||||
|
|
||||||
>>> d = {'x': 11, 'y': 22}
|
|
||||||
>>> Point(**d)
|
|
||||||
Point(x=11, y=22)
|
|
||||||
|
|
||||||
In addition to the methods inherited from tuples, named tuples support
|
|
||||||
two additonal methods and a read-only attribute.
|
|
||||||
|
|
||||||
.. method:: somenamedtuple._asdict()
|
.. method:: somenamedtuple._asdict()
|
||||||
|
|
||||||
Return a new dict which maps field names to their corresponding values:
|
Return a new dict which maps field names to their corresponding values:
|
||||||
|
@ -529,6 +530,12 @@ function:
|
||||||
>>> getattr(p, 'x')
|
>>> getattr(p, 'x')
|
||||||
11
|
11
|
||||||
|
|
||||||
|
When casting a dictionary to a named tuple, use the double-star-operator [#]_::
|
||||||
|
|
||||||
|
>>> d = {'x': 11, 'y': 22}
|
||||||
|
>>> Point(**d)
|
||||||
|
Point(x=11, y=22)
|
||||||
|
|
||||||
Since a named tuple is a regular Python class, it is easy to add or change
|
Since a named tuple is a regular Python class, it is easy to add or change
|
||||||
functionality. For example, the display format can be changed by overriding
|
functionality. For example, the display format can be changed by overriding
|
||||||
the :meth:`__repr__` method:
|
the :meth:`__repr__` method:
|
||||||
|
@ -551,5 +558,5 @@ and customizing it with :meth:`_replace`:
|
||||||
|
|
||||||
.. rubric:: Footnotes
|
.. rubric:: Footnotes
|
||||||
|
|
||||||
.. [#] For information on the star-operator see
|
.. [#] For information on the double-star-operator see
|
||||||
:ref:`tut-unpacking-arguments` and :ref:`calls`.
|
:ref:`tut-unpacking-arguments` and :ref:`calls`.
|
||||||
|
|
|
@ -435,7 +435,8 @@ available. They are listed here in alphabetical order.
|
||||||
|
|
||||||
Convert a string or a number to floating point. If the argument is a string, it
|
Convert a string or a number to floating point. If the argument is a string, it
|
||||||
must contain a possibly signed decimal or floating point number, possibly
|
must contain a possibly signed decimal or floating point number, possibly
|
||||||
embedded in whitespace. Otherwise, the argument may be an integer
|
embedded in whitespace. The argument may also be [+|-]nan or [+|-]inf.
|
||||||
|
Otherwise, the argument may be a plain integer
|
||||||
or a floating point number, and a floating point number with the same value
|
or a floating point number, and a floating point number with the same value
|
||||||
(within Python's floating point precision) is returned. If no argument is
|
(within Python's floating point precision) is returned. If no argument is
|
||||||
given, returns ``0.0``.
|
given, returns ``0.0``.
|
||||||
|
@ -447,9 +448,10 @@ available. They are listed here in alphabetical order.
|
||||||
single: Infinity
|
single: Infinity
|
||||||
|
|
||||||
When passing in a string, values for NaN and Infinity may be returned, depending
|
When passing in a string, values for NaN and Infinity may be returned, depending
|
||||||
on the underlying C library. The specific set of strings accepted which cause
|
on the underlying C library. Float accepts the strings nan, inf and -inf for
|
||||||
these values to be returned depends entirely on the C library and is known to
|
NaN and positive or negative infinity. The case and a leading + are ignored as
|
||||||
vary.
|
well as a leading - is ignored for NaN. Float always represents NaN and infinity
|
||||||
|
as nan, inf or -inf.
|
||||||
|
|
||||||
The float type is described in :ref:`typesnumeric`.
|
The float type is described in :ref:`typesnumeric`.
|
||||||
|
|
||||||
|
|
|
@ -285,7 +285,7 @@ numeric operations have a higher priority than comparison operations):
|
||||||
+---------------------+---------------------------------+-------+--------------------+
|
+---------------------+---------------------------------+-------+--------------------+
|
||||||
| ``int(x)`` | *x* converted to integer | \(3) | :func:`int` |
|
| ``int(x)`` | *x* converted to integer | \(3) | :func:`int` |
|
||||||
+---------------------+---------------------------------+-------+--------------------+
|
+---------------------+---------------------------------+-------+--------------------+
|
||||||
| ``float(x)`` | *x* converted to floating point | | :func:`float` |
|
| ``float(x)`` | *x* converted to floating point | \(6) | :func:`float` |
|
||||||
+---------------------+---------------------------------+-------+--------------------+
|
+---------------------+---------------------------------+-------+--------------------+
|
||||||
| ``complex(re, im)`` | a complex number with real part | | :func:`complex` |
|
| ``complex(re, im)`` | a complex number with real part | | :func:`complex` |
|
||||||
| | *re*, imaginary part *im*. | | |
|
| | *re*, imaginary part *im*. | | |
|
||||||
|
@ -329,6 +329,13 @@ Notes:
|
||||||
as in C; see functions :func:`floor` and :func:`ceil` in the :mod:`math` module
|
as in C; see functions :func:`floor` and :func:`ceil` in the :mod:`math` module
|
||||||
for well-defined conversions.
|
for well-defined conversions.
|
||||||
|
|
||||||
|
(6)
|
||||||
|
float also accepts the strings "nan" and "inf" with an optional prefix "+"
|
||||||
|
or "-" for Not a Number (NaN) and positive or negative infinity.
|
||||||
|
|
||||||
|
.. versionadded:: 2.6
|
||||||
|
|
||||||
|
|
||||||
.. % XXXJH exceptions: overflow (when? what operations?) zerodivision
|
.. % XXXJH exceptions: overflow (when? what operations?) zerodivision
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -114,6 +114,7 @@
|
||||||
#include "eval.h"
|
#include "eval.h"
|
||||||
|
|
||||||
#include "pystrtod.h"
|
#include "pystrtod.h"
|
||||||
|
#include "pystrcmp.h"
|
||||||
|
|
||||||
/* _Py_Mangle is defined in compile.c */
|
/* _Py_Mangle is defined in compile.c */
|
||||||
PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name);
|
PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name);
|
||||||
|
|
|
@ -123,6 +123,7 @@ PyAPI_FUNC(Py_ssize_t) PyDict_Size(PyObject *mp);
|
||||||
PyAPI_FUNC(PyObject *) PyDict_Copy(PyObject *mp);
|
PyAPI_FUNC(PyObject *) PyDict_Copy(PyObject *mp);
|
||||||
PyAPI_FUNC(int) PyDict_Contains(PyObject *mp, PyObject *key);
|
PyAPI_FUNC(int) PyDict_Contains(PyObject *mp, PyObject *key);
|
||||||
PyAPI_FUNC(int) _PyDict_Contains(PyObject *mp, PyObject *key, long hash);
|
PyAPI_FUNC(int) _PyDict_Contains(PyObject *mp, PyObject *key, long hash);
|
||||||
|
PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused);
|
||||||
|
|
||||||
/* PyDict_Update(mp, other) is equivalent to PyDict_Merge(mp, other, 1). */
|
/* PyDict_Update(mp, other) is equivalent to PyDict_Merge(mp, other, 1). */
|
||||||
PyAPI_FUNC(int) PyDict_Update(PyObject *mp, PyObject *other);
|
PyAPI_FUNC(int) PyDict_Update(PyObject *mp, PyObject *other);
|
||||||
|
|
|
@ -36,6 +36,7 @@ extern "C" {
|
||||||
#define INPLACE_FLOOR_DIVIDE 28
|
#define INPLACE_FLOOR_DIVIDE 28
|
||||||
#define INPLACE_TRUE_DIVIDE 29
|
#define INPLACE_TRUE_DIVIDE 29
|
||||||
|
|
||||||
|
#define STORE_MAP 54
|
||||||
#define INPLACE_ADD 55
|
#define INPLACE_ADD 55
|
||||||
#define INPLACE_SUBTRACT 56
|
#define INPLACE_SUBTRACT 56
|
||||||
#define INPLACE_MULTIPLY 57
|
#define INPLACE_MULTIPLY 57
|
||||||
|
|
|
@ -332,6 +332,17 @@ extern "C" {
|
||||||
#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE)
|
#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* High precision defintion of pi and e (Euler)
|
||||||
|
* The values are taken from libc6's math.h.
|
||||||
|
*/
|
||||||
|
#ifndef Py_MATH_PI
|
||||||
|
#define Py_MATH_PI 3.1415926535897932384626433832795029L
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef Py_MATH_E
|
||||||
|
#define Py_MATH_E 2.7182818284590452353602874713526625L
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Py_IS_NAN(X)
|
/* Py_IS_NAN(X)
|
||||||
* Return 1 if float or double arg is a NaN, else 0.
|
* Return 1 if float or double arg is a NaN, else 0.
|
||||||
* Caution:
|
* Caution:
|
||||||
|
@ -341,8 +352,12 @@ extern "C" {
|
||||||
* a platform where it doesn't work.
|
* a platform where it doesn't work.
|
||||||
*/
|
*/
|
||||||
#ifndef Py_IS_NAN
|
#ifndef Py_IS_NAN
|
||||||
|
#ifdef HAVE_ISNAN
|
||||||
|
#define Py_IS_NAN(X) isnan(X)
|
||||||
|
#else
|
||||||
#define Py_IS_NAN(X) ((X) != (X))
|
#define Py_IS_NAN(X) ((X) != (X))
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Py_IS_INFINITY(X)
|
/* Py_IS_INFINITY(X)
|
||||||
* Return 1 if float or double arg is an infinity, else 0.
|
* Return 1 if float or double arg is an infinity, else 0.
|
||||||
|
@ -353,8 +368,12 @@ extern "C" {
|
||||||
* Override in pyconfig.h if you have a better spelling on your platform.
|
* Override in pyconfig.h if you have a better spelling on your platform.
|
||||||
*/
|
*/
|
||||||
#ifndef Py_IS_INFINITY
|
#ifndef Py_IS_INFINITY
|
||||||
|
#ifdef HAVE_ISINF
|
||||||
|
#define Py_IS_INFINITY(X) isinf(X)
|
||||||
|
#else
|
||||||
#define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (X))
|
#define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (X))
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Py_IS_FINITE(X)
|
/* Py_IS_FINITE(X)
|
||||||
* Return 1 if float or double arg is neither infinite nor NAN, else 0.
|
* Return 1 if float or double arg is neither infinite nor NAN, else 0.
|
||||||
|
@ -362,8 +381,12 @@ extern "C" {
|
||||||
* macro for this particular test is useful
|
* macro for this particular test is useful
|
||||||
*/
|
*/
|
||||||
#ifndef Py_IS_FINITE
|
#ifndef Py_IS_FINITE
|
||||||
|
#ifdef HAVE_ISFINITE
|
||||||
|
#define Py_IS_FINITE(X) isfinite
|
||||||
|
#else
|
||||||
#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X))
|
#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X))
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/* HUGE_VAL is supposed to expand to a positive double infinity. Python
|
/* HUGE_VAL is supposed to expand to a positive double infinity. Python
|
||||||
* uses Py_HUGE_VAL instead because some platforms are broken in this
|
* uses Py_HUGE_VAL instead because some platforms are broken in this
|
||||||
|
@ -376,6 +399,15 @@ extern "C" {
|
||||||
#define Py_HUGE_VAL HUGE_VAL
|
#define Py_HUGE_VAL HUGE_VAL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Py_NAN
|
||||||
|
* A value that evaluates to a NaN. On IEEE 754 platforms INF*0 or
|
||||||
|
* INF/INF works. Define Py_NO_NAN in pyconfig.h if your platform
|
||||||
|
* doesn't support NaNs.
|
||||||
|
*/
|
||||||
|
#if !defined(Py_NAN) && !defined(Py_NO_NAN)
|
||||||
|
#define Py_NAN (Py_HUGE_VAL * 0.)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Py_OVERFLOWED(X)
|
/* Py_OVERFLOWED(X)
|
||||||
* Return 1 iff a libm function overflowed. Set errno to 0 before calling
|
* Return 1 iff a libm function overflowed. Set errno to 0 before calling
|
||||||
* a libm function, and invoke this macro after, passing the function
|
* a libm function, and invoke this macro after, passing the function
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
#ifndef Py_STRCMP_H
|
||||||
|
#define Py_STRCMP_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PyAPI_FUNC(int) PyOS_mystrnicmp(const char *, const char *, Py_ssize_t);
|
||||||
|
PyAPI_FUNC(int) PyOS_mystricmp(const char *, const char *);
|
||||||
|
|
||||||
|
#ifdef MS_WINDOWS
|
||||||
|
#define PyOS_strnicmp strnicmp
|
||||||
|
#define PyOS_stricmp stricmp
|
||||||
|
#else
|
||||||
|
#define PyOS_strnicmp PyOS_mystrnicmp
|
||||||
|
#define PyOS_stricmp PyOS_mystricmp
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !Py_STRCMP_H */
|
|
@ -1,17 +1,15 @@
|
||||||
__all__ = ['deque', 'defaultdict', 'namedtuple']
|
__all__ = ['deque', 'defaultdict', 'namedtuple']
|
||||||
|
|
||||||
from _collections import deque, defaultdict
|
|
||||||
from operator import itemgetter as _itemgetter
|
|
||||||
from itertools import izip as _izip
|
|
||||||
from keyword import iskeyword as _iskeyword
|
|
||||||
import sys as _sys
|
|
||||||
|
|
||||||
# For bootstrapping reasons, the collection ABCs are defined in _abcoll.py.
|
# For bootstrapping reasons, the collection ABCs are defined in _abcoll.py.
|
||||||
# They should however be considered an integral part of collections.py.
|
# They should however be considered an integral part of collections.py.
|
||||||
from _abcoll import *
|
from _abcoll import *
|
||||||
import _abcoll
|
import _abcoll
|
||||||
__all__ += _abcoll.__all__
|
__all__ += _abcoll.__all__
|
||||||
|
|
||||||
|
from _collections import deque, defaultdict
|
||||||
|
from operator import itemgetter as _itemgetter
|
||||||
|
from keyword import iskeyword as _iskeyword
|
||||||
|
import sys as _sys
|
||||||
|
|
||||||
def namedtuple(typename, field_names, verbose=False):
|
def namedtuple(typename, field_names, verbose=False):
|
||||||
"""Returns a new subclass of tuple with named fields.
|
"""Returns a new subclass of tuple with named fields.
|
||||||
|
|
||||||
|
@ -19,9 +17,9 @@ def namedtuple(typename, field_names, verbose=False):
|
||||||
>>> Point.__doc__ # docstring for the new class
|
>>> Point.__doc__ # docstring for the new class
|
||||||
'Point(x, y)'
|
'Point(x, y)'
|
||||||
>>> p = Point(11, y=22) # instantiate with positional args or keywords
|
>>> p = Point(11, y=22) # instantiate with positional args or keywords
|
||||||
>>> p[0] + p[1] # works just like the tuple (11, 22)
|
>>> p[0] + p[1] # indexable like a plain tuple
|
||||||
33
|
33
|
||||||
>>> x, y = p # unpacks just like a tuple
|
>>> x, y = p # unpack like a regular tuple
|
||||||
>>> x, y
|
>>> x, y
|
||||||
(11, 22)
|
(11, 22)
|
||||||
>>> p.x + p.y # fields also accessable by name
|
>>> p.x + p.y # fields also accessable by name
|
||||||
|
@ -58,31 +56,35 @@ def namedtuple(typename, field_names, verbose=False):
|
||||||
# Create and fill-in the class template
|
# Create and fill-in the class template
|
||||||
argtxt = repr(field_names).replace("'", "")[1:-1] # tuple repr without parens or quotes
|
argtxt = repr(field_names).replace("'", "")[1:-1] # tuple repr without parens or quotes
|
||||||
reprtxt = ', '.join('%s=%%r' % name for name in field_names)
|
reprtxt = ', '.join('%s=%%r' % name for name in field_names)
|
||||||
|
dicttxt = ', '.join('%r: t[%d]' % (name, pos) for pos, name in enumerate(field_names))
|
||||||
template = '''class %(typename)s(tuple):
|
template = '''class %(typename)s(tuple):
|
||||||
'%(typename)s(%(argtxt)s)' \n
|
'%(typename)s(%(argtxt)s)' \n
|
||||||
__slots__ = () \n
|
__slots__ = () \n
|
||||||
_fields = property(lambda self: %(field_names)r) \n
|
|
||||||
def __new__(cls, %(argtxt)s):
|
def __new__(cls, %(argtxt)s):
|
||||||
return tuple.__new__(cls, (%(argtxt)s)) \n
|
return tuple.__new__(cls, (%(argtxt)s)) \n
|
||||||
|
_cast = classmethod(tuple.__new__) \n
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return '%(typename)s(%(reprtxt)s)' %% self \n
|
return '%(typename)s(%(reprtxt)s)' %% self \n
|
||||||
def _asdict(self, dict=dict, zip=zip):
|
def _asdict(t):
|
||||||
'Return a new dict which maps field names to their values'
|
'Return a new dict which maps field names to their values'
|
||||||
return dict(zip(%(field_names)r, self)) \n
|
return {%(dicttxt)s} \n
|
||||||
def _replace(self, **kwds):
|
def _replace(self, **kwds):
|
||||||
'Return a new %(typename)s object replacing specified fields with new values'
|
'Return a new %(typename)s object replacing specified fields with new values'
|
||||||
return %(typename)s(*map(kwds.get, %(field_names)r, self)) \n\n''' % locals()
|
return %(typename)s._cast(map(kwds.get, %(field_names)r, self)) \n
|
||||||
|
@property
|
||||||
|
def _fields(self):
|
||||||
|
return %(field_names)r \n\n''' % locals()
|
||||||
for i, name in enumerate(field_names):
|
for i, name in enumerate(field_names):
|
||||||
template += ' %s = property(itemgetter(%d))\n' % (name, i)
|
template += ' %s = property(itemgetter(%d))\n' % (name, i)
|
||||||
if verbose:
|
if verbose:
|
||||||
print(template)
|
print(template)
|
||||||
|
|
||||||
# Execute the template string in a temporary namespace
|
# Execute the template string in a temporary namespace
|
||||||
namespace = dict(itemgetter=_itemgetter, zip=_izip)
|
namespace = dict(itemgetter=_itemgetter)
|
||||||
try:
|
try:
|
||||||
exec(template, namespace)
|
exec(template, namespace)
|
||||||
except SyntaxError as e:
|
except SyntaxError as e:
|
||||||
raise SyntaxError(e.message + ':\n' + template)
|
raise SyntaxError(e.msg + ':\n' + template) from e
|
||||||
result = namespace[typename]
|
result = namespace[typename]
|
||||||
|
|
||||||
# For pickling to work, the __module__ variable needs to be set to the frame
|
# For pickling to work, the __module__ variable needs to be set to the frame
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
import unittest
|
||||||
|
from ctypes import *
|
||||||
|
|
||||||
|
class X(Structure):
|
||||||
|
_fields_ = [("foo", c_int)]
|
||||||
|
|
||||||
|
class TestCase(unittest.TestCase):
|
||||||
|
def test_simple(self):
|
||||||
|
self.assertRaises(TypeError,
|
||||||
|
delattr, c_int(42), "value")
|
||||||
|
|
||||||
|
def test_chararray(self):
|
||||||
|
self.assertRaises(TypeError,
|
||||||
|
delattr, (c_char * 5)(), "value")
|
||||||
|
|
||||||
|
def test_struct(self):
|
||||||
|
self.assertRaises(TypeError,
|
||||||
|
delattr, X(), "foo")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
|
@ -11,6 +11,10 @@ import sys, os
|
||||||
# the real Tcl library will do.
|
# the real Tcl library will do.
|
||||||
|
|
||||||
prefix = os.path.join(sys.prefix,"tcl")
|
prefix = os.path.join(sys.prefix,"tcl")
|
||||||
|
if not os.path.exists(prefix):
|
||||||
|
# devdir/../tcltk/lib
|
||||||
|
prefix = os.path.join(sys.prefix, os.path.pardir, "tcltk", "lib")
|
||||||
|
prefix = os.path.abspath(prefix)
|
||||||
# if this does not exist, no further search is needed
|
# if this does not exist, no further search is needed
|
||||||
if os.path.exists(prefix):
|
if os.path.exists(prefix):
|
||||||
if "TCL_LIBRARY" not in os.environ:
|
if "TCL_LIBRARY" not in os.environ:
|
||||||
|
|
|
@ -71,6 +71,7 @@ def_op('BINARY_TRUE_DIVIDE', 27)
|
||||||
def_op('INPLACE_FLOOR_DIVIDE', 28)
|
def_op('INPLACE_FLOOR_DIVIDE', 28)
|
||||||
def_op('INPLACE_TRUE_DIVIDE', 29)
|
def_op('INPLACE_TRUE_DIVIDE', 29)
|
||||||
|
|
||||||
|
def_op('STORE_MAP', 54)
|
||||||
def_op('INPLACE_ADD', 55)
|
def_op('INPLACE_ADD', 55)
|
||||||
def_op('INPLACE_SUBTRACT', 56)
|
def_op('INPLACE_SUBTRACT', 56)
|
||||||
def_op('INPLACE_MULTIPLY', 57)
|
def_op('INPLACE_MULTIPLY', 57)
|
||||||
|
@ -123,7 +124,7 @@ name_op('LOAD_NAME', 101) # Index in name list
|
||||||
def_op('BUILD_TUPLE', 102) # Number of tuple items
|
def_op('BUILD_TUPLE', 102) # Number of tuple items
|
||||||
def_op('BUILD_LIST', 103) # Number of list items
|
def_op('BUILD_LIST', 103) # Number of list items
|
||||||
def_op('BUILD_SET', 104) # Number of set items
|
def_op('BUILD_SET', 104) # Number of set items
|
||||||
def_op('BUILD_MAP', 105) # Always zero for now
|
def_op('BUILD_MAP', 105) # Number of dict entries (upto 255)
|
||||||
name_op('LOAD_ATTR', 106) # Index in name list
|
name_op('LOAD_ATTR', 106) # Index in name list
|
||||||
def_op('COMPARE_OP', 107) # Comparison operator
|
def_op('COMPARE_OP', 107) # Comparison operator
|
||||||
hascompare.append(107)
|
hascompare.append(107)
|
||||||
|
|
|
@ -49,6 +49,7 @@ class TestNamedTuple(unittest.TestCase):
|
||||||
self.assertEqual(repr(p), 'Point(x=11, y=22)')
|
self.assertEqual(repr(p), 'Point(x=11, y=22)')
|
||||||
self.assert_('__dict__' not in dir(p)) # verify instance has no dict
|
self.assert_('__dict__' not in dir(p)) # verify instance has no dict
|
||||||
self.assert_('__weakref__' not in dir(p))
|
self.assert_('__weakref__' not in dir(p))
|
||||||
|
self.assertEqual(p, Point._cast([11, 22])) # test _cast classmethod
|
||||||
self.assertEqual(p._fields, ('x', 'y')) # test _fields attribute
|
self.assertEqual(p._fields, ('x', 'y')) # test _fields attribute
|
||||||
self.assertEqual(p._replace(x=1), (1, 22)) # test _replace method
|
self.assertEqual(p._replace(x=1), (1, 22)) # test _replace method
|
||||||
self.assertEqual(p._asdict(), dict(x=11, y=22)) # test _asdict method
|
self.assertEqual(p._asdict(), dict(x=11, y=22)) # test _asdict method
|
||||||
|
@ -93,9 +94,40 @@ class TestNamedTuple(unittest.TestCase):
|
||||||
def test_odd_sizes(self):
|
def test_odd_sizes(self):
|
||||||
Zero = namedtuple('Zero', '')
|
Zero = namedtuple('Zero', '')
|
||||||
self.assertEqual(Zero(), ())
|
self.assertEqual(Zero(), ())
|
||||||
|
self.assertEqual(Zero._cast([]), ())
|
||||||
|
self.assertEqual(repr(Zero()), 'Zero()')
|
||||||
|
self.assertEqual(Zero()._asdict(), {})
|
||||||
|
self.assertEqual(Zero()._fields, ())
|
||||||
|
|
||||||
Dot = namedtuple('Dot', 'd')
|
Dot = namedtuple('Dot', 'd')
|
||||||
self.assertEqual(Dot(1), (1,))
|
self.assertEqual(Dot(1), (1,))
|
||||||
|
self.assertEqual(Dot._cast([1]), (1,))
|
||||||
|
self.assertEqual(Dot(1).d, 1)
|
||||||
|
self.assertEqual(repr(Dot(1)), 'Dot(d=1)')
|
||||||
|
self.assertEqual(Dot(1)._asdict(), {'d':1})
|
||||||
|
self.assertEqual(Dot(1)._replace(d=999), (999,))
|
||||||
|
self.assertEqual(Dot(1)._fields, ('d',))
|
||||||
|
|
||||||
|
# n = 10000
|
||||||
|
n = 254 # SyntaxError: more than 255 arguments:
|
||||||
|
import string, random
|
||||||
|
names = [''.join([random.choice(string.ascii_letters) for j in range(10)]) for i in range(n)]
|
||||||
|
Big = namedtuple('Big', names)
|
||||||
|
b = Big(*range(n))
|
||||||
|
self.assertEqual(b, tuple(range(n)))
|
||||||
|
self.assertEqual(Big._cast(range(n)), tuple(range(n)))
|
||||||
|
for pos, name in enumerate(names):
|
||||||
|
self.assertEqual(getattr(b, name), pos)
|
||||||
|
repr(b) # make sure repr() doesn't blow-up
|
||||||
|
d = b._asdict()
|
||||||
|
d_expected = dict(zip(names, range(n)))
|
||||||
|
self.assertEqual(d, d_expected)
|
||||||
|
b2 = b._replace(**dict([(names[1], 999),(names[-5], 42)]))
|
||||||
|
b2_expected = list(range(n))
|
||||||
|
b2_expected[1] = 999
|
||||||
|
b2_expected[-5] = 42
|
||||||
|
self.assertEqual(b2, tuple(b2_expected))
|
||||||
|
self.assertEqual(b._fields, tuple(names))
|
||||||
|
|
||||||
class TestOneTrickPonyABCs(unittest.TestCase):
|
class TestOneTrickPonyABCs(unittest.TestCase):
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import unittest
|
import unittest
|
||||||
from test import test_support
|
from test import test_support
|
||||||
|
|
||||||
import sys, UserDict
|
import sys, UserDict, random, string
|
||||||
|
|
||||||
|
|
||||||
class DictTest(unittest.TestCase):
|
class DictTest(unittest.TestCase):
|
||||||
|
@ -11,6 +11,15 @@ class DictTest(unittest.TestCase):
|
||||||
self.assertEqual(dict(), {})
|
self.assertEqual(dict(), {})
|
||||||
self.assert_(dict() is not {})
|
self.assert_(dict() is not {})
|
||||||
|
|
||||||
|
def test_literal_constructor(self):
|
||||||
|
# check literal constructor for different sized dicts (to exercise the BUILD_MAP oparg
|
||||||
|
items = []
|
||||||
|
for n in range(400):
|
||||||
|
dictliteral = '{' + ', '.join('%r: %d' % item for item in items) + '}'
|
||||||
|
self.assertEqual(eval(dictliteral), dict(items))
|
||||||
|
items.append((''.join([random.choice(string.ascii_letters) for j in range(8)]), n))
|
||||||
|
random.shuffle(items)
|
||||||
|
|
||||||
def test_bool(self):
|
def test_bool(self):
|
||||||
self.assert_(not {})
|
self.assert_(not {})
|
||||||
self.assert_({1: 2})
|
self.assert_({1: 2})
|
||||||
|
|
|
@ -3,6 +3,12 @@ import unittest, struct
|
||||||
import os
|
import os
|
||||||
from test import test_support
|
from test import test_support
|
||||||
|
|
||||||
|
def isinf(x):
|
||||||
|
return x * 0.5 == x
|
||||||
|
|
||||||
|
def isnan(x):
|
||||||
|
return x != x
|
||||||
|
|
||||||
class FormatFunctionsTestCase(unittest.TestCase):
|
class FormatFunctionsTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -159,6 +165,70 @@ class ReprTestCase(unittest.TestCase):
|
||||||
self.assertEqual(v, eval(repr(v)))
|
self.assertEqual(v, eval(repr(v)))
|
||||||
floats_file.close()
|
floats_file.close()
|
||||||
|
|
||||||
|
# Beginning with Python 2.6 float has cross platform compatible
|
||||||
|
# ways to create and representate inf and nan
|
||||||
|
class InfNanTest(unittest.TestCase):
|
||||||
|
def test_inf_from_str(self):
|
||||||
|
self.assert_(isinf(float("inf")))
|
||||||
|
self.assert_(isinf(float("+inf")))
|
||||||
|
self.assert_(isinf(float("-inf")))
|
||||||
|
|
||||||
|
self.assertEqual(repr(float("inf")), "inf")
|
||||||
|
self.assertEqual(repr(float("+inf")), "inf")
|
||||||
|
self.assertEqual(repr(float("-inf")), "-inf")
|
||||||
|
|
||||||
|
self.assertEqual(repr(float("INF")), "inf")
|
||||||
|
self.assertEqual(repr(float("+Inf")), "inf")
|
||||||
|
self.assertEqual(repr(float("-iNF")), "-inf")
|
||||||
|
|
||||||
|
self.assertEqual(str(float("inf")), "inf")
|
||||||
|
self.assertEqual(str(float("+inf")), "inf")
|
||||||
|
self.assertEqual(str(float("-inf")), "-inf")
|
||||||
|
|
||||||
|
self.assertRaises(ValueError, float, "info")
|
||||||
|
self.assertRaises(ValueError, float, "+info")
|
||||||
|
self.assertRaises(ValueError, float, "-info")
|
||||||
|
self.assertRaises(ValueError, float, "in")
|
||||||
|
self.assertRaises(ValueError, float, "+in")
|
||||||
|
self.assertRaises(ValueError, float, "-in")
|
||||||
|
|
||||||
|
def test_inf_as_str(self):
|
||||||
|
self.assertEqual(repr(1e300 * 1e300), "inf")
|
||||||
|
self.assertEqual(repr(-1e300 * 1e300), "-inf")
|
||||||
|
|
||||||
|
self.assertEqual(str(1e300 * 1e300), "inf")
|
||||||
|
self.assertEqual(str(-1e300 * 1e300), "-inf")
|
||||||
|
|
||||||
|
def test_nan_from_str(self):
|
||||||
|
self.assert_(isnan(float("nan")))
|
||||||
|
self.assert_(isnan(float("+nan")))
|
||||||
|
self.assert_(isnan(float("-nan")))
|
||||||
|
|
||||||
|
self.assertEqual(repr(float("nan")), "nan")
|
||||||
|
self.assertEqual(repr(float("+nan")), "nan")
|
||||||
|
self.assertEqual(repr(float("-nan")), "nan")
|
||||||
|
|
||||||
|
self.assertEqual(repr(float("NAN")), "nan")
|
||||||
|
self.assertEqual(repr(float("+NAn")), "nan")
|
||||||
|
self.assertEqual(repr(float("-NaN")), "nan")
|
||||||
|
|
||||||
|
self.assertEqual(str(float("nan")), "nan")
|
||||||
|
self.assertEqual(str(float("+nan")), "nan")
|
||||||
|
self.assertEqual(str(float("-nan")), "nan")
|
||||||
|
|
||||||
|
self.assertRaises(ValueError, float, "nana")
|
||||||
|
self.assertRaises(ValueError, float, "+nana")
|
||||||
|
self.assertRaises(ValueError, float, "-nana")
|
||||||
|
self.assertRaises(ValueError, float, "na")
|
||||||
|
self.assertRaises(ValueError, float, "+na")
|
||||||
|
self.assertRaises(ValueError, float, "-na")
|
||||||
|
|
||||||
|
def test_nan_as_str(self):
|
||||||
|
self.assertEqual(repr(1e300 * 1e300 * 0), "nan")
|
||||||
|
self.assertEqual(repr(-1e300 * 1e300 * 0), "nan")
|
||||||
|
|
||||||
|
self.assertEqual(str(1e300 * 1e300 * 0), "nan")
|
||||||
|
self.assertEqual(str(-1e300 * 1e300 * 0), "nan")
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
test_support.run_unittest(
|
test_support.run_unittest(
|
||||||
|
@ -166,7 +236,8 @@ def test_main():
|
||||||
UnknownFormatTestCase,
|
UnknownFormatTestCase,
|
||||||
IEEEFormatTestCase,
|
IEEEFormatTestCase,
|
||||||
FormatTestCase,
|
FormatTestCase,
|
||||||
#ReprTestCase
|
ReprTestCase,
|
||||||
|
InfNanTest,
|
||||||
)
|
)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
|
@ -275,6 +275,7 @@ PYTHON_OBJS= \
|
||||||
Python/sysmodule.o \
|
Python/sysmodule.o \
|
||||||
Python/traceback.o \
|
Python/traceback.o \
|
||||||
Python/getopt.o \
|
Python/getopt.o \
|
||||||
|
Python/pystrcmp.o \
|
||||||
Python/pystrtod.o \
|
Python/pystrtod.o \
|
||||||
Python/formatter_unicode.o \
|
Python/formatter_unicode.o \
|
||||||
Python/$(DYNLOADFILE) \
|
Python/$(DYNLOADFILE) \
|
||||||
|
@ -585,6 +586,8 @@ PYTHON_HEADERS= \
|
||||||
Include/pymem.h \
|
Include/pymem.h \
|
||||||
Include/pyport.h \
|
Include/pyport.h \
|
||||||
Include/pystate.h \
|
Include/pystate.h \
|
||||||
|
Include/pystrtod.h \
|
||||||
|
Include/pystrcmp.h \
|
||||||
Include/pythonrun.h \
|
Include/pythonrun.h \
|
||||||
Include/rangeobject.h \
|
Include/rangeobject.h \
|
||||||
Include/setobject.h \
|
Include/setobject.h \
|
||||||
|
|
|
@ -783,6 +783,12 @@ CharArray_set_value(CDataObject *self, PyObject *value)
|
||||||
char *ptr;
|
char *ptr;
|
||||||
Py_ssize_t size;
|
Py_ssize_t size;
|
||||||
|
|
||||||
|
if (value == NULL) {
|
||||||
|
PyErr_SetString(PyExc_TypeError,
|
||||||
|
"can't delete attribute");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (PyUnicode_Check(value)) {
|
if (PyUnicode_Check(value)) {
|
||||||
value = PyUnicode_AsEncodedString(value,
|
value = PyUnicode_AsEncodedString(value,
|
||||||
conversion_mode_encoding,
|
conversion_mode_encoding,
|
||||||
|
@ -838,6 +844,11 @@ WCharArray_set_value(CDataObject *self, PyObject *value)
|
||||||
{
|
{
|
||||||
Py_ssize_t result = 0;
|
Py_ssize_t result = 0;
|
||||||
|
|
||||||
|
if (value == NULL) {
|
||||||
|
PyErr_SetString(PyExc_TypeError,
|
||||||
|
"can't delete attribute");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if (PyString_Check(value)) {
|
if (PyString_Check(value)) {
|
||||||
value = PyUnicode_FromEncodedObject(value,
|
value = PyUnicode_FromEncodedObject(value,
|
||||||
conversion_mode_encoding,
|
conversion_mode_encoding,
|
||||||
|
@ -4022,6 +4033,11 @@ Simple_set_value(CDataObject *self, PyObject *value)
|
||||||
PyObject *result;
|
PyObject *result;
|
||||||
StgDictObject *dict = PyObject_stgdict((PyObject *)self);
|
StgDictObject *dict = PyObject_stgdict((PyObject *)self);
|
||||||
|
|
||||||
|
if (value == NULL) {
|
||||||
|
PyErr_SetString(PyExc_TypeError,
|
||||||
|
"can't delete attribute");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
assert(dict); /* Cannot be NULL for CDataObject instances */
|
assert(dict); /* Cannot be NULL for CDataObject instances */
|
||||||
assert(dict->setfunc);
|
assert(dict->setfunc);
|
||||||
result = dict->setfunc(self->b_ptr, value, dict->size);
|
result = dict->setfunc(self->b_ptr, value, dict->size);
|
||||||
|
|
|
@ -195,6 +195,11 @@ CField_set(CFieldObject *self, PyObject *inst, PyObject *value)
|
||||||
assert(CDataObject_Check(inst));
|
assert(CDataObject_Check(inst));
|
||||||
dst = (CDataObject *)inst;
|
dst = (CDataObject *)inst;
|
||||||
ptr = dst->b_ptr + self->offset;
|
ptr = dst->b_ptr + self->offset;
|
||||||
|
if (value == NULL) {
|
||||||
|
PyErr_SetString(PyExc_TypeError,
|
||||||
|
"can't delete attribute");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
return CData_set(inst, self->proto, self->setfunc, value,
|
return CData_set(inst, self->proto, self->setfunc, value,
|
||||||
self->index, self->size, ptr);
|
self->index, self->size, ptr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2181,12 +2181,12 @@ See recv() for documentation about the flags.");
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is the guts of the recv() and recv_into() methods, which reads into a
|
* This is the guts of the recvfrom() and recvfrom_into() methods, which reads
|
||||||
* char buffer. If you have any inc/def ref to do to the objects that contain
|
* into a char buffer. If you have any inc/def ref to do to the objects that
|
||||||
* the buffer, do it in the caller. This function returns the number of bytes
|
* contain the buffer, do it in the caller. This function returns the number
|
||||||
* succesfully read. If there was an error, it returns -1. Note that it is
|
* of bytes succesfully read. If there was an error, it returns -1. Note
|
||||||
* also possible that we return a number of bytes smaller than the request
|
* that it is also possible that we return a number of bytes smaller than the
|
||||||
* bytes.
|
* request bytes.
|
||||||
*
|
*
|
||||||
* 'addr' is a return value for the address object. Note that you must decref
|
* 'addr' is a return value for the address object. Note that you must decref
|
||||||
* it yourself.
|
* it yourself.
|
||||||
|
|
|
@ -551,6 +551,23 @@ dictresize(PyDictObject *mp, Py_ssize_t minused)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Create a new dictionary pre-sized to hold an estimated number of elements.
|
||||||
|
Underestimates are okay because the dictionary will resize as necessary.
|
||||||
|
Overestimates just mean the dictionary will be more sparse than usual.
|
||||||
|
*/
|
||||||
|
|
||||||
|
PyObject *
|
||||||
|
_PyDict_NewPresized(Py_ssize_t minused)
|
||||||
|
{
|
||||||
|
PyObject *op = PyDict_New();
|
||||||
|
|
||||||
|
if (minused>5 && op != NULL && dictresize((PyDictObject *)op, minused) == -1) {
|
||||||
|
Py_DECREF(op);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return op;
|
||||||
|
}
|
||||||
|
|
||||||
/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
|
/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors
|
||||||
* that may occur (originally dicts supported only string keys, and exceptions
|
* that may occur (originally dicts supported only string keys, and exceptions
|
||||||
* weren't possible). So, while the original intent was that a NULL return
|
* weren't possible). So, while the original intent was that a NULL return
|
||||||
|
|
|
@ -114,7 +114,7 @@ PyFloat_FromDouble(double fval)
|
||||||
PyObject *
|
PyObject *
|
||||||
PyFloat_FromString(PyObject *v)
|
PyFloat_FromString(PyObject *v)
|
||||||
{
|
{
|
||||||
const char *s, *last, *end;
|
const char *s, *last, *end, *sp;
|
||||||
double x;
|
double x;
|
||||||
char buffer[256]; /* for errors */
|
char buffer[256]; /* for errors */
|
||||||
char *s_buffer = NULL;
|
char *s_buffer = NULL;
|
||||||
|
@ -146,6 +146,7 @@ PyFloat_FromString(PyObject *v)
|
||||||
PyErr_SetString(PyExc_ValueError, "empty string for float()");
|
PyErr_SetString(PyExc_ValueError, "empty string for float()");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
sp = s;
|
||||||
/* We don't care about overflow or underflow. If the platform supports
|
/* We don't care about overflow or underflow. If the platform supports
|
||||||
* them, infinities and signed zeroes (on underflow) are fine.
|
* them, infinities and signed zeroes (on underflow) are fine.
|
||||||
* However, strtod can return 0 for denormalized numbers, where atof
|
* However, strtod can return 0 for denormalized numbers, where atof
|
||||||
|
@ -161,7 +162,26 @@ PyFloat_FromString(PyObject *v)
|
||||||
byte at the end of the string, when the input is inf(inity). */
|
byte at the end of the string, when the input is inf(inity). */
|
||||||
if (end > last)
|
if (end > last)
|
||||||
end = last;
|
end = last;
|
||||||
|
/* Check for inf and nan. This is done late because it rarely happens. */
|
||||||
if (end == s) {
|
if (end == s) {
|
||||||
|
char *p = (char*)sp;
|
||||||
|
int sign = 1;
|
||||||
|
|
||||||
|
if (*p == '-') {
|
||||||
|
sign = -1;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
if (*p == '+') {
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
if (PyOS_strnicmp(p, "inf", 4) == 0) {
|
||||||
|
return PyFloat_FromDouble(sign * Py_HUGE_VAL);
|
||||||
|
}
|
||||||
|
#ifdef Py_NAN
|
||||||
|
if(PyOS_strnicmp(p, "nan", 4) == 0) {
|
||||||
|
return PyFloat_FromDouble(Py_NAN);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
PyOS_snprintf(buffer, sizeof(buffer),
|
PyOS_snprintf(buffer, sizeof(buffer),
|
||||||
"invalid literal for float(): %.200s", s);
|
"invalid literal for float(): %.200s", s);
|
||||||
PyErr_SetString(PyExc_ValueError, buffer);
|
PyErr_SetString(PyExc_ValueError, buffer);
|
||||||
|
@ -250,7 +270,9 @@ format_double(char *buf, size_t buflen, double ob_fval, int precision)
|
||||||
{
|
{
|
||||||
register char *cp;
|
register char *cp;
|
||||||
char format[32];
|
char format[32];
|
||||||
/* Subroutine for float_repr, float_str, and others.
|
int i;
|
||||||
|
|
||||||
|
/* Subroutine for float_repr, float_str and float_print.
|
||||||
We want float numbers to be recognizable as such,
|
We want float numbers to be recognizable as such,
|
||||||
i.e., they should contain a decimal point or an exponent.
|
i.e., they should contain a decimal point or an exponent.
|
||||||
However, %g may print the number as an integer;
|
However, %g may print the number as an integer;
|
||||||
|
@ -271,7 +293,33 @@ format_double(char *buf, size_t buflen, double ob_fval, int precision)
|
||||||
*cp++ = '.';
|
*cp++ = '.';
|
||||||
*cp++ = '0';
|
*cp++ = '0';
|
||||||
*cp++ = '\0';
|
*cp++ = '\0';
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
/* Checking the next three chars should be more than enough to
|
||||||
|
* detect inf or nan, even on Windows. We check for inf or nan
|
||||||
|
* at last because they are rare cases.
|
||||||
|
*/
|
||||||
|
for (i=0; *cp != '\0' && i<3; cp++, i++) {
|
||||||
|
if (isdigit(Py_CHARMASK(*cp)) || *cp == '.')
|
||||||
|
continue;
|
||||||
|
/* found something that is neither a digit nor point
|
||||||
|
* it might be a NaN or INF
|
||||||
|
*/
|
||||||
|
#ifdef Py_NAN
|
||||||
|
if (Py_IS_NAN(ob_fval)) {
|
||||||
|
strcpy(buf, "nan");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
if (Py_IS_INFINITY(ob_fval)) {
|
||||||
|
cp = buf;
|
||||||
|
if (*cp == '-')
|
||||||
|
cp++;
|
||||||
|
strcpy(cp, "inf");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -386,6 +386,15 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */
|
||||||
|
|
||||||
/* Fairly standard from here! */
|
/* Fairly standard from here! */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `copysign' function. */
|
||||||
|
/* #define HAVE_COPYSIGN 1*/
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `isinf' function. */
|
||||||
|
#define HAVE_ISINF 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `isnan' function. */
|
||||||
|
#define HAVE_ISNAN 1
|
||||||
|
|
||||||
/* Define if on AIX 3.
|
/* Define if on AIX 3.
|
||||||
System headers sometimes define this.
|
System headers sometimes define this.
|
||||||
We just want to avoid a redefinition error message. */
|
We just want to avoid a redefinition error message. */
|
||||||
|
|
|
@ -700,6 +700,10 @@
|
||||||
<File
|
<File
|
||||||
RelativePath="..\Python\pystate.c">
|
RelativePath="..\Python\pystate.c">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\Python\pystrcmp.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\Python\pystrtod.c">
|
RelativePath="..\Python\pystrtod.c">
|
||||||
</File>
|
</File>
|
||||||
|
|
|
@ -735,6 +735,10 @@
|
||||||
RelativePath="..\..\Python\pystate.c"
|
RelativePath="..\..\Python\pystate.c"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\Python\pystrcmp.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\Python\pystrtod.c"
|
RelativePath="..\..\Python\pystrtod.c"
|
||||||
>
|
>
|
||||||
|
@ -1213,6 +1217,10 @@
|
||||||
RelativePath="..\..\Include\pystate.h"
|
RelativePath="..\..\Include\pystate.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\Include\pystrcmp.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\Include\pystrtod.h"
|
RelativePath="..\..\Include\pystrtod.h"
|
||||||
>
|
>
|
||||||
|
|
|
@ -1,514 +0,0 @@
|
||||||
Document Type: WSE
|
|
||||||
item: Global
|
|
||||||
Version=8.14
|
|
||||||
Flags=00000100
|
|
||||||
Split=1420
|
|
||||||
Languages=65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
|
||||||
Copy Default=1
|
|
||||||
Japanese Font Name=MS Gothic
|
|
||||||
Japanese Font Size=10
|
|
||||||
Start Gradient=0 0 255
|
|
||||||
End Gradient=0 0 0
|
|
||||||
Windows Flags=00000000000000000000101000001000
|
|
||||||
Message Font=MS Sans Serif
|
|
||||||
Font Size=8
|
|
||||||
Disk Label=GLBS
|
|
||||||
Disk Filename=INSTALL
|
|
||||||
Patch Flags=0000000000000001
|
|
||||||
Patch Threshold=200
|
|
||||||
Patch Memory=4096
|
|
||||||
Per-User Version ID=1
|
|
||||||
Crystal Format=10111100101100000010001001001001
|
|
||||||
Step View=&Properties
|
|
||||||
end
|
|
||||||
item: Remark
|
|
||||||
Text=Note from Tim: This is a verbatim copy of Wise's Uninstal.wse, altered at the end to write
|
|
||||||
end
|
|
||||||
item: Remark
|
|
||||||
Text=uninstall info under HKCU instead of HKLM if our DOADMIN var is false.
|
|
||||||
end
|
|
||||||
item: Remark
|
|
||||||
end
|
|
||||||
item: Remark
|
|
||||||
Text= Install Support for uninstalling the application.
|
|
||||||
end
|
|
||||||
item: Remark
|
|
||||||
end
|
|
||||||
item: Set Variable
|
|
||||||
Variable=UNINSTALL_PATH
|
|
||||||
Value=%_LOGFILE_PATH_%
|
|
||||||
Flags=00000010
|
|
||||||
end
|
|
||||||
item: Set Variable
|
|
||||||
Variable=UNINSTALL_PATH
|
|
||||||
Value=%UNINSTALL_PATH%\UNWISE.EXE
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Variable=_EXE_OS_TYPE_
|
|
||||||
Value=WIN32
|
|
||||||
end
|
|
||||||
item: Install File
|
|
||||||
Source=%_WISE_%\UNWISE32.EXE
|
|
||||||
Destination=%UNINSTALL_PATH%
|
|
||||||
Flags=0000000000000010
|
|
||||||
end
|
|
||||||
item: Compiler Variable Else
|
|
||||||
end
|
|
||||||
item: Install File
|
|
||||||
Source=%_WISE_%\UNWISE.EXE
|
|
||||||
Destination=%UNINSTALL_PATH%
|
|
||||||
Flags=0000000000000010
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Remark
|
|
||||||
end
|
|
||||||
item: Remark
|
|
||||||
Text= Install Support for multiple languages
|
|
||||||
end
|
|
||||||
item: Remark
|
|
||||||
end
|
|
||||||
item: Set Variable
|
|
||||||
Variable=UNINSTALL_LANG
|
|
||||||
Value=%UNINSTALL_PATH%
|
|
||||||
Flags=00000010
|
|
||||||
end
|
|
||||||
item: Set Variable
|
|
||||||
Variable=UNINSTALL_LANG
|
|
||||||
Value=%UNINSTALL_LANG%\UNWISE.INI
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Variable=_LANG_LIST_
|
|
||||||
Value=C
|
|
||||||
Flags=00000010
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Value=%_WISE_%\LANGUAGE\UNWISE.FRA
|
|
||||||
Flags=00000011
|
|
||||||
end
|
|
||||||
item: If/While Statement
|
|
||||||
Variable=LANG
|
|
||||||
Value=%_LANG_C_NAME_%
|
|
||||||
end
|
|
||||||
item: Install File
|
|
||||||
Source=%_WISE_%\LANGUAGE\UNWISE.FRA
|
|
||||||
Destination=%UNINSTALL_LANG%
|
|
||||||
Flags=0000000000000010
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Variable=_LANG_LIST_
|
|
||||||
Value=D
|
|
||||||
Flags=00000010
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Value=%_WISE_%\LANGUAGE\UNWISE.FRA
|
|
||||||
Flags=00000011
|
|
||||||
end
|
|
||||||
item: If/While Statement
|
|
||||||
Variable=LANG
|
|
||||||
Value=%_LANG_D_NAME_%
|
|
||||||
end
|
|
||||||
item: Install File
|
|
||||||
Source=%_WISE_%\LANGUAGE\UNWISE.FRA
|
|
||||||
Destination=%UNINSTALL_LANG%
|
|
||||||
Flags=0000000000000010
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Variable=_LANG_LIST_
|
|
||||||
Value=E
|
|
||||||
Flags=00000010
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Value=%_WISE_%\LANGUAGE\UNWISE.DEU
|
|
||||||
Flags=00000011
|
|
||||||
end
|
|
||||||
item: If/While Statement
|
|
||||||
Variable=LANG
|
|
||||||
Value=%_LANG_E_NAME_%
|
|
||||||
end
|
|
||||||
item: Install File
|
|
||||||
Source=%_WISE_%\LANGUAGE\UNWISE.DEU
|
|
||||||
Destination=%UNINSTALL_LANG%
|
|
||||||
Flags=0000000000000010
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Variable=_LANG_LIST_
|
|
||||||
Value=F
|
|
||||||
Flags=00000010
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Value=%_WISE_%\LANGUAGE\UNWISE.PTG
|
|
||||||
Flags=00000011
|
|
||||||
end
|
|
||||||
item: If/While Statement
|
|
||||||
Variable=LANG
|
|
||||||
Value=%_LANG_F_NAME_%
|
|
||||||
end
|
|
||||||
item: Install File
|
|
||||||
Source=%_WISE_%\LANGUAGE\UNWISE.PTG
|
|
||||||
Destination=%UNINSTALL_LANG%
|
|
||||||
Flags=0000000000000010
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Variable=_LANG_LIST_
|
|
||||||
Value=G
|
|
||||||
Flags=00000010
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Value=%_WISE_%\LANGUAGE\UNWISE.ESP
|
|
||||||
Flags=00000011
|
|
||||||
end
|
|
||||||
item: If/While Statement
|
|
||||||
Variable=LANG
|
|
||||||
Value=%_LANG_G_NAME_%
|
|
||||||
end
|
|
||||||
item: Install File
|
|
||||||
Source=%_WISE_%\LANGUAGE\UNWISE.ESP
|
|
||||||
Destination=%UNINSTALL_LANG%
|
|
||||||
Flags=0000000000000010
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Variable=_LANG_LIST_
|
|
||||||
Value=H
|
|
||||||
Flags=00000010
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Value=%_WISE_%\LANGUAGE\UNWISE.ESP
|
|
||||||
Flags=00000011
|
|
||||||
end
|
|
||||||
item: If/While Statement
|
|
||||||
Variable=LANG
|
|
||||||
Value=%_LANG_H_NAME_%
|
|
||||||
end
|
|
||||||
item: Install File
|
|
||||||
Source=%_WISE_%\LANGUAGE\UNWISE.ESP
|
|
||||||
Destination=%UNINSTALL_LANG%
|
|
||||||
Flags=0000000000000010
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Variable=_LANG_LIST_
|
|
||||||
Value=I
|
|
||||||
Flags=00000010
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Value=%_WISE_%\LANGUAGE\UNWISE.ITA
|
|
||||||
Flags=00000011
|
|
||||||
end
|
|
||||||
item: If/While Statement
|
|
||||||
Variable=LANG
|
|
||||||
Value=%_LANG_I_NAME_%
|
|
||||||
end
|
|
||||||
item: Install File
|
|
||||||
Source=%_WISE_%\LANGUAGE\UNWISE.ITA
|
|
||||||
Destination=%UNINSTALL_LANG%
|
|
||||||
Flags=0000000000000010
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Variable=_LANG_LIST_
|
|
||||||
Value=J
|
|
||||||
Flags=00000010
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Value=%_WISE_%\LANGUAGE\UNWISE.DAN
|
|
||||||
Flags=00000011
|
|
||||||
end
|
|
||||||
item: If/While Statement
|
|
||||||
Variable=LANG
|
|
||||||
Value=%_LANG_J_NAME_%
|
|
||||||
end
|
|
||||||
item: Install File
|
|
||||||
Source=%_WISE_%\LANGUAGE\UNWISE.DAN
|
|
||||||
Destination=%UNINSTALL_LANG%
|
|
||||||
Flags=0000000000000010
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Variable=_LANG_LIST_
|
|
||||||
Value=K
|
|
||||||
Flags=00000010
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Value=%_WISE_%\LANGUAGE\UNWISE.FIN
|
|
||||||
Flags=00000011
|
|
||||||
end
|
|
||||||
item: If/While Statement
|
|
||||||
Variable=LANG
|
|
||||||
Value=%_LANG_K_NAME_%
|
|
||||||
end
|
|
||||||
item: Install File
|
|
||||||
Source=%_WISE_%\LANGUAGE\UNWISE.FIN
|
|
||||||
Destination=%UNINSTALL_LANG%
|
|
||||||
Flags=0000000000000010
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Variable=_LANG_LIST_
|
|
||||||
Value=L
|
|
||||||
Flags=00000010
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Value=%_WISE_%\LANGUAGE\UNWISE.ISL
|
|
||||||
Flags=00000011
|
|
||||||
end
|
|
||||||
item: If/While Statement
|
|
||||||
Variable=LANG
|
|
||||||
Value=%_LANG_L_NAME_%
|
|
||||||
end
|
|
||||||
item: Install File
|
|
||||||
Source=%_WISE_%\LANGUAGE\UNWISE.ISL
|
|
||||||
Destination=%UNINSTALL_LANG%
|
|
||||||
Flags=0000000000000010
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Variable=_LANG_LIST_
|
|
||||||
Value=M
|
|
||||||
Flags=00000010
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Value=%_WISE_%\LANGUAGE\UNWISE.NLD
|
|
||||||
Flags=00000011
|
|
||||||
end
|
|
||||||
item: If/While Statement
|
|
||||||
Variable=LANG
|
|
||||||
Value=%_LANG_M_NAME_%
|
|
||||||
end
|
|
||||||
item: Install File
|
|
||||||
Source=%_WISE_%\LANGUAGE\UNWISE.NLD
|
|
||||||
Destination=%UNINSTALL_LANG%
|
|
||||||
Flags=0000000000000010
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Variable=_LANG_LIST_
|
|
||||||
Value=N
|
|
||||||
Flags=00000010
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Value=%_WISE_%\LANGUAGE\UNWISE.NOR
|
|
||||||
Flags=00000011
|
|
||||||
end
|
|
||||||
item: If/While Statement
|
|
||||||
Variable=LANG
|
|
||||||
Value=%_LANG_N_NAME_%
|
|
||||||
end
|
|
||||||
item: Install File
|
|
||||||
Source=%_WISE_%\LANGUAGE\UNWISE.NOR
|
|
||||||
Destination=%UNINSTALL_LANG%
|
|
||||||
Flags=0000000000000010
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Variable=_LANG_LIST_
|
|
||||||
Value=O
|
|
||||||
Flags=00000010
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Value=%_WISE_%\LANGUAGE\UNWISE.SVE
|
|
||||||
Flags=00000011
|
|
||||||
end
|
|
||||||
item: If/While Statement
|
|
||||||
Variable=LANG
|
|
||||||
Value=%_LANG_O_NAME_%
|
|
||||||
end
|
|
||||||
item: Install File
|
|
||||||
Source=%_WISE_%\LANGUAGE\UNWISE.SVE
|
|
||||||
Destination=%UNINSTALL_LANG%
|
|
||||||
Flags=0000000000000010
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Variable=_LANG_LIST_
|
|
||||||
Value=P
|
|
||||||
Flags=00000010
|
|
||||||
end
|
|
||||||
item: Compiler Variable If
|
|
||||||
Value=%_WISE_%\LANGUAGE\UNWISE.JPN
|
|
||||||
Flags=00000011
|
|
||||||
end
|
|
||||||
item: If/While Statement
|
|
||||||
Variable=LANG
|
|
||||||
Value=%_LANG_P_NAME_%
|
|
||||||
end
|
|
||||||
item: Install File
|
|
||||||
Source=%_WISE_%\LANGUAGE\UNWISE.JPN
|
|
||||||
Destination=%UNINSTALL_LANG%
|
|
||||||
Flags=0000000000000010
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Compiler Variable End
|
|
||||||
end
|
|
||||||
item: Remark
|
|
||||||
end
|
|
||||||
item: Remark
|
|
||||||
Text= Install the add/remove or uninstall icon
|
|
||||||
end
|
|
||||||
item: Remark
|
|
||||||
end
|
|
||||||
item: Set Variable
|
|
||||||
Variable=UNINSTALL_PATH
|
|
||||||
Value=%UNINSTALL_PATH%
|
|
||||||
Flags=00010100
|
|
||||||
end
|
|
||||||
item: Set Variable
|
|
||||||
Variable=INST_LOG_PATH
|
|
||||||
Value=%_LOGFILE_PATH_%
|
|
||||||
Flags=00010100
|
|
||||||
end
|
|
||||||
item: Check Configuration
|
|
||||||
Flags=10111011
|
|
||||||
end
|
|
||||||
item: If/While Statement
|
|
||||||
Variable=DOADMIN
|
|
||||||
Value=1
|
|
||||||
end
|
|
||||||
item: Remark
|
|
||||||
Text=Write uninstall info under HKLM. This if/else/end block added by Tim.
|
|
||||||
end
|
|
||||||
item: Edit Registry
|
|
||||||
Total Keys=1
|
|
||||||
Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
|
|
||||||
New Value=%APPTITLE%
|
|
||||||
Value Name=DisplayName
|
|
||||||
Root=2
|
|
||||||
end
|
|
||||||
item: Edit Registry
|
|
||||||
Total Keys=1
|
|
||||||
Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
|
|
||||||
New Value=%UNINSTALL_PATH% %INST_LOG_PATH%
|
|
||||||
New Value=
|
|
||||||
Value Name=UninstallString
|
|
||||||
Root=2
|
|
||||||
end
|
|
||||||
item: Else Statement
|
|
||||||
end
|
|
||||||
item: Remark
|
|
||||||
Text=The same, but write under HKCU instead.
|
|
||||||
end
|
|
||||||
item: Edit Registry
|
|
||||||
Total Keys=1
|
|
||||||
Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
|
|
||||||
New Value=%APPTITLE%
|
|
||||||
Value Name=DisplayName
|
|
||||||
Root=1
|
|
||||||
end
|
|
||||||
item: Edit Registry
|
|
||||||
Total Keys=1
|
|
||||||
Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
|
|
||||||
New Value=%UNINSTALL_PATH% %INST_LOG_PATH%
|
|
||||||
New Value=
|
|
||||||
Value Name=UninstallString
|
|
||||||
Root=1
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: Else Statement
|
|
||||||
end
|
|
||||||
item: Add ProgMan Icon
|
|
||||||
Group=%GROUP%
|
|
||||||
Icon Name=Uninstall %APPTITLE%
|
|
||||||
Command Line=%UNINSTALL_PATH% %INST_LOG_PATH%
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: Check Configuration
|
|
||||||
Flags=11110010
|
|
||||||
end
|
|
||||||
item: If/While Statement
|
|
||||||
Variable=DOBRAND
|
|
||||||
Value=1
|
|
||||||
end
|
|
||||||
item: Edit Registry
|
|
||||||
Total Keys=2
|
|
||||||
item: Key
|
|
||||||
Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
|
|
||||||
New Value=%COMPANY%
|
|
||||||
Value Name=RegCompany
|
|
||||||
Root=2
|
|
||||||
end
|
|
||||||
item: Key
|
|
||||||
Key=Software\Microsoft\Windows\CurrentVersion\Uninstall\%APPTITLE%
|
|
||||||
New Value=%NAME%
|
|
||||||
Value Name=RegOwner
|
|
||||||
Root=2
|
|
||||||
end
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
||||||
item: End Block
|
|
||||||
end
|
|
|
@ -1,61 +0,0 @@
|
||||||
// Microsoft Visual C++ generated resource script.
|
|
||||||
//
|
|
||||||
#include "resource.h"
|
|
||||||
|
|
||||||
#define APSTUDIO_READONLY_SYMBOLS
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Generated from the TEXTINCLUDE 2 resource.
|
|
||||||
//
|
|
||||||
#include "afxres.h"
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
#undef APSTUDIO_READONLY_SYMBOLS
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
// English (U.S.) resources
|
|
||||||
|
|
||||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
|
||||||
LANGUAGE 7, 1
|
|
||||||
#pragma code_page(1252)
|
|
||||||
|
|
||||||
#ifdef APSTUDIO_INVOKED
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// TEXTINCLUDE
|
|
||||||
//
|
|
||||||
|
|
||||||
1 TEXTINCLUDE
|
|
||||||
BEGIN
|
|
||||||
"resource.h\0"
|
|
||||||
END
|
|
||||||
|
|
||||||
2 TEXTINCLUDE
|
|
||||||
BEGIN
|
|
||||||
"#include ""afxres.h""\r\n"
|
|
||||||
"\0"
|
|
||||||
END
|
|
||||||
|
|
||||||
3 TEXTINCLUDE
|
|
||||||
BEGIN
|
|
||||||
"\r\n"
|
|
||||||
"\0"
|
|
||||||
END
|
|
||||||
|
|
||||||
#endif // APSTUDIO_INVOKED
|
|
||||||
|
|
||||||
#endif // English (U.S.) resources
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef APSTUDIO_INVOKED
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Generated from the TEXTINCLUDE 3 resource.
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
#endif // not APSTUDIO_INVOKED
|
|
||||||
|
|
|
@ -56,7 +56,7 @@
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib"
|
AdditionalDependencies="$(tcltkLib)"
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCALinkTool"
|
Name="VCALinkTool"
|
||||||
|
@ -118,7 +118,7 @@
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib"
|
AdditionalDependencies="$(tcltk64Lib)"
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCALinkTool"
|
Name="VCALinkTool"
|
||||||
|
@ -180,7 +180,7 @@
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib"
|
AdditionalDependencies="$(tcltkLib)"
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCALinkTool"
|
Name="VCALinkTool"
|
||||||
|
@ -243,7 +243,7 @@
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib"
|
AdditionalDependencies="$(tcltk64Lib)"
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCALinkTool"
|
Name="VCALinkTool"
|
||||||
|
@ -305,7 +305,7 @@
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib"
|
AdditionalDependencies="$(tcltkLib)"
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCALinkTool"
|
Name="VCALinkTool"
|
||||||
|
@ -368,7 +368,7 @@
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib"
|
AdditionalDependencies="$(tcltk64Lib)"
|
||||||
TargetMachine="17"
|
TargetMachine="17"
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
|
@ -431,7 +431,7 @@
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib"
|
AdditionalDependencies="$(tcltkLib)"
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCALinkTool"
|
Name="VCALinkTool"
|
||||||
|
@ -494,7 +494,7 @@
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib"
|
AdditionalDependencies="$(tcltk64Lib)"
|
||||||
TargetMachine="17"
|
TargetMachine="17"
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
|
|
|
@ -12,14 +12,24 @@ import shutil
|
||||||
here = os.path.abspath(os.path.dirname(__file__))
|
here = os.path.abspath(os.path.dirname(__file__))
|
||||||
par = os.path.pardir
|
par = os.path.pardir
|
||||||
|
|
||||||
TCL = "tcl8.4.16"
|
if 1:
|
||||||
TK = "tk8.4.16"
|
TCL = "tcl8.4.16"
|
||||||
TIX = "tix-8.4.0"
|
TK = "tk8.4.16"
|
||||||
#TIX = "Tix8.4.2"
|
TIX = "tix-8.4.0"
|
||||||
ROOT = os.path.abspath(os.path.join(here, par, par))
|
else:
|
||||||
NMAKE = "nmake /nologo "
|
TCL = "tcl8.5b3"
|
||||||
|
TK = "tcl8.5b3"
|
||||||
|
TIX = "Tix8.4.2"
|
||||||
|
|
||||||
def system(cmd):
|
ROOT = os.path.abspath(os.path.join(here, par, par))
|
||||||
|
# Windows 2000 compatibility: WINVER 0x0500
|
||||||
|
# http://msdn2.microsoft.com/en-us/library/aa383745.aspx
|
||||||
|
NMAKE = "nmake /nologo /f %s COMPILERFLAGS=-DWINVER=0x0500 %s %s"
|
||||||
|
|
||||||
|
def nmake(makefile, command="", **kw):
|
||||||
|
defines = ' '.join(k+'='+v for k, v in kw.items())
|
||||||
|
cmd = NMAKE % (makefile, defines, command)
|
||||||
|
print("\n\n"+cmd+"\n")
|
||||||
if os.system(cmd) != 0:
|
if os.system(cmd) != 0:
|
||||||
raise RuntimeError(cmd)
|
raise RuntimeError(cmd)
|
||||||
|
|
||||||
|
@ -35,31 +45,29 @@ def build(platform, clean):
|
||||||
|
|
||||||
# TCL
|
# TCL
|
||||||
tcldir = os.path.join(ROOT, TCL)
|
tcldir = os.path.join(ROOT, TCL)
|
||||||
if True:
|
if 1:
|
||||||
os.chdir(os.path.join(tcldir, "win"))
|
os.chdir(os.path.join(tcldir, "win"))
|
||||||
if clean:
|
if clean:
|
||||||
system(NMAKE + "/f makefile.vc clean")
|
nmake("makefile.vc", "clean")
|
||||||
system(NMAKE + "/f makefile.vc")
|
nmake("makefile.vc")
|
||||||
system(NMAKE + "/f makefile.vc INSTALLDIR=%s install" % dest)
|
nmake("makefile.vc", "install", INSTALLDIR=dest)
|
||||||
|
|
||||||
# TK
|
# TK
|
||||||
if True:
|
if 1:
|
||||||
os.chdir(os.path.join(ROOT, TK, "win"))
|
os.chdir(os.path.join(ROOT, TK, "win"))
|
||||||
if clean:
|
if clean:
|
||||||
system(NMAKE + "/f makefile.vc clean")
|
nmake("makefile.vc", "clean", TCLDIR=tcldir)
|
||||||
system(NMAKE + "/f makefile.vc TCLDIR=%s" % tcldir)
|
nmake("makefile.vc", TCLDIR=tcldir)
|
||||||
system(NMAKE + "/f makefile.vc TCLDIR=%s INSTALLDIR=%s install" %
|
nmake("makefile.vc", "install", TCLDIR=tcldir, INSTALLDIR=dest)
|
||||||
(tcldir, dest))
|
|
||||||
|
|
||||||
# TIX
|
# TIX
|
||||||
if True:
|
if 1:
|
||||||
# python9.mak is available at http://svn.python.org
|
# python9.mak is available at http://svn.python.org
|
||||||
os.chdir(os.path.join(ROOT, TIX, "win"))
|
os.chdir(os.path.join(ROOT, TIX, "win"))
|
||||||
if clean:
|
if clean:
|
||||||
system(NMAKE + "/f python9.mak clean")
|
nmake("python9.mak", "clean")
|
||||||
system(NMAKE + "/f python9.mak MACHINE=%s" % machine)
|
nmake("python9.mak", MACHINE=machine)
|
||||||
system(NMAKE + "/f python9.mak install")
|
nmake("python9.mak", "install")
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
if len(sys.argv) < 2 or sys.argv[1] not in ("Win32", "x64"):
|
if len(sys.argv) < 2 or sys.argv[1] not in ("Win32", "x64"):
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
@echo off
|
||||||
|
rem start idle
|
||||||
|
rem Usage: idle [-d]
|
||||||
|
rem -d Run Debug build (python_d.exe). Else release build.
|
||||||
|
|
||||||
|
setlocal
|
||||||
|
set exe=python
|
||||||
|
PATH %PATH%;..\..\tcltk\bin
|
||||||
|
|
||||||
|
if "%1"=="-d" (set exe=python_d) & shift
|
||||||
|
|
||||||
|
set cmd=%exe% ../Lib/idlelib/idle.py %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||||
|
|
||||||
|
echo on
|
||||||
|
%cmd%
|
|
@ -68,4 +68,12 @@
|
||||||
Name="tcltk64Dir"
|
Name="tcltk64Dir"
|
||||||
Value="..\..\tcltk64"
|
Value="..\..\tcltk64"
|
||||||
/>
|
/>
|
||||||
|
<UserMacro
|
||||||
|
Name="tcltkLib"
|
||||||
|
Value="$(tcltkDir)\lib\tcl84.lib $(tcltkDir)\lib\tk84.lib $(tcltkDir)\lib\tix8.4\tix84.lib"
|
||||||
|
/>
|
||||||
|
<UserMacro
|
||||||
|
Name="tcltk64Lib"
|
||||||
|
Value="$(tcltk64Dir)\lib\tcl84.lib $(tcltk64Dir)\lib\tk84.lib $(tcltk64Dir)\lib\tix8.4\tix84.lib"
|
||||||
|
/>
|
||||||
</VisualStudioPropertySheet>
|
</VisualStudioPropertySheet>
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
<?xml version="1.0"?>
|
|
||||||
<project>
|
|
||||||
<target name="all" description="Build all targets.">
|
|
||||||
<solution configuration="release">
|
|
||||||
<projects>
|
|
||||||
<include name="make_versioninfo.vcproj" />
|
|
||||||
</projects>
|
|
||||||
</solution>
|
|
||||||
<exec program="make_versioninfo" output="pythonnt_rc.h" />
|
|
||||||
|
|
||||||
<solution configuration="release" solutionfile="pcbuild.sln">
|
|
||||||
<excludeprojects>
|
|
||||||
<include name="_bsddb.vcproj" />
|
|
||||||
</excludeprojects>
|
|
||||||
</solution>
|
|
||||||
</target>
|
|
||||||
</project>
|
|
|
@ -1,337 +0,0 @@
|
||||||
; Script generated by the Inno Setup Script Wizard.
|
|
||||||
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
|
|
||||||
|
|
||||||
; This is the whole ball of wax for an Inno installer for Python.
|
|
||||||
; To use, download Inno Setup from http://www.jrsoftware.org/isdl.htm/,
|
|
||||||
; install it, and double-click on this file. That launches the Inno
|
|
||||||
; script compiler. The GUI is extemely simple, and has only one button
|
|
||||||
; you may not recognize instantly: click it. You're done. It builds
|
|
||||||
; the installer into PCBuild/Python-2.2a1.exe. Size and speed of the
|
|
||||||
; installer are competitive with the Wise installer; Inno uninstall
|
|
||||||
; seems much quicker than Wise (but also feebler, and the uninstall
|
|
||||||
; log is in some un(human)readable binary format).
|
|
||||||
;
|
|
||||||
; What's Done
|
|
||||||
; -----------
|
|
||||||
; All the usual Windows Python files are installed by this now.
|
|
||||||
; All the usual Windows Python Start menu entries are created and
|
|
||||||
; work fine.
|
|
||||||
; .py, .pyw, .pyc and .pyo extensions are registered.
|
|
||||||
; PROBLEM: Inno uninstall does not restore their previous registry
|
|
||||||
; associations (if any). Wise did. This will make life
|
|
||||||
; difficult for alpha (etc) testers.
|
|
||||||
; The Python install is fully functional for "typical" uses.
|
|
||||||
;
|
|
||||||
; What's Not Done
|
|
||||||
; ---------------
|
|
||||||
; None of "Mark Hammond's" registry entries are written.
|
|
||||||
; No installation of files is done into the system dir:
|
|
||||||
; The MS DLLs aren't handled at all by this yet.
|
|
||||||
; Python22.dll is unpacked into the main Python dir.
|
|
||||||
;
|
|
||||||
; Inno can't do different things on NT/2000 depending on whether the user
|
|
||||||
; has Admin privileges, so I don't know how to "solve" either of those,
|
|
||||||
; short of building two installers (one *requiring* Admin privs, the
|
|
||||||
; other not doing anything that needs Admin privs).
|
|
||||||
;
|
|
||||||
; Inno has no concept of variables, so lots of lines in this file need
|
|
||||||
; to be fiddled by hand across releases. Simplest way out: stick this
|
|
||||||
; file in a giant triple-quoted r-string (note that backslashes are
|
|
||||||
; required all over the place here -- forward slashes DON'T WORK in
|
|
||||||
; Inno), and use %(yadda)s string interpolation to do substitutions; i.e.,
|
|
||||||
; write a very simple Python program to *produce* this script.
|
|
||||||
|
|
||||||
[Setup]
|
|
||||||
AppName=Python and combined Win32 Extensions
|
|
||||||
AppVerName=Python 2.2.2 and combined Win32 Extensions 150
|
|
||||||
AppId=Python 2.2.2.150
|
|
||||||
AppVersion=2.2.2.150
|
|
||||||
AppCopyright=Python is Copyright © 2001 Python Software Foundation. Win32 Extensions are Copyright © 1996-2001 Greg Stein and Mark Hammond.
|
|
||||||
|
|
||||||
; Default install dir; value of {app} later (unless user overrides).
|
|
||||||
; {sd} = system root drive, probably "C:".
|
|
||||||
DefaultDirName={sd}\Python22
|
|
||||||
;DefaultDirName={pf}\Python
|
|
||||||
|
|
||||||
; Start menu folder name; value of {group} later (unless user overrides).
|
|
||||||
DefaultGroupName=Python 2.2
|
|
||||||
|
|
||||||
; Point SourceDir to one above PCBuild = src.
|
|
||||||
; means this script can run unchanged from anyone's CVS tree, no matter
|
|
||||||
; what they called the top-level directories.
|
|
||||||
SourceDir=.
|
|
||||||
OutputDir=..
|
|
||||||
OutputBaseFilename=Python-2.2.2-Win32-150-Setup
|
|
||||||
|
|
||||||
AppPublisher=PythonLabs at Digital Creations
|
|
||||||
AppPublisherURL=http://www.python.org
|
|
||||||
AppSupportURL=http://www.python.org
|
|
||||||
AppUpdatesURL=http://www.python.org
|
|
||||||
|
|
||||||
AlwaysCreateUninstallIcon=true
|
|
||||||
ChangesAssociations=true
|
|
||||||
UninstallLogMode=new
|
|
||||||
AllowNoIcons=true
|
|
||||||
AdminPrivilegesRequired=true
|
|
||||||
UninstallDisplayIcon={app}\pyc.ico
|
|
||||||
WizardDebug=false
|
|
||||||
|
|
||||||
; The fewer screens the better; leave these commented.
|
|
||||||
|
|
||||||
Compression=bzip
|
|
||||||
InfoBeforeFile=LICENSE.txt
|
|
||||||
;InfoBeforeFile=Misc\NEWS
|
|
||||||
|
|
||||||
; uncomment the following line if you want your installation to run on NT 3.51 too.
|
|
||||||
; MinVersion=4,3.51
|
|
||||||
|
|
||||||
[Types]
|
|
||||||
Name: normal; Description: Select desired components; Flags: iscustom
|
|
||||||
|
|
||||||
[Components]
|
|
||||||
Name: main; Description: Python and Win32 Extensions; Types: normal
|
|
||||||
Name: docs; Description: Python documentation (HTML); Types: normal
|
|
||||||
Name: tk; Description: TCL/TK, tkinter, and Idle; Types: normal
|
|
||||||
Name: tools; Description: Python utility scripts (Tools\); Types: normal
|
|
||||||
Name: test; Description: Python test suite (Lib\test\); Types: normal
|
|
||||||
|
|
||||||
[Tasks]
|
|
||||||
Name: extensions; Description: Register file associations (.py, .pyw, .pyc, .pyo); Components: main; Check: IsAdminLoggedOn
|
|
||||||
|
|
||||||
[Files]
|
|
||||||
; Caution: Using forward slashes instead screws up in amazing ways.
|
|
||||||
; Unknown: By the time Components (and other attrs) are added to these lines, they're
|
|
||||||
; going to get awfully long. But don't see a way to continue logical lines across
|
|
||||||
; physical lines.
|
|
||||||
|
|
||||||
Source: LICENSE.txt; DestDir: {app}; CopyMode: alwaysoverwrite
|
|
||||||
Source: README.txt; DestDir: {app}; CopyMode: alwaysoverwrite
|
|
||||||
Source: News.txt; DestDir: {app}; CopyMode: alwaysoverwrite
|
|
||||||
Source: *.ico; DestDir: {app}; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: python.exe; DestDir: {app}; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
Source: pythonw.exe; DestDir: {app}; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
Source: w9xpopen.exe; DestDir: {app}; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
|
|
||||||
Source: DLLs\tcl83.dll; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: tk
|
|
||||||
Source: DLLs\tk83.dll; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: tk
|
|
||||||
Source: tcl\*.*; DestDir: {app}\tcl; CopyMode: alwaysoverwrite; Components: tk; Flags: recursesubdirs
|
|
||||||
|
|
||||||
Source: sysdir\python22.dll; DestDir: {sys}; CopyMode: alwaysskipifsameorolder; Components: main; Flags: sharedfile restartreplace
|
|
||||||
Source: sysdir\PyWinTypes22.dll; DestDir: {sys}; CopyMode: alwaysskipifsameorolder; Components: main; Flags: restartreplace sharedfile
|
|
||||||
Source: sysdir\pythoncom22.dll; DestDir: {sys}; CopyMode: alwaysskipifsameorolder; Components: main; Flags: restartreplace sharedfile
|
|
||||||
|
|
||||||
Source: DLLs\_socket.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
Source: libs\_socket.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: DLLs\_sre.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
Source: libs\_sre.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: DLLs\_symtable.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
Source: libs\_symtable.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: DLLs\_testcapi.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
Source: libs\_testcapi.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: DLLs\_tkinter.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: tk
|
|
||||||
Source: libs\_tkinter.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: tk
|
|
||||||
|
|
||||||
Source: DLLs\bsddb.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
Source: libs\bsddb.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: DLLs\mmap.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
Source: libs\mmap.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: DLLs\parser.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
Source: libs\parser.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: DLLs\pyexpat.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
Source: libs\pyexpat.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: DLLs\select.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
Source: libs\select.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: DLLs\unicodedata.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
Source: libs\unicodedata.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: DLLs\_winreg.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
Source: libs\_winreg.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: DLLs\winsound.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
Source: libs\winsound.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: DLLs\zlib.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
Source: libs\zlib.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: libs\python22.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: DLLs\expat.dll; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Source: Lib\*.py; DestDir: {app}\Lib; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
Source: Lib\distutils\*.*; DestDir: {app}\Lib\distutils; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
|
|
||||||
Source: Lib\email\*.*; DestDir: {app}\Lib\email; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
|
|
||||||
Source: Lib\encodings\*.*; DestDir: {app}\Lib\encodings; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
|
|
||||||
Source: Lib\lib-old\*.*; DestDir: {app}\Lib\lib-old; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
|
|
||||||
Source: Lib\xml\*.*; DestDir: {app}\Lib\xml; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
|
|
||||||
Source: Lib\test\*.*; DestDir: {app}\Lib\test; CopyMode: alwaysoverwrite; Components: test; Flags: recursesubdirs
|
|
||||||
|
|
||||||
Source: Lib\site-packages\README.txt; DestDir: {app}\Lib\site-packages; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: Lib\site-packages\PyWin32.chm; DestDir: {app}\Lib\site-packages; CopyMode: alwaysoverwrite; Components: docs
|
|
||||||
Source: Lib\site-packages\win32\*.*; DestDir: {app}\Lib\site-packages\win32; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
|
|
||||||
Source: Lib\site-packages\win32com\*.*; DestDir: {app}\Lib\site-packages\win32com; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
|
|
||||||
Source: Lib\site-packages\win32comext\*.*; DestDir: {app}\Lib\site-packages\win32comext; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
|
|
||||||
|
|
||||||
Source: Lib\lib-tk\*.py; DestDir: {app}\Lib\lib-tk; CopyMode: alwaysoverwrite; Components: tk; Flags: recursesubdirs
|
|
||||||
|
|
||||||
Source: include\*.h; DestDir: {app}\include; CopyMode: alwaysoverwrite; Components: main
|
|
||||||
|
|
||||||
Source: Tools\idle\*.*; DestDir: {app}\Tools\idle; CopyMode: alwaysoverwrite; Components: tk; Flags: recursesubdirs
|
|
||||||
|
|
||||||
Source: Tools\pynche\*.*; DestDir: {app}\Tools\pynche; CopyMode: alwaysoverwrite; Components: tools; Flags: recursesubdirs
|
|
||||||
Source: Tools\scripts\*.*; DestDir: {app}\Tools\Scripts; CopyMode: alwaysoverwrite; Components: tools; Flags: recursesubdirs
|
|
||||||
Source: Tools\webchecker\*.*; DestDir: {app}\Tools\webchecker; CopyMode: alwaysoverwrite; Components: tools; Flags: recursesubdirs
|
|
||||||
Source: Tools\versioncheck\*.*; DestDir: {app}\Tools\versioncheck; CopyMode: alwaysoverwrite; Components: tools; Flags: recursesubdirs
|
|
||||||
|
|
||||||
Source: Doc\*.*; DestDir: {app}\Doc; CopyMode: alwaysoverwrite; Flags: recursesubdirs; Components: docs
|
|
||||||
|
|
||||||
|
|
||||||
[Icons]
|
|
||||||
Name: {group}\Python (command line); Filename: {app}\python.exe; WorkingDir: {app}; Components: main
|
|
||||||
Name: {group}\Python Manuals; Filename: {app}\Doc\index.html; WorkingDir: {app}; Components: docs
|
|
||||||
Name: {group}\Win32 Extensions Help; Filename: {app}\Lib\site-packages\PyWin32.chm; WorkingDir: {app}\Lib\site-packages; Components: docs
|
|
||||||
Name: {group}\Module Docs; Filename: {app}\pythonw.exe; WorkingDir: {app}; Parameters: """{app}\Tools\Scripts\pydoc.pyw"""; Components: tools
|
|
||||||
Name: {group}\IDLE (Python GUI); Filename: {app}\pythonw.exe; WorkingDir: {app}; Parameters: """{app}\Tools\idle\idle.pyw"""; Components: tools
|
|
||||||
|
|
||||||
[Registry]
|
|
||||||
; Register .py
|
|
||||||
Tasks: extensions; Root: HKCR; Subkey: .py; ValueType: string; ValueName: ; ValueData: Python File; Flags: uninsdeletevalue
|
|
||||||
Tasks: extensions; Root: HKCR; Subkey: .py; ValueType: string; ValueName: Content Type; ValueData: text/plain; Flags: uninsdeletevalue
|
|
||||||
Tasks: extensions; Root: HKCR; Subkey: Python File; ValueType: string; ValueName: ; ValueData: Python File; Flags: uninsdeletekey
|
|
||||||
Tasks: extensions; Root: HKCR; Subkey: Python File\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\Py.ico
|
|
||||||
Tasks: extensions; Root: HKCR; Subkey: Python File\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\python.exe"" ""%1"" %*"
|
|
||||||
|
|
||||||
; Register .pyc
|
|
||||||
Tasks: extensions; Root: HKCR; Subkey: .pyc; ValueType: string; ValueName: ; ValueData: Python CompiledFile; Flags: uninsdeletevalue
|
|
||||||
Tasks: extensions; Root: HKCR; Subkey: Python CompiledFile; ValueType: string; ValueName: ; ValueData: Compiled Python File; Flags: uninsdeletekey
|
|
||||||
Tasks: extensions; Root: HKCR; Subkey: Python CompiledFile\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\pyc.ico
|
|
||||||
Tasks: extensions; Root: HKCR; Subkey: Python CompiledFile\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\python.exe"" ""%1"" %*"
|
|
||||||
|
|
||||||
; Register .pyo
|
|
||||||
Tasks: extensions; Root: HKCR; Subkey: .pyo; ValueType: string; ValueName: ; ValueData: Python CompiledFile; Flags: uninsdeletevalue
|
|
||||||
|
|
||||||
; Register .pyw
|
|
||||||
Tasks: extensions; Root: HKCR; Subkey: .pyw; ValueType: string; ValueName: ; ValueData: Python NoConFile; Flags: uninsdeletevalue
|
|
||||||
Tasks: extensions; Root: HKCR; Subkey: .pyw; ValueType: string; ValueName: Content Type; ValueData: text/plain; Flags: uninsdeletevalue
|
|
||||||
Tasks: extensions; Root: HKCR; Subkey: Python NoConFile; ValueType: string; ValueName: ; ValueData: Python File (no console); Flags: uninsdeletekey
|
|
||||||
Tasks: extensions; Root: HKCR; Subkey: Python NoConFile\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\Py.ico
|
|
||||||
Tasks: extensions; Root: HKCR; Subkey: Python NoConFile\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\pythonw.exe"" ""%1"" %*"
|
|
||||||
|
|
||||||
|
|
||||||
; Python Registry Keys
|
|
||||||
Root: HKLM; Subkey: SOFTWARE\Python; Flags: uninsdeletekeyifempty; Check: IsAdminLoggedOn
|
|
||||||
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore; Flags: uninsdeletekeyifempty
|
|
||||||
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2; Flags: uninsdeletekeyifempty
|
|
||||||
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\PythonPath; ValueData: "{app}\Lib;{app}\DLLs"; Flags: uninsdeletekeyifempty
|
|
||||||
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\PythonPath\tk; ValueData: {app}\Lib\lib-tk; Flags: uninsdeletekey; Components: tk
|
|
||||||
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\PythonPath\win32; ValueData: "{app}\lib\site-packages\win32;{app}\lib\site-packages\win32\lib"; Flags: uninsdeletekey
|
|
||||||
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\PythonPath\win32com; ValueData: C:\Python\lib\site-packages; Flags: uninsdeletekey
|
|
||||||
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Modules; Flags: uninsdeletekeyifempty
|
|
||||||
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Modules\pythoncom; ValueData: {sys}\pythoncom22.dll; Flags: uninsdeletekey
|
|
||||||
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Modules\pywintypes; ValueData: {sys}\PyWinTypes22.dll; Flags: uninsdeletekey
|
|
||||||
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\InstallPath; ValueData: {app}; Flags: uninsdeletekeyifempty; ValueType: string
|
|
||||||
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\InstallPath\InstallGroup; ValueData: {group}; Flags: uninsdeletekey
|
|
||||||
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Help; Flags: uninsdeletekeyifempty
|
|
||||||
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Help\Main Python Documentation; ValueType: string; ValueData: {app}\Doc\index.html; Flags: uninsdeletekey; Components: docs
|
|
||||||
Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Help\Python Win32 Documentation; ValueType: string; ValueData: {app}\lib\site-packages\PyWin32.chm; Flags: uninsdeletekey; Components: docs
|
|
||||||
|
|
||||||
[_ISTool]
|
|
||||||
EnableISX=true
|
|
||||||
|
|
||||||
|
|
||||||
[Code]
|
|
||||||
Program Setup;
|
|
||||||
|
|
||||||
Function IsAdminNotLoggedOn(): Boolean;
|
|
||||||
begin
|
|
||||||
Result := Not IsAdminLoggedOn();
|
|
||||||
end;
|
|
||||||
|
|
||||||
begin
|
|
||||||
end.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[UninstallDelete]
|
|
||||||
Name: {app}\Lib\distutils\command\*.pyc; Type: files
|
|
||||||
Name: {app}\Lib\distutils\command\*.pyo; Type: files
|
|
||||||
Name: {app}\Lib\distutils\command; Type: dirifempty
|
|
||||||
Name: {app}\Lib\distutils\*.pyc; Type: files
|
|
||||||
Name: {app}\Lib\distutils\*.pyo; Type: files
|
|
||||||
Name: {app}\Lib\distutils; Type: dirifempty
|
|
||||||
Name: {app}\Lib\email\test\*.pyc; Type: files
|
|
||||||
Name: {app}\Lib\email\test\*.pyo; Type: files
|
|
||||||
Name: {app}\Lib\email\test; Type: dirifempty
|
|
||||||
Name: {app}\Lib\email\*.pyc; Type: files
|
|
||||||
Name: {app}\Lib\email\*.pyo; Type: files
|
|
||||||
Name: {app}\Lib\email; Type: dirifempty
|
|
||||||
Name: {app}\Lib\encodings\*.pyc; Type: files
|
|
||||||
Name: {app}\Lib\encodings\*.pyo; Type: files
|
|
||||||
Name: {app}\Lib\encodings; Type: dirifempty
|
|
||||||
Name: {app}\Lib\lib-old\*.pyc; Type: files
|
|
||||||
Name: {app}\Lib\lib-old\*.pyo; Type: files
|
|
||||||
Name: {app}\Lib\lib-old; Type: dirifempty
|
|
||||||
Name: {app}\Lib\lib-tk\*.pyc; Type: files
|
|
||||||
Name: {app}\Lib\lib-tk\*.pyo; Type: files
|
|
||||||
Name: {app}\Lib\lib-tk; Type: dirifempty
|
|
||||||
Name: {app}\Lib\test\*.pyc; Type: files
|
|
||||||
Name: {app}\Lib\test\*.pyo; Type: files
|
|
||||||
Name: {app}\Lib\test; Type: dirifempty
|
|
||||||
Name: {app}\Lib\xml\dom\*.pyc; Type: files
|
|
||||||
Name: {app}\Lib\xml\dom\*.pyo; Type: files
|
|
||||||
Name: {app}\Lib\xml\dom; Type: dirifempty
|
|
||||||
Name: {app}\Lib\xml\parsers\*.pyc; Type: files
|
|
||||||
Name: {app}\Lib\xml\parsers\*.pyo; Type: files
|
|
||||||
Name: {app}\Lib\xml\parsers; Type: dirifempty
|
|
||||||
Name: {app}\Lib\xml\sax\*.pyc; Type: files
|
|
||||||
Name: {app}\Lib\xml\sax\*.pyo; Type: files
|
|
||||||
Name: {app}\Lib\xml\sax; Type: dirifempty
|
|
||||||
Name: {app}\Lib\xml\*.pyc; Type: files
|
|
||||||
Name: {app}\Lib\xml\*.pyo; Type: files
|
|
||||||
Name: {app}\Lib\xml; Type: dirifempty
|
|
||||||
|
|
||||||
Name: {app}\Lib\site-packages\win32; Type: filesandordirs
|
|
||||||
Name: {app}\Lib\site-packages\win32com; Type: filesandordirs
|
|
||||||
Name: {app}\Lib\site-packages\win32comext; Type: filesandordirs
|
|
||||||
Name: {app}\Lib\site-packages\pythoncom.py*; Type: files
|
|
||||||
Name: {app}\Lib\site-packages; Type: dirifempty
|
|
||||||
|
|
||||||
Name: {app}\Lib\*.pyc; Type: files
|
|
||||||
Name: {app}\Lib; Type: dirifempty
|
|
||||||
|
|
||||||
Name: {app}\Tools\pynche\*.pyc; Type: files
|
|
||||||
Name: {app}\Tools\pynche\*.pyo; Type: files
|
|
||||||
Name: {app}\Tools\pynche; Type: dirifempty
|
|
||||||
|
|
||||||
Name: {app}\Tools\idle\*.pyc; Type: files
|
|
||||||
Name: {app}\Tools\idle\*.pyo; Type: files
|
|
||||||
Name: {app}\Tools\idle; Type: dirifempty
|
|
||||||
|
|
||||||
Name: {app}\Tools\scripts\*.pyc; Type: files
|
|
||||||
Name: {app}\Tools\scripts\*.pyo; Type: files
|
|
||||||
Name: {app}\Tools\scripts; Type: dirifempty
|
|
||||||
|
|
||||||
Name: {app}\Tools\versioncheck\*.pyc; Type: files
|
|
||||||
Name: {app}\Tools\versioncheck\*.pyo; Type: files
|
|
||||||
Name: {app}\Tools\versioncheck; Type: dirifempty
|
|
||||||
|
|
||||||
Name: {app}\Tools\webchecker\*.pyc; Type: files
|
|
||||||
Name: {app}\Tools\webchecker\*.pyo; Type: files
|
|
||||||
Name: {app}\Tools\webchecker; Type: dirifempty
|
|
||||||
|
|
||||||
Name: {app}\Tools; Type: dirifempty
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -878,6 +878,10 @@
|
||||||
RelativePath="..\Include\pystate.h"
|
RelativePath="..\Include\pystate.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\Include\pystrcmp.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\Include\pystrtod.h"
|
RelativePath="..\Include\pystrtod.h"
|
||||||
>
|
>
|
||||||
|
@ -1714,6 +1718,10 @@
|
||||||
RelativePath="..\Python\pystate.c"
|
RelativePath="..\Python\pystate.c"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\Python\pystrcmp.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\Python\pystrtod.c"
|
RelativePath="..\Python\pystrtod.c"
|
||||||
>
|
>
|
||||||
|
|
|
@ -1787,11 +1787,23 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BUILD_MAP:
|
case BUILD_MAP:
|
||||||
x = PyDict_New();
|
x = _PyDict_NewPresized((Py_ssize_t)oparg);
|
||||||
PUSH(x);
|
PUSH(x);
|
||||||
if (x != NULL) continue;
|
if (x != NULL) continue;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case STORE_MAP:
|
||||||
|
w = TOP(); /* key */
|
||||||
|
u = SECOND(); /* value */
|
||||||
|
v = THIRD(); /* dict */
|
||||||
|
STACKADJ(-2);
|
||||||
|
assert (PyDict_CheckExact(v));
|
||||||
|
err = PyDict_SetItem(v, w, u); /* v[w] = u */
|
||||||
|
Py_DECREF(u);
|
||||||
|
Py_DECREF(w);
|
||||||
|
if (err == 0) continue;
|
||||||
|
break;
|
||||||
|
|
||||||
case LOAD_ATTR:
|
case LOAD_ATTR:
|
||||||
w = GETITEM(names, oparg);
|
w = GETITEM(names, oparg);
|
||||||
v = TOP();
|
v = TOP();
|
||||||
|
|
|
@ -714,6 +714,8 @@ opcode_stack_effect(int opcode, int oparg)
|
||||||
return -1;
|
return -1;
|
||||||
case STORE_SUBSCR:
|
case STORE_SUBSCR:
|
||||||
return -3;
|
return -3;
|
||||||
|
case STORE_MAP:
|
||||||
|
return -2;
|
||||||
case DELETE_SUBSCR:
|
case DELETE_SUBSCR:
|
||||||
return -2;
|
return -2;
|
||||||
|
|
||||||
|
@ -3169,19 +3171,14 @@ compiler_visit_expr(struct compiler *c, expr_ty e)
|
||||||
case IfExp_kind:
|
case IfExp_kind:
|
||||||
return compiler_ifexp(c, e);
|
return compiler_ifexp(c, e);
|
||||||
case Dict_kind:
|
case Dict_kind:
|
||||||
/* XXX get rid of arg? */
|
|
||||||
ADDOP_I(c, BUILD_MAP, 0);
|
|
||||||
n = asdl_seq_LEN(e->v.Dict.values);
|
n = asdl_seq_LEN(e->v.Dict.values);
|
||||||
/* We must arrange things just right for STORE_SUBSCR.
|
ADDOP_I(c, BUILD_MAP, (n>255 ? 255 : n));
|
||||||
It wants the stack to look like (value) (dict) (key) */
|
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
ADDOP(c, DUP_TOP);
|
|
||||||
VISIT(c, expr,
|
VISIT(c, expr,
|
||||||
(expr_ty)asdl_seq_GET(e->v.Dict.values, i));
|
(expr_ty)asdl_seq_GET(e->v.Dict.values, i));
|
||||||
ADDOP(c, ROT_TWO);
|
|
||||||
VISIT(c, expr,
|
VISIT(c, expr,
|
||||||
(expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
|
(expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
|
||||||
ADDOP(c, STORE_SUBSCR);
|
ADDOP(c, STORE_MAP);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Set_kind:
|
case Set_kind:
|
||||||
|
|
|
@ -66,7 +66,7 @@ extern time_t PyOS_GetLastModificationTime(char *, FILE *);
|
||||||
Python 2.5c1: 62121 (fix wrong lnotab with for loops and
|
Python 2.5c1: 62121 (fix wrong lnotab with for loops and
|
||||||
storing constants that should have been removed)
|
storing constants that should have been removed)
|
||||||
Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
|
Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
|
||||||
Python 2.6a0: 62141 (peephole optimizations)
|
Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
|
||||||
Python 3000: 3000
|
Python 3000: 3000
|
||||||
3010 (removed UNARY_CONVERT)
|
3010 (removed UNARY_CONVERT)
|
||||||
3020 (added BUILD_SET)
|
3020 (added BUILD_SET)
|
||||||
|
@ -77,9 +77,10 @@ extern time_t PyOS_GetLastModificationTime(char *, FILE *);
|
||||||
3070 (PEP 3109 raise changes)
|
3070 (PEP 3109 raise changes)
|
||||||
3080 (PEP 3137 make __file__ and __name__ unicode)
|
3080 (PEP 3137 make __file__ and __name__ unicode)
|
||||||
3090 (kill str8 interning)
|
3090 (kill str8 interning)
|
||||||
|
3100 (merge from 2.6a0, see 62151)
|
||||||
.
|
.
|
||||||
*/
|
*/
|
||||||
#define MAGIC (3090 | ((long)'\r'<<16) | ((long)'\n'<<24))
|
#define MAGIC (3100 | ((long)'\r'<<16) | ((long)'\n'<<24))
|
||||||
|
|
||||||
/* Magic word as global; note that _PyImport_Init() can change the
|
/* Magic word as global; note that _PyImport_Init() can change the
|
||||||
value of this global to accommodate for alterations of how the
|
value of this global to accommodate for alterations of how the
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
/* Cross platform case insenstive string compare functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Python.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
PyOS_mystrnicmp(const char *s1, const char *s2, Py_ssize_t size)
|
||||||
|
{
|
||||||
|
if (size == 0)
|
||||||
|
return 0;
|
||||||
|
while ((--size > 0) && (tolower(*s1) == tolower(*s2))) {
|
||||||
|
if (!*s1++ || !*s2++)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return tolower(*s1) - tolower(*s2);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
PyOS_mystricmp(const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
while (*s1 && (tolower(*s1++) == tolower(*s2++))) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
return (tolower(*s1) - tolower(*s2));
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# From configure.in Revision: 59484 .
|
# From configure.in Revision: 59533 .
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.61 for python 3.0.
|
# Generated by GNU Autoconf 2.61 for python 3.0.
|
||||||
#
|
#
|
||||||
|
@ -20581,6 +20581,9 @@ echo "${ECHO_T}default LIBC=\"$LIBC\"" >&6; }
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# ************************************
|
||||||
|
# * Check for mathematical functions *
|
||||||
|
# ************************************
|
||||||
# check for hypot() in math library
|
# check for hypot() in math library
|
||||||
LIBS_SAVE=$LIBS
|
LIBS_SAVE=$LIBS
|
||||||
LIBS="$LIBS $LIBM"
|
LIBS="$LIBS $LIBM"
|
||||||
|
@ -20686,6 +20689,105 @@ fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for ac_func in copysign isfinite isnan isinf
|
||||||
|
do
|
||||||
|
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||||
|
{ echo "$as_me:$LINENO: checking for $ac_func" >&5
|
||||||
|
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
|
||||||
|
if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
|
||||||
|
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||||
|
else
|
||||||
|
cat >conftest.$ac_ext <<_ACEOF
|
||||||
|
/* confdefs.h. */
|
||||||
|
_ACEOF
|
||||||
|
cat confdefs.h >>conftest.$ac_ext
|
||||||
|
cat >>conftest.$ac_ext <<_ACEOF
|
||||||
|
/* end confdefs.h. */
|
||||||
|
/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
|
||||||
|
For example, HP-UX 11i <limits.h> declares gettimeofday. */
|
||||||
|
#define $ac_func innocuous_$ac_func
|
||||||
|
|
||||||
|
/* System header to define __stub macros and hopefully few prototypes,
|
||||||
|
which can conflict with char $ac_func (); below.
|
||||||
|
Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
|
||||||
|
<limits.h> exists even on freestanding compilers. */
|
||||||
|
|
||||||
|
#ifdef __STDC__
|
||||||
|
# include <limits.h>
|
||||||
|
#else
|
||||||
|
# include <assert.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef $ac_func
|
||||||
|
|
||||||
|
/* Override any GCC internal prototype to avoid an error.
|
||||||
|
Use char because int might match the return type of a GCC
|
||||||
|
builtin and then its argument prototype would still apply. */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
#endif
|
||||||
|
char $ac_func ();
|
||||||
|
/* The GNU C library defines this for functions which it implements
|
||||||
|
to always fail with ENOSYS. Some functions are actually named
|
||||||
|
something starting with __ and the normal name is an alias. */
|
||||||
|
#if defined __stub_$ac_func || defined __stub___$ac_func
|
||||||
|
choke me
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
return $ac_func ();
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||||
|
if { (ac_try="$ac_link"
|
||||||
|
case "(($ac_try" in
|
||||||
|
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
|
||||||
|
*) ac_try_echo=$ac_try;;
|
||||||
|
esac
|
||||||
|
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
|
||||||
|
(eval "$ac_link") 2>conftest.er1
|
||||||
|
ac_status=$?
|
||||||
|
grep -v '^ *+' conftest.er1 >conftest.err
|
||||||
|
rm -f conftest.er1
|
||||||
|
cat conftest.err >&5
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); } && {
|
||||||
|
test -z "$ac_c_werror_flag" ||
|
||||||
|
test ! -s conftest.err
|
||||||
|
} && test -s conftest$ac_exeext &&
|
||||||
|
$as_test_x conftest$ac_exeext; then
|
||||||
|
eval "$as_ac_var=yes"
|
||||||
|
else
|
||||||
|
echo "$as_me: failed program was:" >&5
|
||||||
|
sed 's/^/| /' conftest.$ac_ext >&5
|
||||||
|
|
||||||
|
eval "$as_ac_var=no"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
|
||||||
|
conftest$ac_exeext conftest.$ac_ext
|
||||||
|
fi
|
||||||
|
ac_res=`eval echo '${'$as_ac_var'}'`
|
||||||
|
{ echo "$as_me:$LINENO: result: $ac_res" >&5
|
||||||
|
echo "${ECHO_T}$ac_res" >&6; }
|
||||||
|
if test `eval echo '${'$as_ac_var'}'` = yes; then
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
LIBS=$LIBS_SAVE
|
LIBS=$LIBS_SAVE
|
||||||
|
|
||||||
# check for wchar.h
|
# check for wchar.h
|
||||||
|
|
|
@ -2944,10 +2944,16 @@ else AC_MSG_ERROR([proper usage is --with-libc=STRING])
|
||||||
fi],
|
fi],
|
||||||
[AC_MSG_RESULT(default LIBC="$LIBC")])
|
[AC_MSG_RESULT(default LIBC="$LIBC")])
|
||||||
|
|
||||||
|
# ************************************
|
||||||
|
# * Check for mathematical functions *
|
||||||
|
# ************************************
|
||||||
# check for hypot() in math library
|
# check for hypot() in math library
|
||||||
LIBS_SAVE=$LIBS
|
LIBS_SAVE=$LIBS
|
||||||
LIBS="$LIBS $LIBM"
|
LIBS="$LIBS $LIBM"
|
||||||
AC_REPLACE_FUNCS(hypot)
|
AC_REPLACE_FUNCS(hypot)
|
||||||
|
|
||||||
|
AC_CHECK_FUNCS(copysign isfinite isnan isinf)
|
||||||
|
|
||||||
LIBS=$LIBS_SAVE
|
LIBS=$LIBS_SAVE
|
||||||
|
|
||||||
# check for wchar.h
|
# check for wchar.h
|
||||||
|
|
|
@ -82,6 +82,9 @@
|
||||||
/* Define to 1 if you have the <conio.h> header file. */
|
/* Define to 1 if you have the <conio.h> header file. */
|
||||||
#undef HAVE_CONIO_H
|
#undef HAVE_CONIO_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `copysign' function. */
|
||||||
|
#undef HAVE_COPYSIGN
|
||||||
|
|
||||||
/* Define to 1 if you have the `ctermid' function. */
|
/* Define to 1 if you have the `ctermid' function. */
|
||||||
#undef HAVE_CTERMID
|
#undef HAVE_CTERMID
|
||||||
|
|
||||||
|
@ -285,6 +288,15 @@
|
||||||
/* Define to 1 if you have the <io.h> header file. */
|
/* Define to 1 if you have the <io.h> header file. */
|
||||||
#undef HAVE_IO_H
|
#undef HAVE_IO_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `isfinite' function. */
|
||||||
|
#undef HAVE_ISFINITE
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `isinf' function. */
|
||||||
|
#undef HAVE_ISINF
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `isnan' function. */
|
||||||
|
#undef HAVE_ISNAN
|
||||||
|
|
||||||
/* Define to 1 if you have the `kill' function. */
|
/* Define to 1 if you have the `kill' function. */
|
||||||
#undef HAVE_KILL
|
#undef HAVE_KILL
|
||||||
|
|
||||||
|
@ -1034,3 +1046,4 @@
|
||||||
|
|
||||||
#endif /*Py_PYCONFIG_H*/
|
#endif /*Py_PYCONFIG_H*/
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue