comparison interps/cfunge/cfunge-src/tools/gen_fingerprint.sh @ 996:859f9b4339e6

<Gregor> tar xf egobot.tar.xz
author HackBot
date Sun, 09 Dec 2012 19:30:08 +0000
parents
children
comparison
equal deleted inserted replaced
995:6883f5911eb7 996:859f9b4339e6
1 #!/usr/bin/env bash
2 # -*- coding: utf-8 -*-
3 ###########################################################################
4 # #
5 # cfunge - A standard-conforming Befunge93/98/109 interpreter in C. #
6 # Copyright (C) 2008-2009 Arvid Norlander #
7 # #
8 # This program is free software: you can redistribute it and/or modify #
9 # it under the terms of the GNU General Public License as published by #
10 # the Free Software Foundation, either version 3 of the License, or #
11 # (at the proxy's option) any later version. Arvid Norlander is a #
12 # proxy who can decide which future versions of the GNU General Public #
13 # License can be used. #
14 # #
15 # This program is distributed in the hope that it will be useful, #
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
18 # GNU General Public License for more details. #
19 # #
20 # You should have received a copy of the GNU General Public License #
21 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
22 # #
23 ###########################################################################
24
25 # Generate a fingerprint template.
26 # This must be run from top source directory.
27
28 # Error to fail with for old bash.
29 fail_old_bash() {
30 echo "Sorry your bash version is too old!"
31 echo "You need at least version 3.2.10 of bash"
32 echo "Please install a newer version:"
33 echo " * Either use your distro's packages"
34 echo " * Or see http://www.gnu.org/software/bash/"
35 exit 2
36 }
37
38 # Check bash version. We need at least 3.2.10
39 # Lets not use anything like =~ here because
40 # that may not work on old bash versions.
41 if [[ "${BASH_VERSINFO[0]}${BASH_VERSINFO[1]}" -lt 32 ]]; then
42 fail_old_bash
43 elif [[ "${BASH_VERSINFO[0]}${BASH_VERSINFO[1]}" -eq 32 && "${BASH_VERSINFO[2]}" -lt 10 ]]; then
44 fail_old_bash
45 fi
46
47 if [[ ! -d src/fingerprints ]]; then
48 echo "ERROR: Run from top source directory please." >&2
49 exit 1
50 fi
51
52 set -e
53
54 if [[ ! -f tools/fprint_funcs.sh ]]; then
55 echo "ERROR: Couldn't find tools/fprint_funcs.sh." >&2
56 exit 1
57 fi
58 source tools/fprint_funcs.sh
59 if [[ $? -ne 0 ]]; then
60 echo "ERROR: Couldn't load tools/fprint_funcs.sh." >&2
61 exit 1
62 fi
63
64 # Variables
65 FPRINT=""
66 fp_URL=""
67 fp_SAFE=""
68 fp_CONDITION=""
69 fp_OPCODES=""
70 fp_DESCRIPTION=""
71
72 fp_OPCODES=""
73 fp_OPCODE_NAMES=()
74 fp_OPCODE_DESC=()
75
76 if [[ -z $1 ]]; then
77 echo "ERROR: Please provide finger print name!" >&2
78 echo "Usage: $0 FingerprintName opcodes" >&2
79 exit 1
80 else
81 FPRINT="$1"
82 fi
83
84 progress "Sanity checking parameters"
85 checkfprint "$FPRINT"
86
87 if [[ -e src/fingerprints/$FPRINT ]]; then
88 die "A fingerprint with that name already exists"
89 fi
90
91 progress "Looking for spec file"
92
93 if [[ -f "src/fingerprints/${FPRINT}.spec" ]]; then
94 status "Good, spec file found."
95 else
96 die "Sorry, but you need a spec file for the fingerprint." \
97 "Either you misspelled the parameter to this script, or you misspelled" \
98 "the spec file. Or you forgot to create a spec file." \
99 "If you didn't typo the name on the command line to this script then" \
100 "the spec file should be placed at src/fingerprints/${FPRINT}.spec"
101 fi
102
103 cd "src/fingerprints" || die "Couldn't change directory to src/fingerprints"
104
105 progress "Parsing spec file"
106 parse_spec "${FPRINT}"
107
108 addtoh() {
109 echo "$1" >> "${FPRINT}.h"
110 }
111 addtoc() {
112 echo "$1" >> "${FPRINT}.c"
113 }
114
115
116
117 progress "Creating directory"
118 mkdir "$FPRINT" || die "mkdir failed"
119 cd "$FPRINT" || die "cd to src/fingerprints/$FPRINT failed"
120
121 progress "Creating header file"
122 cat > "${FPRINT}.h" << EOF
123 /* -*- mode: C; coding: utf-8; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*-
124 *
125 * cfunge - A standard-conforming Befunge93/98/109 interpreter in C.
126 * Copyright (C) 2008-2009 Arvid Norlander <anmaster AT tele2 DOT se>
127 *
128 * This program is free software: you can redistribute it and/or modify
129 * it under the terms of the GNU General Public License as published by
130 * the Free Software Foundation, either version 3 of the License, or
131 * (at the proxy's option) any later version. Arvid Norlander is a
132 * proxy who can decide which future versions of the GNU General Public
133 * License can be used.
134 *
135 * This program is distributed in the hope that it will be useful,
136 * but WITHOUT ANY WARRANTY; without even the implied warranty of
137 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
138 * GNU General Public License for more details.
139 *
140 * You should have received a copy of the GNU General Public License
141 * along with this program. If not, see <http://www.gnu.org/licenses/>.
142 */
143
144 EOF
145
146 addtoh "#ifndef FUNGE_HAD_SRC_FINGERPRINTS_${FPRINT}_H"
147 addtoh "#define FUNGE_HAD_SRC_FINGERPRINTS_${FPRINT}_H"
148
149
150 cat >> "${FPRINT}.h" << EOF
151
152 #include "../../global.h"
153 #include "../manager.h"
154
155 EOF
156
157 if [[ "$fp_CONDITION" ]]; then
158 addtoh "#if $fp_CONDITION"
159 fi
160
161 addtoh "bool finger_${FPRINT}_load(instructionPointer * ip);"
162
163 if [[ "$fp_CONDITION" ]]; then
164 addtoh "#endif /* $fp_CONDITION */"
165 fi
166
167 addtoh ""
168 addtoh "#endif"
169
170 ##############
171 # Now for .c #
172 ##############
173
174 progress "Creating source file"
175 cat > "${FPRINT}.c" << EOF
176 /* -*- mode: C; coding: utf-8; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*-
177 *
178 * cfunge - A standard-conforming Befunge93/98/109 interpreter in C.
179 * Copyright (C) 2008-2009 Arvid Norlander <anmaster AT tele2 DOT se>
180 *
181 * This program is free software: you can redistribute it and/or modify
182 * it under the terms of the GNU General Public License as published by
183 * the Free Software Foundation, either version 3 of the License, or
184 * (at the proxy's option) any later version. Arvid Norlander is a
185 * proxy who can decide which future versions of the GNU General Public
186 * License can be used.
187 *
188 * This program is distributed in the hope that it will be useful,
189 * but WITHOUT ANY WARRANTY; without even the implied warranty of
190 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
191 * GNU General Public License for more details.
192 *
193 * You should have received a copy of the GNU General Public License
194 * along with this program. If not, see <http://www.gnu.org/licenses/>.
195 */
196
197 EOF
198 addtoc "#include \"${FPRINT}.h\""
199
200 if [[ "$fp_CONDITION" ]]; then
201 addtoc "#if $fp_CONDITION"
202 fi
203
204 cat >> "${FPRINT}.c" << EOF
205 #include "../../stack.h"
206
207 // TODO: Add code to template functions
208
209 EOF
210
211 for (( i = 0; i < ${#fp_OPCODES}; i++ )); do
212 ord number "${fp_OPCODES:$i:1}"
213 addtoc "/// ${fp_OPCODES:$i:1} - ${fp_OPCODE_DESC[$number]}"
214 addtoc "static void finger_${FPRINT}_${fp_OPCODE_NAMES[$number]}(instructionPointer * ip)"
215 addtoc '{'
216 addtoc '}'
217 addtoc ''
218 done
219
220
221
222 addtoc "bool finger_${FPRINT}_load(instructionPointer * ip)"
223 addtoc '{'
224 for (( i = 0; i < ${#fp_OPCODES}; i++ )); do
225 ord number "${fp_OPCODES:$i:1}"
226 addtoc " manager_add_opcode(${FPRINT}, '${fp_OPCODES:$i:1}', ${fp_OPCODE_NAMES[$number]})"
227 done
228
229 cat >> "${FPRINT}.c" << EOF
230 return true;
231 }
232 EOF
233
234 if [[ "$fp_CONDITION" ]]; then
235 addtoc "#endif /* $fp_CONDITION */"
236 fi
237
238 status "File creation done"
239 echo
240 echo "To make cfunge aware of the new fingerprint run tools/gen_fprint_list.sh"
241 echo "You may need to run cmake or similar to make the build system aware as well."
242 echo
243 echo "All done! However make sure the copyright in the files is correct. Oh, and another thing: implement the fingerprint :)"