blob: 95dc094421be17351df17860ce85e0036bf02857 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Module object implementation */
2
3#include <stdio.h>
4
5#include "PROTO.h"
6#include "object.h"
7#include "stringobject.h"
8#include "dictobject.h"
9#include "moduleobject.h"
10#include "objimpl.h"
11
12typedef struct {
13 OB_HEAD
14 object *md_name;
15 object *md_dict;
16} moduleobject;
17
18object *
19newmoduleobject(name)
20 char *name;
21{
22 moduleobject *m = NEWOBJ(moduleobject, &Moduletype);
23 if (m == NULL)
24 return NULL;
25 m->md_name = newstringobject(name);
26 m->md_dict = newdictobject();
27 if (m->md_name == NULL || m->md_dict == NULL) {
28 DECREF(m);
29 return NULL;
30 }
31 return (object *)m;
32}
33
34object *
35getmoduledict(m)
36 object *m;
37{
38 if (!is_moduleobject(m)) {
39 errno = EBADF;
40 return NULL;
41 }
42 return ((moduleobject *)m) -> md_dict;
43}
44
45int
46setmoduledict(m, v)
47 object *m;
48 object *v;
49{
50 if (!is_moduleobject(m))
51 return errno = EBADF;
52 if (!is_dictobject(v))
53 return errno = EINVAL;
54 DECREF(((moduleobject *)m) -> md_dict);
55 INCREF(v);
56 ((moduleobject *)m) -> md_dict = v;
57 return 0;
58}
59
60/* Methods */
61
62static void
63moduledealloc(m)
64 moduleobject *m;
65{
66 if (m->md_name != NULL)
67 DECREF(m->md_name);
68 if (m->md_dict != NULL)
69 DECREF(m->md_dict);
70 free((char *)m);
71}
72
73static void
74moduleprint(m, fp, flags)
75 moduleobject *m;
76 FILE *fp;
77 int flags;
78{
79 fprintf(fp, "<module %s>", getstringvalue(m->md_name));
80}
81
82static object *
83modulerepr(m)
84 moduleobject *m;
85{
86 char buf[100];
87 sprintf(buf, "<module %.80s>", getstringvalue(m->md_name));
88 return newstringobject(buf);
89}
90
91static object *
92modulegetattr(m, name)
93 moduleobject *m;
94 char *name;
95{
96 object *res = dictlookup(m->md_dict, name);
97 if (res == NULL) {
98 if (errno == ENOENT)
99 errno = ESRCH;
100 }
101 else
102 INCREF(res);
103 return res;
104}
105
106static int
107modulesetattr(m, name, v)
108 moduleobject *m;
109 char *name;
110 object *v;
111{
112 if (v == NULL)
113 return dictremove(m->md_dict, name);
114 else
115 return dictinsert(m->md_dict, name, v);
116}
117
118typeobject Moduletype = {
119 OB_HEAD_INIT(&Typetype)
120 0, /*ob_size*/
121 "module", /*tp_name*/
122 sizeof(moduleobject), /*tp_size*/
123 0, /*tp_itemsize*/
124 moduledealloc, /*tp_dealloc*/
125 moduleprint, /*tp_print*/
126 modulegetattr, /*tp_getattr*/
127 modulesetattr, /*tp_setattr*/
128 0, /*tp_compare*/
129 modulerepr, /*tp_repr*/
130};