blob: 9fc7e6e27d42a945224f1738ebcee3334eb4b84c (
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
#! /bin/sh
noise_set() { # set a variable
case "$1" in
(-q|--quiet) echo=: ; shift ;;
(*) echo=echo ;;
esac
case $# in
(0) ## print all noise variables
env | sed -rn '
s/^noise_([[:alnum:]_]+)=(.*)$/[35;4m\1[;35m = [32m\2[m/p
' | sort
;;
(1) ## print value the specified variable
eval "echo \"[35;4m$1[0;35m = [0;32m\$noise_$1[m\""
;;
(*) ## set the specified variable
if echo "$1" | grep -q '[^[:alnum:]_]' ; then
fail invalid variable name "[4m$1"
return 23
fi
eval "old=\"\$noise_$1\""
if test "x$old" = "x$2" ; then
eval "$echo \"[35;4m$1[0;35m is already [0;32m$2[m\""
elif test -z "$old" ; then
eval "export noise_$1='$2' ; $echo \
\"[35;4m$1[0;35m set to [0;32m$2[m\""
else
eval "export noise_$1='$2' ; $echo \
\"[35;4m$1[0;35m changed from $old to [0;32m$2[m\""
fi
;;
esac
}
noise_quit() { # exit
echo "[35mGood bye![m"
exit
}
fail() {
echo "[31mFAIL: $*[m"
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
"
}
##
##
##
export noise_prompt="[30mREADY.[m
"
export noise_default_command=espeak
##
##
##
while echo -n "$noise_prompt" && eval "`readline`" ; do
## modcall
for dir in `echo "$NOISE_PATH" | tr : \ ` ; do
module="$dir/$command"
if test -x "$module" ; then
shift
eval 'NOISE="$0" NOISE_linefeed="$linefeed" "$module"' "$args"
continue 2
fi
done
## funcall
if type noise_$command &>/dev/null ; then
eval 'noise_$command' "$args"
continue
fi
##
fail unknown command "[4m$command[m"
done <$linefeed &
jobs="${jobs+$jobs }`jobs -p`"
##
##
##
cat<<EOF
[35mwelcome to [4mSHACK UTTERANCE[;35m version 0.9 beta 2
get help with [32m/help[m
[33mTIP: benutze [4mrlwrap[;33m für eine elitäre Kommandozeile.[m
EOF
##
##
##
exec >>$linefeed
while read ; do
case $REPLY in
(/quit) echo /quit ; exit ;;
(*) tr \; \\n | grep . ;;
esac<<EOF
$REPLY
EOF
done
#### end of file.
|