Home | History | Annotate | Line # | Download | only in lint1
check-msgs.lua revision 1.1
      1  1.1  rillig #! /usr/bin/lua
      2  1.1  rillig -- $NetBSD: check-msgs.lua,v 1.1 2020/12/31 22:48:33 rillig Exp $
      3  1.1  rillig 
      4  1.1  rillig --[[
      5  1.1  rillig 
      6  1.1  rillig Check that the message text in the C source matches the actual user-visible
      7  1.1  rillig message text.
      8  1.1  rillig 
      9  1.1  rillig usage: ./check-diagnostics *.c
     10  1.1  rillig 
     11  1.1  rillig ]]
     12  1.1  rillig 
     13  1.1  rillig 
     14  1.1  rillig local function load_messages(fname)
     15  1.1  rillig   local msgs = {}
     16  1.1  rillig 
     17  1.1  rillig   local f = assert(io.open(fname, "r"))
     18  1.1  rillig   for line in f:lines() do
     19  1.1  rillig     local msg, id = line:match("%s*\"(.+)\",%s*/%*%s*(%d+)%s*%*/$")
     20  1.1  rillig     if msg ~= nil then
     21  1.1  rillig       msgs[tonumber(id)] = msg
     22  1.1  rillig     end
     23  1.1  rillig   end
     24  1.1  rillig 
     25  1.1  rillig   f:close()
     26  1.1  rillig 
     27  1.1  rillig   return msgs
     28  1.1  rillig end
     29  1.1  rillig 
     30  1.1  rillig 
     31  1.1  rillig local function check_message(fname, lineno, id, comment, msgs, errors)
     32  1.1  rillig   local msg = msgs[id]
     33  1.1  rillig 
     34  1.1  rillig   if msg == nil then
     35  1.1  rillig     errors:add("%s:%d: id=%d not found", fname, lineno, id)
     36  1.1  rillig     return
     37  1.1  rillig   end
     38  1.1  rillig 
     39  1.1  rillig   if comment == msg then
     40  1.1  rillig     return
     41  1.1  rillig   end
     42  1.1  rillig 
     43  1.1  rillig   local prefix = comment:match("(.*) %.%.%.$")
     44  1.1  rillig   if prefix ~= nil and msg:find(prefix) == 1 then
     45  1.1  rillig     return
     46  1.1  rillig   end
     47  1.1  rillig 
     48  1.1  rillig   errors:add("%s:%d:   id=%-3d   msg=%-40s   comment=%s",
     49  1.1  rillig     fname, lineno, id, msg, comment)
     50  1.1  rillig end
     51  1.1  rillig 
     52  1.1  rillig 
     53  1.1  rillig local function collect_errors(fname, msgs)
     54  1.1  rillig   local errors = {}
     55  1.1  rillig   errors.add = function(self, fmt, ...)
     56  1.1  rillig     table.insert(self, string.format(fmt, ...))
     57  1.1  rillig   end
     58  1.1  rillig   local f = assert(io.open(fname, "r"))
     59  1.1  rillig   local lineno = 0
     60  1.1  rillig   local prev = ""
     61  1.1  rillig   for line in f:lines() do
     62  1.1  rillig     lineno = lineno + 1
     63  1.1  rillig 
     64  1.1  rillig     local id = line:match("^%s+warning%((%d+)[),]")
     65  1.1  rillig     if id == nil then
     66  1.1  rillig       id = line:match("^%s+error%((%d+)[),]")
     67  1.1  rillig     end
     68  1.1  rillig     if id ~= nil then
     69  1.1  rillig       local comment = prev:match("^%s+/%*%s+(.+)%s+%*/$")
     70  1.1  rillig       if comment ~= nil then
     71  1.1  rillig         check_message(fname, lineno, tonumber(id), comment, msgs, errors)
     72  1.1  rillig       end
     73  1.1  rillig     end
     74  1.1  rillig 
     75  1.1  rillig     prev = line
     76  1.1  rillig   end
     77  1.1  rillig 
     78  1.1  rillig   f:close()
     79  1.1  rillig 
     80  1.1  rillig   return errors
     81  1.1  rillig end
     82  1.1  rillig 
     83  1.1  rillig 
     84  1.1  rillig local function check_file(fname, msgs)
     85  1.1  rillig   local errors = collect_errors(fname, msgs)
     86  1.1  rillig   for _, err in ipairs(errors) do
     87  1.1  rillig     print(err)
     88  1.1  rillig   end
     89  1.1  rillig   return #errors == 0
     90  1.1  rillig end
     91  1.1  rillig 
     92  1.1  rillig 
     93  1.1  rillig local function main(arg)
     94  1.1  rillig   local msgs = load_messages("err.c")
     95  1.1  rillig   local ok = true
     96  1.1  rillig   for _, fname in ipairs(arg) do
     97  1.1  rillig     ok = check_file(fname, msgs) and ok
     98  1.1  rillig   end
     99  1.1  rillig   return ok
    100  1.1  rillig end
    101  1.1  rillig 
    102  1.1  rillig os.exit(main(arg))
    103