View difference between Paste ID: NfiHbepW and iUp4xjJT
SHOW: | | - or go back to the newest paste.
1
#!/bin/sh
2
3
# The ramdisk /bin/sh uses "\c" at end of line to suppress newlines.
4
# Oher shells use -ne and -e.  So define c or the other two.
5
c=\\c
6
#ne=-ne; e=-e
7
8
E=$(printf "\033")
9
ESC=$(printf "\033")
10
C_D=$(printf "\004")
11
C_H=$(printf "\010")
12
TAB=$(printf "\011")
13
BS=$(printf "\177")
14
NL='
15
'
16
17
# ANSI colors (darK,Red,Green,Yellow,Blue,Magenta,Cyan,White,Normal)
18
K="${E}[1;30m"
19
R="${E}[1;31m"
20
G="${E}[1;32m"
21
Y="${E}[1;33m"
22
B="${E}[1;34m"
23
M="${E}[1;35m"
24
C="${E}[1;36m"
25
W="${E}[1;37m"
26
N="${E}[0m"
27
BOLD="${E}[1m"
28
REV="${E}[7m"
29
ITAL="${E}[3m"
30
UNDR="${E}[4m"
31
BLNK="${E}[5m"
32
33
WB="${E}[1;44;37m"
34
BW="${E}[0;47;34m"
35
36
DRAW="${E}(0"
37
TEXT="${E}(B"
38
39
#NICK="zippy"
40
DSRV="irc.freenode.net"
41
SERV=$DSRV
42
PORT=6667
43
44
printat()
45
{
46
  printf "${ESC}[%d;%dH" ${1:-1} ${2:-1}
47
  [ $# -gt 2 ] && {
48
    shift 2
49
    printf "%s" "$*"
50
  }
51
}
52
53
sreplace()
54
{
55
  S1=$(expr substr "$STR" 1 $1)
56
  [ $# -lt 2 ] && S1=$(expr substr $STR 1 $(($1 - 1)))
57
  S2=$(expr substr "$STR" $(($1 + 1)) ${#STR})
58
  STR="${S1}${2}${S2}"
59
}
60
61
cursor()
62
{
63
  case $1 in
64
    0) printf "${ESC}[?25l" ;;
65
    *) printf "${ESC}[?12l${ESC}[?25h" ;;
66
  esac
67
}
68
69
bold()
70
{
71
  case $1 in
72
    0) printf "${ESC}[22m" ;;
73
    *) printf "${ESC}[1m" ;;
74
  esac
75
}
76
77
get() ## get a single keystroke from stdin without waiting
78
{
79
  if [ -t 0 ]
80
  then
81
    if [ -z "$_STTY" ]
82
    then
83
      _STTY=$(stty -g)
84
      stty -echo -icanon time ${GET_TMOUT:-0} min ${GET_MIN:-0}
85
    elif [ -n "$GET_TMOUT$GET_MIN" ]
86
    then
87
      stty -echo -icanon time ${GET_TMOUT:-0} min ${GET_MIN:-0}
88
    fi
89
  fi
90
#  _KEY=$(dd bs=1 count=1  2>/dev/null; printf '.')
91
  _KEY=$(dd bs=1 count=1  2>/dev/null; echo '.')
92
  _KEY=${_KEY%.}
93
  [ -n "$_KEY" ]
94
}
95
96
get_key()
97
{
98
  while :
99
  do
100
    GET_TMOUT=5 get && break ## Half second timeout on each loop
101
  done
102
103
  case $_KEY in
104
  "${ESC}")
105
    stty -echo -icanon time 0 min 0
106
    read _KEY
107
    if [ -z "$_KEY" ] 
108
    then
109
#      _KEY='?'
110
      _KEY="${ESC}"
111
    fi
112
  ;;
113
  esac
