dbc 1.3.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/caphir.rb +152 -0
- data/bin/dbcparse.rb +139 -285
- data/lib/{dbc → caphir}/ctokenizer.rb +48 -41
- data/lib/caphir/ctype.rb +2640 -0
- data/lib/caphir/define.rb +488 -0
- data/lib/{dbc → caphir}/parseerrorhandler.rb +0 -0
- data/lib/caphir/parser.rb +125 -0
- data/lib/caphir/parsersettings.rb +175 -0
- data/lib/caphir/preprocessor.rb +2173 -0
- data/lib/caphir/preprocessor_conf.rb +153 -0
- data/lib/{dbc → caphir}/searchpath.rb +0 -0
- data/lib/dbc/dbc.rb +65 -129
- data/lib/dbc/expand_function.rb +43 -46
- data/lib/dbc/ocl.rb +600 -577
- metadata +13 -9
- data/lib/dbc/ctype.rb +0 -2569
- data/lib/dbc/define.rb +0 -282
- data/lib/dbc/parameters.rb +0 -434
- data/lib/dbc/preprocessor.rb +0 -2078
data/bin/caphir.rb
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Simple test script to run the parser on the given input file
|
4
|
+
#
|
5
|
+
|
6
|
+
|
7
|
+
if RUBY_VERSION =~ /\A1\.6/
|
8
|
+
warn("attempt to run with Ruby 1.6.* (should be using Ruby 1.8+)")
|
9
|
+
exit(1)
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'optparse'
|
13
|
+
|
14
|
+
# allows us to run the regression test with local source base
|
15
|
+
# without installing caphir
|
16
|
+
if $0 != File.basename($0)
|
17
|
+
$:.unshift(File.join(File.dirname($0),'..','lib'))
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'caphir/parsersettings'
|
21
|
+
require 'caphir/parser'
|
22
|
+
|
23
|
+
|
24
|
+
if $0 == __FILE__
|
25
|
+
|
26
|
+
settings = ParserSettings.new
|
27
|
+
|
28
|
+
# initialize with defaults
|
29
|
+
always_output = false
|
30
|
+
|
31
|
+
#
|
32
|
+
# define OptionParser
|
33
|
+
#
|
34
|
+
|
35
|
+
opts = OptionParser.new do |opts|
|
36
|
+
opts.banner = "Usage: parser.rb [options] [input file]"
|
37
|
+
opts.separator ""
|
38
|
+
opts.separator "Specific options:"
|
39
|
+
|
40
|
+
# Compiler like options
|
41
|
+
opts.on("-o", "--output file", String,
|
42
|
+
"Output to file (default STDOUT)") do |file|
|
43
|
+
opts.error("multiple output files give") if settings.dest_file
|
44
|
+
settings.dest_file = file
|
45
|
+
end
|
46
|
+
opts.on("-D macro(=value)", String, "Define macro") do |macro|
|
47
|
+
settings.define_macro(macro)
|
48
|
+
end
|
49
|
+
# allow user to undefine compiler specific macros
|
50
|
+
opts.on("-U macro", String, "Cancel the definintion of macro") do |macro|
|
51
|
+
settings.undefine_macro(macro)
|
52
|
+
end
|
53
|
+
opts.on("-I directory", String,
|
54
|
+
"Use directory to search for header files") do |inc_dir|
|
55
|
+
settings.add_include_path(inc_dir)
|
56
|
+
end
|
57
|
+
opts.on("--include file", String, "Include file before processing") do |file|
|
58
|
+
settings.includes << file
|
59
|
+
end
|
60
|
+
opts.on("--cc=compiler(-version)", String, "Specify target compiler") do |cc|
|
61
|
+
opts.error("invalid compiler #{cc}") unless cc =~ /\A[^-]+(?:-(\d\.)+)?\Z/
|
62
|
+
settings.compiler = $1
|
63
|
+
settings.version = $2
|
64
|
+
end
|
65
|
+
opts.on("-E", "Preprocess input file only") do
|
66
|
+
settings.preprocess_only = true
|
67
|
+
end
|
68
|
+
opts.on("-a", "--always-output", "Always output to destination file") do
|
69
|
+
always_output = true
|
70
|
+
end
|
71
|
+
opts.on("--no-overwrite", "Don't overwrite output file") do
|
72
|
+
settings.overwrite = false
|
73
|
+
end
|
74
|
+
opts.on("-h", "--help", "Print this message") do
|
75
|
+
puts opts
|
76
|
+
exit(0)
|
77
|
+
end
|
78
|
+
|
79
|
+
opts.separator ""
|
80
|
+
opts.separator "Reads from STDIN if input file is '-' or none is given."
|
81
|
+
opts.separator "-D and -U options are processed in the order given."
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
#
|
86
|
+
# Handle command line options
|
87
|
+
#
|
88
|
+
|
89
|
+
begin
|
90
|
+
opts.parse!(ARGV)
|
91
|
+
rescue
|
92
|
+
warn "#{$!} (-h will show vaild options)"
|
93
|
+
exit(2)
|
94
|
+
end
|
95
|
+
|
96
|
+
# make sure opts gets GC'ed
|
97
|
+
opts = nil
|
98
|
+
|
99
|
+
|
100
|
+
if ARGV.length > 1
|
101
|
+
warn "expecting one input file, got #{ARGV.length}"
|
102
|
+
exit(2)
|
103
|
+
end
|
104
|
+
|
105
|
+
unless ARGV.empty? || ARGV[0] == '-'
|
106
|
+
settings.src_file = ARGV[0]
|
107
|
+
unless File.file?(settings.src_file)
|
108
|
+
warn "file does not exist: #{settings.src_file}"
|
109
|
+
exit(2)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
begin
|
114
|
+
settings.check
|
115
|
+
settings.execute
|
116
|
+
rescue
|
117
|
+
$stderr.puts $!
|
118
|
+
exit(2)
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
begin
|
123
|
+
out_str = ''
|
124
|
+
|
125
|
+
parser = Caphir::EventParser.new(settings)
|
126
|
+
|
127
|
+
if settings.preprocess_only
|
128
|
+
parser.each do |t|
|
129
|
+
out_str << t
|
130
|
+
end
|
131
|
+
else
|
132
|
+
parser.each do |function|
|
133
|
+
stmt = parser.in_stream.reset([])
|
134
|
+
|
135
|
+
out_str << stmt.collect! { |t| t.at(1) }.join
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
rescue CTokenizer::Error, CType::EvaluationError
|
140
|
+
warn $!
|
141
|
+
exit(-1)
|
142
|
+
ensure
|
143
|
+
if !$! or always_output
|
144
|
+
if settings.dest_file
|
145
|
+
File.open(settings.dest_file, 'w') { |f| f.write(out_str) }
|
146
|
+
else
|
147
|
+
$stdout.write(out_str)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
data/bin/dbcparse.rb
CHANGED
@@ -6,327 +6,181 @@
|
|
6
6
|
# See included LICENCE file.
|
7
7
|
|
8
8
|
if RUBY_VERSION =~ /\A1\.6/
|
9
|
-
|
10
|
-
|
11
|
-
$stdout = STDOUT
|
12
|
-
$stderr = STDERR
|
9
|
+
warn("attempt to run with Ruby 1.6.* (should be using Ruby 1.8+)")
|
10
|
+
exit(1)
|
13
11
|
end
|
14
12
|
|
15
|
-
|
16
|
-
def create_dest_dirs(dest_file)
|
17
|
-
dest_dir = File.dirname(dest_file)
|
18
|
-
dirs = []
|
19
|
-
until File.directory?(dest_dir)
|
20
|
-
# [ "/home/boson/fake", "/home/boson" ]
|
21
|
-
# "/home/boson" exists so loop ends
|
22
|
-
dirs << dest_dir
|
23
|
-
dest_dir = File.dirname(dest_dir)
|
24
|
-
end
|
25
|
-
dirs.reverse_each do |d|
|
26
|
-
Dir.mkdir(d)
|
27
|
-
end
|
28
|
-
nil
|
29
|
-
end
|
30
|
-
|
31
|
-
require 'getoptlong'
|
13
|
+
require 'optparse'
|
32
14
|
|
33
|
-
|
34
|
-
|
35
|
-
if $0 !=
|
36
|
-
|
15
|
+
# allows us to run the regression test with local source base
|
16
|
+
# without installing DBC
|
17
|
+
if $0 != File.basename($0)
|
18
|
+
$:.unshift(File.join(File.dirname($0),'..','lib'))
|
37
19
|
end
|
38
|
-
|
39
|
-
require '
|
20
|
+
|
21
|
+
require 'caphir/parsersettings'
|
22
|
+
require 'caphir/parser'
|
40
23
|
require 'dbc/expand_function'
|
41
|
-
require 'dbc/ctype'
|
42
24
|
require 'dbc/dbc'
|
43
25
|
|
44
|
-
class GetoptLong
|
45
|
-
def error(msg)
|
46
|
-
raise GetoptLong::Error, msg
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
opts = GetoptLong.new(
|
51
|
-
[ "--always-output", "-a", GetoptLong::NO_ARGUMENT ],
|
52
|
-
[ "--docs", "-d", GetoptLong::NO_ARGUMENT ],
|
53
|
-
[ "--help", "-h", GetoptLong::NO_ARGUMENT ],
|
54
|
-
[ "--no_line", "-n", GetoptLong::NO_ARGUMENT ],
|
55
|
-
[ "--preprocess-only","-p", GetoptLong::NO_ARGUMENT ],
|
56
|
-
# [ "--trace", "-t", GetoptLong::NO_ARGUMENT ],
|
57
|
-
[ "--check_level", "-c", GetoptLong::REQUIRED_ARGUMENT ],
|
58
|
-
[ "--output", "-o", GetoptLong::REQUIRED_ARGUMENT ],
|
59
|
-
# cc compatibility options
|
60
|
-
[ "--define", "-D", GetoptLong::REQUIRED_ARGUMENT ],
|
61
|
-
[ "--include", "-I", GetoptLong::OPTIONAL_ARGUMENT ]
|
62
|
-
)
|
63
|
-
|
64
26
|
# initialize with defaults
|
65
|
-
|
66
|
-
src_file = nil
|
67
|
-
search_path = SearchPath.new
|
68
|
-
defines = []
|
69
|
-
search_usr_include = true
|
27
|
+
settings = ParserSettings.new
|
70
28
|
|
71
29
|
always_output = false
|
72
30
|
check_level = nil
|
73
31
|
docs = nil
|
74
32
|
line_info = true
|
75
|
-
preprocess_only = nil
|
76
33
|
|
77
|
-
|
34
|
+
#
|
35
|
+
# define OptionParser
|
36
|
+
#
|
37
|
+
opts = OptionParser.new do |opts|
|
38
|
+
opts.banner = "Usage: dbcparse.rb [options] [input file]"
|
39
|
+
opts.separator ""
|
40
|
+
opts.separator "Specific options:"
|
41
|
+
|
42
|
+
# Compiler like options
|
43
|
+
opts.on("-o", "--output file", String, \
|
44
|
+
"Output to file (default STDOUT)") do |file|
|
45
|
+
opts.error("multiple output files give") if settings.dest_file
|
46
|
+
settings.dest_file = file
|
47
|
+
end
|
48
|
+
opts.on("-D macro(=value)", String, "Define macro") do |macro|
|
49
|
+
settings.define_macro(macro)
|
50
|
+
end
|
51
|
+
# allow user to undefine compiler specific macros
|
52
|
+
opts.on("-U macro", String, "Cancel the definintion of macro") do |macro|
|
53
|
+
settings.undefine_macro(macro)
|
54
|
+
end
|
55
|
+
opts.on("-I directory", String,
|
56
|
+
"Use directory to search for header files") do |inc_dir|
|
57
|
+
settings.add_include_path(inc_dir)
|
58
|
+
end
|
59
|
+
opts.on("--include file", String, "Include file before processing") do |file|
|
60
|
+
settings.includes << file
|
61
|
+
end
|
62
|
+
opts.on("--cc=compiler(-version)", String, "Specify target compiler") do |cc|
|
63
|
+
opts.error("invalid compiler #{cc}") unless cc =~ /\A([^-]+)(?:-(\d\.)+)?\Z/
|
64
|
+
settings.compiler = $1
|
65
|
+
settings.version = $2
|
66
|
+
end
|
67
|
+
opts.on("-E", "Preprocess input file only") do
|
68
|
+
settings.preprocess_only = true
|
69
|
+
end
|
70
|
+
opts.on("-c", "--check-level [0,1,2]", Integer,
|
71
|
+
"Set check level (default 2)") do |level|
|
72
|
+
opts.error("invalid check level '#{level}'") unless DBC.valid_check_level?(level)
|
73
|
+
check_level = level
|
74
|
+
end
|
75
|
+
opts.on("-a", "--always-output", "Always output to destination file") do
|
76
|
+
always_output = true
|
77
|
+
end
|
78
|
+
opts.on("-d", "--docs", "Generate Doxygen documentation") do
|
79
|
+
docs = true
|
80
|
+
end
|
81
|
+
opts.on("--no-overwrite", "Don't overwrite output file") do
|
82
|
+
settings.overwrite = false
|
83
|
+
end
|
84
|
+
opts.on("--no-line", "Don't output '\#line' directives") do
|
85
|
+
line_info = false
|
86
|
+
end
|
87
|
+
opts.on("-h", "--help", "Print this message") do
|
88
|
+
puts opts
|
89
|
+
exit(0)
|
90
|
+
end
|
91
|
+
|
92
|
+
opts.separator ""
|
93
|
+
opts.separator "Check levels: 0 = none, 1 = preconditions only, 2 = all conditions."
|
94
|
+
opts.separator "Reads from STDIN if input file is '-' or none is given."
|
95
|
+
opts.separator "-D and -U options are processed in the order given."
|
96
|
+
end
|
97
|
+
|
98
|
+
#
|
99
|
+
# Handle command line options
|
100
|
+
#
|
78
101
|
|
79
102
|
begin
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
check_level = arg.to_i
|
85
|
-
unless DBC.valid_check_level?(check_level)
|
86
|
-
opts.error("invalid check level: #{arg}")
|
87
|
-
end
|
88
|
-
when "--include"
|
89
|
-
# should support including file in the future
|
90
|
-
if arg
|
91
|
-
begin
|
92
|
-
search_path.unshift(arg)
|
93
|
-
rescue
|
94
|
-
opts.error($!)
|
95
|
-
end
|
96
|
-
else
|
97
|
-
# -I with no argument means don't search /usr/include
|
98
|
-
search_usr_include = false
|
99
|
-
end
|
100
|
-
when "--define"
|
101
|
-
unless arg =~ /\A([A-Za-z_]\w*)(?:\(([\w,\s]*)\))?(?:=(.*))?\Z/
|
102
|
-
opts.error("macro names must be identifiers: #{arg}")
|
103
|
-
end
|
104
|
-
macro = $1
|
105
|
-
opts.error("cannot use 'defined' as a macro name") if macro == 'defined'
|
106
|
-
value = $3 || '1'
|
107
|
-
params = $2.split(/\s*,\s*/) if $2
|
108
|
-
defines << [macro,params,value]
|
109
|
-
when "--output"
|
110
|
-
if dest_file
|
111
|
-
opts.error("multiple output files give")
|
112
|
-
end
|
113
|
-
dest_file = arg
|
114
|
-
when "--always-output" then always_output = true
|
115
|
-
when "--docs" then docs = true
|
116
|
-
when "--no_line" then line_info = false
|
117
|
-
when "--preprocess-only" then preprocess_only = true
|
118
|
-
when "--help"
|
119
|
-
puts "Converts OCL design by contract tags to C code."
|
120
|
-
puts "Usage:"
|
121
|
-
puts "\t#{command} [options] [commands] input_file"
|
122
|
-
puts "Options:"
|
123
|
-
puts "\t-a, --always-output : always output to destination file"
|
124
|
-
puts "\t-d, --docs : generate Doxygen documentation"
|
125
|
-
puts "\t-h, --help : print this message"
|
126
|
-
puts "\t-n, --no_line : do not output '\#line' directives"
|
127
|
-
puts "\t-p, --preprocess-only : preprocess input files only"
|
128
|
-
puts "Commands:"
|
129
|
-
puts "\t-o, --output <file>"
|
130
|
-
puts "\t-c, --check_level <0,1,2>"
|
131
|
-
puts "\t-D, --define <macro(=value)>"
|
132
|
-
puts "\t-I, --include <directory>"
|
133
|
-
puts ""
|
134
|
-
puts "Check levels: 0 = none, 1 = preconditions only, 2 = all conditions."
|
135
|
-
puts "Reads from STDIN if input file is '-' or none is given."
|
136
|
-
puts "Outputs to STDOUT if no output file is given."
|
137
|
-
exit(0)
|
138
|
-
else raise GetoptLong::InvalidOption, "unrecognized option '#{opt}'"
|
139
|
-
end # case
|
140
|
-
i += 1
|
141
|
-
end # each
|
142
|
-
rescue GetoptLong::InvalidOption, GetoptLong::Error
|
143
|
-
msg = $!.message
|
144
|
-
warn "<command line>:#{i}: #{msg} (-h will show vaild options)"
|
145
|
-
exit(2)
|
103
|
+
opts.parse!(ARGV)
|
104
|
+
rescue
|
105
|
+
warn "#{$!} (-h will show vaild options)"
|
106
|
+
exit(2)
|
146
107
|
end
|
147
108
|
|
148
|
-
|
149
|
-
|
150
|
-
|
109
|
+
# make sure opts gets gc'ed
|
110
|
+
opts = nil
|
111
|
+
|
112
|
+
if [check_level, settings.preprocess_only, docs].nitems > 1
|
113
|
+
warn %q{conflicting options: only one of the following may be selected:
|
114
|
+
--check-level
|
151
115
|
--preprocess-only
|
152
116
|
--docs}
|
153
|
-
|
117
|
+
exit(2)
|
154
118
|
end
|
155
119
|
|
156
120
|
# default condition is all
|
157
121
|
check_level = DBC::ALL unless check_level
|
158
122
|
|
159
123
|
if ARGV.length > 1
|
160
|
-
|
161
|
-
|
124
|
+
warn "expecting one input file, got #{ARGV.length}"
|
125
|
+
exit(2)
|
162
126
|
end
|
163
127
|
|
164
128
|
unless ARGV.empty? || ARGV[0] == '-'
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
end
|
171
|
-
|
172
|
-
if dest_file
|
173
|
-
if File.exists?(dest_file) and not overwrite
|
174
|
-
warn "destination file '#{dest_file}' exists"
|
175
|
-
exit(2)
|
176
|
-
end
|
177
|
-
# this is always bad - so don't allow it even if overwrite is true
|
178
|
-
if src_file and File.expand_path(dest_file) == File.expand_path(src_file)
|
179
|
-
warn "destination file and source file are the same"
|
180
|
-
exit(2)
|
181
|
-
end
|
182
|
-
begin
|
183
|
-
create_dest_dirs(dest_file)
|
184
|
-
rescue
|
185
|
-
warn "could not create destination directory: #{$?}"
|
186
|
-
exit(2)
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
if src_file
|
191
|
-
begin
|
192
|
-
text = File.open(src_file, 'r') do |in_file|
|
193
|
-
in_file.read
|
194
|
-
end
|
195
|
-
rescue
|
196
|
-
warn "could not open '#{src_file}': #{$?}"
|
197
|
-
exit(2)
|
198
|
-
end
|
199
|
-
else
|
200
|
-
text = STDIN.read
|
201
|
-
end
|
202
|
-
|
203
|
-
### Compatibility with various compilers ###
|
204
|
-
|
205
|
-
# the following are added to the end of the search path
|
206
|
-
if search_usr_include
|
207
|
-
if File.exists?('/usr/include')
|
208
|
-
search_path << '/usr/include'
|
209
|
-
# search for /usr/lib/gcc*/<system>/<version>/include
|
210
|
-
Dir['/usr/lib/gcc*/*/*/include'].each do |gcc_inc|
|
211
|
-
search_path << gcc_inc if File.directory?(gcc_inc)
|
212
|
-
end
|
213
|
-
else
|
214
|
-
if env_include = ENV['INCLUDE']
|
215
|
-
env_include.split(';').each do |p|
|
216
|
-
# any anci c installation should have stdlib.h or stdio.h
|
217
|
-
if File.exists?(File.join(p, 'stdlib.h'))
|
218
|
-
search_path << p
|
219
|
-
end
|
220
|
-
end # each
|
221
|
-
end
|
222
|
-
end # if File.exists?('/usr/include')
|
129
|
+
settings.src_file = ARGV[0]
|
130
|
+
unless File.file?(settings.src_file)
|
131
|
+
warn "file does not exist: #{settings.src_file}"
|
132
|
+
exit(2)
|
133
|
+
end
|
223
134
|
end
|
224
135
|
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
when /i[0-9]86|cygwin|mingw/
|
232
|
-
defines << ['__i386__', nil, nil]
|
233
|
-
# I have found that these setting work best with GNU C libs
|
234
|
-
# experiance may vary :)
|
235
|
-
defines << ['__GLIBC_HAVE_LONG_LONG', nil, '1']
|
236
|
-
when /powerpc|darwin/
|
237
|
-
defines << ['__ppc__', nil, nil]
|
238
|
-
else
|
239
|
-
warn "unrecognized platform: #{RUBY_PLATFORM}"
|
136
|
+
begin
|
137
|
+
settings.check
|
138
|
+
settings.execute
|
139
|
+
rescue
|
140
|
+
$stderr.puts $!
|
141
|
+
exit(2)
|
240
142
|
end
|
241
143
|
|
242
|
-
# for gcc compatibility
|
243
|
-
defines << ['__asm__', ['...'], ' ']
|
244
|
-
defines << ['__attribute__', ['...'], ' ']
|
245
|
-
defines << ['__const__', nil, 'const']
|
246
|
-
defines << ['__extension__', nil, ' ']
|
247
|
-
defines << ['__inline__', nil, ' ']
|
248
|
-
defines << ['__signed__', nil, 'signed']
|
249
|
-
defines << ['__volatile__', nil, 'volatile']
|
250
|
-
|
251
|
-
# for gcc 3.4+ compatibility
|
252
|
-
defines << ['__builtin_va_list', nil, 'int *']
|
253
|
-
defines << ['SHLIB_COMPAT', ['...'], '(0)']
|
254
|
-
|
255
|
-
# so '##' is used to paste tokens, not '/**/'
|
256
|
-
defines << ['__STDC__', nil, '1']
|
257
|
-
#############################################
|
258
144
|
|
259
145
|
begin
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
# extracts DBC condtions
|
290
|
-
source = DBC::OCLParser.new(preproc)
|
291
|
-
|
292
|
-
# extract all C Statements
|
293
|
-
DBC.parse(source) do |context, f_body|
|
294
|
-
stmt = cache.reset
|
295
|
-
line = stmt.line
|
296
|
-
stmt = stmt.cache
|
297
|
-
# remove end of file token if it exists
|
298
|
-
stmt.pop unless stmt.empty? or stmt.last[0]
|
299
|
-
|
300
|
-
# define C types
|
301
|
-
context.each do |ctxt|
|
302
|
-
CType[ctxt.identifier] = ctxt if ctxt.typedef?
|
303
|
-
end
|
304
|
-
|
305
|
-
if f_body and preproc.base?
|
306
|
-
unless context.first
|
307
|
-
raise CTokenizer.error(nil, line, "unmatched braket")
|
308
|
-
end
|
309
|
-
out_str << expand_function( source.conditions,
|
310
|
-
context.first,
|
311
|
-
stmt, line, line_info )
|
312
|
-
else
|
313
|
-
stmt.each do |t|
|
314
|
-
out_str << t.at(1)
|
315
|
-
end
|
316
|
-
end
|
317
|
-
end # do
|
318
|
-
end #if
|
319
|
-
end # if
|
146
|
+
out_str = ''
|
147
|
+
|
148
|
+
if docs
|
149
|
+
out_str = DBC.parse_docs(CTokenizer::Lexer.new(
|
150
|
+
settings.source, settings.src_file))
|
151
|
+
elsif check_level == DBC::NONE
|
152
|
+
out_str = settings.source
|
153
|
+
else
|
154
|
+
parser = Caphir::EventParser.new(settings, DBC::Parser)
|
155
|
+
|
156
|
+
if settings.preprocess_only
|
157
|
+
parser.each do |t|
|
158
|
+
out_str << t
|
159
|
+
end
|
160
|
+
else
|
161
|
+
parser.each do |function|
|
162
|
+
line = parser.in_stream.last_line
|
163
|
+
stmt = parser.in_stream.reset([])
|
164
|
+
|
165
|
+
if function and parser.preproc.base?
|
166
|
+
out_str << expand_function( parser.handler.conditions,
|
167
|
+
function, stmt, line, line_info)
|
168
|
+
else
|
169
|
+
out_str << stmt.collect! { |t| t.at(1) }.join
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
320
174
|
rescue CTokenizer::Error, CType::EvaluationError
|
321
|
-
|
322
|
-
|
175
|
+
warn $!
|
176
|
+
exit(-1)
|
323
177
|
ensure
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
178
|
+
if !$! or always_output
|
179
|
+
if settings.dest_file
|
180
|
+
File.open(settings.dest_file, 'w') { |f| f.write(out_str) }
|
181
|
+
else
|
182
|
+
$stdout.write(out_str)
|
183
|
+
end
|
184
|
+
end
|
331
185
|
end
|
332
186
|
|