rubysl-syck 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,408 @@
1
+ /*
2
+ * node.c
3
+ *
4
+ * $Author: shyouhei $
5
+ * $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
6
+ *
7
+ * Copyright (C) 2003 why the lucky stiff
8
+ */
9
+
10
+ #include "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
+