bake-toolkit 2.19.2 → 2.20.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/documentation/_build/html/_images/dot.png +0 -0
  3. data/documentation/_build/html/_images/dotP.png +0 -0
  4. data/documentation/_build/html/_images/dotPC.png +0 -0
  5. data/documentation/_build/html/_sources/changelog.txt +12 -0
  6. data/documentation/_build/html/_sources/concepts/concepts.txt +2 -0
  7. data/documentation/_build/html/_sources/concepts/inject.txt +65 -0
  8. data/documentation/_build/html/_sources/concepts/prebuild.txt +56 -0
  9. data/documentation/_build/html/_sources/index.txt +1 -1
  10. data/documentation/_build/html/_sources/syntax/auto_adjustment.txt +43 -0
  11. data/documentation/_build/html/_sources/syntax/syntax.txt +1 -1
  12. data/documentation/_build/html/_sources/syntax/variable_substitutions.txt +41 -68
  13. data/documentation/_build/html/_sources/tips_and_tricks/dot.txt +34 -0
  14. data/documentation/_build/html/_sources/tips_and_tricks/tips_and_tricks.txt +1 -1
  15. data/documentation/_build/html/_static/dot.png +0 -0
  16. data/documentation/_build/html/_static/dotP.png +0 -0
  17. data/documentation/_build/html/_static/dotPC.png +0 -0
  18. data/documentation/_build/html/_static/syntax.html +20 -0
  19. data/documentation/_build/html/changelog.html +17 -3
  20. data/documentation/_build/html/commandline/commandline.html +3 -3
  21. data/documentation/_build/html/concepts/build_hierarchy.html +3 -3
  22. data/documentation/_build/html/concepts/concepts.html +13 -3
  23. data/documentation/_build/html/concepts/inject.html +217 -0
  24. data/documentation/_build/html/concepts/link_order.html +3 -3
  25. data/documentation/_build/html/concepts/prebuild.html +205 -0
  26. data/documentation/_build/html/concepts/the_main_project.html +3 -3
  27. data/documentation/_build/html/concepts/the_project_meta_file.html +3 -3
  28. data/documentation/_build/html/genindex.html +3 -3
  29. data/documentation/_build/html/ide/eclipse/eclipse.html +3 -3
  30. data/documentation/_build/html/ide/eclipse/how_to_convert_existing_cdt_workspace.html +3 -3
  31. data/documentation/_build/html/ide/eclipse/how_to_create_a_new_project_in_eclipse.html +3 -3
  32. data/documentation/_build/html/ide/eclipse/how_to_create_a_workspace_in_eclipse.html +3 -3
  33. data/documentation/_build/html/ide/eclipse/how_to_debug_in_eclipse.html +3 -3
  34. data/documentation/_build/html/ide/eclipse/how_to_install_eclipse_plugin.html +3 -3
  35. data/documentation/_build/html/ide/eclipse/how_to_use_bake_in_eclipse.html +3 -3
  36. data/documentation/_build/html/ide/ide_integrations.html +3 -3
  37. data/documentation/_build/html/ide/vs/how_to_create_vs_projects.html +3 -3
  38. data/documentation/_build/html/ide/vs/how_to_debug_in_vs.html +3 -3
  39. data/documentation/_build/html/ide/vs/how_to_used_bake_in_vs.html +3 -3
  40. data/documentation/_build/html/ide/vs/vs.html +3 -3
  41. data/documentation/_build/html/ide/vs/vs_install.html +3 -3
  42. data/documentation/_build/html/index.html +10 -7
  43. data/documentation/_build/html/install/install_bake.html +3 -3
  44. data/documentation/_build/html/internal.html +3 -3
  45. data/documentation/_build/html/known_issues.html +3 -3
  46. data/documentation/_build/html/license.html +3 -3
  47. data/documentation/_build/html/performance/performance.html +5 -5
  48. data/documentation/_build/html/quickstart/quickstart.html +3 -3
  49. data/documentation/_build/html/search.html +3 -3
  50. data/documentation/_build/html/searchindex.js +1 -1
  51. data/documentation/_build/html/syntax/adapt_configs.html +3 -3
  52. data/documentation/_build/html/syntax/auto_adjustment.html +190 -0
  53. data/documentation/_build/html/syntax/derive_configs.html +3 -3
  54. data/documentation/_build/html/syntax/project_meta_syntax.html +23 -3
  55. data/documentation/_build/html/syntax/syntax.html +11 -7
  56. data/documentation/_build/html/syntax/variable_substitutions.html +54 -67
  57. data/documentation/_build/html/tips_and_tricks/{bundle.html → dot.html} +25 -19
  58. data/documentation/_build/html/tips_and_tricks/how_to_use_bake_with_cygwin.html +3 -3
  59. data/documentation/_build/html/tips_and_tricks/static_code_analysis.html +3 -3
  60. data/documentation/_build/html/tips_and_tricks/the_bakery.html +3 -3
  61. data/documentation/_build/html/tips_and_tricks/the_clang.html +5 -5
  62. data/documentation/_build/html/tips_and_tricks/tips_and_tricks.html +4 -4
  63. data/documentation/_build/html/why_bake/why_bake.html +5 -5
  64. data/lib/adapt/config/loader.rb +37 -35
  65. data/lib/bake/config/checks.rb +19 -11
  66. data/lib/bake/config/loader.rb +67 -60
  67. data/lib/bake/model/metamodel.rb +56 -30
  68. data/lib/bake/options/options.rb +37 -3
  69. data/lib/bake/options/usage.rb +12 -3
  70. data/lib/bake/subst.rb +5 -2
  71. data/lib/blocks/block.rb +27 -6
  72. data/lib/blocks/blockBase.rb +2 -17
  73. data/lib/blocks/compile.rb +91 -91
  74. data/lib/blocks/executable.rb +41 -41
  75. data/lib/common/version.rb +1 -1
  76. data/lib/tocxx.rb +212 -55
  77. metadata +16 -4
  78. data/documentation/_build/html/_sources/tips_and_tricks/bundle.txt +0 -24
