blob: 59b7aab13b62f42b7114b8bd9f3014fcb7dbed92 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* System module */
33
34/*
35Various bits of information used by the interpreter are collected in
36module 'sys'.
Guido van Rossum3f5da241990-12-20 15:06:42 +000037Function member:
Guido van Rossumcc8914f1995-03-20 15:09:40 +000038- exit(sts): raise SystemExit
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039Data members:
40- stdin, stdout, stderr: standard file objects
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041- modules: the table of modules (dictionary)
Guido van Rossum3f5da241990-12-20 15:06:42 +000042- path: module search path (list of strings)
43- argv: script arguments (list of strings)
44- ps1, ps2: optional primary and secondary prompts (strings)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045*/
46
Guido van Rossum65bf9f21997-04-29 18:33:38 +000047#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048
Guido van Rossume2437a11992-03-23 18:20:18 +000049#include "osdefs.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000050
Guido van Rossum1254d791997-05-20 15:57:25 +000051#ifdef HAVE_UNISTD_H
Guido van Rossumc474dea1997-04-25 15:38:31 +000052#include <unistd.h>
53#endif
54
Guido van Rossum9b38a141996-09-11 23:12:24 +000055#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +000056extern void *PyWin_DLLhModule;
Guido van Rossum6c1e5f21997-09-29 23:34:23 +000057/* A string loaded from the DLL at startup: */
58extern const char *PyWin_DLLVersionString;
Guido van Rossumc606fe11996-04-09 02:37:57 +000059#endif
60
Guido van Rossum65bf9f21997-04-29 18:33:38 +000061PyObject *
62PySys_GetObject(name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063 char *name;
64{
Guido van Rossum25ce5661997-08-02 03:10:38 +000065 PyThreadState *tstate = PyThreadState_Get();
66 PyObject *sd = tstate->interp->sysdict;
67 return PyDict_GetItemString(sd, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000068}
69
70FILE *
Guido van Rossum65bf9f21997-04-29 18:33:38 +000071PySys_GetFile(name, def)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072 char *name;
73 FILE *def;
74{
75 FILE *fp = NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +000076 PyObject *v = PySys_GetObject(name);
77 if (v != NULL && PyFile_Check(v))
78 fp = PyFile_AsFile(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000079 if (fp == NULL)
80 fp = def;
81 return fp;
82}
83
84int
Guido van Rossum65bf9f21997-04-29 18:33:38 +000085PySys_SetObject(name, v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086 char *name;
Guido van Rossum65bf9f21997-04-29 18:33:38 +000087 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088{
Guido van Rossum25ce5661997-08-02 03:10:38 +000089 PyThreadState *tstate = PyThreadState_Get();
90 PyObject *sd = tstate->interp->sysdict;
Guido van Rossum5ad58c61992-01-26 18:15:48 +000091 if (v == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +000092 if (PyDict_GetItemString(sd, name) == NULL)
Guido van Rossum5ad58c61992-01-26 18:15:48 +000093 return 0;
94 else
Guido van Rossum25ce5661997-08-02 03:10:38 +000095 return PyDict_DelItemString(sd, name);
Guido van Rossum5ad58c61992-01-26 18:15:48 +000096 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097 else
Guido van Rossum25ce5661997-08-02 03:10:38 +000098 return PyDict_SetItemString(sd, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099}
100
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000101static PyObject *
Guido van Rossuma027efa1997-05-05 20:56:21 +0000102sys_exc_info(self, args)
103 PyObject *self;
104 PyObject *args;
105{
106 PyThreadState *tstate;
107 if (!PyArg_Parse(args, ""))
108 return NULL;
109 tstate = PyThreadState_Get();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000110 return Py_BuildValue(
111 "(OOO)",
112 tstate->exc_type != NULL ? tstate->exc_type : Py_None,
113 tstate->exc_value != NULL ? tstate->exc_value : Py_None,
114 tstate->exc_traceback != NULL ?
115 tstate->exc_traceback : Py_None);
116}
117
118static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119sys_exit(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000120 PyObject *self;
121 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122{
Guido van Rossum6a468bf1991-12-31 13:15:35 +0000123 /* Raise SystemExit so callers may catch it or clean up. */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000124 PyErr_SetObject(PyExc_SystemExit, args);
Guido van Rossum6a468bf1991-12-31 13:15:35 +0000125 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126}
127
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000128static PyObject *
Guido van Rossume2437a11992-03-23 18:20:18 +0000129sys_settrace(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000130 PyObject *self;
131 PyObject *args;
Guido van Rossume2437a11992-03-23 18:20:18 +0000132{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000133 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000134 if (args == Py_None)
Guido van Rossume2437a11992-03-23 18:20:18 +0000135 args = NULL;
Guido van Rossume765f7d1992-04-05 14:17:55 +0000136 else
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000137 Py_XINCREF(args);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000138 Py_XDECREF(tstate->sys_tracefunc);
139 tstate->sys_tracefunc = args;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000140 Py_INCREF(Py_None);
141 return Py_None;
Guido van Rossume2437a11992-03-23 18:20:18 +0000142}
143
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000144static PyObject *
Guido van Rossume2437a11992-03-23 18:20:18 +0000145sys_setprofile(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000146 PyObject *self;
147 PyObject *args;
Guido van Rossume2437a11992-03-23 18:20:18 +0000148{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000149 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000150 if (args == Py_None)
Guido van Rossume2437a11992-03-23 18:20:18 +0000151 args = NULL;
Guido van Rossume765f7d1992-04-05 14:17:55 +0000152 else
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000153 Py_XINCREF(args);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000154 Py_XDECREF(tstate->sys_profilefunc);
155 tstate->sys_profilefunc = args;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000156 Py_INCREF(Py_None);
157 return Py_None;
Guido van Rossume2437a11992-03-23 18:20:18 +0000158}
159
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000160static PyObject *
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000161sys_setcheckinterval(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000162 PyObject *self;
163 PyObject *args;
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000164{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000165 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000166 if (!PyArg_ParseTuple(args, "i", &tstate->interp->checkinterval))
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000167 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000168 Py_INCREF(Py_None);
169 return Py_None;
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000170}
171
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000172#ifdef USE_MALLOPT
173/* Link with -lmalloc (or -lmpc) on an SGI */
174#include <malloc.h>
175
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000176static PyObject *
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000177sys_mdebug(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000178 PyObject *self;
179 PyObject *args;
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000180{
181 int flag;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000182 if (!PyArg_Parse(args, "i", &flag))
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000183 return NULL;
184 mallopt(M_DEBUG, flag);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000185 Py_INCREF(Py_None);
186 return Py_None;
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000187}
188#endif /* USE_MALLOPT */
189
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000190static PyObject *
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000191sys_getrefcount(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000192 PyObject *self;
193 PyObject *args;
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000194{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000195 PyObject *arg;
196 if (!PyArg_Parse(args, "O", &arg))
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000197 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000198 return PyInt_FromLong((long) arg->ob_refcnt);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000199}
200
201#ifdef COUNT_ALLOCS
202static PyObject *
203sys_getcounts(self, args)
204 PyObject *self, *args;
205{
206 extern PyObject *get_counts Py_PROTO((void));
207
208 if (!PyArg_Parse(args, ""))
209 return NULL;
210 return get_counts();
211}
212#endif
213
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000214#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000215/* Defined in objects.c because it uses static globals if that file */
216extern PyObject *_Py_GetObjects Py_PROTO((PyObject *, PyObject *));
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000217#endif
Guido van Rossumded690f1996-05-24 20:48:31 +0000218
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000219#ifdef DYNAMIC_EXECUTION_PROFILE
220/* Defined in ceval.c because it uses static globals if that file */
221extern PyObject *_Py_GetDXProfile Py_PROTO((PyObject *, PyObject *));
222#endif
223
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000224static PyMethodDef sys_methods[] = {
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000225 /* Might as well keep this in alphabetic order */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000226 {"exc_info", sys_exc_info, 0},
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000227 {"exit", sys_exit, 0},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000228#ifdef COUNT_ALLOCS
229 {"getcounts", sys_getcounts, 0},
230#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000231#ifdef DYNAMIC_EXECUTION_PROFILE
232 {"getdxp", _Py_GetDXProfile, 1},
233#endif
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000234#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000235 {"getobjects", _Py_GetObjects, 1},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000236#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000237 {"getrefcount", sys_getrefcount, 0},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000238#ifdef USE_MALLOPT
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000239 {"mdebug", sys_mdebug, 0},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000240#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000241 {"setcheckinterval", sys_setcheckinterval, 1},
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000242 {"setprofile", sys_setprofile, 0},
243 {"settrace", sys_settrace, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000244 {NULL, NULL} /* sentinel */
245};
246
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000247static PyObject *
Guido van Rossum34679b71993-01-26 13:33:44 +0000248list_builtin_module_names()
249{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000250 PyObject *list = PyList_New(0);
Guido van Rossum34679b71993-01-26 13:33:44 +0000251 int i;
252 if (list == NULL)
253 return NULL;
Guido van Rossumbb5c6f81997-04-29 20:42:30 +0000254 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000255 PyObject *name = PyString_FromString(
256 _PyImport_Inittab[i].name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000257 if (name == NULL)
258 break;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000259 PyList_Append(list, name);
260 Py_DECREF(name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000261 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000262 if (PyList_Sort(list) != 0) {
263 Py_DECREF(list);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000264 list = NULL;
265 }
Guido van Rossum8f49e121997-01-06 22:55:54 +0000266 if (list) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000267 PyObject *v = PyList_AsTuple(list);
268 Py_DECREF(list);
Guido van Rossum8f49e121997-01-06 22:55:54 +0000269 list = v;
270 }
Guido van Rossum34679b71993-01-26 13:33:44 +0000271 return list;
272}
273
Guido van Rossum25ce5661997-08-02 03:10:38 +0000274PyObject *
275_PySys_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000276{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000277 extern int fclose Py_PROTO((FILE *));
Guido van Rossum25ce5661997-08-02 03:10:38 +0000278 PyObject *m, *v, *sysdict;
279 PyObject *sysin, *sysout, *syserr;
280
281 m = Py_InitModule("sys", sys_methods);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000282 sysdict = PyModule_GetDict(m);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000283
284 sysin = PyFile_FromFile(stdin, "<stdin>", "r", NULL);
285 sysout = PyFile_FromFile(stdout, "<stdout>", "w", NULL);
286 syserr = PyFile_FromFile(stderr, "<stderr>", "w", NULL);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000287 if (PyErr_Occurred())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000288 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000289 PyDict_SetItemString(sysdict, "stdin", sysin);
290 PyDict_SetItemString(sysdict, "stdout", sysout);
291 PyDict_SetItemString(sysdict, "stderr", syserr);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000292 Py_XDECREF(sysin);
293 Py_XDECREF(sysout);
294 Py_XDECREF(syserr);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000295 PyDict_SetItemString(sysdict, "version",
296 v = PyString_FromString(Py_GetVersion()));
297 Py_XDECREF(v);
298 PyDict_SetItemString(sysdict, "copyright",
299 v = PyString_FromString(Py_GetCopyright()));
300 Py_XDECREF(v);
301 PyDict_SetItemString(sysdict, "platform",
302 v = PyString_FromString(Py_GetPlatform()));
303 Py_XDECREF(v);
Guido van Rossumb2c8ec41997-05-22 20:41:20 +0000304 PyDict_SetItemString(sysdict, "executable",
305 v = PyString_FromString(Py_GetProgramFullPath()));
306 Py_XDECREF(v);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000307 PyDict_SetItemString(sysdict, "prefix",
308 v = PyString_FromString(Py_GetPrefix()));
309 Py_XDECREF(v);
310 PyDict_SetItemString(sysdict, "exec_prefix",
311 v = PyString_FromString(Py_GetExecPrefix()));
312 Py_XDECREF(v);
313 PyDict_SetItemString(sysdict, "maxint",
314 v = PyInt_FromLong(PyInt_GetMax()));
315 Py_XDECREF(v);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000316 PyDict_SetItemString(sysdict, "builtin_module_names",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000317 v = list_builtin_module_names());
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000318 Py_XDECREF(v);
Guido van Rossum8b9ea871996-08-23 18:14:47 +0000319#ifdef MS_COREDLL
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000320 PyDict_SetItemString(sysdict, "dllhandle",
321 v = PyInt_FromLong((int)PyWin_DLLhModule));
322 Py_XDECREF(v);
323 PyDict_SetItemString(sysdict, "winver",
Guido van Rossum6c1e5f21997-09-29 23:34:23 +0000324 v = PyString_FromString(PyWin_DLLVersionString));
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000325 Py_XDECREF(v);
Guido van Rossumc606fe11996-04-09 02:37:57 +0000326#endif
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000327 if (PyErr_Occurred())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000328 return NULL;
329 return m;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000330}
331
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000332static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000333makepathobject(path, delim)
334 char *path;
335 int delim;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000336{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000337 int i, n;
338 char *p;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000339 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000340
341 n = 1;
342 p = path;
343 while ((p = strchr(p, delim)) != NULL) {
344 n++;
345 p++;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000346 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000347 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000348 if (v == NULL)
349 return NULL;
350 for (i = 0; ; i++) {
351 p = strchr(path, delim);
352 if (p == NULL)
353 p = strchr(path, '\0'); /* End of string */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000354 w = PyString_FromStringAndSize(path, (int) (p - path));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000355 if (w == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000356 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000357 return NULL;
358 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000359 PyList_SetItem(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000360 if (*p == '\0')
361 break;
362 path = p+1;
363 }
364 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365}
366
367void
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000368PySys_SetPath(path)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000369 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000370{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000371 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000372 if ((v = makepathobject(path, DELIM)) == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000373 Py_FatalError("can't create sys.path");
374 if (PySys_SetObject("path", v) != 0)
375 Py_FatalError("can't assign sys.path");
376 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000377}
378
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000379static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000380makeargvobject(argc, argv)
381 int argc;
382 char **argv;
383{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000384 PyObject *av;
Guido van Rossumee3a2991992-01-14 18:42:53 +0000385 if (argc <= 0 || argv == NULL) {
386 /* Ensure at least one (empty) argument is seen */
387 static char *empty_argv[1] = {""};
388 argv = empty_argv;
389 argc = 1;
390 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000391 av = PyList_New(argc);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000392 if (av != NULL) {
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000393 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000394 for (i = 0; i < argc; i++) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000395 PyObject *v = PyString_FromString(argv[i]);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000396 if (v == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000397 Py_DECREF(av);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000398 av = NULL;
399 break;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000400 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000401 PyList_SetItem(av, i, v);
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000402 }
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000403 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000404 return av;
405}
406
407void
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000408PySys_SetArgv(argc, argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000409 int argc;
410 char **argv;
411{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000412 PyObject *av = makeargvobject(argc, argv);
413 PyObject *path = PySys_GetObject("path");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000414 if (av == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000415 Py_FatalError("no mem for sys.argv");
416 if (PySys_SetObject("argv", av) != 0)
417 Py_FatalError("can't assign sys.argv");
Guido van Rossum94a96671996-07-30 20:35:50 +0000418 if (path != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000419 char *argv0 = argv[0];
Guido van Rossum94a96671996-07-30 20:35:50 +0000420 char *p = NULL;
Guido van Rossumcc883411996-09-10 14:44:21 +0000421 int n = 0;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000422 PyObject *a;
Guido van Rossumc474dea1997-04-25 15:38:31 +0000423#ifdef HAVE_READLINK
424 char link[MAXPATHLEN+1];
425 char argv0copy[2*MAXPATHLEN+1];
426 int nr = 0;
427 if (argc > 0 && argv0 != NULL)
428 nr = readlink(argv0, link, MAXPATHLEN);
429 if (nr > 0) {
430 /* It's a symlink */
431 link[nr] = '\0';
432 if (link[0] == SEP)
433 argv0 = link; /* Link to absolute path */
434 else if (strchr(link, SEP) == NULL)
435 ; /* Link without path */
436 else {
437 /* Must join(dirname(argv0), link) */
438 char *q = strrchr(argv0, SEP);
439 if (q == NULL)
440 argv0 = link; /* argv0 without path */
441 else {
442 /* Must make a copy */
443 strcpy(argv0copy, argv0);
444 q = strrchr(argv0copy, SEP);
445 strcpy(q+1, link);
446 argv0 = argv0copy;
447 }
448 }
449 }
450#endif /* HAVE_READLINK */
Guido van Rossumcc883411996-09-10 14:44:21 +0000451#if SEP == '\\' /* Special case for MS filename syntax */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000452 if (argc > 0 && argv0 != NULL) {
Guido van Rossumcc883411996-09-10 14:44:21 +0000453 char *q;
Guido van Rossumc474dea1997-04-25 15:38:31 +0000454 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000455 /* Test for alternate separator */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000456 q = strrchr(p ? p : argv0, '/');
Guido van Rossumcc883411996-09-10 14:44:21 +0000457 if (q != NULL)
458 p = q;
459 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000460 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +0000461 if (n > 1 && p[-1] != ':')
462 n--; /* Drop trailing separator */
463 }
464 }
465#else /* All other filename syntaxes */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000466 if (argc > 0 && argv0 != NULL)
467 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000468 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000469 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +0000470#if SEP == '/' /* Special case for Unix filename syntax */
471 if (n > 1)
472 n--; /* Drop trailing separator */
473#endif /* Unix */
474 }
475#endif /* All others */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000476 a = PyString_FromStringAndSize(argv0, n);
Guido van Rossum94a96671996-07-30 20:35:50 +0000477 if (a == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000478 Py_FatalError("no mem for sys.path insertion");
479 if (PyList_Insert(path, 0, a) < 0)
480 Py_FatalError("sys.path.insert(0) failed");
481 Py_DECREF(a);
Guido van Rossuma63d9f41996-07-24 01:31:37 +0000482 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000483 Py_DECREF(av);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000484}