114
}
115
116
117-
# Define GUI Widgets (StrName, FieldLength, AtLoc, EmptyStr, Type)
117+
# Define TUI Widgets (Type, StrName, FieldLength, AtLoc, EmptyStr)
118-
WS1="NICK";  WL1=39;  WA1="${E}[2;13H";   WE1="${WA1}$(printf "%-39s")"
118+
WT1=s  WS1="NICK";  WL1=39;  WA1="${E}[2;13H";   WE1="${WA1}$(printf "%-39s")${WA1}"
119-
WS2="ID";    WL2=39;  WA2="${E}[3;13H";   WE2="${WA2}$(printf "%-39s")"
119+
WT2=b  WS2="ID";    WL2=39;  WA2="${E}[3;13H";   WE2="${WA2}$(printf "%-39s")${WA2}"
120-
WS3="IPAS";  WL3=39;  WA3="${E}[4;13H";   WE3="${WA3}$(printf "%-39s")"
120+
WT1=s  WS3="IPAS";  WL3=39;  WA3="${E}[4;13H";   WE3="${WA3}$(printf "%-39s")${WA3}"
121-
WS4="SERV";  WL4=39;  WA4="${E}[6;13H";   WE4="${WA4}$(printf "%-39s")"
121+
WT4=s  WS4="SERV";  WL4=39;  WA4="${E}[6;13H";   WE4="${WA4}$(printf "%-39s")${WA4}"
122-
WS5="PORT";  WL5=39;  WA5="${E}[7;13H";   WE5="${WA5}$(printf "%-39s")"
122+
WT5=i  WS5="PORT";  WL5=39;  WA5="${E}[7;13H";   WE5="${WA5}$(printf "%-39s")${WA5}"
123-
WS6="NPAS";  WL6=39;  WA6="${E}[8;13H";   WE6="${WA6}$(printf "%-39s")"
123+
WT6=b  WS6="NPAS";  WL6=39;  WA6="${E}[8;13H";   WE6="${WA6}$(printf "%-39s")${WA6}"
124-
WS7="PASS";  WL7=39;  WA7="${E}[9;13H";   WE7="${WA7}$(printf "%-39s")"
124+
WT7=s  WS7="PASS";  WL7=39;  WA7="${E}[9;13H";   WE7="${WA7}$(printf "%-39s")${WA7}"
125-
WS8="CH1";   WL8=24;  WA8="${E}[11;3H";   WE8="${WA8}$(printf "%-24s")"
125+
WT8=s  WS8="CH1";   WL8=24;  WA8="${E}[11;3H";   WE8="${WA8}$(printf "%-24s")${WA8}"
126-
WS9="CH2";   WL9=24;  WA9="${E}[12;3H";   WE9="${WA9}$(printf "%-24s")"
126+
WT9=s  WS9="CH2";   WL9=24;  WA9="${E}[12;3H";   WE9="${WA9}$(printf "%-24s")${WA9}"
127-
WS10="CH3";  WL10=24; WA10="${E}[13;3H";  WE10="${WA10}$(printf "%-24s")"
127+
WT10=s WS10="CH3";  WL10=24; WA10="${E}[13;3H";  WE10="${WA10}$(printf "%-24s")${WA10}"
128-
WS11="CH4";  WL11=24; WA11="${E}[14;3H";  WE11="${WA11}$(printf "%-24s")"
128+
WT11=s WS11="CH4";  WL11=24; WA11="${E}[14;3H";  WE11="${WA11}$(printf "%-24s")${WA11}"
129-
WS12="NK1";  WL12=3;  WA12="${E}[11;32H"; WE12="${WA12}$(printf "%-3s")"
129+
WT12=b WS12="NK1";  WL12=3;  WA12="${E}[11;32H"; WE12="${WA12}$(printf "%-3s")${WA12}"
130-
WS13="NK2";  WL13=3;  WA13="${E}[12;32H"; WE13="${WA13}$(printf "%-3s")"
130+
WT13=b WS13="NK2";  WL13=3;  WA13="${E}[12;32H"; WE13="${WA13}$(printf "%-3s")${WA13}"
131-
WS14="NK3";  WL14=3;  WA14="${E}[13;32H"; WE14="${WA14}$(printf "%-3s")"
131+
WT14=b WS14="NK3";  WL14=3;  WA14="${E}[13;32H"; WE14="${WA14}$(printf "%-3s")${WA14}"
132-
WS15="NK4";  WL15=3;  WA15="${E}[14;32H"; WE15="${WA15}$(printf "%-3s")"
132+
WT15=b WS15="NK4";  WL15=3;  WA15="${E}[14;32H"; WE15="${WA15}$(printf "%-3s")${WA15}"
133-
WS16="KEY1"; WL16=15; WA16="${E}[11;37H"; WE16="${WA16}$(printf "%-15s")"
133+
WT16=s WS16="KEY1"; WL16=15; WA16="${E}[11;37H"; WE16="${WA16}$(printf "%-15s")${WA16}"
134-
WS17="KEY2"; WL17=15; WA17="${E}[12;37H"; WE17="${WA17}$(printf "%-15s")"
134+
WT17=s WS17="KEY2"; WL17=15; WA17="${E}[12;37H"; WE17="${WA17}$(printf "%-15s")${WA17}"
135-
WS18="KEY3"; WL18=15; WA18="${E}[13;37H"; WE18="${WA18}$(printf "%-15s")"
135+
WT18=s WS18="KEY3"; WL18=15; WA18="${E}[13;37H"; WE18="${WA18}$(printf "%-15s")${WA18}"
136-
WS19="KEY4"; WL19=15; WA19="${E}[14;37H"; WE19="${WA19}$(printf "%-15s")"
136+
WT19=s WS19="KEY4"; WL19=15; WA19="${E}[14;37H"; WE19="${WA19}$(printf "%-15s")${WA19}"
137
138
WT20=b WS20="SAVE"; WL20=4;   WA20="${E}[17;8H"; WE20="${WA20}$(printf "%-4s")${WA20}"
139-
ShowGUI()
139+
WT21=b WS21="SAVEAS"; WL21=6; WA21="${E}[17;25H"; WE21="${WA21}$(printf "%-6s")${WA21}"
140
WT22=b WS22="EXIT"; WL22=4;   WA22="${E}[17;43H"; WE22="${WA22}$(printf "%-4s")${WA22}"
141
142
SAVE="Save"; SAVEAS="SaveAs"; EXIT="Exit"
143
###################
144
ShowTUI()
145
{
146
printf "${ESC}[2J"
147
148
# Must use UPPERCASE for words in DRAW mode.  Or add labels later.
149
# NOTE: see how the cfaj code makes variable sized boxes.
150
printat 1 1  "$WB$DRAW"
151
echo "lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk"
152
echo "x NICK                                              x"
153
echo "x IDENTIFY                                          x"
154
echo "x PASSWORD                                          x"
155
echo "tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu"
156
echo "x SERVER                                            x"
157
echo "x PORT                                              x"
158
echo "x NEEDPASS                                          x"
159
echo "x PASSWORD                                          x"
160
echo "t CHANNELS  qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu"
161
echo "x                          KEY                      x"
162
echo "x                          KEY                      x"
163-
echo "${WE1}${WA1}${NICK}"
163+
164-
echo "${WE2}${WA2}${ID}"
164+
165-
echo "${WE3}${WA3}${IPAS}"
165+
166-
echo "${WE4}${WA4}${SERV}"
166+
echo "x    lqqqqqqk         lqqqqqqqqk        lqqqqqqk    x"
167-
echo "${WE5}${WA5}${PORT}"
167+
echo "x    x      x         x        x        x      x    x"
168-
echo "${WE6}${WA6}${NPAS}"
168+
echo "x    mqqqqqqj         mqqqqqqqqj        mqqqqqqj    x"
169-
echo "${WE7}${WA7}${PASS}"
169+
170-
echo "${WE8}${WA8}${CH1}${WE12}${WA12}${NK1}${WE16}${WA16}${KEY1}"
170+
171-
echo "${WE9}${WA9}${CH2}${WE13}${WA13}${NK2}${WE17}${WA17}${KEY2}"
171+
172-
echo "${WE10}${WA10}${CH3}${WE14}${WA14}${NK3}${WE18}${WA18}${KEY3}"
172+
echo "${WE1}${NICK}"
173-
echo "${WE11}${WA11}${CH4}${WE15}${WA15}${NK4}${WE19}${WA19}${KEY4}"
173+
echo "${WE2}${ID}"
174
echo "${WE3}${IPAS}"
175
echo "${WE4}${SERV}"
176
echo "${WE5}${PORT}"
177
echo "${WE6}${NPAS}"
178
echo "${WE7}${PASS}"
179
echo "${WE8}${CH1}${WE12}${NK1}${WE16}${KEY1}"
180
echo "${WE9}${CH2}${WE13}${NK2}${WE17}${KEY2}"
181
echo "${WE10}${CH3}${WE14}${NK3}${WE18}${KEY3}"
182
echo "${WE11}${CH4}${WE15}${NK4}${WE19}${KEY4}"
183
184
echo "${WE20}${SAVE}${WE21}${SAVEAS}${WE22}${EXIT}"
185
#echo $N
186
}
187
188
# Boolean/PushButton handler
189
button()
190
{
191
  [ "$WT" != "b" ] && return
192
  case $J in 20) echo "break" ; return ;; 
