ruby_rnv 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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: []