blob: d85eb719a27c769c971a78a99619bab95352aec9 [file] [log] [blame]
Jack Jansen84fa5ec1995-01-18 14:04:40 +00001/***********************************************************
Guido van Rossumefd97671995-01-26 22:56:16 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Jack Jansen84fa5ec1995-01-18 14:04:40 +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#include "allobjects.h"
26#include "modsupport.h" /* For getargs() etc. */
27#include "macglue.h"
28
Guido van Rossumbecdbec1995-02-14 01:27:24 +000029#include <Memory.h>
Jack Jansen84fa5ec1995-01-18 14:04:40 +000030#include <Files.h>
Jack Jansen2c673621995-06-18 20:05:14 +000031#include <Folders.h>
Jack Jansen84fa5ec1995-01-18 14:04:40 +000032#include <StandardFile.h>
33#include <Aliases.h>
34
35#include "nfullpath.h"
36
Guido van Rossuma42960c1995-01-19 00:03:47 +000037#ifdef THINK_C
38#define FileFilterUPP FileFilterProcPtr
39#endif
40
Jack Jansen84fa5ec1995-01-18 14:04:40 +000041static object *ErrorObject;
42
43/* ----------------------------------------------------- */
Jack Jansen17ba43f1995-01-26 16:22:07 +000044/* Declarations for objects of type Alias */
45
46typedef struct {
47 OB_HEAD
48 AliasHandle alias;
49} mfsaobject;
50
51staticforward typeobject Mfsatype;
52
53#define is_mfsaobject(v) ((v)->ob_type == &Mfsatype)
54
55/* ---------------------------------------------------------------- */
56/* Declarations for objects of type FSSpec */
57
58typedef struct {
59 OB_HEAD
60 FSSpec fsspec;
61} mfssobject;
62
63staticforward typeobject Mfsstype;
64
65#define is_mfssobject(v) ((v)->ob_type == &Mfsstype)
66
Guido van Rossumefd97671995-01-26 22:56:16 +000067
68mfssobject *newmfssobject(FSSpec *fss); /* Forward */
69
Jack Jansen17ba43f1995-01-26 16:22:07 +000070/* ---------------------------------------------------------------- */
Jack Jansen84fa5ec1995-01-18 14:04:40 +000071
72static object *
Jack Jansen17ba43f1995-01-26 16:22:07 +000073mfsa_Resolve(self, args)
74 mfsaobject *self;
Jack Jansen84fa5ec1995-01-18 14:04:40 +000075 object *args;
76{
Jack Jansen17ba43f1995-01-26 16:22:07 +000077 FSSpec from, *fromp, result;
78 Boolean changed;
79 OSErr err;
Jack Jansen84fa5ec1995-01-18 14:04:40 +000080
Jack Jansen17ba43f1995-01-26 16:22:07 +000081 from.name[0] = 0;
82 if (!newgetargs(args, "|O&", PyMac_GetFSSpec, &from))
Jack Jansen84fa5ec1995-01-18 14:04:40 +000083 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +000084 if (from.name[0] )
85 fromp = &from;
86 else
87 fromp = NULL;
88 err = ResolveAlias(fromp, self->alias, &result, &changed);
89 if ( err ) {
90 PyErr_Mac(ErrorObject, err);
91 return NULL;
92 }
93 return mkvalue("(Oi)", newmfssobject(&result), (int)changed);
Jack Jansen84fa5ec1995-01-18 14:04:40 +000094}
95
96static object *
Jack Jansen17ba43f1995-01-26 16:22:07 +000097mfsa_GetInfo(self, args)
98 mfsaobject *self;
Jack Jansen84fa5ec1995-01-18 14:04:40 +000099 object *args;
100{
Jack Jansen17ba43f1995-01-26 16:22:07 +0000101 Str63 value;
102 int i;
103 OSErr err;
104
105 if (!newgetargs(args, "i", &i))
106 return NULL;
107 err = GetAliasInfo(self->alias, (AliasInfoType)i, value);
108 if ( err ) {
109 PyErr_Mac(ErrorObject, err);
110 return 0;
111 }
112 return newsizedstringobject((char *)&value[1], value[0]);
113}
114
115static object *
116mfsa_Update(self, args)
117 mfsaobject *self;
118 object *args;
119{
120 FSSpec target, fromfile, *fromfilep;
121 OSErr err;
122 Boolean changed;
123
124 fromfile.name[0] = 0;
125 if (!newgetargs(args, "O&|O&", PyMac_GetFSSpec, &target,
126 PyMac_GetFSSpec, &fromfile))
127 return NULL;
128 if ( fromfile.name[0] )
129 fromfilep = &fromfile;
130 else
131 fromfilep = NULL;
132 err = UpdateAlias(fromfilep, &target, self->alias, &changed);
133 if ( err ) {
134 PyErr_Mac(ErrorObject, err);
135 return 0;
136 }
137 return mkvalue("i", (int)changed);
138}
139
140static struct methodlist mfsa_methods[] = {
Guido van Rossumefd97671995-01-26 22:56:16 +0000141 {"Resolve", (method)mfsa_Resolve, 1},
142 {"GetInfo", (method)mfsa_GetInfo, 1},
143 {"Update", (method)mfsa_Update, 1},
Jack Jansen17ba43f1995-01-26 16:22:07 +0000144
145 {NULL, NULL} /* sentinel */
146};
147
148/* ---------- */
149
150static object *
151mfsa_getattr(self, name)
152 mfsaobject *self;
153 char *name;
154{
Jack Jansenc889b761995-02-13 12:00:46 +0000155 if ( strcmp(name, "data") == 0 ) {
156 int size;
157 PyObject *rv;
158
159 size = GetHandleSize((Handle)self->alias);
160 HLock((Handle)self->alias);
161 rv = PyString_FromStringAndSize(*(Handle)self->alias, size);
162 HUnlock((Handle)self->alias);
163 return rv;
164 }
Jack Jansen17ba43f1995-01-26 16:22:07 +0000165 return findmethod(mfsa_methods, (object *)self, name);
166}
167
168mfsaobject *
169newmfsaobject(alias)
170 AliasHandle alias;
171{
172 mfsaobject *self;
173
174 self = NEWOBJ(mfsaobject, &Mfsatype);
175 if (self == NULL)
176 return NULL;
177 self->alias = alias;
178 return self;
179}
180
181
182static void
183mfsa_dealloc(self)
184 mfsaobject *self;
185{
186#if 0
187 if ( self->alias ) {
188 should we do something here?
189 }
190#endif
191
192 DEL(self);
193}
194
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000195statichere typeobject Mfsatype = {
Jack Jansen17ba43f1995-01-26 16:22:07 +0000196 OB_HEAD_INIT(&Typetype)
197 0, /*ob_size*/
198 "Alias", /*tp_name*/
199 sizeof(mfsaobject), /*tp_basicsize*/
200 0, /*tp_itemsize*/
201 /* methods */
202 (destructor)mfsa_dealloc, /*tp_dealloc*/
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000203 (printfunc)0, /*tp_print*/
Jack Jansen17ba43f1995-01-26 16:22:07 +0000204 (getattrfunc)mfsa_getattr, /*tp_getattr*/
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000205 (setattrfunc)0, /*tp_setattr*/
206 (cmpfunc)0, /*tp_compare*/
207 (reprfunc)0, /*tp_repr*/
208 0, /*tp_as_number*/
209 0, /*tp_as_sequence*/
210 0, /*tp_as_mapping*/
211 (hashfunc)0, /*tp_hash*/
Jack Jansen17ba43f1995-01-26 16:22:07 +0000212};
213
214/* End of code for Alias objects */
215/* -------------------------------------------------------- */
216
217/*
218** Helper routine for other modules: return an FSSpec * if the
219** object is a python fsspec object, else NULL
220*/
221FSSpec *
222mfs_GetFSSpecFSSpec(self)
223 object *self;
224{
225 if ( is_mfssobject(self) )
226 return &((mfssobject *)self)->fsspec;
227 return NULL;
228}
229
230static object *
231mfss_as_pathname(self, args)
232 mfssobject *self;
233 object *args;
234{
235 char strbuf[257];
236 OSErr err;
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000237
238 if (!newgetargs(args, ""))
239 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000240 err = nfullpath(&self->fsspec, strbuf);
241 if ( err ) {
242 PyErr_Mac(ErrorObject, err);
243 return NULL;
244 }
245 return newstringobject(strbuf);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000246}
247
248static object *
Jack Jansen17ba43f1995-01-26 16:22:07 +0000249mfss_as_tuple(self, args)
250 mfssobject *self;
251 object *args;
252{
253 if (!newgetargs(args, ""))
254 return NULL;
255 return Py_BuildValue("(iis#)", self->fsspec.vRefNum, self->fsspec.parID,
256 &self->fsspec.name[1], self->fsspec.name[0]);
257}
258
259static object *
260mfss_NewAlias(self, args)
261 mfssobject *self;
262 object *args;
263{
264 FSSpec src, *srcp;
265 OSErr err;
266 AliasHandle alias;
267
268 src.name[0] = 0;
269 if (!newgetargs(args, "|O&", PyMac_GetFSSpec, &src))
270 return NULL;
271 if ( src.name[0] )
272 srcp = &src;
273 else
274 srcp = NULL;
275 err = NewAlias(srcp, &self->fsspec, &alias);
276 if ( err ) {
277 PyErr_Mac(ErrorObject, err);
278 return NULL;
279 }
280
281 return (object *)newmfsaobject(alias);
282}
283
284static object *
285mfss_NewAliasMinimal(self, args)
286 mfssobject *self;
287 object *args;
288{
289 OSErr err;
290 AliasHandle alias;
291
292 if (!newgetargs(args, ""))
293 return NULL;
294 err = NewAliasMinimal(&self->fsspec, &alias);
295 if ( err ) {
296 PyErr_Mac(ErrorObject, err);
297 return NULL;
298 }
299 return (object *)newmfsaobject(alias);
300}
301
Jack Jansen8828fcf1995-02-02 14:23:52 +0000302/* XXXX These routines should be replaced with a complete interface to *FInfo */
303static object *
304mfss_GetCreatorType(self, args)
305 mfssobject *self;
306 object *args;
307{
308 OSErr err;
309 FInfo info;
310
311 if (!newgetargs(args, ""))
312 return NULL;
313 err = FSpGetFInfo(&self->fsspec, &info);
314 if ( err ) {
315 PyErr_Mac(ErrorObject, err);
316 return NULL;
317 }
318 return Py_BuildValue("(O&O&)",
319 PyMac_BuildOSType, info.fdCreator, PyMac_BuildOSType, info.fdType);
320}
321
322static object *
323mfss_SetCreatorType(self, args)
324 mfssobject *self;
325 object *args;
326{
327 OSErr err;
328 OSType creator, type;
329 FInfo info;
330
331 if (!newgetargs(args, "O&O&", PyMac_GetOSType, &creator, PyMac_GetOSType, &type))
332 return NULL;
333 err = FSpGetFInfo(&self->fsspec, &info);
334 if ( err ) {
335 PyErr_Mac(ErrorObject, err);
336 return NULL;
337 }
338 info.fdType = type;
339 info.fdCreator = creator;
340 err = FSpSetFInfo(&self->fsspec, &info);
341 if ( err ) {
342 PyErr_Mac(ErrorObject, err);
343 return NULL;
344 }
345 INCREF(None);
346 return None;
347}
348
Jack Jansen17ba43f1995-01-26 16:22:07 +0000349static struct methodlist mfss_methods[] = {
Guido van Rossumefd97671995-01-26 22:56:16 +0000350 {"as_pathname", (method)mfss_as_pathname, 1},
351 {"as_tuple", (method)mfss_as_tuple, 1},
352 {"NewAlias", (method)mfss_NewAlias, 1},
353 {"NewAliasMinimal", (method)mfss_NewAliasMinimal, 1},
Jack Jansen8828fcf1995-02-02 14:23:52 +0000354 {"GetCreatorType", (method)mfss_GetCreatorType, 1},
355 {"SetCreatorType", (method)mfss_SetCreatorType, 1},
Jack Jansen17ba43f1995-01-26 16:22:07 +0000356
357 {NULL, NULL} /* sentinel */
358};
359
360/* ---------- */
361
362static object *
363mfss_getattr(self, name)
364 mfssobject *self;
365 char *name;
366{
Jack Jansenc889b761995-02-13 12:00:46 +0000367 if ( strcmp(name, "data") == 0)
368 return PyString_FromStringAndSize((char *)&self->fsspec, sizeof(FSSpec));
Jack Jansen17ba43f1995-01-26 16:22:07 +0000369 return findmethod(mfss_methods, (object *)self, name);
370}
371
372mfssobject *
373newmfssobject(fss)
374 FSSpec *fss;
375{
376 mfssobject *self;
377
378 self = NEWOBJ(mfssobject, &Mfsstype);
379 if (self == NULL)
380 return NULL;
381 self->fsspec = *fss;
382 return self;
383}
384
385static void
386mfss_dealloc(self)
387 mfssobject *self;
388{
389 DEL(self);
390}
391
392static object *
393mfss_repr(self)
394 mfssobject *self;
395{
396 char buf[512];
397
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000398 sprintf(buf, "FSSpec((%d, %d, '%.*s'))",
399 self->fsspec.vRefNum,
400 self->fsspec.parID,
401 self->fsspec.name[0], self->fsspec.name+1);
Jack Jansen17ba43f1995-01-26 16:22:07 +0000402 return newstringobject(buf);
403}
404
405static int
406mfss_compare(v, w)
407 mfssobject *v, *w;
408{
409 int minlen;
410 int res;
411
412 if ( v->fsspec.vRefNum < w->fsspec.vRefNum ) return -1;
413 if ( v->fsspec.vRefNum > w->fsspec.vRefNum ) return 1;
414 if ( v->fsspec.parID < w->fsspec.parID ) return -1;
415 if ( v->fsspec.parID > w->fsspec.parID ) return 1;
416 minlen = v->fsspec.name[0];
417 if ( w->fsspec.name[0] < minlen ) minlen = w->fsspec.name[0];
418 res = strncmp((char *)v->fsspec.name+1, (char *)w->fsspec.name+1, minlen);
419 if ( res ) return res;
420 if ( v->fsspec.name[0] < w->fsspec.name[0] ) return -1;
421 if ( v->fsspec.name[0] > w->fsspec.name[0] ) return 1;
422 return res;
423}
424
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000425statichere typeobject Mfsstype = {
Jack Jansen17ba43f1995-01-26 16:22:07 +0000426 OB_HEAD_INIT(&Typetype)
427 0, /*ob_size*/
428 "FSSpec", /*tp_name*/
429 sizeof(mfssobject), /*tp_basicsize*/
430 0, /*tp_itemsize*/
431 /* methods */
432 (destructor)mfss_dealloc, /*tp_dealloc*/
433 (printfunc)0, /*tp_print*/
434 (getattrfunc)mfss_getattr, /*tp_getattr*/
435 (setattrfunc)0, /*tp_setattr*/
436 (cmpfunc)mfss_compare, /*tp_compare*/
437 (reprfunc)mfss_repr, /*tp_repr*/
438 0, /*tp_as_number*/
439 0, /*tp_as_sequence*/
440 0, /*tp_as_mapping*/
441 (hashfunc)0, /*tp_hash*/
442};
443
444/* End of code for FSSpec objects */
445/* -------------------------------------------------------- */
446
447static object *
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000448mfs_ResolveAliasFile(self, args)
449 object *self; /* Not used */
450 object *args;
451{
Jack Jansen17ba43f1995-01-26 16:22:07 +0000452 FSSpec fss;
453 Boolean chain = 1, isfolder, wasaliased;
454 OSErr err;
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000455
Jack Jansen17ba43f1995-01-26 16:22:07 +0000456 if (!newgetargs(args, "O&|i", PyMac_GetFSSpec, &fss, &chain))
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000457 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000458 err = ResolveAliasFile(&fss, chain, &isfolder, &wasaliased);
459 if ( err ) {
460 PyErr_Mac(ErrorObject, err);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000461 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000462 }
463 return mkvalue("Oii", newmfssobject(&fss), (int)isfolder, (int)wasaliased);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000464}
465
466static object *
467mfs_StandardGetFile(self, args)
468 object *self; /* Not used */
469 object *args;
470{
Guido van Rossumb2f524a1995-01-30 08:56:06 +0000471 SFTypeList list;
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000472 short numtypes;
473 StandardFileReply reply;
474
475 list[0] = list[1] = list[2] = list[3] = 0;
476 numtypes = 0;
Guido van Rossumb2f524a1995-01-30 08:56:06 +0000477 if (!newgetargs(args, "|O&O&O&O&", PyMac_GetOSType, &list[0],
Jack Jansen17ba43f1995-01-26 16:22:07 +0000478 PyMac_GetOSType, &list[1], PyMac_GetOSType, &list[2],
479 PyMac_GetOSType, &list[3]) )
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000480 return NULL;
Guido van Rossumb2f524a1995-01-30 08:56:06 +0000481 while ( numtypes < 4 && list[numtypes] ) {
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000482 numtypes++;
483 }
Jack Jansenc2632861995-06-03 21:15:50 +0000484 if ( numtypes == 0 )
485 numtypes = -1;
Guido van Rossumb2f524a1995-01-30 08:56:06 +0000486 StandardGetFile((FileFilterUPP)0, numtypes, list, &reply);
Jack Jansen17ba43f1995-01-26 16:22:07 +0000487 return mkvalue("(Oi)", newmfssobject(&reply.sfFile), reply.sfGood);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000488}
489
490static object *
Jack Jansen17ba43f1995-01-26 16:22:07 +0000491mfs_StandardPutFile(self, args)
492 object *self; /* Not used */
493 object *args;
494{
495 Str255 prompt, dft;
496 StandardFileReply reply;
497
498 dft[0] = 0;
499 if (!newgetargs(args, "O&|O&", PyMac_GetStr255, &prompt, PyMac_GetStr255, &dft) )
500 return NULL;
501 StandardPutFile(prompt, dft, &reply);
502 return mkvalue("(Oi)",newmfssobject(&reply.sfFile), reply.sfGood);
503}
504
505static object *
506mfs_FSSpec(self, args)
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000507 object *self; /* Not used */
508 object *args;
509{
510 FSSpec fss;
511
Guido van Rossum9aa3d131995-01-21 13:46:04 +0000512 if (!newgetargs(args, "O&", PyMac_GetFSSpec, &fss))
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000513 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000514 return (object *)newmfssobject(&fss);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000515}
516
Jack Jansenc889b761995-02-13 12:00:46 +0000517static object *
518mfs_RawFSSpec(self, args)
519 object *self; /* Not used */
520 object *args;
521{
522 FSSpec *fssp;
523 int size;
524
525 if (!newgetargs(args, "s#", &fssp, &size))
526 return NULL;
527 if ( size != sizeof(FSSpec) ) {
528 PyErr_SetString(PyExc_TypeError, "Incorrect size for FSSpec record");
529 return NULL;
530 }
531 return (object *)newmfssobject(fssp);
532}
533
534static object *
535mfs_RawAlias(self, args)
536 object *self; /* Not used */
537 object *args;
538{
539 char *dataptr;
540 Handle h;
541 int size;
542
543 if (!newgetargs(args, "s#", &dataptr, &size))
544 return NULL;
545 h = NewHandle(size);
546 if ( h == NULL ) {
547 PyErr_NoMemory();
548 return NULL;
549 }
550 HLock(h);
551 memcpy((char *)*h, dataptr, size);
552 HUnlock(h);
553 return (object *)newmfsaobject((AliasHandle)h);
554}
555
Jack Jansen81f51c71995-02-20 15:45:25 +0000556static object *
557mfs_GetDirectory(self, args)
558 object *self; /* Not used */
559 object *args;
560{
561 FSSpec fsdir;
562 int ok;
563
564 if (!newgetargs(args, "") )
565 return NULL;
566
567 ok = PyMac_GetDirectory(&fsdir);
568 return mkvalue("(Oi)", newmfssobject(&fsdir), ok);
569}
570
Jack Jansen2c673621995-06-18 20:05:14 +0000571static object *
572mfs_FindFolder(self, args)
573 object *self; /* Not used */
574 object *args;
575{
576 OSErr err;
577 short where;
578 OSType which;
579 int create;
580 short refnum;
581 long dirid;
582
583 if (!newgetargs(args, "hO&i", &where, PyMac_GetOSType, &which, &create) )
584 return NULL;
585 err = FindFolder(where, which, (Boolean)create, &refnum, &dirid);
586 if ( err ) {
587 PyErr_Mac(ErrorObject, err);
588 return NULL;
589 }
590 return mkvalue("(ii)", refnum, dirid);
591}
592
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000593/* List of methods defined in the module */
594
595static struct methodlist mfs_methods[] = {
Jack Jansen17ba43f1995-01-26 16:22:07 +0000596 {"ResolveAliasFile", mfs_ResolveAliasFile, 1},
597 {"StandardGetFile", mfs_StandardGetFile, 1},
598 {"StandardPutFile", mfs_StandardPutFile, 1},
Jack Jansen81f51c71995-02-20 15:45:25 +0000599 {"GetDirectory", mfs_GetDirectory, 1},
Jack Jansen17ba43f1995-01-26 16:22:07 +0000600 {"FSSpec", mfs_FSSpec, 1},
Jack Jansenc889b761995-02-13 12:00:46 +0000601 {"RawFSSpec", mfs_RawFSSpec, 1},
602 {"RawAlias", mfs_RawAlias, 1},
Jack Jansen2c673621995-06-18 20:05:14 +0000603 {"FindFolder", mfs_FindFolder, 1},
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000604
605 {NULL, NULL} /* sentinel */
606};
607
608
609/* Initialization function for the module (*must* be called initmacfs) */
610
611void
612initmacfs()
613{
614 object *m, *d;
615
616 /* Create the module and add the functions */
617 m = initmodule("macfs", mfs_methods);
618
619 /* Add some symbolic constants to the module */
620 d = getmoduledict(m);
621 ErrorObject = newstringobject("macfs.error");
622 dictinsert(d, "error", ErrorObject);
623
624 /* XXXX Add constants here */
625
626 /* Check for errors */
627 if (err_occurred())
628 fatal("can't initialize module macfs");
629}