@@ -100,9 +100,9 @@ module Bake
100
100
  p = @block.convPath(@tcs[:OUTPUT_DIR])
101
101
  @output_dir = p
102
102
  elsif isMainProject?
103
- @output_dir = "build/" + Bake.options.build_config
103
+ @output_dir = "build" + Bake.options.buildDirDelimiter + Bake.options.build_config
104
104
  else
105
- @output_dir = "build/" + @config.name + "_" + Bake.options.main_project_name + "_" + Bake.options.build_config
105
+ @output_dir = "build" + Bake.options.buildDirDelimiter + @config.name + "_" + Bake.options.main_project_name + "_" + Bake.options.build_config
106
106
  end
107
107
  end
108
108
 
@@ -199,21 +199,6 @@ module Bake
199
199
  incList
200
200
  end
201
201
 
202
- def getSubBlocks(b, method)
203
- b.send(method).each do |child_b|
204
- if not @otherBlocks.include?child_b
205
- @otherBlocks << child_b
206
- getSubBlocks(child_b, method)
207
- end
208
- end
209
- end
210
-
211
- def getBlocks(method)
212
- @otherBlocks = []
213
- getSubBlocks(@block, method)
214
- return @otherBlocks
215
- end
216
-
217
202
  end
218
203
  end
219
204
  end
@@ -6,24 +6,24 @@ require 'bake/toolchain/colorizing_formatter'
6
6
  require 'bake/config/loader'
7
7
 
8
8
  module Bake
9
-
9
+
10
10
  module Blocks
11
-
11
+
12
12
  class Compile < BlockBase
13
-
13
+
14
14
  attr_reader :objects, :include_list
15
-
15
+
16
16
  def initialize(block, config, referencedConfigs, tcs)
17
17
  super(block, config, referencedConfigs, tcs)
18
18
  @objects = []
19
19
  @object_files = {}
20
-
20
+
21
21
  calcFileTcs
22
22
  calcIncludes
23
23
  calcDefines # not for files with changed tcs
24
24
  calcFlags # not for files with changed tcs
25
25
  end
26
-
26
+
27
27
  def get_object_file(source)
28
28
 
29
29
  # until now all OBJECT_FILE_ENDING are equal in all three types
@@ -31,23 +31,23 @@ module Bake
31
31
  return adaptedSource if File.is_absolute?source
32
32
  File.join([@output_dir, adaptedSource])
33
33
  end
34
-
34
+
35
35
  def ignore?(type)
36
36
  Bake.options.linkOnly or (Bake.options.prepro and type == ASM)
37
37
  end
