1 /* scheme.c: Initializations for libRUIN's Scheme interface
2  * Copyright (C) 2011 Julian Graham
3  *
4  * libRUIN is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #include <libguile.h>
19 #include <string.h>
20 
21 #include "scheme.h"
22 #include "window.h"
23 
24 static SCM ruin_scheme_pe = SCM_EOL;
25 
26 static SCM ruin_scheme_scss_sip_p = SCM_EOL;
27 static SCM ruin_scheme_scss_cth = SCM_EOL;
28 static SCM ruin_scheme_scss_sca_x = SCM_EOL;
29 static SCM ruin_scheme_scss_ca = SCM_EOL;
30 static SCM ruin_scheme_scss_scua_x = SCM_EOL;
31 static SCM ruin_scheme_scss_sv = SCM_EOL;
32 static SCM ruin_scheme_scss_gdv = SCM_EOL;
33 static SCM ruin_scheme_scss_mc = SCM_EOL;
34 static SCM ruin_scheme_scss_cts = SCM_EOL;
35 static SCM ruin_scheme_scss_mri = SCM_EOL;
36 static SCM ruin_scheme_scss_msc = SCM_EOL;
37 static SCM ruin_scheme_scss_svip = SCM_EOL;
38 static SCM ruin_scheme_scss_svp = SCM_EOL;
39 static SCM ruin_scheme_scss_svs = SCM_EOL;
40 static SCM ruin_scheme_scss_svv = SCM_EOL;
41 static SCM ruin_scheme_scss_ss = SCM_EOL;
42 
43 static SCM ruin_scheme_sdom_cd = SCM_EOL;
44 static SCM ruin_scheme_sdom_cdt = SCM_EOL;
45 static SCM ruin_scheme_sdom_ce = SCM_EOL;
46 static SCM ruin_scheme_sdom_ctn = SCM_EOL;
47 static SCM ruin_scheme_sdom_sa = SCM_EOL;
48 static SCM ruin_scheme_sdom_snn = SCM_EOL;
49 static SCM ruin_scheme_sdom_ssa = SCM_EOL;
50 static SCM ruin_scheme_sdom_sga = SCM_EOL;
51 static SCM ruin_scheme_sdom_sn = SCM_EOL;
52 static SCM ruin_scheme_sdom_sde_prop = SCM_EOL;
53 static SCM ruin_scheme_sdom_sd_p = SCM_EOL;
54 static SCM ruin_scheme_sdom_sdt = SCM_EOL;
55 static SCM ruin_scheme_sdom_sdu = SCM_EOL;
56 static SCM ruin_scheme_sdom_se_p = SCM_EOL;
57 static SCM ruin_scheme_sdom_sac = SCM_EOL;
58 static SCM ruin_scheme_sdom_sfc = SCM_EOL;
59 static SCM ruin_scheme_sdom_sns = SCM_EOL;
60 static SCM ruin_scheme_sdom_snv = SCM_EOL;
61 static SCM ruin_scheme_sdom_sod = SCM_EOL;
62 static SCM ruin_scheme_sdom_spn = SCM_EOL;
63 static SCM ruin_scheme_sdom_stc = SCM_EOL;
64 static SCM ruin_scheme_sdom_stn_p = SCM_EOL;
65 static SCM ruin_scheme_sdom_sv = SCM_EOL;
66 
67 static SCM ruin_scheme_sdom_ael = SCM_EOL;
68 static SCM ruin_scheme_sdom_sde = SCM_EOL;
69 static SCM ruin_scheme_sdom_xts = SCM_EOL;
70 
ruin_scheme_pre_unwind_handler(void * data,SCM key,SCM args)71 static SCM ruin_scheme_pre_unwind_handler (void *data, SCM key, SCM args) {
72   ((void **) data)[3] = scm_make_stack (SCM_BOOL_T, SCM_EOL);
73   return SCM_UNDEFINED;
74 }
75 
ruin_scheme_catch_body(void * expr)76 static SCM ruin_scheme_catch_body(void *expr) {
77   SCM e = *((SCM *) expr);
78   return scm_apply (SCM_CAR (e), SCM_CDR (e), SCM_EOL);
79 }
80 
ruin_scheme_catch_handler(void * data,SCM key,SCM args)81 static SCM ruin_scheme_catch_handler(void *data, SCM key, SCM args) {
82   ruin_window_t *w = (ruin_window_t *) ((void **) data)[0];
83   SCM stack = (SCM) ((void **) data)[3];
84   SCM frame = SCM_BOOL_F;
85   SCM port = scm_open_output_string ();
86   char *port_str = NULL;
87 
88   if (scm_stack_p (stack) == SCM_BOOL_T)
89     frame = scm_stack_ref (stack, scm_from_uint (0));
90 
91   *((int *) ((void **) data)[1]) = FALSE;
92 
93   scm_display(scm_from_locale_string ("error calling "), port);
94   scm_display(scm_from_locale_string ((char *) ((void **) data)[2]), port);
95   scm_display(scm_from_locale_string (": "), port);
96 
97   scm_call_4 (ruin_scheme_pe, port, frame, key, args);
98 
99   if (frame != SCM_BOOL_F)
100     scm_display_backtrace (stack, port, SCM_BOOL_F, SCM_BOOL_F);
101 
102   port_str = scm_to_locale_string (scm_get_output_string (port));
103   ruin_util_log (w, port_str);
104   free (port_str);
105 
106   return SCM_UNDEFINED;
107 }
108 
ruin_scheme_wrap(ruin_window_t * w,char * fn,SCM expr,SCM * result)109 int ruin_scheme_wrap(ruin_window_t *w, char *fn, SCM expr, SCM *result) {
110   int success = TRUE;
111   SCM res = SCM_EOL;
112 
113   void *handler_data[4];
114   handler_data[0] = w;
115   handler_data[1] = &success;
116   handler_data[2] = fn;
117   handler_data[3] = NULL;
118 
119   res = scm_c_catch(SCM_BOOL_T,
120 		    ruin_scheme_catch_body, &expr,
121 		    ruin_scheme_catch_handler, handler_data,
122 		    ruin_scheme_pre_unwind_handler, handler_data);
123   if (success && result != NULL)
124     *result = res;
125   return success;
126 }
127 
call_scm_function(ruin_window_t * w,SCM fn,char * fn_name,SCM arg)128 SCM call_scm_function (ruin_window_t *w, SCM fn, char *fn_name, SCM arg)
129 {
130   SCM r = SCM_EOL;
131   ruin_scheme_wrap (w, fn_name, scm_cons (fn, arg), &r);
132   return r;
133 }
134 
call_boolean_function(ruin_window_t * w,SCM fn,char * fn_name,SCM arg)135 int call_boolean_function (ruin_window_t *w, SCM fn, char *fn_name, SCM arg)
136 {
137   SCM r = SCM_EOL;
138   ruin_scheme_wrap (w, fn_name, scm_cons (fn, arg), &r);
139   return r == SCM_BOOL_T ? 1 : 0;
140 }
141 
call_char_function(ruin_window_t * w,SCM fn,char * fn_name,SCM arg)142 char *call_char_function (ruin_window_t *w, SCM fn, char *fn_name, SCM arg)
143 {
144   SCM r = SCM_EOL;
145   ruin_scheme_wrap (w, fn_name, scm_cons (fn, arg), &r);
146   return scm_string_p (r) == SCM_BOOL_T ? scm_to_locale_string (r) : NULL;
147 }
148 
ruin_scheme_scss_color_to_hex(ruin_window_t * w,char * c)149 SCM ruin_scheme_scss_color_to_hex(ruin_window_t *w, char *c) {
150   SCM r = scm_from_locale_string ("#000000");
151   SCM sc = scm_from_locale_string (c);
152   (void) ruin_scheme_wrap
153     (w, "scss:color->hex", scm_list_2 (ruin_scheme_scss_cth, sc), &r);
154   return r;
155 }
156 
ruin_scheme_scss_set_cascade_author(ruin_window_t * w,SCM c,SCM s)157 void ruin_scheme_scss_set_cascade_author (ruin_window_t *w, SCM c, SCM s) {
158   ruin_scheme_wrap(w, "scss:set-cascade-author!",
159 		   scm_list_3 (ruin_scheme_scss_sca_x, c, s), NULL);
160 }
161 
ruin_scheme_scss_cascade_author(ruin_window_t * w,SCM c)162 SCM ruin_scheme_scss_cascade_author (ruin_window_t *w, SCM c)
163 {
164   return call_scm_function
165     (w, ruin_scheme_scss_ca, "sdom:cascade-author", scm_list_1 (c));
166 }
167 
ruin_scheme_scss_set_cascade_agent(ruin_window_t * w,SCM c,SCM s)168 void ruin_scheme_scss_set_cascade_agent (ruin_window_t *w, SCM c, SCM s) {
169   ruin_scheme_wrap(w, "scss:set-cascade-agent!",
170 		   scm_list_3 (ruin_scheme_scss_scua_x, c, s), NULL);
171 }
172 
ruin_scheme_scss_is_inherited(ruin_window_t * w,char * prop)173 int ruin_scheme_scss_is_inherited(ruin_window_t *w, char *prop) {
174   SCM r = SCM_BOOL_F;
175   SCM sp = scm_from_locale_symbol (prop);
176   (void) ruin_scheme_wrap
177     (w, "scss:inherited?", scm_list_2 (ruin_scheme_scss_sip_p, sp), &r);
178   return r == SCM_BOOL_T ? 1 : 0;
179 }
180 
ruin_scheme_scss_get_default_value(ruin_window_t * w,char * p)181 char *ruin_scheme_scss_get_default_value(ruin_window_t *w, char *p) {
182   return call_char_function
183     (w, ruin_scheme_scss_gdv, "sdom:get-default-value",
184      scm_list_1 (scm_from_locale_symbol (p)));
185 }
186 
ruin_scheme_scss_make_rendering_interface(ruin_window_t * w,SCM pch,SCM peh)187 SCM ruin_scheme_scss_make_rendering_interface
188 (ruin_window_t *w, SCM pch, SCM peh)
189 {
190   return call_scm_function
191     (w, ruin_scheme_scss_mri, "scss:make-rendering-interface",
192      scm_list_2 (pch, peh));
193 }
194 
ruin_scheme_scss_make_cascade(ruin_window_t * w)195 SCM ruin_scheme_scss_make_cascade(ruin_window_t *w) {
196   return call_scm_function
197     (w, ruin_scheme_scss_mc, "scss:make-cascade",
198      scm_list_3 (SCM_BOOL_F, SCM_BOOL_F, SCM_BOOL_F));
199 }
200 
ruin_scheme_scss_css_to_scss(ruin_window_t * w,char * c,char * d)201 SCM ruin_scheme_scss_css_to_scss(ruin_window_t *w, char *c, char *d) {
202   return ruin_scheme_scss_css_to_scss_port
203     (w, scm_open_input_string (scm_from_locale_string(c)), d);
204 }
205 
ruin_scheme_scss_css_to_scss_port(ruin_window_t * w,SCM p,char * d)206 SCM ruin_scheme_scss_css_to_scss_port(ruin_window_t *w, SCM p, char *d) {
207   SCM ret = SCM_EOL;
208   long start = ruin_util_current_time_millis(), end = 0;
209 
210   if (d != NULL)
211     (void) ruin_scheme_wrap
212       (w, "scss:css->scss", scm_list_3
213        (ruin_scheme_scss_cts, p, scm_from_locale_string (d)), &ret);
214   else (void) ruin_scheme_wrap
215 	 (w, "scss:css->scss", scm_list_2 (ruin_scheme_scss_cts, p), &ret);
216 
217   end = ruin_util_current_time_millis();
218   ruin_util_log(w, "parsing stylesheet took %d ms", end - start);
219 
220   scm_gc_protect_object(ret);
221   return ret;
222 }
223 
ruin_scheme_scss_make_selection_context(ruin_window_t * w,SCM document_interface,SCM rendering_interface,SCM cascade)224 SCM ruin_scheme_scss_make_selection_context
225 (ruin_window_t *w, SCM document_interface, SCM rendering_interface, SCM cascade)
226 {
227   return call_scm_function
228     (w, ruin_scheme_scss_msc, "scss:make-selection-context",
229      scm_list_3 (document_interface, rendering_interface, cascade));
230 }
231 
ruin_scheme_scss_selected_value_important_p(ruin_window_t * w,SCM selected_value)232 int ruin_scheme_scss_selected_value_important_p
233 (ruin_window_t *w, SCM selected_value)
234 {
235   return call_boolean_function
236     (w, ruin_scheme_scss_svip, "scss:selected-value-important?",
237      scm_list_1 (selected_value));
238 }
239 
ruin_scheme_scss_selected_value_property(ruin_window_t * w,SCM selected_value)240 char *ruin_scheme_scss_selected_value_property
241 (ruin_window_t *w, SCM selected_value)
242 {
243   SCM property_symbol = call_scm_function
244     (w, ruin_scheme_scss_svp, "scss:selected-value-property",
245      scm_list_1 (selected_value));
246   return scm_to_locale_string (scm_symbol_to_string (property_symbol));
247 }
248 
ruin_scheme_scss_selected_value_source(ruin_window_t * w,SCM selected_value)249 char *ruin_scheme_scss_selected_value_source
250 (ruin_window_t *w, SCM selected_value)
251 {
252   SCM source_symbol = call_scm_function
253     (w, ruin_scheme_scss_svs, "scss:selected-value-source",
254      scm_list_1 (selected_value));
255   return scm_to_locale_string (scm_symbol_to_string (source_symbol));
256 }
257 
ruin_scheme_scss_selected_value_value(ruin_window_t * w,SCM selected_value)258 char *ruin_scheme_scss_selected_value_value
259 (ruin_window_t *w, SCM selected_value)
260 {
261   return call_char_function
262     (w, ruin_scheme_scss_svv, "scss:selected-value-value",
263      scm_list_1 (selected_value));
264 }
265 
ruin_scheme_scss_select_values(ruin_window_t * w,SCM selection_context,SCM node)266 SCM ruin_scheme_scss_select_values
267 (ruin_window_t *w, SCM selection_context, SCM node)
268 {
269   return call_scm_function
270     (w, ruin_scheme_scss_sv, "scss:select-values",
271      scm_list_2 (selection_context, node));
272 }
273 
ruin_scheme_scss_specify(ruin_window_t * w,char * prop,char * value)274 char *ruin_scheme_scss_specify (ruin_window_t *w, char *prop, char *value)
275 {
276   return call_char_function
277     (w, ruin_scheme_scss_ss, "scss:specify",
278      scm_list_2 (scm_from_locale_symbol (prop),
279 		 scm_from_locale_string (value)));
280 }
281 
ruin_scheme_sdom_create_document(ruin_window_t * w,char * r,SCM d)282 SCM ruin_scheme_sdom_create_document (ruin_window_t *w, char *r, SCM d)
283 {
284   return call_scm_function
285     (w, ruin_scheme_sdom_cd, "sdom:create-document",
286      scm_list_2 (scm_from_locale_string (r), d));
287 }
288 
ruin_scheme_sdom_create_document_type(ruin_window_t * w,char * r)289 SCM ruin_scheme_sdom_create_document_type (ruin_window_t *w, char *r)
290 {
291   return call_scm_function
292     (w, ruin_scheme_sdom_cdt, "sdom:create-document-type",
293      scm_list_1 (scm_from_locale_string (r)));
294 }
295 
ruin_scheme_sdom_create_element(ruin_window_t * w,SCM d,char * e)296 SCM ruin_scheme_sdom_create_element (ruin_window_t *w, SCM d, char *e)
297 {
298   return call_scm_function
299     (w, ruin_scheme_sdom_ce, "sdom:create-element",
300      scm_list_2 (d, scm_from_locale_string (e)));
301 }
302 
ruin_scheme_sdom_create_text_node(ruin_window_t * w,SCM d,char * c)303 SCM ruin_scheme_sdom_create_text_node (ruin_window_t *w, SCM d, char *c)
304 {
305   return call_scm_function
306     (w, ruin_scheme_sdom_ctn, "sdom:create-text-node",
307      scm_list_2 (d, scm_from_locale_string (c)));
308 }
309 
ruin_scheme_sdom_attributes(ruin_window_t * w,SCM e)310 SCM ruin_scheme_sdom_attributes (ruin_window_t *w, SCM e)
311 {
312   return call_scm_function
313     (w, ruin_scheme_sdom_sa, "sdom:attributes", scm_list_1 (e));
314 }
315 
ruin_scheme_sdom_doctype(ruin_window_t * w,SCM doc)316 SCM ruin_scheme_sdom_doctype (ruin_window_t *w, SCM doc)
317 {
318   return call_scm_function
319     (w, ruin_scheme_sdom_sdt, "sdom:doctype", scm_list_1 (doc));
320 }
321 
ruin_scheme_sdom_document_element(ruin_window_t * w,SCM doc)322 SCM ruin_scheme_sdom_document_element (ruin_window_t *w, SCM doc)
323 {
324   return call_scm_function
325     (w, ruin_scheme_sdom_sde_prop, "sdom:document-element", scm_list_1 (doc));
326 }
327 
ruin_scheme_sdom_owner_document(ruin_window_t * w,SCM e)328 SCM ruin_scheme_sdom_owner_document (ruin_window_t *w, SCM e)
329 {
330   return call_scm_function
331     (w, ruin_scheme_sdom_sod, "sdom:owner-document", scm_list_1 (e));
332 }
333 
ruin_scheme_sdom_parent_node(ruin_window_t * w,SCM e)334 SCM ruin_scheme_sdom_parent_node (ruin_window_t *w, SCM e)
335 {
336   return call_scm_function
337     (w, ruin_scheme_sdom_spn, "sdom:parent-node", scm_list_1 (e));
338 }
339 
ruin_scheme_sdom_append_child(ruin_window_t * w,SCM n,SCM c)340 void ruin_scheme_sdom_append_child (ruin_window_t *w, SCM n, SCM c)
341 {
342   call_scm_function
343     (w, ruin_scheme_sdom_sac, "sdom:append-child!", scm_list_2 (n, c));
344 }
345 
ruin_scheme_sdom_first_child(ruin_window_t * w,SCM e)346 SCM ruin_scheme_sdom_first_child (ruin_window_t *w, SCM e)
347 {
348   return call_scm_function
349     (w, ruin_scheme_sdom_sfc, "sdom:first-child", scm_list_1 (e));
350 }
351 
ruin_scheme_sdom_next_sibling(ruin_window_t * w,SCM e)352 SCM ruin_scheme_sdom_next_sibling (ruin_window_t *w, SCM e)
353 {
354   return call_scm_function
355     (w, ruin_scheme_sdom_sns, "sdom:next-sibling", scm_list_1 (e));
356 }
357 
ruin_scheme_sdom_document_p(ruin_window_t * w,SCM e)358 int ruin_scheme_sdom_document_p (ruin_window_t *w, SCM e)
359 {
360   return call_boolean_function
361     (w, ruin_scheme_sdom_sd_p, "sdom:document?", scm_list_1 (e));
362 }
363 
ruin_scheme_sdom_element_p(ruin_window_t * w,SCM e)364 int ruin_scheme_sdom_element_p (ruin_window_t *w, SCM e)
365 {
366   return call_boolean_function
367     (w, ruin_scheme_sdom_se_p, "sdom:element?", scm_list_1 (e));
368 }
369 
ruin_scheme_sdom_text_node_p(ruin_window_t * w,SCM e)370 int ruin_scheme_sdom_text_node_p (ruin_window_t *w, SCM e)
371 {
372   return call_boolean_function
373     (w, ruin_scheme_sdom_stn_p, "sdom:text-node?", scm_list_1 (e));
374 }
375 
ruin_scheme_sdom_document_uri(ruin_window_t * w,SCM d)376 char *ruin_scheme_sdom_document_uri (ruin_window_t *w, SCM d)
377 {
378   return call_char_function
379     (w, ruin_scheme_sdom_sdu, "sdom:document-uri", scm_list_1 (d));
380 }
381 
ruin_scheme_sdom_name(ruin_window_t * w,SCM n)382 char *ruin_scheme_sdom_name (ruin_window_t *w, SCM n)
383 {
384   return call_char_function
385     (w, ruin_scheme_sdom_sn, "sdom:name", scm_list_1 (n));
386 }
387 
ruin_scheme_sdom_node_name(ruin_window_t * w,SCM n)388 char *ruin_scheme_sdom_node_name (ruin_window_t *w, SCM n)
389 {
390   return call_char_function
391     (w, ruin_scheme_sdom_snn, "sdom:node-name", scm_list_1 (n));
392 }
393 
ruin_scheme_sdom_node_value(ruin_window_t * w,SCM n)394 char *ruin_scheme_sdom_node_value (ruin_window_t *w, SCM n)
395 {
396   return call_char_function
397     (w, ruin_scheme_sdom_snv, "sdom:node-value", scm_list_1 (n));
398 }
399 
ruin_scheme_sdom_text_content(ruin_window_t * w,SCM e)400 char *ruin_scheme_sdom_text_content (ruin_window_t *w, SCM e)
401 {
402   return call_char_function
403     (w, ruin_scheme_sdom_stc, "sdom:text-content", scm_list_1 (e));
404 }
405 
ruin_scheme_sdom_value(ruin_window_t * w,SCM n)406 char *ruin_scheme_sdom_value (ruin_window_t *w, SCM n)
407 {
408   return call_char_function
409     (w, ruin_scheme_sdom_sv, "sdom:value", scm_list_1 (n));
410 }
411 
ruin_scheme_sdom_set_attribute(ruin_window_t * w,SCM n,char * attr,char * val)412 void ruin_scheme_sdom_set_attribute
413 (ruin_window_t *w, SCM n, char *attr, char *val)
414 {
415   call_scm_function
416     (w, ruin_scheme_sdom_ssa, "sdom:set-attribute!",
417      scm_list_3 (n, scm_from_locale_string (attr),
418 		 scm_from_locale_string (val)));
419 }
420 
ruin_scheme_sdom_get_attribute(ruin_window_t * w,SCM n,char * attr)421 char *ruin_scheme_sdom_get_attribute(ruin_window_t *w, SCM n, char *attr) {
422   SCM sprop = scm_from_locale_string (attr);
423   SCM r = SCM_EOL;
424 
425   (void) ruin_scheme_wrap
426     (w, "sdom:get-attribute", scm_list_3 (ruin_scheme_sdom_sga, n, sprop), &r);
427 
428   if (scm_string_p(r) != SCM_BOOL_T)
429     return NULL;
430   return scm_to_locale_string(r);
431 }
432 
ruin_scheme_sdom_dispatch_event(ruin_window_t * w,SCM n,char * event)433 void ruin_scheme_sdom_dispatch_event(ruin_window_t *w, SCM n, char *event) {
434   SCM sevent = scm_from_locale_string(event);
435   ruin_scheme_wrap(w, "sdom:dispatch-event",
436 		   scm_list_3(ruin_scheme_sdom_sde, n, sevent), NULL);
437 }
438 
ruin_scheme_sdom_add_event_listener(ruin_window_t * w,SCM n,char * event,char * group,char * handler)439 void ruin_scheme_sdom_add_event_listener(ruin_window_t *w, SCM n, char *event,
440 					 char *group, char *handler) {
441   SCM sevent = scm_from_locale_string (event);
442   SCM sgroup = scm_from_locale_string (group);
443   SCM handler_proc = scm_c_eval_string(handler);
444 
445   ruin_scheme_wrap(w, "sdom:add-event-listener",
446 		   scm_list_n(ruin_scheme_sdom_ael, n, sevent,
447 			      sgroup, handler_proc, SCM_BOOL_F, SCM_UNDEFINED),
448 		   NULL);
449 }
450 
ruin_scheme_sdom_xml_to_sdom(ruin_window_t * w,SCM p,SCM ns)451 SCM ruin_scheme_sdom_xml_to_sdom(ruin_window_t *w, SCM p, SCM ns) {
452   SCM r = SCM_EOL;
453   (void) ruin_scheme_wrap
454     (w, "sdom:xml->sdom", scm_list_3 (ruin_scheme_sdom_xts, p, ns), &r);
455   scm_gc_protect_object(r);
456   return r;
457 }
458 
459 #define PROTECTED_BINDING(var, expr) \
460   var = scm_c_eval_string (expr); \
461   scm_gc_protect_object (var);
462 
ruin_scheme_init()463 void ruin_scheme_init() {
464   PROTECTED_BINDING (ruin_scheme_pe, "print-exception");
465 
466   PROTECTED_BINDING (ruin_scheme_scss_document_interface_sdom,
467 		     "scss:document-interface-sdom");
468 
469   PROTECTED_BINDING (ruin_scheme_scss_sip_p, "scss:inherited?");
470   PROTECTED_BINDING (ruin_scheme_scss_cth, "scss:color->hex");
471   PROTECTED_BINDING (ruin_scheme_scss_sca_x, "scss:set-cascade-author!");
472   PROTECTED_BINDING (ruin_scheme_scss_ca, "scss:cascade-author");
473   PROTECTED_BINDING (ruin_scheme_scss_scua_x, "scss:set-cascade-agent!");
474   PROTECTED_BINDING (ruin_scheme_scss_gdv, "scss:get-default-value");
475   PROTECTED_BINDING (ruin_scheme_scss_mc, "scss:make-cascade");
476   PROTECTED_BINDING (ruin_scheme_scss_cts, "scss:css->scss");
477   PROTECTED_BINDING (ruin_scheme_scss_mri, "scss:make-rendering-interface");
478   PROTECTED_BINDING (ruin_scheme_scss_msc, "scss:make-selection-context");
479   PROTECTED_BINDING (ruin_scheme_scss_svip, "scss:selected-value-important?");
480   PROTECTED_BINDING (ruin_scheme_scss_svp, "scss:selected-value-property");
481   PROTECTED_BINDING (ruin_scheme_scss_svs, "scss:selected-value-source");
482   PROTECTED_BINDING (ruin_scheme_scss_svv, "scss:selected-value-value");
483   PROTECTED_BINDING (ruin_scheme_scss_sv, "scss:select-values");
484   PROTECTED_BINDING (ruin_scheme_scss_ss, "scss:specify");
485 
486   PROTECTED_BINDING (ruin_scheme_sdom_cd, "sdom:create-document");
487   PROTECTED_BINDING (ruin_scheme_sdom_cdt, "sdom:create-document-type");
488   PROTECTED_BINDING (ruin_scheme_sdom_ce, "sdom:create-element");
489   PROTECTED_BINDING (ruin_scheme_sdom_ctn, "sdom:create-text-node");
490   PROTECTED_BINDING (ruin_scheme_sdom_sa, "sdom:attributes");
491   PROTECTED_BINDING (ruin_scheme_sdom_snn, "sdom:node-name");
492   PROTECTED_BINDING (ruin_scheme_sdom_sn, "sdom:name");
493   PROTECTED_BINDING (ruin_scheme_sdom_sde_prop, "sdom:document-element");
494   PROTECTED_BINDING (ruin_scheme_sdom_sdt, "sdom:doctype");
495   PROTECTED_BINDING (ruin_scheme_sdom_sdu, "sdom:document-uri");
496   PROTECTED_BINDING (ruin_scheme_sdom_sd_p, "sdom:document?");
497   PROTECTED_BINDING (ruin_scheme_sdom_se_p, "sdom:element?");
498   PROTECTED_BINDING (ruin_scheme_sdom_sac, "sdom:append-child!");
499   PROTECTED_BINDING (ruin_scheme_sdom_sfc, "sdom:first-child");
500   PROTECTED_BINDING (ruin_scheme_sdom_sns, "sdom:next-sibling");
501   PROTECTED_BINDING (ruin_scheme_sdom_snv, "sdom:node-value");
502   PROTECTED_BINDING (ruin_scheme_sdom_stc, "sdom:text-content");
503   PROTECTED_BINDING (ruin_scheme_sdom_stn_p, "sdom:text-node?");
504   PROTECTED_BINDING (ruin_scheme_sdom_sv, "sdom:value");
505   PROTECTED_BINDING (ruin_scheme_sdom_ssa, "sdom:set-attribute!");
506   PROTECTED_BINDING (ruin_scheme_sdom_sga, "sdom:get-attribute");
507   PROTECTED_BINDING (ruin_scheme_sdom_ael, "sdom:add-event-listener!");
508   PROTECTED_BINDING (ruin_scheme_sdom_sde, "sdom:dispatch-event");
509   PROTECTED_BINDING (ruin_scheme_sdom_xts, "sdom:xml->sdom");
510   PROTECTED_BINDING (ruin_scheme_sdom_sod, "sdom:owner-document");
511   PROTECTED_BINDING (ruin_scheme_sdom_spn, "sdom:parent-node");
512 }
513