psych-with-location 3.0.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.travis.yml +20 -0
  4. data/CHANGELOG.rdoc +576 -0
  5. data/Gemfile +3 -0
  6. data/Mavenfile +7 -0
  7. data/README.md +73 -0
  8. data/Rakefile +46 -0
  9. data/bin/console +7 -0
  10. data/bin/setup +6 -0
  11. data/ext/psych/.gitignore +11 -0
  12. data/ext/psych/depend +3 -0
  13. data/ext/psych/extconf.rb +39 -0
  14. data/ext/psych/psych.c +34 -0
  15. data/ext/psych/psych.h +17 -0
  16. data/ext/psych/psych_emitter.c +554 -0
  17. data/ext/psych/psych_emitter.h +8 -0
  18. data/ext/psych/psych_parser.c +591 -0
  19. data/ext/psych/psych_parser.h +6 -0
  20. data/ext/psych/psych_to_ruby.c +39 -0
  21. data/ext/psych/psych_to_ruby.h +8 -0
  22. data/ext/psych/psych_yaml_tree.c +24 -0
  23. data/ext/psych/psych_yaml_tree.h +8 -0
  24. data/ext/psych/yaml/LICENSE +19 -0
  25. data/ext/psych/yaml/api.c +1392 -0
  26. data/ext/psych/yaml/config.h +10 -0
  27. data/ext/psych/yaml/dumper.c +394 -0
  28. data/ext/psych/yaml/emitter.c +2329 -0
  29. data/ext/psych/yaml/loader.c +444 -0
  30. data/ext/psych/yaml/parser.c +1374 -0
  31. data/ext/psych/yaml/reader.c +469 -0
  32. data/ext/psych/yaml/scanner.c +3576 -0
  33. data/ext/psych/yaml/writer.c +141 -0
  34. data/ext/psych/yaml/yaml.h +1971 -0
  35. data/ext/psych/yaml/yaml_private.h +662 -0
  36. data/lib/psych.rb +511 -0
  37. data/lib/psych/class_loader.rb +102 -0
  38. data/lib/psych/coder.rb +95 -0
  39. data/lib/psych/core_ext.rb +19 -0
  40. data/lib/psych/exception.rb +14 -0
  41. data/lib/psych/handler.rb +255 -0
  42. data/lib/psych/handlers/document_stream.rb +23 -0
  43. data/lib/psych/handlers/recorder.rb +40 -0
  44. data/lib/psych/json/ruby_events.rb +20 -0
  45. data/lib/psych/json/stream.rb +17 -0
  46. data/lib/psych/json/tree_builder.rb +13 -0
  47. data/lib/psych/json/yaml_events.rb +30 -0
  48. data/lib/psych/nodes.rb +78 -0
  49. data/lib/psych/nodes/alias.rb +19 -0
  50. data/lib/psych/nodes/document.rb +61 -0
  51. data/lib/psych/nodes/mapping.rb +57 -0
  52. data/lib/psych/nodes/node.rb +68 -0
  53. data/lib/psych/nodes/scalar.rb +68 -0
  54. data/lib/psych/nodes/sequence.rb +82 -0
  55. data/lib/psych/nodes/stream.rb +38 -0
  56. data/lib/psych/omap.rb +5 -0
  57. data/lib/psych/parser.rb +52 -0
  58. data/lib/psych/scalar_scanner.rb +149 -0
  59. data/lib/psych/set.rb +5 -0
  60. data/lib/psych/stream.rb +38 -0
  61. data/lib/psych/streaming.rb +28 -0
  62. data/lib/psych/syntax_error.rb +22 -0
  63. data/lib/psych/tree_builder.rb +137 -0
  64. data/lib/psych/versions.rb +9 -0
  65. data/lib/psych/visitors.rb +7 -0
  66. data/lib/psych/visitors/depth_first.rb +27 -0
  67. data/lib/psych/visitors/emitter.rb +52 -0
  68. data/lib/psych/visitors/json_tree.rb +25 -0
  69. data/lib/psych/visitors/to_ruby.rb +401 -0
  70. data/lib/psych/visitors/visitor.rb +20 -0
  71. data/lib/psych/visitors/yaml_tree.rb +551 -0
  72. data/lib/psych/y.rb +10 -0
  73. data/psych-with-location.gemspec +66 -0
  74. metadata +174 -0
