summaryrefslogtreecommitdiffstats
path: root/noise
blob: 36c8618543b409fbaf7c98ded70020369b0885f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#! /bin/sh

noise_set() { # set a variable
  if test "x$1" = x ; then
    env | sed -rn '
      s/^noise_([[:alnum:]_]+)=(.*)$/\1 = \2/p
    ' | sort
  elif test "x$2" = x ; then
    eval "echo \"$1 = \$noise_$1\""
  else
    if echo "$1" | grep -q '[^[:alnum:]_]' ; then
      fail invalid variable name "$1"
      return 23
    fi
    eval "old=\"\$noise_$1\""
    if test "x$old" = "x$2" ; then
      eval "echo \"$1 is already $2\""
    elif test -z "$old" ; then
      eval "export noise_$1='$2' ; echo \
\"$1 set to $2\""
    else
      eval "export noise_$1='$2' ; echo \
\"$1 changed from $old to $2\""
    fi
  fi
}

noise_quit() { # exit
  echo "Good bye!"
  exit
}

fail() {
  echo "FAIL: $*"
  return 23
}

cleanup() {
  rm -f $linefeed
  kill $jobs
}


qname="`readlink -f "$0"`"
dirname="`dirname "$qname"`"
if test -d "$dirname/modules" ; then
  export NOISE_PATH="${NOISE_PATH+$NOISE_PATH:}$dirname/modules"
  export NOISE_PATH="${NOISE_PATH+$NOISE_PATH:}$HOME/noise/modules"
fi
linefeed="/tmp/noise-client-$$"
trap cleanup EXIT
mkfifo $linefeed
##
##
##
readline() {
  { read && echo $REPLY ; } | sed -rn "
    s/['\"]//g
    s:^/([a-z]+)([[:space:]]+(.*))?$:command=\1; args='\3';:p;t
    s@^([[:alnum:]_/+-]+):[[:space:]]*(.*)@command=lang; args='\1 \2';@p;t
    s@^\![[:space:]]*(.*)@command=play; args='\1';@p;t
    s:.*:command='$noise_default_command'; args='&';:p;t
  "
}
while echo "READY." && eval "`readline`" ; do
  #echo "command: $command; args: $args"
  ## modcall
  for dir in `echo "$NOISE_PATH" | tr : \ ` ; do
    module="$dir/$command"
    if test -x "$module" ; then
      shift
      NOISE="$0" NOISE_linefeed="$linefeed" "$module" $args
      continue 2
    fi
  done
  ## funcall
  if type noise_$command &>/dev/null ; then
    noise_$command $args
    continue
  fi
  ##
  fail unknown command "$command"
done <$linefeed &
jobs="${jobs+$jobs }`jobs -p`"
##
##
##
cat<<EOF
welcome to SHACK UTTERANCE version 0.9 beta 2
get help with /help
TIP: benutze rlwrap für eine elitäre Kommandozeile.
EOF
##
##
##
exec >>$linefeed
echo /set default_command espeak
while read ; do
  case $REPLY in
    (/quit) echo /quit ; exit ;; 
    (*) tr \; \\n | grep . ;;
  esac<<EOF
$REPLY
EOF
done
#### end of file.