Module: Rant::C::Include

Defined in:
lib/rant/c/include.rb

Class Method Summary collapse

Class Method Details

.parse_includes(src) ⇒ Object

Searches for all ‘#include’ statements in the C/C++ source from the string src.

Returns two arguments:

  1. A list of all standard library includes (e.g. #include <stdio.h>).

  2. A list of all local includes (e.g. #include “stdio.h”).



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/rant/c/include.rb', line 15

def parse_includes(src)
    if src.respond_to? :to_str
  src = src.to_str
    else
  raise ArgumentError, "src has to be a string"
    end
    s_includes = []
    l_includes = []
    in_block_comment = false
    prev_line = nil
    src.each { |line|
  line.chomp!
               if block_start_i = line.index("/*")
                   c_start_i = line.index("//")
                   if !c_start_i || block_start_i < c_start_i
                       if block_end_i = line.index("*/")
                           if block_end_i > block_start_i
                               line[block_start_i..block_end_i+1] = ""
                           end
                       end
                   end
               end
  if prev_line
      line = prev_line << line
      prev_line = nil
  end
  if line =~ /\\$/
      prev_line = line.chomp[0...line.length-1]
  end
  if in_block_comment
      in_block_comment = false if line =~ %r|\*/|
      next
  end
  case line
  when /\s*#\s*include\s+"([^"]+)"/
      l_includes << $1
  when /\s*#\s*include\s+<([^>]+)>/
      s_includes << $1
  when %r|(?!//)[^/]*/\*|
      in_block_comment = true
  end
    }
    [s_includes, l_includes]
end