ruby_rnv 0.2.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.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/ext/rnv/extconf.rb +15 -0
  4. data/ext/rnv/ruby_rnv.c +742 -0
  5. data/ext/rnv/src/ary.c +78 -0
  6. data/ext/rnv/src/ary.h +10 -0
  7. data/ext/rnv/src/drv.c +472 -0
  8. data/ext/rnv/src/drv.h +35 -0
  9. data/ext/rnv/src/er.c +15 -0
  10. data/ext/rnv/src/er.h +16 -0
  11. data/ext/rnv/src/erbit.h +14 -0
  12. data/ext/rnv/src/ht.c +90 -0
  13. data/ext/rnv/src/ht.h +22 -0
  14. data/ext/rnv/src/ll.h +43 -0
  15. data/ext/rnv/src/m.c +60 -0
  16. data/ext/rnv/src/m.h +10 -0
  17. data/ext/rnv/src/rn.c +569 -0
  18. data/ext/rnv/src/rn.h +150 -0
  19. data/ext/rnv/src/rnc.c +1191 -0
  20. data/ext/rnv/src/rnc.h +68 -0
  21. data/ext/rnv/src/rnd.c +436 -0
  22. data/ext/rnv/src/rnd.h +25 -0
  23. data/ext/rnv/src/rnl.c +62 -0
  24. data/ext/rnv/src/rnl.h +18 -0
  25. data/ext/rnv/src/rnv.c +158 -0
  26. data/ext/rnv/src/rnv.h +30 -0
  27. data/ext/rnv/src/rnx.c +153 -0
  28. data/ext/rnv/src/rnx.h +16 -0
  29. data/ext/rnv/src/rx.c +749 -0
  30. data/ext/rnv/src/rx.h +43 -0
  31. data/ext/rnv/src/rx_cls_ranges.c +126 -0
  32. data/ext/rnv/src/rx_cls_u.c +262 -0
  33. data/ext/rnv/src/s.c +103 -0
  34. data/ext/rnv/src/s.h +32 -0
  35. data/ext/rnv/src/sc.c +62 -0
  36. data/ext/rnv/src/sc.h +26 -0
  37. data/ext/rnv/src/type.h +121 -0
  38. data/ext/rnv/src/u.c +88 -0
  39. data/ext/rnv/src/u.h +26 -0
  40. data/ext/rnv/src/xcl.c +472 -0
  41. data/ext/rnv/src/xmlc.c +20 -0
  42. data/ext/rnv/src/xmlc.h +16 -0
  43. data/ext/rnv/src/xsd.c +789 -0
  44. data/ext/rnv/src/xsd.h +27 -0
  45. data/ext/rnv/src/xsd_tm.c +100 -0
  46. data/ext/rnv/src/xsd_tm.h +15 -0
  47. data/lib/rnv.rb +2 -0
  48. data/lib/rnv/ox_sax_document.rb +84 -0
  49. data/lib/rnv/validator.rb +104 -0
  50. metadata +175 -0
