cddl 0.11.5 → 0.12.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 652f1e63847fbed19fceeca1ed0b695b25b5f8aa6d312b2bd17f21c0ac7c6549
4
- data.tar.gz: d55f4a0bff69a37b1c6101b11eb003eb93c00df24ede1dded8d7be9844b4afb1
3
+ metadata.gz: b77b45ee60d8e79876e52c98aa9ab48548edf4e8af92faa28672db533c292a39
4
+ data.tar.gz: f4f61374b1b0c74010f4e2f73ef87487889b1d5f5feefbedba829bba685fc959
5
5
  SHA512:
6
- metadata.gz: 6622daf044d0f5a6d0ce4fe90ac57341526f7723aef0ce49e228edd2284711a44302ab0c3a1a28e3e156676db61afb4477a9b97b27269e1509034c41796ca8b9
7
- data.tar.gz: 966fd633edc283925e0e4bbb5ca04cb40de60470044bbbd94e7df41fb05c185f59ff09ae4767d5dea2899491d3f82db50d3feb01a585fe03891d60f073e50557
6
+ metadata.gz: ed08c886645ce05ad9af193ce4e2a724f1d394c731a3e5438112fd1a5a7a264db2833036d004ec249052ca9cefb42f5a5adb6a13c6ab1ef186edf524debc4b3a
7
+ data.tar.gz: e4bcc5a23cf88e2a20d5238a1f2ebf74fa3ae2988deaf3f71336bd009b15b38d511c0cd037a68923d24a86b5ae7d41365f1b31d5294fdeb6ab57dd0f13117ec1
data/bin/cddl CHANGED
@@ -22,6 +22,13 @@ def usage
22
22
  exit EX_USAGE
23
23
  end
24
24
 
25
+ def utfify(s)
26
+ s.force_encoding(Encoding::UTF_8).scrub { |c|
27
+ warn "*** replaced invalid UTF-8 byte sequence #{c.inspect} by U+FFFD REPLACEMENT CHARACTER"
28
+ 0xFFFD.chr(Encoding::UTF_8)
29
+ }
30
+ end
31
+
25
32
  def read_arg(arg, remember_fn = true)
26
33
  if arg == "-"
27
34
  $fn = "(stdin)" if remember_fn
@@ -34,7 +41,7 @@ def read_arg(arg, remember_fn = true)
34
41
  end
35
42
 
36
43
  def parser
37
- @parser ||= CDDL::Parser.new(read_arg(ARGV[0], false))
44
+ @parser ||= CDDL::Parser.new(utfify(read_arg(ARGV[0], false)))
38
45
  end
39
46
 
40
47
  def my_pp(v)
@@ -99,7 +106,12 @@ begin
99
106
  instance = if $sequence
100
107
  CBOR.decode("\x9f".b << instance.b << "\xff".b)
101
108
  else
102
- CBOR.decode(instance.b) rescue JSON.load(instance)
109
+ begin
110
+ CBOR.decode(instance.b)
111
+ rescue => e
112
+ warn e.inspect if verbose
113
+ JSON.load(utfify(instance))
114
+ end
103
115
  end
104
116
  instance = instance.cbor_clone if $annotate && ENV["EXPERIMENTAL_ANNOTATE"]
105
117
  warn "#{fn}:" if verbose
@@ -107,6 +119,7 @@ begin
107
119
  # my_pp ann
108
120
  instance.cbor_add_annotations_from(ann) rescue nil
109
121
  my_diag(instance) if $annotate
122
+ warn "ann: #{!!ann}" if verbose
110
123
  unless ann
111
124
  retcode = 1
112
125
  end
data/cddl.gemspec CHANGED
@@ -1,13 +1,13 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'cddl'
3
- s.version = '0.11.5'
3
+ s.version = '0.12.5'
4
4
  s.summary = "CDDL generator and validator."
5
5
  s.description = %{A parser, generator, and validator for CDDL}
6
6
  s.add_dependency('cbor-diag')
7
7
  s.add_dependency('abnc', '~> 0.1.1')
8
8
  s.add_dependency('json_pure')
9
9
  s.add_dependency('abnftt')
10
- s.add_dependency('regexp-examples') # , '1.1.0')
10
+ s.add_dependency('regexp-examples', '~> 1.5.1') # , '1.1.0')
11
11
  s.add_dependency('colorize')
12
12
  s.add_dependency('base32', '~> 0.3')
13
13
  s.add_dependency('base45_lite', '~> 1.0')
data/data/cddl.abnf CHANGED
@@ -41,7 +41,7 @@ grpent = [occur S] [memberkey S] type optcom
41
41
  / [occur S] groupname [genericarg] optcom ; preempted by above