193
    21) echo "break" ; return ;;
194
    22) echo "break" ; return ;; 
195
  esac
196
  #case $_KEY in ${NL}) return ;; esac
197
  #case "$STR" in y*|Y*) STR="no " ;; *) STR="yes" ;; esac
198
  #eval SP=\$WS$J; eval $SP="$STR"
199
  #echo "printat $y $xo '${STR}'"
200
}
201
202
# Open the tinyirc wrapper script and read lines until one starts with tinyirc.
203
IRC=/usr/local/bin/irc
204
if [ -r $IRC ] ; then
205
exec 3<$IRC
206
# Find SERV NICK PORT
207
while read line <&3
208
do
209
  if [ "${line%% *}" = "tinyirc" ] ; then
210
    # Tries to remove the first word
211
    CFG="${line#tinyirc }"
212
    # Check if we removed anything
213
    if [ "$CFG" != "$line" ] ; then
214
      for ARG in $CFG
215
      do 
216
	case $ARG in 
217
	  */*|*:*|*.*) SERV="$ARG" ;;
218
	  -i) ID="yes" ;; 
219
	  -*) ARGS="$ARGS $ARG" ;; 
220
	  ''|*[!0-9]*) NICK="$ARG" ;; 
221
	  *) PORT="$ARG" ;;
222
	esac 
223
      done
224
    fi
225
  fi
226
done
227
exec 3</dev/null
228
fi
229
230
# Remove irc:// from SERV
231
case $SERV in 
232
  *://*) SERV=${SERV#*://} ;;
233
esac 
234
# Split SERV at first / 
235
case $SERV in 
236
  */*) CHAN=${SERV#*/} ;;
237
  *) CHAN="" ;;  
