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