cauterize 0.0.1.pre11 → 0.0.1.pre12

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,6 +4,12 @@ set_version("1.2.3")
4
4
  scalar(:bigint) { |t| t.type_name(:int32) }
5
5
  scalar(:usmallint) { |t| t.type_name(:uint8) }
6
6
 
7
+ variable_array(:uint8_buffer) do |a|
8
+ a.size_type :uint8
9
+ a.array_type :uint8
10
+ a.array_size 128
11
+ end
12
+
7
13
  enumeration(:color) do |e|
8
14
  e.value :red
9
15
  e.value :blue
@@ -7,11 +7,14 @@ rm -rf c_cauterize_output
7
7
  ../bin/cauterize generate c c_cauterize_output
8
8
 
9
9
  CFLAGS="-Wall -Werror -Wextra"
10
- INCLUDES="-Ic_cauterize_output"
11
-
12
-
13
- gcc $CFLAGS $INCLUDES c_cauterize_output/cauterize.c -c -o c_cauterize_output/cauterize.o
14
- gcc $CFLAGS $INCLUDES c_cauterize_output/example_project.c -c -o c_cauterize_output/example_project.o
10
+ INCLUDES="-Ic_cauterize_output -Ic_example_support"
11
+ DEFINES="-DUSE_CAUTERIZE_CONFIG_HEADER"
12
+
13
+ gcc $CFLAGS $INCLUDES $DEFINES c_example_support/example_project_config.c \
14
+ c_example_support/empty_main.c \
15
+ c_cauterize_output/cauterize.c \
16
+ c_cauterize_output/example_project.c \
17
+ -o c_cauterize_output/example_project
15
18
 
16
19
  rm -rf cs_cauterize_output
17
20
  ../bin/cauterize generate cs cs_cauterize_output
@@ -0,0 +1 @@
1
+ int main(int argc, char * argv[]) { (void)argc; (void)argv; return 0; }
@@ -0,0 +1,11 @@
1
+ #include "example_project_config.h"
2
+
3
+ CAUTERIZE_STATUS_T spec_Pack_uint8_buffer(struct Cauterize * dst, struct uint8_buffer * src)
4
+ {
5
+ CAUTERIZE_STATUS_T err;
6
+
7
+ if (src->length > ARRAY_SIZE(src->data)) { return CA_ERR_INVALID_LENGTH; }
8
+ if (CA_OK != (err = Pack_uint8(dst, &src->length))) { return err; }
9
+
10
+ return CauterizeAppend(dst, src->data, src->length * sizeof(src->data[0]));
11
+ }
@@ -0,0 +1,15 @@
1
+ #ifndef EXAMPLE_PROJECT_CONFIG_H
2
+ #define EXAMPLE_PROJECT_CONFIG_H
3
+
4
+ #include "example_project.h"
5
+
6
+ /* We're going to define a specialized version of Pack_uint8_buffer which packs
7
+ * the entire buffer at once. We know this is okay since we're guaranteed not
8
+ * to have any padding between the bytes in the array. */
9
+ #define SPECIALIZED_Pack_uint8_buffer spec_Pack_uint8_buffer
10
+
11
+ CAUTERIZE_STATUS_T spec_Pack_uint8_buffer(
12
+ struct Cauterize * dst,
13
+ struct uint8_buffer * src);
14
+
15
+ #endif /* EXAMPLE_PROJECT_CONFIG_H */
@@ -33,18 +33,42 @@ module Cauterize
33
33
  end
34
34
  end
35
35
 
36
+ # wrapped_(un)packer_defn allow us to wrap every definition in some text #
37
+ ##########################################################################
38
+ def wrapped_packer_defn(formatter)
39
+ formatter << packer_sig
40
+ formatter.braces do
41
+ formatter.backdent("#ifdef SPECIALIZED_#{packer_sym}")
42
+ formatter << "return SPECIALIZED_#{packer_sym}(dst, src);"
43
+ formatter.backdent("#else")
44
+ packer_defn(formatter)
45
+ formatter.backdent("#endif")
46
+ end
47
+ end
48
+
49
+ def wrapped_unpacker_defn(formatter)
50
+ formatter << unpacker_sig
51
+ formatter.braces do
52
+ formatter.backdent("#ifdef SPECIALIZED_#{unpacker_sym}")
53
+ formatter << "return SPECIALIZED_#{unpacker_sym}(src, dst);"
54
+ formatter.backdent("#else")
55
+ unpacker_defn(formatter)
56
+ formatter.backdent("#endif")
57
+ end
58
+ end
59
+
36
60
  # Things below here are tested in shared_examples_for_c_buildables #
37
61
  ####################################################################
38
62
 
39
63
  # Methods that are pretty much the same for everyone.
40
64
  def packer_sym; "Pack_#{@blueprint.name}" end