238
esac 
239
SERV=${SERV%%/*}
240
# Split SERV at first :
241
case $SERV in 
242
  *:*) PORT=${SERV#*:} ; SERV=${SERV%%:*} ;;
243
esac 
244
245
# Get the channels
246
J=1; while [ $J -lt 5 ]
247
do
248
  CH=${CHAN%%/*}
249
  case $CHAN in 
250
    */*) CHAN=${CHAN#*/} ;;
251
    *) CHAN="" ;;
252
  esac 
253
  case $CH in 
254
    *[\?\&,]*) OPTS=${CH#*[[\?\&,]} ; CH=${CH%%[\?\&,]*} ;;
255
    *) OPTS="" ;;
256
  esac
257
  echo "$J CH=<$CH> OPTS=<$OPTS>"
258
  if [ -n "$CH" ] ; then
259
    eval CH$J=$CH ; eval OPTS$J=$OPTS ; 
260
    case $OPTS in 
261
      *key=*) CK=${OPTS#key=} ; CK=${CK#*[[\?\&,]} ; eval KEY$J=$CK ;;
262
      *needkey*) eval NK$J="yes" ;;
263
    esac
264
    J=`expr $J + 1` ;
265
  elif [ -z "$OPTS" ] ; then
266
    J=`expr $J + 1` ;
267
  else # We got some server opts (no channel)
268
    SOPT="$SOPT,$OPTS"
269
  fi
270
  case $OPTS in 
271
    *identify=*) IPAS=${OPTS#identify=} ; IPAS=${IPAS#*[[\?\&,]} ;;
272
  esac
273
  case $OPTS in 
274
    *pass=*) PASS=${OPTS#pass=} ; PASS=${PASS#*[[\?\&,]} ;;
275
    *needpass*) NPAS="yes" ;;
276
  esac
