78 lines
2.1 KiB
Bash
Executable File
78 lines
2.1 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Processes input text and outputs commands to be executed as a result
|
|
#
|
|
# This script does not actually execute the commands or further validate them.
|
|
#
|
|
# Copyright (C) 2011 Mike Gerwitz
|
|
#
|
|
# This file is part of gsgp. 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 your option) any later version.
|
|
#
|
|
# 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/>.
|
|
##
|
|
|
|
words="$1"
|
|
max_words=2
|
|
scene=$( cat - )
|
|
|
|
# scene data should be provided via stdin
|
|
[ "$scene" ] || {
|
|
echo "No scene data provided" >&2
|
|
exit 1
|
|
}
|
|
|
|
# our processing method depends heavily on the word count
|
|
count=$( grep -o '\w\+' <<< "$words" | wc -l )
|
|
|
|
# the action is every word except the last, and the object being acted upon is
|
|
# the final word
|
|
action=$( sed 's/^\(.\+\) .\+$/\1/' <<< "$words" )
|
|
object=$( grep -o '[^ ]\+$' <<< "$words" )
|
|
|
|
# if only one word was given, then we need to ask what to do
|
|
if [ "$count" -eq 1 ]; then
|
|
# is it a known object?
|
|
grep -q "^OBJECT $action" <<< "$scene" && {
|
|
echo "MSG What about $action?"
|
|
exit 2
|
|
}
|
|
|
|
# otherwise, we have no idea what the user is babbling about
|
|
echo "MSG Please elaborate."
|
|
exit 2
|
|
fi
|
|
|
|
# check for am action on a known object and output the associated commands, left
|
|
# trimmed
|
|
awk "
|
|
/^OBJECT $object$/ {
|
|
found = 1
|
|
getline
|
|
}
|
|
found && /^[ \\t]*$|^[A-Z]/ {
|
|
found = 0
|
|
}
|
|
|
|
/^( |\\t)ACTION $action$/ {
|
|
if ( found ) {
|
|
getline
|
|
|
|
while ( !/^( |\\t)[^ \\t]|^$/ ) {
|
|
print
|
|
getline
|
|
}
|
|
}
|
|
}
|
|
" <<< "$scene" \
|
|
| sed 's/^[ \t]\+//'
|
|
|