fast-xml 1.0.1 → 1.1.0

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,16 @@
1
+ /* CC0 (Public domain) - see ccan/licenses/CC0 file for details */
2
+ #ifndef CCAN_STR_H
3
+ #define CCAN_STR_H
4
+ /**
5
+ * stringify - Turn expression into a string literal
6
+ * @expr: any C expression
7
+ *
8
+ * Example:
9
+ * #define PRINT_COND_IF_FALSE(cond) \
10
+ * ((cond) || printf("%s is false!", stringify(cond)))
11
+ */
12
+ #define stringify(expr) stringify_1(expr)
13
+ /* Double-indirection required to stringify expansions */
14
+ #define stringify_1(expr) #expr
15
+
16
+ #endif /* CCAN_STR_H */
@@ -8,6 +8,7 @@ void Init_fastxml();
8
8
  VALUE xh_module;
9
9
  VALUE xh_parse_error_class;
10
10
  ID xh_id_next;
11
+ ID xh_id_initialize;
11
12
 
12
13
  typedef struct {
13
14
  int argc;
@@ -15,6 +16,12 @@ typedef struct {
15
16
  xh_h2x_ctx_t *ctx;
16
17
  } xh_h2x_arg_t;
17
18
 
19
+ typedef struct {
20
+ int argc;
21
+ VALUE *argv;
22
+ xh_x2h_ctx_t *ctx;
23
+ } xh_x2h_arg_t;
24
+
18
25
  static VALUE
19
26
  hash2xml_exec(VALUE a) {
20
27
  xh_h2x_arg_t *arg = (xh_h2x_arg_t *) a;
@@ -49,11 +56,36 @@ hash2xml(int argc, VALUE *argv, VALUE self) {
49
56
  return result;
50
57
  }
51
58
 
59
+ static VALUE
60
+ xml2hash_exec(VALUE a) {
61
+ xh_x2h_arg_t *arg = (xh_x2h_arg_t *) a;
62
+
63
+ xh_x2h_init_ctx(arg->ctx, arg->argc, arg->argv);
64
+
65
+ return xh_x2h(arg->ctx);
66
+ }
67
+
52
68
  static VALUE
53
69
  xml2hash(int argc, VALUE *argv, VALUE self) {
54
- VALUE obj = Qnil;
70
+ xh_x2h_ctx_t ctx;
71
+ VALUE result;
72
+ int state;
73
+ xh_x2h_arg_t arg;
55
74
 
56
- return obj;
75
+ arg.argc = argc;
76
+ arg.argv = argv;
77
+ arg.ctx = &ctx;
78
+
79
+ result = rb_protect(xml2hash_exec, (VALUE) &arg, &state);
80
+
81
+ if (state) {
82
+ xh_x2h_destroy_ctx(&ctx);
83
+ rb_exc_raise(rb_errinfo());
84
+ }
85
+
86
+ xh_x2h_destroy_ctx(&ctx);
87
+
88
+ return result;
57
89
  }
58
90
 
59
91
  void Init_fastxml(void) {
@@ -64,4 +96,5 @@ void Init_fastxml(void) {
64
96
  rb_define_module_function(xh_module, "xml2hash", xml2hash, -1);
65
97
 
66
98
  xh_id_next = rb_intern("next");
99
+ xh_id_initialize = rb_intern("initialize");
67
100
  }
data/ext/fastxml/xh.c CHANGED
@@ -96,14 +96,6 @@ xh_parse_arg(VALUE key, VALUE value, VALUE ctx)
96
96
  keylen = RSTRING_LEN(key);
97
97
 
98
98
  switch (keylen) {
99
- case 2:
100
- if (xh_str_equal2(keyptr, 'c', 'b')) {
101
- VALUE v = rb_inspect(value);
102
- rb_warn("cb: %s\n", StringValueCStr(v));
103
- opts->cb = xh_param_assign_cb(value);
104
- break;
105
- }
106
- goto error;
107
99
  #ifdef XH_HAVE_DOM
108
100
  case 3:
109
101
  if (xh_str_equal3(keyptr, 'd', 'o', 'c')) {
@@ -278,6 +270,8 @@ xh_parse_args(xh_opts_t *opts, xh_int_t *nparam, xh_int_t argc, VALUE *argv)
278
270
  (*nparam)++;
279
271
 
280
272
  rb_hash_foreach(hash, xh_parse_arg, (VALUE) opts);
273
+
274
+ opts->block_given = xh_param_assign_block();
281
275
  }
282
276
 
283
277
  void *
@@ -320,6 +314,23 @@ xh_get_hash_param(xh_int_t *nparam, xh_int_t argc, VALUE *argv)
320
314
  return param;
321
315
  }
322
316
 
317
+ VALUE
318
+ xh_get_str_param(xh_int_t *nparam, xh_int_t argc, VALUE *argv)
319
+ {
320
+ VALUE param;
321
+
322
+ if (*nparam >= argc)
323
+ rb_raise(rb_eArgError, "Invalid parameters");
324
+
325
+ param = argv[*nparam];
326
+ if (!RB_TYPE_P(param, RUBY_T_STRING))
327
+ rb_raise(rb_eArgError, "Parameter is not a string");
328
+
329
+ (*nparam)++;
330
+
331
+ return param;
332
+ }
333
+
323
334
  void
324
335
  xh_merge_opts(xh_opts_t *ctx_opts, xh_opts_t *opts, xh_int_t *nparam, xh_int_t argc, VALUE *argv)
325
336
  {
data/ext/fastxml/xh.h CHANGED
@@ -35,7 +35,7 @@ typedef struct {
35
35
  xh_bool_t force_content;
36
36
  xh_bool_t merge_text;
37
37
  xh_pattern_t filter;
38
- VALUE cb;
38
+ xh_bool_t block_given;
39
39
 
40
40
  /* LX options */
41
41
  xh_char_t attr[XH_PARAM_LEN];
@@ -53,6 +53,7 @@ void xh_parse_args(xh_opts_t *opts, xh_int_t *nparam, xh_int_t argc, VALUE *argv
53
53
  void xh_copy_opts(xh_opts_t *dst, xh_opts_t *src);
54
54
  void *xh_get_obj_param(xh_int_t *nparam, xh_int_t argc, VALUE *argv, const char *class);
55
55
  VALUE xh_get_hash_param(xh_int_t *nparam, xh_int_t argc, VALUE *argv);
56
+ VALUE xh_get_str_param(xh_int_t *nparam, xh_int_t argc, VALUE *argv);
56
57
  void xh_merge_opts(xh_opts_t *ctx_opts, xh_opts_t *opts, xh_int_t *nparam, xh_int_t argc, VALUE *argv);
57
58
 
58
59
  #endif /* _XH_H_ */
@@ -2,6 +2,8 @@
2
2
  #define _XH_CONFIG_H_
3
3
 
4
4
  #include "ruby.h"
5
+ #include "ruby/io.h"
6
+ #include "ruby/re.h"
5
7
  #if HAVE_RUBY_ENCODING_H
6
8
  #include "ruby/encoding.h"
7
9
  #endif
@@ -70,5 +72,6 @@ typedef u_char xh_char_t;
70
72
  extern VALUE xh_module;
71
73
  extern VALUE xh_parse_error_class;
72
74
  extern ID xh_id_next;
75
+ extern ID xh_id_initialize;
73
76
 
74
77
  #endif /* _XH_CONFIG_H_ */
@@ -35,19 +35,15 @@
35
35
  #include "xh_string.h"
36
36
  #include "xh_sort.h"
37
37
  #include "xh_stack.h"
38
- //#include "xh_stash.h"
39
38
  #include "xh_param.h"
40
39
  #include "xh_buffer_helper.h"
41
40
  #include "xh_buffer.h"
42
41
  #include "xh_ruby_buffer.h"
43
42
  #include "xh_encoder.h"
44
- //#include "xh_reader.h"
43
+ #include "xh_reader.h"
45
44
  #include "xh_writer.h"
46
45
  #include "xh.h"
47
46
  #include "xh_h2x.h"
48
47
  #include "xh_xml.h"
49
- /*
50
48
  #include "xh_x2h.h"
51
- #include "xh_dom.h"
52
- */
53
49
  #endif /* _XH_CORE_H_ */
data/ext/fastxml/xh_log.h CHANGED
@@ -14,25 +14,35 @@ typedef enum {
14
14
  XH_LOG_TRACE
15
15
  } xh_log_level_t;
16
16
 
17
+ #if __STDC_VERSION__ < 199901L
18
+ # if __GNUC__ >= 2
19
+ # define XH_CURRENT_FUNCTION __FUNCTION__
20
+ # else
21
+ # define XH_CURRENT_FUNCTION "<unknown>"
22
+ # endif
23
+ #else
24
+ # define XH_CURRENT_FUNCTION __func__
25
+ #endif
26
+
17
27
  #ifdef WITH_TRACE
18
28
  #define xh_log_debug0(msg) \
19
- xh_log(XH_LOG_DEBUG, __FUNCTION__, __LINE__, msg)
29
+ xh_log(XH_LOG_DEBUG, XH_CURRENT_FUNCTION, __LINE__, msg)
20
30
  #define xh_log_debug1(msg, arg1) \
21
- xh_log(XH_LOG_DEBUG, __FUNCTION__, __LINE__, msg, arg1)
31
+ xh_log(XH_LOG_DEBUG, XH_CURRENT_FUNCTION, __LINE__, msg, arg1)
22
32
  #define xh_log_debug2(msg, arg1, arg2) \
23
- xh_log(XH_LOG_DEBUG, __FUNCTION__, __LINE__, msg, arg1, arg2)
33
+ xh_log(XH_LOG_DEBUG, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2)
24
34
  #define xh_log_debug3(msg, arg1, arg2, arg3) \
25
- xh_log(XH_LOG_DEBUG, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3)
35
+ xh_log(XH_LOG_DEBUG, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3)
26
36
  #define xh_log_debug4(msg, arg1, arg2, arg3, arg4) \
27
- xh_log(XH_LOG_DEBUG, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3, arg4)
37
+ xh_log(XH_LOG_DEBUG, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3, arg4)
28
38
  #define xh_log_debug5(msg, arg1, arg2, arg3, arg4, arg5) \
29
- xh_log(XH_LOG_DEBUG, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3, arg4, arg5)
39
+ xh_log(XH_LOG_DEBUG, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3, arg4, arg5)
30
40
  #define xh_log_debug6(msg, arg1, arg2, arg3, arg4, arg5, arg6) \
31
- xh_log(XH_LOG_DEBUG, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6)
41
+ xh_log(XH_LOG_DEBUG, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6)
32
42
  #define xh_log_debug7(msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
33
- xh_log(XH_LOG_DEBUG, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
43
+ xh_log(XH_LOG_DEBUG, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
34
44
  #define xh_log_debug8(msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \
35
- xh_log(XH_LOG_DEBUG, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
45
+ xh_log(XH_LOG_DEBUG, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
36
46
  #else
37
47
  #define xh_log_debug0(msg)
38
48
  #define xh_log_debug1(msg, arg1)
@@ -47,23 +57,23 @@ typedef enum {
47
57
 
48
58
  #ifdef WITH_TRACE
49
59
  #define xh_log_trace0(msg) \
50
- xh_log(XH_LOG_TRACE, __FUNCTION__, __LINE__, msg)
60
+ xh_log(XH_LOG_TRACE, XH_CURRENT_FUNCTION, __LINE__, msg)
51
61
  #define xh_log_trace1(msg, arg1) \
52
- xh_log(XH_LOG_TRACE, __FUNCTION__, __LINE__, msg, arg1)
62
+ xh_log(XH_LOG_TRACE, XH_CURRENT_FUNCTION, __LINE__, msg, arg1)
53
63
  #define xh_log_trace2(msg, arg1, arg2) \
54
- xh_log(XH_LOG_TRACE, __FUNCTION__, __LINE__, msg, arg1, arg2)
64
+ xh_log(XH_LOG_TRACE, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2)
55
65
  #define xh_log_trace3(msg, arg1, arg2, arg3) \
56
- xh_log(XH_LOG_TRACE, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3)
66
+ xh_log(XH_LOG_TRACE, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3)
57
67
  #define xh_log_trace4(msg, arg1, arg2, arg3, arg4) \
58
- xh_log(XH_LOG_TRACE, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3, arg4)
68
+ xh_log(XH_LOG_TRACE, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3, arg4)
59
69
  #define xh_log_trace5(msg, arg1, arg2, arg3, arg4, arg5) \
60
- xh_log(XH_LOG_TRACE, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3, arg4, arg5)
70
+ xh_log(XH_LOG_TRACE, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3, arg4, arg5)
61
71
  #define xh_log_trace6(msg, arg1, arg2, arg3, arg4, arg5, arg6) \
62
- xh_log(XH_LOG_TRACE, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6)
72
+ xh_log(XH_LOG_TRACE, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6)
63
73
  #define xh_log_trace7(msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
64
- xh_log(XH_LOG_TRACE, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
74
+ xh_log(XH_LOG_TRACE, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
65
75
  #define xh_log_trace8(msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \
66
- xh_log(XH_LOG_TRACE, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
76
+ xh_log(XH_LOG_TRACE, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
67
77
  #else
68
78
  #define xh_log_trace0(msg)
69
79
  #define xh_log_trace1(msg, arg1)
@@ -77,23 +87,23 @@ typedef enum {
77
87
  #endif
78
88
 
79
89
  #define xh_log_error0(msg) \
80
- xh_log(XH_LOG_ERROR, __FUNCTION__, __LINE__, msg)
90
+ xh_log(XH_LOG_ERROR, XH_CURRENT_FUNCTION, __LINE__, msg)
81
91
  #define xh_log_error1(msg, arg1) \
82
- xh_log(XH_LOG_ERROR, __FUNCTION__, __LINE__, msg, arg1)
92
+ xh_log(XH_LOG_ERROR, XH_CURRENT_FUNCTION, __LINE__, msg, arg1)
83
93
  #define xh_log_error2(msg, arg1, arg2) \
84
- xh_log(XH_LOG_ERROR, __FUNCTION__, __LINE__, msg, arg1, arg2)
94
+ xh_log(XH_LOG_ERROR, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2)
85
95
  #define xh_log_error3(msg, arg1, arg2, arg3) \
86
- xh_log(XH_LOG_ERROR, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3)
96
+ xh_log(XH_LOG_ERROR, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3)
87
97
  #define xh_log_error4(msg, arg1, arg2, arg3, arg4) \
88
- xh_log(XH_LOG_ERROR, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3, arg4)
98
+ xh_log(XH_LOG_ERROR, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3, arg4)
89
99
  #define xh_log_error5(msg, arg1, arg2, arg3, arg4, arg5) \
90
- xh_log(XH_LOG_ERROR, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3, arg4, arg5)
100
+ xh_log(XH_LOG_ERROR, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3, arg4, arg5)
91
101
  #define xh_log_error6(msg, arg1, arg2, arg3, arg4, arg5, arg6) \
92
- xh_log(XH_LOG_ERROR, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6)
102
+ xh_log(XH_LOG_ERROR, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6)
93
103
  #define xh_log_error7(msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
94
- xh_log(XH_LOG_ERROR, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
104
+ xh_log(XH_LOG_ERROR, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
95
105
  #define xh_log_error8(msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \
96
- xh_log(XH_LOG_ERROR, __FUNCTION__, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
106
+ xh_log(XH_LOG_ERROR, XH_CURRENT_FUNCTION, __LINE__, msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
97
107
 
98
108
  void xh_log(xh_log_level_t log_level, const char *func, xh_int_t line, const char *msg, ...);
99
109
 
@@ -62,16 +62,8 @@ xh_param_assign_filter(xh_pattern_t *patt, VALUE value)
62
62
  }
63
63
  }
64
64
 
65
- VALUE
66
- xh_param_assign_cb(VALUE value)
65
+ xh_bool_t
66
+ xh_param_assign_block(void)
67
67
  {
68
- if ( !RTEST(value) )
69
- return Qnil;
70
-
71
- if (rb_cProc != rb_class_of(value) && rb_cMethod != rb_class_of(value))
72
- rb_raise(rb_eArgError, "Expected Proc or Method callback");
73
-
74
- //rb_funcall(value, rb_intern("call"), 0);
75
-
76
- return value;
68
+ return rb_block_given_p() ? TRUE : FALSE;
77
69
  }
@@ -15,7 +15,7 @@ void xh_param_assign_int(xh_char_t *name, xh_int_t *param, VALUE value);
15
15
  xh_bool_t xh_param_assign_bool(VALUE value);
16
16
  void xh_param_assign_pattern(xh_pattern_t *param, VALUE value);
17
17
  void xh_param_assign_filter(xh_pattern_t *param, VALUE value);
18
- VALUE xh_param_assign_cb(VALUE value);
18
+ VALUE xh_param_assign_block(void);
19
19
 
20
20
  #define XH_PARAM_LEN 32
21
21