blob: 9c9eb2f2b21ffe6094a79bc734f08b9adcb1b1d1 [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{
Guido van Rossumb4fb6e42008-06-14 20:20:24 +000055 PyThreadState *tstate = PyThreadState_GET();
56 PyObject *tb = NULL;
57
Thomas Wouters303de6a2006-04-20 22:42:37 +000058 if (exception != NULL &&
59 !PyExceptionClass_Check(exception)) {
Thomas Wouters303de6a2006-04-20 22:42:37 +000060 PyErr_Format(PyExc_SystemError,
Walter Dörwald573c08c2007-05-25 15:46:59 +000061 "exception %R not a BaseException subclass",
62 exception);
Thomas Wouters303de6a2006-04-20 22:42:37 +000063 return;
64 }
Guido van Rossum373c8691997-04-29 18:22:47 +000065 Py_XINCREF(value);
Guido van Rossumb4fb6e42008-06-14 20:20:24 +000066 if (tstate->exc_value != NULL && tstate->exc_value != Py_None) {
67 /* Implicit exception chaining */
68 if (value == NULL || !PyExceptionInstance_Check(value)) {
69 /* We must normalize the value right now */
70 PyObject *args, *fixed_value;
71 if (value == NULL || value == Py_None)
72 args = PyTuple_New(0);
73 else if (PyTuple_Check(value)) {
74 Py_INCREF(value);
75 args = value;
76 }
77 else
78 args = PyTuple_Pack(1, value);
79 fixed_value = args ?
80 PyEval_CallObject(exception, args) : NULL;
81 Py_XDECREF(args);
82 Py_XDECREF(value);
83 if (fixed_value == NULL)
84 return;
85 value = fixed_value;
86 }
Benjamin Petersone6528212008-07-15 15:32:09 +000087 /* Avoid reference cycles through the context chain.
88 This is O(chain length) but context chains are
89 usually very short. Sensitive readers may try
90 to inline the call to PyException_GetContext. */
91 if (tstate->exc_value != value) {
92 PyObject *o = tstate->exc_value, *context;
93 while ((context = PyException_GetContext(o))) {
94 Py_DECREF(context);
95 if (context == value) {
96 PyException_SetContext(o, NULL);
97 break;
98 }
99 o = context;
100 }
101 Py_INCREF(tstate->exc_value);
102 PyException_SetContext(value, tstate->exc_value);
103 }
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000104 }
105 if (value != NULL && PyExceptionInstance_Check(value))
106 tb = PyException_GetTraceback(value);
107 Py_XINCREF(exception);
108 PyErr_Restore(exception, value, tb);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109}
110
111void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000112PyErr_SetNone(PyObject *exception)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113{
Guido van Rossum373c8691997-04-29 18:22:47 +0000114 PyErr_SetObject(exception, (PyObject *)NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000115}
116
117void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000118PyErr_SetString(PyObject *exception, const char *string)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119{
Walter Dörwald573c08c2007-05-25 15:46:59 +0000120 PyObject *value = PyUnicode_FromString(string);
Guido van Rossum373c8691997-04-29 18:22:47 +0000121 PyErr_SetObject(exception, value);
122 Py_XDECREF(value);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123}
124
Guido van Rossum3a241811994-08-29 12:14:12 +0000125
Guido van Rossum373c8691997-04-29 18:22:47 +0000126PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000127PyErr_Occurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128{
Tim Peters024da352001-05-30 06:09:50 +0000129 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000130
131 return tstate->curexc_type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132}
133
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000134
135int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000136PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000137{
Barry Warsawfa5c3152000-05-02 19:27:51 +0000138 if (err == NULL || exc == NULL) {
139 /* maybe caused by "import exceptions" that failed early on */
140 return 0;
141 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000142 if (PyTuple_Check(exc)) {
Martin v. Löwisd96ee902006-02-16 14:37:16 +0000143 Py_ssize_t i, n;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000144 n = PyTuple_Size(exc);
145 for (i = 0; i < n; i++) {
146 /* Test recursively */
147 if (PyErr_GivenExceptionMatches(
148 err, PyTuple_GET_ITEM(exc, i)))
149 {
150 return 1;
151 }
152 }
153 return 0;
154 }
155 /* err might be an instance, so check its class. */
Brett Cannonbf364092006-03-01 04:25:17 +0000156 if (PyExceptionInstance_Check(err))
157 err = PyExceptionInstance_Class(err);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000158
Brett Cannonbf364092006-03-01 04:25:17 +0000159 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
Benjamin Peterson69c88f72008-07-31 01:47:08 +0000160 int res = 0;
161 PyObject *exception, *value, *tb;
162 PyErr_Fetch(&exception, &value, &tb);
163 res = PyObject_IsSubclass(err, exc);
164 /* This function must not fail, so print the error here */
165 if (res == -1) {
166 PyErr_WriteUnraisable(err);
167 /* issubclass did not succeed */
168 res = 0;
169 }
170 PyErr_Restore(exception, value, tb);
171 return res;
Brett Cannonbf364092006-03-01 04:25:17 +0000172 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000173
174 return err == exc;
175}
Guido van Rossum743007d1999-04-21 15:27:31 +0000176
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000177
178int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000179PyErr_ExceptionMatches(PyObject *exc)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000180{
181 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
182}
183
184
185/* Used in many places to normalize a raised exception, including in
186 eval_code2(), do_raise(), and PyErr_Print()
Benjamin Petersone6528212008-07-15 15:32:09 +0000187
188 XXX: should PyErr_NormalizeException() also call
189 PyException_SetTraceback() with the resulting value and tb?
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000190*/
191void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000192PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000193{
194 PyObject *type = *exc;
195 PyObject *value = *val;
196 PyObject *inclass = NULL;
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000197 PyObject *initial_tb = NULL;
Thomas Wouters89d996e2007-09-08 17:39:28 +0000198 PyThreadState *tstate = NULL;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000199
Guido van Rossumed473a42000-08-07 19:18:27 +0000200 if (type == NULL) {
Guido van Rossum6b3fffa2003-04-10 20:29:48 +0000201 /* There was no exception, so nothing to do. */
202 return;
Guido van Rossumed473a42000-08-07 19:18:27 +0000203 }
204
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000205 /* If PyErr_SetNone() was used, the value will have been actually
206 set to NULL.
207 */
208 if (!value) {
209 value = Py_None;
210 Py_INCREF(value);
211 }
212
Brett Cannonbf364092006-03-01 04:25:17 +0000213 if (PyExceptionInstance_Check(value))
214 inclass = PyExceptionInstance_Class(value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000215
216 /* Normalize the exception so that if the type is a class, the
217 value will be an instance.
218 */
Brett Cannonbf364092006-03-01 04:25:17 +0000219 if (PyExceptionClass_Check(type)) {
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000220 /* if the value was not an instance, or is not an instance
221 whose class is (or is derived from) type, then use the
222 value as an argument to instantiation of the type
223 class.
224 */
Brett Cannonbf364092006-03-01 04:25:17 +0000225 if (!inclass || !PyObject_IsSubclass(inclass, type)) {
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000226 PyObject *args, *res;
227
228 if (value == Py_None)
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000229 args = PyTuple_New(0);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000230 else if (PyTuple_Check(value)) {
231 Py_INCREF(value);
232 args = value;
233 }
234 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000235 args = PyTuple_Pack(1, value);
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000236
237 if (args == NULL)
238 goto finally;
239 res = PyEval_CallObject(type, args);
240 Py_DECREF(args);
241 if (res == NULL)
242 goto finally;
243 Py_DECREF(value);
244 value = res;
245 }
Barry Warsaw3a749931997-09-30 15:00:18 +0000246 /* if the class of the instance doesn't exactly match the
247 class of the type, believe the instance
248 */
249 else if (inclass != type) {
250 Py_DECREF(type);
251 type = inclass;
252 Py_INCREF(type);
253 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000254 }
255 *exc = type;
256 *val = value;
257 return;
258finally:
Guido van Rossum19b55f21997-12-09 14:11:39 +0000259 Py_DECREF(type);
260 Py_DECREF(value);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000261 /* If the new exception doesn't set a traceback and the old
262 exception had a traceback, use the old traceback for the
263 new exception. It's better than nothing.
264 */
265 initial_tb = *tb;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000266 PyErr_Fetch(exc, val, tb);
Jeremy Hyltone2e2c9f2001-09-26 19:58:38 +0000267 if (initial_tb != NULL) {
268 if (*tb == NULL)
269 *tb = initial_tb;
270 else
271 Py_DECREF(initial_tb);
272 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000273 /* normalize recursively */
Thomas Wouters89d996e2007-09-08 17:39:28 +0000274 tstate = PyThreadState_GET();
275 if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
276 --tstate->recursion_depth;
277 PyErr_SetObject(PyExc_RuntimeError, PyExc_RecursionErrorInst);
278 return;
279 }
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000280 PyErr_NormalizeException(exc, val, tb);
Thomas Wouters89d996e2007-09-08 17:39:28 +0000281 --tstate->recursion_depth;
Barry Warsawc0dc92a1997-08-22 21:22:58 +0000282}
283
284
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000286PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287{
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000288 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000289
290 *p_type = tstate->curexc_type;
291 *p_value = tstate->curexc_value;
292 *p_traceback = tstate->curexc_traceback;
293
294 tstate->curexc_type = NULL;
295 tstate->curexc_value = NULL;
296 tstate->curexc_traceback = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000297}
298
299void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000300PyErr_Clear(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000301{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000302 PyErr_Restore(NULL, NULL, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303}
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000304
305/* Convenience functions to set a type error exception and return 0 */
306
307int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000308PyErr_BadArgument(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000309{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000310 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000311 "bad argument type for built-in operation");
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000312 return 0;
313}
314
Guido van Rossum373c8691997-04-29 18:22:47 +0000315PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000316PyErr_NoMemory(void)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000317{
Vladimir Marangozov0888ff12000-08-18 18:01:06 +0000318 if (PyErr_ExceptionMatches(PyExc_MemoryError))
319 /* already current */
320 return NULL;
321
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000322 /* raise the pre-allocated instance if it still exists */
323 if (PyExc_MemoryErrorInst)
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +0000324 {
325 /* Clear the previous traceback, otherwise it will be appended
326 * to the current one.
327 *
328 * The following statement is not likely to raise any error;
329 * if it does, we simply discard it.
330 */
331 PyException_SetTraceback(PyExc_MemoryErrorInst, Py_None);
332
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000333 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +0000334 }
Barry Warsaw2d8adff1997-08-29 21:54:35 +0000335 else
336 /* this will probably fail since there's no memory and hee,
337 hee, we have to instantiate this class
338 */
339 PyErr_SetNone(PyExc_MemoryError);
340
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000341 return NULL;
342}
343
Guido van Rossum373c8691997-04-29 18:22:47 +0000344PyObject *
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000345PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000346{
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000347 PyObject *message;
Guido van Rossum373c8691997-04-29 18:22:47 +0000348 PyObject *v;
Guido van Rossum3a241811994-08-29 12:14:12 +0000349 int i = errno;
Martin v. Löwis3484a182002-03-09 12:07:51 +0000350#ifdef PLAN9
351 char errbuf[ERRMAX];
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000352#else
353#ifndef MS_WINDOWS
354 char *s;
355#else
356 WCHAR *s_buf = NULL;
357#endif /* Unix/Windows */
358#endif /* PLAN 9*/
359
Guido van Rossume9fbc091995-02-18 14:52:19 +0000360#ifdef EINTR
Guido van Rossum373c8691997-04-29 18:22:47 +0000361 if (i == EINTR && PyErr_CheckSignals())
Guido van Rossum5063bab1991-10-20 20:14:56 +0000362 return NULL;
Guido van Rossume9fbc091995-02-18 14:52:19 +0000363#endif
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000364
Martin v. Löwis3484a182002-03-09 12:07:51 +0000365#ifdef PLAN9
366 rerrstr(errbuf, sizeof errbuf);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000367 message = PyUnicode_DecodeUTF8(errbuf, strlen(errbuf), "ignore");
Martin v. Löwis3484a182002-03-09 12:07:51 +0000368#else
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000369#ifndef MS_WINDOWS
Guido van Rossume0e59821998-10-14 20:38:13 +0000370 if (i == 0)
371 s = "Error"; /* Sometimes errno didn't get set */
Barry Warsaw97d95151998-07-23 16:05:56 +0000372 else
Guido van Rossume0e59821998-10-14 20:38:13 +0000373 s = strerror(i);
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000374 message = PyUnicode_DecodeUTF8(s, strlen(s), "ignore");
Guido van Rossum743007d1999-04-21 15:27:31 +0000375#else
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000376 if (i == 0)
377 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
378 else
Guido van Rossum743007d1999-04-21 15:27:31 +0000379 {
Guido van Rossum795e1892000-02-17 15:19:15 +0000380 /* Note that the Win32 errors do not lineup with the
381 errno error. So if the error is in the MSVC error
Brett Cannonbf364092006-03-01 04:25:17 +0000382 table, we use it, otherwise we assume it really _is_
Guido van Rossum795e1892000-02-17 15:19:15 +0000383 a Win32 error code
384 */
Guido van Rossum584b16a2000-02-21 16:50:31 +0000385 if (i > 0 && i < _sys_nerr) {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000386 message = PyUnicode_FromString(_sys_errlist[i]);
Guido van Rossum795e1892000-02-17 15:19:15 +0000387 }
388 else {
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000389 int len = FormatMessageW(
Guido van Rossum795e1892000-02-17 15:19:15 +0000390 FORMAT_MESSAGE_ALLOCATE_BUFFER |
391 FORMAT_MESSAGE_FROM_SYSTEM |
392 FORMAT_MESSAGE_IGNORE_INSERTS,
393 NULL, /* no message source */
394 i,
395 MAKELANGID(LANG_NEUTRAL,
396 SUBLANG_DEFAULT),
397 /* Default language */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000398 (LPWSTR) &s_buf,
Guido van Rossum795e1892000-02-17 15:19:15 +0000399 0, /* size not used */
400 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000401 if (len==0) {
Brett Cannonbf364092006-03-01 04:25:17 +0000402 /* Only ever seen this in out-of-mem
Mark Hammond3d61a062002-10-04 00:13:02 +0000403 situations */
Mark Hammond3d61a062002-10-04 00:13:02 +0000404 s_buf = NULL;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000405 message = PyUnicode_FromFormat("Windows Error 0x%X", i);
Mark Hammond3d61a062002-10-04 00:13:02 +0000406 } else {
Mark Hammond3d61a062002-10-04 00:13:02 +0000407 /* remove trailing cr/lf and dots */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000408 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
409 s_buf[--len] = L'\0';
410 message = PyUnicode_FromUnicode(s_buf, len);
Mark Hammond3d61a062002-10-04 00:13:02 +0000411 }
Guido van Rossum795e1892000-02-17 15:19:15 +0000412 }
Guido van Rossum743007d1999-04-21 15:27:31 +0000413 }
Martin v. Löwis3484a182002-03-09 12:07:51 +0000414#endif /* Unix/Windows */
415#endif /* PLAN 9*/
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000416
417 if (message == NULL)
418 {
419#ifdef MS_WINDOWS
420 LocalFree(s_buf);
421#endif
422 return NULL;
423 }
424
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000425 if (filenameObject != NULL)
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000426 v = Py_BuildValue("(iOO)", i, message, filenameObject);
Guido van Rossume0e59821998-10-14 20:38:13 +0000427 else
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000428 v = Py_BuildValue("(iO)", i, message);
429 Py_DECREF(message);
430
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000431 if (v != NULL) {
Guido van Rossum373c8691997-04-29 18:22:47 +0000432 PyErr_SetObject(exc, v);
433 Py_DECREF(v);
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000434 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000435#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000436 LocalFree(s_buf);
Guido van Rossum743007d1999-04-21 15:27:31 +0000437#endif
Guido van Rossum7d310eb1990-10-14 20:00:05 +0000438 return NULL;
439}
Guido van Rossum743007d1999-04-21 15:27:31 +0000440
Barry Warsaw97d95151998-07-23 16:05:56 +0000441
442PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000443PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000444{
Neal Norwitzcd795962007-08-24 19:54:13 +0000445 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000446 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000447 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000448 return result;
449}
450
451#ifdef Py_WIN_WIDE_FILENAMES
452PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000453PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000454{
Brett Cannonbf364092006-03-01 04:25:17 +0000455 PyObject *name = filename ?
456 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000457 NULL;
458 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
459 Py_XDECREF(name);
460 return result;
461}
462#endif /* Py_WIN_WIDE_FILENAMES */
463
464PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000465PyErr_SetFromErrno(PyObject *exc)
Barry Warsaw97d95151998-07-23 16:05:56 +0000466{
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000467 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
Barry Warsaw97d95151998-07-23 16:05:56 +0000468}
Guido van Rossum683a0721990-10-21 22:09:12 +0000469
Brett Cannonbf364092006-03-01 04:25:17 +0000470#ifdef MS_WINDOWS
Guido van Rossum795e1892000-02-17 15:19:15 +0000471/* Windows specific error code handling */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000472PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
Thomas Heller085358a2002-07-29 14:27:41 +0000473 PyObject *exc,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000474 int ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000475 PyObject *filenameObject)
Guido van Rossum795e1892000-02-17 15:19:15 +0000476{
477 int len;
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000478 WCHAR *s_buf = NULL; /* Free via LocalFree */
479 PyObject *message;
Guido van Rossum795e1892000-02-17 15:19:15 +0000480 PyObject *v;
481 DWORD err = (DWORD)ierr;
482 if (err==0) err = GetLastError();
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000483 len = FormatMessageW(
Guido van Rossum795e1892000-02-17 15:19:15 +0000484 /* Error API error */
485 FORMAT_MESSAGE_ALLOCATE_BUFFER |
486 FORMAT_MESSAGE_FROM_SYSTEM |
487 FORMAT_MESSAGE_IGNORE_INSERTS,
488 NULL, /* no message source */
489 err,
490 MAKELANGID(LANG_NEUTRAL,
491 SUBLANG_DEFAULT), /* Default language */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000492 (LPWSTR) &s_buf,
Guido van Rossum795e1892000-02-17 15:19:15 +0000493 0, /* size not used */
494 NULL); /* no args */
Mark Hammond3d61a062002-10-04 00:13:02 +0000495 if (len==0) {
496 /* Only seen this in out of mem situations */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000497 message = PyUnicode_FromFormat("Windows Error 0x%X", err);
Mark Hammond3d61a062002-10-04 00:13:02 +0000498 s_buf = NULL;
499 } else {
Mark Hammond3d61a062002-10-04 00:13:02 +0000500 /* remove trailing cr/lf and dots */
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000501 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
502 s_buf[--len] = L'\0';
503 message = PyUnicode_FromUnicode(s_buf, len);
Mark Hammond3d61a062002-10-04 00:13:02 +0000504 }
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000505
506 if (message == NULL)
507 {
508 LocalFree(s_buf);
509 return NULL;
510 }
511
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000512 if (filenameObject != NULL)
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000513 v = Py_BuildValue("(iOO)", err, message, filenameObject);
Guido van Rossum795e1892000-02-17 15:19:15 +0000514 else
Martin v. Löwis5d12abe2007-09-03 07:40:24 +0000515 v = Py_BuildValue("(iO)", err, message);
516 Py_DECREF(message);
517
Guido van Rossum795e1892000-02-17 15:19:15 +0000518 if (v != NULL) {
Thomas Heller085358a2002-07-29 14:27:41 +0000519 PyErr_SetObject(exc, v);
Guido van Rossum795e1892000-02-17 15:19:15 +0000520 Py_DECREF(v);
521 }
Mark Hammond3d61a062002-10-04 00:13:02 +0000522 LocalFree(s_buf);
Guido van Rossum795e1892000-02-17 15:19:15 +0000523 return NULL;
524}
525
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000526PyObject *PyErr_SetExcFromWindowsErrWithFilename(
527 PyObject *exc,
528 int ierr,
529 const char *filename)
530{
Neal Norwitzcd795962007-08-24 19:54:13 +0000531 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
Brett Cannonbf364092006-03-01 04:25:17 +0000532 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
533 ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000534 name);
535 Py_XDECREF(name);
536 return ret;
537}
538
539#ifdef Py_WIN_WIDE_FILENAMES
540PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
541 PyObject *exc,
542 int ierr,
543 const Py_UNICODE *filename)
544{
Brett Cannonbf364092006-03-01 04:25:17 +0000545 PyObject *name = filename ?
546 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000547 NULL;
Brett Cannonbf364092006-03-01 04:25:17 +0000548 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
549 ierr,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000550 name);
551 Py_XDECREF(name);
552 return ret;
553}
554#endif /* Py_WIN_WIDE_FILENAMES */
555
Thomas Heller085358a2002-07-29 14:27:41 +0000556PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
557{
558 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
559}
560
Guido van Rossum795e1892000-02-17 15:19:15 +0000561PyObject *PyErr_SetFromWindowsErr(int ierr)
562{
Thomas Heller085358a2002-07-29 14:27:41 +0000563 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
564 ierr, NULL);
565}
566PyObject *PyErr_SetFromWindowsErrWithFilename(
567 int ierr,
568 const char *filename)
569{
Neal Norwitzcd795962007-08-24 19:54:13 +0000570 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000571 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
572 PyExc_WindowsError,
573 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000574 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000575 return result;
Guido van Rossum795e1892000-02-17 15:19:15 +0000576}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000577
578#ifdef Py_WIN_WIDE_FILENAMES
579PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
580 int ierr,
581 const Py_UNICODE *filename)
582{
Brett Cannonbf364092006-03-01 04:25:17 +0000583 PyObject *name = filename ?
584 PyUnicode_FromUnicode(filename, wcslen(filename)) :
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000585 NULL;
586 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
587 PyExc_WindowsError,
588 ierr, name);
Mark Hammondda7efaa2002-10-04 00:09:38 +0000589 Py_XDECREF(name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000590 return result;
591}
592#endif /* Py_WIN_WIDE_FILENAMES */
Guido van Rossum795e1892000-02-17 15:19:15 +0000593#endif /* MS_WINDOWS */
594
Guido van Rossum683a0721990-10-21 22:09:12 +0000595void
Neal Norwitzb382b842007-08-24 20:00:37 +0000596_PyErr_BadInternalCall(const char *filename, int lineno)
Fred Drake6d63adf2000-08-24 22:38:39 +0000597{
598 PyErr_Format(PyExc_SystemError,
599 "%s:%d: bad argument to internal function",
600 filename, lineno);
601}
602
603/* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
604 export the entry point for existing object code: */
605#undef PyErr_BadInternalCall
606void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000607PyErr_BadInternalCall(void)
Guido van Rossum683a0721990-10-21 22:09:12 +0000608{
Fred Drake6d63adf2000-08-24 22:38:39 +0000609 PyErr_Format(PyExc_SystemError,
610 "bad argument to internal function");
Guido van Rossum683a0721990-10-21 22:09:12 +0000611}
Fred Drake6d63adf2000-08-24 22:38:39 +0000612#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
613
Guido van Rossum1548bac1997-02-14 17:09:47 +0000614
615
Guido van Rossum1548bac1997-02-14 17:09:47 +0000616PyObject *
617PyErr_Format(PyObject *exception, const char *format, ...)
Guido van Rossum1548bac1997-02-14 17:09:47 +0000618{
619 va_list vargs;
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000620 PyObject* string;
Guido van Rossum1548bac1997-02-14 17:09:47 +0000621
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000622#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossum1548bac1997-02-14 17:09:47 +0000623 va_start(vargs, format);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000624#else
625 va_start(vargs);
626#endif
Guido van Rossum1548bac1997-02-14 17:09:47 +0000627
Walter Dörwald573c08c2007-05-25 15:46:59 +0000628 string = PyUnicode_FromFormatV(format, vargs);
Jeremy Hyltonb69a27e2000-09-01 03:49:47 +0000629 PyErr_SetObject(exception, string);
630 Py_XDECREF(string);
Tim Petersc15c4f12001-10-02 21:32:07 +0000631 va_end(vargs);
Guido van Rossum1548bac1997-02-14 17:09:47 +0000632 return NULL;
633}
Guido van Rossum7617e051997-09-16 18:43:50 +0000634
635
Thomas Wouters477c8d52006-05-27 19:21:47 +0000636
Guido van Rossum7617e051997-09-16 18:43:50 +0000637PyObject *
Neal Norwitzb382b842007-08-24 20:00:37 +0000638PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
Guido van Rossum7617e051997-09-16 18:43:50 +0000639{
Neal Norwitzb382b842007-08-24 20:00:37 +0000640 const char *dot;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000641 PyObject *modulename = NULL;
642 PyObject *classname = NULL;
643 PyObject *mydict = NULL;
644 PyObject *bases = NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000645 PyObject *result = NULL;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000646 dot = strrchr(name, '.');
647 if (dot == NULL) {
648 PyErr_SetString(PyExc_SystemError,
649 "PyErr_NewException: name must be module.class");
Guido van Rossum7617e051997-09-16 18:43:50 +0000650 return NULL;
Guido van Rossum7617e051997-09-16 18:43:50 +0000651 }
652 if (base == NULL)
653 base = PyExc_Exception;
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000654 if (dict == NULL) {
655 dict = mydict = PyDict_New();
656 if (dict == NULL)
657 goto failure;
658 }
659 if (PyDict_GetItemString(dict, "__module__") == NULL) {
Neal Norwitzcd795962007-08-24 19:54:13 +0000660 modulename = PyUnicode_FromStringAndSize(name,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000661 (Py_ssize_t)(dot-name));
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000662 if (modulename == NULL)
663 goto failure;
664 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
665 goto failure;
666 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000667 if (PyTuple_Check(base)) {
668 bases = base;
669 /* INCREF as we create a new ref in the else branch */
670 Py_INCREF(bases);
671 } else {
672 bases = PyTuple_Pack(1, base);
673 if (bases == NULL)
674 goto failure;
675 }
676 /* Create a real new-style class. */
Guido van Rossume845c0f2007-11-02 23:07:07 +0000677 result = PyObject_CallFunction((PyObject *)&PyType_Type, "UOO",
Thomas Wouters477c8d52006-05-27 19:21:47 +0000678 dot+1, bases, dict);
Guido van Rossum7617e051997-09-16 18:43:50 +0000679 failure:
Guido van Rossum2ac650f1997-10-03 19:50:55 +0000680 Py_XDECREF(bases);
681 Py_XDECREF(mydict);
682 Py_XDECREF(classname);
683 Py_XDECREF(modulename);
Guido van Rossum7617e051997-09-16 18:43:50 +0000684 return result;
685}
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000686
687/* Call when an exception has occurred but there is no way for Python
688 to handle it. Examples: exception in __del__ or during GC. */
689void
690PyErr_WriteUnraisable(PyObject *obj)
691{
692 PyObject *f, *t, *v, *tb;
693 PyErr_Fetch(&t, &v, &tb);
694 f = PySys_GetObject("stderr");
Christian Heimes2be03732007-11-15 02:26:46 +0000695 if (f != NULL && f != Py_None) {
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000696 PyFile_WriteString("Exception ", f);
697 if (t) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000698 PyObject* moduleName;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000699 char* className;
700 assert(PyExceptionClass_Check(t));
701 className = PyExceptionClass_Name(t);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000702 if (className != NULL) {
703 char *dot = strrchr(className, '.');
704 if (dot != NULL)
705 className = dot+1;
706 }
707
708 moduleName = PyObject_GetAttrString(t, "__module__");
Brett Cannonbf364092006-03-01 04:25:17 +0000709 if (moduleName == NULL)
710 PyFile_WriteString("<unknown>", f);
711 else {
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +0000712 char* modstr = _PyUnicode_AsString(moduleName);
Neal Norwitz2633c692007-02-26 22:22:47 +0000713 if (modstr &&
Georg Brandl1a3284e2007-12-02 09:40:06 +0000714 strcmp(modstr, "builtins") != 0)
Brett Cannonbf364092006-03-01 04:25:17 +0000715 {
716 PyFile_WriteString(modstr, f);
717 PyFile_WriteString(".", f);
718 }
719 }
720 if (className == NULL)
721 PyFile_WriteString("<unknown>", f);
722 else
723 PyFile_WriteString(className, f);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000724 if (v && v != Py_None) {
725 PyFile_WriteString(": ", f);
726 PyFile_WriteObject(v, f, 0);
727 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000728 Py_XDECREF(moduleName);
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000729 }
730 PyFile_WriteString(" in ", f);
731 PyFile_WriteObject(obj, f, 0);
732 PyFile_WriteString(" ignored\n", f);
733 PyErr_Clear(); /* Just in case */
734 }
735 Py_XDECREF(t);
736 Py_XDECREF(v);
737 Py_XDECREF(tb);
738}
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000739
Armin Rigo092381a2003-10-25 14:29:27 +0000740extern PyObject *PyModule_GetWarningsModule(void);
Guido van Rossumcfd42b52000-12-15 21:58:52 +0000741
Guido van Rossum2fd45652001-02-28 21:46:24 +0000742
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000743/* Set file and line information for the current exception.
744 If the exception is not a SyntaxError, also sets additional attributes
745 to make printing of exceptions believe it is a syntax error. */
Guido van Rossum2fd45652001-02-28 21:46:24 +0000746
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000747void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000748PyErr_SyntaxLocation(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000749{
750 PyObject *exc, *v, *tb, *tmp;
751
752 /* add attributes for the line number and filename for the error */
753 PyErr_Fetch(&exc, &v, &tb);
754 PyErr_NormalizeException(&exc, &v, &tb);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000755 /* XXX check that it is, indeed, a syntax error. It might not
756 * be, though. */
Christian Heimes217cfd12007-12-02 14:31:20 +0000757 tmp = PyLong_FromLong(lineno);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000758 if (tmp == NULL)
759 PyErr_Clear();
760 else {
761 if (PyObject_SetAttrString(v, "lineno", tmp))
762 PyErr_Clear();
763 Py_DECREF(tmp);
764 }
765 if (filename != NULL) {
Neal Norwitzcd795962007-08-24 19:54:13 +0000766 tmp = PyUnicode_FromString(filename);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000767 if (tmp == NULL)
768 PyErr_Clear();
769 else {
770 if (PyObject_SetAttrString(v, "filename", tmp))
771 PyErr_Clear();
772 Py_DECREF(tmp);
773 }
774
775 tmp = PyErr_ProgramText(filename, lineno);
776 if (tmp) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000777 if (PyObject_SetAttrString(v, "text", tmp))
778 PyErr_Clear();
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000779 Py_DECREF(tmp);
780 }
781 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000782 if (PyObject_SetAttrString(v, "offset", Py_None)) {
783 PyErr_Clear();
784 }
785 if (exc != PyExc_SyntaxError) {
786 if (!PyObject_HasAttrString(v, "msg")) {
787 tmp = PyObject_Str(v);
788 if (tmp) {
789 if (PyObject_SetAttrString(v, "msg", tmp))
790 PyErr_Clear();
791 Py_DECREF(tmp);
792 } else {
793 PyErr_Clear();
794 }
795 }
796 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
797 if (PyObject_SetAttrString(v, "print_file_and_line",
798 Py_None))
799 PyErr_Clear();
800 }
801 }
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000802 PyErr_Restore(exc, v, tb);
803}
804
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000805/* Attempt to load the line of text that the exception refers to. If it
806 fails, it will return NULL but will not set an exception.
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000807
808 XXX The functionality of this function is quite similar to the
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000809 functionality in tb_displayline() in traceback.c. */
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000810
811PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +0000812PyErr_ProgramText(const char *filename, int lineno)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000813{
814 FILE *fp;
815 int i;
816 char linebuf[1000];
817
Tim Petersa7444f42006-02-27 23:29:46 +0000818 if (filename == NULL || *filename == '\0' || lineno <= 0)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000819 return NULL;
Jack Jansen7b8c7542002-04-14 20:12:41 +0000820 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000821 if (fp == NULL)
822 return NULL;
823 for (i = 0; i < lineno; i++) {
824 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
825 do {
826 *pLastChar = '\0';
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000827 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
828 fp, NULL) == NULL)
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000829 break;
830 /* fgets read *something*; if it didn't get as
831 far as pLastChar, it must have found a newline
Thomas Wouters477c8d52006-05-27 19:21:47 +0000832 or hit the end of the file; if pLastChar is \n,
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000833 it obviously found a newline; else we haven't
834 yet seen a newline, so must continue */
835 } while (*pLastChar != '\0' && *pLastChar != '\n');
836 }
837 fclose(fp);
838 if (i == lineno) {
839 char *p = linebuf;
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000840 PyObject *res;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000841 while (*p == ' ' || *p == '\t' || *p == '\014')
842 p++;
Guido van Rossumebe8f8a2007-10-10 18:53:36 +0000843 res = PyUnicode_FromString(p);
844 if (res == NULL)
845 PyErr_Clear();
846 return res;
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000847 }
848 return NULL;
849}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000850
851#ifdef __cplusplus
852}
853#endif