gsgp/util/process-input

83 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
data=$( cat - )
# scene data should be provided via stdin
[ "$data" ] || {
echo "No scene data provided" >&2
exit 1
}
# our processing method depends heavily on the word count
count=$( grep -o '\w\+' <<< "$words" | wc -l )
# no use in allowing more words than we're able to interpret
if [ $count -gt $max_words ]; then
echo "Too many words" >&2
exit 2
fi
action=$( cut -d' ' -f1 <<< "$words" )
object=$( cut -s -d' ' -f2 <<< "$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 "$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
}
}
}
" <<< "$data" \
| sed 's/^[ \t]\+//'