mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-01 12:03:41 +00:00
b420ed8248
This change gets the Python codebase into a state where it conforms to the conventions of this codebase. It's now possible to include headers from Python, without worrying about ordering. Python has traditionally solved that problem by "diamonding" everything in Python.h, but that's problematic since it means any change to any Python header invalidates all the build artifacts. Lastly it makes tooling not work. Since it is hard to explain to Emacs when I press C-c C-h to add an import line it shouldn't add the header that actually defines the symbol, and instead do follow the nonstandard Python convention. Progress has been made on letting Python load source code from the zip executable structure via the standard C library APIs. System calss now recognizes zip!FILENAME alternative URIs as equivalent to zip:FILENAME since Python uses colon as its delimiter. Some progress has been made on embedding the notice license terms into the Python object code. This is easier said than done since Python has an extremely complicated ownership story. - Some termios APIs have been added - Implement rewinddir() dirstream API - GetCpuCount() API added to Cosmopolitan Libc - More bugs in Cosmopolitan Libc have been fixed - zipobj.com now has flags for mangling the path - Fixed bug a priori with sendfile() on certain BSDs - Polyfill F_DUPFD and F_DUPFD_CLOEXEC across platforms - FIOCLEX / FIONCLEX now polyfilled for fast O_CLOEXEC changes - APE now supports a hybrid solution to no-self-modify for builds - Many BSD-only magnums added, e.g. O_SEARCH, O_SHLOCK, SF_NODISKIO
197 lines
6.8 KiB
C
197 lines
6.8 KiB
C
#ifndef COSMOPOLITAN_THIRD_PARTY_PYTHON_MODULES__IO__IOMODULE_H_
|
|
#define COSMOPOLITAN_THIRD_PARTY_PYTHON_MODULES__IO__IOMODULE_H_
|
|
#include "libc/calls/weirdtypes.h"
|
|
#include "third_party/python/Include/moduleobject.h"
|
|
#include "third_party/python/Include/object.h"
|
|
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
|
COSMOPOLITAN_C_START_
|
|
/* clang-format off */
|
|
|
|
/* ABCs */
|
|
extern PyTypeObject PyIOBase_Type;
|
|
extern PyTypeObject PyRawIOBase_Type;
|
|
extern PyTypeObject PyBufferedIOBase_Type;
|
|
extern PyTypeObject PyTextIOBase_Type;
|
|
|
|
/* Concrete classes */
|
|
extern PyTypeObject PyFileIO_Type;
|
|
extern PyTypeObject PyBytesIO_Type;
|
|
extern PyTypeObject PyStringIO_Type;
|
|
extern PyTypeObject PyBufferedReader_Type;
|
|
extern PyTypeObject PyBufferedWriter_Type;
|
|
extern PyTypeObject PyBufferedRWPair_Type;
|
|
extern PyTypeObject PyBufferedRandom_Type;
|
|
extern PyTypeObject PyTextIOWrapper_Type;
|
|
extern PyTypeObject PyIncrementalNewlineDecoder_Type;
|
|
|
|
#ifndef Py_LIMITED_API
|
|
#ifdef MS_WINDOWS
|
|
extern PyTypeObject PyWindowsConsoleIO_Type;
|
|
extern PyObject * _PyWindowsConsoleIO_Type;
|
|
#define PyWindowsConsoleIO_Check(op) (PyObject_TypeCheck((op), (PyTypeObject*)_PyWindowsConsoleIO_Type))
|
|
#endif /* MS_WINDOWS */
|
|
#endif /* Py_LIMITED_API */
|
|
|
|
extern int _PyIO_ConvertSsize_t(PyObject *, void *);
|
|
|
|
/* These functions are used as METH_NOARGS methods, are normally called
|
|
* with args=NULL, and return a new reference.
|
|
* BUT when args=Py_True is passed, they return a borrowed reference.
|
|
*/
|
|
PyObject* _PyIOBase_check_readable(PyObject *, PyObject *);
|
|
PyObject* _PyIOBase_check_writable(PyObject *, PyObject *);
|
|
PyObject* _PyIOBase_check_seekable(PyObject *, PyObject *);
|
|
PyObject* _PyIOBase_check_closed(PyObject *, PyObject *);
|
|
|
|
/* Helper for finalization.
|
|
This function will revive an object ready to be deallocated and try to
|
|
close() it. It returns 0 if the object can be destroyed, or -1 if it
|
|
is alive again. */
|
|
extern int _PyIOBase_finalize(PyObject *self);
|
|
|
|
/* Returns true if the given FileIO object is closed.
|
|
Doesn't check the argument type, so be careful! */
|
|
extern int _PyFileIO_closed(PyObject *self);
|
|
|
|
/* Shortcut to the core of the IncrementalNewlineDecoder.decode method */
|
|
extern PyObject *_PyIncrementalNewlineDecoder_decode(
|
|
PyObject *self, PyObject *input, int final);
|
|
|
|
/* Finds the first line ending between `start` and `end`.
|
|
If found, returns the index after the line ending and doesn't touch
|
|
`*consumed`.
|
|
If not found, returns -1 and sets `*consumed` to the number of characters
|
|
which can be safely put aside until another search.
|
|
|
|
NOTE: for performance reasons, `end` must point to a NUL character ('\0').
|
|
Otherwise, the function will scan further and return garbage.
|
|
|
|
There are three modes, in order of priority:
|
|
* translated: Only find \n (assume newlines already translated)
|
|
* universal: Use universal newlines algorithm
|
|
* Otherwise, the line ending is specified by readnl, a str object */
|
|
extern Py_ssize_t _PyIO_find_line_ending(
|
|
int translated, int universal, PyObject *readnl,
|
|
int kind, const char *start, const char *end, Py_ssize_t *consumed);
|
|
|
|
/* Return 1 if an EnvironmentError with errno == EINTR is set (and then
|
|
clears the error indicator), 0 otherwise.
|
|
Should only be called when PyErr_Occurred() is true.
|
|
*/
|
|
extern int _PyIO_trap_eintr(void);
|
|
|
|
#define DEFAULT_BUFFER_SIZE (8 * 1024) /* bytes */
|
|
|
|
/*
|
|
* Offset type for positioning.
|
|
*/
|
|
|
|
/* Printing a variable of type off_t (with e.g., PyUnicode_FromFormat)
|
|
correctly and without producing compiler warnings is surprisingly painful.
|
|
We identify an integer type whose size matches off_t and then: (1) cast the
|
|
off_t to that integer type and (2) use the appropriate conversion
|
|
specification. The cast is necessary: gcc complains about formatting a
|
|
long with "%lld" even when both long and long long have the same
|
|
precision. */
|
|
|
|
#ifdef MS_WINDOWS
|
|
|
|
/* Windows uses long long for offsets */
|
|
typedef long long Py_off_t;
|
|
# define PyLong_AsOff_t PyLong_AsLongLong
|
|
# define PyLong_FromOff_t PyLong_FromLongLong
|
|
# define PY_OFF_T_MAX LLONG_MAX
|
|
# define PY_OFF_T_MIN LLONG_MIN
|
|
# define PY_OFF_T_COMPAT long long /* type compatible with off_t */
|
|
# define PY_PRIdOFF "lld" /* format to use for that type */
|
|
|
|
#else
|
|
|
|
/* Other platforms use off_t */
|
|
typedef off_t Py_off_t;
|
|
#if (SIZEOF_OFF_T == SIZEOF_SIZE_T)
|
|
# define PyLong_AsOff_t PyLong_AsSsize_t
|
|
# define PyLong_FromOff_t PyLong_FromSsize_t
|
|
# define PY_OFF_T_MAX PY_SSIZE_T_MAX
|
|
# define PY_OFF_T_MIN PY_SSIZE_T_MIN
|
|
# define PY_OFF_T_COMPAT Py_ssize_t
|
|
# define PY_PRIdOFF "zd"
|
|
#elif (SIZEOF_OFF_T == SIZEOF_LONG_LONG)
|
|
# define PyLong_AsOff_t PyLong_AsLongLong
|
|
# define PyLong_FromOff_t PyLong_FromLongLong
|
|
# define PY_OFF_T_MAX LLONG_MAX
|
|
# define PY_OFF_T_MIN LLONG_MIN
|
|
# define PY_OFF_T_COMPAT long long
|
|
# define PY_PRIdOFF "lld"
|
|
#elif (SIZEOF_OFF_T == SIZEOF_LONG)
|
|
# define PyLong_AsOff_t PyLong_AsLong
|
|
# define PyLong_FromOff_t PyLong_FromLong
|
|
# define PY_OFF_T_MAX LONG_MAX
|
|
# define PY_OFF_T_MIN LONG_MIN
|
|
# define PY_OFF_T_COMPAT long
|
|
# define PY_PRIdOFF "ld"
|
|
#else
|
|
# error off_t does not match either size_t, long, or long long!
|
|
#endif
|
|
|
|
#endif
|
|
|
|
extern Py_off_t PyNumber_AsOff_t(PyObject *item, PyObject *err);
|
|
|
|
/* Implementation details */
|
|
|
|
/* IO module structure */
|
|
|
|
extern PyModuleDef _PyIO_Module;
|
|
|
|
typedef struct {
|
|
int initialized;
|
|
PyObject *locale_module;
|
|
|
|
PyObject *unsupported_operation;
|
|
} _PyIO_State;
|
|
|
|
#define IO_MOD_STATE(mod) ((_PyIO_State *)PyModule_GetState(mod))
|
|
#define IO_STATE() _PyIO_get_module_state()
|
|
|
|
extern _PyIO_State *_PyIO_get_module_state(void);
|
|
extern PyObject *_PyIO_get_locale_module(_PyIO_State *);
|
|
|
|
#ifdef MS_WINDOWS
|
|
extern char _PyIO_get_console_type(PyObject *);
|
|
#endif
|
|
|
|
extern PyObject *_PyIO_str_close;
|
|
extern PyObject *_PyIO_str_closed;
|
|
extern PyObject *_PyIO_str_decode;
|
|
extern PyObject *_PyIO_str_encode;
|
|
extern PyObject *_PyIO_str_fileno;
|
|
extern PyObject *_PyIO_str_flush;
|
|
extern PyObject *_PyIO_str_getstate;
|
|
extern PyObject *_PyIO_str_isatty;
|
|
extern PyObject *_PyIO_str_newlines;
|
|
extern PyObject *_PyIO_str_nl;
|
|
extern PyObject *_PyIO_str_read;
|
|
extern PyObject *_PyIO_str_read1;
|
|
extern PyObject *_PyIO_str_readable;
|
|
extern PyObject *_PyIO_str_readall;
|
|
extern PyObject *_PyIO_str_readinto;
|
|
extern PyObject *_PyIO_str_readline;
|
|
extern PyObject *_PyIO_str_reset;
|
|
extern PyObject *_PyIO_str_seek;
|
|
extern PyObject *_PyIO_str_seekable;
|
|
extern PyObject *_PyIO_str_setstate;
|
|
extern PyObject *_PyIO_str_tell;
|
|
extern PyObject *_PyIO_str_truncate;
|
|
extern PyObject *_PyIO_str_writable;
|
|
extern PyObject *_PyIO_str_write;
|
|
|
|
extern PyObject *_PyIO_empty_str;
|
|
extern PyObject *_PyIO_empty_bytes;
|
|
extern PyObject *_PyIO_zero;
|
|
|
|
extern PyTypeObject _PyBytesIOBuffer_Type;
|
|
|
|
COSMOPOLITAN_C_END_
|
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
|
#endif /* COSMOPOLITAN_THIRD_PARTY_PYTHON_MODULES__IO__IOMODULE_H_ */
|