@@ -0,0 +1,8 @@
1
+ #ifndef PSYCH_EMITTER_H
2
+ #define PSYCH_EMITTER_H
3
+
4
+ #include <psych.h>
5
+
6
+ void Init_psych_emitter(void);
7
+
8
+ #endif
@@ -0,0 +1,591 @@
1
+ #include <psych.h>
2
+
3
+ VALUE cPsychParser;
4
+ VALUE ePsychSyntaxError;
5
+
6
+ static ID id_read;
7
+ static ID id_path;
8
+ static ID id_empty;
9
+ static ID id_start_stream;
10
+ static ID id_end_stream;
11
+ static ID id_start_document;
12
+ static ID id_end_document;
13
+ static ID id_alias;
14
+ static ID id_scalar;
15
+ static ID id_start_sequence;
16
+ static ID id_end_sequence;
17
+ static ID id_start_mapping;
18
+ static ID id_end_mapping;
19
+ static ID id_event_location;
20
+
21
+ #define PSYCH_TRANSCODE(_str, _yaml_enc, _internal_enc) \
22
+ do { \
23
+ rb_enc_associate_index((_str), (_yaml_enc)); \
24
+ if(_internal_enc) \
25
+ (_str) = rb_str_export_to_enc((_str), (_internal_enc)); \
26
+ } while (0)
27
+
28
+ static int io_reader(void * data, unsigned char *buf, size_t size, size_t *read)
29
+ {
30
+ VALUE io = (VALUE)data;
31
+ VALUE string = rb_funcall(io, id_read, 1, INT2NUM(size));
32
+
33
+ *read = 0;
34
+
35
+ if(! NIL_P(string)) {
36
+ void * str = (void *)StringValuePtr(string);
37
+ *read = (size_t)RSTRING_LEN(string);
38
+ memcpy(buf, str, *read);
39
+ }
40
+
41
+ return 1;
42
+ }
43
+
44
+ static void dealloc(void * ptr)
45
+ {
46
+ yaml_parser_t * parser;
47
+
48
+ parser = (yaml_parser_t *)ptr;
49
+ yaml_parser_delete(parser);
50
+ xfree(parser);
51
+ }
52
+
53
+ #if 0
54
+ static size_t memsize(const void *ptr)
55
+ {
56
+ const yaml_parser_t *parser = ptr;
57
+ /* TODO: calculate parser's size */
58
+ return 0;
59
+ }
60
+ #endif
61
+
62
+ static const rb_data_type_t psych_parser_type = {
63
+ "Psych/parser",
64
+ {0, dealloc, 0,},
65
+ 0, 0,
66
+ #ifdef RUBY_TYPED_FREE_IMMEDIATELY
67
+ RUBY_TYPED_FREE_IMMEDIATELY,
68
+ #endif
69
+ };
70
+
71
+ static VALUE allocate(VALUE klass)
72
+ {
73
+ yaml_parser_t * parser;
74
+ VALUE obj = TypedData_Make_Struct(klass, yaml_parser_t, &psych_parser_type, parser);
75
+
76
+ yaml_parser_initialize(parser);
77
+
78
+ return obj;
79
+ }
80
+
81
+ static VALUE make_exception(yaml_parser_t * parser, VALUE path)
82
+ {
83
+ size_t line, column;
84
+
85
+ line = parser->context_mark.line + 1;
86
+ column = parser->context_mark.column + 1;
87
+
88
+ return rb_funcall(ePsychSyntaxError, rb_intern("new"), 6,
89
+ path,
90
+ INT2NUM(line),
91
+ INT2NUM(column),
92
+ INT2NUM(parser->problem_offset),
93
+ parser->problem ? rb_usascii_str_new2(parser->problem) : Qnil,
94
+ parser->context ? rb_usascii_str_new2(parser->context) : Qnil);
95
+ }
96
+
97
+ static VALUE transcode_string(VALUE src, int * parser_encoding)
98
+ {
99
+ int utf8 = rb_utf8_encindex();
100
+ int utf16le = rb_enc_find_index("UTF-16LE");
101
+ int utf16be = rb_enc_find_index("UTF-16BE");
102
+ int source_encoding = rb_enc_get_index(src);
103
+
104
+ if (source_encoding == utf8) {
105
+ *parser_encoding = YAML_UTF8_ENCODING;
106
+ return src;
107
+ }
108
+
109
+ if (source_encoding == utf16le) {
110
+ *parser_encoding = YAML_UTF16LE_ENCODING;
111
+ return src;
112
+ }
113
+
114
+ if (source_encoding == utf16be) {
115
+ *parser_encoding = YAML_UTF16BE_ENCODING;
116
+ return src;
117
+ }
118
+
119
+ src = rb_str_export_to_enc(src, rb_utf8_encoding());
120
+ RB_GC_GUARD(src);
121
+
122
+ *parser_encoding = YAML_UTF8_ENCODING;
123
+ return src;
124
+ }
125
+
126
+ static VALUE transcode_io(VALUE src, int * parser_encoding)
127
+ {
128
+ VALUE io_external_encoding;
129
+ int io_external_enc_index;
130
+
131
+ io_external_encoding = rb_funcall(src, rb_intern("external_encoding"), 0);
132
+
133
+ /* if no encoding is returned, assume ascii8bit. */
134
+ if (NIL_P(io_external_encoding)) {
135
+ io_external_enc_index = rb_ascii8bit_encindex();
136
+ } else {
137
+ io_external_enc_index = rb_to_encoding_index(io_external_encoding);
138
+ }
139
+
140
+ /* Treat US-ASCII as utf_8 */
141
+ if (io_external_enc_index == rb_usascii_encindex()) {
142
+ *parser_encoding = YAML_UTF8_ENCODING;
143
+ return src;
144
+ }
145
+
146
+ if (io_external_enc_index == rb_utf8_encindex()) {
147
+ *parser_encoding = YAML_UTF8_ENCODING;
148
+ return src;
149
+ }
150
+
151
+ if (io_external_enc_index == rb_enc_find_index("UTF-16LE")) {
152
+ *parser_encoding = YAML_UTF16LE_ENCODING;
153
+ return src;
154
+ }
155
+
156
+ if (io_external_enc_index == rb_enc_find_index("UTF-16BE")) {
157
+ *parser_encoding = YAML_UTF16BE_ENCODING;
158
+ return src;
159
+ }
160
+
161
+ /* Just guess on ASCII-8BIT */
162
+ if (io_external_enc_index == rb_ascii8bit_encindex()) {
163
+ *parser_encoding = YAML_ANY_ENCODING;
164
+ return src;
165
+ }
166
+
167
+ /* If the external encoding is something we don't know how to handle,
168
+ * fall back to YAML_ANY_ENCODING. */
169
+ *parser_encoding = YAML_ANY_ENCODING;
170
+
171
+ return src;
172
+ }
173
+
174
+ static VALUE protected_start_stream(VALUE pointer)
175
+ {
176
+ VALUE *args = (VALUE *)pointer;
177
+ return rb_funcall(args[0], id_start_stream, 1, args[1]);
178
+ }
179
+
180
+ static VALUE protected_start_document(VALUE pointer)
181
+ {
182
+ VALUE *args = (VALUE *)pointer;
183
+ return rb_funcall3(args[0], id_start_document, 3, args + 1);
184
+ }
185
+
186
+ static VALUE protected_end_document(VALUE pointer)
187
+ {
188
+ VALUE *args = (VALUE *)pointer;
189
+ return rb_funcall(args[0], id_end_document, 1, args[1]);
190
+ }
191
+
192
+ static VALUE protected_alias(VALUE pointer)
193
+ {
194
+ VALUE *args = (VALUE *)pointer;
195
+ return rb_funcall(args[0], id_alias, 1, args[1]);
196
+ }
197
+
198
+ static VALUE protected_scalar(VALUE pointer)
199
+ {
200
+ VALUE *args = (VALUE *)pointer;
201
+ return rb_funcall3(args[0], id_scalar, 6, args + 1);
202
+ }
203
+
204
+ static VALUE protected_start_sequence(VALUE pointer)
205
+ {
206
+ VALUE *args = (VALUE *)pointer;
207
+ return rb_funcall3(args[0], id_start_sequence, 4, args + 1);
208
+ }
209
+
210
+ static VALUE protected_end_sequence(VALUE handler)
211
+ {
212
+ return rb_funcall(handler, id_end_sequence, 0);
213
+ }
214
+
215
+ static VALUE protected_start_mapping(VALUE pointer)
216
+ {
217
+ VALUE *args = (VALUE *)pointer;
218
+ return rb_funcall3(args[0], id_start_mapping, 4, args + 1);
219
+ }
220
+
221
+ static VALUE protected_end_mapping(VALUE handler)
222
+ {
223
+ return rb_funcall(handler, id_end_mapping, 0);
224
+ }
225
+
226
+ static VALUE protected_empty(VALUE handler)
227
+ {
228
+ return rb_funcall(handler, id_empty, 0);
229
+ }
230
+
231
+ static VALUE protected_end_stream(VALUE handler)
232
+ {
233
+ return rb_funcall(handler, id_end_stream, 0);
234
+ }
235
+
236
+ static VALUE protected_event_location(VALUE pointer)
237
+ {
238
+ VALUE *args = (VALUE *)pointer;
239
+ return rb_funcall3(args[0], id_event_location, 4, args + 1);
240
+ }
241
+
242
+ /*
243
+ * call-seq:
244
+ * parser.parse(yaml)
245
+ *
246
+ * Parse the YAML document contained in +yaml+. Events will be called on
247
+ * the handler set on the parser instance.
248
+ *
249
+ * See Psych::Parser and Psych::Parser#handler
250
+ */
251
+ static VALUE parse(int argc, VALUE *argv, VALUE self)
252
+ {
253
+ VALUE yaml, path;
254
+ yaml_parser_t * parser;
255
+ yaml_event_t event;
256
+ int done = 0;
257
+ int tainted = 0;
258
+ int state = 0;
259
+ int parser_encoding = YAML_ANY_ENCODING;
260
+ int encoding = rb_utf8_encindex();
261
+ rb_encoding * internal_enc = rb_default_internal_encoding();
262
+ VALUE handler = rb_iv_get(self, "@handler");
263
+
264
+ if (rb_scan_args(argc, argv, "11", &yaml, &path) == 1) {
265
+ if(rb_respond_to(yaml, id_path))
266
+ path = rb_funcall(yaml, id_path, 0);
267
+ else
268
+ path = rb_str_new2("<unknown>");
269
+ }
270
+
271
+ TypedData_Get_Struct(self, yaml_parser_t, &psych_parser_type, parser);
272
+
273
+ yaml_parser_delete(parser);
274
+ yaml_parser_initialize(parser);
275
+
276
+ if (OBJ_TAINTED(yaml)) tainted = 1;
277
+
278
+ if (rb_respond_to(yaml, id_read)) {
279
+ yaml = transcode_io(yaml, &parser_encoding);
280
+ yaml_parser_set_encoding(parser, parser_encoding);
281
+ yaml_parser_set_input(parser, io_reader, (void *)yaml);
282
+ if (RTEST(rb_obj_is_kind_of(yaml, rb_cIO))) tainted = 1;
283
+ } else {
284
+ StringValue(yaml);
285
+ yaml = transcode_string(yaml, &parser_encoding);
286
+ yaml_parser_set_encoding(parser, parser_encoding);
287
+ yaml_parser_set_input_string(
288
+ parser,
289
+ (const unsigned char *)RSTRING_PTR(yaml),
290
+ (size_t)RSTRING_LEN(yaml)
291
+ );
292
+ }
293
+
294
+ while(!done) {
295
+ if(!yaml_parser_parse(parser, &event)) {
296
+ VALUE exception;
297
+
298
+ exception = make_exception(parser, path);
299
+ yaml_parser_delete(parser);
300
+ yaml_parser_initialize(parser);
301
+
302
+ rb_exc_raise(exception);
303
+ }
304
+
305
+ VALUE event_args[5];
306
+ VALUE start_line, start_column, end_line, end_column;
307
+
308
+ start_line = INT2NUM((long)event.start_mark.line);
309
+ start_column = INT2NUM((long)event.start_mark.column);
310
+ end_line = INT2NUM((long)event.end_mark.line);
311
+ end_column = INT2NUM((long)event.end_mark.column);
312
+
313
+ event_args[0] = handler;
314
+ event_args[1] = start_line;
315
+ event_args[2] = start_column;
316
+ event_args[3] = end_line;
317
+ event_args[4] = end_column;
318
+ rb_protect(protected_event_location, (VALUE)event_args, &state);
319
+
320
+ switch(event.type) {
321
+ case YAML_STREAM_START_EVENT:
322
+ {
323
+ VALUE args[2];
324
+
325
+ args[0] = handler;
326
+ args[1] = INT2NUM((long)event.data.stream_start.encoding);
327
+ rb_protect(protected_start_stream, (VALUE)args, &state);
328
+ }
329
+ break;
330
+ case YAML_DOCUMENT_START_EVENT:
331
+ {
332
+ VALUE args[4];
333
+ /* Get a list of tag directives (if any) */
334
+ VALUE tag_directives = rb_ary_new();
335
+ /* Grab the document version */
336
+ VALUE version = event.data.document_start.version_directive ?
337
+ rb_ary_new3(
338
+ (long)2,
339
+ INT2NUM((long)event.data.document_start.version_directive->major),
340
+ INT2NUM((long)event.data.document_start.version_directive->minor)
341
+ ) : rb_ary_new();
342
+
343
+ if(event.data.document_start.tag_directives.start) {
344
+ yaml_tag_directive_t *start =
345
+ event.data.document_start.tag_directives.start;
346
+ yaml_tag_directive_t *end =
347
+ event.data.document_start.tag_directives.end;
348
+ for(; start != end; start++) {
349
+ VALUE handle = Qnil;
350
+ VALUE prefix = Qnil;
351
+ if(start->handle) {
352
+ handle = rb_str_new2((const char *)start->handle);
353
+ if (tainted) OBJ_TAINT(handle);
354
+ PSYCH_TRANSCODE(handle, encoding, internal_enc);
355
+ }
356
+
357
+ if(start->prefix) {
358
+ prefix = rb_str_new2((const char *)start->prefix);
359
+ if (tainted) OBJ_TAINT(prefix);
360
+ PSYCH_TRANSCODE(prefix, encoding, internal_enc);
361
+ }
362
+
363
+ rb_ary_push(tag_directives, rb_ary_new3((long)2, handle, prefix));
364
+ }
365
+ }
366
+ args[0] = handler;
367
+ args[1] = version;
368
+ args[2] = tag_directives;
369
+ args[3] = event.data.document_start.implicit == 1 ? Qtrue : Qfalse;
370
+ rb_protect(protected_start_document, (VALUE)args, &state);
371
+ }
372
+ break;
373
+ case YAML_DOCUMENT_END_EVENT:
374
+ {
375
+ VALUE args[2];
376
+
377
+ args[0] = handler;
378
+ args[1] = event.data.document_end.implicit == 1 ? Qtrue : Qfalse;
379
+ rb_protect(protected_end_document, (VALUE)args, &state);
380
+ }
381
+ break;
382
+ case YAML_ALIAS_EVENT:
383
+ {
384
+ VALUE args[2];
385
+ VALUE alias = Qnil;
386
+ if(event.data.alias.anchor) {
387
+ alias = rb_str_new2((const char *)event.data.alias.anchor);
388
+ if (tainted) OBJ_TAINT(alias);
389
+ PSYCH_TRANSCODE(alias, encoding, internal_enc);
390
+ }
391
+
392
+ args[0] = handler;
393
+ args[1] = alias;
394
+ rb_protect(protected_alias, (VALUE)args, &state);
395
+ }
396
+ break;
397
+ case YAML_SCALAR_EVENT:
398
+ {
399
+ VALUE args[7];
400
+ VALUE anchor = Qnil;
401
+ VALUE tag = Qnil;
402
+ VALUE plain_implicit, quoted_implicit, style;
403
+ VALUE val = rb_str_new(
404
+ (const char *)event.data.scalar.value,
405
+ (long)event.data.scalar.length
406
+ );
407
+ if (tainted) OBJ_TAINT(val);
408
+
409
+ PSYCH_TRANSCODE(val, encoding, internal_enc);
410
+
411
+ if(event.data.scalar.anchor) {
412
+ anchor = rb_str_new2((const char *)event.data.scalar.anchor);
413
+ if (tainted) OBJ_TAINT(anchor);
414
+ PSYCH_TRANSCODE(anchor, encoding, internal_enc);
415
+ }
416
+
417
+ if(event.data.scalar.tag) {
418
+ tag = rb_str_new2((const char *)event.data.scalar.tag);
419
+ if (tainted) OBJ_TAINT(tag);
420
+ PSYCH_TRANSCODE(tag, encoding, internal_enc);
421
+ }
422
+
423
+ plain_implicit =
424
+ event.data.scalar.plain_implicit == 0 ? Qfalse : Qtrue;
425
+
426
+ quoted_implicit =
427
+ event.data.scalar.quoted_implicit == 0 ? Qfalse : Qtrue;
428
+
429
+ style = INT2NUM((long)event.data.scalar.style);
430
+
431
+ args[0] = handler;
432
+ args[1] = val;
433
+ args[2] = anchor;
434
+ args[3] = tag;
435
+ args[4] = plain_implicit;
436
+ args[5] = quoted_implicit;
437
+ args[6] = style;
438
+ rb_protect(protected_scalar, (VALUE)args, &state);
439
+ }
440
+ break;
441
+ case YAML_SEQUENCE_START_EVENT:
442
+ {
443
+ VALUE args[5];
444
+ VALUE anchor = Qnil;
445
+ VALUE tag = Qnil;
446
+ VALUE implicit, style;
447
+ if(event.data.sequence_start.anchor) {
448
+ anchor = rb_str_new2((const char *)event.data.sequence_start.anchor);
449
+ if (tainted) OBJ_TAINT(anchor);
450
+ PSYCH_TRANSCODE(anchor, encoding, internal_enc);
451
+ }
452
+
453
+ tag = Qnil;
454
+ if(event.data.sequence_start.tag) {
455
+ tag = rb_str_new2((const char *)event.data.sequence_start.tag);
456
+ if (tainted) OBJ_TAINT(tag);
457
+ PSYCH_TRANSCODE(tag, encoding, internal_enc);
458
+ }
459
+
460
+ implicit =
461
+ event.data.sequence_start.implicit == 0 ? Qfalse : Qtrue;
462
+
463
+ style = INT2NUM((long)event.data.sequence_start.style);
464
+
465
+ args[0] = handler;
466
+ args[1] = anchor;
467
+ args[2] = tag;
468
+ args[3] = implicit;
469
+ args[4] = style;
470
+
471
+ rb_protect(protected_start_sequence, (VALUE)args, &state);
472
+ }
473
+ break;
474
+ case YAML_SEQUENCE_END_EVENT:
475
+ rb_protect(protected_end_sequence, handler, &state);
476
+ break;
477
+ case YAML_MAPPING_START_EVENT:
478
+ {
479
+ VALUE args[5];
480
+ VALUE anchor = Qnil;
481
+ VALUE tag = Qnil;
482
+ VALUE implicit, style;
483
+ if(event.data.mapping_start.anchor) {
484
+ anchor = rb_str_new2((const char *)event.data.mapping_start.anchor);
485
+ if (tainted) OBJ_TAINT(anchor);
486
+ PSYCH_TRANSCODE(anchor, encoding, internal_enc);
487
+ }
488
+
489
+ if(event.data.mapping_start.tag) {
490
+ tag = rb_str_new2((const char *)event.data.mapping_start.tag);
491
+ if (tainted) OBJ_TAINT(tag);
492
+ PSYCH_TRANSCODE(tag, encoding, internal_enc);
493
+ }
494
+
495
+ implicit =
496
+ event.data.mapping_start.implicit == 0 ? Qfalse : Qtrue;
497
+
498
+ style = INT2NUM((long)event.data.mapping_start.style);
499
+
500
+ args[0] = handler;
501
+ args[1] = anchor;
502
+ args[2] = tag;
503
+ args[3] = implicit;
504
+ args[4] = style;
505
+
506
+ rb_protect(protected_start_mapping, (VALUE)args, &state);
507
+ }
508
+ break;
509
+ case YAML_MAPPING_END_EVENT:
510
+ rb_protect(protected_end_mapping, handler, &state);
511
+ break;
512
+ case YAML_NO_EVENT:
513
+ rb_protect(protected_empty, handler, &state);
514
+ break;
515
+ case YAML_STREAM_END_EVENT:
516
+ rb_protect(protected_end_stream, handler, &state);
517
+ done = 1;
518
+ break;
519
+ }
520
+ yaml_event_delete(&event);
521
+ if (state) rb_jump_tag(state);
522
+ }
523
+
524
+ return self;
525
+ }
526
+
527
+ /*
528
+ * call-seq:
529
+ * parser.mark # => #<Psych::Parser::Mark>
530
+ *
531
+ * Returns a Psych::Parser::Mark object that contains line, column, and index
532
+ * information.
533
+ */
534
+ static VALUE mark(VALUE self)
535
+ {
536
+ VALUE mark_klass;
537
+ VALUE args[3];
538
+ yaml_parser_t * parser;
539
+
540
+ TypedData_Get_Struct(self, yaml_parser_t, &psych_parser_type, parser);
541
+ mark_klass = rb_const_get_at(cPsychParser, rb_intern("Mark"));
542
+ args[0] = INT2NUM(parser->mark.index);
543
+ args[1] = INT2NUM(parser->mark.line);
544
+ args[2] = INT2NUM(parser->mark.column);
545
+
546
+ return rb_class_new_instance(3, args, mark_klass);
547
+ }
548
+
549
+ void Init_psych_parser(void)
550
+ {
551
+ #if 0
552
+ mPsych = rb_define_module("Psych");
553
+ #endif
554
+
555
+ cPsychParser = rb_define_class_under(mPsych, "Parser", rb_cObject);
556
+ rb_define_alloc_func(cPsychParser, allocate);
557
+
558
+ /* Any encoding: Let the parser choose the encoding */
559
+ rb_define_const(cPsychParser, "ANY", INT2NUM(YAML_ANY_ENCODING));
560
+
561
+ /* UTF-8 Encoding */
562
+ rb_define_const(cPsychParser, "UTF8", INT2NUM(YAML_UTF8_ENCODING));
563
+
564
+ /* UTF-16-LE Encoding with BOM */
565
+ rb_define_const(cPsychParser, "UTF16LE", INT2NUM(YAML_UTF16LE_ENCODING));
566
+
567
+ /* UTF-16-BE Encoding with BOM */
568
+ rb_define_const(cPsychParser, "UTF16BE", INT2NUM(YAML_UTF16BE_ENCODING));
569
+
570
+ rb_require("psych/syntax_error");
571
+ ePsychSyntaxError = rb_const_get(mPsych, rb_intern("SyntaxError"));
572
+
573
+ rb_define_method(cPsychParser, "parse", parse, -1);
574
+ rb_define_method(cPsychParser, "mark", mark, 0);
575
+
576
+ id_read = rb_intern("read");
577
+ id_path = rb_intern("path");
578
+ id_empty = rb_intern("empty");
579
+ id_start_stream = rb_intern("start_stream");
580
+ id_end_stream = rb_intern("end_stream");
581
+ id_start_document = rb_intern("start_document");
582
+ id_end_document = rb_intern("end_document");
583
+ id_alias = rb_intern("alias");
584
+ id_scalar = rb_intern("scalar");
585
+ id_start_sequence = rb_intern("start_sequence");
586
+ id_end_sequence = rb_intern("end_sequence");
587
+ id_start_mapping = rb_intern("start_mapping");
588
+ id_end_mapping = rb_intern("end_mapping");
589
+ id_event_location = rb_intern("event_location");
590
+ }
591
+ /* vim: set noet sws=4 sw=4: */