#!/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 # # 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 -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 } } } " <<< "$data" \ | sed 's/^[ \t]\+//' ) # 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" ) case "$cmd" in GO) if [ ! "$arg" ]; then echo "ERROR: GO command requires target scene" >&2 exit 4 fi # the action will be to go to the target scene echo "GO $arg" ;; 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" ;; *) echo "ERROR: Unknown command '$cmd' for action: $words" >&2 exit 4 ;; esac