42
42
  / [occur S] "(" S group S ")" optcom
43
43
 
44
- memberkey = type1 S "=>"
44
+ memberkey = type1 S ["^" S] "=>"
45
45
  / bareword S ":"
46
46
  / value S ":"
47
47
 
@@ -70,27 +70,39 @@ fraction = 1*DIGIT
70
70
  exponent = int
71
71
 
72
72
  text = %x22 *SCHAR %x22
73
- SCHAR = %x20-21 / %x23-7E / SESC
74
- SESC = "\" %x20-7E
73
+ SCHAR = %x20-21 / %x23-5B / %x5D-7E / NONASCII / SESC
74
+
75
+ SESC = "\" ( %x22 / "/" / "\" / ; \" \/ \\
76
+ %x62 / %x66 / %x6E / %x72 / %x74 / ; \b \f \n \r \t
77
+ (%x75 hexchar) ) ; \uXXXX
78
+
79
+ hexchar = "{" (1*"0" [ hexscalar ] / hexscalar) "}" /
80
+ non-surrogate / (high-surrogate "\" %x75 low-surrogate)
81
+ non-surrogate = ((DIGIT / "A"/"B"/"C" / "E"/"F") HEXDIG HEXDIG HEXDIG) /
82
+ ("D" %x30-37 HEXDIG HEXDIG)
83
+ high-surrogate = "D" ("8"/"9"/"A"/"B") HEXDIG HEXDIG
84
+ low-surrogate = "D" ("C"/"D"/"E"/"F") HEXDIG HEXDIG
85
+ hexscalar = "10" HEXDIG HEXDIG HEXDIG HEXDIG / HEXDIG1 HEXDIG HEXDIG HEXDIG HEXDIG
86
+ / non-surrogate / HEXDIG [HEXDIG [HEXDIG]]
75
87
 
76
88
  bytes = [bsqual] %x27 *BCHAR %x27
77
- BCHAR = %x20-26 / %x28-5B / %x5D-7E / SESC / CRLF
78
- bsqual = %x68 ; "h"
79
- / %x62.36.34 ; "b64"
89
+ BCHAR = %x20-26 / %x28-5B / %x5D-7E / NONASCII / SESC / "\'" / CRLF
90
+ bsqual = "h" / "b64"
80
91
 
81
92
  id = EALPHA *(*("-" / ".") (EALPHA / DIGIT))
82
93
  ALPHA = %x41-5A / %x61-7A
83
- EALPHA = %x41-5A / %x61-7A / "@" / "_" / "$"
94
+ EALPHA = ALPHA / "@" / "_" / "$"
84
95
  DIGIT = %x30-39
85
96
  DIGIT1 = %x31-39
86
97
  HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
98
+ HEXDIG1 = DIGIT1 / "A" / "B" / "C" / "D" / "E" / "F"
87
99
  BINDIG = %x30-31
88
100
 
89
101
  S = *WS
90
102
  WS = SP / NL
91
103
  SP = %x20
92
104
  NL = COMMENT / CRLF
93
- COMMENT = ";" *(SP / VCHAR) CRLF
94
- VCHAR = %x21-7E
105
+ COMMENT = ";" *PCHAR CRLF
106
+ PCHAR = %x20-7E / NONASCII
107
+ NONASCII = %xA0-D7FF / %xE000-10FFFD
95
108
  CRLF = %x0A / %x0D.0A
96
-
data/lib/cddl.rb CHANGED
@@ -61,7 +61,7 @@ module CDDL
61
61
  if upto - presult < 100
62
62
  part2 = source_text[presult...upto]
63
63
  else
64
- part2 = source_text[presult, 50] + "......." + source_text[upto-50, 50]
64
+ part2 = source_text[presult, 50] + "......." + (source_text[upto-50, 50] || "")
65
65
  end
66
66
  warn "*** Look for syntax problems around the #{
67
67
  "%%%".colorize(background: :light_yellow)} markers:\n#{
@@ -1428,6 +1428,10 @@ module CDDL
1428
1428
  else
1429
1429
  [:type1]
1430
1430
  end
1431
+ elsif s = ENV["CDDL_INVENT"]
1432
+ s = "_" if s == ""
1433
+ r = [:type1, [:text, "#{s}-#{name}"]]
1434
+ return r
1431
1435
  end
1432
1436
  end
1433
1437
  if r
@@ -1473,6 +1477,18 @@ module CDDL
1473
1477
  end
1474
1478
  end
1475
1479
 