41
- def packer_sig; "CALLCONV CAUTERIZE_STATUS_T DLLDECL #{packer_sym}(struct Cauterize * dst, #{render} * src)" end
65
+ def packer_sig; "CAUTERIZE_STATUS_T #{packer_sym}(struct Cauterize * dst, #{render} * src)" end
42
66
  def packer_proto(formatter)
43
67
  formatter << packer_sig + ";"
44
68
  end
45
69
 
46
70
  def unpacker_sym; "Unpack_#{@blueprint.name}" end
47
- def unpacker_sig; "CALLCONV CAUTERIZE_STATUS_T DLLDECL #{unpacker_sym}(struct Cauterize * src, #{render} * dst)" end
71
+ def unpacker_sig; "CAUTERIZE_STATUS_T #{unpacker_sym}(struct Cauterize * src, #{render} * dst)" end
48
72
  def unpacker_proto(formatter)
49
73
  formatter << unpacker_sig + ";"
50
74
  end
@@ -19,17 +19,11 @@ module Cauterize
19
19
 
20
20
  # These are identical to the Scalar definitions. For now.
21
21
  def packer_defn(formatter)
22
- formatter << packer_sig
23
- formatter.braces do
24
- formatter << "return CauterizeAppend(dst, (uint8_t*)src, sizeof(*src));"
25
- end
22
+ formatter << "return CauterizeAppend(dst, (uint8_t*)src, sizeof(*src));"
26
23
  end
27
24
 
28
25
  def unpacker_defn(formatter)
29
- formatter << unpacker_sig
30
- formatter.braces do
31
- formatter << "return CauterizeRead(src, (uint8_t*)dst, sizeof(*dst));"
32
- end
26
+ formatter << "return CauterizeRead(src, (uint8_t*)dst, sizeof(*dst));"
33
27
  end
34
28
 
35
29
  private
@@ -11,27 +11,21 @@ module Cauterize
11
11
  end
12
12
 
13
13
  def packer_defn(formatter)
14
- formatter << packer_sig
15
- formatter.braces do
16
- formatter << "CAUTERIZE_STATUS_T err;"
17
- @blueprint.fields.values.each do |field|
18
- p_sym = Builders.get(:c, field.type).packer_sym
19
- formatter << "if (CA_OK != (err = #{p_sym}(dst, &src->#{field.name}))) { return err; }"
20
- end
21
- formatter << "return CA_OK;"
14
+ formatter << "CAUTERIZE_STATUS_T err;"
15
+ @blueprint.fields.values.each do |field|
16
+ p_sym = Builders.get(:c, field.type).packer_sym
17
+ formatter << "if (CA_OK != (err = #{p_sym}(dst, &src->#{field.name}))) { return err; }"
22
18
  end
19
+ formatter << "return CA_OK;"
23
20
  end
24
21
 
25
22
  def unpacker_defn(formatter)
26
- formatter << unpacker_sig
27
- formatter.braces do
28
- formatter << "CAUTERIZE_STATUS_T err;"
29
- @blueprint.fields.values.each do |field|
30
- u_sym = Builders.get(:c, field.type).unpacker_sym
31
- formatter << "if (CA_OK != (err = #{u_sym}(src, &dst->#{field.name}))) { return err; }"
32
- end
33
- formatter << "return CA_OK;"
23
+ formatter << "CAUTERIZE_STATUS_T err;"
24
+ @blueprint.fields.values.each do |field|
25
+ u_sym = Builders.get(:c, field.type).unpacker_sym
26
+ formatter << "if (CA_OK != (err = #{u_sym}(src, &dst->#{field.name}))) { return err; }"
34
27
  end
28
+ formatter << "return CA_OK;"
35
29
  end
36
30
 
37
31
  def struct_proto(formatter)
@@ -13,35 +13,29 @@ module Cauterize
13
13
  def packer_defn(formatter)
14
14
  rep_builder = Builders.get(:c, @blueprint.representation)
15
15
 
16
- formatter << packer_sig
17
- formatter.braces do
18
- rep = "enum_representation"
19
- rep_builder.declare(formatter, rep)
16
+ rep = "enum_representation"
17
+ rep_builder.declare(formatter, rep)
20
18
 
21
- formatter << "#{rep} = (#{rep_builder.render})(*src);"
22
- formatter << "return #{rep_builder.packer_sym}(dst, &#{rep});"
23
- end
19
+ formatter << "#{rep} = (#{rep_builder.render})(*src);"
20
+ formatter << "return #{rep_builder.packer_sym}(dst, &#{rep});"
24
21
  end
25
22
 
26
23
  def unpacker_defn(formatter)
27
24
  rep_builder = Builders.get(:c, @blueprint.representation)
28
25
 
29
- formatter << unpacker_sig
30
- formatter.braces do
31
- rep = "enum_representation"
32
- rep_builder.declare(formatter, rep)
26
+ rep = "enum_representation"
27
+ rep_builder.declare(formatter, rep)
33
28
 
