1 #ifndef mujs_h
2 #define mujs_h
3 
4 #include <setjmp.h> /* required for setjmp in fz_try macro */
5 
6 #ifdef __cplusplus
7 extern "C" {
8 #endif
9 
10 /* noreturn is a GCC extension */
11 #ifdef __GNUC__
12 #define JS_NORETURN __attribute__((noreturn))
13 #else
14 #ifdef _MSC_VER
15 #define JS_NORETURN __declspec(noreturn)
16 #else
17 #define JS_NORETURN
18 #endif
19 #endif
20 
21 /* GCC can do type checking of printf strings */
22 #ifdef __printflike
23 #define JS_PRINTFLIKE __printflike
24 #else
25 #if __GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ >= 7
26 #define JS_PRINTFLIKE(fmtarg, firstvararg) \
27 	__attribute__((__format__ (__printf__, fmtarg, firstvararg)))
28 #else
29 #define JS_PRINTFLIKE(fmtarg, firstvararg)
30 #endif
31 #endif
32 
33 typedef struct js_State js_State;
34 
35 typedef void *(*js_Alloc)(void *memctx, void *ptr, int size);
36 typedef void (*js_Panic)(js_State *J);
37 typedef void (*js_CFunction)(js_State *J);
38 typedef void (*js_Finalize)(js_State *J, void *p);
39 typedef int (*js_HasProperty)(js_State *J, void *p, const char *name);
40 typedef int (*js_Put)(js_State *J, void *p, const char *name);
41 typedef int (*js_Delete)(js_State *J, void *p, const char *name);
42 typedef void (*js_Report)(js_State *J, const char *message);
43 
44 /* Basic functions */
45 js_State *js_newstate(js_Alloc alloc, void *actx, int flags);
46 void js_setcontext(js_State *J, void *uctx);
47 void *js_getcontext(js_State *J);
48 void js_setreport(js_State *J, js_Report report);
49 js_Panic js_atpanic(js_State *J, js_Panic panic);
50 void js_freestate(js_State *J);
51 void js_gc(js_State *J, int report);
52 
53 int js_dostring(js_State *J, const char *source);
54 int js_dofile(js_State *J, const char *filename);
55 int js_ploadstring(js_State *J, const char *filename, const char *source);
56 int js_ploadfile(js_State *J, const char *filename);
57 int js_pcall(js_State *J, int n);
58 int js_pconstruct(js_State *J, int n);
59 
60 /* Exception handling */
61 
62 void *js_savetry(js_State *J); /* returns a jmp_buf */
63 
64 #define js_try(J) \
65 	setjmp(js_savetry(J))
66 
67 void js_endtry(js_State *J);
68 
69 /* State constructor flags */
70 enum {
71 	JS_STRICT = 1,
72 };
73 
74 /* RegExp flags */
75 enum {
76 	JS_REGEXP_G = 1,
77 	JS_REGEXP_I = 2,
78 	JS_REGEXP_M = 4,
79 };
80 
81 /* Property attribute flags */
82 enum {
83 	JS_READONLY = 1,
84 	JS_DONTENUM = 2,
85 	JS_DONTCONF = 4,
86 };
87 
88 void js_report(js_State *J, const char *message);
89 
90 void js_newerror(js_State *J, const char *message);
91 void js_newevalerror(js_State *J, const char *message);
92 void js_newrangeerror(js_State *J, const char *message);
93 void js_newreferenceerror(js_State *J, const char *message);
94 void js_newsyntaxerror(js_State *J, const char *message);
95 void js_newtypeerror(js_State *J, const char *message);
96 void js_newurierror(js_State *J, const char *message);
97 
98 JS_NORETURN void js_error(js_State *J, const char *fmt, ...) JS_PRINTFLIKE(2,3);
99 JS_NORETURN void js_evalerror(js_State *J, const char *fmt, ...) JS_PRINTFLIKE(2,3);
100 JS_NORETURN void js_rangeerror(js_State *J, const char *fmt, ...) JS_PRINTFLIKE(2,3);
101 JS_NORETURN void js_referenceerror(js_State *J, const char *fmt, ...) JS_PRINTFLIKE(2,3);
102 JS_NORETURN void js_syntaxerror(js_State *J, const char *fmt, ...) JS_PRINTFLIKE(2,3);
103 JS_NORETURN void js_typeerror(js_State *J, const char *fmt, ...) JS_PRINTFLIKE(2,3);
104 JS_NORETURN void js_urierror(js_State *J, const char *fmt, ...) JS_PRINTFLIKE(2,3);
105 JS_NORETURN void js_throw(js_State *J);
106 
107 void js_loadstring(js_State *J, const char *filename, const char *source);
108 void js_loadfile(js_State *J, const char *filename);
109 
110 void js_eval(js_State *J);
111 void js_call(js_State *J, int n);
112 void js_construct(js_State *J, int n);
113 
114 const char *js_ref(js_State *J);
115 void js_unref(js_State *J, const char *ref);
116 
117 void js_getregistry(js_State *J, const char *name);
118 void js_setregistry(js_State *J, const char *name);
119 void js_delregistry(js_State *J, const char *name);
120 
121 void js_getglobal(js_State *J, const char *name);
122 void js_setglobal(js_State *J, const char *name);
123 void js_defglobal(js_State *J, const char *name, int atts);
124 
125 int js_hasproperty(js_State *J, int idx, const char *name);
126 void js_getproperty(js_State *J, int idx, const char *name);
127 void js_setproperty(js_State *J, int idx, const char *name);
128 void js_defproperty(js_State *J, int idx, const char *name, int atts);
129 void js_delproperty(js_State *J, int idx, const char *name);
130 void js_defaccessor(js_State *J, int idx, const char *name, int atts);
131 
132 int js_getlength(js_State *J, int idx);
133 void js_setlength(js_State *J, int idx, int len);
134 int js_hasindex(js_State *J, int idx, int i);
135 void js_getindex(js_State *J, int idx, int i);
136 void js_setindex(js_State *J, int idx, int i);
137 void js_delindex(js_State *J, int idx, int i);
138 
139 void js_currentfunction(js_State *J);
140 void js_pushglobal(js_State *J);
141 void js_pushundefined(js_State *J);
142 void js_pushnull(js_State *J);
143 void js_pushboolean(js_State *J, int v);
144 void js_pushnumber(js_State *J, double v);
145 void js_pushstring(js_State *J, const char *v);
146 void js_pushlstring(js_State *J, const char *v, int n);
147 void js_pushliteral(js_State *J, const char *v);
148 
149 void js_newobjectx(js_State *J);
150 void js_newobject(js_State *J);
151 void js_newarray(js_State *J);
152 void js_newboolean(js_State *J, int v);
153 void js_newnumber(js_State *J, double v);
154 void js_newstring(js_State *J, const char *v);
155 void js_newcfunction(js_State *J, js_CFunction fun, const char *name, int length);
156 void js_newcconstructor(js_State *J, js_CFunction fun, js_CFunction con, const char *name, int length);
157 void js_newuserdata(js_State *J, const char *tag, void *data, js_Finalize finalize);
158 void js_newuserdatax(js_State *J, const char *tag, void *data, js_HasProperty has, js_Put put, js_Delete del, js_Finalize finalize);
159 void js_newregexp(js_State *J, const char *pattern, int flags);
160 
161 void js_pushiterator(js_State *J, int idx, int own);
162 const char *js_nextiterator(js_State *J, int idx);
163 
164 int js_isdefined(js_State *J, int idx);
165 int js_isundefined(js_State *J, int idx);
166 int js_isnull(js_State *J, int idx);
167 int js_isboolean(js_State *J, int idx);
168 int js_isnumber(js_State *J, int idx);
169 int js_isstring(js_State *J, int idx);
170 int js_isprimitive(js_State *J, int idx);
171 int js_isobject(js_State *J, int idx);
172 int js_isarray(js_State *J, int idx);
173 int js_isregexp(js_State *J, int idx);
174 int js_iscoercible(js_State *J, int idx);
175 int js_iscallable(js_State *J, int idx);
176 int js_isuserdata(js_State *J, int idx, const char *tag);
177 
178 int js_toboolean(js_State *J, int idx);
179 double js_tonumber(js_State *J, int idx);
180 const char *js_tostring(js_State *J, int idx);
181 void *js_touserdata(js_State *J, int idx, const char *tag);
182 
183 const char *js_trystring(js_State *J, int idx, const char *error);
184 double js_trynumber(js_State *J, int idx, double error);
185 int js_tryinteger(js_State *J, int idx, int error);
186 int js_tryboolean(js_State *J, int idx, int error);
187 
188 int js_tointeger(js_State *J, int idx);
189 int js_toint32(js_State *J, int idx);
190 unsigned int js_touint32(js_State *J, int idx);
191 short js_toint16(js_State *J, int idx);
192 unsigned short js_touint16(js_State *J, int idx);
193 
194 int js_gettop(js_State *J);
195 void js_settop(js_State *J, int idx);
196 void js_pop(js_State *J, int n);
197 void js_rot(js_State *J, int n);
198 void js_copy(js_State *J, int idx);
199 void js_remove(js_State *J, int idx);
200 void js_insert(js_State *J, int idx);
201 void js_replace(js_State* J, int idx);
202 
203 void js_dup(js_State *J);
204 void js_dup2(js_State *J);
205 void js_rot2(js_State *J);
206 void js_rot3(js_State *J);
207 void js_rot4(js_State *J);
208 void js_rot2pop1(js_State *J);
209 void js_rot3pop2(js_State *J);
210 
211 void js_concat(js_State *J);
212 int js_compare(js_State *J, int *okay);
213 int js_equal(js_State *J);
214 int js_strictequal(js_State *J);
215 int js_instanceof(js_State *J);
216 
217 #ifdef __cplusplus
218 }
219 #endif
220 
221 #endif
222