ray 0.0.1 → 0.1.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
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
-