34
- formatter << "CAUTERIZE_STATUS_T s = #{rep_builder.unpacker_sym}(src, &#{rep});"
35
- formatter << "if (CA_OK != s)"
36
- formatter.braces do
37
- formatter << "return s;"
38
- end
29
+ formatter << "CAUTERIZE_STATUS_T s = #{rep_builder.unpacker_sym}(src, &#{rep});"
30
+ formatter << "if (CA_OK != s)"
31
+ formatter.braces do
32
+ formatter << "return s;"
33
+ end
39
34
 
40
- formatter << "else"
41
- formatter.braces do
42
- formatter << "*dst = (#{render})#{rep};"
43
- formatter << "return CA_OK;"
44
- end
35
+ formatter << "else"
36
+ formatter.braces do
37
+ formatter << "*dst = (#{render})#{rep};"
38
+ formatter << "return CA_OK;"
45
39
  end
46
40
  end
47
41
 
@@ -11,39 +11,33 @@ module Cauterize
11
11
  end
12
12
 
13
13
  def packer_defn(formatter)
14
- formatter << packer_sig
15
- formatter.braces do
16
- formatter << "CAUTERIZE_STATUS_T err;"
17
- formatter << "size_t i;"
18
- formatter.blank_line
19
-
20
- # store each used item in the array
21
- formatter << "for (i = 0; i < #{@blueprint.array_size}; i++)"
22
- formatter.braces do
23
- formatter << "if (CA_OK != (err = #{ty_bldr.packer_sym}(dst, &src->data[i]))) { return err; }"
24
- end
25
- formatter.blank_line
14
+ formatter << "CAUTERIZE_STATUS_T err;"
15
+ formatter << "size_t i;"
16
+ formatter.blank_line
26
17
 
27
- formatter << "return CA_OK;"
18
+ # store each used item in the array
19
+ formatter << "for (i = 0; i < #{@blueprint.array_size}; i++)"
20
+ formatter.braces do
21
+ formatter << "if (CA_OK != (err = #{ty_bldr.packer_sym}(dst, &src->data[i]))) { return err; }"
28
22
  end
23
+ formatter.blank_line
24
+
25
+ formatter << "return CA_OK;"
29
26
  end
30
27
 
31
28
  def unpacker_defn(formatter)
32
- formatter << unpacker_sig
33
- formatter.braces do
34
- formatter << "CAUTERIZE_STATUS_T err;"
35
- formatter << "size_t i;"
36
- formatter.blank_line
37
-
38
- # store each used item in the array
39
- formatter << "for (i = 0; i < #{@blueprint.array_size}; i++)"
40
- formatter.braces do
41
- formatter << "if (CA_OK != (err = #{ty_bldr.unpacker_sym}(src, &dst->data[i]))) { return err; }"
42
- end
43
- formatter.blank_line
29
+ formatter << "CAUTERIZE_STATUS_T err;"
30
+ formatter << "size_t i;"
31
+ formatter.blank_line
44
32
 
45
- formatter << "return CA_OK;"
33
+ # store each used item in the array
34
+ formatter << "for (i = 0; i < #{@blueprint.array_size}; i++)"
35
+ formatter.braces do
36
+ formatter << "if (CA_OK != (err = #{ty_bldr.unpacker_sym}(src, &dst->data[i]))) { return err; }"
46
37
  end
38
+ formatter.blank_line
39
+
40
+ formatter << "return CA_OK;"
47
41
  end
48
42
 
49
43
  def struct_proto(formatter)
@@ -17,60 +17,55 @@ module Cauterize
17
17
 
18
18
  def packer_defn(formatter)
19
19
  enum_builder = Builders.get(:c, @tag_enum)
20
- formatter << packer_sig
21
- formatter.braces do
22
- formatter << "CAUTERIZE_STATUS_T err;"
23
-
24
- # pack the tag
25
- formatter << "if (CA_OK != (err = #{enum_builder.packer_sym}(dst, &src->tag))) { return err; }"
26
-
27
- # pack the fields
28
- formatter << "switch (src->tag)"
29
- formatter.braces do
30
- having_data.each do |field|
31
- bldr = Builders.get(:c, field.type)
32
- formatter.backdent "case #{@blueprint.enum_sym(field.name)}:"
33
- formatter << "if (CA_OK != (err = #{bldr.packer_sym}(dst, &src->data.#{field.name}))) { return err; }"
34
- formatter << "break;"
35
- end
20
+ formatter << "CAUTERIZE_STATUS_T err;"
36
21
 
37
- format_no_data_stubs(formatter)
22
+ # pack the tag
23
+ formatter << "if (CA_OK != (err = #{enum_builder.packer_sym}(dst, &src->tag))) { return err; }"
38
24
 
39
- formatter.backdent "default:"
40
- formatter << "return CA_ERR_INVALID_TYPE_TAG;"
25
+ # pack the fields
26
+ formatter << "switch (src->tag)"
27
+ formatter.braces do
28
+ having_data.each do |field|
29
+ bldr = Builders.get(:c, field.type)
30
+ formatter.backdent "case #{@blueprint.enum_sym(field.name)}:"
31
+ formatter << "if (CA_OK != (err = #{bldr.packer_sym}(dst, &src->data.#{field.name}))) { return err; }"
41
32
  formatter << "break;"
