31 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
class PreprocessinatorExtractor
 | 
						|
  def extract_base_file_from_preprocessed_expansion(filepath)
 | 
						|
    # preprocessing by way of toolchain preprocessor expands macros, eliminates
 | 
						|
    # comments, strips out #ifdef code, etc.  however, it also expands in place
 | 
						|
    # each #include'd file.  so, we must extract only the lines of the file
 | 
						|
    # that belong to the file originally preprocessed
 | 
						|
 | 
						|
    # iterate through all lines and alternate between extract and ignore modes
 | 
						|
    # all lines between a '#'line containing file name of our filepath and the
 | 
						|
    # next '#'line should be extracted
 | 
						|
 | 
						|
    base_name  = File.basename(filepath)
 | 
						|
    not_pragma = /^#(?!pragma\b)/ # preprocessor directive that's not a #pragma
 | 
						|
    pattern    = /^#.*(\s|\/|\\|\")#{Regexp.escape(base_name)}/
 | 
						|
    found_file = false # have we found the file we care about?
 | 
						|
 | 
						|
    lines = []
 | 
						|
    File.readlines(filepath).each do |line|
 | 
						|
      if found_file and not line.match(not_pragma)
 | 
						|
        lines << line
 | 
						|
      else
 | 
						|
        found_file = false
 | 
						|
      end
 | 
						|
 | 
						|
      found_file = true if line.match(pattern)
 | 
						|
    end
 | 
						|
 | 
						|
    return lines
 | 
						|
  end
 | 
						|
end
 |