1480
+ STRING_ESCAPES = {
1481
+ "\"" => "\"",
1482
+ "/" => "/",
1483
+ "\\" => "\\",
1484
+ "'" => "'",
1485
+ "b" => "\b",
1486
+ "f" => "\f",
1487
+ "n" => "\n",
1488
+ "r" => "\r",
1489
+ "t" => "\t",
1490
+ }
1491
+
1476
1492
  def value(n)
1477
1493
  # cheat:
1478
1494
  # warn n
@@ -1482,7 +1498,20 @@ module CDDL
1482
1498
  if parts[-1] != ""
1483
1499
  warn "*** Problem decoding byte string #{s.inspect}"
1484
1500
  end
1485
- bsval = parts[0...-1].join("'").gsub(/\\(.)/){$1}
1501
+ bsval = parts[0...-1].join("'").gsub(/\\u([Dd][89AaBb][0-9a-zA-Z]{2})\\u([Dd][CcDdEeFf][0-9a-zA-Z]{2})|\\u([0-9a-zA-Z]{4})|\\u\{([0-9a-zA-Z]+)\}|\r?(\n)|\\([^u])/) {
1502
+ if hex = $3 || $4
1503
+ hex.to_i(16).chr(Encoding::UTF_8)
1504
+ elsif lf = $5
1505
+ lf
1506
+ elsif escaped = $6
1507
+ STRING_ESCAPES[$6] or (
1508
+ fail "Invalid String Escape #{escaped.inspect} in #{s.inspect}"
1509
+ )
1510
+ else
1511
+ ((($1.to_i(16) & 0x3ff) << 10) +
1512
+ ($2.to_i(16) & 0x3ff) + 0x10000).chr(Encoding::UTF_8)
1513
+ end
1514
+ }
1486
1515
  [:bytes,
1487
1516
  case bsqual
1488
1517
  when ""
@@ -1496,7 +1525,17 @@ module CDDL
1496
1525
  end
1497
1526
  ]
1498
1527
  else
1499
- val = eval(n.to_s)
1528
+ if s[-1] == '"'
1529
+ s.gsub!(/\\u([Dd][89AaBb][0-9a-zA-Z]{2})\\u([Dd][CcDdEeFf][0-9a-zA-Z]{2})|\\([^u]|u[0-9a-zA-Z]{4})/) {
1530
+ if $3
1531
+ "\\#$3" # skip this, use eval parser
1532
+ else
1533
+ ((($1.to_i(16) & 0x3ff) << 10) +
1534
+ ($2.to_i(16) & 0x3ff) + 0x10000).chr(Encoding::UTF_8)
1535
+ end
1536
+ }
1537
+ end
1538
+ val = eval(s)
1500
1539
  # warn val
1501
1540
  case val
1502
1541
  when Integer; [:int, val]
@@ -5,6 +5,8 @@ a = text .b64u bytes
5
5
  ;;vp "AAAA"
6
6
  ;;vp "AAA-"
7
7
  ;;vp "AAA_"
8
+ ; fail with 0.11.5:
8
9
  ;;vp "AAA+"
9
10
  ;;vp "AAA/"
10
11
  ;;vp "AAA="
12
+ ;;vp "+kd8"
@@ -0,0 +1,16 @@
1
+ cwt = [
2
+ bstr .cbor protected-map,
3
+ unprotected-map,
4
+ bstr .cbor payload-map,
5
+ bstr ; signature
6
+ ]
7
+
8
+ protected-map = {
9
+ &(alg: 1) => int,
10
+ ? &(typ: 16) => text,
11
+ * key => any
12
+ }
13
+
14
+ unprotected-map = ()
15
+ key = "key"
16
+ payload-map = { payload: "map"}
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.11.5
4
+ version: 0.12.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: 2024-04-15 00:00:00.000000000 Z
11
+ date: 2024-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cbor-diag
@@ -70,16 +70,16 @@ dependencies:
70
70
  name: regexp-examples
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: 1.5.1
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: 1.5.1
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: colorize
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -263,6 +263,7 @@ files:
263
263
  - test-data/toerless0.cddl
264
264
  - test-data/toerless1.cddl
265
265
  - test-data/two_anonymous_groups.cddl
266
+ - test-data/valemb.cddl
266
267
  - test-data/wrong1.cddl
267
268
  - test-data/wrong1a.cddl
268
269
  - test-data/wrong2.cddl
@@ -290,7 +291,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
290
291
  - !ruby/object:Gem::Version
291
292
  version: '0'
292
293
  requirements: []
293
- rubygems_version: 3.5.4
294
+ rubygems_version: 3.5.11
294
295
  signing_key:
295
296
  specification_version: 4
296
297
  summary: CDDL generator and validator.