38
-
38
+
39
39
  def needed?(source, object, type, dep_filename_conv)
40
40
  return "because analyzer toolchain is configured" if Bake.options.analyze
41
- return "because prepro was specified and source is no assembler file" if Bake.options.prepro
42
-
41
+ return "because prepro was specified and source is no assembler file" if Bake.options.prepro
42
+
43
43
  return "because object does not exist" if not File.exist?(object)
44
44
  oTime = File.mtime(object)
45
-
45
+
46
46
  return "because source is newer than object" if oTime < File.mtime(source)
47
-
47
+
48
48
  if type != :ASM
49
49
  return "because dependency file does not exist" if not File.exist?(dep_filename_conv)
50
-
50
+
51
51
  begin
52
52
  File.readlines(dep_filename_conv).map{|line| line.strip}.each do |dep|
53
53
  if not File.exist?(dep)
@@ -68,19 +68,19 @@ module Bake
68
68
  if Bake.options.debug
69
69
  puts "While reading #{dep_filename_conv}:"
70
70
  puts ex.message
71
- puts ex.backtrace
71
+ puts ex.backtrace
72
72
  end
73
73
  return "because dependency file could not be loaded"
74
74
  end
75
75
  end
76
-
76
+
77
77
  false
78
78
  end
79
-
79
+
80
80
  def calcCmdlineFile(object)
81
81
  object[0..-3] + ".cmdline"
82
82
  end
83
-
83
+
84
84
  def calcDepFile(object, type)
85
85
  dep_filename = nil
86
86
  if type != :ASM
@@ -88,7 +88,7 @@ module Bake
88
88
  end
89
89
  dep_filename
90
90
  end
91
-
91
+
92
92
  def calcDepFileConv(dep_filename)
93
93
  dep_filename + ".bake"
94
94
  end
@@ -100,16 +100,16 @@ module Bake
100
100
  end
101
101
  nil
102
102
  end
103
-
103
+
104
104
  def compileFile(source)
105
105
  type = get_source_type(source)
106
106
  return if type.nil?
107
-
107
+
108
108
  object = @object_files[source]
109
-
109
+
110
110
  dep_filename = calcDepFile(object, type)
111
111
  dep_filename_conv = calcDepFileConv(dep_filename) if type != :ASM
112
-
112
+
113
113
  cmdLineCheck = false
114
114
  cmdLineFile = calcCmdlineFile(object)
115
115
 
@@ -131,14 +131,14 @@ module Bake
131
131
  end
132
132
  includes = @include_array[type]
133
133
 
134
- if Bake.options.prepro and compiler[:PREPRO_FLAGS] == ""
134
+ if Bake.options.prepro and compiler[:PREPRO_FLAGS] == ""
135
135
  Bake.formatter.printError("Error: No preprocessor option available for " + source)
136
- raise SystemCommandFailed.new
136
+ raise SystemCommandFailed.new
137
137
  end
138
-
138
+
139
139
  cmd = Utils.flagSplit(compiler[:COMMAND], false)
140
140
  cmd += compiler[:COMPILE_FLAGS].split(" ")
141
-
141
+
142
142
  if dep_filename
143
143
  cmd += @tcs[:COMPILER][type][:DEP_FLAGS].split(" ")
144
144
  if @tcs[:COMPILER][type][:DEP_FLAGS_FILENAME]
@@ -150,17 +150,17 @@ module Bake
150
150
  else
151
151
  cmd[cmd.length-1] << dep_filename
152
152
  end
153
-
153
+
154
154
  end
155
155
  end
156
156
  end
157
-
157
+
158
158
  cmd += compiler[:PREPRO_FLAGS].split(" ") if Bake.options.prepro
159
159
  cmd += flags
160
160
  cmd += includes
161
161
  cmd += defines
162
-
163
- offlag = compiler[:OBJECT_FILE_FLAG]
162
+
163
+ offlag = compiler[:OBJECT_FILE_FLAG]
164
164
  offlag = compiler[:PREPRO_FILE_FLAG] if compiler[:PREPRO_FILE_FLAG] and Bake.options.prepro
165
165
 
166
166
  if compiler[:OBJ_FLAG_SPACE]
@@ -168,7 +168,7 @@ module Bake
168
168
  cmd << object
169
169
  else
170
170
  if object.include?" "
