Module Name: src Committed By: rillig Date: Thu Dec 31 22:48:33 UTC 2020
Added Files: src/usr.bin/xlint/lint1: check-msgs.lua Log Message: lint: check messages and their IDs for consistency To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 src/usr.bin/xlint/lint1/check-msgs.lua Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Added files: Index: src/usr.bin/xlint/lint1/check-msgs.lua diff -u /dev/null src/usr.bin/xlint/lint1/check-msgs.lua:1.1 --- /dev/null Thu Dec 31 22:48:33 2020 +++ src/usr.bin/xlint/lint1/check-msgs.lua Thu Dec 31 22:48:33 2020 @@ -0,0 +1,102 @@ +#! /usr/bin/lua +-- $NetBSD: check-msgs.lua,v 1.1 2020/12/31 22:48:33 rillig Exp $ + +--[[ + +Check that the message text in the C source matches the actual user-visible +message text. + +usage: ./check-diagnostics *.c + +]] + + +local function load_messages(fname) + local msgs = {} + + local f = assert(io.open(fname, "r")) + for line in f:lines() do + local msg, id = line:match("%s*\"(.+)\",%s*/%*%s*(%d+)%s*%*/$") + if msg ~= nil then + msgs[tonumber(id)] = msg + end + end + + f:close() + + return msgs +end + + +local function check_message(fname, lineno, id, comment, msgs, errors) + local msg = msgs[id] + + if msg == nil then + errors:add("%s:%d: id=%d not found", fname, lineno, id) + return + end + + if comment == msg then + return + end + + local prefix = comment:match("(.*) %.%.%.$") + if prefix ~= nil and msg:find(prefix) == 1 then + return + end + + errors:add("%s:%d: id=%-3d msg=%-40s comment=%s", + fname, lineno, id, msg, comment) +end + + +local function collect_errors(fname, msgs) + local errors = {} + errors.add = function(self, fmt, ...) + table.insert(self, string.format(fmt, ...)) + end + local f = assert(io.open(fname, "r")) + local lineno = 0 + local prev = "" + for line in f:lines() do + lineno = lineno + 1 + + local id = line:match("^%s+warning%((%d+)[),]") + if id == nil then + id = line:match("^%s+error%((%d+)[),]") + end + if id ~= nil then + local comment = prev:match("^%s+/%*%s+(.+)%s+%*/$") + if comment ~= nil then + check_message(fname, lineno, tonumber(id), comment, msgs, errors) + end + end + + prev = line + end + + f:close() + + return errors +end + + +local function check_file(fname, msgs) + local errors = collect_errors(fname, msgs) + for _, err in ipairs(errors) do + print(err) + end + return #errors == 0 +end + + +local function main(arg) + local msgs = load_messages("err.c") + local ok = true + for _, fname in ipairs(arg) do + ok = check_file(fname, msgs) and ok + end + return ok +end + +os.exit(main(arg))