annotate sciprts/dstepgen.rb @ 0:c7db221de6e8

First upload of dgen.rb and dstepgen.rb
author Jacob Carlborg <doob@me.com>
date Sat, 31 Jan 2009 17:22:44 +0100
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1 #!/usr/bin/env ruby
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
2
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
3 # Copyright (c) 2008-2009, Jacob Carlborg. All rights reserved.
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
4 # Copyright (c) 2006-2007, Apple Inc. All rights reserved.
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
5 # Copyright (c) 2005-2006 FUJIMOTO Hisakuni
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
6 #
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
7 # Redistribution and use in source and binary forms, with or without
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
8 # modification, are permitted provided that the following conditions
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
9 # are met:
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
10 # 1. Redistributions of source code must retain the above copyright
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
11 # notice, this list of conditions and the following disclaimer.
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
12 # 2. Redistributions in binary form must reproduce the above copyright
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
13 # notice, this list of conditions and the following disclaimer in the
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
14 # documentation and/or other materials provided with the distribution.
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
15 # 3. Neither the name of Apple Inc. ("Apple") nor the names of
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
16 # its contributors may be used to endorse or promote products derived
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
17 # from this software without specific prior written permission.
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
18 #
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
19 # THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
20 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
21 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
22 # ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
23 # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
24 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
25 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
26 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
27 # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
28 # IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
29 # POSSIBILITY OF SUCH DAMAGE.
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
30
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
31 require "rubygems"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
32 gem "builder", "~> 2.0"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
33 require "builder"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
34 require "tmpdir"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
35 require "optparse"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
36 include Builder
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
37
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
38 $KCODE = "UTF8"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
39
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
40 # Extensions that adds support for member access syntax
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
41 class Hash
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
42 def type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
43 result = self["type"]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
44 return result unless result.nil?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
45 self[:type]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
46 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
47
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
48 def type= (type)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
49 self[:type] = type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
50 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
51
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
52 def id
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
53 result = self["id"]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
54 return result unless result.nil?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
55 self[:id]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
56 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
57
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
58 def id= (id)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
59 self[:id] = id
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
60 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
61
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
62 def methods
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
63 result = self["methods"]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
64 return result unless result.nil?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
65 self[:methods]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
66 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
67
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
68 def methods= (methods)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
69 self[:methods] = methods
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
70 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
71
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
72 def method_missing (method, *args)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
73 self.class.instance_eval do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
74 define_method(method) do |*args|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
75 if args.length > 0
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
76 self[method[0 ... -1]] = args[0]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
77 self[eval(":#{method}"[0 ... -1])] = args[0]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
78 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
79 result = self[method]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
80 return result unless result.nil?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
81 self[eval(":#{method}")]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
82 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
83 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
84 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
85
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
86 if (method = method.id2name) =~ /=/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
87 eval("self.#{method} (args.length < 2 ? args[0] : args)")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
88 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
89 eval("self.#{method}")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
90 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
91 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
92 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
93
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
94 # This Struct represents an Objective-C Framework
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
95 Framework = Struct.new(:name, :headers) do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
96 def initialize
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
97 self.headers = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
98 self.name = ""
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
99 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
100 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
101
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
102 # This Struct represents a C/Objective-C header
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
103 HeaderFile = Struct.new(:name, :framework, :cftypes, :constants, :defines, :enums, :externs, :functions,
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
104 :imports, :inline_functions, :opaques, :path, :structs, :typedefs) do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
105 def initialize
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
106 self.name = ""
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
107 self.cftypes = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
108 self.constants = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
109 self.defines = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
110 self.enums = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
111 self.externs = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
112 self.framework = ""
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
113 self.functions = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
114 self.imports = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
115 self.inline_functions = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
116 self.opaques = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
117 self.path = ""
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
118 self.structs = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
119 self.typedefs = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
120 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
121 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
122
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
123 # This class scans the headers
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
124 class HeaderScaner
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
125 CPP = ['/usr/bin/cpp-4.0', '/usr/bin/cpp-3.3', '/usr/bin/cpp3'].find { |x| File.exist?(x) }
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
126 raise "cpp not found" if CPP.nil?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
127 CPPFLAGS = "-D__APPLE_CPP__ -include /usr/include/AvailabilityMacros.h"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
128 CPPFLAGS << "-D__GNUC__" unless /\Acpp-4/.match(File.basename(CPP))
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
129
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
130 attr_accessor :frameworks, :headers, :do_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
131
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
132 def initialize
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
133 @extern_name = 'extern'
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
134 @frameworks = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
135 @file_content = nil
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
136 @headers = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
137 @classes = {}
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
138 @informal_protocols = {}
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
139 @function_pointer_types = {}
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
140 @do_64bit = false
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
141 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
142
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
143 def classes
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
144 @classes
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
145 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
146
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
147 def protocols
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
148 @informal_protocols
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
149 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
150
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
151 def cftypes (header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
152 re = /typedef\s+(const\s+)?(struct\s*\w+\s*\*\s*)([^\s]+Ref)\s*;/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
153 @cpp_result.scan(re).each do |m|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
154 header.cftypes << { :name => m[2], :type => m[1], :const => m[0] =~ /const/ ? true : false}
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
155 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
156 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
157
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
158 def constants (header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
159 tmp = header.externs.map do |i|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
160 constant?(i, true)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
161 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
162
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
163 header.constants = tmp.flatten.compact
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
164 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
165
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
166 def defines (header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
167 re = /#define\s+([^\s]+)\s+(\([^)]+\)|[^\s]+)\s*$/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
168 @file_content.scan(re).each do |m|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
169 next unless !m[0].include?('(') && m[1] != '\\'
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
170 header.defines << { :name => m[0], :value => m[1] }
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
171 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
172 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
173
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
174 def enums (header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
175 re = /\benum\b\s*(\w+\s+)?\{([^}]*)\}/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
176 @cpp_result.scan(re).each do |m|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
177 enum = { :name => m[0], :members => [] }
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
178
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
179 m[1].split(",").map do |i|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
180 name, value = i.split("=", 2).map do |x|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
181 x.strip
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
182 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
183
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
184 enum[:members] << { :name => name, :value => value } unless name.empty? || name[0] == ?#
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
185 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
186
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
187 header.enums << enum
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
188 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
189 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
190
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
191 def function_pointer_types (header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
192 re = /typedef\s+([\w\s]+)\s*\(\s*\*\s*(\w+)\s*\)\s*\(([^)]*)\)\s*;/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
193 data = @cpp_result.scan(re)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
194 re = /typedef\s+([\w\s]+)\s*\(([^)]+)\)\s*;/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
195 data |= @cpp_result.scan(re).map do |m|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
196 ary = m[0].split(/(\w+)$/)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
197 ary[1] << " *"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
198 ary << m[1]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
199 ary
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
200 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
201
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
202 data.each do |m|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
203 name = m[1]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
204 args = m[2].split(",").map do |x|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
205 if x.include?(" ")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
206 ptr = x.sub!(/\[\]\s*$/, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
207 x = x.sub(/\w+\s*$/, "").strip
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
208 ptr ? x + "*" : x
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
209 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
210 x.strip
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
211 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
212 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
213
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
214 type = "#{m[0]}(*)(#{args.join(', ')})"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
215 @function_pointer_types[name] = type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
216 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
217 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
218
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
219 def typedefs (header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
220 re = /^\s*typedef\s+(.+)\s+([\w\*]+)\s*;$/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
221 data = @cpp_result
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
222 data.scan(re).each do |m|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
223 var = get_var_info(m[0] + " " + m[1])
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
224 header.typedefs << get_var_info(m[0] + " " + m[1]) if var
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
225 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
226 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
227
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
228 def externs (header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
229 re = /^\s*#{@extern_name}\s+\b(.*)\s*;.*$/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
230 header.externs = @cpp_result.scan(re).map do |m|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
231 m[0].strip
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
232 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
233 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
234
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
235 def imports (header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
236 tmp = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
237
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
238 @file_content.each do |line|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
239 if line =~ /#(include|import) <(.+)\.h>/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
240 next if $2 == header.name
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
241 tmp << $2
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
242 elsif line =~ /@class(\s+)(\w+)(,|;)/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
243 next if $2 == header.name
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
244
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
245 if $3 == ";"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
246 tmp << header.framework + "/" + $2 unless header.framework == ""
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
247 tmp << $2 if header.framework == ""
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
248 elsif
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
249 str = line[6 + $1.length ... -2]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
250 str.gsub!(" ", "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
251 arr = str.split(",")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
252
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
253 arr.each do |s|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
254 tmp << header.framework + "/" + s unless header.framework == ""
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
255 tmp << s if header.framework == ""
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
256 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
257 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
258 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
259 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
260
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
261 header.imports = tmp.compact.uniq
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
262 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
263
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
264 def informal_protocols (header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
265 self.methods(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
266 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
267
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
268 def methods (header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
269 interface_re = /^@(interface|protocol)\s+(\w+)\s*:?\s*(\w*)\s*(\([^)]+\))?/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
270
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
271 end_re = /^@end/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
272 body_re = /^[-+]\s*(\([^)]+\))?\s*([^:\s;]+)/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
273 args_re = /\w+\s*:/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
274 prop_re = /^@property\s*(\([^)]+\))?\s*([^;]+);$/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
275 current_interface = current_category = nil
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
276 i = 0
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
277 parent = nil
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
278
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
279 @cpp_result.each_line do |line|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
280 size = line.size
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
281 line.strip!
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
282
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
283 if md = interface_re.match(line)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
284 parent = nil
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
285 current_interface = md[1] == "protocol" ? "NSObject" : md[2]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
286 current_category = md[4].delete("()").strip if md[4]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
287 parent = md[3] unless md[3] == ""
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
288
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
289 elsif end_re.match(line)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
290 current_interface = current_category = nil
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
291
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
292 elsif current_interface && md = prop_re.match(line)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
293 # Parsing Objective-C 2.0 properties
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
294 if (a = md[2].split(/\s/)).length >= 2 && /^\w+$/.match(name = a[-1]) && (type = a[0 .. -2].join(" ")).index(",").nil?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
295 getter, setter = name, "set#{name[0].chr.upcase + name[1 .. -1]}"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
296 readonly = false
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
297
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
298 if attributes = md[1]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
299 if md = /getter\s*=\s*(\w+)/.match(attributes)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
300 getter = md[1]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
301 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
302
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
303 if md = /setter\s*=\s*(\w+)/.match(attributes)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
304 setter = md[1]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
305 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
306
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
307 readonly = true if attributes.index("readonly")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
308 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
309
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
310 typeinfo = VarInfo.new(type, "", "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
311
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
312 @classes[current_interface] ||= {}
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
313 methods = (@classes[current_interface].methods ||= [])
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
314 methods << MethodInfo.new(typeinfo, getter, false, [], line)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
315
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
316 unless readonly
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
317 methods << MethodInfo.new(VarInfo.new("void", "", ""), setter + ":", false, [typeinfo], line)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
318 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
319 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
320
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
321 elsif current_interface && (line[0] == ?+ || line[0] == ?-)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
322 mtype = line[0]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
323 data = @cpp_result[i .. -1]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
324 body_md = body_re.match(data)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
325
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
326 next if body_md.nil?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
327
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
328 rettype = body_md[1] ? body_md[1].delete("()") : "id"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
329 retval = VarInfo.new(rettype, "", "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
330 args = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
331 selector = ""
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
332 data = data[0 .. data.index(";")]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
333 args_data = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
334
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
335 data.scan(args_re) do |x|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
336 args_data << [$`, x, $']
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
337 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
338
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
339 variadic = false
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
340 args_data.each_with_index do |ary, n|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
341 before, argname, argtype = ary
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
342 arg_nameless = (n > 0 && /\)\s*$/.match(before))
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
343 argname = ":" if arg_nameless
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
344 realargname = nil
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
345
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
346 if n < args_data.length - 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
347 argtype.sub!(args_data[n + 1][2], "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
348
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
349 if arg_nameless
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
350 argtype.sub!(/(\w+\s*)?\w+\s*:\s*$/, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
351 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
352 unless argtype.sub!(/(\w+)\s+\w+:\s*$/) { |s| realargname = $1; "" }
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
353 # maybe the next argument is nameless
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
354 argtype.sub!(/\w+\s*:\s*$/, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
355 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
356 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
357 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
358 argtype.sub!(/\s+__attribute__\(\(.+\)\)/, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
359
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
360 if arg_nameless
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
361 argtype.sub!(/\w+\s*;$/, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
362 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
363 unless argtype.sub!(/(\w+)\s*;$/) { |s| realargname = $1; "" }
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
364 variadic = argtype.sub!(/,\s*\.\.\.\s*;/, "") != nil
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
365 argtype.sub!(/\w+\s*$/, "") if variadic
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
366 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
367 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
368 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
369
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
370 selector << argname
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
371 realargname ||= argname.sub(/:/, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
372 args << VarInfo.new(argtype, realargname, "") unless argtype.empty?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
373 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
374
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
375 selector = body_md[2] if selector.empty?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
376 args << VarInfo.new("...", "vararg", "") if variadic
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
377 method = MethodInfo.new(retval, selector, line[0] == ?+, args, data)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
378
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
379 if current_category && current_interface == "NSObject"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
380 (@informal_protocols[current_category] ||= []) << method
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
381 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
382
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
383 @classes[current_interface] ||= {}
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
384
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
385 if header.name == current_interface
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
386 @classes[current_interface].file = header.name
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
387 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
388 @classes[current_interface].file ||= header.name
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
389 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
390
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
391 unless parent == current_interface || parent =~ /\s+/ || parent.nil?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
392 @classes[current_interface].parent = parent
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
393 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
394
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
395 (@classes[current_interface].methods ||= []) << method
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
396 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
397 i += size
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
398 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
399 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
400
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
401 def structs (header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
402 re = /typedef\s+struct\s*\w*\s*((\w+)|\{([^{}]*(\{[^}]+\})?)*\}\s*([^\s]+))\s*(__attribute__\(.+\))?\s*;/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
403 i = 0
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
404 body = nil
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
405 @cpp_result.scan(re).each do |m|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
406 struct = { :name => m[4], :members => [] }
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
407
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
408 unless struct[:name].nil?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
409 if struct[:name][0, 1] == "*"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
410 struct[:name].sub!("*", "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
411 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
412 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
413
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
414 return_type = nil
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
415 stripped_return_type = nil
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
416 body = m[2]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
417
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
418 if m[2]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
419 m[2].split(/,|;/).map do |i|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
420 str, bytes = i.split(":", 2).map do |x|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
421 x.strip
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
422 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
423
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
424 var = get_var_info(str, true)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
425
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
426 if var
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
427 if var.return_type == "***dummy***"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
428 var.return_type = return_type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
429 var.stripped_return_type = stripped_return_type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
430 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
431 return_type = var.return_type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
432 stripped_return_type = var.stripped_return_type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
433 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
434
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
435 struct[:members] << { :name => var.name, :bytes => bytes, :declaredType => var.return_type, :type => "", :type64 => "" } unless str.empty? || str[0] == ?#
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
436
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
437 names = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
438
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
439 tmp = struct[:members].collect do |member|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
440 unless names.include?(member[:name])
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
441 names << member[:name]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
442 member
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
443 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
444 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
445
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
446 struct[:members] = tmp.compact
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
447 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
448 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
449 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
450
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
451 header.structs << struct if body
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
452 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
453 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
454
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
455 def functions (header, inline = false)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
456 if inline
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
457 inline_func_re = /(inline|__inline__)\s+((__attribute__\(\([^)]*\)\)\s+)?([\w\s\*<>]+)\s*\(([^)]*)\)\s*)\{/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
458 res = @cpp_result.scan(inline_func_re)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
459 res.each do |x|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
460 x.delete_at(0)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
461 x.delete_at(1)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
462 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
463 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
464 skip_inline_re = /(static)?\s(inline|__inline__)[^{;]+(;|\{([^{}]*(\{[^}]+\})?)*\})\s*/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
465 func_re = /(^([\w\s\*<>]+)\s*\(([^)]*)\)\s*)(__attribute__[^;]+)?;/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
466 res = @cpp_result.gsub(skip_inline_re, '').scan(func_re)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
467 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
468
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
469 funcs = res.map do |m|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
470 orig, base, args = m
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
471 base.sub!(/^.*extern\s/, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
472 func = constant?(base)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
473
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
474 if func
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
475 args = args.strip.split(",").map do |i|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
476 constant?(i)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
477 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
478
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
479 next if args.any? do |x|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
480 x.nil?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
481 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
482
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
483 args = [] if args.size == 1 && args[0].return_type == "void"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
484 FunctionInfo.new(func, args, orig, inline)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
485 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
486 end.compact
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
487
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
488 if inline
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
489 header.inline_functions = funcs
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
490 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
491 header.functions = funcs
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
492 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
493 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
494
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
495 def prepare (path)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
496 @file_content = File.read(path)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
497 @file_content.gsub!(%r{(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)}, "");
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
498 @complete_cpp_result, @cpp_result = do_cpp(path, false, true, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
499 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
500
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
501 def scan (frameworks, headers)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
502 @frameworks = frameworks
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
503 @headers = headers
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
504
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
505 @frameworks.each do |framework|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
506 framework.headers.each do |header|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
507 prepare(header.path)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
508
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
509 imports(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
510 cftypes(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
511 externs(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
512 constants(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
513 enums(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
514 structs(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
515 typedefs(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
516 functions(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
517 functions(header, true)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
518 defines(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
519 methods(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
520 function_pointer_types(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
521 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
522 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
523
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
524 @headers.each do |header|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
525 prepare(header.path)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
526
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
527 imports(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
528 cftypes(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
529 externs(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
530 constants(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
531 enums(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
532 structs(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
533 typedefs(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
534 functions(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
535 functions(header, true)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
536 defines(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
537 methods(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
538 function_pointer_types(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
539 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
540 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
541
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
542 def get_var_info (str, multi = false)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
543 str.strip!
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
544
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
545 return nil if str.empty?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
546
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
547 if str == "..."
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
548 VarInfo.new("...", "...", str)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
549 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
550 str = "***dummy*** " + str if str[-1].chr == '*' || str.index(/\s/).nil?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
551 tokens = multi ? str.split(',') : [str]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
552 part = tokens.first
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
553 re = /^([^()]*)\b(\w+)\b\s*(\[[^\]]*\])*$/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
554 m = re.match(part)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
555
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
556 if m
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
557 return nil if m[1].split(/\s+/).any? do |x|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
558 ['end', 'typedef'].include?(x)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
559 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
560
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
561 m = m.to_a[1..-1].compact.map do |i|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
562 i.strip
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
563 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
564
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
565 m[0] += m[2] if m.size == 3
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
566 m[0] = 'void' if m[1] == 'void'
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
567
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
568 var = begin
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
569 VarInfo.new(m[0], m[1], part)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
570 rescue
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
571 return nil
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
572 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
573
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
574 if tokens.size > 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
575 [var, *tokens[1..-1].map { |x| constant?(m[0] + x.strip.sub(/^\*+/, '')) }]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
576 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
577 var
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
578 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
579 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
580 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
581 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
582
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
583 def constant? (str, multi = false)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
584 str.strip!
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
585 return nil if str.empty?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
586
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
587 if str == '...'
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
588 VarInfo.new('...', '...', str)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
589 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
590 str << " dummy" if str[-1].chr == '*' or str.index(/\s/).nil?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
591 tokens = multi ? str.split(',') : [str]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
592 part = tokens.first
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
593 re = /^([^()]*)\b(\w+)\b\s*(\[[^\]]*\])*$/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
594 m = re.match(part)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
595
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
596 if m
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
597 return nil if m[1].split(/\s+/).any? do |x|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
598 ['end', 'typedef'].include?(x)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
599 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
600
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
601 m = m.to_a[1..-1].compact.map do |i|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
602 i.strip
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
603 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
604
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
605 m[0] += m[2] if m.size == 3
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
606 m[0] = 'void' if m[1] == 'void'
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
607
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
608 var = begin
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
609 VarInfo.new(m[0], m[1], part)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
610 rescue
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
611 return nil
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
612 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
613
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
614 if tokens.size > 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
615 [var, *tokens[1..-1].map { |x| constant?(m[0] + x.strip.sub(/^\*+/, '')) }]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
616 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
617 var
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
618 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
619 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
620 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
621 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
622
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
623 class VarInfo
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
624
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
625 attr_reader :name, :orig, :const, :type_modifier
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
626 attr_accessor :octype, :resolved_type, :resolved_type64, :return_type, :stripped_return_type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
627
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
628 def initialize (type, name, orig)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
629 @return_type = type.clone
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
630 @name = name
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
631 @orig = orig
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
632 @const = false
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
633 @type_modifier = ""
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
634
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
635 @return_type.gsub!(/\[[^\]]*\]/, "*")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
636
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
637 if @return_type =~ /\bconst\b/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
638 @const = true
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
639 @return_type.gsub!("const", "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
640 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
641
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
642 if @return_type =~ /\b(in|out|inout|oneway|bycopy|byref)\b/
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
643
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
644 case $1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
645 when "in"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
646 @type_modifier << "n"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
647 when "out"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
648 @type_modifier << "o"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
649 when "inout"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
650 @type_modifier << "N"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
651 when "oneway"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
652 @type_modifier << "w"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
653 when "bycopy"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
654 @type_modifier << "c"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
655 when "byref"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
656 @type_modifier << "r"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
657 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
658
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
659 @return_type.gsub!("#{$1}", "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
660 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
661
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
662 @return_type.gsub!(/\s?\*\s?/, "*")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
663 @return_type.gsub!(/^\(|\)$/, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
664 @return_type.strip!
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
665
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
666 t = type.gsub(/\b(__)?const\b/, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
667 t.gsub!(/<[^>]*>/, '')
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
668 t.gsub!(/\b(in|out|inout|oneway|const)\b/, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
669 t.gsub!(/\b__private_extern__\b/, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
670 t.gsub!(/^\s*\(?\s*/, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
671 t.gsub!(/\s*\)?\s*$/, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
672
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
673 raise "Empty type (was '#{type}')" if t.empty?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
674
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
675 @stripped_return_type = t
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
676 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
677
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
678 def function_pointer? (function_pointer_types)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
679 type = @function_pointer_types[@stripped_return_type] || @stripped_return_type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
680 @function_pointer_type ||= FunctionPointerInfo.new_from_type(type)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
681 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
682
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
683 def <=>(x)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
684 self.name <=> x.name
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
685 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
686
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
687 def hash
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
688 @name.hash
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
689 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
690
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
691 def eql? (o)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
692 @name == o.name
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
693 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
694 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
695
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
696 class FunctionInfo < VarInfo
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
697
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
698 attr_reader :args, :argc
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
699
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
700 def initialize (function, args, orig, inline = false)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
701 super(function.return_type, function.name, orig)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
702
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
703 @args = args
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
704 @argc = @args.size
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
705 @variadic = false
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
706
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
707 if @args[-1] && @args[-1].return_type == "..."
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
708 @argc -= 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
709 @variadic = true
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
710 @args.pop
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
711 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
712
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
713 @inline = inline
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
714 self
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
715 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
716
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
717 def variadic?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
718 @variadic
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
719 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
720
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
721 def inline?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
722 @inline
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
723 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
724 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
725
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
726 class FunctionPointerInfo < FunctionInfo
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
727 def initialize (return_type, arg_types, orig)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
728 args = arg_types.map do |x|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
729 VarInfo.new(x, "", "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
730 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
731
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
732 super(VarInfo.new(return_type, "", ""), args, orig)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
733 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
734
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
735 def self.new_from_type (type)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
736 @cache ||= {}
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
737 info = @cache[type]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
738
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
739 return info if info
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
740
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
741 tokens = type.split(/\(\*\)/)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
742 return nil if tokens.size != 2
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
743
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
744 return_type = tokens.first.strip
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
745 rest = tokens.last.sub(/^\s*\(\s*/, "").sub(/\s*\)\s*$/, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
746
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
747 arg_types = rest.split(/,/).map do |x|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
748 x.strip
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
749 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
750
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
751 @cache[type] = self.new(return_type, arg_types, type)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
752 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
753 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
754
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
755 class MethodInfo < FunctionInfo
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
756
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
757 attr_reader :selector
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
758
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
759 def initialize (method, selector, is_class, args, orig)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
760 super(method, args, orig)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
761
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
762 @selector = selector
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
763 @is_class = is_class
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
764 self
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
765 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
766
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
767 def class_method?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
768 @is_class
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
769 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
770
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
771 def <=>(o)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
772 @selector <=> o.selector
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
773 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
774
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
775 def hash
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
776 @selector.hash
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
777 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
778
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
779 def eql? (o)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
780 @selector == o.selector
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
781 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
782 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
783
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
784 def do_cpp (path, fails_on_error = true, do_64 = true, flags = "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
785 f_on = false
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
786 err_file = '/tmp/.cpp.err'
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
787 cpp_line = "#{CPP} #{CPPFLAGS} #{flags} #{do_64 ? '-D__LP64__' : ''} \"#{path}\" 2>#{err_file}"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
788 complete_result = `#{cpp_line}`
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
789
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
790 if $?.to_i != 0 && fails_on_error
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
791 $stderr.puts File.read(err_file)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
792 File.unlink(err_file)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
793 raise "#{CPP} returned #{$?.to_int/256} exit status\nline was: #{cpp_line}"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
794 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
795
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
796 result = complete_result.select do |s|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
797 # First pass to only grab non-empty lines and the pre-processed lines
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
798 # only from the target header (and not the entire pre-processing result).
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
799 next if s.strip.empty?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
800 m = %r{^#\s*\d+\s+"([^"]+)"}.match(s)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
801 f_on = (File.basename(m[1]) == File.basename(path)) if m
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
802 f_on
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
803 end.select do |s|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
804 # Second pass to ignore all pro-processor comments that were left.
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
805 /^#/.match(s) == nil
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
806 end.join
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
807
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
808 File.unlink(err_file)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
809 return [complete_result, result]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
810 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
811 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
812
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
813 class DStepGenerator
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
814
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
815 VERSION = 1.0
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
816
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
817 attr_accessor :out_file, :scaner
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
818
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
819 def initialize
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
820 @do_64bit = false
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
821 @frameworks = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
822 @framework_paths = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
823 @headers = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
824 @import_directives = ""
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
825 @informal_protocols = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
826 @classes = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
827 @scaner = HeaderScaner.new
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
828 @scaner.do_64bit = @do_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
829 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
830
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
831 def do_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
832 return @do_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
833 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
834
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
835 def do_64bit= (do_64bit)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
836 @do_64bit = do_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
837 @scaner.do_64bit = do_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
838 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
839
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
840 def collect
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
841 scaner.scan(@frameworks, @headers)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
842 @classes = scaner.classes
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
843 @informal_protocols = scaner.protocols
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
844 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
845
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
846 def handle_framework (framework)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
847 val = framework.name
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
848 path = framework_path(val)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
849
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
850 raise "Can't locate framework '#{val}'" if path.nil?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
851 @framework_paths << File.dirname(path)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
852 raise "Can't find framework '#{val}'" if path.nil?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
853
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
854 parent_path, name = path.scan(/^(.+)\/(\w+)\.framework\/?$/)[0]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
855
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
856 if @private
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
857 headers_path = File.join(path, "PrivateHeaders")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
858 raise "Can't locate private framework headers at '#{headers_path}'" unless File.exist?(headers_path)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
859
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
860 headers = Dir.glob(File.join(headers_path, "**", "*.h"))
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
861 public_headers_path = File.join(path, "Headers")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
862 public_headers = if File.exist?(public_headers_path)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
863 HeaderScaner::CPPFLAGS << " -I#{public_headers_path} "
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
864 Dir.glob(File.join8(headers_path, "**", "*.h"))
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
865 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
866 []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
867 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
868 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
869 headers_path = File.join(path, "Headers")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
870 raise "Can't locate public framework headers at '#{headers_path}'" unless File.exist?(headers_path)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
871 public_headers = headers = Dir.glob(File.join(headers_path, "**", "*.h"))
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
872 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
873
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
874 # We can't just "#import <x/x.h>" as the main Framework header might not include _all_ headers.
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
875 # So we are tricking this by importing the main header first, then all headers.
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
876 header_basenames = (headers | public_headers).map do |x|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
877 x.sub(/#{headers_path}\/*/, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
878 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
879
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
880 if idx = header_basenames.index("#{name}.h")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
881 header_basenames.delete_at(idx)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
882 header_basenames.unshift("#{name}.h")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
883 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
884
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
885 @import_directives = header_basenames.map do |x|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
886 "#import <#{name}/#{x}>"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
887 end.join("\n")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
888
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
889 @import_directives << "\n"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
890
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
891 @compiler_flags ||= "-F\"#{parent_path}\" -framework #{name}"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
892 @cpp_flags ||= ""
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
893 @cpp_flags << "-F\"#{parent_path}\" "
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
894
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
895 headers.each do |header|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
896 header_file = HeaderFile.new
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
897 header_file.path = header
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
898 header_file.name = File.basename(header, File.extname(header))
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
899 header_file.framework = framework.name
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
900
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
901 framework.headers << header_file
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
902 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
903
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
904 # Memorize the dependencies.
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
905 @dependencies = DStepGenerator.dependencies_of_framework(path)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
906 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
907
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
908 def framework_path (val)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
909 return path if File.exist?(val)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
910
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
911 val += ".framework" unless /\.framework$/.match(val)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
912 paths = ["/System/Library/Frameworks", "/Library/Frameworks", "#{ENV['HOME']}/Library/Frameworks"]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
913 paths << "/System/Library/PrivateFrameworks" if @private
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
914
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
915 paths.each do |dir|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
916 path = File.join(dir, val)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
917 return path if File.exist?(path)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
918 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
919
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
920 return nil
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
921 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
922
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
923 def self.dependencies_of_framework (path)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
924 @dependencies ||= {}
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
925 name = File.basename(path, ".framework")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
926 path = File.join(path, name)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
927 deps = @dependencies[path]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
928
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
929 if deps.nil?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
930 deps = `otool -L "#{path}"`.scan(/\t([^\s]+)/).map do |m|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
931 dpath = m[0]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
932 next if File.basename(dpath) == name
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
933 next if dpath.include?("PrivateFrameworks")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
934 next unless dpath.sub!(/\.framework\/Versions\/\w+\/\w+$/, "")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
935 dpath + ".framework"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
936 end.compact
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
937
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
938 @dependencies[path] = deps
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
939 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
940
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
941 return deps
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
942 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
943
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
944 def compile_and_execute (code, enable_64bit = false)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
945 compiler_line = "gcc "
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
946 src = File.new(unique_tmp_path("src", ".m"), "w")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
947 src << code
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
948 src.close
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
949
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
950 arch_flag = if enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
951 "-arch x86_64 -arch ppc64"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
952 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
953 "-arch i386 -arch ppc"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
954 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
955
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
956 compiler_line << arch_flag
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
957
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
958 bin = unique_tmp_path "bin"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
959 log = unique_tmp_path "log"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
960
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
961 line = "#{compiler_line} -o #{bin} #{src.path} #{@compiler_flags}> #{log}"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
962
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
963 unless system(line)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
964 msg = "Cannot compile Objective-C code ...aborting\nCommand was: #{line}\n\nLog:\n#{File.read(log)}\n\n"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
965 $stderr << msg
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
966 File.delete src.path
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
967 raise msg
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
968 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
969
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
970 result = `#{bin}`
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
971
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
972 unless $?.success?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
973 raise "Cannot execute compiled Objective-C code ... aborting\nCommand was: #{line}\nBinary is: #{bin}"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
974 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
975
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
976 File.delete bin
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
977 File.delete log
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
978 File.delete src.path
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
979
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
980 return result
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
981 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
982
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
983 def unique_tmp_path (base, extension = "", dir = Dir.tmpdir)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
984 i = 0
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
985 loop do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
986 path = File.join(dir, "#{base}-#{Process.pid}-#{i}#{extension}")
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
987 return path unless File.exists?(path)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
988 i += 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
989 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
990 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
991
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
992 def add_header (path)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
993 header = HeaderFile.new
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
994 header.path = path
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
995 header.name = File.basename(path, File.extname(path))
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
996 @import_directives << "#include <#{path}>\n"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
997 @headers << header
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
998 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
999
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1000 def add_framework (name)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1001 framework = Framework.new
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1002 framework.name = name
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1003 handle_framework(framework)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1004 #@import_directives << "#import <#{framework.name}/#{framework.name}.h>\n"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1005 @frameworks << framework
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1006 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1007
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1008 def collect_header_types (header, enable_64bit)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1009 types = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1010
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1011 header.cftypes.each do |cftype|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1012 types << cftype[:type]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1013 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1014
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1015 header.constants.each do |constant|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1016 types << constant.stripped_return_type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1017 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1018
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1019 header.structs.each do |struct|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1020 types << struct[:name]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1021
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1022 struct[:members].each do |member|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1023 types << member[:declaredType]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1024 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1025 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1026
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1027 header.typedefs.each do |typedef|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1028 types << typedef.stripped_return_type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1029 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1030
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1031 header.functions.each do |function|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1032 types << function.stripped_return_type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1033
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1034 function.args.each do |arg|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1035 types << arg.stripped_return_type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1036 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1037 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1038
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1039 types
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1040 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1041
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1042 def collect_classes_types (enable_64bit)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1043 types = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1044
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1045 @classes.each do |clazz, value|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1046 value.methods.each do |method|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1047 types << method.stripped_return_type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1048
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1049 method.args.each do |arg|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1050 types << arg.stripped_return_type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1051 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1052 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1053 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1054
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1055 types
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1056 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1057
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1058 def collect_informal_protocols_types (enable_64bit)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1059 types = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1060
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1061 @informal_protocols.each do |name, methods|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1062 methods.each do |method|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1063 types << method.stripped_return_type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1064
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1065 method.args.each do |arg|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1066 types << arg.stripped_return_type
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1067 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1068 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1069 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1070
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1071 types
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1072 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1073
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1074 def resolve_header_types (header, enable_64bit, resolved_types, x)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1075 i = x
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1076
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1077 header.cftypes.each do |cftype|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1078 cftype[enable_64bit ? :type64 : :type] = resolved_types[i]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1079 i += 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1080 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1081
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1082 header.constants.each do |constant|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1083 constant.resolved_type = resolved_types[i] unless enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1084 constant.resolved_type64 = resolved_types[i] if enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1085 i += 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1086 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1087
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1088 header.structs.each do |struct|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1089 struct[enable_64bit ? :type64 : :type] = resolved_types[i]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1090 i += 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1091
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1092 struct[:members].each do |member|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1093 member[enable_64bit ? :type64 : :type] = resolved_types[i]
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1094 i += 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1095 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1096 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1097
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1098 header.typedefs.each do |typedef|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1099 typedef.resolved_type = resolved_types[i] unless enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1100 typedef.resolved_type64 = resolved_types[i] if enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1101 i += 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1102 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1103
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1104 header.functions.each do |function|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1105 function.resolved_type = resolved_types[i] unless enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1106 function.resolved_type64 = resolved_types[i] if enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1107 i += 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1108
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1109 function.args.each do |arg|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1110 arg.resolved_type = resolved_types[i] unless enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1111 arg.resolved_type64 = resolved_types[i] if enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1112 i += 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1113 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1114 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1115
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1116 i
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1117 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1118
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1119 def resolve_methods_types (enable_64bit, resolved_types, x)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1120 i = x
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1121
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1122 @classes.each do |clazz, value|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1123 value.methods.each do |method|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1124 method.resolved_type = resolved_types[i] unless enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1125 method.resolved_type64 = resolved_types[i] if enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1126 i += 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1127
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1128 method.args.each do |arg|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1129 arg.resolved_type = resolved_types[i] unless enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1130 arg.resolved_type64 = resolved_types[i] if enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1131 i += 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1132 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1133 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1134 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1135
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1136 i
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1137 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1138
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1139 def resolve_informal_protocols_types (enable_64bit, resolved_types, x)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1140 i = x
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1141
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1142 @informal_protocols.each do |name, methods|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1143 methods.each do |method|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1144 method.resolved_type = resolved_types[i] unless enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1145 method.resolved_type64 = resolved_types[i] if enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1146 i += 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1147
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1148 method.args.each do |arg|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1149 arg.resolved_type = resolved_types[i] unless enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1150 arg.resolved_type64 = resolved_types[i] if enable_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1151 i += 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1152 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1153 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1154 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1155
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1156 i
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1157 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1158
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1159 def resolve_types (enable_64bit = false)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1160 code = "#include <stdio.h>\n"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1161 code << @import_directives
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1162 types = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1163
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1164 @frameworks.each do |framework|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1165 framework.headers.each do |header|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1166 types << collect_header_types(header, enable_64bit)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1167 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1168 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1169
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1170 @headers.each do |header|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1171 types << collect_header_types(header, enable_64bit)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1172 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1173
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1174 types << collect_classes_types(enable_64bit)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1175 types << collect_informal_protocols_types(enable_64bit)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1176
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1177 code << "int main () \n{\n"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1178 types.flatten!
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1179
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1180 types.each do |type|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1181 code << ' printf("%s\n", ' + "@encode(#{type}));\n"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1182 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1183
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1184 code << " return 0;\n}"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1185
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1186 resolved_types = []
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1187
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1188 compile_and_execute(code, enable_64bit).split("\n").each do |line|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1189 resolved_types << line
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1190 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1191
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1192 i = 0
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1193
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1194 @frameworks.each do |framework|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1195 framework.headers.each do |header|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1196 i = resolve_header_types(header, enable_64bit, resolved_types, i)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1197 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1198 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1199
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1200 @headers.each do |header|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1201 i = resolve_header_types(header, enable_64bit, resolved_types, i)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1202 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1203
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1204 i = resolve_methods_types(enable_64bit, resolved_types, i)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1205 i = resolve_informal_protocols_types(enable_64bit, resolved_types, i)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1206 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1207
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1208 def generate_header (xml, header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1209 xml.file :name => header.name do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1210 header.imports.each do |import|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1211 xml.import import
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1212 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1213
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1214 header.defines.each do |define|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1215 xml.define define
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1216 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1217
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1218 header.cftypes.each do |cftype|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1219 xml.cftype cftype
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1220 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1221
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1222 header.constants.each do |constant|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1223 xml.constant :name => constant.name, :declaredType => constant.return_type, :type => constant.resolved_type, :type64 => constant.resolved_type64, :const => constant.const
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1224 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1225
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1226 header.enums.each do |enum|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1227 xml.enum :name => enum[:name] do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1228 enum[:members].each do |member|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1229 xml.member member
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1230 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1231 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1232 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1233
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1234 header.structs.each do |struct|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1235 xml.struct :name => struct[:name], :type => struct[:type], :type64 => struct[:type64] do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1236 struct[:members].each do |member|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1237 xml.member member
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1238 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1239 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1240 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1241
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1242 header.typedefs.each do |typedef|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1243 xml.typedef :name => typedef.name, :declaredType => typedef.return_type, :type => typedef.resolved_type, :type64 => typedef.resolved_type64, :const => typedef.const
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1244 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1245
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1246 header.functions.each do |function|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1247 xml.function :name => function.name, :inline => function.inline?, :variadic => function.variadic? do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1248 function.args.each do |arg|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1249 xml.arg :name => arg.name, :declaredType => arg.return_type, :type => arg.resolved_type, :type64 => arg.resolved_type64, :const => arg.const, :typeModifier => arg.type_modifier
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1250 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1251
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1252 xml.returnValue :declaredType => function.return_type, :type => function.resolved_type, :type64 => function.resolved_type64, :const => function.const, :typeModifier => function.type_modifier
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1253 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1254 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1255 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1256 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1257
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1258 def generate_classes (xml)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1259 @classes.each do |clazz, value|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1260 xml.class :name => clazz, :parent => value.parent, :file => value.file do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1261 value.methods.each do |method|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1262 xml.method :selector => method.selector, :classMethod => method.class_method?, :variadic => method.variadic? do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1263 method.args.each do |arg|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1264 xml.arg :name => arg.name, :declaredType => arg.return_type, :type => arg.resolved_type, :type64 => arg.resolved_type64, :const => arg.const, :typeModifier => arg.type_modifier
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1265 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1266
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1267 xml.returnValue :declaredType => method.return_type, :type => method.resolved_type, :type64 => method.resolved_type64, :const => method.const, :typeModifier => method.type_modifier
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1268 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1269 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1270 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1271 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1272 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1273
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1274 def generate_informal_protocols (xml)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1275 @informal_protocols.each do |name, methods|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1276 xml.informalProtocol :name => name do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1277 methods.each do |method|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1278 xml.method :selector => method.selector, :classMethod => method.class_method?, :variadic => method.variadic? do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1279 method.args.each do |arg|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1280 xml.arg :name => arg.name, :declaredType => arg.return_type, :type => arg.resolved_type, :type64 => arg.resolved_type64, :const => arg.const, :typeModifier => arg.type_modifier
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1281 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1282
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1283 xml.returnValue :declaredType => method.return_type, :type => method.resolved_type, :type64 => method.resolved_type64, :const => method.const, :typeModifier => method.type_modifier
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1284 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1285 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1286 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1287 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1288 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1289
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1290 def generate
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1291 resolve_types
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1292 resolve_types(true) if @do_64bit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1293
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1294 file = STDOUT if @out_file == nil
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1295 file = File.open @out_file, "w" unless @out_file == nil
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1296
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1297 xml = XmlMarkup.new(:target => file, :indent => 4)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1298 xml.instruct!
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1299
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1300 xml.dstep :xmlns => "http://www.dsource.org/projects/dstep", "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", "xsi:schemaLocation" => "http://www.dsource.org/projects/dstep/trunk/scripts/dstep.xsd" do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1301 @frameworks.each do |framework|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1302 xml.framework :name => framework.name do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1303 framework.headers.each do |header|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1304 generate_header(xml, header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1305 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1306 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1307 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1308
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1309 @headers.each do |header|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1310 generate_header(xml, header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1311 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1312
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1313 generate_classes(xml)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1314 generate_informal_protocols(xml)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1315 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1316
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1317 file.close unless file == STDOUT
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1318 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1319 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1320
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1321 def die (*msg)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1322 $stderr.puts msg
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1323 exit 1
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1324 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1325
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1326 if __FILE__ == $0
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1327 dstep_gen = DStepGenerator.new
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1328
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1329 OptionParser.new do |opts|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1330 opts.banner = "Usage: #{File.basename(__FILE__)} [options] <headers...>"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1331 opts.separator ""
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1332 opts.separator "Options:"
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1333
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1334 opts.on("-f", "--framework FRAMEWORK", "Generate metadata for the given framework.") do |opt|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1335 dstep_gen.add_framework(opt)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1336 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1337
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1338 opts.on(nil, "--64-bit", "Write 64-bit annotations.") do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1339 dstep_gen.do_64bit = true
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1340 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1341
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1342 opts.on("-o", "--output FILE", "Write output to the given file.") do |opt|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1343 die "Output file can't be specified more than once" if dstep_gen.out_file
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1344 dstep_gen.out_file = opt
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1345 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1346
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1347 # opts.on("-d", "--output-dir PATH", "Write ouptut to the given paht, use this with the --framework option") do |opt|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1348 # die "Output directory can't be specified more than once" if dstep_gen.out_dir
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1349 # dstep_gen.out_dir = opt
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1350 # end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1351
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1352
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1353
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1354 help_msg = "Use the `-h' flag or for help."
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1355
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1356 opts.on("-h", "--help", "Show this message.") do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1357 puts opts, help_msg
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1358 exit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1359 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1360
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1361 opts.on('-v', '--version', 'Show version.') do
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1362 puts DStepGenerator::VERSION
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1363 exit
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1364 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1365
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1366 opts.separator ""
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1367
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1368 if ARGV.empty?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1369 die opts.banner
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1370 else
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1371 begin
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1372 opts.parse!(ARGV)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1373
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1374 ARGV.each do |header|
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1375 dstep_gen.add_header(header)
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1376 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1377
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1378 dstep_gen.collect
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1379 dstep_gen.generate
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1380 rescue => e
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1381 msg = e.message
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1382 msg = "Internal error" if msg.empty?
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1383
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1384 die msg, opts.banner, help_msg
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1385 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1386 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1387 end
c7db221de6e8 First upload of dgen.rb and dstepgen.rb
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1388 end