171
- cmd << offlag + "\"" + object + "\""
171
+ cmd << offlag + "\"" + object + "\""
172
172
  else
173
173
  cmd << offlag + object
174
174
  end
@@ -178,24 +178,24 @@ module Bake
178
178
  if Bake.options.cc2j_filename
179
179
  Blocks::CC2J << { :directory => @projectDir, :command => cmd, :file => source }
180
180
  end
181
-
181
+
182
182
  if not (cmdLineCheck and BlockBase.isCmdLineEqual?(cmd, cmdLineFile))
183
183
  BlockBase.prepareOutput(object)
184
184
  BlockBase.writeCmdLineFile(cmd, cmdLineFile)
185
185
  success, consoleOutput = ProcessHelper.run(cmd, false, false)
186
-
186
+
187
187
  outputType = Bake.options.analyze ? "Analyzing" : (Bake.options.prepro ? "Preprocessing" : "Compiling")
188
188
  incList = process_result(cmd, consoleOutput, compiler[:ERROR_PARSER], "#{outputType} #{source}", reason, success)
189
-
189
+
190
190
  if type != :ASM and not Bake.options.analyze and not Bake.options.prepro
191
191
  incList = Compile.read_depfile(dep_filename, @projectDir, @tcs[:COMPILER][:DEP_FILE_SINGLE_LINE]) if incList.nil?
192
- Compile.write_depfile(incList, dep_filename_conv)
192
+ Compile.write_depfile(incList, dep_filename_conv)
193
193
  end
194
194
  check_config_file
195
195
  end
196
-
196
+
197
197
  Bake::Bundle.instance.addSource(source, @include_list, dep_filename_conv) if isMainProject?
198
-
198
+
199
199
  end
200
200
 
201
201
  def self.read_depfile(dep_filename, projDir, singeLine)
@@ -206,7 +206,7 @@ module Bake
206
206
  splitted = line.split(": ")
207
207
  deps << splitted[1].gsub(/[\\]/,'/') if splitted.length > 1
208
208
  end
209
- else
209
+ else
210
210
  deps_string = File.read(dep_filename)
211
211
  deps_string = deps_string.gsub(/\\\n/,'')
212
212
  dep_splitted = deps_string.split(/([^\\]) /).each_slice(2).map(&:join)[2..-1]
@@ -218,7 +218,7 @@ module Bake
218
218
  end
219
219
  deps
220
220
  end
221
-
221
+
222
222
  # todo: move to toolchain util file
223
223
  def self.write_depfile(deps, dep_filename_conv)
224
224
  if deps
@@ -238,30 +238,30 @@ module Bake
238
238
  def mutex
239
239
  @mutex ||= Mutex.new
240
240
  end
241
-
241
+
242
242
  def execute
243
243
  Dir.chdir(@projectDir) do
244
-
244
+
245
245
  calcSources
246
246
  calcObjects
247
247
 
248
248
  @incWarns.each do |x|
249
249
  Bake.formatter.printInfo("IncludeDir '#{x[0].name}' will be converted to '#{x[1]}' although local path exists. If not intended, use './#{x[0].name}'.", x[0])
250
250
  end if Bake.options.verbose >= 1
251
-
251
+
252
252
  @error_strings = {}
253
-
253
+
254
254
  compileJobs = Multithread::Jobs.new(@source_files) do |jobs|
255
255
  while source = jobs.get_next_or_nil do
256
-
256
+
257
257
  if (jobs.failed and Bake.options.stopOnFirstError) or Bake::IDEInterface.instance.get_abort
258
258
  break
259
259
  end
260
-
260
+
261
261
  s = StringIO.new
262
262
  tmp = Thread.current[:stdout]
263
263
  Thread.current[:stdout] = s unless tmp
264
-
264
+
265
265
  result = false
266
266
  begin
267
267
  compileFile(source)
@@ -273,22 +273,22 @@ module Bake
273
273
  Bake.formatter.printError("Error: #{ex1.message}")
274
274
  puts ex1.backtrace if Bake.options.debug
275
275
  end
276
- end
277
-
276
+ end
277
+
278
278
  jobs.set_failed if not result
279
-
279
+
280
280
  Thread.current[:stdout] = tmp
281
-
281
+
282
282
  mutex.synchronize do
283
- if s.string.length > 0
283
+ if s.string.length > 0
284
284
  if Bake.options.stopOnFirstError and not result