42
33
  end
43
- formatter << "return CA_OK;"
34
+
35
+ format_no_data_stubs(formatter)
36
+
37
+ formatter.backdent "default:"
38
+ formatter << "return CA_ERR_INVALID_TYPE_TAG;"
39
+ formatter << "break;"
44
40
  end
41
+ formatter << "return CA_OK;"
45
42
  end
46
43
 
47
44
  def unpacker_defn(formatter)
48
45
  enum_builder = Builders.get(:c, @tag_enum)
49
- formatter << unpacker_sig
50
- formatter.braces do
51
- formatter << "CAUTERIZE_STATUS_T err;"
52
46
 
53
- # unpack the tag
54
- formatter << "if (CA_OK != (err = #{enum_builder.unpacker_sym}(src, &dst->tag))) { return err; }"
47
+ formatter << "CAUTERIZE_STATUS_T err;"
55
48
 
56
- # pack the fields
57
- formatter << "switch (dst->tag)"
58
- formatter.braces do
59
- having_data.each do |field|
60
- bldr = Builders.get(:c, field.type)
61
- formatter.backdent "case #{@blueprint.enum_sym(field.name)}:"
62
- formatter << "if (CA_OK != (err = #{bldr.unpacker_sym}(src, &dst->data.#{field.name}))) { return err; }"
63
- formatter << "break;"
64
- end
49
+ # unpack the tag
50
+ formatter << "if (CA_OK != (err = #{enum_builder.unpacker_sym}(src, &dst->tag))) { return err; }"
65
51
 
66
- format_no_data_stubs(formatter)
67
-
68
- formatter.backdent "default:"
69
- formatter << "return CA_ERR_INVALID_TYPE_TAG;"
52
+ # pack the fields
53
+ formatter << "switch (dst->tag)"
54
+ formatter.braces do
55
+ having_data.each do |field|
56
+ bldr = Builders.get(:c, field.type)
57
+ formatter.backdent "case #{@blueprint.enum_sym(field.name)}:"
58
+ formatter << "if (CA_OK != (err = #{bldr.unpacker_sym}(src, &dst->data.#{field.name}))) { return err; }"
70
59
  formatter << "break;"
71
60
  end
72
- formatter << "return CA_OK;"
61
+
62
+ format_no_data_stubs(formatter)
63
+
64
+ formatter.backdent "default:"
65
+ formatter << "return CA_ERR_INVALID_TYPE_TAG;"
66
+ formatter << "break;"
73
67
  end
68
+ formatter << "return CA_OK;"
74
69
  end
75
70
 
76
71
  def struct_proto(formatter)
@@ -16,17 +16,11 @@ module Cauterize
16
16
  end
17
17
 
18
18
  def packer_defn(formatter)
19
- formatter << packer_sig
20
- formatter.braces do
21
- formatter << "return CauterizeAppend(dst, (uint8_t*)src, sizeof(*src));"
22
- end
19
+ formatter << "return CauterizeAppend(dst, (uint8_t*)src, sizeof(*src));"
23
20
  end
24
21
 
25
22
  def unpacker_defn(formatter)
26
- formatter << unpacker_sig
27
- formatter.braces do
28
- formatter << "return CauterizeRead(src, (uint8_t*)dst, sizeof(*dst));"
29
- end
23
+ formatter << "return CauterizeRead(src, (uint8_t*)dst, sizeof(*dst));"
30
24
  end
31
25
  end
32
26
  end
@@ -14,57 +14,51 @@ module Cauterize
14
14
  size_type_builder = Builders.get(:c, @blueprint.size_type)
15
15
  array_type_builder = Builders.get(:c, @blueprint.array_type)
16
16
 
17
- formatter << packer_sig
17
+ formatter << "CAUTERIZE_STATUS_T err;"
18
+ formatter << "size_t i;"
19
+ formatter.blank_line
20
+ # check the length
21
+ formatter << "if (src->length > ARRAY_SIZE(src->data)) { return CA_ERR_INVALID_LENGTH; }"
22
+
23
+ # store the length
24
+ formatter << "if (CA_OK != (err = #{size_type_builder.packer_sym}(dst, &src->length))) { return err; }"
25
+ formatter.blank_line
26
+
27
+ # store each used item in the array
28
+ formatter << "for (i = 0; i < src->length; i++)"
18
29
  formatter.braces do
