diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/cfunge/cfunge-src/tools/gen_fingerprint.sh	Sun Dec 09 19:30:08 2012 +0000
@@ -0,0 +1,243 @@
+#!/usr/bin/env bash
+# -*- coding: utf-8 -*-
+###########################################################################
+#                                                                         #
+#  cfunge - A standard-conforming Befunge93/98/109 interpreter in C.      #
+#  Copyright (C) 2008-2009  Arvid Norlander                               #
+#                                                                         #
+#  This program is free software: you can redistribute it and/or modify   #
+#  it under the terms of the GNU General Public License as published by   #
+#  the Free Software Foundation, either version 3 of the License, or      #
+#  (at the proxy's option) any later version. Arvid Norlander is a        #
+#  proxy who can decide which future versions of the GNU General Public   #
+#  License can be used.                                                   #
+#                                                                         #
+#  This program is distributed in the hope that it will be useful,        #
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of         #
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          #
+#  GNU General Public License for more details.                           #
+#                                                                         #
+#  You should have received a copy of the GNU General Public License      #
+#  along with this program.  If not, see <http://www.gnu.org/licenses/>.  #
+#                                                                         #
+###########################################################################
+
+# Generate a fingerprint template.
+# This must be run from top source directory.
+
+# Error to fail with for old bash.
+fail_old_bash() {
+	echo "Sorry your bash version is too old!"
+	echo "You need at least version 3.2.10 of bash"
+	echo "Please install a newer version:"
+	echo " * Either use your distro's packages"
+	echo " * Or see http://www.gnu.org/software/bash/"
+	exit 2
+}
+
+# Check bash version. We need at least 3.2.10
+# Lets not use anything like =~ here because
+# that may not work on old bash versions.
+if [[ "${BASH_VERSINFO[0]}${BASH_VERSINFO[1]}" -lt 32 ]]; then
+	fail_old_bash
+elif [[ "${BASH_VERSINFO[0]}${BASH_VERSINFO[1]}" -eq 32 && "${BASH_VERSINFO[2]}" -lt 10 ]]; then
+	fail_old_bash
+fi
+
+if [[ ! -d src/fingerprints ]]; then
+	echo "ERROR: Run from top source directory please." >&2
+	exit 1
+fi
+
+set -e
+
+if [[ ! -f tools/fprint_funcs.sh ]]; then
+	echo "ERROR: Couldn't find tools/fprint_funcs.sh." >&2
+	exit 1
+fi
+source tools/fprint_funcs.sh
+if [[ $? -ne 0 ]]; then
+	echo "ERROR: Couldn't load tools/fprint_funcs.sh." >&2
+	exit 1
+fi
+
+# Variables
+FPRINT=""
+fp_URL=""
+fp_SAFE=""
+fp_CONDITION=""
+fp_OPCODES=""
+fp_DESCRIPTION=""
+
+fp_OPCODES=""
+fp_OPCODE_NAMES=()
+fp_OPCODE_DESC=()
+
+if [[ -z $1 ]]; then
+	echo "ERROR: Please provide finger print name!" >&2
+	echo "Usage: $0 FingerprintName opcodes" >&2
+	exit 1
+else
+	FPRINT="$1"
+fi
+
+progress "Sanity checking parameters"
+checkfprint "$FPRINT"
+
+if [[ -e src/fingerprints/$FPRINT ]]; then
+	die "A fingerprint with that name already exists"
+fi
+
+progress "Looking for spec file"
+
+if [[ -f "src/fingerprints/${FPRINT}.spec" ]]; then
+	status "Good, spec file found."
+else
+	die "Sorry, but you need a spec file for the fingerprint." \
+	    "Either you misspelled the parameter to this script, or you misspelled" \
+	    "the spec file. Or you forgot to create a spec file." \
+	    "If you didn't typo the name on the command line to this script then" \
+	    "the spec file should be placed at src/fingerprints/${FPRINT}.spec"
+fi
+
+cd "src/fingerprints" || die "Couldn't change directory to src/fingerprints"
+
+progress "Parsing spec file"
+parse_spec "${FPRINT}"
+
+addtoh() {
+	echo "$1" >> "${FPRINT}.h"
+}
+addtoc() {
+	echo "$1" >> "${FPRINT}.c"
+}
+
+
+
+progress "Creating directory"
+mkdir "$FPRINT" || die "mkdir failed"
+cd "$FPRINT" || die "cd to src/fingerprints/$FPRINT failed"
+
+progress "Creating header file"
+cat > "${FPRINT}.h" << EOF
+/* -*- mode: C; coding: utf-8; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*-
+ *
+ * cfunge - A standard-conforming Befunge93/98/109 interpreter in C.
+ * Copyright (C) 2008-2009 Arvid Norlander <anmaster AT tele2 DOT se>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at the proxy's option) any later version. Arvid Norlander is a
+ * proxy who can decide which future versions of the GNU General Public
+ * License can be used.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+EOF
+
+addtoh "#ifndef FUNGE_HAD_SRC_FINGERPRINTS_${FPRINT}_H"
+addtoh "#define FUNGE_HAD_SRC_FINGERPRINTS_${FPRINT}_H"
+
+
+cat >> "${FPRINT}.h" << EOF
+
+#include "../../global.h"
+#include "../manager.h"
+
+EOF
+
+if [[ "$fp_CONDITION" ]]; then
+	addtoh "#if $fp_CONDITION"
+fi
+
+addtoh "bool finger_${FPRINT}_load(instructionPointer * ip);"
+
+if [[ "$fp_CONDITION" ]]; then
+	addtoh "#endif /* $fp_CONDITION */"
+fi
+
+addtoh ""
+addtoh "#endif"
+
+##############
+# Now for .c #
+##############
+
+progress "Creating source file"
+cat > "${FPRINT}.c" << EOF
+/* -*- mode: C; coding: utf-8; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*-
+ *
+ * cfunge - A standard-conforming Befunge93/98/109 interpreter in C.
+ * Copyright (C) 2008-2009 Arvid Norlander <anmaster AT tele2 DOT se>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at the proxy's option) any later version. Arvid Norlander is a
+ * proxy who can decide which future versions of the GNU General Public
+ * License can be used.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+EOF
+addtoc "#include \"${FPRINT}.h\""
+
+if [[ "$fp_CONDITION" ]]; then
+	addtoc "#if $fp_CONDITION"
+fi
+
+cat >> "${FPRINT}.c" << EOF
+#include "../../stack.h"
+
+// TODO: Add code to template functions
+
+EOF
+
+for (( i = 0; i < ${#fp_OPCODES}; i++ )); do
+	ord number "${fp_OPCODES:$i:1}"
+	addtoc "/// ${fp_OPCODES:$i:1} - ${fp_OPCODE_DESC[$number]}"
+	addtoc "static void finger_${FPRINT}_${fp_OPCODE_NAMES[$number]}(instructionPointer * ip)"
+	addtoc '{'
+	addtoc '}'
+	addtoc ''
+done
+
+
+
+addtoc "bool finger_${FPRINT}_load(instructionPointer * ip)"
+addtoc '{'
+for (( i = 0; i < ${#fp_OPCODES}; i++ )); do
+	ord number "${fp_OPCODES:$i:1}"
+	addtoc "	manager_add_opcode(${FPRINT}, '${fp_OPCODES:$i:1}', ${fp_OPCODE_NAMES[$number]})"
+done
+
+cat >> "${FPRINT}.c" << EOF
+	return true;
+}
+EOF
+
+if [[ "$fp_CONDITION" ]]; then
+	addtoc "#endif /* $fp_CONDITION */"
+fi
+
+status "File creation done"
+echo
+echo "To make cfunge aware of the new fingerprint run tools/gen_fprint_list.sh"
+echo "You may need to run cmake or similar to make the build system aware as well."
+echo
+echo "All done! However make sure the copyright in the files is correct. Oh, and another thing: implement the fingerprint :)"