AppPkg/Applications/Python/Python-2.7.10: Initial Checkin part 5/5.
These files are candidates for modification during the port to EDK II. The following files were copied, unchanged, from the Python 2.7.2 port. Ia32/pyconfig.h X64/pyconfig.h PyMod-2.7.10/Modules/config.c PyMod-2.7.10/Modules/edk2module.c Py2710ReadMe.txt // Copied from PythonReadMe.txt Python2710.inf // Copied from PythonCore.inf The remaining files were copied, unchanged, from the cPython 2.7.10 distribution. These files are unchanged and set the baseline for subsequent commits. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Daryl McDaniel <edk2-lists@mc2research.org> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18741 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
committed by
darylm503
parent
3257aa9932
commit
3ec97ca490
1262
AppPkg/Applications/Python/Python-2.7.10/Ia32/pyconfig.h
Normal file
1262
AppPkg/Applications/Python/Python-2.7.10/Ia32/pyconfig.h
Normal file
File diff suppressed because it is too large
Load Diff
198
AppPkg/Applications/Python/Python-2.7.10/Py2710ReadMe.txt
Normal file
198
AppPkg/Applications/Python/Python-2.7.10/Py2710ReadMe.txt
Normal file
@@ -0,0 +1,198 @@
|
|||||||
|
EDK II Python
|
||||||
|
ReadMe
|
||||||
|
Release 1.02
|
||||||
|
18 Jan. 2013
|
||||||
|
|
||||||
|
|
||||||
|
1. OVERVIEW
|
||||||
|
===========
|
||||||
|
This document is devoted to general information on building and setup of the
|
||||||
|
Python environment for UEFI 2.3, the invocation of the interpreter, and things
|
||||||
|
that make working with Python easier.
|
||||||
|
|
||||||
|
It is assumed that you already have either UDK2010 or a current snapshot of
|
||||||
|
the EDK II sources from www.tianocore.org, and that you can successfully build
|
||||||
|
packages within that distribution.
|
||||||
|
|
||||||
|
2. Release Notes
|
||||||
|
================
|
||||||
|
1) All C extension modules must be statically linked (built in)
|
||||||
|
2) The site and os modules must exist as discrete files in ...\lib\python.27
|
||||||
|
3) User-specific configurations are not supported.
|
||||||
|
4) Environment variables are not supported.
|
||||||
|
|
||||||
|
3. Getting and Building Python
|
||||||
|
======================================================
|
||||||
|
3.1 Getting Python
|
||||||
|
==================
|
||||||
|
Currently only version 2.7.2 of the CPython distribution is supported. For development
|
||||||
|
ease, a subset of the Python 2.7.2 distribution has been included in the AppPkg source
|
||||||
|
tree. If a full distribution is desired, the Python-2.7.2 directory can be removed or
|
||||||
|
renamed and the full source code downloaded from http://www.python.org/ftp/python/2.7.2/.
|
||||||
|
|
||||||
|
A. Within your EDK II development tree, extract the Python distribution into
|
||||||
|
AppPkg/Applications/Python. This should create the
|
||||||
|
AppPkg/Applications/Python/Python-2.7.2 directory.
|
||||||
|
|
||||||
|
B. Copy the files from PyMod-2.7.2 into the corresponding directories within
|
||||||
|
the Python-2.7.2 tree. This will overwrite existing files with files
|
||||||
|
modified for UEFI usage.
|
||||||
|
|
||||||
|
3.2 Building Python
|
||||||
|
===================
|
||||||
|
A. Edit Efi/config.c to enable the built-in modules you need.
|
||||||
|
Mandatory Built-in Modules:
|
||||||
|
edk2 errno imp marshal
|
||||||
|
|
||||||
|
Additional built-in modules which are required to use the help()
|
||||||
|
functionality provided by PyDoc, are:
|
||||||
|
_codecs _collections _functools _random
|
||||||
|
_sre _struct _weakref binascii
|
||||||
|
cStringIO gc itertools math
|
||||||
|
operator time
|
||||||
|
|
||||||
|
B. Edit AppPkg/AppPkg.dsc to enable (uncomment) the PythonCore.inf line
|
||||||
|
within the [Components] section.
|
||||||
|
|
||||||
|
C. Build AppPkg, which includes Python, using the standard "build" command:
|
||||||
|
For example, to build Python for an X64 CPU architecture:
|
||||||
|
build -a X64 -p AppPkg\AppPkg.dsc
|
||||||
|
|
||||||
|
4. Python-related paths and files
|
||||||
|
=================================
|
||||||
|
Python depends upon the existence of several directories and files on the
|
||||||
|
target system.
|
||||||
|
|
||||||
|
\EFI Root of the UEFI system area.
|
||||||
|
|- \Tools Location of the Python.efi executable.
|
||||||
|
|- \Boot UEFI specified Boot directory.
|
||||||
|
|- \StdLib Root of the Standard Libraries sub-tree.
|
||||||
|
|- \etc Configuration files used by libraries.
|
||||||
|
|- \tmp Temporary files created by tmpfile(), etc.
|
||||||
|
|- \lib Root of the libraries tree.
|
||||||
|
|- \python.27 Directory containing the Python library modules.
|
||||||
|
|- \lib-dynload Dynamically loadable Python extensions.
|
||||||
|
|- \site-packages Site-specific packages and modules.
|
||||||
|
|
||||||
|
|
||||||
|
5. Installing Python
|
||||||
|
====================
|
||||||
|
These directories, on the target system, are populated from the development
|
||||||
|
system as follows:
|
||||||
|
|
||||||
|
* \Efi\Tools receives a copy of Build/AppPkg/DEBUG_VS2005/X64/Python.efi.
|
||||||
|
^^^^^ ^^^^^^
|
||||||
|
Modify the host path to match the your build type and compiler.
|
||||||
|
|
||||||
|
* The \Efi\StdLib\etc directory is populated from the StdLib/Efi/StdLib/etc
|
||||||
|
source directory.
|
||||||
|
|
||||||
|
* Directory \Efi\StdLib\lib\python.27 is populated with packages and modules
|
||||||
|
from the AppPkg/Applications/Python/Python-2.7.2/Lib directory.
|
||||||
|
The recommended minimum set of modules (.py, .pyc, and/or .pyo):
|
||||||
|
os stat ntpath warnings traceback
|
||||||
|
site types copy_reg linecache genericpath
|
||||||
|
|
||||||
|
* Python C Extension Modules built as dynamically loadable extensions go into
|
||||||
|
the \Efi\StdLib\lib\python.27\lib-dynload directory. This functionality is not
|
||||||
|
yet implemented.
|
||||||
|
|
||||||
|
|
||||||
|
6. Example: Enabling socket support
|
||||||
|
===================================
|
||||||
|
1. enable {"_socket", init_socket}, in Efi\config.c
|
||||||
|
2. enable Python-2.7.2/Modules/socketmodule.c in PythonCore.inf.
|
||||||
|
3. copy socket.py over to /Efi/StdLib/lib/python.27 on your target system.
|
||||||
|
4. Make sure dependent modules are present(.py) or built in(.c):
|
||||||
|
functools, types, os, sys, warnings, cStringIO, StringIO, errno
|
||||||
|
|
||||||
|
5. build -a X64 -p AppPkg\AppPkg.dsc
|
||||||
|
6. copy Build\AppPkg\DEBUG_VS2005\X64\Python.efi to \Efi\Tools on your target system.
|
||||||
|
^^^^ Modify as needed
|
||||||
|
|
||||||
|
|
||||||
|
7. Supported C Modules
|
||||||
|
======================
|
||||||
|
Module Name C File(s)
|
||||||
|
=============== =============================================
|
||||||
|
_ast Python/Python-ast.c
|
||||||
|
_bisect Modules/_bisectmodule.c
|
||||||
|
_codecs Modules/_codecsmodule.c
|
||||||
|
_codecs_cn Modules/cjkcodecs/_codecs_cn.c
|
||||||
|
_codecs_hk Modules/cjkcodecs/_codecs_hk.c
|
||||||
|
_codecs_iso2022 Modules/cjkcodecs/_codecs_iso2022.c
|
||||||
|
_codecs_jp Modules/cjkcodecs/_codecs_jp
|
||||||
|
_codecs_kr Modules/cjkcodecs/_codecs_kr
|
||||||
|
_codecs_tw Modules/cjkcodecs/_codecs_tw
|
||||||
|
_collections Modules/_collectionsmodule.c
|
||||||
|
_csv Modules/_csv.c
|
||||||
|
_functools Modules/_functoolsmodule.c
|
||||||
|
_heapq Modules/_heapqmodule.c
|
||||||
|
_io Modules/_io/_iomodule.c Modules/_io/*
|
||||||
|
_json Modules/_json.c
|
||||||
|
_md5 Modules/md5module.c Modules/md5.c
|
||||||
|
_multibytecodec Modules/cjkcodecs/_multibytecodec.c
|
||||||
|
_random Modules/_randommodule.c
|
||||||
|
_sha Modules/shamodule.c
|
||||||
|
_sha256 Modules/sha256module.c
|
||||||
|
_sha512 Modules/sha512module.c
|
||||||
|
_socket Modules/socketmodule.c
|
||||||
|
_sre Modules/_sre.c
|
||||||
|
_struct Modules/_struct.c
|
||||||
|
_symtable Modules/symtablemodule.c
|
||||||
|
_weakref Modules/_weakref.c
|
||||||
|
array Modules/arraymodule.c
|
||||||
|
binascii Modules/binascii.c
|
||||||
|
cmath Modules/cmathmodule.c
|
||||||
|
cPickle Modules/cPickle.c
|
||||||
|
cStringIO Modules/cStringIO.c
|
||||||
|
datetime Modules/datetimemodule.c
|
||||||
|
edk2 Modules/Efi/edk2module.c
|
||||||
|
errno Modules/errnomodule.c
|
||||||
|
future_builtins Modules/future_builtins.c
|
||||||
|
gc Modules/gcmodule.c
|
||||||
|
imp Python/import.c
|
||||||
|
itertools Modules/itertoolsmodule.c
|
||||||
|
marshal Python/marshal.c
|
||||||
|
math Modules/mathmodule.c Modules/_math.c
|
||||||
|
operator Modules/operator.c
|
||||||
|
parser Modules/parsermodule.c
|
||||||
|
select Modules/selectmodule.c
|
||||||
|
signal Modules/signalmodule.c
|
||||||
|
strop Modules/stropmodule.c
|
||||||
|
time Modules/timemodule.c
|
||||||
|
xxsubtype Modules/xxsubtype.c
|
||||||
|
zipimport Modules/zipimport.c
|
||||||
|
zlib Modules/zlibmodule.c Modules/zlib/*
|
||||||
|
|
||||||
|
|
||||||
|
8. Tested Python Library Modules
|
||||||
|
================================
|
||||||
|
This is a partial list of the packages and modules of the Python Standard
|
||||||
|
Library that have been tested or used in some manner.
|
||||||
|
|
||||||
|
encodings genericpath.py sha.py
|
||||||
|
importlib getopt.py SimpleHTTPServer.py
|
||||||
|
json hashlib.py site.py
|
||||||
|
pydoc_data heapq.py socket.py
|
||||||
|
xml HTMLParser.py SocketServer.py
|
||||||
|
abc.py inspect.py sre.py
|
||||||
|
argparse.py io.py sre_compile.py
|
||||||
|
ast.py keyword.py sre_constants.py
|
||||||
|
atexit.py linecache.py sre_parse.py
|
||||||
|
BaseHTTPServer.py locale.py stat.py
|
||||||
|
binhex.py md5.py string.py
|
||||||
|
bisect.py modulefinder.py StringIO.py
|
||||||
|
calendar.py ntpath.py struct.py
|
||||||
|
cmd.py numbers.py textwrap.py
|
||||||
|
codecs.py optparse.py token.py
|
||||||
|
collections.py os.py tokenize.py
|
||||||
|
copy.py platform.py traceback.py
|
||||||
|
copy_reg.py posixpath.py types.py
|
||||||
|
csv.py pydoc.py warnings.py
|
||||||
|
dummy_thread.py random.py weakref.py
|
||||||
|
fileinput.py re.py xmllib.py
|
||||||
|
formatter.py repr.py zipfile.py
|
||||||
|
functools.py runpy.py expat
|
||||||
|
|
||||||
|
# # #
|
@@ -0,0 +1,108 @@
|
|||||||
|
/** @file
|
||||||
|
File object interface
|
||||||
|
|
||||||
|
Copyright (c) 2015, Daryl McDaniel. All rights reserved.<BR>
|
||||||
|
Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||||
|
This program and the accompanying materials are licensed and made available under
|
||||||
|
the terms and conditions of the BSD License that accompanies this distribution.
|
||||||
|
The full text of the license may be found at
|
||||||
|
http://opensource.org/licenses/bsd-license.
|
||||||
|
|
||||||
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef Py_FILEOBJECT_H
|
||||||
|
#define Py_FILEOBJECT_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PyObject_HEAD
|
||||||
|
FILE *f_fp;
|
||||||
|
PyObject *f_name;
|
||||||
|
PyObject *f_mode;
|
||||||
|
int (*f_close)(FILE *);
|
||||||
|
int f_softspace; /* Flag used by 'print' command */
|
||||||
|
int f_binary; /* Flag which indicates whether the file is
|
||||||
|
open in binary (1) or text (0) mode */
|
||||||
|
char* f_buf; /* Allocated readahead buffer */
|
||||||
|
char* f_bufend; /* Points after last occupied position */
|
||||||
|
char* f_bufptr; /* Current buffer position */
|
||||||
|
char *f_setbuf; /* Buffer for setbuf(3) and setvbuf(3) */
|
||||||
|
int f_univ_newline; /* Handle any newline convention */
|
||||||
|
int f_newlinetypes; /* Types of newlines seen */
|
||||||
|
int f_skipnextlf; /* Skip next \n */
|
||||||
|
PyObject *f_encoding;
|
||||||
|
PyObject *f_errors;
|
||||||
|
PyObject *weakreflist; /* List of weak references */
|
||||||
|
int unlocked_count; /* Num. currently running sections of code
|
||||||
|
using f_fp with the GIL released. */
|
||||||
|
int readable;
|
||||||
|
int writable;
|
||||||
|
} PyFileObject;
|
||||||
|
|
||||||
|
PyAPI_DATA(PyTypeObject) PyFile_Type;
|
||||||
|
|
||||||
|
#define PyFile_Check(op) PyObject_TypeCheck(op, &PyFile_Type)
|
||||||
|
#define PyFile_CheckExact(op) (Py_TYPE(op) == &PyFile_Type)
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyFile_FromString(char *, char *);
|
||||||
|
PyAPI_FUNC(void) PyFile_SetBufSize(PyObject *, int);
|
||||||
|
PyAPI_FUNC(int) PyFile_SetEncoding(PyObject *, const char *);
|
||||||
|
PyAPI_FUNC(int) PyFile_SetEncodingAndErrors(PyObject *, const char *, char *errors);
|
||||||
|
PyAPI_FUNC(PyObject *) PyFile_FromFile(FILE *, char *, char *,
|
||||||
|
int (*)(FILE *));
|
||||||
|
PyAPI_FUNC(FILE *) PyFile_AsFile(PyObject *);
|
||||||
|
PyAPI_FUNC(void) PyFile_IncUseCount(PyFileObject *);
|
||||||
|
PyAPI_FUNC(void) PyFile_DecUseCount(PyFileObject *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyFile_Name(PyObject *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyFile_GetLine(PyObject *, int);
|
||||||
|
PyAPI_FUNC(int) PyFile_WriteObject(PyObject *, PyObject *, int);
|
||||||
|
PyAPI_FUNC(int) PyFile_SoftSpace(PyObject *, int);
|
||||||
|
PyAPI_FUNC(int) PyFile_WriteString(const char *, PyObject *);
|
||||||
|
PyAPI_FUNC(int) PyObject_AsFileDescriptor(PyObject *);
|
||||||
|
|
||||||
|
/* The default encoding used by the platform file system APIs
|
||||||
|
If non-NULL, this is different than the default encoding for strings
|
||||||
|
*/
|
||||||
|
PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding;
|
||||||
|
|
||||||
|
/* Routines to replace fread() and fgets() which accept any of \r, \n
|
||||||
|
or \r\n as line terminators.
|
||||||
|
*/
|
||||||
|
#define PY_STDIOTEXTMODE "b"
|
||||||
|
char *Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *);
|
||||||
|
size_t Py_UniversalNewlineFread(char *, size_t, FILE *, PyObject *);
|
||||||
|
|
||||||
|
/* A routine to do sanity checking on the file mode string. returns
|
||||||
|
non-zero on if an exception occurred
|
||||||
|
*/
|
||||||
|
int _PyFile_SanitizeMode(char *mode);
|
||||||
|
|
||||||
|
//#if defined _MSC_VER && _MSC_VER >= 1400
|
||||||
|
/* A routine to check if a file descriptor is valid on Windows. Returns 0
|
||||||
|
* and sets errno to EBADF if it isn't. This is to avoid Assertions
|
||||||
|
* from various functions in the Windows CRT beginning with
|
||||||
|
* Visual Studio 2005
|
||||||
|
*/
|
||||||
|
//int _PyVerify_fd(int fd);
|
||||||
|
//#elif defined _MSC_VER && _MSC_VER >= 1200
|
||||||
|
/* fdopen doesn't set errno EBADF and crashes for large fd on debug build */
|
||||||
|
//#define _PyVerify_fd(fd) (_get_osfhandle(fd) >= 0)
|
||||||
|
//#else
|
||||||
|
#define _PyVerify_fd(A) (1) /* dummy */
|
||||||
|
//#endif
|
||||||
|
|
||||||
|
/* A routine to check if a file descriptor can be select()-ed. */
|
||||||
|
#ifdef HAVE_SELECT
|
||||||
|
#define _PyIsSelectable_fd(FD) (((FD) >= 0) && ((FD) < FD_SETSIZE))
|
||||||
|
#else
|
||||||
|
#define _PyIsSelectable_fd(FD) (1)
|
||||||
|
#endif /* HAVE_SELECT */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_FILEOBJECT_H */
|
@@ -0,0 +1,81 @@
|
|||||||
|
/** @file
|
||||||
|
Operating system dependencies.
|
||||||
|
|
||||||
|
Copyright (c) 2015, Daryl McDaniel. All rights reserved.<BR>
|
||||||
|
Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||||
|
This program and the accompanying materials are licensed and made available under
|
||||||
|
the terms and conditions of the BSD License that accompanies this distribution.
|
||||||
|
The full text of the license may be found at
|
||||||
|
http://opensource.org/licenses/bsd-license.
|
||||||
|
|
||||||
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef Py_OSDEFS_H
|
||||||
|
#define Py_OSDEFS_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Mod by chrish: QNX has WATCOM, but isn't DOS */
|
||||||
|
#if !defined(__QNX__) && !defined(UEFI_C_SOURCE)
|
||||||
|
#if defined(MS_WINDOWS) || defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__DJGPP__) || defined(PYOS_OS2)
|
||||||
|
#if defined(PYOS_OS2) && defined(PYCC_GCC)
|
||||||
|
#define MAXPATHLEN 260
|
||||||
|
#define SEP '/'
|
||||||
|
#define ALTSEP '\\'
|
||||||
|
#else
|
||||||
|
#define SEP '\\'
|
||||||
|
#define ALTSEP '/'
|
||||||
|
#define MAXPATHLEN 256
|
||||||
|
#endif
|
||||||
|
#define DELIM ';'
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RISCOS
|
||||||
|
#define SEP '.'
|
||||||
|
#define MAXPATHLEN 256
|
||||||
|
#define DELIM ','
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Filename separator */
|
||||||
|
#ifndef SEP
|
||||||
|
#define SEP '/'
|
||||||
|
#define ALTSEP '\\'
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Max pathname length */
|
||||||
|
#ifdef __hpux
|
||||||
|
# include <sys/param.h>
|
||||||
|
# include <limits.h>
|
||||||
|
# ifndef PATH_MAX
|
||||||
|
# define PATH_MAX MAXPATHLEN
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAXPATHLEN
|
||||||
|
#if defined(PATH_MAX) && PATH_MAX > 1024
|
||||||
|
#define MAXPATHLEN PATH_MAX
|
||||||
|
#else
|
||||||
|
#define MAXPATHLEN 1024
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Search path entry delimiter */
|
||||||
|
#ifndef DELIM
|
||||||
|
# ifdef UEFI_C_SOURCE
|
||||||
|
# define DELIM ';'
|
||||||
|
# define DELIM_STR ";"
|
||||||
|
# else
|
||||||
|
# define DELIM ':'
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_OSDEFS_H */
|
@@ -0,0 +1,957 @@
|
|||||||
|
/** @file
|
||||||
|
Symbols and macros to supply platform-independent interfaces to basic
|
||||||
|
C language & library operations whose spellings vary across platforms.
|
||||||
|
|
||||||
|
Copyright (c) 2015, Daryl McDaniel. All rights reserved.<BR>
|
||||||
|
Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
|
||||||
|
This program and the accompanying materials are licensed and made available under
|
||||||
|
the terms and conditions of the BSD License that accompanies this distribution.
|
||||||
|
The full text of the license may be found at
|
||||||
|
http://opensource.org/licenses/bsd-license.
|
||||||
|
|
||||||
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef Py_PYPORT_H
|
||||||
|
#define Py_PYPORT_H
|
||||||
|
|
||||||
|
#include "pyconfig.h" /* include for defines */
|
||||||
|
|
||||||
|
/* Some versions of HP-UX & Solaris need inttypes.h for int32_t,
|
||||||
|
INT32_MAX, etc. */
|
||||||
|
#ifdef HAVE_INTTYPES_H
|
||||||
|
#include <inttypes.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_STDINT_H
|
||||||
|
#include <stdint.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
Symbols and macros to supply platform-independent interfaces to basic
|
||||||
|
C language & library operations whose spellings vary across platforms.
|
||||||
|
|
||||||
|
Please try to make documentation here as clear as possible: by definition,
|
||||||
|
the stuff here is trying to illuminate C's darkest corners.
|
||||||
|
|
||||||
|
Config #defines referenced here:
|
||||||
|
|
||||||
|
SIGNED_RIGHT_SHIFT_ZERO_FILLS
|
||||||
|
Meaning: To be defined iff i>>j does not extend the sign bit when i is a
|
||||||
|
signed integral type and i < 0.
|
||||||
|
Used in: Py_ARITHMETIC_RIGHT_SHIFT
|
||||||
|
|
||||||
|
Py_DEBUG
|
||||||
|
Meaning: Extra checks compiled in for debug mode.
|
||||||
|
Used in: Py_SAFE_DOWNCAST
|
||||||
|
|
||||||
|
HAVE_UINTPTR_T
|
||||||
|
Meaning: The C9X type uintptr_t is supported by the compiler
|
||||||
|
Used in: Py_uintptr_t
|
||||||
|
|
||||||
|
HAVE_LONG_LONG
|
||||||
|
Meaning: The compiler supports the C type "long long"
|
||||||
|
Used in: PY_LONG_LONG
|
||||||
|
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/* For backward compatibility only. Obsolete, do not use. */
|
||||||
|
#ifdef HAVE_PROTOTYPES
|
||||||
|
#define Py_PROTO(x) x
|
||||||
|
#else
|
||||||
|
#define Py_PROTO(x) ()
|
||||||
|
#endif
|
||||||
|
#ifndef Py_FPROTO
|
||||||
|
#define Py_FPROTO(x) Py_PROTO(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* typedefs for some C9X-defined synonyms for integral types.
|
||||||
|
*
|
||||||
|
* The names in Python are exactly the same as the C9X names, except with a
|
||||||
|
* Py_ prefix. Until C9X is universally implemented, this is the only way
|
||||||
|
* to ensure that Python gets reliable names that don't conflict with names
|
||||||
|
* in non-Python code that are playing their own tricks to define the C9X
|
||||||
|
* names.
|
||||||
|
*
|
||||||
|
* NOTE: don't go nuts here! Python has no use for *most* of the C9X
|
||||||
|
* integral synonyms. Only define the ones we actually need.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
#ifndef PY_LONG_LONG
|
||||||
|
#define PY_LONG_LONG long long
|
||||||
|
#if defined(LLONG_MAX)
|
||||||
|
/* If LLONG_MAX is defined in limits.h, use that. */
|
||||||
|
#define PY_LLONG_MIN LLONG_MIN
|
||||||
|
#define PY_LLONG_MAX LLONG_MAX
|
||||||
|
#define PY_ULLONG_MAX ULLONG_MAX
|
||||||
|
#elif defined(__LONG_LONG_MAX__)
|
||||||
|
/* Otherwise, if GCC has a builtin define, use that. */
|
||||||
|
#define PY_LLONG_MAX __LONG_LONG_MAX__
|
||||||
|
#define PY_LLONG_MIN (-PY_LLONG_MAX-1)
|
||||||
|
#define PY_ULLONG_MAX (__LONG_LONG_MAX__*2ULL + 1ULL)
|
||||||
|
#else
|
||||||
|
/* Otherwise, rely on two's complement. */
|
||||||
|
#define PY_ULLONG_MAX (~0ULL)
|
||||||
|
#define PY_LLONG_MAX ((long long)(PY_ULLONG_MAX>>1))
|
||||||
|
#define PY_LLONG_MIN (-PY_LLONG_MAX-1)
|
||||||
|
#endif /* LLONG_MAX */
|
||||||
|
#endif
|
||||||
|
#endif /* HAVE_LONG_LONG */
|
||||||
|
|
||||||
|
/* a build with 30-bit digits for Python long integers needs an exact-width
|
||||||
|
* 32-bit unsigned integer type to store those digits. (We could just use
|
||||||
|
* type 'unsigned long', but that would be wasteful on a system where longs
|
||||||
|
* are 64-bits.) On Unix systems, the autoconf macro AC_TYPE_UINT32_T defines
|
||||||
|
* uint32_t to be such a type unless stdint.h or inttypes.h defines uint32_t.
|
||||||
|
* However, it doesn't set HAVE_UINT32_T, so we do that here.
|
||||||
|
*/
|
||||||
|
#ifdef uint32_t
|
||||||
|
#define HAVE_UINT32_T 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_UINT32_T
|
||||||
|
#ifndef PY_UINT32_T
|
||||||
|
#define PY_UINT32_T uint32_t
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Macros for a 64-bit unsigned integer type; used for type 'twodigits' in the
|
||||||
|
* long integer implementation, when 30-bit digits are enabled.
|
||||||
|
*/
|
||||||
|
#ifdef uint64_t
|
||||||
|
#define HAVE_UINT64_T 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_UINT64_T
|
||||||
|
#ifndef PY_UINT64_T
|
||||||
|
#define PY_UINT64_T uint64_t
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Signed variants of the above */
|
||||||
|
#ifdef int32_t
|
||||||
|
#define HAVE_INT32_T 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_INT32_T
|
||||||
|
#ifndef PY_INT32_T
|
||||||
|
#define PY_INT32_T int32_t
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef int64_t
|
||||||
|
#define HAVE_INT64_T 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_INT64_T
|
||||||
|
#ifndef PY_INT64_T
|
||||||
|
#define PY_INT64_T int64_t
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* If PYLONG_BITS_IN_DIGIT is not defined then we'll use 30-bit digits if all
|
||||||
|
the necessary integer types are available, and we're on a 64-bit platform
|
||||||
|
(as determined by SIZEOF_VOID_P); otherwise we use 15-bit digits. */
|
||||||
|
|
||||||
|
#ifndef PYLONG_BITS_IN_DIGIT
|
||||||
|
#if (defined HAVE_UINT64_T && defined HAVE_INT64_T && \
|
||||||
|
defined HAVE_UINT32_T && defined HAVE_INT32_T && SIZEOF_VOID_P >= 8)
|
||||||
|
#define PYLONG_BITS_IN_DIGIT 30
|
||||||
|
#else
|
||||||
|
#define PYLONG_BITS_IN_DIGIT 15
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* uintptr_t is the C9X name for an unsigned integral type such that a
|
||||||
|
* legitimate void* can be cast to uintptr_t and then back to void* again
|
||||||
|
* without loss of information. Similarly for intptr_t, wrt a signed
|
||||||
|
* integral type.
|
||||||
|
*/
|
||||||
|
#ifdef HAVE_UINTPTR_T
|
||||||
|
typedef uintptr_t Py_uintptr_t;
|
||||||
|
typedef intptr_t Py_intptr_t;
|
||||||
|
|
||||||
|
#elif SIZEOF_VOID_P <= SIZEOF_INT
|
||||||
|
typedef unsigned int Py_uintptr_t;
|
||||||
|
typedef int Py_intptr_t;
|
||||||
|
|
||||||
|
#elif SIZEOF_VOID_P <= SIZEOF_LONG
|
||||||
|
typedef unsigned long Py_uintptr_t;
|
||||||
|
typedef long Py_intptr_t;
|
||||||
|
|
||||||
|
#elif defined(HAVE_LONG_LONG) && (SIZEOF_VOID_P <= SIZEOF_LONG_LONG)
|
||||||
|
typedef unsigned PY_LONG_LONG Py_uintptr_t;
|
||||||
|
typedef PY_LONG_LONG Py_intptr_t;
|
||||||
|
|
||||||
|
#else
|
||||||
|
# error "Python needs a typedef for Py_uintptr_t in pyport.h."
|
||||||
|
#endif /* HAVE_UINTPTR_T */
|
||||||
|
|
||||||
|
/* Py_ssize_t is a signed integral type such that sizeof(Py_ssize_t) ==
|
||||||
|
* sizeof(size_t). C99 doesn't define such a thing directly (size_t is an
|
||||||
|
* unsigned integral type). See PEP 353 for details.
|
||||||
|
*/
|
||||||
|
#ifdef HAVE_SSIZE_T
|
||||||
|
typedef ssize_t Py_ssize_t;
|
||||||
|
#elif SIZEOF_VOID_P == SIZEOF_SIZE_T
|
||||||
|
typedef Py_intptr_t Py_ssize_t;
|
||||||
|
#else
|
||||||
|
# error "Python needs a typedef for Py_ssize_t in pyport.h."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Largest possible value of size_t.
|
||||||
|
SIZE_MAX is part of C99, so it might be defined on some
|
||||||
|
platforms. If it is not defined, (size_t)-1 is a portable
|
||||||
|
definition for C89, due to the way signed->unsigned
|
||||||
|
conversion is defined. */
|
||||||
|
#ifdef SIZE_MAX
|
||||||
|
#define PY_SIZE_MAX SIZE_MAX
|
||||||
|
#else
|
||||||
|
#define PY_SIZE_MAX ((size_t)-1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Largest positive value of type Py_ssize_t. */
|
||||||
|
#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1))
|
||||||
|
/* Smallest negative value of type Py_ssize_t. */
|
||||||
|
#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1)
|
||||||
|
|
||||||
|
#if SIZEOF_PID_T > SIZEOF_LONG
|
||||||
|
# error "Python doesn't support sizeof(pid_t) > sizeof(long)"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf
|
||||||
|
* format to convert an argument with the width of a size_t or Py_ssize_t.
|
||||||
|
* C99 introduced "z" for this purpose, but not all platforms support that;
|
||||||
|
* e.g., MS compilers use "I" instead.
|
||||||
|
*
|
||||||
|
* These "high level" Python format functions interpret "z" correctly on
|
||||||
|
* all platforms (Python interprets the format string itself, and does whatever
|
||||||
|
* the platform C requires to convert a size_t/Py_ssize_t argument):
|
||||||
|
*
|
||||||
|
* PyString_FromFormat
|
||||||
|
* PyErr_Format
|
||||||
|
* PyString_FromFormatV
|
||||||
|
*
|
||||||
|
* Lower-level uses require that you interpolate the correct format modifier
|
||||||
|
* yourself (e.g., calling printf, fprintf, sprintf, PyOS_snprintf); for
|
||||||
|
* example,
|
||||||
|
*
|
||||||
|
* Py_ssize_t index;
|
||||||
|
* fprintf(stderr, "index %" PY_FORMAT_SIZE_T "d sucks\n", index);
|
||||||
|
*
|
||||||
|
* That will expand to %ld, or %Id, or to something else correct for a
|
||||||
|
* Py_ssize_t on the platform.
|
||||||
|
*/
|
||||||
|
#ifndef PY_FORMAT_SIZE_T
|
||||||
|
# if SIZEOF_SIZE_T == SIZEOF_INT && !defined(__APPLE__)
|
||||||
|
# define PY_FORMAT_SIZE_T ""
|
||||||
|
# elif SIZEOF_SIZE_T == SIZEOF_LONG
|
||||||
|
# define PY_FORMAT_SIZE_T "l"
|
||||||
|
# elif defined(MS_WINDOWS)
|
||||||
|
# define PY_FORMAT_SIZE_T "I"
|
||||||
|
# else
|
||||||
|
# error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T"
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* PY_FORMAT_LONG_LONG is analogous to PY_FORMAT_SIZE_T above, but for
|
||||||
|
* the long long type instead of the size_t type. It's only available
|
||||||
|
* when HAVE_LONG_LONG is defined. The "high level" Python format
|
||||||
|
* functions listed above will interpret "lld" or "llu" correctly on
|
||||||
|
* all platforms.
|
||||||
|
*/
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
# ifndef PY_FORMAT_LONG_LONG
|
||||||
|
# if defined(MS_WIN64) || defined(MS_WINDOWS)
|
||||||
|
# define PY_FORMAT_LONG_LONG "I64"
|
||||||
|
# else
|
||||||
|
# error "This platform's pyconfig.h needs to define PY_FORMAT_LONG_LONG"
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Py_LOCAL can be used instead of static to get the fastest possible calling
|
||||||
|
* convention for functions that are local to a given module.
|
||||||
|
*
|
||||||
|
* Py_LOCAL_INLINE does the same thing, and also explicitly requests inlining,
|
||||||
|
* for platforms that support that.
|
||||||
|
*
|
||||||
|
* If PY_LOCAL_AGGRESSIVE is defined before python.h is included, more
|
||||||
|
* "aggressive" inlining/optimizaion is enabled for the entire module. This
|
||||||
|
* may lead to code bloat, and may slow things down for those reasons. It may
|
||||||
|
* also lead to errors, if the code relies on pointer aliasing. Use with
|
||||||
|
* care.
|
||||||
|
*
|
||||||
|
* NOTE: You can only use this for functions that are entirely local to a
|
||||||
|
* module; functions that are exported via method tables, callbacks, etc,
|
||||||
|
* should keep using static.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef USE_INLINE /* XXX - set via configure? */
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#if defined(PY_LOCAL_AGGRESSIVE)
|
||||||
|
/* enable more aggressive optimization for visual studio */
|
||||||
|
//#pragma optimize("agtw", on)
|
||||||
|
#pragma optimize("gt", on) // a and w are not legal for VS2005
|
||||||
|
#endif
|
||||||
|
/* ignore warnings if the compiler decides not to inline a function */
|
||||||
|
#pragma warning(disable: 4710)
|
||||||
|
/* fastest possible local call under MSVC */
|
||||||
|
#define Py_LOCAL(type) static type __fastcall
|
||||||
|
#define Py_LOCAL_INLINE(type) static __inline type __fastcall
|
||||||
|
#elif defined(USE_INLINE)
|
||||||
|
#define Py_LOCAL(type) static type
|
||||||
|
#define Py_LOCAL_INLINE(type) static inline type
|
||||||
|
#else
|
||||||
|
#define Py_LOCAL(type) static type
|
||||||
|
#define Py_LOCAL_INLINE(type) static type
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Py_MEMCPY can be used instead of memcpy in cases where the copied blocks
|
||||||
|
* are often very short. While most platforms have highly optimized code for
|
||||||
|
* large transfers, the setup costs for memcpy are often quite high. MEMCPY
|
||||||
|
* solves this by doing short copies "in line".
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#define Py_MEMCPY(target, source, length) do { \
|
||||||
|
size_t i_, n_ = (length); \
|
||||||
|
char *t_ = (void*) (target); \
|
||||||
|
const char *s_ = (void*) (source); \
|
||||||
|
if (n_ >= 16) \
|
||||||
|
memcpy(t_, s_, n_); \
|
||||||
|
else \
|
||||||
|
for (i_ = 0; i_ < n_; i_++) \
|
||||||
|
t_[i_] = s_[i_]; \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
#define Py_MEMCPY memcpy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_IEEEFP_H
|
||||||
|
#include <ieeefp.h> /* needed for 'finite' declaration on some platforms */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <math.h> /* Moved here from the math section, before extern "C" */
|
||||||
|
|
||||||
|
/********************************************
|
||||||
|
* WRAPPER FOR <time.h> and/or <sys/time.h> *
|
||||||
|
********************************************/
|
||||||
|
|
||||||
|
#ifdef TIME_WITH_SYS_TIME
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <time.h>
|
||||||
|
#else /* !TIME_WITH_SYS_TIME */
|
||||||
|
#ifdef HAVE_SYS_TIME_H
|
||||||
|
#include <sys/time.h>
|
||||||
|
#else /* !HAVE_SYS_TIME_H */
|
||||||
|
#include <time.h>
|
||||||
|
#endif /* !HAVE_SYS_TIME_H */
|
||||||
|
#endif /* !TIME_WITH_SYS_TIME */
|
||||||
|
|
||||||
|
|
||||||
|
/******************************
|
||||||
|
* WRAPPER FOR <sys/select.h> *
|
||||||
|
******************************/
|
||||||
|
|
||||||
|
/* NB caller must include <sys/types.h> */
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_SELECT_H
|
||||||
|
|
||||||
|
#include <sys/select.h>
|
||||||
|
|
||||||
|
#endif /* !HAVE_SYS_SELECT_H */
|
||||||
|
|
||||||
|
/*******************************
|
||||||
|
* stat() and fstat() fiddling *
|
||||||
|
*******************************/
|
||||||
|
|
||||||
|
/* We expect that stat and fstat exist on most systems.
|
||||||
|
* It's confirmed on Unix, Mac and Windows.
|
||||||
|
* If you don't have them, add
|
||||||
|
* #define DONT_HAVE_STAT
|
||||||
|
* and/or
|
||||||
|
* #define DONT_HAVE_FSTAT
|
||||||
|
* to your pyconfig.h. Python code beyond this should check HAVE_STAT and
|
||||||
|
* HAVE_FSTAT instead.
|
||||||
|
* Also
|
||||||
|
* #define HAVE_SYS_STAT_H
|
||||||
|
* if <sys/stat.h> exists on your platform, and
|
||||||
|
* #define HAVE_STAT_H
|
||||||
|
* if <stat.h> does.
|
||||||
|
*/
|
||||||
|
#ifndef DONT_HAVE_STAT
|
||||||
|
#define HAVE_STAT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DONT_HAVE_FSTAT
|
||||||
|
#define HAVE_FSTAT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RISCOS
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include "unixstuff.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_STAT_H
|
||||||
|
#if defined(PYOS_OS2) && defined(PYCC_GCC)
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#elif defined(HAVE_STAT_H)
|
||||||
|
#include <stat.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PYCC_VACPP)
|
||||||
|
/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
|
||||||
|
#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef S_ISREG
|
||||||
|
#define S_ISREG(x) (((x) & S_IFMT) == S_IFREG)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef S_ISDIR
|
||||||
|
#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
/* Move this down here since some C++ #include's don't like to be included
|
||||||
|
inside an extern "C" */
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Py_ARITHMETIC_RIGHT_SHIFT
|
||||||
|
* C doesn't define whether a right-shift of a signed integer sign-extends
|
||||||
|
* or zero-fills. Here a macro to force sign extension:
|
||||||
|
* Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J)
|
||||||
|
* Return I >> J, forcing sign extension. Arithmetically, return the
|
||||||
|
* floor of I/2**J.
|
||||||
|
* Requirements:
|
||||||
|
* I should have signed integer type. In the terminology of C99, this can
|
||||||
|
* be either one of the five standard signed integer types (signed char,
|
||||||
|
* short, int, long, long long) or an extended signed integer type.
|
||||||
|
* J is an integer >= 0 and strictly less than the number of bits in the
|
||||||
|
* type of I (because C doesn't define what happens for J outside that
|
||||||
|
* range either).
|
||||||
|
* TYPE used to specify the type of I, but is now ignored. It's been left
|
||||||
|
* in for backwards compatibility with versions <= 2.6 or 3.0.
|
||||||
|
* Caution:
|
||||||
|
* I may be evaluated more than once.
|
||||||
|
*/
|
||||||
|
#ifdef SIGNED_RIGHT_SHIFT_ZERO_FILLS
|
||||||
|
#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) \
|
||||||
|
((I) < 0 ? -1-((-1-(I)) >> (J)) : (I) >> (J))
|
||||||
|
#else
|
||||||
|
#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Py_FORCE_EXPANSION(X)
|
||||||
|
* "Simply" returns its argument. However, macro expansions within the
|
||||||
|
* argument are evaluated. This unfortunate trickery is needed to get
|
||||||
|
* token-pasting to work as desired in some cases.
|
||||||
|
*/
|
||||||
|
#define Py_FORCE_EXPANSION(X) X
|
||||||
|
|
||||||
|
/* Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW)
|
||||||
|
* Cast VALUE to type NARROW from type WIDE. In Py_DEBUG mode, this
|
||||||
|
* assert-fails if any information is lost.
|
||||||
|
* Caution:
|
||||||
|
* VALUE may be evaluated more than once.
|
||||||
|
*/
|
||||||
|
#ifdef Py_DEBUG
|
||||||
|
#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \
|
||||||
|
(assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE))
|
||||||
|
#else
|
||||||
|
#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Py_SET_ERRNO_ON_MATH_ERROR(x)
|
||||||
|
* If a libm function did not set errno, but it looks like the result
|
||||||
|
* overflowed or not-a-number, set errno to ERANGE or EDOM. Set errno
|
||||||
|
* to 0 before calling a libm function, and invoke this macro after,
|
||||||
|
* passing the function result.
|
||||||
|
* Caution:
|
||||||
|
* This isn't reliable. See Py_OVERFLOWED comments.
|
||||||
|
* X is evaluated more than once.
|
||||||
|
*/
|
||||||
|
#if defined(__FreeBSD__) || defined(__OpenBSD__) || (defined(__hpux) && defined(__ia64))
|
||||||
|
#define _Py_SET_EDOM_FOR_NAN(X) if (isnan(X)) errno = EDOM;
|
||||||
|
#else
|
||||||
|
#define _Py_SET_EDOM_FOR_NAN(X) ;
|
||||||
|
#endif
|
||||||
|
#define Py_SET_ERRNO_ON_MATH_ERROR(X) \
|
||||||
|
do { \
|
||||||
|
if (errno == 0) { \
|
||||||
|
if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \
|
||||||
|
errno = ERANGE; \
|
||||||
|
else _Py_SET_EDOM_FOR_NAN(X) \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
/* Py_SET_ERANGE_ON_OVERFLOW(x)
|
||||||
|
* An alias of Py_SET_ERRNO_ON_MATH_ERROR for backward-compatibility.
|
||||||
|
*/
|
||||||
|
#define Py_SET_ERANGE_IF_OVERFLOW(X) Py_SET_ERRNO_ON_MATH_ERROR(X)
|
||||||
|
|
||||||
|
/* Py_ADJUST_ERANGE1(x)
|
||||||
|
* Py_ADJUST_ERANGE2(x, y)
|
||||||
|
* Set errno to 0 before calling a libm function, and invoke one of these
|
||||||
|
* macros after, passing the function result(s) (Py_ADJUST_ERANGE2 is useful
|
||||||
|
* for functions returning complex results). This makes two kinds of
|
||||||
|
* adjustments to errno: (A) If it looks like the platform libm set
|
||||||
|
* errno=ERANGE due to underflow, clear errno. (B) If it looks like the
|
||||||
|
* platform libm overflowed but didn't set errno, force errno to ERANGE. In
|
||||||
|
* effect, we're trying to force a useful implementation of C89 errno
|
||||||
|
* behavior.
|
||||||
|
* Caution:
|
||||||
|
* This isn't reliable. See Py_OVERFLOWED comments.
|
||||||
|
* X and Y may be evaluated more than once.
|
||||||
|
*/
|
||||||
|
#define Py_ADJUST_ERANGE1(X) \
|
||||||
|
do { \
|
||||||
|
if (errno == 0) { \
|
||||||
|
if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \
|
||||||
|
errno = ERANGE; \
|
||||||
|
} \
|
||||||
|
else if (errno == ERANGE && (X) == 0.0) \
|
||||||
|
errno = 0; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define Py_ADJUST_ERANGE2(X, Y) \
|
||||||
|
do { \
|
||||||
|
if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL || \
|
||||||
|
(Y) == Py_HUGE_VAL || (Y) == -Py_HUGE_VAL) { \
|
||||||
|
if (errno == 0) \
|
||||||
|
errno = ERANGE; \
|
||||||
|
} \
|
||||||
|
else if (errno == ERANGE) \
|
||||||
|
errno = 0; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
/* The functions _Py_dg_strtod and _Py_dg_dtoa in Python/dtoa.c (which are
|
||||||
|
* required to support the short float repr introduced in Python 3.1) require
|
||||||
|
* that the floating-point unit that's being used for arithmetic operations
|
||||||
|
* on C doubles is set to use 53-bit precision. It also requires that the
|
||||||
|
* FPU rounding mode is round-half-to-even, but that's less often an issue.
|
||||||
|
*
|
||||||
|
* If your FPU isn't already set to 53-bit precision/round-half-to-even, and
|
||||||
|
* you want to make use of _Py_dg_strtod and _Py_dg_dtoa, then you should
|
||||||
|
*
|
||||||
|
* #define HAVE_PY_SET_53BIT_PRECISION 1
|
||||||
|
*
|
||||||
|
* and also give appropriate definitions for the following three macros:
|
||||||
|
*
|
||||||
|
* _PY_SET_53BIT_PRECISION_START : store original FPU settings, and
|
||||||
|
* set FPU to 53-bit precision/round-half-to-even
|
||||||
|
* _PY_SET_53BIT_PRECISION_END : restore original FPU settings
|
||||||
|
* _PY_SET_53BIT_PRECISION_HEADER : any variable declarations needed to
|
||||||
|
* use the two macros above.
|
||||||
|
*
|
||||||
|
* The macros are designed to be used within a single C function: see
|
||||||
|
* Python/pystrtod.c for an example of their use.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* get and set x87 control word for gcc/x86 */
|
||||||
|
#ifdef HAVE_GCC_ASM_FOR_X87
|
||||||
|
#define HAVE_PY_SET_53BIT_PRECISION 1
|
||||||
|
/* _Py_get/set_387controlword functions are defined in Python/pymath.c */
|
||||||
|
#define _Py_SET_53BIT_PRECISION_HEADER \
|
||||||
|
unsigned short old_387controlword, new_387controlword
|
||||||
|
#define _Py_SET_53BIT_PRECISION_START \
|
||||||
|
do { \
|
||||||
|
old_387controlword = _Py_get_387controlword(); \
|
||||||
|
new_387controlword = (old_387controlword & ~0x0f00) | 0x0200; \
|
||||||
|
if (new_387controlword != old_387controlword) \
|
||||||
|
_Py_set_387controlword(new_387controlword); \
|
||||||
|
} while (0)
|
||||||
|
#define _Py_SET_53BIT_PRECISION_END \
|
||||||
|
if (new_387controlword != old_387controlword) \
|
||||||
|
_Py_set_387controlword(old_387controlword)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* get and set x87 control word for VisualStudio/x86 */
|
||||||
|
#if defined(_MSC_VER) && !defined(_WIN64) && !defined(UEFI_C_SOURCE) /* x87 not supported in 64-bit */
|
||||||
|
#define HAVE_PY_SET_53BIT_PRECISION 1
|
||||||
|
#define _Py_SET_53BIT_PRECISION_HEADER \
|
||||||
|
unsigned int old_387controlword, new_387controlword, out_387controlword
|
||||||
|
/* We use the __control87_2 function to set only the x87 control word.
|
||||||
|
The SSE control word is unaffected. */
|
||||||
|
#define _Py_SET_53BIT_PRECISION_START \
|
||||||
|
do { \
|
||||||
|
__control87_2(0, 0, &old_387controlword, NULL); \
|
||||||
|
new_387controlword = \
|
||||||
|
(old_387controlword & ~(_MCW_PC | _MCW_RC)) | (_PC_53 | _RC_NEAR); \
|
||||||
|
if (new_387controlword != old_387controlword) \
|
||||||
|
__control87_2(new_387controlword, _MCW_PC | _MCW_RC, \
|
||||||
|
&out_387controlword, NULL); \
|
||||||
|
} while (0)
|
||||||
|
#define _Py_SET_53BIT_PRECISION_END \
|
||||||
|
do { \
|
||||||
|
if (new_387controlword != old_387controlword) \
|
||||||
|
__control87_2(old_387controlword, _MCW_PC | _MCW_RC, \
|
||||||
|
&out_387controlword, NULL); \
|
||||||
|
} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* default definitions are empty */
|
||||||
|
#ifndef HAVE_PY_SET_53BIT_PRECISION
|
||||||
|
#define _Py_SET_53BIT_PRECISION_HEADER
|
||||||
|
#define _Py_SET_53BIT_PRECISION_START
|
||||||
|
#define _Py_SET_53BIT_PRECISION_END
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* If we can't guarantee 53-bit precision, don't use the code
|
||||||
|
in Python/dtoa.c, but fall back to standard code. This
|
||||||
|
means that repr of a float will be long (17 sig digits).
|
||||||
|
|
||||||
|
Realistically, there are two things that could go wrong:
|
||||||
|
|
||||||
|
(1) doubles aren't IEEE 754 doubles, or
|
||||||
|
(2) we're on x86 with the rounding precision set to 64-bits
|
||||||
|
(extended precision), and we don't know how to change
|
||||||
|
the rounding precision.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(DOUBLE_IS_LITTLE_ENDIAN_IEEE754) && \
|
||||||
|
!defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) && \
|
||||||
|
!defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754)
|
||||||
|
#define PY_NO_SHORT_FLOAT_REPR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* double rounding is symptomatic of use of extended precision on x86. If
|
||||||
|
we're seeing double rounding, and we don't have any mechanism available for
|
||||||
|
changing the FPU rounding precision, then don't use Python/dtoa.c. */
|
||||||
|
#if defined(X87_DOUBLE_ROUNDING) && !defined(HAVE_PY_SET_53BIT_PRECISION)
|
||||||
|
#define PY_NO_SHORT_FLOAT_REPR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Py_DEPRECATED(version)
|
||||||
|
* Declare a variable, type, or function deprecated.
|
||||||
|
* Usage:
|
||||||
|
* extern int old_var Py_DEPRECATED(2.3);
|
||||||
|
* typedef int T1 Py_DEPRECATED(2.4);
|
||||||
|
* extern int x() Py_DEPRECATED(2.5);
|
||||||
|
*/
|
||||||
|
#if defined(__GNUC__) && ((__GNUC__ >= 4) || \
|
||||||
|
(__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))
|
||||||
|
#define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__))
|
||||||
|
#else
|
||||||
|
#define Py_DEPRECATED(VERSION_UNUSED)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
Prototypes that are missing from the standard include files on some systems
|
||||||
|
(and possibly only some versions of such systems.)
|
||||||
|
|
||||||
|
Please be conservative with adding new ones, document them and enclose them
|
||||||
|
in platform-specific #ifdefs.
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifdef SOLARIS
|
||||||
|
/* Unchecked */
|
||||||
|
extern int gethostname(char *, int);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __BEOS__
|
||||||
|
/* Unchecked */
|
||||||
|
/* It's in the libs, but not the headers... - [cjh] */
|
||||||
|
int shutdown( int, int );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE__GETPTY
|
||||||
|
#include <sys/types.h> /* we need to import mode_t */
|
||||||
|
extern char * _getpty(int *, int, mode_t, int);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* On QNX 6, struct termio must be declared by including sys/termio.h
|
||||||
|
if TCGETA, TCSETA, TCSETAW, or TCSETAF are used. sys/termio.h must
|
||||||
|
be included before termios.h or it will generate an error. */
|
||||||
|
#if defined(HAVE_SYS_TERMIO_H) && !defined(__hpux)
|
||||||
|
#include <sys/termio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY)
|
||||||
|
#if !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) && !defined(HAVE_UTIL_H)
|
||||||
|
/* BSDI does not supply a prototype for the 'openpty' and 'forkpty'
|
||||||
|
functions, even though they are included in libutil. */
|
||||||
|
#include <termios.h>
|
||||||
|
extern int openpty(int *, int *, char *, struct termios *, struct winsize *);
|
||||||
|
extern pid_t forkpty(int *, char *, struct termios *, struct winsize *);
|
||||||
|
#endif /* !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) */
|
||||||
|
#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */
|
||||||
|
|
||||||
|
|
||||||
|
/* These are pulled from various places. It isn't obvious on what platforms
|
||||||
|
they are necessary, nor what the exact prototype should look like (which
|
||||||
|
is likely to vary between platforms!) If you find you need one of these
|
||||||
|
declarations, please move them to a platform-specific block and include
|
||||||
|
proper prototypes. */
|
||||||
|
#if 0
|
||||||
|
|
||||||
|
/* From Modules/resource.c */
|
||||||
|
extern int getrusage();
|
||||||
|
extern int getpagesize();
|
||||||
|
|
||||||
|
/* From Python/sysmodule.c and Modules/posixmodule.c */
|
||||||
|
extern int fclose(FILE *);
|
||||||
|
|
||||||
|
/* From Modules/posixmodule.c */
|
||||||
|
extern int fdatasync(int);
|
||||||
|
#endif /* 0 */
|
||||||
|
|
||||||
|
|
||||||
|
/* On 4.4BSD-descendants, ctype functions serves the whole range of
|
||||||
|
* wchar_t character set rather than single byte code points only.
|
||||||
|
* This characteristic can break some operations of string object
|
||||||
|
* including str.upper() and str.split() on UTF-8 locales. This
|
||||||
|
* workaround was provided by Tim Robbins of FreeBSD project.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
#include <osreldate.h>
|
||||||
|
#if __FreeBSD_version > 500039
|
||||||
|
# define _PY_PORT_CTYPE_UTF8_ISSUE
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
# define _PY_PORT_CTYPE_UTF8_ISSUE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _PY_PORT_CTYPE_UTF8_ISSUE
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
#undef isalnum
|
||||||
|
#define isalnum(c) iswalnum(btowc(c))
|
||||||
|
#undef isalpha
|
||||||
|
#define isalpha(c) iswalpha(btowc(c))
|
||||||
|
#undef islower
|
||||||
|
#define islower(c) iswlower(btowc(c))
|
||||||
|
#undef isspace
|
||||||
|
#define isspace(c) iswspace(btowc(c))
|
||||||
|
#undef isupper
|
||||||
|
#define isupper(c) iswupper(btowc(c))
|
||||||
|
#undef tolower
|
||||||
|
#define tolower(c) towlower(btowc(c))
|
||||||
|
#undef toupper
|
||||||
|
#define toupper(c) towupper(btowc(c))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Declarations for symbol visibility.
|
||||||
|
|
||||||
|
PyAPI_FUNC(type): Declares a public Python API function and return type
|
||||||
|
PyAPI_DATA(type): Declares public Python data and its type
|
||||||
|
PyMODINIT_FUNC: A Python module init function. If these functions are
|
||||||
|
inside the Python core, they are private to the core.
|
||||||
|
If in an extension module, it may be declared with
|
||||||
|
external linkage depending on the platform.
|
||||||
|
|
||||||
|
As a number of platforms support/require "__declspec(dllimport/dllexport)",
|
||||||
|
we support a HAVE_DECLSPEC_DLL macro to save duplication.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
All windows ports, except cygwin, are handled in PC/pyconfig.h.
|
||||||
|
|
||||||
|
BeOS and cygwin are the only other autoconf platform requiring special
|
||||||
|
linkage handling and both of these use __declspec().
|
||||||
|
*/
|
||||||
|
#if defined(__CYGWIN__) || defined(__BEOS__)
|
||||||
|
# define HAVE_DECLSPEC_DLL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* only get special linkage if built as shared or platform is Cygwin */
|
||||||
|
#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__)
|
||||||
|
# if defined(HAVE_DECLSPEC_DLL)
|
||||||
|
# ifdef Py_BUILD_CORE
|
||||||
|
# define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE
|
||||||
|
# define PyAPI_DATA(RTYPE) extern __declspec(dllexport) RTYPE
|
||||||
|
/* module init functions inside the core need no external linkage */
|
||||||
|
/* except for Cygwin to handle embedding (FIXME: BeOS too?) */
|
||||||
|
# if defined(__CYGWIN__)
|
||||||
|
# define PyMODINIT_FUNC __declspec(dllexport) void
|
||||||
|
# else /* __CYGWIN__ */
|
||||||
|
# define PyMODINIT_FUNC void
|
||||||
|
# endif /* __CYGWIN__ */
|
||||||
|
# else /* Py_BUILD_CORE */
|
||||||
|
/* Building an extension module, or an embedded situation */
|
||||||
|
/* public Python functions and data are imported */
|
||||||
|
/* Under Cygwin, auto-import functions to prevent compilation */
|
||||||
|
/* failures similar to those described at the bottom of 4.1: */
|
||||||
|
/* http://docs.python.org/extending/windows.html#a-cookbook-approach */
|
||||||
|
# if !defined(__CYGWIN__)
|
||||||
|
# define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE
|
||||||
|
# endif /* !__CYGWIN__ */
|
||||||
|
# define PyAPI_DATA(RTYPE) extern __declspec(dllimport) RTYPE
|
||||||
|
/* module init functions outside the core must be exported */
|
||||||
|
# if defined(__cplusplus)
|
||||||
|
# define PyMODINIT_FUNC extern "C" __declspec(dllexport) void
|
||||||
|
# else /* __cplusplus */
|
||||||
|
# define PyMODINIT_FUNC __declspec(dllexport) void
|
||||||
|
# endif /* __cplusplus */
|
||||||
|
# endif /* Py_BUILD_CORE */
|
||||||
|
# endif /* HAVE_DECLSPEC */
|
||||||
|
#endif /* Py_ENABLE_SHARED */
|
||||||
|
|
||||||
|
/* If no external linkage macros defined by now, create defaults */
|
||||||
|
#ifndef PyAPI_FUNC
|
||||||
|
# define PyAPI_FUNC(RTYPE) RTYPE
|
||||||
|
#endif
|
||||||
|
#ifndef PyAPI_DATA
|
||||||
|
# define PyAPI_DATA(RTYPE) extern RTYPE
|
||||||
|
#endif
|
||||||
|
#ifndef PyMODINIT_FUNC
|
||||||
|
# if defined(__cplusplus)
|
||||||
|
# define PyMODINIT_FUNC extern "C" void
|
||||||
|
# else /* __cplusplus */
|
||||||
|
# define PyMODINIT_FUNC void
|
||||||
|
# endif /* __cplusplus */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Deprecated DL_IMPORT and DL_EXPORT macros */
|
||||||
|
#if defined(Py_ENABLE_SHARED) && defined (HAVE_DECLSPEC_DLL)
|
||||||
|
# if defined(Py_BUILD_CORE)
|
||||||
|
# define DL_IMPORT(RTYPE) __declspec(dllexport) RTYPE
|
||||||
|
# define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE
|
||||||
|
# else
|
||||||
|
# define DL_IMPORT(RTYPE) __declspec(dllimport) RTYPE
|
||||||
|
# define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#ifndef DL_EXPORT
|
||||||
|
# define DL_EXPORT(RTYPE) RTYPE
|
||||||
|
#endif
|
||||||
|
#ifndef DL_IMPORT
|
||||||
|
# define DL_IMPORT(RTYPE) RTYPE
|
||||||
|
#endif
|
||||||
|
/* End of deprecated DL_* macros */
|
||||||
|
|
||||||
|
/* If the fd manipulation macros aren't defined,
|
||||||
|
here is a set that should do the job */
|
||||||
|
|
||||||
|
#if 0 /* disabled and probably obsolete */
|
||||||
|
|
||||||
|
#ifndef FD_SETSIZE
|
||||||
|
#define FD_SETSIZE 256
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FD_SET
|
||||||
|
|
||||||
|
typedef long fd_mask;
|
||||||
|
|
||||||
|
#define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */
|
||||||
|
#ifndef howmany
|
||||||
|
#define howmany(x, y) (((x)+((y)-1))/(y))
|
||||||
|
#endif /* howmany */
|
||||||
|
|
||||||
|
typedef struct fd_set {
|
||||||
|
fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)];
|
||||||
|
} fd_set;
|
||||||
|
|
||||||
|
#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
|
||||||
|
#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
|
||||||
|
#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
|
||||||
|
#define FD_ZERO(p) memset((char *)(p), '\0', sizeof(*(p)))
|
||||||
|
|
||||||
|
#endif /* FD_SET */
|
||||||
|
|
||||||
|
#endif /* fd manipulation macros */
|
||||||
|
|
||||||
|
|
||||||
|
/* limits.h constants that may be missing */
|
||||||
|
|
||||||
|
#ifndef INT_MAX
|
||||||
|
#define INT_MAX 2147483647
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LONG_MAX
|
||||||
|
#if SIZEOF_LONG == 4
|
||||||
|
#define LONG_MAX 0X7FFFFFFFL
|
||||||
|
#elif SIZEOF_LONG == 8
|
||||||
|
#define LONG_MAX 0X7FFFFFFFFFFFFFFFL
|
||||||
|
#else
|
||||||
|
#error "could not set LONG_MAX in pyport.h"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LONG_MIN
|
||||||
|
#define LONG_MIN (-LONG_MAX-1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LONG_BIT
|
||||||
|
#define LONG_BIT (8 * SIZEOF_LONG)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LONG_BIT != 8 * SIZEOF_LONG
|
||||||
|
/* 04-Oct-2000 LONG_BIT is apparently (mis)defined as 64 on some recent
|
||||||
|
* 32-bit platforms using gcc. We try to catch that here at compile-time
|
||||||
|
* rather than waiting for integer multiplication to trigger bogus
|
||||||
|
* overflows.
|
||||||
|
*/
|
||||||
|
#error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Hide GCC attributes from compilers that don't support them.
|
||||||
|
*/
|
||||||
|
#if (!defined(__GNUC__) || __GNUC__ < 2 || \
|
||||||
|
(__GNUC__ == 2 && __GNUC_MINOR__ < 7) ) && \
|
||||||
|
!defined(RISCOS)
|
||||||
|
#define Py_GCC_ATTRIBUTE(x)
|
||||||
|
#else
|
||||||
|
#define Py_GCC_ATTRIBUTE(x) __attribute__(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add PyArg_ParseTuple format where available.
|
||||||
|
*/
|
||||||
|
#ifdef HAVE_ATTRIBUTE_FORMAT_PARSETUPLE
|
||||||
|
#define Py_FORMAT_PARSETUPLE(func,p1,p2) __attribute__((format(func,p1,p2)))
|
||||||
|
#else
|
||||||
|
#define Py_FORMAT_PARSETUPLE(func,p1,p2)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Specify alignment on compilers that support it.
|
||||||
|
*/
|
||||||
|
#if defined(__GNUC__) && __GNUC__ >= 3
|
||||||
|
#define Py_ALIGNED(x) __attribute__((aligned(x)))
|
||||||
|
#else
|
||||||
|
#define Py_ALIGNED(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Eliminate end-of-loop code not reached warnings from SunPro C
|
||||||
|
* when using do{...}while(0) macros
|
||||||
|
*/
|
||||||
|
#ifdef __SUNPRO_C
|
||||||
|
#pragma error_messages (off,E_END_OF_LOOP_CODE_NOT_REACHED)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Older Microsoft compilers don't support the C99 long long literal suffixes,
|
||||||
|
* so these will be defined in PC/pyconfig.h for those compilers.
|
||||||
|
*/
|
||||||
|
#ifndef Py_LL
|
||||||
|
#define Py_LL(x) x##LL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef Py_ULL
|
||||||
|
#define Py_ULL(x) Py_LL(x##U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* Py_PYPORT_H */
|
@@ -0,0 +1,550 @@
|
|||||||
|
# Module 'ntpath' -- common operations on WinNT/Win95 pathnames
|
||||||
|
"""Common pathname manipulations, WindowsNT/95 version.
|
||||||
|
|
||||||
|
Instead of importing this module directly, import os and refer to this
|
||||||
|
module as os.path.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import stat
|
||||||
|
import genericpath
|
||||||
|
import warnings
|
||||||
|
|
||||||
|
from genericpath import *
|
||||||
|
from genericpath import _unicode
|
||||||
|
|
||||||
|
__all__ = ["normcase","isabs","join","splitdrive","split","splitext",
|
||||||
|
"basename","dirname","commonprefix","getsize","getmtime",
|
||||||
|
"getatime","getctime", "islink","exists","lexists","isdir","isfile",
|
||||||
|
"ismount","walk","expanduser","expandvars","normpath","abspath",
|
||||||
|
"splitunc","curdir","pardir","sep","pathsep","defpath","altsep",
|
||||||
|
"extsep","devnull","realpath","supports_unicode_filenames","relpath"]
|
||||||
|
|
||||||
|
# strings representing various path-related bits and pieces
|
||||||
|
curdir = '.'
|
||||||
|
pardir = '..'
|
||||||
|
extsep = '.'
|
||||||
|
sep = '\\'
|
||||||
|
pathsep = ';'
|
||||||
|
altsep = '/'
|
||||||
|
defpath = '.;C:\\bin'
|
||||||
|
if 'ce' in sys.builtin_module_names:
|
||||||
|
defpath = '\\Windows'
|
||||||
|
elif 'os2' in sys.builtin_module_names:
|
||||||
|
# OS/2 w/ VACPP
|
||||||
|
altsep = '/'
|
||||||
|
devnull = 'nul'
|
||||||
|
|
||||||
|
# Normalize the case of a pathname and map slashes to backslashes.
|
||||||
|
# Other normalizations (such as optimizing '../' away) are not done
|
||||||
|
# (this is done by normpath).
|
||||||
|
|
||||||
|
def normcase(s):
|
||||||
|
"""Normalize case of pathname.
|
||||||
|
|
||||||
|
Makes all characters lowercase and all slashes into backslashes."""
|
||||||
|
return s.replace("/", "\\").lower()
|
||||||
|
|
||||||
|
|
||||||
|
# Return whether a path is absolute.
|
||||||
|
# Trivial in Posix, harder on the Mac or MS-DOS.
|
||||||
|
# For DOS it is absolute if it starts with a slash or backslash (current
|
||||||
|
# volume), or if a pathname after the volume letter and colon / UNC resource
|
||||||
|
# starts with a slash or backslash.
|
||||||
|
|
||||||
|
def isabs(s):
|
||||||
|
"""Test whether a path is absolute"""
|
||||||
|
s = splitdrive(s)[1]
|
||||||
|
return s != '' and s[:1] in '/\\'
|
||||||
|
|
||||||
|
|
||||||
|
# Join two (or more) paths.
|
||||||
|
def join(path, *paths):
|
||||||
|
"""Join two or more pathname components, inserting "\\" as needed."""
|
||||||
|
result_drive, result_path = splitdrive(path)
|
||||||
|
for p in paths:
|
||||||
|
p_drive, p_path = splitdrive(p)
|
||||||
|
if p_path and p_path[0] in '\\/':
|
||||||
|
# Second path is absolute
|
||||||
|
if p_drive or not result_drive:
|
||||||
|
result_drive = p_drive
|
||||||
|
result_path = p_path
|
||||||
|
continue
|
||||||
|
elif p_drive and p_drive != result_drive:
|
||||||
|
if p_drive.lower() != result_drive.lower():
|
||||||
|
# Different drives => ignore the first path entirely
|
||||||
|
result_drive = p_drive
|
||||||
|
result_path = p_path
|
||||||
|
continue
|
||||||
|
# Same drive in different case
|
||||||
|
result_drive = p_drive
|
||||||
|
# Second path is relative to the first
|
||||||
|
if result_path and result_path[-1] not in '\\/':
|
||||||
|
result_path = result_path + '\\'
|
||||||
|
result_path = result_path + p_path
|
||||||
|
## add separator between UNC and non-absolute path
|
||||||
|
if (result_path and result_path[0] not in '\\/' and
|
||||||
|
result_drive and result_drive[-1:] != ':'):
|
||||||
|
return result_drive + sep + result_path
|
||||||
|
return result_drive + result_path
|
||||||
|
|
||||||
|
|
||||||
|
# Split a path in a drive specification (a drive letter followed by a
|
||||||
|
# colon) and the path specification.
|
||||||
|
# It is always true that drivespec + pathspec == p
|
||||||
|
def splitdrive(p):
|
||||||
|
"""Split a pathname into drive/UNC sharepoint and relative path specifiers.
|
||||||
|
Returns a 2-tuple (drive_or_unc, path); either part may be empty.
|
||||||
|
|
||||||
|
If you assign
|
||||||
|
result = splitdrive(p)
|
||||||
|
It is always true that:
|
||||||
|
result[0] + result[1] == p
|
||||||
|
|
||||||
|
If the path contained a drive letter, drive_or_unc will contain everything
|
||||||
|
up to and including the colon. e.g. splitdrive("c:/dir") returns ("c:", "/dir")
|
||||||
|
|
||||||
|
If the path contained a UNC path, the drive_or_unc will contain the host name
|
||||||
|
and share up to but not including the fourth directory separator character.
|
||||||
|
e.g. splitdrive("//host/computer/dir") returns ("//host/computer", "/dir")
|
||||||
|
|
||||||
|
Paths cannot contain both a drive letter and a UNC path.
|
||||||
|
|
||||||
|
"""
|
||||||
|
if len(p) > 1:
|
||||||
|
normp = p.replace(altsep, sep)
|
||||||
|
if (normp[0:2] == sep*2) and (normp[2:3] != sep):
|
||||||
|
# is a UNC path:
|
||||||
|
# vvvvvvvvvvvvvvvvvvvv drive letter or UNC path
|
||||||
|
# \\machine\mountpoint\directory\etc\...
|
||||||
|
# directory ^^^^^^^^^^^^^^^
|
||||||
|
index = normp.find(sep, 2)
|
||||||
|
if index == -1:
|
||||||
|
return '', p
|
||||||
|
index2 = normp.find(sep, index + 1)
|
||||||
|
# a UNC path can't have two slashes in a row
|
||||||
|
# (after the initial two)
|
||||||
|
if index2 == index + 1:
|
||||||
|
return '', p
|
||||||
|
if index2 == -1:
|
||||||
|
index2 = len(p)
|
||||||
|
return p[:index2], p[index2:]
|
||||||
|
if normp[1] == ':':
|
||||||
|
return p[:2], p[2:]
|
||||||
|
return '', p
|
||||||
|
|
||||||
|
# Parse UNC paths
|
||||||
|
def splitunc(p):
|
||||||
|
"""Split a pathname into UNC mount point and relative path specifiers.
|
||||||
|
|
||||||
|
Return a 2-tuple (unc, rest); either part may be empty.
|
||||||
|
If unc is not empty, it has the form '//host/mount' (or similar
|
||||||
|
using backslashes). unc+rest is always the input path.
|
||||||
|
Paths containing drive letters never have an UNC part.
|
||||||
|
"""
|
||||||
|
if p[1:2] == ':':
|
||||||
|
return '', p # Drive letter present
|
||||||
|
firstTwo = p[0:2]
|
||||||
|
if firstTwo == '//' or firstTwo == '\\\\':
|
||||||
|
# is a UNC path:
|
||||||
|
# vvvvvvvvvvvvvvvvvvvv equivalent to drive letter
|
||||||
|
# \\machine\mountpoint\directories...
|
||||||
|
# directory ^^^^^^^^^^^^^^^
|
||||||
|
normp = p.replace('\\', '/')
|
||||||
|
index = normp.find('/', 2)
|
||||||
|
if index <= 2:
|
||||||
|
return '', p
|
||||||
|
index2 = normp.find('/', index + 1)
|
||||||
|
# a UNC path can't have two slashes in a row
|
||||||
|
# (after the initial two)
|
||||||
|
if index2 == index + 1:
|
||||||
|
return '', p
|
||||||
|
if index2 == -1:
|
||||||
|
index2 = len(p)
|
||||||
|
return p[:index2], p[index2:]
|
||||||
|
return '', p
|
||||||
|
|
||||||
|
|
||||||
|
# Split a path in head (everything up to the last '/') and tail (the
|
||||||
|
# rest). After the trailing '/' is stripped, the invariant
|
||||||
|
# join(head, tail) == p holds.
|
||||||
|
# The resulting head won't end in '/' unless it is the root.
|
||||||
|
|
||||||
|
def split(p):
|
||||||
|
"""Split a pathname.
|
||||||
|
|
||||||
|
Return tuple (head, tail) where tail is everything after the final slash.
|
||||||
|
Either part may be empty."""
|
||||||
|
|
||||||
|
d, p = splitdrive(p)
|
||||||
|
# set i to index beyond p's last slash
|
||||||
|
i = len(p)
|
||||||
|
while i and p[i-1] not in '/\\':
|
||||||
|
i = i - 1
|
||||||
|
head, tail = p[:i], p[i:] # now tail has no slashes
|
||||||
|
# remove trailing slashes from head, unless it's all slashes
|
||||||
|
head2 = head
|
||||||
|
while head2 and head2[-1] in '/\\':
|
||||||
|
head2 = head2[:-1]
|
||||||
|
head = head2 or head
|
||||||
|
return d + head, tail
|
||||||
|
|
||||||
|
|
||||||
|
# Split a path in root and extension.
|
||||||
|
# The extension is everything starting at the last dot in the last
|
||||||
|
# pathname component; the root is everything before that.
|
||||||
|
# It is always true that root + ext == p.
|
||||||
|
|
||||||
|
def splitext(p):
|
||||||
|
return genericpath._splitext(p, sep, altsep, extsep)
|
||||||
|
splitext.__doc__ = genericpath._splitext.__doc__
|
||||||
|
|
||||||
|
|
||||||
|
# Return the tail (basename) part of a path.
|
||||||
|
|
||||||
|
def basename(p):
|
||||||
|
"""Returns the final component of a pathname"""
|
||||||
|
return split(p)[1]
|
||||||
|
|
||||||
|
|
||||||
|
# Return the head (dirname) part of a path.
|
||||||
|
|
||||||
|
def dirname(p):
|
||||||
|
"""Returns the directory component of a pathname"""
|
||||||
|
return split(p)[0]
|
||||||
|
|
||||||
|
# Is a path a symbolic link?
|
||||||
|
# This will always return false on systems where posix.lstat doesn't exist.
|
||||||
|
|
||||||
|
def islink(path):
|
||||||
|
"""Test for symbolic link.
|
||||||
|
On WindowsNT/95 and OS/2 always returns false
|
||||||
|
"""
|
||||||
|
return False
|
||||||
|
|
||||||
|
# alias exists to lexists
|
||||||
|
lexists = exists
|
||||||
|
|
||||||
|
# Is a path a mount point? Either a root (with or without drive letter)
|
||||||
|
# or an UNC path with at most a / or \ after the mount point.
|
||||||
|
|
||||||
|
def ismount(path):
|
||||||
|
"""Test whether a path is a mount point (defined as root of drive)"""
|
||||||
|
unc, rest = splitunc(path)
|
||||||
|
if unc:
|
||||||
|
return rest in ("", "/", "\\")
|
||||||
|
p = splitdrive(path)[1]
|
||||||
|
return len(p) == 1 and p[0] in '/\\'
|
||||||
|
|
||||||
|
|
||||||
|
# Directory tree walk.
|
||||||
|
# For each directory under top (including top itself, but excluding
|
||||||
|
# '.' and '..'), func(arg, dirname, filenames) is called, where
|
||||||
|
# dirname is the name of the directory and filenames is the list
|
||||||
|
# of files (and subdirectories etc.) in the directory.
|
||||||
|
# The func may modify the filenames list, to implement a filter,
|
||||||
|
# or to impose a different order of visiting.
|
||||||
|
|
||||||
|
def walk(top, func, arg):
|
||||||
|
"""Directory tree walk with callback function.
|
||||||
|
|
||||||
|
For each directory in the directory tree rooted at top (including top
|
||||||
|
itself, but excluding '.' and '..'), call func(arg, dirname, fnames).
|
||||||
|
dirname is the name of the directory, and fnames a list of the names of
|
||||||
|
the files and subdirectories in dirname (excluding '.' and '..'). func
|
||||||
|
may modify the fnames list in-place (e.g. via del or slice assignment),
|
||||||
|
and walk will only recurse into the subdirectories whose names remain in
|
||||||
|
fnames; this can be used to implement a filter, or to impose a specific
|
||||||
|
order of visiting. No semantics are defined for, or required of, arg,
|
||||||
|
beyond that arg is always passed to func. It can be used, e.g., to pass
|
||||||
|
a filename pattern, or a mutable object designed to accumulate
|
||||||
|
statistics. Passing None for arg is common."""
|
||||||
|
warnings.warnpy3k("In 3.x, os.path.walk is removed in favor of os.walk.",
|
||||||
|
stacklevel=2)
|
||||||
|
try:
|
||||||
|
names = os.listdir(top)
|
||||||
|
except os.error:
|
||||||
|
return
|
||||||
|
func(arg, top, names)
|
||||||
|
for name in names:
|
||||||
|
name = join(top, name)
|
||||||
|
if isdir(name):
|
||||||
|
walk(name, func, arg)
|
||||||
|
|
||||||
|
|
||||||
|
# Expand paths beginning with '~' or '~user'.
|
||||||
|
# '~' means $HOME; '~user' means that user's home directory.
|
||||||
|
# If the path doesn't begin with '~', or if the user or $HOME is unknown,
|
||||||
|
# the path is returned unchanged (leaving error reporting to whatever
|
||||||
|
# function is called with the expanded path as argument).
|
||||||
|
# See also module 'glob' for expansion of *, ? and [...] in pathnames.
|
||||||
|
# (A function should also be defined to do full *sh-style environment
|
||||||
|
# variable expansion.)
|
||||||
|
|
||||||
|
def expanduser(path):
|
||||||
|
"""Expand ~ and ~user constructs.
|
||||||
|
|
||||||
|
If user or $HOME is unknown, do nothing."""
|
||||||
|
if path[:1] != '~':
|
||||||
|
return path
|
||||||
|
i, n = 1, len(path)
|
||||||
|
while i < n and path[i] not in '/\\':
|
||||||
|
i = i + 1
|
||||||
|
|
||||||
|
if 'HOME' in os.environ:
|
||||||
|
userhome = os.environ['HOME']
|
||||||
|
elif 'USERPROFILE' in os.environ:
|
||||||
|
userhome = os.environ['USERPROFILE']
|
||||||
|
elif not 'HOMEPATH' in os.environ:
|
||||||
|
return path
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
drive = os.environ['HOMEDRIVE']
|
||||||
|
except KeyError:
|
||||||
|
drive = ''
|
||||||
|
userhome = join(drive, os.environ['HOMEPATH'])
|
||||||
|
|
||||||
|
if i != 1: #~user
|
||||||
|
userhome = join(dirname(userhome), path[1:i])
|
||||||
|
|
||||||
|
return userhome + path[i:]
|
||||||
|
|
||||||
|
|
||||||
|
# Expand paths containing shell variable substitutions.
|
||||||
|
# The following rules apply:
|
||||||
|
# - no expansion within single quotes
|
||||||
|
# - '$$' is translated into '$'
|
||||||
|
# - '%%' is translated into '%' if '%%' are not seen in %var1%%var2%
|
||||||
|
# - ${varname} is accepted.
|
||||||
|
# - $varname is accepted.
|
||||||
|
# - %varname% is accepted.
|
||||||
|
# - varnames can be made out of letters, digits and the characters '_-'
|
||||||
|
# (though is not verified in the ${varname} and %varname% cases)
|
||||||
|
# XXX With COMMAND.COM you can use any characters in a variable name,
|
||||||
|
# XXX except '^|<>='.
|
||||||
|
|
||||||
|
def expandvars(path):
|
||||||
|
"""Expand shell variables of the forms $var, ${var} and %var%.
|
||||||
|
|
||||||
|
Unknown variables are left unchanged."""
|
||||||
|
if '$' not in path and '%' not in path:
|
||||||
|
return path
|
||||||
|
import string
|
||||||
|
varchars = string.ascii_letters + string.digits + '_-'
|
||||||
|
if isinstance(path, _unicode):
|
||||||
|
encoding = sys.getfilesystemencoding()
|
||||||
|
def getenv(var):
|
||||||
|
return os.environ[var.encode(encoding)].decode(encoding)
|
||||||
|
else:
|
||||||
|
def getenv(var):
|
||||||
|
return os.environ[var]
|
||||||
|
res = ''
|
||||||
|
index = 0
|
||||||
|
pathlen = len(path)
|
||||||
|
while index < pathlen:
|
||||||
|
c = path[index]
|
||||||
|
if c == '\'': # no expansion within single quotes
|
||||||
|
path = path[index + 1:]
|
||||||
|
pathlen = len(path)
|
||||||
|
try:
|
||||||
|
index = path.index('\'')
|
||||||
|
res = res + '\'' + path[:index + 1]
|
||||||
|
except ValueError:
|
||||||
|
res = res + c + path
|
||||||
|
index = pathlen - 1
|
||||||
|
elif c == '%': # variable or '%'
|
||||||
|
if path[index + 1:index + 2] == '%':
|
||||||
|
res = res + c
|
||||||
|
index = index + 1
|
||||||
|
else:
|
||||||
|
path = path[index+1:]
|
||||||
|
pathlen = len(path)
|
||||||
|
try:
|
||||||
|
index = path.index('%')
|
||||||
|
except ValueError:
|
||||||
|
res = res + '%' + path
|
||||||
|
index = pathlen - 1
|
||||||
|
else:
|
||||||
|
var = path[:index]
|
||||||
|
try:
|
||||||
|
res = res + getenv(var)
|
||||||
|
except KeyError:
|
||||||
|
res = res + '%' + var + '%'
|
||||||
|
elif c == '$': # variable or '$$'
|
||||||
|
if path[index + 1:index + 2] == '$':
|
||||||
|
res = res + c
|
||||||
|
index = index + 1
|
||||||
|
elif path[index + 1:index + 2] == '{':
|
||||||
|
path = path[index+2:]
|
||||||
|
pathlen = len(path)
|
||||||
|
try:
|
||||||
|
index = path.index('}')
|
||||||
|
var = path[:index]
|
||||||
|
try:
|
||||||
|
res = res + getenv(var)
|
||||||
|
except KeyError:
|
||||||
|
res = res + '${' + var + '}'
|
||||||
|
except ValueError:
|
||||||
|
res = res + '${' + path
|
||||||
|
index = pathlen - 1
|
||||||
|
else:
|
||||||
|
var = ''
|
||||||
|
index = index + 1
|
||||||
|
c = path[index:index + 1]
|
||||||
|
while c != '' and c in varchars:
|
||||||
|
var = var + c
|
||||||
|
index = index + 1
|
||||||
|
c = path[index:index + 1]
|
||||||
|
try:
|
||||||
|
res = res + getenv(var)
|
||||||
|
except KeyError:
|
||||||
|
res = res + '$' + var
|
||||||
|
if c != '':
|
||||||
|
index = index - 1
|
||||||
|
else:
|
||||||
|
res = res + c
|
||||||
|
index = index + 1
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A\B.
|
||||||
|
# Previously, this function also truncated pathnames to 8+3 format,
|
||||||
|
# but as this module is called "ntpath", that's obviously wrong!
|
||||||
|
|
||||||
|
def normpath(path):
|
||||||
|
"""Normalize path, eliminating double slashes, etc."""
|
||||||
|
# Preserve unicode (if path is unicode)
|
||||||
|
backslash, dot = (u'\\', u'.') if isinstance(path, _unicode) else ('\\', '.')
|
||||||
|
if path.startswith(('\\\\.\\', '\\\\?\\')):
|
||||||
|
# in the case of paths with these prefixes:
|
||||||
|
# \\.\ -> device names
|
||||||
|
# \\?\ -> literal paths
|
||||||
|
# do not do any normalization, but return the path unchanged
|
||||||
|
return path
|
||||||
|
path = path.replace("/", "\\")
|
||||||
|
prefix, path = splitdrive(path)
|
||||||
|
# We need to be careful here. If the prefix is empty, and the path starts
|
||||||
|
# with a backslash, it could either be an absolute path on the current
|
||||||
|
# drive (\dir1\dir2\file) or a UNC filename (\\server\mount\dir1\file). It
|
||||||
|
# is therefore imperative NOT to collapse multiple backslashes blindly in
|
||||||
|
# that case.
|
||||||
|
# The code below preserves multiple backslashes when there is no drive
|
||||||
|
# letter. This means that the invalid filename \\\a\b is preserved
|
||||||
|
# unchanged, where a\\\b is normalised to a\b. It's not clear that there
|
||||||
|
# is any better behaviour for such edge cases.
|
||||||
|
if prefix == '':
|
||||||
|
# No drive letter - preserve initial backslashes
|
||||||
|
while path[:1] == "\\":
|
||||||
|
prefix = prefix + backslash
|
||||||
|
path = path[1:]
|
||||||
|
else:
|
||||||
|
# We have a drive letter - collapse initial backslashes
|
||||||
|
if path.startswith("\\"):
|
||||||
|
prefix = prefix + backslash
|
||||||
|
path = path.lstrip("\\")
|
||||||
|
comps = path.split("\\")
|
||||||
|
i = 0
|
||||||
|
while i < len(comps):
|
||||||
|
if comps[i] in ('.', ''):
|
||||||
|
del comps[i]
|
||||||
|
elif comps[i] == '..':
|
||||||
|
if i > 0 and comps[i-1] != '..':
|
||||||
|
del comps[i-1:i+1]
|
||||||
|
i -= 1
|
||||||
|
elif i == 0 and prefix.endswith("\\"):
|
||||||
|
del comps[i]
|
||||||
|
else:
|
||||||
|
i += 1
|
||||||
|
else:
|
||||||
|
i += 1
|
||||||
|
# If the path is now empty, substitute '.'
|
||||||
|
if not prefix and not comps:
|
||||||
|
comps.append(dot)
|
||||||
|
return prefix + backslash.join(comps)
|
||||||
|
|
||||||
|
|
||||||
|
# Return an absolute path.
|
||||||
|
try:
|
||||||
|
from nt import _getfullpathname
|
||||||
|
|
||||||
|
except ImportError: # not running on Windows - mock up something sensible
|
||||||
|
def abspath(path):
|
||||||
|
"""Return the absolute version of a path."""
|
||||||
|
if not isabs(path):
|
||||||
|
if isinstance(path, _unicode):
|
||||||
|
cwd = os.getcwdu()
|
||||||
|
else:
|
||||||
|
cwd = os.getcwd()
|
||||||
|
path = join(cwd, path)
|
||||||
|
return normpath(path)
|
||||||
|
|
||||||
|
else: # use native Windows method on Windows
|
||||||
|
def abspath(path):
|
||||||
|
"""Return the absolute version of a path."""
|
||||||
|
|
||||||
|
if path: # Empty path must return current working directory.
|
||||||
|
try:
|
||||||
|
path = _getfullpathname(path)
|
||||||
|
except WindowsError:
|
||||||
|
pass # Bad path - return unchanged.
|
||||||
|
elif isinstance(path, _unicode):
|
||||||
|
path = os.getcwdu()
|
||||||
|
else:
|
||||||
|
path = os.getcwd()
|
||||||
|
return normpath(path)
|
||||||
|
|
||||||
|
# realpath is a no-op on systems without islink support
|
||||||
|
realpath = abspath
|
||||||
|
# Win9x family and earlier have no Unicode filename support.
|
||||||
|
supports_unicode_filenames = (hasattr(sys, "getwindowsversion") and
|
||||||
|
sys.getwindowsversion()[3] >= 2)
|
||||||
|
|
||||||
|
def _abspath_split(path):
|
||||||
|
abs = abspath(normpath(path))
|
||||||
|
prefix, rest = splitunc(abs)
|
||||||
|
is_unc = bool(prefix)
|
||||||
|
if not is_unc:
|
||||||
|
prefix, rest = splitdrive(abs)
|
||||||
|
return is_unc, prefix, [x for x in rest.split(sep) if x]
|
||||||
|
|
||||||
|
def relpath(path, start=curdir):
|
||||||
|
"""Return a relative version of a path"""
|
||||||
|
|
||||||
|
if not path:
|
||||||
|
raise ValueError("no path specified")
|
||||||
|
|
||||||
|
start_is_unc, start_prefix, start_list = _abspath_split(start)
|
||||||
|
path_is_unc, path_prefix, path_list = _abspath_split(path)
|
||||||
|
|
||||||
|
if path_is_unc ^ start_is_unc:
|
||||||
|
raise ValueError("Cannot mix UNC and non-UNC paths (%s and %s)"
|
||||||
|
% (path, start))
|
||||||
|
if path_prefix.lower() != start_prefix.lower():
|
||||||
|
if path_is_unc:
|
||||||
|
raise ValueError("path is on UNC root %s, start on UNC root %s"
|
||||||
|
% (path_prefix, start_prefix))
|
||||||
|
else:
|
||||||
|
raise ValueError("path is on drive %s, start on drive %s"
|
||||||
|
% (path_prefix, start_prefix))
|
||||||
|
# Work out how much of the filepath is shared by start and path.
|
||||||
|
i = 0
|
||||||
|
for e1, e2 in zip(start_list, path_list):
|
||||||
|
if e1.lower() != e2.lower():
|
||||||
|
break
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
rel_list = [pardir] * (len(start_list)-i) + path_list[i:]
|
||||||
|
if not rel_list:
|
||||||
|
return curdir
|
||||||
|
return join(*rel_list)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# The genericpath.isdir implementation uses os.stat and checks the mode
|
||||||
|
# attribute to tell whether or not the path is a directory.
|
||||||
|
# This is overkill on Windows - just pass the path to GetFileAttributes
|
||||||
|
# and check the attribute from there.
|
||||||
|
from nt import _isdir as isdir
|
||||||
|
except ImportError:
|
||||||
|
# Use genericpath.isdir as imported above.
|
||||||
|
pass
|
742
AppPkg/Applications/Python/Python-2.7.10/PyMod-2.7.10/Lib/os.py
Normal file
742
AppPkg/Applications/Python/Python-2.7.10/PyMod-2.7.10/Lib/os.py
Normal file
@@ -0,0 +1,742 @@
|
|||||||
|
r"""OS routines for NT or Posix depending on what system we're on.
|
||||||
|
|
||||||
|
This exports:
|
||||||
|
- all functions from posix, nt, os2, or ce, e.g. unlink, stat, etc.
|
||||||
|
- os.path is one of the modules posixpath, or ntpath
|
||||||
|
- os.name is 'posix', 'nt', 'os2', 'ce' or 'riscos'
|
||||||
|
- os.curdir is a string representing the current directory ('.' or ':')
|
||||||
|
- os.pardir is a string representing the parent directory ('..' or '::')
|
||||||
|
- os.sep is the (or a most common) pathname separator ('/' or ':' or '\\')
|
||||||
|
- os.extsep is the extension separator ('.' or '/')
|
||||||
|
- os.altsep is the alternate pathname separator (None or '/')
|
||||||
|
- os.pathsep is the component separator used in $PATH etc
|
||||||
|
- os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
|
||||||
|
- os.defpath is the default search path for executables
|
||||||
|
- os.devnull is the file path of the null device ('/dev/null', etc.)
|
||||||
|
|
||||||
|
Programs that import and use 'os' stand a better chance of being
|
||||||
|
portable between different platforms. Of course, they must then
|
||||||
|
only use functions that are defined by all platforms (e.g., unlink
|
||||||
|
and opendir), and leave all pathname manipulation to os.path
|
||||||
|
(e.g., split and join).
|
||||||
|
"""
|
||||||
|
|
||||||
|
#'
|
||||||
|
|
||||||
|
import sys, errno
|
||||||
|
|
||||||
|
_names = sys.builtin_module_names
|
||||||
|
|
||||||
|
# Note: more names are added to __all__ later.
|
||||||
|
__all__ = ["altsep", "curdir", "pardir", "sep", "extsep", "pathsep", "linesep",
|
||||||
|
"defpath", "name", "path", "devnull",
|
||||||
|
"SEEK_SET", "SEEK_CUR", "SEEK_END"]
|
||||||
|
|
||||||
|
def _get_exports_list(module):
|
||||||
|
try:
|
||||||
|
return list(module.__all__)
|
||||||
|
except AttributeError:
|
||||||
|
return [n for n in dir(module) if n[0] != '_']
|
||||||
|
|
||||||
|
if 'posix' in _names:
|
||||||
|
name = 'posix'
|
||||||
|
linesep = '\n'
|
||||||
|
from posix import *
|
||||||
|
try:
|
||||||
|
from posix import _exit
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
import posixpath as path
|
||||||
|
|
||||||
|
import posix
|
||||||
|
__all__.extend(_get_exports_list(posix))
|
||||||
|
del posix
|
||||||
|
|
||||||
|
elif 'nt' in _names:
|
||||||
|
name = 'nt'
|
||||||
|
linesep = '\r\n'
|
||||||
|
from nt import *
|
||||||
|
try:
|
||||||
|
from nt import _exit
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
import ntpath as path
|
||||||
|
|
||||||
|
import nt
|
||||||
|
__all__.extend(_get_exports_list(nt))
|
||||||
|
del nt
|
||||||
|
|
||||||
|
elif 'os2' in _names:
|
||||||
|
name = 'os2'
|
||||||
|
linesep = '\r\n'
|
||||||
|
from os2 import *
|
||||||
|
try:
|
||||||
|
from os2 import _exit
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
if sys.version.find('EMX GCC') == -1:
|
||||||
|
import ntpath as path
|
||||||
|
else:
|
||||||
|
import os2emxpath as path
|
||||||
|
from _emx_link import link
|
||||||
|
|
||||||
|
import os2
|
||||||
|
__all__.extend(_get_exports_list(os2))
|
||||||
|
del os2
|
||||||
|
|
||||||
|
elif 'ce' in _names:
|
||||||
|
name = 'ce'
|
||||||
|
linesep = '\r\n'
|
||||||
|
from ce import *
|
||||||
|
try:
|
||||||
|
from ce import _exit
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
# We can use the standard Windows path.
|
||||||
|
import ntpath as path
|
||||||
|
|
||||||
|
import ce
|
||||||
|
__all__.extend(_get_exports_list(ce))
|
||||||
|
del ce
|
||||||
|
|
||||||
|
elif 'riscos' in _names:
|
||||||
|
name = 'riscos'
|
||||||
|
linesep = '\n'
|
||||||
|
from riscos import *
|
||||||
|
try:
|
||||||
|
from riscos import _exit
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
import riscospath as path
|
||||||
|
|
||||||
|
import riscos
|
||||||
|
__all__.extend(_get_exports_list(riscos))
|
||||||
|
del riscos
|
||||||
|
|
||||||
|
else:
|
||||||
|
raise ImportError, 'no os specific module found'
|
||||||
|
|
||||||
|
sys.modules['os.path'] = path
|
||||||
|
from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,
|
||||||
|
devnull)
|
||||||
|
|
||||||
|
del _names
|
||||||
|
|
||||||
|
# Python uses fixed values for the SEEK_ constants; they are mapped
|
||||||
|
# to native constants if necessary in posixmodule.c
|
||||||
|
SEEK_SET = 0
|
||||||
|
SEEK_CUR = 1
|
||||||
|
SEEK_END = 2
|
||||||
|
|
||||||
|
#'
|
||||||
|
|
||||||
|
# Super directory utilities.
|
||||||
|
# (Inspired by Eric Raymond; the doc strings are mostly his)
|
||||||
|
|
||||||
|
def makedirs(name, mode=0777):
|
||||||
|
"""makedirs(path [, mode=0777])
|
||||||
|
|
||||||
|
Super-mkdir; create a leaf directory and all intermediate ones.
|
||||||
|
Works like mkdir, except that any intermediate path segment (not
|
||||||
|
just the rightmost) will be created if it does not exist. This is
|
||||||
|
recursive.
|
||||||
|
|
||||||
|
"""
|
||||||
|
head, tail = path.split(name)
|
||||||
|
if not tail:
|
||||||
|
head, tail = path.split(head)
|
||||||
|
if head and tail and not path.exists(head):
|
||||||
|
try:
|
||||||
|
makedirs(head, mode)
|
||||||
|
except OSError, e:
|
||||||
|
# be happy if someone already created the path
|
||||||
|
if e.errno != errno.EEXIST:
|
||||||
|
raise
|
||||||
|
if tail == curdir: # xxx/newdir/. exists if xxx/newdir exists
|
||||||
|
return
|
||||||
|
mkdir(name, mode)
|
||||||
|
|
||||||
|
def removedirs(name):
|
||||||
|
"""removedirs(path)
|
||||||
|
|
||||||
|
Super-rmdir; remove a leaf directory and all empty intermediate
|
||||||
|
ones. Works like rmdir except that, if the leaf directory is
|
||||||
|
successfully removed, directories corresponding to rightmost path
|
||||||
|
segments will be pruned away until either the whole path is
|
||||||
|
consumed or an error occurs. Errors during this latter phase are
|
||||||
|
ignored -- they generally mean that a directory was not empty.
|
||||||
|
|
||||||
|
"""
|
||||||
|
rmdir(name)
|
||||||
|
head, tail = path.split(name)
|
||||||
|
if not tail:
|
||||||
|
head, tail = path.split(head)
|
||||||
|
while head and tail:
|
||||||
|
try:
|
||||||
|
rmdir(head)
|
||||||
|
except error:
|
||||||
|
break
|
||||||
|
head, tail = path.split(head)
|
||||||
|
|
||||||
|
def renames(old, new):
|
||||||
|
"""renames(old, new)
|
||||||
|
|
||||||
|
Super-rename; create directories as necessary and delete any left
|
||||||
|
empty. Works like rename, except creation of any intermediate
|
||||||
|
directories needed to make the new pathname good is attempted
|
||||||
|
first. After the rename, directories corresponding to rightmost
|
||||||
|
path segments of the old name will be pruned until either the
|
||||||
|
whole path is consumed or a nonempty directory is found.
|
||||||
|
|
||||||
|
Note: this function can fail with the new directory structure made
|
||||||
|
if you lack permissions needed to unlink the leaf directory or
|
||||||
|
file.
|
||||||
|
|
||||||
|
"""
|
||||||
|
head, tail = path.split(new)
|
||||||
|
if head and tail and not path.exists(head):
|
||||||
|
makedirs(head)
|
||||||
|
rename(old, new)
|
||||||
|
head, tail = path.split(old)
|
||||||
|
if head and tail:
|
||||||
|
try:
|
||||||
|
removedirs(head)
|
||||||
|
except error:
|
||||||
|
pass
|
||||||
|
|
||||||
|
__all__.extend(["makedirs", "removedirs", "renames"])
|
||||||
|
|
||||||
|
def walk(top, topdown=True, onerror=None, followlinks=False):
|
||||||
|
"""Directory tree generator.
|
||||||
|
|
||||||
|
For each directory in the directory tree rooted at top (including top
|
||||||
|
itself, but excluding '.' and '..'), yields a 3-tuple
|
||||||
|
|
||||||
|
dirpath, dirnames, filenames
|
||||||
|
|
||||||
|
dirpath is a string, the path to the directory. dirnames is a list of
|
||||||
|
the names of the subdirectories in dirpath (excluding '.' and '..').
|
||||||
|
filenames is a list of the names of the non-directory files in dirpath.
|
||||||
|
Note that the names in the lists are just names, with no path components.
|
||||||
|
To get a full path (which begins with top) to a file or directory in
|
||||||
|
dirpath, do os.path.join(dirpath, name).
|
||||||
|
|
||||||
|
If optional arg 'topdown' is true or not specified, the triple for a
|
||||||
|
directory is generated before the triples for any of its subdirectories
|
||||||
|
(directories are generated top down). If topdown is false, the triple
|
||||||
|
for a directory is generated after the triples for all of its
|
||||||
|
subdirectories (directories are generated bottom up).
|
||||||
|
|
||||||
|
When topdown is true, the caller can modify the dirnames list in-place
|
||||||
|
(e.g., via del or slice assignment), and walk will only recurse into the
|
||||||
|
subdirectories whose names remain in dirnames; this can be used to prune the
|
||||||
|
search, or to impose a specific order of visiting. Modifying dirnames when
|
||||||
|
topdown is false is ineffective, since the directories in dirnames have
|
||||||
|
already been generated by the time dirnames itself is generated. No matter
|
||||||
|
the value of topdown, the list of subdirectories is retrieved before the
|
||||||
|
tuples for the directory and its subdirectories are generated.
|
||||||
|
|
||||||
|
By default errors from the os.listdir() call are ignored. If
|
||||||
|
optional arg 'onerror' is specified, it should be a function; it
|
||||||
|
will be called with one argument, an os.error instance. It can
|
||||||
|
report the error to continue with the walk, or raise the exception
|
||||||
|
to abort the walk. Note that the filename is available as the
|
||||||
|
filename attribute of the exception object.
|
||||||
|
|
||||||
|
By default, os.walk does not follow symbolic links to subdirectories on
|
||||||
|
systems that support them. In order to get this functionality, set the
|
||||||
|
optional argument 'followlinks' to true.
|
||||||
|
|
||||||
|
Caution: if you pass a relative pathname for top, don't change the
|
||||||
|
current working directory between resumptions of walk. walk never
|
||||||
|
changes the current directory, and assumes that the client doesn't
|
||||||
|
either.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
import os
|
||||||
|
from os.path import join, getsize
|
||||||
|
for root, dirs, files in os.walk('python/Lib/email'):
|
||||||
|
print root, "consumes",
|
||||||
|
print sum([getsize(join(root, name)) for name in files]),
|
||||||
|
print "bytes in", len(files), "non-directory files"
|
||||||
|
if 'CVS' in dirs:
|
||||||
|
dirs.remove('CVS') # don't visit CVS directories
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
islink, join, isdir = path.islink, path.join, path.isdir
|
||||||
|
|
||||||
|
# We may not have read permission for top, in which case we can't
|
||||||
|
# get a list of the files the directory contains. os.path.walk
|
||||||
|
# always suppressed the exception then, rather than blow up for a
|
||||||
|
# minor reason when (say) a thousand readable directories are still
|
||||||
|
# left to visit. That logic is copied here.
|
||||||
|
try:
|
||||||
|
# Note that listdir and error are globals in this module due
|
||||||
|
# to earlier import-*.
|
||||||
|
names = listdir(top)
|
||||||
|
except error, err:
|
||||||
|
if onerror is not None:
|
||||||
|
onerror(err)
|
||||||
|
return
|
||||||
|
|
||||||
|
dirs, nondirs = [], []
|
||||||
|
for name in names:
|
||||||
|
if isdir(join(top, name)):
|
||||||
|
dirs.append(name)
|
||||||
|
else:
|
||||||
|
nondirs.append(name)
|
||||||
|
|
||||||
|
if topdown:
|
||||||
|
yield top, dirs, nondirs
|
||||||
|
for name in dirs:
|
||||||
|
new_path = join(top, name)
|
||||||
|
if followlinks or not islink(new_path):
|
||||||
|
for x in walk(new_path, topdown, onerror, followlinks):
|
||||||
|
yield x
|
||||||
|
if not topdown:
|
||||||
|
yield top, dirs, nondirs
|
||||||
|
|
||||||
|
__all__.append("walk")
|
||||||
|
|
||||||
|
# Make sure os.environ exists, at least
|
||||||
|
try:
|
||||||
|
environ
|
||||||
|
except NameError:
|
||||||
|
environ = {}
|
||||||
|
|
||||||
|
def execl(file, *args):
|
||||||
|
"""execl(file, *args)
|
||||||
|
|
||||||
|
Execute the executable file with argument list args, replacing the
|
||||||
|
current process. """
|
||||||
|
execv(file, args)
|
||||||
|
|
||||||
|
def execle(file, *args):
|
||||||
|
"""execle(file, *args, env)
|
||||||
|
|
||||||
|
Execute the executable file with argument list args and
|
||||||
|
environment env, replacing the current process. """
|
||||||
|
env = args[-1]
|
||||||
|
execve(file, args[:-1], env)
|
||||||
|
|
||||||
|
def execlp(file, *args):
|
||||||
|
"""execlp(file, *args)
|
||||||
|
|
||||||
|
Execute the executable file (which is searched for along $PATH)
|
||||||
|
with argument list args, replacing the current process. """
|
||||||
|
execvp(file, args)
|
||||||
|
|
||||||
|
def execlpe(file, *args):
|
||||||
|
"""execlpe(file, *args, env)
|
||||||
|
|
||||||
|
Execute the executable file (which is searched for along $PATH)
|
||||||
|
with argument list args and environment env, replacing the current
|
||||||
|
process. """
|
||||||
|
env = args[-1]
|
||||||
|
execvpe(file, args[:-1], env)
|
||||||
|
|
||||||
|
def execvp(file, args):
|
||||||
|
"""execvp(file, args)
|
||||||
|
|
||||||
|
Execute the executable file (which is searched for along $PATH)
|
||||||
|
with argument list args, replacing the current process.
|
||||||
|
args may be a list or tuple of strings. """
|
||||||
|
_execvpe(file, args)
|
||||||
|
|
||||||
|
def execvpe(file, args, env):
|
||||||
|
"""execvpe(file, args, env)
|
||||||
|
|
||||||
|
Execute the executable file (which is searched for along $PATH)
|
||||||
|
with argument list args and environment env , replacing the
|
||||||
|
current process.
|
||||||
|
args may be a list or tuple of strings. """
|
||||||
|
_execvpe(file, args, env)
|
||||||
|
|
||||||
|
__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"])
|
||||||
|
|
||||||
|
def _execvpe(file, args, env=None):
|
||||||
|
if env is not None:
|
||||||
|
func = execve
|
||||||
|
argrest = (args, env)
|
||||||
|
else:
|
||||||
|
func = execv
|
||||||
|
argrest = (args,)
|
||||||
|
env = environ
|
||||||
|
|
||||||
|
head, tail = path.split(file)
|
||||||
|
if head:
|
||||||
|
func(file, *argrest)
|
||||||
|
return
|
||||||
|
if 'PATH' in env:
|
||||||
|
envpath = env['PATH']
|
||||||
|
else:
|
||||||
|
envpath = defpath
|
||||||
|
PATH = envpath.split(pathsep)
|
||||||
|
saved_exc = None
|
||||||
|
saved_tb = None
|
||||||
|
for dir in PATH:
|
||||||
|
fullname = path.join(dir, file)
|
||||||
|
try:
|
||||||
|
func(fullname, *argrest)
|
||||||
|
except error, e:
|
||||||
|
tb = sys.exc_info()[2]
|
||||||
|
if (e.errno != errno.ENOENT and e.errno != errno.ENOTDIR
|
||||||
|
and saved_exc is None):
|
||||||
|
saved_exc = e
|
||||||
|
saved_tb = tb
|
||||||
|
if saved_exc:
|
||||||
|
raise error, saved_exc, saved_tb
|
||||||
|
raise error, e, tb
|
||||||
|
|
||||||
|
# Change environ to automatically call putenv() if it exists
|
||||||
|
try:
|
||||||
|
# This will fail if there's no putenv
|
||||||
|
putenv
|
||||||
|
except NameError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
import UserDict
|
||||||
|
|
||||||
|
# Fake unsetenv() for Windows
|
||||||
|
# not sure about os2 here but
|
||||||
|
# I'm guessing they are the same.
|
||||||
|
|
||||||
|
if name in ('os2', 'nt'):
|
||||||
|
def unsetenv(key):
|
||||||
|
putenv(key, "")
|
||||||
|
|
||||||
|
if name == "riscos":
|
||||||
|
# On RISC OS, all env access goes through getenv and putenv
|
||||||
|
from riscosenviron import _Environ
|
||||||
|
elif name in ('os2', 'nt'): # Where Env Var Names Must Be UPPERCASE
|
||||||
|
# But we store them as upper case
|
||||||
|
class _Environ(UserDict.IterableUserDict):
|
||||||
|
def __init__(self, environ):
|
||||||
|
UserDict.UserDict.__init__(self)
|
||||||
|
data = self.data
|
||||||
|
for k, v in environ.items():
|
||||||
|
data[k.upper()] = v
|
||||||
|
def __setitem__(self, key, item):
|
||||||
|
putenv(key, item)
|
||||||
|
self.data[key.upper()] = item
|
||||||
|
def __getitem__(self, key):
|
||||||
|
return self.data[key.upper()]
|
||||||
|
try:
|
||||||
|
unsetenv
|
||||||
|
except NameError:
|
||||||
|
def __delitem__(self, key):
|
||||||
|
del self.data[key.upper()]
|
||||||
|
else:
|
||||||
|
def __delitem__(self, key):
|
||||||
|
unsetenv(key)
|
||||||
|
del self.data[key.upper()]
|
||||||
|
def clear(self):
|
||||||
|
for key in self.data.keys():
|
||||||
|
unsetenv(key)
|
||||||
|
del self.data[key]
|
||||||
|
def pop(self, key, *args):
|
||||||
|
unsetenv(key)
|
||||||
|
return self.data.pop(key.upper(), *args)
|
||||||
|
def has_key(self, key):
|
||||||
|
return key.upper() in self.data
|
||||||
|
def __contains__(self, key):
|
||||||
|
return key.upper() in self.data
|
||||||
|
def get(self, key, failobj=None):
|
||||||
|
return self.data.get(key.upper(), failobj)
|
||||||
|
def update(self, dict=None, **kwargs):
|
||||||
|
if dict:
|
||||||
|
try:
|
||||||
|
keys = dict.keys()
|
||||||
|
except AttributeError:
|
||||||
|
# List of (key, value)
|
||||||
|
for k, v in dict:
|
||||||
|
self[k] = v
|
||||||
|
else:
|
||||||
|
# got keys
|
||||||
|
# cannot use items(), since mappings
|
||||||
|
# may not have them.
|
||||||
|
for k in keys:
|
||||||
|
self[k] = dict[k]
|
||||||
|
if kwargs:
|
||||||
|
self.update(kwargs)
|
||||||
|
def copy(self):
|
||||||
|
return dict(self)
|
||||||
|
|
||||||
|
else: # Where Env Var Names Can Be Mixed Case
|
||||||
|
class _Environ(UserDict.IterableUserDict):
|
||||||
|
def __init__(self, environ):
|
||||||
|
UserDict.UserDict.__init__(self)
|
||||||
|
self.data = environ
|
||||||
|
def __setitem__(self, key, item):
|
||||||
|
putenv(key, item)
|
||||||
|
self.data[key] = item
|
||||||
|
def update(self, dict=None, **kwargs):
|
||||||
|
if dict:
|
||||||
|
try:
|
||||||
|
keys = dict.keys()
|
||||||
|
except AttributeError:
|
||||||
|
# List of (key, value)
|
||||||
|
for k, v in dict:
|
||||||
|
self[k] = v
|
||||||
|
else:
|
||||||
|
# got keys
|
||||||
|
# cannot use items(), since mappings
|
||||||
|
# may not have them.
|
||||||
|
for k in keys:
|
||||||
|
self[k] = dict[k]
|
||||||
|
if kwargs:
|
||||||
|
self.update(kwargs)
|
||||||
|
try:
|
||||||
|
unsetenv
|
||||||
|
except NameError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
def __delitem__(self, key):
|
||||||
|
unsetenv(key)
|
||||||
|
del self.data[key]
|
||||||
|
def clear(self):
|
||||||
|
for key in self.data.keys():
|
||||||
|
unsetenv(key)
|
||||||
|
del self.data[key]
|
||||||
|
def pop(self, key, *args):
|
||||||
|
unsetenv(key)
|
||||||
|
return self.data.pop(key, *args)
|
||||||
|
def copy(self):
|
||||||
|
return dict(self)
|
||||||
|
|
||||||
|
|
||||||
|
environ = _Environ(environ)
|
||||||
|
|
||||||
|
def getenv(key, default=None):
|
||||||
|
"""Get an environment variable, return None if it doesn't exist.
|
||||||
|
The optional second argument can specify an alternate default."""
|
||||||
|
return environ.get(key, default)
|
||||||
|
__all__.append("getenv")
|
||||||
|
|
||||||
|
def _exists(name):
|
||||||
|
return name in globals()
|
||||||
|
|
||||||
|
# Supply spawn*() (probably only for Unix)
|
||||||
|
if _exists("fork") and not _exists("spawnv") and _exists("execv"):
|
||||||
|
|
||||||
|
P_WAIT = 0
|
||||||
|
P_NOWAIT = P_NOWAITO = 1
|
||||||
|
|
||||||
|
# XXX Should we support P_DETACH? I suppose it could fork()**2
|
||||||
|
# and close the std I/O streams. Also, P_OVERLAY is the same
|
||||||
|
# as execv*()?
|
||||||
|
|
||||||
|
def _spawnvef(mode, file, args, env, func):
|
||||||
|
# Internal helper; func is the exec*() function to use
|
||||||
|
pid = fork()
|
||||||
|
if not pid:
|
||||||
|
# Child
|
||||||
|
try:
|
||||||
|
if env is None:
|
||||||
|
func(file, args)
|
||||||
|
else:
|
||||||
|
func(file, args, env)
|
||||||
|
except:
|
||||||
|
_exit(127)
|
||||||
|
else:
|
||||||
|
# Parent
|
||||||
|
if mode == P_NOWAIT:
|
||||||
|
return pid # Caller is responsible for waiting!
|
||||||
|
while 1:
|
||||||
|
wpid, sts = waitpid(pid, 0)
|
||||||
|
if WIFSTOPPED(sts):
|
||||||
|
continue
|
||||||
|
elif WIFSIGNALED(sts):
|
||||||
|
return -WTERMSIG(sts)
|
||||||
|
elif WIFEXITED(sts):
|
||||||
|
return WEXITSTATUS(sts)
|
||||||
|
else:
|
||||||
|
raise error, "Not stopped, signaled or exited???"
|
||||||
|
|
||||||
|
def spawnv(mode, file, args):
|
||||||
|
"""spawnv(mode, file, args) -> integer
|
||||||
|
|
||||||
|
Execute file with arguments from args in a subprocess.
|
||||||
|
If mode == P_NOWAIT return the pid of the process.
|
||||||
|
If mode == P_WAIT return the process's exit code if it exits normally;
|
||||||
|
otherwise return -SIG, where SIG is the signal that killed it. """
|
||||||
|
return _spawnvef(mode, file, args, None, execv)
|
||||||
|
|
||||||
|
def spawnve(mode, file, args, env):
|
||||||
|
"""spawnve(mode, file, args, env) -> integer
|
||||||
|
|
||||||
|
Execute file with arguments from args in a subprocess with the
|
||||||
|
specified environment.
|
||||||
|
If mode == P_NOWAIT return the pid of the process.
|
||||||
|
If mode == P_WAIT return the process's exit code if it exits normally;
|
||||||
|
otherwise return -SIG, where SIG is the signal that killed it. """
|
||||||
|
return _spawnvef(mode, file, args, env, execve)
|
||||||
|
|
||||||
|
# Note: spawnvp[e] is't currently supported on Windows
|
||||||
|
|
||||||
|
def spawnvp(mode, file, args):
|
||||||
|
"""spawnvp(mode, file, args) -> integer
|
||||||
|
|
||||||
|
Execute file (which is looked for along $PATH) with arguments from
|
||||||
|
args in a subprocess.
|
||||||
|
If mode == P_NOWAIT return the pid of the process.
|
||||||
|
If mode == P_WAIT return the process's exit code if it exits normally;
|
||||||
|
otherwise return -SIG, where SIG is the signal that killed it. """
|
||||||
|
return _spawnvef(mode, file, args, None, execvp)
|
||||||
|
|
||||||
|
def spawnvpe(mode, file, args, env):
|
||||||
|
"""spawnvpe(mode, file, args, env) -> integer
|
||||||
|
|
||||||
|
Execute file (which is looked for along $PATH) with arguments from
|
||||||
|
args in a subprocess with the supplied environment.
|
||||||
|
If mode == P_NOWAIT return the pid of the process.
|
||||||
|
If mode == P_WAIT return the process's exit code if it exits normally;
|
||||||
|
otherwise return -SIG, where SIG is the signal that killed it. """
|
||||||
|
return _spawnvef(mode, file, args, env, execvpe)
|
||||||
|
|
||||||
|
if _exists("spawnv"):
|
||||||
|
# These aren't supplied by the basic Windows code
|
||||||
|
# but can be easily implemented in Python
|
||||||
|
|
||||||
|
def spawnl(mode, file, *args):
|
||||||
|
"""spawnl(mode, file, *args) -> integer
|
||||||
|
|
||||||
|
Execute file with arguments from args in a subprocess.
|
||||||
|
If mode == P_NOWAIT return the pid of the process.
|
||||||
|
If mode == P_WAIT return the process's exit code if it exits normally;
|
||||||
|
otherwise return -SIG, where SIG is the signal that killed it. """
|
||||||
|
return spawnv(mode, file, args)
|
||||||
|
|
||||||
|
def spawnle(mode, file, *args):
|
||||||
|
"""spawnle(mode, file, *args, env) -> integer
|
||||||
|
|
||||||
|
Execute file with arguments from args in a subprocess with the
|
||||||
|
supplied environment.
|
||||||
|
If mode == P_NOWAIT return the pid of the process.
|
||||||
|
If mode == P_WAIT return the process's exit code if it exits normally;
|
||||||
|
otherwise return -SIG, where SIG is the signal that killed it. """
|
||||||
|
env = args[-1]
|
||||||
|
return spawnve(mode, file, args[:-1], env)
|
||||||
|
|
||||||
|
|
||||||
|
__all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",])
|
||||||
|
|
||||||
|
|
||||||
|
if _exists("spawnvp"):
|
||||||
|
# At the moment, Windows doesn't implement spawnvp[e],
|
||||||
|
# so it won't have spawnlp[e] either.
|
||||||
|
def spawnlp(mode, file, *args):
|
||||||
|
"""spawnlp(mode, file, *args) -> integer
|
||||||
|
|
||||||
|
Execute file (which is looked for along $PATH) with arguments from
|
||||||
|
args in a subprocess with the supplied environment.
|
||||||
|
If mode == P_NOWAIT return the pid of the process.
|
||||||
|
If mode == P_WAIT return the process's exit code if it exits normally;
|
||||||
|
otherwise return -SIG, where SIG is the signal that killed it. """
|
||||||
|
return spawnvp(mode, file, args)
|
||||||
|
|
||||||
|
def spawnlpe(mode, file, *args):
|
||||||
|
"""spawnlpe(mode, file, *args, env) -> integer
|
||||||
|
|
||||||
|
Execute file (which is looked for along $PATH) with arguments from
|
||||||
|
args in a subprocess with the supplied environment.
|
||||||
|
If mode == P_NOWAIT return the pid of the process.
|
||||||
|
If mode == P_WAIT return the process's exit code if it exits normally;
|
||||||
|
otherwise return -SIG, where SIG is the signal that killed it. """
|
||||||
|
env = args[-1]
|
||||||
|
return spawnvpe(mode, file, args[:-1], env)
|
||||||
|
|
||||||
|
|
||||||
|
__all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",])
|
||||||
|
|
||||||
|
|
||||||
|
# Supply popen2 etc. (for Unix)
|
||||||
|
if _exists("fork"):
|
||||||
|
if not _exists("popen2"):
|
||||||
|
def popen2(cmd, mode="t", bufsize=-1):
|
||||||
|
"""Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd'
|
||||||
|
may be a sequence, in which case arguments will be passed directly to
|
||||||
|
the program without shell intervention (as with os.spawnv()). If 'cmd'
|
||||||
|
is a string it will be passed to the shell (as with os.system()). If
|
||||||
|
'bufsize' is specified, it sets the buffer size for the I/O pipes. The
|
||||||
|
file objects (child_stdin, child_stdout) are returned."""
|
||||||
|
import warnings
|
||||||
|
msg = "os.popen2 is deprecated. Use the subprocess module."
|
||||||
|
warnings.warn(msg, DeprecationWarning, stacklevel=2)
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
PIPE = subprocess.PIPE
|
||||||
|
p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring),
|
||||||
|
bufsize=bufsize, stdin=PIPE, stdout=PIPE,
|
||||||
|
close_fds=True)
|
||||||
|
return p.stdin, p.stdout
|
||||||
|
__all__.append("popen2")
|
||||||
|
|
||||||
|
if not _exists("popen3"):
|
||||||
|
def popen3(cmd, mode="t", bufsize=-1):
|
||||||
|
"""Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd'
|
||||||
|
may be a sequence, in which case arguments will be passed directly to
|
||||||
|
the program without shell intervention (as with os.spawnv()). If 'cmd'
|
||||||
|
is a string it will be passed to the shell (as with os.system()). If
|
||||||
|
'bufsize' is specified, it sets the buffer size for the I/O pipes. The
|
||||||
|
file objects (child_stdin, child_stdout, child_stderr) are returned."""
|
||||||
|
import warnings
|
||||||
|
msg = "os.popen3 is deprecated. Use the subprocess module."
|
||||||
|
warnings.warn(msg, DeprecationWarning, stacklevel=2)
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
PIPE = subprocess.PIPE
|
||||||
|
p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring),
|
||||||
|
bufsize=bufsize, stdin=PIPE, stdout=PIPE,
|
||||||
|
stderr=PIPE, close_fds=True)
|
||||||
|
return p.stdin, p.stdout, p.stderr
|
||||||
|
__all__.append("popen3")
|
||||||
|
|
||||||
|
if not _exists("popen4"):
|
||||||
|
def popen4(cmd, mode="t", bufsize=-1):
|
||||||
|
"""Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd'
|
||||||
|
may be a sequence, in which case arguments will be passed directly to
|
||||||
|
the program without shell intervention (as with os.spawnv()). If 'cmd'
|
||||||
|
is a string it will be passed to the shell (as with os.system()). If
|
||||||
|
'bufsize' is specified, it sets the buffer size for the I/O pipes. The
|
||||||
|
file objects (child_stdin, child_stdout_stderr) are returned."""
|
||||||
|
import warnings
|
||||||
|
msg = "os.popen4 is deprecated. Use the subprocess module."
|
||||||
|
warnings.warn(msg, DeprecationWarning, stacklevel=2)
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
PIPE = subprocess.PIPE
|
||||||
|
p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring),
|
||||||
|
bufsize=bufsize, stdin=PIPE, stdout=PIPE,
|
||||||
|
stderr=subprocess.STDOUT, close_fds=True)
|
||||||
|
return p.stdin, p.stdout
|
||||||
|
__all__.append("popen4")
|
||||||
|
|
||||||
|
import copy_reg as _copy_reg
|
||||||
|
|
||||||
|
def _make_stat_result(tup, dict):
|
||||||
|
return stat_result(tup, dict)
|
||||||
|
|
||||||
|
def _pickle_stat_result(sr):
|
||||||
|
(type, args) = sr.__reduce__()
|
||||||
|
return (_make_stat_result, args)
|
||||||
|
|
||||||
|
try:
|
||||||
|
_copy_reg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
|
||||||
|
except NameError: # stat_result may not exist
|
||||||
|
pass
|
||||||
|
|
||||||
|
def _make_statvfs_result(tup, dict):
|
||||||
|
return statvfs_result(tup, dict)
|
||||||
|
|
||||||
|
def _pickle_statvfs_result(sr):
|
||||||
|
(type, args) = sr.__reduce__()
|
||||||
|
return (_make_statvfs_result, args)
|
||||||
|
|
||||||
|
try:
|
||||||
|
_copy_reg.pickle(statvfs_result, _pickle_statvfs_result,
|
||||||
|
_make_statvfs_result)
|
||||||
|
except NameError: # statvfs_result may not exist
|
||||||
|
pass
|
2406
AppPkg/Applications/Python/Python-2.7.10/PyMod-2.7.10/Lib/pydoc.py
Normal file
2406
AppPkg/Applications/Python/Python-2.7.10/PyMod-2.7.10/Lib/pydoc.py
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,600 @@
|
|||||||
|
"""Append module search paths for third-party packages to sys.path.
|
||||||
|
|
||||||
|
****************************************************************
|
||||||
|
* This module is automatically imported during initialization. *
|
||||||
|
****************************************************************
|
||||||
|
|
||||||
|
In earlier versions of Python (up to 1.5a3), scripts or modules that
|
||||||
|
needed to use site-specific modules would place ``import site''
|
||||||
|
somewhere near the top of their code. Because of the automatic
|
||||||
|
import, this is no longer necessary (but code that does it still
|
||||||
|
works).
|
||||||
|
|
||||||
|
This will append site-specific paths to the module search path. On
|
||||||
|
Unix (including Mac OSX), it starts with sys.prefix and
|
||||||
|
sys.exec_prefix (if different) and appends
|
||||||
|
lib/python<version>/site-packages as well as lib/site-python.
|
||||||
|
On other platforms (such as Windows), it tries each of the
|
||||||
|
prefixes directly, as well as with lib/site-packages appended. The
|
||||||
|
resulting directories, if they exist, are appended to sys.path, and
|
||||||
|
also inspected for path configuration files.
|
||||||
|
|
||||||
|
A path configuration file is a file whose name has the form
|
||||||
|
<package>.pth; its contents are additional directories (one per line)
|
||||||
|
to be added to sys.path. Non-existing directories (or
|
||||||
|
non-directories) are never added to sys.path; no directory is added to
|
||||||
|
sys.path more than once. Blank lines and lines beginning with
|
||||||
|
'#' are skipped. Lines starting with 'import' are executed.
|
||||||
|
|
||||||
|
For example, suppose sys.prefix and sys.exec_prefix are set to
|
||||||
|
/usr/local and there is a directory /usr/local/lib/python2.5/site-packages
|
||||||
|
with three subdirectories, foo, bar and spam, and two path
|
||||||
|
configuration files, foo.pth and bar.pth. Assume foo.pth contains the
|
||||||
|
following:
|
||||||
|
|
||||||
|
# foo package configuration
|
||||||
|
foo
|
||||||
|
bar
|
||||||
|
bletch
|
||||||
|
|
||||||
|
and bar.pth contains:
|
||||||
|
|
||||||
|
# bar package configuration
|
||||||
|
bar
|
||||||
|
|
||||||
|
Then the following directories are added to sys.path, in this order:
|
||||||
|
|
||||||
|
/usr/local/lib/python2.5/site-packages/bar
|
||||||
|
/usr/local/lib/python2.5/site-packages/foo
|
||||||
|
|
||||||
|
Note that bletch is omitted because it doesn't exist; bar precedes foo
|
||||||
|
because bar.pth comes alphabetically before foo.pth; and spam is
|
||||||
|
omitted because it is not mentioned in either path configuration file.
|
||||||
|
|
||||||
|
After these path manipulations, an attempt is made to import a module
|
||||||
|
named sitecustomize, which can perform arbitrary additional
|
||||||
|
site-specific customizations. If this import fails with an
|
||||||
|
ImportError exception, it is silently ignored.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import __builtin__
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
# Prefixes for site-packages; add additional prefixes like /usr/local here
|
||||||
|
PREFIXES = [sys.prefix, sys.exec_prefix]
|
||||||
|
# Enable per user site-packages directory
|
||||||
|
# set it to False to disable the feature or True to force the feature
|
||||||
|
ENABLE_USER_SITE = None
|
||||||
|
|
||||||
|
# for distutils.commands.install
|
||||||
|
# These values are initialized by the getuserbase() and getusersitepackages()
|
||||||
|
# functions, through the main() function when Python starts.
|
||||||
|
USER_SITE = None
|
||||||
|
USER_BASE = None
|
||||||
|
|
||||||
|
|
||||||
|
def makepath(*paths):
|
||||||
|
dir = os.path.join(*paths)
|
||||||
|
try:
|
||||||
|
dir = os.path.abspath(dir)
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
return dir, os.path.normcase(dir)
|
||||||
|
|
||||||
|
|
||||||
|
def abs__file__():
|
||||||
|
"""Set all module' __file__ attribute to an absolute path"""
|
||||||
|
for m in sys.modules.values():
|
||||||
|
if hasattr(m, '__loader__'):
|
||||||
|
continue # don't mess with a PEP 302-supplied __file__
|
||||||
|
try:
|
||||||
|
m.__file__ = os.path.abspath(m.__file__)
|
||||||
|
except (AttributeError, OSError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def removeduppaths():
|
||||||
|
""" Remove duplicate entries from sys.path along with making them
|
||||||
|
absolute"""
|
||||||
|
# This ensures that the initial path provided by the interpreter contains
|
||||||
|
# only absolute pathnames, even if we're running from the build directory.
|
||||||
|
L = []
|
||||||
|
known_paths = set()
|
||||||
|
for dir in sys.path:
|
||||||
|
# Filter out duplicate paths (on case-insensitive file systems also
|
||||||
|
# if they only differ in case); turn relative paths into absolute
|
||||||
|
# paths.
|
||||||
|
dir, dircase = makepath(dir)
|
||||||
|
if not dircase in known_paths:
|
||||||
|
L.append(dir)
|
||||||
|
known_paths.add(dircase)
|
||||||
|
sys.path[:] = L
|
||||||
|
return known_paths
|
||||||
|
|
||||||
|
|
||||||
|
def _init_pathinfo():
|
||||||
|
"""Return a set containing all existing directory entries from sys.path"""
|
||||||
|
d = set()
|
||||||
|
for dir in sys.path:
|
||||||
|
try:
|
||||||
|
if os.path.isdir(dir):
|
||||||
|
dir, dircase = makepath(dir)
|
||||||
|
d.add(dircase)
|
||||||
|
except TypeError:
|
||||||
|
continue
|
||||||
|
return d
|
||||||
|
|
||||||
|
|
||||||
|
def addpackage(sitedir, name, known_paths):
|
||||||
|
"""Process a .pth file within the site-packages directory:
|
||||||
|
For each line in the file, either combine it with sitedir to a path
|
||||||
|
and add that to known_paths, or execute it if it starts with 'import '.
|
||||||
|
"""
|
||||||
|
if known_paths is None:
|
||||||
|
_init_pathinfo()
|
||||||
|
reset = 1
|
||||||
|
else:
|
||||||
|
reset = 0
|
||||||
|
fullname = os.path.join(sitedir, name)
|
||||||
|
try:
|
||||||
|
f = open(fullname, "rU")
|
||||||
|
except IOError:
|
||||||
|
return
|
||||||
|
with f:
|
||||||
|
for n, line in enumerate(f):
|
||||||
|
if line.startswith("#"):
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
if line.startswith(("import ", "import\t")):
|
||||||
|
exec line
|
||||||
|
continue
|
||||||
|
line = line.rstrip()
|
||||||
|
dir, dircase = makepath(sitedir, line)
|
||||||
|
if not dircase in known_paths and os.path.exists(dir):
|
||||||
|
sys.path.append(dir)
|
||||||
|
known_paths.add(dircase)
|
||||||
|
except Exception as err:
|
||||||
|
print >>sys.stderr, "Error processing line {:d} of {}:\n".format(
|
||||||
|
n+1, fullname)
|
||||||
|
for record in traceback.format_exception(*sys.exc_info()):
|
||||||
|
for line in record.splitlines():
|
||||||
|
print >>sys.stderr, ' '+line
|
||||||
|
print >>sys.stderr, "\nRemainder of file ignored"
|
||||||
|
break
|
||||||
|
if reset:
|
||||||
|
known_paths = None
|
||||||
|
return known_paths
|
||||||
|
|
||||||
|
|
||||||
|
def addsitedir(sitedir, known_paths=None):
|
||||||
|
"""Add 'sitedir' argument to sys.path if missing and handle .pth files in
|
||||||
|
'sitedir'"""
|
||||||
|
if known_paths is None:
|
||||||
|
known_paths = _init_pathinfo()
|
||||||
|
reset = 1
|
||||||
|
else:
|
||||||
|
reset = 0
|
||||||
|
sitedir, sitedircase = makepath(sitedir)
|
||||||
|
if not sitedircase in known_paths:
|
||||||
|
sys.path.append(sitedir) # Add path component
|
||||||
|
try:
|
||||||
|
names = os.listdir(sitedir)
|
||||||
|
except os.error:
|
||||||
|
return
|
||||||
|
dotpth = os.extsep + "pth"
|
||||||
|
names = [name for name in names if name.endswith(dotpth)]
|
||||||
|
for name in sorted(names):
|
||||||
|
addpackage(sitedir, name, known_paths)
|
||||||
|
if reset:
|
||||||
|
known_paths = None
|
||||||
|
return known_paths
|
||||||
|
|
||||||
|
|
||||||
|
def check_enableusersite():
|
||||||
|
"""Check if user site directory is safe for inclusion
|
||||||
|
|
||||||
|
The function tests for the command line flag (including environment var),
|
||||||
|
process uid/gid equal to effective uid/gid.
|
||||||
|
|
||||||
|
None: Disabled for security reasons
|
||||||
|
False: Disabled by user (command line option)
|
||||||
|
True: Safe and enabled
|
||||||
|
"""
|
||||||
|
if sys.flags.no_user_site:
|
||||||
|
return False
|
||||||
|
|
||||||
|
if hasattr(os, "getuid") and hasattr(os, "geteuid"):
|
||||||
|
# check process uid == effective uid
|
||||||
|
if os.geteuid() != os.getuid():
|
||||||
|
return None
|
||||||
|
if hasattr(os, "getgid") and hasattr(os, "getegid"):
|
||||||
|
# check process gid == effective gid
|
||||||
|
if os.getegid() != os.getgid():
|
||||||
|
return None
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def getuserbase():
|
||||||
|
"""Returns the `user base` directory path.
|
||||||
|
|
||||||
|
The `user base` directory can be used to store data. If the global
|
||||||
|
variable ``USER_BASE`` is not initialized yet, this function will also set
|
||||||
|
it.
|
||||||
|
"""
|
||||||
|
global USER_BASE
|
||||||
|
if USER_BASE is not None:
|
||||||
|
return USER_BASE
|
||||||
|
from sysconfig import get_config_var
|
||||||
|
USER_BASE = get_config_var('userbase')
|
||||||
|
return USER_BASE
|
||||||
|
|
||||||
|
def getusersitepackages():
|
||||||
|
"""Returns the user-specific site-packages directory path.
|
||||||
|
|
||||||
|
If the global variable ``USER_SITE`` is not initialized yet, this
|
||||||
|
function will also set it.
|
||||||
|
"""
|
||||||
|
global USER_SITE
|
||||||
|
user_base = getuserbase() # this will also set USER_BASE
|
||||||
|
|
||||||
|
if USER_SITE is not None:
|
||||||
|
return USER_SITE
|
||||||
|
|
||||||
|
from sysconfig import get_path
|
||||||
|
import os
|
||||||
|
|
||||||
|
if sys.platform == 'darwin':
|
||||||
|
from sysconfig import get_config_var
|
||||||
|
if get_config_var('PYTHONFRAMEWORK'):
|
||||||
|
USER_SITE = get_path('purelib', 'osx_framework_user')
|
||||||
|
return USER_SITE
|
||||||
|
|
||||||
|
USER_SITE = get_path('purelib', '%s_user' % os.name)
|
||||||
|
return USER_SITE
|
||||||
|
|
||||||
|
def addusersitepackages(known_paths):
|
||||||
|
"""Add a per user site-package to sys.path
|
||||||
|
|
||||||
|
Each user has its own python directory with site-packages in the
|
||||||
|
home directory.
|
||||||
|
"""
|
||||||
|
# get the per user site-package path
|
||||||
|
# this call will also make sure USER_BASE and USER_SITE are set
|
||||||
|
user_site = getusersitepackages()
|
||||||
|
|
||||||
|
if ENABLE_USER_SITE and os.path.isdir(user_site):
|
||||||
|
addsitedir(user_site, known_paths)
|
||||||
|
return known_paths
|
||||||
|
|
||||||
|
def getsitepackages():
|
||||||
|
"""Returns a list containing all global site-packages directories
|
||||||
|
(and possibly site-python).
|
||||||
|
|
||||||
|
For each directory present in the global ``PREFIXES``, this function
|
||||||
|
will find its `site-packages` subdirectory depending on the system
|
||||||
|
environment, and will return a list of full paths.
|
||||||
|
"""
|
||||||
|
sitepackages = []
|
||||||
|
seen = set()
|
||||||
|
|
||||||
|
for prefix in PREFIXES:
|
||||||
|
if not prefix or prefix in seen:
|
||||||
|
continue
|
||||||
|
seen.add(prefix)
|
||||||
|
|
||||||
|
if sys.platform in ('os2emx', 'riscos'):
|
||||||
|
sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))
|
||||||
|
elif os.sep == '/':
|
||||||
|
sitepackages.append(os.path.join(prefix, "lib",
|
||||||
|
"python" + sys.version[:3],
|
||||||
|
"site-packages"))
|
||||||
|
sitepackages.append(os.path.join(prefix, "lib", "site-python"))
|
||||||
|
else:
|
||||||
|
sitepackages.append(prefix)
|
||||||
|
sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
|
||||||
|
if sys.platform == "darwin":
|
||||||
|
# for framework builds *only* we add the standard Apple
|
||||||
|
# locations.
|
||||||
|
from sysconfig import get_config_var
|
||||||
|
framework = get_config_var("PYTHONFRAMEWORK")
|
||||||
|
if framework:
|
||||||
|
sitepackages.append(
|
||||||
|
os.path.join("/Library", framework,
|
||||||
|
sys.version[:3], "site-packages"))
|
||||||
|
return sitepackages
|
||||||
|
|
||||||
|
def addsitepackages(known_paths):
|
||||||
|
"""Add site-packages (and possibly site-python) to sys.path"""
|
||||||
|
for sitedir in getsitepackages():
|
||||||
|
if os.path.isdir(sitedir):
|
||||||
|
addsitedir(sitedir, known_paths)
|
||||||
|
|
||||||
|
return known_paths
|
||||||
|
|
||||||
|
def setBEGINLIBPATH():
|
||||||
|
"""The OS/2 EMX port has optional extension modules that do double duty
|
||||||
|
as DLLs (and must use the .DLL file extension) for other extensions.
|
||||||
|
The library search path needs to be amended so these will be found
|
||||||
|
during module import. Use BEGINLIBPATH so that these are at the start
|
||||||
|
of the library search path.
|
||||||
|
|
||||||
|
"""
|
||||||
|
dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload")
|
||||||
|
libpath = os.environ['BEGINLIBPATH'].split(';')
|
||||||
|
if libpath[-1]:
|
||||||
|
libpath.append(dllpath)
|
||||||
|
else:
|
||||||
|
libpath[-1] = dllpath
|
||||||
|
os.environ['BEGINLIBPATH'] = ';'.join(libpath)
|
||||||
|
|
||||||
|
|
||||||
|
def setquit():
|
||||||
|
"""Define new builtins 'quit' and 'exit'.
|
||||||
|
|
||||||
|
These are objects which make the interpreter exit when called.
|
||||||
|
The repr of each object contains a hint at how it works.
|
||||||
|
|
||||||
|
"""
|
||||||
|
if os.sep == ':':
|
||||||
|
eof = 'Cmd-Q'
|
||||||
|
elif os.sep == '\\':
|
||||||
|
eof = 'Ctrl-Z plus Return'
|
||||||
|
else:
|
||||||
|
eof = 'Ctrl-D (i.e. EOF)'
|
||||||
|
|
||||||
|
class Quitter(object):
|
||||||
|
def __init__(self, name):
|
||||||
|
self.name = name
|
||||||
|
def __repr__(self):
|
||||||
|
return 'Use %s() or %s to exit' % (self.name, eof)
|
||||||
|
def __call__(self, code=None):
|
||||||
|
# Shells like IDLE catch the SystemExit, but listen when their
|
||||||
|
# stdin wrapper is closed.
|
||||||
|
try:
|
||||||
|
sys.stdin.close()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
raise SystemExit(code)
|
||||||
|
__builtin__.quit = Quitter('quit')
|
||||||
|
__builtin__.exit = Quitter('exit')
|
||||||
|
|
||||||
|
|
||||||
|
class _Printer(object):
|
||||||
|
"""interactive prompt objects for printing the license text, a list of
|
||||||
|
contributors and the copyright notice."""
|
||||||
|
|
||||||
|
MAXLINES = 23
|
||||||
|
|
||||||
|
def __init__(self, name, data, files=(), dirs=()):
|
||||||
|
self.__name = name
|
||||||
|
self.__data = data
|
||||||
|
self.__files = files
|
||||||
|
self.__dirs = dirs
|
||||||
|
self.__lines = None
|
||||||
|
|
||||||
|
def __setup(self):
|
||||||
|
if self.__lines:
|
||||||
|
return
|
||||||
|
data = None
|
||||||
|
for dir in self.__dirs:
|
||||||
|
for filename in self.__files:
|
||||||
|
filename = os.path.join(dir, filename)
|
||||||
|
try:
|
||||||
|
fp = file(filename, "rU")
|
||||||
|
data = fp.read()
|
||||||
|
fp.close()
|
||||||
|
break
|
||||||
|
except IOError:
|
||||||
|
pass
|
||||||
|
if data:
|
||||||
|
break
|
||||||
|
if not data:
|
||||||
|
data = self.__data
|
||||||
|
self.__lines = data.split('\n')
|
||||||
|
self.__linecnt = len(self.__lines)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
self.__setup()
|
||||||
|
if len(self.__lines) <= self.MAXLINES:
|
||||||
|
return "\n".join(self.__lines)
|
||||||
|
else:
|
||||||
|
return "Type %s() to see the full %s text" % ((self.__name,)*2)
|
||||||
|
|
||||||
|
def __call__(self):
|
||||||
|
self.__setup()
|
||||||
|
prompt = 'Hit Return for more, or q (and Return) to quit: '
|
||||||
|
lineno = 0
|
||||||
|
while 1:
|
||||||
|
try:
|
||||||
|
for i in range(lineno, lineno + self.MAXLINES):
|
||||||
|
print self.__lines[i]
|
||||||
|
except IndexError:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
lineno += self.MAXLINES
|
||||||
|
key = None
|
||||||
|
while key is None:
|
||||||
|
key = raw_input(prompt)
|
||||||
|
if key not in ('', 'q'):
|
||||||
|
key = None
|
||||||
|
if key == 'q':
|
||||||
|
break
|
||||||
|
|
||||||
|
def setcopyright():
|
||||||
|
"""Set 'copyright' and 'credits' in __builtin__"""
|
||||||
|
__builtin__.copyright = _Printer("copyright", sys.copyright)
|
||||||
|
if sys.platform[:4] == 'java':
|
||||||
|
__builtin__.credits = _Printer(
|
||||||
|
"credits",
|
||||||
|
"Jython is maintained by the Jython developers (www.jython.org).")
|
||||||
|
else:
|
||||||
|
__builtin__.credits = _Printer("credits", """\
|
||||||
|
Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
|
||||||
|
for supporting Python development. See www.python.org for more information.""")
|
||||||
|
here = os.path.dirname(os.__file__)
|
||||||
|
__builtin__.license = _Printer(
|
||||||
|
"license", "See https://www.python.org/psf/license/",
|
||||||
|
["LICENSE.txt", "LICENSE"],
|
||||||
|
[os.path.join(here, os.pardir), here, os.curdir])
|
||||||
|
|
||||||
|
|
||||||
|
class _Helper(object):
|
||||||
|
"""Define the builtin 'help'.
|
||||||
|
This is a wrapper around pydoc.help (with a twist).
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "Type help() for interactive help, " \
|
||||||
|
"or help(object) for help about object."
|
||||||
|
def __call__(self, *args, **kwds):
|
||||||
|
import pydoc
|
||||||
|
return pydoc.help(*args, **kwds)
|
||||||
|
|
||||||
|
def sethelper():
|
||||||
|
__builtin__.help = _Helper()
|
||||||
|
|
||||||
|
def aliasmbcs():
|
||||||
|
"""On Windows, some default encodings are not provided by Python,
|
||||||
|
while they are always available as "mbcs" in each locale. Make
|
||||||
|
them usable by aliasing to "mbcs" in such a case."""
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
import locale, codecs
|
||||||
|
enc = locale.getdefaultlocale()[1]
|
||||||
|
if enc.startswith('cp'): # "cp***" ?
|
||||||
|
try:
|
||||||
|
codecs.lookup(enc)
|
||||||
|
except LookupError:
|
||||||
|
import encodings
|
||||||
|
encodings._cache[enc] = encodings._unknown
|
||||||
|
encodings.aliases.aliases[enc] = 'mbcs'
|
||||||
|
|
||||||
|
def setencoding():
|
||||||
|
"""Set the string encoding used by the Unicode implementation. The
|
||||||
|
default is 'ascii', but if you're willing to experiment, you can
|
||||||
|
change this."""
|
||||||
|
encoding = "ascii" # Default value set by _PyUnicode_Init()
|
||||||
|
if 0:
|
||||||
|
# Enable to support locale aware default string encodings.
|
||||||
|
import locale
|
||||||
|
loc = locale.getdefaultlocale()
|
||||||
|
if loc[1]:
|
||||||
|
encoding = loc[1]
|
||||||
|
if 0:
|
||||||
|
# Enable to switch off string to Unicode coercion and implicit
|
||||||
|
# Unicode to string conversion.
|
||||||
|
encoding = "undefined"
|
||||||
|
if encoding != "ascii":
|
||||||
|
# On Non-Unicode builds this will raise an AttributeError...
|
||||||
|
sys.setdefaultencoding(encoding) # Needs Python Unicode build !
|
||||||
|
|
||||||
|
|
||||||
|
def execsitecustomize():
|
||||||
|
"""Run custom site specific code, if available."""
|
||||||
|
try:
|
||||||
|
import sitecustomize
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
except Exception:
|
||||||
|
if sys.flags.verbose:
|
||||||
|
sys.excepthook(*sys.exc_info())
|
||||||
|
else:
|
||||||
|
print >>sys.stderr, \
|
||||||
|
"'import sitecustomize' failed; use -v for traceback"
|
||||||
|
|
||||||
|
|
||||||
|
def execusercustomize():
|
||||||
|
"""Run custom user specific code, if available."""
|
||||||
|
try:
|
||||||
|
import usercustomize
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
except Exception:
|
||||||
|
if sys.flags.verbose:
|
||||||
|
sys.excepthook(*sys.exc_info())
|
||||||
|
else:
|
||||||
|
print>>sys.stderr, \
|
||||||
|
"'import usercustomize' failed; use -v for traceback"
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
global ENABLE_USER_SITE
|
||||||
|
|
||||||
|
abs__file__()
|
||||||
|
known_paths = removeduppaths()
|
||||||
|
if ENABLE_USER_SITE is None:
|
||||||
|
ENABLE_USER_SITE = check_enableusersite()
|
||||||
|
known_paths = addusersitepackages(known_paths)
|
||||||
|
known_paths = addsitepackages(known_paths)
|
||||||
|
if sys.platform == 'os2emx':
|
||||||
|
setBEGINLIBPATH()
|
||||||
|
setquit()
|
||||||
|
setcopyright()
|
||||||
|
sethelper()
|
||||||
|
aliasmbcs()
|
||||||
|
setencoding()
|
||||||
|
execsitecustomize()
|
||||||
|
if ENABLE_USER_SITE:
|
||||||
|
execusercustomize()
|
||||||
|
# Remove sys.setdefaultencoding() so that users cannot change the
|
||||||
|
# encoding after initialization. The test for presence is needed when
|
||||||
|
# this module is run as a script, because this code is executed twice.
|
||||||
|
if hasattr(sys, "setdefaultencoding"):
|
||||||
|
del sys.setdefaultencoding
|
||||||
|
|
||||||
|
main()
|
||||||
|
|
||||||
|
def _script():
|
||||||
|
help = """\
|
||||||
|
%s [--user-base] [--user-site]
|
||||||
|
|
||||||
|
Without arguments print some useful information
|
||||||
|
With arguments print the value of USER_BASE and/or USER_SITE separated
|
||||||
|
by '%s'.
|
||||||
|
|
||||||
|
Exit codes with --user-base or --user-site:
|
||||||
|
0 - user site directory is enabled
|
||||||
|
1 - user site directory is disabled by user
|
||||||
|
2 - uses site directory is disabled by super user
|
||||||
|
or for security reasons
|
||||||
|
>2 - unknown error
|
||||||
|
"""
|
||||||
|
args = sys.argv[1:]
|
||||||
|
if not args:
|
||||||
|
print "sys.path = ["
|
||||||
|
for dir in sys.path:
|
||||||
|
print " %r," % (dir,)
|
||||||
|
print "]"
|
||||||
|
print "USER_BASE: %r (%s)" % (USER_BASE,
|
||||||
|
"exists" if os.path.isdir(USER_BASE) else "doesn't exist")
|
||||||
|
print "USER_SITE: %r (%s)" % (USER_SITE,
|
||||||
|
"exists" if os.path.isdir(USER_SITE) else "doesn't exist")
|
||||||
|
print "ENABLE_USER_SITE: %r" % ENABLE_USER_SITE
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
buffer = []
|
||||||
|
if '--user-base' in args:
|
||||||
|
buffer.append(USER_BASE)
|
||||||
|
if '--user-site' in args:
|
||||||
|
buffer.append(USER_SITE)
|
||||||
|
|
||||||
|
if buffer:
|
||||||
|
print os.pathsep.join(buffer)
|
||||||
|
if ENABLE_USER_SITE:
|
||||||
|
sys.exit(0)
|
||||||
|
elif ENABLE_USER_SITE is False:
|
||||||
|
sys.exit(1)
|
||||||
|
elif ENABLE_USER_SITE is None:
|
||||||
|
sys.exit(2)
|
||||||
|
else:
|
||||||
|
sys.exit(3)
|
||||||
|
else:
|
||||||
|
import textwrap
|
||||||
|
print textwrap.dedent(help % (sys.argv[0], os.pathsep))
|
||||||
|
sys.exit(10)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
_script()
|
4034
AppPkg/Applications/Python/Python-2.7.10/PyMod-2.7.10/Modules/_sre.c
Normal file
4034
AppPkg/Applications/Python/Python-2.7.10/PyMod-2.7.10/Modules/_sre.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,176 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the project nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HAVE_GETADDRINFO
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Error return codes from getaddrinfo()
|
||||||
|
*/
|
||||||
|
#ifdef EAI_ADDRFAMILY
|
||||||
|
/* If this is defined, there is a conflicting implementation
|
||||||
|
in the C library, which can't be used for some reason.
|
||||||
|
Make sure it won't interfere with this emulation. */
|
||||||
|
|
||||||
|
#undef EAI_ADDRFAMILY
|
||||||
|
#undef EAI_AGAIN
|
||||||
|
#undef EAI_BADFLAGS
|
||||||
|
#undef EAI_FAIL
|
||||||
|
#undef EAI_FAMILY
|
||||||
|
#undef EAI_MEMORY
|
||||||
|
#undef EAI_NODATA
|
||||||
|
#undef EAI_NONAME
|
||||||
|
#undef EAI_SERVICE
|
||||||
|
#undef EAI_SOCKTYPE
|
||||||
|
#undef EAI_SYSTEM
|
||||||
|
#undef EAI_BADHINTS
|
||||||
|
#undef EAI_PROTOCOL
|
||||||
|
#undef EAI_MAX
|
||||||
|
#undef getaddrinfo
|
||||||
|
#define getaddrinfo fake_getaddrinfo
|
||||||
|
#endif /* EAI_ADDRFAMILY */
|
||||||
|
|
||||||
|
#define EAI_ADDRFAMILY 1 /* address family for hostname not supported */
|
||||||
|
#define EAI_AGAIN 2 /* temporary failure in name resolution */
|
||||||
|
#define EAI_BADFLAGS 3 /* invalid value for ai_flags */
|
||||||
|
#define EAI_FAIL 4 /* non-recoverable failure in name resolution */
|
||||||
|
#define EAI_FAMILY 5 /* ai_family not supported */
|
||||||
|
#define EAI_MEMORY 6 /* memory allocation failure */
|
||||||
|
#define EAI_NODATA 7 /* no address associated with hostname */
|
||||||
|
#define EAI_NONAME 8 /* hostname nor servname provided, or not known */
|
||||||
|
#define EAI_SERVICE 9 /* servname not supported for ai_socktype */
|
||||||
|
#define EAI_SOCKTYPE 10 /* ai_socktype not supported */
|
||||||
|
#define EAI_SYSTEM 11 /* system error returned in errno */
|
||||||
|
#define EAI_BADHINTS 12
|
||||||
|
#define EAI_PROTOCOL 13
|
||||||
|
#define EAI_MAX 14
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flag values for getaddrinfo()
|
||||||
|
*/
|
||||||
|
#ifdef AI_PASSIVE
|
||||||
|
#undef AI_PASSIVE
|
||||||
|
#undef AI_CANONNAME
|
||||||
|
#undef AI_NUMERICHOST
|
||||||
|
#undef AI_MASK
|
||||||
|
#undef AI_ALL
|
||||||
|
#undef AI_V4MAPPED_CFG
|
||||||
|
#undef AI_ADDRCONFIG
|
||||||
|
#undef AI_V4MAPPED
|
||||||
|
#undef AI_DEFAULT
|
||||||
|
#endif /* AI_PASSIVE */
|
||||||
|
|
||||||
|
#define AI_PASSIVE 0x00000001 /* get address to use bind() */
|
||||||
|
#define AI_CANONNAME 0x00000002 /* fill ai_canonname */
|
||||||
|
#define AI_NUMERICHOST 0x00000004 /* prevent name resolution */
|
||||||
|
/* valid flags for addrinfo */
|
||||||
|
#define AI_MASK (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST)
|
||||||
|
|
||||||
|
#define AI_ALL 0x00000100 /* IPv6 and IPv4-mapped (with AI_V4MAPPED) */
|
||||||
|
#define AI_V4MAPPED_CFG 0x00000200 /* accept IPv4-mapped if kernel supports */
|
||||||
|
#define AI_ADDRCONFIG 0x00000400 /* only if any address is assigned */
|
||||||
|
#define AI_V4MAPPED 0x00000800 /* accept IPv4-mapped IPv6 address */
|
||||||
|
/* special recommended flags for getipnodebyname */
|
||||||
|
#define AI_DEFAULT (AI_V4MAPPED_CFG | AI_ADDRCONFIG)
|
||||||
|
|
||||||
|
#endif /* !HAVE_GETADDRINFO */
|
||||||
|
|
||||||
|
#ifndef HAVE_GETNAMEINFO
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Constants for getnameinfo()
|
||||||
|
*/
|
||||||
|
#ifndef NI_MAXHOST
|
||||||
|
#define NI_MAXHOST 1025
|
||||||
|
#define NI_MAXSERV 32
|
||||||
|
#endif /* !NI_MAXHOST */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flag values for getnameinfo()
|
||||||
|
*/
|
||||||
|
#ifndef NI_NOFQDN
|
||||||
|
#define NI_NOFQDN 0x00000001
|
||||||
|
#define NI_NUMERICHOST 0x00000002
|
||||||
|
#define NI_NAMEREQD 0x00000004
|
||||||
|
#define NI_NUMERICSERV 0x00000008
|
||||||
|
#define NI_DGRAM 0x00000010
|
||||||
|
#endif /* !NI_NOFQDN */
|
||||||
|
|
||||||
|
#endif /* !HAVE_GETNAMEINFO */
|
||||||
|
|
||||||
|
#ifndef HAVE_ADDRINFO
|
||||||
|
struct addrinfo {
|
||||||
|
int ai_flags; /* AI_PASSIVE, AI_CANONNAME */
|
||||||
|
int ai_family; /* PF_xxx */
|
||||||
|
int ai_socktype; /* SOCK_xxx */
|
||||||
|
int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
|
||||||
|
size_t ai_addrlen; /* length of ai_addr */
|
||||||
|
char *ai_canonname; /* canonical name for hostname */
|
||||||
|
struct sockaddr *ai_addr; /* binary address */
|
||||||
|
struct addrinfo *ai_next; /* next structure in linked list */
|
||||||
|
};
|
||||||
|
#endif /* !HAVE_ADDRINFO */
|
||||||
|
|
||||||
|
#ifndef HAVE_SOCKADDR_STORAGE
|
||||||
|
/*
|
||||||
|
* RFC 2553: protocol-independent placeholder for socket addresses
|
||||||
|
*/
|
||||||
|
#define _SS_MAXSIZE 128
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
#define _SS_ALIGNSIZE (sizeof(PY_LONG_LONG))
|
||||||
|
#else
|
||||||
|
#define _SS_ALIGNSIZE (sizeof(double))
|
||||||
|
#endif /* HAVE_LONG_LONG */
|
||||||
|
#define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(u_char) * 2)
|
||||||
|
#define _SS_PAD2SIZE (_SS_MAXSIZE - sizeof(u_char) * 2 - \
|
||||||
|
_SS_PAD1SIZE - _SS_ALIGNSIZE)
|
||||||
|
|
||||||
|
struct sockaddr_storage {
|
||||||
|
#ifdef HAVE_SOCKADDR_SA_LEN
|
||||||
|
unsigned char ss_len; /* address length */
|
||||||
|
unsigned char ss_family; /* address family */
|
||||||
|
#else
|
||||||
|
unsigned short ss_family; /* address family */
|
||||||
|
#endif /* HAVE_SOCKADDR_SA_LEN */
|
||||||
|
char __ss_pad1[_SS_PAD1SIZE];
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
PY_LONG_LONG __ss_align; /* force desired structure storage alignment */
|
||||||
|
#else
|
||||||
|
double __ss_align; /* force desired structure storage alignment */
|
||||||
|
#endif /* HAVE_LONG_LONG */
|
||||||
|
char __ss_pad2[_SS_PAD2SIZE];
|
||||||
|
};
|
||||||
|
#endif /* !HAVE_SOCKADDR_STORAGE */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
extern void freehostent Py_PROTO((struct hostent *));
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
@@ -0,0 +1,155 @@
|
|||||||
|
/** @file
|
||||||
|
Python Module configuration.
|
||||||
|
|
||||||
|
Copyright (c) 2011-2012, Intel Corporation. All rights reserved.<BR>
|
||||||
|
This program and the accompanying materials are licensed and made available under
|
||||||
|
the terms and conditions of the BSD License that accompanies this distribution.
|
||||||
|
The full text of the license may be found at
|
||||||
|
http://opensource.org/licenses/bsd-license.
|
||||||
|
|
||||||
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
**/
|
||||||
|
|
||||||
|
/* This file contains the table of built-in modules.
|
||||||
|
See init_builtin() in import.c. */
|
||||||
|
|
||||||
|
#include "Python.h"
|
||||||
|
|
||||||
|
extern void initarray(void);
|
||||||
|
extern void init_ast(void);
|
||||||
|
extern void initbinascii(void);
|
||||||
|
extern void init_bisect(void);
|
||||||
|
extern void initcmath(void);
|
||||||
|
extern void init_codecs(void);
|
||||||
|
extern void init_collections(void);
|
||||||
|
extern void initcPickle(void);
|
||||||
|
extern void initcStringIO(void);
|
||||||
|
extern void init_csv(void);
|
||||||
|
extern void init_ctypes(void);
|
||||||
|
extern void initdatetime(void);
|
||||||
|
extern void initedk2(void);
|
||||||
|
extern void initerrno(void);
|
||||||
|
extern void init_functools(void);
|
||||||
|
extern void initfuture_builtins(void);
|
||||||
|
extern void initgc(void);
|
||||||
|
extern void init_heapq(void);
|
||||||
|
extern void init_hotshot(void);
|
||||||
|
extern void initimp(void);
|
||||||
|
extern void init_io(void);
|
||||||
|
extern void inititertools(void);
|
||||||
|
extern void init_json(void);
|
||||||
|
extern void init_lsprof(void);
|
||||||
|
extern void initmath(void);
|
||||||
|
extern void init_md5(void);
|
||||||
|
extern void initmmap(void);
|
||||||
|
extern void initoperator(void);
|
||||||
|
extern void initparser(void);
|
||||||
|
extern void initpyexpat(void);
|
||||||
|
extern void init_random(void);
|
||||||
|
extern void initselect(void);
|
||||||
|
extern void init_sha(void);
|
||||||
|
extern void init_sha256(void);
|
||||||
|
extern void init_sha512(void);
|
||||||
|
extern void initsignal(void);
|
||||||
|
extern void init_socket(void);
|
||||||
|
extern void init_sre(void);
|
||||||
|
extern void initstrop(void);
|
||||||
|
extern void init_struct(void);
|
||||||
|
extern void init_subprocess(void);
|
||||||
|
extern void init_symtable(void);
|
||||||
|
extern void initthread(void);
|
||||||
|
extern void inittime(void);
|
||||||
|
extern void initunicodedata(void);
|
||||||
|
extern void init_weakref(void);
|
||||||
|
extern void init_winreg(void);
|
||||||
|
extern void initxxsubtype(void);
|
||||||
|
extern void initzipimport(void);
|
||||||
|
extern void initzlib(void);
|
||||||
|
|
||||||
|
extern void PyMarshal_Init(void);
|
||||||
|
extern void _PyWarnings_Init(void);
|
||||||
|
|
||||||
|
extern void init_multibytecodec(void);
|
||||||
|
extern void init_codecs_cn(void);
|
||||||
|
extern void init_codecs_hk(void);
|
||||||
|
extern void init_codecs_iso2022(void);
|
||||||
|
extern void init_codecs_jp(void);
|
||||||
|
extern void init_codecs_kr(void);
|
||||||
|
extern void init_codecs_tw(void);
|
||||||
|
|
||||||
|
struct _inittab _PyImport_Inittab[] = {
|
||||||
|
|
||||||
|
//{"_ast", init_ast},
|
||||||
|
//{"_bisect", init_bisect}, /* A fast version of bisect.py */
|
||||||
|
//{"_csv", init_csv},
|
||||||
|
//{"_heapq", init_heapq}, /* A fast version of heapq.py */
|
||||||
|
//{"_io", init_io},
|
||||||
|
//{"_json", init_json},
|
||||||
|
//{"_md5", init_md5},
|
||||||
|
//{"_sha", init_sha},
|
||||||
|
//{"_sha256", init_sha256},
|
||||||
|
//{"_sha512", init_sha512},
|
||||||
|
//{"_socket", init_socket},
|
||||||
|
//{"_symtable", init_symtable},
|
||||||
|
|
||||||
|
//{"array", initarray},
|
||||||
|
//{"cmath", initcmath},
|
||||||
|
//{"cPickle", initcPickle},
|
||||||
|
//{"datetime", initdatetime},
|
||||||
|
//{"future_builtins", initfuture_builtins},
|
||||||
|
//{"parser", initparser},
|
||||||
|
//{"pyexpat", initpyexpat},
|
||||||
|
//{"select", initselect},
|
||||||
|
//{"signal", initsignal},
|
||||||
|
//{"strop", initstrop}, /* redefines some string operations that are 100-1000 times faster */
|
||||||
|
//{"unicodedata", initunicodedata},
|
||||||
|
//{"xxsubtype", initxxsubtype},
|
||||||
|
//{"zipimport", initzipimport},
|
||||||
|
//{"zlib", initzlib},
|
||||||
|
|
||||||
|
/* CJK codecs */
|
||||||
|
//{"_multibytecodec", init_multibytecodec},
|
||||||
|
//{"_codecs_cn", init_codecs_cn},
|
||||||
|
//{"_codecs_hk", init_codecs_hk},
|
||||||
|
//{"_codecs_iso2022", init_codecs_iso2022},
|
||||||
|
//{"_codecs_jp", init_codecs_jp},
|
||||||
|
//{"_codecs_kr", init_codecs_kr},
|
||||||
|
//{"_codecs_tw", init_codecs_tw},
|
||||||
|
|
||||||
|
#ifdef WITH_THREAD
|
||||||
|
{"thread", initthread},
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* These modules are required for the full built-in help() facility provided by pydoc. */
|
||||||
|
{"_codecs", init_codecs},
|
||||||
|
{"_collections", init_collections},
|
||||||
|
{"_functools", init_functools},
|
||||||
|
{"_random", init_random},
|
||||||
|
{"_sre", init_sre},
|
||||||
|
{"_struct", init_struct}, /* Required by the logging package. */
|
||||||
|
{"_weakref", init_weakref},
|
||||||
|
{"binascii", initbinascii},
|
||||||
|
{"cStringIO", initcStringIO}, /* Required by several modules, such as logging. */
|
||||||
|
{"gc", initgc},
|
||||||
|
{"itertools", inititertools},
|
||||||
|
{"math", initmath},
|
||||||
|
{"operator", initoperator},
|
||||||
|
{"time", inittime},
|
||||||
|
|
||||||
|
/* These four modules should always be built in. */
|
||||||
|
{"edk2", initedk2},
|
||||||
|
{"errno", initerrno},
|
||||||
|
{"imp", initimp}, /* We get this for free from Python/import.c */
|
||||||
|
{"marshal", PyMarshal_Init}, /* We get this for free from Python/marshal.c */
|
||||||
|
|
||||||
|
/* These entries are here for sys.builtin_module_names */
|
||||||
|
{"__main__", NULL},
|
||||||
|
{"__builtin__", NULL},
|
||||||
|
{"sys", NULL},
|
||||||
|
{"exceptions", NULL},
|
||||||
|
{"_warnings", _PyWarnings_Init},
|
||||||
|
|
||||||
|
/* Sentinel */
|
||||||
|
{0, 0}
|
||||||
|
};
|
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,791 @@
|
|||||||
|
|
||||||
|
/* Errno module */
|
||||||
|
|
||||||
|
#include "Python.h"
|
||||||
|
|
||||||
|
/* Windows socket errors (WSA*) */
|
||||||
|
#ifdef MS_WINDOWS
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pull in the system error definitions
|
||||||
|
*/
|
||||||
|
|
||||||
|
static PyMethodDef errno_methods[] = {
|
||||||
|
{NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Helper function doing the dictionary inserting */
|
||||||
|
|
||||||
|
static void
|
||||||
|
_inscode(PyObject *d, PyObject *de, char *name, int code)
|
||||||
|
{
|
||||||
|
PyObject *u = PyString_FromString(name);
|
||||||
|
PyObject *v = PyInt_FromLong((long) code);
|
||||||
|
|
||||||
|
/* Don't bother checking for errors; they'll be caught at the end
|
||||||
|
* of the module initialization function by the caller of
|
||||||
|
* initerrno().
|
||||||
|
*/
|
||||||
|
if (u && v) {
|
||||||
|
/* insert in modules dict */
|
||||||
|
PyDict_SetItem(d, u, v);
|
||||||
|
/* insert in errorcode dict */
|
||||||
|
PyDict_SetItem(de, v, u);
|
||||||
|
}
|
||||||
|
Py_XDECREF(u);
|
||||||
|
Py_XDECREF(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
PyDoc_STRVAR(errno__doc__,
|
||||||
|
"This module makes available standard errno system symbols.\n\
|
||||||
|
\n\
|
||||||
|
The value of each symbol is the corresponding integer value,\n\
|
||||||
|
e.g., on most systems, errno.ENOENT equals the integer 2.\n\
|
||||||
|
\n\
|
||||||
|
The dictionary errno.errorcode maps numeric codes to symbol names,\n\
|
||||||
|
e.g., errno.errorcode[2] could be the string 'ENOENT'.\n\
|
||||||
|
\n\
|
||||||
|
Symbols that are not relevant to the underlying system are not defined.\n\
|
||||||
|
\n\
|
||||||
|
To map error codes to error messages, use the function os.strerror(),\n\
|
||||||
|
e.g. os.strerror(2) could return 'No such file or directory'.");
|
||||||
|
|
||||||
|
PyMODINIT_FUNC
|
||||||
|
initerrno(void)
|
||||||
|
{
|
||||||
|
PyObject *m, *d, *de;
|
||||||
|
m = Py_InitModule3("errno", errno_methods, errno__doc__);
|
||||||
|
if (m == NULL)
|
||||||
|
return;
|
||||||
|
d = PyModule_GetDict(m);
|
||||||
|
de = PyDict_New();
|
||||||
|
if (!d || !de || PyDict_SetItemString(d, "errorcode", de) < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Macro so I don't have to edit each and every line below... */
|
||||||
|
#define inscode(d, ds, de, name, code, comment) _inscode(d, de, name, code)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The names and comments are borrowed from linux/include/errno.h,
|
||||||
|
* which should be pretty all-inclusive
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef ENODEV
|
||||||
|
inscode(d, ds, de, "ENODEV", ENODEV, "No such device");
|
||||||
|
#endif
|
||||||
|
#ifdef ENOCSI
|
||||||
|
inscode(d, ds, de, "ENOCSI", ENOCSI, "No CSI structure available");
|
||||||
|
#endif
|
||||||
|
#ifdef EHOSTUNREACH
|
||||||
|
inscode(d, ds, de, "EHOSTUNREACH", EHOSTUNREACH, "No route to host");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEHOSTUNREACH
|
||||||
|
inscode(d, ds, de, "EHOSTUNREACH", WSAEHOSTUNREACH, "No route to host");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ENOMSG
|
||||||
|
inscode(d, ds, de, "ENOMSG", ENOMSG, "No message of desired type");
|
||||||
|
#endif
|
||||||
|
#ifdef EUCLEAN
|
||||||
|
inscode(d, ds, de, "EUCLEAN", EUCLEAN, "Structure needs cleaning");
|
||||||
|
#endif
|
||||||
|
#ifdef EL2NSYNC
|
||||||
|
inscode(d, ds, de, "EL2NSYNC", EL2NSYNC, "Level 2 not synchronized");
|
||||||
|
#endif
|
||||||
|
#ifdef EL2HLT
|
||||||
|
inscode(d, ds, de, "EL2HLT", EL2HLT, "Level 2 halted");
|
||||||
|
#endif
|
||||||
|
#ifdef ENODATA
|
||||||
|
inscode(d, ds, de, "ENODATA", ENODATA, "No data available");
|
||||||
|
#endif
|
||||||
|
#ifdef ENOTBLK
|
||||||
|
inscode(d, ds, de, "ENOTBLK", ENOTBLK, "Block device required");
|
||||||
|
#endif
|
||||||
|
#ifdef ENOSYS
|
||||||
|
inscode(d, ds, de, "ENOSYS", ENOSYS, "Function not implemented");
|
||||||
|
#endif
|
||||||
|
#ifdef EPIPE
|
||||||
|
inscode(d, ds, de, "EPIPE", EPIPE, "Broken pipe");
|
||||||
|
#endif
|
||||||
|
#ifdef EINVAL
|
||||||
|
inscode(d, ds, de, "EINVAL", EINVAL, "Invalid argument");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEINVAL
|
||||||
|
inscode(d, ds, de, "EINVAL", WSAEINVAL, "Invalid argument");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EOVERFLOW
|
||||||
|
inscode(d, ds, de, "EOVERFLOW", EOVERFLOW, "Value too large for defined data type");
|
||||||
|
#endif
|
||||||
|
#ifdef EADV
|
||||||
|
inscode(d, ds, de, "EADV", EADV, "Advertise error");
|
||||||
|
#endif
|
||||||
|
#ifdef EINTR
|
||||||
|
inscode(d, ds, de, "EINTR", EINTR, "Interrupted system call");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEINTR
|
||||||
|
inscode(d, ds, de, "EINTR", WSAEINTR, "Interrupted system call");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EUSERS
|
||||||
|
inscode(d, ds, de, "EUSERS", EUSERS, "Too many users");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEUSERS
|
||||||
|
inscode(d, ds, de, "EUSERS", WSAEUSERS, "Too many users");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ENOTEMPTY
|
||||||
|
inscode(d, ds, de, "ENOTEMPTY", ENOTEMPTY, "Directory not empty");
|
||||||
|
#else
|
||||||
|
#ifdef WSAENOTEMPTY
|
||||||
|
inscode(d, ds, de, "ENOTEMPTY", WSAENOTEMPTY, "Directory not empty");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ENOBUFS
|
||||||
|
inscode(d, ds, de, "ENOBUFS", ENOBUFS, "No buffer space available");
|
||||||
|
#else
|
||||||
|
#ifdef WSAENOBUFS
|
||||||
|
inscode(d, ds, de, "ENOBUFS", WSAENOBUFS, "No buffer space available");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EPROTO
|
||||||
|
inscode(d, ds, de, "EPROTO", EPROTO, "Protocol error");
|
||||||
|
#endif
|
||||||
|
#ifdef EREMOTE
|
||||||
|
inscode(d, ds, de, "EREMOTE", EREMOTE, "Object is remote");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEREMOTE
|
||||||
|
inscode(d, ds, de, "EREMOTE", WSAEREMOTE, "Object is remote");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ENAVAIL
|
||||||
|
inscode(d, ds, de, "ENAVAIL", ENAVAIL, "No XENIX semaphores available");
|
||||||
|
#endif
|
||||||
|
#ifdef ECHILD
|
||||||
|
inscode(d, ds, de, "ECHILD", ECHILD, "No child processes");
|
||||||
|
#endif
|
||||||
|
#ifdef ELOOP
|
||||||
|
inscode(d, ds, de, "ELOOP", ELOOP, "Too many symbolic links encountered");
|
||||||
|
#else
|
||||||
|
#ifdef WSAELOOP
|
||||||
|
inscode(d, ds, de, "ELOOP", WSAELOOP, "Too many symbolic links encountered");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EXDEV
|
||||||
|
inscode(d, ds, de, "EXDEV", EXDEV, "Cross-device link");
|
||||||
|
#endif
|
||||||
|
#ifdef E2BIG
|
||||||
|
inscode(d, ds, de, "E2BIG", E2BIG, "Arg list too long");
|
||||||
|
#endif
|
||||||
|
#ifdef ESRCH
|
||||||
|
inscode(d, ds, de, "ESRCH", ESRCH, "No such process");
|
||||||
|
#endif
|
||||||
|
#ifdef EMSGSIZE
|
||||||
|
inscode(d, ds, de, "EMSGSIZE", EMSGSIZE, "Message too long");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEMSGSIZE
|
||||||
|
inscode(d, ds, de, "EMSGSIZE", WSAEMSGSIZE, "Message too long");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EAFNOSUPPORT
|
||||||
|
inscode(d, ds, de, "EAFNOSUPPORT", EAFNOSUPPORT, "Address family not supported by protocol");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEAFNOSUPPORT
|
||||||
|
inscode(d, ds, de, "EAFNOSUPPORT", WSAEAFNOSUPPORT, "Address family not supported by protocol");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EBADR
|
||||||
|
inscode(d, ds, de, "EBADR", EBADR, "Invalid request descriptor");
|
||||||
|
#endif
|
||||||
|
#ifdef EHOSTDOWN
|
||||||
|
inscode(d, ds, de, "EHOSTDOWN", EHOSTDOWN, "Host is down");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEHOSTDOWN
|
||||||
|
inscode(d, ds, de, "EHOSTDOWN", WSAEHOSTDOWN, "Host is down");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EPFNOSUPPORT
|
||||||
|
inscode(d, ds, de, "EPFNOSUPPORT", EPFNOSUPPORT, "Protocol family not supported");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEPFNOSUPPORT
|
||||||
|
inscode(d, ds, de, "EPFNOSUPPORT", WSAEPFNOSUPPORT, "Protocol family not supported");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ENOPROTOOPT
|
||||||
|
inscode(d, ds, de, "ENOPROTOOPT", ENOPROTOOPT, "Protocol not available");
|
||||||
|
#else
|
||||||
|
#ifdef WSAENOPROTOOPT
|
||||||
|
inscode(d, ds, de, "ENOPROTOOPT", WSAENOPROTOOPT, "Protocol not available");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EBUSY
|
||||||
|
inscode(d, ds, de, "EBUSY", EBUSY, "Device or resource busy");
|
||||||
|
#endif
|
||||||
|
#ifdef EWOULDBLOCK
|
||||||
|
inscode(d, ds, de, "EWOULDBLOCK", EWOULDBLOCK, "Operation would block");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEWOULDBLOCK
|
||||||
|
inscode(d, ds, de, "EWOULDBLOCK", WSAEWOULDBLOCK, "Operation would block");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EBADFD
|
||||||
|
inscode(d, ds, de, "EBADFD", EBADFD, "File descriptor in bad state");
|
||||||
|
#endif
|
||||||
|
#ifdef EDOTDOT
|
||||||
|
inscode(d, ds, de, "EDOTDOT", EDOTDOT, "RFS specific error");
|
||||||
|
#endif
|
||||||
|
#ifdef EISCONN
|
||||||
|
inscode(d, ds, de, "EISCONN", EISCONN, "Transport endpoint is already connected");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEISCONN
|
||||||
|
inscode(d, ds, de, "EISCONN", WSAEISCONN, "Transport endpoint is already connected");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ENOANO
|
||||||
|
inscode(d, ds, de, "ENOANO", ENOANO, "No anode");
|
||||||
|
#endif
|
||||||
|
#ifdef ESHUTDOWN
|
||||||
|
inscode(d, ds, de, "ESHUTDOWN", ESHUTDOWN, "Cannot send after transport endpoint shutdown");
|
||||||
|
#else
|
||||||
|
#ifdef WSAESHUTDOWN
|
||||||
|
inscode(d, ds, de, "ESHUTDOWN", WSAESHUTDOWN, "Cannot send after transport endpoint shutdown");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ECHRNG
|
||||||
|
inscode(d, ds, de, "ECHRNG", ECHRNG, "Channel number out of range");
|
||||||
|
#endif
|
||||||
|
#ifdef ELIBBAD
|
||||||
|
inscode(d, ds, de, "ELIBBAD", ELIBBAD, "Accessing a corrupted shared library");
|
||||||
|
#endif
|
||||||
|
#ifdef ENONET
|
||||||
|
inscode(d, ds, de, "ENONET", ENONET, "Machine is not on the network");
|
||||||
|
#endif
|
||||||
|
#ifdef EBADE
|
||||||
|
inscode(d, ds, de, "EBADE", EBADE, "Invalid exchange");
|
||||||
|
#endif
|
||||||
|
#ifdef EBADF
|
||||||
|
inscode(d, ds, de, "EBADF", EBADF, "Bad file number");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEBADF
|
||||||
|
inscode(d, ds, de, "EBADF", WSAEBADF, "Bad file number");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EMULTIHOP
|
||||||
|
inscode(d, ds, de, "EMULTIHOP", EMULTIHOP, "Multihop attempted");
|
||||||
|
#endif
|
||||||
|
#ifdef EIO
|
||||||
|
inscode(d, ds, de, "EIO", EIO, "I/O error");
|
||||||
|
#endif
|
||||||
|
#ifdef EUNATCH
|
||||||
|
inscode(d, ds, de, "EUNATCH", EUNATCH, "Protocol driver not attached");
|
||||||
|
#endif
|
||||||
|
#ifdef EPROTOTYPE
|
||||||
|
inscode(d, ds, de, "EPROTOTYPE", EPROTOTYPE, "Protocol wrong type for socket");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEPROTOTYPE
|
||||||
|
inscode(d, ds, de, "EPROTOTYPE", WSAEPROTOTYPE, "Protocol wrong type for socket");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ENOSPC
|
||||||
|
inscode(d, ds, de, "ENOSPC", ENOSPC, "No space left on device");
|
||||||
|
#endif
|
||||||
|
#ifdef ENOEXEC
|
||||||
|
inscode(d, ds, de, "ENOEXEC", ENOEXEC, "Exec format error");
|
||||||
|
#endif
|
||||||
|
#ifdef EALREADY
|
||||||
|
inscode(d, ds, de, "EALREADY", EALREADY, "Operation already in progress");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEALREADY
|
||||||
|
inscode(d, ds, de, "EALREADY", WSAEALREADY, "Operation already in progress");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ENETDOWN
|
||||||
|
inscode(d, ds, de, "ENETDOWN", ENETDOWN, "Network is down");
|
||||||
|
#else
|
||||||
|
#ifdef WSAENETDOWN
|
||||||
|
inscode(d, ds, de, "ENETDOWN", WSAENETDOWN, "Network is down");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ENOTNAM
|
||||||
|
inscode(d, ds, de, "ENOTNAM", ENOTNAM, "Not a XENIX named type file");
|
||||||
|
#endif
|
||||||
|
#ifdef EACCES
|
||||||
|
inscode(d, ds, de, "EACCES", EACCES, "Permission denied");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEACCES
|
||||||
|
inscode(d, ds, de, "EACCES", WSAEACCES, "Permission denied");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ELNRNG
|
||||||
|
inscode(d, ds, de, "ELNRNG", ELNRNG, "Link number out of range");
|
||||||
|
#endif
|
||||||
|
#ifdef EILSEQ
|
||||||
|
inscode(d, ds, de, "EILSEQ", EILSEQ, "Illegal byte sequence");
|
||||||
|
#endif
|
||||||
|
#ifdef ENOTDIR
|
||||||
|
inscode(d, ds, de, "ENOTDIR", ENOTDIR, "Not a directory");
|
||||||
|
#endif
|
||||||
|
#ifdef ENOTUNIQ
|
||||||
|
inscode(d, ds, de, "ENOTUNIQ", ENOTUNIQ, "Name not unique on network");
|
||||||
|
#endif
|
||||||
|
#ifdef EPERM
|
||||||
|
inscode(d, ds, de, "EPERM", EPERM, "Operation not permitted");
|
||||||
|
#endif
|
||||||
|
#ifdef EDOM
|
||||||
|
inscode(d, ds, de, "EDOM", EDOM, "Math argument out of domain of func");
|
||||||
|
#endif
|
||||||
|
#ifdef EXFULL
|
||||||
|
inscode(d, ds, de, "EXFULL", EXFULL, "Exchange full");
|
||||||
|
#endif
|
||||||
|
#ifdef ECONNREFUSED
|
||||||
|
inscode(d, ds, de, "ECONNREFUSED", ECONNREFUSED, "Connection refused");
|
||||||
|
#else
|
||||||
|
#ifdef WSAECONNREFUSED
|
||||||
|
inscode(d, ds, de, "ECONNREFUSED", WSAECONNREFUSED, "Connection refused");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EISDIR
|
||||||
|
inscode(d, ds, de, "EISDIR", EISDIR, "Is a directory");
|
||||||
|
#endif
|
||||||
|
#ifdef EPROTONOSUPPORT
|
||||||
|
inscode(d, ds, de, "EPROTONOSUPPORT", EPROTONOSUPPORT, "Protocol not supported");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEPROTONOSUPPORT
|
||||||
|
inscode(d, ds, de, "EPROTONOSUPPORT", WSAEPROTONOSUPPORT, "Protocol not supported");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EROFS
|
||||||
|
inscode(d, ds, de, "EROFS", EROFS, "Read-only file system");
|
||||||
|
#endif
|
||||||
|
#ifdef EADDRNOTAVAIL
|
||||||
|
inscode(d, ds, de, "EADDRNOTAVAIL", EADDRNOTAVAIL, "Cannot assign requested address");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEADDRNOTAVAIL
|
||||||
|
inscode(d, ds, de, "EADDRNOTAVAIL", WSAEADDRNOTAVAIL, "Cannot assign requested address");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EIDRM
|
||||||
|
inscode(d, ds, de, "EIDRM", EIDRM, "Identifier removed");
|
||||||
|
#endif
|
||||||
|
#ifdef ECOMM
|
||||||
|
inscode(d, ds, de, "ECOMM", ECOMM, "Communication error on send");
|
||||||
|
#endif
|
||||||
|
#ifdef ESRMNT
|
||||||
|
inscode(d, ds, de, "ESRMNT", ESRMNT, "Srmount error");
|
||||||
|
#endif
|
||||||
|
#ifdef EREMOTEIO
|
||||||
|
inscode(d, ds, de, "EREMOTEIO", EREMOTEIO, "Remote I/O error");
|
||||||
|
#endif
|
||||||
|
#ifdef EL3RST
|
||||||
|
inscode(d, ds, de, "EL3RST", EL3RST, "Level 3 reset");
|
||||||
|
#endif
|
||||||
|
#ifdef EBADMSG
|
||||||
|
inscode(d, ds, de, "EBADMSG", EBADMSG, "Not a data message");
|
||||||
|
#endif
|
||||||
|
#ifdef ENFILE
|
||||||
|
inscode(d, ds, de, "ENFILE", ENFILE, "File table overflow");
|
||||||
|
#endif
|
||||||
|
#ifdef ELIBMAX
|
||||||
|
inscode(d, ds, de, "ELIBMAX", ELIBMAX, "Attempting to link in too many shared libraries");
|
||||||
|
#endif
|
||||||
|
#ifdef ESPIPE
|
||||||
|
inscode(d, ds, de, "ESPIPE", ESPIPE, "Illegal seek");
|
||||||
|
#endif
|
||||||
|
#ifdef ENOLINK
|
||||||
|
inscode(d, ds, de, "ENOLINK", ENOLINK, "Link has been severed");
|
||||||
|
#endif
|
||||||
|
#ifdef ENETRESET
|
||||||
|
inscode(d, ds, de, "ENETRESET", ENETRESET, "Network dropped connection because of reset");
|
||||||
|
#else
|
||||||
|
#ifdef WSAENETRESET
|
||||||
|
inscode(d, ds, de, "ENETRESET", WSAENETRESET, "Network dropped connection because of reset");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ETIMEDOUT
|
||||||
|
inscode(d, ds, de, "ETIMEDOUT", ETIMEDOUT, "Connection timed out");
|
||||||
|
#else
|
||||||
|
#ifdef WSAETIMEDOUT
|
||||||
|
inscode(d, ds, de, "ETIMEDOUT", WSAETIMEDOUT, "Connection timed out");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ENOENT
|
||||||
|
inscode(d, ds, de, "ENOENT", ENOENT, "No such file or directory");
|
||||||
|
#endif
|
||||||
|
#ifdef EEXIST
|
||||||
|
inscode(d, ds, de, "EEXIST", EEXIST, "File exists");
|
||||||
|
#endif
|
||||||
|
#ifdef EDQUOT
|
||||||
|
inscode(d, ds, de, "EDQUOT", EDQUOT, "Quota exceeded");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEDQUOT
|
||||||
|
inscode(d, ds, de, "EDQUOT", WSAEDQUOT, "Quota exceeded");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ENOSTR
|
||||||
|
inscode(d, ds, de, "ENOSTR", ENOSTR, "Device not a stream");
|
||||||
|
#endif
|
||||||
|
#ifdef EBADSLT
|
||||||
|
inscode(d, ds, de, "EBADSLT", EBADSLT, "Invalid slot");
|
||||||
|
#endif
|
||||||
|
#ifdef EBADRQC
|
||||||
|
inscode(d, ds, de, "EBADRQC", EBADRQC, "Invalid request code");
|
||||||
|
#endif
|
||||||
|
#ifdef ELIBACC
|
||||||
|
inscode(d, ds, de, "ELIBACC", ELIBACC, "Can not access a needed shared library");
|
||||||
|
#endif
|
||||||
|
#ifdef EFAULT
|
||||||
|
inscode(d, ds, de, "EFAULT", EFAULT, "Bad address");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEFAULT
|
||||||
|
inscode(d, ds, de, "EFAULT", WSAEFAULT, "Bad address");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EFBIG
|
||||||
|
inscode(d, ds, de, "EFBIG", EFBIG, "File too large");
|
||||||
|
#endif
|
||||||
|
#ifdef EDEADLK
|
||||||
|
inscode(d, ds, de, "EDEADLK", EDEADLK, "Resource deadlock would occur");
|
||||||
|
#endif
|
||||||
|
#ifdef ENOTCONN
|
||||||
|
inscode(d, ds, de, "ENOTCONN", ENOTCONN, "Transport endpoint is not connected");
|
||||||
|
#else
|
||||||
|
#ifdef WSAENOTCONN
|
||||||
|
inscode(d, ds, de, "ENOTCONN", WSAENOTCONN, "Transport endpoint is not connected");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EDESTADDRREQ
|
||||||
|
inscode(d, ds, de, "EDESTADDRREQ", EDESTADDRREQ, "Destination address required");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEDESTADDRREQ
|
||||||
|
inscode(d, ds, de, "EDESTADDRREQ", WSAEDESTADDRREQ, "Destination address required");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ELIBSCN
|
||||||
|
inscode(d, ds, de, "ELIBSCN", ELIBSCN, ".lib section in a.out corrupted");
|
||||||
|
#endif
|
||||||
|
#ifdef ENOLCK
|
||||||
|
inscode(d, ds, de, "ENOLCK", ENOLCK, "No record locks available");
|
||||||
|
#endif
|
||||||
|
#ifdef EISNAM
|
||||||
|
inscode(d, ds, de, "EISNAM", EISNAM, "Is a named type file");
|
||||||
|
#endif
|
||||||
|
#ifdef ECONNABORTED
|
||||||
|
inscode(d, ds, de, "ECONNABORTED", ECONNABORTED, "Software caused connection abort");
|
||||||
|
#else
|
||||||
|
#ifdef WSAECONNABORTED
|
||||||
|
inscode(d, ds, de, "ECONNABORTED", WSAECONNABORTED, "Software caused connection abort");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ENETUNREACH
|
||||||
|
inscode(d, ds, de, "ENETUNREACH", ENETUNREACH, "Network is unreachable");
|
||||||
|
#else
|
||||||
|
#ifdef WSAENETUNREACH
|
||||||
|
inscode(d, ds, de, "ENETUNREACH", WSAENETUNREACH, "Network is unreachable");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ESTALE
|
||||||
|
inscode(d, ds, de, "ESTALE", ESTALE, "Stale NFS file handle");
|
||||||
|
#else
|
||||||
|
#ifdef WSAESTALE
|
||||||
|
inscode(d, ds, de, "ESTALE", WSAESTALE, "Stale NFS file handle");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ENOSR
|
||||||
|
inscode(d, ds, de, "ENOSR", ENOSR, "Out of streams resources");
|
||||||
|
#endif
|
||||||
|
#ifdef ENOMEM
|
||||||
|
inscode(d, ds, de, "ENOMEM", ENOMEM, "Out of memory");
|
||||||
|
#endif
|
||||||
|
#ifdef ENOTSOCK
|
||||||
|
inscode(d, ds, de, "ENOTSOCK", ENOTSOCK, "Socket operation on non-socket");
|
||||||
|
#else
|
||||||
|
#ifdef WSAENOTSOCK
|
||||||
|
inscode(d, ds, de, "ENOTSOCK", WSAENOTSOCK, "Socket operation on non-socket");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ESTRPIPE
|
||||||
|
inscode(d, ds, de, "ESTRPIPE", ESTRPIPE, "Streams pipe error");
|
||||||
|
#endif
|
||||||
|
#ifdef EMLINK
|
||||||
|
inscode(d, ds, de, "EMLINK", EMLINK, "Too many links");
|
||||||
|
#endif
|
||||||
|
#ifdef ERANGE
|
||||||
|
inscode(d, ds, de, "ERANGE", ERANGE, "Math result not representable");
|
||||||
|
#endif
|
||||||
|
#ifdef ELIBEXEC
|
||||||
|
inscode(d, ds, de, "ELIBEXEC", ELIBEXEC, "Cannot exec a shared library directly");
|
||||||
|
#endif
|
||||||
|
#ifdef EL3HLT
|
||||||
|
inscode(d, ds, de, "EL3HLT", EL3HLT, "Level 3 halted");
|
||||||
|
#endif
|
||||||
|
#ifdef ECONNRESET
|
||||||
|
inscode(d, ds, de, "ECONNRESET", ECONNRESET, "Connection reset by peer");
|
||||||
|
#else
|
||||||
|
#ifdef WSAECONNRESET
|
||||||
|
inscode(d, ds, de, "ECONNRESET", WSAECONNRESET, "Connection reset by peer");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EADDRINUSE
|
||||||
|
inscode(d, ds, de, "EADDRINUSE", EADDRINUSE, "Address already in use");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEADDRINUSE
|
||||||
|
inscode(d, ds, de, "EADDRINUSE", WSAEADDRINUSE, "Address already in use");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EOPNOTSUPP
|
||||||
|
inscode(d, ds, de, "EOPNOTSUPP", EOPNOTSUPP, "Operation not supported on transport endpoint");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEOPNOTSUPP
|
||||||
|
inscode(d, ds, de, "EOPNOTSUPP", WSAEOPNOTSUPP, "Operation not supported on transport endpoint");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EREMCHG
|
||||||
|
inscode(d, ds, de, "EREMCHG", EREMCHG, "Remote address changed");
|
||||||
|
#endif
|
||||||
|
#ifdef EAGAIN
|
||||||
|
inscode(d, ds, de, "EAGAIN", EAGAIN, "Try again");
|
||||||
|
#endif
|
||||||
|
#ifdef ENAMETOOLONG
|
||||||
|
inscode(d, ds, de, "ENAMETOOLONG", ENAMETOOLONG, "File name too long");
|
||||||
|
#else
|
||||||
|
#ifdef WSAENAMETOOLONG
|
||||||
|
inscode(d, ds, de, "ENAMETOOLONG", WSAENAMETOOLONG, "File name too long");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ENOTTY
|
||||||
|
inscode(d, ds, de, "ENOTTY", ENOTTY, "Not a typewriter");
|
||||||
|
#endif
|
||||||
|
#ifdef ERESTART
|
||||||
|
inscode(d, ds, de, "ERESTART", ERESTART, "Interrupted system call should be restarted");
|
||||||
|
#endif
|
||||||
|
#ifdef ESOCKTNOSUPPORT
|
||||||
|
inscode(d, ds, de, "ESOCKTNOSUPPORT", ESOCKTNOSUPPORT, "Socket type not supported");
|
||||||
|
#else
|
||||||
|
#ifdef WSAESOCKTNOSUPPORT
|
||||||
|
inscode(d, ds, de, "ESOCKTNOSUPPORT", WSAESOCKTNOSUPPORT, "Socket type not supported");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ETIME
|
||||||
|
inscode(d, ds, de, "ETIME", ETIME, "Timer expired");
|
||||||
|
#endif
|
||||||
|
#ifdef EBFONT
|
||||||
|
inscode(d, ds, de, "EBFONT", EBFONT, "Bad font file format");
|
||||||
|
#endif
|
||||||
|
#ifdef EDEADLOCK
|
||||||
|
inscode(d, ds, de, "EDEADLOCK", EDEADLOCK, "Error EDEADLOCK");
|
||||||
|
#endif
|
||||||
|
#ifdef ETOOMANYREFS
|
||||||
|
inscode(d, ds, de, "ETOOMANYREFS", ETOOMANYREFS, "Too many references: cannot splice");
|
||||||
|
#else
|
||||||
|
#ifdef WSAETOOMANYREFS
|
||||||
|
inscode(d, ds, de, "ETOOMANYREFS", WSAETOOMANYREFS, "Too many references: cannot splice");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef EMFILE
|
||||||
|
inscode(d, ds, de, "EMFILE", EMFILE, "Too many open files");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEMFILE
|
||||||
|
inscode(d, ds, de, "EMFILE", WSAEMFILE, "Too many open files");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ETXTBSY
|
||||||
|
inscode(d, ds, de, "ETXTBSY", ETXTBSY, "Text file busy");
|
||||||
|
#endif
|
||||||
|
#ifdef EINPROGRESS
|
||||||
|
inscode(d, ds, de, "EINPROGRESS", EINPROGRESS, "Operation now in progress");
|
||||||
|
#else
|
||||||
|
#ifdef WSAEINPROGRESS
|
||||||
|
inscode(d, ds, de, "EINPROGRESS", WSAEINPROGRESS, "Operation now in progress");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef ENXIO
|
||||||
|
inscode(d, ds, de, "ENXIO", ENXIO, "No such device or address");
|
||||||
|
#endif
|
||||||
|
#ifdef ENOPKG
|
||||||
|
inscode(d, ds, de, "ENOPKG", ENOPKG, "Package not installed");
|
||||||
|
#endif
|
||||||
|
#ifdef WSASY
|
||||||
|
inscode(d, ds, de, "WSASY", WSASY, "Error WSASY");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEHOSTDOWN
|
||||||
|
inscode(d, ds, de, "WSAEHOSTDOWN", WSAEHOSTDOWN, "Host is down");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAENETDOWN
|
||||||
|
inscode(d, ds, de, "WSAENETDOWN", WSAENETDOWN, "Network is down");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAENOTSOCK
|
||||||
|
inscode(d, ds, de, "WSAENOTSOCK", WSAENOTSOCK, "Socket operation on non-socket");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEHOSTUNREACH
|
||||||
|
inscode(d, ds, de, "WSAEHOSTUNREACH", WSAEHOSTUNREACH, "No route to host");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAELOOP
|
||||||
|
inscode(d, ds, de, "WSAELOOP", WSAELOOP, "Too many symbolic links encountered");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEMFILE
|
||||||
|
inscode(d, ds, de, "WSAEMFILE", WSAEMFILE, "Too many open files");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAESTALE
|
||||||
|
inscode(d, ds, de, "WSAESTALE", WSAESTALE, "Stale NFS file handle");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAVERNOTSUPPORTED
|
||||||
|
inscode(d, ds, de, "WSAVERNOTSUPPORTED", WSAVERNOTSUPPORTED, "Error WSAVERNOTSUPPORTED");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAENETUNREACH
|
||||||
|
inscode(d, ds, de, "WSAENETUNREACH", WSAENETUNREACH, "Network is unreachable");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEPROCLIM
|
||||||
|
inscode(d, ds, de, "WSAEPROCLIM", WSAEPROCLIM, "Error WSAEPROCLIM");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEFAULT
|
||||||
|
inscode(d, ds, de, "WSAEFAULT", WSAEFAULT, "Bad address");
|
||||||
|
#endif
|
||||||
|
#ifdef WSANOTINITIALISED
|
||||||
|
inscode(d, ds, de, "WSANOTINITIALISED", WSANOTINITIALISED, "Error WSANOTINITIALISED");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEUSERS
|
||||||
|
inscode(d, ds, de, "WSAEUSERS", WSAEUSERS, "Too many users");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAMAKEASYNCREPL
|
||||||
|
inscode(d, ds, de, "WSAMAKEASYNCREPL", WSAMAKEASYNCREPL, "Error WSAMAKEASYNCREPL");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAENOPROTOOPT
|
||||||
|
inscode(d, ds, de, "WSAENOPROTOOPT", WSAENOPROTOOPT, "Protocol not available");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAECONNABORTED
|
||||||
|
inscode(d, ds, de, "WSAECONNABORTED", WSAECONNABORTED, "Software caused connection abort");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAENAMETOOLONG
|
||||||
|
inscode(d, ds, de, "WSAENAMETOOLONG", WSAENAMETOOLONG, "File name too long");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAENOTEMPTY
|
||||||
|
inscode(d, ds, de, "WSAENOTEMPTY", WSAENOTEMPTY, "Directory not empty");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAESHUTDOWN
|
||||||
|
inscode(d, ds, de, "WSAESHUTDOWN", WSAESHUTDOWN, "Cannot send after transport endpoint shutdown");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEAFNOSUPPORT
|
||||||
|
inscode(d, ds, de, "WSAEAFNOSUPPORT", WSAEAFNOSUPPORT, "Address family not supported by protocol");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAETOOMANYREFS
|
||||||
|
inscode(d, ds, de, "WSAETOOMANYREFS", WSAETOOMANYREFS, "Too many references: cannot splice");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEACCES
|
||||||
|
inscode(d, ds, de, "WSAEACCES", WSAEACCES, "Permission denied");
|
||||||
|
#endif
|
||||||
|
#ifdef WSATR
|
||||||
|
inscode(d, ds, de, "WSATR", WSATR, "Error WSATR");
|
||||||
|
#endif
|
||||||
|
#ifdef WSABASEERR
|
||||||
|
inscode(d, ds, de, "WSABASEERR", WSABASEERR, "Error WSABASEERR");
|
||||||
|
#endif
|
||||||
|
#ifdef WSADESCRIPTIO
|
||||||
|
inscode(d, ds, de, "WSADESCRIPTIO", WSADESCRIPTIO, "Error WSADESCRIPTIO");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEMSGSIZE
|
||||||
|
inscode(d, ds, de, "WSAEMSGSIZE", WSAEMSGSIZE, "Message too long");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEBADF
|
||||||
|
inscode(d, ds, de, "WSAEBADF", WSAEBADF, "Bad file number");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAECONNRESET
|
||||||
|
inscode(d, ds, de, "WSAECONNRESET", WSAECONNRESET, "Connection reset by peer");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAGETSELECTERRO
|
||||||
|
inscode(d, ds, de, "WSAGETSELECTERRO", WSAGETSELECTERRO, "Error WSAGETSELECTERRO");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAETIMEDOUT
|
||||||
|
inscode(d, ds, de, "WSAETIMEDOUT", WSAETIMEDOUT, "Connection timed out");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAENOBUFS
|
||||||
|
inscode(d, ds, de, "WSAENOBUFS", WSAENOBUFS, "No buffer space available");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEDISCON
|
||||||
|
inscode(d, ds, de, "WSAEDISCON", WSAEDISCON, "Error WSAEDISCON");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEINTR
|
||||||
|
inscode(d, ds, de, "WSAEINTR", WSAEINTR, "Interrupted system call");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEPROTOTYPE
|
||||||
|
inscode(d, ds, de, "WSAEPROTOTYPE", WSAEPROTOTYPE, "Protocol wrong type for socket");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAHOS
|
||||||
|
inscode(d, ds, de, "WSAHOS", WSAHOS, "Error WSAHOS");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEADDRINUSE
|
||||||
|
inscode(d, ds, de, "WSAEADDRINUSE", WSAEADDRINUSE, "Address already in use");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEADDRNOTAVAIL
|
||||||
|
inscode(d, ds, de, "WSAEADDRNOTAVAIL", WSAEADDRNOTAVAIL, "Cannot assign requested address");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEALREADY
|
||||||
|
inscode(d, ds, de, "WSAEALREADY", WSAEALREADY, "Operation already in progress");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEPROTONOSUPPORT
|
||||||
|
inscode(d, ds, de, "WSAEPROTONOSUPPORT", WSAEPROTONOSUPPORT, "Protocol not supported");
|
||||||
|
#endif
|
||||||
|
#ifdef WSASYSNOTREADY
|
||||||
|
inscode(d, ds, de, "WSASYSNOTREADY", WSASYSNOTREADY, "Error WSASYSNOTREADY");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEWOULDBLOCK
|
||||||
|
inscode(d, ds, de, "WSAEWOULDBLOCK", WSAEWOULDBLOCK, "Operation would block");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEPFNOSUPPORT
|
||||||
|
inscode(d, ds, de, "WSAEPFNOSUPPORT", WSAEPFNOSUPPORT, "Protocol family not supported");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEOPNOTSUPP
|
||||||
|
inscode(d, ds, de, "WSAEOPNOTSUPP", WSAEOPNOTSUPP, "Operation not supported on transport endpoint");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEISCONN
|
||||||
|
inscode(d, ds, de, "WSAEISCONN", WSAEISCONN, "Transport endpoint is already connected");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEDQUOT
|
||||||
|
inscode(d, ds, de, "WSAEDQUOT", WSAEDQUOT, "Quota exceeded");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAENOTCONN
|
||||||
|
inscode(d, ds, de, "WSAENOTCONN", WSAENOTCONN, "Transport endpoint is not connected");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEREMOTE
|
||||||
|
inscode(d, ds, de, "WSAEREMOTE", WSAEREMOTE, "Object is remote");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEINVAL
|
||||||
|
inscode(d, ds, de, "WSAEINVAL", WSAEINVAL, "Invalid argument");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEINPROGRESS
|
||||||
|
inscode(d, ds, de, "WSAEINPROGRESS", WSAEINPROGRESS, "Operation now in progress");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAGETSELECTEVEN
|
||||||
|
inscode(d, ds, de, "WSAGETSELECTEVEN", WSAGETSELECTEVEN, "Error WSAGETSELECTEVEN");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAESOCKTNOSUPPORT
|
||||||
|
inscode(d, ds, de, "WSAESOCKTNOSUPPORT", WSAESOCKTNOSUPPORT, "Socket type not supported");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAGETASYNCERRO
|
||||||
|
inscode(d, ds, de, "WSAGETASYNCERRO", WSAGETASYNCERRO, "Error WSAGETASYNCERRO");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAMAKESELECTREPL
|
||||||
|
inscode(d, ds, de, "WSAMAKESELECTREPL", WSAMAKESELECTREPL, "Error WSAMAKESELECTREPL");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAGETASYNCBUFLE
|
||||||
|
inscode(d, ds, de, "WSAGETASYNCBUFLE", WSAGETASYNCBUFLE, "Error WSAGETASYNCBUFLE");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAEDESTADDRREQ
|
||||||
|
inscode(d, ds, de, "WSAEDESTADDRREQ", WSAEDESTADDRREQ, "Destination address required");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAECONNREFUSED
|
||||||
|
inscode(d, ds, de, "WSAECONNREFUSED", WSAECONNREFUSED, "Connection refused");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAENETRESET
|
||||||
|
inscode(d, ds, de, "WSAENETRESET", WSAENETRESET, "Network dropped connection because of reset");
|
||||||
|
#endif
|
||||||
|
#ifdef WSAN
|
||||||
|
inscode(d, ds, de, "WSAN", WSAN, "Error WSAN");
|
||||||
|
#endif
|
||||||
|
#ifdef ENOTSUP
|
||||||
|
inscode(d, ds, de, "ENOTSUP", ENOTSUP, "Operation not supported");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Py_DECREF(de);
|
||||||
|
}
|
@@ -0,0 +1,119 @@
|
|||||||
|
/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
|
||||||
|
See the file COPYING for copying permission.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef Expat_External_INCLUDED
|
||||||
|
#define Expat_External_INCLUDED 1
|
||||||
|
|
||||||
|
/* External API definitions */
|
||||||
|
|
||||||
|
/* Namespace external symbols to allow multiple libexpat version to
|
||||||
|
co-exist. */
|
||||||
|
#include "pyexpatns.h"
|
||||||
|
|
||||||
|
#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__)
|
||||||
|
#define XML_USE_MSC_EXTENSIONS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Expat tries very hard to make the API boundary very specifically
|
||||||
|
defined. There are two macros defined to control this boundary;
|
||||||
|
each of these can be defined before including this header to
|
||||||
|
achieve some different behavior, but doing so it not recommended or
|
||||||
|
tested frequently.
|
||||||
|
|
||||||
|
XMLCALL - The calling convention to use for all calls across the
|
||||||
|
"library boundary." This will default to cdecl, and
|
||||||
|
try really hard to tell the compiler that's what we
|
||||||
|
want.
|
||||||
|
|
||||||
|
XMLIMPORT - Whatever magic is needed to note that a function is
|
||||||
|
to be imported from a dynamically loaded library
|
||||||
|
(.dll, .so, or .sl, depending on your platform).
|
||||||
|
|
||||||
|
The XMLCALL macro was added in Expat 1.95.7. The only one which is
|
||||||
|
expected to be directly useful in client code is XMLCALL.
|
||||||
|
|
||||||
|
Note that on at least some Unix versions, the Expat library must be
|
||||||
|
compiled with the cdecl calling convention as the default since
|
||||||
|
system headers may assume the cdecl convention.
|
||||||
|
*/
|
||||||
|
#ifndef XMLCALL
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#define XMLCALL __cdecl
|
||||||
|
#elif defined(__GNUC__) && defined(__i386) && !defined(__INTEL_COMPILER)
|
||||||
|
#define XMLCALL __attribute__((cdecl))
|
||||||
|
#else
|
||||||
|
/* For any platform which uses this definition and supports more than
|
||||||
|
one calling convention, we need to extend this definition to
|
||||||
|
declare the convention used on that platform, if it's possible to
|
||||||
|
do so.
|
||||||
|
|
||||||
|
If this is the case for your platform, please file a bug report
|
||||||
|
with information on how to identify your platform via the C
|
||||||
|
pre-processor and how to specify the same calling convention as the
|
||||||
|
platform's malloc() implementation.
|
||||||
|
*/
|
||||||
|
#define XMLCALL
|
||||||
|
#endif
|
||||||
|
#endif /* not defined XMLCALL */
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(XML_STATIC) && !defined(XMLIMPORT)
|
||||||
|
#ifndef XML_BUILDING_EXPAT
|
||||||
|
/* using Expat from an application */
|
||||||
|
|
||||||
|
#ifdef XML_USE_MSC_EXTENSIONS
|
||||||
|
#define XMLIMPORT __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* not defined XML_STATIC */
|
||||||
|
|
||||||
|
|
||||||
|
/* If we didn't define it above, define it away: */
|
||||||
|
#ifndef XMLIMPORT
|
||||||
|
#define XMLIMPORT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef XML_UNICODE_WCHAR_T
|
||||||
|
#define XML_UNICODE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef XML_UNICODE /* Information is UTF-16 encoded. */
|
||||||
|
#ifdef XML_UNICODE_WCHAR_T
|
||||||
|
typedef wchar_t XML_Char;
|
||||||
|
typedef wchar_t XML_LChar;
|
||||||
|
#else
|
||||||
|
typedef unsigned short XML_Char;
|
||||||
|
typedef char XML_LChar;
|
||||||
|
#endif /* XML_UNICODE_WCHAR_T */
|
||||||
|
#else /* Information is UTF-8 encoded. */
|
||||||
|
typedef char XML_Char;
|
||||||
|
typedef char XML_LChar;
|
||||||
|
#endif /* XML_UNICODE */
|
||||||
|
|
||||||
|
#ifdef XML_LARGE_SIZE /* Use large integers for file/stream positions. */
|
||||||
|
#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400
|
||||||
|
typedef __int64 XML_Index;
|
||||||
|
typedef unsigned __int64 XML_Size;
|
||||||
|
#else
|
||||||
|
typedef long long XML_Index;
|
||||||
|
typedef unsigned long long XML_Size;
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
typedef long XML_Index;
|
||||||
|
typedef unsigned long XML_Size;
|
||||||
|
#endif /* XML_LARGE_SIZE */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* not Expat_External_INCLUDED */
|
@@ -0,0 +1,725 @@
|
|||||||
|
/** @file
|
||||||
|
Return the initial module search path.
|
||||||
|
|
||||||
|
Search in specified locations for the associated Python libraries.
|
||||||
|
|
||||||
|
Py_GetPath returns module_search_path.
|
||||||
|
Py_GetPrefix returns PREFIX
|
||||||
|
Py_GetExec_Prefix returns PREFIX
|
||||||
|
Py_GetProgramFullPath returns the full path to the python executable.
|
||||||
|
|
||||||
|
These are built dynamically so that the proper volume name can be prefixed
|
||||||
|
to the paths.
|
||||||
|
|
||||||
|
For the EDK II, UEFI, implementation of Python, PREFIX and EXEC_PREFIX
|
||||||
|
are set as follows:
|
||||||
|
PREFIX = /Efi/StdLib
|
||||||
|
EXEC_PREFIX = PREFIX
|
||||||
|
|
||||||
|
The following final paths are assumed:
|
||||||
|
/Efi/Tools/Python.efi The Python executable.
|
||||||
|
/Efi/StdLib/lib/python.VERSION The platform independent Python modules.
|
||||||
|
/Efi/StdLib/lib/python.VERSION/dynalib Dynamically loadable Python extension modules.
|
||||||
|
|
||||||
|
Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||||
|
This program and the accompanying materials are licensed and made available under
|
||||||
|
the terms and conditions of the BSD License that accompanies this distribution.
|
||||||
|
The full text of the license may be found at
|
||||||
|
http://opensource.org/licenses/bsd-license.
|
||||||
|
|
||||||
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
**/
|
||||||
|
#include <Python.h>
|
||||||
|
#include <osdefs.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* VERSION must be at least two characters long. */
|
||||||
|
#ifndef VERSION
|
||||||
|
#define VERSION "27"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef VPATH
|
||||||
|
#define VPATH "."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Search path entry delimiter */
|
||||||
|
#ifdef DELIM
|
||||||
|
#define sDELIM ";"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PREFIX
|
||||||
|
#define PREFIX "/Efi/StdLib"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EXEC_PREFIX
|
||||||
|
#define EXEC_PREFIX PREFIX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LIBPYTHON
|
||||||
|
#define LIBPYTHON "lib/python." VERSION
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PYTHONPATH
|
||||||
|
#ifdef HAVE_ENVIRONMENT_OPS
|
||||||
|
#define PYTHONPATH PREFIX LIBPYTHON sDELIM \
|
||||||
|
EXEC_PREFIX LIBPYTHON "/lib-dynload"
|
||||||
|
#else
|
||||||
|
#define PYTHONPATH LIBPYTHON
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LANDMARK
|
||||||
|
#define LANDMARK "os.py"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static char prefix[MAXPATHLEN+1];
|
||||||
|
static char exec_prefix[MAXPATHLEN+1];
|
||||||
|
static char progpath[MAXPATHLEN+1];
|
||||||
|
static char *module_search_path = NULL;
|
||||||
|
static char lib_python[] = LIBPYTHON;
|
||||||
|
static char volume_name[32] = { 0 };
|
||||||
|
|
||||||
|
/** Determine if "ch" is a separator character.
|
||||||
|
|
||||||
|
@param[in] ch The character to test.
|
||||||
|
|
||||||
|
@retval TRUE ch is a separator character.
|
||||||
|
@retval FALSE ch is NOT a separator character.
|
||||||
|
**/
|
||||||
|
static int
|
||||||
|
is_sep(char ch)
|
||||||
|
{
|
||||||
|
#ifdef ALTSEP
|
||||||
|
return ch == SEP || ch == ALTSEP;
|
||||||
|
#else
|
||||||
|
return ch == SEP;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reduce a path by its last element.
|
||||||
|
|
||||||
|
The last element (everything to the right of the last separator character)
|
||||||
|
in the path, dir, is removed from the path. Parameter dir is modified in place.
|
||||||
|
|
||||||
|
@param[in,out] dir Pointer to the path to modify.
|
||||||
|
**/
|
||||||
|
static void
|
||||||
|
reduce(char *dir)
|
||||||
|
{
|
||||||
|
size_t i = strlen(dir);
|
||||||
|
while (i > 0 && !is_sep(dir[i]))
|
||||||
|
--i;
|
||||||
|
dir[i] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef UEFI_C_SOURCE
|
||||||
|
/** Does filename point to a file and not directory?
|
||||||
|
|
||||||
|
@param[in] filename The fully qualified path to the object to test.
|
||||||
|
|
||||||
|
@retval 0 Filename was not found, or is a directory.
|
||||||
|
@retval 1 Filename refers to a regular file.
|
||||||
|
**/
|
||||||
|
static int
|
||||||
|
isfile(char *filename)
|
||||||
|
{
|
||||||
|
struct stat buf;
|
||||||
|
if (stat(filename, &buf) != 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
//if (!S_ISREG(buf.st_mode))
|
||||||
|
if (S_ISDIR(buf.st_mode)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Determine if filename refers to a Python module.
|
||||||
|
|
||||||
|
A Python module is indicated if the file exists, or if the file with
|
||||||
|
'o' or 'c' appended exists.
|
||||||
|
|
||||||
|
@param[in] filename The fully qualified path to the object to test.
|
||||||
|
|
||||||
|
@retval 0
|
||||||
|
**/
|
||||||
|
static int
|
||||||
|
ismodule(char *filename)
|
||||||
|
{
|
||||||
|
if (isfile(filename)) {
|
||||||
|
//if (Py_VerboseFlag) PySys_WriteStderr("%s[%d]: file = \"%s\"\n", __func__, __LINE__, filename);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check for the compiled version of prefix. */
|
||||||
|
if (strlen(filename) < MAXPATHLEN) {
|
||||||
|
strcat(filename, Py_OptimizeFlag ? "o" : "c");
|
||||||
|
if (isfile(filename)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Does filename point to a directory?
|
||||||
|
|
||||||
|
@param[in] filename The fully qualified path to the object to test.
|
||||||
|
|
||||||
|
@retval 0 Filename was not found, or is not a regular file.
|
||||||
|
@retval 1 Filename refers to a directory.
|
||||||
|
**/
|
||||||
|
static int
|
||||||
|
isdir(char *filename)
|
||||||
|
{
|
||||||
|
struct stat buf;
|
||||||
|
|
||||||
|
if (stat(filename, &buf) != 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!S_ISDIR(buf.st_mode))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif /* UEFI_C_SOURCE */
|
||||||
|
|
||||||
|
/** Determine if a path is absolute, or not.
|
||||||
|
An absolute path consists of a volume name, "VOL:", followed by a rooted path,
|
||||||
|
"/path/elements". If both of these components are present, the path is absolute.
|
||||||
|
|
||||||
|
Let P be a pointer to the path to test.
|
||||||
|
Let A be a pointer to the first ':' in P.
|
||||||
|
Let B be a pointer to the first '/' or '\\' in P.
|
||||||
|
|
||||||
|
If A and B are not NULL
|
||||||
|
If (A-P+1) == (B-P) then the path is absolute.
|
||||||
|
Otherwise, the path is NOT absolute.
|
||||||
|
|
||||||
|
@param[in] path The path to test.
|
||||||
|
|
||||||
|
@retval -1 Path is absolute but lacking volume name.
|
||||||
|
@retval 0 Path is NOT absolute.
|
||||||
|
@retval 1 Path is absolute.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
is_absolute(char *path)
|
||||||
|
{
|
||||||
|
char *A;
|
||||||
|
char *B;
|
||||||
|
|
||||||
|
A = strchr(path, ':');
|
||||||
|
B = strpbrk(path, "/\\");
|
||||||
|
|
||||||
|
if(B != NULL) {
|
||||||
|
if(A == NULL) {
|
||||||
|
if(B == path) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(((A - path) + 1) == (B - path)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Add a path component, by appending stuff to buffer.
|
||||||
|
buffer must have at least MAXPATHLEN + 1 bytes allocated, and contain a
|
||||||
|
NUL-terminated string with no more than MAXPATHLEN characters (not counting
|
||||||
|
the trailing NUL). It's a fatal error if it contains a string longer than
|
||||||
|
that (callers must be careful!). If these requirements are met, it's
|
||||||
|
guaranteed that buffer will still be a NUL-terminated string with no more
|
||||||
|
than MAXPATHLEN characters at exit. If stuff is too long, only as much of
|
||||||
|
stuff as fits will be appended.
|
||||||
|
|
||||||
|
@param[in,out] buffer The path to be extended.
|
||||||
|
@param[in] stuff The stuff to join onto the path.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
joinpath(char *buffer, char *stuff)
|
||||||
|
{
|
||||||
|
size_t n, k;
|
||||||
|
|
||||||
|
k = 0;
|
||||||
|
if (is_absolute(stuff) == 1) {
|
||||||
|
n = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
n = strlen(buffer);
|
||||||
|
if(n == 0) {
|
||||||
|
strncpy(buffer, volume_name, MAXPATHLEN);
|
||||||
|
n = strlen(buffer);
|
||||||
|
}
|
||||||
|
/* We must not use an else clause here because we want to test n again.
|
||||||
|
volume_name may have been empty.
|
||||||
|
*/
|
||||||
|
if (n > 0 && n < MAXPATHLEN) {
|
||||||
|
if(!is_sep(buffer[n-1])) {
|
||||||
|
buffer[n++] = SEP;
|
||||||
|
}
|
||||||
|
if(is_sep(stuff[0])) ++stuff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (n > MAXPATHLEN)
|
||||||
|
Py_FatalError("buffer overflow in getpath.c's joinpath()");
|
||||||
|
k = strlen(stuff);
|
||||||
|
if (n + k > MAXPATHLEN)
|
||||||
|
k = MAXPATHLEN - n;
|
||||||
|
strncpy(buffer+n, stuff, k);
|
||||||
|
buffer[n+k] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Is filename an executable file?
|
||||||
|
|
||||||
|
An executable file:
|
||||||
|
1) exists
|
||||||
|
2) is a file, not a directory
|
||||||
|
3) has a name ending with ".efi"
|
||||||
|
4) Only has a single '.' in the name.
|
||||||
|
|
||||||
|
If basename(filename) does not contain a '.', append ".efi" to filename
|
||||||
|
If filename ends in ".efi", it is executable, else it isn't.
|
||||||
|
|
||||||
|
This routine is used to when searching for the file named by argv[0].
|
||||||
|
As such, there is no need to search for extensions other than ".efi".
|
||||||
|
|
||||||
|
@param[in] filename The name of the file to test. It may, or may not, have an extension.
|
||||||
|
|
||||||
|
@retval 0 filename already has a path other than ".efi", or it doesn't exist, or is a directory.
|
||||||
|
@retval 1 filename refers to an executable file.
|
||||||
|
**/
|
||||||
|
static int
|
||||||
|
isxfile(char *filename)
|
||||||
|
{
|
||||||
|
struct stat buf;
|
||||||
|
char *bn;
|
||||||
|
char *newbn;
|
||||||
|
int bnlen;
|
||||||
|
|
||||||
|
bn = basename(filename); // Separate off the file name component
|
||||||
|
reduce(filename); // and isolate the path component
|
||||||
|
bnlen = strlen(bn);
|
||||||
|
newbn = strrchr(bn, '.'); // Does basename contain a period?
|
||||||
|
if(newbn == NULL) { // Does NOT contain a period.
|
||||||
|
newbn = &bn[bnlen];
|
||||||
|
strncpyX(newbn, ".efi", MAXPATHLEN - bnlen); // append ".efi" to basename
|
||||||
|
bnlen += 4;
|
||||||
|
}
|
||||||
|
else if(strcmp(newbn, ".efi") != 0) {
|
||||||
|
return 0; // File can not be executable.
|
||||||
|
}
|
||||||
|
joinpath(filename, bn); // Stitch path and file name back together
|
||||||
|
|
||||||
|
if (stat(filename, &buf) != 0) { // Now, verify that file exists
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(S_ISDIR(buf.st_mode)) { // And it is not a directory.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Copy p into path, ensuring that the result is an absolute path.
|
||||||
|
|
||||||
|
copy_absolute requires that path be allocated at least
|
||||||
|
MAXPATHLEN + 1 bytes and that p be no more than MAXPATHLEN bytes.
|
||||||
|
|
||||||
|
@param[out] path Destination to receive the absolute path.
|
||||||
|
@param[in] p Path to be tested and possibly converted.
|
||||||
|
**/
|
||||||
|
static void
|
||||||
|
copy_absolute(char *path, char *p)
|
||||||
|
{
|
||||||
|
if (is_absolute(p) == 1)
|
||||||
|
strcpy(path, p);
|
||||||
|
else {
|
||||||
|
if (!getcwd(path, MAXPATHLEN)) {
|
||||||
|
/* unable to get the current directory */
|
||||||
|
if(volume_name[0] != 0) {
|
||||||
|
strcpy(path, volume_name);
|
||||||
|
joinpath(path, p);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
strcpy(path, p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (p[0] == '.' && is_sep(p[1]))
|
||||||
|
p += 2;
|
||||||
|
joinpath(path, p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Modify path so that the result is an absolute path.
|
||||||
|
absolutize() requires that path be allocated at least MAXPATHLEN+1 bytes.
|
||||||
|
|
||||||
|
@param[in,out] path The path to be made absolute.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
absolutize(char *path)
|
||||||
|
{
|
||||||
|
char buffer[MAXPATHLEN + 1];
|
||||||
|
|
||||||
|
if (is_absolute(path) == 1)
|
||||||
|
return;
|
||||||
|
copy_absolute(buffer, path);
|
||||||
|
strcpy(path, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Extract the volume name from a path.
|
||||||
|
|
||||||
|
@param[out] Dest Pointer to location in which to store the extracted volume name.
|
||||||
|
@param[in] path Pointer to the path to extract the volume name from.
|
||||||
|
**/
|
||||||
|
static void
|
||||||
|
set_volume(char *Dest, char *path)
|
||||||
|
{
|
||||||
|
size_t VolLen;
|
||||||
|
|
||||||
|
if(is_absolute(path)) {
|
||||||
|
VolLen = strcspn(path, "/\\:");
|
||||||
|
if((VolLen != 0) && (path[VolLen] == ':')) {
|
||||||
|
(void) strncpyX(Dest, path, VolLen + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Determine paths.
|
||||||
|
|
||||||
|
Two directories must be found, the platform independent directory
|
||||||
|
(prefix), containing the common .py and .pyc files, and the platform
|
||||||
|
dependent directory (exec_prefix), containing the shared library
|
||||||
|
modules. Note that prefix and exec_prefix are the same directory
|
||||||
|
for UEFI installations.
|
||||||
|
|
||||||
|
Separate searches are carried out for prefix and exec_prefix.
|
||||||
|
Each search tries a number of different locations until a ``landmark''
|
||||||
|
file or directory is found. If no prefix or exec_prefix is found, a
|
||||||
|
warning message is issued and the preprocessor defined PREFIX and
|
||||||
|
EXEC_PREFIX are used (even though they may not work); python carries on
|
||||||
|
as best as is possible, but some imports may fail.
|
||||||
|
|
||||||
|
Before any searches are done, the location of the executable is
|
||||||
|
determined. If argv[0] has one or more slashes in it, it is used
|
||||||
|
unchanged. Otherwise, it must have been invoked from the shell's path,
|
||||||
|
so we search %PATH% for the named executable and use that. If the
|
||||||
|
executable was not found on %PATH% (or there was no %PATH% environment
|
||||||
|
variable), the original argv[0] string is used.
|
||||||
|
|
||||||
|
Finally, argv0_path is set to the directory containing the executable
|
||||||
|
(i.e. the last component is stripped).
|
||||||
|
|
||||||
|
With argv0_path in hand, we perform a number of steps. The same steps
|
||||||
|
are performed for prefix and for exec_prefix, but with a different
|
||||||
|
landmark.
|
||||||
|
|
||||||
|
The prefix landmark will always be lib/python.VERSION/os.py and the
|
||||||
|
exec_prefix will always be lib/python.VERSION/dynaload, where VERSION
|
||||||
|
is Python's version number as defined at the beginning of this file.
|
||||||
|
|
||||||
|
First. See if the %PYTHONHOME% environment variable points to the
|
||||||
|
installed location of the Python libraries. If %PYTHONHOME% is set, then
|
||||||
|
it points to prefix and exec_prefix. %PYTHONHOME% can be a single
|
||||||
|
directory, which is used for both, or the prefix and exec_prefix
|
||||||
|
directories separated by the DELIM character.
|
||||||
|
|
||||||
|
Next. Search the directories pointed to by the preprocessor variables
|
||||||
|
PREFIX and EXEC_PREFIX. These paths are prefixed with the volume name
|
||||||
|
extracted from argv0_path. The volume names correspond to the UEFI
|
||||||
|
shell "map" names.
|
||||||
|
|
||||||
|
That's it!
|
||||||
|
|
||||||
|
Well, almost. Once we have determined prefix and exec_prefix, the
|
||||||
|
preprocessor variable PYTHONPATH is used to construct a path. Each
|
||||||
|
relative path on PYTHONPATH is prefixed with prefix. Then the directory
|
||||||
|
containing the shared library modules is appended. The environment
|
||||||
|
variable $PYTHONPATH is inserted in front of it all. Finally, the
|
||||||
|
prefix and exec_prefix globals are tweaked so they reflect the values
|
||||||
|
expected by other code, by stripping the "lib/python$VERSION/..." stuff
|
||||||
|
off. This seems to make more sense given that currently the only
|
||||||
|
known use of sys.prefix and sys.exec_prefix is for the ILU installation
|
||||||
|
process to find the installed Python tree.
|
||||||
|
|
||||||
|
The final, fully resolved, paths should look something like:
|
||||||
|
fs0:/Efi/Tools/python.efi
|
||||||
|
fs0:/Efi/StdLib/lib/python27
|
||||||
|
fs0:/Efi/StdLib/lib/python27/dynaload
|
||||||
|
|
||||||
|
**/
|
||||||
|
static void
|
||||||
|
calculate_path(void)
|
||||||
|
{
|
||||||
|
extern char *Py_GetProgramName(void);
|
||||||
|
|
||||||
|
static char delimiter[2] = {DELIM, '\0'};
|
||||||
|
static char separator[2] = {SEP, '\0'};
|
||||||
|
char *pythonpath = PYTHONPATH;
|
||||||
|
char *rtpypath = Py_GETENV("PYTHONPATH");
|
||||||
|
//char *home = Py_GetPythonHome();
|
||||||
|
char *path = getenv("PATH");
|
||||||
|
char *prog = Py_GetProgramName();
|
||||||
|
char argv0_path[MAXPATHLEN+1];
|
||||||
|
char zip_path[MAXPATHLEN+1];
|
||||||
|
char *buf;
|
||||||
|
size_t bufsz;
|
||||||
|
size_t prefixsz;
|
||||||
|
char *defpath;
|
||||||
|
|
||||||
|
|
||||||
|
/* ###########################################################################
|
||||||
|
Determine path to the Python.efi binary.
|
||||||
|
Produces progpath, argv0_path, and volume_name.
|
||||||
|
########################################################################### */
|
||||||
|
|
||||||
|
/* If there is no slash in the argv0 path, then we have to
|
||||||
|
* assume python is on the user's $PATH, since there's no
|
||||||
|
* other way to find a directory to start the search from. If
|
||||||
|
* $PATH isn't exported, you lose.
|
||||||
|
*/
|
||||||
|
if (strchr(prog, SEP))
|
||||||
|
strncpy(progpath, prog, MAXPATHLEN);
|
||||||
|
else if (path) {
|
||||||
|
while (1) {
|
||||||
|
char *delim = strchr(path, DELIM);
|
||||||
|
|
||||||
|
if (delim) {
|
||||||
|
size_t len = delim - path;
|
||||||
|
if (len > MAXPATHLEN)
|
||||||
|
len = MAXPATHLEN;
|
||||||
|
strncpy(progpath, path, len);
|
||||||
|
*(progpath + len) = '\0';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
strncpy(progpath, path, MAXPATHLEN);
|
||||||
|
|
||||||
|
joinpath(progpath, prog);
|
||||||
|
if (isxfile(progpath))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!delim) {
|
||||||
|
progpath[0] = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
path = delim + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
progpath[0] = '\0';
|
||||||
|
if ( (!is_absolute(progpath)) && (progpath[0] != '\0') )
|
||||||
|
absolutize(progpath);
|
||||||
|
strncpy(argv0_path, progpath, MAXPATHLEN);
|
||||||
|
argv0_path[MAXPATHLEN] = '\0';
|
||||||
|
set_volume(volume_name, argv0_path);
|
||||||
|
|
||||||
|
reduce(argv0_path);
|
||||||
|
/* At this point, argv0_path is guaranteed to be less than
|
||||||
|
MAXPATHLEN bytes long.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ###########################################################################
|
||||||
|
Build the FULL prefix string, including volume name.
|
||||||
|
This is the full path to the platform independent libraries.
|
||||||
|
########################################################################### */
|
||||||
|
|
||||||
|
strncpy(prefix, volume_name, MAXPATHLEN);
|
||||||
|
joinpath(prefix, PREFIX);
|
||||||
|
joinpath(prefix, lib_python);
|
||||||
|
|
||||||
|
/* ###########################################################################
|
||||||
|
Build the FULL path to the zipped-up Python library.
|
||||||
|
########################################################################### */
|
||||||
|
|
||||||
|
strncpy(zip_path, prefix, MAXPATHLEN);
|
||||||
|
zip_path[MAXPATHLEN] = '\0';
|
||||||
|
reduce(zip_path);
|
||||||
|
joinpath(zip_path, "python00.zip");
|
||||||
|
bufsz = strlen(zip_path); /* Replace "00" with version */
|
||||||
|
zip_path[bufsz - 6] = VERSION[0];
|
||||||
|
zip_path[bufsz - 5] = VERSION[1];
|
||||||
|
|
||||||
|
/* ###########################################################################
|
||||||
|
Build the FULL path to dynamically loadable libraries.
|
||||||
|
########################################################################### */
|
||||||
|
|
||||||
|
strncpy(exec_prefix, volume_name, MAXPATHLEN);
|
||||||
|
joinpath(exec_prefix, EXEC_PREFIX);
|
||||||
|
joinpath(exec_prefix, lib_python);
|
||||||
|
joinpath(exec_prefix, "lib-dynload");
|
||||||
|
|
||||||
|
/* ###########################################################################
|
||||||
|
Build the module search path.
|
||||||
|
########################################################################### */
|
||||||
|
|
||||||
|
/* Reduce prefix and exec_prefix to their essence,
|
||||||
|
* e.g. /usr/local/lib/python1.5 is reduced to /usr/local.
|
||||||
|
* If we're loading relative to the build directory,
|
||||||
|
* return the compiled-in defaults instead.
|
||||||
|
*/
|
||||||
|
reduce(prefix);
|
||||||
|
reduce(prefix);
|
||||||
|
/* The prefix is the root directory, but reduce() chopped
|
||||||
|
* off the "/". */
|
||||||
|
if (!prefix[0]) {
|
||||||
|
strcpy(prefix, volume_name);
|
||||||
|
}
|
||||||
|
bufsz = strlen(prefix);
|
||||||
|
if(prefix[bufsz-1] == ':') {
|
||||||
|
prefix[bufsz] = SEP;
|
||||||
|
prefix[bufsz+1] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calculate size of return buffer.
|
||||||
|
*/
|
||||||
|
defpath = pythonpath;
|
||||||
|
bufsz = 0;
|
||||||
|
|
||||||
|
if (rtpypath)
|
||||||
|
bufsz += strlen(rtpypath) + 1;
|
||||||
|
|
||||||
|
prefixsz = strlen(prefix) + 1;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
char *delim = strchr(defpath, DELIM);
|
||||||
|
|
||||||
|
if (is_absolute(defpath) == 0)
|
||||||
|
/* Paths are relative to prefix */
|
||||||
|
bufsz += prefixsz;
|
||||||
|
|
||||||
|
if (delim)
|
||||||
|
bufsz += delim - defpath + 1;
|
||||||
|
else {
|
||||||
|
bufsz += strlen(defpath) + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
defpath = delim + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bufsz += strlen(zip_path) + 1;
|
||||||
|
bufsz += strlen(exec_prefix) + 1;
|
||||||
|
|
||||||
|
/* This is the only malloc call in this file */
|
||||||
|
buf = (char *)PyMem_Malloc(bufsz);
|
||||||
|
|
||||||
|
if (buf == NULL) {
|
||||||
|
/* We can't exit, so print a warning and limp along */
|
||||||
|
fprintf(stderr, "Not enough memory for dynamic PYTHONPATH.\n");
|
||||||
|
fprintf(stderr, "Using default static PYTHONPATH.\n");
|
||||||
|
module_search_path = PYTHONPATH;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Run-time value of $PYTHONPATH goes first */
|
||||||
|
if (rtpypath) {
|
||||||
|
strcpy(buf, rtpypath);
|
||||||
|
strcat(buf, delimiter);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
buf[0] = '\0';
|
||||||
|
|
||||||
|
/* Next is the default zip path */
|
||||||
|
strcat(buf, zip_path);
|
||||||
|
strcat(buf, delimiter);
|
||||||
|
|
||||||
|
/* Next goes merge of compile-time $PYTHONPATH with
|
||||||
|
* dynamically located prefix.
|
||||||
|
*/
|
||||||
|
defpath = pythonpath;
|
||||||
|
while (1) {
|
||||||
|
char *delim = strchr(defpath, DELIM);
|
||||||
|
|
||||||
|
if (is_absolute(defpath) != 1) {
|
||||||
|
strcat(buf, prefix);
|
||||||
|
strcat(buf, separator);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delim) {
|
||||||
|
size_t len = delim - defpath + 1;
|
||||||
|
size_t end = strlen(buf) + len;
|
||||||
|
strncat(buf, defpath, len);
|
||||||
|
*(buf + end) = '\0';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
strcat(buf, defpath);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
defpath = delim + 1;
|
||||||
|
}
|
||||||
|
strcat(buf, delimiter);
|
||||||
|
|
||||||
|
/* Finally, on goes the directory for dynamic-load modules */
|
||||||
|
strcat(buf, exec_prefix);
|
||||||
|
|
||||||
|
/* And publish the results */
|
||||||
|
module_search_path = buf;
|
||||||
|
}
|
||||||
|
/* At this point, exec_prefix is set to VOL:/Efi/StdLib/lib/python.27/dynalib.
|
||||||
|
We want to get back to the root value, so we have to remove the final three
|
||||||
|
segments to get VOL:/Efi/StdLib. Because we don't know what VOL is, and
|
||||||
|
EXEC_PREFIX is also indeterminate, we just remove the three final segments.
|
||||||
|
*/
|
||||||
|
reduce(exec_prefix);
|
||||||
|
reduce(exec_prefix);
|
||||||
|
reduce(exec_prefix);
|
||||||
|
if (!exec_prefix[0]) {
|
||||||
|
strcpy(exec_prefix, volume_name);
|
||||||
|
}
|
||||||
|
bufsz = strlen(exec_prefix);
|
||||||
|
if(exec_prefix[bufsz-1] == ':') {
|
||||||
|
exec_prefix[bufsz] = SEP;
|
||||||
|
exec_prefix[bufsz+1] = 0;
|
||||||
|
}
|
||||||
|
if (Py_VerboseFlag) PySys_WriteStderr("%s[%d]: module_search_path = \"%s\"\n", __func__, __LINE__, module_search_path);
|
||||||
|
if (Py_VerboseFlag) PySys_WriteStderr("%s[%d]: prefix = \"%s\"\n", __func__, __LINE__, prefix);
|
||||||
|
if (Py_VerboseFlag) PySys_WriteStderr("%s[%d]: exec_prefix = \"%s\"\n", __func__, __LINE__, exec_prefix);
|
||||||
|
if (Py_VerboseFlag) PySys_WriteStderr("%s[%d]: progpath = \"%s\"\n", __func__, __LINE__, progpath);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* External interface */
|
||||||
|
|
||||||
|
char *
|
||||||
|
Py_GetPath(void)
|
||||||
|
{
|
||||||
|
if (!module_search_path)
|
||||||
|
calculate_path();
|
||||||
|
return module_search_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
Py_GetPrefix(void)
|
||||||
|
{
|
||||||
|
if (!module_search_path)
|
||||||
|
calculate_path();
|
||||||
|
return prefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
Py_GetExecPrefix(void)
|
||||||
|
{
|
||||||
|
if (!module_search_path)
|
||||||
|
calculate_path();
|
||||||
|
return exec_prefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
Py_GetProgramFullPath(void)
|
||||||
|
{
|
||||||
|
if (!module_search_path)
|
||||||
|
calculate_path();
|
||||||
|
return progpath;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
@@ -0,0 +1,704 @@
|
|||||||
|
/* Python interpreter main program */
|
||||||
|
|
||||||
|
#include "Python.h"
|
||||||
|
#include "osdefs.h"
|
||||||
|
#include "code.h" /* For CO_FUTURE_DIVISION */
|
||||||
|
#include "import.h"
|
||||||
|
|
||||||
|
#ifdef __VMS
|
||||||
|
#include <unixlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(MS_WINDOWS) || defined(__CYGWIN__)
|
||||||
|
#ifdef HAVE_FCNTL_H
|
||||||
|
#include <fcntl.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(PYOS_OS2) && !defined(PYCC_GCC)) || defined(MS_WINDOWS)
|
||||||
|
#define PYTHONHOMEHELP "<prefix>\\lib"
|
||||||
|
#else
|
||||||
|
#if defined(PYOS_OS2) && defined(PYCC_GCC)
|
||||||
|
#define PYTHONHOMEHELP "<prefix>/Lib"
|
||||||
|
#else
|
||||||
|
#define PYTHONHOMEHELP "<prefix>/pythonX.X"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "pygetopt.h"
|
||||||
|
|
||||||
|
#define COPYRIGHT \
|
||||||
|
"Type \"help\", \"copyright\", \"credits\" or \"license\" " \
|
||||||
|
"for more information."
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* For Py_GetArgcArgv(); set by main() */
|
||||||
|
static char **orig_argv;
|
||||||
|
static int orig_argc;
|
||||||
|
|
||||||
|
/* command line options */
|
||||||
|
#define BASE_OPTS "3bBc:dEhiJm:OQ:RsStuUvVW:xX?"
|
||||||
|
|
||||||
|
#ifndef RISCOS
|
||||||
|
#define PROGRAM_OPTS BASE_OPTS
|
||||||
|
#else /*RISCOS*/
|
||||||
|
/* extra option saying that we are running under a special task window
|
||||||
|
frontend; especially my_readline will behave different */
|
||||||
|
#define PROGRAM_OPTS BASE_OPTS "w"
|
||||||
|
/* corresponding flag */
|
||||||
|
extern int Py_RISCOSWimpFlag;
|
||||||
|
#endif /*RISCOS*/
|
||||||
|
|
||||||
|
/* Short usage message (with %s for argv0) */
|
||||||
|
static char *usage_line =
|
||||||
|
"usage: %s [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
|
||||||
|
|
||||||
|
/* Long usage message, split into parts < 512 bytes */
|
||||||
|
static char *usage_1 = "\
|
||||||
|
Options and arguments (and corresponding environment variables):\n\
|
||||||
|
-B : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\
|
||||||
|
-c cmd : program passed in as string (terminates option list)\n\
|
||||||
|
-d : debug output from parser; also PYTHONDEBUG=x\n\
|
||||||
|
-E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
|
||||||
|
-h : print this help message and exit (also --help)\n\
|
||||||
|
-i : inspect interactively after running script; forces a prompt even\n\
|
||||||
|
";
|
||||||
|
static char *usage_2 = "\
|
||||||
|
if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
|
||||||
|
-m mod : run library module as a script (terminates option list)\n\
|
||||||
|
-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
|
||||||
|
-OO : remove doc-strings in addition to the -O optimizations\n\
|
||||||
|
-R : use a pseudo-random salt to make hash() values of various types be\n\
|
||||||
|
unpredictable between separate invocations of the interpreter, as\n\
|
||||||
|
a defense against denial-of-service attacks\n\
|
||||||
|
-Q arg : division options: -Qold (default), -Qwarn, -Qwarnall, -Qnew\n\
|
||||||
|
-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
|
||||||
|
-S : don't imply 'import site' on initialization\n\
|
||||||
|
-t : issue warnings about inconsistent tab usage (-tt: issue errors)\n\
|
||||||
|
";
|
||||||
|
static char *usage_3 = "\
|
||||||
|
-u : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x\n\
|
||||||
|
see man page for details on internal buffering relating to '-u'\n\
|
||||||
|
-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
|
||||||
|
can be supplied multiple times to increase verbosity\n\
|
||||||
|
-V : print the Python version number and exit (also --version)\n\
|
||||||
|
-W arg : warning control; arg is action:message:category:module:lineno\n\
|
||||||
|
also PYTHONWARNINGS=arg\n\
|
||||||
|
-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
|
||||||
|
";
|
||||||
|
static char *usage_4 = "\
|
||||||
|
-3 : warn about Python 3.x incompatibilities that 2to3 cannot trivially fix\n\
|
||||||
|
file : program read from script file\n\
|
||||||
|
- : program read from stdin (default; interactive mode if a tty)\n\
|
||||||
|
arg ...: arguments passed to program in sys.argv[1:]\n\n\
|
||||||
|
Other environment variables:\n\
|
||||||
|
PYTHONSTARTUP: file executed on interactive startup (no default)\n\
|
||||||
|
PYTHONPATH : '%c'-separated list of directories prefixed to the\n\
|
||||||
|
default module search path. The result is sys.path.\n\
|
||||||
|
";
|
||||||
|
static char *usage_5 = "\
|
||||||
|
PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
|
||||||
|
The default module search path uses %s.\n\
|
||||||
|
PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\
|
||||||
|
PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\
|
||||||
|
";
|
||||||
|
static char *usage_6 = "\
|
||||||
|
PYTHONHASHSEED: if this variable is set to 'random', the effect is the same\n\
|
||||||
|
as specifying the -R option: a random value is used to seed the hashes of\n\
|
||||||
|
str, bytes and datetime objects. It can also be set to an integer\n\
|
||||||
|
in the range [0,4294967295] to get hash values with a predictable seed.\n\
|
||||||
|
";
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
usage(int exitcode, char* program)
|
||||||
|
{
|
||||||
|
FILE *f = exitcode ? stderr : stdout;
|
||||||
|
|
||||||
|
fprintf(f, usage_line, program);
|
||||||
|
if (exitcode)
|
||||||
|
fprintf(f, "Try `python -h' for more information.\n");
|
||||||
|
else {
|
||||||
|
fputs(usage_1, f);
|
||||||
|
fputs(usage_2, f);
|
||||||
|
fputs(usage_3, f);
|
||||||
|
fprintf(f, usage_4, DELIM);
|
||||||
|
fprintf(f, usage_5, DELIM, PYTHONHOMEHELP);
|
||||||
|
fputs(usage_6, f);
|
||||||
|
}
|
||||||
|
#if defined(__VMS)
|
||||||
|
if (exitcode == 0) {
|
||||||
|
/* suppress 'error' message */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* STS$M_INHIB_MSG + SS$_ABORT */
|
||||||
|
return 0x1000002c;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return exitcode;
|
||||||
|
#endif
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
|
|
||||||
|
static void RunStartupFile(PyCompilerFlags *cf)
|
||||||
|
{
|
||||||
|
char *startup = Py_GETENV("PYTHONSTARTUP");
|
||||||
|
if (startup != NULL && startup[0] != '\0') {
|
||||||
|
FILE *fp = fopen(startup, "r");
|
||||||
|
if (fp != NULL) {
|
||||||
|
(void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
|
||||||
|
PyErr_Clear();
|
||||||
|
fclose(fp);
|
||||||
|
} else {
|
||||||
|
int save_errno;
|
||||||
|
save_errno = errno;
|
||||||
|
PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
|
||||||
|
errno = save_errno;
|
||||||
|
PyErr_SetFromErrnoWithFilename(PyExc_IOError,
|
||||||
|
startup);
|
||||||
|
PyErr_Print();
|
||||||
|
PyErr_Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int RunModule(char *module, int set_argv0)
|
||||||
|
{
|
||||||
|
PyObject *runpy, *runmodule, *runargs, *result;
|
||||||
|
runpy = PyImport_ImportModule("runpy");
|
||||||
|
if (runpy == NULL) {
|
||||||
|
fprintf(stderr, "Could not import runpy module\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
|
||||||
|
if (runmodule == NULL) {
|
||||||
|
fprintf(stderr, "Could not access runpy._run_module_as_main\n");
|
||||||
|
Py_DECREF(runpy);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
runargs = Py_BuildValue("(si)", module, set_argv0);
|
||||||
|
if (runargs == NULL) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Could not create arguments for runpy._run_module_as_main\n");
|
||||||
|
Py_DECREF(runpy);
|
||||||
|
Py_DECREF(runmodule);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
result = PyObject_Call(runmodule, runargs, NULL);
|
||||||
|
if (result == NULL) {
|
||||||
|
PyErr_Print();
|
||||||
|
}
|
||||||
|
Py_DECREF(runpy);
|
||||||
|
Py_DECREF(runmodule);
|
||||||
|
Py_DECREF(runargs);
|
||||||
|
if (result == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
Py_DECREF(result);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int RunMainFromImporter(char *filename)
|
||||||
|
{
|
||||||
|
PyObject *argv0 = NULL, *importer = NULL;
|
||||||
|
|
||||||
|
if ((argv0 = PyString_FromString(filename)) &&
|
||||||
|
(importer = PyImport_GetImporter(argv0)) &&
|
||||||
|
(importer->ob_type != &PyNullImporter_Type))
|
||||||
|
{
|
||||||
|
/* argv0 is usable as an import source, so
|
||||||
|
put it in sys.path[0] and import __main__ */
|
||||||
|
PyObject *sys_path = NULL;
|
||||||
|
if ((sys_path = PySys_GetObject("path")) &&
|
||||||
|
!PyList_SetItem(sys_path, 0, argv0))
|
||||||
|
{
|
||||||
|
Py_INCREF(argv0);
|
||||||
|
Py_DECREF(importer);
|
||||||
|
sys_path = NULL;
|
||||||
|
return RunModule("__main__", 0) != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Py_XDECREF(argv0);
|
||||||
|
Py_XDECREF(importer);
|
||||||
|
if (PyErr_Occurred()) {
|
||||||
|
PyErr_Print();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Main program */
|
||||||
|
|
||||||
|
int
|
||||||
|
Py_Main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
int sts;
|
||||||
|
char *command = NULL;
|
||||||
|
char *filename = NULL;
|
||||||
|
char *module = NULL;
|
||||||
|
FILE *fp = stdin;
|
||||||
|
char *p;
|
||||||
|
int unbuffered = 0;
|
||||||
|
int skipfirstline = 0;
|
||||||
|
int stdin_is_interactive = 0;
|
||||||
|
int help = 0;
|
||||||
|
int version = 0;
|
||||||
|
int saw_unbuffered_flag = 0;
|
||||||
|
PyCompilerFlags cf;
|
||||||
|
|
||||||
|
cf.cf_flags = 0;
|
||||||
|
|
||||||
|
orig_argc = argc; /* For Py_GetArgcArgv() */
|
||||||
|
orig_argv = argv;
|
||||||
|
|
||||||
|
#ifdef RISCOS
|
||||||
|
Py_RISCOSWimpFlag = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Hash randomization needed early for all string operations
|
||||||
|
(including -W and -X options). */
|
||||||
|
_PyOS_opterr = 0; /* prevent printing the error in 1st pass */
|
||||||
|
while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
|
||||||
|
if (c == 'm' || c == 'c') {
|
||||||
|
/* -c / -m is the last option: following arguments are
|
||||||
|
not interpreter options. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (c) {
|
||||||
|
case 'E':
|
||||||
|
Py_IgnoreEnvironmentFlag++;
|
||||||
|
break;
|
||||||
|
case 'R':
|
||||||
|
Py_HashRandomizationFlag++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* The variable is only tested for existence here; _PyRandom_Init will
|
||||||
|
check its value further. */
|
||||||
|
if (!Py_HashRandomizationFlag &&
|
||||||
|
(p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0')
|
||||||
|
Py_HashRandomizationFlag = 1;
|
||||||
|
|
||||||
|
_PyRandom_Init();
|
||||||
|
|
||||||
|
PySys_ResetWarnOptions();
|
||||||
|
_PyOS_ResetGetOpt();
|
||||||
|
|
||||||
|
while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
|
||||||
|
if (c == 'c') {
|
||||||
|
/* -c is the last option; following arguments
|
||||||
|
that look like options are left for the
|
||||||
|
command to interpret. */
|
||||||
|
command = (char *)malloc(strlen(_PyOS_optarg) + 2);
|
||||||
|
if (command == NULL)
|
||||||
|
Py_FatalError(
|
||||||
|
"not enough memory to copy -c argument");
|
||||||
|
strcpy(command, _PyOS_optarg);
|
||||||
|
strcat(command, "\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == 'm') {
|
||||||
|
/* -m is the last option; following arguments
|
||||||
|
that look like options are left for the
|
||||||
|
module to interpret. */
|
||||||
|
module = (char *)malloc(strlen(_PyOS_optarg) + 2);
|
||||||
|
if (module == NULL)
|
||||||
|
Py_FatalError(
|
||||||
|
"not enough memory to copy -m argument");
|
||||||
|
strcpy(module, _PyOS_optarg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
case 'b':
|
||||||
|
Py_BytesWarningFlag++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'd':
|
||||||
|
Py_DebugFlag++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '3':
|
||||||
|
Py_Py3kWarningFlag++;
|
||||||
|
if (!Py_DivisionWarningFlag)
|
||||||
|
Py_DivisionWarningFlag = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Q':
|
||||||
|
if (strcmp(_PyOS_optarg, "old") == 0) {
|
||||||
|
Py_DivisionWarningFlag = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (strcmp(_PyOS_optarg, "warn") == 0) {
|
||||||
|
Py_DivisionWarningFlag = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (strcmp(_PyOS_optarg, "warnall") == 0) {
|
||||||
|
Py_DivisionWarningFlag = 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (strcmp(_PyOS_optarg, "new") == 0) {
|
||||||
|
/* This only affects __main__ */
|
||||||
|
cf.cf_flags |= CO_FUTURE_DIVISION;
|
||||||
|
/* And this tells the eval loop to treat
|
||||||
|
BINARY_DIVIDE as BINARY_TRUE_DIVIDE */
|
||||||
|
_Py_QnewFlag = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fprintf(stderr,
|
||||||
|
"-Q option should be `-Qold', "
|
||||||
|
"`-Qwarn', `-Qwarnall', or `-Qnew' only\n");
|
||||||
|
return usage(2, argv[0]);
|
||||||
|
/* NOTREACHED */
|
||||||
|
|
||||||
|
case 'i':
|
||||||
|
Py_InspectFlag++;
|
||||||
|
Py_InteractiveFlag++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* case 'J': reserved for Jython */
|
||||||
|
|
||||||
|
case 'O':
|
||||||
|
Py_OptimizeFlag++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'B':
|
||||||
|
Py_DontWriteBytecodeFlag++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 's':
|
||||||
|
Py_NoUserSiteDirectory++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'S':
|
||||||
|
Py_NoSiteFlag++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'E':
|
||||||
|
/* Already handled above */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 't':
|
||||||
|
Py_TabcheckFlag++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'u':
|
||||||
|
unbuffered++;
|
||||||
|
saw_unbuffered_flag = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'v':
|
||||||
|
Py_VerboseFlag++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
#ifdef RISCOS
|
||||||
|
case 'w':
|
||||||
|
Py_RISCOSWimpFlag = 1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case 'x':
|
||||||
|
skipfirstline = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* case 'X': reserved for implementation-specific arguments */
|
||||||
|
|
||||||
|
case 'U':
|
||||||
|
Py_UnicodeFlag++;
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
help++;
|
||||||
|
break;
|
||||||
|
case 'V':
|
||||||
|
version++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'W':
|
||||||
|
PySys_AddWarnOption(_PyOS_optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'R':
|
||||||
|
/* Already handled above */
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* This space reserved for other options */
|
||||||
|
|
||||||
|
default:
|
||||||
|
return usage(2, argv[0]);
|
||||||
|
/*NOTREACHED*/
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (help)
|
||||||
|
return usage(0, argv[0]);
|
||||||
|
|
||||||
|
if (version) {
|
||||||
|
fprintf(stderr, "Python %s\n", PY_VERSION);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Py_Py3kWarningFlag && !Py_TabcheckFlag)
|
||||||
|
/* -3 implies -t (but not -tt) */
|
||||||
|
Py_TabcheckFlag = 1;
|
||||||
|
|
||||||
|
if (!Py_InspectFlag &&
|
||||||
|
(p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
|
||||||
|
Py_InspectFlag = 1;
|
||||||
|
if (!saw_unbuffered_flag &&
|
||||||
|
(p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
|
||||||
|
unbuffered = 1;
|
||||||
|
|
||||||
|
if (!Py_NoUserSiteDirectory &&
|
||||||
|
(p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0')
|
||||||
|
Py_NoUserSiteDirectory = 1;
|
||||||
|
|
||||||
|
if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
|
||||||
|
char *buf, *warning;
|
||||||
|
|
||||||
|
buf = (char *)malloc(strlen(p) + 1);
|
||||||
|
if (buf == NULL)
|
||||||
|
Py_FatalError(
|
||||||
|
"not enough memory to copy PYTHONWARNINGS");
|
||||||
|
strcpy(buf, p);
|
||||||
|
for (warning = strtok(buf, ",");
|
||||||
|
warning != NULL;
|
||||||
|
warning = strtok(NULL, ","))
|
||||||
|
PySys_AddWarnOption(warning);
|
||||||
|
free(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (command == NULL && module == NULL && _PyOS_optind < argc &&
|
||||||
|
strcmp(argv[_PyOS_optind], "-") != 0)
|
||||||
|
{
|
||||||
|
#ifdef __VMS
|
||||||
|
filename = decc$translate_vms(argv[_PyOS_optind]);
|
||||||
|
if (filename == (char *)0 || filename == (char *)-1)
|
||||||
|
filename = argv[_PyOS_optind];
|
||||||
|
|
||||||
|
#else
|
||||||
|
filename = argv[_PyOS_optind];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
|
||||||
|
|
||||||
|
if (unbuffered) {
|
||||||
|
#if defined(MS_WINDOWS) || defined(__CYGWIN__)
|
||||||
|
_setmode(fileno(stdin), O_BINARY);
|
||||||
|
_setmode(fileno(stdout), O_BINARY);
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SETVBUF
|
||||||
|
setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
|
||||||
|
setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
|
||||||
|
setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
|
||||||
|
#else /* !HAVE_SETVBUF */
|
||||||
|
setbuf(stdin, (char *)NULL);
|
||||||
|
setbuf(stdout, (char *)NULL);
|
||||||
|
setbuf(stderr, (char *)NULL);
|
||||||
|
#endif /* !HAVE_SETVBUF */
|
||||||
|
}
|
||||||
|
else if (Py_InteractiveFlag) {
|
||||||
|
#ifdef MS_WINDOWS
|
||||||
|
/* Doesn't have to have line-buffered -- use unbuffered */
|
||||||
|
/* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
|
||||||
|
setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
|
||||||
|
#else /* !MS_WINDOWS */
|
||||||
|
#ifdef HAVE_SETVBUF
|
||||||
|
setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
|
||||||
|
setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
|
||||||
|
#endif /* HAVE_SETVBUF */
|
||||||
|
#endif /* !MS_WINDOWS */
|
||||||
|
/* Leave stderr alone - it should be unbuffered anyway. */
|
||||||
|
}
|
||||||
|
#ifdef __VMS
|
||||||
|
else {
|
||||||
|
setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
|
||||||
|
}
|
||||||
|
#endif /* __VMS */
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
/* On MacOS X, when the Python interpreter is embedded in an
|
||||||
|
application bundle, it gets executed by a bootstrapping script
|
||||||
|
that does os.execve() with an argv[0] that's different from the
|
||||||
|
actual Python executable. This is needed to keep the Finder happy,
|
||||||
|
or rather, to work around Apple's overly strict requirements of
|
||||||
|
the process name. However, we still need a usable sys.executable,
|
||||||
|
so the actual executable path is passed in an environment variable.
|
||||||
|
See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
|
||||||
|
script. */
|
||||||
|
if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0')
|
||||||
|
Py_SetProgramName(p);
|
||||||
|
else
|
||||||
|
Py_SetProgramName(argv[0]);
|
||||||
|
#else
|
||||||
|
Py_SetProgramName(argv[0]);
|
||||||
|
#endif
|
||||||
|
Py_Initialize();
|
||||||
|
|
||||||
|
if (Py_VerboseFlag ||
|
||||||
|
(command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
|
||||||
|
fprintf(stderr, "Python %s on %s\n",
|
||||||
|
Py_GetVersion(), Py_GetPlatform());
|
||||||
|
if (!Py_NoSiteFlag)
|
||||||
|
fprintf(stderr, "%s\n", COPYRIGHT);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (command != NULL) {
|
||||||
|
/* Backup _PyOS_optind and force sys.argv[0] = '-c' */
|
||||||
|
_PyOS_optind--;
|
||||||
|
argv[_PyOS_optind] = "-c";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (module != NULL) {
|
||||||
|
/* Backup _PyOS_optind and force sys.argv[0] = '-c'
|
||||||
|
so that PySys_SetArgv correctly sets sys.path[0] to ''
|
||||||
|
rather than looking for a file called "-m". See
|
||||||
|
tracker issue #8202 for details. */
|
||||||
|
_PyOS_optind--;
|
||||||
|
argv[_PyOS_optind] = "-c";
|
||||||
|
}
|
||||||
|
|
||||||
|
PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
|
||||||
|
|
||||||
|
if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
|
||||||
|
isatty(fileno(stdin))) {
|
||||||
|
PyObject *v;
|
||||||
|
v = PyImport_ImportModule("readline");
|
||||||
|
if (v == NULL)
|
||||||
|
PyErr_Clear();
|
||||||
|
else
|
||||||
|
Py_DECREF(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (command) {
|
||||||
|
sts = PyRun_SimpleStringFlags(command, &cf) != 0;
|
||||||
|
free(command);
|
||||||
|
} else if (module) {
|
||||||
|
sts = (RunModule(module, 1) != 0);
|
||||||
|
free(module);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
if (filename == NULL && stdin_is_interactive) {
|
||||||
|
Py_InspectFlag = 0; /* do exit on SystemExit */
|
||||||
|
RunStartupFile(&cf);
|
||||||
|
}
|
||||||
|
/* XXX */
|
||||||
|
|
||||||
|
sts = -1; /* keep track of whether we've already run __main__ */
|
||||||
|
|
||||||
|
if (filename != NULL) {
|
||||||
|
sts = RunMainFromImporter(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sts==-1 && filename!=NULL) {
|
||||||
|
if ((fp = fopen(filename, "r")) == NULL) {
|
||||||
|
fprintf(stderr, "%s: can't open file '%s': [Errno %d] %s\n",
|
||||||
|
argv[0], filename, errno, strerror(errno));
|
||||||
|
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
else if (skipfirstline) {
|
||||||
|
int ch;
|
||||||
|
/* Push back first newline so line numbers
|
||||||
|
remain the same */
|
||||||
|
while ((ch = getc(fp)) != EOF) {
|
||||||
|
if (ch == '\n') {
|
||||||
|
(void)ungetc(ch, fp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
/* XXX: does this work on Win/Win64? (see posix_fstat) */
|
||||||
|
struct stat sb;
|
||||||
|
if (fstat(fileno(fp), &sb) == 0 &&
|
||||||
|
S_ISDIR(sb.st_mode)) {
|
||||||
|
fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename);
|
||||||
|
fclose(fp);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sts==-1) {
|
||||||
|
/* call pending calls like signal handlers (SIGINT) */
|
||||||
|
if (Py_MakePendingCalls() == -1) {
|
||||||
|
PyErr_Print();
|
||||||
|
sts = 1;
|
||||||
|
} else {
|
||||||
|
sts = PyRun_AnyFileExFlags(
|
||||||
|
fp,
|
||||||
|
filename == NULL ? "<stdin>" : filename,
|
||||||
|
filename != NULL, &cf) != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check this environment variable at the end, to give programs the
|
||||||
|
* opportunity to set it from Python.
|
||||||
|
*/
|
||||||
|
if (!Py_InspectFlag &&
|
||||||
|
(p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
|
||||||
|
{
|
||||||
|
Py_InspectFlag = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Py_InspectFlag && stdin_is_interactive &&
|
||||||
|
(filename != NULL || command != NULL || module != NULL)) {
|
||||||
|
Py_InspectFlag = 0;
|
||||||
|
/* XXX */
|
||||||
|
sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Py_Finalize();
|
||||||
|
#ifdef RISCOS
|
||||||
|
if (Py_RISCOSWimpFlag)
|
||||||
|
fprintf(stderr, "\x0cq\x0c"); /* make frontend quit */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __INSURE__
|
||||||
|
/* Insure++ is a memory analysis tool that aids in discovering
|
||||||
|
* memory leaks and other memory problems. On Python exit, the
|
||||||
|
* interned string dictionary is flagged as being in use at exit
|
||||||
|
* (which it is). Under normal circumstances, this is fine because
|
||||||
|
* the memory will be automatically reclaimed by the system. Under
|
||||||
|
* memory debugging, it's a huge source of useless noise, so we
|
||||||
|
* trade off slower shutdown for less distraction in the memory
|
||||||
|
* reports. -baw
|
||||||
|
*/
|
||||||
|
_Py_ReleaseInternedStrings();
|
||||||
|
#endif /* __INSURE__ */
|
||||||
|
|
||||||
|
return sts;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* this is gonna seem *real weird*, but if you put some other code between
|
||||||
|
Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
|
||||||
|
while statement in Misc/gdbinit:ppystack */
|
||||||
|
|
||||||
|
/* Make the *original* argc/argv available to other modules.
|
||||||
|
This is rare, but it is needed by the secureware extension. */
|
||||||
|
|
||||||
|
void
|
||||||
|
Py_GetArgcArgv(int *argc, char ***argv)
|
||||||
|
{
|
||||||
|
*argc = orig_argc;
|
||||||
|
*argv = orig_argv;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,209 @@
|
|||||||
|
/* gzguts.h -- zlib internal header definitions for gz* operations
|
||||||
|
* Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef _LARGEFILE64_SOURCE
|
||||||
|
# ifndef _LARGEFILE_SOURCE
|
||||||
|
# define _LARGEFILE_SOURCE 1
|
||||||
|
# endif
|
||||||
|
# ifdef _FILE_OFFSET_BITS
|
||||||
|
# undef _FILE_OFFSET_BITS
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_HIDDEN
|
||||||
|
# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
|
||||||
|
#else
|
||||||
|
# define ZLIB_INTERNAL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "zlib.h"
|
||||||
|
#ifdef STDC
|
||||||
|
# include <string.h>
|
||||||
|
# include <stdlib.h>
|
||||||
|
# include <limits.h>
|
||||||
|
#endif
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
# include <stddef.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32)
|
||||||
|
# include <io.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WINAPI_FAMILY
|
||||||
|
# define open _open
|
||||||
|
# define read _read
|
||||||
|
# define write _write
|
||||||
|
# define close _close
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef NO_DEFLATE /* for compatibility with old definition */
|
||||||
|
# define NO_GZCOMPRESS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)
|
||||||
|
# ifndef HAVE_VSNPRINTF
|
||||||
|
# define HAVE_VSNPRINTF
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__CYGWIN__)
|
||||||
|
# ifndef HAVE_VSNPRINTF
|
||||||
|
# define HAVE_VSNPRINTF
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410)
|
||||||
|
# ifndef HAVE_VSNPRINTF
|
||||||
|
# define HAVE_VSNPRINTF
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_VSNPRINTF
|
||||||
|
# ifdef MSDOS
|
||||||
|
/* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
|
||||||
|
but for now we just assume it doesn't. */
|
||||||
|
# define NO_vsnprintf
|
||||||
|
# endif
|
||||||
|
# ifdef __TURBOC__
|
||||||
|
# define NO_vsnprintf
|
||||||
|
# endif
|
||||||
|
# ifdef WIN32
|
||||||
|
/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
|
||||||
|
# if !defined(vsnprintf) && !defined(NO_vsnprintf)
|
||||||
|
# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )
|
||||||
|
# define vsnprintf _vsnprintf
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# ifdef __SASC
|
||||||
|
# define NO_vsnprintf
|
||||||
|
# endif
|
||||||
|
# ifdef VMS
|
||||||
|
# define NO_vsnprintf
|
||||||
|
# endif
|
||||||
|
# ifdef __OS400__
|
||||||
|
# define NO_vsnprintf
|
||||||
|
# endif
|
||||||
|
# ifdef __MVS__
|
||||||
|
# define NO_vsnprintf
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* unlike snprintf (which is required in C99, yet still not supported by
|
||||||
|
Microsoft more than a decade later!), _snprintf does not guarantee null
|
||||||
|
termination of the result -- however this is only used in gzlib.c where
|
||||||
|
the result is assured to fit in the space provided */
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# define snprintf _snprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef local
|
||||||
|
# define local static
|
||||||
|
#endif
|
||||||
|
/* compile with -Dlocal if your debugger can't find static symbols */
|
||||||
|
|
||||||
|
/* gz* functions always use library allocation functions */
|
||||||
|
#ifndef STDC
|
||||||
|
extern voidp malloc OF((uInt size));
|
||||||
|
extern void free OF((voidpf ptr));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* get errno and strerror definition */
|
||||||
|
#if defined UNDER_CE
|
||||||
|
# include <windows.h>
|
||||||
|
# define zstrerror() gz_strwinerror((DWORD)GetLastError())
|
||||||
|
#else
|
||||||
|
# ifndef NO_STRERROR
|
||||||
|
# include <errno.h>
|
||||||
|
# define zstrerror() strerror(errno)
|
||||||
|
# else
|
||||||
|
# define zstrerror() "stdio error (consult errno)"
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* provide prototypes for these when building zlib without LFS */
|
||||||
|
#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0
|
||||||
|
ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
|
||||||
|
ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
|
||||||
|
ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
|
||||||
|
ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* default memLevel */
|
||||||
|
#if MAX_MEM_LEVEL >= 8
|
||||||
|
# define DEF_MEM_LEVEL 8
|
||||||
|
#else
|
||||||
|
# define DEF_MEM_LEVEL MAX_MEM_LEVEL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* default i/o buffer size -- double this for output when reading (this and
|
||||||
|
twice this must be able to fit in an unsigned type) */
|
||||||
|
#define GZBUFSIZE 8192
|
||||||
|
|
||||||
|
/* gzip modes, also provide a little integrity check on the passed structure */
|
||||||
|
#define GZ_NONE 0
|
||||||
|
#define GZ_READ 7247
|
||||||
|
#define GZ_WRITE 31153
|
||||||
|
#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */
|
||||||
|
|
||||||
|
/* values for gz_state how */
|
||||||
|
#define LOOK 0 /* look for a gzip header */
|
||||||
|
#define COPY 1 /* copy input directly */
|
||||||
|
#define GZIP 2 /* decompress a gzip stream */
|
||||||
|
|
||||||
|
/* internal gzip file state data structure */
|
||||||
|
typedef struct {
|
||||||
|
/* exposed contents for gzgetc() macro */
|
||||||
|
struct gzFile_s x; /* "x" for exposed */
|
||||||
|
/* x.have: number of bytes available at x.next */
|
||||||
|
/* x.next: next output data to deliver or write */
|
||||||
|
/* x.pos: current position in uncompressed data */
|
||||||
|
/* used for both reading and writing */
|
||||||
|
int mode; /* see gzip modes above */
|
||||||
|
int fd; /* file descriptor */
|
||||||
|
char *path; /* path or fd for error messages */
|
||||||
|
unsigned size; /* buffer size, zero if not allocated yet */
|
||||||
|
unsigned want; /* requested buffer size, default is GZBUFSIZE */
|
||||||
|
unsigned char *in; /* input buffer */
|
||||||
|
unsigned char *out; /* output buffer (double-sized when reading) */
|
||||||
|
int direct; /* 0 if processing gzip, 1 if transparent */
|
||||||
|
/* just for reading */
|
||||||
|
int how; /* 0: get header, 1: copy, 2: decompress */
|
||||||
|
z_off64_t start; /* where the gzip data started, for rewinding */
|
||||||
|
int eof; /* true if end of input file reached */
|
||||||
|
int past; /* true if read requested past end */
|
||||||
|
/* just for writing */
|
||||||
|
int level; /* compression level */
|
||||||
|
int strategy; /* compression strategy */
|
||||||
|
/* seek request */
|
||||||
|
z_off64_t skip; /* amount to skip (already rewound if backwards) */
|
||||||
|
int seek; /* true if seek request pending */
|
||||||
|
/* error information */
|
||||||
|
int err; /* error code */
|
||||||
|
char *msg; /* error message */
|
||||||
|
/* zlib inflate or deflate stream */
|
||||||
|
z_stream strm; /* stream structure in-place (not a pointer) */
|
||||||
|
} gz_state;
|
||||||
|
typedef gz_state FAR *gz_statep;
|
||||||
|
|
||||||
|
/* shared functions */
|
||||||
|
void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *));
|
||||||
|
#if defined UNDER_CE
|
||||||
|
char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t
|
||||||
|
value -- needed when comparing unsigned to z_off64_t, which is signed
|
||||||
|
(possible z_off64_t types off_t, off64_t, and long are all signed) */
|
||||||
|
#ifdef INT_MAX
|
||||||
|
# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)
|
||||||
|
#else
|
||||||
|
unsigned ZLIB_INTERNAL gz_intmax OF((void));
|
||||||
|
# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
|
||||||
|
#endif
|
@@ -0,0 +1,253 @@
|
|||||||
|
/* zutil.h -- internal interface and configuration of the compression library
|
||||||
|
* Copyright (C) 1995-2013 Jean-loup Gailly.
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* WARNING: this file should *not* be used by applications. It is
|
||||||
|
part of the implementation of the compression library and is
|
||||||
|
subject to change. Applications should only use zlib.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* @(#) $Id$ */
|
||||||
|
|
||||||
|
#ifndef ZUTIL_H
|
||||||
|
#define ZUTIL_H
|
||||||
|
|
||||||
|
#ifdef HAVE_HIDDEN
|
||||||
|
# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
|
||||||
|
#else
|
||||||
|
# define ZLIB_INTERNAL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "zlib.h"
|
||||||
|
|
||||||
|
#if defined(STDC) && !defined(Z_SOLO)
|
||||||
|
# if !(defined(_WIN32_WCE) && defined(_MSC_VER))
|
||||||
|
# include <stddef.h>
|
||||||
|
# endif
|
||||||
|
# include <string.h>
|
||||||
|
# include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef Z_SOLO
|
||||||
|
typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef local
|
||||||
|
# define local static
|
||||||
|
#endif
|
||||||
|
/* compile with -Dlocal if your debugger can't find static symbols */
|
||||||
|
|
||||||
|
typedef unsigned char uch;
|
||||||
|
typedef uch FAR uchf;
|
||||||
|
typedef unsigned short ush;
|
||||||
|
typedef ush FAR ushf;
|
||||||
|
typedef unsigned long ulg;
|
||||||
|
|
||||||
|
extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
||||||
|
/* (size given to avoid silly warnings with Visual C++) */
|
||||||
|
|
||||||
|
#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
|
||||||
|
|
||||||
|
#define ERR_RETURN(strm,err) \
|
||||||
|
return (strm->msg = ERR_MSG(err), (err))
|
||||||
|
/* To be used only when the state is known to be valid */
|
||||||
|
|
||||||
|
/* common constants */
|
||||||
|
|
||||||
|
#ifndef DEF_WBITS
|
||||||
|
# define DEF_WBITS MAX_WBITS
|
||||||
|
#endif
|
||||||
|
/* default windowBits for decompression. MAX_WBITS is for compression only */
|
||||||
|
|
||||||
|
#if MAX_MEM_LEVEL >= 8
|
||||||
|
# define DEF_MEM_LEVEL 8
|
||||||
|
#else
|
||||||
|
# define DEF_MEM_LEVEL MAX_MEM_LEVEL
|
||||||
|
#endif
|
||||||
|
/* default memLevel */
|
||||||
|
|
||||||
|
#define STORED_BLOCK 0
|
||||||
|
#define STATIC_TREES 1
|
||||||
|
#define DYN_TREES 2
|
||||||
|
/* The three kinds of block type */
|
||||||
|
|
||||||
|
#define MIN_MATCH 3
|
||||||
|
#define MAX_MATCH 258
|
||||||
|
/* The minimum and maximum match lengths */
|
||||||
|
|
||||||
|
#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
|
||||||
|
|
||||||
|
/* target dependencies */
|
||||||
|
|
||||||
|
#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32))
|
||||||
|
# define OS_CODE 0x00
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# if defined(__TURBOC__) || defined(__BORLANDC__)
|
||||||
|
# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
|
||||||
|
/* Allow compilation with ANSI keywords only enabled */
|
||||||
|
void _Cdecl farfree( void *block );
|
||||||
|
void *_Cdecl farmalloc( unsigned long nbytes );
|
||||||
|
# else
|
||||||
|
# include <alloc.h>
|
||||||
|
# endif
|
||||||
|
# else /* MSC or DJGPP */
|
||||||
|
# include <malloc.h>
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef AMIGA
|
||||||
|
# define OS_CODE 0x01
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(VAXC) || defined(VMS)
|
||||||
|
# define OS_CODE 0x02
|
||||||
|
# define F_OPEN(name, mode) \
|
||||||
|
fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ATARI) || defined(atarist)
|
||||||
|
# define OS_CODE 0x05
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef OS2
|
||||||
|
# define OS_CODE 0x06
|
||||||
|
# if defined(M_I86) && !defined(Z_SOLO)
|
||||||
|
# include <malloc.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(MACOS) || defined(TARGET_OS_MAC)
|
||||||
|
# define OS_CODE 0x07
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
|
||||||
|
# include <unix.h> /* for fdopen */
|
||||||
|
# else
|
||||||
|
# ifndef fdopen
|
||||||
|
# define fdopen(fd,mode) NULL /* No fdopen() */
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TOPS20
|
||||||
|
# define OS_CODE 0x0a
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */
|
||||||
|
# define OS_CODE 0x0b
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __50SERIES /* Prime/PRIMOS */
|
||||||
|
# define OS_CODE 0x0f
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_BEOS_) || defined(RISCOS)
|
||||||
|
# define fdopen(fd,mode) NULL /* No fdopen() */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX
|
||||||
|
# if defined(_WIN32_WCE)
|
||||||
|
# define fdopen(fd,mode) NULL /* No fdopen() */
|
||||||
|
# ifndef _PTRDIFF_T_DEFINED
|
||||||
|
typedef int ptrdiff_t;
|
||||||
|
# define _PTRDIFF_T_DEFINED
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# define fdopen(fd,type) _fdopen(fd,type)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__BORLANDC__) && !defined(MSDOS)
|
||||||
|
#pragma warn -8004
|
||||||
|
#pragma warn -8008
|
||||||
|
#pragma warn -8066
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* provide prototypes for these when building zlib without LFS */
|
||||||
|
#if !defined(_WIN32) && \
|
||||||
|
(!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
|
||||||
|
ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
|
||||||
|
ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* common defaults */
|
||||||
|
|
||||||
|
#ifndef OS_CODE
|
||||||
|
# define OS_CODE 0x03 /* assume Unix */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef F_OPEN
|
||||||
|
# define F_OPEN(name, mode) fopen((name), (mode))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* functions */
|
||||||
|
|
||||||
|
#if defined(pyr) || defined(Z_SOLO)
|
||||||
|
# define NO_MEMCPY
|
||||||
|
#endif
|
||||||
|
#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
|
||||||
|
/* Use our own functions for small and medium model with MSC <= 5.0.
|
||||||
|
* You may have to use the same strategy for Borland C (untested).
|
||||||
|
* The __SC__ check is for Symantec.
|
||||||
|
*/
|
||||||
|
# define NO_MEMCPY
|
||||||
|
#endif
|
||||||
|
#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)
|
||||||
|
# define HAVE_MEMCPY
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_MEMCPY
|
||||||
|
# ifdef SMALL_MEDIUM /* MSDOS small or medium model */
|
||||||
|
# define zmemcpy _fmemcpy
|
||||||
|
# define zmemcmp _fmemcmp
|
||||||
|
# define zmemzero(dest, len) _fmemset(dest, 0, len)
|
||||||
|
# else
|
||||||
|
# define zmemcpy memcpy
|
||||||
|
# define zmemcmp memcmp
|
||||||
|
# define zmemzero(dest, len) memset(dest, 0, len)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));
|
||||||
|
int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));
|
||||||
|
void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Diagnostic functions */
|
||||||
|
#ifdef DEBUG
|
||||||
|
# include <stdio.h>
|
||||||
|
extern int ZLIB_INTERNAL z_verbose;
|
||||||
|
extern void ZLIB_INTERNAL z_error OF((char *m));
|
||||||
|
# define Assert(cond,msg) {if(!(cond)) z_error(msg);}
|
||||||
|
# define Trace(x) {if (z_verbose>=0) fprintf x ;}
|
||||||
|
# define Tracev(x) {if (z_verbose>0) fprintf x ;}
|
||||||
|
# define Tracevv(x) {if (z_verbose>1) fprintf x ;}
|
||||||
|
# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}
|
||||||
|
# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}
|
||||||
|
#else
|
||||||
|
# define Assert(cond,msg)
|
||||||
|
# define Trace(x)
|
||||||
|
# define Tracev(x)
|
||||||
|
# define Tracevv(x)
|
||||||
|
# define Tracec(c,x)
|
||||||
|
# define Tracecv(c,x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef Z_SOLO
|
||||||
|
voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items,
|
||||||
|
unsigned size));
|
||||||
|
void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ZALLOC(strm, items, size) \
|
||||||
|
(*((strm)->zalloc))((strm)->opaque, (items), (size))
|
||||||
|
#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
|
||||||
|
#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
|
||||||
|
|
||||||
|
/* Reverse the bytes in a 32-bit value */
|
||||||
|
#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
|
||||||
|
(((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
|
||||||
|
|
||||||
|
#endif /* ZUTIL_H */
|
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,212 @@
|
|||||||
|
/* stringlib: locale related helpers implementation */
|
||||||
|
|
||||||
|
#ifndef STRINGLIB_LOCALEUTIL_H
|
||||||
|
#define STRINGLIB_LOCALEUTIL_H
|
||||||
|
|
||||||
|
#include <locale.h>
|
||||||
|
|
||||||
|
#define MAX(x, y) ((x) < (y) ? (y) : (x))
|
||||||
|
#define MIN(x, y) ((x) < (y) ? (x) : (y))
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const char *grouping;
|
||||||
|
char previous;
|
||||||
|
Py_ssize_t i; /* Where we're currently pointing in grouping. */
|
||||||
|
} GroupGenerator;
|
||||||
|
|
||||||
|
static void
|
||||||
|
_GroupGenerator_init(GroupGenerator *self, const char *grouping)
|
||||||
|
{
|
||||||
|
self->grouping = grouping;
|
||||||
|
self->i = 0;
|
||||||
|
self->previous = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns the next grouping, or 0 to signify end. */
|
||||||
|
static Py_ssize_t
|
||||||
|
_GroupGenerator_next(GroupGenerator *self)
|
||||||
|
{
|
||||||
|
/* Note that we don't really do much error checking here. If a
|
||||||
|
grouping string contains just CHAR_MAX, for example, then just
|
||||||
|
terminate the generator. That shouldn't happen, but at least we
|
||||||
|
fail gracefully. */
|
||||||
|
switch (self->grouping[self->i]) {
|
||||||
|
case 0:
|
||||||
|
return self->previous;
|
||||||
|
case CHAR_MAX:
|
||||||
|
/* Stop the generator. */
|
||||||
|
return 0;
|
||||||
|
default: {
|
||||||
|
char ch = self->grouping[self->i];
|
||||||
|
self->previous = ch;
|
||||||
|
self->i++;
|
||||||
|
return (Py_ssize_t)ch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fill in some digits, leading zeros, and thousands separator. All
|
||||||
|
are optional, depending on when we're called. */
|
||||||
|
static void
|
||||||
|
fill(STRINGLIB_CHAR **digits_end, STRINGLIB_CHAR **buffer_end,
|
||||||
|
Py_ssize_t n_chars, Py_ssize_t n_zeros, const char* thousands_sep,
|
||||||
|
Py_ssize_t thousands_sep_len)
|
||||||
|
{
|
||||||
|
#if STRINGLIB_IS_UNICODE
|
||||||
|
Py_ssize_t i;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (thousands_sep) {
|
||||||
|
*buffer_end -= thousands_sep_len;
|
||||||
|
|
||||||
|
/* Copy the thousands_sep chars into the buffer. */
|
||||||
|
#if STRINGLIB_IS_UNICODE
|
||||||
|
/* Convert from the char's of the thousands_sep from
|
||||||
|
the locale into unicode. */
|
||||||
|
for (i = 0; i < thousands_sep_len; ++i)
|
||||||
|
(*buffer_end)[i] = thousands_sep[i];
|
||||||
|
#else
|
||||||
|
/* No conversion, just memcpy the thousands_sep. */
|
||||||
|
memcpy(*buffer_end, thousands_sep, thousands_sep_len);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
*buffer_end -= n_chars;
|
||||||
|
*digits_end -= n_chars;
|
||||||
|
memcpy(*buffer_end, *digits_end, n_chars * sizeof(STRINGLIB_CHAR));
|
||||||
|
|
||||||
|
*buffer_end -= n_zeros;
|
||||||
|
STRINGLIB_FILL(*buffer_end, '0', n_zeros);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _Py_InsertThousandsGrouping:
|
||||||
|
* @buffer: A pointer to the start of a string.
|
||||||
|
* @n_buffer: Number of characters in @buffer.
|
||||||
|
* @digits: A pointer to the digits we're reading from. If count
|
||||||
|
* is non-NULL, this is unused.
|
||||||
|
* @n_digits: The number of digits in the string, in which we want
|
||||||
|
* to put the grouping chars.
|
||||||
|
* @min_width: The minimum width of the digits in the output string.
|
||||||
|
* Output will be zero-padded on the left to fill.
|
||||||
|
* @grouping: see definition in localeconv().
|
||||||
|
* @thousands_sep: see definition in localeconv().
|
||||||
|
*
|
||||||
|
* There are 2 modes: counting and filling. If @buffer is NULL,
|
||||||
|
* we are in counting mode, else filling mode.
|
||||||
|
* If counting, the required buffer size is returned.
|
||||||
|
* If filling, we know the buffer will be large enough, so we don't
|
||||||
|
* need to pass in the buffer size.
|
||||||
|
* Inserts thousand grouping characters (as defined by grouping and
|
||||||
|
* thousands_sep) into the string between buffer and buffer+n_digits.
|
||||||
|
*
|
||||||
|
* Return value: 0 on error, else 1. Note that no error can occur if
|
||||||
|
* count is non-NULL.
|
||||||
|
*
|
||||||
|
* This name won't be used, the includer of this file should define
|
||||||
|
* it to be the actual function name, based on unicode or string.
|
||||||
|
*
|
||||||
|
* As closely as possible, this code mimics the logic in decimal.py's
|
||||||
|
_insert_thousands_sep().
|
||||||
|
**/
|
||||||
|
Py_ssize_t
|
||||||
|
_Py_InsertThousandsGrouping(STRINGLIB_CHAR *buffer,
|
||||||
|
Py_ssize_t n_buffer,
|
||||||
|
STRINGLIB_CHAR *digits,
|
||||||
|
Py_ssize_t n_digits,
|
||||||
|
Py_ssize_t min_width,
|
||||||
|
const char *grouping,
|
||||||
|
const char *thousands_sep)
|
||||||
|
{
|
||||||
|
Py_ssize_t count = 0;
|
||||||
|
Py_ssize_t n_zeros;
|
||||||
|
int loop_broken = 0;
|
||||||
|
int use_separator = 0; /* First time through, don't append the
|
||||||
|
separator. They only go between
|
||||||
|
groups. */
|
||||||
|
STRINGLIB_CHAR *buffer_end = NULL;
|
||||||
|
STRINGLIB_CHAR *digits_end = NULL;
|
||||||
|
Py_ssize_t l;
|
||||||
|
Py_ssize_t n_chars;
|
||||||
|
Py_ssize_t thousands_sep_len = strlen(thousands_sep);
|
||||||
|
Py_ssize_t remaining = n_digits; /* Number of chars remaining to
|
||||||
|
be looked at */
|
||||||
|
/* A generator that returns all of the grouping widths, until it
|
||||||
|
returns 0. */
|
||||||
|
GroupGenerator groupgen;
|
||||||
|
_GroupGenerator_init(&groupgen, grouping);
|
||||||
|
|
||||||
|
if (buffer) {
|
||||||
|
buffer_end = buffer + n_buffer;
|
||||||
|
digits_end = digits + n_digits;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((l = _GroupGenerator_next(&groupgen)) > 0) {
|
||||||
|
l = MIN(l, MAX(MAX(remaining, min_width), 1));
|
||||||
|
n_zeros = MAX(0, l - remaining);
|
||||||
|
n_chars = MAX(0, MIN(remaining, l));
|
||||||
|
|
||||||
|
/* Use n_zero zero's and n_chars chars */
|
||||||
|
|
||||||
|
/* Count only, don't do anything. */
|
||||||
|
count += (use_separator ? thousands_sep_len : 0) + n_zeros + n_chars;
|
||||||
|
|
||||||
|
if (buffer) {
|
||||||
|
/* Copy into the output buffer. */
|
||||||
|
fill(&digits_end, &buffer_end, n_chars, n_zeros,
|
||||||
|
use_separator ? thousands_sep : NULL, thousands_sep_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Use a separator next time. */
|
||||||
|
use_separator = 1;
|
||||||
|
|
||||||
|
remaining -= n_chars;
|
||||||
|
min_width -= l;
|
||||||
|
|
||||||
|
if (remaining <= 0 && min_width <= 0) {
|
||||||
|
loop_broken = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
min_width -= thousands_sep_len;
|
||||||
|
}
|
||||||
|
if (!loop_broken) {
|
||||||
|
/* We left the loop without using a break statement. */
|
||||||
|
|
||||||
|
l = MAX(MAX(remaining, min_width), 1);
|
||||||
|
n_zeros = MAX(0, l - remaining);
|
||||||
|
n_chars = MAX(0, MIN(remaining, l));
|
||||||
|
|
||||||
|
/* Use n_zero zero's and n_chars chars */
|
||||||
|
count += (use_separator ? thousands_sep_len : 0) + n_zeros + n_chars;
|
||||||
|
if (buffer) {
|
||||||
|
/* Copy into the output buffer. */
|
||||||
|
fill(&digits_end, &buffer_end, n_chars, n_zeros,
|
||||||
|
use_separator ? thousands_sep : NULL, thousands_sep_len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _Py_InsertThousandsGroupingLocale:
|
||||||
|
* @buffer: A pointer to the start of a string.
|
||||||
|
* @n_digits: The number of digits in the string, in which we want
|
||||||
|
* to put the grouping chars.
|
||||||
|
*
|
||||||
|
* Reads thee current locale and calls _Py_InsertThousandsGrouping().
|
||||||
|
**/
|
||||||
|
Py_ssize_t
|
||||||
|
_Py_InsertThousandsGroupingLocale(STRINGLIB_CHAR *buffer,
|
||||||
|
Py_ssize_t n_buffer,
|
||||||
|
STRINGLIB_CHAR *digits,
|
||||||
|
Py_ssize_t n_digits,
|
||||||
|
Py_ssize_t min_width)
|
||||||
|
{
|
||||||
|
struct lconv *locale_data = localeconv();
|
||||||
|
const char *grouping = locale_data->grouping;
|
||||||
|
const char *thousands_sep = locale_data->thousands_sep;
|
||||||
|
|
||||||
|
return _Py_InsertThousandsGrouping(buffer, n_buffer, digits, n_digits,
|
||||||
|
min_width, grouping, thousands_sep);
|
||||||
|
}
|
||||||
|
#endif /* STRINGLIB_LOCALEUTIL_H */
|
@@ -0,0 +1,23 @@
|
|||||||
|
/* Return the copyright string. This is updated manually. */
|
||||||
|
|
||||||
|
#include "Python.h"
|
||||||
|
|
||||||
|
static char cprt[] =
|
||||||
|
"\
|
||||||
|
Copyright (c) 2001-2015 Python Software Foundation.\n\
|
||||||
|
All Rights Reserved.\n\
|
||||||
|
\n\
|
||||||
|
Copyright (c) 2000 BeOpen.com.\n\
|
||||||
|
All Rights Reserved.\n\
|
||||||
|
\n\
|
||||||
|
Copyright (c) 1995-2001 Corporation for National Research Initiatives.\n\
|
||||||
|
All Rights Reserved.\n\
|
||||||
|
\n\
|
||||||
|
Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.\n\
|
||||||
|
All Rights Reserved.";
|
||||||
|
|
||||||
|
const char *
|
||||||
|
Py_GetCopyright(void)
|
||||||
|
{
|
||||||
|
return cprt;
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,420 @@
|
|||||||
|
#include "Python.h"
|
||||||
|
#ifdef MS_WINDOWS
|
||||||
|
#include <windows.h>
|
||||||
|
#else
|
||||||
|
#include <fcntl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef Py_DEBUG
|
||||||
|
int _Py_HashSecret_Initialized = 0;
|
||||||
|
#else
|
||||||
|
static int _Py_HashSecret_Initialized = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MS_WINDOWS
|
||||||
|
typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\
|
||||||
|
LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\
|
||||||
|
DWORD dwFlags );
|
||||||
|
typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\
|
||||||
|
BYTE *pbBuffer );
|
||||||
|
|
||||||
|
static CRYPTGENRANDOM pCryptGenRandom = NULL;
|
||||||
|
/* This handle is never explicitly released. Instead, the operating
|
||||||
|
system will release it when the process terminates. */
|
||||||
|
static HCRYPTPROV hCryptProv = 0;
|
||||||
|
|
||||||
|
static int
|
||||||
|
win32_urandom_init(int raise)
|
||||||
|
{
|
||||||
|
HINSTANCE hAdvAPI32 = NULL;
|
||||||
|
CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL;
|
||||||
|
|
||||||
|
/* Obtain handle to the DLL containing CryptoAPI. This should not fail. */
|
||||||
|
hAdvAPI32 = GetModuleHandle("advapi32.dll");
|
||||||
|
if(hAdvAPI32 == NULL)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
/* Obtain pointers to the CryptoAPI functions. This will fail on some early
|
||||||
|
versions of Win95. */
|
||||||
|
pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress(
|
||||||
|
hAdvAPI32, "CryptAcquireContextA");
|
||||||
|
if (pCryptAcquireContext == NULL)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress(hAdvAPI32,
|
||||||
|
"CryptGenRandom");
|
||||||
|
if (pCryptGenRandom == NULL)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
/* Acquire context */
|
||||||
|
if (! pCryptAcquireContext(&hCryptProv, NULL, NULL,
|
||||||
|
PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
if (raise)
|
||||||
|
PyErr_SetFromWindowsErr(0);
|
||||||
|
else
|
||||||
|
Py_FatalError("Failed to initialize Windows random API (CryptoGen)");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fill buffer with size pseudo-random bytes generated by the Windows CryptoGen
|
||||||
|
API. Return 0 on success, or -1 on error. */
|
||||||
|
static int
|
||||||
|
win32_urandom(unsigned char *buffer, Py_ssize_t size, int raise)
|
||||||
|
{
|
||||||
|
Py_ssize_t chunk;
|
||||||
|
|
||||||
|
if (hCryptProv == 0)
|
||||||
|
{
|
||||||
|
if (win32_urandom_init(raise) == -1)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (size > 0)
|
||||||
|
{
|
||||||
|
chunk = size > INT_MAX ? INT_MAX : size;
|
||||||
|
if (!pCryptGenRandom(hCryptProv, chunk, buffer))
|
||||||
|
{
|
||||||
|
/* CryptGenRandom() failed */
|
||||||
|
if (raise)
|
||||||
|
PyErr_SetFromWindowsErr(0);
|
||||||
|
else
|
||||||
|
Py_FatalError("Failed to initialized the randomized hash "
|
||||||
|
"secret using CryptoGen)");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
buffer += chunk;
|
||||||
|
size -= chunk;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif HAVE_GETENTROPY
|
||||||
|
/* Fill buffer with size pseudo-random bytes generated by getentropy().
|
||||||
|
Return 0 on success, or raise an exception and return -1 on error.
|
||||||
|
If fatal is nonzero, call Py_FatalError() instead of raising an exception
|
||||||
|
on error. */
|
||||||
|
static int
|
||||||
|
py_getentropy(unsigned char *buffer, Py_ssize_t size, int fatal)
|
||||||
|
{
|
||||||
|
while (size > 0) {
|
||||||
|
Py_ssize_t len = size < 256 ? size : 256;
|
||||||
|
int res;
|
||||||
|
|
||||||
|
if (!fatal) {
|
||||||
|
Py_BEGIN_ALLOW_THREADS
|
||||||
|
res = getentropy(buffer, len);
|
||||||
|
Py_END_ALLOW_THREADS
|
||||||
|
|
||||||
|
if (res < 0) {
|
||||||
|
PyErr_SetFromErrno(PyExc_OSError);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
res = getentropy(buffer, len);
|
||||||
|
if (res < 0)
|
||||||
|
Py_FatalError("getentropy() failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer += len;
|
||||||
|
size -= len;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __VMS
|
||||||
|
/* Use openssl random routine */
|
||||||
|
#include <openssl/rand.h>
|
||||||
|
static int
|
||||||
|
vms_urandom(unsigned char *buffer, Py_ssize_t size, int raise)
|
||||||
|
{
|
||||||
|
if (RAND_pseudo_bytes(buffer, size) < 0) {
|
||||||
|
if (raise) {
|
||||||
|
PyErr_Format(PyExc_ValueError,
|
||||||
|
"RAND_pseudo_bytes");
|
||||||
|
} else {
|
||||||
|
Py_FatalError("Failed to initialize the randomized hash "
|
||||||
|
"secret using RAND_pseudo_bytes");
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif /* __VMS */
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(MS_WINDOWS) && !defined(__VMS)
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
int fd;
|
||||||
|
dev_t st_dev;
|
||||||
|
ino_t st_ino;
|
||||||
|
} urandom_cache = { -1 };
|
||||||
|
|
||||||
|
/* Read size bytes from /dev/urandom into buffer.
|
||||||
|
Call Py_FatalError() on error. */
|
||||||
|
static void
|
||||||
|
dev_urandom_noraise(unsigned char *buffer, Py_ssize_t size)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
Py_ssize_t n;
|
||||||
|
|
||||||
|
assert (0 < size);
|
||||||
|
|
||||||
|
fd = open("/dev/urandom", O_RDONLY);
|
||||||
|
if (fd < 0)
|
||||||
|
Py_FatalError("Failed to open /dev/urandom");
|
||||||
|
|
||||||
|
while (0 < size)
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
n = read(fd, buffer, (size_t)size);
|
||||||
|
} while (n < 0 && errno == EINTR);
|
||||||
|
if (n <= 0)
|
||||||
|
{
|
||||||
|
/* stop on error or if read(size) returned 0 */
|
||||||
|
Py_FatalError("Failed to read bytes from /dev/urandom");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
buffer += n;
|
||||||
|
size -= (Py_ssize_t)n;
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read size bytes from /dev/urandom into buffer.
|
||||||
|
Return 0 on success, raise an exception and return -1 on error. */
|
||||||
|
static int
|
||||||
|
dev_urandom_python(char *buffer, Py_ssize_t size)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
Py_ssize_t n;
|
||||||
|
struct stat st;
|
||||||
|
int attr;
|
||||||
|
|
||||||
|
if (size <= 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (urandom_cache.fd >= 0) {
|
||||||
|
/* Does the fd point to the same thing as before? (issue #21207) */
|
||||||
|
if (fstat(urandom_cache.fd, &st)
|
||||||
|
|| st.st_dev != urandom_cache.st_dev
|
||||||
|
|| st.st_ino != urandom_cache.st_ino) {
|
||||||
|
/* Something changed: forget the cached fd (but don't close it,
|
||||||
|
since it probably points to something important for some
|
||||||
|
third-party code). */
|
||||||
|
urandom_cache.fd = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (urandom_cache.fd >= 0)
|
||||||
|
fd = urandom_cache.fd;
|
||||||
|
else {
|
||||||
|
Py_BEGIN_ALLOW_THREADS
|
||||||
|
fd = open("/dev/urandom", O_RDONLY);
|
||||||
|
Py_END_ALLOW_THREADS
|
||||||
|
if (fd < 0)
|
||||||
|
{
|
||||||
|
if (errno == ENOENT || errno == ENXIO ||
|
||||||
|
errno == ENODEV || errno == EACCES)
|
||||||
|
PyErr_SetString(PyExc_NotImplementedError,
|
||||||
|
"/dev/urandom (or equivalent) not found");
|
||||||
|
else
|
||||||
|
PyErr_SetFromErrno(PyExc_OSError);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* try to make the file descriptor non-inheritable, ignore errors */
|
||||||
|
attr = fcntl(fd, F_GETFD);
|
||||||
|
if (attr >= 0) {
|
||||||
|
attr |= FD_CLOEXEC;
|
||||||
|
(void)fcntl(fd, F_SETFD, attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (urandom_cache.fd >= 0) {
|
||||||
|
/* urandom_fd was initialized by another thread while we were
|
||||||
|
not holding the GIL, keep it. */
|
||||||
|
close(fd);
|
||||||
|
fd = urandom_cache.fd;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (fstat(fd, &st)) {
|
||||||
|
PyErr_SetFromErrno(PyExc_OSError);
|
||||||
|
close(fd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
urandom_cache.fd = fd;
|
||||||
|
urandom_cache.st_dev = st.st_dev;
|
||||||
|
urandom_cache.st_ino = st.st_ino;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Py_BEGIN_ALLOW_THREADS
|
||||||
|
do {
|
||||||
|
do {
|
||||||
|
n = read(fd, buffer, (size_t)size);
|
||||||
|
} while (n < 0 && errno == EINTR);
|
||||||
|
if (n <= 0)
|
||||||
|
break;
|
||||||
|
buffer += n;
|
||||||
|
size -= (Py_ssize_t)n;
|
||||||
|
} while (0 < size);
|
||||||
|
Py_END_ALLOW_THREADS
|
||||||
|
|
||||||
|
if (n <= 0)
|
||||||
|
{
|
||||||
|
/* stop on error or if read(size) returned 0 */
|
||||||
|
if (n < 0)
|
||||||
|
PyErr_SetFromErrno(PyExc_OSError);
|
||||||
|
else
|
||||||
|
PyErr_Format(PyExc_RuntimeError,
|
||||||
|
"Failed to read %zi bytes from /dev/urandom",
|
||||||
|
size);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dev_urandom_close(void)
|
||||||
|
{
|
||||||
|
if (urandom_cache.fd >= 0) {
|
||||||
|
close(urandom_cache.fd);
|
||||||
|
urandom_cache.fd = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* !defined(MS_WINDOWS) && !defined(__VMS) */
|
||||||
|
|
||||||
|
/* Fill buffer with pseudo-random bytes generated by a linear congruent
|
||||||
|
generator (LCG):
|
||||||
|
|
||||||
|
x(n+1) = (x(n) * 214013 + 2531011) % 2^32
|
||||||
|
|
||||||
|
Use bits 23..16 of x(n) to generate a byte. */
|
||||||
|
static void
|
||||||
|
lcg_urandom(unsigned int x0, unsigned char *buffer, size_t size)
|
||||||
|
{
|
||||||
|
size_t index;
|
||||||
|
unsigned int x;
|
||||||
|
|
||||||
|
x = x0;
|
||||||
|
for (index=0; index < size; index++) {
|
||||||
|
x *= 214013;
|
||||||
|
x += 2531011;
|
||||||
|
/* modulo 2 ^ (8 * sizeof(int)) */
|
||||||
|
buffer[index] = (x >> 16) & 0xff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fill buffer with size pseudo-random bytes from the operating system random
|
||||||
|
number generator (RNG). It is suitable for most cryptographic purposes
|
||||||
|
except long living private keys for asymmetric encryption.
|
||||||
|
|
||||||
|
Return 0 on success, raise an exception and return -1 on error. */
|
||||||
|
int
|
||||||
|
_PyOS_URandom(void *buffer, Py_ssize_t size)
|
||||||
|
{
|
||||||
|
if (size < 0) {
|
||||||
|
PyErr_Format(PyExc_ValueError,
|
||||||
|
"negative argument not allowed");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (size == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
#ifdef MS_WINDOWS
|
||||||
|
return win32_urandom((unsigned char *)buffer, size, 1);
|
||||||
|
#elif HAVE_GETENTROPY
|
||||||
|
return py_getentropy(buffer, size, 0);
|
||||||
|
#else
|
||||||
|
# ifdef __VMS
|
||||||
|
return vms_urandom((unsigned char *)buffer, size, 1);
|
||||||
|
# else
|
||||||
|
return dev_urandom_python((char*)buffer, size);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_PyRandom_Init(void)
|
||||||
|
{
|
||||||
|
char *env;
|
||||||
|
void *secret = &_Py_HashSecret;
|
||||||
|
Py_ssize_t secret_size = sizeof(_Py_HashSecret_t);
|
||||||
|
|
||||||
|
if (_Py_HashSecret_Initialized)
|
||||||
|
return;
|
||||||
|
_Py_HashSecret_Initialized = 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
By default, hash randomization is disabled, and only
|
||||||
|
enabled if PYTHONHASHSEED is set to non-empty or if
|
||||||
|
"-R" is provided at the command line:
|
||||||
|
*/
|
||||||
|
if (!Py_HashRandomizationFlag) {
|
||||||
|
/* Disable the randomized hash: */
|
||||||
|
memset(secret, 0, secret_size);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Hash randomization is enabled. Generate a per-process secret,
|
||||||
|
using PYTHONHASHSEED if provided.
|
||||||
|
*/
|
||||||
|
|
||||||
|
env = Py_GETENV("PYTHONHASHSEED");
|
||||||
|
if (env && *env != '\0' && strcmp(env, "random") != 0) {
|
||||||
|
char *endptr = env;
|
||||||
|
unsigned long seed;
|
||||||
|
seed = strtoul(env, &endptr, 10);
|
||||||
|
if (*endptr != '\0'
|
||||||
|
|| seed > 4294967295UL
|
||||||
|
|| (errno == ERANGE && seed == ULONG_MAX))
|
||||||
|
{
|
||||||
|
Py_FatalError("PYTHONHASHSEED must be \"random\" or an integer "
|
||||||
|
"in range [0; 4294967295]");
|
||||||
|
}
|
||||||
|
if (seed == 0) {
|
||||||
|
/* disable the randomized hash */
|
||||||
|
memset(secret, 0, secret_size);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lcg_urandom(seed, (unsigned char*)secret, secret_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
#ifdef MS_WINDOWS
|
||||||
|
(void)win32_urandom((unsigned char *)secret, secret_size, 0);
|
||||||
|
#elif __VMS
|
||||||
|
vms_urandom((unsigned char *)secret, secret_size, 0);
|
||||||
|
#elif HAVE_GETENTROPY
|
||||||
|
(void)py_getentropy(secret, secret_size, 1);
|
||||||
|
#else
|
||||||
|
dev_urandom_noraise(secret, secret_size);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_PyRandom_Fini(void)
|
||||||
|
{
|
||||||
|
#ifdef MS_WINDOWS
|
||||||
|
if (hCryptProv) {
|
||||||
|
CryptReleaseContext(hCryptProv, 0);
|
||||||
|
hCryptProv = 0;
|
||||||
|
}
|
||||||
|
#elif HAVE_GETENTROPY
|
||||||
|
/* nothing to clean */
|
||||||
|
#else
|
||||||
|
dev_urandom_close();
|
||||||
|
#endif
|
||||||
|
}
|
255
AppPkg/Applications/Python/Python-2.7.10/Python2710.inf
Normal file
255
AppPkg/Applications/Python/Python-2.7.10/Python2710.inf
Normal file
@@ -0,0 +1,255 @@
|
|||||||
|
## @file
|
||||||
|
# PythonCore.inf
|
||||||
|
#
|
||||||
|
# Copyright (c) 2015, Daryl McDaniel. All rights reserved.<BR>
|
||||||
|
# Copyright (c) 2011-2012, Intel Corporation. All rights reserved.<BR>
|
||||||
|
# This program and the accompanying materials
|
||||||
|
# are licensed and made available under the terms and conditions of the BSD License
|
||||||
|
# which accompanies this distribution. The full text of the license may be found at
|
||||||
|
# http://opensource.org/licenses/bsd-license.
|
||||||
|
#
|
||||||
|
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
#
|
||||||
|
##
|
||||||
|
|
||||||
|
[Defines]
|
||||||
|
INF_VERSION = 0x00010016
|
||||||
|
BASE_NAME = Python
|
||||||
|
FILE_GUID = ca5627c4-51ba-4dcb-ac62-c076ebd37ddb
|
||||||
|
MODULE_TYPE = UEFI_APPLICATION
|
||||||
|
VERSION_STRING = 0.8
|
||||||
|
ENTRY_POINT = ShellCEntryLib
|
||||||
|
|
||||||
|
DEFINE PYTHON_VERSION = 2.7.2
|
||||||
|
|
||||||
|
#
|
||||||
|
# VALID_ARCHITECTURES = IA32 X64 IPF
|
||||||
|
#
|
||||||
|
|
||||||
|
[Packages]
|
||||||
|
StdLib/StdLib.dec
|
||||||
|
MdePkg/MdePkg.dec
|
||||||
|
|
||||||
|
[LibraryClasses]
|
||||||
|
UefiLib
|
||||||
|
DebugLib
|
||||||
|
LibC
|
||||||
|
LibString
|
||||||
|
LibStdio
|
||||||
|
LibGdtoa
|
||||||
|
LibMath
|
||||||
|
LibWchar
|
||||||
|
LibGen
|
||||||
|
LibNetUtil
|
||||||
|
DevMedia
|
||||||
|
#
|
||||||
|
# Comment out the following two library classes if socket support is
|
||||||
|
# NOT being built in to Python.
|
||||||
|
#BsdSocketLib
|
||||||
|
#EfiSocketLib
|
||||||
|
|
||||||
|
[FixedPcd]
|
||||||
|
gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x0F
|
||||||
|
gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000040
|
||||||
|
|
||||||
|
[Sources]
|
||||||
|
#EFI -- EFI specific code
|
||||||
|
Efi/config.c
|
||||||
|
Efi/edk2module.c
|
||||||
|
Efi/getpath.c
|
||||||
|
|
||||||
|
#Parser
|
||||||
|
Python-$(PYTHON_VERSION)/Parser/acceler.c
|
||||||
|
Python-$(PYTHON_VERSION)/Parser/bitset.c
|
||||||
|
Python-$(PYTHON_VERSION)/Parser/firstsets.c
|
||||||
|
Python-$(PYTHON_VERSION)/Parser/grammar.c
|
||||||
|
Python-$(PYTHON_VERSION)/Parser/grammar1.c
|
||||||
|
Python-$(PYTHON_VERSION)/Parser/listnode.c
|
||||||
|
Python-$(PYTHON_VERSION)/Parser/metagrammar.c
|
||||||
|
Python-$(PYTHON_VERSION)/Parser/myreadline.c
|
||||||
|
Python-$(PYTHON_VERSION)/Parser/node.c
|
||||||
|
Python-$(PYTHON_VERSION)/Parser/parser.c
|
||||||
|
Python-$(PYTHON_VERSION)/Parser/parsetok.c
|
||||||
|
Python-$(PYTHON_VERSION)/Parser/tokenizer.c
|
||||||
|
|
||||||
|
#Python
|
||||||
|
PyMod-$(PYTHON_VERSION)/Python/getcopyright.c
|
||||||
|
PyMod-$(PYTHON_VERSION)/Python/marshal.c
|
||||||
|
PyMod-$(PYTHON_VERSION)/Python/import.c
|
||||||
|
|
||||||
|
Python-$(PYTHON_VERSION)/Python/_warnings.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/Python-ast.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/asdl.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/ast.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/bltinmodule.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/ceval.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/codecs.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/compile.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/dtoa.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/dynload_stub.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/errors.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/formatter_string.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/formatter_unicode.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/frozen.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/future.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/getargs.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/getcompiler.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/getopt.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/getplatform.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/getversion.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/graminit.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/importdl.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/modsupport.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/mysnprintf.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/mystrtoul.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/peephole.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/pyarena.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/pyctype.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/pyfpe.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/pymath.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/pystate.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/pystrcmp.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/pystrtod.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/pythonrun.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/structmember.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/symtable.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/sysmodule.c
|
||||||
|
Python-$(PYTHON_VERSION)/Python/traceback.c
|
||||||
|
|
||||||
|
#Objects
|
||||||
|
PyMod-$(PYTHON_VERSION)/Objects/longobject.c
|
||||||
|
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/abstract.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/boolobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/bufferobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/bytearrayobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/bytes_methods.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/capsule.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/cellobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/classobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/cobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/codeobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/complexobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/descrobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/dictobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/enumobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/exceptions.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/fileobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/floatobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/frameobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/funcobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/genobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/intobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/iterobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/listobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/memoryobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/methodobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/moduleobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/object.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/obmalloc.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/rangeobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/setobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/sliceobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/stringobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/structseq.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/tupleobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/typeobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/unicodectype.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/unicodeobject.c
|
||||||
|
Python-$(PYTHON_VERSION)/Objects/weakrefobject.c
|
||||||
|
|
||||||
|
#Modules -- See Efi/config.c
|
||||||
|
# Mandatory Modules -- These must always be built in.
|
||||||
|
PyMod-$(PYTHON_VERSION)/Modules/errnomodule.c
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_functoolsmodule.c
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/gcmodule.c
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/getbuildinfo.c
|
||||||
|
PyMod-$(PYTHON_VERSION)/Modules/main.c
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/python.c
|
||||||
|
|
||||||
|
# Optional Modules -- See Python/Efi/config.c
|
||||||
|
PyMod-$(PYTHON_VERSION)/Modules/_sre.c #
|
||||||
|
PyMod-$(PYTHON_VERSION)/Modules/selectmodule.c #
|
||||||
|
#
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_bisectmodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_codecsmodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_collectionsmodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_csv.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_heapqmodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_json.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_localemodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_math.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_randommodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_struct.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_weakref.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/arraymodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/binascii.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/cmathmodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/cPickle.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/cStringIO.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/datetimemodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/future_builtins.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/itertoolsmodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/mathmodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/md5.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/md5module.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/operator.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/parsermodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/sha256module.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/sha512module.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/shamodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/signalmodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/socketmodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/stropmodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/symtablemodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/timemodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/unicodedata.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/xxsubtype.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/zipimport.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/zlibmodule.c #
|
||||||
|
|
||||||
|
#Modules/_io
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_io/_iomodule.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_io/bufferedio.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_io/bytesio.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_io/fileio.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_io/iobase.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_io/stringio.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/_io/textio.c #
|
||||||
|
|
||||||
|
#Modules/cjkcodecs
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/cjkcodecs/multibytecodec.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/cjkcodecs/_codecs_cn.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/cjkcodecs/_codecs_hk.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/cjkcodecs/_codecs_iso2022.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/cjkcodecs/_codecs_jp.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/cjkcodecs/_codecs_kr.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/cjkcodecs/_codecs_tw.c #
|
||||||
|
|
||||||
|
#Modules/expat
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/pyexpat.c #
|
||||||
|
PyMod-$(PYTHON_VERSION)/Modules/expat/xmlparse.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/expat/xmlrole.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/expat/xmltok.c #
|
||||||
|
|
||||||
|
#Modules/zlib
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/zlib/adler32.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/zlib/compress.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/zlib/crc32.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/zlib/deflate.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/zlib/gzio.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/zlib/infback.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/zlib/inffast.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/zlib/inflate.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/zlib/inftrees.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/zlib/trees.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/zlib/uncompr.c #
|
||||||
|
Python-$(PYTHON_VERSION)/Modules/zlib/zutil.c #
|
||||||
|
|
||||||
|
[BuildOptions]
|
||||||
|
MSFT:*_*_IA32_CC_FLAGS = /Oi- /wd4018 /wd4054 /wd4055 /wd4101 /wd4131 /wd4152 /wd4204 /wd4210 /wd4244 /wd4267 /wd4305 /wd4310 /wd4389 /wd4701 /wd4702 /wd4706 /I$(WORKSPACE)\AppPkg\Applications\Python\Ia32 /I$(WORKSPACE)\AppPkg\Applications\Python\Efi /I$(WORKSPACE)\AppPkg\Applications\Python\Python-$(PYTHON_VERSION)\Include /DHAVE_MEMMOVE /DUSE_PYEXPAT_CAPI /DXML_STATIC
|
||||||
|
MSFT:*_*_X64_CC_FLAGS = /Oi- /wd4018 /wd4054 /wd4055 /wd4101 /wd4131 /wd4152 /wd4204 /wd4210 /wd4244 /wd4267 /wd4305 /wd4310 /wd4389 /wd4701 /wd4702 /wd4706 /I$(WORKSPACE)\AppPkg\Applications\Python\X64 /I$(WORKSPACE)\AppPkg\Applications\Python\Efi /I$(WORKSPACE)\AppPkg\Applications\Python\Python-$(PYTHON_VERSION)\Include /DHAVE_MEMMOVE /DUSE_PYEXPAT_CAPI /DXML_STATIC
|
||||||
|
GCC:*_*_IA32_CC_FLAGS = -fno-builtin -Wno-format -I$(WORKSPACE)/AppPkg/Applications/Python/Ia32 -I$(WORKSPACE)/AppPkg/Applications/Python/Python-$(PYTHON_VERSION)/Include -DHAVE_MEMMOVE -DUSE_PYEXPAT_CAPI -DXML_STATIC
|
||||||
|
GCC:*_*_X64_CC_FLAGS = -Wno-format -I$(WORKSPACE)/AppPkg/Applications/Python/X64 -I$(WORKSPACE)/AppPkg/Applications/Python/Python-$(PYTHON_VERSION)/Include -DHAVE_MEMMOVE -DUSE_PYEXPAT_CAPI -DXML_STATIC
|
||||||
|
GCC:*_*_IPF_SYMRENAME_FLAGS = --redefine-syms=$(WORKSPACE)/StdLib/GccSymRename.txt
|
1266
AppPkg/Applications/Python/Python-2.7.10/X64/pyconfig.h
Normal file
1266
AppPkg/Applications/Python/Python-2.7.10/X64/pyconfig.h
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user