cauterize 0.0.1.pre1 → 0.0.1.pre5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. data/.gitignore +5 -0
  2. data/.rspec +1 -1
  3. data/Gemfile +1 -1
  4. data/README.md +0 -2
  5. data/Rakefile +19 -3
  6. data/bin/cauterize +14 -6
  7. data/example/Cauterize +22 -10
  8. data/example/build.sh +15 -2
  9. data/lib/cauterize/base_type.rb +2 -5
  10. data/lib/cauterize/builders.rb +1 -3
  11. data/lib/cauterize/builders/c/buildable.rb +3 -2
  12. data/lib/cauterize/builders/c/builtin.rb +46 -0
  13. data/lib/cauterize/builders/c/enumeration.rb +23 -2
  14. data/lib/cauterize/builders/c/fixed_array.rb +16 -7
  15. data/lib/cauterize/builders/c/group.rb +32 -3
  16. data/lib/cauterize/builders/c/scalar.rb +5 -0
  17. data/lib/cauterize/builders/c/variable_array.rb +1 -1
  18. data/lib/cauterize/builders/cs/buildable.rb +59 -0
  19. data/lib/cauterize/builders/cs/builtin.rb +23 -0
  20. data/lib/cauterize/builders/cs/composite.rb +21 -0
  21. data/lib/cauterize/builders/cs/csarray.rb +32 -0
  22. data/lib/cauterize/builders/cs/enumeration.rb +21 -0
  23. data/lib/cauterize/builders/cs/fixed_array.rb +25 -0
  24. data/lib/cauterize/builders/cs/group.rb +33 -0
  25. data/lib/cauterize/builders/cs/scalar.rb +10 -0
  26. data/lib/cauterize/builders/cs/variable_array.rb +34 -0
  27. data/lib/cauterize/builtin.rb +52 -0
  28. data/lib/cauterize/c_builder.rb +15 -1
  29. data/lib/cauterize/cauterize.rb +44 -13
  30. data/lib/cauterize/composite.rb +3 -3
  31. data/lib/cauterize/cs_builder.rb +53 -0
  32. data/lib/cauterize/enumeration.rb +20 -3
  33. data/lib/cauterize/fixed_array.rb +3 -3
  34. data/lib/cauterize/formatter.rb +7 -3
  35. data/lib/cauterize/group.rb +5 -8
  36. data/lib/cauterize/scalar.rb +16 -7
  37. data/lib/cauterize/variable_array.rb +6 -6
  38. data/lib/cauterize/version.rb +1 -1
  39. data/spec/base_type_spec.rb +133 -125
  40. data/spec/builders/c/buildable_spec.rb +18 -18
  41. data/spec/builders/c/builtin_spec.rb +22 -0
  42. data/spec/builders/c/composite_spec.rb +37 -33
  43. data/spec/builders/c/enumeration_spec.rb +84 -21
  44. data/spec/builders/c/fixed_array_spec.rb +6 -6
  45. data/spec/builders/c/group_spec.rb +97 -90
  46. data/spec/builders/c/scalar_spec.rb +24 -6
  47. data/spec/builders/c/variable_array_spec.rb +37 -37
  48. data/spec/builders/cs/buildable_spec.rb +8 -0
  49. data/spec/builders/cs/composite_spec.rb +32 -0
  50. data/spec/builders/cs/enumeration_spec.rb +33 -0
  51. data/spec/builders/cs/fixed_array_spec.rb +40 -0
  52. data/spec/builders/cs/group_spec.rb +56 -0
  53. data/spec/builders/cs/scalar_spec.rb +7 -0
  54. data/spec/builders/cs/variable_array_spec.rb +46 -0
  55. data/spec/builders_spec.rb +38 -38
  56. data/spec/builtin_spec.rb +46 -0
  57. data/spec/c_builder_spec.rb +116 -102
  58. data/spec/cauterize_spec.rb +8 -1
  59. data/spec/composite_spec.rb +52 -48
  60. data/spec/cs_builder_spec.rb +113 -0
  61. data/spec/enumeration_spec.rb +55 -16
  62. data/spec/fixed_array_spec.rb +7 -9
  63. data/spec/group_spec.rb +81 -76
  64. data/spec/scalar_spec.rb +20 -10
  65. data/spec/spec_helper.rb +103 -94
  66. data/spec/support/shared_examples_for_c_buildables.rb +68 -64
  67. data/spec/variable_array_spec.rb +12 -17
  68. data/{c → support/c}/src/cauterize.c +8 -7
  69. data/support/c/src/cauterize.h +59 -0
  70. data/{c → support/c}/src/cauterize_debug.h +0 -0
  71. data/support/c/src/cauterize_util.h +49 -0
  72. data/{c → support/c}/test/greatest.h +0 -0
  73. data/{c → support/c}/test/test.c +0 -0
  74. data/support/cs/src/CauterizeCompositeFormatter.cs +34 -0
  75. data/support/cs/src/CauterizeContainerFormatter.cs +18 -0
  76. data/support/cs/src/CauterizeEnumFormatter.cs +67 -0
  77. data/support/cs/src/CauterizeException.cs +15 -0
  78. data/support/cs/src/CauterizeFixedArrayFormatter.cs +39 -0
  79. data/support/cs/src/CauterizeFormatter.cs +40 -0
  80. data/support/cs/src/CauterizeGroupFormatter.cs +46 -0
  81. data/support/cs/src/CauterizePrimitiveFormatter.cs +33 -0
  82. data/support/cs/src/CauterizeTypeFormatterFactory.cs +39 -0
  83. data/support/cs/src/CauterizeTypes.cs +107 -0
  84. data/support/cs/src/CauterizeVariableArrayFormatter.cs +49 -0
  85. data/support/cs/src/ICauterizeTypeFormatter.cs +12 -0
  86. data/support/cs/src/OrderAttribute.cs +50 -0
  87. data/support/cs/src/PrimitiveSupport.cs +134 -0
  88. data/support/cs/src/SerializedRepresentationAttribute.cs +24 -0
  89. data/support/cs/test/CauterizeCompositeFormatterTest.cs +59 -0
  90. data/support/cs/test/CauterizeEnumFormatterTest.cs +110 -0
  91. data/support/cs/test/CauterizeFixedArrayFormatterTest.cs +91 -0
  92. data/support/cs/test/CauterizeFormatterTest.cs +40 -0
  93. data/support/cs/test/CauterizeGroupFormatterTest.cs +147 -0
  94. data/support/cs/test/CauterizeIntegrationTest.cs +129 -0
  95. data/support/cs/test/CauterizePrimitiveFormatterTest.cs +98 -0
  96. data/support/cs/test/CauterizeTypeFormatterFactoryTest.cs +73 -0
  97. data/support/cs/test/CauterizeVariableArrayFormatterTest.cs +130 -0
  98. data/support/cs/test/OrderAttributeTest.cs +39 -0
  99. data/support/cs/test/SerializedRepresentationAttributeTest.cs +39 -0
  100. metadata +68 -10
  101. data/c/src/cauterize.h +0 -46
  102. data/c/src/cauterize_util.h +0 -7
