14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* System module */
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmVarious bits of information used by the interpreter are collected in
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmodule 'sys'.
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmFunction member:
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- exit(sts): raise SystemExit
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmData members:
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- stdin, stdout, stderr: standard file objects
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- modules: the table of modules (dictionary)
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- path: module search path (list of strings)
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- argv: script arguments (list of strings)
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- ps1, ps2: optional primary and secondary prompts (strings)
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "Python.h"
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "structseq.h"
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "code.h"
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "frameobject.h"
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "eval.h"
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "osdefs.h"
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define WIN32_LEAN_AND_MEAN
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "windows.h"
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* MS_WINDOWS */
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_COREDLL
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern void *PyWin_DLLhModule;
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* A string loaded from the DLL at startup: */
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern const char *PyWin_DLLVersionString;
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __VMS
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <unixlib.h>
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <windows.h>
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LANGINFO_H
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <locale.h>
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <langinfo.h>
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_GetObject(char *name)
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThreadState *tstate = PyThreadState_GET();
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *sd = tstate->interp->sysdict;
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (sd == NULL)
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyDict_GetItemString(sd, name);
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmFILE *
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_GetFile(char *name, FILE *def)
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    FILE *fp = NULL;
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v = PySys_GetObject(name);
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v != NULL && PyFile_Check(v))
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fp = PyFile_AsFile(v);
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (fp == NULL)
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        fp = def;
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return fp;
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_SetObject(char *name, PyObject *v)
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThreadState *tstate = PyThreadState_GET();
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *sd = tstate->interp->sysdict;
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v == NULL) {
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyDict_GetItemString(sd, name) == NULL)
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return PyDict_DelItemString(sd, name);
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyDict_SetItemString(sd, name, v);
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_displayhook(PyObject *self, PyObject *o)
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *outf;
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyInterpreterState *interp = PyThreadState_GET()->interp;
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *modules = interp->modules;
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *builtins = PyDict_GetItemString(modules, "__builtin__");
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (builtins == NULL) {
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_RuntimeError, "lost __builtin__");
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Print value except if None */
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* After printing, also assign to '_' */
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Before, set '_' to None to avoid recursion */
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (o == Py_None) {
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(Py_None);
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Py_None;
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyObject_SetAttrString(builtins, "_", Py_None) != 0)
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (Py_FlushLine() != 0)
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    outf = PySys_GetObject("stdout");
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (outf == NULL) {
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyFile_WriteObject(o, outf, 0) != 0)
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyFile_SoftSpace(outf, 1);
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (Py_FlushLine() != 0)
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyObject_SetAttrString(builtins, "_", o) != 0)
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(displayhook_doc,
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"displayhook(object) -> None\n"
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"\n"
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Print an object to sys.stdout and also save it in __builtin__._\n"
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_excepthook(PyObject* self, PyObject* args)
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *exc, *value, *tb;
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_UnpackTuple(args, "excepthook", 3, 3, &exc, &value, &tb))
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_Display(exc, value, tb);
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(excepthook_doc,
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"excepthook(exctype, value, traceback) -> None\n"
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"\n"
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Handle an exception by displaying it with a traceback on sys.stderr.\n"
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_exc_info(PyObject *self, PyObject *noargs)
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThreadState *tstate;
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tstate = PyThreadState_GET();
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_BuildValue(
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        "(OOO)",
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tstate->exc_type != NULL ? tstate->exc_type : Py_None,
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tstate->exc_value != NULL ? tstate->exc_value : Py_None,
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tstate->exc_traceback != NULL ?
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            tstate->exc_traceback : Py_None);
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(exc_info_doc,
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"exc_info() -> (type, value, traceback)\n\
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn information about the most recent exception caught by an except\n\
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclause in the current stack frame or in an older stack frame."
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_exc_clear(PyObject *self, PyObject *noargs)
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThreadState *tstate;
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *tmp_type, *tmp_value, *tmp_tb;
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyErr_WarnPy3k("sys.exc_clear() not supported in 3.x; "
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       "use except clauses", 1) < 0)
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tstate = PyThreadState_GET();
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tmp_type = tstate->exc_type;
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tmp_value = tstate->exc_value;
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tmp_tb = tstate->exc_traceback;
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tstate->exc_type = NULL;
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tstate->exc_value = NULL;
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tstate->exc_traceback = NULL;
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(tmp_type);
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(tmp_value);
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(tmp_tb);
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* For b/w compatibility */
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PySys_SetObject("exc_type", Py_None);
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PySys_SetObject("exc_value", Py_None);
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PySys_SetObject("exc_traceback", Py_None);
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(exc_clear_doc,
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"exc_clear() -> None\n\
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmClear global information on the current exception.  Subsequent calls to\n\
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexc_info() will return (None,None,None) until another exception is raised\n\
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmin the current thread or the execution stack returns to a frame where\n\
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmanother exception is being handled."
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_exit(PyObject *self, PyObject *args)
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *exit_code = 0;
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Raise SystemExit so callers may catch it or clean up. */
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetObject(PyExc_SystemExit, exit_code);
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(exit_doc,
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"exit([status])\n\
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmExit the interpreter by raising SystemExit(status).\n\
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf the status is omitted or None, it defaults to zero (i.e., success).\n\
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf the status is numeric, it will be used as the system exit status.\n\
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf it is another kind of object, it will be printed and the system\n\
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexit status will be one (i.e., failure)."
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getdefaultencoding(PyObject *self)
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyString_FromString(PyUnicode_GetDefaultEncoding());
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getdefaultencoding_doc,
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getdefaultencoding() -> string\n\
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the current default string encoding used by the Unicode \n\
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimplementation."
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_setdefaultencoding(PyObject *self, PyObject *args)
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *encoding;
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "s:setdefaultencoding", &encoding))
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyUnicode_SetDefaultEncoding(encoding))
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(setdefaultencoding_doc,
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"setdefaultencoding(encoding)\n\
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet the current default string encoding used by the Unicode implementation."
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getfilesystemencoding(PyObject *self)
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (Py_FileSystemDefaultEncoding)
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyString_FromString(Py_FileSystemDefaultEncoding);
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getfilesystemencoding_doc,
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getfilesystemencoding() -> string\n\
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the encoding used to convert Unicode filenames in\n\
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmoperating system filenames."
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Cached interned string objects used for calling the profile and
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * trace functions.  Initialized by trace_init().
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *whatstrings[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL};
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtrace_init(void)
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    static char *whatnames[7] = {"call", "exception", "line", "return",
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                    "c_call", "c_exception", "c_return"};
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *name;
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < 7; ++i) {
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (whatstrings[i] == NULL) {
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            name = PyString_InternFromString(whatnames[i]);
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (name == NULL)
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return -1;
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            whatstrings[i] = name;
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcall_trampoline(PyThreadState *tstate, PyObject* callback,
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyFrameObject *frame, int what, PyObject *arg)
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *args = PyTuple_New(3);
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *whatstr;
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *result;
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (args == NULL)
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(frame);
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    whatstr = whatstrings[what];
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(whatstr);
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (arg == NULL)
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        arg = Py_None;
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(arg);
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyTuple_SET_ITEM(args, 0, (PyObject *)frame);
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyTuple_SET_ITEM(args, 1, whatstr);
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyTuple_SET_ITEM(args, 2, arg);
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* call the Python-level function */
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyFrame_FastToLocals(frame);
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = PyEval_CallObject(callback, args);
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyFrame_LocalsToFast(frame, 1);
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result == NULL)
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyTraceBack_Here(frame);
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* cleanup */
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(args);
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmprofile_trampoline(PyObject *self, PyFrameObject *frame,
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   int what, PyObject *arg)
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThreadState *tstate = frame->f_tstate;
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *result;
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (arg == NULL)
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        arg = Py_None;
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = call_trampoline(tstate, self, frame, what, arg);
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result == NULL) {
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyEval_SetProfile(NULL, NULL);
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(result);
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtrace_trampoline(PyObject *self, PyFrameObject *frame,
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 int what, PyObject *arg)
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThreadState *tstate = frame->f_tstate;
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *callback;
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *result;
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (what == PyTrace_CALL)
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        callback = self;
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        callback = frame->f_trace;
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (callback == NULL)
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 0;
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = call_trampoline(tstate, callback, frame, what, arg);
3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result == NULL) {
3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyEval_SetTrace(NULL, NULL);
3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_XDECREF(frame->f_trace);
3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        frame->f_trace = NULL;
3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return -1;
3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (result != Py_None) {
3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *temp = frame->f_trace;
3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        frame->f_trace = NULL;
3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_XDECREF(temp);
3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        frame->f_trace = result;
3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(result);
3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_settrace(PyObject *self, PyObject *args)
3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (trace_init() == -1)
3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (args == Py_None)
3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyEval_SetTrace(NULL, NULL);
3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyEval_SetTrace(trace_trampoline, args);
3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(settrace_doc,
4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"settrace(function)\n\
4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet the global debug tracing function.  It will be called on each\n\
4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfunction call.  See the debugger chapter in the library manual."
4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_gettrace(PyObject *self, PyObject *args)
4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThreadState *tstate = PyThreadState_GET();
4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *temp = tstate->c_traceobj;
4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (temp == NULL)
4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        temp = Py_None;
4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(temp);
4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return temp;
4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(gettrace_doc,
4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"gettrace()\n\
4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the global debug tracing function set with sys.settrace.\n\
4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSee the debugger chapter in the library manual."
4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_setprofile(PyObject *self, PyObject *args)
4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (trace_init() == -1)
4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (args == Py_None)
4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyEval_SetProfile(NULL, NULL);
4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyEval_SetProfile(profile_trampoline, args);
4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(setprofile_doc,
4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"setprofile(function)\n\
4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet the profiling function.  It will be called on each function call\n\
4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmand return.  See the profiler chapter in the library manual."
4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getprofile(PyObject *self, PyObject *args)
4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThreadState *tstate = PyThreadState_GET();
4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *temp = tstate->c_profileobj;
4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (temp == NULL)
4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        temp = Py_None;
4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(temp);
4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return temp;
4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getprofile_doc,
4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getprofile()\n\
4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the profiling function set with sys.setprofile.\n\
4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSee the profiler chapter in the library manual."
4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_setcheckinterval(PyObject *self, PyObject *args)
4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "i:setcheckinterval", &_Py_CheckInterval))
4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(setcheckinterval_doc,
4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"setcheckinterval(n)\n\
4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmTell the Python interpreter to check for asynchronous events every\n\
4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmn instructions.  This also affects how often thread switches occur."
4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getcheckinterval(PyObject *self, PyObject *args)
4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong(_Py_CheckInterval);
4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getcheckinterval_doc,
4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getcheckinterval() -> current check interval; see setcheckinterval()."
4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_TSC
4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_settscdump(PyObject *self, PyObject *args)
4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int bool;
4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThreadState *tstate = PyThreadState_Get();
4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "i:settscdump", &bool))
4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (bool)
5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tstate->interp->tscdump = 1;
5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tstate->interp->tscdump = 0;
5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(settscdump_doc,
5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"settscdump(bool)\n\
5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf true, tell the Python interpreter to dump VM measurements to\n\
5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstderr.  If false, turn off dump.  The measurements are based on the\n\
5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmprocessor's time-stamp counter."
5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* TSC */
5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_setrecursionlimit(PyObject *self, PyObject *args)
5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int new_limit;
5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit))
5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (new_limit <= 0) {
5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError,
5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "recursion limit must be positive");
5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_SetRecursionLimit(new_limit);
5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(setrecursionlimit_doc,
5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"setrecursionlimit(n)\n\
5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet the maximum depth of the Python interpreter stack to n.  This\n\
5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlimit prevents infinite recursion from causing an overflow of the C\n\
5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstack and crashing Python.  The highest possible limit is platform-\n\
5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdependent."
5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getrecursionlimit(PyObject *self)
5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong(Py_GetRecursionLimit());
5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getrecursionlimit_doc,
5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getrecursionlimit()\n\
5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the current value of the recursion limit, the maximum depth\n\
5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmof the Python interpreter stack.  This limit prevents infinite\n\
5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmrecursion from causing an overflow of the C stack and crashing Python."
5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS
5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getwindowsversion_doc,
5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getwindowsversion()\n\
5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn information about the running version of Windows as a named tuple.\n\
5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe members are named: major, minor, build, platform, service_pack,\n\
5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmservice_pack_major, service_pack_minor, suite_mask, and product_type. For\n\
5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbackward compatibility, only the first 5 items are available by indexing.\n\
5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAll elements are numbers, except service_pack which is a string. Platform\n\
5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmay be 0 for win32s, 1 for Windows 9x/ME, 2 for Windows NT/2000/XP/Vista/7,\n\
5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm3 for Windows CE. Product_type may be 1 for a workstation, 2 for a domain\n\
5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcontroller, 3 for a server."
5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject WindowsVersionType = {0, 0, 0, 0, 0, 0};
5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyStructSequence_Field windows_version_fields[] = {
5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"major", "Major version number"},
5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"minor", "Minor version number"},
5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"build", "Build number"},
5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"platform", "Operating system platform"},
5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"service_pack", "Latest Service Pack installed on the system"},
5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"service_pack_major", "Service Pack major version number"},
5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"service_pack_minor", "Service Pack minor version number"},
5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"suite_mask", "Bit mask identifying available product suites"},
5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"product_type", "System product type"},
5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {0}
5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyStructSequence_Desc windows_version_desc = {
5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "sys.getwindowsversion",  /* name */
5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    getwindowsversion_doc,    /* doc */
5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    windows_version_fields,   /* fields */
5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    5                         /* For backward compatibility,
5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                 only the first 5 items are accessible
5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                 via indexing, the rest are name only */
5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getwindowsversion(PyObject *self)
5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *version;
5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int pos = 0;
5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    OSVERSIONINFOEX ver;
6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ver.dwOSVersionInfoSize = sizeof(ver);
6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!GetVersionEx((OSVERSIONINFO*) &ver))
6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyErr_SetFromWindowsErr(0);
6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version = PyStructSequence_New(&WindowsVersionType);
6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (version == NULL)
6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwMajorVersion));
6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwMinorVersion));
6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwBuildNumber));
6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwPlatformId));
6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStructSequence_SET_ITEM(version, pos++, PyString_FromString(ver.szCSDVersion));
6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wServicePackMajor));
6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wServicePackMinor));
6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wSuiteMask));
6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wProductType));
6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return version;
6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* MS_WINDOWS */
6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_DLOPEN
6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_setdlopenflags(PyObject *self, PyObject *args)
6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int new_val;
6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThreadState *tstate = PyThreadState_GET();
6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val))
6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!tstate)
6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tstate->interp->dlopenflags = new_val;
6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(setdlopenflags_doc,
6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"setdlopenflags(n) -> None\n\
6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet the flags used by the interpreter for dlopen calls, such as when the\n\
6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminterpreter loads extension modules.  Among other things, this will enable\n\
6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma lazy resolving of symbols when importing a module, if called as\n\
6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys.setdlopenflags(0).  To share symbols across extension modules, call as\n\
6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys.setdlopenflags(ctypes.RTLD_GLOBAL).  Symbolic names for the flag modules\n\
6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcan be either found in the ctypes module, or in the DLFCN module. If DLFCN\n\
6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmis not available, it can be generated from /usr/include/dlfcn.h using the\n\
6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmh2py script.");
6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getdlopenflags(PyObject *self, PyObject *args)
6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyThreadState *tstate = PyThreadState_GET();
6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!tstate)
6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromLong(tstate->interp->dlopenflags);
6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getdlopenflags_doc,
6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getdlopenflags() -> int\n\
6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the current value of the flags that are used for dlopen calls.\n\
6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe flag constants are defined in the ctypes and DLFCN modules.");
6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif  /* HAVE_DLOPEN */
6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_MALLOPT
6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Link with -lmalloc (or -lmpc) on an SGI */
6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <malloc.h>
6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_mdebug(PyObject *self, PyObject *args)
6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int flag;
6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "i:mdebug", &flag))
6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    mallopt(M_DEBUG, flag);
6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(Py_None);
6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Py_None;
6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* USE_MALLOPT */
6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *res = NULL;
6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    static PyObject *str__sizeof__ = NULL, *gc_head_size = NULL;
6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    static char *kwlist[] = {"object", "default", 0};
6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *o, *dflt = NULL;
6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof",
6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     kwlist, &o, &dflt))
6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Initialize static variable for GC head size */
6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (gc_head_size == NULL) {
6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        gc_head_size = PyInt_FromSsize_t(sizeof(PyGC_Head));
6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (gc_head_size == NULL)
6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Make sure the type is initialized. float gets initialized late */
7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyType_Ready(Py_TYPE(o)) < 0)
7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Instance of old-style class */
7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyInstance_Check(o))
7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        res = PyInt_FromSsize_t(PyInstance_Type.tp_basicsize);
7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* all other objects */
7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *method = _PyObject_LookupSpecial(o, "__sizeof__",
7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                                   &str__sizeof__);
7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (method == NULL) {
7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!PyErr_Occurred())
7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_Format(PyExc_TypeError,
7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             "Type %.100s doesn't define __sizeof__",
7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             Py_TYPE(o)->tp_name);
7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else {
7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            res = PyObject_CallFunctionObjArgs(method, NULL);
7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(method);
7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Has a default value been given? */
7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((res == NULL) && (dflt != NULL) &&
7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_ExceptionMatches(PyExc_TypeError))
7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Clear();
7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(dflt);
7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return dflt;
7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (res == NULL)
7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return res;
7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* add gc_head size */
7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyObject_IS_GC(o)) {
7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *tmp = res;
7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        res = PyNumber_Add(tmp, gc_head_size);
7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(tmp);
7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return res;
7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getsizeof_doc,
7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getsizeof(object, default) -> int\n\
7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the size of object in bytes.");
7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getrefcount(PyObject *self, PyObject *arg)
7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromSsize_t(arg->ob_refcnt);
7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_REF_DEBUG
7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_gettotalrefcount(PyObject *self)
7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return PyInt_FromSsize_t(_Py_GetRefTotal());
7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* Py_REF_DEBUG */
7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getrefcount_doc,
7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getrefcount(object) -> integer\n\
7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the reference count of object.  The count returned is generally\n\
7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmone higher than you might expect, because it includes the (temporary)\n\
7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreference as an argument to getrefcount()."
7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS
7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getcounts(PyObject *self)
7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    extern PyObject *get_counts(void);
7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return get_counts();
7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getframe_doc,
7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"_getframe([depth]) -> frameobject\n\
7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a frame object from the call stack.  If optional integer depth is\n\
7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgiven, return the frame object that many calls below the top of the stack.\n\
7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf that is deeper than the call stack, ValueError is raised.  The default\n\
7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfor depth is zero, returning the frame at the top of the call stack.\n\
7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThis function should be used for internal and specialized\n\
7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpurposes only."
7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getframe(PyObject *self, PyObject *args)
7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyFrameObject *f = PyThreadState_GET()->frame;
7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int depth = -1;
7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "|i:_getframe", &depth))
8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (depth > 0 && f != NULL) {
8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        f = f->f_back;
8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        --depth;
8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (f == NULL) {
8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_SetString(PyExc_ValueError,
8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        "call stack is not deep enough");
8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(f);
8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (PyObject*)f;
8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(current_frames_doc,
8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"_current_frames() -> dictionary\n\
8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a dictionary mapping each current thread T's thread id to T's\n\
8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcurrent stack frame.\n\
8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThis function should be used for specialized purposes only."
8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_current_frames(PyObject *self, PyObject *noargs)
8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return _PyThread_CurrentFrames();
8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(call_tracing_doc,
8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"call_tracing(func, args) -> object\n\
8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmCall func(*args), while tracing is enabled.  The tracing state is\n\
8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsaved, and restored afterwards.  This is intended to be called from\n\
8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma debugger from a checkpoint, to recursively debug some other code."
8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_call_tracing(PyObject *self, PyObject *args)
8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *func, *funcargs;
8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyArg_ParseTuple(args, "OO!:call_tracing", &func, &PyTuple_Type, &funcargs))
8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return _PyEval_CallTracing(func, funcargs);
8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(callstats_doc,
8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"callstats() -> tuple of integers\n\
8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a tuple of function call statistics, if CALL_PROFILE was defined\n\
8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwhen Python was built.  Otherwise, return None.\n\
8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmWhen enabled, this function returns detailed, implementation-specific\n\
8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdetails about the number of function calls executed. The return value is\n\
8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma 11-tuple where the entries in the tuple are counts of:\n\
8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm0. all function calls\n\
8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm1. calls to PyFunction_Type objects\n\
8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm2. PyFunction calls that do not create an argument tuple\n\
8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm3. PyFunction calls that do not create an argument tuple\n\
8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   and bypass PyEval_EvalCodeEx()\n\
8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm4. PyMethod calls\n\
8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm5. PyMethod calls on bound methods\n\
8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm6. PyType calls\n\
8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm7. PyCFunction calls\n\
8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm8. generator calls\n\
8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm9. All other calls\n\
8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm10. Number of stack pops performed by call_function()"
8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm);
8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __cplusplus
8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern "C" {
8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_TRACE_REFS
8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Defined in objects.c because it uses static globals if that file */
8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern PyObject *_Py_GetObjects(PyObject *, PyObject *);
8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef DYNAMIC_EXECUTION_PROFILE
8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Defined in ceval.c because it uses static globals if that file */
8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern PyObject *_Py_GetDXProfile(PyObject *,  PyObject *);
8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __cplusplus
8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_clear_type_cache(PyObject* self, PyObject* args)
8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyType_ClearCache();
8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_RETURN_NONE;
8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(sys_clear_type_cache__doc__,
8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"_clear_type_cache() -> None\n\
8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmClear the internal type lookup cache.");
8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyMethodDef sys_methods[] = {
9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Might as well keep this in alphabetic order */
9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS,
9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     callstats_doc},
9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"_clear_type_cache",       sys_clear_type_cache,     METH_NOARGS,
9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     sys_clear_type_cache__doc__},
9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"_current_frames", sys_current_frames, METH_NOARGS,
9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     current_frames_doc},
9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"displayhook",     sys_displayhook, METH_O, displayhook_doc},
9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"exc_info",        sys_exc_info, METH_NOARGS, exc_info_doc},
9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"exc_clear",       sys_exc_clear, METH_NOARGS, exc_clear_doc},
9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"excepthook",      sys_excepthook, METH_VARARGS, excepthook_doc},
9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"exit",            sys_exit, METH_VARARGS, exit_doc},
9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getdefaultencoding", (PyCFunction)sys_getdefaultencoding,
9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_NOARGS, getdefaultencoding_doc},
9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_DLOPEN
9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS,
9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     getdlopenflags_doc},
9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS
9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getcounts",       (PyCFunction)sys_getcounts, METH_NOARGS},
9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef DYNAMIC_EXECUTION_PROFILE
9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getdxp",          _Py_GetDXProfile, METH_VARARGS},
9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getfilesystemencoding", (PyCFunction)sys_getfilesystemencoding,
9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_NOARGS, getfilesystemencoding_doc},
9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_TRACE_REFS
9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getobjects",      _Py_GetObjects, METH_VARARGS},
9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_REF_DEBUG
9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS},
9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getrefcount",     (PyCFunction)sys_getrefcount, METH_O, getrefcount_doc},
9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS,
9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     getrecursionlimit_doc},
9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getsizeof",   (PyCFunction)sys_getsizeof,
9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     METH_VARARGS | METH_KEYWORDS, getsizeof_doc},
9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"_getframe", sys_getframe, METH_VARARGS, getframe_doc},
9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS
9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getwindowsversion", (PyCFunction)sys_getwindowsversion, METH_NOARGS,
9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     getwindowsversion_doc},
9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* MS_WINDOWS */
9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_MALLOPT
9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"mdebug",          sys_mdebug, METH_VARARGS},
9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS,
9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     setdefaultencoding_doc},
9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"setcheckinterval",        sys_setcheckinterval, METH_VARARGS,
9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     setcheckinterval_doc},
9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getcheckinterval",        sys_getcheckinterval, METH_NOARGS,
9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     getcheckinterval_doc},
9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_DLOPEN
9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"setdlopenflags", sys_setdlopenflags, METH_VARARGS,
9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     setdlopenflags_doc},
9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"setprofile",      sys_setprofile, METH_O, setprofile_doc},
9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"getprofile",      sys_getprofile, METH_NOARGS, getprofile_doc},
9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS,
9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     setrecursionlimit_doc},
9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_TSC
9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"settscdump", sys_settscdump, METH_VARARGS, settscdump_doc},
9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"settrace",        sys_settrace, METH_O, settrace_doc},
9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"gettrace",        sys_gettrace, METH_NOARGS, gettrace_doc},
9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc},
9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {NULL,              NULL}           /* sentinel */
9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlist_builtin_module_names(void)
9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *list = PyList_New(0);
9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (list == NULL)
9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *name = PyString_FromString(
9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyImport_Inittab[i].name);
9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (name == NULL)
9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyList_Append(list, name);
9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(name);
9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyList_Sort(list) != 0) {
9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(list);
9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        list = NULL;
9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (list) {
9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *v = PyList_AsTuple(list);
9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(list);
9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        list = v;
9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return list;
10014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *warnoptions = NULL;
10044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid
10064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_ResetWarnOptions(void)
10074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (warnoptions == NULL || !PyList_Check(warnoptions))
10094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
10104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL);
10114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid
10144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_AddWarnOption(char *s)
10154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *str;
10174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (warnoptions == NULL || !PyList_Check(warnoptions)) {
10194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_XDECREF(warnoptions);
10204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        warnoptions = PyList_New(0);
10214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (warnoptions == NULL)
10224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return;
10234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    str = PyString_FromString(s);
10254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (str != NULL) {
10264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyList_Append(warnoptions, str);
10274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(str);
10284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint
10324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_HasWarnOptions(void)
10334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (warnoptions != NULL && (PyList_Size(warnoptions) > 0)) ? 1 : 0;
10354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* XXX This doc string is too long to be a single string literal in VC++ 5.0.
10384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Two literals concatenated works just fine.  If you have a K&R compiler
10394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   or other abomination that however *does* understand longer strings,
10404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   get rid of the !!! comment in the middle and the quotes that surround it. */
10414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_VAR(sys_doc) =
10424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STR(
10434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"This module provides access to some objects used or maintained by the\n\
10444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminterpreter and to functions that interact strongly with the interpreter.\n\
10454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
10464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmDynamic objects:\n\
10474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
10484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmargv -- command line arguments; argv[0] is the script pathname if known\n\
10494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpath -- module search path; path[0] is the script directory, else ''\n\
10504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmodules -- dictionary of loaded modules\n\
10514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
10524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdisplayhook -- called to show results in an interactive session\n\
10534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcepthook -- called to handle any uncaught exception other than SystemExit\n\
10544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  To customize printing in an interactive session or to install a custom\n\
10554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  top-level exception handler, assign other functions to replace these.\n\
10564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
10574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexitfunc -- if sys.exitfunc exists, this routine is called when Python exits\n\
10584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  Assigning to sys.exitfunc is deprecated; use the atexit module instead.\n\
10594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
10604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstdin -- standard input file object; used by raw_input() and input()\n\
10614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstdout -- standard output file object; used by the print statement\n\
10624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstderr -- standard error object; used for error messages\n\
10634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  By assigning other file objects (or objects that behave like files)\n\
10644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  to these, it is possible to redirect all of the interpreter's I/O.\n\
10654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
10664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlast_type -- type of last uncaught exception\n\
10674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlast_value -- value of last uncaught exception\n\
10684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlast_traceback -- traceback of last uncaught exception\n\
10694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  These three are only available in an interactive session after a\n\
10704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  traceback has been printed.\n\
10714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
10724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexc_type -- type of exception currently being handled\n\
10734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexc_value -- value of exception currently being handled\n\
10744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexc_traceback -- traceback of exception currently being handled\n\
10754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  The function exc_info() should be used instead of these three,\n\
10764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  because it is thread-safe.\n\
10774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"
10784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm)
10794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* concatenating string here */
10804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STR(
10814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"\n\
10824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmStatic objects:\n\
10834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
10844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfloat_info -- a dict with information about the float inplementation.\n\
10854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlong_info -- a struct sequence with information about the long implementation.\n\
10864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmaxint -- the largest supported integer (the smallest is -maxint-1)\n\
10874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmaxsize -- the largest supported length of containers.\n\
10884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmaxunicode -- the largest supported character\n\
10894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbuiltin_module_names -- tuple of module names built into this interpreter\n\
10904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmversion -- the version of this interpreter as a string\n\
10914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmversion_info -- version information as a named tuple\n\
10924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhexversion -- version information encoded as a single integer\n\
10934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcopyright -- copyright notice pertaining to this interpreter\n\
10944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmplatform -- platform identifier\n\
10954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexecutable -- pathname of this Python interpreter\n\
10964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmprefix -- prefix used to find the Python library\n\
10974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexec_prefix -- prefix used to find the machine-specific Python library\n\
10984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfloat_repr_style -- string indicating the style of repr() output for floats\n\
10994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"
11004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm)
11014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS
11024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* concatenating string here */
11034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STR(
11044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"dllhandle -- [Windows only] integer handle of the Python DLL\n\
11054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwinver -- [Windows only] version number of the Python DLL\n\
11064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"
11074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm)
11084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* MS_WINDOWS */
11094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STR(
11104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"__stdin__ -- the original stdin; don't touch!\n\
11114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm__stdout__ -- the original stdout; don't touch!\n\
11124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm__stderr__ -- the original stderr; don't touch!\n\
11134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm__displayhook__ -- the original displayhook; don't touch!\n\
11144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm__excepthook__ -- the original excepthook; don't touch!\n\
11154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
11164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmFunctions:\n\
11174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
11184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdisplayhook() -- print an object to the screen, and save it in __builtin__._\n\
11194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcepthook() -- print an exception and its traceback to sys.stderr\n\
11204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexc_info() -- return thread-safe information about the current exception\n\
11214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexc_clear() -- clear the exception state for the current thread\n\
11224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexit() -- exit the interpreter by raising SystemExit\n\
11234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetdlopenflags() -- returns flags to be used for dlopen() calls\n\
11244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetprofile() -- get the global profiling function\n\
11254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetrefcount() -- return the reference count for an object (plus one :-)\n\
11264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetrecursionlimit() -- return the max recursion depth for the interpreter\n\
11274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetsizeof() -- return the size of an object in bytes\n\
11284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgettrace() -- get the global debug tracing function\n\
11294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsetcheckinterval() -- control how often the interpreter checks for events\n\
11304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsetdlopenflags() -- set the flags to be used for dlopen() calls\n\
11314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsetprofile() -- set the global profiling function\n\
11324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsetrecursionlimit() -- set the max recursion depth for the interpreter\n\
11334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsettrace() -- set the global debug tracing function\n\
11344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"
11354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm)
11364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* end of sys_doc */ ;
11374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
11394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_check_and_flush (FILE *stream)
11404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  int prev_fail = ferror (stream);
11424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  return fflush (stream) || prev_fail ? EOF : 0;
11434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Subversion branch and revision management */
11464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int svn_initialized;
11474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char patchlevel_revision[50]; /* Just the number */
11484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char branch[50];
11494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char shortbranch[50];
11504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic const char *svn_revision;
11514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
11534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsvnversion_init(void)
11544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (svn_initialized)
11564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
11574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    svn_initialized = 1;
11584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    *patchlevel_revision = '\0';
11594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    strcpy(branch, "");
11604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    strcpy(shortbranch, "unknown");
11614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    svn_revision = "";
11624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return;
11634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Return svnversion output if available.
11664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Else return Revision of patchlevel.h if on branch.
11674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Else return empty string */
11684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmconst char*
11694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_SubversionRevision()
11704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    svnversion_init();
11724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return svn_revision;
11734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmconst char*
11764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_SubversionShortBranch()
11774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    svnversion_init();
11794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return shortbranch;
11804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(flags__doc__,
11844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"sys.flags\n\
11854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
11864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmFlags provided through command line arguments or environment vars.");
11874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject FlagsType = {0, 0, 0, 0, 0, 0};
11894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyStructSequence_Field flags_fields[] = {
11914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"debug",                   "-d"},
11924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"py3k_warning",            "-3"},
11934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"division_warning",        "-Q"},
11944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"division_new",            "-Qnew"},
11954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"inspect",                 "-i"},
11964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"interactive",             "-i"},
11974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"optimize",                "-O or -OO"},
11984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"dont_write_bytecode",     "-B"},
11994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"no_user_site",            "-s"},
12004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"no_site",                 "-S"},
12014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"ignore_environment",      "-E"},
12024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"tabcheck",                "-t or -tt"},
12034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"verbose",                 "-v"},
12044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef RISCOS
12054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"riscos_wimp",             "???"},
12064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
12074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* {"unbuffered",                   "-u"}, */
12084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"unicode",                 "-U"},
12094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* {"skip_first",                   "-x"}, */
12104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"bytes_warning", "-b"},
12114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {0}
12124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
12134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyStructSequence_Desc flags_desc = {
12154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "sys.flags",        /* name */
12164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    flags__doc__,       /* doc */
12174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    flags_fields,       /* fields */
12184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef RISCOS
12194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    16
12204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
12214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    15
12224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
12234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
12244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject*
12264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmake_flags(void)
12274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
12284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int pos = 0;
12294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *seq;
12304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    seq = PyStructSequence_New(&FlagsType);
12324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (seq == NULL)
12334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
12344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SetFlag(flag) \
12364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStructSequence_SET_ITEM(seq, pos++, PyInt_FromLong(flag))
12374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetFlag(Py_DebugFlag);
12394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetFlag(Py_Py3kWarningFlag);
12404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetFlag(Py_DivisionWarningFlag);
12414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetFlag(_Py_QnewFlag);
12424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetFlag(Py_InspectFlag);
12434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetFlag(Py_InteractiveFlag);
12444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetFlag(Py_OptimizeFlag);
12454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetFlag(Py_DontWriteBytecodeFlag);
12464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetFlag(Py_NoUserSiteDirectory);
12474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetFlag(Py_NoSiteFlag);
12484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetFlag(Py_IgnoreEnvironmentFlag);
12494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetFlag(Py_TabcheckFlag);
12504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetFlag(Py_VerboseFlag);
12514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef RISCOS
12524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetFlag(Py_RISCOSWimpFlag);
12534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
12544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* SetFlag(saw_unbuffered_flag); */
12554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetFlag(Py_UnicodeFlag);
12564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* SetFlag(skipfirstline); */
12574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetFlag(Py_BytesWarningFlag);
12584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef SetFlag
12594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyErr_Occurred()) {
12614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
12624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return seq;
12644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
12654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(version_info__doc__,
12674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"sys.version_info\n\
12684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\
12694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmVersion information as a named tuple.");
12704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject VersionInfoType = {0, 0, 0, 0, 0, 0};
12724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyStructSequence_Field version_info_fields[] = {
12744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"major", "Major release number"},
12754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"minor", "Minor release number"},
12764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"micro", "Patch release number"},
12774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"releaselevel", "'alpha', 'beta', 'candidate', or 'release'"},
12784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {"serial", "Serial release number"},
12794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {0}
12804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
12814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyStructSequence_Desc version_info_desc = {
12834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "sys.version_info",     /* name */
12844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version_info__doc__,    /* doc */
12854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version_info_fields,    /* fields */
12864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    5
12874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
12884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
12904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmake_version_info(void)
12914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
12924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *version_info;
12934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s;
12944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int pos = 0;
12954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    version_info = PyStructSequence_New(&VersionInfoType);
12974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (version_info == NULL) {
12984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
12994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
13004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /*
13024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * These release level checks are mutually exclusive and cover
13034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * the field, so don't get too fancy with the pre-processor!
13044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     */
13054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
13064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s = "alpha";
13074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
13084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s = "beta";
13094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
13104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s = "candidate";
13114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
13124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s = "final";
13134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
13144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SetIntItem(flag) \
13164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStructSequence_SET_ITEM(version_info, pos++, PyInt_FromLong(flag))
13174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SetStrItem(flag) \
13184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyStructSequence_SET_ITEM(version_info, pos++, PyString_FromString(flag))
13194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetIntItem(PY_MAJOR_VERSION);
13214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetIntItem(PY_MINOR_VERSION);
13224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetIntItem(PY_MICRO_VERSION);
13234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetStrItem(s);
13244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SetIntItem(PY_RELEASE_SERIAL);
13254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef SetIntItem
13264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef SetStrItem
13274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyErr_Occurred()) {
13294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_CLEAR(version_info);
13304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
13324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return version_info;
13334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject *
13364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_PySys_Init(void)
13374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *m, *v, *sysdict;
13394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *sysin, *sysout, *syserr;
13404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s;
13414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    m = Py_InitModule3("sys", sys_methods, sys_doc);
13434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (m == NULL)
13444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sysdict = PyModule_GetDict(m);
13464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SET_SYS_FROM_STRING(key, value)                 \
13474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = value;                                          \
13484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v != NULL)                                      \
13494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyDict_SetItemString(sysdict, key, v);          \
13504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(v)
13514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Check that stdin is not a directory
13534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Using shell redirection, you can redirect stdin to a directory,
13544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    crashing the Python interpreter. Catch this common mistake here
13554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    and output a useful error message. Note that under MS Windows,
13564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    the shell already prevents that. */
13574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(MS_WINDOWS)
13584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
13594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        struct stat sb;
13604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (fstat(fileno(stdin), &sb) == 0 &&
13614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            S_ISDIR(sb.st_mode)) {
13624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* There's nothing more we can do. */
13634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* Py_FatalError() will core dump, so just exit. */
13644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PySys_WriteStderr("Python error: <stdin> is a directory, cannot continue\n");
13654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            exit(EXIT_FAILURE);
13664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
13674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
13684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
13694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Closing the standard FILE* if sys.std* goes aways causes problems
13714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * for embedded Python usages. Closing them when somebody explicitly
13724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * invokes .close() might be possible, but the FAQ promises they get
13734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * never closed. However, we still need to get write errors when
13744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * writing fails (e.g. because stdout is redirected), so we flush the
13754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * streams and check for errors before the file objects are deleted.
13764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * On OS X, fflush()ing stdin causes an error, so we exempt stdin
13774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     * from that procedure.
13784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     */
13794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sysin = PyFile_FromFile(stdin, "<stdin>", "r", NULL);
13804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    sysout = PyFile_FromFile(stdout, "<stdout>", "w", _check_and_flush);
13814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    syserr = PyFile_FromFile(stderr, "<stderr>", "w", _check_and_flush);
13824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyErr_Occurred())
13834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyDict_SetItemString(sysdict, "stdin", sysin);
13864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyDict_SetItemString(sysdict, "stdout", sysout);
13874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyDict_SetItemString(sysdict, "stderr", syserr);
13884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Make backup copies for cleanup */
13894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyDict_SetItemString(sysdict, "__stdin__", sysin);
13904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyDict_SetItemString(sysdict, "__stdout__", sysout);
13914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyDict_SetItemString(sysdict, "__stderr__", syserr);
13924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyDict_SetItemString(sysdict, "__displayhook__",
13934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         PyDict_GetItemString(sysdict, "displayhook"));
13944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyDict_SetItemString(sysdict, "__excepthook__",
13954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         PyDict_GetItemString(sysdict, "excepthook"));
13964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(sysin);
13974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(sysout);
13984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_XDECREF(syserr);
13994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("version",
14014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         PyString_FromString(Py_GetVersion()));
14024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("hexversion",
14034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         PyInt_FromLong(PY_VERSION_HEX));
14044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    svnversion_init();
14054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("subversion",
14064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         Py_BuildValue("(ssz)", "CPython", branch,
14074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                      svn_revision));
14084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("_mercurial",
14094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        Py_BuildValue("(szz)", "CPython", _Py_hgidentifier(),
14104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                      _Py_hgversion()));
14114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("dont_write_bytecode",
14124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         PyBool_FromLong(Py_DontWriteBytecodeFlag));
14134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("api_version",
14144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyInt_FromLong(PYTHON_API_VERSION));
14154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("copyright",
14164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyString_FromString(Py_GetCopyright()));
14174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("platform",
14184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyString_FromString(Py_GetPlatform()));
14194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("executable",
14204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyString_FromString(Py_GetProgramFullPath()));
14214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("prefix",
14224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyString_FromString(Py_GetPrefix()));
14234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("exec_prefix",
14244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyString_FromString(Py_GetExecPrefix()));
14254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("maxsize",
14264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyInt_FromSsize_t(PY_SSIZE_T_MAX));
14274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("maxint",
14284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyInt_FromLong(PyInt_GetMax()));
14294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("py3kwarning",
14304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyBool_FromLong(Py_Py3kWarningFlag));
14314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("float_info",
14324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyFloat_GetInfo());
14334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("long_info",
14344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyLong_GetInfo());
14354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
14364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("maxunicode",
14374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyInt_FromLong(PyUnicode_GetMax()));
14384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
14394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("builtin_module_names",
14404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        list_builtin_module_names());
14414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    {
14424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Assumes that longs are at least 2 bytes long.
14434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           Should be safe! */
14444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        unsigned long number = 1;
14454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *value;
14464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s = (char *) &number;
14484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (s[0] == 0)
14494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            value = "big";
14504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
14514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            value = "little";
14524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        SET_SYS_FROM_STRING("byteorder",
14534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            PyString_FromString(value));
14544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_COREDLL
14564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("dllhandle",
14574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyLong_FromVoidPtr(PyWin_DLLhModule));
14584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("winver",
14594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyString_FromString(PyWin_DLLVersionString));
14604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
14614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (warnoptions == NULL) {
14624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        warnoptions = PyList_New(0);
14634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
14654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(warnoptions);
14664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (warnoptions != NULL) {
14684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyDict_SetItemString(sysdict, "warnoptions", warnoptions);
14694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* version_info */
14724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (VersionInfoType.tp_name == 0)
14734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyStructSequence_InitType(&VersionInfoType, &version_info_desc);
14744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("version_info", make_version_info());
14754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* prevent user from creating new instances */
14764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    VersionInfoType.tp_init = NULL;
14774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    VersionInfoType.tp_new = NULL;
14784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* flags */
14804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (FlagsType.tp_name == 0)
14814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyStructSequence_InitType(&FlagsType, &flags_desc);
14824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("flags", make_flags());
14834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* prevent user from creating new instances */
14844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    FlagsType.tp_init = NULL;
14854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    FlagsType.tp_new = NULL;
14864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(MS_WINDOWS)
14894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* getwindowsversion */
14904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (WindowsVersionType.tp_name == 0)
14914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyStructSequence_InitType(&WindowsVersionType, &windows_version_desc);
14924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* prevent user from creating new instances */
14934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    WindowsVersionType.tp_init = NULL;
14944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    WindowsVersionType.tp_new = NULL;
14954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
14964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */
14984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef PY_NO_SHORT_FLOAT_REPR
14994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("float_repr_style",
15004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyString_FromString("short"));
15014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
15024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    SET_SYS_FROM_STRING("float_repr_style",
15034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyString_FromString("legacy"));
15044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
15054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef SET_SYS_FROM_STRING
15074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyErr_Occurred())
15084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
15094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return m;
15104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
15114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
15134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmakepathobject(char *path, int delim)
15144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
15154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i, n;
15164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *p;
15174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v, *w;
15184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n = 1;
15204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    p = path;
15214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while ((p = strchr(p, delim)) != NULL) {
15224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n++;
15234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        p++;
15244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    v = PyList_New(n);
15264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (v == NULL)
15274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
15284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; ; i++) {
15294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        p = strchr(path, delim);
15304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (p == NULL)
15314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p = strchr(path, '\0'); /* End of string */
15324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        w = PyString_FromStringAndSize(path, (Py_ssize_t) (p - path));
15334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (w == NULL) {
15344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_DECREF(v);
15354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
15364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
15374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyList_SetItem(v, i, w);
15384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (*p == '\0')
15394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
15404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        path = p+1;
15414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return v;
15434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
15444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid
15464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_SetPath(char *path)
15474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
15484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *v;
15494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if ((v = makepathobject(path, DELIM)) == NULL)
15504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_FatalError("can't create sys.path");
15514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PySys_SetObject("path", v) != 0)
15524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_FatalError("can't assign sys.path");
15534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(v);
15544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
15554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
15574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmakeargvobject(int argc, char **argv)
15584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
15594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *av;
15604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (argc <= 0 || argv == NULL) {
15614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Ensure at least one (empty) argument is seen */
15624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        static char *empty_argv[1] = {""};
15634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        argv = empty_argv;
15644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        argc = 1;
15654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    av = PyList_New(argc);
15674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (av != NULL) {
15684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int i;
15694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < argc; i++) {
15704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __VMS
15714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyObject *v;
15724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* argv[0] is the script pathname if known */
15744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (i == 0) {
15754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                char* fn = decc$translate_vms(argv[0]);
15764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if ((fn == (char *)0) || fn == (char *)-1)
15774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    v = PyString_FromString(argv[0]);
15784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else
15794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    v = PyString_FromString(
15804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        decc$translate_vms(argv[0]));
15814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            } else
15824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                v = PyString_FromString(argv[i]);
15834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
15844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyObject *v = PyString_FromString(argv[i]);
15854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
15864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (v == NULL) {
15874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(av);
15884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                av = NULL;
15894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
15904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
15914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyList_SetItem(av, i, v);
15924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
15934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return av;
15954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
15964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid
15984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_SetArgvEx(int argc, char **argv, int updatepath)
15994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
16004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(HAVE_REALPATH)
16014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char fullpath[MAXPATHLEN];
16024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif defined(MS_WINDOWS) && !defined(MS_WINCE)
16034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char fullpath[MAX_PATH];
16044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
16054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *av = makeargvobject(argc, argv);
16064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *path = PySys_GetObject("path");
16074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (av == NULL)
16084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_FatalError("no mem for sys.argv");
16094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PySys_SetObject("argv", av) != 0)
16104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_FatalError("can't assign sys.argv");
16114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (updatepath && path != NULL) {
16124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *argv0 = argv[0];
16134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *p = NULL;
16144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_ssize_t n = 0;
16154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *a;
16164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_READLINK
16174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char link[MAXPATHLEN+1];
16184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char argv0copy[2*MAXPATHLEN+1];
16194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int nr = 0;
16204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0)
16214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            nr = readlink(argv0, link, MAXPATHLEN);
16224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (nr > 0) {
16234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* It's a symlink */
16244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            link[nr] = '\0';
16254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (link[0] == SEP)
16264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                argv0 = link; /* Link to absolute path */
16274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (strchr(link, SEP) == NULL)
16284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ; /* Link without path */
16294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else {
16304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* Must join(dirname(argv0), link) */
16314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                char *q = strrchr(argv0, SEP);
16324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (q == NULL)
16334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    argv0 = link; /* argv0 without path */
16344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else {
16354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    /* Must make a copy */
16364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    strcpy(argv0copy, argv0);
16374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    q = strrchr(argv0copy, SEP);
16384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    strcpy(q+1, link);
16394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    argv0 = argv0copy;
16404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
16414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
16424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
16434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* HAVE_READLINK */
16444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if SEP == '\\' /* Special case for MS filename syntax */
16454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) {
16464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            char *q;
16474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(MS_WINDOWS) && !defined(MS_WINCE)
16484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* This code here replaces the first element in argv with the full
16494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            path that it represents. Under CE, there are no relative paths so
16504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            the argument must be the full path anyway. */
16514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            char *ptemp;
16524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (GetFullPathName(argv0,
16534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                               sizeof(fullpath),
16544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                               fullpath,
16554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                               &ptemp)) {
16564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                argv0 = fullpath;
16574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
16584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
16594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p = strrchr(argv0, SEP);
16604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* Test for alternate separator */
16614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            q = strrchr(p ? p : argv0, '/');
16624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (q != NULL)
16634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                p = q;
16644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (p != NULL) {
16654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n = p + 1 - argv0;
16664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (n > 1 && p[-1] != ':')
16674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    n--; /* Drop trailing separator */
16684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
16694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
16704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else /* All other filename syntaxes */
16714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) {
16724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(HAVE_REALPATH)
16734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (realpath(argv0, fullpath)) {
16744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                argv0 = fullpath;
16754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
16764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
16774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            p = strrchr(argv0, SEP);
16784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
16794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (p != NULL) {
16804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef RISCOS
16814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n = p + 1 - argv0;
16824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else /* don't include trailing separator */
16834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n = p - argv0;
16844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* RISCOS */
16854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if SEP == '/' /* Special case for Unix filename syntax */
16864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (n > 1)
16874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n--; /* Drop trailing separator */
16884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* Unix */
16894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
16904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* All others */
16914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        a = PyString_FromStringAndSize(argv0, n);
16924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (a == NULL)
16934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_FatalError("no mem for sys.path insertion");
16944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyList_Insert(path, 0, a) < 0)
16954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_FatalError("sys.path.insert(0) failed");
16964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(a);
16974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
16984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(av);
16994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
17004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid
17024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_SetArgv(int argc, char **argv)
17034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
17044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PySys_SetArgvEx(argc, argv, 1);
17054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
17064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
17094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Adapted from code submitted by Just van Rossum.
17104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   PySys_WriteStdout(format, ...)
17124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   PySys_WriteStderr(format, ...)
17134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      The first function writes to sys.stdout; the second to sys.stderr.  When
17154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      there is a problem, they write to the real (C level) stdout or stderr;
17164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      no exceptions are raised.
17174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      Both take a printf-style format string as their first argument followed
17194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      by a variable length argument list determined by the format string.
17204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      *** WARNING ***
17224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      The format should limit the total size of the formatted output string to
17244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      1000 bytes.  In particular, this means that no unrestricted "%s" formats
17254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      should occur; these should be limited using "%.<N>s where <N> is a
17264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      decimal number calculated so that <N> plus the maximum size of other
17274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      formatted text does not exceed 1000 bytes.  Also watch out for "%f",
17284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      which can print hundreds of digits for very large numbers.
17294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
17314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
17334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmywrite(char *name, FILE *fp, const char *format, va_list va)
17344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
17354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *file;
17364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *error_type, *error_value, *error_traceback;
17374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_Fetch(&error_type, &error_value, &error_traceback);
17394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    file = PySys_GetObject(name);
17404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (file == NULL || PyFile_AsFile(file) == fp)
17414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        vfprintf(fp, format, va);
17424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
17434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char buffer[1001];
17444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        const int written = PyOS_vsnprintf(buffer, sizeof(buffer),
17454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                           format, va);
17464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyFile_WriteString(buffer, file) != 0) {
17474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Clear();
17484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            fputs(buffer, fp);
17494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
17504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (written < 0 || (size_t)written >= sizeof(buffer)) {
17514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            const char *truncated = "... truncated";
17524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (PyFile_WriteString(truncated, file) != 0) {
17534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_Clear();
17544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                fputs(truncated, fp);
17554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
17564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
17574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_Restore(error_type, error_value, error_traceback);
17594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
17604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid
17624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_WriteStdout(const char *format, ...)
17634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
17644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    va_list va;
17654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    va_start(va, format);
17674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    mywrite("stdout", stdout, format, va);
17684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    va_end(va);
17694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
17704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid
17724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_WriteStderr(const char *format, ...)
17734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
17744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    va_list va;
17754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    va_start(va, format);
17774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    mywrite("stderr", stderr, format, va);
17784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    va_end(va);
17794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1780