285
285
  @error_strings[source] = s.string
286
286
  else
287
287
  puts s.string
288
288
  end
289
289
  end
290
- end
291
-
290
+ end
291
+
292
292
  end
293
293
  end
294
294
  compileJobs.join
@@ -297,35 +297,35 @@ module Bake
297
297
  # if not sorted, it may be confusing when builing more than once and the order of the error appearances changes from build to build
298
298
  # (it is not deterministic which file compilation finishes first)
299
299
  @error_strings.sort.each {|es| puts es[1]}
300
-
300
+
301
301
  raise SystemCommandFailed.new if compileJobs.failed
302
-
303
-
302
+
303
+
304
304
  end
305
305
  return true
306
306
  end
307
-
307
+
308
308
  def clean
309
309
  if Bake.options.filename or Bake.options.analyze
310
310
  Dir.chdir(@projectDir) do
311
311
  calcSources(true)
312
312
  @source_files.each do |source|
313
-
313
+
314
314
  type = get_source_type(source)
315
315
  next if type.nil?
316
316
  object = get_object_file(source)
317
- if File.exist?object
317
+ if File.exist?object
318
318
  puts "Deleting file #{object}" if Bake.options.verbose >= 2
319
319
  FileUtils.rm_rf(object)
320
320
  end
321
321
  if not Bake.options.analyze
322
322
  dep_filename = calcDepFile(object, type)
323
- if dep_filename and File.exist?dep_filename
323
+ if dep_filename and File.exist?dep_filename
324
324
  puts "Deleting file #{dep_filename}" if Bake.options.verbose >= 2
325
325
  FileUtils.rm_rf(dep_filename)
326
326
  end
327
327
  cmdLineFile = calcCmdlineFile(object)
328
- if File.exist?cmdLineFile
328
+ if File.exist?cmdLineFile
329
329
  puts "Deleting file #{cmdLineFile}" if Bake.options.verbose >= 2
330
330
  FileUtils.rm_rf(cmdLineFile)
331
331
  end
@@ -335,7 +335,7 @@ module Bake
335
335
  end
336
336
  return true
337
337
  end
338
-
338
+
339
339
  def calcObjects
340
340
  @source_files.each do |source|
341
341
  type = get_source_type(source)
@@ -345,7 +345,7 @@ module Bake
345
345
  @object_files.each do |k,v|
346
346
  if (v == object) # will be found exactly once
347
347
  Bake.formatter.printError("Source files '#{k}' and '#{source}' would result in the same object file", source)
348
- raise SystemCommandFailed.new
348
+ raise SystemCommandFailed.new
349
349
  end
350
350
  end
351
351
  end
@@ -354,17 +354,17 @@ module Bake
354
354
  end
355
355
  end
356
356
  end
357
-
357
+
358
358
  def calcSources(cleaning = false, keep = false)
359
359
  return @source_files if @source_files and not @source_files.empty?
360
360
  Dir.chdir(@projectDir) do
361
361
  @source_files = []
362
-
362
+
363
363
  exclude_files = Set.new
364
364
  @config.excludeFiles.each do |p|
365
365
  Dir.glob(p.name).each {|f| exclude_files << f}
366
366
  end
367
-
367
+
368
368
  source_files = Set.new
369
369
  @config.files.each do |sources|
370
370
  p = sources.name
@@ -372,7 +372,7 @@ module Bake
372
372
  if res.length == 0 and cleaning == false
373
373
  if not p.include?"*" and not p.include?"?"
374
374
  Bake.formatter.printError("Source file '#{p}' not found", sources)
375
- raise SystemCommandFailed.new
375
+ raise SystemCommandFailed.new
376
376
  elsif Bake.options.verbose >= 1
377
377
  Bake.formatter.printInfo("Source file pattern '#{p}' does not match to any file", sources)
378
378
  end
@@ -384,7 +384,7 @@ module Bake
384
384
  @source_files << f
385
385
  end
386
386
  end
387
-
387
+
388
388
  if Bake.options.filename
389
389
  @source_files.keep_if do |source|
390
390
  source.include?Bake.options.filename
@@ -393,7 +393,7 @@ module Bake
393
393
  Bake.formatter.printInfo("#{Bake.options.filename} does not match to any source", @config)
394
394
  end
395
395
  end
