1 
2 //metadoc Message copyright Steve Dekorte 2002
3 //metadoc Message license BSD revised
4 
5 #ifndef IOMESSAGE_DEFINED
6 #define IOMESSAGE_DEFINED 1
7 
8 #include "IoVMApi.h"
9 #include "Common.h"
10 #include "List.h"
11 #include "UArray.h"
12 #include "IoTag.h"
13 #include "IoObject_struct.h"
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 #define MESSAGE_STOP_STATUS_NORMAL   0
20 #define MESSAGE_STOP_STATUS_BREAK    1
21 #define MESSAGE_STOP_STATUS_CONTINUE 2
22 #define MESSAGE_STOP_STATUS_RETURN   4
23 #define MESSAGE_STOP_STATUS_EOL      8
24 
25 #define ISMESSAGE(self) IoObject_hasCloneFunc_(self, (IoTagCloneFunc *)IoMessage_rawClone)
26 
27 #if !defined(IoSymbol_DEFINED)
28 	#define IoSymbol_DEFINED
29 	typedef IoObject IoSymbol;
30 #endif
31 
32 typedef IoObject IoMessage;
33 
34 #define IOMESSAGE_HASPREV
35 
36 typedef struct
37 {
38 	IoSymbol *name;
39 	List *args;
40 	#ifdef IOMESSAGE_HASPREV
41 	IoMessage *previous; // unused for now
42 	#endif
43 	IoMessage *next;
44 	IoObject *cachedResult;
45 
46 	// debugging info
47 	//int charNumber;
48 	int lineNumber;
49 	IoSymbol *label;
50 } IoMessageData;
51 
52 #define IOMESSAGEDATA(self) ((IoMessageData *)IoObject_dataPointer(self))
53 
54 // basics
55 
56 IOVM_API IoMessage *IoMessage_proto(void *state);
57 IOVM_API IoMessage *IoMessage_rawClone(IoMessage *m);
58 IOVM_API IoMessage *IoMessage_new(void *state);
59 IOVM_API void IoMessage_copy_(IoMessage *self, IoMessage *other);
60 IOVM_API IoMessage *IoMessage_deepCopyOf_(IoMessage *m);
61 IOVM_API IoMessage *IoMessage_newWithName_(void *state, IoSymbol *symbol);
62 IOVM_API IoMessage *IoMessage_newWithName_label_(void *state, IoSymbol *symbol, IoSymbol *label);
63 IOVM_API IoMessage *IoMessage_newWithName_returnsValue_(void *state, IoSymbol *symbol, IoObject *v);
64 IOVM_API IoMessage *IoMessage_newWithName_andCachedArg_(void *state, IoSymbol *symbol, IoObject *v);
65 
66 IOVM_API void IoMessage_mark(IoMessage *self);
67 IOVM_API void IoMessage_free(IoMessage *self);
68 
69 IOVM_API IoSymbol *IoMessage_rawLabel(IoMessage *self);
70 IOVM_API int IoMessage_rawLineNumber(IoMessage *self);
71 IOVM_API int IoMessage_rawCharNumber(IoMessage *self);
72 IOVM_API void IoMessage_label_(IoMessage *self, IoSymbol *ioSymbol); // sets label for children too
73 IOVM_API void IoMessage_rawSetLineNumber_(IoMessage *self, int n);
74 IOVM_API void IoMessage_rawSetCharNumber_(IoMessage *self, int n);
75 IOVM_API void IoMessage_rawCopySourceLocation(IoMessage *self, IoMessage *other);
76 IOVM_API List *IoMessage_rawArgList(IoMessage *self);
77 IOVM_API unsigned char IoMessage_needsEvaluation(IoMessage *self);
78 
79 IOVM_API void IoMessage_addCachedArg_(IoMessage *self, IoObject *v);
80 IOVM_API void IoMessage_setCachedArg_to_(IoMessage *self, int n, IoObject *v);
81 IOVM_API void IoMessage_setCachedArg_toInt_(IoMessage *self, int n, int anInt);
82 IOVM_API void IoMessage_rawSetCachedResult_(IoMessage *self, IoObject *v);
83 IOVM_API void IoMessage_rawSetName_(IoMessage *self, IoObject *v);
84 IOVM_API void IoMessage_rawSetLabel_(IoMessage *self, IoObject *v);
85 
86 
87 IOVM_API IO_METHOD(IoMessage, lineNumber);
88 IOVM_API IO_METHOD(IoMessage, characterNumber);
89 IOVM_API IO_METHOD(IoMessage, label);
90 
91 // perform
92 
93 IOVM_API IO_METHOD(IoMessage, doInContext);
94 IOVM_API IoObject *IoMessage_locals_performOn_(IoMessage *self, IoObject *locals, IoObject *target);
95 
96 // args
97 
98 //IOVM_API IoObject *IoMessage_locals_valueArgAt_(IoMessage *self, IoObject *locals, int n);
99 IOVM_API IoObject *IoMessage_locals_valueOrEvalArgAt_(IoMessage *self, IoObject *locals, int n);
100 IOVM_API void IoMessage_assertArgCount_receiver_(IoMessage *self, int n, IoObject *receiver);
101 IOVM_API int IoMessage_argCount(IoMessage *self);
102 
103 IOVM_API void IoMessage_locals_numberArgAt_errorForType_(
104   IoMessage *self,
105   IoObject *locals,
106   int n,
107   const char *typeName);
108 
109 IOVM_API IoObject *IoMessage_locals_numberArgAt_(IoMessage *self, IoObject *locals, int n);
110 IOVM_API int IoMessage_locals_intArgAt_(IoMessage *self, IoObject *locals, int n);
111 IOVM_API int IoMessage_locals_boolArgAt_(IoMessage *self, IoObject *locals, int n);
112 IOVM_API long IoMessage_locals_longArgAt_(IoMessage *self, IoObject *locals, int n);
113 IOVM_API size_t IoMessage_locals_sizetArgAt_(IoMessage *self, IoObject *locals, int n);
114 IOVM_API double IoMessage_locals_doubleArgAt_(IoMessage *self, IoObject *locals, int n);
115 IOVM_API float IoMessage_locals_floatArgAt_(IoMessage *self, IoObject *locals, int n);
116 
117 IOVM_API IoObject *IoMessage_locals_symbolArgAt_(IoMessage *self, IoObject *locals, int n);
118 IOVM_API IoObject *IoMessage_locals_seqArgAt_(IoMessage *self, IoObject *locals, int n);
119 IOVM_API IoObject *IoMessage_locals_mutableSeqArgAt_(IoMessage *self, IoObject *locals, int n);
120 IOVM_API char *IoMessage_locals_cStringArgAt_(IoMessage *self, IoObject *locals, int n);
121 IOVM_API IoObject *IoMessage_locals_valueAsStringArgAt_(IoMessage *self, IoObject *locals, int n);
122 
123 IOVM_API IoObject *IoMessage_locals_blockArgAt_(IoMessage *self, IoObject *locals, int n);
124 IOVM_API IoObject *IoMessage_locals_dateArgAt_(IoMessage *self, IoObject *locals, int n);
125 IOVM_API IoObject *IoMessage_locals_mapArgAt_(IoMessage *self, IoObject *locals, int n);
126 IOVM_API IoObject *IoMessage_locals_messageArgAt_(IoMessage *self, IoObject *locals, int n);
127 IOVM_API IoObject *IoMessage_locals_listArgAt_(IoMessage *self, IoObject *locals, int n);
128 
129 // printing
130 
131 IOVM_API void IoMessage_print(IoMessage *self);
132 IOVM_API void IoMessage_printWithReturn(IoMessage *self);
133 IOVM_API UArray *IoMessage_description(IoMessage *self);
134 IOVM_API UArray *IoMessage_descriptionJustSelfAndArgs(IoMessage *self); /* caller must io_free returned */
135 IOVM_API void IoMessage_appendDescriptionTo_follow_(IoMessage *self, UArray *ba, int follow);
136 IOVM_API IO_METHOD(IoMessage, asString);
137 
138 // primitive methods
139 
140 IOVM_API IO_METHOD(IoMessage, clone);
141 IOVM_API IO_METHOD(IoMessage, protoName);
142 IOVM_API IO_METHOD(IoMessage, protoSetName);
143 IOVM_API IO_METHOD(IoMessage, descriptionString);
144 
145 // next
146 
147 IOVM_API IO_METHOD(IoMessage, next);
148 IOVM_API IoMessage *IoMessage_rawNext(IoMessage *self);
149 
150 IOVM_API IO_METHOD(IoMessage, setNext);
151 IOVM_API void IoMessage_rawSetNext_(IoMessage *self, IoMessage *m);
152 
153 IOVM_API IO_METHOD(IoMessage, isEOL);
154 IOVM_API int IoMessage_rawIsEOL(IoMessage *self);
155 
156 IOVM_API IO_METHOD(IoMessage, nextIgnoreEOLs);
157 IOVM_API IoMessage *IoMessage_rawNextIgnoreEOLs(IoMessage *self);
158 IOVM_API IO_METHOD(IoMessage, last);
159 IOVM_API IoMessage *IoMessage_rawLast(IoMessage *self);
160 IOVM_API IO_METHOD(IoMessage, lastBeforeEOL);
161 IOVM_API IoMessage *IoMessage_rawLastBeforeEOL(IoMessage *self);
162 
163 // previous
164 
165 IOVM_API IO_METHOD(IoMessage, previous);
166 IOVM_API IoMessage *IoMessage_rawPrevious(IoMessage *self);
167 
168 IOVM_API IO_METHOD(IoMessage, setPrevious);
169 IOVM_API void IoMessage_rawSetPrevious(IoMessage *self, IoMessage *m);
170 
171 IOVM_API IO_METHOD(IoMessage, argAt);
172 IOVM_API IO_METHOD(IoMessage, arguments);
173 IOVM_API IO_METHOD(IoMessage, setArguments);
174 IOVM_API IO_METHOD(IoMessage, appendArg);
175 IOVM_API IO_METHOD(IoMessage, appendCachedArg);
176 IOVM_API IO_METHOD(IoMessage, argCount_);
177 IOVM_API IO_METHOD(IoMessage, cachedResult);
178 IOVM_API IO_METHOD(IoMessage, setCachedResult);
179 IOVM_API IO_METHOD(IoMessage, removeCachedResult);
180 IOVM_API IO_METHOD(IoMessage, hasCachedResult);
181 
182 IOVM_API IO_METHOD(IoMessage, setLineNumber);
183 IOVM_API IO_METHOD(IoMessage, setCharacterNumber);
184 IOVM_API IO_METHOD(IoMessage, setLabel);
185 
186 IOVM_API IO_METHOD(IoMessage, fromString);
187 IOVM_API IO_METHOD(IoMessage, argsEvaluatedIn);
188 IOVM_API IO_METHOD(IoMessage, evaluatedArgs);
189 IOVM_API IO_METHOD(IoMessage, profilerTime);
190 
191 IOVM_API void IoMessage_foreachArgs(IoMessage *self,
192 	IoObject *object,
193 	IoSymbol **indexSlotName,
194 	IoSymbol **valueSlotName,
195 	IoMessage **doMessage);
196 
197 IOVM_API IoMessage *IoMessage_asMessageWithEvaluatedArgs(IoMessage *self, IoObject *locals, IoMessage *m);
198 
199 //  ------------------------------
200 
201 #include "IoMessage_inline.h"
202 #include "IoMessage_parser.h"
203 
204 //IoSymbol *IoMessage_name(IoMessage *self);
205 
206 #define IoMessage_name(self)  (((IoMessageData *)IoObject_dataPointer(self))->name)
207 #define IoMessage_rawCachedResult(self) (((IoMessageData *)IoObject_dataPointer(self))->cachedResult)
208 
209 IOVM_API void IoMessage_addArg_(IoMessage *self, IoMessage *m);
210 IOVM_API IoMessage *IoMessage_rawArgAt_(IoMessage *self, int n);
211 IOVM_API List *IoMessage_rawArgs(IoMessage *self);
212 
213 IOVM_API UArray *IoMessage_asMinimalStackEntryDescription(IoMessage *self);
214 
215 #ifdef __cplusplus
216 }
217 #endif
218 #endif
219