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