gsgp/util/process-input

105 lines
2.7 KiB
Plaintext
Raw Normal View History

2011-08-24 00:58:18 -04:00
#!/bin/bash
#
# Processes input text and outputs result
#
# This script will return one of two commands with an associated argument, which
# should be interpreted as follows:
# - MSG - Output the provided message
# - GO - Go to the scene matching the provided id
#
2011-08-24 00:58:18 -04:00
# 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 -d' ' -f2 <<< "$words" )
# check for am action on a known object
action_data=$( awk "
/OBJECT $object/,/^$/ {
found = 1
}
/^( |\\t)ACTION $action$/ {
if ( found ) {
getline
while ( !/^( |\\t)[^ \\t]|^$/ ) {
print
getline
}
2011-08-24 00:58:18 -04:00
}
}
" <<< "$data" \
| sed 's/^[ \t]\+//'
2011-08-24 00:58:18 -04:00
)
# if we were unable to find the associated object/action, then let the user know
# that they've performed an invalid action
if [ ! "$action_data" ]; then
echo "MSG Cannot $words"
exit 0
fi
# what type of command should we execute?
cmd=$( cut -d' ' -f1 <<< "$action_data" )
arg=$( cut -s -d' ' -f2- <<< "$action_data" )
2011-08-24 00:58:18 -04:00
case "$cmd" in
GO)
if [ ! "$arg" ]; then
2011-08-24 00:58:18 -04:00
echo "ERROR: GO command requires target scene" >&2
exit 4
fi
# the action will be to go to the target scene
echo "GO $arg"
2011-08-24 00:58:18 -04:00
;;
MSG)
if [ ! "$arg" ]; then
echo "ERROR: MSG requires an output string" >&2
exit 4
fi
# the MSG action will indicate that a message should be output
echo "MSG $arg"
;;
2011-08-24 00:58:18 -04:00
*)
echo "ERROR: Unknown command '$cmd' for action: $words" >&2
exit 4
;;
esac