277
done
278
279
# Check if various passwords are needed
280
if [ -n "$ID" ] ; then ID="yes" ; 
281
elif [ -n "$IPAS" ] ; then ID="yes" ; 
282-
################## Now draw and run the GUI.
282+
283-
ShowGUI
283+
284
if [ -n "$NPAS" ] ; then NPAS="yes" ; 
285
elif [ -n "$PASS" ] ; then NPAS="yes" ; 
286
else NPAS="no" ; 
287
fi
288
289
if [ -n "$NK1" ] ; then NK1="yes" ; 
290
elif [ -n "$KEY1" ] ; then NK1="yes" ; 
291
else NK1="no" ; 
292
fi
293
if [ -n "$NK2" ] ; then NK2="yes" ; 
294
elif [ -n "$KEY2" ] ; then NK2="yes" ; 
295
else NK2="no" ; 
296
fi
297
if [ -n "$NK3" ] ; then NK3="yes" ; 
298
elif [ -n "$KEY4" ] ; then NK3="yes" ; 
299-
   ${NL})printat 1 24 "key=[NL]"
299+
300-
        #_KEY=$J
300+
301-
	eval SP=\$WS$J
301+
302-
	eval $SP=$STR
302+
303
else NK4="no" ; 
304-
;; "${ESC}"|${NL}) break
304+
305
306
307
################## Now draw and run the TUI.
308
ShowTUI
309
310-
        [ "$J" -ne 11 ] && [ "$J" -ne 15 ] && J=$(($J + 1))
310+
311
J=1
312-
        [ "$J" -eq 19 ] && J=0
312+
313-
        [ "$J" -gt 7 ] && J=$(($J + 4))
313+
314-
        [ "$J" -gt 19 ] && J=$(($J - 11))
314+
315-
        [ "$J" -le 7 ] && J=$(($J + 1))
315+
316
WT=s
317-
        [ $x -gt $xo ] && x=$(($x - 1))
317+
318
# Run main dialog box until ESC
319-
        [ $x -lt $((${#STR} + $xo)) ] && x=$(($x + 1))
319+
320
do
321
printat $y $x
322
get_key
323
MV=0 # Handle widget traversal (UP,DN,TAB).
324
case $_KEY in
325
   " ")printat 1 24 "key=[SP]" ; eval $(button)
326
;; ${NL})printat 1 24 "key=[NL]" ; eval $(button)
327-
	[ $x -gt $xo ] && {
327+
        eval SP=\$WS$J; eval $SP="$STR"
328
	x=$xo
329
;; "${ESC}") MV=$J #break
330
;; '[A')printat 1 24 "key=[UP]" ; MV=$J
331-
          printat $y $x
331+
332
        [ "$J" -eq 16 ] && J=8
333
        [ "$J" -gt 19 ] && J=12
334
        J=$(($J - 1))
335-
	sreplace $(($x - $xo)) "${_KEY}"
335+
336-
        printat $y $xo $STR 
336+
        [ "$J" -eq 11 ] && J=20
337-
	x=$(($x + 1))
337+
        [ "$J" -eq 15 ] && J=20
338-
        printat $y $x
338+
        [ "$J" -le 19 ] && J=$(($J + 1))
339
;; "${TAB}")printat 1 24 "key=[TB]" ; MV=$J
340
	case $J in 
341
          22) J=1 ;; 
342
          [89]|1[0-5]) J=$(($J + 4)) ;; 
343
          1[6-8]) J=$(($J - 7)) ;; 
344
          *) J=$(($J + 1)) ;; 
345-
  eval WL=\$WL$MV
345+
	esac
346-
  printat $y $xo; printf "%-${WL}s"
346+
347
;; '[6~')printat 1 24 "key=[V-]"
348
;; '[1~')printat 1 24 "key=[HM]"
349-
  eval printat $y $xo $STR
349+
350-
  # Should erase from xo+$(#STR) to widgetlength.
350+
351
        [ "$WT" != "b" ] && [ $x -lt $((${#STR} + $xo)) ] && x=$(($x + 1))
352-
  elif [ "$J" -gt 19 ] ; then J=19
352+
        [ "$WT" = "b" ] && [ $J -ge 12 ] && [ $J -le 15 ] && {
353
          MV=$J ; J=$(($J + 4)) 
354
	}
355
        [ "$WT" = "b" ] && [ $J -ge 20 ] && [ $J -le 22 ] && {
356
          MV=$J ; J=$(($J + 1)) 
357
        }
358
;; '[D')printat 1 24 "key=[<<]"
359
        [ "$WT" != "b" ] && [ $x -gt $xo ] && x=$(($x - 1))
360
        [ "$WT" = "b" ] && [ $J -ge 12 ] && [ $J -le 15 ] && {
361
          MV=$J ; J=$(($J - 4)) 
362
	}
363-
  eval printat $y $xo $STR
363+
        [ "$WT" = "b" ] && [ $J -gt 20 ] && {
364
          MV=$J ; J=$(($J - 1)) 
365
        }
366
;; "${C_D}")printat 1 24 "key=[^D]"
367
;; "${C_H}")printat 1 24 "key=[^H]"
368
;; "${BS}")printat 1 24 "key=[BS]"
369
	[ "$WT" != "b" ] && [ $x -gt $xo ] && {
370
          sreplace $(($x - $xo))
371
	  x=$(($x - 1))
372
          printat $y $xo "$STR "
373
        }