19
- formatter << "CAUTERIZE_STATUS_T err;"
20
- formatter << "size_t i;"
21
- formatter.blank_line
22
- # check the length
23
- formatter << "if (src->length > ARRAY_SIZE(src->data)) { return CA_ERR_INVALID_LENGTH; }"
24
-
25
- # store the length
26
- formatter << "if (CA_OK != (err = #{size_type_builder.packer_sym}(dst, &src->length))) { return err; }"
27
- formatter.blank_line
28
-
29
- # store each used item in the array
30
- formatter << "for (i = 0; i < src->length; i++)"
31
- formatter.braces do
32
- formatter << "if (CA_OK != (err = #{array_type_builder.packer_sym}(dst, &src->data[i]))) { return err; }"
33
- end
34
- formatter.blank_line
35
-
36
- formatter << "return CA_OK;"
30
+ formatter << "if (CA_OK != (err = #{array_type_builder.packer_sym}(dst, &src->data[i]))) { return err; }"
37
31
  end
32
+ formatter.blank_line
33
+
34
+ formatter << "return CA_OK;"
38
35
  end
39
36
 
40
37
  def unpacker_defn(formatter)
41
38
  size_type_builder = Builders.get(:c, @blueprint.size_type)
42
39
  array_type_builder = Builders.get(:c, @blueprint.array_type)
43
40
 
44
- formatter << unpacker_sig
45
- formatter.braces do
46
- formatter << "CAUTERIZE_STATUS_T err;"
47
- formatter << "size_t i;"
48
- formatter.blank_line
49
-
50
- # read the length
51
- formatter << "if (CA_OK != (err = #{size_type_builder.unpacker_sym}(src, &dst->length))) { return err; }"
52
- formatter.blank_line
41
+ formatter << "CAUTERIZE_STATUS_T err;"
42
+ formatter << "size_t i;"
43
+ formatter.blank_line
53
44
 
54
- # check the length
55
- formatter << "if (dst->length > ARRAY_SIZE(dst->data)) { return CA_ERR_INVALID_LENGTH; }"
56
- formatter.blank_line
45
+ # read the length
46
+ formatter << "if (CA_OK != (err = #{size_type_builder.unpacker_sym}(src, &dst->length))) { return err; }"
47
+ formatter.blank_line
57
48
 
49
+ # check the length
50
+ formatter << "if (dst->length > ARRAY_SIZE(dst->data)) { return CA_ERR_INVALID_LENGTH; }"
51
+ formatter.blank_line
58
52
 
59
- # store each used item in the array
60
- formatter << "for (i = 0; i < dst->length; i++)"
61
- formatter.braces do
62
- formatter << "if (CA_OK != (err = #{array_type_builder.unpacker_sym}(src, &dst->data[i]))) { return err; }"
63
- end
64
- formatter.blank_line
65
53
 
66
- formatter << "return CA_OK;"
54
+ # store each used item in the array
55
+ formatter << "for (i = 0; i < dst->length; i++)"
56
+ formatter.braces do
57
+ formatter << "if (CA_OK != (err = #{array_type_builder.unpacker_sym}(src, &dst->data[i]))) { return err; }"
67
58
  end
59
+ formatter.blank_line
60
+
61
+ formatter << "return CA_OK;"
68
62
  end
69
63
 
70
64
  def struct_proto(formatter)
@@ -72,12 +72,22 @@ module Cauterize
72
72
  f << ""
