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