-
Notifications
You must be signed in to change notification settings - Fork 0
/
nginx_parser.rb
64 lines (56 loc) · 1.81 KB
/
nginx_parser.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
59
60
61
62
63
64
# Scan through nginx source code for ngx_command_t declarations.
# Find the ngx_string for the command and extract.
# Also the following line of NGX_ bit mask constants.
# if NGX_CONF_BLOCK then this is a command that defines a block and
# thus another indentation level.
# The other commands declare where the command is valid
CMD_DECL_START_REG = /static\s+ngx_command_t\s+.*\[\]\s*=\s*\{/
CMD_DECL_STOP_REG = /ngx_null_command|\};/
CMD_NAME_REG = /\{\s*ngx_string\s*\("(.*)"\)\s*,/
commands = Hash.new
command_loc = Hash.new { |h,k| h[k] = [] }
command_types = Hash.new { |h,k| h[k] = [] }
in_command_declaration = false
current_command = nil
valid_locs = nil
ARGV.each do |file|
File.readlines(file).each do |line|
if in_command_declaration
if CMD_DECL_STOP_REG =~ line
current_command = nil
in_command_declaration = false
elsif current_command && valid_locs.nil?
valid_locs = line.strip.chomp.split("|")
commands[current_command] = valid_locs
command_loc[file] << current_command
valid_locs.each { |l| command_types[l] << current_command }
current_command = nil
elsif current_command.nil?
if m = CMD_NAME_REG.match(line)
current_command = m[1]
valid_locs = nil
end
else
#skip
end
else
in_command_declaration = CMD_DECL_START_REG =~ line
end
end
end
def command_list(cmds)
"(" + cmds.map { |c| "\"#{c}\""}.join(" ") + ")"
end
def url_name(file)
File.basename(file).gsub(/ngx_|\.c/, "").split("_").map { |s| s.capitalize }.join("")
end
puts "Commands", command_list(commands.keys.sort)
puts "", ""
puts "Block Commands", command_list(command_types["NGX_CONF_BLOCK"].sort)
puts "Doc Commands"
puts "'("
command_loc.each do |f, vals|
pfile = url_name(f)
puts vals.map { |v| "(" + [v, pfile].join(" ") + ")" }.join(" ")
end
puts ")"