ucl 0.1.0 → 0.1.2

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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/ext/ucl.c +57 -27
  3. data/ucl.gemspec +1 -1
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 123bfade721343ef51a1b839b450365e7d2aa934e16e9d537a708582336aca60
4
- data.tar.gz: c2f59b562e9a13fb4535e65055acf6d4fa8e140161ecb445875699314163cc93
3
+ metadata.gz: 3fb8e8b518ea32adfa5365bf32e260487f3aa4ec9e546738911e6cf37a16e300
4
+ data.tar.gz: e9067e8747899c187f9ae400cd4bfe58e4343c41ff04b70cdbe161a500062bfc
5
5
  SHA512:
6
- metadata.gz: fe5a117504dd4694952d5555107a8c7c886ca25a5a2bebe5e52f394552fbf39386175040080a85dcaf4a240d7837af436a483255ae0f2411932de2b62bbed98f
7
- data.tar.gz: ccebbfb07adabb8e892c855ccacf385ee79a81415b5f57a1b1ce50fffb7fb01e233902265bac6f6950fc3aa93e44f8a8067c122a08e029ce85df1348294bb94c
6
+ metadata.gz: 962eea2f25228aec1ee903315074ceabd9cc424b2afab0963e68179fd39f1666abe6954404594ae6d4c658704b89200d4bfad21174bc9cd298b8ce66ea9252b7
7
+ data.tar.gz: b5c9bbe4b92be69734f5bd0df81a043dba97158489da7f67d7fce6e33f976a6eb209c45b7a72690bd441aa2fd8aed203f47389753328efd875fe05175e875afa
data/ext/ucl.c CHANGED
@@ -25,6 +25,11 @@
25
25
  static VALUE mUCL = Qundef;
26
26
  static VALUE eUCLError = Qundef;
27
27
 
28
+ static int ucl_allowed_flags = UCL_PARSER_KEY_LOWERCASE |
29
+ UCL_PARSER_NO_TIME |
30
+ UCL_PARSER_DISABLE_MACRO |
31
+ UCL_PARSER_NO_FILEVARS ;
32
+
28
33
 
29
34
  VALUE
30
35
  _iterate_valid_ucl(ucl_object_t const *root, int flags)
@@ -103,6 +108,20 @@ _iterate_valid_ucl(ucl_object_t const *root, int flags)
103
108
  }
104
109
  }
105
110
 
111
+ static VALUE
112
+ ucl_s_get_flags(VALUE klass)
113
+ {
114
+ return rb_iv_get(klass, "@flags");
115
+ }
116
+
117
+
118
+ static VALUE
119
+ ucl_s_set_flags(VALUE klass, VALUE val)
120
+ {
121
+ rb_check_type(val, T_FIXNUM);
122
+ rb_iv_set(klass, "@flags", val);
123
+ return val;
124
+ }
106
125
 
107
126
 
