cddl 0.6.4 → 0.6.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|