73
73
  f << %Q{#include <cauterize_util.h>}
74
74
  f << %Q{#include "#{@name}.h"}
75
+ f.blank_line
76
+
77
+ f << %Q{/* Some extra configuration information may be provided. This is}
78
+ f << %Q{ * a good place for the user to put prototypes or defines used}
79
+ f << %Q{ * elsewhere. This is a user defined file and should be in the}
80
+ f << %Q{ * include search path. */}
81
+ f << %Q{#ifdef USE_CAUTERIZE_CONFIG_HEADER}
82
+ f << %Q{#include "#{@name}_config.h"}
83
+ f << %Q{#endif}
84
+ f.blank_line
75
85
 
76
86
  instances = BaseType.all_instances
77
87
  builders = instances.map {|i| Builders.get(:c, i)}
78
88
 
79
- builders.each { |b| b.packer_defn(f) }
80
- builders.each { |b| b.unpacker_defn(f) }
89
+ builders.each { |b| b.wrapped_packer_defn(f); f.blank_line }
90
+ builders.each { |b| b.wrapped_unpacker_defn(f); f.blank_line }
81
91
 
82
92
  File.open(@c, "wb") do |fh|
83
93
  fh.write(f.to_s)
@@ -23,9 +23,13 @@ class Formatter
23
23
 
24
24
  # indent back one level
25
25
  def backdent(line)
26
- @indent_level -= 1
27
- @lines << indent(line)
28
- @indent_level += 1
26
+ if 0 == @indent_level
27
+ @lines << line
28
+ else
29
+ @indent_level -= 1
30
+ @lines << indent(line)
31
+ @indent_level += 1
32
+ end
29
33
  end
30
34
 
31
35
  def append(text)
@@ -1,3 +1,3 @@
1
1
  module Cauterize
2
- VERSION = "0.0.1.pre11"
2
+ VERSION = "0.0.1.pre12"
3
3
  end
@@ -30,7 +30,7 @@ module Cauterize
30
30
 
31
31
  describe :packer_sig do
32
32
  it "looks like this" do
33
- r = /CALLCONV CAUTERIZE_STATUS_T DLLDECL (?<sym>[^\(]+)\(struct Cauterize \* dst, (?<rend>(?:(?:struct|enum) )?[^ ]+) \* src\)/
33
+ r = /CAUTERIZE_STATUS_T (?<sym>[^\(]+)\(struct Cauterize \* dst, (?<rend>(?:(?:struct|enum) )?[^ ]+) \* src\)/
34
34
  subject.packer_sig.should match r
35
35
  m = subject.packer_sig.match(r)
36
36
  m[:sym].should == subject.packer_sym
@@ -45,12 +45,16 @@ module Cauterize
45
45
  end
46
46
  end
47
47
 
48
- describe :packer_defn do
49
- before { subject.packer_defn(formatter) }
48
+ describe :wrapped_packer_defn do
49
+ before { subject.wrapped_packer_defn(formatter) }
50
50
 
51
51
  it "contains the signature" do
52
52
  formatter.to_s.should match Regexp.escape(subject.packer_sig)
53
53
  end
54
+ end
55
+
56
+ describe :packer_defn do
57
+ before { subject.packer_defn(formatter) }
54
58
 
55
59
  it "contains a return statement" do
56
60
  formatter.to_s.should match /return.*;/
@@ -65,7 +69,7 @@ module Cauterize
65
69
 
66
70
  describe :unpacker_sig do
67
71
  it "looks like this" do
68
- r = /CALLCONV CAUTERIZE_STATUS_T DLLDECL (?<sym>[^\(]+)\(struct Cauterize \* src, (?<rend>(?:(?:struct|enum) )?[^ ]+) \* dst\)/
72
+ r = /CAUTERIZE_STATUS_T (?<sym>[^\(]+)\(struct Cauterize \* src, (?<rend>(?:(?:struct|enum) )?[^ ]+) \* dst\)/
69
73
  subject.unpacker_sig.should match r
70
74
  m = subject.unpacker_sig.match(r)
71
75
  m[:sym].should == subject.unpacker_sym
@@ -80,12 +84,16 @@ module Cauterize
80
84
  end
81
85
  end
82
86
 
83
- describe :unpacker_defn do
84
- before { subject.unpacker_defn(formatter) }
87
+ describe :wrapped_unpacker_defn do
88
+ before { subject.wrapped_unpacker_defn(formatter) }
85
89
 
86
90
  it "contains the signature" do
87
91
  formatter.to_s.should match Regexp.escape(subject.unpacker_sig)
88
92
  end
93
+ end
94
+
95
+ describe :unpacker_defn do
96
+ before { subject.unpacker_defn(formatter) }
89
97
 
90
98
  it "contains a return statement" do
91
99
  formatter.to_s.should match /return.*;/
@@ -6,7 +6,7 @@
6
6
 
7
7
  #include <string.h>
8
8
 
9
- #define S CALLCONV CAUTERIZE_STATUS_T DLLDECL
9
+ #define S CAUTERIZE_STATUS_T
10
10
  #define T struct Cauterize
11
11
 
12
12
  S CauterizeInitAppend(T * m, uint8_t * buffer, uint32_t length)
@@ -33,22 +33,22 @@ struct Cauterize {
33
33
  extern "C" {
34
34
  #endif
35
35
 
36
- CALLCONV CAUTERIZE_STATUS_T DLLDECL CauterizeInitAppend(
36
+ CAUTERIZE_STATUS_T CauterizeInitAppend(
37
37
  struct Cauterize * m,
38
38
  uint8_t * buffer,
39
39
  uint32_t length);
40
40
 
41
- CALLCONV CAUTERIZE_STATUS_T DLLDECL CauterizeInitRead(
41
+ CAUTERIZE_STATUS_T CauterizeInitRead(
42
42
  struct Cauterize * m,
43
43
  uint8_t * buffer,
44
44
  uint32_t used);
45
45
 
46
- CALLCONV CAUTERIZE_STATUS_T DLLDECL CauterizeAppend(
46
+ CAUTERIZE_STATUS_T CauterizeAppend(
47
47
  struct Cauterize * m,
48
48
  uint8_t * src,
49
49
  uint32_t length);
50
50
 
51
- CALLCONV CAUTERIZE_STATUS_T DLLDECL CauterizeRead(
51
+ CAUTERIZE_STATUS_T CauterizeRead(
52
52
  struct Cauterize * m,
53
53
  uint8_t * dst,
54
54
  uint32_t length);
@@ -5,45 +5,4 @@
5
5
  #define CA_MIN(a, b) (((a) < (b)) ? (a) : (b))
6
6
  #define CA_MAX(a,b) ((a) > (b) ? (a) : (b))
7
7
 
8
- /* Buidling Cauterize files as a DLL. */
9
-
10
- #if defined(BUILDING_DLL) || defined(USING_DLL)
11
- #if !defined(_WIN32)
12
- #error "Can only build DLL in Windows."
13
- #endif
14
-
15
- #define CALLCONV __stdcall
16
- #endif
17
-
18
- #if defined(BUILDING_DLL)
19
- #define DLLDECL __declspec(dllexport)
20
- #elif defined(USING_DLL)
21
- #define DLLDECL __declspec(dllimport)
22
- #endif
23
-
24
- #ifndef DLLDECL
25
- #define DLLDECL
26
- #endif
27
-
28
- #ifndef CALLCONV
29
- #define CALLCONV
30
- #endif
31
-
32
- /* Buidling Cauterize files as a DLL. */
33
-
34
- #if defined(BUILDING_DLL)
35
- #define DLLDECL __declspec(dllexport)
36
- #elif defined(USING_DLL)
37
- #define DLLDECL __declspec(dllimport)
38
- #else
39
- #define DLLDECL
40
- #endif
41
-
42
- #if defined(_WIN32)
43
- #warn "building on win32"
44
- #define CALLCONV __stdcal
45
- #else
46
- #define CALLCONV
47
- #endif
48
-
49
8
  #endif /* CAUTERIZE_UTIL_H */
@@ -16,11 +16,13 @@ class CauterizeData
16
16
  end
17
17
 
18
18
  class CauterizeBuiltin < CauterizeData
19
- attr_reader :val
20
19
  def initialize(val)
21
20
  raise "Out of range value" if not in_range(val)
22
21
  @val = val
23
22
  end
23
+ def to_ruby
24
+ @val
25
+ end
24
26
  end
25
27
 
26
28
  class CauterizeBuiltinInteger < CauterizeBuiltin
@@ -29,7 +31,7 @@ class CauterizeBuiltinInteger < CauterizeBuiltin
29
31
  end
30
32
 
31
33
  def to_i
32
- val
34
+ @val
33
35
  end
34
36
  end
35
37
 
@@ -39,7 +41,7 @@ class CauterizeBuiltinFloat < CauterizeBuiltin
39
41
  end
40
42
 
41
43
  def to_f
42
- val
44
+ @val
43
45
  end
44
46
  end
45
47
 
@@ -55,8 +57,8 @@ class CauterizeScalar < CauterizeData
55
57
  @val = self.class.builtin.construct val
56
58
  end
57
59
 
58
- def val
59
- @val.val
60
+ def to_ruby
61
+ @val.to_ruby
60
62
  end
61
63
 
62
64
  def pack
@@ -69,12 +71,12 @@ class CauterizeScalar < CauterizeData
69
71
  end
70
72
 
71
73
  class CauterizeArray < CauterizeData
72
- def val
73
- @elems.map{|e| e.val}
74
+ def to_ruby
75
+ @elems.map{|e| e.to_ruby}
74
76
  end
75
77
 
76
- def to_s
77
- val.to_a.pack("C*")
78
+ def to_string
79
+ to_ruby.to_a.pack("C*")
78
80
  end
79
81
  end
80
82
 
@@ -106,17 +108,13 @@ class CauterizeVariableArray < CauterizeArray
106
108
  raise "Invalid length" if @elems.length > self.class.max_length
107
109
  end
108
110
 
109
- def val
110
- @elems.map{|e| e.val}
111
- end
112
-
113
111
  def pack
114
112
  @length.pack + @elems.inject("") { |sum, n| sum + n.pack }
115
113
  end
116
114
 
117
115
  def self.unpackio(str)
118
116
  length = self.size_type.unpackio(str)
119
- self.new (1..length.val).map { self.elem_type.unpackio(str) }
117
+ self.new (1..length.to_i).map { self.elem_type.unpackio(str) }
120
118
  end
121
119
  end
122
120
 
@@ -134,8 +132,8 @@ class CauterizeComposite < CauterizeData
134
132
  end]
135
133
  end
136
134
 
137
- def val
138
- Hash[@fields.map{|name, value| [name, value.val]}]
135
+ def to_ruby
136
+ Hash[@fields.map{|name, value| [name, value.to_ruby]}]
139
137
  end
140
138
 
141
139
  def pack
@@ -168,11 +166,11 @@ class CauterizeEnumeration < CauterizeData
168
166
  @field_name = field_name
169
167
  end
170
168
 
171
- def val
169
+ def to_ruby
172
170
  @field_name
173
171
  end
174
172
 
175
- def val() self.class.fields[@field_name] end
173
+ def to_i() self.class.fields[@field_name] end
176
174
 
177
175
  def pack
178
176
  self.class.repr_type.construct(self.class.fields[@field_name]).pack
@@ -193,12 +191,12 @@ class CauterizeGroup < CauterizeData
193
191
  attr_reader :tag
194
192
  attr_reader :data
195
193
 
196
- def val
194
+ def to_ruby
197
195
  if data.nil?
198
196
  { tag: tag_field_name }
199
197
  else
200
198
  { tag: tag_field_name,
201
- data: data.val }
199
+ data: data.to_ruby }
202
200
  end
203
201
  end
204
202
 
@@ -3,7 +3,7 @@ require_relative './cauterize_ruby_baseclasses'
3
3
  class UInt8 < CauterizeBuiltinInteger
4
4
  def in_range(v) v >= 0 && v < 2**8 end
5
5
  def pack
6
- [val.to_i].pack("C")
6
+ [to_i].pack("C")
7
7
  end
8
8
  def self.unpackio(str)
9
9
  UInt8.new str.read(1).unpack("C")[0]
@@ -13,7 +13,7 @@ end
13
13
  class UInt16 < CauterizeBuiltinInteger
14
14
  def in_range(v) v >= 0 && v < 2**16 end
15
15
  def pack
16
- [val.to_i].pack("S")
16
+ [to_i].pack("S")
17
17
  end
18
18
  def self.unpackio(str)
19
19
  UInt16.new str.read(2).unpack("S")[0]
@@ -23,7 +23,7 @@ end
23
23
  class UInt32 < CauterizeBuiltinInteger
24
24
  def in_range(v) v >= 0 && v < 2**32 end
25
25
  def pack
26
- [val.to_i].pack("L")
26
+ [to_i].pack("L")
27
27
  end
28
28
  def self.unpackio(str)
29
29
  UInt32.new str.read(4).unpack("L")[0]
@@ -33,7 +33,7 @@ end
33
33
  class UInt64 < CauterizeBuiltinInteger
34
34
  def in_range(v) v >= 0 && v < 2**64 end
35
35
  def pack
36
- [val.to_i].pack("Q")
36
+ [to_i].pack("Q")
37
37
  end
38
38
  def self.unpackio(str)
39
39
  UInt64.new str.read(8).unpack("Q")[0]
@@ -43,7 +43,7 @@ end
43
43
  class Int8 < CauterizeBuiltinInteger
44
44
  def in_range(v) (v >= -2**7) && (v < 2**7) end
45
45
  def pack
46
- [val.to_i].pack("c")
46
+ [to_i].pack("c")
47
47
  end
48
48
  def self.unpackio(str)
49
49
  Int8.new str.read(1).unpack("c")[0]
@@ -53,7 +53,7 @@ end
53
53
  class Int16 < CauterizeBuiltinInteger
54
54
  def in_range(v) (v >= -2**15) && (v < 2**15) end
55
55
  def pack
56
- [val.to_i].pack("s")
56
+ [to_i].pack("s")
57
57
  end
58
58
  def self.unpackio(str)
59
59
  Int16.new str.read(2).unpack("s")[0]
@@ -63,7 +63,7 @@ end
63
63
  class Int32 < CauterizeBuiltinInteger
64
64
  def in_range(v) (v >= -2**31) && (v < 2**31) end
65
65
  def pack
66
- [val.to_i].pack("l")
66
+ [to_i].pack("l")
67
67
  end
68
68
  def self.unpackio(str)
69
69
  Int32.new str.read(4).unpack("l")[0]
@@ -73,7 +73,7 @@ end
73
73
  class Int64 < CauterizeBuiltinInteger
74
74
  def in_range(v) (v >= -2**63) && (v < 2**63) end
75
75
  def pack
76
- [val.to_i].pack("q")
76
+ [to_i].pack("q")
77
77
  end
78
78
  def self.unpackio(str)
79
79
  Int64.new str.read(8).unpack("q")[0]
@@ -101,7 +101,7 @@ end
101
101
  class Float32 < CauterizeBuiltinFloat
102
102
  def in_range(v) v > (-3.402823466e38) && v < (3.402823466e38) end
103
103
  def pack
104
- [val.to_f].pack("f")
104
+ [to_f].pack("f")
105
105
  end
106
106
  def self.unpackio(str)
107
107
  Float32.new str.read(4).unpack("f")[0]
@@ -111,7 +111,7 @@ end
111
111
  class Float64 < CauterizeBuiltinFloat
112
112
  def in_range(v) true end
113
113
  def pack
114
- [val.to_f].pack("d")
114
+ [to_f].pack("d")
115
115
  end
116
116
  def self.unpackio(str)
117
117
  Float64.new str.read(8).unpack("d")[0]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cauterize
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.pre11
4
+ version: 0.0.1.pre12
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -126,6 +126,9 @@ files:
126
126
  - cauterize.gemspec
127
127
  - example/Cauterize
128
128
  - example/build.sh
129
+ - example/c_example_support/empty_main.c
130
+ - example/c_example_support/example_project_config.c
131
+ - example/c_example_support/example_project_config.h
129
132
  - example/ruby_ex.rb
130
133
  - lib/cauterize.rb
131
134
  - lib/cauterize/base_type.rb
@@ -263,7 +266,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
263
266
  version: '0'
264
267
  segments:
265
268
  - 0
266
- hash: -3567501395549835058
269
+ hash: 2978929199543110981
267
270
  required_rubygems_version: !ruby/object:Gem::Requirement
268
271
  none: false
269
272
  requirements: