blob: b09f7d99f7f96288527fe7b1e00517bca5ba4bf2 [file] [log] [blame]
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +01001#!/bin/bash
2
Deaddy75831672018-12-28 11:23:24 +01003CHECKERHOME=$(pwd)
4CHECKERLIB=$(dirname $(readlink -e $0))
5# auf Mac muss man ggf. $CHECKERLIB manuell zu dem Ordner setzen, in dem die
6# Listen der zu testenden Funktionen liegen, wenn man noch irgendwie mit
7# symlinks rumfummelt, weil Mac das nicht standardkompliant kann. ;-)
8CODEFILES="${CHECKERHOME}/CODEFILES"
9HEADERFILES="${CHECKERHOME}/HEADERFILES"
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +010010#export LPCFILES="${HEADERFILES} ${CODEFILES}"
Deaddy75831672018-12-28 11:23:24 +010011LPCFILES="${CHECKERHOME}/LPCFILES"
12MUDLIB="../mudlib"
13LOGS="${CHECKERHOME}/logs"
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +010014
15LEVEL1="change_required"
16LEVEL2="formatting"
17LEVEL5="please_check"
18LEVEL10="cosmetics"
19
20echo -ne "LPC-Source Checker V0.3 (2008-01-09)\n\n"
21
22usage() {
23 echo -ne "usage: ./check <region> <logfile>\n"
24 exit
25}
26
27# Parameter pruefen, ansonsten usage ausgeben
28if [ -z ${1} ] || [ -z ${2} ]
29then
30 usage
31fi
32
33# gucken ob das Logverzeichnis da ist, wenn nein, dann anlegen
34if [ ! -d ${LOGS} ]
35then
36 mkdir -p ${LOGS}
37fi
38
39# rudimentaerer check ob die Mudlib da liegt, wo ${MUDLIB} hinzeigt
40if [ ! -d ${MUDLIB} ]
41then
42 echo -ne "No mudlib found in ${MUDLIB}\n"
43 exit
44fi
45
46# alten Kram entsorgen
47if [ -f ${CODEFILES} ]
48then
49 rm ${CODEFILES}
50fi
51
52if [ -f ${HEADERFILES} ]
53then
54 rm ${HEADERFILES}
55fi
56
57if [ -f ${LPCFILES} ]
58then
59 rm ${LPCFILES}
60fi
61
62echo -ne "Checking the MorgenGrauen Mudlib in ${MUDLIB}\n"
63echo -ne "Checking in ${1} (${MUDLIB}${1})\n"
64
65cd ${MUDLIB}
66
67# Dateiliste erstellen
68echo -ne "Creating file list...\n"
69
70find ./${1} -type f -name "*.c" -print > ${CODEFILES}
71find ./${1} -type f -name "*.h" -print > ${HEADERFILES}
72
73# irgendwie unschoen
74cat ${CODEFILES} ${HEADERFILES} > ${LPCFILES}
75
76# eigentlich haette man das alles in einem abfackeln koennen, aber dann gaebe
77# es keine Ueberschriften ueber den einzelnen Punkten
78
79# LEVEL 1 CHECKS (change required)
80
81# Umlaute
82echo -ne "\n\nPruefe auf Umlaute...\n" | tee -a ${LOGS}/${2}.${LEVEL1}
83while read line
84do
85 grep -Hn '[üöäÜÖÄß]' $line | cut -d : -f 1-2 >> ${LOGS}/${2}.${LEVEL1}
86done < ${LPCFILES}
87
88# lambda()
89echo -ne "\n\nPruefe auf lambda()...\n" | tee -a ${LOGS}/${2}.${LEVEL1}
90while read line
91do
92 grep -Hn 'lambda(' $line| cut -d : -f 1-2 >> ${LOGS}/${2}.${LEVEL1}
93done < ${LPCFILES}
94
95# Pfade in /players/
96echo -ne "\n\nPruefe auf Pfade in /players/...\n" | tee -a ${LOGS}/${2}.${LEVEL1}
97while read line
98do
99 grep -Hn '/players/' $line| cut -d : -f 1-2 >> ${LOGS}/${2}.${LEVEL1}
100done < ${LPCFILES}
101
102# fehlende #pragma strong_types/strict_types
103echo -ne "\n\nFiles ohne #pragma strong_types oder strict_types...\n" | tee -a ${LOGS}/${2}.${LEVEL1}
104while read line
105do
106 grep -L '#pragma.\(strong\|strict\)_types' $line | sort \
107 >> ${LOGS}/${2}.${LEVEL1}
108done < ${CODEFILES}
109
110# direkte Verwendung von do_damage()
111echo -ne "\n\nPruefe auf direkte Verwendung von do_damage()...\n" |\
112 tee -a ${LOGS}/${2}.${LEVEL1}
113while read line
114do
115 grep -Hn 'do_damage(' $line | cut -d : -f 1-2 >> ${LOGS}/${2}.${LEVEL1}
116done < ${LPCFILES}
117
118# Unerwuenschte oder obsolete lfuns
119echo -ne "\n\nPruefe auf unerwuenschte oder obsolete lfuns...\n" |\
120 tee -a ${LOGS}/${2}.${LEVEL1}
121while read line
122do
Deaddy75831672018-12-28 11:23:24 +0100123 grep -Hn -f ${CHECKERLIB}/bad_lfun.list $line >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100124done < ${LPCFILES}
125
126# Unerwuenschte oder obsolete efuns
127echo -ne "\n\nPruefe auf unerwuenschte oder obsolete efuns...\n" |\
128 tee -a ${LOGS}/${2}.${LEVEL1}
129while read line
130do
Deaddy75831672018-12-28 11:23:24 +0100131 grep -Hn -f ${CHECKERLIB}/bad_efun.list $line >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100132done < ${LPCFILES}
133
134# Unerwuenschte oder obsolete Properties
135echo -ne "\n\nPruefe auf unerwuenschte oder obsolete Properties...\n" |\
136 tee -a ${LOGS}/${2}.${LEVEL1}
137while read line
138do
Deaddy75831672018-12-28 11:23:24 +0100139 grep -Hn -f ${CHECKERLIB}/bad_prop.list $line >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100140done < ${LPCFILES}
141
142# Unerwuenschte Events
143echo -ne "\n\nPruefe auf unerwuenschte Eventnamen...\n" | tee -a ${LOGS}/${2}.${LEVEL1}
144while read line
145do
Deaddy75831672018-12-28 11:23:24 +0100146 grep -Hn -f ${CHECKERLIB}/bad_events.list $line >> ${LOGS}/${2}.${LEVEL1}
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100147done < ${LPCFILES}
148
149# Keine clones von /std/thing
150echo -ne "\n\nPruefe auf Clones von /std/thing...\n" |\
151 tee -a ${LOGS}/${2}.${LEVEL1}
152while read line
153do
154 grep -Hn 'clone_object(.*/std/thing.*)' $line | cut -d : -f 1-2 \
155 >> ${LOGS}/${2}.${LEVEL1}
156done < ${LPCFILES}
157
158# ueberschriebenes move()
159echo -ne "\n\nPruefe auf ueberschriebenes move() (deprecated)...\n" |\
160 tee -a ${LOGS}/${2}.${LEVEL1}
161while read line
162do
163 grep -Hn 'int.*move(.*mixed.*int.*)' $line | cut -d : -f 1-2 \
164 >> ${LOGS}/${2}.${LEVEL1}
165done < ${LPCFILES}
166
167# wird geerbtes PreventMove gerufen?
168echo -ne "\n\nUeberschriebenes PreventMove() ohne geerbetes zu rufen...\n" |\
169 tee -a ${LOGS}/${2}.${LEVEL1}
170while read line
171do
Bugfix9225de22018-04-09 17:01:57 +0200172 grep 'PreventMove(.*object.*object.*int.*)' $line > ${CHECKERHOME}/check.tmp
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100173 grep -L '::PreventMove(' $line > ${CHECKERHOME}/check.tmp2
174done < ${LPCFILES}
175# nur Zeilen ausgeben, die nicht im 2. File vorkommen
176grep -v -f ${CHECKERHOME}/check.tmp2 ${CHECKERHOME}/check.tmp | \
177 tee -a ${LOGS}/${2}.${LEVEL1}
178rm ${CHECKERHOME}/check.tmp*
179
Bugfixac979c42018-04-09 16:51:42 +0200180echo -ne "\n\nUeberschriebenes init() ohne geerbtes zu rufen...\n" |\
181 tee -a ${LOGS}/${2}.${LEVEL1}
182while read line
183do
184 grep 'init(\(object.*\)\?)' $line > ${CHECKERHOME}/check.tmp
185 grep -L '::init(' $line > ${CHECKERHOME}/check.tmp2
186done < ${LPCFILES}
187grep -v -f ${CHECKERHOME}/check.tmp2 ${CHECKERHOME}/check.tmp \
188 >> ${LOGS}/${2}.${LEVEL1}
189rm ${CHECKERHOME}/check.tmp*
190
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100191echo -ne "\n\nUeberschriebenes NotifyMove() ohne geerbetes zu rufen...\n" |\
192 tee -a ${LOGS}/${2}.${LEVEL1}
193while read line
194do
Bugfix9225de22018-04-09 17:01:57 +0200195 grep 'NotifyMove(.*object.*object.*int.*)' $line > ${CHECKERHOME}/check.tmp
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100196 grep -L '::NotifyMove(' $line > ${CHECKERHOME}/check.tmp2
197done < ${LPCFILES}
198grep -v -f ${CHECKERHOME}/check.tmp2 ${CHECKERHOME}/check.tmp \
199 >> ${LOGS}/${2}.${LEVEL1}
200rm ${CHECKERHOME}/check.tmp*
201
202# call_other(x, "???") ist obsolet
203echo -ne "\n\nPruefe auf call_other(x, "???") (obsolet)...\n" |\
204 tee -a ${LOGS}/${2}.${LEVEL1}
205while read line
206do
207 grep -Hn 'call_other(.*???.*)' $line | cut -d : -f 1-2 \
208 >> ${LOGS}/${2}.${LEVEL1}
209done < ${LPCFILES}
210
211# Alte Syntax der Inline-Closures
212echo -ne "\n\nPruefe auf obsolete Inline-Closures ( (: :) )...\n" | \
213 tee -a ${LOGS}/${2}.${LEVEL1}
214while read line
215do
216 grep -Hn '(: ' $line | cut -d : -f 1-2 \
217 >> ${LOGS}/${2}.${LEVEL1}
218done < ${LPCFILES}
219
220# LEVEL 2 CHECKS
221# Tabulatoren
222echo -ne "\n\nPruefe auf Tabulatoren...\n" | tee -a ${LOGS}/${2}.${LEVEL2}
223while read line
224do
225 grep -Hn $'\t' $line | cut -d : -f 1-2 >> ${LOGS}/${2}.${LEVEL2}
226done < ${LPCFILES}
227
228# Zeilen > 78 Zeichen
229echo -ne "\n\nPruefe auf Zeilen > 78 Zeichen...\n" | tee -a ${LOGS}/${2}.${LEVEL2}
230while read line
231do
232 grep -Hn '.\{79,\}' $line| cut -d : -f 1-2 >> ${LOGS}/${2}.${LEVEL2}
233done < ${LPCFILES}
234
235# LEVEL 5 CHECKS
236# Header mit #pragmas
237echo -ne "\n\nHeader (*.h) mit #pragmas...\n" | tee -a ${LOGS}/${2}.${LEVEL5}
238while read line
239do
240 grep -l '#pragma' $line >> ${LOGS}/${2}.${LEVEL5}
241done < ${HEADERFILES}
242
243# efuns, Verwendung beachten
244echo -ne "\n\nPruefe auf efuns, deren Verwendung beobachtet werden sollte...\n" |\
245 tee -a ${LOGS}/${2}.${LEVEL5}
246while read line
247do
Deaddy75831672018-12-28 11:23:24 +0100248 grep -Hn -f ${CHECKERLIB}/warn_efun.list $line \
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100249 >> ${LOGS}/${2}.${LEVEL5}
250done < ${LPCFILES}
251
252# Properties, Verwendung beachten
253echo -ne "\n\nPruefe auf Properties, deren Verwendung beobachtet werden
254sollte...\n" | tee -a ${LOGS}/${2}.${LEVEL5}
255while read line
256do
Deaddy75831672018-12-28 11:23:24 +0100257 grep -EHn -f ${CHECKERLIB}/warn_prop.list $line \
Zesstra@Morgengrauen38e73d82016-02-02 22:24:24 +0100258 >> ${LOGS}/${2}.${LEVEL5}
259done < ${LPCFILES}
260
261# Pruefung auf static -> protected
262echo -ne "\n\nPruefe auf 'static' (-> 'protected')...\n" |\
263 tee -a ${LOGS}/${2}.${LEVEL5}
264while read line
265do
266 grep -Hn 'static' $line >> ${LOGS}/${2}.${LEVEL5}
267done < ${LPCFILES}
268
269
270# LEVEL 10 CHECKS
271# Alte Rechtschreibung rules
272echo -ne "\n\nKleingeschriebenes Du/Dir/Dich...\n" |\
273 tee -a ${LOGS}/${2}.${LEVEL10}
274while read line
275do
276 grep -Hn ' \(du\|dich\|dir\) ' $line | cut -d : -f 1-2 | sort | \
277 uniq >> ${LOGS}/${2}.${LEVEL10}
278done < ${LPCFILES}
279
280# Pfadnamen bereinigen
281sed -i -e 's#.//#/#g' ${LOGS}/${2}.*
282
283echo -ne "\nCheck finished!\n"