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
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,7 @@
1
+ #-*- mode: ruby -*-
2
+
3
+ jar 'org.yaml:snakeyaml:${snakeyaml.version}'
4
+
5
+ plugin :dependency, '2.8', :outputFile => 'pkg/classpath'
6
+
7
+ # vim: syntax=Ruby
@@ -0,0 +1,73 @@
1
+ # Psych
2
+
3
+ [![Build Status](https://travis-ci.org/ruby/psych.svg?branch=master)](https://travis-ci.org/ruby/psych)
4
+ [![Build status](https://ci.appveyor.com/api/projects/status/2t6x109xfmbx209k/branch/master?svg=true)](https://ci.appveyor.com/project/ruby/psych/branch/master)
5
+
6
+ * https://github.com/ruby/psych
7
+
8
+ ## Description
9
+
10
+ Psych is a YAML parser and emitter. Psych leverages
11
+ [libyaml](http://pyyaml.org/wiki/LibYAML) for its YAML parsing and emitting
12
+ capabilities. In addition to wrapping libyaml, Psych also knows how to
13
+ serialize and de-serialize most Ruby objects to and from the YAML format.
14
+
15
+ ## Examples
16
+
17
+ # Load YAML in to a Ruby object
18
+ Psych.load('--- foo') # => 'foo'
19
+
20
+ # Emit YAML from a Ruby object
21
+ Psych.dump("foo") # => "--- foo\n...\n"
22
+
23
+ ## Dependencies
24
+
25
+ * libyaml
26
+
27
+ ## Installation
28
+
29
+ Psych has been included with MRI since 1.9.2, and is the default YAML parser
30
+ in 1.9.3.
31
+
32
+ If you want a newer gem release of Psych, you can use rubygems:
33
+
34
+ gem install psych
35
+
36
+ In order to use the gem release in your app, and not the stdlib version,
37
+ you'll need the following:
38
+
39
+ gem 'psych'
40
+ require 'psych'
41
+
42
+ Or if you use Bundler add this to your `Gemfile`:
43
+
44
+ gem 'psych'
45
+
46
+ JRuby ships with a pure Java implementation of Psych.
47
+
48
+ If you're on Rubinius, Psych is available in 1.9 mode, please refer to the
49
+ Language Modes section of the [Rubinius
50
+ README](https://github.com/rubinius/rubinius#readme) for more information on
51
+ building and 1.9 mode.
52
+
53
+ ## License
54
+
55
+ Copyright 2009 Aaron Patterson, et al.
56
+
57
+ Permission is hereby granted, free of charge, to any person obtaining a copy
58
+ of this software and associated documentation files (the 'Software'), to deal
59
+ in the Software without restriction, including without limitation the rights
60
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
61
+ copies of the Software, and to permit persons to whom the Software is
62
+ furnished to do so, subject to the following conditions:
63
+
64
+ The above copyright notice and this permission notice shall be included in all
65
+ copies or substantial portions of the Software.
66
+
67
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
68
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
69
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
70
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
71
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
72
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
73
+ SOFTWARE.
@@ -0,0 +1,46 @@
1
+ require "bundler"
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require "rake/testtask"
5
+ Rake::TestTask.new(:test) do |t|
6
+ t.libs << "test"
7
+ t.libs << "lib"
8
+ t.test_files = FileList['test/**/test_*.rb']
9
+ t.verbose = true
10
+ t.warning = true
11
+ end
12
+
13
+ if RUBY_PLATFORM =~ /java/
14
+ require 'rake/javaextensiontask'
15
+ Rake::JavaExtensionTask.new("psych") do |ext|
16
+ require 'maven/ruby/maven'
17
+ # uses Mavenfile to write classpath into pkg/classpath
18
+ # and tell maven via system properties the snakeyaml version
19
+ # this is basically the same as running from the commandline:
20
+ # rmvn dependency:build-classpath -Dsnakeyaml.version='use version from Psych::DEFAULT_SNAKEYAML_VERSION here'
21
+ Maven::Ruby::Maven.new.exec('dependency:build-classpath', "-Dsnakeyaml.version=1.18", '-Dverbose=true')
22
+ ext.source_version = '1.7'
23
+ ext.target_version = '1.7'
24
+ ext.classpath = File.read('pkg/classpath')
25
+ ext.ext_dir = 'ext/java'
26
+ end
27
+ else
28
+ require 'rake/extensiontask'
29
+ spec = eval File.read("psych-with-location.gemspec")
30
+ Rake::ExtensionTask.new("psych", spec) do |ext|
31
+ ext.lib_dir = File.join(*['lib', ENV['FAT_DIR']].compact)
32
+ ext.cross_compile = true
33
+ ext.cross_platform = %w[x86-mingw32 x64-mingw32]
34
+ ext.cross_compiling do |s|
35
+ s.files.concat ["lib/2.2/psych.so", "lib/2.3/psych.so", "lib/2.4/psych.so"]
36
+ end
37
+ end
38
+ end
39
+
40
+ desc "Compile binaries for mingw platform using rake-compiler-dock"
41
+ task 'build:mingw' do
42
+ require 'rake_compiler_dock'
43
+ RakeCompilerDock.sh "bundle && rake cross native gem RUBY_CC_VERSION=2.2.2:2.3.0:2.4.0"
44
+ end
45
+
46
+ task :default => [:compile, :test]
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "psych"
5
+
6
+ require "irb"
7
+ IRB.start
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
@@ -0,0 +1,11 @@
1
+ /api.c
2
+ /config.h
3
+ /dumper.c
4
+ /emitter.c
5
+ /loader.c
6
+ /parser.c
7
+ /reader.c
8
+ /scanner.c
9
+ /writer.c
10
+ /yaml.h
11
+ /yaml_private.h
@@ -0,0 +1,3 @@
1
+ $(OBJS): $(HDRS) $(ruby_headers) \
2
+ $(hdrdir)/ruby/encoding.h \
3
+ $(hdrdir)/ruby/oniguruma.h
@@ -0,0 +1,39 @@
1
+ # -*- coding: us-ascii -*-
2
+ # frozen_string_literal: true
3
+ require 'mkmf'
4
+ require 'fileutils'
5
+
6
+ # :stopdoc:
7
+
8
+ dir_config 'libyaml'
9
+
10
+ if enable_config("bundled-libyaml", false) || !(find_header('yaml.h') && find_library('yaml', 'yaml_get_version'))
11
+ # Embed libyaml since we could not find it.
12
+
13
+ $VPATH << "$(srcdir)/yaml"
14
+ $INCFLAGS << " -I$(srcdir)/yaml"
15
+
16
+ $srcs = Dir.glob("#{$srcdir}/{,yaml/}*.c").map {|n| File.basename(n)}
17
+
18
+ if have_macro("_WIN32")
19
+ $CPPFLAGS << " -DYAML_DECLARE_STATIC -DHAVE_CONFIG_H"
20
+ end
21
+
22
+ have_header 'dlfcn.h'
23
+ have_header 'inttypes.h'
24
+ have_header 'memory.h'
25
+ have_header 'stdint.h'
26
+ have_header 'stdlib.h'
27
+ have_header 'strings.h'
28
+ have_header 'string.h'
29
+ have_header 'sys/stat.h'
30
+ have_header 'sys/types.h'
31
+ have_header 'unistd.h'
32
+
33
+ find_header 'yaml.h'
34
+ have_header 'config.h'
35
+ end
36
+
37
+ create_makefile 'psych'
38
+
39
+ # :startdoc:
@@ -0,0 +1,34 @@
1
+ #include <psych.h>
2
+
3
+ /* call-seq: Psych.libyaml_version
4
+ *
5
+ * Returns the version of libyaml being used
6
+ */
7
+ static VALUE libyaml_version(VALUE module)
8
+ {
9
+ int major, minor, patch;
10
+ VALUE list[3];
11
+
12
+ yaml_get_version(&major, &minor, &patch);
13
+
14
+ list[0] = INT2NUM((long)major);
15
+ list[1] = INT2NUM((long)minor);
16
+ list[2] = INT2NUM((long)patch);
17
+
18
+ return rb_ary_new4((long)3, list);
19
+ }
20
+
21
+ VALUE mPsych;
22
+
23
+ void Init_psych(void)
24
+ {
25
+ mPsych = rb_define_module("Psych");
26
+
27
+ rb_define_singleton_method(mPsych, "libyaml_version", libyaml_version, 0);
28
+
29
+ Init_psych_parser();
30
+ Init_psych_emitter();
31
+ Init_psych_to_ruby();
32
+ Init_psych_yaml_tree();
33
+ }
34
+ /* vim: set noet sws=4 sw=4: */
@@ -0,0 +1,17 @@
1
+ #ifndef PSYCH_H
2
+ #define PSYCH_H
3
+
4
+ #include <ruby.h>
5
+ #include <ruby/encoding.h>
6
+
7
+ #include <yaml.h>
8
+
9
+ #include <psych_parser.h>
10
+ #include <psych_emitter.h>
11
+ #include <psych_to_ruby.h>
12
+ #include <psych_yaml_tree.h>
13
+
14
+ extern VALUE mPsych;
15
+
16
+
17
+ #endif
@@ -0,0 +1,554 @@
1
+ #include <psych.h>
2
+
3
+ #if !defined(RARRAY_CONST_PTR)
4
+ #define RARRAY_CONST_PTR(s) (const VALUE *)RARRAY_PTR(s)
5
+ #endif
6
+ #if !defined(RARRAY_AREF)
7
+ #define RARRAY_AREF(a, i) RARRAY_CONST_PTR(a)[i]
8
+ #endif
9
+
10
+ VALUE cPsychEmitter;
11
+ static ID id_io;
12
+ static ID id_write;
13
+ static ID id_line_width;
14
+ static ID id_indentation;
15
+ static ID id_canonical;
16
+
17
+ static void emit(yaml_emitter_t * emitter, yaml_event_t * event)
18
+ {
19
+ if(!yaml_emitter_emit(emitter, event))
20
+ rb_raise(rb_eRuntimeError, "%s", emitter->problem);
21
+ }
22
+
23
+ static int writer(void *ctx, unsigned char *buffer, size_t size)
24
+ {
25
+ VALUE self = (VALUE)ctx, io = rb_attr_get(self, id_io);
26
+ VALUE str = rb_enc_str_new((const char *)buffer, (long)size, rb_utf8_encoding());
27
+ VALUE wrote = rb_funcall(io, id_write, 1, str);
28
+ return (int)NUM2INT(wrote);
29
+ }
30
+
31
+ static void dealloc(void * ptr)
32
+ {
33
+ yaml_emitter_t * emitter;
34
+
35
+ emitter = (yaml_emitter_t *)ptr;
36
+ yaml_emitter_delete(emitter);
37
+ xfree(emitter);
38
+ }
39
+
40
+ #if 0
41
+ static size_t memsize(const void *ptr)
42
+ {
43
+ const yaml_emitter_t *emitter = ptr;
44
+ /* TODO: calculate emitter's size */
45
+ return 0;
46
+ }
47
+ #endif
48
+
49
+ static const rb_data_type_t psych_emitter_type = {
50
+ "Psych/emitter",
51
+ {0, dealloc, 0,},
52
+ 0, 0,
53
+ #ifdef RUBY_TYPED_FREE_IMMEDIATELY
54
+ RUBY_TYPED_FREE_IMMEDIATELY,
55
+ #endif
56
+ };
57
+
58
+ static VALUE allocate(VALUE klass)
59
+ {
60
+ yaml_emitter_t * emitter;
61
+ VALUE obj = TypedData_Make_Struct(klass, yaml_emitter_t, &psych_emitter_type, emitter);
62
+
63
+ yaml_emitter_initialize(emitter);
64
+ yaml_emitter_set_unicode(emitter, 1);
65
+ yaml_emitter_set_indent(emitter, 2);
66
+
67
+ return obj;
68
+ }
69
+
70
+ /* call-seq: Psych::Emitter.new(io, options = Psych::Emitter::OPTIONS)
71
+ *
72
+ * Create a new Psych::Emitter that writes to +io+.
73
+ */
74
+ static VALUE initialize(int argc, VALUE *argv, VALUE self)
75
+ {
76
+ yaml_emitter_t * emitter;
77
+ VALUE io, options;
78
+ VALUE line_width;
79
+ VALUE indent;
80
+ VALUE canonical;
81
+
82
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
83
+
84
+ if (rb_scan_args(argc, argv, "11", &io, &options) == 2) {
85
+ line_width = rb_funcall(options, id_line_width, 0);
86
+ indent = rb_funcall(options, id_indentation, 0);
87
+ canonical = rb_funcall(options, id_canonical, 0);
88
+
89
+ yaml_emitter_set_width(emitter, NUM2INT(line_width));
90
+ yaml_emitter_set_indent(emitter, NUM2INT(indent));
91
+ yaml_emitter_set_canonical(emitter, Qtrue == canonical ? 1 : 0);
92
+ }
93
+
94
+ rb_ivar_set(self, id_io, io);
95
+ yaml_emitter_set_output(emitter, writer, (void *)self);
96
+
97
+ return self;
98
+ }
99
+
100
+ /* call-seq: emitter.start_stream(encoding)
101
+ *
102
+ * Start a stream emission with +encoding+
103
+ *
104
+ * See Psych::Handler#start_stream
105
+ */
106
+ static VALUE start_stream(VALUE self, VALUE encoding)
107
+ {
108
+ yaml_emitter_t * emitter;
109
+ yaml_event_t event;
110
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
111
+ Check_Type(encoding, T_FIXNUM);
112
+
113
+ yaml_stream_start_event_initialize(&event, (yaml_encoding_t)NUM2INT(encoding));
114
+
115
+ emit(emitter, &event);
116
+
117
+ return self;
118
+ }
119
+
120
+ /* call-seq: emitter.end_stream
121
+ *
122
+ * End a stream emission
123
+ *
124
+ * See Psych::Handler#end_stream
125
+ */
126
+ static VALUE end_stream(VALUE self)
127
+ {
128
+ yaml_emitter_t * emitter;
129
+ yaml_event_t event;
130
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
131
+
132
+ yaml_stream_end_event_initialize(&event);
133
+
134
+ emit(emitter, &event);
135
+
136
+ return self;
137
+ }
138
+
139
+ /* call-seq: emitter.start_document(version, tags, implicit)
140
+ *
141
+ * Start a document emission with YAML +version+, +tags+, and an +implicit+
142
+ * start.
143
+ *
144
+ * See Psych::Handler#start_document
145
+ */
146
+ static VALUE start_document(VALUE self, VALUE version, VALUE tags, VALUE imp)
147
+ {
148
+ yaml_emitter_t * emitter;
149
+ yaml_tag_directive_t * head = NULL;
150
+ yaml_tag_directive_t * tail = NULL;
151
+ yaml_event_t event;
152
+ yaml_version_directive_t version_directive;
153
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
154
+
155
+
156
+ Check_Type(version, T_ARRAY);
157
+
158
+ if(RARRAY_LEN(version) > 0) {
159
+ VALUE major = rb_ary_entry(version, (long)0);
160
+ VALUE minor = rb_ary_entry(version, (long)1);
161
+
162
+ version_directive.major = NUM2INT(major);
163
+ version_directive.minor = NUM2INT(minor);
164
+ }
165
+
166
+ if(RTEST(tags)) {
167
+ long i = 0;
168
+ long len;
169
+ rb_encoding * encoding = rb_utf8_encoding();
170
+
171
+ Check_Type(tags, T_ARRAY);
172
+
173
+ len = RARRAY_LEN(tags);
174
+ head = xcalloc((size_t)len, sizeof(yaml_tag_directive_t));
175
+ tail = head;
176
+
177
+ for(i = 0; i < len && i < RARRAY_LEN(tags); i++) {
178
+ VALUE tuple = RARRAY_AREF(tags, i);
179
+ VALUE name;
180
+ VALUE value;
181
+
182
+ Check_Type(tuple, T_ARRAY);
183
+
184
+ if(RARRAY_LEN(tuple) < 2) {
185
+ xfree(head);
186
+ rb_raise(rb_eRuntimeError, "tag tuple must be of length 2");
187
+ }
188
+ name = RARRAY_AREF(tuple, 0);
189
+ value = RARRAY_AREF(tuple, 1);
190
+ StringValue(name);
191
+ StringValue(value);
192
+ name = rb_str_export_to_enc(name, encoding);
193
+ value = rb_str_export_to_enc(value, encoding);
194
+
195
+ tail->handle = (yaml_char_t *)RSTRING_PTR(name);
196
+ tail->prefix = (yaml_char_t *)RSTRING_PTR(value);
197
+
198
+ tail++;
199
+ }
200
+ }
201
+
202
+ yaml_document_start_event_initialize(
203
+ &event,
204
+ (RARRAY_LEN(version) > 0) ? &version_directive : NULL,
205
+ head,
206
+ tail,
207
+ imp ? 1 : 0
208
+ );
209
+
210
+ emit(emitter, &event);
211
+
212
+ if(head) xfree(head);
213
+
214
+ return self;
215
+ }
216
+
217
+ /* call-seq: emitter.end_document(implicit)
218
+ *
219
+ * End a document emission with an +implicit+ ending.
220
+ *
221
+ * See Psych::Handler#end_document
222
+ */
223
+ static VALUE end_document(VALUE self, VALUE imp)
224
+ {
225
+ yaml_emitter_t * emitter;
226
+ yaml_event_t event;
227
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
228
+
229
+ yaml_document_end_event_initialize(&event, imp ? 1 : 0);
230
+
231
+ emit(emitter, &event);
232
+
233
+ return self;
234
+ }
235
+
236
+ /* call-seq: emitter.scalar(value, anchor, tag, plain, quoted, style)
237
+ *
238
+ * Emit a scalar with +value+, +anchor+, +tag+, and a +plain+ or +quoted+
239
+ * string type with +style+.
240
+ *
241
+ * See Psych::Handler#scalar
242
+ */
243
+ static VALUE scalar(
244
+ VALUE self,
245
+ VALUE value,
246
+ VALUE anchor,
247
+ VALUE tag,
248
+ VALUE plain,
249
+ VALUE quoted,
250
+ VALUE style
251
+ ) {
252
+ yaml_emitter_t * emitter;
253
+ yaml_event_t event;
254
+ rb_encoding *encoding;
255
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
256
+
257
+ Check_Type(value, T_STRING);
258
+
259
+ encoding = rb_utf8_encoding();
260
+
261
+ value = rb_str_export_to_enc(value, encoding);
262
+
263
+ if(!NIL_P(anchor)) {
264
+ Check_Type(anchor, T_STRING);
265
+ anchor = rb_str_export_to_enc(anchor, encoding);
266
+ }
267
+
268
+ if(!NIL_P(tag)) {
269
+ Check_Type(tag, T_STRING);
270
+ tag = rb_str_export_to_enc(tag, encoding);
271
+ }
272
+
273
+ yaml_scalar_event_initialize(
274
+ &event,
275
+ (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValuePtr(anchor)),
276
+ (yaml_char_t *)(NIL_P(tag) ? NULL : StringValuePtr(tag)),
277
+ (yaml_char_t*)StringValuePtr(value),
278
+ (int)RSTRING_LEN(value),
279
+ plain ? 1 : 0,
280
+ quoted ? 1 : 0,
281
+ (yaml_scalar_style_t)NUM2INT(style)
282
+ );
283
+
284
+ emit(emitter, &event);
285
+
286
+ return self;
287
+ }
288
+
289
+ /* call-seq: emitter.start_sequence(anchor, tag, implicit, style)
290
+ *
291
+ * Start emitting a sequence with +anchor+, a +tag+, +implicit+ sequence
292
+ * start and end, along with +style+.
293
+ *
294
+ * See Psych::Handler#start_sequence
295
+ */
296
+ static VALUE start_sequence(
297
+ VALUE self,
298
+ VALUE anchor,
299
+ VALUE tag,
300
+ VALUE implicit,
301
+ VALUE style
302
+ ) {
303
+ yaml_emitter_t * emitter;
304
+ yaml_event_t event;
305
+
306
+ rb_encoding * encoding = rb_utf8_encoding();
307
+
308
+ if(!NIL_P(anchor)) {
309
+ Check_Type(anchor, T_STRING);
310
+ anchor = rb_str_export_to_enc(anchor, encoding);
311
+ }
312
+
313
+ if(!NIL_P(tag)) {
314
+ Check_Type(tag, T_STRING);
315
+ tag = rb_str_export_to_enc(tag, encoding);
316
+ }
317
+
318
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
319
+
320
+ yaml_sequence_start_event_initialize(
321
+ &event,
322
+ (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValuePtr(anchor)),
323
+ (yaml_char_t *)(NIL_P(tag) ? NULL : StringValuePtr(tag)),
324
+ implicit ? 1 : 0,
325
+ (yaml_sequence_style_t)NUM2INT(style)
326
+ );
327
+
328
+ emit(emitter, &event);
329
+
330
+ return self;
331
+ }
332
+
333
+ /* call-seq: emitter.end_sequence
334
+ *
335
+ * End sequence emission.
336
+ *
337
+ * See Psych::Handler#end_sequence
338
+ */
339
+ static VALUE end_sequence(VALUE self)
340
+ {
341
+ yaml_emitter_t * emitter;
342
+ yaml_event_t event;
343
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
344
+
345
+ yaml_sequence_end_event_initialize(&event);
346
+
347
+ emit(emitter, &event);
348
+
349
+ return self;
350
+ }
351
+
352
+ /* call-seq: emitter.start_mapping(anchor, tag, implicit, style)
353
+ *
354
+ * Start emitting a YAML map with +anchor+, +tag+, an +implicit+ start
355
+ * and end, and +style+.
356
+ *
357
+ * See Psych::Handler#start_mapping
358
+ */
359
+ static VALUE start_mapping(
360
+ VALUE self,
361
+ VALUE anchor,
362
+ VALUE tag,
363
+ VALUE implicit,
364
+ VALUE style
365
+ ) {
366
+ yaml_emitter_t * emitter;
367
+ yaml_event_t event;
368
+ rb_encoding *encoding;
369
+
370
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
371
+
372
+ encoding = rb_utf8_encoding();
373
+
374
+ if(!NIL_P(anchor)) {
375
+ Check_Type(anchor, T_STRING);
376
+ anchor = rb_str_export_to_enc(anchor, encoding);
377
+ }
378
+
379
+ if(!NIL_P(tag)) {
380
+ Check_Type(tag, T_STRING);
381
+ tag = rb_str_export_to_enc(tag, encoding);
382
+ }
383
+
384
+ yaml_mapping_start_event_initialize(
385
+ &event,
386
+ (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValuePtr(anchor)),
387
+ (yaml_char_t *)(NIL_P(tag) ? NULL : StringValuePtr(tag)),
388
+ implicit ? 1 : 0,
389
+ (yaml_mapping_style_t)NUM2INT(style)
390
+ );
391
+
392
+ emit(emitter, &event);
393
+
394
+ return self;
395
+ }
396
+
397
+ /* call-seq: emitter.end_mapping
398
+ *
399
+ * Emit the end of a mapping.
400
+ *
401
+ * See Psych::Handler#end_mapping
402
+ */
403
+ static VALUE end_mapping(VALUE self)
404
+ {
405
+ yaml_emitter_t * emitter;
406
+ yaml_event_t event;
407
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
408
+
409
+ yaml_mapping_end_event_initialize(&event);
410
+
411
+ emit(emitter, &event);
412
+
413
+ return self;
414
+ }
415
+
416
+ /* call-seq: emitter.alias(anchor)
417
+ *
418
+ * Emit an alias with +anchor+.
419
+ *
420
+ * See Psych::Handler#alias
421
+ */
422
+ static VALUE alias(VALUE self, VALUE anchor)
423
+ {
424
+ yaml_emitter_t * emitter;
425
+ yaml_event_t event;
426
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
427
+
428
+ if(!NIL_P(anchor)) {
429
+ Check_Type(anchor, T_STRING);
430
+ anchor = rb_str_export_to_enc(anchor, rb_utf8_encoding());
431
+ }
432
+
433
+ yaml_alias_event_initialize(
434
+ &event,
435
+ (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValuePtr(anchor))
436
+ );
437
+
438
+ emit(emitter, &event);
439
+
440
+ return self;
441
+ }
442
+
443
+ /* call-seq: emitter.canonical = true
444
+ *
445
+ * Set the output style to canonical, or not.
446
+ */
447
+ static VALUE set_canonical(VALUE self, VALUE style)
448
+ {
449
+ yaml_emitter_t * emitter;
450
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
451
+
452
+ yaml_emitter_set_canonical(emitter, Qtrue == style ? 1 : 0);
453
+
454
+ return style;
455
+ }
456
+
457
+ /* call-seq: emitter.canonical
458
+ *
459
+ * Get the output style, canonical or not.
460
+ */
461
+ static VALUE canonical(VALUE self)
462
+ {
463
+ yaml_emitter_t * emitter;
464
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
465
+
466
+ return (emitter->canonical == 0) ? Qfalse : Qtrue;
467
+ }
468
+
469
+ /* call-seq: emitter.indentation = level
470
+ *
471
+ * Set the indentation level to +level+. The level must be less than 10 and
472
+ * greater than 1.
473
+ */
474
+ static VALUE set_indentation(VALUE self, VALUE level)
475
+ {
476
+ yaml_emitter_t * emitter;
477
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
478
+
479
+ yaml_emitter_set_indent(emitter, NUM2INT(level));
480
+
481
+ return level;
482
+ }
483
+
484
+ /* call-seq: emitter.indentation
485
+ *
486
+ * Get the indentation level.
487
+ */
488
+ static VALUE indentation(VALUE self)
489
+ {
490
+ yaml_emitter_t * emitter;
491
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
492
+
493
+ return INT2NUM(emitter->best_indent);
494
+ }
495
+
496
+ /* call-seq: emitter.line_width
497
+ *
498
+ * Get the preferred line width.
499
+ */
500
+ static VALUE line_width(VALUE self)
501
+ {
502
+ yaml_emitter_t * emitter;
503
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
504
+
505
+ return INT2NUM(emitter->best_width);
506
+ }
507
+
508
+ /* call-seq: emitter.line_width = width
509
+ *
510
+ * Set the preferred line with to +width+.
511
+ */
512
+ static VALUE set_line_width(VALUE self, VALUE width)
513
+ {
514
+ yaml_emitter_t * emitter;
515
+ TypedData_Get_Struct(self, yaml_emitter_t, &psych_emitter_type, emitter);
516
+
517
+ yaml_emitter_set_width(emitter, NUM2INT(width));
518
+
519
+ return width;
520
+ }
521
+
522
+ void Init_psych_emitter(void)
523
+ {
524
+ VALUE psych = rb_define_module("Psych");
525
+ VALUE handler = rb_define_class_under(psych, "Handler", rb_cObject);
526
+ cPsychEmitter = rb_define_class_under(psych, "Emitter", handler);
527
+
528
+ rb_define_alloc_func(cPsychEmitter, allocate);
529
+
530
+ rb_define_method(cPsychEmitter, "initialize", initialize, -1);
531
+ rb_define_method(cPsychEmitter, "start_stream", start_stream, 1);
532
+ rb_define_method(cPsychEmitter, "end_stream", end_stream, 0);
533
+ rb_define_method(cPsychEmitter, "start_document", start_document, 3);
534
+ rb_define_method(cPsychEmitter, "end_document", end_document, 1);
535
+ rb_define_method(cPsychEmitter, "scalar", scalar, 6);
536
+ rb_define_method(cPsychEmitter, "start_sequence", start_sequence, 4);
537
+ rb_define_method(cPsychEmitter, "end_sequence", end_sequence, 0);
538
+ rb_define_method(cPsychEmitter, "start_mapping", start_mapping, 4);
539
+ rb_define_method(cPsychEmitter, "end_mapping", end_mapping, 0);
540
+ rb_define_method(cPsychEmitter, "alias", alias, 1);
541
+ rb_define_method(cPsychEmitter, "canonical", canonical, 0);
542
+ rb_define_method(cPsychEmitter, "canonical=", set_canonical, 1);
543
+ rb_define_method(cPsychEmitter, "indentation", indentation, 0);
544
+ rb_define_method(cPsychEmitter, "indentation=", set_indentation, 1);
545
+ rb_define_method(cPsychEmitter, "line_width", line_width, 0);
546
+ rb_define_method(cPsychEmitter, "line_width=", set_line_width, 1);
547
+
548
+ id_io = rb_intern("io");
549
+ id_write = rb_intern("write");
550
+ id_line_width = rb_intern("line_width");
551
+ id_indentation = rb_intern("indentation");
552
+ id_canonical = rb_intern("canonical");
553
+ }
554
+ /* vim: set noet sws=4 sw=4: */