data/.gitignore CHANGED
@@ -22,3 +22,8 @@ pkg
22
22
 
23
23
  # Examples
24
24
  example/cauterize_output
25
+ example/c_cauterize_output
26
+ example/cs_cauterize_output
27
+
28
+ # Nunit test results
29
+ TestResult.xml
data/.rspec CHANGED
@@ -1 +1 @@
1
- -r spec_helper --color
1
+ -r spec_helper
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org'
1
+ source 'http://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in cauterize.gemspec
4
4
  gemspec
data/README.md CHANGED
@@ -1,5 +1,3 @@
1
- # *THIS PROJECT IS EXPERIMENTAL. IT MAY BREAK AND RUIN EVERYTHING YOU KNOW AND LOVE.*
2
-
3
1
  # cauterize
4
2
 
5
3
  A Ruby DSL for generating marshalable structured data easily compatable with
data/Rakefile CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'tmpdir'
2
+ require 'fileutils'
2
3
  require 'bundler/gem_tasks'
3
4
  require 'rspec/core/rake_task'
4
5
 
@@ -13,20 +14,35 @@ task :greatest do
13
14
  test_suite_path = File.join(d, "test_suite.c")
14
15
  mk_test_suite_file(test_suite_path)
15
16
 
16
- args = "-Wall -Wextra -Werror -Ic/test -Ic/src -I#{d}"
17
- srcs = "c/src/cauterize.c c/test/test.c"
17
+ args = "-Wall -Wextra -Werror -Isupport/c/test -Isupport/c/src -I#{d}"
18
+ srcs = "support/c/src/cauterize.c support/c/test/test.c"
18
19
  bin = File.join(d, "test.bin")
