LCOV - code coverage report
Current view: top level - Python - sysmodule.c (source / functions) Hit Total Coverage
Test: CPython lcov report Lines: 224 558 40.1 %
Date: 2017-04-19 Functions: 18 51 35.3 %

          Line data    Source code
       1             : 
       2             : /* System module */
       3             : 
       4             : /*
       5             : Various bits of information used by the interpreter are collected in
       6             : module 'sys'.
       7             : Function member:
       8             : - exit(sts): raise SystemExit
       9             : Data members:
      10             : - stdin, stdout, stderr: standard file objects
      11             : - modules: the table of modules (dictionary)
      12             : - path: module search path (list of strings)
      13             : - argv: script arguments (list of strings)
      14             : - ps1, ps2: optional primary and secondary prompts (strings)
      15             : */
      16             : 
      17             : #include "Python.h"
      18             : #include "structseq.h"
      19             : #include "code.h"
      20             : #include "frameobject.h"
      21             : #include "eval.h"
      22             : 
      23             : #include "osdefs.h"
      24             : 
      25             : #ifdef MS_WINDOWS
      26             : #define WIN32_LEAN_AND_MEAN
      27             : #include "windows.h"
      28             : #endif /* MS_WINDOWS */
      29             : 
      30             : #ifdef MS_COREDLL
      31             : extern void *PyWin_DLLhModule;
      32             : /* A string loaded from the DLL at startup: */
      33             : extern const char *PyWin_DLLVersionString;
      34             : #endif
      35             : 
      36             : #ifdef __VMS
      37             : #include <unixlib.h>
      38             : #endif
      39             : 
      40             : #ifdef MS_WINDOWS
      41             : #include <windows.h>
      42             : #endif
      43             : 
      44             : #ifdef HAVE_LANGINFO_H
      45             : #include <locale.h>
      46             : #include <langinfo.h>
      47             : #endif
      48             : 
      49             : PyObject *
      50        1707 : PySys_GetObject(char *name)
      51             : {
      52        1707 :     PyThreadState *tstate = PyThreadState_GET();
      53        1707 :     PyObject *sd = tstate->interp->sysdict;
      54        1707 :     if (sd == NULL)
      55           0 :         return NULL;
      56        1707 :     return PyDict_GetItemString(sd, name);
      57             : }
      58             : 
      59             : FILE *
      60           0 : PySys_GetFile(char *name, FILE *def)
      61             : {
      62           0 :     FILE *fp = NULL;
      63           0 :     PyObject *v = PySys_GetObject(name);
      64           0 :     if (v != NULL && PyFile_Check(v))
      65           0 :         fp = PyFile_AsFile(v);
      66           0 :     if (fp == NULL)
      67           0 :         fp = def;
      68           0 :     return fp;
      69             : }
      70             : 
      71             : int
      72        5850 : PySys_SetObject(char *name, PyObject *v)
      73             : {
      74        5850 :     PyThreadState *tstate = PyThreadState_GET();
      75        5850 :     PyObject *sd = tstate->interp->sysdict;
      76        5850 :     if (v == NULL) {
      77         405 :         if (PyDict_GetItemString(sd, name) == NULL)
      78           0 :             return 0;
      79             :         else
      80         405 :             return PyDict_DelItemString(sd, name);
      81             :     }
      82             :     else
      83        5445 :         return PyDict_SetItemString(sd, name, v);
      84             : }
      85             : 
      86             : static PyObject *
      87           0 : sys_displayhook(PyObject *self, PyObject *o)
      88             : {
      89             :     PyObject *outf;
      90           0 :     PyInterpreterState *interp = PyThreadState_GET()->interp;
      91           0 :     PyObject *modules = interp->modules;
      92           0 :     PyObject *builtins = PyDict_GetItemString(modules, "__builtin__");
      93             : 
      94           0 :     if (builtins == NULL) {
      95           0 :         PyErr_SetString(PyExc_RuntimeError, "lost __builtin__");
      96           0 :         return NULL;
      97             :     }
      98             : 
      99             :     /* Print value except if None */
     100             :     /* After printing, also assign to '_' */
     101             :     /* Before, set '_' to None to avoid recursion */
     102           0 :     if (o == Py_None) {
     103           0 :         Py_INCREF(Py_None);
     104           0 :         return Py_None;
     105             :     }
     106           0 :     if (PyObject_SetAttrString(builtins, "_", Py_None) != 0)
     107           0 :         return NULL;
     108           0 :     if (Py_FlushLine() != 0)
     109           0 :         return NULL;
     110           0 :     outf = PySys_GetObject("stdout");
     111           0 :     if (outf == NULL) {
     112           0 :         PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
     113           0 :         return NULL;
     114             :     }
     115           0 :     if (PyFile_WriteObject(o, outf, 0) != 0)
     116           0 :         return NULL;
     117           0 :     PyFile_SoftSpace(outf, 1);
     118           0 :     if (Py_FlushLine() != 0)
     119           0 :         return NULL;
     120           0 :     if (PyObject_SetAttrString(builtins, "_", o) != 0)
     121           0 :         return NULL;
     122           0 :     Py_INCREF(Py_None);
     123           0 :     return Py_None;
     124             : }
     125             : 
     126             : PyDoc_STRVAR(displayhook_doc,
     127             : "displayhook(object) -> None\n"
     128             : "\n"
     129             : "Print an object to sys.stdout and also save it in __builtin__._\n"
     130             : );
     131             : 
     132             : static PyObject *
     133           0 : sys_excepthook(PyObject* self, PyObject* args)
     134             : {
     135             :     PyObject *exc, *value, *tb;
     136           0 :     if (!PyArg_UnpackTuple(args, "excepthook", 3, 3, &exc, &value, &tb))
     137           0 :         return NULL;
     138           0 :     PyErr_Display(exc, value, tb);
     139           0 :     Py_INCREF(Py_None);
     140           0 :     return Py_None;
     141             : }
     142             : 
     143             : PyDoc_STRVAR(excepthook_doc,
     144             : "excepthook(exctype, value, traceback) -> None\n"
     145             : "\n"
     146             : "Handle an exception by displaying it with a traceback on sys.stderr.\n"
     147             : );
     148             : 
     149             : static PyObject *
     150           3 : sys_exc_info(PyObject *self, PyObject *noargs)
     151             : {
     152             :     PyThreadState *tstate;
     153           3 :     tstate = PyThreadState_GET();
     154           9 :     return Py_BuildValue(
     155             :         "(OOO)",
     156           3 :         tstate->exc_type != NULL ? tstate->exc_type : Py_None,
     157           3 :         tstate->exc_value != NULL ? tstate->exc_value : Py_None,
     158           3 :         tstate->exc_traceback != NULL ?
     159             :             tstate->exc_traceback : Py_None);
     160             : }
     161             : 
     162             : PyDoc_STRVAR(exc_info_doc,
     163             : "exc_info() -> (type, value, traceback)\n\
     164             : \n\
     165             : Return information about the most recent exception caught by an except\n\
     166             : clause in the current stack frame or in an older stack frame."
     167             : );
     168             : 
     169             : static PyObject *
     170           0 : sys_exc_clear(PyObject *self, PyObject *noargs)
     171             : {
     172             :     PyThreadState *tstate;
     173             :     PyObject *tmp_type, *tmp_value, *tmp_tb;
     174             : 
     175           0 :     if (PyErr_WarnPy3k("sys.exc_clear() not supported in 3.x; "
     176           0 :                        "use except clauses", 1) < 0)
     177           0 :         return NULL;
     178             : 
     179           0 :     tstate = PyThreadState_GET();
     180           0 :     tmp_type = tstate->exc_type;
     181           0 :     tmp_value = tstate->exc_value;
     182           0 :     tmp_tb = tstate->exc_traceback;
     183           0 :     tstate->exc_type = NULL;
     184           0 :     tstate->exc_value = NULL;
     185           0 :     tstate->exc_traceback = NULL;
     186           0 :     Py_XDECREF(tmp_type);
     187           0 :     Py_XDECREF(tmp_value);
     188           0 :     Py_XDECREF(tmp_tb);
     189             :     /* For b/w compatibility */
     190           0 :     PySys_SetObject("exc_type", Py_None);
     191           0 :     PySys_SetObject("exc_value", Py_None);
     192           0 :     PySys_SetObject("exc_traceback", Py_None);
     193           0 :     Py_INCREF(Py_None);
     194           0 :     return Py_None;
     195             : }
     196             : 
     197             : PyDoc_STRVAR(exc_clear_doc,
     198             : "exc_clear() -> None\n\
     199             : \n\
     200             : Clear global information on the current exception.  Subsequent calls to\n\
     201             : exc_info() will return (None,None,None) until another exception is raised\n\
     202             : in the current thread or the execution stack returns to a frame where\n\
     203             : another exception is being handled."
     204             : );
     205             : 
     206             : static PyObject *
     207           3 : sys_exit(PyObject *self, PyObject *args)
     208             : {
     209           3 :     PyObject *exit_code = 0;
     210           3 :     if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
     211           0 :         return NULL;
     212             :     /* Raise SystemExit so callers may catch it or clean up. */
     213           3 :     PyErr_SetObject(PyExc_SystemExit, exit_code);
     214           3 :     return NULL;
     215             : }
     216             : 
     217             : PyDoc_STRVAR(exit_doc,
     218             : "exit([status])\n\
     219             : \n\
     220             : Exit the interpreter by raising SystemExit(status).\n\
     221             : If the status is omitted or None, it defaults to zero (i.e., success).\n\
     222             : If the status is an integer, it will be used as the system exit status.\n\
     223             : If it is another kind of object, it will be printed and the system\n\
     224             : exit status will be one (i.e., failure)."
     225             : );
     226             : 
     227             : #ifdef Py_USING_UNICODE
     228             : 
     229             : static PyObject *
     230           0 : sys_getdefaultencoding(PyObject *self)
     231             : {
     232           0 :     return PyString_FromString(PyUnicode_GetDefaultEncoding());
     233             : }
     234             : 
     235             : PyDoc_STRVAR(getdefaultencoding_doc,
     236             : "getdefaultencoding() -> string\n\
     237             : \n\
     238             : Return the current default string encoding used by the Unicode \n\
     239             : implementation."
     240             : );
     241             : 
     242             : static PyObject *
     243           0 : sys_setdefaultencoding(PyObject *self, PyObject *args)
     244             : {
     245             :     char *encoding;
     246           0 :     if (!PyArg_ParseTuple(args, "s:setdefaultencoding", &encoding))
     247           0 :         return NULL;
     248           0 :     if (PyUnicode_SetDefaultEncoding(encoding))
     249           0 :         return NULL;
     250           0 :     Py_INCREF(Py_None);
     251           0 :     return Py_None;
     252             : }
     253             : 
     254             : PyDoc_STRVAR(setdefaultencoding_doc,
     255             : "setdefaultencoding(encoding)\n\
     256             : \n\
     257             : Set the current default string encoding used by the Unicode implementation."
     258             : );
     259             : 
     260             : static PyObject *
     261           0 : sys_getfilesystemencoding(PyObject *self)
     262             : {
     263           0 :     if (Py_FileSystemDefaultEncoding)
     264           0 :         return PyString_FromString(Py_FileSystemDefaultEncoding);
     265           0 :     Py_INCREF(Py_None);
     266           0 :     return Py_None;
     267             : }
     268             : 
     269             : PyDoc_STRVAR(getfilesystemencoding_doc,
     270             : "getfilesystemencoding() -> string\n\
     271             : \n\
     272             : Return the encoding used to convert Unicode filenames in\n\
     273             : operating system filenames."
     274             : );
     275             : 
     276             : #endif
     277             : 
     278             : /*
     279             :  * Cached interned string objects used for calling the profile and
     280             :  * trace functions.  Initialized by trace_init().
     281             :  */
     282             : static PyObject *whatstrings[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL};
     283             : 
     284             : static int
     285           0 : trace_init(void)
     286             : {
     287             :     static char *whatnames[7] = {"call", "exception", "line", "return",
     288             :                                     "c_call", "c_exception", "c_return"};
     289             :     PyObject *name;
     290             :     int i;
     291           0 :     for (i = 0; i < 7; ++i) {
     292           0 :         if (whatstrings[i] == NULL) {
     293           0 :             name = PyString_InternFromString(whatnames[i]);
     294           0 :             if (name == NULL)
     295           0 :                 return -1;
     296           0 :             whatstrings[i] = name;
     297             :         }
     298             :     }
     299           0 :     return 0;
     300             : }
     301             : 
     302             : 
     303             : static PyObject *
     304           0 : call_trampoline(PyThreadState *tstate, PyObject* callback,
     305             :                 PyFrameObject *frame, int what, PyObject *arg)
     306             : {
     307           0 :     PyObject *args = PyTuple_New(3);
     308             :     PyObject *whatstr;
     309             :     PyObject *result;
     310             : 
     311           0 :     if (args == NULL)
     312           0 :         return NULL;
     313           0 :     Py_INCREF(frame);
     314           0 :     whatstr = whatstrings[what];
     315           0 :     Py_INCREF(whatstr);
     316           0 :     if (arg == NULL)
     317           0 :         arg = Py_None;
     318           0 :     Py_INCREF(arg);
     319           0 :     PyTuple_SET_ITEM(args, 0, (PyObject *)frame);
     320           0 :     PyTuple_SET_ITEM(args, 1, whatstr);
     321           0 :     PyTuple_SET_ITEM(args, 2, arg);
     322             : 
     323             :     /* call the Python-level function */
     324           0 :     PyFrame_FastToLocals(frame);
     325           0 :     result = PyEval_CallObject(callback, args);
     326           0 :     PyFrame_LocalsToFast(frame, 1);
     327           0 :     if (result == NULL)
     328           0 :         PyTraceBack_Here(frame);
     329             : 
     330             :     /* cleanup */
     331           0 :     Py_DECREF(args);
     332           0 :     return result;
     333             : }
     334             : 
     335             : static int
     336           0 : profile_trampoline(PyObject *self, PyFrameObject *frame,
     337             :                    int what, PyObject *arg)
     338             : {
     339           0 :     PyThreadState *tstate = frame->f_tstate;
     340             :     PyObject *result;
     341             : 
     342           0 :     if (arg == NULL)
     343           0 :         arg = Py_None;
     344           0 :     result = call_trampoline(tstate, self, frame, what, arg);
     345           0 :     if (result == NULL) {
     346           0 :         PyEval_SetProfile(NULL, NULL);
     347           0 :         return -1;
     348             :     }
     349           0 :     Py_DECREF(result);
     350           0 :     return 0;
     351             : }
     352             : 
     353             : static int
     354           0 : trace_trampoline(PyObject *self, PyFrameObject *frame,
     355             :                  int what, PyObject *arg)
     356             : {
     357           0 :     PyThreadState *tstate = frame->f_tstate;
     358             :     PyObject *callback;
     359             :     PyObject *result;
     360             : 
     361           0 :     if (what == PyTrace_CALL)
     362           0 :         callback = self;
     363             :     else
     364           0 :         callback = frame->f_trace;
     365           0 :     if (callback == NULL)
     366           0 :         return 0;
     367           0 :     result = call_trampoline(tstate, callback, frame, what, arg);
     368           0 :     if (result == NULL) {
     369           0 :         PyEval_SetTrace(NULL, NULL);
     370           0 :         Py_CLEAR(frame->f_trace);
     371           0 :         return -1;
     372             :     }
     373           0 :     if (result != Py_None) {
     374           0 :         PyObject *temp = frame->f_trace;
     375           0 :         frame->f_trace = NULL;
     376           0 :         Py_XDECREF(temp);
     377           0 :         frame->f_trace = result;
     378             :     }
     379             :     else {
     380           0 :         Py_DECREF(result);
     381             :     }
     382           0 :     return 0;
     383             : }
     384             : 
     385             : static PyObject *
     386           0 : sys_settrace(PyObject *self, PyObject *args)
     387             : {
     388           0 :     if (trace_init() == -1)
     389           0 :         return NULL;
     390           0 :     if (args == Py_None)
     391           0 :         PyEval_SetTrace(NULL, NULL);
     392             :     else
     393           0 :         PyEval_SetTrace(trace_trampoline, args);
     394           0 :     Py_INCREF(Py_None);
     395           0 :     return Py_None;
     396             : }
     397             : 
     398             : PyDoc_STRVAR(settrace_doc,
     399             : "settrace(function)\n\
     400             : \n\
     401             : Set the global debug tracing function.  It will be called on each\n\
     402             : function call.  See the debugger chapter in the library manual."
     403             : );
     404             : 
     405             : static PyObject *
     406           0 : sys_gettrace(PyObject *self, PyObject *args)
     407             : {
     408           0 :     PyThreadState *tstate = PyThreadState_GET();
     409           0 :     PyObject *temp = tstate->c_traceobj;
     410             : 
     411           0 :     if (temp == NULL)
     412           0 :         temp = Py_None;
     413           0 :     Py_INCREF(temp);
     414           0 :     return temp;
     415             : }
     416             : 
     417             : PyDoc_STRVAR(gettrace_doc,
     418             : "gettrace()\n\
     419             : \n\
     420             : Return the global debug tracing function set with sys.settrace.\n\
     421             : See the debugger chapter in the library manual."
     422             : );
     423             : 
     424             : static PyObject *
     425           0 : sys_setprofile(PyObject *self, PyObject *args)
     426             : {
     427           0 :     if (trace_init() == -1)
     428           0 :         return NULL;
     429           0 :     if (args == Py_None)
     430           0 :         PyEval_SetProfile(NULL, NULL);
     431             :     else
     432           0 :         PyEval_SetProfile(profile_trampoline, args);
     433           0 :     Py_INCREF(Py_None);
     434           0 :     return Py_None;
     435             : }
     436             : 
     437             : PyDoc_STRVAR(setprofile_doc,
     438             : "setprofile(function)\n\
     439             : \n\
     440             : Set the profiling function.  It will be called on each function call\n\
     441             : and return.  See the profiler chapter in the library manual."
     442             : );
     443             : 
     444             : static PyObject *
     445           0 : sys_getprofile(PyObject *self, PyObject *args)
     446             : {
     447           0 :     PyThreadState *tstate = PyThreadState_GET();
     448           0 :     PyObject *temp = tstate->c_profileobj;
     449             : 
     450           0 :     if (temp == NULL)
     451           0 :         temp = Py_None;
     452           0 :     Py_INCREF(temp);
     453           0 :     return temp;
     454             : }
     455             : 
     456             : PyDoc_STRVAR(getprofile_doc,
     457             : "getprofile()\n\
     458             : \n\
     459             : Return the profiling function set with sys.setprofile.\n\
     460             : See the profiler chapter in the library manual."
     461             : );
     462             : 
     463             : static PyObject *
     464           0 : sys_setcheckinterval(PyObject *self, PyObject *args)
     465             : {
     466           0 :     if (!PyArg_ParseTuple(args, "i:setcheckinterval", &_Py_CheckInterval))
     467           0 :         return NULL;
     468           0 :     _Py_Ticker = _Py_CheckInterval;
     469           0 :     Py_INCREF(Py_None);
     470           0 :     return Py_None;
     471             : }
     472             : 
     473             : PyDoc_STRVAR(setcheckinterval_doc,
     474             : "setcheckinterval(n)\n\
     475             : \n\
     476             : Tell the Python interpreter to check for asynchronous events every\n\
     477             : n instructions.  This also affects how often thread switches occur."
     478             : );
     479             : 
     480             : static PyObject *
     481           0 : sys_getcheckinterval(PyObject *self, PyObject *args)
     482             : {
     483           0 :     return PyInt_FromLong(_Py_CheckInterval);
     484             : }
     485             : 
     486             : PyDoc_STRVAR(getcheckinterval_doc,
     487             : "getcheckinterval() -> current check interval; see setcheckinterval()."
     488             : );
     489             : 
     490             : #ifdef WITH_TSC
     491             : static PyObject *
     492             : sys_settscdump(PyObject *self, PyObject *args)
     493             : {
     494             :     int bool;
     495             :     PyThreadState *tstate = PyThreadState_Get();
     496             : 
     497             :     if (!PyArg_ParseTuple(args, "i:settscdump", &bool))
     498             :         return NULL;
     499             :     if (bool)
     500             :         tstate->interp->tscdump = 1;
     501             :     else
     502             :         tstate->interp->tscdump = 0;
     503             :     Py_INCREF(Py_None);
     504             :     return Py_None;
     505             : 
     506             : }
     507             : 
     508             : PyDoc_STRVAR(settscdump_doc,
     509             : "settscdump(bool)\n\
     510             : \n\
     511             : If true, tell the Python interpreter to dump VM measurements to\n\
     512             : stderr.  If false, turn off dump.  The measurements are based on the\n\
     513             : processor's time-stamp counter."
     514             : );
     515             : #endif /* TSC */
     516             : 
     517             : static PyObject *
     518           0 : sys_setrecursionlimit(PyObject *self, PyObject *args)
     519             : {
     520             :     int new_limit;
     521           0 :     if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit))
     522           0 :         return NULL;
     523           0 :     if (new_limit <= 0) {
     524           0 :         PyErr_SetString(PyExc_ValueError,
     525             :                         "recursion limit must be positive");
     526           0 :         return NULL;
     527             :     }
     528           0 :     Py_SetRecursionLimit(new_limit);
     529           0 :     Py_INCREF(Py_None);
     530           0 :     return Py_None;
     531             : }
     532             : 
     533             : PyDoc_STRVAR(setrecursionlimit_doc,
     534             : "setrecursionlimit(n)\n\
     535             : \n\
     536             : Set the maximum depth of the Python interpreter stack to n.  This\n\
     537             : limit prevents infinite recursion from causing an overflow of the C\n\
     538             : stack and crashing Python.  The highest possible limit is platform-\n\
     539             : dependent."
     540             : );
     541             : 
     542             : static PyObject *
     543           0 : sys_getrecursionlimit(PyObject *self)
     544             : {
     545           0 :     return PyInt_FromLong(Py_GetRecursionLimit());
     546             : }
     547             : 
     548             : PyDoc_STRVAR(getrecursionlimit_doc,
     549             : "getrecursionlimit()\n\
     550             : \n\
     551             : Return the current value of the recursion limit, the maximum depth\n\
     552             : of the Python interpreter stack.  This limit prevents infinite\n\
     553             : recursion from causing an overflow of the C stack and crashing Python."
     554             : );
     555             : 
     556             : #ifdef MS_WINDOWS
     557             : PyDoc_STRVAR(getwindowsversion_doc,
     558             : "getwindowsversion()\n\
     559             : \n\
     560             : Return information about the running version of Windows as a named tuple.\n\
     561             : The members are named: major, minor, build, platform, service_pack,\n\
     562             : service_pack_major, service_pack_minor, suite_mask, and product_type. For\n\
     563             : backward compatibility, only the first 5 items are available by indexing.\n\
     564             : All elements are numbers, except service_pack which is a string. Platform\n\
     565             : may be 0 for win32s, 1 for Windows 9x/ME, 2 for Windows NT/2000/XP/Vista/7,\n\
     566             : 3 for Windows CE. Product_type may be 1 for a workstation, 2 for a domain\n\
     567             : controller, 3 for a server."
     568             : );
     569             : 
     570             : static PyTypeObject WindowsVersionType = {0, 0, 0, 0, 0, 0};
     571             : 
     572             : static PyStructSequence_Field windows_version_fields[] = {
     573             :     {"major", "Major version number"},
     574             :     {"minor", "Minor version number"},
     575             :     {"build", "Build number"},
     576             :     {"platform", "Operating system platform"},
     577             :     {"service_pack", "Latest Service Pack installed on the system"},
     578             :     {"service_pack_major", "Service Pack major version number"},
     579             :     {"service_pack_minor", "Service Pack minor version number"},
     580             :     {"suite_mask", "Bit mask identifying available product suites"},
     581             :     {"product_type", "System product type"},
     582             :     {0}
     583             : };
     584             : 
     585             : static PyStructSequence_Desc windows_version_desc = {
     586             :     "sys.getwindowsversion",  /* name */
     587             :     getwindowsversion_doc,    /* doc */
     588             :     windows_version_fields,   /* fields */
     589             :     5                         /* For backward compatibility,
     590             :                                  only the first 5 items are accessible
     591             :                                  via indexing, the rest are name only */
     592             : };
     593             : 
     594             : static PyObject *
     595             : sys_getwindowsversion(PyObject *self)
     596             : {
     597             :     PyObject *version;
     598             :     int pos = 0;
     599             :     OSVERSIONINFOEX ver;
     600             :     ver.dwOSVersionInfoSize = sizeof(ver);
     601             :     if (!GetVersionEx((OSVERSIONINFO*) &ver))
     602             :         return PyErr_SetFromWindowsErr(0);
     603             : 
     604             :     version = PyStructSequence_New(&WindowsVersionType);
     605             :     if (version == NULL)
     606             :         return NULL;
     607             : 
     608             :     PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwMajorVersion));
     609             :     PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwMinorVersion));
     610             :     PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwBuildNumber));
     611             :     PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwPlatformId));
     612             :     PyStructSequence_SET_ITEM(version, pos++, PyString_FromString(ver.szCSDVersion));
     613             :     PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wServicePackMajor));
     614             :     PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wServicePackMinor));
     615             :     PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wSuiteMask));
     616             :     PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wProductType));
     617             : 
     618             :     if (PyErr_Occurred()) {
     619             :         Py_DECREF(version);
     620             :         return NULL;
     621             :     }
     622             :     return version;
     623             : }
     624             : 
     625             : #endif /* MS_WINDOWS */
     626             : 
     627             : #ifdef HAVE_DLOPEN
     628             : static PyObject *
     629           0 : sys_setdlopenflags(PyObject *self, PyObject *args)
     630             : {
     631             :     int new_val;
     632           0 :     PyThreadState *tstate = PyThreadState_GET();
     633           0 :     if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val))
     634           0 :         return NULL;
     635           0 :     if (!tstate)
     636           0 :         return NULL;
     637           0 :     tstate->interp->dlopenflags = new_val;
     638           0 :     Py_INCREF(Py_None);
     639           0 :     return Py_None;
     640             : }
     641             : 
     642             : PyDoc_STRVAR(setdlopenflags_doc,
     643             : "setdlopenflags(n) -> None\n\
     644             : \n\
     645             : Set the flags used by the interpreter for dlopen calls, such as when the\n\
     646             : interpreter loads extension modules.  Among other things, this will enable\n\
     647             : a lazy resolving of symbols when importing a module, if called as\n\
     648             : sys.setdlopenflags(0).  To share symbols across extension modules, call as\n\
     649             : sys.setdlopenflags(ctypes.RTLD_GLOBAL).  Symbolic names for the flag modules\n\
     650             : can be either found in the ctypes module, or in the DLFCN module. If DLFCN\n\
     651             : is not available, it can be generated from /usr/include/dlfcn.h using the\n\
     652             : h2py script.");
     653             : 
     654             : static PyObject *
     655           0 : sys_getdlopenflags(PyObject *self, PyObject *args)
     656             : {
     657           0 :     PyThreadState *tstate = PyThreadState_GET();
     658           0 :     if (!tstate)
     659           0 :         return NULL;
     660           0 :     return PyInt_FromLong(tstate->interp->dlopenflags);
     661             : }
     662             : 
     663             : PyDoc_STRVAR(getdlopenflags_doc,
     664             : "getdlopenflags() -> int\n\
     665             : \n\
     666             : Return the current value of the flags that are used for dlopen calls.\n\
     667             : The flag constants are defined in the ctypes and DLFCN modules.");
     668             : 
     669             : #endif  /* HAVE_DLOPEN */
     670             : 
     671             : #ifdef USE_MALLOPT
     672             : /* Link with -lmalloc (or -lmpc) on an SGI */
     673             : #include <malloc.h>
     674             : 
     675             : static PyObject *
     676             : sys_mdebug(PyObject *self, PyObject *args)
     677             : {
     678             :     int flag;
     679             :     if (!PyArg_ParseTuple(args, "i:mdebug", &flag))
     680             :         return NULL;
     681             :     mallopt(M_DEBUG, flag);
     682             :     Py_INCREF(Py_None);
     683             :     return Py_None;
     684             : }
     685             : #endif /* USE_MALLOPT */
     686             : 
     687             : size_t
     688           0 : _PySys_GetSizeOf(PyObject *o)
     689             : {
     690             :     static PyObject *str__sizeof__ = NULL;
     691           0 :     PyObject *res = NULL;
     692             :     Py_ssize_t size;
     693             : 
     694             :     /* Make sure the type is initialized. float gets initialized late */
     695           0 :     if (PyType_Ready(Py_TYPE(o)) < 0)
     696           0 :         return (size_t)-1;
     697             : 
     698             :     /* Instance of old-style class */
     699           0 :     if (PyInstance_Check(o))
     700           0 :         size = PyInstance_Type.tp_basicsize;
     701             :     /* all other objects */
     702             :     else {
     703           0 :         PyObject *method = _PyObject_LookupSpecial(o, "__sizeof__",
     704             :                                                    &str__sizeof__);
     705           0 :         if (method == NULL) {
     706           0 :             if (!PyErr_Occurred())
     707           0 :                 PyErr_Format(PyExc_TypeError,
     708             :                              "Type %.100s doesn't define __sizeof__",
     709           0 :                              Py_TYPE(o)->tp_name);
     710             :         }
     711             :         else {
     712           0 :             res = PyObject_CallFunctionObjArgs(method, NULL);
     713           0 :             Py_DECREF(method);
     714             :         }
     715             : 
     716           0 :         if (res == NULL)
     717           0 :             return (size_t)-1;
     718             : 
     719           0 :         size = (size_t)PyInt_AsSsize_t(res);
     720           0 :         Py_DECREF(res);
     721           0 :         if (size == -1 && PyErr_Occurred())
     722           0 :             return (size_t)-1;
     723             :     }
     724             : 
     725           0 :     if (size < 0) {
     726           0 :         PyErr_SetString(PyExc_ValueError, "__sizeof__() should return >= 0");
     727           0 :         return (size_t)-1;
     728             :     }
     729             : 
     730             :     /* add gc_head size */
     731           0 :     if (PyObject_IS_GC(o))
     732           0 :         return ((size_t)size) + sizeof(PyGC_Head);
     733           0 :     return (size_t)size;
     734             : }
     735             : 
     736             : static PyObject *
     737           0 : sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
     738             : {
     739             :     static char *kwlist[] = {"object", "default", 0};
     740             :     size_t size;
     741           0 :     PyObject *o, *dflt = NULL;
     742             : 
     743           0 :     if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof",
     744             :                                      kwlist, &o, &dflt))
     745           0 :         return NULL;
     746             : 
     747           0 :     size = _PySys_GetSizeOf(o);
     748             : 
     749           0 :     if (size == (size_t)-1 && PyErr_Occurred()) {
     750             :         /* Has a default value been given */
     751           0 :         if (dflt != NULL && PyErr_ExceptionMatches(PyExc_TypeError)) {
     752           0 :             PyErr_Clear();
     753           0 :             Py_INCREF(dflt);
     754           0 :             return dflt;
     755             :         }
     756             :         else
     757           0 :             return NULL;
     758             :     }
     759             : 
     760           0 :     return PyInt_FromSize_t(size);
     761             : }
     762             : 
     763             : PyDoc_STRVAR(getsizeof_doc,
     764             : "getsizeof(object, default) -> int\n\
     765             : \n\
     766             : Return the size of object in bytes.");
     767             : 
     768             : static PyObject *
     769           0 : sys_getrefcount(PyObject *self, PyObject *arg)
     770             : {
     771           0 :     return PyInt_FromSsize_t(arg->ob_refcnt);
     772             : }
     773             : 
     774             : #ifdef Py_REF_DEBUG
     775             : static PyObject *
     776             : sys_gettotalrefcount(PyObject *self)
     777             : {
     778             :     return PyInt_FromSsize_t(_Py_GetRefTotal());
     779             : }
     780             : #endif /* Py_REF_DEBUG */
     781             : 
     782             : PyDoc_STRVAR(getrefcount_doc,
     783             : "getrefcount(object) -> integer\n\
     784             : \n\
     785             : Return the reference count of object.  The count returned is generally\n\
     786             : one higher than you might expect, because it includes the (temporary)\n\
     787             : reference as an argument to getrefcount()."
     788             : );
     789             : 
     790             : #ifdef COUNT_ALLOCS
     791             : static PyObject *
     792             : sys_getcounts(PyObject *self)
     793             : {
     794             :     extern PyObject *get_counts(void);
     795             : 
     796             :     return get_counts();
     797             : }
     798             : #endif
     799             : 
     800             : PyDoc_STRVAR(getframe_doc,
     801             : "_getframe([depth]) -> frameobject\n\
     802             : \n\
     803             : Return a frame object from the call stack.  If optional integer depth is\n\
     804             : given, return the frame object that many calls below the top of the stack.\n\
     805             : If that is deeper than the call stack, ValueError is raised.  The default\n\
     806             : for depth is zero, returning the frame at the top of the call stack.\n\
     807             : \n\
     808             : This function should be used for internal and specialized\n\
     809             : purposes only."
     810             : );
     811             : 
     812             : static PyObject *
     813          27 : sys_getframe(PyObject *self, PyObject *args)
     814             : {
     815          27 :     PyFrameObject *f = PyThreadState_GET()->frame;
     816          27 :     int depth = -1;
     817             : 
     818          27 :     if (!PyArg_ParseTuple(args, "|i:_getframe", &depth))
     819           0 :         return NULL;
     820             : 
     821          81 :     while (depth > 0 && f != NULL) {
     822          27 :         f = f->f_back;
     823          27 :         --depth;
     824             :     }
     825          27 :     if (f == NULL) {
     826           0 :         PyErr_SetString(PyExc_ValueError,
     827             :                         "call stack is not deep enough");
     828           0 :         return NULL;
     829             :     }
     830          27 :     Py_INCREF(f);
     831          27 :     return (PyObject*)f;
     832             : }
     833             : 
     834             : PyDoc_STRVAR(current_frames_doc,
     835             : "_current_frames() -> dictionary\n\
     836             : \n\
     837             : Return a dictionary mapping each current thread T's thread id to T's\n\
     838             : current stack frame.\n\
     839             : \n\
     840             : This function should be used for specialized purposes only."
     841             : );
     842             : 
     843             : static PyObject *
     844           0 : sys_current_frames(PyObject *self, PyObject *noargs)
     845             : {
     846           0 :     return _PyThread_CurrentFrames();
     847             : }
     848             : 
     849             : PyDoc_STRVAR(call_tracing_doc,
     850             : "call_tracing(func, args) -> object\n\
     851             : \n\
     852             : Call func(*args), while tracing is enabled.  The tracing state is\n\
     853             : saved, and restored afterwards.  This is intended to be called from\n\
     854             : a debugger from a checkpoint, to recursively debug some other code."
     855             : );
     856             : 
     857             : static PyObject *
     858           0 : sys_call_tracing(PyObject *self, PyObject *args)
     859             : {
     860             :     PyObject *func, *funcargs;
     861           0 :     if (!PyArg_ParseTuple(args, "OO!:call_tracing", &func, &PyTuple_Type, &funcargs))
     862           0 :         return NULL;
     863           0 :     return _PyEval_CallTracing(func, funcargs);
     864             : }
     865             : 
     866             : PyDoc_STRVAR(callstats_doc,
     867             : "callstats() -> tuple of integers\n\
     868             : \n\
     869             : Return a tuple of function call statistics, if CALL_PROFILE was defined\n\
     870             : when Python was built.  Otherwise, return None.\n\
     871             : \n\
     872             : When enabled, this function returns detailed, implementation-specific\n\
     873             : details about the number of function calls executed. The return value is\n\
     874             : a 11-tuple where the entries in the tuple are counts of:\n\
     875             : 0. all function calls\n\
     876             : 1. calls to PyFunction_Type objects\n\
     877             : 2. PyFunction calls that do not create an argument tuple\n\
     878             : 3. PyFunction calls that do not create an argument tuple\n\
     879             :    and bypass PyEval_EvalCodeEx()\n\
     880             : 4. PyMethod calls\n\
     881             : 5. PyMethod calls on bound methods\n\
     882             : 6. PyType calls\n\
     883             : 7. PyCFunction calls\n\
     884             : 8. generator calls\n\
     885             : 9. All other calls\n\
     886             : 10. Number of stack pops performed by call_function()"
     887             : );
     888             : 
     889             : #ifdef __cplusplus
     890             : extern "C" {
     891             : #endif
     892             : 
     893             : #ifdef Py_TRACE_REFS
     894             : /* Defined in objects.c because it uses static globals if that file */
     895             : extern PyObject *_Py_GetObjects(PyObject *, PyObject *);
     896             : #endif
     897             : 
     898             : #ifdef DYNAMIC_EXECUTION_PROFILE
     899             : /* Defined in ceval.c because it uses static globals if that file */
     900             : extern PyObject *_Py_GetDXProfile(PyObject *,  PyObject *);
     901             : #endif
     902             : 
     903             : #ifdef __cplusplus
     904             : }
     905             : #endif
     906             : 
     907             : static PyObject *
     908           0 : sys_clear_type_cache(PyObject* self, PyObject* args)
     909             : {
     910           0 :     PyType_ClearCache();
     911           0 :     Py_RETURN_NONE;
     912             : }
     913             : 
     914             : PyDoc_STRVAR(sys_clear_type_cache__doc__,
     915             : "_clear_type_cache() -> None\n\
     916             : Clear the internal type lookup cache.");
     917             : 
     918             : 
     919             : static PyMethodDef sys_methods[] = {
     920             :     /* Might as well keep this in alphabetic order */
     921             :     {"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS,
     922             :      callstats_doc},
     923             :     {"_clear_type_cache",       sys_clear_type_cache,     METH_NOARGS,
     924             :      sys_clear_type_cache__doc__},
     925             :     {"_current_frames", sys_current_frames, METH_NOARGS,
     926             :      current_frames_doc},
     927             :     {"displayhook",     sys_displayhook, METH_O, displayhook_doc},
     928             :     {"exc_info",        sys_exc_info, METH_NOARGS, exc_info_doc},
     929             :     {"exc_clear",       sys_exc_clear, METH_NOARGS, exc_clear_doc},
     930             :     {"excepthook",      sys_excepthook, METH_VARARGS, excepthook_doc},
     931             :     {"exit",            sys_exit, METH_VARARGS, exit_doc},
     932             : #ifdef Py_USING_UNICODE
     933             :     {"getdefaultencoding", (PyCFunction)sys_getdefaultencoding,
     934             :      METH_NOARGS, getdefaultencoding_doc},
     935             : #endif
     936             : #ifdef HAVE_DLOPEN
     937             :     {"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS,
     938             :      getdlopenflags_doc},
     939             : #endif
     940             : #ifdef COUNT_ALLOCS
     941             :     {"getcounts",       (PyCFunction)sys_getcounts, METH_NOARGS},
     942             : #endif
     943             : #ifdef DYNAMIC_EXECUTION_PROFILE
     944             :     {"getdxp",          _Py_GetDXProfile, METH_VARARGS},
     945             : #endif
     946             : #ifdef Py_USING_UNICODE
     947             :     {"getfilesystemencoding", (PyCFunction)sys_getfilesystemencoding,
     948             :      METH_NOARGS, getfilesystemencoding_doc},
     949             : #endif
     950             : #ifdef Py_TRACE_REFS
     951             :     {"getobjects",      _Py_GetObjects, METH_VARARGS},
     952             : #endif
     953             : #ifdef Py_REF_DEBUG
     954             :     {"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS},
     955             : #endif
     956             :     {"getrefcount",     (PyCFunction)sys_getrefcount, METH_O, getrefcount_doc},
     957             :     {"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS,
     958             :      getrecursionlimit_doc},
     959             :     {"getsizeof",   (PyCFunction)sys_getsizeof,
     960             :      METH_VARARGS | METH_KEYWORDS, getsizeof_doc},
     961             :     {"_getframe", sys_getframe, METH_VARARGS, getframe_doc},
     962             : #ifdef MS_WINDOWS
     963             :     {"getwindowsversion", (PyCFunction)sys_getwindowsversion, METH_NOARGS,
     964             :      getwindowsversion_doc},
     965             : #endif /* MS_WINDOWS */
     966             : #ifdef USE_MALLOPT
     967             :     {"mdebug",          sys_mdebug, METH_VARARGS},
     968             : #endif
     969             : #ifdef Py_USING_UNICODE
     970             :     {"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS,
     971             :      setdefaultencoding_doc},
     972             : #endif
     973             :     {"setcheckinterval",        sys_setcheckinterval, METH_VARARGS,
     974             :      setcheckinterval_doc},
     975             :     {"getcheckinterval",        sys_getcheckinterval, METH_NOARGS,
     976             :      getcheckinterval_doc},
     977             : #ifdef HAVE_DLOPEN
     978             :     {"setdlopenflags", sys_setdlopenflags, METH_VARARGS,
     979             :      setdlopenflags_doc},
     980             : #endif
     981             :     {"setprofile",      sys_setprofile, METH_O, setprofile_doc},
     982             :     {"getprofile",      sys_getprofile, METH_NOARGS, getprofile_doc},
     983             :     {"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS,
     984             :      setrecursionlimit_doc},
     985             : #ifdef WITH_TSC
     986             :     {"settscdump", sys_settscdump, METH_VARARGS, settscdump_doc},
     987             : #endif
     988             :     {"settrace",        sys_settrace, METH_O, settrace_doc},
     989             :     {"gettrace",        sys_gettrace, METH_NOARGS, gettrace_doc},
     990             :     {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc},
     991             :     {NULL,              NULL}           /* sentinel */
     992             : };
     993             : 
     994             : static PyObject *
     995           3 : list_builtin_module_names(void)
     996             : {
     997           3 :     PyObject *list = PyList_New(0);
     998             :     int i;
     999           3 :     if (list == NULL)
    1000           0 :         return NULL;
    1001          63 :     for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
    1002          60 :         PyObject *name = PyString_FromString(
    1003          60 :             PyImport_Inittab[i].name);
    1004          60 :         if (name == NULL)
    1005           0 :             break;
    1006          60 :         PyList_Append(list, name);
    1007          60 :         Py_DECREF(name);
    1008             :     }
    1009           3 :     if (PyList_Sort(list) != 0) {
    1010           0 :         Py_DECREF(list);
    1011           0 :         list = NULL;
    1012             :     }
    1013           3 :     if (list) {
    1014           3 :         PyObject *v = PyList_AsTuple(list);
    1015           3 :         Py_DECREF(list);
    1016           3 :         list = v;
    1017             :     }
    1018           3 :     return list;
    1019             : }
    1020             : 
    1021             : static PyObject *warnoptions = NULL;
    1022             : 
    1023             : void
    1024           3 : PySys_ResetWarnOptions(void)
    1025             : {
    1026           3 :     if (warnoptions == NULL || !PyList_Check(warnoptions))
    1027           6 :         return;
    1028           0 :     PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL);
    1029             : }
    1030             : 
    1031             : void
    1032           0 : PySys_AddWarnOption(char *s)
    1033             : {
    1034             :     PyObject *str;
    1035             : 
    1036           0 :     if (warnoptions == NULL || !PyList_Check(warnoptions)) {
    1037           0 :         Py_XDECREF(warnoptions);
    1038           0 :         warnoptions = PyList_New(0);
    1039           0 :         if (warnoptions == NULL)
    1040           0 :             return;
    1041             :     }
    1042           0 :     str = PyString_FromString(s);
    1043           0 :     if (str != NULL) {
    1044           0 :         PyList_Append(warnoptions, str);
    1045           0 :         Py_DECREF(str);
    1046             :     }
    1047             : }
    1048             : 
    1049             : int
    1050           3 : PySys_HasWarnOptions(void)
    1051             : {
    1052           3 :     return (warnoptions != NULL && (PyList_Size(warnoptions) > 0)) ? 1 : 0;
    1053             : }
    1054             : 
    1055             : /* XXX This doc string is too long to be a single string literal in VC++ 5.0.
    1056             :    Two literals concatenated works just fine.  If you have a K&R compiler
    1057             :    or other abomination that however *does* understand longer strings,
    1058             :    get rid of the !!! comment in the middle and the quotes that surround it. */
    1059             : PyDoc_VAR(sys_doc) =
    1060             : PyDoc_STR(
    1061             : "This module provides access to some objects used or maintained by the\n\
    1062             : interpreter and to functions that interact strongly with the interpreter.\n\
    1063             : \n\
    1064             : Dynamic objects:\n\
    1065             : \n\
    1066             : argv -- command line arguments; argv[0] is the script pathname if known\n\
    1067             : path -- module search path; path[0] is the script directory, else ''\n\
    1068             : modules -- dictionary of loaded modules\n\
    1069             : \n\
    1070             : displayhook -- called to show results in an interactive session\n\
    1071             : excepthook -- called to handle any uncaught exception other than SystemExit\n\
    1072             :   To customize printing in an interactive session or to install a custom\n\
    1073             :   top-level exception handler, assign other functions to replace these.\n\
    1074             : \n\
    1075             : exitfunc -- if sys.exitfunc exists, this routine is called when Python exits\n\
    1076             :   Assigning to sys.exitfunc is deprecated; use the atexit module instead.\n\
    1077             : \n\
    1078             : stdin -- standard input file object; used by raw_input() and input()\n\
    1079             : stdout -- standard output file object; used by the print statement\n\
    1080             : stderr -- standard error object; used for error messages\n\
    1081             :   By assigning other file objects (or objects that behave like files)\n\
    1082             :   to these, it is possible to redirect all of the interpreter's I/O.\n\
    1083             : \n\
    1084             : last_type -- type of last uncaught exception\n\
    1085             : last_value -- value of last uncaught exception\n\
    1086             : last_traceback -- traceback of last uncaught exception\n\
    1087             :   These three are only available in an interactive session after a\n\
    1088             :   traceback has been printed.\n\
    1089             : \n\
    1090             : exc_type -- type of exception currently being handled\n\
    1091             : exc_value -- value of exception currently being handled\n\
    1092             : exc_traceback -- traceback of exception currently being handled\n\
    1093             :   The function exc_info() should be used instead of these three,\n\
    1094             :   because it is thread-safe.\n\
    1095             : "
    1096             : )
    1097             : /* concatenating string here */
    1098             : PyDoc_STR(
    1099             : "\n\
    1100             : Static objects:\n\
    1101             : \n\
    1102             : float_info -- a dict with information about the float inplementation.\n\
    1103             : long_info -- a struct sequence with information about the long implementation.\n\
    1104             : maxint -- the largest supported integer (the smallest is -maxint-1)\n\
    1105             : maxsize -- the largest supported length of containers.\n\
    1106             : maxunicode -- the largest supported character\n\
    1107             : builtin_module_names -- tuple of module names built into this interpreter\n\
    1108             : version -- the version of this interpreter as a string\n\
    1109             : version_info -- version information as a named tuple\n\
    1110             : hexversion -- version information encoded as a single integer\n\
    1111             : copyright -- copyright notice pertaining to this interpreter\n\
    1112             : platform -- platform identifier\n\
    1113             : executable -- absolute path of the executable binary of the Python interpreter\n\
    1114             : prefix -- prefix used to find the Python library\n\
    1115             : exec_prefix -- prefix used to find the machine-specific Python library\n\
    1116             : float_repr_style -- string indicating the style of repr() output for floats\n\
    1117             : "
    1118             : )
    1119             : #ifdef MS_WINDOWS
    1120             : /* concatenating string here */
    1121             : PyDoc_STR(
    1122             : "dllhandle -- [Windows only] integer handle of the Python DLL\n\
    1123             : winver -- [Windows only] version number of the Python DLL\n\
    1124             : "
    1125             : )
    1126             : #endif /* MS_WINDOWS */
    1127             : PyDoc_STR(
    1128             : "__stdin__ -- the original stdin; don't touch!\n\
    1129             : __stdout__ -- the original stdout; don't touch!\n\
    1130             : __stderr__ -- the original stderr; don't touch!\n\
    1131             : __displayhook__ -- the original displayhook; don't touch!\n\
    1132             : __excepthook__ -- the original excepthook; don't touch!\n\
    1133             : \n\
    1134             : Functions:\n\
    1135             : \n\
    1136             : displayhook() -- print an object to the screen, and save it in __builtin__._\n\
    1137             : excepthook() -- print an exception and its traceback to sys.stderr\n\
    1138             : exc_info() -- return thread-safe information about the current exception\n\
    1139             : exc_clear() -- clear the exception state for the current thread\n\
    1140             : exit() -- exit the interpreter by raising SystemExit\n\
    1141             : getdlopenflags() -- returns flags to be used for dlopen() calls\n\
    1142             : getprofile() -- get the global profiling function\n\
    1143             : getrefcount() -- return the reference count for an object (plus one :-)\n\
    1144             : getrecursionlimit() -- return the max recursion depth for the interpreter\n\
    1145             : getsizeof() -- return the size of an object in bytes\n\
    1146             : gettrace() -- get the global debug tracing function\n\
    1147             : setcheckinterval() -- control how often the interpreter checks for events\n\
    1148             : setdlopenflags() -- set the flags to be used for dlopen() calls\n\
    1149             : setprofile() -- set the global profiling function\n\
    1150             : setrecursionlimit() -- set the max recursion depth for the interpreter\n\
    1151             : settrace() -- set the global debug tracing function\n\
    1152             : "
    1153             : )
    1154             : /* end of sys_doc */ ;
    1155             : 
    1156             : static int
    1157           6 : _check_and_flush (FILE *stream)
    1158             : {
    1159           6 :   int prev_fail = ferror (stream);
    1160           6 :   return fflush (stream) || prev_fail ? EOF : 0;
    1161             : }
    1162             : 
    1163             : /* Subversion branch and revision management */
    1164             : static int svn_initialized;
    1165             : static char patchlevel_revision[50]; /* Just the number */
    1166             : static char branch[50];
    1167             : static char shortbranch[50];
    1168             : static const char *svn_revision;
    1169             : 
    1170             : static void
    1171           3 : svnversion_init(void)
    1172             : {
    1173           3 :     if (svn_initialized)
    1174           0 :         return;
    1175           3 :     svn_initialized = 1;
    1176           3 :     *patchlevel_revision = '\0';
    1177           3 :     strcpy(branch, "");
    1178           3 :     strcpy(shortbranch, "unknown");
    1179           3 :     svn_revision = "";
    1180           3 :     return;
    1181             : }
    1182             : 
    1183             : /* Return svnversion output if available.
    1184             :    Else return Revision of patchlevel.h if on branch.
    1185             :    Else return empty string */
    1186             : const char*
    1187           0 : Py_SubversionRevision()
    1188             : {
    1189           0 :     svnversion_init();
    1190           0 :     return svn_revision;
    1191             : }
    1192             : 
    1193             : const char*
    1194           0 : Py_SubversionShortBranch()
    1195             : {
    1196           0 :     svnversion_init();
    1197           0 :     return shortbranch;
    1198             : }
    1199             : 
    1200             : 
    1201             : PyDoc_STRVAR(flags__doc__,
    1202             : "sys.flags\n\
    1203             : \n\
    1204             : Flags provided through command line arguments or environment vars.");
    1205             : 
    1206             : static PyTypeObject FlagsType = {0, 0, 0, 0, 0, 0};
    1207             : 
    1208             : static PyStructSequence_Field flags_fields[] = {
    1209             :     {"debug",                   "-d"},
    1210             :     {"py3k_warning",            "-3"},
    1211             :     {"division_warning",        "-Q"},
    1212             :     {"division_new",            "-Qnew"},
    1213             :     {"inspect",                 "-i"},
    1214             :     {"interactive",             "-i"},
    1215             :     {"optimize",                "-O or -OO"},
    1216             :     {"dont_write_bytecode",     "-B"},
    1217             :     {"no_user_site",            "-s"},
    1218             :     {"no_site",                 "-S"},
    1219             :     {"ignore_environment",      "-E"},
    1220             :     {"tabcheck",                "-t or -tt"},
    1221             :     {"verbose",                 "-v"},
    1222             : #ifdef RISCOS
    1223             :     {"riscos_wimp",             "???"},
    1224             : #endif
    1225             :     /* {"unbuffered",                   "-u"}, */
    1226             :     {"unicode",                 "-U"},
    1227             :     /* {"skip_first",                   "-x"}, */
    1228             :     {"bytes_warning", "-b"},
    1229             :     {"hash_randomization", "-R"},
    1230             :     {0}
    1231             : };
    1232             : 
    1233             : static PyStructSequence_Desc flags_desc = {
    1234             :     "sys.flags",        /* name */
    1235             :     flags__doc__,       /* doc */
    1236             :     flags_fields,       /* fields */
    1237             : #ifdef RISCOS
    1238             :     17
    1239             : #else
    1240             :     16
    1241             : #endif
    1242             : };
    1243             : 
    1244             : static PyObject*
    1245           3 : make_flags(void)
    1246             : {
    1247           3 :     int pos = 0;
    1248             :     PyObject *seq;
    1249             : 
    1250           3 :     seq = PyStructSequence_New(&FlagsType);
    1251           3 :     if (seq == NULL)
    1252           0 :         return NULL;
    1253             : 
    1254             : #define SetFlag(flag) \
    1255             :     PyStructSequence_SET_ITEM(seq, pos++, PyInt_FromLong(flag))
    1256             : 
    1257           3 :     SetFlag(Py_DebugFlag);
    1258           3 :     SetFlag(Py_Py3kWarningFlag);
    1259           3 :     SetFlag(Py_DivisionWarningFlag);
    1260           3 :     SetFlag(_Py_QnewFlag);
    1261           3 :     SetFlag(Py_InspectFlag);
    1262           3 :     SetFlag(Py_InteractiveFlag);
    1263           3 :     SetFlag(Py_OptimizeFlag);
    1264           3 :     SetFlag(Py_DontWriteBytecodeFlag);
    1265           3 :     SetFlag(Py_NoUserSiteDirectory);
    1266           3 :     SetFlag(Py_NoSiteFlag);
    1267           3 :     SetFlag(Py_IgnoreEnvironmentFlag);
    1268           3 :     SetFlag(Py_TabcheckFlag);
    1269           3 :     SetFlag(Py_VerboseFlag);
    1270             : #ifdef RISCOS
    1271             :     SetFlag(Py_RISCOSWimpFlag);
    1272             : #endif
    1273             :     /* SetFlag(saw_unbuffered_flag); */
    1274           3 :     SetFlag(Py_UnicodeFlag);
    1275             :     /* SetFlag(skipfirstline); */
    1276           3 :     SetFlag(Py_BytesWarningFlag);
    1277           3 :     SetFlag(Py_HashRandomizationFlag);
    1278             : #undef SetFlag
    1279             : 
    1280           3 :     if (PyErr_Occurred()) {
    1281           0 :         Py_DECREF(seq);
    1282           0 :         return NULL;
    1283             :     }
    1284           3 :     return seq;
    1285             : }
    1286             : 
    1287             : PyDoc_STRVAR(version_info__doc__,
    1288             : "sys.version_info\n\
    1289             : \n\
    1290             : Version information as a named tuple.");
    1291             : 
    1292             : static PyTypeObject VersionInfoType = {0, 0, 0, 0, 0, 0};
    1293             : 
    1294             : static PyStructSequence_Field version_info_fields[] = {
    1295             :     {"major", "Major release number"},
    1296             :     {"minor", "Minor release number"},
    1297             :     {"micro", "Patch release number"},
    1298             :     {"releaselevel", "'alpha', 'beta', 'candidate', or 'final'"},
    1299             :     {"serial", "Serial release number"},
    1300             :     {0}
    1301             : };
    1302             : 
    1303             : static PyStructSequence_Desc version_info_desc = {
    1304             :     "sys.version_info",     /* name */
    1305             :     version_info__doc__,    /* doc */
    1306             :     version_info_fields,    /* fields */
    1307             :     5
    1308             : };
    1309             : 
    1310             : static PyObject *
    1311           3 : make_version_info(void)
    1312             : {
    1313             :     PyObject *version_info;
    1314             :     char *s;
    1315           3 :     int pos = 0;
    1316             : 
    1317           3 :     version_info = PyStructSequence_New(&VersionInfoType);
    1318           3 :     if (version_info == NULL) {
    1319           0 :         return NULL;
    1320             :     }
    1321             : 
    1322             :     /*
    1323             :      * These release level checks are mutually exclusive and cover
    1324             :      * the field, so don't get too fancy with the pre-processor!
    1325             :      */
    1326             : #if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
    1327             :     s = "alpha";
    1328             : #elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
    1329             :     s = "beta";
    1330             : #elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
    1331             :     s = "candidate";
    1332             : #elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
    1333           3 :     s = "final";
    1334             : #endif
    1335             : 
    1336             : #define SetIntItem(flag) \
    1337             :     PyStructSequence_SET_ITEM(version_info, pos++, PyInt_FromLong(flag))
    1338             : #define SetStrItem(flag) \
    1339             :     PyStructSequence_SET_ITEM(version_info, pos++, PyString_FromString(flag))
    1340             : 
    1341           3 :     SetIntItem(PY_MAJOR_VERSION);
    1342           3 :     SetIntItem(PY_MINOR_VERSION);
    1343           3 :     SetIntItem(PY_MICRO_VERSION);
    1344           3 :     SetStrItem(s);
    1345           3 :     SetIntItem(PY_RELEASE_SERIAL);
    1346             : #undef SetIntItem
    1347             : #undef SetStrItem
    1348             : 
    1349           3 :     if (PyErr_Occurred()) {
    1350           0 :         Py_CLEAR(version_info);
    1351           0 :         return NULL;
    1352             :     }
    1353           3 :     return version_info;
    1354             : }
    1355             : 
    1356             : PyObject *
    1357           3 : _PySys_Init(void)
    1358             : {
    1359             :     PyObject *m, *v, *sysdict;
    1360             :     PyObject *sysin, *sysout, *syserr;
    1361             :     char *s;
    1362             : 
    1363           3 :     m = Py_InitModule3("sys", sys_methods, sys_doc);
    1364           3 :     if (m == NULL)
    1365           0 :         return NULL;
    1366           3 :     sysdict = PyModule_GetDict(m);
    1367             : #define SET_SYS_FROM_STRING(key, value)                 \
    1368             :     v = value;                                          \
    1369             :     if (v != NULL)                                      \
    1370             :         PyDict_SetItemString(sysdict, key, v);          \
    1371             :     Py_XDECREF(v)
    1372             : 
    1373             :     /* Check that stdin is not a directory
    1374             :     Using shell redirection, you can redirect stdin to a directory,
    1375             :     crashing the Python interpreter. Catch this common mistake here
    1376             :     and output a useful error message. Note that under MS Windows,
    1377             :     the shell already prevents that. */
    1378             : #if !defined(MS_WINDOWS)
    1379             :     {
    1380             :         struct stat sb;
    1381           6 :         if (fstat(fileno(stdin), &sb) == 0 &&
    1382           3 :             S_ISDIR(sb.st_mode)) {
    1383             :             /* There's nothing more we can do. */
    1384             :             /* Py_FatalError() will core dump, so just exit. */
    1385           0 :             PySys_WriteStderr("Python error: <stdin> is a directory, cannot continue\n");
    1386           0 :             exit(EXIT_FAILURE);
    1387             :         }
    1388             :     }
    1389             : #endif
    1390             : 
    1391             :     /* Closing the standard FILE* if sys.std* goes aways causes problems
    1392             :      * for embedded Python usages. Closing them when somebody explicitly
    1393             :      * invokes .close() might be possible, but the FAQ promises they get
    1394             :      * never closed. However, we still need to get write errors when
    1395             :      * writing fails (e.g. because stdout is redirected), so we flush the
    1396             :      * streams and check for errors before the file objects are deleted.
    1397             :      * On OS X, fflush()ing stdin causes an error, so we exempt stdin
    1398             :      * from that procedure.
    1399             :      */
    1400           3 :     sysin = PyFile_FromFile(stdin, "<stdin>", "r", NULL);
    1401           3 :     sysout = PyFile_FromFile(stdout, "<stdout>", "w", _check_and_flush);
    1402           3 :     syserr = PyFile_FromFile(stderr, "<stderr>", "w", _check_and_flush);
    1403           3 :     if (PyErr_Occurred())
    1404           0 :         return NULL;
    1405             : 
    1406           3 :     PyDict_SetItemString(sysdict, "stdin", sysin);
    1407           3 :     PyDict_SetItemString(sysdict, "stdout", sysout);
    1408           3 :     PyDict_SetItemString(sysdict, "stderr", syserr);
    1409             :     /* Make backup copies for cleanup */
    1410           3 :     PyDict_SetItemString(sysdict, "__stdin__", sysin);
    1411           3 :     PyDict_SetItemString(sysdict, "__stdout__", sysout);
    1412           3 :     PyDict_SetItemString(sysdict, "__stderr__", syserr);
    1413           3 :     PyDict_SetItemString(sysdict, "__displayhook__",
    1414             :                          PyDict_GetItemString(sysdict, "displayhook"));
    1415           3 :     PyDict_SetItemString(sysdict, "__excepthook__",
    1416             :                          PyDict_GetItemString(sysdict, "excepthook"));
    1417           3 :     Py_XDECREF(sysin);
    1418           3 :     Py_XDECREF(sysout);
    1419           3 :     Py_XDECREF(syserr);
    1420             : 
    1421           3 :     SET_SYS_FROM_STRING("version",
    1422             :                          PyString_FromString(Py_GetVersion()));
    1423           3 :     SET_SYS_FROM_STRING("hexversion",
    1424             :                          PyInt_FromLong(PY_VERSION_HEX));
    1425           3 :     svnversion_init();
    1426           3 :     SET_SYS_FROM_STRING("subversion",
    1427             :                          Py_BuildValue("(ssz)", "CPython", branch,
    1428             :                                       svn_revision));
    1429           3 :     SET_SYS_FROM_STRING("_mercurial",
    1430             :                         Py_BuildValue("(szz)", "CPython", _Py_hgidentifier(),
    1431             :                                       _Py_hgversion()));
    1432           3 :     SET_SYS_FROM_STRING("dont_write_bytecode",
    1433             :                          PyBool_FromLong(Py_DontWriteBytecodeFlag));
    1434           3 :     SET_SYS_FROM_STRING("api_version",
    1435             :                         PyInt_FromLong(PYTHON_API_VERSION));
    1436           3 :     SET_SYS_FROM_STRING("copyright",
    1437             :                         PyString_FromString(Py_GetCopyright()));
    1438           3 :     SET_SYS_FROM_STRING("platform",
    1439             :                         PyString_FromString(Py_GetPlatform()));
    1440           3 :     SET_SYS_FROM_STRING("executable",
    1441             :                         PyString_FromString(Py_GetProgramFullPath()));
    1442           3 :     SET_SYS_FROM_STRING("prefix",
    1443             :                         PyString_FromString(Py_GetPrefix()));
    1444           3 :     SET_SYS_FROM_STRING("exec_prefix",
    1445             :                         PyString_FromString(Py_GetExecPrefix()));
    1446           3 :     SET_SYS_FROM_STRING("maxsize",
    1447             :                         PyInt_FromSsize_t(PY_SSIZE_T_MAX));
    1448           3 :     SET_SYS_FROM_STRING("maxint",
    1449             :                         PyInt_FromLong(PyInt_GetMax()));
    1450           3 :     SET_SYS_FROM_STRING("py3kwarning",
    1451             :                         PyBool_FromLong(Py_Py3kWarningFlag));
    1452           3 :     SET_SYS_FROM_STRING("float_info",
    1453             :                         PyFloat_GetInfo());
    1454           3 :     SET_SYS_FROM_STRING("long_info",
    1455             :                         PyLong_GetInfo());
    1456             : #ifdef Py_USING_UNICODE
    1457           3 :     SET_SYS_FROM_STRING("maxunicode",
    1458             :                         PyInt_FromLong(PyUnicode_GetMax()));
    1459             : #endif
    1460           3 :     SET_SYS_FROM_STRING("builtin_module_names",
    1461             :                         list_builtin_module_names());
    1462             :     {
    1463             :         /* Assumes that longs are at least 2 bytes long.
    1464             :            Should be safe! */
    1465           3 :         unsigned long number = 1;
    1466             :         char *value;
    1467             : 
    1468           3 :         s = (char *) &number;
    1469           3 :         if (s[0] == 0)
    1470           0 :             value = "big";
    1471             :         else
    1472           3 :             value = "little";
    1473           3 :         SET_SYS_FROM_STRING("byteorder",
    1474             :                             PyString_FromString(value));
    1475             :     }
    1476             : #ifdef MS_COREDLL
    1477             :     SET_SYS_FROM_STRING("dllhandle",
    1478             :                         PyLong_FromVoidPtr(PyWin_DLLhModule));
    1479             :     SET_SYS_FROM_STRING("winver",
    1480             :                         PyString_FromString(PyWin_DLLVersionString));
    1481             : #endif
    1482           3 :     if (warnoptions == NULL) {
    1483           3 :         warnoptions = PyList_New(0);
    1484             :     }
    1485             :     else {
    1486           0 :         Py_INCREF(warnoptions);
    1487             :     }
    1488           3 :     if (warnoptions != NULL) {
    1489           3 :         PyDict_SetItemString(sysdict, "warnoptions", warnoptions);
    1490             :     }
    1491             : 
    1492             :     /* version_info */
    1493           3 :     if (VersionInfoType.tp_name == 0)
    1494           3 :         PyStructSequence_InitType(&VersionInfoType, &version_info_desc);
    1495           3 :     SET_SYS_FROM_STRING("version_info", make_version_info());
    1496             :     /* prevent user from creating new instances */
    1497           3 :     VersionInfoType.tp_init = NULL;
    1498           3 :     VersionInfoType.tp_new = NULL;
    1499             : 
    1500             :     /* flags */
    1501           3 :     if (FlagsType.tp_name == 0)
    1502           3 :         PyStructSequence_InitType(&FlagsType, &flags_desc);
    1503           3 :     SET_SYS_FROM_STRING("flags", make_flags());
    1504             :     /* prevent user from creating new instances */
    1505           3 :     FlagsType.tp_init = NULL;
    1506           3 :     FlagsType.tp_new = NULL;
    1507             : 
    1508             : 
    1509             : #if defined(MS_WINDOWS)
    1510             :     /* getwindowsversion */
    1511             :     if (WindowsVersionType.tp_name == 0)
    1512             :         PyStructSequence_InitType(&WindowsVersionType, &windows_version_desc);
    1513             :     /* prevent user from creating new instances */
    1514             :     WindowsVersionType.tp_init = NULL;
    1515             :     WindowsVersionType.tp_new = NULL;
    1516             : #endif
    1517             : 
    1518             :     /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */
    1519             : #ifndef PY_NO_SHORT_FLOAT_REPR
    1520           3 :     SET_SYS_FROM_STRING("float_repr_style",
    1521             :                         PyString_FromString("short"));
    1522             : #else
    1523             :     SET_SYS_FROM_STRING("float_repr_style",
    1524             :                         PyString_FromString("legacy"));
    1525             : #endif
    1526             : 
    1527             : #undef SET_SYS_FROM_STRING
    1528           3 :     if (PyErr_Occurred())
    1529           0 :         return NULL;
    1530           3 :     return m;
    1531             : }
    1532             : 
    1533             : static PyObject *
    1534           3 : makepathobject(char *path, int delim)
    1535             : {
    1536             :     int i, n;
    1537             :     char *p;
    1538             :     PyObject *v, *w;
    1539             : 
    1540           3 :     n = 1;
    1541           3 :     p = path;
    1542          21 :     while ((p = strchr(p, delim)) != NULL) {
    1543          15 :         n++;
    1544          15 :         p++;
    1545             :     }
    1546           3 :     v = PyList_New(n);
    1547           3 :     if (v == NULL)
    1548           0 :         return NULL;
    1549          18 :     for (i = 0; ; i++) {
    1550          18 :         p = strchr(path, delim);
    1551          18 :         if (p == NULL)
    1552           3 :             p = strchr(path, '\0'); /* End of string */
    1553          18 :         w = PyString_FromStringAndSize(path, (Py_ssize_t) (p - path));
    1554          18 :         if (w == NULL) {
    1555           0 :             Py_DECREF(v);
    1556           0 :             return NULL;
    1557             :         }
    1558          18 :         PyList_SetItem(v, i, w);
    1559          18 :         if (*p == '\0')
    1560           3 :             break;
    1561          15 :         path = p+1;
    1562          15 :     }
    1563           3 :     return v;
    1564             : }
    1565             : 
    1566             : void
    1567           3 : PySys_SetPath(char *path)
    1568             : {
    1569             :     PyObject *v;
    1570           3 :     if ((v = makepathobject(path, DELIM)) == NULL)
    1571           0 :         Py_FatalError("can't create sys.path");
    1572           3 :     if (PySys_SetObject("path", v) != 0)
    1573           0 :         Py_FatalError("can't assign sys.path");
    1574           3 :     Py_DECREF(v);
    1575           3 : }
    1576             : 
    1577             : static PyObject *
    1578           3 : makeargvobject(int argc, char **argv)
    1579             : {
    1580             :     PyObject *av;
    1581           3 :     if (argc <= 0 || argv == NULL) {
    1582             :         /* Ensure at least one (empty) argument is seen */
    1583             :         static char *empty_argv[1] = {""};
    1584           0 :         argv = empty_argv;
    1585           0 :         argc = 1;
    1586             :     }
    1587           3 :     av = PyList_New(argc);
    1588           3 :     if (av != NULL) {
    1589             :         int i;
    1590          15 :         for (i = 0; i < argc; i++) {
    1591             : #ifdef __VMS
    1592             :             PyObject *v;
    1593             : 
    1594             :             /* argv[0] is the script pathname if known */
    1595             :             if (i == 0) {
    1596             :                 char* fn = decc$translate_vms(argv[0]);
    1597             :                 if ((fn == (char *)0) || fn == (char *)-1)
    1598             :                     v = PyString_FromString(argv[0]);
    1599             :                 else
    1600             :                     v = PyString_FromString(
    1601             :                         decc$translate_vms(argv[0]));
    1602             :             } else
    1603             :                 v = PyString_FromString(argv[i]);
    1604             : #else
    1605          12 :             PyObject *v = PyString_FromString(argv[i]);
    1606             : #endif
    1607          12 :             if (v == NULL) {
    1608           0 :                 Py_DECREF(av);
    1609           0 :                 av = NULL;
    1610           0 :                 break;
    1611             :             }
    1612          12 :             PyList_SetItem(av, i, v);
    1613             :         }
    1614             :     }
    1615           3 :     return av;
    1616             : }
    1617             : 
    1618             : void
    1619           3 : PySys_SetArgvEx(int argc, char **argv, int updatepath)
    1620             : {
    1621             : #if defined(HAVE_REALPATH)
    1622             :     char fullpath[MAXPATHLEN];
    1623             : #elif defined(MS_WINDOWS) && !defined(MS_WINCE)
    1624             :     char fullpath[MAX_PATH];
    1625             : #endif
    1626           3 :     PyObject *av = makeargvobject(argc, argv);
    1627           3 :     PyObject *path = PySys_GetObject("path");
    1628           3 :     if (av == NULL)
    1629           0 :         Py_FatalError("no mem for sys.argv");
    1630           3 :     if (PySys_SetObject("argv", av) != 0)
    1631           0 :         Py_FatalError("can't assign sys.argv");
    1632           3 :     if (updatepath && path != NULL) {
    1633           3 :         char *argv0 = argv[0];
    1634           3 :         char *p = NULL;
    1635           3 :         Py_ssize_t n = 0;
    1636             :         PyObject *a;
    1637             : #ifdef HAVE_READLINK
    1638             :         char link[MAXPATHLEN+1];
    1639             :         char argv0copy[2*MAXPATHLEN+1];
    1640           3 :         int nr = 0;
    1641           3 :         if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0)
    1642           3 :             nr = readlink(argv0, link, MAXPATHLEN);
    1643           3 :         if (nr > 0) {
    1644             :             /* It's a symlink */
    1645           0 :             link[nr] = '\0';
    1646           0 :             if (link[0] == SEP)
    1647           0 :                 argv0 = link; /* Link to absolute path */
    1648           0 :             else if (strchr(link, SEP) == NULL)
    1649             :                 ; /* Link without path */
    1650             :             else {
    1651             :                 /* Must join(dirname(argv0), link) */
    1652           0 :                 char *q = strrchr(argv0, SEP);
    1653           0 :                 if (q == NULL)
    1654           0 :                     argv0 = link; /* argv0 without path */
    1655             :                 else {
    1656             :                     /* Must make a copy */
    1657           0 :                     strcpy(argv0copy, argv0);
    1658           0 :                     q = strrchr(argv0copy, SEP);
    1659           0 :                     strcpy(q+1, link);
    1660           0 :                     argv0 = argv0copy;
    1661             :                 }
    1662             :             }
    1663             :         }
    1664             : #endif /* HAVE_READLINK */
    1665             : #if SEP == '\\' /* Special case for MS filename syntax */
    1666             :         if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) {
    1667             :             char *q;
    1668             : #if defined(MS_WINDOWS) && !defined(MS_WINCE)
    1669             :             /* This code here replaces the first element in argv with the full
    1670             :             path that it represents. Under CE, there are no relative paths so
    1671             :             the argument must be the full path anyway. */
    1672             :             char *ptemp;
    1673             :             if (GetFullPathName(argv0,
    1674             :                                sizeof(fullpath),
    1675             :                                fullpath,
    1676             :                                &ptemp)) {
    1677             :                 argv0 = fullpath;
    1678             :             }
    1679             : #endif
    1680             :             p = strrchr(argv0, SEP);
    1681             :             /* Test for alternate separator */
    1682             :             q = strrchr(p ? p : argv0, '/');
    1683             :             if (q != NULL)
    1684             :                 p = q;
    1685             :             if (p != NULL) {
    1686             :                 n = p + 1 - argv0;
    1687             :                 if (n > 1 && p[-1] != ':')
    1688             :                     n--; /* Drop trailing separator */
    1689             :             }
    1690             :         }
    1691             : #else /* All other filename syntaxes */
    1692           3 :         if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) {
    1693             : #if defined(HAVE_REALPATH)
    1694           3 :             if (realpath(argv0, fullpath)) {
    1695           3 :                 argv0 = fullpath;
    1696             :             }
    1697             : #endif
    1698           3 :             p = strrchr(argv0, SEP);
    1699             :         }
    1700           3 :         if (p != NULL) {
    1701             : #ifndef RISCOS
    1702           3 :             n = p + 1 - argv0;
    1703             : #else /* don't include trailing separator */
    1704             :             n = p - argv0;
    1705             : #endif /* RISCOS */
    1706             : #if SEP == '/' /* Special case for Unix filename syntax */
    1707           3 :             if (n > 1)
    1708           3 :                 n--; /* Drop trailing separator */
    1709             : #endif /* Unix */
    1710             :         }
    1711             : #endif /* All others */
    1712           3 :         a = PyString_FromStringAndSize(argv0, n);
    1713           3 :         if (a == NULL)
    1714           0 :             Py_FatalError("no mem for sys.path insertion");
    1715           3 :         if (PyList_Insert(path, 0, a) < 0)
    1716           0 :             Py_FatalError("sys.path.insert(0) failed");
    1717           3 :         Py_DECREF(a);
    1718             :     }
    1719           3 :     Py_DECREF(av);
    1720           3 : }
    1721             : 
    1722             : void
    1723           3 : PySys_SetArgv(int argc, char **argv)
    1724             : {
    1725           3 :     PySys_SetArgvEx(argc, argv, 1);
    1726           3 : }
    1727             : 
    1728             : 
    1729             : /* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
    1730             :    Adapted from code submitted by Just van Rossum.
    1731             : 
    1732             :    PySys_WriteStdout(format, ...)
    1733             :    PySys_WriteStderr(format, ...)
    1734             : 
    1735             :       The first function writes to sys.stdout; the second to sys.stderr.  When
    1736             :       there is a problem, they write to the real (C level) stdout or stderr;
    1737             :       no exceptions are raised.
    1738             : 
    1739             :       Both take a printf-style format string as their first argument followed
    1740             :       by a variable length argument list determined by the format string.
    1741             : 
    1742             :       *** WARNING ***
    1743             : 
    1744             :       The format should limit the total size of the formatted output string to
    1745             :       1000 bytes.  In particular, this means that no unrestricted "%s" formats
    1746             :       should occur; these should be limited using "%.<N>s where <N> is a
    1747             :       decimal number calculated so that <N> plus the maximum size of other
    1748             :       formatted text does not exceed 1000 bytes.  Also watch out for "%f",
    1749             :       which can print hundreds of digits for very large numbers.
    1750             : 
    1751             :  */
    1752             : 
    1753             : static void
    1754           0 : mywrite(char *name, FILE *fp, const char *format, va_list va)
    1755             : {
    1756             :     PyObject *file;
    1757             :     PyObject *error_type, *error_value, *error_traceback;
    1758             : 
    1759           0 :     PyErr_Fetch(&error_type, &error_value, &error_traceback);
    1760           0 :     file = PySys_GetObject(name);
    1761           0 :     if (file == NULL || PyFile_AsFile(file) == fp)
    1762           0 :         vfprintf(fp, format, va);
    1763             :     else {
    1764             :         char buffer[1001];
    1765           0 :         const int written = PyOS_vsnprintf(buffer, sizeof(buffer),
    1766             :                                            format, va);
    1767           0 :         if (PyFile_WriteString(buffer, file) != 0) {
    1768           0 :             PyErr_Clear();
    1769           0 :             fputs(buffer, fp);
    1770             :         }
    1771           0 :         if (written < 0 || (size_t)written >= sizeof(buffer)) {
    1772           0 :             const char *truncated = "... truncated";
    1773           0 :             if (PyFile_WriteString(truncated, file) != 0) {
    1774           0 :                 PyErr_Clear();
    1775           0 :                 fputs(truncated, fp);
    1776             :             }
    1777             :         }
    1778             :     }
    1779           0 :     PyErr_Restore(error_type, error_value, error_traceback);
    1780           0 : }
    1781             : 
    1782             : void
    1783           0 : PySys_WriteStdout(const char *format, ...)
    1784             : {
    1785             :     va_list va;
    1786             : 
    1787           0 :     va_start(va, format);
    1788           0 :     mywrite("stdout", stdout, format, va);
    1789           0 :     va_end(va);
    1790           0 : }
    1791             : 
    1792             : void
    1793           0 : PySys_WriteStderr(const char *format, ...)
    1794             : {
    1795             :     va_list va;
    1796             : 
    1797           0 :     va_start(va, format);
    1798           0 :     mywrite("stderr", stderr, format, va);
    1799           0 :     va_end(va);
    1800           0 : }

Generated by: LCOV version 1.10