add usage example
[shellsnippets/shellsnippets.git] / mksh / wtf-chkdb
1 #!/bin/mksh
2 # $MirOS: src/usr.bin/wtf/chkdb,v 1.6 2017/08/02 10:15:11 tg Exp $
3 #-
4 # Copyright © 2015, 2016, 2017
5 #       mirabilos <m@mirbsd.org>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un‐
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person’s immediate fault when using the work as intended.
21 #-
22 # Check the acronyms database for validity.
23
24 acronyms=${ACRONYMDB:-/usr/share/misc/acronyms}
25
26 function die {
27         print -ru2 -- "E: $*"
28         exit 1
29 }
30 rv=0
31 function warn {
32         print -ru2 -- "W: $*"
33         rv=1
34 }
35
36 [[ -s $acronyms ]] || die "acronyms database ${acronyms@Q} missing or empty"
37
38 exec <"$acronyms"
39 IFS= read -r line || die "acronyms database ${acronyms@Q} empty"
40 [[ $line = '  '* ]] || die "acronyms database ${acronyms@Q} does not start with caseconv pairs"
41
42 set -U
43 [[ $line = ' '+( ?/?) ]] || die "acronyms database ${acronyms@Q} caseconv pairs line syntax error"
44 set +U
45 set -A ucsrch -- $line
46
47 lline=$line
48 num=1
49 last= nacr=0 nexp=0 lots=${EPOCHREALTIME%?????}
50 while IFS= read -r line; do
51         (( ++num ))
52         [[ $line = *@([         \r\f]) ]] && warn "whitespace at EOL: $line"
53         if [[ $line != *'       '* ]]; then
54                 [[ $line = ' '* ]] || warn "does not begin with a space: $line"
55                 [[ $line < $lline ]] && warn "not sorted: $line"
56                 lline=$line
57                 continue
58         fi
59         let ++nexp
60         target=${line%% *}
61         [[ $target = "$last" ]] || let ++nacr
62         last=$target
63         exp=${line#*    }
64         [[ $exp = *'    '* ]] && warn "tab in expansion: $line"
65         typeset -u tgsrch=$target
66         if [[ $tgsrch = *[A-Z].* ]]; then
67                 warn "never matched, contains dots: $line"
68                 target=${target//.}
69                 tgsrch=${tgsrch//.}
70         fi
71         for p in "${ucsrch[@]}"; do
72                 eval 'tgsrch=${tgsrch//'"$p}"
73         done
74         [[ $target != "$tgsrch" ]] && warn "never matched, not case-folded: $line"
75         [[ $tgsrch < $lline ]] && warn "not sorted: $line"
76         lline=$tgsrch
77         [[ $lots = ${EPOCHREALTIME%?????} ]] && continue
78         print -n "$num...\r"
79         lots=${EPOCHREALTIME%?????}
80 done
81 (( rv )) && die "acronyms database ${acronyms@Q} contains errors"
82 print "I: counted $num lines ($nacr acronyms with $nexp expansions), all OK"