#!/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 . ## 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]\+//'