108
127
  /**
@@ -116,19 +135,14 @@ _iterate_valid_ucl(ucl_object_t const *root, int flags)
116
135
  static VALUE
117
136
  ucl_s_parse(int argc, VALUE *argv, VALUE klass)
118
137
  {
119
- static int allowed_flags = UCL_PARSER_KEY_LOWERCASE |
120
- UCL_PARSER_NO_TIME |
121
- UCL_PARSER_DISABLE_MACRO |
122
- UCL_PARSER_NO_FILEVARS ;
123
-
124
138
  VALUE data, flags;
125
139
  rb_scan_args(argc, argv, "11", &data, &flags);
126
- if (NIL_P(flags)) flags = INT2FIX(0);
140
+ if (NIL_P(flags)) flags = ucl_s_get_flags(mUCL);
127
141
 
128
142
  rb_check_type(data, T_STRING);
129
143
  rb_check_type(flags, T_FIXNUM);
130
144
 
131
- int c_flags = FIX2INT(flags) & allowed_flags;
145
+ int c_flags = FIX2INT(flags) & ucl_allowed_flags;
132
146
 
133
147
  struct ucl_parser *parser =
134
148
  ucl_parser_new(c_flags | UCL_PARSER_NO_IMPLICIT_ARRAYS);
@@ -138,20 +152,16 @@ ucl_s_parse(int argc, VALUE *argv, VALUE klass)
138
152
  RSTRING_LEN(data));
139
153
 
140
154
  if (ucl_parser_get_error(parser)) {
141
- rb_raise(eUCLError, "%s", ucl_parser_get_error(parser));
155
+ const char *errormsg = ucl_parser_get_error(parser);
156
+ if (parser != NULL) { ucl_parser_free(parser); }
157
+ rb_raise(eUCLError, "%s", errormsg);
142
158
  }
143
159
 
144
160
  ucl_object_t *root = ucl_parser_get_object(parser);
161
+ VALUE res = _iterate_valid_ucl(root, FIX2INT(flags));
145
162
 
146
- VALUE res = _iterate_valid_ucl(root, FIX2INT(flags));
147
-
148
- if (parser != NULL) {
149
- ucl_parser_free(parser);
150
- }
151
-
152
- if (root != NULL) {
153
- ucl_object_unref(root);
154
- }
163
+ if (parser != NULL) { ucl_parser_free(parser); }
164
+ if (root != NULL) { ucl_object_unref(root); }
155
165
 
156
166
  return res;
157
167
  }
@@ -173,22 +183,38 @@ ucl_s_load_file(int argc, VALUE *argv, VALUE klass)
173
183
  {
174
184
  VALUE file, flags;
175
185
  rb_scan_args(argc, argv, "11", &file, &flags);
186
+ if (NIL_P(flags)) flags = ucl_s_get_flags(mUCL);
176
187
 
177
- VALUE read_kwargs = rb_hash_new();
178
- rb_hash_aset(read_kwargs, rb_id2sym(rb_intern("encoding")),
179
- rb_str_new_cstr("BINARY"));
188
+ rb_check_type(file, T_STRING);
189
+ rb_check_type(flags, T_FIXNUM);
190
+
191
+ int c_flags = FIX2INT(flags) & ucl_allowed_flags;
192
+ char *c_file = StringValueCStr(file);
193
+
194
+ struct ucl_parser *parser =
195
+ ucl_parser_new(c_flags | UCL_PARSER_NO_IMPLICIT_ARRAYS);
196
+ ucl_parser_add_file(parser, c_file);
197
+
198
+ if (ucl_parser_get_error(parser)) {
199
+ const char *errormsg = ucl_parser_get_error(parser);
200
+ if (parser != NULL) { ucl_parser_free(parser); }
201
+ rb_raise(eUCLError, "%s", errormsg);
202
+ }
180
203
 
181
- VALUE read_args[] = { file, read_kwargs };
182
- VALUE data = rb_funcallv_kw(rb_cFile, rb_intern("read"),
183
- 2, read_args, RB_PASS_KEYWORDS);
204
+ ucl_object_t *root = ucl_parser_get_object(parser);
205
+ VALUE res = _iterate_valid_ucl(root, FIX2INT(flags));
184
206
 
185
- VALUE parse_args[] = { data, flags };
186
- return ucl_s_parse(2, parse_args, klass);
207
+ if (parser != NULL) { ucl_parser_free(parser); }
208
+ if (root != NULL) { ucl_object_unref(root); }
209
+
210
+ return res;
187
211
  }
188
212
 
189
213
 
190
214
 
191
215
 
216
+
217
+
192
218
  void Init_ucl(void) {
193
219
  /* Main classes */
194
220
  mUCL = rb_define_class("UCL", rb_cObject);
@@ -200,11 +226,15 @@ void Init_ucl(void) {
200
226
  rb_define_const(mUCL, "DISABLE_MACRO", INT2FIX(UCL_PARSER_DISABLE_MACRO));
201
227
  rb_define_const(mUCL, "NO_FILEVARS", INT2FIX(UCL_PARSER_NO_FILEVARS ));
202
228
  rb_define_const(mUCL, "KEY_SYMBOL", INT2FIX(UCL_PARSER_KEY_SYMBOL ));
203
-
229
+
230
+ /* Variables */
231
+ ucl_s_set_flags(mUCL, INT2FIX(0));
232
+
204
233
  /* Definitions */
205
234
  rb_define_singleton_method(mUCL, "load_file", ucl_s_load_file, -1);
206
235
  rb_define_singleton_method(mUCL, "parse", ucl_s_parse, -1);
207
-
236
+ rb_define_singleton_method(mUCL, "flags", ucl_s_get_flags, 0);
237
+ rb_define_singleton_method(mUCL, "flags=", ucl_s_set_flags, 1);
208
238
  }
209
239
 
210
240
 
data/ucl.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'ucl'
3
- s.version = '0.1.0'
3
+ s.version = '0.1.2'
4
4
  s.summary = " Universal configuration library parser"
5
5
  s.description = <<~EOF
6
6
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ucl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stéphane D'Alu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-19 00:00:00.000000000 Z
11
+ date: 2022-12-20 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |2+
14
14