blob: 9869965237f1a5052d5674756b60095d63c2107c [file] [log] [blame]
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +01001#!/bin/bash
2
Deaddy75831672018-12-28 11:23:24 +01003CHECKERHOME=$(pwd)
Deaddy334b3762018-12-30 11:48:13 +01004case $(uname -s) in
5 Darwin*) CHECKERLIB=$(dirname $(readlink $0));;
6 *) CHECKERLIB=$(dirname $(readlink -e $0));;
7esac
Deaddy75831672018-12-28 11:23:24 +01008# auf Mac muss man ggf. $CHECKERLIB manuell zu dem Ordner setzen, in dem die
9# Listen der zu testenden Funktionen liegen, wenn man noch irgendwie mit
10# symlinks rumfummelt, weil Mac das nicht standardkompliant kann. ;-)
11CODEFILES="${CHECKERHOME}/CODEFILES"
12HEADERFILES="${CHECKERHOME}/HEADERFILES"
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +010013#export LPCFILES="${HEADERFILES} ${CODEFILES}"
Deaddy75831672018-12-28 11:23:24 +010014LPCFILES="${CHECKERHOME}/LPCFILES"
Deaddyb2545fa2019-01-02 11:53:50 +010015# wenn $MUDLIB bereits als Umgebungsvariable existiert, muss man das nicht
16# ueberschreiben
17[[-z $MUDLIB]] && MUDLIB="../mudlib"
Deaddy75831672018-12-28 11:23:24 +010018LOGS="${CHECKERHOME}/logs"
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +010019
20LEVEL1="change_required"
21LEVEL2="formatting"
22LEVEL5="please_check"
23LEVEL10="cosmetics"
24
Deaddyb2545fa2019-01-02 11:53:50 +010025CHECKTMP=$(mktemp --suffix=lpccheck) || exit
26CHECKTMP2=$(mktemp --suffix=lpccheck) || exit
27
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +010028echo -ne "LPC-Source Checker V0.3 (2008-01-09)\n\n"
29
30usage() {
31 echo -ne "usage: ./check <region> <logfile>\n"
32 exit
33}
34
35# Parameter pruefen, ansonsten usage ausgeben
36if [ -z ${1} ] || [ -z ${2} ]
37then
Deaddyb2545fa2019-01-02 11:53:50 +010038 usage
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +010039fi
40
41# gucken ob das Logverzeichnis da ist, wenn nein, dann anlegen
42if [ ! -d ${LOGS} ]
43then
Deaddyb2545fa2019-01-02 11:53:50 +010044 mkdir -p ${LOGS}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +010045fi
46
47# rudimentaerer check ob die Mudlib da liegt, wo ${MUDLIB} hinzeigt
48if [ ! -d ${MUDLIB} ]
49then
Deaddyb2545fa2019-01-02 11:53:50 +010050 echo -ne "No mudlib found in ${MUDLIB}\n"
51 exit
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +010052fi
53
54# alten Kram entsorgen
55if [ -f ${CODEFILES} ]
56then
Deaddyb2545fa2019-01-02 11:53:50 +010057 rm ${CODEFILES}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +010058fi
59
60if [ -f ${HEADERFILES} ]
61then
Deaddyb2545fa2019-01-02 11:53:50 +010062 rm ${HEADERFILES}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +010063fi
64
65if [ -f ${LPCFILES} ]
66then
Deaddyb2545fa2019-01-02 11:53:50 +010067 rm ${LPCFILES}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +010068fi
69
70echo -ne "Checking the MorgenGrauen Mudlib in ${MUDLIB}\n"
71echo -ne "Checking in ${1} (${MUDLIB}${1})\n"
72
73cd ${MUDLIB}
74
75# Dateiliste erstellen
76echo -ne "Creating file list...\n"
77
78find ./${1} -type f -name "*.c" -print > ${CODEFILES}
79find ./${1} -type f -name "*.h" -print > ${HEADERFILES}
80
81# irgendwie unschoen
82cat ${CODEFILES} ${HEADERFILES} > ${LPCFILES}
83
84# eigentlich haette man das alles in einem abfackeln koennen, aber dann gaebe
85# es keine Ueberschriften ueber den einzelnen Punkten
86
87# LEVEL 1 CHECKS (change required)
88
89# Umlaute
90echo -ne "\n\nPruefe auf Umlaute...\n" | tee -a ${LOGS}/${2}.${LEVEL1}
91while read line
92do
Deaddyb2545fa2019-01-02 11:53:50 +010093 grep -Hn '[üöäÜÖÄß]' $line | cut -d : -f 1-2 >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +010094done < ${LPCFILES}
95
96# lambda()
97echo -ne "\n\nPruefe auf lambda()...\n" | tee -a ${LOGS}/${2}.${LEVEL1}
98while read line
99do
Deaddyb2545fa2019-01-02 11:53:50 +0100100 grep -Hn 'lambda(' $line| cut -d : -f 1-2 >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100101done < ${LPCFILES}
102
103# Pfade in /players/
104echo -ne "\n\nPruefe auf Pfade in /players/...\n" | tee -a ${LOGS}/${2}.${LEVEL1}
105while read line
106do
Deaddyb2545fa2019-01-02 11:53:50 +0100107 grep -Hn '/players/' $line| cut -d : -f 1-2 >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100108done < ${LPCFILES}
109
110# fehlende #pragma strong_types/strict_types
111echo -ne "\n\nFiles ohne #pragma strong_types oder strict_types...\n" | tee -a ${LOGS}/${2}.${LEVEL1}
112while read line
113do
Deaddyb2545fa2019-01-02 11:53:50 +0100114 grep -L '#pragma.\(strong\|strict\)_types' $line | sort \
115 >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100116done < ${CODEFILES}
117
118# direkte Verwendung von do_damage()
119echo -ne "\n\nPruefe auf direkte Verwendung von do_damage()...\n" |\
Deaddyb2545fa2019-01-02 11:53:50 +0100120 tee -a ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100121while read line
122do
Deaddyb2545fa2019-01-02 11:53:50 +0100123 grep -Hn 'do_damage(' $line | cut -d : -f 1-2 >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100124done < ${LPCFILES}
125
126# Unerwuenschte oder obsolete lfuns
127echo -ne "\n\nPruefe auf unerwuenschte oder obsolete lfuns...\n" |\
Deaddyb2545fa2019-01-02 11:53:50 +0100128 tee -a ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100129while read line
130do
Deaddyb2545fa2019-01-02 11:53:50 +0100131 grep -Hn -f ${CHECKERLIB}/bad_lfun.list $line >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100132done < ${LPCFILES}
133
134# Unerwuenschte oder obsolete efuns
135echo -ne "\n\nPruefe auf unerwuenschte oder obsolete efuns...\n" |\
Deaddyb2545fa2019-01-02 11:53:50 +0100136 tee -a ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100137while read line
138do
Deaddyb2545fa2019-01-02 11:53:50 +0100139 grep -Hn -f ${CHECKERLIB}/bad_efun.list $line >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100140done < ${LPCFILES}
141
142# Unerwuenschte oder obsolete Properties
143echo -ne "\n\nPruefe auf unerwuenschte oder obsolete Properties...\n" |\
Deaddyb2545fa2019-01-02 11:53:50 +0100144 tee -a ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100145while read line
146do
Deaddyb2545fa2019-01-02 11:53:50 +0100147 grep -Hn -f ${CHECKERLIB}/bad_prop.list $line >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100148done < ${LPCFILES}
149
150# Unerwuenschte Events
151echo -ne "\n\nPruefe auf unerwuenschte Eventnamen...\n" | tee -a ${LOGS}/${2}.${LEVEL1}
152while read line
153do
Deaddyb2545fa2019-01-02 11:53:50 +0100154 grep -Hn -f ${CHECKERLIB}/bad_events.list $line >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100155done < ${LPCFILES}
156
157# Keine clones von /std/thing
158echo -ne "\n\nPruefe auf Clones von /std/thing...\n" |\
Deaddyb2545fa2019-01-02 11:53:50 +0100159 tee -a ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100160while read line
161do
Deaddyb2545fa2019-01-02 11:53:50 +0100162 grep -Hn 'clone_object(.*/std/thing.*)' $line | cut -d : -f 1-2 \
163 >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100164done < ${LPCFILES}
165
166# ueberschriebenes move()
167echo -ne "\n\nPruefe auf ueberschriebenes move() (deprecated)...\n" |\
Deaddyb2545fa2019-01-02 11:53:50 +0100168 tee -a ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100169while read line
170do
Deaddyb2545fa2019-01-02 11:53:50 +0100171 grep -Hn 'int.*move(.*mixed.*int.*)' $line | cut -d : -f 1-2 \
172 >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100173done < ${LPCFILES}
174
175# wird geerbtes PreventMove gerufen?
176echo -ne "\n\nUeberschriebenes PreventMove() ohne geerbetes zu rufen...\n" |\
Deaddyb2545fa2019-01-02 11:53:50 +0100177 tee -a ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100178while read line
179do
Deaddyb2545fa2019-01-02 11:53:50 +0100180 grep 'PreventMove(.*object.*object.*int.*)' $line > $CHECKTMP
181 grep -L '::PreventMove(' $line > $CHECKTMP2
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100182done < ${LPCFILES}
183# nur Zeilen ausgeben, die nicht im 2. File vorkommen
Deaddyb2545fa2019-01-02 11:53:50 +0100184grep -v -f $CHECKTMP2 $CHECKTMP | \
185 tee -a ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100186
Bugfixac979c42018-04-09 16:51:42 +0200187echo -ne "\n\nUeberschriebenes init() ohne geerbtes zu rufen...\n" |\
Deaddyb2545fa2019-01-02 11:53:50 +0100188 tee -a ${LOGS}/${2}.${LEVEL1}
Bugfixac979c42018-04-09 16:51:42 +0200189while read line
190do
Deaddyb2545fa2019-01-02 11:53:50 +0100191 grep 'init(\(object.*\)\?)' $line > $CHECKTMP
192 grep -L '::init(' $line > $CHECKTMP2
Bugfixac979c42018-04-09 16:51:42 +0200193done < ${LPCFILES}
Deaddyb2545fa2019-01-02 11:53:50 +0100194grep -v -f $CHECKTMP2 $CHECKTMP \
195 >> ${LOGS}/${2}.${LEVEL1}
Bugfixac979c42018-04-09 16:51:42 +0200196
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100197echo -ne "\n\nUeberschriebenes NotifyMove() ohne geerbetes zu rufen...\n" |\
Deaddyb2545fa2019-01-02 11:53:50 +0100198 tee -a ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100199while read line
200do
Deaddyb2545fa2019-01-02 11:53:50 +0100201 grep 'NotifyMove(.*object.*object.*int.*)' $line > $CHECKTMP
202 grep -L '::NotifyMove(' $line > $CHECKTMP2
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100203done < ${LPCFILES}
Deaddyb2545fa2019-01-02 11:53:50 +0100204grep -v -f $CHECKTMP2 $CHECKTMP \
205 >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100206
207# call_other(x, "???") ist obsolet
208echo -ne "\n\nPruefe auf call_other(x, "???") (obsolet)...\n" |\
Deaddyb2545fa2019-01-02 11:53:50 +0100209 tee -a ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100210while read line
211do
Deaddyb2545fa2019-01-02 11:53:50 +0100212 grep -Hn 'call_other(.*???.*)' $line | cut -d : -f 1-2 \
213 >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100214done < ${LPCFILES}
215
216# Alte Syntax der Inline-Closures
217echo -ne "\n\nPruefe auf obsolete Inline-Closures ( (: :) )...\n" | \
Deaddyb2545fa2019-01-02 11:53:50 +0100218 tee -a ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100219while read line
220do
Deaddyb2545fa2019-01-02 11:53:50 +0100221 grep -Hn '(: ' $line | cut -d : -f 1-2 \
222 >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100223done < ${LPCFILES}
224
225# LEVEL 2 CHECKS
226# Tabulatoren
227echo -ne "\n\nPruefe auf Tabulatoren...\n" | tee -a ${LOGS}/${2}.${LEVEL2}
228while read line
229do
Deaddyb2545fa2019-01-02 11:53:50 +0100230 grep -Hn $'\t' $line | cut -d : -f 1-2 >> ${LOGS}/${2}.${LEVEL2}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100231done < ${LPCFILES}
232
233# Zeilen > 78 Zeichen
234echo -ne "\n\nPruefe auf Zeilen > 78 Zeichen...\n" | tee -a ${LOGS}/${2}.${LEVEL2}
235while read line
236do
Deaddyb2545fa2019-01-02 11:53:50 +0100237 grep -Hn '.\{79,\}' $line| cut -d : -f 1-2 >> ${LOGS}/${2}.${LEVEL2}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100238done < ${LPCFILES}
239
240# LEVEL 5 CHECKS
241# Header mit #pragmas
242echo -ne "\n\nHeader (*.h) mit #pragmas...\n" | tee -a ${LOGS}/${2}.${LEVEL5}
243while read line
244do
Deaddyb2545fa2019-01-02 11:53:50 +0100245 grep -l '#pragma' $line >> ${LOGS}/${2}.${LEVEL5}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100246done < ${HEADERFILES}
247
248# efuns, Verwendung beachten
249echo -ne "\n\nPruefe auf efuns, deren Verwendung beobachtet werden sollte...\n" |\
Deaddyb2545fa2019-01-02 11:53:50 +0100250 tee -a ${LOGS}/${2}.${LEVEL5}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100251while read line
252do
Deaddyb2545fa2019-01-02 11:53:50 +0100253 grep -Hn -f ${CHECKERLIB}/warn_efun.list $line \
254 >> ${LOGS}/${2}.${LEVEL5}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100255done < ${LPCFILES}
256
257# Properties, Verwendung beachten
258echo -ne "\n\nPruefe auf Properties, deren Verwendung beobachtet werden
259sollte...\n" | tee -a ${LOGS}/${2}.${LEVEL5}
260while read line
261do
Deaddyb2545fa2019-01-02 11:53:50 +0100262 grep -EHn -f ${CHECKERLIB}/warn_prop.list $line \
263 >> ${LOGS}/${2}.${LEVEL5}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100264done < ${LPCFILES}
Deaddyb2545fa2019-01-02 11:53:50 +0100265
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100266# Pruefung auf static -> protected
267echo -ne "\n\nPruefe auf 'static' (-> 'protected')...\n" |\
Deaddyb2545fa2019-01-02 11:53:50 +0100268 tee -a ${LOGS}/${2}.${LEVEL5}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100269while read line
270do
Deaddyb2545fa2019-01-02 11:53:50 +0100271 grep -Hn 'static' $line >> ${LOGS}/${2}.${LEVEL5}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100272done < ${LPCFILES}
273
274
275# LEVEL 10 CHECKS
276# Alte Rechtschreibung rules
277echo -ne "\n\nKleingeschriebenes Du/Dir/Dich...\n" |\
Deaddyb2545fa2019-01-02 11:53:50 +0100278 tee -a ${LOGS}/${2}.${LEVEL10}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100279while read line
280do
Deaddyb2545fa2019-01-02 11:53:50 +0100281 grep -Hn ' \(du\|dich\|dir\) ' $line | cut -d : -f 1-2 | sort | \
282 uniq >> ${LOGS}/${2}.${LEVEL10}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100283done < ${LPCFILES}
284
285# Pfadnamen bereinigen
286sed -i -e 's#.//#/#g' ${LOGS}/${2}.*
287
288echo -ne "\nCheck finished!\n"
Deaddyb2545fa2019-01-02 11:53:50 +0100289
290# cleanup
291rm $CHECKTMP
292rm $CHECKTMP2