ray 0.0.1 → 0.1.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. data/.gemtest +0 -0
  2. data/.yardopts +4 -0
  3. data/README.md +17 -21
  4. data/Rakefile +18 -139
  5. data/VERSION +1 -1
  6. data/ext/audio.cpp +723 -0
  7. data/ext/{color.c → color.cpp} +25 -13
  8. data/ext/drawable.cpp +91 -0
  9. data/ext/event.cpp +460 -0
  10. data/ext/extconf.rb +5 -104
  11. data/ext/font.cpp +190 -0
  12. data/ext/image.cpp +733 -0
  13. data/ext/input.cpp +74 -0
  14. data/ext/ray.cpp +168 -0
  15. data/ext/ray.hpp +356 -0
  16. data/ext/{rect.c → rect.cpp} +51 -37
  17. data/ext/shader.cpp +169 -0
  18. data/ext/shape.cpp +409 -0
  19. data/ext/sprite.cpp +306 -0
  20. data/ext/text.cpp +181 -0
  21. data/ext/vector.cpp +215 -0
  22. data/guide.md +619 -0
  23. data/lib/ray/audio.rb +0 -41
  24. data/lib/ray/color.rb +32 -10
  25. data/lib/ray/drawable.rb +16 -0
  26. data/lib/ray/dsl/event_listener.rb +25 -2
  27. data/lib/ray/dsl/event_runner.rb +33 -5
  28. data/lib/ray/dsl/event_translator.rb +66 -30
  29. data/lib/ray/dsl/handler.rb +3 -2
  30. data/lib/ray/dsl/matcher.rb +58 -14
  31. data/lib/ray/font.rb +38 -96
  32. data/lib/ray/font_set.rb +8 -8
  33. data/lib/ray/game.rb +87 -66
  34. data/lib/ray/helper.rb +105 -10
  35. data/lib/ray/image.rb +150 -24
  36. data/lib/ray/image_set.rb +3 -1
  37. data/lib/ray/input.rb +10 -0
  38. data/lib/ray/music_set.rb +5 -3
  39. data/lib/ray/ray.rb +21 -9
  40. data/lib/ray/rect.rb +48 -7
  41. data/lib/ray/rmagick.rb +41 -0
  42. data/lib/ray/scene.rb +99 -43
  43. data/lib/ray/scene_list.rb +67 -0
  44. data/lib/ray/shape.rb +132 -0
  45. data/lib/ray/sound_set.rb +4 -2
  46. data/lib/ray/sprite.rb +49 -111
  47. data/lib/ray/text.rb +101 -0
  48. data/lib/ray/text_helper.rb +37 -0
  49. data/lib/ray/turtle.rb +215 -0
  50. data/lib/ray/vector.rb +226 -0
  51. data/samples/audio/spacial.rb +44 -0
  52. data/samples/hello_world/hello.rb +9 -13
  53. data/samples/hello_world/hello_dsl.rb +8 -12
  54. data/samples/hello_world/text.rb +15 -0
  55. data/samples/opengl/binding.rb +38 -0
  56. data/samples/opengl/image.rb +32 -0
  57. data/samples/opengl/opengl.rb +34 -0
  58. data/samples/opengl/shader.rb +42 -0
  59. data/samples/pong/pong.rb +14 -10
  60. data/samples/run_scene.rb +53 -0
  61. data/samples/shaders/scene.rb +40 -0
  62. data/samples/shaders/shaders.rb +42 -0
  63. data/samples/shaders/shape.rb +34 -0
  64. data/samples/sokoban/sokoban.rb +18 -18
  65. data/samples/test/actual_scene.rb +41 -0
  66. data/samples/test/scene_riot.rb +39 -0
  67. data/samples/test/scene_spec.rb +32 -0
  68. data/samples/test/scene_test_unit.rb +25 -0
  69. data/samples/turtle/byzantium.rb +45 -0
  70. data/samples/turtle/hilbert.rb +48 -0
  71. data/samples/turtle/koch.rb +55 -0
  72. data/samples/turtle/mandala.rb +61 -0
  73. data/samples/turtle/tree.rb +57 -0
  74. data/test/audio_test.rb +69 -0
  75. data/test/color_test.rb +77 -0
  76. data/test/drawable_test.rb +19 -0
  77. data/test/dsl_test.rb +93 -0
  78. data/test/font_test.rb +57 -0
  79. data/test/helpers.rb +94 -0
  80. data/test/image_test.rb +82 -0
  81. data/test/ray_test.rb +25 -0
  82. data/test/rect_test.rb +121 -0
  83. data/{spec → test}/res/VeraMono.ttf +0 -0
  84. data/{spec → test}/res/aqua.bmp +0 -0
  85. data/{spec → test}/res/aqua.png +0 -0
  86. data/{spec → test}/res/aqua2.bmp +0 -0
  87. data/{spec → test}/res/not_a_jpeg.jpeg +0 -0
  88. data/{spec → test}/res/pop.wav +0 -0
  89. data/test/resource_set_test.rb +99 -0
  90. data/test/run_all.rb +7 -0
  91. data/test/shape_test.rb +101 -0
  92. data/test/sprite_test.rb +89 -0
  93. data/test/text_test.rb +78 -0
  94. data/test/turtle_test.rb +176 -0
  95. data/test/vector_test.rb +111 -0
  96. data/yard_ext.rb +0 -28
  97. metadata +95 -139
  98. data/.gitignore +0 -23
  99. data/.gitmodules +0 -3
  100. data/.rspec +0 -3
  101. data/ext/audio.c +0 -473
  102. data/ext/event.c +0 -557
  103. data/ext/font.c +0 -287
  104. data/ext/image.c +0 -933
  105. data/ext/joystick.c +0 -145
  106. data/ext/ray.c +0 -489
  107. data/ext/ray.h +0 -245
  108. data/ext/ray_osx.m +0 -161
  109. data/lib/ray/joystick.rb +0 -30
  110. data/psp/SDL_psp_main.c +0 -84
  111. data/psp/bigdecimal/README +0 -60
  112. data/psp/bigdecimal/bigdecimal.c +0 -4697
  113. data/psp/bigdecimal/bigdecimal.h +0 -216
  114. data/psp/bigdecimal/lib/bigdecimal/jacobian.rb +0 -85
  115. data/psp/bigdecimal/lib/bigdecimal/ludcmp.rb +0 -84
  116. data/psp/bigdecimal/lib/bigdecimal/math.rb +0 -235
  117. data/psp/bigdecimal/lib/bigdecimal/newton.rb +0 -77
  118. data/psp/bigdecimal/lib/bigdecimal/util.rb +0 -65
  119. data/psp/digest/bubblebabble/bubblebabble.c +0 -142
  120. data/psp/digest/defs.h +0 -20
  121. data/psp/digest/digest.c +0 -643
  122. data/psp/digest/digest.h +0 -32
  123. data/psp/digest/lib/digest.rb +0 -50
  124. data/psp/digest/lib/md5.rb +0 -27
  125. data/psp/digest/lib/sha1.rb +0 -27
  126. data/psp/digest/md5/md5.c +0 -420
  127. data/psp/digest/md5/md5.h +0 -80
  128. data/psp/digest/md5/md5init.c +0 -40
  129. data/psp/digest/rmd160/rmd160.c +0 -457
  130. data/psp/digest/rmd160/rmd160.h +0 -56
  131. data/psp/digest/rmd160/rmd160init.c +0 -40
  132. data/psp/digest/sha1/sha1.c +0 -269
  133. data/psp/digest/sha1/sha1.h +0 -39
  134. data/psp/digest/sha1/sha1init.c +0 -40
  135. data/psp/digest/sha2/lib/sha2.rb +0 -73
  136. data/psp/digest/sha2/sha2.c +0 -919
  137. data/psp/digest/sha2/sha2.h +0 -109
  138. data/psp/digest/sha2/sha2init.c +0 -52
  139. data/psp/enumerator/enumerator.c +0 -298
  140. data/psp/etc/etc.c +0 -559
  141. data/psp/ext.c +0 -289
  142. data/psp/fcntl/fcntl.c +0 -187
  143. data/psp/lib/rbconfig.rb +0 -178
  144. data/psp/nkf/lib/kconv.rb +0 -367
  145. data/psp/nkf/nkf-utf8/config.h +0 -88
  146. data/psp/nkf/nkf-utf8/nkf.c +0 -6040
  147. data/psp/nkf/nkf-utf8/utf8tbl.c +0 -8500
  148. data/psp/nkf/nkf-utf8/utf8tbl.h +0 -34
  149. data/psp/nkf/nkf.c +0 -654
  150. data/psp/socket/addrinfo.h +0 -173
  151. data/psp/socket/getaddrinfo.c +0 -676
  152. data/psp/socket/getnameinfo.c +0 -270
  153. data/psp/socket/pspsocket.c +0 -71
  154. data/psp/socket/pspsocket.h +0 -28
  155. data/psp/socket/socket.c +0 -4662
  156. data/psp/socket/sockport.h +0 -76
  157. data/psp/stringio/stringio.c +0 -1306
  158. data/psp/strscan/strscan.c +0 -1320
  159. data/psp/syck/bytecode.c +0 -1166
  160. data/psp/syck/emitter.c +0 -1242
  161. data/psp/syck/gram.c +0 -1894
  162. data/psp/syck/gram.h +0 -79
  163. data/psp/syck/handler.c +0 -174
  164. data/psp/syck/implicit.c +0 -2990
  165. data/psp/syck/node.c +0 -408
  166. data/psp/syck/rubyext.c +0 -2367
  167. data/psp/syck/syck.c +0 -504
  168. data/psp/syck/syck.h +0 -456
  169. data/psp/syck/token.c +0 -2725
  170. data/psp/syck/yaml2byte.c +0 -257
  171. data/psp/syck/yamlbyte.h +0 -170
  172. data/psp/thread/thread.c +0 -1175
  173. data/psp/zlib/zlib.c +0 -3547
  174. data/script.rb +0 -10
  175. data/spec/ray/audio_spec.rb +0 -146
  176. data/spec/ray/color_spec.rb +0 -57
  177. data/spec/ray/event_spec.rb +0 -80
  178. data/spec/ray/font_spec.rb +0 -93
  179. data/spec/ray/image_set_spec.rb +0 -48
  180. data/spec/ray/image_spec.rb +0 -162
  181. data/spec/ray/joystick_spec.rb +0 -21
  182. data/spec/ray/matcher_spec.rb +0 -50
  183. data/spec/ray/ray_spec.rb +0 -88
  184. data/spec/ray/rect_spec.rb +0 -154
  185. data/spec/ray/resource_set_spec.rb +0 -105
  186. data/spec/ray/sprite_spec.rb +0 -163
  187. data/spec/spec.opts +0 -4
  188. data/spec/spec_helper.rb +0 -8
