blob: 063187bf51ff4fffe02976c5fee9dcc5d62fd163 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum373c8691997-04-29 18:22:47 +00002/* Error handling */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003
Guido van Rossum373c8691997-04-29 18:22:47 +00004#include "Python.h"
Guido van Rossumf22120a1990-12-20 23:05:40 +00005
Guido van Rossum53e8d441995-03-09 12:11:31 +00006#ifndef __STDC__
Guido van Rossum7844e381997-04-11 20:44:04 +00007#ifndef MS_WINDOWS
Tim Petersdbd9ba62000-07-09 03:09:57 +00008extern char *strerror(int);
Guido van Rossum53e8d441995-03-09 12:11:31 +00009#endif
Guido van Rossum7844e381997-04-11 20:44:04 +000010#endif
Guido van Rossumf5401bd1990-11-02 17:50:28 +000011
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000012#ifdef MS_WINDOWS
Martin v. Löwis5d12abe2007-09-03 07:40:24 +000013#include <windows.h>
14#include <winbase.h>
Guido van Rossum743007d1999-04-21 15:27:31 +000015#endif
16
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +000017#include <ctype.h>
18
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000019#ifdef __cplusplus
20extern "C" {
21#endif
22
23
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000024void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000025PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000026{
Guido van Rossum885553e1998-12-21 18:33:30 +000027 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000028 PyObject *oldtype, *oldvalue, *oldtraceback;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000029
Guido van Rossuma027efa1997-05-05 20:56:21 +000030 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
31 /* XXX Should never happen -- fatal error instead? */
Guido van Rossum1a5e21e2006-02-28 21:57:43 +000032 /* Well, it could be None. */
Guido van Rossuma027efa1997-05-05 20:56:21 +000033 Py_DECREF(traceback);
34 traceback = NULL;
35 }
36
37 /* Save these in locals to safeguard against recursive
38 invocation through Py_XDECREF */
39 oldtype = tstate->curexc_type;
40 oldvalue = tstate->curexc_value;
41 oldtraceback = tstate->curexc_traceback;
42
43 tstate->curexc_type = type;
44 tstate->curexc_value = value;
45 tstate->curexc_traceback = traceback;
46
47 Py_XDECREF(oldtype);
48 Py_XDECREF(oldvalue);
49 Py_XDECREF(oldtraceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000050}
51
52void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000053PyErr_SetObject(PyObject *exception, PyObject *value)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000054{
Thomas Wouters303de6a2006-04-20 22:42:37 +000055 if (exception != NULL &&
56 !PyExceptionClass_Check(exception)) {
Thomas Wouters303de6a2006-04-20 22:42:37 +000057 PyErr_Format(PyExc_SystemError,
Walter Dörwald573c08c2007-05-25 15:46:59 +000058 "exception %R not a BaseException subclass",
59 exception);
Thomas Wouters303de6a2006-04-20 22:42:37 +000060 return;
61 }
Guido van Rossum373c8691997-04-29 18:22:47 +000062 Py_XINCREF(exception);
63 Py_XINCREF(value);
64 PyErr_Restore(exception, value, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000065}
66
67void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000068PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069{
Guido van Rossum373c8691997-04-29 18:22:47 +000070 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071}
72
73void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000074PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075{
Walter Dörwald573c08c2007-05-25 15:46:59 +000076 PyObject *value = PyUnicode_FromString(string);
Guido van Rossum373c8691997-04-29 18:22:47 +000077 PyErr_SetObject(exception, value);
78 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000079}
80
Guido van Rossum3a241811994-08-29 12:14:12 +000081
Guido van Rossum373c8691997-04-29 18:22:47 +000082PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000083PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000084{
Tim Peters024da352001-05-30 06:09:50 +000085 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +000086
87 return tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088}
89
Barry Warsawc0dc92a1997-08-22 21:22:58 +000090
91int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000092PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +000093{
Barry Warsawfa5c3152000-05-02 19:27:51 +000094 if (err == NULL || exc == NULL) {
95 /* maybe caused by "import exceptions" that failed early on */
96 return 0;
97 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +000098 if (PyTuple_Check(exc)) {
Martin v. Löwisd96ee902006-02-16 14:37:16 +000099 Py_ssize_t i, n;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000100 n = PyTuple_Size(exc);
101 for (i = 0; i < n; i++) {
102 /* Test recursively */
103 if (PyErr_GivenExceptionMatches(
104 err, PyTuple_GET_ITEM(exc, i)))
105 {
106 return 1;
107 }
108 }
109 return 0;
110 }
111 /* err might be an instance, so check its class. */
Brett Cannonbf364092006-03-01 04:25:17 +0000112 if (PyExceptionInstance_Check(err))
113 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000114
Brett Cannonbf364092006-03-01 04:25:17 +0000115 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
116 /* problems here!? not sure PyObject_IsSubclass expects to
117 be called with an exception pending... */
118 return PyObject_IsSubclass(err, exc);
119 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000120
121 return err == exc;
122}
Guido van Rossum743007d1999-04-21 15:27:31 +0000123
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000124
125int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000126PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000127{
128 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
129}
130
131
132/* Used in many places to normalize a raised exception, including in
133 eval_code2(), do_raise(), and PyErr_Print()
134*/
135void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000136PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000137{
138 PyObject *type = *exc;
139 PyObject *value = *val;
140 PyObject *inclass = NULL;
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000141 PyObject *initial_tb = NULL;
Thomas Wouters89d996e2007-09-08 17:39:28 +0000142 PyThreadState *tstate = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000143
Guido van Rossumed473a42000-08-07 19:18:27 +0000144 if (type == NULL) {
Guido van Rossum6b3fffa2003-04-10 20:29:48 +0000145 /* There was no exception, so nothing to do. */
146 return;
Guido van Rossumed473a42000-08-07 19:18:27 +0000147 }
148
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000149 /* If PyErr_SetNone() was used, the value will have been actually
150 set to NULL.
151 */
152 if (!value) {
153 value = Py_None;
154 Py_INCREF(value);
155 }
156
Brett Cannonbf364092006-03-01 04:25:17 +0000157 if (PyExceptionInstance_Check(value))
158 inclass = PyExceptionInstance_Class(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000159
160 /* Normalize the exception so that if the type is a class, the
161 value will be an instance.
162 */
Brett Cannonbf364092006-03-01 04:25:17 +0000163 if (PyExceptionClass_Check(type)) {
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000164 /* if the value was not an instance, or is not an instance
165 whose class is (or is derived from) type, then use the
166 value as an argument to instantiation of the type
167 class.
168 */
Brett Cannonbf364092006-03-01 04:25:17 +0000169 if (!inclass || !PyObject_IsSubclass(inclass, type)) {
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000170 PyObject *args, *res;
171
172 if (value == Py_None)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000173 args = PyTuple_New(0);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000174 else if (PyTuple_Check(value)) {
175 Py_INCREF(value);
176 args = value;
177 }
178 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000179 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000180
181 if (args == NULL)
182 goto finally;
183 res = PyEval_CallObject(type, args);
184 Py_DECREF(args);
185 if (res == NULL)
186 goto finally;
187 Py_DECREF(value);
188 value = res;
189 }
Barry Warsaw3a749931997-09-30 15:00:18 +0000190 /* if the class of the instance doesn't exactly match the
191 class of the type, believe the instance
192 */
193 else if (inclass != type) {
194 Py_DECREF(type);
195 type = inclass;
196 Py_INCREF(type);
197 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000198 }
199 *exc = type;
200 *val = value;
201 return;
202finally:
Guido van Rossum19b55f21997-12-09 14:11:39 +0000203 Py_DECREF(type);
204 Py_DECREF(value);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000205 /* If the new exception doesn't set a traceback and the old
206 exception had a traceback, use the old traceback for the
207 new exception. It's better than nothing.
208 */
209 initial_tb = *tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000210 PyErr_Fetch(exc, val, tb);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000211 if (initial_tb != NULL) {
212 if (*tb == NULL)
213 *tb = initial_tb;
214 else
215 Py_DECREF(initial_tb);
216 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000217 /* normalize recursively */
Thomas Wouters89d996e2007-09-08 17:39:28 +0000218 tstate = PyThreadState_GET();
219 if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
220 --tstate->recursion_depth;
221 PyErr_SetObject(PyExc_RuntimeError, PyExc_RecursionErrorInst);
222 return;
223 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000224 PyErr_NormalizeException(exc, val, tb);
Thomas Wouters89d996e2007-09-08 17:39:28 +0000225 --tstate->recursion_depth;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000226}
227
228
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000229void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000230PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231{
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000232 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000233
234 *p_type = tstate->curexc_type;
235 *p_value = tstate->curexc_value;
236 *p_traceback = tstate->curexc_traceback;
237
238 tstate->curexc_type = NULL;
239 tstate->curexc_value = NULL;
240 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241}
242
243void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000244PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000245{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000246 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000248
249/* Convenience functions to set a type error exception and return 0 */
250
251int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000252PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000253{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000254 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000255 "bad argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000256 return 0;
257}
258
Guido van Rossum373c8691997-04-29 18:22:47 +0000259PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000260PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000261{
Vladimir Marangozov0888ff12000-08-18 18:01:06 +0000262 if (PyErr_ExceptionMatches(PyExc_MemoryError))
263 /* already current */
264 return NULL;
265
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000266 /* raise the pre-allocated instance if it still exists */
267 if (PyExc_MemoryErrorInst)
268 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
269 else
270 /* this will probably fail since there's no memory and hee,
271 hee, we have to instantiate this class
272 */
273 PyErr_SetNone(PyExc_MemoryError);
274
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000275 return NULL;
276}
277
Guido van Rossum373c8691997-04-29 18:22:47 +0000278PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000279PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000280{
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000281 PyObject *message;
Guido van Rossum373c8691997-04-29 18:22:47 +0000282 PyObject *v;
Guido van Rossum3a241811994-08-29 12:14:12 +0000283 int i = errno;
Martin v. Löwis3484a182002-03-09 12:07:51 +0000284#ifdef PLAN9
285 char errbuf[ERRMAX];
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000286#else
287#ifndef MS_WINDOWS
288 char *s;
289#else
290 WCHAR *s_buf = NULL;
291#endif /* Unix/Windows */
292#endif /* PLAN 9*/
293
Guido van Rossume9fbc091995-02-18 14:52:19 +0000294#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000295 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000296 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000297#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000298
Martin v. Löwis3484a182002-03-09 12:07:51 +0000299#ifdef PLAN9
300 rerrstr(errbuf, sizeof errbuf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000301 message = PyUnicode_DecodeUTF8(errbuf, strlen(errbuf), "ignore");
Martin v. Löwis3484a182002-03-09 12:07:51 +0000302#else
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000303#ifndef MS_WINDOWS
Guido van Rossume0e59821998-10-14 20:38:13 +0000304 if (i == 0)
305 s = "Error"; /* Sometimes errno didn't get set */
Barry Warsaw97d95151998-07-23 16:05:56 +0000306 else
Guido van Rossume0e59821998-10-14 20:38:13 +0000307 s = strerror(i);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000308 message = PyUnicode_DecodeUTF8(s, strlen(s), "ignore");
Guido van Rossum743007d1999-04-21 15:27:31 +0000309#else
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000310 if (i == 0)
311 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
312 else
Guido van Rossum743007d1999-04-21 15:27:31 +0000313 {
Guido van Rossum795e1892000-02-17 15:19:15 +0000314 /* Note that the Win32 errors do not lineup with the
315 errno error. So if the error is in the MSVC error
Brett Cannonbf364092006-03-01 04:25:17 +0000316 table, we use it, otherwise we assume it really _is_
Guido van Rossum795e1892000-02-17 15:19:15 +0000317 a Win32 error code
318 */
Guido van Rossum584b16a2000-02-21 16:50:31 +0000319 if (i > 0 && i < _sys_nerr) {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000320 message = PyUnicode_FromString(_sys_errlist[i]);
Guido van Rossum795e1892000-02-17 15:19:15 +0000321 }
322 else {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000323 int len = FormatMessageW(
Guido van Rossum795e1892000-02-17 15:19:15 +0000324 FORMAT_MESSAGE_ALLOCATE_BUFFER |
325 FORMAT_MESSAGE_FROM_SYSTEM |
326 FORMAT_MESSAGE_IGNORE_INSERTS,
327 NULL, /* no message source */
328 i,
329 MAKELANGID(LANG_NEUTRAL,
330 SUBLANG_DEFAULT),
331 /* Default language */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000332 (LPWSTR) &s_buf,
Guido van Rossum795e1892000-02-17 15:19:15 +0000333 0, /* size not used */
334 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000335 if (len==0) {
Brett Cannonbf364092006-03-01 04:25:17 +0000336 /* Only ever seen this in out-of-mem
Mark Hammond3d61a062002-10-04 00:13:02 +0000337 situations */
Mark Hammond3d61a062002-10-04 00:13:02 +0000338 s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000339 message = PyUnicode_FromFormat("Windows Error 0x%X", i);
Mark Hammond3d61a062002-10-04 00:13:02 +0000340 } else {
Mark Hammond3d61a062002-10-04 00:13:02 +0000341 /* remove trailing cr/lf and dots */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000342 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
343 s_buf[--len] = L'\0';
344 message = PyUnicode_FromUnicode(s_buf, len);
Mark Hammond3d61a062002-10-04 00:13:02 +0000345 }
Guido van Rossum795e1892000-02-17 15:19:15 +0000346 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000347 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000348#endif /* Unix/Windows */
349#endif /* PLAN 9*/
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000350
351 if (message == NULL)
352 {
353#ifdef MS_WINDOWS
354 LocalFree(s_buf);
355#endif
356 return NULL;
357 }
358
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000359 if (filenameObject != NULL)
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000360 v = Py_BuildValue("(iOO)", i, message, filenameObject);
Guido van Rossume0e59821998-10-14 20:38:13 +0000361 else
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000362 v = Py_BuildValue("(iO)", i, message);
363 Py_DECREF(message);
364
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000365 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000366 PyErr_SetObject(exc, v);
367 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000368 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000369#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000370 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000371#endif
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000372 return NULL;
373}
Guido van Rossum743007d1999-04-21 15:27:31 +0000374
Barry Warsaw97d95151998-07-23 16:05:56 +0000375
376PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000377PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000378{
Neal Norwitzcd795962007-08-24 19:54:13 +0000379 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000380 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000381 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000382 return result;
383}
384
385#ifdef Py_WIN_WIDE_FILENAMES
386PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000387PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000388{
Brett Cannonbf364092006-03-01 04:25:17 +0000389 PyObject *name = filename ?
390 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000391 NULL;
392 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
393 Py_XDECREF(name);
394 return result;
395}
396#endif /* Py_WIN_WIDE_FILENAMES */
397
398PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000399PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000400{
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000401 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000402}
Guido van Rossum683a0721990-10-21 22:09:12 +0000403
Brett Cannonbf364092006-03-01 04:25:17 +0000404#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000405/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000406PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Thomas Heller085358a2002-07-29 14:27:41 +0000407 PyObject *exc,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000408 int ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000409 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000410{
411 int len;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000412 WCHAR *s_buf = NULL; /* Free via LocalFree */
413 PyObject *message;
Guido van Rossum795e1892000-02-17 15:19:15 +0000414 PyObject *v;
415 DWORD err = (DWORD)ierr;
416 if (err==0) err = GetLastError();
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000417 len = FormatMessageW(
Guido van Rossum795e1892000-02-17 15:19:15 +0000418 /* Error API error */
419 FORMAT_MESSAGE_ALLOCATE_BUFFER |
420 FORMAT_MESSAGE_FROM_SYSTEM |
421 FORMAT_MESSAGE_IGNORE_INSERTS,
422 NULL, /* no message source */
423 err,
424 MAKELANGID(LANG_NEUTRAL,
425 SUBLANG_DEFAULT), /* Default language */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000426 (LPWSTR) &s_buf,
Guido van Rossum795e1892000-02-17 15:19:15 +0000427 0, /* size not used */
428 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000429 if (len==0) {
430 /* Only seen this in out of mem situations */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000431 message = PyUnicode_FromFormat("Windows Error 0x%X", err);
Mark Hammond3d61a062002-10-04 00:13:02 +0000432 s_buf = NULL;
433 } else {
Mark Hammond3d61a062002-10-04 00:13:02 +0000434 /* remove trailing cr/lf and dots */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000435 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
436 s_buf[--len] = L'\0';
437 message = PyUnicode_FromUnicode(s_buf, len);
Mark Hammond3d61a062002-10-04 00:13:02 +0000438 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000439
440 if (message == NULL)
441 {
442 LocalFree(s_buf);
443 return NULL;
444 }
445
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000446 if (filenameObject != NULL)
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000447 v = Py_BuildValue("(iOO)", err, message, filenameObject);
Guido van Rossum795e1892000-02-17 15:19:15 +0000448 else
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000449 v = Py_BuildValue("(iO)", err, message);
450 Py_DECREF(message);
451
Guido van Rossum795e1892000-02-17 15:19:15 +0000452 if (v != NULL) {
Thomas Heller085358a2002-07-29 14:27:41 +0000453 PyErr_SetObject(exc, v);
Guido van Rossum795e1892000-02-17 15:19:15 +0000454 Py_DECREF(v);
455 }
Mark Hammond3d61a062002-10-04 00:13:02 +0000456 LocalFree(s_buf);
Guido van Rossum795e1892000-02-17 15:19:15 +0000457 return NULL;
458}
459
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000460PyObject *PyErr_SetExcFromWindowsErrWithFilename(
461 PyObject *exc,
462 int ierr,
463 const char *filename)
464{
Neal Norwitzcd795962007-08-24 19:54:13 +0000465 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
Brett Cannonbf364092006-03-01 04:25:17 +0000466 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
467 ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000468 name);
469 Py_XDECREF(name);
470 return ret;
471}
472
473#ifdef Py_WIN_WIDE_FILENAMES
474PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
475 PyObject *exc,
476 int ierr,
477 const Py_UNICODE *filename)
478{
Brett Cannonbf364092006-03-01 04:25:17 +0000479 PyObject *name = filename ?
480 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000481 NULL;
Brett Cannonbf364092006-03-01 04:25:17 +0000482 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
483 ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000484 name);
485 Py_XDECREF(name);
486 return ret;
487}
488#endif /* Py_WIN_WIDE_FILENAMES */
489
Thomas Heller085358a2002-07-29 14:27:41 +0000490PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
491{
492 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
493}
494
Guido van Rossum795e1892000-02-17 15:19:15 +0000495PyObject *PyErr_SetFromWindowsErr(int ierr)
496{
Thomas Heller085358a2002-07-29 14:27:41 +0000497 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
498 ierr, NULL);
499}
500PyObject *PyErr_SetFromWindowsErrWithFilename(
501 int ierr,
502 const char *filename)
503{
Neal Norwitzcd795962007-08-24 19:54:13 +0000504 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000505 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
506 PyExc_WindowsError,
507 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000508 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000509 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000510}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000511
512#ifdef Py_WIN_WIDE_FILENAMES
513PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
514 int ierr,
515 const Py_UNICODE *filename)
516{
Brett Cannonbf364092006-03-01 04:25:17 +0000517 PyObject *name = filename ?
518 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000519 NULL;
520 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
521 PyExc_WindowsError,
522 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000523 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000524 return result;
525}
526#endif /* Py_WIN_WIDE_FILENAMES */
Guido van Rossum795e1892000-02-17 15:19:15 +0000527#endif /* MS_WINDOWS */
528
Guido van Rossum683a0721990-10-21 22:09:12 +0000529void
Neal Norwitzb382b842007-08-24 20:00:37 +0000530_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000531{
532 PyErr_Format(PyExc_SystemError,
533 "%s:%d: bad argument to internal function",
534 filename, lineno);
535}
536
537/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
538 export the entry point for existing object code: */
539#undef PyErr_BadInternalCall
540void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000541PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000542{
Fred Drake6d63adf2000-08-24 22:38:39 +0000543 PyErr_Format(PyExc_SystemError,
544 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000545}
Fred Drake6d63adf2000-08-24 22:38:39 +0000546#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
547
Guido van Rossum1548bac1997-02-14 17:09:47 +0000548
549
Guido van Rossum1548bac1997-02-14 17:09:47 +0000550PyObject *
551PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000552{
553 va_list vargs;
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000554 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000555
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000556#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum1548bac1997-02-14 17:09:47 +0000557 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000558#else
559 va_start(vargs);
560#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000561
Walter Dörwald573c08c2007-05-25 15:46:59 +0000562 string = PyUnicode_FromFormatV(format, vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000563 PyErr_SetObject(exception, string);
564 Py_XDECREF(string);
Tim Petersc15c4f12001-10-02 21:32:07 +0000565 va_end(vargs);
Guido van Rossum1548bac1997-02-14 17:09:47 +0000566 return NULL;
567}
Guido van Rossum7617e051997-09-16 18:43:50 +0000568
569
Thomas Wouters477c8d52006-05-27 19:21:47 +0000570
Guido van Rossum7617e051997-09-16 18:43:50 +0000571PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000572PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000573{
Neal Norwitzb382b842007-08-24 20:00:37 +0000574 const char *dot;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000575 PyObject *modulename = NULL;
576 PyObject *classname = NULL;
577 PyObject *mydict = NULL;
578 PyObject *bases = NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000579 PyObject *result = NULL;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000580 dot = strrchr(name, '.');
581 if (dot == NULL) {
582 PyErr_SetString(PyExc_SystemError,
583 "PyErr_NewException: name must be module.class");
Guido van Rossum7617e051997-09-16 18:43:50 +0000584 return NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000585 }
586 if (base == NULL)
587 base = PyExc_Exception;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000588 if (dict == NULL) {
589 dict = mydict = PyDict_New();
590 if (dict == NULL)
591 goto failure;
592 }
593 if (PyDict_GetItemString(dict, "__module__") == NULL) {
Neal Norwitzcd795962007-08-24 19:54:13 +0000594 modulename = PyUnicode_FromStringAndSize(name,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000595 (Py_ssize_t)(dot-name));
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000596 if (modulename == NULL)
597 goto failure;
598 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
599 goto failure;
600 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000601 if (PyTuple_Check(base)) {
602 bases = base;
603 /* INCREF as we create a new ref in the else branch */
604 Py_INCREF(bases);
605 } else {
606 bases = PyTuple_Pack(1, base);
607 if (bases == NULL)
608 goto failure;
609 }
610 /* Create a real new-style class. */
Guido van Rossume845c0f2007-11-02 23:07:07 +0000611 result = PyObject_CallFunction((PyObject *)&PyType_Type, "UOO",
Thomas Wouters477c8d52006-05-27 19:21:47 +0000612 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000613 failure:
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000614 Py_XDECREF(bases);
615 Py_XDECREF(mydict);
616 Py_XDECREF(classname);
617 Py_XDECREF(modulename);
Guido van Rossum7617e051997-09-16 18:43:50 +0000618 return result;
619}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000620
621/* Call when an exception has occurred but there is no way for Python
622 to handle it. Examples: exception in __del__ or during GC. */
623void
624PyErr_WriteUnraisable(PyObject *obj)
625{
626 PyObject *f, *t, *v, *tb;
627 PyErr_Fetch(&t, &v, &tb);
628 f = PySys_GetObject("stderr");
Christian Heimes2be03732007-11-15 02:26:46 +0000629 if (f != NULL && f != Py_None) {
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000630 PyFile_WriteString("Exception ", f);
631 if (t) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000632 PyObject* moduleName;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000633 char* className;
634 assert(PyExceptionClass_Check(t));
635 className = PyExceptionClass_Name(t);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000636 if (className != NULL) {
637 char *dot = strrchr(className, '.');
638 if (dot != NULL)
639 className = dot+1;
640 }
641
642 moduleName = PyObject_GetAttrString(t, "__module__");
Brett Cannonbf364092006-03-01 04:25:17 +0000643 if (moduleName == NULL)
644 PyFile_WriteString("<unknown>", f);
645 else {
Neal Norwitzcd795962007-08-24 19:54:13 +0000646 char* modstr = PyUnicode_AsString(moduleName);
Neal Norwitz2633c692007-02-26 22:22:47 +0000647 if (modstr &&
Georg Brandl1a3284e2007-12-02 09:40:06 +0000648 strcmp(modstr, "builtins") != 0)
Brett Cannonbf364092006-03-01 04:25:17 +0000649 {
650 PyFile_WriteString(modstr, f);
651 PyFile_WriteString(".", f);
652 }
653 }
654 if (className == NULL)
655 PyFile_WriteString("<unknown>", f);
656 else
657 PyFile_WriteString(className, f);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000658 if (v && v != Py_None) {
659 PyFile_WriteString(": ", f);
660 PyFile_WriteObject(v, f, 0);
661 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000662 Py_XDECREF(moduleName);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000663 }
664 PyFile_WriteString(" in ", f);
665 PyFile_WriteObject(obj, f, 0);
666 PyFile_WriteString(" ignored\n", f);
667 PyErr_Clear(); /* Just in case */
668 }
669 Py_XDECREF(t);
670 Py_XDECREF(v);
671 Py_XDECREF(tb);
672}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000673
Armin Rigo092381a2003-10-25 14:29:27 +0000674extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000675
676/* Function to issue a warning message; may raise an exception. */
677int
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000678PyErr_WarnEx(PyObject *category, const char *message, Py_ssize_t stack_level)
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000679{
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000680 PyObject *dict, *func = NULL;
Mark Hammondedd07732003-07-15 23:03:55 +0000681 PyObject *warnings_module = PyModule_GetWarningsModule();
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000682
Mark Hammondedd07732003-07-15 23:03:55 +0000683 if (warnings_module != NULL) {
684 dict = PyModule_GetDict(warnings_module);
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000685 if (dict != NULL)
686 func = PyDict_GetItemString(dict, "warn");
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000687 }
688 if (func == NULL) {
689 PySys_WriteStderr("warning: %s\n", message);
690 return 0;
691 }
692 else {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000693 PyObject *res;
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000694
695 if (category == NULL)
696 category = PyExc_RuntimeWarning;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000697 res = PyObject_CallFunction(func, "sOn",
698 message, category, stack_level);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000699 if (res == NULL)
700 return -1;
701 Py_DECREF(res);
702 return 0;
703 }
704}
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000705
Guido van Rossum2fd45652001-02-28 21:46:24 +0000706/* Warning with explicit origin */
707int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000708PyErr_WarnExplicit(PyObject *category, const char *message,
709 const char *filename, int lineno,
710 const char *module, PyObject *registry)
Guido van Rossum2fd45652001-02-28 21:46:24 +0000711{
712 PyObject *mod, *dict, *func = NULL;
713
714 mod = PyImport_ImportModule("warnings");
715 if (mod != NULL) {
716 dict = PyModule_GetDict(mod);
717 func = PyDict_GetItemString(dict, "warn_explicit");
718 Py_DECREF(mod);
719 }
720 if (func == NULL) {
721 PySys_WriteStderr("warning: %s\n", message);
722 return 0;
723 }
724 else {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000725 PyObject *res;
Guido van Rossum2fd45652001-02-28 21:46:24 +0000726
727 if (category == NULL)
728 category = PyExc_RuntimeWarning;
729 if (registry == NULL)
730 registry = Py_None;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000731 res = PyObject_CallFunction(func, "sOsizO", message, category,
732 filename, lineno, module, registry);
Guido van Rossum2fd45652001-02-28 21:46:24 +0000733 if (res == NULL)
734 return -1;
735 Py_DECREF(res);
736 return 0;
737 }
738}
739
740
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000741/* Set file and line information for the current exception.
742 If the exception is not a SyntaxError, also sets additional attributes
743 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000744
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000745void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000746PyErr_SyntaxLocation(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000747{
748 PyObject *exc, *v, *tb, *tmp;
749
750 /* add attributes for the line number and filename for the error */
751 PyErr_Fetch(&exc, &v, &tb);
752 PyErr_NormalizeException(&exc, &v, &tb);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000753 /* XXX check that it is, indeed, a syntax error. It might not
754 * be, though. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000755 tmp = PyInt_FromLong(lineno);
756 if (tmp == NULL)
757 PyErr_Clear();
758 else {
759 if (PyObject_SetAttrString(v, "lineno", tmp))
760 PyErr_Clear();
761 Py_DECREF(tmp);
762 }
763 if (filename != NULL) {
Neal Norwitzcd795962007-08-24 19:54:13 +0000764 tmp = PyUnicode_FromString(filename);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000765 if (tmp == NULL)
766 PyErr_Clear();
767 else {
768 if (PyObject_SetAttrString(v, "filename", tmp))
769 PyErr_Clear();
770 Py_DECREF(tmp);
771 }
772
773 tmp = PyErr_ProgramText(filename, lineno);
774 if (tmp) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000775 if (PyObject_SetAttrString(v, "text", tmp))
776 PyErr_Clear();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000777 Py_DECREF(tmp);
778 }
779 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000780 if (PyObject_SetAttrString(v, "offset", Py_None)) {
781 PyErr_Clear();
782 }
783 if (exc != PyExc_SyntaxError) {
784 if (!PyObject_HasAttrString(v, "msg")) {
785 tmp = PyObject_Str(v);
786 if (tmp) {
787 if (PyObject_SetAttrString(v, "msg", tmp))
788 PyErr_Clear();
789 Py_DECREF(tmp);
790 } else {
791 PyErr_Clear();
792 }
793 }
794 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
795 if (PyObject_SetAttrString(v, "print_file_and_line",
796 Py_None))
797 PyErr_Clear();
798 }
799 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000800 PyErr_Restore(exc, v, tb);
801}
802
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000803/* Attempt to load the line of text that the exception refers to. If it
804 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000805
806 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000807 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000808
809PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +0000810PyErr_ProgramText(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000811{
812 FILE *fp;
813 int i;
814 char linebuf[1000];
815
Tim Petersa7444f42006-02-27 23:29:46 +0000816 if (filename == NULL || *filename == '\0' || lineno <= 0)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000817 return NULL;
Jack Jansen7b8c7542002-04-14 20:12:41 +0000818 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000819 if (fp == NULL)
820 return NULL;
821 for (i = 0; i < lineno; i++) {
822 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
823 do {
824 *pLastChar = '\0';
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000825 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
826 fp, NULL) == NULL)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000827 break;
828 /* fgets read *something*; if it didn't get as
829 far as pLastChar, it must have found a newline
Thomas Wouters477c8d52006-05-27 19:21:47 +0000830 or hit the end of the file; if pLastChar is \n,
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000831 it obviously found a newline; else we haven't
832 yet seen a newline, so must continue */
833 } while (*pLastChar != '\0' && *pLastChar != '\n');
834 }
835 fclose(fp);
836 if (i == lineno) {
837 char *p = linebuf;
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000838 PyObject *res;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000839 while (*p == ' ' || *p == '\t' || *p == '\014')
840 p++;
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000841 res = PyUnicode_FromString(p);
842 if (res == NULL)
843 PyErr_Clear();
844 return res;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000845 }
846 return NULL;
847}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000848
849#ifdef __cplusplus
850}
851#endif