cauterize 0.0.1.pre5 → 0.0.1.pre7
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.
- data/README.md +9 -0
- data/Rakefile +1 -1
- data/bin/cauterize +1 -1
- data/cauterize.gemspec +1 -0
- data/example/Cauterize +15 -9
- data/example/build.sh +3 -0
- data/example/doc_cauterize_output/example_project.txt +124 -0
- data/example/ruby_ex.rb +14 -0
- data/lib/cauterize.rb +117 -0
- data/lib/cauterize/base_type.rb +3 -2
- data/lib/cauterize/builders.rb +18 -2
- data/lib/cauterize/builders/c/group.rb +2 -3
- data/lib/cauterize/builders/cs/group.rb +2 -3
- data/lib/cauterize/builders/doc/buildable.rb +30 -0
- data/lib/cauterize/builders/doc/builtin.rb +21 -0
- data/lib/cauterize/builders/doc/composite.rb +23 -0
- data/lib/cauterize/builders/doc/enumeration.rb +24 -0
- data/lib/cauterize/builders/doc/fixed_array.rb +26 -0
- data/lib/cauterize/builders/doc/group.rb +29 -0
- data/lib/cauterize/builders/doc/scalar.rb +21 -0
- data/lib/cauterize/builders/doc/variable_array.rb +26 -0
- data/lib/cauterize/builtin.rb +2 -2
- data/lib/cauterize/c_builder.rb +5 -0
- data/lib/cauterize/cauterize.rb +7 -2
- data/lib/cauterize/composite.rb +8 -7
- data/lib/cauterize/cs_builder.rb +8 -5
- data/lib/cauterize/doc_builder.rb +34 -0
- data/lib/cauterize/enumeration.rb +5 -5
- data/lib/cauterize/fixed_array.rb +3 -3
- data/lib/cauterize/group.rb +18 -8
- data/lib/cauterize/scalar.rb +3 -3
- data/lib/cauterize/variable_array.rb +3 -3
- data/lib/cauterize/version.rb +1 -1
- data/spec/base_type_spec.rb +10 -0
- data/spec/builders/c/group_spec.rb +2 -2
- data/spec/builders/cs/group_spec.rb +1 -1
- data/spec/builders/doc/buildable_spec.rb +25 -0
- data/spec/builders_spec.rb +4 -2
- data/spec/builtin_spec.rb +2 -0
- data/spec/c_builder_spec.rb +12 -3
- data/spec/composite_spec.rb +11 -0
- data/spec/cs_builder_spec.rb +6 -2
- data/spec/doc_builder_spec.rb +247 -0
- data/spec/enumeration_spec.rb +2 -0
- data/spec/fixed_array_spec.rb +2 -0
- data/spec/group_spec.rb +4 -2
- data/spec/scalar_spec.rb +2 -0
- data/spec/spec_helper.rb +4 -0
- data/support/c/src/cauterize.h +1 -1
- data/support/cs/src/CauterizeFormatter.cs +7 -5
- data/support/cs/src/CauterizeTypes.cs +45 -5
- metadata +50 -18
@@ -0,0 +1,21 @@
|
|
1
|
+
module Cauterize
|
2
|
+
module Builders
|
3
|
+
module Doc
|
4
|
+
class BuiltIn < Buildable
|
5
|
+
def heading
|
6
|
+
[
|
7
|
+
"Type Name: #{@blueprint.name}",
|
8
|
+
"Cauterize Class: built-in",
|
9
|
+
"Description: #{(@blueprint.description ? " - #{@blueprint.description}" : "<none>")}",
|
10
|
+
].join("\n")
|
11
|
+
end
|
12
|
+
|
13
|
+
def body
|
14
|
+
["data - size: #{@blueprint.byte_length} bytes"]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Cauterize::Builders.register(:doc, Cauterize::BuiltIn, Cauterize::Builders::Doc::BuiltIn)
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Cauterize
|
2
|
+
module Builders
|
3
|
+
module Doc
|
4
|
+
class Composite < Buildable
|
5
|
+
def heading
|
6
|
+
[
|
7
|
+
"Type Name: #{@blueprint.name}",
|
8
|
+
"Cauterize Class: composite",
|
9
|
+
"Description: #{(@blueprint.description ? @blueprint.description : "<none>")}",
|
10
|
+
].join("\n")
|
11
|
+
end
|
12
|
+
|
13
|
+
def body
|
14
|
+
@blueprint.fields.values.map do |v|
|
15
|
+
"#{v.name} - type: #{v.type.name}" + (v.description ? " - description: #{v.description}" : "")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
Cauterize::Builders.register(:doc, Cauterize::Composite, Cauterize::Builders::Doc::Composite)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Cauterize
|
2
|
+
module Builders
|
3
|
+
module Doc
|
4
|
+
class Enumeration < Buildable
|
5
|
+
def heading
|
6
|
+
[
|
7
|
+
"Type Name: #{@blueprint.name}",
|
8
|
+
"Cauterize Class: enumeration",
|
9
|
+
"Description: #{@blueprint.description ? @blueprint.description : "<none>"}",
|
10
|
+
"Encoding: #{@blueprint.representation.name}",
|
11
|
+
].join("\n")
|
12
|
+
end
|
13
|
+
|
14
|
+
def body
|
15
|
+
@blueprint.values.values.map {|v| " #{v.name} = #{v.value}"}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
Cauterize::Builders.register(:doc, Cauterize::Enumeration, Cauterize::Builders::Doc::Enumeration)
|
23
|
+
|
24
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Cauterize
|
2
|
+
module Builders
|
3
|
+
module Doc
|
4
|
+
class FixedArray < Buildable
|
5
|
+
def heading
|
6
|
+
[
|
7
|
+
"Type Name: #{@blueprint.name}",
|
8
|
+
"Cauterize Class: fixed-array",
|
9
|
+
"Description: #{@blueprint.description ? @blueprint.description : "<none>"}",
|
10
|
+
"Stored Type: #{@blueprint.array_type.name}",
|
11
|
+
"Value Count: #{@blueprint.array_size}",
|
12
|
+
].join("\n")
|
13
|
+
end
|
14
|
+
|
15
|
+
def body
|
16
|
+
[
|
17
|
+
"data - #{@blueprint.array_size} values of type #{@blueprint.array_type.name}",
|
18
|
+
]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
Cauterize::Builders.register(:doc, Cauterize::FixedArray, Cauterize::Builders::Doc::FixedArray)
|
26
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Cauterize
|
2
|
+
module Builders
|
3
|
+
module Doc
|
4
|
+
class Group < Buildable
|
5
|
+
def heading
|
6
|
+
[
|
7
|
+
"Type Name: #{@blueprint.name}",
|
8
|
+
"Cauterize Class: group",
|
9
|
+
"Description: #{(@blueprint.description ? @blueprint.description : "<none>")}",
|
10
|
+
].join("\n")
|
11
|
+
end
|
12
|
+
|
13
|
+
def body
|
14
|
+
vals = @blueprint.fields.values.map do |v|
|
15
|
+
" #{v.name} - payload: #{v.type ? v.type.name : "<no payload>"}" + (v.description ? " - description: #{v.description}" : "")
|
16
|
+
end
|
17
|
+
|
18
|
+
[
|
19
|
+
"kind tag: #{@blueprint.tag_enum.name}",
|
20
|
+
"kinds:"
|
21
|
+
] + vals
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
Cauterize::Builders.register(:doc, Cauterize::Group, Cauterize::Builders::Doc::Group)
|
29
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Cauterize
|
2
|
+
module Builders
|
3
|
+
module Doc
|
4
|
+
class Scalar < Buildable
|
5
|
+
def heading
|
6
|
+
[
|
7
|
+
"Type Name: #{@blueprint.name}",
|
8
|
+
"Cauterize Class: scalar",
|
9
|
+
"Description: #{(@blueprint.description ? " - #{@blueprint.description}" : "<none>")}",
|
10
|
+
].join("\n")
|
11
|
+
end
|
12
|
+
|
13
|
+
def body
|
14
|
+
["data - type: #{@blueprint.type_name.name}"]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Cauterize::Builders.register(:doc, Cauterize::Scalar, Cauterize::Builders::Doc::Scalar)
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Cauterize
|
2
|
+
module Builders
|
3
|
+
module Doc
|
4
|
+
class VariableArray < Buildable
|
5
|
+
def heading
|
6
|
+
[
|
7
|
+
"Type Name: #{@blueprint.name}",
|
8
|
+
"Cauterize Class: variable-array",
|
9
|
+
"Description: #{@blueprint.description ? @blueprint.description : "<none>"}",
|
10
|
+
"Maximum Value Count: #{@blueprint.array_size}",
|
11
|
+
].join("\n")
|
12
|
+
end
|
13
|
+
|
14
|
+
def body
|
15
|
+
[
|
16
|
+
"length - type #{@blueprint.size_type.name}",
|
17
|
+
"data - 0 to #{@blueprint.array_size} values of type #{@blueprint.array_type.name}",
|
18
|
+
]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
Cauterize::Builders.register(:doc, Cauterize::VariableArray, Cauterize::Builders::Doc::VariableArray)
|
26
|
+
|
data/lib/cauterize/builtin.rb
CHANGED
@@ -18,7 +18,7 @@ module Cauterize
|
|
18
18
|
|
19
19
|
def create_builtins
|
20
20
|
BUILT_IN_TYPES.each do |b|
|
21
|
-
_b = BuiltIn.new(b[:name])
|
21
|
+
_b = BuiltIn.new(b[:name], nil)
|
22
22
|
_b.byte_length(b[:size])
|
23
23
|
_b.is_signed(b[:signed])
|
24
24
|
builtins[b[:name]] = _b
|
@@ -26,7 +26,7 @@ module Cauterize
|
|
26
26
|
end
|
27
27
|
|
28
28
|
class BuiltIn < BaseType
|
29
|
-
def initialize(name)
|
29
|
+
def initialize(name, desc=nil)
|
30
30
|
super
|
31
31
|
end
|
32
32
|
|
data/lib/cauterize/c_builder.rb
CHANGED
@@ -21,6 +21,8 @@ module Cauterize
|
|
21
21
|
f = default_formatter
|
22
22
|
|
23
23
|
excluder = @name.up_snake + "_H_#{Time.now.to_i}"
|
24
|
+
f << "/* WARNING: This is generated code. Do not edit this file directly. */"
|
25
|
+
f << ""
|
24
26
|
f << "#ifndef #{excluder}"
|
25
27
|
f << "#define #{excluder}"
|
26
28
|
f.blank_line
|
@@ -51,6 +53,7 @@ module Cauterize
|
|
51
53
|
|
52
54
|
f.blank_line
|
53
55
|
f << "#endif /* #{excluder} */"
|
56
|
+
f << "\n"
|
54
57
|
|
55
58
|
File.open(@h, "wb") do |fh|
|
56
59
|
fh.write(f.to_s)
|
@@ -60,6 +63,8 @@ module Cauterize
|
|
60
63
|
def build_c
|
61
64
|
f = default_formatter
|
62
65
|
|
66
|
+
f << "/* WARNING: This is generated code. Do not edit this file directly. */"
|
67
|
+
f << ""
|
63
68
|
f << %Q{#include <cauterize_util.h>}
|
64
69
|
f << %Q{#include "#{@name}.h"}
|
65
70
|
|
data/lib/cauterize/cauterize.rb
CHANGED
@@ -29,6 +29,12 @@ module Cauterize
|
|
29
29
|
Cauterize::CSBuilder.new(cs_file, output_prefix)
|
30
30
|
end
|
31
31
|
|
32
|
+
def make_builder_doc(target_dir, output_prefix)
|
33
|
+
doc_file = File.join(target_dir, "#{output_prefix}.txt")
|
34
|
+
|
35
|
+
Cauterize::DocBuilder.new(doc_file, output_prefix)
|
36
|
+
end
|
37
|
+
|
32
38
|
def get_name
|
33
39
|
@@description_name
|
34
40
|
end
|
@@ -49,8 +55,7 @@ module Cauterize
|
|
49
55
|
@@version = version
|
50
56
|
end
|
51
57
|
|
52
|
-
|
53
|
-
def self.parse_dsl(desc_file)
|
58
|
+
def parse_dsl(desc_file)
|
54
59
|
Object.new.extend(Cauterize).instance_exec do
|
55
60
|
# this magic allows us to emit useful exception messages when evaling the
|
56
61
|
# file. if your description file has errors, you'll be able to find them
|
data/lib/cauterize/composite.rb
CHANGED
@@ -5,8 +5,8 @@
|
|
5
5
|
module Cauterize
|
6
6
|
module_function
|
7
7
|
|
8
|
-
def composite(name)
|
9
|
-
c = Cauterize.composites[name] || Cauterize.composites[name] = Composite.new(name)
|
8
|
+
def composite(name, desc=nil)
|
9
|
+
c = Cauterize.composites[name] || Cauterize.composites[name] = Composite.new(name, desc)
|
10
10
|
yield c if block_given?
|
11
11
|
return c
|
12
12
|
end
|
@@ -24,26 +24,27 @@ module Cauterize
|
|
24
24
|
end
|
25
25
|
|
26
26
|
class CompositeField
|
27
|
-
attr_reader :name, :type
|
28
|
-
def initialize(field_name, type_name)
|
27
|
+
attr_reader :name, :type, :description
|
28
|
+
def initialize(field_name, type_name, desc=nil)
|
29
29
|
@name = field_name
|
30
30
|
@type = BaseType.find_type!(type_name)
|
31
|
+
@description = desc
|
31
32
|
end
|
32
33
|
end
|
33
34
|
|
34
35
|
class Composite < BaseType
|
35
36
|
attr_reader :fields
|
36
37
|
|
37
|
-
def initialize(name)
|
38
|
+
def initialize(name, desc=nil)
|
38
39
|
super
|
39
40
|
@fields = {}
|
40
41
|
end
|
41
42
|
|
42
|
-
def field(name, type)
|
43
|
+
def field(name, type, desc=nil)
|
43
44
|
if @fields[name]
|
44
45
|
raise Exception.new("Field name #{name} already used.")
|
45
46
|
else
|
46
|
-
@fields[name] = CompositeField.new(name, type)
|
47
|
+
@fields[name] = CompositeField.new(name, type, desc)
|
47
48
|
end
|
48
49
|
end
|
49
50
|
end
|
data/lib/cauterize/cs_builder.rb
CHANGED
@@ -18,19 +18,22 @@ module Cauterize
|
|
18
18
|
def build_cs
|
19
19
|
f = four_space_formatter
|
20
20
|
|
21
|
+
f << "/* WARNING: This is generated code. Do not edit this file directly. */"
|
22
|
+
f << ""
|
21
23
|
f << "using System;"
|
22
24
|
f << "using Cauterize;"
|
23
25
|
f.blank_line
|
24
26
|
f << "namespace #{@name}"
|
25
27
|
f.braces do
|
26
|
-
f << "public class #{@name}
|
28
|
+
f << "public static class #{@name}Cauterize"
|
27
29
|
f.braces do
|
28
|
-
f << "static
|
30
|
+
f << "public static CauterizeInfo Info = new CauterizeInfo"
|
29
31
|
f.braces do
|
30
|
-
f << "Name = \"#{@name}\"
|
31
|
-
f << "GeneratedVersion = \"#{Cauterize.get_version}\"
|
32
|
-
f << "GeneratedDate = \"#{
|
32
|
+
f << "Name = \"#{@name}\","
|
33
|
+
f << "GeneratedVersion = \"#{Cauterize.get_version}\","
|
34
|
+
f << "GeneratedDate = \"#{DateTime.now.to_s}\""
|
33
35
|
end
|
36
|
+
f << ";"
|
34
37
|
end
|
35
38
|
f.blank_line
|
36
39
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Cauterize
|
2
|
+
class DocBuilder
|
3
|
+
attr_reader :doc_path, :name
|
4
|
+
def initialize(doc_path, name="cauterize")
|
5
|
+
@doc_path = doc_path
|
6
|
+
@name = name
|
7
|
+
end
|
8
|
+
|
9
|
+
def build
|
10
|
+
build_doc
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def build_doc
|
16
|
+
File.open(@doc_path, "wb") do |fh|
|
17
|
+
doc_sections = []
|
18
|
+
|
19
|
+
instances = BaseType.all_instances
|
20
|
+
builders = instances.map {|i| Builders.get(:doc, i)}
|
21
|
+
|
22
|
+
builders.each do |b|
|
23
|
+
body_lines = (b.body || []).map {|l| " " + l}
|
24
|
+
lines = ([b.heading] + body_lines)
|
25
|
+
|
26
|
+
doc_sections << lines.join("\n") + "\n"
|
27
|
+
end
|
28
|
+
|
29
|
+
fh.write(doc_sections.join("\n"))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
@@ -6,17 +6,17 @@ require 'set'
|
|
6
6
|
|
7
7
|
module Cauterize
|
8
8
|
module_function
|
9
|
-
def enumeration(name)
|
10
|
-
e = Cauterize.enumerations[name] || Cauterize.enumerations[name] = Enumeration.new(name)
|
9
|
+
def enumeration(name, desc=nil)
|
10
|
+
e = Cauterize.enumerations[name] || Cauterize.enumerations[name] = Enumeration.new(name, desc)
|
11
11
|
yield e if block_given?
|
12
12
|
return e
|
13
13
|
end
|
14
14
|
|
15
|
-
def enumeration!(name, &blk)
|
15
|
+
def enumeration!(name, desc=nil, &blk)
|
16
16
|
if Cauterize.enumerations[name]
|
17
17
|
raise Exception.new("Enumeration with name #{name} already exists.")
|
18
18
|
else
|
19
|
-
Cauterize.enumeration(name, &blk)
|
19
|
+
Cauterize.enumeration(name, desc, &blk)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
@@ -36,7 +36,7 @@ module Cauterize
|
|
36
36
|
class Enumeration < BaseType
|
37
37
|
attr_reader :values
|
38
38
|
|
39
|
-
def initialize(name)
|
39
|
+
def initialize(name, desc=nil)
|
40
40
|
super
|
41
41
|
@values = {}
|
42
42
|
@value_id = 0
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module Cauterize
|
2
2
|
module_function
|
3
3
|
|
4
|
-
def fixed_array(name)
|
5
|
-
a = Cauterize.fixed_arrays[name] || Cauterize.fixed_arrays[name] = FixedArray.new(name)
|
4
|
+
def fixed_array(name, desc=nil)
|
5
|
+
a = Cauterize.fixed_arrays[name] || Cauterize.fixed_arrays[name] = FixedArray.new(name, desc)
|
6
6
|
yield a if block_given?
|
7
7
|
return a
|
8
8
|
end
|
@@ -20,7 +20,7 @@ module Cauterize
|
|
20
20
|
end
|
21
21
|
|
22
22
|
class FixedArray < BaseType
|
23
|
-
def initialize(name)
|
23
|
+
def initialize(name, desc=nil)
|
24
24
|
super
|
25
25
|
end
|
26
26
|
|
data/lib/cauterize/group.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module Cauterize
|
2
2
|
module_function
|
3
3
|
|
4
|
-
def group(name)
|
5
|
-
a = Cauterize.groups[name] || Cauterize.groups[name] = Group.new(name)
|
4
|
+
def group(name, desc=nil)
|
5
|
+
a = Cauterize.groups[name] || Cauterize.groups[name] = Group.new(name, desc)
|
6
6
|
yield a if block_given?
|
7
7
|
return a
|
8
8
|
end
|
@@ -20,32 +20,42 @@ module Cauterize
|
|
20
20
|
end
|
21
21
|
|
22
22
|
class GroupField
|
23
|
-
attr_reader :name, :type
|
23
|
+
attr_reader :name, :type, :description
|
24
24
|
|
25
|
-
def initialize(name, type)
|
25
|
+
def initialize(name, type, desc=nil)
|
26
26
|
@name = name
|
27
27
|
@type = BaseType.find_type!(type) if type
|
28
|
+
@description = desc
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
31
32
|
class Group < BaseType
|
32
33
|
attr_reader :fields, :tag_enum
|
33
34
|
|
34
|
-
def initialize(name)
|
35
|
+
def initialize(name, desc=nil)
|
36
|
+
# This technically should be defined before the group itself is defined
|
37
|
+
# because the group depends on the enumeration. Technically, this snippet
|
38
|
+
# of code doesn't care, but others may depend on the ordering.
|
39
|
+
@tag_enum = Cauterize.enumeration!("group_#{name}_type".to_sym)
|
40
|
+
|
41
|
+
# Make sure that this is called *AFTER* the enumeration is created.
|
35
42
|
super
|
36
43
|
@fields = {}
|
37
|
-
@tag_enum = Cauterize.enumeration!("group_#{name}_type".to_sym)
|
38
44
|
end
|
39
45
|
|
40
|
-
def field(name, type=nil)
|
46
|
+
def field(name, type, desc=nil)
|
41
47
|
if @fields[name]
|
42
48
|
raise Exception.new("Field name #{name} already used.")
|
43
49
|
else
|
44
|
-
@fields[name] = GroupField.new(name, type)
|
50
|
+
@fields[name] = GroupField.new(name, type, desc)
|
45
51
|
@tag_enum.value(enum_sym(name))
|
46
52
|
end
|
47
53
|
end
|
48
54
|
|
55
|
+
def dataless(name, desc=nil)
|
56
|
+
field(name, nil, desc)
|
57
|
+
end
|
58
|
+
|
49
59
|
def enum_sym(fname)
|
50
60
|
"group_#{@name}_type_#{fname}".up_snake.to_sym
|
51
61
|
end
|