data/ext/rnv/src/xsd.h ADDED
@@ -0,0 +1,27 @@
1
+ /* $Id: xsd.h,v 1.14 2005/01/05 09:46:25 dvd Exp $ */
2
+
3
+ #include <stdarg.h>
4
+ #include "type.h"
5
+
6
+ #ifndef XSD_H
7
+ #define XSD_H 1
8
+
9
+ #define XSD_ER_TYP 0
10
+ #define XSD_ER_PAR 1
11
+ #define XSD_ER_PARVAL 2
12
+ #define XSD_ER_VAL 3
13
+ #define XSD_ER_NPAT 4
14
+ #define XSD_ER_WS 5
15
+ #define XSD_ER_ENUM 6
16
+
17
+ extern void xsd_default_verror_handler(rnv_t *rnv, int erno,va_list ap);
18
+
19
+ extern void xsd_init(rx_st_t *rx_st);
20
+ extern void xsd_clear(void);
21
+
22
+ extern int xsd_allows(rx_st_t *rx_st, char *typ,char *ps,char *s,int n);
23
+ extern int xsd_equal(rx_st_t *rx_st, char *typ,char *val,char *s,int n);
24
+
25
+ extern void xsd_test(void);
26
+
27
+ #endif
@@ -0,0 +1,100 @@
1
+ /* $Id: xsd_tm.c,v 1.9 2004/02/25 00:00:32 dvd Exp $ */
2
+
3
+ #include <stdlib.h> /*strtol*/
4
+ #include <limits.h>
5
+ #include <string.h> /*strlen*/
6
+ #include <assert.h>
7
+ #include "xsd_tm.h"
8
+
9
+ static int leap(int yr) {return !(yr%4)&&((yr%100)||!(yr%400));}
10
+ static int y2d(int yr) {return yr*365+yr/4-yr/100+yr/400;}
11
+ static int ymd2dn(int yr,int mo,int dy) {
12
+ switch(mo) {
13
+ case 12: dy+=30;
14
+ case 11: dy+=31;
15
+ case 10: dy+=30;
16
+ case 9: dy+=31;
17
+ case 8: dy+=31;
18
+ case 7: dy+=30;
19
+ case 6: dy+=31;
20
+ case 5: dy+=30;
21
+ case 4: dy+=31;
22
+ case 3: dy+=28;
23
+ case 2: dy+=31;
24
+ case 1: break;
25
+ }
26
+ if(mo>2&&leap(yr)) ++dy;
27
+ return dy;
28
+ }
29
+
30
+ static int ymd2ds(int yr,int mo,int dy) {
31
+ return (yr>=0?y2d(yr-1):y2d(yr)-366)+ymd2dn(yr,mo,dy);
32
+ }
33
+
34
+ #define DAYSECS 86400
35
+ #define TZSECS 50400
36
+
37
+ static void addsecs(struct xsd_tm *tmp,int secs) {
38
+ tmp->secs+=secs;
39
+ if(tmp->secs<0) {
40
+ --tmp->days;
41
+ tmp->secs+=DAYSECS;
42
+ } else if(tmp->secs>=DAYSECS) {
43
+ ++tmp->days;
44
+ tmp->secs-=DAYSECS;
45
+ }
46
+ }
47
+
48
+ void xsd_mktmn(struct xsd_tm *tmp,char *fmt,char *s,int n) {
49
+ char *end=s+n;
50
+ int yr=2000,mo=1,dy=1,hr=0,mi=0,zh=15,zm=0;
51
+ double se=0.0;
52
+ for(;;) {
53
+ if(s==end||!*fmt) break;
54
+ switch(*s) {
55
+ case '-':
56
+ switch(*fmt) {
57
+ case 'y': ++fmt; yr=strtol(s,&s,10); continue;
58
+ case 'z': ++fmt; ++s; zh=strtol(s,&s,10); ++s; zm=strtol(s,&s,10); continue;
59
+ }
60
+ break;
61
+ case '+': assert(*fmt=='z'); ++fmt;
62
+ zh=-strtol(s,&s,10); ++s; zm=-strtol(s,&s,10); continue;
63
+ case 'Z': assert(*fmt=='z'); ++fmt; zh=0; zm=0; ++s; continue;
64
+ case '0': case '1': case '2': case '3': case '4':
65
+ case '5': case '6': case '7': case '8': case '9':
66
+ switch(*(fmt++)) {
67
+ case 'y': yr=strtol(s,&s,10); continue;
68
+ case 'm': mo=strtol(s,&s,10); continue;
69
+ case 'd': dy=strtol(s,&s,10); continue;
70
+ case 't': hr=strtol(s,&s,10); ++s; mi=strtol(s,&s,10); ++s; se=strtod(s,&s); continue;
71
+ }
72
+ break;
73
+ }
74
+ ++s;
75
+ }
76
+ tmp->mics=(int)((se-(int)se)*1000000+0.5);
77
+ tmp->secs=(int)se+60*(mi+60*hr);
78
+ tmp->days=ymd2ds(yr,mo,dy);
79
+ if((tmp->tz=(zh!=15))) addsecs(tmp,60*(zm+60*zh));
80
+ }
81
+ void xsd_mktm(struct xsd_tm *tmp,char *fmt,char *val) {xsd_mktmn(tmp,fmt,val,strlen(val));}
82
+
83
+ static int tmcmp(struct xsd_tm *tmp1, struct xsd_tm *tmp2) {
84
+ int dd=tmp1->days-tmp2->days, ds=tmp1->secs-tmp2->secs, dm=tmp1->mics-tmp2->mics;
85
+ return dd<0?-1:dd>0?1:ds<0?-1:ds>0?1:dm<0?-1:dm>0?1:0;
86
+ }
87
+
88
+ extern int xsd_tmcmp(struct xsd_tm *tmp1, struct xsd_tm *tmp2) {
89
+ if(tmp1->tz==tmp2->tz) {
90
+ return tmcmp(tmp1,tmp2);
91
+ } else if(tmp1->tz) {
92
+ struct xsd_tm tm; tm.mics=tmp2->mics;
93
+ tm.days=tmp2->days; tm.secs=tmp2->secs; addsecs(&tm,TZSECS);
94
+ if(tmcmp(tmp1,&tm)==1) return 1;
95
+ tm.days=tmp2->days; tm.secs=tmp2->secs; addsecs(&tm,-TZSECS);
96
+ if(tmcmp(tmp1,&tm)==-1) return -1;
97
+ return 2;
98
+ } else return -xsd_tmcmp(tmp2,tmp1);
99
+ }
100
+
@@ -0,0 +1,15 @@
1
+ /* $Id: xsd_tm.h,v 1.2 2003/12/25 03:05:34 dvd Exp $ */
2
+
3
+ #ifndef XSD_TM_H
4
+ #define XSD_TM_H 1
5
+
6
+ struct xsd_tm {int days,secs,mics,tz;};
7
+
8
+ /* fmt is a combination of ymdtz */
9
+ extern void xsd_mktm(struct xsd_tm *tmp,char *fmt,char *val);
10
+ extern void xsd_mktmn(struct xsd_tm *tmp,char *fmt,char *s,int n);
11
+
12
+ /* -1 - less, 0 - equal, 1 - greater, other - unknown */
13
+ extern int xsd_tmcmp(struct xsd_tm *tmp1, struct xsd_tm *tmp2);
14
+
15
+ #endif
data/lib/rnv.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'rnv/rnv'
2
+ require 'rnv/validator'
@@ -0,0 +1,84 @@
1
+ class OxSaxDocument < ::Ox::Sax
2
+ attr_accessor :current_element, :current_attributes, :current_ns
3
+
4
+ def initialize(document)
5
+ @document = document
6
+ @current_ns = {}
7
+ @pos = nil
8
+ @line = nil
9
+ @column = nil
10
+ end
11
+
12
+ def start_element(name)
13
+ save_line_col
14
+ @current_element = name.to_s
15
+ @current_attributes = []
16
+ end
17
+
18
+ def end_element(name)
19
+ save_line_col
20
+ @document.end_tag(name_with_ns_uri(name.to_s))
21
+ @current_element = nil
22
+ end
23
+
24
+ def attr(name, value)
25
+ if @current_element
26
+ if name.to_s.start_with?("xmlns")
27
+ ns = name.to_s.split(":")
28
+ @current_ns[ns.length > 1 ? ns.last : ""] = value.to_s
29
+ else
30
+ @current_attributes << name_with_ns_uri(name.to_s, false)
31
+ @current_attributes << value.to_s
32
+ end
33
+ end
34
+ end
35
+
36
+ def attrs_done
37
+ save_line_col
38
+ if @current_element
39
+ @document.start_tag(name_with_ns_uri(@current_element), @current_attributes)
40
+ @current_element = nil
41
+ end
42
+ end
43
+
44
+ def text(value)
45
+ save_line_col
46
+ @document.characters(value)
47
+ end
48
+
49
+ if false
50
+ def value(value)
51
+ save_line_col
52
+ @document.characters(value.as_s)
53
+ end
54
+ end
55
+
56
+ def instruct(inst)
57
+ end
58
+
59
+ private
60
+ def get_ns_uri(ns)
61
+ @current_ns[ns] ? "#{@current_ns[ns]}:" : ""
62
+ end
63
+
64
+ def name_with_ns_uri(name, explicit_xmlns = true)
65
+ name_with_ns = name.split(":")
66
+ if name_with_ns.length > 1
67
+ "#{get_ns_uri(name_with_ns.first)}#{name_with_ns.last}"
68
+ else
69
+ if explicit_xmlns
70
+ "#{get_ns_uri("")}#{name_with_ns.first}"
71
+ else
72
+ name
73
+ end
74
+ end
75
+ end
76
+
77
+ def save_line_col
78
+ @document.last_line = @line
79
+ @document.last_col = @column
80
+ end
81
+ end
82
+
83
+ # handler = OxSaxDocument.new(@document)
84
+ # Ox.sax_parse(handler, file)
@@ -0,0 +1,104 @@
1
+ require 'nokogiri'
2
+ require 'rnv/rnv'
3
+
4
+ module RNV
5
+ # @!visibility private
6
+ class NokogiriSaxDocument < Nokogiri::XML::SAX::Document
7
+ # @return [Nokogiri::XML::SAX::ParserContext]
8
+ attr_accessor :ctx
9
+ # @param [RNV::Document] document
10
+ def initialize(document)
11
+ @document = document
12
+ end
13
+
14
+ def start_element_namespace(name, attrs = [], prefix = nil, uri = nil, ns = nil)
15
+ update_line_col
16
+ tag_attrs = attrs.map { |attr| [attr.uri ? "#{attr.uri}:#{attr.localname}" : attr.localname, attr.value] }
17
+ tag_name = uri ? "#{uri}:#{name}" : name
18
+ @document.start_tag(tag_name, tag_attrs.flatten)
19
+ end
20
+
21
+ def end_element_namespace(name, prefix = nil, uri = nil)
22
+ update_line_col
23
+ tag_name = uri ? "#{uri}:#{name}" : name
24
+ @document.end_tag(tag_name)
25
+ end
26
+
27
+ def characters str
28
+ update_line_col
29
+ @document.characters(str)
30
+ end
31
+
32
+ def cdata_block str
33
+ update_line_col
34
+ @document.characters(str)
35
+ end
36
+
37
+ private
38
+
39
+ def update_line_col
40
+ @document.last_line = @ctx.line
41
+ @document.last_col = @ctx.column
42
+ end
43
+ end
44
+
45
+ class Validator
46
+ # @return [RNV::Document]
47
+ attr_accessor :document
48
+
49
+ def initialize
50
+ @document = RNV::Document.new
51
+ end
52
+
53
+ # errors from document
54
+ # @return [Array<RNV::Error>]
55
+ def errors
56
+ @document.errors
57
+ end
58
+
59
+ # @param [String] str RNC schema buffer
60
+ def load_schema_from_string(str)
61
+ @document.load_string(str)
62
+ end
63
+
64
+ # @param [String] file RNC schema filename
65
+ def load_schema_from_file(file)
66
+ @document.load_file(file)
67
+ end
68
+
69
+ # parse and validate buffer
70
+ # @param [String] str XML buffer to parse
71
+ # @return [Boolean] true if valid
72
+ def parse_string(str)
73
+ @document.errors = [] # reset errors
74
+ @document.start_document
75
+ rnv_doc = NokogiriSaxDocument.new(@document)
76
+
77
+ parser = Nokogiri::XML::SAX::Parser.new(rnv_doc)
78
+ parser.parse_memory(str) do |ctx|
79
+ rnv_doc.ctx = ctx
80
+ end
81
+
82
+ @document.valid?
83
+ end
84
+
85
+ # parse and validate file
86
+ # @param [String, File] xml XML file to parse
87
+ # @return [Boolean] true if valid
88
+ def parse_file(xml)
89
+ @document.errors = [] # reset errors
90
+ @document.start_document
91
+ rnv_doc = NokogiriSaxDocument.new(@document)
92
+
93
+ file = xml.is_a?(File) ? xml : File.open(xml)
94
+
95
+ parser = Nokogiri::XML::SAX::Parser.new(rnv_doc)
96
+ parser.parse(file) do |ctx|
97
+ rnv_doc.ctx = ctx
98
+ end
99
+
100
+ @document.valid?
101
+ end
102
+
103
+ end
104
+ end
metadata ADDED
@@ -0,0 +1,175 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby_rnv
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Julien Boulnois
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-04-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.14'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake-compiler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: ruby-prof
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: nokogiri
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description:
98
+ email:
99
+ executables: []
100
+ extensions:
101
+ - ext/rnv/extconf.rb
102
+ extra_rdoc_files: []
103
+ files:
104
+ - Gemfile
105
+ - ext/rnv/extconf.rb
106
+ - ext/rnv/ruby_rnv.c
107
+ - ext/rnv/src/ary.c
108
+ - ext/rnv/src/ary.h
109
+ - ext/rnv/src/drv.c
110
+ - ext/rnv/src/drv.h
111
+ - ext/rnv/src/er.c
112
+ - ext/rnv/src/er.h
113
+ - ext/rnv/src/erbit.h
114
+ - ext/rnv/src/ht.c
115
+ - ext/rnv/src/ht.h
116
+ - ext/rnv/src/ll.h
117
+ - ext/rnv/src/m.c
118
+ - ext/rnv/src/m.h
119
+ - ext/rnv/src/rn.c
120
+ - ext/rnv/src/rn.h
121
+ - ext/rnv/src/rnc.c
122
+ - ext/rnv/src/rnc.h
123
+ - ext/rnv/src/rnd.c
124
+ - ext/rnv/src/rnd.h
125
+ - ext/rnv/src/rnl.c
126
+ - ext/rnv/src/rnl.h
127
+ - ext/rnv/src/rnv.c
128
+ - ext/rnv/src/rnv.h
129
+ - ext/rnv/src/rnx.c
130
+ - ext/rnv/src/rnx.h
131
+ - ext/rnv/src/rx.c
132
+ - ext/rnv/src/rx.h
133
+ - ext/rnv/src/rx_cls_ranges.c
134
+ - ext/rnv/src/rx_cls_u.c
135
+ - ext/rnv/src/s.c
136
+ - ext/rnv/src/s.h
137
+ - ext/rnv/src/sc.c
138
+ - ext/rnv/src/sc.h
139
+ - ext/rnv/src/type.h
140
+ - ext/rnv/src/u.c
141
+ - ext/rnv/src/u.h
142
+ - ext/rnv/src/xcl.c
143
+ - ext/rnv/src/xmlc.c
144
+ - ext/rnv/src/xmlc.h
145
+ - ext/rnv/src/xsd.c
146
+ - ext/rnv/src/xsd.h
147
+ - ext/rnv/src/xsd_tm.c
148
+ - ext/rnv/src/xsd_tm.h
149
+ - lib/rnv.rb
150
+ - lib/rnv/ox_sax_document.rb
151
+ - lib/rnv/validator.rb
152
+ homepage:
153
+ licenses:
154
+ - MIT
155
+ metadata: {}
156
+ post_install_message:
157
+ rdoc_options: []
158
+ require_paths:
159
+ - lib
160
+ required_ruby_version: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '2.4'
165
+ required_rubygems_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ requirements: []
171
+ rubygems_version: 3.0.8
172
+ signing_key:
173
+ specification_version: 4
174
+ summary: RelaxNG compact syntax validator
175
+ test_files: []