| #!/usr/bin/env lua |
| |
| local format_br = '\n.br\n' |
| local tools = { |
| "wasm-decompile", "wasm-interp", "wasm-objdump", "wasm-stats", |
| "wasm-strip", "wasm-validate", "wasm2c", "wasm2wat", |
| "wast2json", "wat-desugar", "wat2wasm", "spectest-interp" |
| } |
| |
| local name, mainarg, argvs |
| local usage |
| local short = "" |
| local full = {} |
| local examples = {} |
| local options = {} |
| |
| local last = { } |
| |
| do -- parse usage |
| local usage = io.read('*line'); |
| name, mainarg, argvs = usage:match("usage: ([^%s%c]+) %[options%] ([^%s%c]+) %[([^%s%c]+)%]%.%.%.") |
| if not argvs then |
| name, mainarg = usage:match("usage: ([^%s%c]+) %[options%] ([^%s%c]+)") |
| end |
| end |
| |
| do -- read short description |
| repeat line = io.read('*line'); |
| short = short .. ' ' .. line |
| until line == "" |
| end |
| |
| do -- read full description |
| repeat line = io.read('*line'); |
| table.insert(full, line) |
| until line == "examples:" |
| do -- format full description |
| table.remove(full, #full) -- remove "examples:" |
| full = table.concat(full, "") -- concat everything with a space |
| full = full:gsub("^ ", "") |
| full = full:gsub("\n ", "") |
| -- full = full:gsub(" +", "\n") |
| full:gsub('\n', format_br) |
| end |
| end |
| |
| |
| do -- parse examples |
| line = io.read('*line'); -- skip "examples:" |
| last = { descr = {} } -- prepare new example |
| while line ~= "options:" do |
| -- empty lines are between examples |
| if line:match("^%s*$") then |
| -- format last |
| local descr = last.descr |
| descr = table.concat(descr, '\n') |
| last.descr = descr |
| -- push last |
| table.insert(examples, last) |
| -- prepare new example |
| last = { descr = {} } |
| end |
| |
| -- found the sample usage |
| if line:match("^%s*%$ ") then |
| last.input = line:match("^ *%$ (.+)") |
| end |
| -- found some description |
| if line:match("^ *# ") then |
| table.insert(last.descr, (line:gsub("^ *# ", ""))) |
| end |
| |
| line = io.read('*line'); |
| end |
| end |
| |
| |
| do -- parse options |
| last = { } |
| for line in io.stdin:lines() do |
| if line:match("^ +%-") then |
| table.insert(options, last) |
| |
| local short, long, descr = line:match("^ %-(%w), %-%-([^%s%c]+) +(.+)") |
| if not short then |
| long, descr = line:match("^ %-%-([^%s%c]+) +(.+)") |
| end |
| last = { |
| short = short, |
| long = long, |
| descr = descr, |
| } |
| else |
| last.descr = last.descr .. line:gsub("^ +", "\n") |
| end |
| end |
| table.remove(options, 1) |
| last = { } |
| end |
| |
| |
| -- remove this tool from the SEE ALSO section |
| for index, tool in pairs(tools) do |
| if tool == name then |
| table.remove(tools, index) |
| break |
| end |
| end |
| |
| |
| |
| do -- print the man page |
| print(".Dd $Mdocdate$") |
| print(".Os") |
| print(".Sh NAME") |
| print((".Nm %s"):format(name)) |
| print((".Nd %s"):format(short)) |
| print(".Sh SYNOPSIS") |
| print((".Nm %s"):format(name)) |
| print(".Op options") |
| print((".Ar %s"):format(mainarg)) |
| if argvs then |
| print((".Ar [%s]..."):format(argvs)) |
| end |
| print(".Sh DESCRIPTION") |
| print(".Nm") |
| print(full) |
| print(".Pp") |
| print("The options are as follows:") |
| print(".Bl -tag -width Ds") |
| for index, option in pairs(options) do |
| if option.short then |
| print((".It Fl %s , Fl Fl %s"):format(option.short, option.long)) |
| else |
| print((".It Fl Fl %s"):format(option.long)) |
| end |
| print(option.descr) |
| end |
| print(".El") |
| print(".Sh EXAMPLES") |
| for index, example in pairs(examples) do |
| print(example.descr) |
| print(".Pp") |
| print((".Dl $ %s"):format(example.input)) |
| end |
| print(".Sh SEE ALSO") |
| for idx, tool in pairs(tools) do |
| print((".Xr %s 1 %s"):format(tool, idx == #tool and "" or ",")) |
| end |
| print(".Sh BUGS") |
| print("If you find a bug, please report it at") |
| print(".br") |
| print(".Lk https://github.com/WebAssembly/wabt/issues .") |
| end |