19
20
  sh "gcc #{args} #{srcs} -o #{bin}"
20
21
  sh bin
21
22
  end
22
23
  end
23
24
 
25
+ desc "Run C# tests"
26
+ task :nunit do
27
+ cd "support/cs" do
28
+ FileUtils.mkdir_p "lib"
29
+ sh "dmcs -target:library -out:lib/Cauterize.dll src/*.cs"
30
+ references = "-r:lib/nunit.framework.dll -r:lib/Moq.dll -r:lib/Cauterize.dll"
31
+ sh "dmcs -target:library #{references} -out:lib/Cauterize.Test.dll test/*.cs"
32
+ sh "#{nunit} lib/*.dll"
33
+ end
34
+ end
35
+
36
+ def nunit
37
+ "nunit-console4"
38
+ end
39
+
24
40
  # Support Methods
25
41
 
26
42
  SUITE_ENTRY_TEMPLATE = " RUN_TEST(%s);"
27
43
 
28
44
  def mk_test_suite_file(path)
29
- test_files = Dir["c/test/*.c"]
45
+ test_files = Dir["support/c/test/*.c"]
30
46
  suite_text = test_files.map do |test_file|
31
47
  File.read(test_file).lines.map do |l|
32
48
  m = l.match(/^TEST (?<sym>[^\(]+)\(\)/)
data/bin/cauterize CHANGED
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  LIB_PATH = File.dirname(__FILE__) + "/../lib"
4
- C_PATH = File.dirname(__FILE__) + "/../c/src"
5
4
 
6
5
  $LOAD_PATH.unshift LIB_PATH
7
6
 
@@ -20,8 +19,6 @@ class CauterizeCmdline < Thor
20
19
  :desc => "Bravely overwrite files in non-empty directories",
21
20
  :default => false
22
21
  def generate(language, target_dir, desc_file = nil)
23
- raise CmdLineException.new("Language '#{language}' is not supported.") unless language == 'c'
24
-
25
22
  if not options[:force] and Dir.exist?(target_dir) and Dir[target_dir + "/*"].size > 0
26
23
  raise CmdLineException.new("Directory '#{target_dir}' isn't empty. Cowardly quitting.")
27
24
  end
@@ -32,16 +29,27 @@ class CauterizeCmdline < Thor
32
29
  raise CmdLineException.new("The description file #{desc_file} does not exist.")
33
30
  end
34
31
 
35
- # Generate the C files.
36
- Cauterize.generate_c(target_dir, desc_file)
32
+ language = language.downcase
33
+ if %w(c cs).include? language
34
+ Cauterize.generate language, target_dir, desc_file
35
+ else
36
+ raise CmdLineException.new("Language '#{language}' is not supported.")
37
+ end
37
38
 
38
39
  # Copy the cauterize support files.
39
40
  unless options[:omit_support]
40
- Dir[C_PATH + "/*"].each do |path|
41
+ support_path = File.join(File.dirname(__FILE__),"../support/#{language}/src")
42
+ Dir["#{support_path}/*"].each do |path|
41
43
  FileUtils.cp(path, target_dir)
42
44
  end
43
45
  end
44
46
  end
47
+
48
+ desc "version",
49
+ "Prints the cauterize version to the screen."
50
+ def version
51
+ puts "cauterize-" + Cauterize::VERSION
52
+ end
45
53
  end
46
54
 
47
55
  begin
data/example/Cauterize CHANGED
@@ -1,13 +1,8 @@
1
1
  set_name("example_project")
2
+ set_version("1.2.3")
2
3
 
3
- scalar(:int8_t)
4
- scalar(:int16_t)
5
- scalar(:int32_t)
6
- scalar(:int64_t)
7
- scalar(:uint8_t)
8
- scalar(:uint16_t)
9
- scalar(:uint32_t)
10
- scalar(:uint64_t)
4
+ scalar(:bigint) { |t| t.type_name(:int32) }
5
+ scalar(:usmallint) { |t| t.type_name(:uint8) }
11
6
 
12
7
  enumeration(:color) do |e|
13
8
  e.value :red
@@ -15,14 +10,29 @@ enumeration(:color) do |e|
15
10
  e.value :green
16
11
  end
17
12
 
13
+ enumeration(:large_value) do |e|
14
+ e.value :negative, -500
15
+ e.value :positive, 500
16
+ end
17
+
18
+ composite(:weirdness) do |c|
19
+ c.field :val, :large_value
20
+ c.field :num, :int8
21
+ end
22
+
18
23
  fixed_array(:color_list) do |a|
19
24
  a.array_type :color
20
25
  a.array_size 4
21
26
  end
22
27
 
28
+ fixed_array(:color_list_list) do |a|
29
+ a.array_type :color_list
30
+ a.array_size 4
31
+ end
32
+
23
33
  variable_array(:numbers) do |a|
24
- a.size_type :uint8_t
25
- a.array_type :int32_t
34
+ a.size_type :usmallint
35
+ a.array_type :bigint
26
36
  a.array_size 128
27
37
  end
28
38
 
@@ -41,4 +51,6 @@ end
41
51
  group(:insanity) do |g|
42
52
  g.field :nonsensical, :nonsensical
43
53
  g.field :crazy, :crazy
54
+ g.field :any_empty_entry
55
+ g.field :another_empty
44
56
  end
data/example/build.sh CHANGED
@@ -1,4 +1,17 @@
1
1
  #!/bin/sh
2
2
 
3
- rm -rf cauterize_output
4
- ../bin/cauterize generate c cauterize_output
3
+ rm -rf c_cauterize_output
4
+ ../bin/cauterize generate c c_cauterize_output
5
+
6
+ CFLAGS="-Wall -Werror -Wextra"
7
+ INCLUDES="-Ic_cauterize_output"
8
+
9
+
10
+ gcc $CFLAGS $INCLUDES c_cauterize_output/cauterize.c -c -o c_cauterize_output/cauterize.o
11
+ gcc $CFLAGS $INCLUDES c_cauterize_output/example_project.c -c -o c_cauterize_output/example_project.o
12
+
13
+ rm -rf cs_cauterize_output
14
+ ../bin/cauterize generate cs cs_cauterize_output
15
+
16
+ dmcs cs_cauterize_output/*.cs -target:library -out:cs_cauterize_output/example_project.dll
17
+
@@ -5,13 +5,10 @@ module Cauterize
5
5
  attr_reader :name, :id
6
6
  @@next_id = {}
7
7
  @@instances = {}
8
- @@used_names = Set.new
9
8
 
10
9
  def initialize(name)
11
- if @@used_names.include?(name)
12
- raise Exception.new("A type with the name #{name} already exists.")
13
- else
14
- @@used_names << name
10
+ if @@instances.keys.include?(name)
11
+ raise Exception.new("A type with the name #{name} already exists. [#{@@instances[name].inspect}]")
15
12
  end
16
13
 
17
14
  @name = name
@@ -17,10 +17,8 @@ module Cauterize
17
17
  end
18
18
 
19
19
  def get(language, description_instance)
20
- if @builders and @builders[language]
20
+ if @builders and @builders[language] and @builders[language][description_instance.class]
21
21
  @builders[language][description_instance.class].new(description_instance)
22
- else
23
- raise UnregisteredException.new("The builder for #{description_instance.class} in #{language} is unregistered.")
24
22
  end
25
23
  end
26
24
  end
@@ -38,18 +38,19 @@ module Cauterize
38
38
 
39
39
  # Methods that are pretty much the same for everyone.
40
40
  def packer_sym; "Pack_#{@blueprint.name}" end
41
- def packer_sig; "CAUTERIZE_STATUS_T #{packer_sym}(struct Cauterize * dst, #{render} * src)" end
41
+ def packer_sig; "CALLCONV CAUTERIZE_STATUS_T DLLDECL #{packer_sym}(struct Cauterize * dst, #{render} * src)" end
42
42
  def packer_proto(formatter)
43
43
  formatter << packer_sig + ";"
44
44
  end
45
45
 
46
46
  def unpacker_sym; "Unpack_#{@blueprint.name}" end
47
- def unpacker_sig; "CAUTERIZE_STATUS_T #{unpacker_sym}(struct Cauterize * src, #{render} * dst)" end
47
+ def unpacker_sig; "CALLCONV CAUTERIZE_STATUS_T DLLDECL #{unpacker_sym}(struct Cauterize * src, #{render} * dst)" end
48
48
  def unpacker_proto(formatter)
49
49
  formatter << unpacker_sig + ";"
50
50
  end
51
51
 
52
52
  # These are only different in a few type varieties.
53
+ def typedef_decl(formatter); nil end
53
54
  def struct_proto(formatter); nil end
54
55
  def struct_defn(formatter); nil end
55
56
  def enum_defn(formatter); nil end
@@ -0,0 +1,46 @@
1
+ module Cauterize
2
+ module Builders
3
+ module C
4
+ class BuiltIn < Buildable
5
+ @@C_TYPE_MAPPING = {
6
+ 1 => {signed: :int8_t, unsigned: :uint8_t},
7
+ 2 => {signed: :int16_t, unsigned: :uint16_t},
8
+ 4 => {signed: :int32_t, unsigned: :uint32_t},
9
+ 8 => {signed: :int64_t, unsigned: :uint64_t},
10
+ }
11
+
12
+ def render
13
+ render_ctype
14
+ end
15
+
16
+ def declare(formatter, sym)
17
+ formatter << "#{render} #{sym};"
18
+ end
19
+
20
+ # These are identical to the Scalar definitions. For now.
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
26
+ end
27
+
28
+ def unpacker_defn(formatter)
29
+ formatter << unpacker_sig
30
+ formatter.braces do
31
+ formatter << "return CauterizeRead(src, (uint8_t*)dst, sizeof(*dst));"
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def render_ctype
38
+ s_key = @blueprint.is_signed ? :signed : :unsigned
39
+ @@C_TYPE_MAPPING[@blueprint.byte_length][s_key]
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ Cauterize::Builders.register(:c, Cauterize::BuiltIn, Cauterize::Builders::C::BuiltIn)
@@ -11,16 +11,37 @@ module Cauterize
11
11
  end
12
12
 
13
13
  def packer_defn(formatter)
14
+ rep_builder = Builders.get(:c, @blueprint.representation)
15
+
14
16
  formatter << packer_sig
15
17
  formatter.braces do
16
- formatter << "return CauterizeAppend(dst, (uint8_t*)src, sizeof(*src));"
18
+ rep = "enum_representation"
19
+ rep_builder.declare(formatter, rep)
20
+
21
+ formatter << "#{rep} = (#{rep_builder.render})(*src);"
22
+ formatter << "return #{rep_builder.packer_sym}(dst, &#{rep});"
17
23
  end
18
24
  end
19
25
 
20
26
  def unpacker_defn(formatter)
27
+ rep_builder = Builders.get(:c, @blueprint.representation)
28
+
21
29
  formatter << unpacker_sig
22
30
  formatter.braces do
23
- formatter << "return CauterizeRead(src, (uint8_t*)dst, sizeof(*dst));"
31
+ rep = "enum_representation"
32
+ rep_builder.declare(formatter, rep)
33
+
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
39
+
40
+ formatter << "else"
41
+ formatter.braces do
42
+ formatter << "*dst = (#{render})#{rep};"
43
+ formatter << "return CA_OK;"
44
+ end
24
45
  end
25
46
  end
26
47
 
@@ -3,14 +3,11 @@ module Cauterize
3
3
  module C
4
4
  class FixedArray < Buildable
5
5
  def render
6
- # HEY! PAY ATTENTION!
7
- # Keep in mind that there's no sane way to "render" an array in C
8
- # that doesn't involve an identifier.
9
- ty_bldr.render
6
+ "struct #{@blueprint.name}"
10
7
  end
11
8
 
12
9
  def declare(formatter, sym)
13
- formatter << "#{ty_bldr.render} #{sym}[#{@blueprint.array_size}]; /* #{@blueprint.name} */"
10
+ formatter << "#{render} #{sym};"
14
11
  end
15
12
 
16
13
  def packer_defn(formatter)
@@ -23,7 +20,7 @@ module Cauterize
23
20
  # store each used item in the array
24
21
  formatter << "for (i = 0; i < #{@blueprint.array_size}; i++)"
25
22
  formatter.braces do
26
- formatter << "if (CA_OK != (err = #{ty_bldr.packer_sym}(dst, &src[i]))) { return err; }"
23
+ formatter << "if (CA_OK != (err = #{ty_bldr.packer_sym}(dst, &src->data[i]))) { return err; }"
27
24
  end
28
25
  formatter.blank_line
29
26
 
@@ -41,7 +38,7 @@ module Cauterize
41
38
  # store each used item in the array
42
39
  formatter << "for (i = 0; i < #{@blueprint.array_size}; i++)"
43
40
  formatter.braces do
44
- formatter << "if (CA_OK != (err = #{ty_bldr.unpacker_sym}(src, &dst[i]))) { return err; }"
41
+ formatter << "if (CA_OK != (err = #{ty_bldr.unpacker_sym}(src, &dst->data[i]))) { return err; }"
45
42
  end
46
43
  formatter.blank_line
47
44
 
@@ -49,6 +46,18 @@ module Cauterize
49
46
  end
50
47
  end
51
48
 
49
+ def struct_proto(formatter)
50
+ formatter << (render + ";")
51
+ end
52
+
53
+ def struct_defn(formatter)
54
+ formatter << render
55
+ formatter.braces do
56
+ formatter << "#{ty_bldr.render} data[#{@blueprint.array_size}];"
57
+ end
58
+ formatter.append(";")
59
+ end
60
+
52
61
  private
53
62
 
54
63
  def ty_bldr
@@ -27,13 +27,15 @@ module Cauterize
27
27
  # pack the fields
28
28
  formatter << "switch (src->tag)"
29
29
  formatter.braces do
30
- @blueprint.fields.values.each do |field|
30
+ having_data.each do |field|
31
31
  bldr = Builders.get(:c, field.type)
32
32
  formatter.backdent "case #{@blueprint.enum_sym(field.name)}:"
33
33
  formatter << "if (CA_OK != (err = #{bldr.packer_sym}(dst, &src->data.#{field.name}))) { return err; }"
34
34
  formatter << "break;"
35
35
  end
36
36
 
37
+ format_no_data_stubs(formatter)
38
+
37
39
  formatter.backdent "default:"
38
40
  formatter << "return CA_ERR_INVALUD_TYPE_TAG;"
39
41
  formatter << "break;"
@@ -54,13 +56,15 @@ module Cauterize
54
56
  # pack the fields
55
57
  formatter << "switch (dst->tag)"
56
58
  formatter.braces do
57
- @blueprint.fields.values.each do |field|
59
+ having_data.each do |field|
58
60
  bldr = Builders.get(:c, field.type)
59
61
  formatter.backdent "case #{@blueprint.enum_sym(field.name)}:"
60
62
  formatter << "if (CA_OK != (err = #{bldr.unpacker_sym}(src, &dst->data.#{field.name}))) { return err; }"
61
63
  formatter << "break;"
62
64
  end
63
65
 
66
+ format_no_data_stubs(formatter)
67
+
64
68
  formatter.backdent "default:"
65
69
  formatter << "return CA_ERR_INVALUD_TYPE_TAG;"
66
70
  formatter << "break;"
@@ -80,13 +84,38 @@ module Cauterize
80
84
  formatter << "union"
81
85
  formatter.braces do
82
86
  @blueprint.fields.values.each do |field|
83
- Builders.get(:c, field.type).declare(formatter, field.name)
87
+ b = Builders.get(:c, field.type)
88
+ if b
89
+ b.declare(formatter, field.name)
90
+ else
91
+ formatter << "/* No data associated with '#{field.name}'. */"
92
+ end
84
93
  end
85
94
  end
86
95
  formatter.append(" data;")
87
96
  end
88
97
  formatter.append(";")
89
98
  end
99
+
100
+ private
101
+
102
+ def having_data
103
+ @blueprint.fields.values.reject {|v| v.type.nil?}
104
+ end
105
+
106
+ def no_data
107
+ @blueprint.fields.values.reject {|v| not v.type.nil?}
108
+ end
109
+
110
+ def format_no_data_stubs(formatter)
111
+ if 0 < no_data.length
112
+ formatter.backdent "/* No data associated with the remaining tags. */"
113
+ no_data.each do |field|
114
+ formatter.backdent "case #{@blueprint.enum_sym(field.name)}:"
115
+ end
116
+ formatter << "break;"
117
+ end
118
+ end
90
119
  end
91
120
  end
92
121
  end