cddl 0.6.4 → 0.6.5
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/cddl.gemspec +1 -1
- data/lib/cddl.rb +68 -3
- data/test-data/extractor-demo.cddl +14 -0
- data/test-data/grasp-01-test.cddl +90 -0
- data/test/test-cddl.rb +80 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f786ac685c1f30ca4a1510ad4e40981a6403dc7f
|
4
|
+
data.tar.gz: 8d2a5a22918683e260bbd79331e1b9874ea649a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2055bf34a4f4b366b12455723dcc86eba307064c0831dad03d864f7f6a014eab724b9283917341f88c6daf8a08ecb9d4808f269161b7127404d689684f5165db
|
7
|
+
data.tar.gz: b3693cc1e1277a2f7848fb886ed1665cfc885438da1d2e3fd7d94355a6081265eaa62fd4db3fafea38ade41e708d0515c51a0c0001ad453ccf711009adc8b6d4
|
data/cddl.gemspec
CHANGED
data/lib/cddl.rb
CHANGED
@@ -70,21 +70,86 @@ module CDDL
|
|
70
70
|
}]
|
71
71
|
end
|
72
72
|
|
73
|
+
def walk(rule, anno = nil, &block)
|
74
|
+
r = []
|
75
|
+
case rule
|
76
|
+
when Array
|
77
|
+
r.concat(Array(yield rule, anno))
|
78
|
+
case rule[0]
|
79
|
+
when :type1, :array, :map
|
80
|
+
a = (rule.cbor_annotations rescue nil) if rule.size == 2
|
81
|
+
a = a.first if a
|
82
|
+
r.concat(rule[1..-1].map{|x| walk(x, a, &block)})
|
83
|
+
when :grpchoice
|
84
|
+
r.concat(rule[1..-1].map{|x| x.flat_map {|y| walk(y, &block)}})
|
85
|
+
when :member
|
86
|
+
r << walk(rule[3], &block)
|
87
|
+
r << walk(rule[4], &block)
|
88
|
+
when :anno
|
89
|
+
r << walk(rule[2], &block)
|
90
|
+
r << walk(rule[3], &block)
|
91
|
+
else
|
92
|
+
# p ["LEAF", rule[0]]
|
93
|
+
end
|
94
|
+
end
|
95
|
+
r.compact
|
96
|
+
end
|
97
|
+
|
98
|
+
def cname(s)
|
99
|
+
s.to_s.gsub(/-/, "_")
|
100
|
+
end
|
101
|
+
|
73
102
|
# Generate some simple #define lines from the value-only rules
|
74
103
|
def defines(prefix)
|
75
|
-
s =
|
104
|
+
s = {} # keys form crude set of defines
|
105
|
+
r = rules
|
76
106
|
prefix ||= "CDDL"
|
77
107
|
ast.each :rule do |rule|
|
78
108
|
if rulename = rule.typename
|
79
109
|
t = rule.type.children(:type1)
|
80
110
|
if t.size == 1
|
81
111
|
if (t2 = t.first.children(:type2)) && t2.size == 1 && (v = t2.first.value)
|
82
|
-
s
|
112
|
+
s["#define #{prefix}_#{cname(rulename)} " << v.to_s << "\n"] = true
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
# CBOR::PP.pp r
|
118
|
+
walk(r) do |subtree, anno|
|
119
|
+
if subtree[0] == :type1 && subtree[1..-1].all? {|x| x[0] == :int}
|
120
|
+
if enumname = subtree.cbor_annotations rescue nil
|
121
|
+
enumname = cname(enumname.first)
|
122
|
+
subtree[1..-1].each do |x|
|
123
|
+
if memname = x.cbor_annotations
|
124
|
+
memname = "#{enumname}_#{cname(memname.first)}"
|
125
|
+
s["#define #{prefix}_#{memname} " << x[1].to_s << "\n"] = true
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
if subtree[0] == :array
|
131
|
+
if (arrayname = subtree.cbor_annotations rescue nil) || anno
|
132
|
+
arrayname = cname(arrayname ? arrayname.first : anno)
|
133
|
+
subtree[1..-1].each_with_index do |x, i|
|
134
|
+
if x[0] == :member
|
135
|
+
if Array === x[3] && x[3][0] == :string
|
136
|
+
memname = x[3][1] # preferably use key string
|
137
|
+
elsif memname = x[4].cbor_annotations
|
138
|
+
memname = memname.first # use value annotation otherwise
|
139
|
+
end
|
140
|
+
if memname
|
141
|
+
memname = "#{arrayname}_#{cname(memname)}"
|
142
|
+
s["#define #{prefix}_#{memname}_index " << i.to_s << "\n"] = true
|
143
|
+
end
|
144
|
+
end
|
145
|
+
if x[0] == :member && (x[1] != 1 || x[2] != 1)
|
146
|
+
break # can't give numbers if we have optionals etc.
|
147
|
+
end
|
83
148
|
end
|
84
149
|
end
|
85
150
|
end
|
86
151
|
end
|
87
|
-
s
|
152
|
+
s.keys.join
|
88
153
|
end
|
89
154
|
|
90
155
|
def rules
|
@@ -0,0 +1,90 @@
|
|
1
|
+
grasp-message = message
|
2
|
+
|
3
|
+
session-id = 0..16777215
|
4
|
+
; that is up to 24 bits
|
5
|
+
|
6
|
+
message /= discovery-message
|
7
|
+
discovery-message = [M_DISCOVERY, session-id, objective]
|
8
|
+
|
9
|
+
message /= response-message
|
10
|
+
response-message = [M_RESPONSE, session-id,
|
11
|
+
(+locator-option // divert-option // objective)]
|
12
|
+
|
13
|
+
message /= request-message
|
14
|
+
request-message = [M_REQUEST, session-id, objective]
|
15
|
+
|
16
|
+
message /= negotiation-message
|
17
|
+
negotiation-message = [M_NEGOTIATE, sid: session-id, objective]
|
18
|
+
|
19
|
+
message /= end-message
|
20
|
+
end-message = [M_END, session-id, (accept-option / decline-option)]
|
21
|
+
|
22
|
+
message /= wait-message
|
23
|
+
wait-message = [M_WAIT, session-id, waiting-time-option]
|
24
|
+
|
25
|
+
divert-option = [O_DIVERT, +locator-option]
|
26
|
+
|
27
|
+
accept-option = [O_ACCEPT]
|
28
|
+
|
29
|
+
decline-option = [O_DECLINE]
|
30
|
+
|
31
|
+
waiting-time-option = [O_WAITING, option-waiting-time]
|
32
|
+
option-waiting-time = 0..4294967295 ; in milliseconds
|
33
|
+
|
34
|
+
option-device-id = [O_DEVICE_ID, bytes]
|
35
|
+
|
36
|
+
locator-option /= ipv4-locator-option
|
37
|
+
ipv4-locator-option = bytes .size 4
|
38
|
+
; this is simpler than [O_IPv4_LOCATOR, bytes .size 4]
|
39
|
+
|
40
|
+
locator-option /= ipv6-locator-option
|
41
|
+
ipv6-locator-option = bytes .size 16
|
42
|
+
|
43
|
+
locator-option /= fqdn-locator-option
|
44
|
+
fqdn-locator-option = [O_FQDN_LOCATOR, text]
|
45
|
+
|
46
|
+
locator-option /= url-locator-option
|
47
|
+
url-locator-option = [O_URL_LOCATOR, text]
|
48
|
+
|
49
|
+
objective-flags = uint .bits objective-flag
|
50
|
+
|
51
|
+
objective-flag = &(
|
52
|
+
D: 0
|
53
|
+
N: 1
|
54
|
+
S: 2
|
55
|
+
)
|
56
|
+
|
57
|
+
; D means valid for discovery only
|
58
|
+
; N means valid for discovery and negotiation
|
59
|
+
; S means valid for discovery and synchronization
|
60
|
+
|
61
|
+
objective /= generic-obj
|
62
|
+
generic-obj = [objective-name, objective-flags, loop-count, ?any]
|
63
|
+
|
64
|
+
objective /= vendor-obj
|
65
|
+
vendor-obj = [{"PEN":pen}, objective-name, objective-flags,
|
66
|
+
loop-count, ?any]
|
67
|
+
|
68
|
+
; A PEN is used to distinguish vendor-specific options.
|
69
|
+
|
70
|
+
pen = 0..4294967295
|
71
|
+
objective-name = tstr
|
72
|
+
loop-count = 0..255
|
73
|
+
|
74
|
+
; Constants
|
75
|
+
|
76
|
+
M_DISCOVERY = 1
|
77
|
+
|
78
|
+
M_RESPONSE = 2
|
79
|
+
M_REQUEST = 3
|
80
|
+
M_NEGOTIATE = 4
|
81
|
+
M_END = 5
|
82
|
+
M_WAIT = 6
|
83
|
+
|
84
|
+
O_DIVERT = 100
|
85
|
+
O_ACCEPT = 101
|
86
|
+
O_DECLINE = 102
|
87
|
+
O_WAITING = 103
|
88
|
+
O_DEVICE_ID = 104
|
89
|
+
O_FQDN_LOCATOR = 105
|
90
|
+
O_URL_LOCATOR = 106
|
data/test/test-cddl.rb
CHANGED
@@ -1417,4 +1417,84 @@ HERE
|
|
1417
1417
|
assert_equal g, {"a" => nil}
|
1418
1418
|
end
|
1419
1419
|
|
1420
|
+
def test_extractor_ignores_map
|
1421
|
+
parser = CDDL::Parser.new <<HERE
|
1422
|
+
a = {a: nil,
|
1423
|
+
beer: mtype, wine: bytes, ? optional: text, cantindex: int}
|
1424
|
+
mtype = 1/2/3 ; can't generate anything meaningful here.
|
1425
|
+
HERE
|
1426
|
+
d = parser.defines("FOO")
|
1427
|
+
assert_equal "", d
|
1428
|
+
end
|
1429
|
+
|
1430
|
+
def test_extractor_type1
|
1431
|
+
parser = CDDL::Parser.new <<HERE
|
1432
|
+
BAR = a/b/c
|
1433
|
+
a = 1
|
1434
|
+
b = 2
|
1435
|
+
c = 3
|
1436
|
+
d = 4
|
1437
|
+
HERE
|
1438
|
+
expected = <<HERE
|
1439
|
+
#define FOO_a 1
|
1440
|
+
#define FOO_b 2
|
1441
|
+
#define FOO_c 3
|
1442
|
+
#define FOO_d 4
|
1443
|
+
#define FOO_BAR_a 1
|
1444
|
+
#define FOO_BAR_b 2
|
1445
|
+
#define FOO_BAR_c 3
|
1446
|
+
HERE
|
1447
|
+
d = parser.defines("FOO")
|
1448
|
+
assert_equal expected, d
|
1449
|
+
end
|
1450
|
+
|
1451
|
+
def test_extractor_enum
|
1452
|
+
parser = CDDL::Parser.new <<HERE
|
1453
|
+
|
1454
|
+
foo = enum1; why exactly do we need this one?
|
1455
|
+
|
1456
|
+
enum1 = &(
|
1457
|
+
one: 1
|
1458
|
+
two: 2
|
1459
|
+
three: 3
|
1460
|
+
enum2
|
1461
|
+
)
|
1462
|
+
|
1463
|
+
enum2 = (
|
1464
|
+
four: 4
|
1465
|
+
five: 5
|
1466
|
+
)
|
1467
|
+
|
1468
|
+
HERE
|
1469
|
+
expected = <<HERE
|
1470
|
+
#define FOO_enum1_one 1
|
1471
|
+
#define FOO_enum1_two 2
|
1472
|
+
#define FOO_enum1_three 3
|
1473
|
+
#define FOO_enum1_four 4
|
1474
|
+
#define FOO_enum1_five 5
|
1475
|
+
HERE
|
1476
|
+
d = parser.defines("FOO")
|
1477
|
+
assert_equal expected, d
|
1478
|
+
end
|
1479
|
+
|
1480
|
+
def test_extractor_array
|
1481
|
+
parser = CDDL::Parser.new <<HERE
|
1482
|
+
message = [mtype,
|
1483
|
+
beer: enum1, wine: bytes, ? optional: text, cantindex: int]
|
1484
|
+
enum1 = &( one: 1, two: 2)
|
1485
|
+
mtype = 1/2/3 ; can't generate anything meaningful here.
|
1486
|
+
HERE
|
1487
|
+
expected = <<HERE
|
1488
|
+
#define FOO_message_mtype_index 0
|
1489
|
+
#define FOO_message_beer_index 1
|
1490
|
+
#define FOO_message_wine_index 2
|
1491
|
+
#define FOO_message_optional_index 3
|
1492
|
+
#define FOO_enum1_one 1
|
1493
|
+
#define FOO_enum1_two 2
|
1494
|
+
HERE
|
1495
|
+
d = parser.defines("FOO")
|
1496
|
+
assert_equal expected, d
|
1497
|
+
end
|
1498
|
+
|
1499
|
+
|
1420
1500
|
end
|
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.6.
|
4
|
+
version: 0.6.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carsten Bormann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cbor-diag
|
@@ -102,6 +102,8 @@ files:
|
|
102
102
|
- test-data/cdni-ct.cddl
|
103
103
|
- test-data/dcaf.cddl
|
104
104
|
- test-data/dcaf1.cddl
|
105
|
+
- test-data/extractor-demo.cddl
|
106
|
+
- test-data/grasp-01-test.cddl
|
105
107
|
- test-data/grasp-01.cddl
|
106
108
|
- test-data/grasp-v1.cddl
|
107
109
|
- test-data/grasp-v2X.cddl
|