cddl 0.8.11 → 0.8.16
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.
- checksums.yaml +4 -4
- data/bin/cddl +10 -2
- data/cddl.gemspec +1 -1
- data/data/cddl.abnf +1 -0
- data/lib/cddl.rb +102 -11
- data/test-data/feat1.cddl +1 -1
- data/test-data/feature-detail.cddl +5 -0
- data/test-data/sequence.cddl +1 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4939bdcbf4646dc3e2606b7590db6967cc5ccdb0fcb3ac278376b2393baefef2
|
4
|
+
data.tar.gz: ee4e8dc9a948843a3ad4ee3adbc9a128c3de921a5c2056c8d91c82ecbdf85372
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 07360a1f513c23f9cabb0f64a870bbd961cc336f722b7d857f6d9e92dd47d8fe328899772dcd27afa24af47085e579c8a029ed4d02b8cbecb95b7af7ea2d50cf
|
7
|
+
data.tar.gz: 9dbf6d31bb5656b958274ec32d39bb76ebaf57e015cd819487f48c752b2d786667166f78f9d822322cfba6c7750a5559dc2baf8e938c42e4ce35b7bf3d509dd0
|
data/bin/cddl
CHANGED
@@ -50,11 +50,15 @@ end
|
|
50
50
|
|
51
51
|
begin
|
52
52
|
case ARGV[1]
|
53
|
-
when /\A
|
53
|
+
when /\A..*p/
|
54
54
|
$annotate = true
|
55
55
|
require_relative '../lib/cbor-pp'
|
56
56
|
end
|
57
57
|
case ARGV[1]
|
58
|
+
when /\A..*s/
|
59
|
+
$sequence = true
|
60
|
+
end
|
61
|
+
case ARGV[1]
|
58
62
|
when /\Ar/ # secret
|
59
63
|
$advanced = true
|
60
64
|
my_pp parser.rules
|
@@ -83,7 +87,11 @@ begin
|
|
83
87
|
end
|
84
88
|
when /\Av/
|
85
89
|
instance = read_arg(ARGV[2])
|
86
|
-
instance =
|
90
|
+
instance = if $sequence
|
91
|
+
CBOR.decode("\x9f".b << instance.b << "\xff".b)
|
92
|
+
else
|
93
|
+
CBOR.decode(instance.b) rescue JSON.load(instance)
|
94
|
+
end
|
87
95
|
instance = instance.cbor_clone if $annotate && ENV["EXPERIMENTAL_ANNOTATE"]
|
88
96
|
ann = parser.validate(instance)
|
89
97
|
# my_pp ann
|
data/cddl.gemspec
CHANGED
data/data/cddl.abnf
CHANGED
@@ -16,6 +16,7 @@ type1 = type2 [S (rangeop / annotator) S type2]
|
|
16
16
|
/ "#" "6" ["." uint] "(" S type S ")" ; note no space!
|
17
17
|
/ "#" DIGIT ["." uint] ; major/ai
|
18
18
|
/ "#" ; any
|
19
|
+
/ "~" S typename [genericarg]
|
19
20
|
/ "{" S group S "}"
|
20
21
|
/ "[" S group S "]"
|
21
22
|
/ "&" S "(" S group S ")"
|
data/lib/cddl.rb
CHANGED
@@ -441,6 +441,29 @@ module CDDL
|
|
441
441
|
generate1(target, inmap)
|
442
442
|
when :feature
|
443
443
|
generate1(target, inmap)
|
444
|
+
when :cat
|
445
|
+
lhs = generate1(target, inmap)
|
446
|
+
rhs = generate1(control)
|
447
|
+
begin
|
448
|
+
lhs + rhs
|
449
|
+
rescue Exception => e
|
450
|
+
fail "Can't #{lhs.inspect} .cat #{rhs.inspect}: #{e.message}"
|
451
|
+
end
|
452
|
+
when :plus
|
453
|
+
lhs = generate1(target, inmap)
|
454
|
+
rhs = generate1(control)
|
455
|
+
begin
|
456
|
+
case lhs
|
457
|
+
when Integer
|
458
|
+
lhs + Integer(rhs)
|
459
|
+
when Numeric
|
460
|
+
lhs + rhs
|
461
|
+
else
|
462
|
+
fail "#{lhs.inspect}: Not a number"
|
463
|
+
end
|
464
|
+
rescue Exception => e
|
465
|
+
fail "Can't #{lhs.inspect} .plus #{rhs.inspect}: #{e.message}"
|
466
|
+
end
|
444
467
|
when :eq
|
445
468
|
content = generate1(control)
|
446
469
|
if validate1(content, where)
|
@@ -542,9 +565,34 @@ module CDDL
|
|
542
565
|
[true, t[1], vt]
|
543
566
|
elsif v = SIMPLE_VALUE[t]
|
544
567
|
v
|
545
|
-
|
546
|
-
|
547
|
-
|
568
|
+
elsif t[0] == :anno
|
569
|
+
_, conop, target, control = t
|
570
|
+
# warn ["EXV0", conop, target, control].inspect
|
571
|
+
if conop == :cat || conop == :plus
|
572
|
+
ok1, v1, vt1 = extract_value(target)
|
573
|
+
ok2, v2, vt2 = extract_value(control)
|
574
|
+
# warn ["EXV", ok1, v1, vt1, ok2, v2, vt2].inspect
|
575
|
+
if ok1 && ok2
|
576
|
+
if vt1 == Integer
|
577
|
+
[true, v1 + Integer(v2), Integer] if vt2 == Integer || vt2 == Float
|
578
|
+
elsif vt1 == Float
|
579
|
+
[true, v1 + v2, vt1] if vt2 == Integer || vt2 == Float
|
580
|
+
else
|
581
|
+
[true, v1 + v2, vt1] if vt1 == vt2
|
582
|
+
end
|
583
|
+
end rescue nil
|
584
|
+
end
|
585
|
+
end || [false]
|
586
|
+
end
|
587
|
+
|
588
|
+
def extract_array(t)
|
589
|
+
return [false] unless t[0] == :array
|
590
|
+
[true, *t[1..-1].map { |el|
|
591
|
+
return [false] unless el[0..3] == [:member, 1, 1, nil]
|
592
|
+
ok, v, vt = extract_value(el[4])
|
593
|
+
return [false] unless ok
|
594
|
+
[v, vt]
|
595
|
+
}]
|
548
596
|
end
|
549
597
|
|
550
598
|
def validate_diag
|
@@ -558,7 +606,10 @@ module CDDL
|
|
558
606
|
if warn
|
559
607
|
if result
|
560
608
|
if $features != {}
|
561
|
-
|
609
|
+
ok = ENV["CDDL_FEATURE_OK"] and ok = ok.split(/,\s*/) or ok = []
|
610
|
+
# warn([:OK, ok, $features].inspect)
|
611
|
+
features = $features.reject {|k, v| ok.include? k.to_s }
|
612
|
+
warn "** Features potentially used: #{features.map {|k, v| "#{k}: #{v.keys}"}.join(", ")}" if features != {}
|
562
613
|
end
|
563
614
|
else
|
564
615
|
warn "CDDL validation failure (#{result.inspect} for #{d.inspect}):"
|
@@ -762,10 +813,18 @@ module CDDL
|
|
762
813
|
when :range
|
763
814
|
[] if where[2] === d && where[1].include?(d)
|
764
815
|
when :anno
|
765
|
-
target = where
|
766
|
-
if
|
767
|
-
|
768
|
-
|
816
|
+
_, conop, target, control = where
|
817
|
+
if conop == :cat || conop == :plus
|
818
|
+
ok1, v1, vt1 = extract_value(target)
|
819
|
+
ok2, v2, vt2 = extract_value(control)
|
820
|
+
# warn ["ANNO0", ok1, v1, vt1, ok2, v2, vt2, d].inspect
|
821
|
+
if ok1 && ok2
|
822
|
+
v2 = Integer(v2) if vt1 == Integer
|
823
|
+
# warn ["ANNO", ok1, v1, vt1, ok2, v2, vt2, d].inspect
|
824
|
+
[] if d == v1 + v2 # XXX Focus ArgumentError
|
825
|
+
end
|
826
|
+
elsif ann = validate1a(d, target)
|
827
|
+
case conop
|
769
828
|
when :size
|
770
829
|
case d
|
771
830
|
when Integer
|
@@ -806,10 +865,22 @@ module CDDL
|
|
806
865
|
ann
|
807
866
|
when :feature
|
808
867
|
ok, v, vt = extract_value(control)
|
809
|
-
|
868
|
+
if ok
|
869
|
+
nm = v
|
870
|
+
det = d
|
871
|
+
else
|
872
|
+
ok, *v = extract_array(control)
|
873
|
+
if ok && v.size == 2
|
874
|
+
nm = v[0][0]
|
875
|
+
det = v[1][0]
|
876
|
+
else
|
877
|
+
warn "*** feature controller not implemented: #{control.inspect}"
|
878
|
+
end
|
879
|
+
end
|
880
|
+
$features[nm][det] = true
|
810
881
|
ann
|
811
882
|
when :lt, :le, :gt, :ge, :eq, :ne
|
812
|
-
op = OPERATORS[
|
883
|
+
op = OPERATORS[conop]
|
813
884
|
ok, v, _vt = extract_value(control)
|
814
885
|
if ok
|
815
886
|
ann if d.send(op, v) rescue nil # XXX Focus ArgumentError
|
@@ -1179,7 +1250,7 @@ module CDDL
|
|
1179
1250
|
BRACE = {"{" => :map, "[" => :array}
|
1180
1251
|
RANGE_EXCLUDE_END = {".." => false, "..." => true}
|
1181
1252
|
SUPPORTED_ANNOTATIONS = [:bits, :size, :regexp, :cbor, :cborseq, :within, :and,
|
1182
|
-
:default, :lt, :le, :gt, :ge, :eq, :ne, :feature]
|
1253
|
+
:default, :lt, :le, :gt, :ge, :eq, :ne, :feature, :cat, :plus]
|
1183
1254
|
|
1184
1255
|
def type1(n, canbegroup = false)
|
1185
1256
|
# puts "NVALUE #{n.value.inspect}"
|
@@ -1241,6 +1312,26 @@ module CDDL
|
|
1241
1312
|
v
|
1242
1313
|
}
|
1243
1314
|
]
|
1315
|
+
when /\A~/
|
1316
|
+
if tn = n.typename
|
1317
|
+
s = type_recall(tn.to_s, false, n.genericarg).flatten(1)
|
1318
|
+
else
|
1319
|
+
fail "No typename in unwrap #{n}"
|
1320
|
+
end
|
1321
|
+
if s[0] != :type1
|
1322
|
+
fail [:UNWRAPs0, s].inspect
|
1323
|
+
end
|
1324
|
+
case s[1]
|
1325
|
+
when :map, :array
|
1326
|
+
[:grpent, s[2..-1]]
|
1327
|
+
when :prim
|
1328
|
+
if s[2] != 6
|
1329
|
+
fail [:UNWRAPs2, s].inspect
|
1330
|
+
end
|
1331
|
+
s[4] # check :type1?
|
1332
|
+
else
|
1333
|
+
fail [:UNWRAPs1, s].inspect
|
1334
|
+
end
|
1244
1335
|
else
|
1245
1336
|
"unimplemented #{n}"
|
1246
1337
|
end
|
data/test-data/feat1.cddl
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
a = [tstr, tstr, tstr]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cddl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carsten Bormann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cbor-diag
|
@@ -118,6 +118,7 @@ files:
|
|
118
118
|
- test-data/dotsize.cddl
|
119
119
|
- test-data/extractor-demo.cddl
|
120
120
|
- test-data/feat1.cddl
|
121
|
+
- test-data/feature-detail.cddl
|
121
122
|
- test-data/foo.cddl
|
122
123
|
- test-data/grasp-01-extract.cddl
|
123
124
|
- test-data/grasp-01-test.cddl
|
@@ -149,6 +150,7 @@ files:
|
|
149
150
|
- test-data/named-group.cddl
|
150
151
|
- test-data/patch1.cddl
|
151
152
|
- test-data/reused_named_group.cddl
|
153
|
+
- test-data/sequence.cddl
|
152
154
|
- test-data/structure.cddl
|
153
155
|
- test-data/test-gen.cddl
|
154
156
|
- test-data/toerless0.cddl
|
@@ -179,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
179
181
|
- !ruby/object:Gem::Version
|
180
182
|
version: '0'
|
181
183
|
requirements: []
|
182
|
-
rubygems_version: 3.
|
184
|
+
rubygems_version: 3.2.3
|
183
185
|
signing_key:
|
184
186
|
specification_version: 4
|
185
187
|
summary: CDDL generator and validator.
|