374
;; [[:cntrl:]]) printat 1 24 "key=[CTL]"
375
;; [[:graph:]]) printat 1 24 "key=[${_KEY}]"
376
        case $_KEY in .|-|_) ;; [[:punct:]]) continue ;; esac
377
	[ "$WT" = "i" ] && { case $_KEY in [0-9]) ;; *) continue ;; esac }
378
	[ "$WT" != "b" ] && {
379
          sreplace $(($x - $xo)) "${_KEY}"
380
          printat $y $xo $STR 
381
	  x=$(($x + 1))
382
        }
383
	[ "$WT" = "b" ] && [ $J -le 19 ] && {
384
          case $_KEY in y|Y) STR="yes" ;; *) STR="no " ;; esac
385
          printat $y $xo "${STR}"
386
	  eval SP=\$WS$J; eval $SP="$STR"
387
	}
388
;; *)printat 1 24 "key=[HUH]"
389
;;
390
esac
391
392
# Set x and y if traversing between widgets
393
if [ $MV -ne 0 ] ; then
394
  # Clear and restore old widget to STR before moving on.
395
  eval WE=\$WE$MV
396
  eval SP=\$WS$MV
397
  eval STR=\$"$SP"
398
  echo "${WE}${STR}"
399
  # Traverse
400
  if [ "$J" -lt 1 ] ; then J=1
401
  elif [ "$J" -gt 22 ] ; then J=22
402
  fi
403
  if   [ "$J" -lt 4 ] ; then y=$(($J + 1)) ; x=13
404
  elif [ "$J" -lt 8 ] ; then y=$(($J + 2)) ; x=13
405
  elif [ "$J" -lt 12 ] ; then y=$(($J + 3)) ; x=3
406
  elif [ "$J" -lt 16 ] ; then y=$(($J - 1)) ; x=32
407
  elif [ "$J" -lt 20 ] ; then y=$(($J - 5)) ; x=37
408
  elif [ "$J" -eq 20 ] ; then y=17; x=8
409
  elif [ "$J" -eq 21 ] ; then y=17; x=25
410
  elif [ "$J" -eq 22 ] ; then y=17; x=43
411
  fi
412
  xo=$x
413
  eval SP=\$WS$J
414
  eval STR=\$"$SP"
415
  printat $y $xo $STR
416
  eval WT=\$WT$J
417
fi
418
done
419
420
# Goto top left corner (1,1), set normal text, fix tty, turn on the cursor.
421
printat 1 1 $N
422
stty sane
423
clear
424
cursor 1
425
426
### Construct a tinyirc command line to save.
427
CMD="tinyirc $NICK $PORT ${SERV:-$DSRV}"
428
429
OPS=""
430
OP=\?
431
case "$ID" in y*|Y*) OPS="${OP}identify=$IPAS"; OP=\& ;; esac 
432
if [ -n "$PASS" ] ; then
433
  OPS="${OPS}${OP}pass=${PASS}";
434
else case "$NPAS" in 
435
  y*|Y*) OPS="${OPS}${OP}needpass" ;; esac
436
fi 
437
[ -n "$OPS" ] && CMD="${CMD}/$OPS"
438
439
for J in 1 2 3 4
440
do
441
eval CH="\$CH$J"; eval NK="\$NK$J"; eval KEY="\$KEY$J"
442
[ -n "$CH" ] && {
443
  CMD="${CMD}/$CH"
444
  if [ -n "$KEY" ] ; then
445
    CMD="${CMD},key=${KEY}"
446
  else case "$NK" in 
447
    y*|Y*) CMD="${CMD},needkey" ;; esac
448
  fi 
449
}
450
done
451
452
echo $CMD