Module: CopyExpander
Overview
Work with individual source lines to perform token replacement declared in COBOL COPY REPLACING statements.
Instance Method Summary collapse
-
#blank?(line) ⇒ Boolean
Is this line logically blank?.
-
#break_up_source_line(line) ⇒ Object
Save the first six and last eight characters of the 80-character line so that we won’t shift characters into the interpreted area of the line when we make text substitutions.
-
#comment?(line) ⇒ Boolean
Is this line a comment? Source comments in COBOL are identified by an asterisk in position 7.
-
#commentize(line) ⇒ Object
Make the current source line a comment line.
- #copy_statement_count ⇒ Object
-
#expand_copybook(copy_statement) ⇒ Object
Recursively expand copybooks and replace tokens.
-
#has_copy_statement? ⇒ Boolean
Does the working area of the source line contain a COPY statement?.
- #init ⇒ Object
-
#process(line) ⇒ Object
Expand COPY statement found on a single line of COBOL source code.
-
#reconstruct_line ⇒ Object
Reconstruct the original source line.
-
#replace_tokens(line, copy_statement) ⇒ Object
Carry out token replacement in a source line per the REPLACING option.
Methods included from ExpanderConfig
#config_file, #hash, #load_config, #method_missing
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class ExpanderConfig
Instance Method Details
#blank?(line) ⇒ Boolean
Is this line logically blank?
77 78 79 |
# File 'lib/copy_expander.rb', line 77 def blank? line line == nil || line.gsub(/\s/, '').length == 0 end |
#break_up_source_line(line) ⇒ Object
Save the first six and last eight characters of the 80-character line so that we won’t shift characters into the interpreted area of the line when we make text substitutions.
68 69 70 71 72 |
# File 'lib/copy_expander.rb', line 68 def break_up_source_line line line.length >= 6 ? @first_six_characters = line[0..5] : nil line.length >= 80 ? @last_eight_characters = line[72..79] : nil line.length >= 72 ? @work_area = line[6..71] : nil end |
#comment?(line) ⇒ Boolean
Is this line a comment? Source comments in COBOL are identified by an asterisk in position 7.
85 86 87 |
# File 'lib/copy_expander.rb', line 85 def comment? line line[6] == '*' end |
#commentize(line) ⇒ Object
Make the current source line a comment line.
106 107 108 109 |
# File 'lib/copy_expander.rb', line 106 def commentize line line[6] = '*' line end |
#copy_statement_count ⇒ Object
17 18 19 |
# File 'lib/copy_expander.rb', line 17 def copy_statement_count @copy_statement_count end |
#expand_copybook(copy_statement) ⇒ Object
Recursively expand copybooks and replace tokens
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/copy_expander.rb', line 38 def copy_statement @depth += 1 if @depth > 8 puts "recursion depth is #{@depth}" exit(1) end copybook = File.open("#{copy_dir}/#{copy_statement.copybook_name}", 'r') begin line = ('%-80.80s' % copybook.readline.chomp) if blank?(line) || comment?(line) write_from line else break_up_source_line line if has_copy_statement? @copy_statement_count += 1 CopyStatement.new(@work_area) else @work_area = replace_tokens(@work_area, copy_statement) write_from reconstruct_line end end end while copybook.eof? == false @depth -= 1 end |
#has_copy_statement? ⇒ Boolean
Does the working area of the source line contain a COPY statement?
92 93 94 |
# File 'lib/copy_expander.rb', line 92 def has_copy_statement? @work_area.match(/ COPY (?=([^\"\']*\"[^\"\']*\"\')*[^\"\']*$)/i) ? true : false end |
#init ⇒ Object
12 13 14 15 |
# File 'lib/copy_expander.rb', line 12 def init @copy_statement_count = 0 @copy_statement_depth = 0 end |
#process(line) ⇒ Object
Expand COPY statement found on a single line of COBOL source code.
24 25 26 27 28 29 30 31 32 33 |
# File 'lib/copy_expander.rb', line 24 def process line return line if blank? line return line if comment? line break_up_source_line line return line unless has_copy_statement? @copy_statement_count += 1 @depth = 0 CopyStatement.new(@work_area) nil end |
#reconstruct_line ⇒ Object
Reconstruct the original source line.
99 100 101 |
# File 'lib/copy_expander.rb', line 99 def reconstruct_line @first_six_characters + ('%-66.66s' % @work_area) + @last_eight_characters end |
#replace_tokens(line, copy_statement) ⇒ Object
Carry out token replacement in a source line per the REPLACING option
114 115 116 117 118 119 120 |
# File 'lib/copy_expander.rb', line 114 def replace_tokens line, copy_statement if copy_statement.old_value == nil || copy_statement.new_value == nil line else line.gsub(copy_statement.old_value, copy_statement.new_value) unless copy_statement.old_value == nil end end |