blob: 90be55d1bbe97e8025d9fbf4d0ba1ff8a4b7af0e [file] [log] [blame]
Guido van Rossum2d167031994-09-16 10:54:21 +00001/***********************************************************
Jack Jansen42218ce1997-01-31 16:15:11 +00002Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam,
Guido van Rossum99546991995-01-08 14:33:34 +00003The Netherlands.
Guido van Rossum2d167031994-09-16 10:54:21 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* Macintosh OS-specific interface */
26
27#include "Python.h"
Jack Jansen97ce3611994-12-14 14:02:24 +000028#include "macglue.h"
Guido van Rossum2d167031994-09-16 10:54:21 +000029
Jack Jansenee23d6e1995-01-27 14:43:25 +000030#include <Windows.h>
Jack Jansen76a05891996-02-29 16:11:32 +000031#include <Files.h>
Jack Janseneb76b841996-09-30 14:43:22 +000032#include <LowMem.h>
Jack Jansenee23d6e1995-01-27 14:43:25 +000033
Guido van Rossum2d167031994-09-16 10:54:21 +000034static PyObject *MacOS_Error; /* Exception MacOS.Error */
35
Guido van Rossume6d9ccc1995-02-21 21:01:05 +000036#ifdef MPW
Guido van Rossum9fed1831995-02-18 15:02:02 +000037#define bufferIsSmall -607 /*error returns from Post and Accept */
38#endif
39
Jack Jansen76a05891996-02-29 16:11:32 +000040static PyObject *ErrorObject;
41
42/* ----------------------------------------------------- */
43
44/* Declarations for objects of type Resource fork */
45
46typedef struct {
47 PyObject_HEAD
48 short fRefNum;
49 int isclosed;
50} rfobject;
51
52staticforward PyTypeObject Rftype;
53
54
55
56/* ---------------------------------------------------------------- */
57
58static void
59do_close(self)
60 rfobject *self;
61{
62 if (self->isclosed ) return;
63 (void)FSClose(self->fRefNum);
64 self->isclosed = 1;
65}
66
67static char rf_read__doc__[] =
68"Read data from resource fork"
69;
70
71static PyObject *
72rf_read(self, args)
73 rfobject *self;
74 PyObject *args;
75{
76 long n;
77 PyObject *v;
78 OSErr err;
79
80 if (self->isclosed) {
81 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
82 return NULL;
83 }
84
85 if (!PyArg_ParseTuple(args, "l", &n))
86 return NULL;
87
88 v = PyString_FromStringAndSize((char *)NULL, n);
89 if (v == NULL)
90 return NULL;
91
92 err = FSRead(self->fRefNum, &n, PyString_AsString(v));
93 if (err && err != eofErr) {
94 PyMac_Error(err);
95 Py_DECREF(v);
96 return NULL;
97 }
98 _PyString_Resize(&v, n);
99 return v;
100}
101
102
103static char rf_write__doc__[] =
104"Write to resource fork"
105;
106
107static PyObject *
108rf_write(self, args)
109 rfobject *self;
110 PyObject *args;
111{
112 char *buffer;
113 long size;
114 OSErr err;
115
116 if (self->isclosed) {
117 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
118 return NULL;
119 }
Jack Jansen4a8c54e1997-02-24 13:56:59 +0000120 if (!PyArg_ParseTuple(args, "m#", &buffer, &size))
Jack Jansen76a05891996-02-29 16:11:32 +0000121 return NULL;
122 err = FSWrite(self->fRefNum, &size, buffer);
123 if (err) {
124 PyMac_Error(err);
125 return NULL;
126 }
127 Py_INCREF(Py_None);
128 return Py_None;
129}
130
131
132static char rf_seek__doc__[] =
133"Set file position"
134;
135
136static PyObject *
137rf_seek(self, args)
138 rfobject *self;
139 PyObject *args;
140{
141 long amount, pos;
142 int whence = SEEK_SET;
143 long eof;
144 OSErr err;
145
146 if (self->isclosed) {
147 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
148 return NULL;
149 }
150 if (!PyArg_ParseTuple(args, "l|i", &amount, &whence))
151 return NULL;
152
153 if ( err = GetEOF(self->fRefNum, &eof))
154 goto ioerr;
155
156 switch (whence) {
157 case SEEK_CUR:
158 if (err = GetFPos(self->fRefNum, &pos))
159 goto ioerr;
160 break;
161 case SEEK_END:
162 pos = eof;
163 break;
164 case SEEK_SET:
165 pos = 0;
166 break;
167 default:
168 PyErr_BadArgument();
169 return NULL;
170 }
171
172 pos += amount;
173
174 /* Don't bother implementing seek past EOF */
175 if (pos > eof || pos < 0) {
176 PyErr_BadArgument();
177 return NULL;
178 }
179
180 if ( err = SetFPos(self->fRefNum, fsFromStart, pos) ) {
181ioerr:
182 PyMac_Error(err);
183 return NULL;
184 }
185 Py_INCREF(Py_None);
186 return Py_None;
187}
188
189
190static char rf_tell__doc__[] =
191"Get file position"
192;
193
194static PyObject *
195rf_tell(self, args)
196 rfobject *self;
197 PyObject *args;
198{
199 long where;
200 OSErr err;
201
202 if (self->isclosed) {
203 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
204 return NULL;
205 }
206 if (!PyArg_ParseTuple(args, ""))
207 return NULL;
208 if ( err = GetFPos(self->fRefNum, &where) ) {
209 PyMac_Error(err);
210 return NULL;
211 }
212 return PyInt_FromLong(where);
213}
214
215static char rf_close__doc__[] =
216"Close resource fork"
217;
218
219static PyObject *
220rf_close(self, args)
221 rfobject *self;
222 PyObject *args;
223{
Jack Jansen76a05891996-02-29 16:11:32 +0000224 if (!PyArg_ParseTuple(args, ""))
225 return NULL;
226 do_close(self);
227 Py_INCREF(Py_None);
228 return Py_None;
229}
230
231
232static struct PyMethodDef rf_methods[] = {
233 {"read", rf_read, 1, rf_read__doc__},
234 {"write", rf_write, 1, rf_write__doc__},
235 {"seek", rf_seek, 1, rf_seek__doc__},
236 {"tell", rf_tell, 1, rf_tell__doc__},
237 {"close", rf_close, 1, rf_close__doc__},
238
239 {NULL, NULL} /* sentinel */
240};
241
242/* ---------- */
243
244
245static rfobject *
246newrfobject()
247{
248 rfobject *self;
249
250 self = PyObject_NEW(rfobject, &Rftype);
251 if (self == NULL)
252 return NULL;
253 self->isclosed = 1;
254 return self;
255}
256
257
258static void
259rf_dealloc(self)
260 rfobject *self;
261{
262 do_close(self);
263 PyMem_DEL(self);
264}
265
266static PyObject *
267rf_getattr(self, name)
268 rfobject *self;
269 char *name;
270{
271 return Py_FindMethod(rf_methods, (PyObject *)self, name);
272}
273
274static char Rftype__doc__[] =
275"Resource fork file object"
276;
277
278static PyTypeObject Rftype = {
279 PyObject_HEAD_INIT(&PyType_Type)
280 0, /*ob_size*/
281 "Resource fork", /*tp_name*/
282 sizeof(rfobject), /*tp_basicsize*/
283 0, /*tp_itemsize*/
284 /* methods */
285 (destructor)rf_dealloc, /*tp_dealloc*/
286 (printfunc)0, /*tp_print*/
287 (getattrfunc)rf_getattr, /*tp_getattr*/
288 (setattrfunc)0, /*tp_setattr*/
289 (cmpfunc)0, /*tp_compare*/
290 (reprfunc)0, /*tp_repr*/
291 0, /*tp_as_number*/
292 0, /*tp_as_sequence*/
293 0, /*tp_as_mapping*/
294 (hashfunc)0, /*tp_hash*/
295 (ternaryfunc)0, /*tp_call*/
296 (reprfunc)0, /*tp_str*/
297
298 /* Space for future expansion */
299 0L,0L,0L,0L,
300 Rftype__doc__ /* Documentation string */
301};
302
303/* End of code for Resource fork objects */
304/* -------------------------------------------------------- */
Guido van Rossum2d167031994-09-16 10:54:21 +0000305
306/*----------------------------------------------------------------------*/
Guido van Rossume791c2e1995-01-09 13:20:04 +0000307/* Miscellaneous File System Operations */
308
309static PyObject *
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000310MacOS_GetCreatorAndType(PyObject *self, PyObject *args)
Guido van Rossume791c2e1995-01-09 13:20:04 +0000311{
312 Str255 name;
313 FInfo info;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000314 PyObject *creator, *type, *res;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000315 OSErr err;
316
Guido van Rossum9aa3d131995-01-21 13:46:04 +0000317 if (!PyArg_ParseTuple(args, "O&", PyMac_GetStr255, &name))
Guido van Rossume791c2e1995-01-09 13:20:04 +0000318 return NULL;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000319 if ((err = GetFInfo(name, 0, &info)) != noErr)
320 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000321 creator = PyString_FromStringAndSize((char *)&info.fdCreator, 4);
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000322 type = PyString_FromStringAndSize((char *)&info.fdType, 4);
323 res = Py_BuildValue("OO", creator, type);
Guido van Rossumfffb8bb1995-01-12 12:37:24 +0000324 Py_DECREF(creator);
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000325 Py_DECREF(type);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000326 return res;
327}
328
329static PyObject *
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000330MacOS_SetCreatorAndType(PyObject *self, PyObject *args)
Guido van Rossume791c2e1995-01-09 13:20:04 +0000331{
332 Str255 name;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000333 ResType creator, type;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000334 FInfo info;
335 OSErr err;
336
337 if (!PyArg_ParseTuple(args, "O&O&O&",
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000338 PyMac_GetStr255, &name, PyMac_GetOSType, &creator, PyMac_GetOSType, &type))
Guido van Rossume791c2e1995-01-09 13:20:04 +0000339 return NULL;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000340 if ((err = GetFInfo(name, 0, &info)) != noErr)
341 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000342 info.fdCreator = creator;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000343 info.fdType = type;
344 if ((err = SetFInfo(name, 0, &info)) != noErr)
345 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000346 Py_INCREF(Py_None);
347 return Py_None;
348}
349
350/*----------------------------------------------------------------------*/
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000351/* STDWIN High Level Event interface */
352
353#include <EPPC.h>
354#include <Events.h>
355
356#ifdef USE_STDWIN
357
358extern void (*_w_high_level_event_proc)(EventRecord *);
359
360static PyObject *MacOS_HighLevelEventHandler = NULL;
361
362static void
Guido van Rossumbf068b11995-01-25 23:09:20 +0000363MacOS_HighLevelEventProc(EventRecord *e)
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000364{
365 if (MacOS_HighLevelEventHandler != NULL) {
Guido van Rossumbf068b11995-01-25 23:09:20 +0000366 PyObject *args = PyMac_BuildEventRecord(e);
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000367 PyObject *res;
368 if (args == NULL)
369 res = NULL;
370 else {
371 res = PyEval_CallObject(MacOS_HighLevelEventHandler, args);
372 Py_DECREF(args);
373 }
374 if (res == NULL) {
375 fprintf(stderr, "Exception in MacOS_HighLevelEventProc:\n");
376 PyErr_Print();
377 }
378 else
379 Py_DECREF(res);
380 }
381}
382
Jack Jansene8e8ae01995-01-26 16:36:45 +0000383/* XXXX Need to come here from PyMac_DoYield too... */
384
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000385static PyObject *
386MacOS_SetHighLevelEventHandler(self, args)
387 PyObject *self;
388 PyObject *args;
389{
390 PyObject *previous = MacOS_HighLevelEventHandler;
391 PyObject *next = NULL;
392 if (!PyArg_ParseTuple(args, "|O", &next))
393 return NULL;
394 if (next == Py_None)
395 next = NULL;
396 Py_INCREF(next);
397 MacOS_HighLevelEventHandler = next;
398 if (next == NULL)
399 _w_high_level_event_proc = NULL;
400 else
401 _w_high_level_event_proc = MacOS_HighLevelEventProc;
402 if (previous == NULL) {
403 Py_INCREF(Py_None);
404 previous = Py_None;
405 }
406 return previous;
407}
408
409#endif /* USE_STDWIN */
410
411static PyObject *
412MacOS_AcceptHighLevelEvent(self, args)
413 PyObject *self;
414 PyObject *args;
415{
416 TargetID sender;
417 unsigned long refcon;
418 Ptr buf;
419 unsigned long len;
420 OSErr err;
421 PyObject *res;
422
423 buf = NULL;
424 len = 0;
425 err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
426 if (err == bufferIsSmall) {
427 buf = malloc(len);
428 if (buf == NULL)
429 return PyErr_NoMemory();
430 err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
431 if (err != noErr) {
432 free(buf);
433 return PyErr_Mac(MacOS_Error, (int)err);
434 }
435 }
436 else if (err != noErr)
437 return PyErr_Mac(MacOS_Error, (int)err);
438 res = Py_BuildValue("s#ls#",
439 (char *)&sender, (int)(sizeof sender), refcon, (char *)buf, (int)len);
440 free(buf);
441 return res;
442}
443
Jack Jansene8e8ae01995-01-26 16:36:45 +0000444/*
445** Set poll frequency and cpu-yield-time
446*/
447static PyObject *
448MacOS_SetScheduleTimes(PyObject *self, PyObject *args)
449{
450 long fgi, fgy, bgi, bgy;
451
452 bgi = bgy = -2;
453 if (!PyArg_ParseTuple(args, "ll|ll", &fgi, &fgy, &bgi, &bgy))
454 return NULL;
Jack Jansenb2f6a7e1995-02-20 15:46:10 +0000455 if ( bgi == -2 || bgy == -2 ) {
Jack Jansene8e8ae01995-01-26 16:36:45 +0000456 bgi = fgi;
457 bgy = fgy;
458 }
459 PyMac_SetYield(fgi, fgy, bgi, bgy);
460 Py_INCREF(Py_None);
461 return Py_None;
462}
463
Jack Jansenee23d6e1995-01-27 14:43:25 +0000464static PyObject *
465MacOS_EnableAppswitch(PyObject *self, PyObject *args)
466{
Guido van Rossume7134aa1995-02-26 10:20:53 +0000467 int old, new;
Jack Jansenee23d6e1995-01-27 14:43:25 +0000468
Guido van Rossume7134aa1995-02-26 10:20:53 +0000469 if (!PyArg_ParseTuple(args, "i", &new))
Jack Jansenee23d6e1995-01-27 14:43:25 +0000470 return NULL;
Guido van Rossume7134aa1995-02-26 10:20:53 +0000471 old = PyMac_DoYieldEnabled;
472 PyMac_DoYieldEnabled = new;
473 return Py_BuildValue("i", old);
Jack Jansenee23d6e1995-01-27 14:43:25 +0000474}
475
Jack Jansena76382a1995-02-02 14:25:56 +0000476
477static PyObject *
478MacOS_HandleEvent(PyObject *self, PyObject *args)
479{
480 EventRecord ev;
481
482 if (!PyArg_ParseTuple(args, "O&", PyMac_GetEventRecord, &ev))
483 return NULL;
484 PyMac_HandleEvent(&ev);
485 Py_INCREF(Py_None);
486 return Py_None;
487}
488
Jack Jansen829f88c1995-07-17 11:36:01 +0000489static PyObject *
490MacOS_GetErrorString(PyObject *self, PyObject *args)
491{
492 int errn;
493
494 if (!PyArg_ParseTuple(args, "i", &errn))
495 return NULL;
496 return Py_BuildValue("s", PyMac_StrError(errn));
497}
498
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000499static char splash_doc[] = "Open a splash-screen dialog by resource-id (0=close)";
500
501static PyObject *
502MacOS_splash(PyObject *self, PyObject *args)
503{
Jack Jansendf34cf11996-09-15 22:12:00 +0000504 int resid = -1;
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000505 static DialogPtr curdialog;
Jack Jansen04df9d51996-09-23 15:49:43 +0000506 WindowRef theWindow;
507 CGrafPtr thePort;
Jack Jansen04df9d51996-09-23 15:49:43 +0000508 short xpos, ypos, width, height, swidth, sheight;
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000509
Jack Jansendf34cf11996-09-15 22:12:00 +0000510 if (!PyArg_ParseTuple(args, "|i", &resid))
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000511 return NULL;
512 if (curdialog)
513 DisposeDialog(curdialog);
514
Jack Jansendf34cf11996-09-15 22:12:00 +0000515 if ( resid != -1 ) {
516 curdialog = GetNewDialog(resid, NULL, (WindowPtr)-1);
Jack Jansen04df9d51996-09-23 15:49:43 +0000517 if ( curdialog ) {
518 theWindow = GetDialogWindow(curdialog);
519 thePort = GetWindowPort(theWindow);
520 width = thePort->portRect.right - thePort->portRect.left;
521 height = thePort->portRect.bottom - thePort->portRect.top;
522 swidth = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
523 sheight = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top - LMGetMBarHeight();
524 xpos = (swidth-width)/2;
525 ypos = (sheight-height)/5 + LMGetMBarHeight();
526 MoveWindow(theWindow, xpos, ypos, 0);
527 ShowWindow(theWindow);
Jack Jansendf34cf11996-09-15 22:12:00 +0000528 DrawDialog(curdialog);
Jack Jansen04df9d51996-09-23 15:49:43 +0000529 }
Jack Jansendf34cf11996-09-15 22:12:00 +0000530 }
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000531 Py_INCREF(Py_None);
532 return Py_None;
533}
534
Jack Janseneb76b841996-09-30 14:43:22 +0000535static char DebugStr_doc[] = "Switch to low-level debugger with a message";
536
537static PyObject *
538MacOS_DebugStr(PyObject *self, PyObject *args)
539{
540 Str255 message;
541 PyObject *object = 0;
542
543 if (!PyArg_ParseTuple(args, "O&|O", PyMac_GetStr255, message, &object))
544 return NULL;
545 DebugStr(message);
546 Py_INCREF(Py_None);
547 return Py_None;
548}
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000549
Jack Jansen76a05891996-02-29 16:11:32 +0000550static char openrf_doc[] = "Open resource fork of a file";
551
552static PyObject *
553MacOS_openrf(PyObject *self, PyObject *args)
554{
555 OSErr err;
556 char *mode = "r";
557 FSSpec fss;
558 SignedByte permission = 1;
559 rfobject *fp;
560
561 if (!PyArg_ParseTuple(args, "O&|s", PyMac_GetFSSpec, &fss, &mode))
562 return NULL;
563 while (*mode) {
564 switch (*mode++) {
565 case '*': break;
566 case 'r': permission = 1; break;
567 case 'w': permission = 2; break;
568 case 'b': break;
569 default:
570 PyErr_BadArgument();
571 return NULL;
572 }
573 }
574
575 if ( (fp = newrfobject()) == NULL )
576 return NULL;
577
578 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
579
580 if ( err == fnfErr ) {
581 /* In stead of doing complicated things here to get creator/type
582 ** correct we let the standard i/o library handle it
583 */
584 FILE *tfp;
585 char pathname[257];
586
Jack Jansen84fb1fa1996-11-09 18:46:57 +0000587 if ( err=PyMac_GetFullPath(&fss, pathname) ) {
Jack Jansen76a05891996-02-29 16:11:32 +0000588 PyMac_Error(err);
589 Py_DECREF(fp);
590 return NULL;
591 }
592
593 if ( (tfp = fopen(pathname, "w")) == NULL ) {
594 PyMac_Error(fnfErr); /* What else... */
595 Py_DECREF(fp);
596 return NULL;
597 }
598 fclose(tfp);
599 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
600 }
601 if ( err ) {
602 Py_DECREF(fp);
603 PyMac_Error(err);
604 return NULL;
605 }
606 fp->isclosed = 0;
607 return (PyObject *)fp;
608}
609
Guido van Rossum2d167031994-09-16 10:54:21 +0000610static PyMethodDef MacOS_Methods[] = {
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000611 {"AcceptHighLevelEvent", MacOS_AcceptHighLevelEvent, 1},
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000612 {"GetCreatorAndType", MacOS_GetCreatorAndType, 1},
613 {"SetCreatorAndType", MacOS_SetCreatorAndType, 1},
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000614#ifdef USE_STDWIN
615 {"SetHighLevelEventHandler", MacOS_SetHighLevelEventHandler, 1},
616#endif
Jack Jansene8e8ae01995-01-26 16:36:45 +0000617 {"SetScheduleTimes", MacOS_SetScheduleTimes, 1},
Jack Jansenee23d6e1995-01-27 14:43:25 +0000618 {"EnableAppswitch", MacOS_EnableAppswitch, 1},
Jack Jansena76382a1995-02-02 14:25:56 +0000619 {"HandleEvent", MacOS_HandleEvent, 1},
Jack Jansen829f88c1995-07-17 11:36:01 +0000620 {"GetErrorString", MacOS_GetErrorString, 1},
Jack Jansen76a05891996-02-29 16:11:32 +0000621 {"openrf", MacOS_openrf, 1, openrf_doc},
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000622 {"splash", MacOS_splash, 1, splash_doc},
Jack Janseneb76b841996-09-30 14:43:22 +0000623 {"DebugStr", MacOS_DebugStr, 1, DebugStr_doc},
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000624 {NULL, NULL} /* Sentinel */
Guido van Rossum2d167031994-09-16 10:54:21 +0000625};
626
627
628void
629MacOS_Init()
630{
631 PyObject *m, *d;
632
633 m = Py_InitModule("MacOS", MacOS_Methods);
634 d = PyModule_GetDict(m);
635
636 /* Initialize MacOS.Error exception */
Guido van Rossumbf068b11995-01-25 23:09:20 +0000637 MacOS_Error = PyMac_GetOSErrException();
Guido van Rossume433c971994-09-29 10:02:56 +0000638 if (MacOS_Error == NULL || PyDict_SetItemString(d, "Error", MacOS_Error) != 0)
Guido van Rossum2d167031994-09-16 10:54:21 +0000639 Py_FatalError("can't define MacOS.Error");
Jack Jansenf73bab71997-04-03 14:51:03 +0000640 /*
641 ** This is a hack: the following constant added to the id() of a string
642 ** object gives you the address of the data. Unfortunately, it is needed for
643 ** some of the image and sound processing interfaces on the mac:-(
644 */
645 {
646 PyStringObject *p = 0;
647 long off = (long)&(p->ob_sval[0]);
648
649 if( PyDict_SetItemString(d, "string_id_to_buffer", Py_BuildValue("i", off)) != 0)
650 Py_FatalError("Can't define MacOS.string_id_to_buffer");
651 }
Guido van Rossum2d167031994-09-16 10:54:21 +0000652}
Guido van Rossume7134aa1995-02-26 10:20:53 +0000653