@@ -1,408 +0,0 @@
1
- /*
2
- * node.c
3
- *
4
- * $Author: shyouhei $
5
- * $Date: 2007-02-13 08:01:19 +0900 (Tue, 13 Feb 2007) $
6
- *
7
- * Copyright (C) 2003 why the lucky stiff
8
- */
9
-
10
- #include <ruby/ruby.h>
11
- #include "syck.h"
12
-
13
- /*
14
- * Node allocation functions
15
- */
16
- SyckNode *
17
- syck_alloc_node( enum syck_kind_tag type )
18
- {
19
- SyckNode *s;
20
-
21
- s = S_ALLOC( SyckNode );
22
- s->kind = type;
23
- s->id = 0;
24
- s->type_id = NULL;
25
- s->anchor = NULL;
26
- s->shortcut = NULL;
27
-
28
- return s;
29
- }
30
-
31
- void
32
- syck_free_node( SyckNode *n )
33
- {
34
- syck_free_members( n );
35
- if ( n->type_id != NULL )
36
- {
37
- S_FREE( n->type_id );
38
- n->type_id = NULL;
39
- }
40
- if ( n->anchor != NULL )
41
- {
42
- S_FREE( n->anchor );
43
- n->anchor = NULL;
44
- }
45
- S_FREE( n );
46
- }
47
-
48
- SyckNode *
49
- syck_alloc_map()
50
- {
51
- SyckNode *n;
52
- struct SyckMap *m;
53
-
54
- m = S_ALLOC( struct SyckMap );
55
- m->style = map_none;
56
- m->idx = 0;
57
- m->capa = ALLOC_CT;
58
- m->keys = S_ALLOC_N( SYMID, m->capa );
59
- m->values = S_ALLOC_N( SYMID, m->capa );
60
-
61
- n = syck_alloc_node( syck_map_kind );
62
- n->data.pairs = m;
63
-
64
- return n;
65
- }
66
-
67
- SyckNode *
68
- syck_alloc_seq()
69
- {
70
- SyckNode *n;
71
- struct SyckSeq *s;
72
-
73
- s = S_ALLOC( struct SyckSeq );
74
- s->style = seq_none;
75
- s->idx = 0;
76
- s->capa = ALLOC_CT;
77
- s->items = S_ALLOC_N( SYMID, s->capa );
78
-
79
- n = syck_alloc_node( syck_seq_kind );
80
- n->data.list = s;
81
-
82
- return n;
83
- }
84
-
85
- SyckNode *
86
- syck_alloc_str()
87
- {
88
- SyckNode *n;
89
- struct SyckStr *s;
90
-
91
- s = S_ALLOC( struct SyckStr );
92
- s->len = 0;
93
- s->ptr = NULL;
94
- s->style = scalar_none;
95
-
96
- n = syck_alloc_node( syck_str_kind );
97
- n->data.str = s;
98
-
99
- return n;
100
- }
101
-
102
- SyckNode *
103
- syck_new_str( char *str, enum scalar_style style )
104
- {
105
- return syck_new_str2( str, strlen( str ), style );
106
- }
107
-
108
- SyckNode *
109
- syck_new_str2( char *str, long len, enum scalar_style style )
110
- {
111
- SyckNode *n;
112
-
113
- n = syck_alloc_str();
114
- n->data.str->ptr = S_ALLOC_N( char, len + 1 );
115
- n->data.str->len = len;
116
- n->data.str->style = style;
117
- memcpy( n->data.str->ptr, str, len );
118
- n->data.str->ptr[len] = '\0';
119
-
120
- return n;
121
- }
122
-
123
- void
124
- syck_replace_str( SyckNode *n, char *str, enum scalar_style style )
125
- {
126
- syck_replace_str2( n, str, strlen( str ), style );
127
- }
128
-
129
- void
130
- syck_replace_str2( SyckNode *n, char *str, long len, enum scalar_style style )
131
- {
132
- if ( n->data.str != NULL )
133
- {
134
- S_FREE( n->data.str->ptr );
135
- n->data.str->ptr = NULL;
136
- n->data.str->len = 0;
137
- }
138
- n->data.str->ptr = S_ALLOC_N( char, len + 1 );
139
- n->data.str->len = len;
140
- n->data.str->style = style;
141
- memcpy( n->data.str->ptr, str, len );
142
- n->data.str->ptr[len] = '\0';
143
- }
144
-
145
- void
146
- syck_str_blow_away_commas( SyckNode *n )
147
- {
148
- char *go, *end;
149
-
150
- go = n->data.str->ptr;
151
- end = go + n->data.str->len;
152
- while ( *(++go) != '\0' )
153
- {
154
- if ( *go == ',' )
155
- {
156
- n->data.str->len -= 1;
157
- memmove( go, go + 1, end - go );
158
- end -= 1;
159
- }
160
- }
161
- }
162
-
163
- char *
164
- syck_str_read( SyckNode *n )
165
- {
166
- ASSERT( n != NULL );
167
- return n->data.str->ptr;
168
- }
169
-
170
- SyckNode *
171
- syck_new_map( SYMID key, SYMID value )
172
- {
173
- SyckNode *n;
174
-
175
- n = syck_alloc_map();
176
- syck_map_add( n, key, value );
177
-
178
- return n;
179
- }
180
-
181
- void
182
- syck_map_empty( SyckNode *n )
183
- {
184
- struct SyckMap *m;
185
- ASSERT( n != NULL );
186
- ASSERT( n->data.list != NULL );
187
-
188
- S_FREE( n->data.pairs->keys );
189
- S_FREE( n->data.pairs->values );
190
- m = n->data.pairs;
191
- m->idx = 0;
192
- m->capa = ALLOC_CT;
193
- m->keys = S_ALLOC_N( SYMID, m->capa );
194
- m->values = S_ALLOC_N( SYMID, m->capa );
195
- }
196
-
197
- void
198
- syck_map_add( SyckNode *map, SYMID key, SYMID value )
199
- {
200
- struct SyckMap *m;
201
- long idx;
202
-
203
- ASSERT( map != NULL );
204
- ASSERT( map->data.pairs != NULL );
205
-
206
- m = map->data.pairs;
207
- idx = m->idx;
208
- m->idx += 1;
209
- if ( m->idx > m->capa )
210
- {
211
- m->capa += ALLOC_CT;
212
- S_REALLOC_N( m->keys, SYMID, m->capa );
213
- S_REALLOC_N( m->values, SYMID, m->capa );
214
- }
215
- m->keys[idx] = key;
216
- m->values[idx] = value;
217
- }
218
-
219
- void
220
- syck_map_update( SyckNode *map1, SyckNode *map2 )
221
- {
222
- struct SyckMap *m1, *m2;
223
- long new_idx, new_capa;
224
- ASSERT( map1 != NULL );
225
- ASSERT( map2 != NULL );
226
-
227
- m1 = map1->data.pairs;
228
- m2 = map2->data.pairs;
229
- if ( m2->idx < 1 ) return;
230
-
231
- new_idx = m1->idx;
232
- new_idx += m2->idx;
233
- new_capa = m1->capa;
234
- while ( new_idx > new_capa )
235
- {
236
- new_capa += ALLOC_CT;
237
- }
238
- if ( new_capa > m1->capa )
239
- {
240
- m1->capa = new_capa;
241
- S_REALLOC_N( m1->keys, SYMID, m1->capa );
242
- S_REALLOC_N( m1->values, SYMID, m1->capa );
243
- }
244
- for ( new_idx = 0; new_idx < m2->idx; m1->idx++, new_idx++ )
245
- {
246
- m1->keys[m1->idx] = m2->keys[new_idx];
247
- m1->values[m1->idx] = m2->values[new_idx];
248
- }
249
- }
250
-
251
- long
252
- syck_map_count( SyckNode *map )
253
- {
254
- ASSERT( map != NULL );
255
- ASSERT( map->data.pairs != NULL );
256
- return map->data.pairs->idx;
257
- }
258
-
259
- void
260
- syck_map_assign( SyckNode *map, enum map_part p, long idx, SYMID id )
261
- {
262
- struct SyckMap *m;
263
-
264
- ASSERT( map != NULL );
265
- m = map->data.pairs;
266
- ASSERT( m != NULL );
267
- if ( p == map_key )
268
- {
269
- m->keys[idx] = id;
270
- }
271
- else
272
- {
273
- m->values[idx] = id;
274
- }
275
- }
276
-
277
- SYMID
278
- syck_map_read( SyckNode *map, enum map_part p, long idx )
279
- {
280
- struct SyckMap *m;
281
-
282
- ASSERT( map != NULL );
283
- m = map->data.pairs;
284
- ASSERT( m != NULL );
285
- if ( p == map_key )
286
- {
287
- return m->keys[idx];
288
- }
289
- else
290
- {
291
- return m->values[idx];
292
- }
293
- }
294
-
295
- SyckNode *
296
- syck_new_seq( SYMID value )
297
- {
298
- SyckNode *n;
299
-
300
- n = syck_alloc_seq();
301
- syck_seq_add( n, value );
302
-
303
- return n;
304
- }
305
-
306
- void
307
- syck_seq_empty( SyckNode *n )
308
- {
309
- struct SyckSeq *s;
310
- ASSERT( n != NULL );
311
- ASSERT( n->data.list != NULL );
312
-
313
- S_FREE( n->data.list->items );
314
- s = n->data.list;
315
- s->idx = 0;
316
- s->capa = ALLOC_CT;
317
- s->items = S_ALLOC_N( SYMID, s->capa );
318
- }
319
-
320
- void
321
- syck_seq_add( SyckNode *arr, SYMID value )
322
- {
323
- struct SyckSeq *s;
324
- long idx;
325
-
326
- ASSERT( arr != NULL );
327
- ASSERT( arr->data.list != NULL );
328
-
329
- s = arr->data.list;
330
- idx = s->idx;
331
- s->idx += 1;
332
- if ( s->idx > s->capa )
333
- {
334
- s->capa += ALLOC_CT;
335
- S_REALLOC_N( s->items, SYMID, s->capa );
336
- }
337
- s->items[idx] = value;
338
- }
339
-
340
- long
341
- syck_seq_count( SyckNode *seq )
342
- {
343
- ASSERT( seq != NULL );
344
- ASSERT( seq->data.list != NULL );
345
- return seq->data.list->idx;
346
- }
347
-
348
- void
349
- syck_seq_assign( SyckNode *seq, long idx, SYMID id )
350
- {
351
- struct SyckSeq *s;
352
-
353
- ASSERT( map != NULL );
354
- s = seq->data.list;
355
- ASSERT( m != NULL );
356
- s->items[idx] = id;
357
- }
358
-
359
- SYMID
360
- syck_seq_read( SyckNode *seq, long idx )
361
- {
362
- struct SyckSeq *s;
363
-
364
- ASSERT( seq != NULL );
365
- s = seq->data.list;
366
- ASSERT( s != NULL );
367
- return s->items[idx];
368
- }
369
-
370
- void
371
- syck_free_members( SyckNode *n )
372
- {
373
- if ( n == NULL ) return;
374
-
375
- switch ( n->kind )
376
- {
377
- case syck_str_kind:
378
- if ( n->data.str != NULL )
379
- {
380
- S_FREE( n->data.str->ptr );
381
- n->data.str->ptr = NULL;
382
- n->data.str->len = 0;
383
- S_FREE( n->data.str );
384
- n->data.str = NULL;
385
- }
386
- break;
387
-
388
- case syck_seq_kind:
389
- if ( n->data.list != NULL )
390
- {
391
- S_FREE( n->data.list->items );
392
- S_FREE( n->data.list );
393
- n->data.list = NULL;
394
- }
395
- break;
396
-
397
- case syck_map_kind:
398
- if ( n->data.pairs != NULL )
399
- {
400
- S_FREE( n->data.pairs->keys );
401
- S_FREE( n->data.pairs->values );
402
- S_FREE( n->data.pairs );
403
- n->data.pairs = NULL;
404
- }
405
- break;
406
- }
407
- }
408
-
@@ -1,2367 +0,0 @@
1
- /* -*- indent-tabs-mode: nil -*- */
2
- /*
3
- * rubyext.c
4
- *
5
- * $Author: shyouhei $
6
- * $Date: 2007-02-13 08:01:19 +0900 (Tue, 13 Feb 2007) $
7
- *
8
- * Copyright (C) 2003-2005 why the lucky stiff
9
- */
10
-
11
- #include <ruby/ruby.h>
12
- #include "syck.h"
13
- #include <sys/types.h>
14
- #include <time.h>
15
-
16
- typedef struct RVALUE {
17
- union {
18
- #if 0
19
- struct {
20
- unsigned long flags; /* always 0 for freed obj */
21
- struct RVALUE *next;
22
- } free;
23
- #endif
24
- struct RBasic basic;
25
- struct RObject object;
26
- struct RClass klass;
27
- /*struct RFloat flonum;*/
28
- /*struct RString string;*/
29
- struct RArray array;
30
- /*struct RRegexp regexp;*/
31
- struct RHash hash;
32
- /*struct RData data;*/
33
- struct RStruct rstruct;
34
- /*struct RBignum bignum;*/
35
- /*struct RFile file;*/
36
- } as;
37
- } RVALUE;
38
-
39
- typedef struct {
40
- long hash;
41
- char *buffer;
42
- long length;
43
- long remaining;
44
- int printed;
45
- } bytestring_t;
46
-
47
- #define RUBY_DOMAIN "ruby.yaml.org,2002"
48
-
49
- /*
50
- * symbols and constants
51
- */
52
- static ID s_new, s_utc, s_at, s_to_f, s_to_i, s_read, s_binmode, s_call, s_cmp, s_transfer, s_update, s_dup, s_haskey, s_match, s_keys, s_unpack, s_tr_bang, s_default_set, s_tag_read_class, s_tag_subclasses, s_resolver, s_push, s_emitter, s_level, s_detect_implicit, s_node_import, s_out, s_input, s_intern, s_transform, s_yaml_new, s_yaml_initialize, s_node_export, s_to_yaml, s_write, s_set_resolver;
53
- static ID s_tags, s_domain, s_kind, s_name, s_options, s_type_id, s_type_id_set, s_style, s_style_set, s_value, s_value_set;
54
- static VALUE sym_model, sym_generic, sym_input, sym_bytecode;
55
- static VALUE sym_scalar, sym_seq, sym_map;
56
- static VALUE sym_1quote, sym_2quote, sym_fold, sym_literal, sym_plain, sym_inline;
57
- static VALUE cDate, cNode, cMap, cSeq, cScalar, cOut, cParser, cResolver, cPrivateType, cDomainType, cYObject, cBadAlias, cDefaultKey, cMergeKey, cEmitter;
58
- static VALUE oDefaultResolver, oGenericResolver;
59
-
60
- /*
61
- * my private collection of numerical oddities.
62
- */
63
- static double S_zero() { return 0.0; }
64
- static double S_one() { return 1.0; }
65
- static double S_inf() { return S_one() / S_zero(); }
66
- static double S_nan() { return S_zero() / S_zero(); }
67
-
68
- static VALUE syck_node_transform( VALUE );
69
-
70
- /*
71
- * handler prototypes
72
- */
73
- SYMID rb_syck_load_handler _((SyckParser *, SyckNode *));
74
- void rb_syck_err_handler _((SyckParser *, char *));
75
- SyckNode * rb_syck_bad_anchor_handler _((SyckParser *, char *));
76
- void rb_syck_output_handler _((SyckEmitter *, char *, long));
77
- void rb_syck_emitter_handler _((SyckEmitter *, st_data_t));
78
- int syck_parser_assign_io _((SyckParser *, VALUE *));
79
- VALUE syck_scalar_alloc _((VALUE class));
80
- VALUE syck_seq_alloc _((VALUE class));
81
- VALUE syck_map_alloc _((VALUE class));
82
-
83
- struct parser_xtra {
84
- VALUE data; /* Borrowed this idea from marshal.c to fix [ruby-core:8067] problem */
85
- VALUE proc;
86
- VALUE resolver;
87
- int taint;
88
- };
89
-
90
- struct emitter_xtra {
91
- VALUE oid;
92
- VALUE data;
93
- VALUE port;
94
- };
95
-
96
- /*
97
- * Convert YAML to bytecode
98
- */
99
- VALUE
100
- rb_syck_compile(self, port)
101
- VALUE self, port;
102
- {
103
- SYMID oid;
104
- int taint;
105
- char *ret;
106
- VALUE bc;
107
- bytestring_t *sav;
108
-
109
- SyckParser *parser = syck_new_parser();
110
- taint = syck_parser_assign_io(parser, &port);
111
- syck_parser_handler( parser, syck_yaml2byte_handler );
112
- syck_parser_error_handler( parser, NULL );
113
- syck_parser_implicit_typing( parser, 0 );
114
- syck_parser_taguri_expansion( parser, 0 );
115
- oid = syck_parse( parser );
116
- syck_lookup_sym( parser, oid, (char **)&sav );
117
-
118
- ret = S_ALLOCA_N( char, strlen( sav->buffer ) + 3 );
119
- ret[0] = '\0';
120
- strcat( ret, "D\n" );
121
- strcat( ret, sav->buffer );
122
-
123
- syck_free_parser( parser );
124
-
125
- bc = rb_str_new2( ret );
126
- if ( taint ) OBJ_TAINT( bc );
127
- return bc;
128
- }
129
-
130
- /*
131
- * read from io.
132
- */
133
- long
134
- rb_syck_io_str_read( char *buf, SyckIoStr *str, long max_size, long skip )
135
- {
136
- long len = 0;
137
-
138
- ASSERT( str != NULL );
139
- max_size -= skip;
140
-
141
- if ( max_size <= 0 ) max_size = 0;
142
- else
143
- {
144
- /*
145
- * call io#read.
146
- */
147
- VALUE src = (VALUE)str->ptr;
148
- VALUE n = LONG2NUM(max_size);
149
- VALUE str2 = rb_funcall2(src, s_read, 1, &n);
150
- if (!NIL_P(str2))
151
- {
152
- StringValue(str2);
153
- len = RSTRING(str2)->len;
154
- memcpy( buf + skip, RSTRING(str2)->ptr, len );
155
- }
156
- }
157
- len += skip;
158
- buf[len] = '\0';
159
- return len;
160
- }
161
-
162
- /*
163
- * determine: are we reading from a string or io?
164
- * (returns tainted? boolean)
165
- */
166
- int
167
- syck_parser_assign_io(parser, pport)
168
- SyckParser *parser;
169
- VALUE *pport;
170
- {
171
- int taint = Qtrue;
172
- VALUE tmp, port = *pport;
173
- if (!NIL_P(tmp = rb_check_string_type(port))) {
174
- taint = OBJ_TAINTED(port); /* original taintedness */
175
- port = tmp;
176
- syck_parser_str( parser, RSTRING(port)->ptr, RSTRING(port)->len, NULL );
177
- }
178
- else if (rb_respond_to(port, s_read)) {
179
- if (rb_respond_to(port, s_binmode)) {
180
- rb_funcall2(port, s_binmode, 0, 0);
181
- }
182
- syck_parser_str( parser, (char *)port, 0, rb_syck_io_str_read );
183
- }
184
- else {
185
- rb_raise(rb_eTypeError, "instance of IO needed");
186
- }
187
- *pport = port;
188
- return taint;
189
- }
190
-
191
- /*
192
- * Get value in hash by key, forcing an empty hash if nil.
193
- */
194
- VALUE
195
- syck_get_hash_aref(hsh, key)
196
- VALUE hsh, key;
197
- {
198
- VALUE val = rb_hash_aref( hsh, key );
199
- if ( NIL_P( val ) )
200
- {
201
- val = rb_hash_new();
202
- rb_hash_aset(hsh, key, val);
203
- }
204
- return val;
205
- }
206
-
207
- /*
208
- * creating timestamps
209
- */
210
- SYMID
211
- rb_syck_mktime(str, len)
212
- char *str;
213
- long len;
214
- {
215
- VALUE time;
216
- char *ptr = str;
217
- VALUE year = INT2FIX(0);
218
- VALUE mon = INT2FIX(0);
219
- VALUE day = INT2FIX(0);
220
- VALUE hour = INT2FIX(0);
221
- VALUE min = INT2FIX(0);
222
- VALUE sec = INT2FIX(0);
223
- long usec;
224
-
225
- /* Year*/
226
- if ( ptr[0] != '\0' && len > 0 ) {
227
- year = INT2FIX(strtol(ptr, NULL, 10));
228
- }
229
-
230
- /* Month*/
231
- ptr += 4;
232
- if ( ptr[0] != '\0' && len > ptr - str ) {
233
- while ( !ISDIGIT( *ptr ) ) ptr++;
234
- mon = INT2FIX(strtol(ptr, NULL, 10));
235
- }
236
-
237
- /* Day*/
238
- ptr += 2;
239
- if ( ptr[0] != '\0' && len > ptr - str ) {
240
- while ( !ISDIGIT( *ptr ) ) ptr++;
241
- day = INT2FIX(strtol(ptr, NULL, 10));
242
- }
243
-
244
- /* Hour*/
245
- ptr += 2;
246
- if ( ptr[0] != '\0' && len > ptr - str ) {
247
- while ( !ISDIGIT( *ptr ) ) ptr++;
248
- hour = INT2FIX(strtol(ptr, NULL, 10));
249
- }
250
-
251
- /* Minute */
252
- ptr += 2;
253
- if ( ptr[0] != '\0' && len > ptr - str ) {
254
- while ( !ISDIGIT( *ptr ) ) ptr++;
255
- min = INT2FIX(strtol(ptr, NULL, 10));
256
- }
257
-
258
- /* Second */
259
- ptr += 2;
260
- if ( ptr[0] != '\0' && len > ptr - str ) {
261
- while ( !ISDIGIT( *ptr ) ) ptr++;
262
- sec = INT2FIX(strtol(ptr, NULL, 10));
263
- }
264
-
265
- /* Millisecond */
266
- ptr += 2;
267
- if ( len > ptr - str && *ptr == '.' )
268
- {
269
- char padded[] = "000000";
270
- char *end = ptr + 1;
271
- while ( isdigit( *end ) ) end++;
272
- MEMCPY(padded, ptr + 1, char, end - (ptr + 1));
273
- usec = strtol(padded, NULL, 10);
274
- }
275
- else
276
- {
277
- usec = 0;
278
- }
279
-
280
- /* Time Zone*/
281
- while ( len > ptr - str && *ptr != 'Z' && *ptr != '+' && *ptr != '-' && *ptr != '\0' ) ptr++;
282
- if ( len > ptr - str && ( *ptr == '-' || *ptr == '+' ) )
283
- {
284
- time_t tz_offset = strtol(ptr, NULL, 10) * 3600;
285
- time_t tmp;
286
-
287
- while ( *ptr != ':' && *ptr != '\0' ) ptr++;
288
- if ( *ptr == ':' )
289
- {
290
- ptr += 1;
291
- if ( tz_offset < 0 )
292
- {
293
- tz_offset -= strtol(ptr, NULL, 10) * 60;
294
- }
295
- else
296
- {
297
- tz_offset += strtol(ptr, NULL, 10) * 60;
298
- }
299
- }
300
-
301
- /* Make TZ time*/
302
- time = rb_funcall(rb_cTime, s_utc, 6, year, mon, day, hour, min, sec);
303
- tmp = NUM2LONG(rb_funcall(time, s_to_i, 0)) - tz_offset;
304
- return rb_funcall(rb_cTime, s_at, 2, LONG2NUM(tmp), LONG2NUM(usec));
305
- }
306
- else
307
- {
308
- /* Make UTC time*/
309
- return rb_funcall(rb_cTime, s_utc, 7, year, mon, day, hour, min, sec, LONG2NUM(usec));
310
- }
311
- }
312
-
313
- /*
314
- * handles merging of an array of hashes
315
- * (see http://www.yaml.org/type/merge/)
316
- */
317
- VALUE
318
- syck_merge_i( entry, hsh )
319
- VALUE entry, hsh;
320
- {
321
- VALUE tmp;
322
- if ( !NIL_P(tmp = rb_check_convert_type(entry, T_HASH, "Hash", "to_hash")) )
323
- {
324
- entry = tmp;
325
- rb_funcall( hsh, s_update, 1, entry );
326
- }
327
- return Qnil;
328
- }
329
-
330
- /*
331
- * default handler for ruby.yaml.org types
332
- */
333
- int
334
- yaml_org_handler( n, ref )
335
- SyckNode *n;
336
- VALUE *ref;
337
- {
338
- char *type_id = n->type_id;
339
- int transferred = 0;
340
- long i = 0;
341
- VALUE obj = Qnil;
342
-
343
- if ( type_id != NULL && strncmp( type_id, "tag:yaml.org,2002:", 18 ) == 0 )
344
- {
345
- type_id += 18;
346
- }
347
-
348
- switch (n->kind)
349
- {
350
- case syck_str_kind:
351
- transferred = 1;
352
- if ( type_id == NULL )
353
- {
354
- obj = rb_str_new( n->data.str->ptr, n->data.str->len );
355
- }
356
- else if ( strcmp( type_id, "null" ) == 0 )
357
- {
358
- obj = Qnil;
359
- }
360
- else if ( strcmp( type_id, "binary" ) == 0 )
361
- {
362
- VALUE arr;
363
- obj = rb_str_new( n->data.str->ptr, n->data.str->len );
364
- rb_funcall( obj, s_tr_bang, 2, rb_str_new2( "\n\t " ), rb_str_new2( "" ) );
365
- arr = rb_funcall( obj, s_unpack, 1, rb_str_new2( "m" ) );
366
- obj = rb_ary_shift( arr );
367
- }
368
- else if ( strcmp( type_id, "bool#yes" ) == 0 )
369
- {
370
- obj = Qtrue;
371
- }
372
- else if ( strcmp( type_id, "bool#no" ) == 0 )
373
- {
374
- obj = Qfalse;
375
- }
376
- else if ( strcmp( type_id, "int#hex" ) == 0 )
377
- {
378
- syck_str_blow_away_commas( n );
379
- obj = rb_cstr2inum( n->data.str->ptr, 16 );
380
- }
381
- else if ( strcmp( type_id, "int#oct" ) == 0 )
382
- {
383
- syck_str_blow_away_commas( n );
384
- obj = rb_cstr2inum( n->data.str->ptr, 8 );
385
- }
386
- else if ( strcmp( type_id, "int#base60" ) == 0 )
387
- {
388
- char *ptr, *end;
389
- long sixty = 1;
390
- long total = 0;
391
- syck_str_blow_away_commas( n );
392
- ptr = n->data.str->ptr;
393
- end = n->data.str->ptr + n->data.str->len;
394
- while ( end > ptr )
395
- {
396
- long bnum = 0;
397
- char *colon = end - 1;
398
- while ( colon >= ptr && *colon != ':' )
399
- {
400
- colon--;
401
- }
402
- if ( colon >= ptr && *colon == ':' ) *colon = '\0';
403
-
404
- bnum = strtol( colon + 1, NULL, 10 );
405
- total += bnum * sixty;
406
- sixty *= 60;
407
- end = colon;
408
- }
409
- obj = INT2FIX(total);
410
- }
411
- else if ( strncmp( type_id, "int", 3 ) == 0 )
412
- {
413
- syck_str_blow_away_commas( n );
414
- obj = rb_cstr2inum( n->data.str->ptr, 10 );
415
- }
416
- else if ( strcmp( type_id, "float#base60" ) == 0 )
417
- {
418
- char *ptr, *end;
419
- long sixty = 1;
420
- double total = 0.0;
421
- syck_str_blow_away_commas( n );
422
- ptr = n->data.str->ptr;
423
- end = n->data.str->ptr + n->data.str->len;
424
- while ( end > ptr )
425
- {
426
- double bnum = 0;
427
- char *colon = end - 1;
428
- while ( colon >= ptr && *colon != ':' )
429
- {
430
- colon--;
431
- }
432
- if ( colon >= ptr && *colon == ':' ) *colon = '\0';
433
-
434
- bnum = strtod( colon + 1, NULL );
435
- total += bnum * sixty;
436
- sixty *= 60;
437
- end = colon;
438
- }
439
- obj = rb_float_new( total );
440
- }
441
- else if ( strcmp( type_id, "float#nan" ) == 0 )
442
- {
443
- obj = rb_float_new( S_nan() );
444
- }
445
- else if ( strcmp( type_id, "float#inf" ) == 0 )
446
- {
447
- obj = rb_float_new( S_inf() );
448
- }
449
- else if ( strcmp( type_id, "float#neginf" ) == 0 )
450
- {
451
- obj = rb_float_new( -S_inf() );
452
- }
453
- else if ( strncmp( type_id, "float", 5 ) == 0 )
454
- {
455
- double f;
456
- syck_str_blow_away_commas( n );
457
- f = strtod( n->data.str->ptr, NULL );
458
- obj = rb_float_new( f );
459
- }
460
- else if ( strcmp( type_id, "timestamp#iso8601" ) == 0 )
461
- {
462
- obj = rb_syck_mktime( n->data.str->ptr, n->data.str->len );
463
- }
464
- else if ( strcmp( type_id, "timestamp#spaced" ) == 0 )
465
- {
466
- obj = rb_syck_mktime( n->data.str->ptr, n->data.str->len );
467
- }
468
- else if ( strcmp( type_id, "timestamp#ymd" ) == 0 )
469
- {
470
- char *ptr = n->data.str->ptr;
471
- VALUE year, mon, day;
472
-
473
- /* Year*/
474
- ptr[4] = '\0';
475
- year = INT2FIX(strtol(ptr, NULL, 10));
476
-
477
- /* Month*/
478
- ptr += 4;
479
- while ( !ISDIGIT( *ptr ) ) ptr++;
480
- mon = INT2FIX(strtol(ptr, NULL, 10));
481
-
482
- /* Day*/
483
- ptr += 2;
484
- while ( !ISDIGIT( *ptr ) ) ptr++;
485
- day = INT2FIX(strtol(ptr, NULL, 10));
486
-
487
- if ( !cDate ) {
488
- /*
489
- * Load Date module
490
- */
491
- rb_require( "date" );
492
- cDate = rb_const_get( rb_cObject, rb_intern("Date") );
493
- }
494
-
495
- obj = rb_funcall( cDate, s_new, 3, year, mon, day );
496
- }
497
- else if ( strncmp( type_id, "timestamp", 9 ) == 0 )
498
- {
499
- obj = rb_syck_mktime( n->data.str->ptr, n->data.str->len );
500
- }
501
- else if ( strncmp( type_id, "merge", 5 ) == 0 )
502
- {
503
- obj = rb_funcall( cMergeKey, s_new, 0 );
504
- }
505
- else if ( strncmp( type_id, "default", 7 ) == 0 )
506
- {
507
- obj = rb_funcall( cDefaultKey, s_new, 0 );
508
- }
509
- else if ( n->data.str->style == scalar_plain &&
510
- n->data.str->len > 1 &&
511
- strncmp( n->data.str->ptr, ":", 1 ) == 0 )
512
- {
513
- obj = rb_funcall( oDefaultResolver, s_transfer, 2,
514
- rb_str_new2( "tag:ruby.yaml.org,2002:sym" ),
515
- rb_str_new( n->data.str->ptr + 1, n->data.str->len - 1 ) );
516
- }
517
- else if ( strcmp( type_id, "str" ) == 0 )
518
- {
519
- obj = rb_str_new( n->data.str->ptr, n->data.str->len );
520
- }
521
- else
522
- {
523
- transferred = 0;
524
- obj = rb_str_new( n->data.str->ptr, n->data.str->len );
525
- }
526
- break;
527
-
528
- case syck_seq_kind:
529
- if ( type_id == NULL || strcmp( type_id, "seq" ) == 0 )
530
- {
531
- transferred = 1;
532
- }
533
- obj = rb_ary_new2( n->data.list->idx );
534
- for ( i = 0; i < n->data.list->idx; i++ )
535
- {
536
- rb_ary_store( obj, i, syck_seq_read( n, i ) );
537
- }
538
- break;
539
-
540
- case syck_map_kind:
541
- if ( type_id == NULL || strcmp( type_id, "map" ) == 0 )
542
- {
543
- transferred = 1;
544
- }
545
- obj = rb_hash_new();
546
- for ( i = 0; i < n->data.pairs->idx; i++ )
547
- {
548
- VALUE k = syck_map_read( n, map_key, i );
549
- VALUE v = syck_map_read( n, map_value, i );
550
- int skip_aset = 0;
551
-
552
- /*
553
- * Handle merge keys
554
- */
555
- if ( rb_obj_is_kind_of( k, cMergeKey ) )
556
- {
557
- VALUE tmp;
558
- if ( !NIL_P(tmp = rb_check_convert_type(v, T_HASH, "Hash", "to_hash")) )
559
- {
560
- VALUE dup = rb_funcall( tmp, s_dup, 0 );
561
- rb_funcall( dup, s_update, 1, obj );
562
- obj = dup;
563
- skip_aset = 1;
564
- }
565
- else if ( !NIL_P(tmp = rb_check_array_type(v)) )
566
- {
567
- VALUE end = rb_ary_pop( tmp );
568
- VALUE tmph = rb_check_convert_type(end, T_HASH, "Hash", "to_hash");
569
- if ( !NIL_P(tmph) )
570
- {
571
- VALUE dup = rb_funcall( tmph, s_dup, 0 );
572
- tmp = rb_ary_reverse( tmp );
573
- rb_ary_push( tmp, obj );
574
- rb_iterate( rb_each, tmp, syck_merge_i, dup );
575
- obj = dup;
576
- skip_aset = 1;
577
- }
578
- }
579
- }
580
- else if ( rb_obj_is_kind_of( k, cDefaultKey ) )
581
- {
582
- rb_funcall( obj, s_default_set, 1, v );
583
- skip_aset = 1;
584
- }
585
-
586
- if ( ! skip_aset )
587
- {
588
- rb_hash_aset( obj, k, v );
589
- }
590
- }
591
- break;
592
- }
593
-
594
- *ref = obj;
595
- return transferred;
596
- }
597
-
598
- static void syck_node_mark( SyckNode *n );
599
-
600
- /*
601
- * {native mode} node handler
602
- * - Converts data into native Ruby types
603
- */
604
- SYMID
605
- rb_syck_load_handler(p, n)
606
- SyckParser *p;
607
- SyckNode *n;
608
- {
609
- VALUE obj = Qnil;
610
- struct parser_xtra *bonus = (struct parser_xtra *)p->bonus;
611
- VALUE resolver = bonus->resolver;
612
- if ( NIL_P( resolver ) )
613
- {
614
- resolver = oDefaultResolver;
615
- }
616
-
617
- /*
618
- * Create node,
619
- */
620
- obj = rb_funcall( resolver, s_node_import, 1, Data_Wrap_Struct( cNode, NULL, NULL, n ) );
621
-
622
- /*
623
- * ID already set, let's alter the symbol table to accept the new object
624
- */
625
- if (n->id > 0 && !NIL_P(obj))
626
- {
627
- MEMCPY((void *)n->id, (void *)obj, RVALUE, 1);
628
- MEMZERO((void *)obj, RVALUE, 1);
629
- obj = n->id;
630
- }
631
-
632
- if ( bonus->taint) OBJ_TAINT( obj );
633
- if ( bonus->proc != 0 ) rb_funcall(bonus->proc, s_call, 1, obj);
634
-
635
- rb_hash_aset(bonus->data, INT2FIX(RHASH(bonus->data)->tbl->num_entries), obj);
636
- return obj;
637
- }
638
-
639
- /*
640
- * friendly errors.
641
- */
642
- void
643
- rb_syck_err_handler(p, msg)
644
- SyckParser *p;
645
- char *msg;
646
- {
647
- char *endl = p->cursor;
648
-
649
- while ( *endl != '\0' && *endl != '\n' )
650
- endl++;
651
-
652
- endl[0] = '\0';
653
- rb_raise(rb_eArgError, "%s on line %d, col %d: `%s'",
654
- msg,
655
- p->linect,
656
- p->cursor - p->lineptr,
657
- p->lineptr);
658
- }
659
-
660
- /*
661
- * provide bad anchor object to the parser.
662
- */
663
- SyckNode *
664
- rb_syck_bad_anchor_handler(p, a)
665
- SyckParser *p;
666
- char *a;
667
- {
668
- VALUE anchor_name = rb_str_new2( a );
669
- SyckNode *badanc = syck_new_map( rb_str_new2( "name" ), anchor_name );
670
- badanc->type_id = syck_strndup( "tag:ruby.yaml.org,2002:object:YAML::Syck::BadAlias", 53 );
671
- return badanc;
672
- }
673
-
674
- /*
675
- * data loaded based on the model requested.
676
- */
677
- void
678
- syck_set_model( p, input, model )
679
- VALUE p, input, model;
680
- {
681
- SyckParser *parser;
682
- Data_Get_Struct(p, SyckParser, parser);
683
- syck_parser_handler( parser, rb_syck_load_handler );
684
- /* WARN: gonna be obsoleted soon!! */
685
- if ( model == sym_generic )
686
- {
687
- rb_funcall( p, s_set_resolver, 1, oGenericResolver );
688
- }
689
- syck_parser_implicit_typing( parser, 1 );
690
- syck_parser_taguri_expansion( parser, 1 );
691
-
692
- if ( NIL_P( input ) )
693
- {
694
- input = rb_ivar_get( p, s_input );
695
- }
696
- if ( input == sym_bytecode )
697
- {
698
- syck_parser_set_input_type( parser, syck_bytecode_utf8 );
699
- }
700
- else
701
- {
702
- syck_parser_set_input_type( parser, syck_yaml_utf8 );
703
- }
704
- syck_parser_error_handler( parser, rb_syck_err_handler );
705
- syck_parser_bad_anchor_handler( parser, rb_syck_bad_anchor_handler );
706
- }
707
-
708
- static int
709
- syck_st_mark_nodes( char *key, SyckNode *n, char *arg )
710
- {
711
- if ( n != (void *)1 ) syck_node_mark( n );
712
- return ST_CONTINUE;
713
- }
714
-
715
- /*
716
- * mark parser nodes
717
- */
718
- static void
719
- syck_mark_parser(parser)
720
- SyckParser *parser;
721
- {
722
- struct parser_xtra *bonus = (struct parser_xtra *)parser->bonus;
723
- rb_gc_mark_maybe(parser->root);
724
- rb_gc_mark_maybe(parser->root_on_error);
725
- rb_gc_mark( bonus->data );
726
- rb_gc_mark( bonus->proc );
727
- rb_gc_mark( bonus->resolver );
728
-
729
- if ( parser->anchors != NULL )
730
- {
731
- st_foreach( parser->anchors, syck_st_mark_nodes, 0 );
732
- }
733
- if ( parser->bad_anchors != NULL )
734
- {
735
- st_foreach( parser->bad_anchors, syck_st_mark_nodes, 0 );
736
- }
737
- }
738
-
739
- /*
740
- * Free the parser and any bonus attachment.
741
- */
742
- void
743
- rb_syck_free_parser(p)
744
- SyckParser *p;
745
- {
746
- S_FREE( p->bonus );
747
- syck_free_parser(p);
748
- }
749
-
750
- /*
751
- * YAML::Syck::Parser.allocate
752
- */
753
- VALUE syck_parser_s_alloc _((VALUE));
754
- VALUE
755
- syck_parser_s_alloc(class)
756
- VALUE class;
757
- {
758
- VALUE pobj;
759
- SyckParser *parser = syck_new_parser();
760
-
761
- parser->bonus = S_ALLOC( struct parser_xtra );
762
- S_MEMZERO( parser->bonus, struct parser_xtra, 1 );
763
-
764
- pobj = Data_Wrap_Struct( class, syck_mark_parser, rb_syck_free_parser, parser );
765
-
766
- syck_parser_set_root_on_error( parser, Qnil );
767
-
768
- return pobj;
769
- }
770
-
771
- /*
772
- * YAML::Syck::Parser.initialize( resolver, options )
773
- */
774
- static VALUE
775
- syck_parser_initialize(argc, argv, self)
776
- int argc;
777
- VALUE *argv;
778
- VALUE self;
779
- {
780
- VALUE options;
781
- if (rb_scan_args(argc, argv, "01", &options) == 0)
782
- {
783
- options = rb_hash_new();
784
- }
785
- else
786
- {
787
- Check_Type(options, T_HASH);
788
- }
789
- rb_ivar_set(self, s_options, options);
790
- rb_ivar_set(self, s_input, Qnil);
791
- return self;
792
- }
793
-
794
- /*
795
- * YAML::Syck::Parser.bufsize = Integer
796
- */
797
- static VALUE
798
- syck_parser_bufsize_set( self, size )
799
- VALUE self, size;
800
- {
801
- SyckParser *parser;
802
-
803
- if ( rb_respond_to( size, s_to_i ) ) {
804
- int n = NUM2INT(rb_funcall(size, s_to_i, 0));
805
- Data_Get_Struct(self, SyckParser, parser);
806
- parser->bufsize = n;
807
- }
808
- return self;
809
- }
810
-
811
- /*
812
- * YAML::Syck::Parser.bufsize => Integer
813
- */
814
- static VALUE
815
- syck_parser_bufsize_get( self )
816
- VALUE self;
817
- {
818
- SyckParser *parser;
819
-
820
- Data_Get_Struct(self, SyckParser, parser);
821
- return INT2FIX( parser->bufsize );
822
- }
823
-
824
- /*
825
- * YAML::Syck::Parser.load( IO or String )
826
- */
827
- VALUE
828
- syck_parser_load(argc, argv, self)
829
- int argc;
830
- VALUE *argv;
831
- VALUE self;
832
- {
833
- VALUE port, proc, model, input;
834
- SyckParser *parser;
835
- struct parser_xtra *bonus;
836
-
837
- rb_scan_args(argc, argv, "11", &port, &proc);
838
-
839
- input = rb_hash_aref( rb_attr_get( self, s_options ), sym_input );
840
- model = rb_hash_aref( rb_attr_get( self, s_options ), sym_model );
841
- Data_Get_Struct(self, SyckParser, parser);
842
- syck_set_model( self, input, model );
843
-
844
- bonus = (struct parser_xtra *)parser->bonus;
845
- bonus->taint = syck_parser_assign_io(parser, &port);
846
- bonus->data = rb_hash_new();
847
- bonus->resolver = rb_attr_get( self, s_resolver );
848
- if ( NIL_P( proc ) ) bonus->proc = 0;
849
- else bonus->proc = proc;
850
-
851
- return syck_parse( parser );
852
- }
853
-
854
- /*
855
- * YAML::Syck::Parser.load_documents( IO or String ) { |doc| }
856
- */
857
- VALUE
858
- syck_parser_load_documents(argc, argv, self)
859
- int argc;
860
- VALUE *argv;
861
- VALUE self;
862
- {
863
- VALUE port, proc, v, input, model;
864
- SyckParser *parser;
865
- struct parser_xtra *bonus;
866
-
867
- rb_scan_args(argc, argv, "1&", &port, &proc);
868
-
869
- input = rb_hash_aref( rb_attr_get( self, s_options ), sym_input );
870
- model = rb_hash_aref( rb_attr_get( self, s_options ), sym_model );
871
- Data_Get_Struct(self, SyckParser, parser);
872
- syck_set_model( self, input, model );
873
-
874
- bonus = (struct parser_xtra *)parser->bonus;
875
- bonus->taint = syck_parser_assign_io(parser, &port);
876
- bonus->resolver = rb_attr_get( self, s_resolver );
877
- bonus->proc = 0;
878
-
879
- while ( 1 )
880
- {
881
- /* Reset hash for tracking nodes */
882
- bonus->data = rb_hash_new();
883
-
884
- /* Parse a document */
885
- v = syck_parse( parser );
886
- if ( parser->eof == 1 )
887
- {
888
- break;
889
- }
890
-
891
- /* Pass document to block */
892
- rb_funcall( proc, s_call, 1, v );
893
- }
894
-
895
- return Qnil;
896
- }
897
-
898
- /*
899
- * YAML::Syck::Parser#set_resolver
900
- */
901
- VALUE
902
- syck_parser_set_resolver( self, resolver )
903
- VALUE self, resolver;
904
- {
905
- rb_ivar_set( self, s_resolver, resolver );
906
- return self;
907
- }
908
-
909
- /*
910
- * YAML::Syck::Resolver.initialize
911
- */
912
- static VALUE
913
- syck_resolver_initialize( self )
914
- VALUE self;
915
- {
916
- VALUE tags = rb_hash_new();
917
- rb_ivar_set(self, s_tags, rb_hash_new());
918
- return self;
919
- }
920
-
921
- /*
922
- * YAML::Syck::Resolver#add_type
923
- */
924
- VALUE
925
- syck_resolver_add_type( self, taguri, cls )
926
- VALUE self, taguri, cls;
927
- {
928
- VALUE tags = rb_attr_get(self, s_tags);
929
- rb_hash_aset( tags, taguri, cls );
930
- return Qnil;
931
- }
932
-
933
- /*
934
- * YAML::Syck::Resolver#use_types_at
935
- */
936
- VALUE
937
- syck_resolver_use_types_at( self, hsh )
938
- VALUE self, hsh;
939
- {
940
- rb_ivar_set( self, s_tags, hsh );
941
- return Qnil;
942
- }
943
-
944
- /*
945
- * YAML::Syck::Resolver#detect_implicit
946
- */
947
- VALUE
948
- syck_resolver_detect_implicit( self, val )
949
- VALUE self, val;
950
- {
951
- char *type_id;
952
- return rb_str_new2( "" );
953
- }
954
-
955
- /*
956
- * YAML::Syck::Resolver#node_import
957
- */
958
- VALUE
959
- syck_resolver_node_import( self, node )
960
- VALUE self, node;
961
- {
962
- SyckNode *n;
963
- VALUE obj;
964
- int i = 0;
965
- Data_Get_Struct(node, SyckNode, n);
966
-
967
- switch (n->kind)
968
- {
969
- case syck_str_kind:
970
- obj = rb_str_new( n->data.str->ptr, n->data.str->len );
971
- break;
972
-
973
- case syck_seq_kind:
974
- obj = rb_ary_new2( n->data.list->idx );
975
- for ( i = 0; i < n->data.list->idx; i++ )
976
- {
977
- rb_ary_store( obj, i, syck_seq_read( n, i ) );
978
- }
979
- break;
980
-
981
- case syck_map_kind:
982
- obj = rb_hash_new();
983
- for ( i = 0; i < n->data.pairs->idx; i++ )
984
- {
985
- VALUE k = syck_map_read( n, map_key, i );
986
- VALUE v = syck_map_read( n, map_value, i );
987
- int skip_aset = 0;
988
-
989
- /*
990
- * Handle merge keys
991
- */
992
- if ( rb_obj_is_kind_of( k, cMergeKey ) )
993
- {
994
- if ( rb_obj_is_kind_of( v, rb_cHash ) )
995
- {
996
- VALUE dup = rb_funcall( v, s_dup, 0 );
997
- rb_funcall( dup, s_update, 1, obj );
998
- obj = dup;
999
- skip_aset = 1;
1000
- }
1001
- else if ( rb_obj_is_kind_of( v, rb_cArray ) )
1002
- {
1003
- VALUE end = rb_ary_pop( v );
1004
- if ( rb_obj_is_kind_of( end, rb_cHash ) )
1005
- {
1006
- VALUE dup = rb_funcall( end, s_dup, 0 );
1007
- v = rb_ary_reverse( v );
1008
- rb_ary_push( v, obj );
1009
- rb_iterate( rb_each, v, syck_merge_i, dup );
1010
- obj = dup;
1011
- skip_aset = 1;
1012
- }
1013
- }
1014
- }
1015
- else if ( rb_obj_is_kind_of( k, cDefaultKey ) )
1016
- {
1017
- rb_funcall( obj, s_default_set, 1, v );
1018
- skip_aset = 1;
1019
- }
1020
-
1021
- if ( ! skip_aset )
1022
- {
1023
- rb_hash_aset( obj, k, v );
1024
- }
1025
- }
1026
- break;
1027
- }
1028
-
1029
- if ( n->type_id != NULL )
1030
- {
1031
- obj = rb_funcall( self, s_transfer, 2, rb_str_new2( n->type_id ), obj );
1032
- }
1033
- return obj;
1034
- }
1035
-
1036
- /*
1037
- * Set instance variables
1038
- */
1039
- VALUE
1040
- syck_set_ivars( vars, obj )
1041
- VALUE vars, obj;
1042
- {
1043
- VALUE ivname = rb_ary_entry( vars, 0 );
1044
- char *ivn;
1045
- StringValue( ivname );
1046
- ivn = S_ALLOCA_N( char, RSTRING(ivname)->len + 2 );
1047
- ivn[0] = '@';
1048
- ivn[1] = '\0';
1049
- strncat( ivn, RSTRING(ivname)->ptr, RSTRING(ivname)->len );
1050
- rb_iv_set( obj, ivn, rb_ary_entry( vars, 1 ) );
1051
- return Qnil;
1052
- }
1053
-
1054
- /*
1055
- * YAML::Syck::Resolver#const_find
1056
- */
1057
- VALUE
1058
- syck_const_find( const_name )
1059
- VALUE const_name;
1060
- {
1061
- VALUE tclass = rb_cObject;
1062
- VALUE tparts = rb_str_split( const_name, "::" );
1063
- int i = 0;
1064
- for ( i = 0; i < RARRAY(tparts)->len; i++ ) {
1065
- VALUE tpart = rb_to_id( rb_ary_entry( tparts, i ) );
1066
- if ( !rb_const_defined( tclass, tpart ) ) return Qnil;
1067
- tclass = rb_const_get( tclass, tpart );
1068
- }
1069
- return tclass;
1070
- }
1071
-
1072
- /*
1073
- * YAML::Syck::Resolver#transfer
1074
- */
1075
- VALUE
1076
- syck_resolver_transfer( self, type, val )
1077
- VALUE self, type, val;
1078
- {
1079
- if (NIL_P(type) || RSTRING(StringValue(type))->len == 0)
1080
- {
1081
- type = rb_funcall( self, s_detect_implicit, 1, val );
1082
- }
1083
-
1084
- if ( ! (NIL_P(type) || RSTRING(StringValue(type))->len == 0) )
1085
- {
1086
- VALUE str_xprivate = rb_str_new2( "x-private" );
1087
- VALUE colon = rb_str_new2( ":" );
1088
- VALUE tags = rb_attr_get(self, s_tags);
1089
- VALUE target_class = rb_hash_aref( tags, type );
1090
- VALUE subclass = target_class;
1091
- VALUE obj = Qnil;
1092
-
1093
- /*
1094
- * Should no tag match exactly, check for subclass format
1095
- */
1096
- if ( NIL_P( target_class ) )
1097
- {
1098
- VALUE subclass_parts = rb_ary_new();
1099
- VALUE parts = rb_str_split( type, ":" );
1100
-
1101
- while ( RARRAY(parts)->len > 1 )
1102
- {
1103
- VALUE partial;
1104
- rb_ary_unshift( subclass_parts, rb_ary_pop( parts ) );
1105
- partial = rb_ary_join( parts, colon );
1106
- target_class = rb_hash_aref( tags, partial );
1107
- if ( NIL_P( target_class ) )
1108
- {
1109
- rb_str_append( partial, colon );
1110
- target_class = rb_hash_aref( tags, partial );
1111
- }
1112
-
1113
- /*
1114
- * Possible subclass found, see if it supports subclassing
1115
- */
1116
- if ( ! NIL_P( target_class ) )
1117
- {
1118
- subclass = target_class;
1119
- if ( RARRAY(subclass_parts)->len > 0 && rb_respond_to( target_class, s_tag_subclasses ) &&
1120
- RTEST( rb_funcall( target_class, s_tag_subclasses, 0 ) ) )
1121
- {
1122
- VALUE subclass_v;
1123
- subclass = rb_ary_join( subclass_parts, colon );
1124
- subclass = rb_funcall( target_class, s_tag_read_class, 1, subclass );
1125
- subclass_v = syck_const_find( subclass );
1126
-
1127
- if ( subclass_v != Qnil )
1128
- {
1129
- subclass = subclass_v;
1130
- }
1131
- else if ( rb_cObject == target_class && subclass_v == Qnil )
1132
- {
1133
- target_class = cYObject;
1134
- type = subclass;
1135
- subclass = cYObject;
1136
- }
1137
- else /* workaround for SEGV. real fix please */
1138
- {
1139
- rb_raise( rb_eTypeError, "invalid subclass" );
1140
- }
1141
- }
1142
- break;
1143
- }
1144
- }
1145
- }
1146
-
1147
- /* rb_raise(rb_eTypeError, "invalid typing scheme: %s given",
1148
- * scheme);
1149
- */
1150
-
1151
- if ( rb_respond_to( target_class, s_call ) )
1152
- {
1153
- obj = rb_funcall( target_class, s_call, 2, type, val );
1154
- }
1155
- else
1156
- {
1157
- if ( rb_respond_to( target_class, s_yaml_new ) )
1158
- {
1159
- obj = rb_funcall( target_class, s_yaml_new, 3, subclass, type, val );
1160
- }
1161
- else if ( !NIL_P( target_class ) )
1162
- {
1163
- if ( subclass == rb_cBignum )
1164
- {
1165
- obj = rb_str2inum( val, 10 ); /* for yaml dumped by 1.8.3 [ruby-core:6159] */
1166
- }
1167
- else
1168
- {
1169
- obj = rb_obj_alloc( subclass );
1170
- }
1171
-
1172
- if ( rb_respond_to( obj, s_yaml_initialize ) )
1173
- {
1174
- rb_funcall( obj, s_yaml_initialize, 2, type, val );
1175
- }
1176
- else if ( !NIL_P( obj ) && rb_obj_is_instance_of( val, rb_cHash ) )
1177
- {
1178
- rb_iterate( rb_each, val, syck_set_ivars, obj );
1179
- }
1180
- }
1181
- else
1182
- {
1183
- VALUE parts = rb_str_split( type, ":" );
1184
- VALUE scheme = rb_ary_shift( parts );
1185
- if ( rb_str_cmp( scheme, str_xprivate ) == 0 )
1186
- {
1187
- VALUE name = rb_ary_join( parts, colon );
1188
- obj = rb_funcall( cPrivateType, s_new, 2, name, val );
1189
- }
1190
- else
1191
- {
1192
- VALUE domain = rb_ary_shift( parts );
1193
- VALUE name = rb_ary_join( parts, colon );
1194
- obj = rb_funcall( cDomainType, s_new, 3, domain, name, val );
1195
- }
1196
- }
1197
- }
1198
- val = obj;
1199
- }
1200
-
1201
- return val;
1202
- }
1203
-
1204
- /*
1205
- * YAML::Syck::Resolver#tagurize
1206
- */
1207
- VALUE
1208
- syck_resolver_tagurize( self, val )
1209
- VALUE self, val;
1210
- {
1211
- VALUE tmp = rb_check_string_type(val);
1212
-
1213
- if ( !NIL_P(tmp) )
1214
- {
1215
- char *taguri = syck_type_id_to_uri( RSTRING(tmp)->ptr );
1216
- val = rb_str_new2( taguri );
1217
- S_FREE( taguri );
1218
- }
1219
-
1220
- return val;
1221
- }
1222
-
1223
- /*
1224
- * YAML::Syck::DefaultResolver#detect_implicit
1225
- */
1226
- VALUE
1227
- syck_defaultresolver_detect_implicit( self, val )
1228
- VALUE self, val;
1229
- {
1230
- char *type_id;
1231
- VALUE tmp = rb_check_string_type(val);
1232
-
1233
- if ( !NIL_P(tmp) )
1234
- {
1235
- val = tmp;
1236
- type_id = syck_match_implicit( RSTRING(val)->ptr, RSTRING(val)->len );
1237
- return rb_str_new2( type_id );
1238
- }
1239
-
1240
- return rb_str_new2( "" );
1241
- }
1242
-
1243
- /*
1244
- * YAML::Syck::DefaultResolver#node_import
1245
- */
1246
- VALUE
1247
- syck_defaultresolver_node_import( self, node )
1248
- VALUE self, node;
1249
- {
1250
- SyckNode *n;
1251
- VALUE obj;
1252
- Data_Get_Struct( node, SyckNode, n );
1253
- if ( !yaml_org_handler( n, &obj ) )
1254
- {
1255
- obj = rb_funcall( self, s_transfer, 2, rb_str_new2( n->type_id ), obj );
1256
- }
1257
- return obj;
1258
- }
1259
-
1260
- /*
1261
- * YAML::Syck::GenericResolver#node_import
1262
- */
1263
- VALUE
1264
- syck_genericresolver_node_import( self, node )
1265
- VALUE self, node;
1266
- {
1267
- SyckNode *n;
1268
- int i = 0;
1269
- VALUE t = Qnil, obj = Qnil, v = Qnil, style = Qnil;
1270
- Data_Get_Struct(node, SyckNode, n);
1271
-
1272
- if ( n->type_id != NULL )
1273
- {
1274
- t = rb_str_new2(n->type_id);
1275
- }
1276
-
1277
- switch (n->kind)
1278
- {
1279
- case syck_str_kind:
1280
- {
1281
- v = rb_str_new( n->data.str->ptr, n->data.str->len );
1282
- if ( n->data.str->style == scalar_1quote )
1283
- {
1284
- style = sym_1quote;
1285
- }
1286
- else if ( n->data.str->style == scalar_2quote )
1287
- {
1288
- style = sym_2quote;
1289
- }
1290
- else if ( n->data.str->style == scalar_fold )
1291
- {
1292
- style = sym_fold;
1293
- }
1294
- else if ( n->data.str->style == scalar_literal )
1295
- {
1296
- style = sym_literal;
1297
- }
1298
- else if ( n->data.str->style == scalar_plain )
1299
- {
1300
- style = sym_plain;
1301
- }
1302
- obj = rb_funcall( cScalar, s_new, 3, t, v, style );
1303
- }
1304
- break;
1305
-
1306
- case syck_seq_kind:
1307
- rb_iv_set(obj, "@kind", sym_seq);
1308
- v = rb_ary_new2( syck_seq_count( n ) );
1309
- for ( i = 0; i < syck_seq_count( n ); i++ )
1310
- {
1311
- rb_ary_store( v, i, syck_seq_read( n, i ) );
1312
- }
1313
- if ( n->data.list->style == seq_inline )
1314
- {
1315
- style = sym_inline;
1316
- }
1317
- obj = rb_funcall( cSeq, s_new, 3, t, v, style );
1318
- break;
1319
-
1320
- case syck_map_kind:
1321
- rb_iv_set(obj, "@kind", sym_map);
1322
- v = rb_hash_new();
1323
- for ( i = 0; i < syck_map_count( n ); i++ )
1324
- {
1325
- rb_hash_aset( v, syck_map_read( n, map_key, i ), syck_map_read( n, map_value, i ) );
1326
- }
1327
- if ( n->data.pairs->style == map_inline )
1328
- {
1329
- style = sym_inline;
1330
- }
1331
- obj = rb_funcall( cMap, s_new, 3, t, v, style );
1332
- break;
1333
- }
1334
-
1335
- return obj;
1336
- }
1337
-
1338
- /*
1339
- * YAML::Syck::BadAlias.initialize
1340
- */
1341
- VALUE
1342
- syck_badalias_initialize( self, val )
1343
- VALUE self, val;
1344
- {
1345
- rb_iv_set( self, "@name", val );
1346
- return self;
1347
- }
1348
-
1349
- /*
1350
- * YAML::Syck::BadAlias.<=>
1351
- */
1352
- VALUE
1353
- syck_badalias_cmp( alias1, alias2 )
1354
- VALUE alias1, alias2;
1355
- {
1356
- VALUE str1 = rb_ivar_get( alias1, s_name );
1357
- VALUE str2 = rb_ivar_get( alias2, s_name );
1358
- VALUE val = rb_funcall( str1, s_cmp, 1, str2 );
1359
- return val;
1360
- }
1361
-
1362
- /*
1363
- * YAML::DomainType.initialize
1364
- */
1365
- VALUE
1366
- syck_domaintype_initialize( self, domain, type_id, val )
1367
- VALUE self, domain, type_id, val;
1368
- {
1369
- rb_iv_set( self, "@domain", domain );
1370
- rb_iv_set( self, "@type_id", type_id );
1371
- rb_iv_set( self, "@value", val );
1372
- return self;
1373
- }
1374
-
1375
- /*
1376
- * YAML::Object.initialize
1377
- */
1378
- VALUE
1379
- syck_yobject_initialize( self, klass, ivars )
1380
- VALUE self, klass, ivars;
1381
- {
1382
- rb_iv_set( self, "@class", klass );
1383
- rb_iv_set( self, "@ivars", ivars );
1384
- return self;
1385
- }
1386
-
1387
- /*
1388
- * YAML::PrivateType.initialize
1389
- */
1390
- VALUE
1391
- syck_privatetype_initialize( self, type_id, val )
1392
- VALUE self, type_id, val;
1393
- {
1394
- rb_iv_set( self, "@type_id", type_id );
1395
- rb_iv_set( self, "@value", val );
1396
- return self;
1397
- }
1398
-
1399
- /*
1400
- * Mark node contents.
1401
- */
1402
- static void
1403
- syck_node_mark( n )
1404
- SyckNode *n;
1405
- {
1406
- int i;
1407
- rb_gc_mark_maybe( n->id );
1408
- switch ( n->kind )
1409
- {
1410
- case syck_seq_kind:
1411
- for ( i = 0; i < n->data.list->idx; i++ )
1412
- {
1413
- rb_gc_mark( syck_seq_read( n, i ) );
1414
- }
1415
- break;
1416
-
1417
- case syck_map_kind:
1418
- for ( i = 0; i < n->data.pairs->idx; i++ )
1419
- {
1420
- rb_gc_mark( syck_map_read( n, map_key, i ) );
1421
- rb_gc_mark( syck_map_read( n, map_value, i ) );
1422
- }
1423
- break;
1424
- }
1425
- #if 0 /* maybe needed */
1426
- if ( n->shortcut ) syck_node_mark( n->shortcut ); /* caution: maybe cyclic */
1427
- #endif
1428
- }
1429
-
1430
- /*
1431
- * YAML::Syck::Scalar.allocate
1432
- */
1433
- VALUE
1434
- syck_scalar_alloc( class )
1435
- VALUE class;
1436
- {
1437
- SyckNode *node = syck_alloc_str();
1438
- VALUE obj = Data_Wrap_Struct( class, syck_node_mark, syck_free_node, node );
1439
- node->id = obj;
1440
- return obj;
1441
- }
1442
-
1443
- /*
1444
- * YAML::Syck::Scalar.initialize
1445
- */
1446
- VALUE
1447
- syck_scalar_initialize( self, type_id, val, style )
1448
- VALUE self, type_id, val, style;
1449
- {
1450
- rb_iv_set( self, "@kind", sym_scalar );
1451
- rb_funcall( self, s_type_id_set, 1, type_id );
1452
- rb_funcall( self, s_value_set, 1, val );
1453
- rb_funcall( self, s_style_set, 1, style );
1454
- return self;
1455
- }
1456
-
1457
- /*
1458
- * YAML::Syck::Scalar.style=
1459
- */
1460
- VALUE
1461
- syck_scalar_style_set( self, style )
1462
- VALUE self, style;
1463
- {
1464
- SyckNode *node;
1465
- Data_Get_Struct( self, SyckNode, node );
1466
-
1467
- if ( NIL_P( style ) )
1468
- {
1469
- node->data.str->style = scalar_none;
1470
- }
1471
- else if ( style == sym_1quote )
1472
- {
1473
- node->data.str->style = scalar_1quote;
1474
- }
1475
- else if ( style == sym_2quote )
1476
- {
1477
- node->data.str->style = scalar_2quote;
1478
- }
1479
- else if ( style == sym_fold )
1480
- {
1481
- node->data.str->style = scalar_fold;
1482
- }
1483
- else if ( style == sym_literal )
1484
- {
1485
- node->data.str->style = scalar_literal;
1486
- }
1487
- else if ( style == sym_plain )
1488
- {
1489
- node->data.str->style = scalar_plain;
1490
- }
1491
-
1492
- rb_iv_set( self, "@style", style );
1493
- return self;
1494
- }
1495
-
1496
- /*
1497
- * YAML::Syck::Scalar.value=
1498
- */
1499
- VALUE
1500
- syck_scalar_value_set( self, val )
1501
- VALUE self, val;
1502
- {
1503
- SyckNode *node;
1504
- Data_Get_Struct( self, SyckNode, node );
1505
-
1506
- StringValue( val );
1507
- node->data.str->ptr = syck_strndup( RSTRING(val)->ptr, RSTRING(val)->len );
1508
- node->data.str->len = RSTRING(val)->len;
1509
- node->data.str->style = scalar_none;
1510
-
1511
- rb_iv_set( self, "@value", val );
1512
- return val;
1513
- }
1514
-
1515
- /*
1516
- * YAML::Syck::Seq.allocate
1517
- */
1518
- VALUE
1519
- syck_seq_alloc( class )
1520
- VALUE class;
1521
- {
1522
- SyckNode *node;
1523
- VALUE obj;
1524
- node = syck_alloc_seq();
1525
- obj = Data_Wrap_Struct( class, syck_node_mark, syck_free_node, node );
1526
- node->id = obj;
1527
- return obj;
1528
- }
1529
-
1530
- /*
1531
- * YAML::Syck::Seq.initialize
1532
- */
1533
- VALUE
1534
- syck_seq_initialize( self, type_id, val, style )
1535
- VALUE self, type_id, val, style;
1536
- {
1537
- SyckNode *node;
1538
- Data_Get_Struct( self, SyckNode, node );
1539
-
1540
- rb_iv_set( self, "@kind", sym_seq );
1541
- rb_funcall( self, s_type_id_set, 1, type_id );
1542
- rb_funcall( self, s_value_set, 1, val );
1543
- rb_funcall( self, s_style_set, 1, style );
1544
- return self;
1545
- }
1546
-
1547
- /*
1548
- * YAML::Syck::Seq.value=
1549
- */
1550
- VALUE
1551
- syck_seq_value_set( self, val )
1552
- VALUE self, val;
1553
- {
1554
- SyckNode *node;
1555
- Data_Get_Struct( self, SyckNode, node );
1556
-
1557
- val = rb_check_array_type( val );
1558
- if ( !NIL_P( val ) ) {
1559
- int i;
1560
- syck_seq_empty( node );
1561
- for ( i = 0; i < RARRAY( val )->len; i++ )
1562
- {
1563
- syck_seq_add( node, rb_ary_entry(val, i) );
1564
- }
1565
- }
1566
-
1567
- rb_iv_set( self, "@value", val );
1568
- return val;
1569
- }
1570
-
1571
- /*
1572
- * YAML::Syck::Seq.add
1573
- */
1574
- VALUE
1575
- syck_seq_add_m( self, val )
1576
- VALUE self, val;
1577
- {
1578
- SyckNode *node;
1579
- VALUE emitter = rb_ivar_get( self, s_emitter );
1580
- Data_Get_Struct( self, SyckNode, node );
1581
-
1582
- if ( rb_respond_to( emitter, s_node_export ) ) {
1583
- val = rb_funcall( emitter, s_node_export, 1, val );
1584
- }
1585
- syck_seq_add( node, val );
1586
- rb_ary_push( rb_ivar_get( self, s_value ), val );
1587
-
1588
- return self;
1589
- }
1590
-
1591
- /*
1592
- * YAML::Syck::Seq.style=
1593
- */
1594
- VALUE
1595
- syck_seq_style_set( self, style )
1596
- VALUE self, style;
1597
- {
1598
- SyckNode *node;
1599
- Data_Get_Struct( self, SyckNode, node );
1600
-
1601
- if ( style == sym_inline )
1602
- {
1603
- node->data.list->style = seq_inline;
1604
- }
1605
- else
1606
- {
1607
- node->data.list->style = seq_none;
1608
- }
1609
-
1610
- rb_iv_set( self, "@style", style );
1611
- return self;
1612
- }
1613
-
1614
- /*
1615
- * YAML::Syck::Map.allocate
1616
- */
1617
- VALUE
1618
- syck_map_alloc( class )
1619
- VALUE class;
1620
- {
1621
- SyckNode *node;
1622
- VALUE obj;
1623
- node = syck_alloc_map();
1624
- obj = Data_Wrap_Struct( class, syck_node_mark, syck_free_node, node );
1625
- node->id = obj;
1626
- return obj;
1627
- }
1628
-
1629
- /*
1630
- * YAML::Syck::Map.initialize
1631
- */
1632
- VALUE
1633
- syck_map_initialize( self, type_id, val, style )
1634
- VALUE self, type_id, val, style;
1635
- {
1636
- SyckNode *node;
1637
- Data_Get_Struct( self, SyckNode, node );
1638
-
1639
- if ( !NIL_P( val ) )
1640
- {
1641
- VALUE hsh = rb_check_convert_type(val, T_HASH, "Hash", "to_hash");
1642
- VALUE keys;
1643
- int i;
1644
- if ( NIL_P(hsh) )
1645
- {
1646
- rb_raise( rb_eTypeError, "wrong argument type" );
1647
- }
1648
-
1649
- keys = rb_funcall( hsh, s_keys, 0 );
1650
- for ( i = 0; i < RARRAY(keys)->len; i++ )
1651
- {
1652
- VALUE key = rb_ary_entry(keys, i);
1653
- syck_map_add( node, key, rb_hash_aref(hsh, key) );
1654
- }
1655
- }
1656
-
1657
- rb_iv_set( self, "@kind", sym_seq );
1658
- rb_funcall( self, s_type_id_set, 1, type_id );
1659
- rb_funcall( self, s_value_set, 1, val );
1660
- rb_funcall( self, s_style_set, 1, style );
1661
- return self;
1662
- }
1663
-
1664
- /*
1665
- * YAML::Syck::Map.value=
1666
- */
1667
- VALUE
1668
- syck_map_value_set( self, val )
1669
- VALUE self, val;
1670
- {
1671
- SyckNode *node;
1672
- Data_Get_Struct( self, SyckNode, node );
1673
-
1674
- if ( !NIL_P( val ) )
1675
- {
1676
- VALUE hsh = rb_check_convert_type(val, T_HASH, "Hash", "to_hash");
1677
- VALUE keys;
1678
- int i;
1679
- if ( NIL_P(hsh) )
1680
- {
1681
- rb_raise( rb_eTypeError, "wrong argument type" );
1682
- }
1683
-
1684
- syck_map_empty( node );
1685
- keys = rb_funcall( hsh, s_keys, 0 );
1686
- for ( i = 0; i < RARRAY(keys)->len; i++ )
1687
- {
1688
- VALUE key = rb_ary_entry(keys, i);
1689
- syck_map_add( node, key, rb_hash_aref(hsh, key) );
1690
- }
1691
- }
1692
-
1693
- rb_iv_set( self, "@value", val );
1694
- return val;
1695
- }
1696
-
1697
- /*
1698
- * YAML::Syck::Map.add
1699
- */
1700
- VALUE
1701
- syck_map_add_m( self, key, val )
1702
- VALUE self, key, val;
1703
- {
1704
- SyckNode *node;
1705
- VALUE emitter = rb_ivar_get( self, s_emitter );
1706
- Data_Get_Struct( self, SyckNode, node );
1707
-
1708
- if ( rb_respond_to( emitter, s_node_export ) ) {
1709
- key = rb_funcall( emitter, s_node_export, 1, key );
1710
- val = rb_funcall( emitter, s_node_export, 1, val );
1711
- }
1712
- syck_map_add( node, key, val );
1713
- rb_hash_aset( rb_ivar_get( self, s_value ), key, val );
1714
-
1715
- return self;
1716
- }
1717
-
1718
- /*
1719
- * YAML::Syck::Map.style=
1720
- */
1721
- VALUE
1722
- syck_map_style_set( self, style )
1723
- VALUE self, style;
1724
- {
1725
- SyckNode *node;
1726
- Data_Get_Struct( self, SyckNode, node );
1727
-
1728
- if ( style == sym_inline )
1729
- {
1730
- node->data.pairs->style = map_inline;
1731
- }
1732
- else
1733
- {
1734
- node->data.pairs->style = map_none;
1735
- }
1736
-
1737
- rb_iv_set( self, "@style", style );
1738
- return self;
1739
- }
1740
-
1741
- /*
1742
- * Cloning method for all node types
1743
- */
1744
- VALUE
1745
- syck_node_init_copy( copy, orig )
1746
- VALUE copy, orig;
1747
- {
1748
- SyckNode *copy_n;
1749
- SyckNode *orig_n;
1750
-
1751
- if ( copy == orig )
1752
- return copy;
1753
-
1754
- if ( TYPE( orig ) != T_DATA )
1755
- {
1756
- rb_raise( rb_eTypeError, "wrong argument type" );
1757
- }
1758
-
1759
- Data_Get_Struct( orig, SyckNode, orig_n );
1760
- Data_Get_Struct( copy, SyckNode, copy_n );
1761
- MEMCPY( copy_n, orig_n, SyckNode, 1 );
1762
- return copy;
1763
- }
1764
-
1765
- /*
1766
- * YAML::Syck::Node#type_id=
1767
- */
1768
- VALUE
1769
- syck_node_type_id_set( self, type_id )
1770
- VALUE self, type_id;
1771
- {
1772
- SyckNode *node;
1773
- Data_Get_Struct( self, SyckNode, node );
1774
-
1775
- S_FREE( node->type_id );
1776
-
1777
- if ( !NIL_P( type_id ) ) {
1778
- StringValue( type_id );
1779
- node->type_id = syck_strndup( RSTRING(type_id)->ptr, RSTRING(type_id)->len );
1780
- }
1781
-
1782
- rb_iv_set( self, "@type_id", type_id );
1783
- return type_id;
1784
- }
1785
-
1786
- /*
1787
- * YAML::Syck::Node.transform
1788
- */
1789
- VALUE
1790
- syck_node_transform( self )
1791
- VALUE self;
1792
- {
1793
- VALUE t;
1794
- SyckNode *n;
1795
- SyckNode *orig_n;
1796
- Data_Get_Struct(self, SyckNode, orig_n);
1797
- t = Data_Wrap_Struct( cNode, syck_node_mark, syck_free_node, 0 );
1798
-
1799
- switch (orig_n->kind)
1800
- {
1801
- case syck_map_kind:
1802
- {
1803
- int i;
1804
- DATA_PTR(t) = n = syck_alloc_map();
1805
- for ( i = 0; i < orig_n->data.pairs->idx; i++ )
1806
- {
1807
- syck_map_add( n, rb_funcall( syck_map_read( orig_n, map_key, i ), s_transform, 0 ),
1808
- rb_funcall( syck_map_read( orig_n, map_value, i ), s_transform, 0 ) );
1809
- }
1810
- }
1811
- break;
1812
-
1813
- case syck_seq_kind:
1814
- {
1815
- int i;
1816
- DATA_PTR(t) = n = syck_alloc_seq();
1817
- for ( i = 0; i < orig_n->data.list->idx; i++ )
1818
- {
1819
- syck_seq_add( n, rb_funcall( syck_seq_read( orig_n, i ), s_transform, 0 ) );
1820
- }
1821
- }
1822
- break;
1823
-
1824
- case syck_str_kind:
1825
- DATA_PTR(t) = n = syck_new_str2( orig_n->data.str->ptr, orig_n->data.str->len, orig_n->data.str->style );
1826
- break;
1827
- }
1828
-
1829
- if ( orig_n->type_id != NULL )
1830
- {
1831
- n->type_id = syck_strndup( orig_n->type_id, strlen( orig_n->type_id ) );
1832
- }
1833
- if ( orig_n->anchor != NULL )
1834
- {
1835
- n->anchor = syck_strndup( orig_n->anchor, strlen( orig_n->anchor ) );
1836
- }
1837
- n->id = t;
1838
- return rb_funcall( oDefaultResolver, s_node_import, 1, t );
1839
- }
1840
-
1841
- /*
1842
- * Emitter callback: assembles YAML document events from
1843
- * Ruby symbols. This is a brilliant way to do it.
1844
- * No one could possibly object.
1845
- */
1846
- void
1847
- rb_syck_emitter_handler(e, data)
1848
- SyckEmitter *e;
1849
- st_data_t data;
1850
- {
1851
- SyckNode *n;
1852
- Data_Get_Struct((VALUE)data, SyckNode, n);
1853
-
1854
- switch (n->kind)
1855
- {
1856
- case syck_map_kind:
1857
- {
1858
- int i;
1859
- syck_emit_map( e, n->type_id, n->data.pairs->style );
1860
- for ( i = 0; i < n->data.pairs->idx; i++ )
1861
- {
1862
- syck_emit_item( e, syck_map_read( n, map_key, i ) );
1863
- syck_emit_item( e, syck_map_read( n, map_value, i ) );
1864
- }
1865
- syck_emit_end( e );
1866
- }
1867
- break;
1868
-
1869
- case syck_seq_kind:
1870
- {
1871
- int i;
1872
- syck_emit_seq( e, n->type_id, n->data.list->style );
1873
- for ( i = 0; i < n->data.list->idx; i++ )
1874
- {
1875
- syck_emit_item( e, syck_seq_read( n, i ) );
1876
- }
1877
- syck_emit_end( e );
1878
- }
1879
- break;
1880
-
1881
- case syck_str_kind:
1882
- {
1883
- syck_emit_scalar( e, n->type_id, n->data.str->style, 0, 0, 0, n->data.str->ptr, n->data.str->len );
1884
- }
1885
- break;
1886
- }
1887
- }
1888
-
1889
- /*
1890
- * Handle output from the emitter
1891
- */
1892
- void
1893
- rb_syck_output_handler( emitter, str, len )
1894
- SyckEmitter *emitter;
1895
- char *str;
1896
- long len;
1897
- {
1898
- struct emitter_xtra *bonus = (struct emitter_xtra *)emitter->bonus;
1899
- VALUE dest = bonus->port;
1900
- if (TYPE(dest) == T_STRING) {
1901
- rb_str_cat( dest, str, len );
1902
- } else {
1903
- rb_io_write( dest, rb_str_new( str, len ) );
1904
- }
1905
- }
1906
-
1907
- /*
1908
- * Helper function for marking nodes in the anchor
1909
- * symbol table.
1910
- */
1911
- void
1912
- syck_out_mark( emitter, node )
1913
- VALUE emitter, node;
1914
- {
1915
- SyckEmitter *emitterPtr;
1916
- struct emitter_xtra *bonus;
1917
- Data_Get_Struct(emitter, SyckEmitter, emitterPtr);
1918
- bonus = (struct emitter_xtra *)emitterPtr->bonus;
1919
- rb_ivar_set( node, s_emitter, emitter );
1920
- /* syck_emitter_mark_node( emitterPtr, (st_data_t)node ); */
1921
- if ( !NIL_P( bonus->oid ) ) {
1922
- rb_hash_aset( bonus->data, bonus->oid, node );
1923
- }
1924
- }
1925
-
1926
- /*
1927
- * Mark emitter values.
1928
- */
1929
- static void
1930
- syck_mark_emitter(emitter)
1931
- SyckEmitter *emitter;
1932
- {
1933
- struct emitter_xtra *bonus = (struct emitter_xtra *)emitter->bonus;
1934
- rb_gc_mark( bonus->oid );
1935
- rb_gc_mark( bonus->data );
1936
- rb_gc_mark( bonus->port );
1937
- }
1938
-
1939
- /*
1940
- * Free the emitter and any bonus attachment.
1941
- */
1942
- void
1943
- rb_syck_free_emitter(e)
1944
- SyckEmitter *e;
1945
- {
1946
- S_FREE( e->bonus );
1947
- syck_free_emitter(e);
1948
- }
1949
-
1950
- /*
1951
- * YAML::Syck::Emitter.allocate
1952
- */
1953
- VALUE syck_emitter_s_alloc _((VALUE));
1954
- VALUE
1955
- syck_emitter_s_alloc(class)
1956
- VALUE class;
1957
- {
1958
- VALUE pobj;
1959
- SyckEmitter *emitter = syck_new_emitter();
1960
-
1961
- emitter->bonus = S_ALLOC( struct emitter_xtra );
1962
- S_MEMZERO( emitter->bonus, struct emitter_xtra, 1 );
1963
-
1964
- pobj = Data_Wrap_Struct( class, syck_mark_emitter, rb_syck_free_emitter, emitter );
1965
- syck_emitter_handler( emitter, rb_syck_emitter_handler );
1966
- syck_output_handler( emitter, rb_syck_output_handler );
1967
-
1968
- rb_ivar_set( pobj, s_out, rb_funcall( cOut, s_new, 1, pobj ) );
1969
- return pobj;
1970
- }
1971
-
1972
- /*
1973
- * YAML::Syck::Emitter.reset( options )
1974
- */
1975
- VALUE
1976
- syck_emitter_reset( argc, argv, self )
1977
- int argc;
1978
- VALUE *argv;
1979
- VALUE self;
1980
- {
1981
- VALUE options, tmp;
1982
- SyckEmitter *emitter;
1983
- struct emitter_xtra *bonus;
1984
-
1985
- Data_Get_Struct(self, SyckEmitter, emitter);
1986
- bonus = (struct emitter_xtra *)emitter->bonus;
1987
-
1988
- bonus->oid = Qnil;
1989
- bonus->port = rb_str_new2( "" );
1990
- bonus->data = rb_hash_new();
1991
-
1992
- if (rb_scan_args(argc, argv, "01", &options) == 0)
1993
- {
1994
- options = rb_hash_new();
1995
- rb_ivar_set(self, s_options, options);
1996
- }
1997
- else if ( !NIL_P(tmp = rb_check_string_type(options)) )
1998
- {
1999
- bonus->port = tmp;
2000
- }
2001
- else if ( rb_respond_to( options, s_write ) )
2002
- {
2003
- bonus->port = options;
2004
- }
2005
- else
2006
- {
2007
- Check_Type(options, T_HASH);
2008
- rb_ivar_set(self, s_options, options);
2009
- }
2010
-
2011
- emitter->headless = 0;
2012
- rb_ivar_set(self, s_level, INT2FIX(0));
2013
- rb_ivar_set(self, s_resolver, Qnil);
2014
- return self;
2015
- }
2016
-
2017
- /*
2018
- * YAML::Syck::Emitter.emit( object_id ) { |out| ... }
2019
- */
2020
- VALUE
2021
- syck_emitter_emit( argc, argv, self )
2022
- int argc;
2023
- VALUE *argv;
2024
- VALUE self;
2025
- {
2026
- VALUE oid, proc;
2027
- char *anchor_name;
2028
- SyckEmitter *emitter;
2029
- struct emitter_xtra *bonus;
2030
- SYMID symple;
2031
- int level = FIX2INT(rb_ivar_get(self, s_level)) + 1;
2032
- rb_ivar_set(self, s_level, INT2FIX(level));
2033
-
2034
- rb_scan_args(argc, argv, "1&", &oid, &proc);
2035
- Data_Get_Struct(self, SyckEmitter, emitter);
2036
- bonus = (struct emitter_xtra *)emitter->bonus;
2037
-
2038
- /* Calculate anchors, normalize nodes, build a simpler symbol table */
2039
- bonus->oid = oid;
2040
- if ( !NIL_P( oid ) && RTEST( rb_funcall( bonus->data, s_haskey, 1, oid ) ) ) {
2041
- symple = rb_hash_aref( bonus->data, oid );
2042
- } else {
2043
- symple = rb_funcall( proc, s_call, 1, rb_ivar_get( self, s_out ) );
2044
- }
2045
- syck_emitter_mark_node( emitter, (st_data_t)symple );
2046
-
2047
- /* Second pass, build emitted string */
2048
- level -= 1;
2049
- rb_ivar_set(self, s_level, INT2FIX(level));
2050
- if ( level == 0 )
2051
- {
2052
- syck_emit(emitter, (st_data_t)symple);
2053
- syck_emitter_flush(emitter, 0);
2054
-
2055
- return bonus->port;
2056
- }
2057
-
2058
- return symple;
2059
- }
2060
-
2061
- /*
2062
- * YAML::Syck::Emitter#node_export
2063
- */
2064
- VALUE
2065
- syck_emitter_node_export( self, node )
2066
- VALUE self, node;
2067
- {
2068
- return rb_funcall( node, s_to_yaml, 1, self );
2069
- }
2070
-
2071
- /*
2072
- * YAML::Syck::Emitter#set_resolver
2073
- */
2074
- VALUE
2075
- syck_emitter_set_resolver( self, resolver )
2076
- VALUE self, resolver;
2077
- {
2078
- rb_ivar_set( self, s_resolver, resolver );
2079
- return self;
2080
- }
2081
-
2082
- /*
2083
- * YAML::Syck::Out::initialize
2084
- */
2085
- VALUE
2086
- syck_out_initialize( self, emitter )
2087
- VALUE self, emitter;
2088
- {
2089
- rb_ivar_set( self, s_emitter, emitter );
2090
- return self;
2091
- }
2092
-
2093
- /*
2094
- * YAML::Syck::Out::map
2095
- */
2096
- VALUE
2097
- syck_out_map( argc, argv, self )
2098
- int argc;
2099
- VALUE *argv;
2100
- VALUE self;
2101
- {
2102
- VALUE type_id, style, map;
2103
- if (rb_scan_args(argc, argv, "11", &type_id, &style) == 1) {
2104
- style = Qnil;
2105
- }
2106
- map = rb_funcall( cMap, s_new, 3, type_id, rb_hash_new(), style );
2107
- syck_out_mark( rb_ivar_get( self, s_emitter ), map );
2108
- rb_yield( map );
2109
- return map;
2110
- }
2111
-
2112
- /*
2113
- * YAML::Syck::Out::seq
2114
- */
2115
- VALUE
2116
- syck_out_seq( argc, argv, self )
2117
- int argc;
2118
- VALUE *argv;
2119
- VALUE self;
2120
- {
2121
- VALUE type_id, style, seq;
2122
- if (rb_scan_args(argc, argv, "11", &type_id, &style) == 1) {
2123
- style = Qnil;
2124
- }
2125
- seq = rb_funcall( cSeq, s_new, 3, type_id, rb_ary_new(), style );
2126
- syck_out_mark( rb_ivar_get( self, s_emitter ), seq );
2127
- rb_yield( seq );
2128
- return seq;
2129
- }
2130
-
2131
- /*
2132
- * YAML::Syck::Out::scalar
2133
- syck_out_scalar( self, type_id, str, style )
2134
- VALUE self, type_id, str, style;
2135
- */
2136
- VALUE
2137
- syck_out_scalar( argc, argv, self )
2138
- int argc;
2139
- VALUE *argv;
2140
- VALUE self;
2141
- {
2142
- VALUE type_id, str, style, scalar;
2143
- if (rb_scan_args(argc, argv, "21", &type_id, &str, &style) == 2) {
2144
- style = Qnil;
2145
- }
2146
- scalar = rb_funcall( cScalar, s_new, 3, type_id, str, style );
2147
- syck_out_mark( rb_ivar_get( self, s_emitter ), scalar );
2148
- return scalar;
2149
- }
2150
-
2151
- /*
2152
- * Initialize Syck extension
2153
- */
2154
- void
2155
- Init_syck()
2156
- {
2157
- VALUE rb_yaml = rb_define_module( "YAML" );
2158
- VALUE rb_syck = rb_define_module_under( rb_yaml, "Syck" );
2159
- rb_define_const( rb_syck, "VERSION", rb_str_new2( SYCK_VERSION ) );
2160
- rb_define_module_function( rb_syck, "compile", rb_syck_compile, 1 );
2161
-
2162
- /*
2163
- * Global symbols
2164
- */
2165
- s_new = rb_intern("new");
2166
- s_utc = rb_intern("utc");
2167
- s_at = rb_intern("at");
2168
- s_to_f = rb_intern("to_f");
2169
- s_to_i = rb_intern("to_i");
2170
- s_read = rb_intern("read");
2171
- s_binmode = rb_intern("binmode");
2172
- s_transfer = rb_intern("transfer");
2173
- s_call = rb_intern("call");
2174
- s_cmp = rb_intern("<=>");
2175
- s_intern = rb_intern("intern");
2176
- s_update = rb_intern("update");
2177
- s_detect_implicit = rb_intern("detect_implicit");
2178
- s_dup = rb_intern("dup");
2179
- s_default_set = rb_intern("default=");
2180
- s_match = rb_intern("match");
2181
- s_push = rb_intern("push");
2182
- s_haskey = rb_intern("has_key?");
2183
- s_keys = rb_intern("keys");
2184
- s_node_import = rb_intern("node_import");
2185
- s_tr_bang = rb_intern("tr!");
2186
- s_unpack = rb_intern("unpack");
2187
- s_write = rb_intern("write");
2188
- s_tag_read_class = rb_intern( "yaml_tag_read_class" );
2189
- s_tag_subclasses = rb_intern( "yaml_tag_subclasses?" );
2190
- s_emitter = rb_intern( "emitter" );
2191
- s_set_resolver = rb_intern( "set_resolver" );
2192
- s_node_export = rb_intern( "node_export" );
2193
- s_to_yaml = rb_intern( "to_yaml" );
2194
- s_transform = rb_intern( "transform" );
2195
- s_yaml_new = rb_intern("yaml_new");
2196
- s_yaml_initialize = rb_intern("yaml_initialize");
2197
-
2198
- s_tags = rb_intern("@tags");
2199
- s_name = rb_intern("@name");
2200
- s_options = rb_intern("@options");
2201
- s_kind = rb_intern("@kind");
2202
- s_type_id = rb_intern("@type_id");
2203
- s_type_id_set = rb_intern("type_id=");
2204
- s_resolver = rb_intern("@resolver");
2205
- s_level = rb_intern( "@level" );
2206
- s_style = rb_intern("@style");
2207
- s_style_set = rb_intern("style=");
2208
- s_value = rb_intern("@value");
2209
- s_value_set = rb_intern("value=");
2210
- s_out = rb_intern("@out");
2211
- s_input = rb_intern("@input");
2212
-
2213
- sym_model = ID2SYM(rb_intern("Model"));
2214
- sym_generic = ID2SYM(rb_intern("Generic"));
2215
- sym_bytecode = ID2SYM(rb_intern("bytecode"));
2216
- sym_map = ID2SYM(rb_intern("map"));
2217
- sym_scalar = ID2SYM(rb_intern("scalar"));
2218
- sym_seq = ID2SYM(rb_intern("seq"));
2219
- sym_1quote = ID2SYM(rb_intern("quote1"));
2220
- sym_2quote = ID2SYM(rb_intern("quote2"));
2221
- sym_fold = ID2SYM(rb_intern("fold"));
2222
- sym_literal = ID2SYM(rb_intern("literal"));
2223
- sym_plain = ID2SYM(rb_intern("plain"));
2224
- sym_inline = ID2SYM(rb_intern("inline"));
2225
-
2226
- /*
2227
- * Define YAML::Syck::Resolver class
2228
- */
2229
- cResolver = rb_define_class_under( rb_syck, "Resolver", rb_cObject );
2230
- rb_define_attr( cResolver, "tags", 1, 1 );
2231
- rb_define_method( cResolver, "initialize", syck_resolver_initialize, 0 );
2232
- rb_define_method( cResolver, "add_type", syck_resolver_add_type, 2 );
2233
- rb_define_method( cResolver, "use_types_at", syck_resolver_use_types_at, 1 );
2234
- rb_define_method( cResolver, "detect_implicit", syck_resolver_detect_implicit, 1 );
2235
- rb_define_method( cResolver, "transfer", syck_resolver_transfer, 2 );
2236
- rb_define_method( cResolver, "node_import", syck_resolver_node_import, 1 );
2237
- rb_define_method( cResolver, "tagurize", syck_resolver_tagurize, 1 );
2238
-
2239
- rb_global_variable( &oDefaultResolver );
2240
- oDefaultResolver = rb_funcall( cResolver, rb_intern( "new" ), 0 );
2241
- rb_define_singleton_method( oDefaultResolver, "node_import", syck_defaultresolver_node_import, 1 );
2242
- rb_define_singleton_method( oDefaultResolver, "detect_implicit", syck_defaultresolver_detect_implicit, 1 );
2243
- rb_define_const( rb_syck, "DefaultResolver", oDefaultResolver );
2244
- rb_global_variable( &oGenericResolver );
2245
- oGenericResolver = rb_funcall( cResolver, rb_intern( "new" ), 0 );
2246
- rb_define_singleton_method( oGenericResolver, "node_import", syck_genericresolver_node_import, 1 );
2247
- rb_define_const( rb_syck, "GenericResolver", oGenericResolver );
2248
-
2249
- /*
2250
- * Define YAML::Syck::Parser class
2251
- */
2252
- cParser = rb_define_class_under( rb_syck, "Parser", rb_cObject );
2253
- rb_define_attr( cParser, "options", 1, 1 );
2254
- rb_define_attr( cParser, "resolver", 1, 1 );
2255
- rb_define_attr( cParser, "input", 1, 1 );
2256
- rb_define_alloc_func( cParser, syck_parser_s_alloc );
2257
- rb_define_method(cParser, "initialize", syck_parser_initialize, -1 );
2258
- rb_define_method(cParser, "bufsize=", syck_parser_bufsize_set, 1 );
2259
- rb_define_method(cParser, "bufsize", syck_parser_bufsize_get, 0 );
2260
- rb_define_method(cParser, "load", syck_parser_load, -1);
2261
- rb_define_method(cParser, "load_documents", syck_parser_load_documents, -1);
2262
- rb_define_method(cParser, "set_resolver", syck_parser_set_resolver, 1);
2263
-
2264
- /*
2265
- * Define YAML::Syck::Node class
2266
- */
2267
- cNode = rb_define_class_under( rb_syck, "Node", rb_cObject );
2268
- rb_define_method( cNode, "initialize_copy", syck_node_init_copy, 1 );
2269
- rb_define_attr( cNode, "emitter", 1, 1 );
2270
- rb_define_attr( cNode, "resolver", 1, 1 );
2271
- rb_define_attr( cNode, "kind", 1, 0 );
2272
- rb_define_attr( cNode, "type_id", 1, 0 );
2273
- rb_define_attr( cNode, "value", 1, 0 );
2274
- rb_define_method( cNode, "type_id=", syck_node_type_id_set, 1 );
2275
- rb_define_method( cNode, "transform", syck_node_transform, 0);
2276
-
2277
- /*
2278
- * Define YAML::Syck::Scalar, YAML::Syck::Seq, YAML::Syck::Map --
2279
- * all are the publicly usable variants of YAML::Syck::Node
2280
- */
2281
- cScalar = rb_define_class_under( rb_syck, "Scalar", cNode );
2282
- rb_define_alloc_func( cScalar, syck_scalar_alloc );
2283
- rb_define_attr( cNode, "value", 1, 0 );
2284
- rb_define_method( cScalar, "initialize", syck_scalar_initialize, 3 );
2285
- rb_define_method( cScalar, "value=", syck_scalar_value_set, 1 );
2286
- rb_define_method( cScalar, "style=", syck_scalar_style_set, 1 );
2287
- cSeq = rb_define_class_under( rb_syck, "Seq", cNode );
2288
- rb_define_alloc_func( cSeq, syck_seq_alloc );
2289
- rb_define_method( cSeq, "initialize", syck_seq_initialize, 3 );
2290
- rb_define_method( cSeq, "value=", syck_seq_value_set, 1 );
2291
- rb_define_method( cSeq, "add", syck_seq_add_m, 1 );
2292
- rb_define_method( cSeq, "style=", syck_seq_style_set, 1 );
2293
- cMap = rb_define_class_under( rb_syck, "Map", cNode );
2294
- rb_define_alloc_func( cMap, syck_map_alloc );
2295
- rb_define_method( cMap, "initialize", syck_map_initialize, 3 );
2296
- rb_define_method( cMap, "value=", syck_map_value_set, 1 );
2297
- rb_define_method( cMap, "add", syck_map_add_m, 2 );
2298
- rb_define_method( cMap, "style=", syck_map_style_set, 1 );
2299
-
2300
- /*
2301
- * Define YAML::PrivateType class
2302
- */
2303
- cPrivateType = rb_define_class_under( rb_yaml, "PrivateType", rb_cObject );
2304
- rb_define_attr( cPrivateType, "type_id", 1, 1 );
2305
- rb_define_attr( cPrivateType, "value", 1, 1 );
2306
- rb_define_method( cPrivateType, "initialize", syck_privatetype_initialize, 2);
2307
-
2308
- /*
2309
- * Define YAML::DomainType class
2310
- */
2311
- cDomainType = rb_define_class_under( rb_yaml, "DomainType", rb_cObject );
2312
- rb_define_attr( cDomainType, "domain", 1, 1 );
2313
- rb_define_attr( cDomainType, "type_id", 1, 1 );
2314
- rb_define_attr( cDomainType, "value", 1, 1 );
2315
- rb_define_method( cDomainType, "initialize", syck_domaintype_initialize, 3);
2316
-
2317
- /*
2318
- * Define YAML::Object class
2319
- */
2320
- cYObject = rb_define_class_under( rb_yaml, "Object", rb_cObject );
2321
- rb_define_attr( cYObject, "class", 1, 1 );
2322
- rb_define_attr( cYObject, "ivars", 1, 1 );
2323
- rb_define_method( cYObject, "initialize", syck_yobject_initialize, 2);
2324
- rb_define_method( cYObject, "yaml_initialize", syck_yobject_initialize, 2);
2325
-
2326
- /*
2327
- * Define YAML::Syck::BadAlias class
2328
- */
2329
- cBadAlias = rb_define_class_under( rb_syck, "BadAlias", rb_cObject );
2330
- rb_define_attr( cBadAlias, "name", 1, 1 );
2331
- rb_define_method( cBadAlias, "initialize", syck_badalias_initialize, 1);
2332
- rb_define_method( cBadAlias, "<=>", syck_badalias_cmp, 1);
2333
- rb_include_module( cBadAlias, rb_const_get( rb_cObject, rb_intern("Comparable") ) );
2334
-
2335
- /*
2336
- * Define YAML::Syck::MergeKey class
2337
- */
2338
- cMergeKey = rb_define_class_under( rb_syck, "MergeKey", rb_cObject );
2339
-
2340
- /*
2341
- * Define YAML::Syck::DefaultKey class
2342
- */
2343
- cDefaultKey = rb_define_class_under( rb_syck, "DefaultKey", rb_cObject );
2344
-
2345
- /*
2346
- * Define YAML::Syck::Out classes
2347
- */
2348
- cOut = rb_define_class_under( rb_syck, "Out", rb_cObject );
2349
- rb_define_attr( cOut, "emitter", 1, 1 );
2350
- rb_define_method( cOut, "initialize", syck_out_initialize, 1 );
2351
- rb_define_method( cOut, "map", syck_out_map, -1 );
2352
- rb_define_method( cOut, "seq", syck_out_seq, -1 );
2353
- rb_define_method( cOut, "scalar", syck_out_scalar, -1 );
2354
-
2355
- /*
2356
- * Define YAML::Syck::Emitter class
2357
- */
2358
- cEmitter = rb_define_class_under( rb_syck, "Emitter", rb_cObject );
2359
- rb_define_attr( cEmitter, "level", 1, 1 );
2360
- rb_define_alloc_func( cEmitter, syck_emitter_s_alloc );
2361
- rb_define_method( cEmitter, "initialize", syck_emitter_reset, -1 );
2362
- rb_define_method( cEmitter, "reset", syck_emitter_reset, -1 );
2363
- rb_define_method( cEmitter, "emit", syck_emitter_emit, -1 );
2364
- rb_define_method( cEmitter, "set_resolver", syck_emitter_set_resolver, 1);
2365
- rb_define_method( cEmitter, "node_export", syck_emitter_node_export, 1);
2366
- }
2367
-