396
-
396
+
397
397
  if Bake.options.eclipseOrder # directories reverse order, files in directories in alphabetical order
398
398
  dirs = []
399
399
  filemap = {}
@@ -416,20 +416,20 @@ module Bake
416
416
  end
417
417
  @source_files
418
418
  end
419
-
419
+
420
420
  def mapInclude(inc, orgBlock)
421
-
421
+
422
422
  if inc.name == "___ROOTS___"
423
423
  return Bake.options.roots.map { |r| File.rel_from_to_project(@projectDir,r,false) }
424
424
  end
425
-
425
+
426
426
  i = orgBlock.convPath(inc,nil,true)
427
427
  if orgBlock != @block
428
428
  if not File.is_absolute?(i)
429
429
  i = File.rel_from_to_project(@projectDir,orgBlock.config.parent.get_project_dir) + i
430
430
  end
431
431
  end
432
-
432
+
433
433
  x = Pathname.new(i).cleanpath
434
434
  if orgBlock.warnConvValid
435
435
  @incWarns << [inc, x]
@@ -439,20 +439,20 @@ module Bake
439
439
 
440
440
  def calcIncludes
441
441
  @incWarns = []
442
-
442
+
443
443
  @include_list = @config.includeDir.uniq.map do |dir|
444
444
  mapInclude(dir, @block)
445
445
  end
446
-
447
- getBlocks(:childs).each do |b|
446
+
447
+ @block.getBlocks(:childs).each do |b|
448
448
  b.config.includeDir.each do |inc|
449
449
  if inc.inherit == true
450
- @include_list << mapInclude(inc, b)
450
+ @include_list << mapInclude(inc, b)
451
451
  end
452
452
  end if b.config.respond_to?("includeDir")
453
453
  end
454
-
455
- getBlocks(:parents).each do |b|
454
+
455
+ @block.getBlocks(:parents).each do |b|
456
456
  if b.config.respond_to?("includeDir")
457
457
  include_list_front = []
458
458
  b.config.includeDir.each do |inc|
@@ -465,27 +465,27 @@ module Bake
465
465
  elsif inc.infix == "back"
466
466
  @include_list << mapInclude(inc, b)
467
467
  end
468
- end
468
+ end
469
469
  @include_list = include_list_front + @include_list
470
470
  end
471
471
  end
472
472
 
473
473
  @include_list = @include_list.flatten.uniq
474
-
474
+
475
475
  @include_array = {}
476
476
  [:CPP, :C, :ASM].each do |type|
477
477
  @include_array[type] = @include_list.map {|k| "#{@tcs[:COMPILER][type][:INCLUDE_PATH_FLAG]}#{k}"}
478
478
  end
479
479
  end
480
-
480
+
481
481
  def getDefines(compiler)
482
482
  compiler[:DEFINES].map {|k| "#{compiler[:DEFINE_FLAG]}#{k}"}
483
483
  end
484
-
484
+
485
485
  def getFlags(compiler)
486
486
  Bake::Utils::flagSplit(compiler[:FLAGS],true)
487
487
  end
488
-
488
+
489
489
  def calcDefines
490
490
  @define_array = {}
491
491
  [:CPP, :C, :ASM].each do |type|
@@ -498,7 +498,7 @@ module Bake
498
498
  @flag_array[type] = getFlags(@tcs[:COMPILER][type])
499
499
  end
500
500
  end
501
-
501
+
502
502
  def calcFileTcs
503
503
  @fileTcs = {}
504
504
  @config.files.each do |f|
@@ -510,20 +510,20 @@ module Bake
510
510
  err_res.line_number = f.line_number
511
511
  err_res.severity = ErrorParser::SEVERITY_WARNING
512
512
  err_res.message = "Toolchain settings not allowed for file patterns"
513
- Bake::IDEInterface.instance.set_errors([err_res])
513
+ Bake::IDEInterface.instance.set_errors([err_res])
514
514
  else
515
515
  @fileTcs[f.name] = integrateCompilerFile(Utils.deep_copy(@tcs),f)
516
516
  end
517
517
  end
518
518
  end
519
519
  end
520
-
520
+
521
521
  def tcs4source(source)
522
522
  @fileTcs[source] || @tcs
523
- end
524
-
525
-
523
+ end
524
+
525
+
526
526
  end
527
-
527
+
528
528
  end
529
529
  end