###  256.bish  #############################################


end=4095
mul=16

for F in  up rnd dwn
do
   echo "//$F:"
   echo "   {"
   for n from 0 to $end repeat
   do
      W=$( ti "$F(sqrt($n*$mul))" )
      prints ss4ss3s "/*" $n "*/  " $W ,
   done
   echo "   },"
done



###  99.bish  #############################################


#am 3.1.2000 5:00
#7.7.1999 6:00
#ls zeigt erst bei um (>?)180 Tage älteren
#Dateien JJJJ an.

M=07 T=07 S=06 m=59

while :
do
   touch -t 1999$M$T$S$m.00 t.bish
   l t.bish
   l t.bish | grep -q 1999 && break
   #let "--M<1" && break
   #let "M<10" && M=0$M
   #let "--T<1" && break
   #let "T<10" && T=0$T
   #let "--S<0" && break
   #let "S<10" && S=0$S
   let "--m<0" && break
   let "m<10" && m=0$m
done



###  C.bish  #############################################


# define MSK16  0x0810= 2064
#/ start= 0x1d0f= 7439
#CRC:EEDATA von WORD @1 ... @949 einschl.
#       Offs 2 ... 1899 = 1898 Byte
#WORD Crc16(crc, word)

# CRC<--  Buf $offs $len
Crc16()  {
   local n=00 crc_=0007439 byte=000000
   for byte in  $Bytes $Bytes
   do
      prints sf08bsf016b- $((2#, byte)) $((2#, crc_))
      for n from 0 to 7 repeat
      do
         if let "{{crc_&16#8000} ^ {[byte&(1<<n)]<<(15-n)}}&16#ffff"
         then
            (( crc_=  ((((crc_^2064)&2064)<<1)|(crc_<<1))
                     &((((crc_^2064)&2064)<<1)|~(2064<<1)),
               crc_&=16#ffff, crc_|=1
            ))
         else
            (( crc_=  ((((crc_^~2064)&2064)<<1)|(crc_<<1))
                     &((((crc_^~2064)&2064)<<1)|~(2064<<1)),
               crc_&=~1, crc_&=16#ffff
            ))
         fi
      done
      prints sf016  $((2#, crc_))
   done
   return 0
}


for n from 0 to 255 repeat
do
   Bytes="$Bytes $n"
done
Crc16



###  Cccvbm  #############################################

#!/u/bin/bish

#startx_plus, FreeBSD4.5

set -f

#u==user s==sys,server c==client
#bindir=/usr/X11R6/bin
uc_rc=$HOME/.xinitrc
us_rc=$HOME/.xserverrc
sc_rc=/usr/X11R6/lib/X11/xinit/xinitrc
ss_rc=/usr/X11R6/lib/X11/xinit/xserverrc

[ -s $sc_rc ] && cargs=$sc_rc
[ -s $uc_rc ] && cargs=$uc_rc

[ -s $ss_rc ] && sargs=$ss_rc
[ -s $us_rc ] && sargs=$us_rc

args=cargs
for  A  in  $@
do
   [ "$A" == -- ] && args=sargs continue
   $args="${{args} $A"
done

#  ---------------------------------------------------
sargs=$sargs
ifset sargs || {
   pids=$( ps -wajx | grep '[/ ]xinit .*--' | cut -d'  ' -f2 )
   ps -wajx | grep ' :[0-9]' |
      while read - - ppid - - - - - - cmd
      do
         expr " $pids " :: " $ppid " || continue
         expr "$cmd" :dpy '/[^ ]%{1,} %(:[0-9]%)' || continue
         expr "$cmd" :cmd '%([^ ]%{1,}%) :[0-9]' || continue
         sargs=$cmd displ="$displ$dpy "
      done

   for dpy from 0 to 9 repeat
   do
      echo " :$dpy%c"
      expr "$displ" :: ":$dpy " || sargs="$sargs :$dpy" break
   done
   echo
   if expr "$sargs" :: '/[^ ]%{1,} :[0-9]'
   then  echo trying display :$dpy ...; sleep -m 1700
   else  sargs=''
   fi
}
# /---------------------------------------------------

exec xinit $cargs -- $sargs



###  Cccvbm  #############################################

:
cd /home/bish
b=/home/cie/wms/cgi/bish_folso_cgi
Ccc -o$b -DVBM -DCGI bish.c
mcs -d $b
l $b


###  H.bish  #############################################


echo "hash%nverbose%nopen schellong.com" > Hftp
echo "user u8888888 rrrrrrrr%nbinary" >> Hftp
for Fh in $( cat H )
do
   echo $Fh
   echo "put $Fh" >> Hftp
   <> $Fh
   while seek + 0 sk; readl Z
   do
      expr "$Z" =:: '<table [^>]*WIDTH="150"  *HEIGHT="35"[^>]*>' || continue
      expr "$Z" =:Z 'WIDTH="150"' = 'WIDTH="150"'
      catv Z =$sk,,0.
      break
   done
   while seek + 0 sk; readl Z
   do
      expr "$Z" =:: '</table>' && break
      ow=0
      expr "$Z" :Z '%.d5' += '.d6' && ow=1
      expr "$Z" =:Z 'width=60' = 'width=72' && ow=1
      expr "$Z" =:Z 'width=40' = 'width=48' && ow=1
      expr "$Z" =:Z 'width="60"' = 'width="72"' && ow=1
      expr "$Z" =:Z 'width="40"' = 'width="48"' && ow=1
      [ ow -eq 1 ] && catv Z =$sk,,0.
   done
   ><
done
echo "quit" >> Hftp



###  M.bish  #############################################


headEMAIL='From: post@schellong.com
Reply-To: schellong@t-online.de
MIME-Version: 1.0
To: ~email~
Subject: 1000-fach-WebCounter
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

'
headEMAIL2='From: webmaster@schellong.com
Reply-To: webmaster@schellong.com
MIME-Version: 1.0
To: schellong@t-online.de
Subject: 1000-fach-WebCounter
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

'
#date=$(date '+%m/%d/%y %H:%M')

Mtxt='
Sehr geehrte/r WebCounter-Kundin/Kunde,

den 1000-fach-Zähler, den Sie verwenden, hatte ich zu Anfang nur
WüW WWWW WWWWWW WWWWWWWWWW, WW WWWW .WWWW-WWWWWWW WWW WWWWWW WWWWWWWW
WWWWWWW WWW WWWWWäWWWW WäWWWW WWW WWWWWWWWWWW WWWWWWWW WW WöWWWW.
WWWW WWWWW WWWWWWW WWWW-WWWW-WäWWWW WWWW WW WWWWW WWWWWWWW.

WW WWW WWWWWWW WWWW WWWWWWWWWWWWWW WWWWWW WWW WWWW WWWWW WWWWW
.WWWW-WWWWWWWWW (WWWWWWWWWWWWWWWWW) üWWW WWWWW WWWWWWWW WWWWWWW
WWW WWWWWWW WWWWWWWWWW WWW WWW WW, WW WWW WWWWW WWWWWWW WWWWW-WäWWWW
WWWW WüW WWW WWWWWWWWWW WöWWW.
WWW WWWWWW - WWW WW WWWWWWWW WWWWWW WäWWWWWWWWWW WWWWW WWWWWWW WWWüWW
WWW WäWWWWWW WWWW WWWWW-WWWWWW WWW ÄWWWWWWWW.

WWWWW WWWWWW ''WWW WWWWWW WWWWWW'' WWWWWW WW WWW WWWWWWWWW WWWWWW
WäWWWW -WWWWWWäWWWWWW WW WWWWWWWWWW- WWW WWWWWWWWWWWWW WWWWWWWWWWWWW
WWWWWWWWWWWWWWW.
WW WWW WW, WWß WWW WWW WWWWWWWWWWWW WWW WWWWWWWWWW WWWWWWWWW WWW WW
WW WWWWWWWWW WWWWWWWWWWWW WWWWWW.

WWWWWWWWWWWW WWWW WWW WWWWWW WWW WWWW W WWWWWWWWW WWWW W-W WWWWWW,
WWW WWWW WWWWWWWWWW WWWWWWWW WW, WWWWäWWWWW WWWWW.
WW WWWWWWWWW WWWW.
WWWW WW WWW WWWWWW WWWWWWWWWW WWWWWW, WWWWW WWW WWW WWWWWWWWWWW
WWWWWWWWWW WWWWWW WäWWWWWWWWWWWW WWWWWWWWWW.
WWW WWWWW WWWW WWWWW WWWWWWWWW WWWW WWWWWWWWW WWW WWWWW WWWWäWWWWWWWWW
WWWW WWWWWWWWWWWW.

WWW WöWWWW WWWWWWWWWWW WWWWWW - WWW WWWW WWW WWWW WWWWW.
WWW WöWWWW WWWWWWW WWW WWWWWW WWWWWWWWWWWWWWWWWWWW WWWWW WWWWWWWWW.WW
WWWWWW, WWW WWWW WW-WWWW WäWWWWWW WWWWWWW WWWW WWW WWWWWWWWW.WWW
- WWW WWWW WWW WWWW WWWW WWWWW.
WWW WöWWWW WWWWW WWWWWWWWW WWWWWWW WWWWWWW WWW WWWWWW WWWWW WWWWWWWWWW
- WWWW WWWW WWW WWWäWWW WWW WWWWW.

WWW WWW WWWW WWWWWW WWWWWWWWWW, WWß WWWWWWWWWW WäWWWWWWWWWW WWWWWWWWWWWW
WWWWWW WäWWWWWWWWWW WWWWWWWWWWWWWWW!
WWW WWWWWW WWWW WWW WW WWWWWWWWWW WWWWW WWW, WW WWW WWWW WWWWWW WWW
''WWWWWWüWWWW'' WWWWWWWWWW WüWWW.

WWWW WWW WWWWWWW WWWWWW WWWWWW WWWWWW WWW WWWW-WWWW-WWWWWWW WWW WWW,
WWWWW WWW WWW WWWW WWW WWW WWWW WöWWWWWWW WWWWWWW WWWWWW WWW WWW WWWW
WWWWW WäWWWWWWWWWWWW WWWWWWWWWWWW WWWWW.
WWWWWWWW WäWW WW WWWWWWWW WWWWW WWWWWW, WWWW WWWWWW WWWW WäWWWWWWWWWWW
WWWWWWWWWW WWWWW WWWW WWWWWWWWWWWWWWW WüWWW.

WWWWWWWWW WWWW WWW WWWWWW WWWWWWWWWWWWW WäWWWWWWWWWW WWWWWWWWWWW
WWWWWWWW, WWWW WWW WWWWW WWWWWW WWWß, WWW WWWW WWWWWWWW WWWWWW WWWWW
WWW WWW WWWWWWW WWWW WüW WWWWWWWWWW WWWWWWWW.

WWW WWWWW WWW WWWW WWWW WWWWWWWW WWWWW, WW WWW WWW WWWWWW WWWWWWWWW
WWWW WWWWW WWWWWWWWW.


Mit freundlichen Grüßen
Helmut Schellong

'

for z in  $( grep '[^@ ]%{1,}@[^@ ]%{1,}' K )
do
   ifset z || continue
   expr "$z" :z '[| ]' += ''
   #expr "$z" :: 'schellong@' && continue
   echo sendmail "$z"
   expr "$headEMAIL" :Hbuf '~email~' = "$z"
   catv Hbuf Mtxt | /etc/mail/sendmail "$z"
done
catv headEMAIL2 Mtxt | /etc/mail/sendmail "schellong@t-online.de"



###  R.bish  #############################################


local n=0000 rand1=00000 rand2=00000
> Rand
while [ n -lt 1000 ]
do
   rand1=$RANDOM
   [ rand1 -lt 200 ] || continue
   rand2=$RANDOM
   [ rand2 -lt 200 ] || continue
   let ++n
   echo $rand1 $rand2
done
><



###  a.bish  #############################################


v1="80 c0 ff 41 81 bf 00 42 82 c2 01 3f 7f c1 02 44 84 c4 03 45 85 c3 04 3e 7e be"
v2="0f cf 92 4f 12 d4 95 4e 15 d5 78 39 f8 ba 97 4c fb bb 96 3b 16 e0 a0 b2 22 e1"

i=0
for b in  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do
   let ++i,ii=0
   for v in  $v1
   do
      let "++ii==i" && { d=$(catv /$b | base -b +10)
         let "v=16#$v"
         prints sss3ssf08ssf02ss3ssf08 $b : $d : $((2#,d)) "   " %
                       $((16#,v)) : $v : $((2#,v))
      }
   done
done


echo %n
i=0
for b in  AA BB CC DD EE FF GG HH II JJ KK LL MM NN %
          OO PP QQ RR SS TT UU VV WW XX YY ZZ
do
   let ++i,ii=0
   for v in  $v2
   do
      let "++ii==i" && { d=$(catv /$b =1,1 | base -b +10)
         let "v=16#$v"
         prints sss3ssf08ssf02ss3ssf08 $b : $d : $((2#,d)) "   " %
                       $((16#,v)) : $v : $((2#,v))
      }
   done
done



###  ab.bish  #############################################

#!/u/bin/bish


cd a
a=*.LST
cd ../b
b=*.LST
cd ..
mkdirs a1 b1

for B in a b
do
for F in ${{B}
do
   echo $B/$F ...
   > ${B}1/$F
   < $B/$F
   while readl zeile
   do
      expr "$zeile" :: '^CO ' && {
         expr "$zeile" :zeile '^%(.%{32}%)'
        #expr "$zeile" :d '    %(%d%{1,}%)    ' && {
        #   expr "$d" :d '%d' += ' '
        #   expr "$zeile" :zeile '    %d%{1,}    ' = %
        #        "    $d    "
        #}
         catv zeile /%n
      }
   done
   ><<
done
done





###  add.bish  #############################################


read "script? Script(s) *.scr angeben: "

[ -e sym.scr ] || : > sym.scr
[ -e pac.scr ] || : > pac.scr
[ -e dev.scr ] || : > dev.scr
:>add.log

for scr in  $script
do
   [ "$scr" == sym.scr -o "$scr" == pac.scr -o "$scr" == dev.scr ] &&
      continue
   read "prefix? Prefix für $scr [pre|Q]: "
   [ "$prefix" == Q ] && continue
   z=start
   < $scr
   while readl zeile
   do
      expr "$zeile" :nam '^Edit %([^ .]%{1,%}%)%.sym' && {
         z=sym; of=sym.scr; pre=""
      }
      expr "$zeile" :nam '^Edit %([^ .]%{1,%}%)%.pac' && {
         z=pac; of=pac.scr; pre=$prefix
      }
      expr "$zeile" :nam '^Edit %([^ .]%{1,%}%)%.dev' && {
         z=dev; of=dev.scr; pre=$prefix
      }
      [ $z == start ] && {
         expr "$zeile" :num '^Layer  *%([0-9]%{1,%}%)' &&
            let "num<100" && continue
         catv zeile /%r%n >> sym.scr
         catv zeile /%r%n >> pac.scr
         catv zeile /%r%n >> dev.scr
         continue
      }
      [ $z == cancel ] && continue
      [ $z == sym -o $z == pac -o $z == dev ] &&
         grep -q "^Edit $pre$nam%.$z" $of && {
            print -r "$scr-!->$of: $pre$nam.$z" >> add.log
            z=cancel; continue
         }
      case "$z" in
        sym|pac|dev)  expr "$zeile" :zeile "$nam" "$pre&"
                      z=${z}2; print -r "$zeile" ;;
          sym2|pac2)  : ;;
               dev2)  expr "$zeile" :zeile '%(Package ''%)%([^'']%)' %
                           '%1'"$pre"'%2'
                      ;;
      esac
      catv zeile /%r%n >> $of
   done
   ><
done





###  all.bish  #############################################


dirs=$( list -dp /home2 )
expr "$dirs" :dirs '/home2/All' = ''
local f=000000
list -fpR $dirs |
   while let "++f<=10000" && readl F
   do
      link -s "$F" /home2/All/$f
   done



###  allprjzip.bish  #############################################


remove -s /u/all.zip
zip /u/all.zip %
   /dos/cie/mc/c/lib/*.* %
   /dos/cie/mc/c/mu1000c/*.* %
   /dos/cie/mc/c/mu1000c200/*.* %
   /dos/cie/mc/c/mu2000c/*.* %
   /dos/cie/mc/c/mu2000cFR/*.* %
   /dos/cie/mc/c/mu2doc/*.* %
   /dos/cie/mc/c/mu2siemens/*.* %
   /dos/cie/mc/c/pms300/*.* %
   /dos/cie/mc/c/tds/*.*
ls -l /u/*.zip



###  anz1.bish  #############################################


OFILE=bish_anz.out

NAM="Helmut Schellong%r"
STR="Pestalozzi-Straße 72%r"
ORT="32108  Bad Salzuflen%r"
TEL="Tel (05222) 82513 ù Fax 84540%r"

YMAX=2710 XMAX=1980

start()  {
   echo "%eE%e&a9L%e&k2G%e*t600R%e%1Binsc0,4,0,4,2;
sd1,341,2,1,4,10,5,0,6,3,7,4148ss;
DT³,1sp1wu0pw0.0lo2;
rf1,10,8,1,%c" >> $OFILE
   echo "1,1,0,0,0,0,0,0,0,0,%c" >> $OFILE
   echo "0,0,0,0,0,0,0,0,0,0,%c" >> $OFILE
   echo "0,0,0,0,0,1,1,0,0,0,%c" >> $OFILE
   echo "0,0,0,0,0,0,0,0,0,0,%c" >> $OFILE
   echo "1,1,0,0,0,0,0,0,0,0,%c" >> $OFILE
   echo "0,0,0,0,0,0,0,0,0,0,%c" >> $OFILE
   echo "0,0,0,0,0,1,1,0,0,0,%c" >> $OFILE
   echo "0,0,0,0,0,0,0,0,0,0,;" >> $OFILE
   echo "PUpa0,0;" >> $OFILE
}

init()  {
   #1/8 S. = 128x43mm = H~The x Breite
   M=$1
   AH=$((1280*M)) AB=$((430*M))
   RDEC=$((7*M))
   XY0=$(([XMAX-AB]-900)),$(([YMAX-AH]/2))
   E1=$((30*M)) E2=$((45*M)) EB=$((10*M))
   RO=$((12*M)) RU=$((12*M)) RLR=$((12*M)) RAD=$((50*M))
}

ecken()  {
   echo "
pa$XY0;rr-$E1,-${EB}rr$E2,-${EB}rr-$EB,-${E1}rr-$EB,$E2;
pr$AB,0rr-$E2,-${EB}rr$E1,-${EB}rr$EB,-${E1}rr$EB,$E2;
pr0,$AH;rr-$E2,${EB}rr$E1,${EB}rr$EB,-${E2}rr$EB,$E1;
pr-$AB,0rr-$E1,${EB}rr$E2,${EB}rr-$EB,-${E2}rr-$EB,$E1;
" >> $OFILE
}

rahmen()  {
   echo "
pa$XY0;pr$RDEC,$RDEC;rr$((AB-RDEC*2)),$((AH-RDEC*2));
pr$RLR,$((RU+RAD))pm0pr0,$((AH-RDEC*2-RAD*2-RU-RO));
ar$RAD,0,-90,0.5pr$((AB-RDEC*2-RAD*2-RLR*2)),0ar0,-$RAD,-90,0.5;
pr0,-$((AH-RDEC*2-RAD*2-RU-RO))ar-$RAD,0,-90,0.5;
pr-$((AB-RDEC*2-RAD*2-RLR*2)),0ar0,$RAD,-90,0.5pm2tr0ft10,0fptr;
" >> $OFILE
   [ $M = 1 ] && echo "pa$XY0;ft11,1rr$AB,$AH;ft1;" >> $OFILE
}

abs()  {
   local rad=25 abs=6 ybr=10 neig=15 y
   y=$(([rad*2-abs*2-ybr]*M))
   echo "
sd4,$((8*M)),5,4lo14pa$XY0;pr$((AB/2)),$((RDEC+RU+10*M));
lb$TEL³pr0,$((28*M))sd4,$((8*M)),5,0lb$ORT³pr0,$((27*M));
lb$STR³pr0,$((27*M))lb$NAM³sd4,$((12*M));
pr0,$((27*M+32*M))pm0ci$((rad*M)),0.5pm2ft1fp;
pr0,$(([rad-abs]*M))pm0;
pr0,-$((ybr*M)),$((neig*M)),-$y,0,$((ybr*M)),-$((neig*M)),$y;
pm2ft10,0tr0fp
pr0,-$(([rad-abs]*2*M))pm0;
pr0,$((ybr*M)),-$((neig*M)),$y,0,-$((ybr*M)),$((neig*M)),-$y;
pm2fpft1tr1;
" >> $OFILE
#\\
}

text()  {
   local my=25
   echo "
sd4,$((22*M)),5,4lo16pa$XY0;pr$((AB/2)),$((AH-RDEC-RO));
lbDOS...UNIX%r³pr0,-$((94*M));
sd4,$(mulfp 11 $M)lo6;
WWWWWWW-WWWWWWWW  ¯WWW®%W³WWW,-$((WW*W));
WWWWWW~DWW WWWW WW~AWWW.%W³WWW,$(WWWWW WW $W)WWW,-$((WW*W));
WWWWWWW W~AW WWWWWWWWW WWW%W³WWW,-$((WW*W));
WWWWWWWWWW WWWWWWWW WWWWWWW.%W³WWW,-$((WW*W));
WWWWWWWWWWWW WWW WWWW-WWW.%W³WWW,-$((WW*W));
WWWWWWWWWW WWW WW WWW-WWWW%W³WWW,-$((WW*W));
WWWWWWWWWWW WWW WWWWWW WWWWWW!%W³WWW,-$((WW*W));
WWW,$(WWWWW W.WW $W),W,WWWWWW-$((WW/W-WWWW-WWW-WW*W)),W;
WWþ WWWWWWWWWWWWW WWWWW~AWWW WWW WWWWWWWW%W³WWW,-$((WW*W));
WWþ WWWWW WWWWWW WWWWWWWWW%W³WWW,-$((WW*W));
WW   ( WWWWW,WWWWWW; WWWWWWWWW- W. WWWWW-WWWWW )%W³WWW,-$((WW*W));
WWþ WWWW-WWWW-WWWWWWWW-WWWWWWWWWW  &|%W³WWW,-$((WW*W));
WWþ WWWWWWWWWWWWWW-WWW-WWWWWWWW%W³WWW,-$((WW*W));
WWþ WWW-WWWW-WW-WW-WWWWWW-WWWWWWWW%W³WWW,-$((WW*W));
WWþ WWWW,WWWW,WW,WWW,WWW,WW,WWW,...  WWWWWW!%W³WWW,-$((WW*W));
WWþ WWWWWWW WWWWWWWWWWW%W³WWW,-$((WW*W));
WWþ WWWWWWWWWWW~DWWWW WWWWWWW WWWWWWWWWWW%W³WWW,-$((WW*W));
WWþ WW WWWWWW WW-WWWW WWWWWWWWW WWW WWW. WW.%W³WWW,-$((WW*W));
WWþ WWWWWW WWWWWWWWWWWWWWW WWWWWWWWWWWWWWW%W³WWW,-$((WW*W));
WWþ WW~TáWW-WWWWWW W WWWWWWWW%W³WWW,-$((WW*W));
WWþ WWWWWWWW W~AW WWWWWWWWWWW WWWWWWW%W³WWW,-$((WW*W));
WWþ WWWWWWWWWWW WWWWWWWWWWWWWW-WWWWWW%W³WWW,-$((WW*W));
" >> $WWWWW
   WWWW "
WWþ WWWWWWWWWWW~DWWWWWW W-WWW-W~DWWW%W³WWW,-$((WW*W));
WWþ WWWWWWWW WWWWWWW WWWWWWWWWW%W³WWW,-$((WW*W));
WWþ WWWWWWWWWWWWWWW  ù  WWWWW. >WWWW%W³WWW,-$((WW*W));
WWþ WWWWWWWWWWW  WWW,WW,WW,WW,...  WWWW~AWWWW%W³WWW,-$((WW*W));
WWþ WWWWWWW WWWWWWWWW W~AW WWW WWW WWW-WWWW%W³WWW,-$((WW*W));
WWW,$(WWWWW W.W $W),W,W;
WWWWW WW.WW :   WW WWW,-- / WW,--%W³WWW,-$((WW*W));
WWWWW. WWWW. :   WW WW WW,--%W³WWW,-$((WW*W));
WWW,W;
WWWWWWW-WWWWWW  WWW~AWW. WW% WWWW%W³WWW,-$((WW*W));
WWWWW~AWWW W. WWWWWWWWW  WW% WWWWWWá%W³WWW,-$((WW*W));
WWW,W;
WWWWWWWWWWWW WWWW WWWWW WWWWWWW.%W³WWW,-$((WW*W));
WWW~AWWWWWWWWWW òWW/WWW.%W³WWW,-$((WW*W));
WWWWWW/WWWW-WWWWWWWW WWWWW WW WW.%W³WWW,-$((WW*W));
" >> $OFILE
}

M1txt()  {
   echo "
pa$XY0;pr$((AB+200)),$AH;lo3sd4,28,5,0,6,3;
lbM $M:1%r%n³sd4,12,5,4,6,0;
lbDies ist nur ein Anschauungsbeispiel im%r%n³
lbOriginal-Maástab.%r%n³
lbAls Auflichtvorlage verwenden Sie bitte%r%n³
lbdie gr~Táere Beilage  M 2:1.%r%n³
lbDer Grauton zeigt die einfarbige%r%n³
lbUnterlegung der Anzeigenfl~Dche.%r%n³
lbAnzeigenh~The = 128 mm%r%n³
lbAnzeigenbreite = 43 mm%r%n³
lbFarbprobe (gelb) aus iX:%r%n³
" >> $OFILE
}

MXtxt()  {
   echo "
pa$XY0;pr$((AB+200)),$AH;lo3sd4,28,5,0,6,3;
lbM $M:1%r%n³sd4,12,5,4,6,0;
lbBitte als Auflichtvorlage verwenden.%r%n³
lbDie Eckenkreuze begrenzen die gekaufte%r%n³
lbAnzeigenfl~Dche und sind nicht%r%n³
lbBestandteil dieser Fl~Dche.%r%n³
lbAnzeigenh~The = 128 mm (M1:1)%r%n³
lbAnzeigenbreite = 43 mm (M1:1)%r%n³
lbDie Anzeigenfl~Dche soll einfarbig%r%n³
lbunterlegt werden.%r%n³
lbFarbprobe (gelb) aus iX:%r%n³
" >> $OFILE
}


end_gl()  {
   echo '%e%%0A%c' >> $OFILE
}


mulfp()  {
   local  ganz mul nn x nnx
   expr $1 :: '.*%.' || { let "x=$1*$2"; echo $x%c; return; }
   ganz=`expr $1 : '^%(.*%)%.'`
   mul=`expr $1 : '^.*%.%([0-9]*%)0*$'`
   nn=${#mul}
   let "x=$ganz$mul*$2"
   nnx=${#x}
   echo `expr $x : '^%(.%{'$((nnx-nn))'%}%)'`.%c
   echo `expr $x : '^.%{'$((nnx-nn))'%}%(.*%)$'`%c
   return
}


read "maástab? Maástab:  " rest

[ "$maástab" = 1 ] && {
   echo %c > $OFILE
   start
   init 1
   ecken
   rahmen
   abs
   text
   M1txt
   end_gl
   echo '%eE%c' >> $OFILE
   cat $OFILE >> $DRUCKER
}

[ "$maástab" -gt 1 ] && {
   echo %c > $OFILE
   start
   init $maástab
   ecken
   rahmen
   abs
   text
   MXtxt
   end_gl
   echo '%eE%c' >> $OFILE
   cat $OFILE >> $DRUCKER
}


[ -f $OFILE ] && rm $OFILE



###  array_pas.bish  #############################################



Err()  {
   print -u2 "ERR: $1"
   exit 1
   return 0
}

set L:' '50
set E:.100
set D:.100
set R:.100
RA='^#define [^"]%{1,}_%d%d%d_'
z=e
n=-00001

cat texts256.h | {
   > /tmp/_ps_txt
   while readl Z
   do
      ifset Z || continue
      case $z in
        e)
           expr "$Z" :E "$RA"'en %{1,3}"%([^"]%{1,}%)"' || continue
           z=d
        ;;
        d)
           expr "$Z" :D "$RA"'de %{1,3}"%([^"]%{1,}%)"' || Err de
           z=r
        ;;
        r)
           expr "$Z" :R "$RA"'ru %{1,3}"%([^"]%{1,}%)"' || Err ru
           z=e
           expr "$E" :E "'" += "''"
           expr "$D" :D "'" += "''"
           expr "$R" :R "'" += "''"
           let "e=40-${#E}" "d=40-${#D}" "r=40-${#R}" "++n"
           catv ". ( '" E ".', " $e,L %
                ".'"    D ".', " $d,L %
                ".'"    R ".' "  $r,L ".)," /%n
        ;;
      esac
   done
   ><
}

> "array.pas"
echo '%n(*Eventuell letztes Komma löschen*)'
echo '%nconst%nERRMESG : array[0..'"$n"'] of array[0..2] of string = ('
cat /tmp/_ps_txt
echo ");%n"
><




###  ash.bish  #############################################

#!/u/bin/bish
#!/usr/bin/bish
#sc/20.04.01
#nur bish_VV


[ -s "$1" ] || { print -u2 "Keine (gueltige) Datei: '$1'"; exit 1; }
set -f

asm1='

 .PROGRAM ~nameteil~
 .TITLE   ~nameteil~

; Erzeugt von ash.bish: ~datetime~

 .section IOBASE, IO, locate=0x0000

'
asm2='

 .section IOXTND, DATA, locate=0x~extend~

'
h1='
#ifndef   __MB90XXX_H
#  define __MB90XXX_H
/*
- Please define __IO_NEAR in LARGE and COMPACT memory model, if the default
  data bank (DTB) is 00. This will result in better performance in these
  models.
- Please define __IO_FAR in SMALL and MEDIUM memory model, if the default
  data bank (DTB) is other than 00. This might be the case in systems with
  external RAM, which are not using internal RAM as default data area.
- Please define neither __IO_NEAR nor __IO_FAR in all other cases. This
  will work with almost all configurations.
*/

#if defined(byte) || defined(word) || defined(dword)
# error "byte/word/dword  definiert!"
#endif

#  ifdef  __IO_NEAR
#    ifdef  __IO_FAR
#      error __IO_NEAR and __IO_FAR must not be defined at the same time
#    else
#      define ___IOWIDTH __near
#    endif
#  else
#    ifdef __IO_FAR
#      define ___IOWIDTH __far
#    else                               /* specified by memory model */
#      define ___IOWIDTH
#    endif
#  endif
#  ifdef  __IO_DEFINE
#    define __IO_EXTERN
#    define __IO_EXTENDED volatile ___IOWIDTH
#  else
#    define __IO_EXTERN   extern      /* for data, which can have __io */
#    define __IO_EXTENDED extern volatile ___IOWIDTH
#  endif

typedef unsigned char         IO_BYTE;
typedef unsigned short        IO_WORD;
typedef unsigned long         IO_LWORD;
typedef const unsigned short  IO_WORD_READ;

'
# .GLOBAL __pdr0,     __pdr1,     __pdr2,     __pdr3,     __pdr4,     __pdr5
# .org 0xhhhh
#__xxx .res.b 16|0x10
# .end

#typedef union{
#    IO_BYTE        byte;
#    struct{
#    IO_BYTE ADE0 :1;
#    IO_BYTE ADE7 :1;
#  }bit;
#}ADERSTR;
#__IO_EXTERN __io ADERSTR _ader;
#define ADER _ader.byte
#define ADER_ADE0 _ader.bit.ADE0
#define ADER_ADE7 _ader.bit.ADE7
#__IO_EXTENDED TMR0STR _tmr0;


mktemp Tmpf1
mktemp Tmpf2
mktemp Tmpf3


Err()  {
   [ $# -gt 0 ] && print -u2 "ash.bish: ERROR: '$*'%n   >>>$zeile<<<"
   remove $Tmpf1 $Tmpf2 $Tmpf3
   [ $# -eq 0 ] && exit 0
   exit 1
   return
}


PrGlob()  {
   local n=1 v=.. g1 g2 g3 g4
   echo >> $Tmpf1
   for 4 g1 g2 g3 g4 in $Glob
   do
      conv -l g1 g2 g3 g4
      for n from 1 to 4 repeat
      do
         v=g$n
         ifset g$n && g$n="__${{v}"
         ifset g$((n+1)) && g$n="${{v}, "
      done
      prints ss-18s-18s-18s-18 " .GLOBAL " %
             "$g1" "$g2" "$g3" "$g4" >> $Tmpf1
   done
   echo >> $Tmpf1
   Glob=''
   return
}


MkBitF()  {
   local bf=,,,,,,,, bfc0=,,,,,,,, bfc=,,,,,,,,
   local b=00 b2=00 d=00 d0=00
   BitFc='' bfc0=''
   for bf in $BitF
   do
      let ++b
      expr "$bf" :bfc '^%(..*%)%d$' && expr "$bf" :d '%(%d%)$' && {
         let "d-d0==1" && [ "$bfc0" == "$bfc" ] && { d0=$d
            let "b2==0" && { b2=1
               let "(b-=2)>0" && BitFc="$BitFc . $b"
               b=2
            }
            continue
         }
         let b2 && BitFc="$BitFc $bfc0 $((b-1))"  b=1
         bfc0=$bfc d0=$d b2=0
         continue
      }
      let b2 && BitFc="$BitFc $bfc0 $((b-1))"  b=1
      bfc0='' d0=0 b2=0
   done
   ifset BitFc && {
      let b2 && BitFc="$BitFc $bfc0 $b"
      let !b2 && BitFc="$BitFc . $b"
      for 2 bf b in $BitFc
      do
         [ "$bf" != . ] && expr "$BitF" :: "%<$bf%>" && { BitFc='' ; return 1; }
      done
      return 0
   }
   return 1
}



prints vs300 zeile

expr "$1" :ifn '^%(..*%)%.[^.]%{1,}$' || ifn="$1"

tz -2
time=$(systime -t)
expr "$asm1" :asm1 '~nameteil~' += "_$ifn"
expr "$asm1" :asm1 '~datetime~' = "$time"
catv asm1 >> $Tmpf1
echo "%n/* Erzeugt von ash.bish: $time, $ifn */" >> $Tmpf3
catv h1 >> $Tmpf3

extend=0000
adr=00000000
siz=00000001
siz2=00000000
arr=00000000
arr1=00000000
arr2=00000000
nam=..........
namu=..........
nam0=............
org=........
extrn=...........................
typ=................
typ2=................
typ20=................
typ21=................
type=................
prints vs2500 Glob
prints vs300 BitF
prints vs300 BitFc
Glob=''
nbitf=000 n=00000000 rb=000

local adrlim=00000255 mk=..............  ak=..............
local ab=..............  ar=.............. s=00000000


PrBitFields()  {
   local nn="$1" nk="$2" typ="$3"
   local n=.......... un=.......... s=00
   [ -n "$nn" ] && let "arr>=10&&nn<10" && nn=0$nn
   prints s-17s14s "#define" "$namu$nn" "    _$nam$nk.$typ"
   {  #nbitf
      for n in $BitF
      do
         expr "$n" :: '[.-]' && continue
         un=$n  conv -u un
         [ $n == int ] && n=_int
         prints s-9s-24s "#define" $namu${nn}_$un "  _$nam$nk.bit.$n"
      done
   }
   for 2 n s in $BitFc
   do
      expr "$n" :: '[.-]' && continue
      un=$n  conv -u un
      [ $n == int ] && n=_int
      prints s-9s-24s "#define" $namu${nn}_$un "  _$nam$nk.bitc.$n"
   done
   echo
}


GetZeile()  {
   local z='                                          '
   while readl zeile
   do
      ifset zeile || continue
      expr "$zeile" =:extend '^EXT:%(....%)$' && continue
      expr "$zeile" :: '^[+0-9]' || continue
      while expr "$zeile" :zeile '^%(..*%)[ %t]*+%{1,}$'
      do
         readl z || break
         zeile="$zeile $z"
      done
      return 0
   done
   return 1
}


PutBF()  {
   local w="$1" a=00 b=00
   expr "$w" :a '(%(%d%{1,}%),%d%{1,})$'
   expr "$w" :b '(%d%{1,},%(%d%{1,}%))$'
   expr "$w" :w '^%([^(]%{1,}%)('
   let "${#w}>6" && Err "Bitfeld-Name zu lang [6]: '$w'"
   while :
   do
      BitF="$BitF $w$a"
      let ++nbitf "a==b" && break
      let "a<b" && let ++a
      let "a>b" && let --a
   done
   return
}


DataFromZeile()  {
   local cas=adr w=.....................
   for w in $zeile
   do
      case "$cas" in
        adr)  cas=nam
              expr "$w" :: '^+$' && continue
              expr "$w" :: '^[0-9][0-9a-fA-F]*$' && {
                 let "16#$w==adr" && continue
                 let "16#$w<adr" && let "siz=adr-16#$w"
                 let "adr=16#$w"
                 org=$w
                 continue
              }
              ;,
        nam)  expr "$w" :: '^[a-zA-Z_]%w*$' || Err "$w"
              cas=siz
              let "${#w}>14" && Err "Name zu lang [14]: '$w'"
              nam=$w
              conv -l nam
              [ "$nam" == "$nam0" ] && Err "Doppelt: $nam"
              nam0="$nam"
              Glob="$Glob $w"
              ;;
        siz)  cas=arr
              expr "$w" :: '^%d$' && { siz=$w ; continue; }
              expr "$w" :siz '^%(%d%):%d$' &&
                 expr "$w" :siz2 '^%d:%(%d%)$' && continue
              ;,
        arr)  cas=bit
              expr "$w" :arr '^%(%d%{1,2}%)' &&
                 expr "$w" :w '^%d%{1,2}%(.*%)$'
              expr "$w" :arr1 '^(%(%d%{1,2}%))$' && continue
              expr "$w" :: '^(%d%{1,2},%d%{1,2})$' && {
                 expr "$w" :arr1 '%(%d%{1,}%)'
                 expr "$w" :arr2 ',%(%d%{1,}%))$'
                 continue
              }
              [ "$arr" != 0000 ] && continue
              ;,
        bit)  expr "$w" :: '^[a-zA-Z_]%w*(%d%{1,2},%d%{1,2})$' && {
                 PutBF "$w" ; continue
              }
              expr "$w" :: '^[-.a-zA-Z_]%w*$' || Err "$w"
              expr "$w" :: '^[-.].' && Err "$w"
              let "${#w}>6" && Err "Bitfeld-Name zu lang [6]: '$w'"
              BitF="$BitF $w"
              let ++nbitf
              ;;
          *)  Err Interner Fehler ;;
      esac
   done
   [ "$cas" == adr -o "$cas" == nam ] && Err "$zeile"
   [ "$cas" == bit ] && {
      let "nbitf>0&&(siz2==0&&nbitf!=siz*8||siz2!=0&&nbitf!=siz2*8)" &&
         Err "Anzahl:$BitF"
      conv -l BitF
   }
   return
}


< "$1"
while GetZeile
do
   BitF='' org=''
   nbitf=000 arr=0000 arr1=00 arr2=00
   siz=1 siz2=0
   DataFromZeile

   let "siz!=1&&siz!=2&&siz!=4" && Err "sz==$siz"
   let "siz2!=0&&siz2!=1&&siz2!=2&&siz2!=4" && Err ":sz2==$siz2"
   let "siz2>=siz" && Err "sz:sz $siz<=$siz2"
   let "adrlim>0&&adr>adrlim" && { adrlim=0
      let "16#$extend<256" && Err "EXT:hhhh-Zeile fehlt"
      expr "$asm2" :asm2 '~extend~' = "$extend"
      PrGlob
      cat $Tmpf2 >> $Tmpf1
      : > $Tmpf2
      catv asm2 >> $Tmpf1
   }
   ifset org && prints sbssf04 " .org" 0x $org >> $Tmpf2
   s=$siz
   let arr  && let "s*=arr"
   let arr1 && let "s*=arr1"
   let arr2 && let "s*=arr2"
   prints s-17sbs __$nam .res.b $s >> $Tmpf2
   let "adr+=s"

   extrn="__IO_EXTERN __io"
   let "adr-s>255" && extrn="__IO_EXTENDED   "
   let siz==1 && typ=IO_BYTE typ2=byte
   let siz==2 && typ=IO_WORD typ2=word
   let siz==4 && typ=IO_LWORD typ2=dword
   let siz2==1 && typ20=IO_BYTE typ21=byte
   let siz2==2 && typ20=IO_WORD typ21=word
   let siz2==4 && typ20=IO_LWORD typ21=dword
   ar= mk= ak= ab= rb=14
   let "arr"  && ar="[$arr]"
   let "arr1" && mk="(a)" ak="[$arr1]" ab="[a]" rb=19
   let "arr2" && mk="(a,b)" ak="[$arr1][$arr2]" ab="[a][b]" rb=19
   namu="$nam"
   conv -u namu
   >> $Tmpf3
   let "nbitf==0&&siz2==0" && {
      prints s-17s${rb}sss "$extrn" $typ "  _$nam" "$ar$ak" ";"
      let "!arr" && {
         prints s-17s${rb}ssn "#define" $namu$mk "  _$nam" "$ab"
         >< ; continue
      }
      for n from 0 to 0$((arr-1)) repeat
      do
         let "arr>=10&&n<10" && n=0$n
         prints s-17s$((rb+2))ss "#define" $namu$n$mk "  _$nam" "[$n]$ab"
      done
      echo
      >< ; continue
   }
   let "nbitf==0&&siz2!=0" && {
      echo "typedef union {"
      echo "   $typ $typ2;"
      echo "   $typ20 $typ21;"
      echo "} ${namu}_t;"
      prints s-17s${rb}sss "$extrn" ${namu}_t "  _$nam" "$ar$ak" ";"
      let "!arr" && {
         prints s-17s${rb}sn "#define" $namu$mk "  _$nam$ab.$typ21"
         >< ; continue
      }
      for n from 0 to 0$((arr-1)) repeat
      do
         let "arr>=10&&n<10" && n=0$n
         prints s-17s$((rb+2))s "#define" $namu$n$mk "  _${nam}[$n]$ab.$typ21"
      done
      echo
      >< ; continue
   }
   let arr1 && Err "Operation nicht moeglich: $ar$ak"
   type=$typ
   echo "typedef union {"
   echo "   $typ $typ2;"
   let siz2 && type=$typ20 && echo "   $typ20 $typ21;"
   {  #nbitf
      echo "   struct {"
      for n in $BitF
      do
         expr "$n" :: '[.-]' && n=''
         [ "$n" == int ] && n=_int
         prints ss10s7s "      " $type "$n" ":1;"
      done
      echo "   } bit;"
   }
   MkBitF && {
      echo "   struct {"
      for 2 n s in $BitFc
      do
         expr "$n" :: '[.-]' && n=''
         [ "$n" == int ] && n=_int
         prints ss10s7s "      " $type "$n" ":$s;"
      done
      echo "   } bitc;"
   }
   echo "} ${namu}_t;"
   prints s-17s16sss "$extrn" ${namu}_t "  _$nam" "$ar" ";"
   type=$typ2
   let siz2 && type=$typ21
   let  arr && {
      for n from 0 to 0$((arr-1)) repeat
      do
         PrBitFields $n "[$n]" $type
      done
   }
   let !arr && PrBitFields "" "" $type
   ><
done
><


echo " .end%n" >> $Tmpf2
PrGlob
cat $Tmpf2 >> $Tmpf1
cat $Tmpf1 > $ifn.asm

>> $Tmpf3
echo "#define IDRw(i,v)  (IDR(i)=(((v)<<5)<<8|((v)<<5)>>8))"
echo "#define IDRr(i)  ((IDR(i)<<8|IDR(i)>>8)>>5)"
echo "#define AMR0w(v)  (AMR0=(((v)<<5)<<8|((v)<<5)>>8))"
echo "#define AMR0r  ((AMR0<<8|AMR0>>8)>>5)"
echo "#define AMR1w(v)  (AMR1=(((v)<<5)<<8|((v)<<5)>>8))"
echo "#define AMR1r  ((AMR1<<8|AMR1>>8)>>5)"
echo
echo "#define IDR0w(i,v)  (IDR0(i)=(((v)<<5)<<8|((v)<<5)>>8))"
echo "#define IDR0r(i)  ((IDR0(i)<<8|IDR0(i)>>8)>>5)"
echo "#define AMR00w(v)  (AMR00=(((v)<<5)<<8|((v)<<5)>>8))"
echo "#define AMR00r  ((AMR00<<8|AMR00>>8)>>5)"
echo "#define AMR10w(v)  (AMR10=(((v)<<5)<<8|((v)<<5)>>8))"
echo "#define AMR10r  ((AMR10<<8|AMR10>>8)>>5)"
echo
echo "#define IDR1w(i,v)  (IDR1(i)=(((v)<<5)<<8|((v)<<5)>>8))"
echo "#define IDR1r(i)  ((IDR1(i)<<8|IDR1(i)>>8)>>5)"
echo "#define AMR01w(v)  (AMR01=(((v)<<5)<<8|((v)<<5)>>8))"
echo "#define AMR01r  ((AMR01<<8|AMR01>>8)>>5)"
echo "#define AMR11w(v)  (AMR11=(((v)<<5)<<8|((v)<<5)>>8))"
echo "#define AMR11r  ((AMR11<<8|AMR11>>8)>>5)"
><

echo "%n#endif%n" >> $Tmpf3
cat $Tmpf3 > $ifn.h


Err
exit 0





###  atp.bish  #############################################

#!/u/bin/bish_com
#!/u/cie/wms/cgi/bish_folso_cgi -p_


set -f

MUanrufen()  {
   local telnu=$1 ch=00 offs=00000 cksum:010 ring="RING$RN.........."
   while :
   do
   case $AnrufZ in
     dialout)
        [ MOwahl -eq 0 ] && AnrufZ=getdata continue
        let "$SECONDS-DOtime<=40" && { sleep 2; continue; }
        WriteAT "$MOdialout" "$telnu" || DOtime=$SECONDS break
        AnrufZ=waitpass TOsec=$SECONDS DOtime=0
     ;;
     waitpass)
        let "$SECONDS-TOsec>10" && break
        com -p || return 0
        AnrufZ=pass
     ;;
     pass)
        com -it400id15i1000 Ibuf
        catv $.,Ibuf =Hbuf:
        catv Hbuf
        expr "$Hbuf" =:: 'PASSWORD:' || break
        ring="@DK40mopas"
        com -cot50od10o10 ring
        sleep -m 150
        com -ocot30od10o2 RN
        AnrufZ=waitpassok TOsec=$SECONDS
     ;;
     waitpassok)
        let "$SECONDS-TOsec>10" && break
        com -p || return 0
        AnrufZ=passok
     ;;
     passok)
        com -it300id15i1000 Ibuf
        catv $.,Ibuf =Hbuf:
        catv Hbuf
        expr "$Hbuf" =:: 'PASSWORD %{1,3}OK' || break
        AnrufZ=getdata
     ;;
     getdata)
        [ Status -eq 2 ] && AnrufZ=writecfg continue
        [ Status -eq 3 ] && AnrufZ=readcfg continue
        GetMUdata $Fmustatus Nn dk40 || {
           echo "$Nn Bytes"
           [ MOwahl -eq 0 ] && break
           ring=@EN:
           com -cot30od10o4 ring
           break
        }
        echo "$Nn Bytes"
        AnrufZ=data
     ;;
     data)
        MUkategorie_c $Fmustatus
        cat $Fmustatus > $MUdir/stat
        [ ! -e "$MUdir/lock" -o ! -s "$MUdir/eepr" ] && AnrufZ=readcfg continue
        [ MOwahl -eq 0 ] && AnrufZ=0 goend
        AnrufZ=mowrite continue
     ;;
     mowrite)
        ring=@EN:
        sleep -m 400
        com -cot50od10o4 ring
        echo @EN: = $.
        AnrufZ=waitmoend TOsec=$SECONDS
     ;;
     waitmoend)
        let "$SECONDS-TOsec>10" && break
        com -p || return 0
        AnrufZ=moend
     ;;
     moend)
        com -it300id15i1000 Ibuf
        catv $.,Ibuf =Hbuf:
        catv Hbuf
        expr "$Hbuf" =:: 'Connection %{1,3}aborted' || break
        AnrufZ=0
        #[ Status -eq 2 -o Status -eq 3 ] && AnrufZ=0
     ;;
     dialin)
        WriteAT "$MOabnehmen" || break
        AnrufZ=getokayfail
     ;;
     getokayfail)
        GetMUdata $Fokayfail Nn rdonly || break
        echo "$Nn Bytes"
        AnrufZ=okayfail
     ;;
     okayfail)
        #< $Fokayfail
        #><
        #MkTbl5data $Ftbl5 addmu "$mustat" "$muokfa" "$mudati"
        AnrufZ=0
     ;;
     writecfg)
        sum -w cksum < $MUdir/eepr
        let "cksum+=16#1d0f, cksum&=65535"
        base -10 cksum +w cksum
        ring=129
        base -10 ring +b ch
        ring=@PC:
        com -cot40od10o4 ring
        com -it400id20i1 Ibuf
        catv 1,Ibuf /%j
        com -cot30od10o1 ch
        com -it400id10i1 Ibuf
        catv 1,Ibuf /%j
        catv 2048,0 =Hbuf < $MUdir/eepr
        for offs from 0 by 32 to 2016 repeat
        do
           com -cot80od10oO${offs}o32 Hbuf
           com -it600id20i1 Ibuf
           catv 1,Ibuf
        done
        com -cot30od10o2 cksum
        com -it400id10i2 ring
        echo
        catv 2,cksum =cksum:
        catv 2,ring =ring:
        base -w cksum +16
        base -w ring +16
        cmpv cksum ring || break
        [ MOwahl -ne 0 ] && AnrufZ=mowrite continue
        AnrufZ=0
     ;;
     readcfg)
        ring=128
        base -10 ring +b ch
        ring=@PC:
        com -cot40od10o4 ring
        com -it400id20i1 Ibuf
        catv 1,Ibuf /%j
        com -cot30od10o1 ch
        com -it3500id20i2050 Ibuf
        echo $.
        catv 2048,Ibuf > ../tmp/eeprin
        sum -w cksum < ../tmp/eeprin
        let "cksum+=16#1d0f, cksum&=65535"
        base -10 cksum +w cksum
        com -cot30od10o2 cksum
        catv 2,cksum =cksum:
        catv 2048,2,Ibuf =ring:
        base -w cksum +16
        base -w ring +16
        cmpv cksum ring || break
        mucrc cksum Ibuf 2 1898 || break
        catv 0,2,Ibuf =ring:
        base -w ring +10 ring
        echo "$cksum : $ring"
        [ cksum -ne ring ] && break
        cat ../tmp/eeprin > $MUdir/eepr
        remove ../tmp/eeprin
        #base -W +w < $MUdir/eepr | catv 2048,0 =5000,2048,3  3<> C:\DATA.MUC
        #catv $(( 960<<1)),2,0 =ring:  < $MUdir/eepr
        #base -w ring +10 ring
        #MUspsw=0
        #let "ring==1" && MUspsw=1
        #catv $((1001<<1)),2,0 =ring:  < $MUdir/eepr
        #base -w ring +10 ring
        #let "ring==1" && MUspsw=2
        [ MOwahl -ne 0 ] && AnrufZ=mowrite continue
        AnrufZ=0
     ;;
   esac
   return 0
   done
   return 1
}


GetMUdata()  {
   local nrw=0000000000 sum=00000
   catv /@DK40: =6,Ibuf
   [ "$3" == dk40 ] && com -cot100od10o6 Ibuf
   until com -p
   do
      let "sum+=10, sum>3000" && break
      sleep -m 10
   done
   echo "InputWait: $sum ms"
   com -it500id20i4000 Ibuf
   nrw=$. $2=$. sum=0
   let "sum+=nrw, nrw==0" && return 1
   > $1
   while [ nrw -gt 0 ]
   do
      [ "$3" == dk40 ] && conv '-t `' Ibuf
      catv $nrw,Ibuf
      com -it500id20i4000 Ibuf
      let "nrw=$., sum+=nrw"
   done
   ><
   $2=$sum
   return 0
}


MAIN()  {
   sleep -m $Wait
   Sec=$SECONDS
   case $Status in
     0)
        [ MUcall -ge 30 -a MUcall -le 39 ] && { let "MUcall-=20"; Uvars MUcall; }
        com -p && {
           [ MOwahl -eq 0 ] && { com -ic; continue; }
           com -it60id10i1500 Ibuf
           catv $.,Ibuf =Hbuf:
           catv '/[' Hbuf '/]'
           GetMOmsgNr Hbuf && let "Hbuf&4" && MOri=1 MOrings=0 %
              MOritime=$Sec Wait=150 Status=9 MUcall=39 Uvars MUcall
           continue
        }
        fstat -mv Uv uvars.bish
        [ Uv -ne Uv0 ] && { Uv0=$Uv  . ./uvars.bish; }
        [ MOwahl -ne 0 -a MOisinit -ne 1 ] && {
           Status=7 MOinittime=-30
           [ MOisinit -eq 0 ] && MUcall=37 Uvars MUcall
           continue
        }
        [ MOwahl -eq 0 ] && MOisinit=0
        [ Sec -ge St ] && {
           let "St=Sec+10"; systime Stime
           [ ConnTest -gt 0 ] && [ -s $Fstation ] && {
              [ CTbuild -ne 0 ] && { BuildCT; continue; }
              let "Sec-DOtime<=90||Sec-CTwait<=150" && continue
              [ Stime -ge CTtime -a CTtime -ge 10 ] && {
                 SetVarsCT && MUcall=6; } ||
                 WrLog "Connect test" "SetVars failed: $CTgid/$CTaid"
           }
        }
        [ MUcall -eq  1 ] && Status=1
        [ MUcall -eq  2 ] && Status=2
        [ MUcall -eq  6 ] && Status=6 echo CT: $CTgid $CTaid $CTtime $CTday
        [ MUcall -lt  0 ] && MUcall=00 Uvars MUcall
        [ Status -ne 0 ] && { AnrufZ=dialout let "MUcall=Status+30"; Uvars MUcall; }
        continue
     ;;
     9)
        if com -p
        then
              MOri=0
              com -it60id10i1500 Ibuf
              catv $.,Ibuf =Hbuf:
              catv '/[' Hbuf '/]'
              GetMOmsgNr Hbuf && let "Hbuf&4" && MOri=1
        else  let "MOrings+=MOri, MOrings>=3" && {
                 Status=8 Wait=500 MUcall=38 Uvars MUcall
                 AnrufZ=dialin continue
              }
              MOri=0
        fi
        let "Sec-MOritime>20" && {
           Status=0 Wait=500 MUcall=29 Uvars MUcall
           WrLog "RING event" "less then 3 rings"
           continue
        }
        continue
     ;;
     1)
        MUanrufen $Telnu || { 
           MOisinit=2 Status=0 MUcall=21 Uvars MUcall
           WrLog "Call get data" "failed: $AnrufZ" $MUdir/log
        }
        [ $AnrufZ != 0 ] && continue
        MOisinit=2 Status=0 MUcall=11 Uvars MUcall
        continue
     ;;
     2)
        MUanrufen $Telnu || { 
           MOisinit=2 Status=0 MUcall=22 Uvars MUcall
           WrLog "Call configure" "failed: $AnrufZ" $MUdir/log
        }
        [ $AnrufZ != 0 ] && continue
        MOisinit=2 Status=0 MUcall=12 Uvars MUcall
        continue
     ;;
     6)
        MUanrufen $Telnu || { 
           WrLog "Connect test $MUdir" "failed: $AnrufZ"
           WrLog "Connect test" "failed: $AnrufZ" $MUdir/log
           GetTryCT Hbuf
           if [ Hbuf -ge CTtries ]
           then  FailCT; WriteCT full
           else  WriteCT try
           fi
           NextCT; CTwait=$Sec
           MOisinit=2 Status=0 MUcall=26 Uvars MUcall
        }
        [ $AnrufZ != 0 ] && continue
        WriteCT okay; NextCT; CTwait=$Sec
        MOisinit=2 Status=0
        continue
     ;;
     8)
        MUanrufen || { 
           MOisinit=2 Status=0 MUcall=28 Uvars MUcall
           WrLog "Incoming call" "failed: $AnrufZ"
        }
        [ $AnrufZ != 0 ] && continue
        OkayFail $Fokayfail || MUcall=28 Uvars MUcall
        MOisinit=2 Status=0
        continue
     ;;
     7)
        fstat -mv Uv uvars.bish
        [ Uv -ne Uv0 ] && { Uv0=$Uv  . ./uvars.bish; }
        [ MOwahl -eq 0 ] && Status=0 MOisinit=0 continue
        let "$Sec-MOinittime<30" && continue
        WriteAT "$MOauflegen"
        WriteAT "$MOinit" && Status=0 MOisinit=1
        [ MOisinit -eq 2 ] && Status=0 MOisinit=0
        MOinittime=$Sec
        continue
     ;;
   esac
}
#------------------------------------------------------------------------


WaitData()  {
   local dp=0 len=00000
   Ilen=0
   com -it400id20i1 dp
   if expr "$dp" :: '^:$'
   then
      com -it400id20i1 dp
      base -b dp +10 len
      com -it400id20i$len Ibuf
      Ilen=$.
      Mode=BIN
   else
      com -it400id20i1000 Ibuf
      Ilen=$.
      catv 1,dp $Ilen,Ibuf =Ibuf
      let "++Ilen"
      Mode=TXT
   fi
   return 0
}


WaitREADY()  {
   local ok:.20
   com -it700id20i10 Ibuf
   catv $.,Ibuf =20,ok:
   expr "$ok" :: '^@[0-9]:READY'"$RN" || return 1
   catv 10,Ibuf
   return 0
}


WaitOK()  {
   local ok:.20
   com -it400id20i7 Ibuf
   catv $.,Ibuf =20,ok:
   expr "$ok" :: '^@[0-9]:OK'"$RN" || return 1
   catv 7,Ibuf
   return 0
}


Kommando()  {
   echo $1
   return 0
}


ID()  {
   local n=0000000000 id=0000000000$1
   local len=5 cksum=00000 ilen=00000
   base -10 id +l id
   base -10 len +b len
   catv 1,len 4,id | sum -b cksum
   let "cksum=~cksum&255"
   base -10 cksum +b cksum
   catv /: 1,len 4,id 1,cksum =id:
   for n to $Lcnt repeat
   do
      [ Lcnt -gt 1 ] && echo %t$n
      while :
      do
         case $IdZ in
           IDsend)
             Obuf="@3!ID$RN"
             com -cot40od10o7 Obuf
             WaitOK || break 2
             com -cot40od10o7 id
             WaitOK || break 2
             Obuf="@3!SEND$RN"
             com -cot40od10o9 Obuf
             WaitOK || break 2
             IdZ=datarecv
             ;;
           datarecv)
             WaitData || break 2
             ilen=$Ilen
             [ $Mode == BIN ] && let --ilen
             catv $ilen,Ibuf /%j
             Obuf="@3:OK$RN"
             com -cot40od10o7 Obuf
             IdZ=IDsend
             WaitREADY || break 2
             #sleep -m 10
             break
             ;;
         esac
      done
   done
   IdZ=IDsend
   return 0
}
#------------------------------------------------------------------------


#8>&1

set Ibuf:0.2048
set Obuf:0.1024
IdZ=IDsend
Ilen=0000000000
Mode=BIN
Lcnt=0000000001
Lcnt=1
Ofile=stdout
catv /%r%n =RN:

#BSD: /dev/cuaa0, /dev/ttyd0
case "FreeBSD" in
  FreeBSD)   Sio='/dev/ttyd0' Tty='/dev/ttyp1';;
  OpenUnix)  Sio='/dev/term/00t' Tty='/dev/pts016';;
  *)         Sio='/dev/null' Tty='/dev/console';;
esac
#1>> $Tty
#2>> $Tty

com +L  $Sio || { print -u2 "TTY-Device '$Sio'" "open failed"; com -; exit 1; }
com -B57600
com -s 1
com -H comhandle
fstat -h 0 1 2 $comhandle
echo

Obuf="@3!START$RN"
com -cot40od10o10 Obuf
WaitOK || { print -u2 "START failed"; com -; exit 2; }


while print -u2 "
%tAusgabedatei  : o file  [$Ofile]
%tLoop count    : l #     [$Lcnt]
%tKommando      : Kommando
%tID+SEND       : #       (id)
%tBeenden       : E

%t              : _%b%c"
do
   read cmd opt
   com -p && { com -it700id20i1000 Ibuf; catv $.,Ibuf; }
   ifset cmd || continue
   case "$cmd" in
     o)  expr "$opt" :: '^[a-zA-Z_0-9/\]%{1,}$' || continue
         [ $Ofile == $opt ] && continue
         Ofile=$opt
         if [ $Ofile == stdout ]
         then  ><
         else  1>$Ofile
         fi
         ;;
     l)  expr "$opt" :: '^[1-9][0-9]*$' || continue
         Lcnt=$opt
         ;;
     [a-zA-Z][a-zA-Z_0-9]*)
         expr "$cmd" :: '^[a-zA-Z_0-9]%{2,15}$' || continue
         Kommando $cmd ;;
     [0-9]??*)
         expr "$cmd" :: '^[0-9][0-9]*$' || continue
         ID $cmd ;;
     E)  break;;
     *)  echo %a%c; continue;;
   esac
done


Obuf="@3!END$RN"
com -cot40od10o8 Obuf
WaitOK || print -u2 "END failed"

com -
#[ -t 1 -a -n "$Tty" -a -c "$Tty" ] && ><
#[ -t 2 -a -n "$Tty" -a -c "$Tty" ] && ><
exit 0





###  autoexec.bish  #############################################


global
alias MU="cd \u\mc\c\mu1000c"
alias CV="cd \u\c\mucv"



###  base2bin.bish  #############################################

#!/u/bin/bish

set -f
set Z:.250 liste:.150 null:0.256
l=00 u=.. v=........ mif=0000 maf=0000

MakeBin()  {
   #0.0.000.00000
   >$2
   <$1
   while read id dd adr grp idlink sort parbn typ bytelen darst nbit bitpos %
              access dflt1 min max %
              flags einheit name Tinfo Tgrp Tsgrp Tbit Text text
   do
      expr "$id" :: '^%$' && break
      expr "$id" :: '^[:.]..*' && continue;
      expr "$id" :id '^@%([0-9]%{1,}%)' && {
         let "adr=$adr" "bytelen=$bytelen" "id=$id" "parbn=$parbn"
         let "id+=dd*100000000"
         prints vsf010 pid $id
         nelem=1 mif=0 maf=0 voffs=0
         expr "$flags" :nelem 'A%([0-9]%{1,}%)'
         expr "$flags" :nelem 'S%([0-9]%{1,}%)'
         liste=
         while :
         do
            seek + 0 sk
            readl Z
            expr "$Z" :: '^@:.' || { seek $sk 0; break; }
            catv 2,,Z =0:,,liste
         done
         [ "$darst" ==  1 ] && darst=/
         expr "$darst" :darst '%.%([0-9]%)'
         if [ "$typ" == s ]
         then
            min=0
            max=0
         else
            [ "$min" == '"' ] && min=0
            [ "$max" == '"' ] && max=0
            l=4 u=u
            [ bytelen -eq 4 ] && l=8 u=ul
            for v in min max
            do
               case "$typ" in
                 b)  expr "${{v}}" :$v '^x%([0-9a-fA-F]%{1,}%)$' && goend
                     base -2 $v +16 $v ;;
                 x)  goend ;;
                 *)  continue ;;
               esac
               prints vssf0${l}s $v 0x ${{v}} $u ;;
            done
         fi
         [ "$einheit" == '"' ] && einheit=
         flg=0000000000 txtgrp=0 txtnum=0
         expr "$flags" :txtnum 'T%(%d%{1,3}%)'
         expr "$flags" :txtgrp 'G%(%d%{1,3}%)'
         expr "$flags" :: 'a'   && let "flg|=1<<30"
         expr "$flags" :: 'Z'   && let "flg|=1<<24"
         expr "$flags" :: 'S'   && let "flg|=1<<23"
         expr "$flags" :: 'A'   && let "flg|=1<<22"
         expr "$flags" :: 'E'   && let "flg|=1<<21"
         expr "$flags" :: 'N'   && let "flg|=1<<19"
         expr "$flags" :: 'F'   && let "flg|=1<<18"
         expr "$flags" :: 'm'   && let "flg|=1<<17"
         expr "$flags" :: 'D'   && let "flg|=1<<16"
         expr "$flags" :: 'd'   && let "flg|=1<<15"
         expr "$flags" :: ':'   && let "flg|=1<<14"
         expr "$flags" :: 'I'   && let "flg|=1<<13"
         expr "$flags" :: 't1'  && let "flg|=1<<12"
         expr "$flags" :: 'l'   && let "flg|=1<<11"
         expr "$flags" :: 't2'  && let "flg|=1<<10"
         expr "$flags" :: 'B'   && let "flg|=1<<8"
         expr "$flags" :: '1%.' && let "flg|=1<<7"
         expr "$flags" :: 'q'   && let "flg|=1<<6"
         expr "$flags" :: 'K'   && let "flg|=1<<5"
         expr "$flags" :: 'i'   && let "flg|=1<<4"
         expr "$flags" :: 's'   && let "flg|=1<<3"
         expr "$flags" :: 'n'   && let "flg|=1<<2"
         expr "$flags" :: 'b'   && let "flg|=1<<1"
         expr "$flags" :: 'r'   && let "flg|=1"
         [ "$name" == 0 -o "$name" == '"' ] && name=0 ptr= let "flg|=512"

         base -10 pid +l
         base -10 flg +l
         let "flg&1<<15" && min=0 max=3200
         if [ $typ == b -o $typ == x ]
         then
            expr "$min" :min '^0x%([0-9a-fA-F]%{1,}%)'
            base -16 min +l
            base -10 mif +w
            expr "$max" :max '^0x%([0-9a-fA-F]%{1,}%)'
            base -16 max +l
            base -10 maf +w
         else
            if [ $typ == s ]
            then
               base -10 mif +l; base -10 mif +w
               base -10 maf +l; base -10 maf +w
            else
               [ "$darst" == 'm' ] && let "min=(min+30)/60" "max=(max+30)/60"
               expr "$darst" :: '^[123]$' && {
                  d=0001 g=... f=...
                  to 0$darst repeat; do let "d*=10"; done
                  for 2 g f in min mif max maf
                  do
                     let "$f=$g%d" "$g/=d" "$g<0&&$f<0" && let "$f*=-1"
                  done
               }
               base -10 min +l; base -10 mif +w
               base -10 max +l; base -10 maf +w
            fi
         fi
         base -16 access +w
         base -10 nelem +w
         base -10 bytelen +b
         base -10 nbit +b
         catv 1,typ 1,darst
         #28 bis hier
         prints vsF00020 null ''
         catv einheit =null
         catv 19,null /%n
         if let "flg&1<<11"
         then
            prints vsF00096 null ''
            catv liste =null
            catv 95,null /%n
         fi
      }
   done
   ><<
   return 0
}


MakeBin ./base/cfgbase.txt cfg.dat
MakeBin ./base/mesbase.txt mes.dat

:





###  batt.bish  #############################################

#:EnerSys SBS190F: Entl.->1.8V; 20°C
#:zeit	[A]	[Ah]
#5m	377.2	31.4
#10m	377.2	62.8
#15m	313.0	78.3
#20m	266.7	88.9
#25m	234.4	97.7
#30m	208.6	104.3
#35m	188.8	110.1
#40m	172.6	115.1
#45m	159.2	119.4
#1h	129.5	129.5
#2h	76.0	152.0
#3h	54.4	163.2
#4h	42.5	170.0
#5h	35.0	175.0
#6h	29.9	179.4
#7h	26.1	182.7
#8h	23.2	185.6
#9h	20.9	188.1
#10h	19.0	190.0
#20h	10.3	206.0
#:Ladung: I= (3+Ib/C10)/4
#: I= 750+250*Ib/C10
#$

C10=190
K10=1900

<"$0"
while read z Ib ah
do
   expr "$z" :: '^#%d%{1,}[mh]' || {
      expr "$z" :: '^#$' && break
      continue
   }
   conv -d. Ib ah
   let "I=750+250*Ib/C10"
   echo $z $Ib $ah $((100*K10/ah)) $I
done
><





###  batt.bish  #############################################


[ $# -eq 0 ] && {
   Files=?*.[chCH]
   Files="$Files CFGBASE.TXT"
}
[ $# -gt 0 ] && Files=$*

for F in $Files
do
   m=0
   cat $F | {
      > $F
      while readl Z
      do
         expr "$Z" :Z 'Batt%.i1%[' += 'Batt.i[' && m=1
         expr "$Z" :Z 'Batt%.%(%w%{1,}%)%(%[[^]]%{1,}]%)' + 'Batt.B%2.%1' && m=1
	 catv Z /%r%n
      done
      ><
   }
   [ m -eq 1 ] && echo $F
done



###  bool.bish  #############################################


ho=$((2#100000))
hs=$((2#010000))
ht=$((2#001000))
so=$((2#000100))
ss=$((2#000010))
st=$((2#000001))
echo ho hs ht so ss st

for n from 0 to 63 repeat
do
   let "n&hs&&n&ss" && continue
   let "e= (n&ho||(n&hs)==0&&(n&ht)==0)&&
           (n&so||(n&ss)==0&&(n&st)==0)"
   prints sf06s $((2#, n)) =$e
done

#sense= !( !ho&&(hs||ht) || !so&&(ss||st) )


###  box11.bish  #############################################

#!/u/bin/bish

X=200 Y=1500 A=100
nthlr=10 nthou=6
nbav=1  #Nutenbreitenaddition vorn
dou=16 dlr=25 dv=8 dh=8 dvh=8  #Dicken
r=$((dou/2))  #Radius
uebhh=$dou  #Überhang hinten
uebhv=$((dou+nbav))  #Überhang vorn
bi=850  #Breite innen
ti=425  #Tiefe innen
hi=400  #Höhe innen
bou=$((bi+2*dlr))
tlr=$((ti+dh+uebhh))
hlr=$hi
tou=$((tlr+uebhv))

Box="pa$X,$Y
er$bou,$dou;pr0,$dou;er$dlr,$hi;pr0,$hi;er$bou,$dou;pr$bou,0;er-$dlr,-$hi
pa$((X+bou+A)),$Y
er$tou,$dou;pr0,$dou;er$tlr,$hlr;pr0,$hlr;er$tou,$dou
pa$X,$((Y-A))
er$bou,-$tou
pa$X,$Y;pw0.3lt-2,5,1
pr$((dlr-nthlr)),$((dou-nthou));er$((bi+nthlr*2)),$((hi+nthou*2))
"

print -n "%e%1Bin;sc0,1980,0,2724,0sp1puwu0pw0.5la1,4,2,4;"
catv Box
print -n "%e%1A%eE"




###  brand_lx  #############################################

#!/u/bin/bish

[ $# -eq 0 ] && exit
Tmp=/tmp/blx_$$
find "$@" -type f -print | file -N -f - > $Tmp
[ -s $Tmp ] || { rm $Tmp; exit; }
<$Tmp
while readl F
do
   expr "$F" :: 'ELF .*executable' || continue
   expr "$F" :F '^%(..*%): ' || continue
   [ -L "$F" -o -d "$F" ] && continue
   [ -s "$F" ] || continue
   brandelf "$F" || continue
   brandelf -t Linux "$F" && brandelf "$F"
done
><
rm $Tmp




###  bsatz  #############################################

#!/u/bin/bish
# Blocksatz


ozadd()  {
   typeset -i10 nadd=$1 nz=$# zn
   shift
   (( nz-=2 ))
   for zn from $nz by -1 to 1 repeat
   do
      print -nr "$1"; shift
      prints s$(( nadd/nz+1+[zn<=nadd%nz] ))-
   done
   print -r "$1"
}



set -f
[ $# -gt 0 ] && < "$1"
sps="`prints s18-`"
rw=`prints sf+80-`
rz=`prints sf+120-`
oz=`prints sf+120-`
oz=''
while read inp
do
   ifset inp || {
      ifset oz && {
         #let "rw=44-${#oz}"
         #oz="`ozadd $rw $oz`"
         catv sps oz /%n; oz=''
      }
      echo; continue
   }
   ifset oz && oz="$oz $inp"
   ifset oz || oz="$inp"
   [ ${#oz} -lt 44 ] && continue
   while [ ${#oz} -ge 44 ]
   do
      [ ${#oz} -eq 44 ] && { catv sps oz /%n;oz=''; continue 2; }
      #expr "$oz" :rz '^.%{44%}%(.*%)$'
      #expr "$oz" :oz '^%(.%{44%}%)'
      catv 44,,oz =:rz
      catv 44,oz =:oz
      if expr "$rz" :: '^ '
      then
         catv sps oz /%n
         expr "$rz" :oz '^.%(.*%)$'
      elif expr "$oz" :rw ' %([^ ]*%)$'
      then
         rz="$rw$rz"
         expr "$oz" :oz '^%(.*%) [^ ]*$'
         let "rw=44-${#oz}"
	 catv sps
         ozadd $rw $oz
         oz="$rz"
      else
         catv sps oz /%n
         oz="$rz"
      fi
   done
   #[ ${#oz} -eq 44 ] && { prints s18-; echo "$oz"; oz=''; }
done

ifset oz && {
   #let "rw=44-${#oz}"
   #oz="`ozadd $rw $oz`"
   catv sps oz /%n
}

[ $# -gt 0 ] && ><





###  bsatz  #############################################

#!/u/bin/bish

o=$1
until [ "$o" == l -o "$o" == u -o "$o" == lr -o "$o" == ur ]
do
   echo ToLower/ToUpper [rekursiv]
   read "o?Optionen {l|u}[r]: "
   ifset o || exit 0
done

expr "$o" :: 'l' && lu=L
expr "$o" :: 'u' && lu=U
r=' '
expr "$o" :: 'r' && r=R

bish -c "list -d$r; list -f$r" |
while readl Z z
do
   expr "$Z" :z '[^/\]%{1,}$' "%%$lu&"
   cmpv Z z && continue
   zz="$z"
   a=0
   while [ -e "$z" ]
   do
      let "++a>9" && continue 2
      print -r "Bereits existent: '$z'"
      expr "$z" :z '%(.%)%(%.[^.]%{1,}%)$' "%1$a%2" || z="$z$a"
   done
   print -r "$Z --> $z"
   move "$Z" "$z"
   fsync "$z"
   let 'a==0' && continue
   [ -e "$zz" ] && print -r "Bereits existent: '$zz'"
   [ -e "$zz" -a -d "$zz" ] && continue
   print -r "$z --> $zz"
   move "$z" "$zz"
   fsync "$zz"
done

exit 0



###  bsatz  #############################################

#!/u/bin/bish

N=-15
[ $# -lt 1 ] && exit 0
[ $# -ge 2 ] && N=-$1 shift

ps -xhwwo user,pid,ppid,pgid,stat,tt,time,command |
   while read - pid - - - - - cmd
   do
      [ pid -eq $$ ] && continue
      expr "$cmd" :: "$1" && {
	 echo kill $cmd ...
	 kill $N $pid
      }
   done

:



###  bsatz.bish  #############################################

#!/u/bin/bish
# Blocksatz
# Copyright (c) 1996  Helmut Schellong


ozadd()  {
   typeset -i10 nadd=$1 nz=$# zn
   shift
   (( nz-=2 ))
   for zn from $nz by -1 to 1 repeat
   do
      print -nr "$1"; shift
      prints s$(( nadd/nz+1+[zn<=nadd%nz] ))-
   done
   print -r "$1"
}



set -f
[ $# -gt 0 ] && < "$1"
sps="`prints s18-`"
rw=`prints sf+80-`
rz=`prints sf+120-`
oz=`prints sf+120-`
oz=''
while read inp
do
   ifset inp || {
      ifset oz && {
         #let "rw=44-${#oz}"
         #oz="`ozadd $rw $oz`"
         catv sps oz /%n; oz=''
      }
      echo; continue
   }
   ifset oz && oz="$oz $inp"
   ifset oz || oz="$inp"
   [ ${#oz} -lt 44 ] && continue
   while [ ${#oz} -ge 44 ]
   do
      [ ${#oz} -eq 44 ] && { catv sps oz /%n;oz=''; continue 2; }
      #expr "$oz" :rz '^.%{44%}%(.*%)$'
      #expr "$oz" :oz '^%(.%{44%}%)'
      catv 44,,oz =:rz
      catv 44,oz =:oz
      if expr "$rz" :: '^ '
      then
         catv sps oz /%n
         expr "$rz" :oz '^.%(.*%)$'
      elif expr "$oz" :rw ' %([^ ]*%)$'
      then
         rz="$rw$rz"
         expr "$oz" :oz '^%(.*%) [^ ]*$'
         let "rw=44-${#oz}"
	 catv sps
         ozadd $rw $oz
         oz="$rz"
      else
         catv sps oz /%n
         oz="$rz"
      fi
   done
   #[ ${#oz} -eq 44 ] && { prints s18-; echo "$oz"; oz=''; }
done

ifset oz && {
   #let "rw=44-${#oz}"
   #oz="`ozadd $rw $oz`"
   catv sps oz /%n
}

[ $# -gt 0 ] && ><





###  btr.bish  #############################################

#!/u/bin/bish

# CAN BTR Bittimeregister

#100 kHz, RSJ=2-->RSJW=3
#0 100 1001 10  001001
#- TS2 TS1  RSJ PSC
local mhz=000 bt=0000000000 BT=10000000 #picos Periodendauer für ein Bit in Picosekunden
local picos=00000 rsj=00 ts1=00 ts2=00 psc=00
local tq=0000000000 rsjw=00000 btr=0000000000 proz=0000
local Ts1=0000000000 Ts2=0000000000 c=00

#for 2 mhz picos in 16 62500 24 41667 32 31250
#mhz Ist die Quartzfrequenz, picos ist 1/Quartzfrequenz und BT ist die Bittime in picosekunden
#BT für 100Khz = 10000000
#BT für 125Khz =  8000000
#for 3 mhz picos BT in 16 62500  8000000
#for 3 mhz picos BT in 24 41667  8000000
#for 3 mhz picos BT in 24 41667 10000000
for 3 mhz picos BT in 16 62500 10000000
do
   for rsj from 0 to 3 repeat
   do
      for ts1 from 0 to 15 repeat
      do
         for ts2 from 0 to 7 repeat
         do
            for psc from 1 to 63 repeat
            do
               (( tq= (psc+1)*picos,
                  bt= (3+ts1+ts2)*tq,
                  rsjw= (rsj+1)*tq,
                  Ts1= (ts1+1)*tq,
                  Ts2= (ts2+1)*tq,
                  1000000%mhz!=0&&(bt>BT+100||bt<BT-100)||
                  1000000%mhz==0&&bt!=BT
               )) && continue
               #  bt!=BT
               c=00
               let "Ts1>2*tq&&Ts1>rsjw&&Ts2>2*tq&&Ts2>rsjw+2*tq" && c='>> '
               [ $c == 00 ] &&
               let "Ts1>2*tq&&Ts1>rsjw&&Ts2>2*tq&&Ts2>rsjw" && c='G> '
               [ $c == 00 ] &&
               let "Ts1>=2*tq&&Ts1>=rsjw&&Ts2>=2*tq&&Ts2>=rsjw+2*tq" && c='>>='
               [ $c == 00 ] &&
               let "Ts1>=2*tq&&Ts1>=rsjw&&Ts2>=2*tq&&Ts2>=rsjw" && c='G>='
               [ $c == 00 ] && continue
               let "btr=ts2<<12|ts1<<8|rsj<<6|psc"
               btr=$((16#, btr)); conv -u btr; prints vsf04 btr $btr
	       let "proz=(1+Ts1+1)*100/(1+Ts1+1+Ts2+1)"
               echo "// ${mhz}[MHz]" "$((bt/1000))[ns]" $btr $proz %
                    "$c" ts2=$ts2 ts1=$ts1 rsj=$rsj psc=$psc
               #echo psc=$psc ts1=$ts1 ts2=$ts2 rsj=$rsj
               #Ts1=$Ts1 Ts2=$Ts2 rsjw=$rsjw tq=$tq
            done
         done
      done
   done
done

:




###  btr.bish  #############################################

#!/u/bin/bish

# CAN BTR Bittimeregister

#100 kHz, RSJ=2-->RSJW=3
#0 100 1001 10  001001
#- TS2 TS1  RSJ PSC
local mhz=000 bt=0000000000 BT=10000000 #picos Periodendauer für ein Bit in Picosekunden
local picos=00000 rsj=00 ts1=00 ts2=00 psc=00
local tq=0000000000 rsjw=00000
local Ts1=0000000000 Ts2=0000000000 c=00

#for 2 mhz picos in 16 62500 24 41667 32 31250
#mhz Ist die Quartzfrequenz, picos ist 1/Quartzfrequenz und BT ist die Bittime in picosekunden
#BT für 100Khz = 10000000
#BT für 125Khz =  8000000
#for 3 mhz picos BT in 16 62500  8000000
for 3 mhz picos BT in 24 41667  8000000
do
   for rsj from 0 to 3 repeat
   do
      for ts1 from 0 to 15 repeat
      do
         for ts2 from 0 to 7 repeat
         do
            for psc from 1 to 63 repeat
            do
               (( tq= (psc+1)*picos,
                  bt= (3+ts1+ts2)*tq,
                  rsjw= (rsj+1)*tq,
                  Ts1= (ts1+1)*tq,
                  Ts2= (ts2+1)*tq,
                  1000000%mhz!=0&&(bt>BT+100||bt<BT-100)||
                  1000000%mhz==0&&bt!=BT
               )) && continue
               #  bt!=BT
               c=00
               let "Ts1>2*tq&&Ts1>rsjw&&Ts2>2*tq&&Ts2>rsjw+2*tq" && c='>> '
               [ $c == 00 ] &&
               let "Ts1>2*tq&&Ts1>rsjw&&Ts2>2*tq&&Ts2>rsjw" && c='G> '
               [ $c == 00 ] &&
               let "Ts1>=2*tq&&Ts1>=rsjw&&Ts2>=2*tq&&Ts2>=rsjw+2*tq" && c='>>='
               [ $c == 00 ] &&
               let "Ts1>=2*tq&&Ts1>=rsjw&&Ts2>=2*tq&&Ts2>=rsjw" && c='G>='
               [ $c == 00 ] && continue
               echo "// ${mhz}[MHz]" "$((bt/1000))[ns]" %
                    "$c" ts2=$ts2 ts1=$ts1 rsj=$rsj psc=$psc
               #echo psc=$psc ts1=$ts1 ts2=$ts2 rsj=$rsj
               #Ts1=$Ts1 Ts2=$Ts2 rsjw=$rsjw tq=$tq
            done
         done
      done
   done
done

:




###  btr.bish  #############################################

#!/u/bin/bish

# CAN BTR Bittimeregister

#100 kHz, RSJ=2-->RSJW=3
#0 100 1001 10  001001
#- TS2 TS1  RSJ PSC
local mhz=000 bt=0000000000 BT=10000000 #picos
local picos=00000 rsj=00 ts1=00 ts2=00 psc=00
local tq=0000000000 rsjw=00000
local Ts1=0000000000 Ts2=0000000000 c=00

for 2 mhz picos in 16 62500 24 41667 32 31250
do
   for rsj from 0 to 3 repeat
   do
      for ts1 from 0 to 15 repeat
      do
         for ts2 from 0 to 7 repeat
         do
            for psc from 1 to 63 repeat
            do
               (( tq= (psc+1)*picos,
                  bt= (3+ts1+ts2)*tq,
                  rsjw= (rsj+1)*tq,
                  Ts1= (ts1+1)*tq,
                  Ts2= (ts2+1)*tq,
                  1000000%mhz!=0&&(bt>BT+100||bt<BT-100)||
                  1000000%mhz==0&&bt!=BT
               )) && continue
               #  bt!=BT
               c=00
               let "Ts1>2*tq&&Ts1>rsjw&&Ts2>2*tq&&Ts2>rsjw+2*tq" && c='>> '
               [ $c == 00 ] &&
               let "Ts1>2*tq&&Ts1>rsjw&&Ts2>2*tq&&Ts2>rsjw" && c='G> '
               [ $c == 00 ] &&
               let "Ts1>=2*tq&&Ts1>=rsjw&&Ts2>=2*tq&&Ts2>=rsjw+2*tq" && c='>>='
               [ $c == 00 ] &&
               let "Ts1>=2*tq&&Ts1>=rsjw&&Ts2>=2*tq&&Ts2>=rsjw" && c='G>='
               [ $c == 00 ] && continue
               echo "// ${mhz}[MHz]" "$((bt/1000))[ns]" %
                    "$c" ts2=$ts2 ts1=$ts1 rsj=$rsj psc=$psc
               #Ts1=$Ts1 Ts2=$Ts2 rsjw=$rsjw tq=$tq
            done
         done
      done
   done
done

:




###  btr.bish  #############################################

#!/u/bin/bish

# CAN BTR Bittimeregister

local mhz=000 bt=0000000000 BT=10000000 #picos
local picos=00000 rsj=00 ts1=00 ts2=00 psc=00
local tq=0000000000 rsjw=00000
local Ts1=0000000000 Ts2=0000000000 c=00

for 2 mhz picos in 32 31250 16 62500
do
   for rsj from 0 to 3 repeat
   do
      for ts1 from 0 to 15 repeat
      do
         for ts2 from 0 to 7 repeat
         do
            for psc from 1 to 63 repeat
            do
               (( tq= (psc+1)*picos,
                  bt= (3+ts1+ts2)*tq,
                  rsjw= (rsj+1)*tq,
                  Ts1= (ts1+1)*tq,
                  Ts2= (ts2+1)*tq,
                  bt!=BT
               )) && continue
               c=00
               let "Ts1>2*tq&&Ts1>rsjw&&Ts2>2*tq&&Ts2>rsjw+2*tq" && c='>> '
               [ $c == 00 ] &&
               let "Ts1>2*tq&&Ts1>rsjw&&Ts2>2*tq&&Ts2>rsjw" && c=' > '
               [ $c == 00 ] &&
               let "Ts1>=2*tq&&Ts1>=rsjw&&Ts2>=2*tq&&Ts2>=rsjw+2*tq" && c='>>='
               [ $c == 00 ] &&
               let "Ts1>=2*tq&&Ts1>=rsjw&&Ts2>=2*tq&&Ts2>=rsjw" && c=' >='
               [ $c == 00 ] && continue
               echo "// ${mhz}[MHz]" "$((bt/1000))[ns]" %
                    "$c" ts2=$ts2 ts1=$ts1 rsj=$rsj psc=$psc
               #Ts1=$Ts1 Ts2=$Ts2 rsjw=$rsjw tq=$tq
            done
         done
      done
   done
done

:




###  build.bish  #############################################


expr "$PWD" =:: '[/\]release$' && cd ..
expr "$PWD" :PD '[/\]%([^/\]%{1,}%)$'
conv -l PD
case "$PD" in
   mu2000)  DSH='8000 10000 10000 4000 4000 4000 4000';;
     upc3)  DSH='8000 10000 10000 4000 4000 4000 4000';;
   upc3cf)  DSH='40000 40000 40000';;
     upc4)  DSH='40000 40000 40000';;
        *)  echo "Verzeichnisname ist so unbekannt. Bitte in 'build.bish anpassen!"; exit 1;;
esac
echo $PD

(. ./bish/uniqid.bish base/cfgbase.txt %
                    base/mesbase.txt %
                    base/txtbase.h   ) || exit 9
(. ./bish/uniqadr.bish base/cfgbase.txt) || exit 9
(. ./bish/overlapadr.bish base/cfgbase.txt) || exit 9
(. ./bish/texts.bish)
(. ./bish/tpa.bish $DSH)
(. ./bish/cfg.bish)

:





###  build.bish  #############################################


expr "$PWD" =:: '[/\]release$' && cd ..
expr "$PWD" :PD '[/\]%([^/\]%{1,}%)$'
conv -l PD
case "$PD" in
   mu2000)  DSH='8000 10000 10000 4000 4000 4000 4000';;
     upc3)  DSH='8000 10000 10000 4000 4000 4000 4000';;
   upc3cf)  DSH='40000 40000 40000';;
     upc4)  DSH='40000 40000 40000';;
     u229)  DSH='40000 40000 40000';;
        *)  echo "Verzeichnisname ist so unbekannt. Bitte in 'build.bish anpassen!"; exit 1;;
esac
echo $PD

(. ./bish/uniqid.bish base/cfgbase.txt %
                    base/mesbase.txt %
                    base/txtbase.h   ) || exit 9
(. ./bish/texts.bish)
(. ./bish/tpa.bish $DSH)
(. ./bish/cfg.bish)

:





###  build.bish  #############################################


expr "$PWD" =:: '[/\]release$' && cd ..
expr "$PWD" :PD '[/\]%([^/\]%{1,}%)$'
conv -l PD
case "$PD" in
   mu2000)  DSH='8000 10000 10000 4000 4000 4000 4000';;
     upc3)  DSH='8000 10000 10000 4000 4000 4000 4000';;
   upc3cf)  DSH='40000 40000 40000';;
     upc4)  DSH='40000 40000 40000';;
        *)  echo "Verzeichnisname ist so unbekannt. Bitte in 'build.bish anpassen!"; exit 1;;
esac
echo $PD

(. ./bish/uniqid.bish base/cfgbase.txt %
                    base/mesbase.txt %
                    base/txtbase.h   ) || exit 9
(. ./bish/texts.bish)
(. ./bish/tpa.bish $DSH)
(. ./bish/cfg.bish)

:





###  build.bish  #############################################



expr "$PWD" :PD '/%([^/]%{1,}%)$'
conv -l PD
case "$PD" in
   mu2000)  DSH='8000 10000 10000 4000 4000 4000 4000';;
     upc3)  DSH='8000 10000 10000 4000 4000 4000 4000';;
        *)  DSH='8000 10000 10000 4000 4000 4000 4000';;
esac
echo $PD

(. ../bish/texts.bish)
(. ../bish/tpa.bish $DSH)
(. ../bish/cfg.bish)

:





###  build.bish  #############################################



(. ../bish/texts.bish)
(.  ./tpa.bish)
(. ../bish/cfg.bish)




###  build.bish  #############################################



(. texts.bish)
(. tpa.bish)
(. cfg.bish)




###  c256.bish  #############################################

#!/home/bin/bish

for C from 0 to 255 repeat
do
   base -10 C +b CB
   let "C<32" && CB=" "
   prints ss3ss4  "   /* " $C " '$CB' */  " $C,
done



###  calcaddrsigen.bish  #############################################

#!/u/bish


#
CalcSet()  {
   local pad=0000 ele=0000 adr=110000
   while readl Z
   do
      expr "$Z" :flags ' %(p%d%{1,}A%d%{1,}%)st2T' && {
         expr "$flags" :pad 'p%(%d%{1,}%)'
         expr "$flags" :ele 'A%(%d%{1,}%)'
         [ adr -gt 110000 ] && {
            prints vsf06 adr $adr
            expr "$Z" :Z ' %d%{6} ' = " $adr " ||
            expr "$Z" :Z ' ' = '!'
         }
         let 'adr+=ele+pad'
      }
      catv Z /%n
   done
   return 0
}


CalcSet





###  call.bish  #############################################


< $1
> _$1
while readl zeile
do
   expr "$zeile" :: '[ %t]call .' || { catv zeile /%j; continue; }
   grep -Fq -e "$zeile" call || { catv zeile /%j; continue; }
   echo '%tmovl %%ecx,ECX'
   catv zeile /%j
   echo '%tmovl ECX,%%ecx'
done
><<



###  canid.bish  #############################################

#!/u/bin/bish

set GER:.100
Found=00

# ID
Get()  {
   local ger=.... id=0000 n=000 inc=000 fnd=00 cid=$1
   GER=
   for 4 ger id n inc in %
        LAMP  10   1   0 %
         BUI  80  16 -64 %
          MU  48  16 -16 %
         STS  64  16 256 %
        INV0  96  32 256 %
         REC 128 128 256 %
         DCC 768 128 256 %
         RK1 256  16  16 %
         FMB 288   4 256 %
         XXA 292   4 256 %
         XXX 296  16 256 %
         CAL 312   8 256 %
         FAN 320  16 256 %
         MMB 336   4 256 %
         DEB 340   2 256 %
         RYB 342   2 256 %
         BMB 344   8 256 %
        INV1 352  32 256 %
         RD1 736  32 256 %
         RDP 760   8 256
   do
      let "$1>=id&&$1<id+n" && { let ++fnd; GER="$GER tx ${ger}.$((cid-id))"; }
      let "$1>=id+inc&&$1<id+n+inc" && { let ++fnd; GER="$GER rx ${ger}.$((cid-id-inc))"; }
   done
   Found=$fnd
   [ fnd -eq 0 ] && return 1
   return 0
}



N=0000
local txrx=.... ger=..........

for N from 0 to $((1023+256)) repeat
do
   prints s4- $N
   Get $N
   [ Found -eq 0 ] && GER="- - - -"
   [ Found -eq 1 ] && GER="$GER - -"
   for 2 txrx ger in $GER
   do
      prints s6ss-9-  "&$txrx" " " "&$ger"
   done
   if let "(N&15)==15"
   then
      echo " \\%n%%%%%n%%%%%%%%"
   else
      echo " \\"
   fi
done





###  cat.bish  #############################################


p=/scratch/VALUE
cat /scratch/NT/EAGLE/SC/SMD.LBR- > 1.lib
cat /scratch/NT/EAGLE/SC/SMD.LBR- > 2.lib
cat /scratch/NT/EAGLE/SC/SMD.LBR- > 3.lib
n=31
while let "++n<=43"
do
   cat $p/350$n >> 1.lib
   cat $p/350$((n+12)) >> 2.lib
   cat $p/350$((n+12*2)) >> 3.lib
done



###  catinfo.bish  #############################################

#!/u/bin/bish

base=gcc
name=/usr/local/info/$base.info

[ -s $name ] && cat $name >> ${base}_info

for n from 0 to 99 repeat
do
   [ -s $name-$n ] && cat $name-$n >> ${base}_info
   [ -s $name-$n.gz ] && gunzip -c $name-$n.gz >> ${base}_info
done




###  cfg.bish  #############################################

#!/u/bin/bish

set -f

VonBis()  {
   local sd=0000 nam
   [ $# -gt 0 ] || return
   for nam in $*
   do
      ifset $nam || continue
      while expr "${{nam}}" :sd '##%(-%{0,1}[0-9]%{1,}%)'
      do
         let 'sd+=von*inc2'
         expr "${{nam}}" :$nam '##-%{0,1}[0-9]%{1,}' = "$sd"
      done
      while expr "${{nam}}" :sd '#%(-%{0,1}[0-9]%{1,}%)'
      do
         let 'sd+=von'
         expr "${{nam}}" :$nam '#-%{0,1}[0-9]%{1,}' = "$sd"
      done
   done
   return 0
}


MakeTexte()  {
   #0.0.000.00000
   _id=0000000000
   grp=0000000
   obj=0000000
   sk=000000
   skvb=000000
   adr=0032
   buf=..................................................................
   von=000
   bis=000
   inc=000
   inc2=000
   info1=000
   info2=000
   parbn=00
   idadd=0000
   3>d__1
   print -u3 '%n#                include <def.h>'
   print -u3 '#                include <var.h>'
   print -u3 '#                include <texte.h>%n%n%n'
   print -u3 '// id: 0.0.000.00000'
   print -u3 '//       d grp object'
   print -u3 '
   // struct cfgdata_t { const BYTE *grp, *sgrp;
   //                    UNS4 id;
   //                    UNS2 adr, len, nbit, bitpos;
   //                    UNS4 flags;
   //                    BYTE typ, darst, info1, info2;
   //                    UNS2 parbn, nelem, voffs;
   //                    const BYTE FAR *dfstr;
   //                    UNS4 dfmima[3];
   //                    UNS2 szname;
   //                    VOL void *name;
   //                    const BYTE FAR *einheit, *text, *info;
   //                    cfap_t Tinfo, Tgrp, Tsgrp, Tbit, Text;
   // };
   '

   [ -n "$4" ] && : >$4
    >d__2
   4>d__3
   print -u4 '%n%n%nconst struct cfgdata_t FAR '"$1"'data[]= {'
   <$2
   while seek + 0 sk; read id dd typ bytelen darst nbit bitpos %
              dflt1 min1 max1 %
              parbn flags einheit name Tinfo Tgrp Tsgrp Tbit Text text
   do
      info1=?
      expr "$id" :: '^%$' && break
      expr "$id" :: '^}$' && {
         [ von -ge bis ] && inc=0 continue
         seek $skvb 0; let 'von+=inc'; continue
      }
      expr "$id" :: '^{#$' && {
         von=$dd bis=$typ inc=$bytelen inc2=$darst
         ifset inc2 || inc2=1
         seek + 0 skvb; continue
      }
      expr "$id" :: '^:..*' && {
         idadd=0 psgrp=0 obj=0 let grp+=500000
         seek $sk 0; readl Z; conv -D: Z
         [ inc -gt 0 ] && VonBis Z
         prints vssf08 pgrp G$1 $grp
         prints su3ss '       const BYTE       ' $pgrp "[]= %"$Z%";"
         echo
         let "adr>32" && let "adr=[(adr/264)+1+(adr%%264>=264/2)]*264"
         continue
      }
      expr "$id" :: '^%...*' && {
         seek $sk 0; readl Z; conv -D. Z
         [ inc -gt 0 ] && VonBis Z
         prints vssf08 psgrp g$1 $grp
         prints su3ss '       const BYTE       ' $psgrp "[]= %"$Z%";"
         continue
      }
      expr "$id" :id '^@%([0-9]%{1,}%)' && {
         let "obj+=500+idadd" "_id=grp+obj" "adr=$adr" "bytelen=$bytelen" "id=$id"
         idadd=0
         let dd && let "_id+=dd*100000000"
         let id && _id=$id
         [ inc -gt 0 -a "$typ" != s ] && VonBis parbn name text Tinfo Tgrp Tsgrp Tbit Text
         [ inc -gt 0 -a "$typ" == s ] && VonBis parbn name text dflt1 Tinfo Tgrp Tsgrp Tbit Text
         conv '-t` ' name
         idname="$name"
         expr "$idname" :: '^[A-Za-z_]' || idname="$text"
         expr "$idname" :idname '^%([^\]%{1,}%)\000'
         conv '-d[d]' idname
         expr "$idname" :idname '[^A-Za-z_0-9]' += '_'
         [ -n "$4" ] && prints ss-24s12 '#define ID_' "$idname" "$_id" >> $4
         nelem=1 voffs=0
         expr "$flags" :nelem 'A%([0-9]%{1,}%)' && {
            voffs='sizeof('"$name"')'
            [ "$name" == 0 ] && voffs=$bytelen
         }
         expr "$flags" :nelem 'S%([0-9]%{1,}%)' && {
            #expr "$name" :idname '^%(.*[^.]%)%.[^.]%{1,}$'
            expr "$name" :idname ']%..%{1,}$' = ']'
            voffs='sizeof('"$idname"')'
            [ "$name" == 0 ] && voffs=$bytelen
         }
         pad=0 autopad=0
         expr "$flags" :pad 'p%([0-9]%{1,}%)' || {
            autopad=1 let 'pad=bytelen*nelem'
         }
         buf='"'
         while :
         do
            seek + 0 sk
            readl Z
            expr "$Z" :: '^@:.' || { seek $sk 0; break; }
            catv 2,,Z =0:,,buf
         done
         [ ${#buf} -le 1 ] && buf=0
         [ ${#buf} -gt 1 ] && buf="$buf%""
         conv '-t` ' dflt1 text
         [ "$darst" ==  1 ] && darst=/
         expr "$darst" :darst '%.%([0-9]%)'
         [ "$dflt1" == '"' ] && dflt1=0
         [ "$typ" == s -a "$dflt1" == '\000' ] && dflt1=
         if [ "$typ" == s ]
         then
            let "autopad&&pad>4" && let "pad>>=1"
            ptr='&'
            w1= w2= w3=
            min1='0'
            max1="$min1"
            expr "$flags" :: '#' && goend
            dflt1="%"$dflt1%""
         else
            ptr='&'
            w1=15 w2=15 w3=14
            [ "$min1" == '"' ] && min1=0
            [ "$max1" == '"' ] && max1=0
            [ "$typ" == s ] && goend
            l=4 u=u
            [ bytelen -eq 4 ] && l=8 u=ul
            for v in dflt1 min1 max1
            do
               case "$typ" in
                 b)  expr "${{v}}" :$v '^x%([0-9a-fA-F]%{1,}%)$' && goend
                     base -2 $v +16 $v ;;
                 x)  goend ;;
                 *)  continue ;;
               esac
               prints vssf0${l}s $v 0x ${{v}} $u ;;
            done
         fi
         flg=000000 info2=0
         expr "$flags" :info2 '=%([1-9][0-9]%{0,2}%)'
         expr "$flags" :: '[sz]' && let autopad && pad=0
         expr "$flags" :: 'a' && let "flg|=1<<30"
         expr "$flags" :: 'h' && let "flg|=1<<20"
         expr "$flags" :: 'u4' && let "flg|=1<<19"
         expr "$flags" :: 'u3' && let "flg|=1<<18"
         expr "$flags" :: 'u2' && let "flg|=1<<17"
         expr "$flags" :: 'u1' && let "flg|=1<<16"
         expr "$flags" :: 'd' && let "flg|=1<<15"
         expr "$flags" :: 'c' && let "flg|=1<<14"
         expr "$flags" :: 'I' && let "flg|=1<<13"
         expr "$flags" :: 't1' && let "flg|=1<<12"
         expr "$flags" :: 'l' && let "flg|=1<<11"
         expr "$flags" :: 't2' && let "flg|=1<<10"
         expr "$flags" :: 'B[AS][0-9]' && let "flg|=256"
         expr "$flags" :: '1%.' && let "flg|=128"
         expr "$flags" :: 'q' && let "flg|=64"
         expr "$flags" :: 'K[AS][0-9]' && let "flg|=32"
         expr "$flags" :: 'i' && let "flg|=16"
         expr "$flags" :: 's' && let "flg|=8"
         expr "$flags" :: 'n' && let "flg|=4"
         expr "$flags" :: 'b' && let "flg|=2"
         expr "$flags" :: 'r' && let "flg|=1"
         expr "$flags" :: '&' && ptr=
         ds=0000000000000000000
         vname=$name
         expr "$flags" :: 'v' && ds=v name=0
         [ "$name" == 0 -o "$name" == '"' ] && name=0 ptr= let "flg|=512"
         [ "$name" != 0 ] && print -u5 "$1%t$bytelen%t$name"
         prints vssf08s flags 0x $((16#, flg)) ul
         prints vsf010 pid $_id
         echo
         prints s-28sbs %
                "#define D${pid}grp" $pgrp, $psgrp
         echo "// id; adr, len, nbit, bitpos,"
         echo "// flags(_|abgl|_|_|_|_|_|_ | _|_|_|halten|u4cal|u3sys|u2hw|u1root)"
         echo "// flags(dfltcalc|access|IP|Telem|infovals|Tbbig|novar|batt | step10|mess|kamm|initcan|sig|nod|bak|ro);"
         echo "// typ, darst, info1, info2, parbn, nelem, voffs;"
         prints s-28s11bs6bs5bs5bs5bsbsbsbsbsbsbsbs %
                "#define D${pid}obj" %
                 $_id, $adr, $bytelen, $nbit, $bitpos, $flags, %
                 "'$typ'," "'$darst'," "'$info1'," "$info2," %
                 $parbn, "$nelem," "$voffs"
         if [ "$typ" == s ]
         then
            [ "$ds" == v ] && prints s "       const BYTE ${vname}[]= $dflt1;"
            prints s "       const BYTE FAR S${pid}[]= $dflt1;"
            ds=S${pid} dflt1=0 min1=0 max1=0
         else
            ds=0
         fi
         prints s-28s %
                "#define D${pid}str" "$ds"
         prints s-28s${w1}bs${w2}bs${w3} %
                "#define D${pid}dfmima" "$dflt1," "$min1," "$max1"
         prints s-28sbs %
                "#define D${pid}szname" "sizeof($name)," "$ptr$name"
         if [ "$einheit" != '"' ]
         then
            prints s "       const BYTE FAR E${pid}[]= %"$einheit%";"
            einheit=E${pid}
         else
            einheit=0
         fi
         prints s "       const BYTE FAR T${pid}[]= %"$text%";"
         text=T${pid}
         prints s-28s11sbs11 %
                "#define D${pid}einhtxt" "$einheit" , "$text"
         if [ "$buf" != 0 ]
         then
            prints s "       const BYTE FAR I${pid}[]= $buf;"
            buf=I${pid}
         else
            buf=0
         fi
         prints s-28s11 %
                "#define D${pid}info" "$buf"
         prints s-28sbsbsbsbs %
                "#define D${pid}Text"  $Tinfo, $Tgrp, $Tsgrp, $Tbit, $Text
         let "adr+=bytelen*nelem+pad"
         let "nelem>1" && idadd=500
         prints su4sbsbsbsbsbsbsbsbs '   { ' %
                D${pid}grp, D${pid}obj, D${pid}str, %
              "{D${pid}dfmima}," %
                D${pid}szname, D${pid}einhtxt, D${pid}info, D${pid}Text ' },'
         continue
      }
   done
   print -u4 '   { 0 }%n};%n%nconst unsigned '"$1"'data_ne= sizeof('"$1"'data)/sizeof(*'"$1"'data);%n%n'
   ><<<<
   cat d__1 d__2 d__3 > $3
   remove d__1 d__2 d__3
   return 0
}


5>vn.txt
MakeTexte CFG cfgbase.txt cfgdata.c cfg.h
MakeTexte MES mesbase.txt mesdata.c
><

#(cfg2.bish)

exit 0

#     prints s-33s${w1}bs${w2}bs${w3} %
#            "#define D${pid}dfltminmax10" "$dfltbm," "$minbm," "$maxbm"
#     prints s-33s${w1}bs${w2}bs${w3} %
#            "#define D${pid}dfltminmax11" "$dfltbm2," "$minbm2," "$maxbm2"
#            D${pid}dfltminmax10, "D${pid}dfltminmax11}," %



###  cfg.bish  #############################################

#!/u/bin/bish

set -f

MakeTexte()  {
   #0.0.000.00000
   sk=000000
   buf=..................................................................
   txtnum=000
   txtgrp=000
   3>d__1
   print -u3 '%n/* Made by script cfg.bish (H.Schellong) */'
   print -u3 '%n#                include "def.h"'
   print -u3 '#                include "share/var.h"'
   print -u3 '#                include "texte.h"%n%n%n'
   print -u3 '// id: 0.0.000.00000'
   print -u3 '//       d grp object'
   print -u3 '
   // struct cfgdata_t { UNS4 id, adr, flags, idlink, sort;
   //                    UNS2 grp, len, nbit, bitpos;
   //                    BYTE typ, darst, txtnum, txtgrp;
   //                    UNS2 parbn, nelem, voffs, access;
   //                    const BYTE *dfstr;
   //                    UNS4 dfmima[3];
   //                    UNS2 szname;
   //                    VOL void *name;
   //                    const BYTE *einheit, *info;
   //                    tsp_t Tinfo, Tgrp, Tsgrp, Tbit, Text;
   // };
   '

   [ -n "$4" ] && print '%n/* Made by script cfg.bish (H.Schellong) */%n' >$4
    >d__2
   4>d__3
   print -u4 '%n%n%nconst struct cfgdata_t '"$1"'data[]= {'
   <$2
   while read id dd adr grp idlink sort parbn typ bytelen darst nbit bitpos %
              access dflt1 min1 max1 %
              flags einheit name Tinfo Tgrp Tsgrp Tbit Text text
   do
      expr "$id" :: '^%$' && break
      expr "$id" :: '^:..*' && { echo; continue; }
      expr "$id" :: '^%...*' && { continue; }
      expr "$id" :id '^@%([0-9]%{1,}%)' && {
         let "adr=$adr" "bytelen=$bytelen" "id=$id" "parbn=$parbn"
         let "idlink=$idlink" "sort=$sort" "grp=$grp"
         let "id+=dd*100000000" "idlink+=dd*100000000"
         #let "grp=(id/100000) % 1000"
         conv '-t` ' name
         idname="$name"
         expr "$idname" :: '^[A-Za-z_]' || idname="$text"
         expr "$idname" :idname '^%([^\]%{1,}%)\000'
         conv '-d[d]' idname
         expr "$idname" :idname '[^A-Za-z_0-9]' += '_'
         [ -n "$4" ] && prints ss-24s12 '#define ID_' "$idname" "$id" >> $4
         nelem=1 voffs=0
         expr "$flags" :nelem 'A%([0-9]%{1,}%)' && {
            voffs='sizeof('"$name"')'
            [ "$name" == 0 ] && voffs=$bytelen
         }
         expr "$flags" :nelem 'S%([0-9]%{1,}%)' && {
            expr "$name" :idname ']%..%{1,}$' = ']'
            voffs='sizeof('"$idname"')'
            [ "$name" == 0 ] && voffs=$bytelen
         }
         buf='"'
         while :
         do
            seek + 0 sk
            readl Z
            expr "$Z" :: '^@:.' || { seek $sk 0; break; }
            catv 2,,Z =0:,,buf
         done
         [ ${#buf} -le 1 ] && buf=0
         [ ${#buf} -gt 1 ] && buf="$buf%""
         conv '-t` ' dflt1
         [ "$darst" ==  1 ] && darst=/
         expr "$darst" :darst '%.%([0-9]%)'
         [ "$dflt1" == '"' ] && dflt1=0
         [ "$typ" == s -a "$dflt1" == '\000' ] && dflt1=
         if [ "$typ" == s ]
         then
            ptr='&'
            w1= w2= w3=
            min1='0'
            max1="$min1"
            expr "$flags" :: '#' && goend
            dflt1="%"$dflt1%""
         else
            ptr='&'
            w1=15 w2=15 w3=14
            [ "$min1" == '"' ] && min1=0
            [ "$max1" == '"' ] && max1=0
            [ "$typ" == s ] && goend
            l=4 u=u
            [ bytelen -eq 4 ] && l=8 u=ul
            for v in dflt1 min1 max1
            do
               case "$typ" in
                 b)  expr "${{v}}" :$v '^x%([0-9a-fA-F]%{1,}%)$' && goend
                     base -2 $v +16 $v ;;
                 x)  goend ;;
                 *)  continue ;;
               esac
               prints vssf0${l}s $v 0x ${{v}} $u ;;
            done
         fi
         flg=0000000000 txtgrp=0 txtnum=0
         expr "$flags" :txtnum 'T%(%d%{1,3}%)'
         expr "$flags" :txtgrp 'G%(%d%{1,3}%)'
         expr "$flags" :: 'a'   && let "flg|=1<<30"
         expr "$flags" :: 'Z'   && let "flg|=1<<24"
         expr "$flags" :: 'S'   && let "flg|=1<<23"
         expr "$flags" :: 'A'   && let "flg|=1<<22"
         expr "$flags" :: 'E'   && let "flg|=1<<21"
         expr "$flags" :: 'N'   && let "flg|=1<<19"
         expr "$flags" :: 'F'   && let "flg|=1<<18"
         expr "$flags" :: 'm'   && let "flg|=1<<17"
         expr "$flags" :: 'D'   && let "flg|=1<<16"
         expr "$flags" :: 'd'   && let "flg|=1<<15"
         expr "$flags" :: ':'   && let "flg|=1<<14"
         expr "$flags" :: 'I'   && let "flg|=1<<13"
         expr "$flags" :: 't1'  && let "flg|=1<<12"
         expr "$flags" :: 'l'   && let "flg|=1<<11"
         expr "$flags" :: 't2'  && let "flg|=1<<10"
         expr "$flags" :: 'B'   && let "flg|=1<<8"
         expr "$flags" :: '1%.' && let "flg|=1<<7"
         expr "$flags" :: 'q'   && let "flg|=1<<6"
         expr "$flags" :: 'K'   && let "flg|=1<<5"
         expr "$flags" :: 'i'   && let "flg|=1<<4"
         expr "$flags" :: 's'   && let "flg|=1<<3"
         expr "$flags" :: 'n'   && let "flg|=1<<2"
         expr "$flags" :: 'b'   && let "flg|=1<<1"
         expr "$flags" :: 'r'   && let "flg|=1"
         expr "$flags" :: '&'   && ptr=
         ds=0000000000000000000
         vname=$name
         expr "$flags" :: 'v' && ds=v name=0
         [ "$name" == 0 -o "$name" == '"' ] && name=0 ptr= let "flg|=512"
         [ "$name" != 0 ] && print -u5 "$1%t$bytelen%t$name"
         prints vssf08 sort 0x $sort
         prints vssf08 flags 0x $((16#, flg))
         prints vsf010 pid $id
         echo
         echo "// id, adr,"
         echo "// flags(_|abgl|_|_|_|_|_|strarr | sarr|arr|eventmap|_|nidlnk|feld|messw|unbdflt)"
         echo "// flags(dfltcalc|bitfeld|IP|Telem|infovals|Tbbig|_|batt | step10|mess|kamm|initcan|sig|nod|bak|ro),"
         echo "// idlink, sort;"
         echo "// grp, len, nbit, bitpos, typ, darst, txtnum, txtgrp, parbn, nelem, voffs, access;"
         prints s-28s11bs11bsbs11bs11 %
                "#define D${pid}long" %
                 $id, $adr, $flags, $idlink, $sort
         prints s-28s5bs5bs5bsbsbsbsbsbsbsbsbs %
                "#define D${pid}obj" %
                 $grp, $bytelen, $nbit, $bitpos, %
                 "'$typ'," "'$darst'," "$txtnum," "$txtgrp," %
                 "$parbn," "$nelem," "$voffs," 0x${access}u
         if [ "$typ" == s ]
         then
            [ "$ds" == v ] && prints s "       const BYTE ${vname}[]= $dflt1;"
            prints s "       const BYTE S${pid}[]= $dflt1;"
            ds=S${pid} dflt1=0 min1=0 max1=0
         else
            ds=0
         fi
         prints s-28s %
                "#define D${pid}str" "$ds"
         prints s-28s${w1}bs${w2}bs${w3} %
                "#define D${pid}dfmima" "$dflt1," "$min1," "$max1"
         prints s-28sbs %
                "#define D${pid}szname" "sizeof($name)," "$ptr$name"
         if [ "$einheit" != '"' ]
         then
            prints s "       const BYTE E${pid}[]= %"$einheit%";"
            einheit=E${pid}
         else
            einheit=0
         fi
         prints s-28s11 "#define D${pid}einhtxt" "$einheit"
         if [ "$buf" != 0 ]
         then
            prints s "       const BYTE I${pid}[]= $buf;"
            buf=I${pid}
         else
            buf=0
         fi
         prints s-28s11 %
                "#define D${pid}info" "$buf"
         prints s-28sbsbsbsbs %
                "#define D${pid}Text"  $Tinfo, $Tgrp, $Tsgrp, $Tbit, $Text
         prints su4sbsbsbsbsbsbsbsbs '   { ' %
                D${pid}long, D${pid}obj, D${pid}str, %
              "{D${pid}dfmima}," %
                D${pid}szname, D${pid}einhtxt, D${pid}info, D${pid}Text ' },'
         continue
      }
   done
   print -u4 '   { 0 }%n};%n%nconst unsigned '"$1"'data_ne= sizeof('"$1"'data)/sizeof(*'"$1"'data);%n%n'
   ><<<<
   cat d__1 d__2 d__3 > $3
   remove d__1 d__2 d__3
   return 0
}


5>./base/vn.txt
MakeTexte CFG ./base/cfgbase.txt cfgdata.c cfg.h
MakeTexte MES ./base/mesbase.txt mesdata.c
><

:





###  cfg.bish  #############################################


set -f

VonBis()  {
   local sd=0000 nam
   [ $# -gt 0 ] || return
   for nam in $*
   do
      ifset $nam || continue
      while expr "${{nam}" :sd '#%(-%{0,1}[0-9]%)'
      do
         let 'sd+=von'
         expr "${{nam}" :$nam '#-%{0,1}[0-9]' = "$sd"
      done
   done
   return 0
}

#0.0.000.00000
_id=0000000000
grp=0000000
obj=0000000
sk=000000
skvb=000000
adr=0032
buf=..................................................................
von=000
bis=000
inc=000
3>d1
print -u3 '%n#                include "def.h"'
print -u3 '#                include "var.h"%n%n%n'
print -u3 '// id: 0.0.000.00000'
print -u3 '//         grp object'
print -u3 '
// struct cfgdata_t { const BYTE *grp; WORD pdummy;
//                    DWORD id;
//                    WORD adr, len, flags, dummy;
//                    BYTE typ, darst, nelem, voffs;
//                    const BYTE __far *dfstr;
//                    DWORD dfmima[2][3];
//                    WORD szname;
//                          void *name;
//                    const BYTE __far *einheit, *text, *info;
// };
'

: >cfg.h
 >d2
4>d3
print -u4 '%n%n%nconst struct cfgdata_t __far CFGdata[]= {'
<cfgbase.txt
while seek + 0 sk; read id typ bytelen darst %
           dflt1 min1 max1 dflt2 min2 max2 %
           flags einheit name text
do
   pdummy=0
   dummy=0
   expr "$id" :: '^%$' && break
   expr "$id" :: '^}$' && {
      [ von -ge bis ] && inc=0 continue
      seek $skvb 0; let 'von+=inc'; continue
   }
   expr "$id" :: '^{#$' && {
      von=$typ bis=$bytelen inc=$darst
      seek + 0 skvb; continue
   }
   expr "$id" :: '^:..*' && {
      obj=0 let grp+=500000
      seek $sk 0; readl Z; conv -D: Z
      [ inc -gt 0 ] && VonBis Z
      prints vssf08 pgrp G $grp
      prints su3ss '       const BYTE       ' $pgrp "[]= %"$Z%";"
      echo
      let "adr>32" && let "adr=[(adr/264)+1+(adr%%264>=264/2)]*264"
      continue
   }
   expr "$id" :id '^@%([0-9]%{1,}%)' && {
      let "obj+=100" "_id=grp+obj" "adr=$adr" "bytelen=$bytelen" "id=$id"
      let id && _id=$id
      [ inc -gt 0 -a "$typ" != s ] && VonBis name text
      [ inc -gt 0 -a "$typ" == s ] && VonBis name text dflt1 dflt2
      idname="$name"
      expr "$idname" :: '^[A-Za-z_]' || idname="$text"
      expr "$idname" :idname '^%([^\]%{1,}%)\000'
      conv '-d[d]' idname
      expr "$idname" :idname '[^A-Za-z_0-9]' += '_'
      prints ss-24s12 '#define ID_' "$idname" "$_id" >> cfg.h
      nelem=1 voffs=0
      expr "$flags" :nelem 'A%([0-9]%{1,}%)' && {
         voffs='sizeof('"$name"')'
         [ "$name" == 0 ] && voffs=$bytelen
      }
      expr "$flags" :nelem 'S%([0-9]%{1,}%)' && {
         expr "$name" :idname '^%(.*[^.]%)%.[^.]%{1,}$'
         voffs='sizeof('"$idname"')'
         [ "$name" == 0 ] && voffs=$bytelen
      }
      pad=0
      expr "$flags" :pad 'p%([0-9]%{1,}%)' || {
         let 'pad=bytelen*nelem'
      }
      buf='"'
      while :
      do
         seek + 0 sk
         readl Z
         expr "$Z" :: '^@:.' || { seek $sk 0; break; }
         catv 2,,Z =0:,,buf
      done
      [ ${#buf} -le 1 ] && buf=0
      [ ${#buf} -gt 1 ] && buf="$buf%""
      conv '-t` ' dflt1 dflt2 name text
      [ "$darst" ==  1 ] && darst=/
      expr "$darst" :darst '%.%([0-9]%)'
      [ "$typ" == s -a "$dflt1" == '\000' ] && dflt1=
      [ "$dflt2" == '"' ] && dflt2="$dflt1"
      if [ "$typ" == s ]
      then
         let "pad>4" && let "pad>>=1"
         ptr=
         w1= w2= w3=
         min1='0'
         min2="$min1"
         max1="$min1"
         max2="$min1"
         expr "$flags" :: '#' && goend
         dflt1="%"$dflt1%""
         dflt2="%"$dflt2%""
      else
         ptr='&'
         w1=15 w2=15 w3=14
         [ "$min1" == '"' ] && min1=0
         [ "$max1" == '"' ] && max1=0
         [ "$min2" == '"' ] && min2="$min1"
         [ "$max2" == '"' ] && max2="$max1"
         [ "$typ" == s ] && goend
         l=4 u=u
         [ bytelen -eq 4 ] && l=8 u=ul
         for v in dflt1 dflt2 min1 min2 max1 max2
         do
            case "$typ" in
              b)  base -2 $v +16 $v; prints vssf0${l}s $v 0x ${{v} $u ;;
              x)  prints vssf0${l}s $v 0x ${{v} $u ;;
            esac
         done
      fi
      flg=000000
      #expr "$flags" :: ':SW:' && let "flg|=256"
      expr "$flags" :: '[sz]' && pad=0
      expr "$flags" :: 'l' && let "flg|=2048"
      expr "$flags" :: ':L:' && let "flg|=1024"
      expr "$flags" :: ':SP:' && let "flg|=512"
      expr "$flags" :: 'B[AS][0-9]' && let "flg|=256"
      expr "$flags" :: '1.' && let "flg|=128"
      expr "$flags" :: 'q' && let "flg|=64"
      expr "$flags" :: 'z' && let "flg|=32"
      expr "$flags" :: 'i' && let "flg|=16"
      expr "$flags" :: 's' && let "flg|=8"
      expr "$flags" :: 'n' && let "flg|=4"
      expr "$flags" :: 'a' && let "flg|=2"
      expr "$flags" :: 'r' && let "flg|=1"
      prints vssf04 flags 0x $((16#, flg))
      [ "$name" == 0 -o "$name" == '"' ] && name=0 ptr=
      prints vsf010 pid $_id
      echo
      prints s-28sbs %
             "#define D${pid}grp" $pgrp, $pdummy
      echo "// id; adr, len, flags(infovals|lang|spv|batt | step10|mess|zuo|initcan|sig|nod|abgl|ro), dummy; typ, darst, nelem, voffs;"
      prints s-28s11bs6bs5bsbsbsbsbsbs %
             "#define D${pid}obj" %
              $_id, $adr, $bytelen, $flags, $dummy, %
              "'$typ'," "'$darst'," "$nelem," "$voffs"
      if [ "$typ" == s ]
      then
         prints s "       const BYTE __far S${pid}[]= $dflt1;"
         ds=S${pid} dflt1=0 min1=0 max1=0 dflt2=0 min2=0 max2=0
      else
         ds=0
      fi
      prints s-28s11 %
             "#define D${pid}str" "$ds"
      prints s-28s${w1}bs${w2}bs${w3} %
             "#define D${pid}dfmima0" "$dflt1," "$min1," "$max1"
      prints s-28s${w1}bs${w2}bs${w3} %
             "#define D${pid}dfmima1" "$dflt2," "$min2," "$max2"
      prints s-28sbs %
             "#define D${pid}szname" "sizeof($name)," "$ptr$name"
      if [ "$einheit" != '"' ]
      then
         prints s "       const BYTE __far E${pid}[]= %"$einheit%";"
         einheit=E${pid}
      else
         einheit=0
      fi
      prints s "       const BYTE __far T${pid}[]= %"$text%";"
      text=T${pid}
      prints s-28s11sbs11 %
             "#define D${pid}einhtxt" "$einheit" , "$text"
      if [ "$buf" != 0 ]
      then
         prints s "       const BYTE __far I${pid}[]= $buf;"
         buf=I${pid}
      else
         buf=0
      fi
      prints s-28s11 %
             "#define D${pid}info" "$buf"
      let "adr+=bytelen*nelem+pad"
      prints su4sbsbsbsbsbsbsbss '   { ' %
             D${pid}grp, D${pid}obj, D${pid}str, %
           "{{D${pid}dfmima0}," "{D${pid}dfmima1}}," %
             D${pid}szname, D${pid}einhtxt, D${pid}info ' },'
      continue
   }
done
print -u4 '   { 0 }%n};%n%nconst unsigned CFGdata_ne= sizeof(CFGdata)/sizeof(*CFGdata);%n%n'
><<<<
cat d1 d2 d3 > cfgdata.c
remove d1 d2 d3

exit 0

#     prints s-33s${w1}bs${w2}bs${w3} %
#            "#define D${pid}dfltminmax10" "$dfltbm," "$minbm," "$maxbm"
#     prints s-33s${w1}bs${w2}bs${w3} %
#            "#define D${pid}dfltminmax11" "$dfltbm2," "$minbm2," "$maxbm2"
#            D${pid}dfltminmax10, "D${pid}dfltminmax11}," %



###  cfg2.bish  #############################################

#!/u/bin/bish


INCL='
#                include "def.h"
#                include "var.h"
#                include "texte.h"


'
HDR='
// id: 0.0.000.00000
//       d grp object

   // struct cfgdataT_t { cfap_t Tinfo, Tgrp, Tsgrp, Tbit, Text; };
   //
   // struct cfgdata_t { const BYTE *grp, *sgrp;
   //                    UNS4 id;
   //                    UNS2 adr, len, nbit, bitpos, flags;
   //                    BYTE typ, darst, info1, info2;
   //                    UNS2 parbn, nelem, voffs;
   //                    const BYTE FAR *dfstr;
   //                    UNS4 dfmima[2][3];
   //                    UNS2 szname;
   //                    VOL void *name;
   //                    const BYTE FAR *einheit, *text, *info;
   //                    const struct cfgdataT_t FAR *T;
   // };



'
i=000000
set Z:.200
set Ta:.100
set Tb:.100

CFG2()  {
   i=-1
   3>$1data0.c
   4>$1dataT.c
   catv HDR =3
   catv INCL HDR =4
   < $1data.c
   while readl Z
   do
      expr "$Z" :: '^#define D%d%{10}grp ' && {
	 let ++i; catv /%n =4; catv Z /%n =3; continue
      }
      expr "$Z" :Ta ' %(const BYTE FAR E[0-9]%{10}%[]%)= ' && {
         expr "$Z" :Tb '%[]= %(".%{1,}%);$' || echo $i:$Ta
         catv '.   extern ' Ta '.;  //' Tb /%n =3
         catv Z /%n =4
         continue
      }
      expr "$Z" :Ta ' %(const BYTE FAR T[0-9]%{10}%[]%)= ' && {
         expr "$Z" :Tb '%[]= %(".%{1,}%);$' || echo $i:$Ta
         catv '.   extern ' Ta '.;  //' Tb /%n =3
         catv Z /%n =4
         continue
      }
      expr "$Z" :Ta ' %(const BYTE FAR I[0-9]%{10}%[]%)= ' && {
         expr "$Z" :Tb '%[]= %(".%{1,}%);$' || echo $i:$Ta
         catv '.   extern ' Ta '.;  //' Tb /%n =3
         catv Z /%n =4
         continue
      }
      expr "$Z" :Ta '^%(#define D%d%{10}Text %{1,}%)' && {
         catv Ta "/&$2dataT[$i]%n" =3
         catv Z /%n =4
         continue
      }
      expr "$Z" :: 'const struct cfgdata_t FAR '"$2"'data%[]= {' && {
         catv '/%n%n%nconst struct cfgdataT_t FAR '"$2"'dataT[]= {%n' =4
      }
      expr "$Z" :Ta '^ %{1,}{ D.%{1,}%( D%d%{10}Text %)' && {
         catv '/   {' Ta '/},%n' =4
      }
      catv Z /%n =3
   done
   catv '/   { 0 }%n};%n%n%n%n' =4
   ><<<
   echo $i
   return 0
}


CFG2 cfg CFG
CFG2 mes MES





###  cfgadr.bish  #############################################



adr=110000

for n from 0 to 24 repeat
do
   echo $((adr)); let "adr+=78+202"
   echo $((adr)); let "adr+=36+114"
   echo $((adr)); let "adr+=56+164"
   echo $((adr)); let "adr+=192+64"
done




###  cfgbase.bish  #############################################

#!/u/bin/bish

if [ "$(-ver s)" == unix ]
then  MORE='gvim -fnR -' #'less -M'
      LESSCHARSET=iso8859; export LESSCHARSET
else  MORE='more' #ultraedit32
fi

set CfgB:.50 MesB:.50 cmd:.10 rest:.30
set Z:.200 File:.50
Base=k

if [ -s base/cfgbase.txt ]
then  CfgB=./base/cfgbase.txt
elif [ -s cfgbase.txt ]
then  CfgB=./cfgbase.txt
else  CfgB='???'
fi
if [ -s base/mesbase.txt ]
then  MesB=./base/mesbase.txt
elif [ -s mesbase.txt ]
then  MesB=./mesbase.txt
else  MesB='???'
fi

File="$CfgB"


Check() {
   catv '/noch nicht implementiert%j'
   return 0
}


IDCheck() {
   local id:010 id0:010 z0:.200 fst=0
   grep -n '^[@x]%d%{8,10} ' |
   sortl -f2 -d':@x ' | {
      while readl Z
      do
         expr "$Z" :id '%(%d%{8,}%)'
         if [ id -eq id0 ]
	 then  [ fst -eq 0 ] && { fst=1; catv 140,z0 /%j; }
	       catv 140,Z /%j
	 else  fst=0
	 fi
         id0=$id z0="$Z"
      done
   }
   return 0
}


Print() {
   catv '/noch nicht implementiert%j'
   return 0
}


while echo "
%tKonfigbasis  :  K datei  [$CfgB]
%tMessbasis    :  M datei  [$MesB]
%tBasis    [$Base] :  k|m
%tKorrektheit  :  c
%tID Prüfung   :  i
%tAusgabe      :  a
%tBeenden      :  E
%t                _%b%c"
do
   read cmd rest
   case "$cmd" in
     K)  [ -s "$rest" ] || { echo "%a%c"; continue; }
         CfgB="$rest";;
     M)  [ -s "$rest" ] || { echo "%a%c"; continue; }
         MesB="$rest";;
     k)  Base=k File="$CfgB";;
     m)  Base=m File="$MesB";;
     c)  Check <"$File" | $MORE;;
     i)  IDCheck <"$File" | $MORE;;
     a)  Print <"$File" | $MORE;;
     E)  break;;
     *)  echo "%a%c"; continue;;
   esac
done

:




###  ch2t.bish  #############################################



FILES=$*

set Z:.500
set Text:.100
set CText:.100
set Leer:.100
set FILE:.100
set HexC:010
R=000000000
G=000000000
B=000000000

PutText()  {
   expr "$Text" :Text '&quot;' += '"'
   expr "$Text" :Text '&lt;' += '<'
   expr "$Text" :Text '&gt;' += '>'
   expr "$Text" :Text '&amp;' += '&'
   expr "$Text" :Text ' ' += 'ë'
   expr "$Text" :Text '\' += '\textbackslash '
   expr "$Text" :Text '''' += '\textquoteright '
   expr "$Text" :Text '`' += '\textquoteleft '
   expr "$Text" :Text '"' += '\textquotedblright '
   expr "$Text" :Text '%^' += '\textasciicircum '
   expr "$Text" :Text '~' += '\textasciitilde '
   expr "$Text" :Text '&' += '\&'
   expr "$Text" :Text '#' += '\#'
   expr "$Text" :Text '%$' += '\$'
   expr "$Text" :Text '%%' += '\%'
   expr "$Text" :Text '_' += '\_'
   expr "$Text" :Text '{' += '\{'
   expr "$Text" :Text '}' += '\}'
   while expr "$Text" :Leer '%(ë%{1,}%)'
   do
      expr "$Leer" :Leer 'ë' += ' '
      expr "$Text" :Text 'ë%{1,}' = "\verb:$Leer:"
   done
   ifset Text || return 1
   catv Text
   return 0
}


PutCText()  {
   while ifset CText
   do
      expr "$CText" :Text '^%( %{1,}%)' && {
         PutText
         expr "$CText" :CText '^ %{1,}' = ''
      }
      expr "$CText" :Text '^%([^ ]%{1,}%)' && {
         catv ".\textcolor[rgb]{$R,$G,$B}{"
         PutText
         catv '/}'
         expr "$CText" :CText '^[^ ]%{1,}' = ''
      }
   done
   return 0
}


MkRgb()  {
   expr "$HexC" :R '^%(..%)....'
   expr "$HexC" :G '^..%(..%)..'
   expr "$HexC" :B '^....%(..%)'
   let "R=16#$R" "G=16#$G" "B=16#$B"
   let "R=(R*1000+127)/255" "G=(G*1000+127)/255" "B=(B*1000+127)/255"
   [ ${#R} -eq 1 ] && R=0.00$R
   [ ${#R} -eq 2 ] && R=0.0$R
   [ ${#R} -eq 3 ] && R=0.$R
   [ ${#R} -eq 4 ] && R=1.000
   [ ${#G} -eq 1 ] && G=0.00$G
   [ ${#G} -eq 2 ] && G=0.0$G
   [ ${#G} -eq 3 ] && G=0.$G
   [ ${#G} -eq 4 ] && G=1.000
   [ ${#B} -eq 1 ] && B=0.00$B
   [ ${#B} -eq 2 ] && B=0.0$B
   [ ${#B} -eq 3 ] && B=0.$B
   [ ${#B} -eq 4 ] && B=1.000
   return 0
}


RApre='%([^<]%{1,}%)'
RAfcc='<font color="#%(......%)">'
RAfcb='<font color="#......"><b>%([^<]%{1,}%)</b></font>'
RAfcn='<font color="#......">%([^<]%{1,}%)</font>'


for FILE in $FILES
do
   < $FILE
   while readl Z
   do  expr "$Z" :: '<pre>' && break; done
   catv '/\begin{ttfamily}%n'
   while readl Z
   do
      expr "$Z" :: '</pre>' && break
      catv "/\verb:   :"
      ifset Z || { catv /\\%n; continue; }
      while ifset Z
      do
         expr "$Z" :Text "^$RApre" && {
            PutText
            expr "$Z" :Z "^$RApre" = ''
            ifset Z || { catv /\\%n; continue 2; }
         }
         expr "$Z" :HexC "^$RAfcc" && {
            MkRgb
            expr "$Z" :CText "^$RAfcb" && {
               PutCText
               expr "$Z" :Z "^$RAfcb" = ''
               ifset Z || { catv /\\%n; continue 2; }
               continue
            }
            expr "$Z" :CText "^$RAfcn" && {
               PutCText
               expr "$Z" :Z "^$RAfcn" = ''
               ifset Z || { catv /\\%n; continue 2; }
               continue
            }
         }
         ><; print -u2 "*** $FILE ***"; exit 1
      done
   done
   ><
   catv '/\end{ttfamily}%n'
done

exit 0





###  chars.bish  #############################################



array C NUL SOH STX ETX EOT ENQ ACK BEL BS HTAB LF VTAB FF CR SO SI %
        DLE XON DC2 XOFF DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
anz=256
col=4
start=0
[ $# -eq 1 ] && col=$1
[ $# -eq 2 ] && col=$1 anz=$2
[ $# -eq 3 ] && col=$1 anz=$2 start=$3
let row=anz/col
c=000 r=000 i=000

for r from 0 to $((row-1)) repeat
do
   for c from 0 to $((col-1)) repeat
   do
      z=$((c*row+r+start))
      i=$((z+1))
      [ z -lt 32 ] && Z="$C[i]"
      [ z -ge 32 ] && Z="\symbol{$z}"
      [ c -gt 0 ] && print -n ' & '
      prints sf@3bsf08- $z $((2#,z))
      #prints s3bsf08bsf03bsf02bs- $z $((2#,z)) $((8#,z)) $((16#,z)) $Z
      #prints sf@3bsf03bsf02bs- $z $((8#,z)) $((16#,z)) "\ $Z"
   done
   echo ' \\'
done




###  chpr.bish  #############################################

# !/u/bin/bish
# Print_xyz auf Print_lcd umbauen



set -f
File="\softune\sample\gfs_594\$1"
[ $# -lt 1 -o ! -s "$File" ] && { print -u2 "? $File ?"; exit; }

Zeile="$(prints s256-)"
Arg1="$(prints s25-)"
Arg2="$(prints s25-)"
Arg3="$(prints s25-)"
Arg4="$(prints s25-)"
ArgTyp=00000000
NArg=00000000
PfName=00000000
ZN=00000000



Args()  {
   local i=0 t=0 a
   expr "$1" :a 'Print[a-zA-Z_0-9]%{1,%}(%(..*%));'
   expr "$a" :: '^[ %t]*[^, %t]%{1,%}[ %t]%{1,%}[^, %t]' && return 1
   expr "$1" :PfName 'Print%([a-zA-Z_0-9]%{1,%}%)(..*);'
   ArgTyp=''
   while let "++i<=4"
   do
      t=0
      #echo "--$a--"
      while :
      do  t=1 expr "$a" :Arg$i '^[ %t]*%(".*[^\]"%)' &&
                 expr "$a" :a '^[ %t]*".*[^\]"%(.*%)$' && break
          t=2 expr "$a" :Arg$i '^[ %t]*%(""%)' &&
                 expr "$a" :a '^[ %t]*""%(.*%)$' && break
          t=3 expr "$a" :Arg$i '^[ %t]*%(''.''%)' &&
                 expr "$a" :a '^[ %t]*''.''%(.*%)$' && break
          t=4 expr "$a" :Arg$i '^[ %t]*%(''\.''%)' &&
                 expr "$a" :a '^[ %t]*''\.''%(.*%)$' && break
          t=5 expr "$a" :Arg$i '^[ %t]*%([0-9][0-9a-zA-Z]*%)' &&
                 expr "$a" :a '^[ %t]*[0-9][0-9a-zA-Z]*%(.*%)$' && break
          t=6 expr "$a" :Arg$i '^[ %t]*%([^, %t]*%)' &&
                 expr "$a" :a '^[ %t]*[^, %t]*%(.*%)$' && break
          print -u2 "Kein ArgTyp![$File:$ZN]" && exit
          break
      done
      catv t =$i,1,ArgTyp
      NArg=$i
      ifset a || break
      expr "$a" :a '^[ %t]*,%(.*%)$'
      expr "$a" :a '^[ %t]*%(.*%)$'
      ifset a || break
   done
   return 0
}



Skip()  {
   local skip=0 pr
   while ifset pr && print -r "$Zeile"
         pr=1 readl Zeile
   do
      let ++ZN
      ifset Zeile || continue
      [ $skip == 2 ] && expr "$Zeile" :: '^#endif' && { skip=0; continue; }
      [ $skip == 1 ] && expr "$Zeile" :: '%*/[ %t]*$' && { skip=0; continue; }
      [ $skip != 0 ] && continue
      expr "$Zeile" :: 'defined(OLDPRN)' && { skip=2; continue; }
      expr "$Zeile" :: '^[ %t]*//' && continue
      expr "$Zeile" :: '^[ %t]*/%*' && {
         expr "$Zeile" :: '%*/[ %t]*$' && continue
         skip=1
         continue
      }
      expr "$Zeile" :: 'Print[a-zA-Z_0-9]%{1,%}(' || continue
      expr "$Zeile" :: 'Print[a-zA-Z_0-9]%{1,%}(..*);' ||
         print -u2 "Mehrzeiler![$File:$ZN]" && continue
      Args "$Zeile" || continue
      pr=
      PrNewFu
      #PrA
   done
   let skip && print -u2 "Offenes Ende: $skip[$File:$ZN]"
   return 0
}



PrNewFu()  {
   local at=-------- na=0 fmt
   #print -rn "Print$PfName"
   case "Print$PfName" in
     Printf)        na=4 fmt='%?K%.16s' at=-kksu ;;
     Print2num)     na=3 fmt='%?K%.2u%?K' at=-kku ;;
     Printnum)      na=1 fmt='%3u' at=-u ;;
     Printnr)       na=1 fmt='%u' at=-u ;;
     Printword)     na=1 fmt='%5u' at=-u ;;
     Printfloat)    na=1 fmt='%,4.1u' at=-u ;;
     Printfloat2)   na=1 fmt='%,4.2u' at=-u ;;
     Printfloat3)   na=1 fmt='%,5.1u' at=-u ;;
     Print_Ch)      na=3 fmt='%?K%c' at=-kkc ;;
     Print_Str)     na=3 fmt='%?K%-16.16s' at=-kks ;;
     Print_Strc)    na=3 fmt='%?K%-16.16s' at=-kks ;;
     Print_Str_l)   na=3 fmt='%?K%.16s' at=-kks ;;
     Print_Wert)    na=3 fmt='%?K%3u' at=-kku ;;
     Print_W)       na=3 fmt='%?K%5u' at=-kku ;;
     Print_Bit8)    na=3 fmt='%?K%08b' at=-kku ;;
     Print_Bit16)   na=3 fmt='%?K%016b' at=-kku ;;
     Print_Hex)     na=3 fmt='%?K%#.4x' at=-kkx ;;
     Print_F)       na=3 fmt='%?K%,4.1u' at=-kku ;;
     Print_F2)      na=3 fmt='%?K%,4.2u' at=-kku ;;
     Print_F3)      na=3 fmt='%?K%,5.1u' at=-kku ;;
     PrintDate)     na=4 fmt='%?s %02u.%02u.%04u' at=-suuu ;;
     PrintDatum)    na=3 fmt='%02u.%02u.%04u' at=-uuu ;;
     PrintTime)     na=3 fmt='%02u:%02u:%02u' at=-uuu ;;
     PrintTime_os)  na=2 fmt='%02u:%02u' at=-uu ;;
     *)  print -u2 "? $PfName() ?" && exit ;;
   esac
   [ na -ne NArg ] && print -u2 "nArg: $NArg!=$na(soll)" && exit
   expr "$fmt" :: '^%%?K' && {
      :
   }
   local i=0
   while let "++i, --n>=0"
   do
      echo "%t${Arg[i]}"
   done
   return 0
}



PrA()  {
   local n=$NArg i=0
   echo "Print$PfName"
   while let "++i, --n>=0"
   do
      echo "%t${Arg[i]}"
   done
}



Skip < "$File"



# 


###  chprint.bish  #############################################

#!c:\u\bin\bish32.exe


an=00000000000
ifs=_______________
Dir="$(prints s120-)"
F="$(prints s80-)"
liste="$(prints s150-)"
vorne="$(prints s80-)"
funam="$(prints s250-)"
reste="$(prints s80-)"
a1="$(prints s60-)"
a2="$(prints s60-)"
a3="$(prints s60-)"
a4="$(prints s60-)"
rest="$(prints s60-)"
Zeile="$(prints s300-)"
zeile="$(prints s300-)"


[ $# -lt 1 ] && Dir=.
[ $# -ge 1 ] && Dir="$1"
[ "$Dir" == . ] && Dir=$(pwd)
#expr "$Dir" =:: '[/\]lst$' || Dir="$Dir\lst"
conv -F/F\ Dir
[ -d "$Dir" ] || { echo "Keine Existenz: '$Dir'!"; exit 1; }
cd "$Dir"
echo Verzeichnis: $Dir
: *.c
[ $] -lt 1 ] && { echo "Keine *.c vorhanden!"; exit 1; }



local fmt=lu________________
funam=Print_Lan
read "funam?Funktionsname oder all: "
ifset funam || exit 0
[ "$funam" == all ] && funam="
        Print_Str Print_Wert Print_Ch Print_W Print_F Print_F_pm Print_F2 Print2num
        Printnum Printnum2 Printnr Printword Printfloat Printfloat_pm Printfloat2
        Print_Lan Convert_w_s Convert_w_ganz_s Convert_w_ganz3_s Convert_b_s"


Args()  {
   ifs="$IFS" IFS=, rest= an=0
   [ $1 -eq 1 ] && print -r "$liste" | read a1 rest
   [ $1 -eq 2 ] && print -r "$liste" | read a1 a2 rest
   [ $1 -eq 3 ] && print -r "$liste" | read a1 a2 a3 rest
   [ $1 -eq 4 ] && print -r "$liste" | read a1 a2 a3 a4 rest
   IFS="$ifs"
   ifset rest && return 1
   ifset a$1 || return 1
   expr "$a1" :a1 '^ *%([0-9]%{1,%}%) *$'  '%1' && let ++an
   expr "$a2" :a2 '^ *%([0-9]%{1,%}%) *$'  '%1' && let ++an
   return 0
}


for funam in  $funam
do
   echo "$funam"

for F in *.c
do
   grep -qm "$funam" "$F" || continue
   grep -qm "//.*$funam.*//F/" "$F" && continue
   echo "%t$F"
   #[ -f "obj\CHP$F" ] || cat "$F" > "obj\CHP$F"
   cat "$F" | {
   : > "$F"
   while readl Zeile zeile
   do
      while :
      do
         expr "$Zeile" :: '^[ %t]*/[*/]' && break
         expr "$Zeile" :: '[^a-zA-Z_0-9]'"$funam"'([^;]%{1,%});' || break
         expr "$Zeile" :vorne '^%(.*[^a-zA-Z_0-9]%)'"$funam(" || break
         expr "$Zeile" :Zeile '^.*[^a-zA-Z_0-9]%('"$funam"'(.*%)$'  '%1'
         expr "$Zeile" :liste "^$funam("'%(..*%)$'
         expr "$liste" :reste '^[^;]%{1,%}%();.*%)$'
         expr "$liste" :liste '^%([^;]%{1,%}%));.*$'
         expr "$liste" :liste '^  *' ''
         expr "$liste" :liste '  *$' ''
         case "$funam" in
           Print_Lan)
               Args 3 || break
               if [ an -eq 2 ]
               then
                  Zeile="${vorne}Print_lcd(%"%%$a1.${a2}K%%Fs%", MSG($a3)$reste"
               else
                  Zeile="${vorne}Print_lcd(%"%%K%%Fs%", $a1,$a2, MSG($a3)$reste"
               fi
               print -r "//$zeile//F/" >> "$F"
           ;;
           Print_Str|Print_Wert|Print_Ch|Print_W|Print_F|Print_F_pm|Print_F2|Print2num)
               case "$funam" in
                   Print_Str)   fmt=s ;;
                   Print_Wert)  fmt=3u ;;
                   Print_Ch)    fmt=c ;;
                   Print_W)     fmt=5u ;;
                   Print_F)     fmt=,4.1u ;;
                   Print_F2)    fmt=,4.2u ;;
                   Print_F_pm)  fmt=,4.1i ;;
                   Print2num)   fmt=2u ;;
               esac
               Args 3 || break
               if [ an -eq 2 ]
               then
                  Zeile="${vorne}Print_lcd(%"%%$a1.${a2}K%%$fmt%", $a3$reste"
               else
                  Zeile="${vorne}Print_lcd(%"%%K%%$fmt%", $a1,$a2, $a3$reste"
               fi
               print -r "//$zeile//F/" >> "$F"
           ;;
           Printnum|Printnum2|Printnr|Printword|Printfloat|Printfloat_pm|Printfloat2)
               case "$funam" in
                   Printnum)       fmt=3u ;;
                   Printnum2)      fmt=02u ;;
                   Printnr)        fmt=u ;;
                   Printword)      fmt=5u ;;
                   Printfloat)     fmt=,4.1u ;;
                   Printfloat2)    fmt=,4.2u ;;
                   Printfloat_pm)  fmt=,4.1i ;;
               esac
               Args 1 || break
               Zeile="${vorne}Print_lcd(%"%%$fmt%", $a1$reste"
               print -r "//$zeile//F/" >> "$F"
           ;;
           Convert_w_s|Convert_w_ganz_s|Convert_w_ganz3_s|Convert_b_s)
               case "$funam" in
                   Convert_w_s)        fmt=,6.1i ;;
                   Convert_w_ganz_s)   fmt=5i ;;
                   Convert_w_ganz3_s)  fmt=3u ;;
                   Convert_b_s)        fmt=02u ;;
               esac
               Args 2 || break
               Zeile="${vorne}sprintf_F($a2, %"%%$fmt%", $a1$reste"
               print -r "//$zeile//F/" >> "$F"
           ;;
           *)  print -ru2 "Unbekannt: '$funam'"; exit 0 ;;
         esac
         break
      done
      print -r "$Zeile" >> "$F"
   done
   }
done

done


read "-?bish:$0: <Enter> "





###  chtm2tex.bish  #############################################

#!/u/bin/bish


[ $# -eq 0 ] && exit 0
SW=0
[ "$1" == -sw ] && SW=1 shift
DIR=.
[ $# -gt 1 ] && DIR="$1" shift
FILES="$*"

set Z:.1000
set Text:.100
set Leer:.100
set FILE:.100
set OFILE:.100
set HexC:010
R=000000000
G=000000000
B=000000000


PutText()  {
   local l:20.1 kl:21.1 kr:22.1
   expr "$Text" :Text '&quot;' += '"'
   expr "$Text" :Text '&lt;' += '<'
   expr "$Text" :Text '&gt;' += '>'
   expr "$Text" :Text '&amp;' += '&'
   expr "$Text" :Text ' ' += "$l"
   expr "$Text" :Text '{' += "$kl"
   expr "$Text" :Text '}' += "$kr"
  #expr "$Text" :Text '\' += '\textbackslash '
  #expr "$Text" :Text '''' += '\textquoteright '
  #expr "$Text" :Text '`' += '\textquoteleft '
  #expr "$Text" :Text '"' += '\textquotedblright '
  #expr "$Text" :Text '%^' += '\textasciicircum '
  #expr "$Text" :Text '~' += '\textasciitilde '
   expr "$Text" :Text '\' += '\symbol{92}'
   expr "$Text" :Text '''' += '\symbol{39}'
   expr "$Text" :Text '`' += '\symbol{96}'
   expr "$Text" :Text '"' += '\symbol{34}'
   expr "$Text" :Text '%^' += '\symbol{94}'
   expr "$Text" :Text '~' += '\symbol{126}'
  #expr "$Text" :Text '<' += '\textless '
  #expr "$Text" :Text '>' += '\textgreater '
   expr "$Text" :Text '&' += '\&'
   expr "$Text" :Text '#' += '\#'
   expr "$Text" :Text '%$' += '\$'
   expr "$Text" :Text '%%' += '\%'
   expr "$Text" :Text '_' += '\_'
   expr "$Text" :Text '<' += '\symbol{60}'
   expr "$Text" :Text '>' += '\symbol{62}'
   expr "$Text" :Text '-' += '\symbol{45}'
   expr "$Text" :Text '%[' += '\symbol{91}'
   expr "$Text" :Text ']' += '\symbol{93}'
   expr "$Text" :Text ',' += '\symbol{44}'
   #expr "$Text" :Text '%('"$l"'%{1,}%)' + '\verb:%1:'
   expr "$Text" :Text "$kl" += '\{'
   expr "$Text" :Text "$kr" += '\}'
   expr "$Text" :Text "$l" += '\ '
   ifset Text || return 1
   catv Text
   return 0
}


MkRgb()  {
   expr "$HexC" :R '^%(..%)....'
   expr "$HexC" :G '^..%(..%)..'
   expr "$HexC" :B '^....%(..%)'
   let "R=16#$R" "G=16#$G" "B=16#$B"
   let "R=(R*1000+127)/255" %
       "G=(G*1000+127)/255" %
       "B=(B*1000+127)/255"
   [ ${#R} -eq 1 ] && R=0.00$R
   [ ${#R} -eq 2 ] && R=0.0$R
   [ ${#R} -eq 3 ] && R=0.$R
   [ ${#R} -eq 4 ] && R=1.000
   [ ${#G} -eq 1 ] && G=0.00$G
   [ ${#G} -eq 2 ] && G=0.0$G
   [ ${#G} -eq 3 ] && G=0.$G
   [ ${#G} -eq 4 ] && G=1.000
   [ ${#B} -eq 1 ] && B=0.00$B
   [ ${#B} -eq 2 ] && B=0.0$B
   [ ${#B} -eq 3 ] && B=0.$B
   [ ${#B} -eq 4 ] && B=1.000
   [ "$HexC" == 000000 ] && return 1
   return 0
}


RAlez='%( %{1,}%)'
#RAtxt='%([^< ]%{1,}%)'
RAtxt='%([^<]%{1,}%)'
RAfcc='<font color="#%(......%)">'
RAbgc='<span style="background-color: #%(......%)">'
KZ='[%/*#(;"]%{1,2}'
Vim='&quot;&quot;'


Leerz()  {
   local k:.10 rek=$1
   shift
   expr "$rek" :k '[BFb]' += '}' || k=
   catv k /\verb: Text /:
   while ifset rek
   do
      catv 1,rek =k:
      expr "$rek" :rek '^.%(.*%)$'
      case "$k" in
        B)  catv ".\colorbox[rgb]{$1,$2,$3}{"; shift 3 ;;
        F)  catv ".\textcolor[rgb]{$1,$2,$3}{"; shift 3 ;;
        b)  catv '.\textbf{' ;;
      esac
   done
   return 0
}

Zeile()  {
   local a=. k=. rek=$1 sw=R
   [ SW -eq 1 ] && sw=r
   shift
   while :
   do
      ifset Z || return 0
      expr "$rek" :k '%(.%)$' || k=.
      case "$k" in
        B)  expr "$Z" :Z '^</span>' = '' && k=$sw ;;
        F)  expr "$Z" :Z '^</font>' = '' && k=$sw ;;
        f)  expr "$Z" :Z '^</font>' = '' && k=r ;;
        b)  expr "$Z" :Z '^</b>'    = '' && k=R ;;
      esac
      [ "$k" == r ] && { return 0; }
      [ "$k" == R ] && { catv '.}'; return 0; }
      #expr "$Z" :Text "^$RAlez" && {
      #   Leerz $rek $*
      #   expr "$Z" :Z "^$RAlez" = ''
      #}
      expr "$Z" :Text "^$RAtxt" && {
         PutText
         expr "$Z" :Z "^$RAtxt" = ''
      }
      expr "$Z" :HexC "^$RAbgc" && {
         expr "$Z" :Z "^$RAbgc" = ''
         [ SW -eq 0 ] && { MkRgb; catv ".\colorbox[rgb]{$R,$G,$B}{"; }
         Zeile ${rek}B $* $R $G $B
      }
      expr "$Z" :HexC "^$RAfcc" && {
         expr "$Z" :Z "^$RAfcc" = ''; a=f
         [ SW -eq 0 ] && MkRgb && a=F catv ".\textcolor[rgb]{$R,$G,$B}{"
         Zeile ${rek}$a $* $R $G $B
      }
      expr "$Z" :: "^<b>" && {
         expr "$Z" :Z "^<b>" = ''
         catv ".\textbf{"
         Zeile ${rek}b $*
      }
   done
   return 0
}


for FILE in $FILES
do
   < $FILE
   while :
   do
      OFILE=
      while readl Z
      do  expr "$Z" :OFILE "$KZ"'@+%(%w%{4,}%)@'"$KZ" &|
          expr "$Z" :OFILE "$Vim"'@+%(%w%{4,}%)@'"$Vim" && break
      done
      ifset OFILE || break
      print -u2 "%t$DIR/$OFILE.ctex"
      > $DIR/$OFILE.ctex
      catv '/\begin{flushleft}%n\begin{ttfamily}%n'
      while readl Z
      do
         expr "$Z" :: "$KZ@-$OFILE@$KZ" &|
         expr "$Z" :: "$Vim@-$OFILE@$Vim" && break
         catv '/\ \ \ '  #"/\verb:   :"
         Zeile
         catv /\\%n
      done
      catv '/\end{ttfamily}%n\end{flushleft}%n'
      ><
   done
   ><
done

exit 0





###  chtm2tex.bish  #############################################

#!/u/bin/bish


[ $# -eq 0 ] && exit 0
DIR=.
[ $# -gt 1 ] && DIR="$1" shift
FILES="$*"

set Z:.500
set Text:.100
set Leer:.100
set FILE:.100
set OFILE:.100
set HexC:010
R=000000000
G=000000000
B=000000000


PutText()  {
   local l:20.1
   expr "$Text" :Text '&quot;' += '"'
   expr "$Text" :Text '&lt;' += '<'
   expr "$Text" :Text '&gt;' += '>'
   expr "$Text" :Text '&amp;' += '&'
   expr "$Text" :Text ' ' += "$l"
   expr "$Text" :Text '\' += '\textbackslash '
   expr "$Text" :Text '''' += '\textquoteright '
   expr "$Text" :Text '`' += '\textquoteleft '
   expr "$Text" :Text '"' += '\textquotedblright '
   expr "$Text" :Text '%^' += '\textasciicircum '
   expr "$Text" :Text '~' += '\textasciitilde '
   #expr "$Text" :Text '<' += '\textless '
   #expr "$Text" :Text '>' += '\textgreater '
   expr "$Text" :Text '&' += '\&'
   expr "$Text" :Text '#' += '\#'
   expr "$Text" :Text '%$' += '\$'
   expr "$Text" :Text '%%' += '\%'
   expr "$Text" :Text '_' += '\_'
   expr "$Text" :Text '{' += '\{'
   expr "$Text" :Text '}' += '\}'
   #expr "$Text" :Text '%('"$l"'%{1,}%)' + '\verb:%1:'
   expr "$Text" :Text "$l" += '\ '
   ifset Text || return 1
   catv Text
   return 0
}


MkRgb()  {
   expr "$HexC" :R '^%(..%)....'
   expr "$HexC" :G '^..%(..%)..'
   expr "$HexC" :B '^....%(..%)'
   let "R=16#$R" "G=16#$G" "B=16#$B"
   let "R=(R*1000+127)/255" %
       "G=(G*1000+127)/255" %
       "B=(B*1000+127)/255"
   [ ${#R} -eq 1 ] && R=0.00$R
   [ ${#R} -eq 2 ] && R=0.0$R
   [ ${#R} -eq 3 ] && R=0.$R
   [ ${#R} -eq 4 ] && R=1.000
   [ ${#G} -eq 1 ] && G=0.00$G
   [ ${#G} -eq 2 ] && G=0.0$G
   [ ${#G} -eq 3 ] && G=0.$G
   [ ${#G} -eq 4 ] && G=1.000
   [ ${#B} -eq 1 ] && B=0.00$B
   [ ${#B} -eq 2 ] && B=0.0$B
   [ ${#B} -eq 3 ] && B=0.$B
   [ ${#B} -eq 4 ] && B=1.000
   [ "$HexC" == 000000 ] && return 1
   return 0
}


RAlez='%( %{1,}%)'
#RAtxt='%([^< ]%{1,}%)'
RAtxt='%([^<]%{1,}%)'
RAfcc='<font color="#%(......%)">'
RAbgc='<span style="background-color: #%(......%)">'
KZ='[%/*#(;"]%{2}'
Vim='&quot;&quot;'


Leerz()  {
   local k:.10 rek=$1
   shift
   expr "$rek" :k '[BFb]' += '}' || k=
   catv k /\verb: Text /:
   while ifset rek
   do
      catv 1,rek =k:
      expr "$rek" :rek '^.%(.*%)$'
      case "$k" in
        B)  catv ".\colorbox[rgb]{$1,$2,$3}{"; shift 3 ;;
        F)  catv ".\textcolor[rgb]{$1,$2,$3}{"; shift 3 ;;
        b)  catv '.\textbf{' ;;
      esac
   done
   return 0
}

Zeile()  {
   local a=. k=. rek=$1
   shift
   while :
   do
      ifset Z || return 0
      expr "$rek" :k '%(.%)$' || k=.
      case "$k" in
        B)  expr "$Z" :Z '^</span>' = '' && k=R ;;
        F)  expr "$Z" :Z '^</font>' = '' && k=R ;;
        f)  expr "$Z" :Z '^</font>' = '' && k=r ;;
        b)  expr "$Z" :Z '^</b>'    = '' && k=R ;;
      esac
      [ "$k" == r ] && { return 0; }
      [ "$k" == R ] && { catv '.}'; return 0; }
      #expr "$Z" :Text "^$RAlez" && {
      #   Leerz $rek $*
      #   expr "$Z" :Z "^$RAlez" = ''
      #}
      expr "$Z" :Text "^$RAtxt" && {
         PutText
         expr "$Z" :Z "^$RAtxt" = ''
      }
      expr "$Z" :HexC "^$RAbgc" && {
         expr "$Z" :Z "^$RAbgc" = ''
         MkRgb
         catv ".\colorbox[rgb]{$R,$G,$B}{"
         Zeile ${rek}B $* $R $G $B
      }
      expr "$Z" :HexC "^$RAfcc" && {
         expr "$Z" :Z "^$RAfcc" = ''; a=f
         MkRgb && a=F catv ".\textcolor[rgb]{$R,$G,$B}{"
         Zeile ${rek}$a $* $R $G $B
      }
      expr "$Z" :: "^<b>" && {
         expr "$Z" :Z "^<b>" = ''
         catv ".\textbf{"
         Zeile ${rek}b $*
      }
   done
   return 0
}


for FILE in $FILES
do
   < $FILE
   while :
   do
      OFILE=
      while readl Z
      do  expr "$Z" :OFILE "$KZ"'@+%(%w%{4,}%)@'"$KZ" &|
          expr "$Z" :OFILE "$Vim"'@+%(%w%{4,}%)@'"$Vim" && break
      done
      ifset OFILE || break
      print -u2 "%t$DIR/$OFILE.ctex"
      > $DIR/$OFILE.ctex
      catv '/\begin{flushleft}%n\begin{ttfamily}%n'
      while readl Z
      do
         expr "$Z" :: "$KZ@-$OFILE@$KZ" &|
         expr "$Z" :: "$Vim@-$OFILE@$Vim" && break
         catv '/\ \ \ '  #"/\verb:   :"
         Zeile
         catv /\\%n
      done
      catv '/\end{ttfamily}%n\end{flushleft}%n'
      ><
   done
   ><
done

exit 0





###  ck128.bish  #############################################

#!/u/bish/a.out

#grep -Xn -e '[%d{128}-%d{255}-[äöüßÄÖÜ]]' /u/bish/man/?*.mn? /u/bish/bish.c /u/bish/mod/*.[hc]
grep -Xn -e '[%d{128}-%d{255}-[äöüßÄÖÜ]]' /u/bish/bish.c /u/bish/mod/*.[hc]
:




###  cmp.bish  #############################################



for b from 64 by -1 to 2 repeat
do
   echo "%n#define SINGLE$b(A,B,F)" ' (  \'
   a=-0001
   while let '++a<=--b'
   do
      echo "%tA[$a]==B[$a]&&" ' \'
      let 'a>=b' && break
      echo "%tA[$b]==B[$b]&&" ' \'
   done
   echo '%t%t%t)'
done




###  cnt.bish  #############################################


set -f
cd /u/hp/2

for mode in add num dir del nowebhits webhits numnam
do
read "inp?$mode?[y]: "
[ "$inp" != y ] && continue
[ "$mode" == numnam ] && : > /u/hp/cnt_htm.lst
n=00000000
for file in %
        index.htm %
        de/index.htm %
        produkte.htm %
        recover.htm %
        de/190.htm %
        de/atxcool.htm %
        de/bishbeisp.htm %
        de/c.htm %
        de/cc.htm %
        de/cksum.htm %
        de/cmd.htm %
        de/fan.htm %
        de/hinw.htm %
        de/htm/ansi.htm %
        de/htm/bishmnk.htm %
        de/htm/istepbish.htm %
        de/htm/rgb.htm %
        de/kurz.htm %
        de/lim/compilo.htm %
        de/lim/lim.htm %
        de/lizenz.htm %
        de/mailcode.htm %
        de/old/delsafe.htm %
        de/old/forum.htm %
        de/old/hpinfo.htm %
        de/old/olinfo.htm %
        de/old/pearl.htm %
        de/overclk.htm %
        de/pent.htm %
        de/sco.htm %
        de/syntax.htm %
        de/win.htm %
        bish/chprint.htm %
        bish/proto.htm %
        bish/segm.htm %
        bish/stack.htm %
        bish/var.htm
do
   [ -s $file ] || continue
   let ++n
   echo $mode:$n: $file
   case $mode in
     add)
        grep -qm 'cgi/icnt.pl?' $file && continue
        cat $file | {
           > $file
           while readl zeile
           do
              print -r "$zeile"
              expr "$zeile" =:: '^[ %t]*<body ' || continue
              cat /u/hp/cnt_htm
           done
           ><
        }
     ;;
     num)
        cat $file | {
           > $file
           while readl zeile
           do
              expr "$zeile" :: 'cgi/icnt.pl?' ||
                 print -r "$zeile" && continue
              expr "$zeile" :zeile %
               '%(cgi/icnt.pl?[0-9]%{1,%}%.%)[1-9][0-9]*' %
               "%%1$n"
              print -r "$zeile"
           done
           ><
        }
     ;;
     dir)
        vors='            '
        cat $file | {
           > $file
           while readl zeile
           do
              expr "$zeile" :: 'cgi/icnt.pl?' ||
                 print -r "$zeile" && continue
              expr "$file" :: '^[^/]%{1,%}/[^/]%{1,%}$' && vors=../de/
              expr "$file" :: '^de/[^/]%{1,%}$' && vors=
              expr "$file" :: '^de/[^/]%{1,%}/[^/]%{1,%}$' && vors=../
              expr "$file" :: '/' || vors=de/
              expr "$zeile" :zeile %
               '"[^"]*%(cgi/icnt.pl?[0-9][^"]%{1,%}"%)' + "%"$vors%%1"
              print -r "$zeile"
           done
           ><
        }
     ;;
     del)
        z=0
        cat $file | {
           > $file
           while readl zeile
           do
              let z==0 && expr "$zeile" =:: '<table ..*130..*35' &&
                 z=1 && continue
              let z==1 && expr "$zeile" =:: '</table>' &&
                 z=2 && continue
              let z==1 && continue
              print -r "$zeile"
           done
           ><
        }
     ;;
     nowebhits)
        cat $file | {
           > $file
           while readl zeile
           do
              expr "$zeile" =:: %
              '<img ..*Count.cgi..*df=27273.dat[^<>]*>' ||
                 print -r "$zeile" && continue
              expr "$zeile" =:: %
              '<!--<img ..*Count.cgi..*df=27273.dat[^<>]*>-->' &&
                 print -r "$zeile" && continue
              expr "$zeile" =:zeile %
              '%(<img ..*Count.cgi..*df=27273.dat[^<>]*>%)'  '<!--%1-->'
              print -r "$zeile"
           done
           ><
        }
     ;;
     webhits)
        cat $file | {
           > $file
           while readl zeile
           do
              expr "$zeile" =:zeile %
              '<!--%(<img ..*Count.cgi..*df=27273.dat[^<>]*>%)-->'  '%1'
              print -r "$zeile"
           done
           ><
        }
     ;;
     numnam)
        print -r "$n: $file" >> /u/hp/cnt_htm.lst
     ;;
     *)  echo "*** $n: $file ***"; break 2 ;;
   esac
done
done





###  cnt2.bish  #############################################




set -f

html='<HTML><HEAD><TITLE></TITLE>
<META HTTP-EQUIV="refresh" CONTENT="0; URL=~url~">
</HEAD><BODY TEXT="#000000" BGCOLOR="#CDAA7D">
<center><br><br><h1>Hui</h1></center></BODY></HTML>
'
echo cd de > /u/hp/ren
cd /u/hp/2/de
list -fR |
while readl Z
do
   expr "$Z" :nam '%([^/]*%.htm%)$' || continue
   expr "$Z" :dir '^%(.*/%)[^/]*$' || dir=
   catv 3,nam =pre:
   base -b pre +12 pre
   conv -'d ' pre
   pre="${pre}_"
   Zg="$(- grep -m 'icnt.pl?0%.[1-9][0-9]*' $dir$nam )" ||
      echo !grep $dir$nam
   expr "$Zg" :Zg 'icnt.pl?%(0%.[1-9][0-9]*%)'
   move $dir$nam $dir$pre$nam
   echo rename $dir$nam $dir$pre$nam >> /u/hp/ren
   url="cgi/get.pl?$Zg:../$dir$nam"
   ifset dir && url="../$url"
   expr "$html" :HTML '~url~' = "$url"
   [ ! -e "$dir$nam" ] && catv HTML > $dir$nam
done

echo cd / >> /u/hp/ren
cd /u/hp/2
list -f |
while readl Z
do
   expr "$Z" :nam '%([^/]*%.htm%)$' || continue
   expr "$Z" :dir '^%(.*/%)[^/]*$' || dir=
   catv 3,nam =pre:
   base -b pre +12 pre
   conv -'d ' pre
   pre="${pre}_"
   Zg="$(- grep -m 'icnt.pl?0%.[1-9][0-9]*' $dir$nam )" ||
      echo !grep $dir$nam
   expr "$Zg" :Zg 'icnt.pl?%(0%.[1-9][0-9]*%)'
   move $dir$nam $dir$pre$nam
   echo rename $dir$nam $dir$pre$nam >> /u/hp/ren
   url="de/cgi/get.pl?$Zg:../../$dir$nam"
   ifset dir && url="../$url"
   expr "$html" :HTML '~url~' = "$url"
   [ ! -e "$dir$nam" ] && catv HTML > $dir$nam
done





###  cnt3.bish  #############################################




set -f

cd /u/hp/2
: > /u/hp/hlst
for F in `find . -type f -name '*.htm' -print`
do
   < /u/hp/rlst
   while readl Z
   do
      grep -qm -e '="[^"]*'$Z'"' $F && echo $F: $Z >> /u/hp/hlst
   done
   ><
done





###  cntcodes.bish  #############################################

#!/u/bin/bish

set Z:.100 N:010

grep -c '^%%l%%[a-z]' kap/*.tex | {
   while readl Z
   do
      catv Z /%n
      expr "$Z" :Z ':%(%d%{1,}%)$' || continue
      let "N+=Z"
   done
}

catv .::: N /%n




###  code.bish  #############################################



Chapters()  {
   local z=0 c:.30
   CHAP=
   < "$1"
   while readl Z
   do
      case $z in
        0)  expr "$Z" :: '^\mainmatter' && z=1 ;;
        1)  expr "$Z" :: '^\backmatter' && break
            expr "$Z" :c '^\include{%([^}]%{1,}%)}' || continue
            expr "$c" :c '%([^/}]%{1,}%)$'
            catv c /%n =:,,CHAP:
         ;;
      esac
   done
   ><
   return 0
}


HTML()  {
   local z=0
   HTMLa=
   < "$1"
   while readl Z
   do
      expr "$Z" :Z '<title>[^<>]*</title>' = "$Title"
      expr "$Z" :: '^<body[ >]' && z=1
      catv Z /%n =:,,HTMLa:
      [ z -eq 1 ] && break
   done
   ><
   return 0
}


#html|text lang ifile chapter
Code()  {
   local z=0 t=0 kz=.. ch:.20
   [ $1 == text ] && z=2
   < $3
   while readl Z
   do
      case $z in
        0)
            expr "$Z" :ch '%(..%)@+%('"$4"'_[a-z0-9]%{2}%)@%1' || continue
            z=1 t=1; catv 2,ch =kz:; catv 2,,ch =ch:
            catv "/<a name=%"${ch}T%"></a>%n" =3
            catv "/&nbsp;&nbsp;&nbsp;<a href=%"#$ch%">$ch.$2</a><br>%n" =3
            catv "/<br><br><a name=%"$ch%"></a><br>%n"
            catv "/<a href=%"#${ch}T%">$ch.$2</a>%n<ul>%n"
            catv '/<table bgcolor="#000000" width="80%" border="0" cellpadding="10"><tr><td bgcolor="#ffffff"><pre>%n'
         ;;
        1)
            expr "$Z" :: "$kz@-$ch@$kz" && {
               catv '/</pre></td></tr></table></ul>%n'
               z=0 continue
            }
            catv Z /%n
         ;;
        2)
            expr "$Z" :ch '%(..%)@+%('"$4"'_[a-z0-9]%{2}%)@%1' || continue
            z=3 t=1; catv 2,ch =kz:; catv 2,,ch =ch:
            catv "/$kz $ch.$2%n"
         ;;
        3)
            expr "$Z" :: "$kz@-$ch@$kz" && {
               catv '/%n%n'
               z=2 continue
            }
            catv Z /%n
         ;;
      esac
   done
   ><
   [ $1 == html -a t -eq 1 ] && { catv '/<br>%n' =3; catv '/<br><br>%n'; }
   [ $1 == text -a t -eq 1 ] && { catv '/%n%n%n'; }
   return 0
}


HTMLb='</body>
</html>'
Title='<title>Kodeabschnitte in Farbe</title>'
HTML3='<br>
<h1>Moderne C-Programmierung - Kompendium und Referenz</h1>
<h2>Kodeabschnitte des Buches in Farbe</h2>
Hergestellt mit Editor <tt>gvim</tt> und Shell <tt>bish</tt><br>
<br><br><br>
'
TXT3='
Moderne C-Programmierung - Kompendium und Referenz
Kodeabschnitte des Buches als Plain-Text
Hergestellt mit Shell bish



'
set Z:.300
set CHAP:.500
set HTMLa:.400
set DE:.10
set LE:.10
set CH:.20
set CO:.20
set HT:.20


Chapters c.tex
HTML ctex_c.htm

for DE in html text
do
   CO=code3.$DE
   print -u2 "%t$CO"
   >$CO
   3>"/tmp/$CO"
   for LE in c bish cpp pl s txt
   do

      [ $DE == html ] && HT=ctex_$LE.htm
      [ $DE == text ] && HT=ctex_l.$LE
      print -u2 "%t%t$HT"
      for CH in $CHAP
      do
         print -u2 "%t%t%t$CH"
         Code $DE $LE $HT $CH
      done
   done
   ><<
   [ $DE == html ] && {
      catv HTMLa HTML3 3 0 HTMLb <$CO 3<"/tmp/$CO" | cat >$CO
      #move $CO ${CO}l
   }
   [ $DE == text ] && {
      catv TXT3 0 <$CO | {
         >$CO
         while readl Z
         do  catv Z /%r%n;  done
         ><
      }
   }
   remove -s /tmp/$CO
done

exit 0




###  colors.bish  #############################################

#!/u/bin/bish


set -f
set +S
[ `ver n` -lt 305 ] && { echo "Shell-Version < 305!"; exit 0; }
[ `ver w` == full -o -t 0 -a -t 1 -a -t 2 ] || exit 0
Script="$0"
expr "$Script" :Script '^%.[/\]' ''
if [ `ver s` == unix ]
then
   expr "$Script" :: '^[^/]' && Script="`-pwd`/$Script"
else
   expr "$Script" :: '^\.' && pwd | catv 0,2,0 Script =Script:
   expr "$Script" :: '^.:\.' || Script="`-pwd`\$Script"
   conv -t/\F\ Script
fi
echo "Script ist: '$Script'"

echo Inhalts-Test...
[ -w "$Script" ] || {
   print -u2 "Script hat Schreibschutz: '$Script'"; exit 1; }
inp=`grep -c '^#@F ......' "$Script"`
let "inp!=551" && { echo "$inp:Script-Inhalt ungültig!"; exit 1; }
inp=`grep -c '^#@G [a-zA-Z0-9,äöüß]%{20%}$' "$Script"`
let "inp!=100" && { echo "$inp:Script-Inhalt ungültig!"; exit 1; }
inp=`grep -c '^#@g [-0-9]%{10%}$' "$Script"`
let "inp!=1" && { echo "$inp:Script-Inhalt ungültig!"; exit 1; }

RGB=000000
GWpos=0000000000
Gpos=0000000000
Dpos=0000000000
Pos=0000000000
NDsel="$(prints sf010-)"
Dsel="$(prints s150-)"
Gsel="$(prints s20-)"
#NL="$(catv /%n)"
Hex=$(prints sf070-)
CN="$(prints s210-)"
zeile="$(prints s300-)"
Such="$(prints s250-)"
Fsel="$(prints s150-)"
Zeile="$(prints s1250-)"

< $Script
while seek + 0 GWpos; readl Zeile
do  expr "$Zeile" :: '^#@g ' && break;  done
catv $((GWpos+=4)),10,0 =Gsel:
echo GruppenGWposition=$GWpos

echo Inhalts-Test G...
inp=000
seek $GWpos 0
while readl Zeile
do  expr "$Zeile" :: '^#@G ' && { let ++inp; continue; }
    let inp && break
done
seek + 0 Dpos
><
let "inp!=100" && { echo "$inp:Script-Inhalt ungültig!"; exit 1; }

< $Script
seek $GWpos 0
while seek + 0 Gpos; readl Zeile
do  expr "$Zeile" :: '^#@G ' && break;  done
echo Gruppenposition=$Gpos

seek $Dpos 0
while seek + 0 Dpos; readl Zeile
do  expr "$Zeile" :: '^#@D[0-9] ' && break;  done
><
echo Dateienposition=$Dpos
let "!GWpos||!Gpos||!Dpos||GWpos>=Gpos||GWpos>=Dpos||Gpos>=Dpos" &&
    { echo "pos:Script-Inhalt ungültig!"; exit 1; }



Fmain()  {
   inp=$1
   shift
   case "$inp" in
      NDGsel)
         local g=00
         NDsel="    0"
         expr "$Gsel" :: '[0-9]' || return
         < $Script
         seek $Dpos 0
         while readl Zeile
         do
            expr "$Zeile" :: '^#@D[0-9] ' || continue
            catv 3,1,Zeile =g:
            expr "$Gsel" :: $g || continue
            let ++NDsel
         done
         ><
         NDsel="$( prints s5- $NDsel )"
         return 0
      ;;
      Gw)
         local g=00
         Gsel=----------
         for g from 0 by 1 to 9 repeat
         do
            expr "-$1" :: "$g" || continue
            catv g =$g,1,Gsel
         done
         catv Gsel =$GWpos,10,0  <> $Script
         return 0
      ;;
      Gcopyg)
         local g="$1" n=00
         ifset g || return
         expr "$g" :: '[^0-9]' && return
         let "g>9" && return
         < $Script
         for n from 0 by 1 to 9 repeat
         do
            catv $((Gpos+g*260+n*26+4)),20,0 =$((n*20)),,CN
         done
         ><
         conv -t", " CN
         return 0
      ;;
      GcopyG)
         local grp="$1" g=00 n=00
         ifset grp || return
         expr "$grp" :: '[^0-9]' && return
         conv -t" ," CN
         <> $Script
         for g from 0 by 1 to 9 repeat
         do
            expr "$grp" :: $g || continue
            for n from 0 by 1 to 9 repeat
            do
               catv $((n*20)),20,CN =$((Gpos+g*260+n*26+4)),,0
            done
         done
         ><
         conv -t", " CN
         return 0
      ;;
      DCheck)
         local n=000 pos
         list -fR | {
            seek + 0 pos
            3< $Script
            seek $Dpos 3
            while readl -u3 Zeile
            do
               expr "$Zeile" :: '^#@D[0-9] ' || continue
               catv 5,,Zeile =Zeile:
               ifset Zeile || continue
               seek $pos 0
               grep -qFx -e "$Zeile" && continue
               #while readl zeile
               #do  cmpv Zeile zeile && continue 2;  done
               let ++n
               print -r "   $Zeile"
            done
            ><
         }
         let n || return 0
         echo "Es wurden $n Dateinamen gefunden, die im aktuellen"
         echo "Verzeichnis nicht existieren."
         echo "Dateieinträge entfernen? [J]: %c"
         read inp
         [ "$inp" != J ] && return 0
         catv $Dpos,,0 < $Script | {
            fstat +s $Dpos $Script
            >> $Script
            while readl Zeile Such
            do
               expr "$Zeile" :: '^#@D[0-9] ' || continue
               catv 5,,Zeile =Zeile:
               ifset Zeile || continue
               list -fR | grep -qFx -e "$Zeile" || continue
               catv Such /%n
               #list -fR |
               #   while readl zeile
               #   do  cmpv Zeile zeile && { catv Such /%n; break; }
               #   done
            done
            ><
         }
         return 0
      ;;
      SetD)
         local tmp=$1 von=____ bis=____ n=0000 g=00 grp
         shift
         while let $#
         do
            grp="$1"
            expr "$grp" :: '[0-9]=[-0-9]' || continue
            conv -t"= " grp
            for 2 bis grp  in  $grp ; do :; done
            expr "$grp" :: '[^-0-9]' && continue
            expr "$grp" :: '-' && grp=-
            conv -t"- " bis
            for 2 von bis  in  $bis ; do :; done
            ifset bis || bis=$von
            expr "$von$bis" :: '[^0-9]' && continue
            let "!von||!bis||von>bis" && continue
            4< $tmp
            catv $Dpos,,0 < $Script | {
               fstat +s $Dpos $Script
               seek + 0 Pos
               while readl Such
               do
                  expr "$Such" :: '^#@D[0-9] ' || continue
                  catv 3,1,Such =g:
                  catv 5,,Such =Such:
                  seek 0 4; n=0
                  while readl -u4 zeile
                  do
                     let "++n<von||n>bis" && continue
                     cmpv Such zeile && continue 2
                  done
                  catv "/#@D$g " Such /%n >> $Script
               done
               seek 0 4; n=0
               while [ $grp != - ] && readl -u4 zeile
               do
                  let "++n<von||n>bis" && continue
                  for g from 0 by 1 to 9 repeat
                  do
                     expr "$grp" :: "$g" || continue
                     catv "/#@D$g " zeile /%n >> $Script
                  done
               done
            }
            ><
            shift
         done
         return 0
      ;;
      GetGrp)
         local grp=---------- g=0
         < $Script
         seek $Dpos 0
         while readl zeile
         do
            expr "$zeile" :: '^#@D[0-9] ' || continue
            catv 3,1,zeile =g:
            catv 5,,zeile =zeile:
            cmpv $1 zeile && catv g =$g,1,grp
         done
         ><
         $2=$grp
         return 0
      ;;
      Dateien)
         local n=000 tmp
         mktemp tmp
         > $tmp
         list -fR |
            while readl Zeile Such
            do
               conv -L Such
               expr "$Such" :: '.html%{0,1%}$' &&
                  catv Zeile /%n
            done
         ><
         3<&0
         while :
         do
            n=0
            < $tmp
            while readl Zeile
            do
               let ++n
               Fmain GetGrp Zeile inp
               prints ss4s "   $inp " $n ":$Zeile"
               let "n%20==0" && {
                  echo "Auswahl:a[-b]=0123456789- ..."
                  echo "Weiter:<Enter> %c"
                  read -u3 inp
                  ifset inp && Fmain SetD $tmp $inp
               }
            done
            ><
            echo "Auswahl:a[-b]=0123456789- ..."
            echo "Start:<Enter>  Beenden:e (EOF) %c"
            read -u3 inp
            ifset inp || continue
            [ "$inp" == e ] && break
            Fmain SetD $tmp $inp
         done
         ><
         remove $tmp
         return 0
      ;;
      ShowF)
         local nf=-001 rgb=000000000000 nl=-001 sel nam
         inp=""
         3<&0
         grep '^#@[Ff] ' $Script | Fconv | {
         seek + 0 Pos
         while :
         do
            nf=-1 nl=-1
            seek $Pos 0
            while read nam rgb
            do
               let ++nf
               Zeile="$nam"; conv -U Zeile
               ifset inp && [[ "$Zeile" != "$inp" ]] && continue
               let ++nl
               prints s5s-20s4s4s4  $nf: $nam $rgb
               let "nl>0&&nl%20==0" && {
                  echo "Start:s  Beenden:e  Farbwahl:123 [456]..."
                  echo "Farbname:[*]xyz[*]  Weiter:<Enter>  %c"
                  read -u3 inp
                  conv -t"$(echo %t%c) " inp
                  [ "$inp" == e ] && break 2
                  [ "$inp" == s ] && { inp=; continue 2; }
                  expr "$inp" :: '[^ 0-9]' ||
                     expr "$inp" :: '[0-9]' && sel="$sel$inp " inp=
                  ifset inp && { conv -U inp; continue 2; }
               }
            done
            echo "Start:<Enter>  Beenden:e  Farbwahl:123 [456]..."
            echo "Farbname:[*]xyz[*]  (EOF)  %c"
            read -u3 inp
            conv -t"$(echo %t%c) " inp
            [ "$inp" == e ] && break
            conv -U inp
            ifset inp || continue
            expr "$inp" :: '[^ 0-9]' ||
               expr "$inp" :: '[0-9]' && sel="$sel$inp " inp=
         done
         }
         ><
         ifset sel || return 0
         echo Farbnamen-Selektion...
         nf=-1
         grep '^#@[Ff] ' $Script | Fconv | {
            while read nam rgb
            do
               let ++nf
               expr " $sel " :: " $nf " && Fsel="$Fsel$nf:$nam  "
            done
         }
         return 0
      ;;
      SetRGB)
         local r=$1 g=$2 b=$3
         r=$((16#, r&255)) g=$((16#, g&255)) b=$((16#, b&255))
         let "${#r}==1" && r="0$r"
         let "${#g}==1" && g="0$g"
         let "${#b}==1" && b="0$b"
         RGB="$r$g$b"
         conv -u RGB
         return 0
      ;;
      GetFnam)
         local nu=-001 rgb=000000000000 f="$1" nam
         conv -Ud, f
         while read nam rgb
         do
            let ++nu
            expr "$1" :: '^[0-9]%{1,3%}$' && {
               let "$1!=nu" && continue
               Fmain SetRGB $rgb; echo $nam; return 0
            }
            inp=$nam; conv -U inp
            [[ $inp != "$f" ]] && continue
            Fmain SetRGB $rgb; echo $nam; return 0
         done
         return 1
      ;;
      Help)
         local n=00000 j=/%j z=...
         3<&0
         while :
         do
            echo ; prints sf-79
            n=0 j=/%j z=
            grep '^#@H' $Script |
               while readl Zeile
               do
                  catv "/     " 4,,Zeile $j
                  let "++n%20==0" &&
                     echo "${z}Start:s  Beenden:e  Weiter:<Enter> %c"
                  let "n>=20" && { j= z=%n
                     read -u3 inp
                     [ "$inp" == e ] && break 2
                     [ "$inp" == s ] && continue 2
                  }
               done
            prints sf-79
            echo "Start:<Enter>  Beenden:e (EOF) %c"
            read -u3 inp
            [ "$inp" == e ] && break
         done
         ><
         return 0
      ;;
      *)  print -u2 "!!! $inp $* ???" ;;
   esac
   return
}



Fconv()  {
   local l=0000 o=0000 n=-00001
   while readl Zeile
   do
      print -nu2 "%t$((++n))    %r"
      expr "$Zeile" :: '^#@f' && { catv 4,,Zeile /%n; continue; }
      let "l=${#Zeile}, l<6||l&1" && {
         print -u2 "l=$l:falscher Wert!"; exit 1; }
      catv 4,,Zeile =Zeile:
      l=${#Zeile}
      while (( l>=16 ))
      do
         catv 0,2,Zeile /" " 2,2,Zeile /" " %
              4,2,Zeile /" " 6,2,Zeile /" " %
              8,2,Zeile /" " 10,2,Zeile /" " %
              12,2,Zeile /" " 14,2,Zeile | base -31 +b
         catv 16,,Zeile =Zeile:
         (( l-=16 ))
      done
      while (( l>=8 ))
      do
         catv 0,2,Zeile /" " 2,2,Zeile /" " %
              4,2,Zeile /" " 6,2,Zeile | base -31 +b
         catv 8,,Zeile =Zeile:
         (( l-=8 ))
      done
      (( o=-2, l+=2 ))
      while (( o+=2, l-=2, l>0 ))
      do
         catv $o,2,Zeile | base -31 +b
      done
      catv /%n
   done
   print -u2
   return 0
}



SetNH()  {
   local r=0
   [ "$1" == '#@W' ] && { r=000; shift; }
   let "$#&1" && { echo Ungerade ArgAnzahl; return 1; }
   let "$#<2" && return 1
   local n=$1 f="$(prints s20-)" pos=0000000000 fnam
   echo "... %c"
   grep '^#@[Ff] ' $Script | Fconv | {
      seek + 0 pos
      while let "$#>=2"
      do
         n=$1 f="$(prints s20-)"
         fnam=$( Fmain GetFnam "$2" )
         ifset fnam || { r=1; break; }
         echo "+$RGB%c"
         [ $r != 000 ] && catv fnam =f
         [ $r != 000 ] && catv f =$((20*[n-1])),20,CN
         catv RGB =$((6*[n-1])),6,Hex
         shift 2
         seek $pos 0
      done
   }
   echo
   return $r
}



Write()  {
   expr "$Gsel" :: '[0-9]' || return
   let $NDsel || return
   local g=00 n=0000 nn=0000
   mktemp zeile
   for g from 0 by 1 to 9 repeat
   do
      expr "$Gsel" :: $g || continue
      echo Gruppe $g...
      > $zeile
      < $Script
      seek $Dpos 0 ; n=0
      while readl Zeile
      do
         expr "$Zeile" :: "^#@D$g " || continue
         catv 5,,Zeile /%n ; let ++n ++nn
      done
      ><<
      let n || continue
      echo $n Dateien
      echo Farbgruppe setzen...
      SetNH '#@W' $(
         for n from 0 by 1 to 9 repeat
         do
            catv /"$((n+1)) " $((Gpos+g*260+n*26+4)),20,0 %
                 /%n  < $Script
         done
      ) || { print -u2 "Write: SetNH()==FALSE"; continue; }
      echo G=$g: HTML schreiben...
      WriteC $*
   done
   remove $zeile
   let nn && read "-?<Enter> "
   return 0
}



WriteC()  {
   [ $# -gt 0 ] || return
   local bgc='[Bb][Gg][Cc][Oo][Ll][Oo][Rr]' body='[Bb][Oo][Dd][Yy]'
   local s="$bgc" rgb=000000 hex
   Such=""
   while [ $# -gt 0 ]
   do
      let "hex=6*($1-1)"
      catv $hex,6,Hex =hex:
      case $1 in
        1)  Such="$Such $body $bgc $hex" ;;
        2)  Such="$Such [Tt][Aa][Bb][Ll][Ee] $bgc $hex" ;;
        3)  Such="$Such [Tt][Rr] $bgc $hex" ;;
        4)  Such="$Such [Tt][Dd] $bgc $hex" ;;
        5)  Such="$Such [Tt][Hh] $bgc $hex" ;;
        6)  Such="$Such $body [^VAva][Ll][Ii][Nn][Kk] $hex" ;;
        7)  Such="$Such $body [Vv][Ll][Ii][Nn][Kk] $hex" ;;
        8)  Such="$Such $body [Aa][Ll][Ii][Nn][Kk] $hex" ;;
        9)  Such="$Such $body [Tt][Ee][Xx][Tt] $hex" ;;
       10)  Such="$Such [Ff][Oo][Nn][Tt] [Cc][Oo][Ll][Oo][Rr] $hex" ;;
      esac
      shift
   done
   unset hex body
   local wrn=00 datei
   < $zeile    #DnamenTmpDatei
   while readl datei
   do
      [ -s "$datei" ] || continue
      print -rn "$datei" ...; inp=0
      0<> "$datei"
      while seek + 0 Pos; readl Zeile
      do
         let "${#Zeile}<19" && continue
         wrn=0
         for 3 s bgc rgb in $Such
         do
            [ $rgb == 010101 ] && continue
            expr "$Zeile" :Zeile %
               "%(<${s}[ %t][^<>]*${bgc}[ %t]*=[ %t]*%"#%)......%"" %
               "%1$rgb%"" || continue
            let "wrn|=512, ++inp"
         done
         let wrn && catv Zeile =$Pos,,0.
      done
      ><
      echo " $inp Schreibvorgänge"
   done
   ><
   return 0
}



echo Standardfarben setzen...
Fmain Gcopyg 1
#SetNH 1 Holz3 2 Elfenbein1 4 HellStahlBlau3 %
#      3 Elfenbein2 5 Weiß 6 StahlBlau3 7 StahlBlau4 %
#      8 Gold 9 Schwarz 10 Null
echo Dateienabgleich...
Fmain DCheck

Fsel="  " NDsel="    0"

echo
prints s:f-50 " bish-Script 'HTML-Color-Manager' "
prints s:f-50 " Copyright (c) Helmut Schellong "
echo
read "-?<Enter> "


while Fmain NDGsel ; echo "%r
   Aktuelles Verzeichnis '$(-pwd)': cd verz%r
   Farbnamen-Notizen  : %"$Fsel%"%r
   Farbenliste/Notizen               : f [-]%r
   Dateienauswahl            $NDsel   : d%r
   Gruppenauswahl       $Gsel   : gw [0123456789]%r
   Gruppen-Farbensatz kopieren < | > : g n | G n...%r
   Farbziel auf Farbe setzen         : {1-10}={fnam|fnum} [n=f]...%r
   DokumentBG  $(catv   0,20,CN)  1%r
   TabellenBG  $(catv  20,20,CN)  2%r
   TabRowBG    $(catv  40,20,CN)  3%r
   TabColBG    $(catv  60,20,CN)  4%r
   TabHColBG   $(catv  80,20,CN)  5%r
   Link        $(catv 100,20,CN)  6%r
   BesuLink    $(catv 120,20,CN)  7%r
   AktiLink    $(catv 140,20,CN)  8%r
   Textfarbe   $(catv 160,20,CN)  9%r
   Fontfarbe   $(catv 180,20,CN) 10%r
   Link-/Text-/Font-Farben schreiben : L|T|F%r
   Alle Farbziele schreiben          : S%r
   Hilfe                             : h%r
   Beenden                           : E%r
%r
                                     : %c"
do
   read inp rest
   case "$inp" in
     cd)  [ -d "$rest" ] || { echo %a%c; continue; }
          cd "$rest"
          echo Dateienabgleich...
          Fmain DCheck ;;
     d)  Fmain Dateien ;;
     f)  ifset rest && [ "$rest" == - ] && Fsel="  "
         ifset rest || Fmain ShowF ;;
     gw) Fmain Gw "$rest" ;;
     [Gg])  Fmain Gcopy$inp "$rest" ;;
     [1-9]=?*|10=?*)  conv -t"= " inp rest; SetNH $inp $rest ;;
     L)  Write 6 7 8 ;;
     T)  Write 9 ;;
     F)  Write 10 ;;
     S)  Write 1 2 3 4 5 6 7 8 9 10 ;;
     h)  Fmain Help ;;
     E)  break ;;
     *)  echo %a%c; continue ;;
   esac
done

exit 0

# Ab hier keinesfalls Änderungen an der Datei vornehmen!
# Ausnahmen: Eigene Farben "#@f ..." (siehe unten) und
             Dateiliste "#@D ..." am Ende.



#@F 2g3o3f3f111i111i111i
#@F 2l363b3q343l3t1111111h1111111h1111111h
#@F 2p383c78111j1m1m111j1m1m111j1m1m
#@F 2l363b3h3838111j1m1m111j1m1h111j1m1h
#@F 29383c3m3n2p383c78111j1l1p111j1l1p111j1m1m
#@F 2p383c78383l2k343o363b111j1l1m111j1l1m111j1l1m
#@F 29343c3h3m353i3l3i111j1j1h111j1j1h111j1j1h
#@F 243f3o3g383h2p383c78111j1m1m111j1m1h111j1l1h
#@F 233f3n2l3j3c3n3t38111j1m1k111j1l1m111j1k1h
#@F 2m3o363b2p383c78111j1m1h111j1l1h111j1k1h
#@F 233h3n3c3e2p383c78111j1m1h111j1k1m111j1i1m
#@F 2i343j343s342l343b3h38111j1m1m111j1k1q111j1i1k
#@F 2f343h37383f243f383c363b111j1m1m111j1k1m111j1h1m
#@F 2d383e3m111j1m1m111j1j1p111i1q1n
#@F 2i393c3l3m3c363b111j1m1m111j1i1p111i1p1m
#@F 2g343p343d3i2p383c78111j1m1m111j1j1j111i1o1k
#@F 2f3i3e3e343m3c3h111j1m1m111j1j1p111i1p1i
#@F 2d3i3l3h111j1m1m111j1l1p111j1j1h
#@F 273f39383h35383c3h111j1m1m111j1m1m111j1l1h
#@F 2s3c3n3l3i3h382l383c3738111j1m1m111j1m1h111j1h1m
#@F 2f38383l3g3o3m363b383f111j1m1m111j1l1m111j1k1p
#@F 2a3i3h3c3a3n343o111j1l1h111j1m1m111j1l1h
#@F 2i39383939383l3g3c3h3t2d3l383g38111j1l1m111j1m1m111j1m1h
#@F 233t3o3l111j1l1h111j1m1m111j1m1m
#@F 233f3c3638243f343o111j1l1h111j1l1p111j1m1m
#@F 2e343p383h37383f111j1k1h111j1k1h111j1m1h
#@F 2e343p383h37383f2k4o3n3f3c363b111j1m1m111j1l1h111j1l1m
#@F 2l363b3q34363b2k3i3m34111j1m1m111j1j1p111j1j1m
#@F 263o3h3e383f2l363b3c3839383l293l343o11111l1o11111o1q11111o1q
#@F 2a343f35373o3h3e383f293l343o111i1h1m111i1h1m111i1h1m
#@F 2l363b3c3839383l293l343o111i1i1j111i1j1p111i1l1l
#@F 2a383f3f2l363b3c3839383l293l343o111i1i1q111i1k1n111i1m1k
#@F 293l343o111i1q1h111i1q1h111i1q1h
#@F 2a383f3f293l343o111j1i1i111j1i1i111j1i1i
#@F 2f3c3n3n383l3h34363b3n243f343o11111j1m11111j1m111i1i1j
#@F 2f343l3c3h38243f343o1111111h1111111h111i1j1p
#@F 2d3i3l3h353f3o3g383h243f343o111i1h1h111i1l1q111j1k1o
#@F 263o3h3e383f2l363b3c3839383l243f343o11111o1j11111n1i111i1k1q
#@F 2l363b3c3839383l243f343o111i1h1n11111q1h111j1h1m
#@F 2f3c3n3n383f2l363b3c3839383l243f343o111i1j1k111i1h1l111j1k1p
#@F 2a383f3f2l363b3c3839383l243f343o111i1k1j111i1i1j111j1m1m
#@F 2f3c3n3n383f243f343o1111111h1111111h111j1h1m
#@F 2d4o3h3c3a243f343o11111n1m111i1h1m111j1j1m
#@F 243f343o1111111h1111111h111j1m1m
#@F 29343o3h383l243f343o11111k1h111i1l1l111j1m1m
#@F 2m3c38392a3c3g3g383f243f343o1111111h111i1q1i111j1m1m
#@F 2a3c3g3g383f243f343o111i1k1m111j1h1n111j1k1m
#@F 2a383f3f2a3c3g3g383f243f343o111i1k1m111j1h1n111j1m1h
#@F 2l3n343b3f243f343o11111o1h111i1k1h111i1p1h
#@F 2a383f3f2l3n343b3f243f343o111i1o1n111i1q1n111j1j1j
#@F 2a383f3f243f343o111i1o1k111j1i1n111j1k1h
#@F 2i3o37383l243f343o111i1o1n111j1j1l111j1k1h
#@F 243f34782m453l3e3c3m111i1o1m111j1k1p111j1k1p
#@F 263o3h3e383f2m453l3e3c3m1111111h111j1h1n111j1h1q
#@F 2f3c3n3n383f2m453l3e3c3m11111o1j111j1h1q111j1h1l
#@F 2m453l3e3c3m11111n1l111j1j1l111j1h1p
#@F 253s343h1111111h111j1m1m111j1m1m
#@F 2a383f3f253s343h111j1j1l111j1m1m111j1m1m
#@F 2d3437383n3n243f343o11111q1m111i1m1p111i1n1h
#@F 2f3c3n3n383f233k3o343g343l3c3h111i1h1j111j1h1m111i1o1h
#@F 233k3o343g343l3c3h111i1j1o111j1m1m111j1i1j
#@F 263o3h3e383f293l453h1111111h111i1h1h1111111h
#@F 263o3h3e383f2h3f3c3p293l453h11111p1m111i1h1o11111l1o
#@F 263o3h3e383f2f38383l293l453h111i1l1k111i1p1p111i1l1k
#@F 2f38383l293l453h11111l1n111i1k1q11111p1o
#@F 2f3c3n3n383f2f38383l293l453h11111n1h111i1o1q111i1i1k
#@F 2a383f3f2f38383l293l453h11111k1j111i1o1p111i1o1h
#@F 243f3478293l453h111i1m1j111j1m1i111i1m1j
#@F 283l453b3f3c3h3a293l453h1111111h111j1m1m111i1j1o
#@F 2k343m383h293l453h111i1j1l111j1m1j1111111h
#@F 293l453h1111111h111j1m1m1111111h
#@F 2d3l483o3n383l3f3c3e4o3l111i1j1o111j1m1m1111111h
#@F 2f3c3n3n383f283l453b3f3c3h3a293l453h1111111h111j1m1h111i1m1l
#@F 293l453h29383f35111i1o1k111j1m1m11111l1o
#@F 2e3c3g3i3h38293l453h11111m1h111j1h1m11111m1h
#@F 29383f35293l453h111i1m1l111j1h1m11111m1h
#@F 2p343f37293l453h11111k1l111i1k1q11111k1l
#@F 2h3f3c3p293l343o353l343o3h111i1h1o111i1l1j11111k1m
#@F 263o3h3e383f2d3b343e3c111i1p1q111i1p1k111i1h1o
#@F 2d3b343e3c111j1l1h111j1k1h111i1l1h
#@F 243f34782d343h3i3h383h3a3i3f37111j1k1p111j1k1j111i1o1h
#@F 2a383f3f2d343h3i3h383h3a3i3f3729383f35111j1m1h111j1m1h111j1i1h
#@F 2a383f3f29383f35111j1m1m111j1m1m111j1j1l
#@F 29383f35111j1m1m111j1m1m1111111h
#@F 293i3f37111j1m1m111j1i1m1111111h
#@F 2a383f3f2d343h3i3h383h3a3i3f37111j1k1p111j1j1i111i1k1h
#@F 2d343h3i3h383h3a3i3f37111j1i1p111i1n1m11111k1j
#@F 263o3h3e383f2d343h3i3h383h3a3i3f37111i1p1l111i1k1l11111i1i
#@F 2k3i3m34243l343o3h111i1p1p111i1l1k111i1l1k
#@F 2b3h373c343h383l2k3i3n111j1h1m11111q1j11111q1j
#@F 2l343n3n383f243l343o3h111i1k1q11111n1q11111i1q
#@F 2k3i3n353l343o3h111i1n1h11111p1j11111l1m
#@F 2i383l3o243l343o3h111j1h1m111i1k1k11111n1k
#@F 2a3i3f3t111j1j1j111i1p1l111i1k1m
#@F 24383c3a38111j1l1m111j1l1m111j1j1h
#@F 2g3478111j1l1m111j1j1j111i1o1q
#@F 2l343h37243l343o3h111j1l1l111i1n1l11111q1n
#@F 2a343o3n353l343o3h111j1i1h111i1p1h111i1l1h
#@F 2l363b3i3e3i3f343738111j1i1h111i1h1m11111k1h
#@F 2s3c383a383f3l3i3n111i1o1p11111k1l11111k1l
#@F 243l343o3h111i1n1m11111l1j11111l1j
#@F 263o3h3e383f2e34363b3m111j1k1k111i1m1h111i1j1j
#@F 2e34363b3m111j1m1h111i1j1p111i1i1l
#@F 2a383f3f2e34363b3m111j1m1m111i1n1h111i1j1j
#@F 2h3l343h3a38111j1m1m111i1n1m1111111h
#@F 263o3h3e383f2h3l343h3a38111j1m1m111i1l1h1111111h
#@F 2d3i3l343f3f38111j1m1m111i1j1o11111p1h
#@F 2a383f3f2d3i3l343f3f38111j1l1h111i1j1p111i1j1p
#@F 2m3i3g343n38111j1m1m11111q1q11111o1i
#@F 2h3l343h3a382k3i3n111j1m1m11111n1q1111111h
#@F 2k3i3n111j1m1m1111111h1111111h
#@F 2a3i3n2i3c3h3e111j1m1m111i1h1m111i1p1h
#@F 2m3c38392i3c3h3e111j1m1m11111j1h111i1l1o
#@F 2i3c3h3e111j1m1m111i1q1j111j1h1k
#@F 2a383f3f2i3c3h3e111j1m1m111i1p1j111i1q1k
#@F 243f34782o3c3i3f383n3n2k3i3n111j1i1q111i1i1j111i1l1o
#@F 2d343m3n343h3c38111i1o1n11111l1p11111q1n
#@F 2f3c3n3n383f2o3c3i3f383n3n2k3i3n111i1q1q11111j1i111i1k1k
#@F 2o3c3i3f383n3n2k3i3n111j1h1p11111k1j111i1l1l
#@F 2f343a383h3n34111j1m1m1111111h111j1m1m
#@F 2o3c3i3f383n3n111j1k1p111i1k1h111j1k1p
#@F 2i393f343o3g38111j1j1i111i1n1h111j1j1i
#@F 2h3l363b3c373838111j1i1p111i1i1j111j1i1l
#@F 2f3c3n3n383f2h3l363b3c373838111i1p1n11111p1m111j1i1i
#@F 263o3h3e383f2h3l363b3c373838111i1m1k11111m1h111j1h1l
#@F 263o3h3e383f2o3c3i3f383n3n111i1l1p1111111h111j1i1i
#@F 243f343o2o3c3i3f383n3n111i1k1p11111l1k111j1j1n
#@F 2e3c3f34111i1n1h11111k1j111j1l1h
#@F 2f3c3n3n383f2e3c3f34111i1l1o111i1i1j111j1i1q
#@F 263c3m3n383f111j1i1n111i1q1i111j1i1n
#@F 2l363b3h38381i111j1m1m111j1m1h111j1m1h
#@F 2l363b3h38381j111j1k1p111j1k1k111j1k1k
#@F 2l363b3h38381k111j1h1m111j1h1i111j1h1i
#@F 2l363b3h38381l111i1k1q111i1k1o111i1k1o
#@F 2f38383l3g3o3m363b383f1i111j1m1m111j1l1m111j1k1p
#@F 2f38383l3g3o3m363b383f1j111j1k1p111j1j1q111j1j1j
#@F 2f38383l3g3o3m363b383f1k111j1h1m111i1q1o111i1q1i
#@F 2f38383l3g3o3m363b383f1l111i1k1q111i1k1l111i1k1h
#@F 233h3n3c3e2p383c781i111j1m1m111j1k1q111j1i1q
#@F 233h3n3c3e2p383c781j111j1k1p111j1j1k111j1h1l
#@F 233h3n3c3e2p383c781k111j1h1m111i1q1j111i1o1n
#@F 233h3n3c3e2p383c781l111i1k1q111i1k1i111i1j1h
#@F 2d383e3m1i111j1m1m111j1j1p111i1q1n
#@F 2d383e3m1j111j1k1p111j1i1k111i1p1k
#@F 2d383e3m1k111j1h1m111i1p1k111i1m1p
#@F 2d383e3m1l111i1k1q111i1j1m111i1h1o
#@F 2i393c3l3m3c363b1i111j1m1m111j1i1p111i1p1m
#@F 2i393c3l3m3c363b1j111j1k1p111j1h1k111i1o1k
#@F 2i393c3l3m3c363b1k111j1h1m111i1o1m111i1l1q
#@F 2i393c3l3m3c363b1l111i1k1q111i1i1q111i1h1i
#@F 2g343p343d3i2p383c781i111j1m1m111j1j1j111i1o1k
#@F 2g343p343d3i2p383c781j111j1k1p111j1h1o111i1n1i
#@F 2g343p343d3i2p383c781k111j1h1m111i1o1q111i1k1q
#@F 2g343p343d3i2p383c781l111i1k1q111i1j1i11111q1l
#@F 2s3c3n3l3i3h382l383c37381i111j1m1m111j1m1h111j1h1m
#@F 2s3c3n3l3i3h382l383c37381j111j1k1p111j1k1k111i1q1i
#@F 2s3c3n3l3i3h382l383c37381k111j1h1m111j1h1i111i1n1m
#@F 2s3c3n3l3i3h382l383c37381l111i1k1q111i1k1o111i1i1j
#@F 2d3i3l3h1i111j1m1m111j1l1p111j1j1h
#@F 2d3i3l3h1j111j1k1p111j1k1j111j1h1m
#@F 2d3i3l3h1k111j1h1m111j1h1h111i1o1o
#@F 2d3i3l3h1l111i1k1q111i1k1n111i1j1h
#@F 273f39383h35383c3h1i111j1m1m111j1m1m111j1l1h
#@F 273f39383h35383c3h1j111j1k1p111j1k1p111j1j1l
#@F 273f39383h35383c3h1k111j1h1m111j1h1m111i1q1k
#@F 273f39383h35383c3h1l111i1k1q111i1k1q111i1k1i
#@F 2a3i3h3c3a3n343o1i111j1l1h111j1m1m111j1l1h
#@F 2a3i3h3c3a3n343o1j111j1j1l111j1k1p111j1j1l
#@F 2a3i3h3c3a3n343o1k111i1q1k111j1h1m111i1q1k
#@F 2a3i3h3c3a3n343o1l111i1k1i111i1k1q111i1k1i
#@F 2e343p383h37383f2k4o3n3f3c363b1i111j1m1m111j1l1h111j1l1m
#@F 2e343p383h37383f2k4o3n3f3c363b1j111j1k1p111j1j1l111j1j1q
#@F 2e343p383h37383f2k4o3n3f3c363b1k111j1h1m111i1q1k111i1q1o
#@F 2e343p383h37383f2k4o3n3f3c363b1l111i1k1q111i1k1i111i1k1l
#@F 2l363b3q34363b2k3i3m341i111j1m1m111j1j1p111j1j1m
#@F 2l363b3q34363b2k3i3m341j111j1k1p111j1i1k111j1i1h
#@F 2l363b3q34363b2k3i3m341k111j1h1m111i1p1k111i1p1i
#@F 2l363b3q34363b2k3i3m341l111i1k1q111i1j1m111i1j1k
#@F 233t3o3l1i111j1l1h111j1m1m111j1m1m
#@F 233t3o3l1j111j1j1l111j1k1p111j1k1p
#@F 233t3o3l1k111i1q1k111j1h1m111j1h1m
#@F 233t3o3l1l111i1k1i111i1k1q111i1k1q
#@F 2l363b3c3839383l243f343o1i111i1k1i111i1i1i111j1m1m
#@F 2l363b3c3839383l243f343o1j111i1j1j111i1h1k111j1k1p
#@F 2l363b3c3839383l243f343o1k111i1h1m11111p1q111j1h1m
#@F 2l363b3c3839383l243f343o1l11111o1i11111n1h111i1k1q
#@F 2d4o3h3c3a243f343o1i11111o1j111i1i1p111j1m1m
#@F 2d4o3h3c3a243f343o1j11111n1o111i1i1h111j1k1p
#@F 2d4o3h3c3a243f343o1k11111m1p11111q1m111j1h1m
#@F 2d4o3h3c3a243f343o1l11111k1q11111n1l111i1k1q
#@F 243f343o1i1111111h1111111h111j1m1m
#@F 243f343o1j1111111h1111111h111j1k1p
#@F 243f343o1k1111111h1111111h111j1h1m
#@F 243f343o1l1111111h1111111h111i1k1q
#@F 29343o3h383l243f343o1i11111k1h111i1l1l111j1m1m
#@F 29343o3h383l243f343o1j11111j1p111i1k1l111j1k1p
#@F 29343o3h383l243f343o1k11111j1l111i1i1n111j1h1m
#@F 29343o3h383l243f343o1l11111i1n11111o1p111i1k1q
#@F 2l3n343b3f243f343o1i11111q1q111i1p1l111j1m1m
#@F 2l3n343b3f243f343o1j11111q1j111i1o1j111j1k1p
#@F 2l3n343b3f243f343o1k11111o1q111i1l1p111j1h1m
#@F 2l3n343b3f243f343o1l11111m1l111i1h1h111i1k1q
#@F 2m3c38392a3c3g3g383f243f343o1i1111111h111i1q1i111j1m1m
#@F 2m3c38392a3c3g3g383f243f343o1j1111111h111i1o1p111j1k1p
#@F 2m3c38392a3c3g3g383f243f343o1k1111111h111i1m1l111j1h1m
#@F 2m3c38392a3c3g3g383f243f343o1l1111111h111i1h1l111i1k1q
#@F 2a3c3g3g383f243f343o1i111i1k1m111j1h1n111j1m1m
#@F 2a3c3g3g383f243f343o1j111i1j1n111i1q1j111j1k1p
#@F 2a3c3g3g383f243f343o1k111i1h1p111i1n1n111j1h1m
#@F 2a3c3g3g383f243f343o1l11111o1l111i1i1j111i1k1q
#@F 2a383f3f2a3c3g3g383f243f343o1i111i1o1n111j1j1n111j1m1m
#@F 2a383f3f2a3c3g3g383f243f343o1j111i1n1l111j1i1i111j1k1p
#@F 2a383f3f2a3c3g3g383f243f343o1k111i1l1i111i1p1j111j1h1m
#@F 2a383f3f2a3c3g3g383f243f343o1l11111q1n111i1j1k111i1k1q
#@F 2l363b3c3839383l293l343o1i111i1q1p111j1j1n111j1m1m
#@F 2l363b3c3839383l293l343o1j111i1p1m111j1i1i111j1k1p
#@F 2l363b3c3839383l293l343o1k111i1m1q111i1p1j111j1h1m
#@F 2l363b3c3839383l293l343o1l111i1h1p111i1j1k111i1k1q
#@F 2a383f3f2l3n343b3f243f343o1i111j1h1j111j1j1m111j1m1m
#@F 2a383f3f2l3n343b3f243f343o1j111i1p1p111j1i1h111j1k1p
#@F 2a383f3f2l3n343b3f243f343o1k111i1n1j111i1p1i111j1h1m
#@F 2a383f3f2l3n343b3f243f343o1l111i1i1h111i1j1k111i1k1q
#@F 2a383f3f243f343o1i111i1q1i111j1k1q111j1m1m
#@F 2a383f3f243f343o1j111i1o1p111j1j1k111j1k1p
#@F 2a383f3f243f343o1k111i1m1l111i1q1j111j1h1m
#@F 2a383f3f243f343o1l111i1h1l111i1k1i111i1k1q
#@F 2a383f3f253s343h1i111j1j1l111j1m1m111j1m1m
#@F 2a383f3f253s343h1j111j1h1q111j1k1p111j1k1p
#@F 2a383f3f253s343h1k111i1p1h111j1h1m111j1h1m
#@F 2a383f3f253s343h1l111i1j1j111i1k1q111i1k1q
#@F 243f34782m453l3e3c3m1i111i1p1o111j1m1m111j1m1m
#@F 243f34782m453l3e3c3m1j111i1o1l111j1k1p111j1k1p
#@F 243f34782m453l3e3c3m1k111i1m1h111j1h1m111j1h1m
#@F 243f34782m453l3e3c3m1l111i1h1j111i1k1q111i1k1q
#@F 2d3437383n3n243f343o1i111i1m1j111j1l1m111j1m1m
#@F 2d3437383n3n243f343o1j111i1l1j111j1j1q111j1k1p
#@F 2d3437383n3n243f343o1k111i1j1j111i1q1o111j1h1m
#@F 2d3437383n3n243f343o1l11111p1k111i1k1l111i1k1q
#@F 2m453l3e3c3m1i1111111h111j1l1m111j1m1m
#@F 2m453l3e3c3m1j1111111h111j1j1q111j1k1p
#@F 2m453l3e3c3m1k1111111h111i1q1o111j1h1m
#@F 2m453l3e3c3m1l1111111h111i1k1l111i1k1q
#@F 253s343h1i1111111h111j1m1m111j1m1m
#@F 253s343h1j1111111h111j1k1p111j1k1p
#@F 253s343h1k1111111h111j1h1m111j1h1m
#@F 253s343h1l1111111h111i1k1q111i1k1q
#@F 263o3h3e383f2l363b3c3839383l293l343o1i111i1m1i111j1m1m111j1m1m
#@F 263o3h3e383f2l363b3c3839383l293l343o1j111i1l1i111j1k1p111j1k1p
#@F 263o3h3e383f2l363b3c3839383l293l343o1k111i1j1i111j1h1m111j1h1m
#@F 263o3h3e383f2l363b3c3839383l293l343o1l11111p1j111i1k1q111i1k1q
#@F 233k3o343g343l3c3h1i111i1j1o111j1m1m111j1i1j
#@F 233k3o343g343l3c3h1j111i1i1p111j1k1p111i1q1p
#@F 233k3o343g343l3c3h1k111i1h1j111j1h1m111i1o1h
#@F 233k3o343g343l3c3h1l11111n1q111i1k1q111i1i1n
#@F 263o3h3e383f2f38383l293l453h1i111i1q1k111j1m1m111i1q1k
#@F 263o3h3e383f2f38383l293l453h1j111i1p1h111j1k1p111i1p1h
#@F 263o3h3e383f2f38383l293l453h1k111i1m1m111j1h1m111i1m1m
#@F 263o3h3e383f2f38383l293l453h1l111i1h1m111i1k1q111i1h1m
#@F 2f38383l293l453h1i11111p1l111j1m1m111i1m1q
#@F 2f38383l293l453h1j11111o1p111j1k1p111i1l1p
#@F 2f38383l293l453h1k11111n1o111j1h1m111i1j1p
#@F 2f38383l293l453h1l11111l1n111i1k1q11111p1o
#@F 243f3478293l453h1i111i1m1l111j1m1m111i1m1l
#@F 243f3478293l453h1j111i1l1l111j1k1p111i1l1l
#@F 243f3478293l453h1k111i1j1l111j1h1m111i1j1l
#@F 243f3478293l453h1l11111p1l111i1k1q11111p1l
#@F 283l453b3f3c3h3a293l453h1i1111111h111j1m1m111i1j1o
#@F 283l453b3f3c3h3a293l453h1j1111111h111j1k1p111i1i1p
#@F 283l453b3f3c3h3a293l453h1k1111111h111j1h1m111i1h1j
#@F 283l453b3f3c3h3a293l453h1l1111111h111i1k1q11111n1q
#@F 293l453h1i1111111h111j1m1m1111111h
#@F 293l453h1j1111111h111j1k1p1111111h
#@F 293l453h1k1111111h111j1h1m1111111h
#@F 293l453h1l1111111h111i1k1q1111111h
#@F 2d3l483o3n383l3f3c3e4o3l1i111i1j1o111j1m1m1111111h
#@F 2d3l483o3n383l3f3c3e4o3l1j111i1i1p111j1k1p1111111h
#@F 2d3l483o3n383l3f3c3e4o3l1k111i1h1j111j1h1m1111111h
#@F 2d3l483o3n383l3f3c3e4o3l1l11111n1q111i1k1q1111111h
#@F 2h3f3c3p293l343o353l343o3h1i111i1q1j111j1m1m11111n1j
#@F 2h3f3c3p293l343o353l343o3h1j111i1o1q111j1k1p11111m1p
#@F 2h3f3c3p293l343o353l343o3h1k111i1m1l111j1h1m11111m1h
#@F 2h3f3c3p293l343o353l343o3h1l111i1h1m111i1k1q11111k1l
#@F 263o3h3e383f2h3f3c3p293l453h1i111j1h1j111j1m1m111i1i1j
#@F 263o3h3e383f2h3f3c3p293l453h1j111i1p1p111j1k1p111i1h1l
#@F 263o3h3e383f2h3f3c3p293l453h1k111i1n1j111j1h1m11111q1h
#@F 263o3h3e383f2h3f3c3p293l453h1l111i1i1h111i1k1q11111n1i
#@F 2d3b343e3c1i111j1m1m111j1l1n111i1l1k
#@F 2d3b343e3c1j111j1k1p111j1k1h111i1k1k
#@F 2d3b343e3c1k111j1h1m111i1q1p111i1i1m
#@F 2d3b343e3c1l111i1k1q111i1k1l11111o1p
#@F 2a383f3f2d343h3i3h383h3a3i3f371i111j1m1m111j1k1n111i1k1q
#@F 2a383f3f2d343h3i3h383h3a3i3f371j111j1k1p111j1j1h111i1k1h
#@F 2a383f3f2d343h3i3h383h3a3i3f371k111j1h1m111i1q1h111i1i1j
#@F 2a383f3f2d343h3i3h383h3a3i3f371l111i1k1q111i1j1q11111o1n
#@F 2a383f3f29383f351i111j1m1m111j1m1m111j1j1l
#@F 2a383f3f29383f351j111j1k1p111j1k1p111j1h1q
#@F 2a383f3f29383f351k111j1h1m111j1h1m111i1p1h
#@F 2a383f3f29383f351l111i1k1q111i1k1q111i1j1j
#@F 29383f351i111j1m1m111j1m1m1111111h
#@F 29383f351j111j1k1p111j1k1p1111111h
#@F 29383f351k111j1h1m111j1h1m1111111h
#@F 29383f351l111i1k1q111i1k1q1111111h
#@F 293i3f371i111j1m1m111j1i1m1111111h
#@F 293i3f371j111j1k1p111j1h1i1111111h
#@F 293i3f371k111j1h1m111i1o1k1111111h
#@F 293i3f371l111i1k1q111i1i1o1111111h
#@F 2d343h3i3h383h3a3i3f371i111j1m1m111i1q1k11111k1o
#@F 2d343h3i3h383h3a3i3f371j111j1k1p111i1p1h11111k1l
#@F 2d343h3i3h383h3a3i3f371k111j1h1m111i1m1m11111j1q
#@F 2d343h3i3h383h3a3i3f371l111i1k1q111i1h1m11111j1h
#@F 263o3h3e383f2d343h3i3h383h3a3i3f371i111j1m1m111i1p1m11111i1m
#@F 263o3h3e383f2d343h3i3h383h3a3i3f371j111j1k1p111i1o1k11111i1l
#@F 263o3h3e383f2d343h3i3h383h3a3i3f371k111j1h1m111i1l1q11111i1j
#@F 263o3h3e383f2d343h3i3h383h3a3i3f371l111i1k1q111i1h1i1111111p
#@F 2k3i3m34243l343o3h1i111j1m1m111i1q1k111i1q1k
#@F 2k3i3m34243l343o3h1j111j1k1p111i1p1h111i1p1h
#@F 2k3i3m34243l343o3h1k111j1h1m111i1m1m111i1m1m
#@F 2k3i3m34243l343o3h1l111i1k1q111i1h1m111i1h1m
#@F 2b3h373c343h383l2k3i3n1i111j1m1m111i1h1n111i1h1n
#@F 2b3h373c343h383l2k3i3n1j111j1k1p11111q1q11111q1q
#@F 2b3h373c343h383l2k3i3n1k111j1h1m11111p1m11111p1m
#@F 2b3h373c343h383l2k3i3n1l111i1k1q11111m1p11111m1p
#@F 2k3i3n353l343o3h1i111j1m1m111i1k1h11111o1i
#@F 2k3i3n353l343o3h1j111j1k1p111i1j1i11111n1n
#@F 2k3i3n353l343o3h1k111j1h1m111i1h1l11111m1o
#@F 2k3i3n353l343o3h1l111i1k1q11111o1i11111k1p
#@F 2a3i3f3t1i111j1m1m111j1i1i111i1m1m
#@F 2a3i3f3t1j111j1k1p111i1q1o111i1l1m
#@F 2a3i3f3t1k111j1h1m111i1o1h111i1j1m
#@F 2a3i3f3t1l111i1k1q111i1i1m11111p1m
#@F 2g34781i111j1m1m111j1k1i111i1p1n
#@F 2g34781j111j1k1p111j1i1n111i1o1l
#@F 2g34781k111j1h1m111i1p1n111i1m1h
#@F 2g34781l111i1k1q111i1j1n111i1h1j
#@F 2a343o3n353l343o3h1i111j1m1m111i1n1m11111o1q
#@F 2a343o3n353l343o3h1j111j1k1p111i1m1l11111o1k
#@F 2a343o3n353l343o3h1k111j1h1m111i1k1k11111n1k
#@F 2a343o3n353l343o3h1l111i1k1q11111q1h11111l1k
#@F 2l363b3i3e3i3f3437381i111j1m1m111i1j1o11111k1n
#@F 2l363b3i3e3i3f3437381j111j1k1p111i1i1p11111k1k
#@F 2l363b3i3e3i3f3437381k111j1h1m111i1h1j11111j1q
#@F 2l363b3i3e3i3f3437381l111i1k1q11111n1q11111i1q
#@F 2s3c383a383f3l3i3n1i111j1m1m11111l1p11111l1p
#@F 2s3c383a383f3l3i3n1j111j1k1p11111l1l11111l1l
#@F 2s3c383a383f3l3i3n1k111j1h1m11111k1p11111k1p
#@F 2s3c383a383f3l3i3n1l111i1k1q11111j1n11111j1n
#@F 243l343o3h1i111j1m1m11111n1l11111n1l
#@F 243l343o3h1j111j1k1p11111m1q11111m1q
#@F 243l343o3h1k111j1h1m11111m1i11111m1i
#@F 243l343o3h1l111i1k1q11111k1m11111k1m
#@F 2e34363b3m1i111j1m1m111i1l1h111i1h1m
#@F 2e34363b3m1j111j1k1p111i1k1h11111q1p
#@F 2e34363b3m1k111j1h1m111i1i1j11111p1l
#@F 2e34363b3m1l111i1k1q11111o1n11111m1o
#@F 2a383f3f2e34363b3m1i111j1m1m111i1n1h111i1j1j
#@F 2a383f3f2e34363b3m1j111j1k1p111i1l1q111i1i1l
#@F 2a383f3f2e34363b3m1k111j1h1m111i1j1q11111q1p
#@F 2a383f3f2e34363b3m1l111i1k1q11111p1o11111n1n
#@F 2h3l343h3a381i111j1m1m111i1n1m1111111h
#@F 2h3l343h3a381j111j1k1p111i1m1l1111111h
#@F 2h3l343h3a381k111j1h1m111i1k1k1111111h
#@F 2h3l343h3a381l111i1k1q11111q1h1111111h
#@F 263o3h3e383f2h3l343h3a381i111j1m1m111i1j1o1111111h
#@F 263o3h3e383f2h3l343h3a381j111j1k1p111i1i1p1111111h
#@F 263o3h3e383f2h3l343h3a381k111j1h1m111i1h1j1111111h
#@F 263o3h3e383f2h3l343h3a381l111i1k1q11111n1q1111111h
#@F 2d3i3l343f3f381i111j1m1m111i1i1l11111p1n
#@F 2d3i3l343f3f381j111j1k1p111i1h1n11111p1h
#@F 2d3i3l343f3f381k111j1h1m11111q1i11111n1q
#@F 2d3i3l343f3f381l111i1k1q11111n1j11111l1o
#@F 2m3i3g343n381i111j1m1m11111q1q11111o1i
#@F 2m3i3g343n381j111j1k1p11111q1j11111n1n
#@F 2m3i3g343n381k111j1h1m11111o1q11111m1o
#@F 2m3i3g343n381l111i1k1q11111m1l11111k1p
#@F 2h3l343h3a382k3i3n1i111j1m1m11111n1q1111111h
#@F 2h3l343h3a382k3i3n1j111j1k1p11111n1l1111111h
#@F 2h3l343h3a382k3i3n1k111j1h1m11111m1m1111111h
#@F 2h3l343h3a382k3i3n1l111i1k1q11111k1o1111111h
#@F 2k3i3n1i111j1m1m1111111h1111111h
#@F 2k3i3n1j111j1k1p1111111h1111111h
#@F 2k3i3n1k111j1h1m1111111h1111111h
#@F 2k3i3n1l111i1k1q1111111h1111111h
#@F 2m3c38392i3c3h3e1i111j1m1m11111j1h111i1l1o
#@F 2m3c38392i3c3h3e1j111j1k1p11111i1p111i1k1o
#@F 2m3c38392i3c3h3e1k111j1h1m11111i1n111i1i1p
#@F 2m3c38392i3c3h3e1l111i1k1q11111i1h11111p1h
#@F 2a3i3n2i3c3h3e1i111j1m1m111i1i1h111i1p1h
#@F 2a3i3n2i3c3h3e1j111j1k1p111i1h1n111i1n1o
#@F 2a3i3n2i3c3h3e1k111j1h1m11111q1n111i1l1l
#@F 2a3i3n2i3c3h3e1l111i1k1q11111m1p11111q1p
#@F 2i3c3h3e1i111j1m1m111i1p1i111i1q1o
#@F 2i3c3h3e1j111j1k1p111i1n1q111i1p1l
#@F 2i3c3h3e1k111j1h1m111i1l1m111i1m1p
#@F 2i3c3h3e1l111i1k1q11111q1q111i1h1p
#@F 2a383f3f2i3c3h3e1i111j1m1m111i1o1l111i1p1m
#@F 2a383f3f2i3c3h3e1j111j1k1p111i1n1j111i1o1k
#@F 2a383f3f2i3c3h3e1k111j1h1m111i1l1h111i1l1q
#@F 2a383f3f2i3c3h3e1l111i1k1q11111q1m111i1h1i
#@F 243f34782o3c3i3f383n3n2k3i3n1i111j1m1m111i1k1h111i1o1i
#@F 243f34782o3c3i3f383n3n2k3i3n1j111j1k1p111i1j1i111i1m1q
#@F 243f34782o3c3i3f383n3n2k3i3n1k111j1h1m111i1h1l111i1k1o
#@F 243f34782o3c3i3f383n3n2k3i3n1l111i1k1q11111o1i11111q1k
#@F 2d343m3n343h3c381i111j1m1m11111m1j111i1o1q
#@F 2d343m3n343h3c381j111j1k1p11111l1p111i1n1o
#@F 2d343m3n343h3c381k111j1h1m11111l1i111i1l1l
#@F 2d343m3n343h3c381l111i1k1q11111j1p11111q1p
#@F 2o3c3i3f383n3n2k3i3n1i111j1m1m11111n1j111i1m1h
#@F 2o3c3i3f383n3n2k3i3n1j111j1k1p11111m1p111i1l1h
#@F 2o3c3i3f383n3n2k3i3n1k111j1h1m11111m1h111i1j1h
#@F 2o3c3i3f383n3n2k3i3n1l111i1k1q11111k1l11111p1j
#@F 2f343a383h3n341i111j1m1m1111111h111j1m1m
#@F 2f343a383h3n341j111j1k1p1111111h111j1k1p
#@F 2f343a383h3n341k111j1h1m1111111h111j1h1m
#@F 2f343a383h3n341l111i1k1q1111111h111i1k1q
#@F 2h3l363b3c3738381i111j1m1m111i1k1i111j1m1h
#@F 2h3l363b3c3738381j111j1k1p111i1j1j111j1k1k
#@F 2h3l363b3c3738381k111j1h1m111i1h1m111j1h1i
#@F 2h3l363b3c3738381l111i1k1q11111o1i111i1k1o
#@F 2i393f343o3g381i111j1m1m111i1p1o111j1m1m
#@F 2i393f343o3g381j111j1k1p111i1o1l111j1k1p
#@F 2i393f343o3g381k111j1h1m111i1m1h111j1h1m
#@F 2i393f343o3g381l111i1k1q111i1h1j111i1k1q
#@F 2f3c3n3n383f2h3l363b3c3738381i111j1j1l111i1h1j111j1m1m
#@F 2f3c3n3n383f2h3l363b3c3738381j111j1h1q11111q1m111j1k1p
#@F 2f3c3n3n383f2h3l363b3c3738381k111i1p1h11111p1j111j1h1m
#@F 2f3c3n3n383f2h3l363b3c3738381l111i1j1j11111m1m111i1k1q
#@F 263o3h3e383f2h3l363b3c3738381i111i1q1i11111n1j111j1m1m
#@F 263o3h3e383f2h3l363b3c3738381j111i1o1p11111m1p111j1k1p
#@F 263o3h3e383f2h3l363b3c3738381k111i1m1l11111m1h111j1h1m
#@F 263o3h3e383f2h3l363b3c3738381l111i1h1l11111k1l111i1k1q
#@F 2e3c3f341i111i1m1m11111l1p111j1m1m
#@F 2e3c3f341j111i1l1m11111l1l111j1k1p
#@F 2e3c3f341k111i1j1m11111k1p111j1h1m
#@F 2e3c3f341l11111p1m11111j1n111i1k1q
#@F 2f3c3n3n383f2e3c3f341i111i1o1i111i1k1h111j1m1m
#@F 2f3c3n3n383f2e3c3f341j111i1m1q111i1j1i111j1k1p
#@F 2f3c3n3n383f2e3c3f341k111i1k1o111i1h1l111j1h1m
#@F 2f3c3n3n383f2e3c3f341l11111q1k11111o1i111i1k1q
#@F 263c3m3n383f1i111j1m1m111j1j1m111j1m1m
#@F 263c3m3n383f1j111j1k1p111j1i1h111j1k1p
#@F 263c3m3n383f1k111j1h1m111i1p1i111j1h1m
#@F 263c3m3n383f1l111i1k1q111i1j1k111i1k1q
#@F 293l343o1h1111111h1111111h1111111h
#@F 293l343o1i1111111k1111111k1111111k
#@F 293l343o1j1111111m1111111m1111111m
#@F 293l343o1k1111111p1111111p1111111p
#@F 293l343o1l11111i1h11111i1h11111i1h
#@F 293l343o1m11111i1k11111i1k11111i1k
#@F 293l343o1n11111i1m11111i1m11111i1m
#@F 293l343o1o11111i1p11111i1p11111i1p
#@F 293l343o1p11111j1h11111j1h11111j1h
#@F 293l343o1q11111j1k11111j1k11111j1k
#@F 293l343o1i1h11111j1n11111j1n11111j1n
#@F 293l343o1i1i11111j1p11111j1p11111j1p
#@F 293l343o1i1j11111k1i11111k1i11111k1i
#@F 293l343o1i1k11111k1k11111k1k11111k1k
#@F 293l343o1i1l11111k1n11111k1n11111k1n
#@F 293l343o1i1m11111k1p11111k1p11111k1p
#@F 293l343o1i1n11111l1i11111l1i11111l1i
#@F 293l343o1i1o11111l1k11111l1k11111l1k
#@F 293l343o1i1p11111l1n11111l1n11111l1n
#@F 293l343o1i1q11111l1p11111l1p11111l1p
#@F 293l343o1j1h11111m1i11111m1i11111m1i
#@F 293l343o1j1i11111m1l11111m1l11111m1l
#@F 293l343o1j1j11111m1n11111m1n11111m1n
#@F 293l343o1j1k11111m1q11111m1q11111m1q
#@F 293l343o1j1l11111n1i11111n1i11111n1i
#@F 293l343o1j1m11111n1l11111n1l11111n1l
#@F 293l343o1j1n11111n1n11111n1n11111n1n
#@F 293l343o1j1o11111n1q11111n1q11111n1q
#@F 293l343o1j1p11111o1i11111o1i11111o1i
#@F 293l343o1j1q11111o1l11111o1l11111o1l
#@F 293l343o1k1h11111o1o11111o1o11111o1o
#@F 293l343o1k1i11111o1q11111o1q11111o1q
#@F 293l343o1k1j11111p1j11111p1j11111p1j
#@F 293l343o1k1k11111p1l11111p1l11111p1l
#@F 293l343o1k1l11111p1o11111p1o11111p1o
#@F 293l343o1k1m11111p1q11111p1q11111p1q
#@F 293l343o1k1n11111q1j11111q1j11111q1j
#@F 293l343o1k1o11111q1l11111q1l11111q1l
#@F 293l343o1k1p11111q1o11111q1o11111q1o
#@F 293l343o1k1q11111q1q11111q1q11111q1q
#@F 293l343o1l1h111i1h1j111i1h1j111i1h1j
#@F 293l343o1l1i111i1h1m111i1h1m111i1h1m
#@F 293l343o1l1j111i1h1o111i1h1o111i1h1o
#@F 293l343o1l1k111i1i1h111i1i1h111i1i1h
#@F 293l343o1l1l111i1i1j111i1i1j111i1i1j
#@F 293l343o1l1m111i1i1m111i1i1m111i1i1m
#@F 293l343o1l1n111i1i1o111i1i1o111i1i1o
#@F 293l343o1l1o111i1j1h111i1j1h111i1j1h
#@F 293l343o1l1p111i1j1j111i1j1j111i1j1j
#@F 293l343o1l1q111i1j1m111i1j1m111i1j1m
#@F 293l343o1m1h111i1j1o111i1j1o111i1j1o
#@F 293l343o1m1i111i1k1h111i1k1h111i1k1h
#@F 293l343o1m1j111i1k1k111i1k1k111i1k1k
#@F 293l343o1m1k111i1k1m111i1k1m111i1k1m
#@F 293l343o1m1l111i1k1p111i1k1p111i1k1p
#@F 293l343o1m1m111i1l1h111i1l1h111i1l1h
#@F 293l343o1m1n111i1l1k111i1l1k111i1l1k
#@F 293l343o1m1o111i1l1m111i1l1m111i1l1m
#@F 293l343o1m1p111i1l1p111i1l1p111i1l1p
#@F 293l343o1m1q111i1m1h111i1m1h111i1m1h
#@F 293l343o1n1h111i1m1k111i1m1k111i1m1k
#@F 293l343o1n1i111i1m1n111i1m1n111i1m1n
#@F 293l343o1n1j111i1m1p111i1m1p111i1m1p
#@F 293l343o1n1k111i1n1i111i1n1i111i1n1i
#@F 293l343o1n1l111i1n1k111i1n1k111i1n1k
#@F 293l343o1n1m111i1n1n111i1n1n111i1n1n
#@F 293l343o1n1n111i1n1p111i1n1p111i1n1p
#@F 293l343o1n1o111i1o1i111i1o1i111i1o1i
#@F 293l343o1n1p111i1o1k111i1o1k111i1o1k
#@F 293l343o1n1q111i1o1n111i1o1n111i1o1n
#@F 293l343o1o1h111i1o1q111i1o1q111i1o1q
#@F 293l343o1o1i111i1p1i111i1p1i111i1p1i
#@F 293l343o1o1j111i1p1l111i1p1l111i1p1l
#@F 293l343o1o1k111i1p1n111i1p1n111i1p1n
#@F 293l343o1o1l111i1p1q111i1p1q111i1p1q
#@F 293l343o1o1m111i1q1i111i1q1i111i1q1i
#@F 293l343o1o1n111i1q1l111i1q1l111i1q1l
#@F 293l343o1o1o111i1q1n111i1q1n111i1q1n
#@F 293l343o1o1p111i1q1q111i1q1q111i1q1q
#@F 293l343o1o1q111j1h1i111j1h1i111j1h1i
#@F 293l343o1p1h111j1h1l111j1h1l111j1h1l
#@F 293l343o1p1i111j1h1o111j1h1o111j1h1o
#@F 293l343o1p1j111j1h1q111j1h1q111j1h1q
#@F 293l343o1p1k111j1i1j111j1i1j111j1i1j
#@F 293l343o1p1l111j1i1l111j1i1l111j1i1l
#@F 293l343o1p1m111j1i1o111j1i1o111j1i1o
#@F 293l343o1p1n111j1i1q111j1i1q111j1i1q
#@F 293l343o1p1o111j1j1j111j1j1j111j1j1j
#@F 293l343o1p1p111j1j1l111j1j1l111j1j1l
#@F 293l343o1p1q111j1j1o111j1j1o111j1j1o
#@F 293l343o1q1h111j1j1q111j1j1q111j1j1q
#@F 293l343o1q1i111j1k1j111j1k1j111j1k1j
#@F 293l343o1q1j111j1k1m111j1k1m111j1k1m
#@F 293l343o1q1k111j1k1o111j1k1o111j1k1o
#@F 293l343o1q1l111j1l1h111j1l1h111j1l1h
#@F 293l343o1q1m111j1l1j111j1l1j111j1l1j
#@F 293l343o1q1n111j1l1m111j1l1m111j1l1m
#@F 293l343o1q1o111j1l1o111j1l1o111j1l1o
#@F 293l343o1q1p111j1m1h111j1m1h111j1m1h
#@F 293l343o1q1q111j1m1j111j1m1j111j1m1j
#@F 293l343o1i1h1h111j1m1m111j1m1m111j1m1m
#@F 3m363i2434363e3a3l3i3o3h37111j1h1k111j1h1k111i1q1j
#@F 3m363i283i3l383a3l3i3o3h3711111i1i1111111h111i1i1k
#@F 3m363i2m3i3j2l3b34373i3q111j1m1m111j1l1h111j1l1p
#@F 3m363i23363n3c3p382434363e3a3l3i3o3h37111j1m1m111j1h1n111i1k1o
#@F 3m363i23363n3c3p38283i3l383a3l3i3o3h3711111l1k11111l1m11111l1q
#@F 3m363i23363n3c3p382m3i3j2l3b34373i3q111j1m1l111j1j1j111j1m1m
#@F 3m363i233f3n2434363e3a3l3i3o3h37111i1o1j111i1p1n111j1h1l
#@F 3m363i2a3c3a3b3f3c3a3b3n1111111h1111111h111j1m1m
#@f EigeneFarbe 2 2 2



#@g -1--------
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Holz3,,,,,,,,,,,,,,,
#@G Elfenbein1,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G HellStahlBlau3,,,,,,
#@G Weiß,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Elfenbein2,,,,,,,,,,
#@G Elfenbein1,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G HellStahlBlau3,,,,,,
#@G Weiß,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Elfenbein2,,,,,,,,,,
#@G Elfenbein1,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G HellStahlBlau3,,,,,,
#@G Weiß,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,


#@H Siehe auch bish-Beispiele auf der Homepage.
#@H Diese Hilfe hier ist nur knapp.
#@H 
#@H Dieses Script schreibt in sich selbst hinein,
#@H es verändert seinen eigenen Inhalt.
#@H 
#@H Bei Farbnamenwahl werden Wildcards verarbeitet.
#@H 
#@H 
#@H MENÜ:
#@H Farbnamen-Notizen  : "  16:Mokkasin  "
#@H Farbenliste/Notizen               : f [-]
#@H Dateienauswahl               84   : d
#@H Gruppenauswahl       -1--4-----   : gw [0123456789]
#@H Gruppen-Farbensatz kopieren < | > : g n | G n...
#@H                                     g 4
#@H                                     G 146
#@H Farbziel auf Farbe setzen         : {1-10}={fnam|fnum} [n=f]...
#@H                                      4=203  7=16  8=mokkasin
#@H DokumentBG  Holz3                 1
#@H TabellenBG  Elfenbein1            2
#@H TabRowBG    Null                  3
#@H TabColBG    HellStahlBlau3        4  Farbziel Tabellenspalte (4)
#@H TabHColBG   Weiß                  5
#@H Link        StahlBlau3            6
#@H BesuLink    StahlBlau4            7
#@H AktiLink    Gold                  8
#@H Textfarbe   Schwarz               9
#@H Fontfarbe   Null                 10
#@H Link-/Text-/Font-Farben schreiben : L|T|F
#@H Alle Farbziele schreiben          : S
#@H Hilfe                             : h
#@H Beenden                           : E


#@D1 dummy.html
#@D3 dummy2.html
#@D2 dummy.html


###  com.bish  #############################################

#!/u/bin/bish -p



# define MSK16  0x0810= 2064
# start= 0x1d0f= 7439
# CRC<--  Buf $offs $len
Crc16()  {
   local n=00 crc_=000${{1} byte=000000 j=00000000
   let "crc_>16#ffff" && crc_=0007439
   for byte in $( catv $3,$4,$2 | base -b +10 )
   do
      for n from 0 to 7 repeat
      do
         if let "crc_&16#8000 ^^ byte&1<<n"
         then
            let 'j=((crc_^2064)&2064)<<1' %
                'crc_= (j|crc_<<1) & (j|~(2064<<1)) & 16#ffff | 1'
         else
            let 'j=((crc_^~2064)&2064)<<1' %
                'crc_= (j|crc_<<1) & (j|~(2064<<1)) & 16#fffe'
         fi
      done
   done
   $1=$crc_
   return 0
}


# cmd
Cmd()  {
   local cmd="@3!$1$NL"
   local len=${#cmd}
   com -cot40od10o$len cmd
   catv $len,cmd
   return 0
}

# cmd
Answ()  {
   local cmd="@3:$1$NL"
   local len=${#cmd}
   com -cot40od10o$len cmd
   catv $len,cmd
   return 0
}


# num|str [len]
IBDdata()  {
   local cks=000
   [ $# -eq 1 ] && {
      local dat=$1
      local l=${#dat}
   }
   [ $# -eq 2 ] && {
      local l=$2 dat=000$1
      [ l -eq 4 ] && base -10 dat +l dat
      [ l -eq 2 ] && base -10 dat +w dat
      [ l -eq 1 ] && base -10 dat +b dat
   }
   let ++l
   base -10 l +b l
   catv /: l dat =Out:
   catv 1,,Out | sum -b cks
   let 'cks=~cks&255'
   base -10 cks +b cks
   catv cks =0:,1,Out:
   com -cot40od10o${#Out} Out
   return 0
}


# id data
ParaData()  {
   local dp=:
   local id=$1 data="$2" l=0000 bl=0
   [ O -eq 0 ] && O=1 catv /: =0,1,Obuf
   if [ id -ne 0 ]
   then
      l=${#data}
      base -10 id +l id
      base -10 l +b bl
      catv id bl data =$O,,Obuf
      let "O+=4+1+l"
   else
      l=2
      base -10 id +l id
      base -10 l +b bl
      catv id bl =$O,,Obuf
      let "O+=4+1"
      CRC=100000
      Crc16 CRC Obuf 1 $((O-1))
      base -10 CRC +w data
      catv data =$O,,Obuf
      let "O+=2"
      catv $O,Obuf | base -b +10
      com -cot90od10o$O Obuf
   fi
   return 0
}

#       com -p || return 0
#       ring=128
#       base -10 ring +b ch
#       ring=@PC:
#       com -cot40od10o4 ring
#       com -it400id20i1 Ibuf
#       catv 1,Ibuf /%j
#       com -cot30od10o1 ch
#       com -it3500id20i2050 Ibuf
set NL:10.1
set Ibuf:0.4000
set Obuf:0.1000
set Out:080
O=00000
CRC=100000

#BSD: /dev/cuaa0, /dev/ttyd0
case "FreeBSD" in
  FreeBSD)   Sio='/dev/ttyd0' Tty='/dev/console';;
  OpenUnix)  Sio='/dev/term/00t' Tty='/dev/pts016';;
  *)         Sio='/dev/null' Tty='/dev/console';;
esac
#1>> $Tty
#2>> $Tty
com +L  $Sio || { print -u2 "TTY-Device '$Sio'" "open failed"; exit 0; }
com -B38400
com -s 1
com -H 0

Cmd PING

local L_z=a L_tmo=30 L_w=1 L_bn=0
[ $# -gt 0 ] && L_z=$1



while let "$SECONDS<L_tmo"
do
   sleep -m 20
   com -p && {
      com -it150id10i100 Ibuf
      catv /++ $.,Ibuf /--%n
      catv '/>>'
      catv $.,Ibuf | base -b +10
      catv '/<<%n'
      [ L_w -eq 2 ] && Answ OK
      let ++L_tmo
      L_w=0
   }
   [ L_w -ne 0 ] && continue
   sleep -m 50
   case $L_z in
     a)  Cmd CFG_PARA
         L_z=b
     ;;
     b)  Cmd RECV
         L_z=c
     ;;
     c)  O=0
         ParaData 200000 aaccbbdd
         ParaData 0 "crc"
         L_z=d
     ;;
     d)  Cmd STORE
         L_z=z
     ;;
     I)  Cmd ID
         L_z=Id
     ;;
     Id)  IBDdata 200511305 4
         L_z=B L_bn=0
     ;;
     B)  [ L_bn -ge 32 ] && L_z=z continue
         Cmd BIT
         L_z=Bn
     ;;
     Bn) IBDdata $L_bn 1
         let ++L_bn
         L_z=S
     ;;
     S)  Cmd SEND
         L_z=B
         L_w=2 continue
     ;;
     z)  continue ;;
   esac
   L_w=1
done


com -c
com -
exit 0





###  conv.bish  #############################################

#!/u/bin/bish
#bish-Script 'conv.bish'
#Copyright (c) 1998  Helmut Schellong


set -f
let 0`ver n`'<304' && {
   echo "Dieses Script benötigt mindestens bish-Version 3.04 !"
   ver; exit 1
}
T=/
[ `ver s` != unix ] && T=\
Line="`prints s800-`"
OutFile="`prints s30-`"



mkofname()  {
   local dir="$1" n=0 t=$T name of
   conv -F\F/ dir
   expr "$dir" :name '%([^/\]%{1,%}%)$' || return
   expr "$dir" :dir '^%(.*%)'"$name"'$' || return
   conv -F\F/ dir
   expr "$name" :name '^%(%.*[^.]*%)' || return
   ifset dir || t=''
   of=$dir$t$name.$2
   conv -F\F/ of
   while [ -e "$of" ]
   do
      let "++n>9" && return 1
      of=$dir$t$(catv 7,name)$n$(catv 8,,name).$2
      conv -F\F/ of
   done
   $3=$of
   return 0
}



Conv()  {
   case "$1" in
   txt_htm)
      local ci=000 C=cc o=0000 buf="`prints s32-`"
      mkofname $2 htm OutFile || return
      > $OutFile
      < $2
      echo '<html>%n<head>%n<title></title>%n</head>%n<body>%n<pre>'
      while catv 24,0 =buf:
      do
         let "o>=512" && catv $o,Line && print -u2 .%c && o=0
         expr "$buf" :: '[&<>"|äöüßÄÖÜ·§]' ||
            catv buf =$o,,Line && let "o+=${#buf}" && continue
         ci=-1
         while catv $((++ci)),1,buf =C:
         do
            case "$C" in
              [!&<>"%|äöüßÄÖÜ·§])  catv 1,C =$o,,Line ; let o+=1
                                   continue ;;
              ä)  catv '/&auml;' =$o,,Line ; let o+=6 ; continue ;;
              ß)  catv '/&szlig;' =$o,,Line ; let o+=7 ; continue ;;
              ü)  catv '/&uuml;' =$o,,Line ; let o+=6 ; continue ;;
              ö)  catv '/&ouml;' =$o,,Line ; let o+=6 ; continue ;;
              Ä)  catv '/&Auml;' =$o,,Line ; let o+=6 ; continue ;;
              Ü)  catv '/&Uuml;' =$o,,Line ; let o+=6 ; continue ;;
              Ö)  catv '/&Ouml;' =$o,,Line ; let o+=6 ; continue ;;
              &)  catv '/&amp;' =$o,,Line ; let o+=5 ; continue ;;
              <)  catv '/&lt;' =$o,,Line ; let o+=4 ; continue ;;
              >)  catv '/&gt;' =$o,,Line ; let o+=4 ; continue ;;
              ")  catv '/&quot;' =$o,,Line ; let o+=6 ; continue ;;
             %|)  catv '/&brvbar;' =$o,,Line ; let o+=8 ; continue ;;
              ·)  catv '/&middot;' =$o,,Line ; let o+=8 ; continue ;;
              §)  catv '/&sect;' =$o,,Line ; let o+=6 ; continue ;;
            esac
         done
      done
      ><
      let "o>0" && catv $o,Line && print -u2 ";%c"
      echo '</pre>%n</body>%n</html>'
      ><
   return 0
   ;;
   htm_htl)
      mkofname $2 htl OutFile || return
      tr '>' '\10' < $2 > $OutFile
   return 0
   ;;
   ibm_iso)
      mkofname $2 iso OutFile || return
      tr %
'\20\21\124[\128-\157]\158\159[\160-\175][\176-\223][\224-\255]' %
\182\167\166\199\252\233\226\228\224\229\231\234\235\232\239%
\238\236\196\197\201\230\198\244\246\242\251\249\255\214\220%
\162\163\165\215\215\225\237\243\250\241\209\170\186\191\215%
'\172\189\188\161\171\187'%
'###||||++||++++++--|-+||++==|=*=-=-++++|*++#####'%
'\215\223[\215*4]'%
'\181[\215*6]\248[\215*3]\177[\215*4]\247\215\176\183\183\215'%
'\215\178*\160'  < $2 > $OutFile
   return 0
   ;;
   iso_ibm)
      mkofname $2 ibm OutFile || return
      tr \127[\128-\159][\160-\255] %
'\177[ *32]\255\173\155\156\197\157\124\21\197C\166\174\170\196R\197'%
\248\241\253\197\197\230\20\249\197\197\167\175\172\171\197\168%
'[\197*4]\142\143\146\128\197\144[\197*7]\165[\197*4]\153[\197*5]'%
\154\197\197\225\133\160\131\197\132\134\145\135\138\130\136\137%
\141\161\140\139\197\164\149\162\147\197\148\246\237\151\163\150%
\129\197\197\152  < $2 > $OutFile
   return 0
   ;;
   dos_unix)
      tr -d '\26' < $2 | {
         : > $2
         >> $2
         while readl Line
         do  catv Line /%n;  done
         ><
      }
      OutFile=$2
   return 0
   ;;
   unix_dos)
      cat $2 | {
         : > $2
         >> $2
         while readl Line
         do  catv Line /%r%n;  done
         ><
      }
      OutFile=$2
   return 0
   ;;
   upp_low)
      mkofname $2 lc OutFile || return
      tr '[A-Z]ÄÖÜ' '[a-z]äöü' < $2 > $OutFile
   return 0
   ;;
   low_upp)
      mkofname $2 uc OutFile || return
      tr '[a-z]äöü' '[A-Z]ÄÖÜ' < $2 > $OutFile
   return 0
   ;;
   gethref)
      OutFile=htmlref.acc
      echo ":::$2:::" >> $OutFile
      grep -i 'HREF="[^"]%{1,%}"' $2 |
      while readl Line
      do
         expr "$Line" :Line '[Hh][Rr][Ee][Ff]="%([^"]%{1,%}%)"'
         catv Line /%j >> $OutFile
      done
   return 0
   ;;
   getmailto)
      OutFile=mailto.acc
      echo ":::$2:::" >> $OutFile
      grep -i 'HREF="mailto:[^"]%{1,%}"' $2 |
      while readl Line
      do
         expr "$Line" :Line '[Hh][Rr][Ee][Ff]="[^:]*:%([^"]%{1,%}%)"'
         catv Line /%j >> $OutFile
      done
   return 0
   ;;
   getsrc)
      OutFile=source.acc
      echo ":::$2:::" >> $OutFile
      grep -i 'SRC="[^"]%{1,%}"' $2 |
      while readl Line
      do
         expr "$Line" :Line '[Ss][Rr][Cc]="%([^"]%{1,%}%)"'
         catv Line /%j >> $OutFile
      done
   return 0
   ;;
   strings)
      OutFile=binstr.acc
      echo ":::$2:::" >> $OutFile
      tr -cs '[a-z][A-Z][0-9]äöüßÄÖÜ_.-@/\\:' '[\10*]' < $2 |
         grep '^[^%r%n]%{2,%}$' >> $OutFile
   return 0
   ;;
   *)  exit 1 ;;
   esac
   return 0
}



Auswahl()  {
   local fsz="<DIR>" e="(EOF)" n=00000 a=aaaa lst cwd
   5<&0
   while :
   do
      n=0 a=$((36#aa-1)) e='' cwd=`pwd`
      list -d | sort -d > ${T}conv_bish.tmp
      list -f | sort -d >> ${T}conv_bish.tmp
      cat ${T}conv_bish.tmp |
      while [ -z "$e" ]
      do
         readl Line &| e="(EOF)" && { fsz="<DIR>"
            [ ! -d "$Line" ] && fsz=`fsize "$Line"`
            prints ss10s5s2s "|" $fsz $((36#,++n,++a)) "" "$Line"
         }
         let 'n%20==0' &| ifset e || continue
         echo "$cwd:%n»$lst«"
         read -u5 "Line?${n}${e}[.jnx]: "
         ifset Line || continue
         case "$Line" in
            x) >< ; return ;;
            j) break 2 ;;
            .) continue 2 ;;
            n) lst='' ; continue ;;
           ..) lst=''; cd ..; continue 2 ;;
         esac
         expr "$Line" :: '^[0-9a-z]%{2,3%}$' && {
            let "fsz=36#$Line-36#aa+1"
            fsz=`line -$fsz ${T}conv_bish.tmp` &&
               [ -d "$fsz" ] && { lst=''; cd $fsz; continue 2; }
         }
         lst="$lst$Line "
      done
   done
   ><
   expr "$lst" :: '[^ ]' || return 0
   unset fsz e n cwd
   local an=aaaa dnam lnam
   a=$((36#aa-1))
   < ${T}conv_bish.tmp
   while readl Line
   do
      an=$((36#, ++a))
      [ -s "$Line" ] || continue
      for lnam in  $lst
      do
         dnam=$an
         expr "$lnam" :lnam '^:%(.*%)$' && dnam="$Line"
         [[ "$dnam" == "$lnam" ]] &&
            echo "$Line" && Conv $1 "$Line" || { ><; return; }
      done
   done
   ><
   return 0
}



Helft_mir_doch()  {
   local n=000 inp=_____
   while :
   do
      n=0
      echo "| Mit diesem bish-Script können verschiedene Konversionen%r%
            | und Filterfunktionen durchgeführt werden.%r%
            | Ausprobieren kann man es gefahrlos mit einer%r%
            | Filterfunktion, wie beispielsweise 'str'.%r%
            | %r%
            | Zur Auswahl der Quelldateien wird eine Verzeichnis=%r%
            | liste erzeugt, bestehend aus Dateigröße oder '<DIR>',%r%
            | Aliasnamen (jeweils beginnend mit 'aa')%r%
            | und dem Dateinamen.%r%
            | Nach Ausgabe jeder Seite können verschiedene Eingaben%r%
            | gemacht werden:%r%
            | Durch Eingabe eines einzelnen Alias, der zu einem%r%
            | Verzeichnis gehört, wird das Verzeichnis gewechselt.%r%
            | '..' führt in das darüberliegende Verzeichnis."
      read "inp?$((++n)): "
      ifset inp && return
      echo "| Eingabe eines Punktes (.) listet das aktuelle%r%
            | Verzeichnis neu.%r%
            | Die Buchstaben 'jnx' bedeuten:%r%
            | j:  Auswahlliste bestätigen und Bearbeiten%r%
            | n:  Auswahlliste verwerfen (bei Verz.wechsel autom.!)%r%
            | x:  Abbrechen, zum Menü zurück%r%
            | %r%
            | Andere Eingaben werden in die Auswahlliste (»...«)%r%
            | sammelnd aufgenommen.%r%
            | Dabei können Aliases, und Dateinamen direkt durch%r%
            | Voranstellen eines Doppelpunktes (:),%r%
            | ausgewählt werden.%r%
            | Desweiteren werden Unix-Wildcards (?*[!...])%r%
            | verarbeitet - auch bei den Aliases.%r%
            | Insbesondere können bei einer Eingabe mehrere%r%
            | Auswahlen angegeben werden, durch Leerzeichen%r%
            | getrennt."
      read "inp?$((++n)): "
      ifset inp && return
      echo "| Die Filterfunktionen schreiben jeweils an das Ende%r%
            | der Dateien  htmlref.acc  mailto.acc  source.acc%r%
            | und  binstr.acc .%r%
            | Dabei wird zu Anfang der Name der jeweiligen%r%
            | Quelldatei (:::quelle:::) eingefügt.%r%
            | %r%
            | Die Umwandlungsfunktionen beziehen sich auf den%r%
            | Namen der jeweiligen Quelldatei, um eine neue%r%
            | Zieldatei zu erzeugen.%r%
            | Die Erweiterung wird ausgewechselt oder aber es%r%
            | wird eine angefügt.%r%
            | Wenn das nicht reicht, wird ein Zeichen 1 bis 9%r%
            | an den Nameteil angefügt oder aber dessen achtes%r%
            | Zeichen wird durch das Digit ersetzt."
      read "inp?$((++n)): "
      ifset inp && return
      echo "| Die Endungen lauten:  htm  htl  iso  ibm  lc  uc%r%
            |  %r%
            | Die Umwandlungsfunktionen  dx  und  xd%r%
            | überschreiben die jeweilige Quelldatei!%r%
            | %r%
            | Dies wurde so gewählt, weil der Ursprungszustand%r%
            | sehr wahrscheinlich wieder herstellbar ist.%r%
            | Nur bei uneinheitlichen Zeilenvorschüben und%r%
            | beim Zeichen ^Z geht das nicht."
      read "inp?$((++n))(EOF): "
      ifset inp && return
   done
   return
}



echo "%r
 +======================================================+%r
 |               bish-Script 'conv.bish'                  |%r
 |        Copyright (c) 1998  Helmut Schellong          |%r
 |                                                      |%r
 |              Konversionen und Filter                 |%r
 +======================================================+"
read "-?<Enter> "


while echo %
"%r
 +---------------------------------------------+%r
 |Verzeichnis : `prints s31- $(pwd)`|%r
 |Ausgabedatei: `prints s31- $OutFile`|%r
 +---------------------------------------------+%r
 |                            Hilfe :  h       |%r
 |     Text (ibm)  -->  html-Datei  :  htm     |%r
 |     html-Zeilenkürzer:  > --> \n :  htl     |%r
 |     Text (ibm)  -->  Text (iso)  :  iso     |%r
 |     Text (iso)  -->  Text (ibm)  :  ibm     |%r
 |     Text (dos)  -->  Text (unix) :  dx      |%r
 |     Text (unix) -->  Text (dos)  :  xd      |%r
 |     Datei (ABC) --> Datei (abc)  :  lc      |%r
 |     Datei (abc) --> Datei (ABC)  :  uc      |%r
 |     Filter:  HREF=%"...%"          :  url     |%r
 |     Filter:  HREF=%"mailto:...%"   :  adr     |%r
 |     Filter:   SRC=%"...%"          :  src     |%r
 |     Filter:  Strings aus Binär   :  str     |%r
 |           Ausgabedatei editieren :  ed      |%r
 |       Interaktive Shell (Prompt) :  sh      |%r
 |                          Beenden :  E       |%r
 +---------------------------------------------+%r
                                    :  ___%b%b%b%c"
do
   read Line
   case "$Line" in
     htm)  Auswahl txt_htm ;;
     htl)  Auswahl htm_htl ;;
     iso)  Auswahl ibm_iso ;;
     ibm)  Auswahl iso_ibm ;;
      dx)  Auswahl dos_unix ;;
      xd)  Auswahl unix_dos ;;
      lc)  Auswahl upp_low ;;
      uc)  Auswahl low_upp ;;
     url)  Auswahl gethref ;;
     adr)  Auswahl getmailto ;;
     src)  Auswahl getsrc ;;
     str)  Auswahl strings ;;
      ed)  ifset OutFile || continue
           [ -s "$OutFile" ] || continue
           [ $T == \ ] && edit $OutFile
           [ $T == / ] && vi $OutFile ;;
      sh)  [ -f ${T}conv_bish.tmp ] && remove ${T}conv_bish.tmp
           echo "%nBeenden durch Eingabe von 'exit'.%n"
           [ $T == \ ] && { DIR; command.com; }
           [ $T == / ] && { l; bish -E; }
           ;;
       E)  break ;;
     H|h)  Helft_mir_doch ;;
       *)  ifset Line && echo %a%c
           continue ;;
   esac
done



[ -f ${T}conv_bish.tmp ] && remove ${T}conv_bish.tmp





###  cp437_latin1.bish  #############################################

#!/u/bin/bish

#cp437 to Latin1
Trans='
80 c7
81 fc
82 e9
83 e2
84 e4
85 e0
86 e5
87 e7
88 ea
89 eb
8a e8
8b ef
8c ee
8d ec
8e c4
8f c5
90 c9
e6 b5
91 e6
92 c6
93 f4
f6 f7
94 f6
95 f2
96 fb
97 f9
ff a0
98 ff
99 d6
9a dc
a2 f3
a3 fa
a5 d1
9b a2
9c a3
9d a5
e1 df
a0 e1
a1 ed
f1 b1
a4 f1
ac bc
aa ac
a6 aa
a7 ba
a8 bf
ab bd
ad a1
ae ab
af bb
f8 b0
fa b7
fd b2
'

local Z:.200 qq=.. zz=.. q=. z=.

while readl Z
do
   for 2 qq zz in $Trans
   do
      base -16 qq +b q
      base -16 zz +b z
      expr "$Z" :Z "$q" += "$z"
   done
   catv Z /%n
done

:




###  cpc.bish  #############################################


list -Rf \u |
while readl path
do
   conv -l path
   expr "$path" :dir '^%(..*%)\[^\][^\]*%.[ch]$' || continue
   [ ! -d "d:$dir" ] && mkdirs "d:$dir"
   copy -v "$path" "d:$path"
done



###  cpd.bish  #############################################




[ -s /mnt/command.com ] || mount /dev/hd0d /mnt || exit
[ -d /scratch/NT ] || mount /dev/scratch /scratch || exit

D1=DOS D2=NT D3=C D4=TEMP D5=RECYCLED
mkdirs /mnt/DOS
mkdirs /mnt/NT
mkdirs /mnt/TEMP
mkdirs /mnt/RECYCLED
echo ---------------------------------------- >> cpdlog
< path.lst
3< path1.lst
while read a c s t n
do
   read -u3 a1 c1 s1 t1 n1
   expr "$n" :nu '^%([1-9]%{1,3%}%)/..*' || { echo $n; break; }
   let "nu==3" && continue
   expr "$n" :name $nu "/mnt/${D[nu]}"
   expr "$n1" :nu '^%([1-9]%{1,3%}%)/..*' || { echo $n1; break; }
   let "nu==3" && continue
   expr "$n1" :name1 $nu "/scratch/${D[nu]}"
   let "2#$a&16#10" && {
      echo "md $name" >> cpdlog
      echo "md $name"
      mkdirs "$name" || { echo "!!!!!"; break; }
   }
   [ -e "$name1" ] || continue
   [ -d "$name1" ] && continue
   [ -e "$name" ] && continue
   let s || continue
   expr "$name1" :: '..*-$' && {
      echo "dd ${s}_$((s/1024))_$((s%1024))_0x90 --> $name" >> cpdlog
      echo "dd ${s}_$((s/1024))_$((s%1024))_0x90 --> $name"
      let "s/(2*512)>0" &&
         dd if=/dev/byte/hex/90 of="$name" bs=2b count=$((s/(2*512))) ||
            { echo !!!!!!!!!; break; }
      let "s%(2*512)>0" &&
         dd if=/dev/byte/hex/90 bs=1 count=$((s%(2*512))) %
            conv=notrunc >> "$name" ||
            { echo !!!!!!!!!; break; }
      continue
   }
   echo "cp $name1 --> $name" >> cpdlog
   echo "cp $name1 --> $name"
   cp "$name1" "$name" || { echo "!!!!!!!!!"; break; }
done
><<





###  cplangline.bish  #############################################

#!/u/bin/bish


set Z:.200 Zq:.200
f=0


cat "$1" | {
   5<"$2"
   >"$1"
   while readl Z
   do
      expr "$Z" :: '_%d%d%d_no  "' || { catv Z /%n; continue; }
      f=0
      while readl -u5 Zq
      do
         expr "$Zq" :: '_%d%d%d_no  "' && f=1 break
      done
      [ f -eq 0 ] && print -u2 "$Zq" '!=no'
      catv Zq /%n
   done
   ><<
}

:





###  cppbn.bish  #############################################

#!/u/bish


# id parbn
Set()  {
   local id=$1 pbn=$2 n=0000
   prints vsf03 pbn $pbn
   prints vsf08 id $id
   cat "cfgbase.txt" | {
      >"cfgbase.txt"
      while readl Z
      do
         expr "$Z" :: '^.'"$id " && {
            expr "$Z" :Z ' 000 ' = " $pbn " && let ++n
         }
         catv Z /%n
      done
      ><
   }
   [ n -eq 1 ] && return 0
   [ n -gt 1 ] && return $n
   return 1
}


<"cb54.txt"
while read id - - - - - - - - - - - parbn -
do
   expr "$id" :: '^%$' && break
   expr "$id" :id '^[@a-z;,.]%(%d%{8}%)$' || continue
   [ parbn -eq 0 ] && continue
   Set $id $parbn || print -u2 $? : $id $parbn
done
><





###  cptransl.bish  #############################################



LL=tr
set Z:.100 Z2:.100 T:.80 T2:.80 D:.50
set Src:.50 Dst:.50
Src=quelle
Dst=ziel
RA_D='D_%w%{1,}_%d%d%d_'


Fehlen() {
   <"$Dst"
   while readl Z
   do
      expr "$Z" :D ' %('"$RA_D$LL"'%) ' || continue
      grep -qm1 " $D " "$Src" || echo "$D"
   done
   ><
   return 0
}


Kopieren() {
   cat "$Dst" | {
      >"$Dst"
      while readl Z
      do
         expr "$Z" :D ' %('"$RA_D$LL"'%)  "[^"]*"$' || { catv Z /%n; continue; }
         Z2="$(-grep -m1 " $D  "'"[^"]%{1,}"$' "$Src")" || { catv Z /%n; continue; }
         expr "$Z2" :T '%("[^"]%{1,}"%)$' || { catv Z /%n; continue; }
         expr "$Z" :Z '"[^"]*"$' = "$T" || print -u2 "%t!subst: $D"
         catv Z /%n
         print -u2 "$T"
      done
      ><
   }
   return 0
}


UngleichEN() {
   <"$Dst"
   while readl Z
   do
      expr "$Z" :D ' %('"$RA_D"'en%) ' || continue
      Z2="$(-grep -m1 " $D " "$Src")" || continue
      expr "$Z" :T '%("[^"]%{1,}"%)$' || continue
      expr "$Z2" :T2 '%("[^"]%{1,}"%)$' || continue
      cmpv T T2 || echo "%tungleich_en: $D"
   done
   ><
   return 0
}


NullenTXT() {
   cat "$Dst" | {
      >"$Dst"
      while readl Z
      do
         expr "$Z" :T " ${RA_D}en"'  %("[^"]*"%)$' && {
            catv Z /%n
            continue
         }
         expr "$Z" :: " $RA_D"'[a-z][a-z]  0$' && {
            expr "$Z" :Z '  0$' = "  $T" || print -u2 "%t!subst: $Z"
         }
         catv Z /%n
      done
      ><
   }
   return 0
}


while echo "
%tQuelldatei : q  $Src
%tZieldatei  : z  $Dst
%tKürzel     : k  $LL
%tFehlt in Q.: fe
%tKopieren QZ: cp
%tNullenTXT  : nt
%tUngleich_EN: ne
%tEnde       : E
%t           : _%b%c"
do
   read cmd arg
   case "$cmd" in
     q)  Src="$arg";;
     z)  Dst="$arg";;
     k)  LL="$arg";;
     fe) Fehlen;;
     cp) Kopieren;;
     nt) NullenTXT;;
     ne) UngleichEN;;
     E)  break;;
     *)  echo "%a%c"; continue;;
   esac
done

:




###  crctab.bish  #############################################


POL32r=$((16#EDB88320))
POL16r=$((16#8408))


for i from 0 to 255 repeat
do
   r=$i
   to 8 repeat
   do
      if let "r&1"
      then
	 let "r=(r>>1)^POL16r"
      else
         let "r>>=1"
      fi
   done
   prints vsf04 r $((16#, r))
   conv -u r
   echo "0x${r}u,%c"
   let "(i+1)%8==0" && echo
done
echo


for i from 0 to 255 repeat
do
   r=$i
   to 8 repeat
   do
      if let "r&1"
      then
	 let "r=(r>>1)^POL32r"
      else
         let "r>>=1"
      fi
   done
   prints vsf08 r $((16#, r))
   conv -u r
   echo "0x${r}ul,%c"
   let "(i+1)%4==0" && echo
done
echo





###  cron.pop.bish  #############################################

#!/u/bin/bish -p

0</dev/tty
1>>/var/log/pop.bish
2>>/var/log/pop.bish
. /u/sh/bish/pop.bish -a l 140000.
><<<



###  crypt.bish  #############################################

#!/u/bin/bish

VZ='JDOOLD HVW RPQLV GLYLVD LQ SDUWHV WUHV'
#   GALLIA EST OMNIS DIVISA IN PARTES TRES
# ABCDEFGHIJKLMNOPQRSTUVWXYZ
#    D  GH J L  O Q S UVW Y
CZ='7 22 12 16 13 33 38 33 28 43 35 49 50 46 55 75
   68 66 79 76 89 97 92 102 123 102 111 119 114 127'
DF='7 15 -10 4 -3 20 5 -5 -5 15 -8 14 1 -4 9 20
   -7 -2 13 -3 13 8 -5 10 21 -21 9 8 -5 13'
# A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
# 1 2 3 4 5 6 7 8 9 1011121314151617181920212223242526


buchst()  {
   local inp=.... c=. vz="$VZ" paar=.. paare:.200 Paare:.200
   Paare=
   while paare="$Paare" vz="$VZ"
         conv -d.t' t' paare
         conv -"$paare" vz
         echo "$Paare%n$vz"
         echo "%ntr-Paar oder E: %c"
   do
      read inp
      case "$inp" in
        E)  break;;
        [A-Za-z][A-Za-z])
            catv 1,inp =c
            expr "$Paare" :Paare " $c." += ''
            Paare="$Paare $inp"
            ;;
        *)  continue;;
      esac
   done
   return 0
}


diffs()  {
   local inp=.... opt=.... s=s1 bw=015 ar=000 d=000 c=000 sw=000 inc=000 l=000
   local s1='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
   local s2=' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ'
   sw=4 inc=4
   while l=${{#s}}
   echo "
%tArithm. Reihe: a
%tDifferenzen  : d
%tStartwert    : s $sw
%tInkrement    : i $inc
%tBasiswert    : b $bw
%tEnde         : E
%t             : _%b%c"
   do
      read inp opt
      case "$inp" in
        E)  break;;
	a)  ar=$sw
	    for d in $CZ
	    do
	       c=$((d-ar+bw))
	       let "c>l-1" && let "c-=l-1"
	       let "c<  0" && let "c+=l"
	       let ar+=inc
	       catv c,1,$s
	    done
	    echo
	    ;;
        d)  for d in $DF
            do
               c=$((bw+d))
               let "c>25" && let "c-=25"
               let "c< 0" && let "c+=26"
               let c+=bw
               base -10 c +b
            done
            echo
            ;;
	s)  sw="$opt";;
	i)  inc="$opt";;
        b)  bw="$opt";;
        *)  continue;;
      esac
   done
   return 0
}


permut()  {
   local s="$1" sa="$1" o=00 l=00 c=.
   let ++N
   l=${#s}
   for o from 0 to $((l-1)) repeat
   do
      catv o,1,s =N,1,C
      [ ${#s} -le 1 ] && { catv $2,C /%n; break; }
      catv o,1,s =c
      sa="$s"
      conv -D$c sa
      permut "$sa" $2
   done
   let --N
   return 0
}


set N=00 C:.26 L=00

while print -u2 "
%tBuchstaben   : b
%tDifferenzen  : d
%tPermutationen: p string
%tENDE         : E
%t             : _%b%c"
do
   read cmd opt
   case "$cmd" in
     E)  break;;
     b)  buchst;;
     d)  diffs;;
     p)  N=-1; permut "$opt" ${#opt};;
     *)  continue;;
   esac
done





###  ct.bish  #############################################

#!/u/bin/bish

for F in db/[1-9]*/[1-9]*/i
do
   echo $F
   cat $F | {
      > $F
      while read id inh
      do
         [ id -ne 50 ] && { catv id '. ' inh /%r%n; continue; }
         catv id '/ 0%r%n'
      done
      ><
   }
done



###  ctex.bish  #############################################

#!/u/bin/bish


DIR=kap
[ -s /tmp/$DIR.tar -o -s /tmp/$DIR.tar.bz2 ] || {
   print -u2 tar ...
   tar cf /tmp/$DIR.tar $DIR || exit 1
   print -u2 bzip2 ...
   bzip2 -f /tmp/$DIR.tar || exit 1
   exit 0
}

FILES=$DIR/?*.tex
CTEX=ctex_l
SW='   '
[ "$1" == sw ] && SW=-sw shift
[ $# -eq 2 ] && CMD=$1 LANG=$2 shift 2
[ $# -gt 0 ] && exit 2
C="del prep clear"
L="c cpp bish sh pl tex html vim txt masm asm s"
ifset CMD  && expr "$C" :: "%<$CMD%>" || exit 3
ifset LANG && expr "$L" :: "%<$LANG%>" || exit 4


SetLangKz()  {
   local le=$1
   expr "$le" :: '^[a-z]%{1,4}$' || return
   case "$le" in
     c|cpp|html|txt)
           KZ='//' ;;
     bish|sh|pl)
           KZ='##' ;;
     tex)  KZ='%%' ;;
     vim)  KZ='""' ;;
     s|asm|masm)  KZ=';;' ;;
       *)  return 2 ;;
   esac
   LE="$le"
   expr "$LES" :: "%%<$le%%>" || {
      LES="$LES$le "
      : 3>$CTEX.$LE
   }
   return 0
}


PutKode()  {
   let "OFFS<=0 || ${#KODE}<OFFS" && return 0
   catv .$KZ@+ NAME ._ TN .@$KZ /%n $OFFS,KODE %
        .$KZ@- NAME ._ TN .@$KZ /%n =3  3>> "$CTEX.$LE"
   return 0
}


set KODE:.30000
set Z:.500
set INAME:.100
set LES:' '100
set FILE:.20
set NAME:.20
set LE:.20
set Le:.20
set N:020
set TN:020
set OFFS:020
z=0 o=0
Beg='\begin{verbatim}'
End='\end{verbatim}'
Inp='\input{..*%.ctex}'
Pv='%%v%%'
Pl='%%l%%'
LES=
N=$((36#a9))


for FILE in $FILES
do
   expr "$FILE" :NAME '%([^/]%{1,}%)%.tex$' || continue
   [ -s "$FILE" ] || continue
   [ -z "$CMD" -o "$CMD" == clear ] &&
      grep -qm "^${Pl}[a-z]" "$FILE" || continue
   print -u2 "%t$FILE"
   N=$((36#a9)) z=0
   [ "$CMD" == del ] && z=D
   [ "$CMD" == prep ] && z=P
   [ "$CMD" == clear ] && z=C
   cat $FILE | {
      > $FILE
      while readl Z
      do
         while :
         do
            case $z in
             0)  expr "$Z" :Le "^$Pl"'%(..*%)$' && z=1
                 ;;
             1)  expr "$Z" :: "^$Pv$Beg" &|
                 expr "$Z" :: "^$Beg" || z=0 goend
                 SetLangKz "$Le" || z=0 goend
                 TN=$((36#, ++N)) OFFS=0
                 INAME="$DIR/${NAME}_$TN.ctex"
                 z=v continue ;;
             v|V)
                 expr "$Z" :: "^$Pv$End" &|
                 expr "$Z" :: "^$End" && z=I
                 if expr "$Z" :: "^$Pv"
                 then o=3
                 else o=0 catv '.%v%'
                 fi
                 let "OFFS+${#Z}+1>=${#KODE}" && {
                    z=- print -u2 "OFFS=$OFFS"
                 }
                 [ $z == V ] && {
                    catv $o,,Z /%n =$OFFS,,KODE
                    let "OFFS+=${#Z}+1-o"
                 }
                 [ $z == v ] && z=V
                 ;;
             I)  if expr "$Z" :: "$Inp"
                 then Z="\input{$INAME}"
                 else catv '.\input{' INAME '/}%n'
                 fi
                 PutKode
                 z=0 continue ;;
             P|p)
                 expr "$Z" :: "^$Beg%$" && [ "$z" == P ] &&
                    catv '.%l%' LANG /%n
                 z=P expr "$Z" :: "^$Pl$LANG%$" && z=p
                 ;;
             D)  expr "$Z" :: "^$Pl$LANG%$" && z=d ;;
             d)  expr "$Z" :: "$Inp" && z=D continue 2
                 if expr "$Z" :: "^$Pv"
                 then catv 3,,Z =Z:
                 else z=D
                 fi
                 ;;
             C)  expr "$Z" :: "^$Pl$LANG%$" && continue 2
                 ;;
            esac
            catv Z /%n
            break
         done
      done
      [ $z == I ] && { catv '.\input{' INAME '/}%n'; PutKode; }
      ><
   }
done

ifset CMD && { print -u2 "$LES"; exit 0; }

for LE in $LES
do
   [ -s $CTEX.$LE ] || continue
   print -u2 "  $CTEX.$LE -> ctex_$LE.htm"
   #-geometry 80x63+8+100 = cols rows xpx ypx; -iconic
   gvim63 -n -f -iconic +'set nonu' +TOhtml +"w! ctex_$LE.htm" %
              +'q!' +'q!' $CTEX.$LE
done

for LE in $LES
do
   [ -s "ctex_$LE.htm" ] || continue
   print -u2 "  $DIR, ctex_$LE.htm"
   bish ./chtm2tex.bish $SW "$DIR" "ctex_$LE.htm"
done

exit 0





###  ctex_l.bish  #############################################

##@+versch_af@##
154#  bish -E
prints s4s4s16  $(( 355)) '' $((2#, 355))
 355           101100011

prints s4s4s16  $(( 355%256)) '' $((2#, 355%256))
  99             1100011

prints s4s4s16  $((-355)) '' $((2#,-355))
-355    1111111010011101

prints s4s4s16  $((-355%256)) '' $((2#,-355%256))
 -99    1111111110011101
##@-versch_af@##
##@+versch_ag@##
187#  bish -E
echo $((36#aa)) $((36#ab)) $((36#zz))
370 371 1295

echo $((10*36+10*1)) $((10*36+11*1)) $((35*36+35*1))
370 371 1295
##@-versch_ag@##
##@+modern_az@##
for 3  U V W  in  Wort...
do
   echo $U $V $W
done
##@-modern_az@##
##@+modern_b0@##
for N from $a by $i to $z repeat
do
   echo $N
done

# to $z repeat
# repeat
##@-modern_b0@##
##@+modern_b1@##
z=10
a="n to $z repeat"

for $a ; do echo $n; done
##@-modern_b1@##
##@+modern_b2@##
a=b
b=c
c=ccc
echo %t${{{a}}} ${{{a}
        ccc ccc
##@-modern_b2@##
##@+modern_b3@##
kdo1 &| kdo2 &| kdo3  && kommando
kdo1 &| kdo2 &| kdo3  || kommando
##@-modern_b3@##
##@+modern_b4@##
set BUF:0.100000000
echo %t${#BUF}
        100000000
catv '.%%' U V  5,10,W$e  220,4  /%n  =35000,,BUF:
echo %t${#BUF}
        35844
##@-modern_b4@##
##@+modern_b5@##
cat $Datei | {
   > $Datei
   while readl Zeile
   do
      catv Zeile /%n
   done
   ><
}

catv HTMLa HTML3 3 0 HTMLb <$CO 3</tmp/$CO | cat >$CO
##@-modern_b5@##
##@+modern_b7@##
(( arithmetik
   arithmetik ))
echo $(( arithmetik ))
let "arithmetik" "arithmetik" ...

(( a>c ? U : V = 26 ))
##@-modern_b7@##
##@+modern_b8@##
Funktion()  {
   local a=. b:.40 argc=$# args=$*
   static sa
   #...
   return 0
}
##@-modern_b8@##
##@+modern_b9@##
expr "$N" :n '^%(.%)%(.*%)$' '%1%L%2'
expr "$n" :n ' %([a-z]%)' + ' %U%1'
##@-modern_b9@##
##@+modern_ba@##
echo $SECONDS
sleep 4
sleep -m 350
##@-modern_ba@##
##@+modern_bb@##
continue [ebenen]
break [ebenen]
goend [ebenen]
##@-modern_bb@##
##@+modern_bd@##
to 10000 repeat
do
   version=$V
   conv -d.d' ' version
   expr "$V" =:version 'Productversion:%(%d*%)'
done
#0.75 s
##@-modern_bd@##
##@+modern_be@##
# SLE<--  Buf $offs $len
Sle16()  {
   local n=00 sle_=000000 word=000000
   for word in $( catv $3,$4,$2 | base -w +10 )
   do
      for n from 0 to 15 repeat
      do
         if let "{{sle_&16#8000}^{[word&(1<<n)]<<(15-n)}}&16#ffff"
         then
            (( sle_=  ((((sle_^2064)&2064)<<1)|(sle_<<1))
                     &((((sle_^2064)&2064)<<1)|~(2064<<1)),
               sle_&=16#ffff, sle_|=1
            ))
         else
            (( sle_=  ((((sle_^~2064)&2064)<<1)|(sle_<<1))
                     &((((sle_^~2064)&2064)<<1)|~(2064<<1)),
               sle_&=~1, sle_&=16#ffff
            ))
         fi
      done
   done
   $1=$sle_
   return 0
}
##@-modern_be@##
##@+modern_bf@##
[ $# -ne 0 ] && files="$*"
[ $# -eq 0 ] && files=?*.[chCH] %
        files="$files cbase.txt mbase.txt"
read "old?ALT und NEU [aaa nnn]:  " new
ifset old || exit
ifset new || exit
expr "$old" :old '\s' += ' '
expr "$new" :new '\s' += ' '

for file in $files
do
   expr "$file" =:: 'sl%d%{2,%}%.h$' && continue
   grep -qm -e "%<$old%>" "$file" || continue
   cat "$file" | {
      3> "$file"
      while readl Z
      do
         expr "$Z" :Z "%<$old%>" + "$new"
         print -ru3 "$Z"
      done
      ><
   }
done

exit 0
##@-modern_bf@##
##@+modern_bg@##
#!/u/bin/bish

start=0 inc=1 muster='@' width=2 fill=' '
neq=1

[ -t 0 ] &| expr "$1" :: '[^0-9-]' && {
   print -u2 ninc.bish: usage: start inc.neq muster %
                              width fillchar
   exit 0
}

[ $# -gt 0 ] && {
   [ -n "$1" ] && start="$1"
   [ -n "$2" ] && inc="$2"
   [ -n "$3" ] && muster="$3"
                  width="$4"
                  fill="$5"
}
ifset fill && fill="f$fill"
expr "$width" :width '^-' = '' && sign=-
expr "$inc" :neq '%d%.%(%d%{1,}%)'
expr "$inc" :inc '^%(%d%{1,}%)'
neqd=$neq

cat | {
   while readl Z
   do
      prints "vs$sign$fill"$width subst "$start"
      expr "$Z" :Z "$muster" = "$subst" &&  {
         let "--neqd==0" && let "start+=inc" "neqd=neq"
      }
      catv Z /%j
   done
}

exit 0
##@-modern_bg@##
##@+modern_bh@##
#.........
[ -n "$4" ] && : >$4
 >d__2
4>d__3
print -u4 '%n%n%nconst struct cdata_t '"$1"'data[]= {'
<$2
while seek + 0 sk
      read id dd typ bytelen darst nbit bitpos %
           dflt1 min1 max1 dflt2 min2 max2 %
           sgrpn flags einheit name %
           Tinfo Tgrp Tsgrp Tbit Text text
do
   expr "$id" :: '^%$' && break
   expr "$id" :: '^}$' && {
      [ von -ge bis ] && inc=0 continue
      seek $skvb 0; let 'von+=inc'; continue
   }
   expr "$id" :: '^{#$' && {
      von=$dd bis=$typ inc=$bytelen inc2=$darst
      ifset inc2 || inc2=1
      seek + 0 skvb; continue
   }
#.........
         prints su4sbsbsbsbsbsbsbsbsbs '   { ' %
#.........
done
#.........
##@-modern_bh@##
##@+modern_bj@##
[ $# -eq 0 ] && exit 0


Zeile()  {
   local a:17.1 b:19.1 comment:.200
   local n:.100
   if expr "$Z" :comment '[^\]%(%%.*%)$'
   then  expr "$Z" :Z '%([^\]%)%%.*$' '%1'
   else  comment=
   fi
   expr "$N" :n '^%(.%)%(.*%)$' '%1%L%2'
   expr "$n" :n ' %([a-z]%)' + ' %U%1'
   expr "$Z" :Z "%<$N%>" + "$a&$b"
   expr "$Z" :Z "\index{$a$N$b" += "\index{$N"
   expr "$Z" :Z "\textsc{$a$N$b" += "\textsc{$N"
   expr "$Z" :Z "\verb%(.%)$a$N$b" + "\verb%1$N"
   expr "$Z" :Z "\label{%([^}]*%)$a$N$b" + "\label{%1$N"
   expr "$Z" :Z "\pageref{%([^}]*%)$a$N$b" + "\pageref{%1$N"
   expr "$Z" :Z "\ref{%([^}]*%)$a$N$b" + "\ref{%1$N"
   expr "$Z" :Z "\textbf{%([^}]*%)$a$N$b" + "\textbf{%1$N"
   expr "$Z" :Z "$a$N$b" += "\textsc{$n}"
   ifset comment && catv comment =:,,Z:
   return 0
}


UseNot()  {
   ifset Z || { catv /%n; return 0; }
   expr "$Z" :: '^[ %t]%{0,}%%' &|
   expr "$Z" :: '\[a-z]*section[{[]' &|
   expr "$Z" :: '\[a-z]*section%*[{[]' &|
   expr "$Z" :: '\chapter[{[]' && {
      catv Z /%n; return 0
   }
   return 1
}


set Z:.300
set Zcmp:.300
set F:.50
set N:.50
V=v

for F in kap/*.tex
do
   [ -s "$F" ] || continue
   [ $# -eq 1 ] && grep -qm "%<$1%>" "$F" || continue
   cat "$F" | {
      > "$F"
      while readl Z Zcmp
      do
         if [ $V == V ]
         then
            expr "$Z" :: '\end{verbatim}' && V=v
            catv Z /%n; continue
         else
            UseNot && continue
            expr "$Z" :: '\begin{verbatim}' || goend
            V=V catv Z /%n; continue
         fi
         for N in "$@"
         do
            [ ${#N} -ge 2 ] || continue
            expr "$Z" :: "%<$N%>" || continue
            Zeile
         done
         cmpv Z Zcmp || print -u2 "$F:$Zcmp%n$F:$Z%n"
         catv Z /%n
      done
      ><
   }
done

exit 0
##@-modern_bj@##
##@+modern_bk@##
#!/u/bin/bish
#ctex.bish: Hauptscript Syntax Highlight in .tex

DIR=kap
[ -s /tmp/$DIR.tar -o -s /tmp/$DIR.tar.bz2 ] || {
   print -u2 tar ...
   tar cf /tmp/$DIR.tar $DIR || exit 1
   print -u2 bzip2 ...
   bzip2 -f /tmp/$DIR.tar || exit 1
}

FILES=$DIR/?*.tex
CTEX=ctex_l
[ $# -eq 2 ] && CMD=$1 LANG=$2 shift 2
[ $# -gt 0 ] && exit 2
C="del prep clear"
L="c cpp bish sh perl tex vim html"
ifset CMD  && expr "$C" :: "%<$CMD%>" || exit 3
ifset LANG && expr "$L" :: "%<$LANG%>" || exit 4


SetLangKz()  {
   local le=$1
   expr "$le" :: '^[a-z]%{1,4}$' || return
   case "$le" in
      c|cpp|html)  KZ='//' ;;
     bish|sh|perl)  KZ='##' ;;
             tex)  KZ='%%' ;;
             vim)  KZ='""' ;;
               *)  return 2 ;;
   esac
   LE="$le"
   expr "$LES" :: "%%<$le%%>" || {
      LES="$LES$le "
      : 3>$CTEX.$LE
   }
   return 0
}


PutKode()  {
   let "OFFS<=0 || ${#KODE}<OFFS" && return 0
   catv .$KZ@+ NAME ._ TN .@$KZ /%n $OFFS,KODE %
        .$KZ@- NAME ._ TN .@$KZ /%n =3  3>> "$CTEX.$LE"
   return 0
}
##@-modern_bk@##
##@+modern_bl@##
set KODE:.30000
set Z:.500
set INAME:.100
set LES:' '100
set FILE:.20
set NAME:.20
set LE:.20
set Le:.20
set N:020
set TN:020
set OFFS:020
z=0 o=0
Beg='\begin{verbatim}'
End='\end{verbatim}'
Inp='\input{..*%.ctex}'
Pv='%%v%%'
Pl='%%l%%'
LES=


for FILE in $FILES
do
   expr "$FILE" :NAME '%([^/]%{1,}%)%.tex$' || continue
   [ -s "$FILE" ] || continue
   [ -z "$CMD" -o "$CMD" == clear ] &&
      grep -qm "^${Pl}[a-z]" "$FILE" || continue
   print -u2 "%t$FILE"
   N=$((36#a9)) z=0
   [ "$CMD" == del ] && z=D
   [ "$CMD" == prep ] && z=P
   [ "$CMD" == clear ] && z=C
   cat $FILE | {
      > $FILE
      while readl Z
      do
         while :
         do
            case $z in
             0)  expr "$Z" :Le "^$Pl"'%(..*%)$' && z=1
                 ;;
             1)  expr "$Z" :: "^$Pv$Beg" &|
                 expr "$Z" :: "^$Beg" || z=0 goend
                 SetLangKz "$Le" || z=0 goend
                 TN=$((36#, ++N)) OFFS=0
                 INAME="$DIR/${NAME}_$TN.ctex"
                 z=v continue ;;
##@-modern_bl@##
##@+modern_bm@##
             v|V)
                 expr "$Z" :: "^$Pv$End" &|
                 expr "$Z" :: "^$End" && z=I
                 if expr "$Z" :: "^$Pv"
                 then o=3
                 else o=0 catv '.%v%'
                 fi
                 let "OFFS+${#Z}+1>=${#KODE}" && {
                    z=- print -u2 "OFFS=$OFFS"
                 }
                 [ $z == V ] && {
                    catv $o,,Z /%n =$OFFS,,KODE
                    let "OFFS+=${#Z}+1-o"
                 }
                 [ $z == v ] && z=V
                 ;;
             I)  if expr "$Z" :: "$Inp"
                 then Z="\input{$INAME}"
                 else catv '.\input{' INAME '/}%n'
                 fi
                 PutKode
                 z=0 continue ;;
             P|p)
                 expr "$Z" :: "^$Beg%$" && [ "$z" == P ] &&
                    catv '.%l%' LANG /%n
                 z=P expr "$Z" :: "^$Pl$LANG%$" && z=p
                 ;;
             D)  expr "$Z" :: "^$Pl$LANG%$" && z=d ;;
             d)  expr "$Z" :: "$Inp" && z=D continue 2
                 if expr "$Z" :: "^$Pv"
                 then catv 3,,Z =Z:
                 else z=D
                 fi
                 ;;
             C)  expr "$Z" :: "^$Pl$LANG%$" && continue 2
                 ;;
            esac
            catv Z /%n
            break
         done
      done
      [ $z == I ] && { catv '.\input{' INAME '/}%n'; PutKode; }
      ><
   }
done
##@-modern_bm@##
##@+modern_bn@##

ifset CMD && exit 0

for LE in $LES
do
   [ -s $CTEX.$LE ] || continue
   print -u2 "  $CTEX.$LE -> ctex_$LE.htm"
   gvim -n -f +'set nonu' +TOhtml +"w! ctex_$LE.htm" %
              +'q!' +'q!' $CTEX.$LE
done

for LE in $LES
do
   [ -s "ctex_$LE.htm" ] || continue
   print -u2 "  $DIR, ctex_$LE.htm"
   bish ./chtm2tex.bish "$DIR" "ctex_$LE.htm"
done

exit 0
##@-modern_bn@##
##@+modern_bo@##
#!/u/bin/bish
#chtm2tex.bish

[ $# -eq 0 ] && exit 0
DIR=.
[ $# -gt 1 ] && DIR="$1" shift
FILES="$*"

set Z:.500
set Text:.100
set Leer:.100
set FILE:.100
set OFILE:.100
set HexC:010
R=000000000
G=000000000
B=000000000


PutText()  {
   local l:20.1
   expr "$Text" :Text '&quot;' += '"'
   expr "$Text" :Text '&lt;' += '<'
   expr "$Text" :Text '&gt;' += '>'
   expr "$Text" :Text '&amp;' += '&'
   expr "$Text" :Text ' ' += "$l"
   expr "$Text" :Text '\' += '\textbackslash '
   expr "$Text" :Text '''' += '\textquoteright '
   expr "$Text" :Text '`' += '\textquoteleft '
   expr "$Text" :Text '"' += '\textquotedblright '
   expr "$Text" :Text '%^' += '\textasciicircum '
   expr "$Text" :Text '~' += '\textasciitilde '
   expr "$Text" :Text '&' += '\&'
   expr "$Text" :Text '#' += '\#'
   expr "$Text" :Text '%$' += '\$'
   expr "$Text" :Text '%%' += '\%'
   expr "$Text" :Text '_' += '\_'
   expr "$Text" :Text '{' += '\{'
   expr "$Text" :Text '}' += '\}'
   expr "$Text" :Text '%('"$l"'%{1,}%)' + '\verb:%1:'
   expr "$Text" :Text "$l" += ' '
   ifset Text || return 1
   catv Text
   return 0
}
##@-modern_bo@##
##@+modern_bp@##
MkRgb()  {
   expr "$HexC" :R '^%(..%)....'
   expr "$HexC" :G '^..%(..%)..'
   expr "$HexC" :B '^....%(..%)'
   let "R=16#$R" "G=16#$G" "B=16#$B"
   let "R=(R*1000+127)/255" %
       "G=(G*1000+127)/255" %
       "B=(B*1000+127)/255"
   [ ${#R} -eq 1 ] && R=0.00$R
   [ ${#R} -eq 2 ] && R=0.0$R
   [ ${#R} -eq 3 ] && R=0.$R
   [ ${#R} -eq 4 ] && R=1.000
   [ ${#G} -eq 1 ] && G=0.00$G
   [ ${#G} -eq 2 ] && G=0.0$G
   [ ${#G} -eq 3 ] && G=0.$G
   [ ${#G} -eq 4 ] && G=1.000
   [ ${#B} -eq 1 ] && B=0.00$B
   [ ${#B} -eq 2 ] && B=0.0$B
   [ ${#B} -eq 3 ] && B=0.$B
   [ ${#B} -eq 4 ] && B=1.000
   return 0
}

RAlez='%( %{1,}%)'
RAtxt='%([^< ]%{1,}%)'
RAfcc='<font color="#%(......%)">'
RAbgc='<span style="background-color: #%(......%)">'
KZ='[%/*#(;"]%{2}'


Leerz()  {
   local k:.10 rek=$1
   shift
   expr "$rek" :k '.' += '}' || k=
   catv k /\verb: Text /:
   while ifset rek
   do
      catv 1,rek =k:
      expr "$rek" :rek '^.%(.*%)$'
      case "$k" in
        B)  catv ".\colorbox[rgb]{$1,$2,$3}{"; shift 3 ;;
        f)  catv ".\textcolor[rgb]{$1,$2,$3}{"; shift 3 ;;
        b)  catv '.\textbf{' ;;
      esac
   done
   return 0
}
##@-modern_bp@##
##@+modern_bq@##
Zeile()  {
   local k=. rek=$1
   shift
   while :
   do
      ifset Z || return 0
      expr "$rek" :k '%(.%)$' || k=.
      case "$k" in
        B)  expr "$Z" :Z '^</span>' = '' && k=R ;;
        f)  expr "$Z" :Z '^</font>' = '' && k=R ;;
        b)  expr "$Z" :Z '^</b>'    = '' && k=R ;;
      esac
      [ "$k" == R ] && { catv '.}'; return 0; }
      expr "$Z" :Text "^$RAlez" && {
         Leerz $rek $*
         expr "$Z" :Z "^$RAlez" = ''
      }
      expr "$Z" :Text "^$RAtxt" && {
         PutText
         expr "$Z" :Z "^$RAtxt" = ''
      }
      expr "$Z" :HexC "^$RAbgc" && {
         expr "$Z" :Z "^$RAbgc" = ''
         MkRgb
         catv ".\colorbox[rgb]{$R,$G,$B}{"
         Zeile ${rek}B $* $R $G $B
      }
      expr "$Z" :HexC "^$RAfcc" && {
         expr "$Z" :Z "^$RAfcc" = ''
         MkRgb
         catv ".\textcolor[rgb]{$R,$G,$B}{"
         Zeile ${rek}f $* $R $G $B
      }
      expr "$Z" :: "^<b>" && {
         expr "$Z" :Z "^<b>" = ''
         catv ".\textbf{"
         Zeile ${rek}b $*
      }
   done
   return 0
}
##@-modern_bq@##
##@+modern_br@##
for FILE in $FILES
do
   < $FILE
   while :
   do
      OFILE=
      while readl Z
      do  expr "$Z" :OFILE "$KZ"'@+%(%w%{4,}%)@'"$KZ" && break
      done
      ifset OFILE || break
      print -u2 "%t$DIR/$OFILE.ctex"
      > $DIR/$OFILE.ctex
      catv '/\begin{flushleft}%n\begin{ttfamily}%n'
      while readl Z
      do
         expr "$Z" :: "$KZ@-$OFILE@$KZ" && break
         catv "/\verb:   :"
         Zeile
         catv /\\%n
      done
      catv '/\end{ttfamily}%n\end{flushleft}%n'
      ><
   done
   ><
done

exit 0
##@-modern_br@##


###  cvars.bish  #############################################


ifdef CVARS_BISH && return
CVARS_BISH=

Doctype='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
'
Meta='<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta http-equiv="Content-Style-Type" content="text/css">
<link rel=STYLESHEET type="text/css" href="/htm/main.css">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<meta http-equiv="expires" content="0">
<meta name="Author" content="Helmut Schellong">
<meta name="Rights" content="Sentelor GmbH, Hetten/Herford">
<meta name="Copyright" content="(c) Helmut Schellong, Bad Salzuflen [bish]">
<meta name="Generator" content="bish Script-Interpreter v3.40 CGI">
<link rel=STYLESHEET type="text/css" href="/htm/main.css">
'
Fmueehtm=../tmp/muee.htm
Fmustatus=../tmp/mustatus
Fokayfail=../tmp/okayfail

Feebase=../dat/eebase.txt
Feelf=../htm/eelf.htm
Fsigjs=../js/sig.js
Fsigajs=../js/siga.js
Fsigabmjs=../js/sigabm.js
Fgrpajs=../js/grpa.js
Fgrpaejs=../js/grpae.js
Fsigatxt=../dat/siga.txt
Fsigabmtxt=../dat/sigabm.txt
Fmuee=../dat/muee.bin
Fmueehv=../dat/mueehv.bin
Fmueebm=../dat/mueebm.bin
Fmueebin=../tmp/muee.bin
Fmueemuc=../tmp/mucfg.muc
Fheadmuc=../dat/head.muc

Ddb=../db
Fali=alias.txt
Fstation=$Ddb/station.txt
Fconntest=$Ddb/conntest.txt
Fmucupld=../tmp/upld.muc
Finfobase=../dat/newbase.txt
Fadmlog=$Ddb/log
MC64='aGbdHfgklmjhpqoe~#KVS]u&vwxyPzDB}C{F(AUEsrIi*Jn)L^MNtQO!RTcWY[XZ'

REip='%d%{1,3}%.%d%{1,3}%.%d%{1,3}%.%d%{1,3}'
RN='
'
CR=''
NL='
'
TAB='	'
ESC='^['
CA='^A'

Tconv='116 239 246 116 245 252 116 223 176'

TblTitle1=' '
TblTitle2='-'
TblTitle3='Main measurement values'
TblTitle4='Alarm data'
TblTitle5='PSS devices'
TblTitle6='UNV devices'
TblTitle7='UNB &nbsp;BM1 &nbsp;MM &nbsp;FAN'
TblTitle8='Measurement values'
TblTitle9='Events/History'

case $(extern uname) in
  FreeBSD)   OsTyp=FreeBSD ps_cmd='/bin/ps -wu -U wms';;
  OpenUnix)  OsTyp=OpenUnix ps_cmd='/bin/ps -f -u wms';;
  OpenUNIX)  OsTyp=OpenUnix ps_cmd='/bin/ps -f -u wms';;
  *)         OsTyp=Unix ps_cmd='/bin/ps -ef';;
esac



###  cvrtbase.bish  #############################################




Convert()  {
   local danam:.30 tanam:.30 dnam:.20 tnam:.20 tnam0:.20
   local id=000000 text:.100
   local nl=0 ddd=000 ll=..
   < $1
   while readl Z
   do
      expr "$Z" :danam ' %(D_%w%{1,}_%d%d%d_%l%l%)  *%d%{1,5}, *"' || {
	 catv Z /%n
         continue
      }
      expr "$Z" :id ' D_%w%{1,}_%d%d%d_%l%l  *%(%d%{1,5}%), *"'
      expr "$Z" :ddd ' D_%w%{1,}_%(%d%d%d%)_%l%l  *%d%{1,5}, *"'
      expr "$Z" :ll ' D_%w%{1,}_%d%d%d_%(%l%l%)  *%d%{1,5}, *"'
      expr "$Z" :text '^[^"]%{1,} %(".*"%)[ %t]*$'
      expr "$danam" :dnam '^%(D_%w%{1,}%)_%d%d%d_%l%l$'
      [ nl -eq 0 ] && echo "#define ${dnam}_${ddd}_id  $id"
      echo "#define $danam  $text"
      let "++nl>=3" && nl=0
   done
   ><
   return 0
}


Convert $1





###  d.bish  #############################################




n=000
3<&0
list -Rpf /home2/I |
while readl if
do
   expr "$if" :dir 'I' = D
   [ -d "$dir" ] && continue
   gf=$( gfile $if )
   echo $if : $gf
   let "++n>10" && n=0  read -u3 inp
   expr "$gf" :: 'tar archive' && {
      mkdirs $dir
      cd $dir
      tar xAnf $if
      continue
   }
   expr "$gf" :: 'x86 boot sector' && {
      mkdirs $dir
      ln $if /home2/MTOOLS || exit
      mcopy -/mp i: $dir
      remove /home2/MTOOLS
      continue
   }
done





###  d.bish  #############################################



d() {
   local x=$1 y=$2
   echo $x $y
   let "x >= y" && {
      d $((x-y)) $y
      r=$?
      echo $r
      return $((1+r))
   }
   return 0
}

d 10 2
echo $?



###  dat.bish  #############################################


for d in 8x12 12x18
do
   > $d/dat
   for n in 0 1 2 3 4 5 6 7 8 9 l s
   do
      [ -s $d/$n.gif ] || continue
      catv "/d${d}_$n=%""
      catv 47,,0 =Z: < $d/$n.gif
      catv / =-1:,,Z:
      base -b Z +16
      echo '"'
   done
   ><
done



###  db.bish  #############################################

#!/u/bin/bish

D=/home/DB
mkdirs $D
#rm -r $D/*
NA=0000
AI='
10 20 21 22 30 40 50 60 70 80 90
100 110 120 130 140 150 160 170 180 190
200 210 220 230 240 250 260 270 280 290
300 310
'
MC64='aGbdHfgklmjhpqoe~#KVS]u&vwxyPzDB}C{F(AUEsrIi*Jn)L^MNtQO!RTcWY[XZ'
MAILCODEAUTOR=H.Schellong,BadSalzuflen
MAILCODEPROGRAM=Freeware_nur_für_nichtgewerbliche_Verwendung
export MAILCODEAUTOR MAILCODEPROGRAM

: > $D/alias.txt
: > $D/station.txt
for g to 40 repeat
do
   echo "$g Gruppe $g" >> $D/alias.txt
   mkdirs $D/$g
   : > $D/$g/alias.txt
   for a to $((100-2*g)) repeat
   do
      echo "$a System $a" >> $D/$g/alias.txt
      mkdirs $D/$g/$a
      : > $D/$g/$a/i
      RAND=$RANDOM
      for ai in $AI
      do
         case $ai in
            10)  inh="Gruppe $g" ;;
            20)  inh="System $a" ;;
            21)  inh="Standort ${g}_$a" ;;
            22)  inh="Station ${g}_$a"
                 echo "$g $a $inh" >> $D/station.txt ;;
            30)  inh=$g${a}54321 ;;
            50)  inh=5 ;;
            60)  catv /0p RAND | mailcode -en -c "$MC64" | catv 0 =inh: ;;
            70)  inh=KRB$g ;;
           100)  prints vssf06ssf03ssf03 inh 02 $RAND - $g . $a ;;
             *)  inh= ;;
         esac
         catv ai '/ ' inh /%r%n >> $D/$g/$a/i
         #let "(RAND>>6&63)==37" && : > $D/$g/$a/fail
         #let "(RAND>>4&63)==37" && : > $D/$g/$a/okay
      done
      let "++NA>=3500" && break 2
   done
done
chown -R www $D
chgrp -R www $D

exit 0



###  dd.bish  #############################################


a="$1" l="$2"

let "b=a/512, r=a%512"
let "c=b/l+(((b%l)*512+r)/l)/512, r=(((b%l)*512+r)/l)%512, b=c"
echo "/=: b=$b r=$r  a/l=$((a/l)) abr=$((b*512+r))"

let "b=a/512, r=a%512"
echo "*=: b=$b r=$r"
let "b=b*l+(r*l)/512, r=(r*l)%512"
echo "*=: b=$b r=$r  a*l=$((a*l)) abr=$((b*512+r))"



###  del_nt.bish  #############################################

#!/u/bin/bish


CDIR=/dos/cie/mc/c
DIRSPD="$CDIR/mu2b256 $CDIR/mu2b262 $CDIR/u3b145 $CDIR/u3b149 $CDIR/u3b150"
DIRSP="mu2000 upc3"


for DIRPD in $DIRSPD
do
   [ -d "$DIRPD" ] || continue
   for DIRP in $DIRSP
   do
      DIRP="$DIRPD/$DIRP"
      [ -d "$DIRP" ] || continue
      DIR="$DIRP/lst"
      [ -d "$DIR" ] || continue
      cd "$DIR" ; echo $DIR
      rm -v *.lst
      DIR="$DIRP/obj"
      [ -d "$DIR" ] || continue
      cd "$DIR" ; echo $DIR
      rm -v *
   done
done




###  demo.bish  #############################################

#!c:\bish\bish.exe
# demo-Skript für bish-Shell-Programm. H.Schellong
# Anmerkung:
# Es gibt im Shareware-Bereich seit Jahren eigenständige Executables,
# deren Funktion in etwa der Funktion dieses Shell-Scripts entspricht.
# Dort bleibt jedoch völlig unberücksichtigt, daß Verzeichnisse selbst
# jeweils ebenfalls mindestens einen Cluster belegen!...
# Das kann mitunter 20% Fehler bedeuten!


TMPS=get_size.tmp
T=/ UNIX=ja BSZ=1024 NUL=/dev/null; alias remove=rm
[ `ver o` = dos ] && { T=\; unset UNIX; DOS=ja; BSZ=512; NUL=NUL
                       alias remove=DEL; }

trap 'echo %nUSER-INTERRUPT%n ; exit 0' 2


#fehler()  { echo "%n demo.bish:  '$1'%n"; exit 1; }


stop()  { read "rest?        <Enter> "; }


frage()  {
   while echo "%n$1  [jne!]:  %c"
   do
     read rest
     case "$rest" in
       [jJ])  return 0 ;;
       [nN])  return 1 ;;
       [eE])  exit 0 ;;
       !)  read "rest?"`pwd`":> "; system "$rest"; continue ;;
       *)  continue ;;
     esac
   done
   return 2
}


echo "%e[2J%n demo-Skript für bish-Shell. H.Schellong%n"


getlines()  {
   [ $# -gt 1 ] && { static sl=1 cnt=$1 dat=$2; return 0; }
   line -$sl-$((sl+cnt-1)) "$dat" || return 1
   ((sl=sl+cnt))
   return 0
}


demo_getdir()  {
   [ ! -d "$1" -o "$1" = demonstration ] && {
      [ "$1" != demonstration ] && echo " Ungültiges Verzeichnis: '$1'"
      read "dir? Demo-Verzeichnis eingeben:  " rest
      demo_getdir "$dir"                                 # REKURSIV !!!
   }
}


demo()  {
   echo "
     Diese Demo-Aktion wird an einem von Ihnen
     anzugebenden Verzeichnis durchgeführt.
     Es wird die Summe der $BSZ-Byte-Einheiten festgestellt,
     die von allen Dateien und allen Verzeichnissen
     belegt werden.
     (Auf Disketten beträgt die Cluster-Größe $BSZ Byte.)
   "
   stop
   dir=demonstration
   demo_getdir $dir
   echo " Demo-Verzeichnis:  '$dir'%n"
   echo " Jetzt ggf. Disketten-Schreibschutz entfernen!"
   stop

   local  dblks=00000 fblks=00000 fsz=00000000000 rblks=00000
   local  verz einträge=0000 fblk=00000 dblk=00000 datei
   local  size=00000000000 rb=00000000000 prz=0000
   ifdef DOS  && verzchnsse="$dir `DIR $dir /s/b/a:d`"
   ifdef UNIX && verzchnsse="`find $dir -type d -print`"
   for verz in $verzchnsse
   do
      echo %r% Bearbeite $verz ...
      ifdef DOS  && DIR $verz /b/a:-d > $TMPS
      ifdef UNIX && ls -p $verz > $TMPS
      ifdef DOS  && einträge=`DIR $verz /b/a | wc -l`
      ifdef UNIX && einträge=`ls $verz | wc -l`
      ((einträge=einträge+2))
      fblk=$fblks dblk=$dblks
      getlines 20 $TMPS
      while dateien="`getlines`"
      do
         for datei in $dateien
         do
            ifdef UNIX && expr $datei : '/$' > $NUL && continue
            size=`fsize $verz$T$datei`  ((fsz=fsz+size))
            (( fblks= fblks + size/BSZ + (rb=((size%BSZ)+BSZ-1)/BSZ) ))
            ((rblks=rblks+rb))
         done
      done
      #einträge<4
      (( size= einträge<<5 ; fsz=fsz+size ;
         dblks= dblks + size/BSZ + (rb=((size%BSZ)+BSZ-1)/BSZ) ))
      ((rblks=rblks+rb))
      echo "%r     " $((fblks-fblk)) %tDateiblöcke
      echo "     " $((dblks-dblk)) %tVerzeichnisblöcke
   done
   [ -e $TMPS ] && remove $TMPS
   echo "%r%n Verzeichnis '$dir' wird auf DOS-Diskette belegen:%n"
   echo " $fblks%tDateiblöcke%n $dblks%tVerzeichnisblöcke"
   ((fblks=fblks+dblks))
   [ $fsz -lt $BSZ ] && fsz=$BSZ
   (( prz=(fblks*100)/(fsz/BSZ) - 100 ; rb=fblks-(fsz/BSZ) ))
   echo " $fblks %tBlöcke insgesamt (mit je $BSZ Byte)"
   echo " Komprimiert etwa $(( (fblks*35)/100 )) bis $(( (fblks*70)
          /100 )) Blöcke"
   echo " Eine 3½%"-1440K-Diskette hat $(([(80*2*18-33)*512]/BSZ)) Blöcke"
   echo "%n $rblks Blöcke mit weniger als $BSZ Byte;"
   echo " die Erhöhung durch die Blockbildung beträgt $prz%%%%%c"
   echo " oder $rb Blöcke."
   stop
   unset verzchnsse
}


echo " Die folgende Frage kann mit  j, n, e  (ja,nein,Ende)
 und ! für Kommando-Eingabe beantwortet werden.
 "
frage "        Demo-Aktion starten?"  &&  demo


echo % --- ENDE demo.bish ---



###  dezdual.bish  #############################################

#!/u/bin/bish

local n=0000 s=0000 d=0000 b=00000000
local e=...... p=...... k=00000000
local nk=00000 ok=00000

for n from 0 to 100 repeat
do
   for s from 0 to 4 repeat
   do
      let "d=n+s*51"
      b=$((2#,d)) e='. & ' p='' ok=0 nk=0
      [ s -eq 4 ] && e='/ \\%n'
      [ -z "$p" -a d -lt  10 ] && p='\ \ '
      [ -z "$p" -a d -lt 100 ] && p='\ '
      let "nk=8-${#b}"
      let "nk<0" && { let "ok=-nk"; nk=0; }
      #catv ok '. ' nk '. ' b /%n =2
      catv p d '. ' nk,k ok,,b "$e"
   done
   [ n -ge 50 ] && break
done




###  doku.bish  #############################################


T=\
[ ! -d doc ] && { echo Vermisse Verzeichnis .${T}doc; exit; }

LST=doc\??*.mn[ki]
expr "$LST" :: '\??%*%.mn' && {
   echo Keine DOKU-Dateien im Verzeichnis .\doc vorhanden!; exit; }

conv -L LST
KLST=""
for LK in $LST
do
   LK=`expr $LK : '^doc\%(..*%)%.mn'`
   KLST="$KLST$LK "
done
unset LST

KNAM=kommando_name
[ $# -ge 1 -a -n "$1" ] && KNAM=$1

[ $KNAM = kommando_name ] && KNAM=" "


until  test $KNAM &&
       test -s doc$T$KNAM.mni -o -s doc$T$KNAM.mnk
do
   echo "   $KLST%n"
   read KNAM"?   Kommando-Name: " rest
done


if test -s doc$T$KNAM.mni -a -s doc$T$KNAM.mnk
then
  until  [ "$KI" = k -o "$KI" = i ]
  do
     read KI"?   $KNAM.mnk oder $KNAM.mni? [ki]: "
  done
  KNAME=$KNAM.mnk
  [ "$KI" = i ] && KNAME=$KNAM.mni
else
  [ -s doc$T$KNAM.mnk ] && KNAME=$KNAM.mnk
  [ -s doc$T$KNAM.mni ] && KNAME=$KNAM.mni
fi

KNAME=doc$T$KNAME

for ZN by 22 repeat
do
   line -$ZN-$((ZN+22)) $KNAME || break
   read rest"?<<<<<<<<<Enter> "
done

echo %n% --- ENDE doku.bish ---



###  dskscan.bish  #############################################


set -f


getbytes()  {
   catv $1,3 =$2: && let `catv ,`==$1
   return
}

prn()  {
   prints sf08s12s12s12ss $1 $2 $3 $4 "  " "$5" >> $6
   return 0
}


getvals()  {
   local __n=____________ __e=___
   __e=`catv 0,1,$1 | base -b +10`
   let "__e==0" && return 1
   let "__e==16#e5" && { $2="" ; return 0; }
   catv 0,8,$1 | tr '\0\5' '\1\229' | catv =__n:
   expr "$__n" :__n '^%([^ ]%{1,%}%)' || __n=''
   catv 8,3,$1 | tr '\0' '\1' | catv =__e:
   expr "$__e" :__e '^%([^ ]%{1,%}%)' || __e=''
   ifset __e && __n="$__n.$__e"
   $2="$__n"
   $3=$( catv 11,1,$1 | base -b +10 )
   $4=$( catv 22,4,$1 | base -l +10 )
   $5=$( catv 26,2,$1 | base -w +10 )
   $6=$( catv 28,4,$1 | base -l +10 )
   return 0
}


readdir()  {
   local name=____________ attr=___ pos=___________
   local timdat=___________ cluster=___________ size=___________
   let "name=$2*512"
   seek $name $3
   while getbytes 32 buf
   do
      getvals buf g_n g_a g_t g_c g_s || return 0
      name="$g_n" attr=$g_a timdat=$g_t cluster=$g_c size=$g_s
      ifset name || continue
      let "attr&16#08" && continue
      [ "$name" == . -o "$name" == .. ] && continue
      echo "%r%c"; print -rn "$1/$name                "
      prints sf08s12s12s12ss $((2#, attr)) $cluster $size $timdat %
                             "  " "$1/$name" >> path.lst
      let "attr&16#10" && {
         seek + $3 pos
         readdir "$1/$name" $((Start+[cluster-2]*64)) $3
         seek $pos $3
      }
   done
   return
}


makepaths()  {
   [ -s dirs.lst ] || return
   local rdir=000 cl dotcl dotdotcl
   : > path.lst
   3< $1
   < dirs.lst
   rdir=0
   while read cl dotcl dotdotcl
   do
      let "dotdotcl==0" &&
         echo "$((++rdir))%t$cl" &&
         readdir $rdir $((Start+[cl-2]*64)) 3
   done
   ><<
   return 0
}


dirscan()  {
   local cl=0000000002 dcl=0000000000 ddcl=0000000000
   let "cl=cl"
   : > dirs.lst
   3< $1
   seek $((Start*512)) 3
   while :
   do
      echo "%r$cl          %c"
      getbytes 512 buf || break
      getvals buf g_n g_a g_t g_c g_s &&
         let "g_s==0&&g_a&16#10" && [ "$g_n" == . ] &&
            dcl="$g_c" &&
      catv 32,32,buf =buf &&
      getvals buf g_n g_a g_t g_c g_s &&
         let "g_s==0&&g_a&16#10" && [ "$g_n" == .. ] &&
            let "dcl==cl" && ddcl="$g_c" &&
               echo "$cl%t$dcl%t$ddcl" &&
               echo "$cl%t$dcl%t$ddcl" >> dirs.lst
      seek +$((++cl, 64*512-512)) 3
   done
   ><
   return 0
}


paths1cl()  {
   [ -s path.lst ] || return
   local at=00000000 cl=00000000 sz=0000000000 td=0000000000 n
   local at1=00000000 cl1=00000000 sz1=0000000000 td1=0000000000 n1
   local big=0
   : > path1.lst
   : > bigf.lst
   < path.lst
   while read at cl sz td n
   do
      big=1
      let "sz1>64*512&&cl>cl1&&(sz1+64*512-1)/(64*512)==cl-cl1" &&
         prn $at1 $cl1 $sz1 $td1 "$n1+" path1.lst && big=0
      let "big!=0&&sz1>64*512" && 
         prn $at1 $cl1 $sz1 $td1 "$n1" bigf.lst &&
         prn $at1 $cl1 $((64*512)) $td1 "$n1-" path1.lst
      let "sz<=64*512" &&
         prn $at $cl $sz $td "$n" path1.lst
      at1=$at cl1=$cl sz1=$sz td1=$td n1="$n"
   done
   let "big!=0&&sz1>64*512" && 
      prn $at1 $cl1 $sz1 $td1 "$n1" bigf.lst &&
      prn $at1 $cl1 $((64*512)) $td1 "$n1-" path1.lst
   ><
   return 0
}


copyx()  {
   [ -s path1.lst ] || return
   local at=00000000 cl=00000000 sz=0000000000 td=0000000000 n
   : > log
   3< $1
   < path1.lst
   mkdirs /scratch/DOS /scratch/NT /scratch/TEMP /scratch/RECYCLED
   while read at cl sz td n
   do
      expr "$n" :n '^1/%(..*%)' && n="/scratch/DOS/$n"
      expr "$n" :n '^2/%(..*%)' && n="/scratch/NT/$n"
      expr "$n" :n '^3/%(..*%)' && n="/scratch/C/$n" && continue
      expr "$n" :n '^4/%(..*%)' && n="/scratch/TEMP/$n"
      expr "$n" :n '^5/%(..*%)' && n="/scratch/RECYCLED/$n"
      let "2#$at&16#10" && echo "DIR  $n"
      let "2#$at&16#10" && { mkdirs "$n" || break; continue; }
      let "cl<2||sz<=0||sz>30000000" &|
	 expr "$n" :: '/NT/GWS.*' &|
	 expr "$n" :: '/NT/[A-Z0-9]%{1,%}%.[A-Z0-9]%{1,%}[+-]*$' &|
	 expr "$n" :: '/NT/NETSCAPE' &|
	 expr "$n" :: '/NT/T_ONLINE' &|
	 expr "$n" :: '/NT/ZDBENCH' &&
	 echo "cl=$cl  sz=$sz  $n" >> log && continue
      echo $(({Start+[cl-2]*64}*512)) $sz '>' "$n"
      catv $(({Start+[cl-2]*64}*512)),$sz,3 > "$n" || break
   done
   ><<
   return 0
}


#mkfat()  {
#   [ -s path1.lst ] || return
#   local at=00000000 cl=00000000 sz=0000000000 td=0000000000 n
#   3> fat.bin
#   seek $((250*512)) 3
#   < path1.lst
#   while read at cl sz td n
#   do
#      catv /%0$(()) =$((cl*2)),2,3
#   done
#   ><<
#   return 0
#}
#
#
#mkrdir()  {
#   [ -s path1.lst ] || return
#   local at=00000000 cl=00000000 sz=0000000000 td=0000000000 n
#   3> rdir.bin
#   < path1.lst
#   while read at cl sz td n
#   do
#   done
#   ><<
#   return 0
#}


#echo "readboot? [y]: %c"
#read buf
#[ "$buf" == y ] && readboot /dev/rhd0d Start

Start=$((1+2*250+[512*32]/512))

echo "dirscan? [y]: %c"
read buf
[ "$buf" == y ] && { dirscan /dev/rhd0d; exit; }

echo "makepaths? [y]: %c"
read buf
[ "$buf" == y ] && makepaths /dev/rhd0d

echo "paths1cl? [y]: %c"
read buf
[ "$buf" == y ] && paths1cl

echo "copyx? [y]: %c"
read buf
[ "$buf" == y ] && copyx /dev/rhd0d





###  dsl.bish  #############################################

#!/home/bin/bish


if [ "$1" == rdip ]
then
HTM1='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>OPEN</title>
<meta name="Author" content="Helmut Schellong">
<meta name="GENERATOR" content="bish Script-Interpreter v3.40">
<META HTTP-EQUIV="expires" CONTENT="0">
<META HTTP-EQUIV="refresh" CONTENT="30">
</head>
<body text="#000000" bgcolor="#CDAA7D" link="#000000" vlink="#000000" alink="#ffffff">
<br>&nbsp;
'
HTM2='<center>
<h1><a href="http://999.888.777.666:80/" target="_blank">HTTP-BSD [FreeBSD4.5]</a></h1>
<br>
<h1><a href="http://999.888.777.666:8180/" target="_blank">HTTP-UX [OpenUnix8]</a></h1>
<br>
<h1><a href="http://999.888.777.666:8080/TEL.HTM" target="_blank">HTTP-beck</a></h1>
<h1><a href="ftp://999.888.777.666:8021/" target="_blank">FTP-beck</a></h1>
<h1><a href="telnet://999.888.777.666:8023" target="_blank">TELNET-beck</a></h1>
</center>
<ul>
<pre>
'
HTM3='</pre></ul></body></html>
'
Ftp="open schellong.com
user u8888888 rrrrrrrr
binary
put /tmp/wanhtm /cie/server.html
quit
"
catv Ftp > /tmp/wanftp
Ip=000000000000000
ip=000000000000000
tm=-500
st=01
   while sleep $st
         catv 0 =ip: < /tmp/wanip
	 [ "$ip" != x ]
   do
      ifset ip || continue
      st=10
      let "$SECONDS-tm>300" && {
	 tm=$SECONDS
	 ping www.t-online.de > /dev/null
      }
      cmpv ip Ip && continue
      Ip=$ip
      expr "$HTM2" :Hbuf '999.888.777.666' += "$ip"
      > /tmp/wanhtm
      catv HTM1 Hbuf
      [ -s /tmp/wanipa ] && cat /tmp/wanipa
      catv HTM3
      ><
      ftp -n < /tmp/wanftp
   done
   exit 0
fi


if [ "$1" == rdtm ]
then
Ip=++++++++++++++++++++
Ip0=++++++++++++++++++++
ip=000000000000000
ipne=000000000000000
size=0000000000
size0=0000000000
neq=0000
tne=0000
nstart=0000
offs=000000
   while fstat -sv size /tmp/wanout
         [ size -lt 3500 ]
   do
      [ size -gt offs ] && catv $offs,$((size-offs)),0  < /tmp/wanout
      offs=$size
      let "++nstart>100" && exit 0
      sleep -m 400
   done
   ipne=0 nstart=0
   while :
   do
      [ $ipne != 0 ] && let "$SECONDS-tne>=15||nstart==0" && {
	 Ip0=$ipne
         echo $ipne%c > /tmp/wanip
         echo $ipne >> /tmp/wanipa
         ipne=0 nstart=1
      }
      fstat -sv size /tmp/wanout
      [ size -gt offs ] && catv $offs,$((size-offs)),0  < /tmp/wanout
      offs=$size
      [ size -eq size0 ] && {
         let "++neq>2" && exit 0
         sleep 4
	 continue
      }
      neq=0 size0=0 offs=0
      tr '\27' '\10' < /tmp/wanout > /tmp/wanz
      : > /tmp/wanout
      ip=
      < /tmp/wanz
      while readl Z
      do
         expr "$Z" :: '^%[11;[234][0-9]H[0-9. ]%{1,}' || continue
         expr "$Z" :col '^....%(..%)H' || continue
         let "col<24||col>41" && continue
         let "col-=24"
         expr "$Z" :ip 'H%([0-9. ]%{1,}%)'
         catv ip =$col,,Ip
      done
      ><
      ifset ip || continue
      expr "$Ip" :ip %
         '%([0-9]%{1,3}%.[0-9]%{1,3}%.[0-9]%{1,3}%.[0-9]%{1,3}%)+*$' || continue
      cmpv ip Ip0 && continue
      ipne=$ip tne=$SECONDS
   done
fi

#^[[11;24..41H
#[ ...]ip_addr(-teil)


: > /tmp/wanout
: > /tmp/wanip
dsl.bish rdip &
dsl.bish rdtm &
Pid=$!
telnet dsl >> /tmp/wanout
#kill $Pid
echo x%c > /tmp/wanip
wait

exit 0



###  ebits.bish  #############################################

#!/u/bin/bish

set -f

N=-001

while readl Z
do
   expr "$Z" :txt ' %(%w%{1,}%) *: *%d' || continue
   let ++N; prints vsf03 N $N
   prints s-25s-27ss14 '//' '"' '<' '"'
   prints sssss '#define D_fehler_' $N '_en  ' "%"$txt" '"'
   #prints ssss-41s '#define D_fehler_' $N '_en  ' "%"$txt" '"'
done

:



###  edit.bish  #############################################

#!/u/bin/bish

FLST='mu2000/*.[ch] upc3/*.[ch] share/*.[ch] lib/*.[ch]'

set ge:.1000 ee:.1000
ge= ee=

catv 0 =PATT
for sm in $PATT
do
   ge="$ge -e \<$sm\>"
done
ee=$PATT
expr "$ee" :ee '[ %t%r%n]%{1,}' += '\|'

FILES=$(extern grep -l $ge $FLST)
$echo $FILES%n$ee
$exit

for F in $FILES
do
   gvim -f -n "+/$ee" "$F"
done

:




###  ketelcan.bish  #############################################

#!/u/bin/bish



MakeGenMsg()  {
   local cmd=000 rest=00000 v=.. n=0
   local systyp=000 sysidx=000 msgtyp=000
   local subsys=000 subidx=000 functn=000
   local datobj=000 datele=000 msgidx=000
   local id=0000000000 d0=000 d1=000 d2=000
   while
   d0=$((16#, (datobj&31)<<3|functn&7))
   d1=$((16#, datele<<2|datobj>>5))
   d2=$((16#, msgidx))
   id=$((16#, systyp<<24|sysidx<<16|msgtyp<<14|subsys<<10|subidx<<2|functn>>3))
   conv -u id d0 d1 d2
   for 2 v n in id 8 d0 2 d1 2 d2 2
   do
      prints vsf0$n $v ${{v}}
   done
   echo "
%tID + Data[3]:  $id  $d0 $d1 $d2
%t   systyp   :  1 value  [$systyp]
%t   sysidx   :  2 value  [$sysidx]
%t   msgtyp   :  3 value  [$msgtyp]
%t   subsys   :  4 value  [$subsys]
%t   subidx   :  5 value  [$subidx]
%t   functn   :  6 value  [$functn]
%t   datobj   :  7 value  [$datobj]
%t   datele   :  8 value  [$datele]
%t   msgidx   :  9 value  [$msgidx]
%tReturn      :  R
%tExit        :  E
%t               _%b%c"
   do
      read cmd rest
      case "$cmd" in
        1)  systyp=$rest;;
        2)  sysidx=$rest;;
        3)  msgtyp=$rest;;
        4)  subsys=$rest;;
        5)  subidx=$rest;;
        6)  functn=$rest;;
        7)  datobj=$rest;;
        8)  datele=$rest;;
        9)  msgidx=$rest;;
        R)  break;;
        E)  exit 0;;
        *)  echo "%a%c"; continue;;
      esac
   done
   return 0
}


SplitGenMsg()  {
   local cmd=000 rest=00000000 v=.. n=0
   local systyp=000 sysidx=000 msgtyp=000
   local subsys=000 subidx=000 functn=000
   local datobj=000 datele=000 msgidx=000
   local id=0000000000 d0=000 d1=000 d2=000
   #id=501ac00 d0=31 d1=5 d2=0
   while  
   let "systyp=16#$id>>24&8#37"  "sysidx=16#$id>>16&8#377" %
       "msgtyp=16#$id>>14&8#3"   "subsys=16#$id>>10&8#17" %
       "subidx=16#$id>> 2&8#377" "functn=(16#$id&8#3)<<3|16#$d0&8#7" %
       "datobj=(16#$d0>>3&8#37)|(16#$d1&8#3)<<5" %
       "datele= 16#$d1>>2&8#77"  "msgidx= 16#$d2"
   conv -u id d0 d1 d2
   for 2 v n in id 8 d0 2 d1 2 d2 2
   do
      prints vsf0$n $v ${{v}}
   done
   echo "
%t   systyp=$systyp  sysidx=$sysidx  msgtyp=$msgtyp
%t   subsys=$subsys  subidx=$subidx  functn=$functn
%t   datobj=$datobj  datele=$datele  msgidx=$msgidx
%tInput ID   :  id  value  [$id]  (hex)
%tInput data0:  d0  value  [$d0]  (hex)
%tInput data1:  d1  value  [$d1]  (hex)
%tInput data2:  d2  value  [$d2]  (hex)
%tReturn     :  R
%tExit       :  E
%t              _%b%c"
   do
      read cmd rest
      case "$cmd" in
        id)  id=$rest;;
        d0)  d0=$rest;;
        d1)  d1=$rest;;
        d2)  d2=$rest;;
        R)  break;;
        E)  exit 0;;
        *)  echo "%a%c"; continue;;
      esac
   done
   return 0
}


MakeCanID()  {
   local cmd=000 rest=00000
   local systyp=000 sysidx=000 msgtyp=000
   local variant=000 data0=000 data9=000
   local id=0000000000
   while
   id=$((16#, systyp<<24|sysidx<<16|msgtyp<<14|variant<<10|data0<<2|data9))
   conv -u id
   prints vsf08 id $id
   echo "
%tID        :  $id
%t   systyp :  1 value  [$systyp]
%t   sysidx :  2 value  [$sysidx]
%t   msgtyp :  3 value  [$msgtyp]
%t   variant:  4 value  [$variant]
%t   data0  :  5 value  [$data0]
%t   data9  :  6 value  [$data9]
%tReturn    :  R
%tExit      :  E
%t             _%b%c"
   do
      read cmd rest
      case "$cmd" in
        1)  systyp=$rest;;
        2)  sysidx=$rest;;
        3)  msgtyp=$rest;;
        4)  variant=$rest;;
        5)  data0=$rest;;
        6)  data9=$rest;;
        R)  break;;
        E)  exit 0;;
        *)  echo "%a%c"; continue;;
      esac
   done
   return 0
}


SplitCanID()  {
   local cmd=000 rest=00000000
   local systyp=000 sysidx=000 msgtyp=000
   local variant=000 data0=000 data9=000
   local id=0000000000
   while  
   let "systyp=16#$id>>24&8#37"  "sysidx=16#$id>>16&8#377" %
       "msgtyp=16#$id>>14&8#3"   "variant=16#$id>>10&8#17" %
       "data0=16#$id>>2&8#377"   "data9=16#$id&8#3"
   conv -u id
   prints vsf08 id $id
   echo "
%t   systyp=$systyp  sysidx=$sysidx  msgtyp=$msgtyp
%t   variant=$variant  data0=$data0  data9=$data9
%tInput ID:  id  value  [$id]  (hex)
%tReturn  :  R
%tExit    :  E
%t           _%b%c"
   do
      read cmd rest
      case "$cmd" in
        id)  id=$rest;;
        R)  break;;
        E)  exit 0;;
        *)  echo "%a%c"; continue;;
      esac
   done
   return 0
}


local cmd=... rest=...

while echo "
%tMakeGenMsg :  mg
%tSplitGenMsg:  sg
%tMakeCanID  :  mc
%tSplitCanID :  sc
%tExit       :  E
%t              _%b%c"
do
   read cmd rest
   case "$cmd" in
     mg)  MakeGenMsg;;
     sg)  SplitGenMsg;;
     mc)  MakeCanID;;
     sc)  SplitCanID;;
      E)  break;;
      *)  echo "%a%c"; continue;;
   esac
done





###  emailadr.bish  #############################################

#!/u/bin/bish
#bish-Script 'emailadr.bish'
#Copyright (c) 1998  Helmut Schellong



let 0`ver n`'<242' && {
   echo "Dieses Script benötigt mindestens bish-Version 2.42 !"
   ver; exit 1
}
[ `ver w` == shw ] && read "-?<Enter> "

T=/
[ `ver s` == dos ] && T=\
Ln=NNN Lc=0000 Nc=0000
inp="`prints s80-`"
mail="$inp"
name="$inp"
Lnam="$inp"



Lnorm()  {
   [[ $Ln == J* ]] || return
   [ -s "$1" ] || return
   grep -imq '^ *<DT><H3' "$1" || return
   local h3nam lnot
   Des=''
   [[ $Ln == ?J* ]] && lnot=j
   cat "$1" | {
      > "$1"
      while readl zeile
      do
         ifset Des && {
            expr "$zeile" :: '^ *<[Dd][Tt]><[Aa]' && {
               expr "$zeile" :mail '^%(..*>%)[^<>]*</[Aa]>%r*$'
               expr "$zeile" :name '>%([^<>]*%)</[Aa]>%r*$'
               expr "$zeile" :inp '>[^<>]*%(</[Aa]>%r*%)$'
               catv mail h3nam /. name inp /%j
               continue
            }
            expr "$zeile" :: '^ *<[Dd][Ll]><[Pp]>' &&
               catv /%j zeile =:,,Des && continue
            expr "$zeile" :: '^ *</[Dd][Ll]><[Pp]>' &&
               ifset lnot &| catv Des /%j zeile /%j && Des=''
            continue
         }
         expr "$zeile" :: '^ *<[Dd][Tt]><[Hh]3' && Des="$zeile" &&
            expr "$zeile" :h3nam '>%([^<>]*%)</[Hh]3>%r*$'
         ifset Des || catv zeile /%j
      done
      ><
   }
   unset Des
   return 0
}



GetAN()  {
   local l=${#W} c=0000 o=0000 sc=n an
   while let "o<l"
   do
      expr "`catv $o,,W`" :an '^%([^"(,<]*%)' || an=''
      c=${#an} sc=e
      let "o+=c, o<l" && catv $o,1,W =sc
      let c && expr "$an" :: '[^ %t]%{1,%}' && {
         [ "x$sc" != 'x<' ] && expr "$an" :an '%([^<> %t]%{1,%}%)' &&
            print -r "a $an"
         [ "x$sc" == 'x<' ] &&
            expr "$an" :an '^[ %t]*%(.*[^ %t]%)[ %t]*$' &&
            conv -"t ?" an && print -r "n $an"
      }
      an=''
      case "$sc" in
        e)  continue ;;
        ,)  echo "e ," ; let --o ;;
        <)  expr "`catv $o,,W`" :an '^<%([^>]*%)' ;;
        ()  expr "`catv $o,,W`" :an '^(%([^)]*%)' ;;
        ")  expr "`catv $o,,W`" :an '^"%([^"]*%)' ;;
      esac
      let "o+=${#an}+2"
      ifset an || continue
      [ "x$sc" == 'x<' ] && print -r "a $an" && continue
      conv -"t ?" an && print -r "n $an"
   done
   let l && echo "e :"
   return 0
}



ABook()  {
   case "$1" in

   tol_htm)
   while :
   do
      echo "%nGeben Sie das Verzeichnis der T-Online-Software an,"
      echo "in der Regel  c:${T}t_online  oder  c:${T}decoder"
      read "inp?        :  "
      ifset inp || return
      conv -t/${T}F$T inp
      [ -d "$inp" ] && break
      echo "%t$inp  ist kein Verzeichnis!"
   done

   expr "$inp" :: '[?*[]' && {
      echo "$inp": Bitte keine Zeichen "?*["; return; }
   Ziel=addrimp.htm

   addr=____________
   [ -d "$inp${T}email" ] && addr=addrbook.lst inp="$inp${T}email"
   [ -d "$inp${T}email20" ] && addr=adressen.dat inp="$inp${T}email20"
   [ "$addr" != addrbook.lst -a "$addr" != adressen.dat ] && {
      echo Kein eMail-Verzeichnis gefunden!; return; }
   : $inp${T}*${T}$addr
   [ "$]" -eq 0 ] && echo Keine Adressendatei gefunden! && return

   echo '<!DOCTYPE NETSCAPE-Addressbook-file-1>' > $Ziel
   echo '<TITLE>Adreßbuch</TITLE>' >> $Ziel
   echo '<H1>Adreßbuch</H1>%n%n<DL><p>' >> $Ziel

   for inp in  $inp${T}*${T}$addr
   do
      [ -s "$inp" ] || continue
      grep -q '^[^=%t]*[=%t][^=%t%r%n]%{2,%}$' $inp || continue
      < "$inp"
      while [ $addr == adressen.dat ] && readl zeile
      do
         conv -l zeile
         expr "$zeile" :: '^%[adressen]$' && break
      done
      while readl zeile
      do
         expr "$zeile" :: '^%[' && break
         expr "$zeile" :: '^[^=%t]*[=%t][^=%t]%{3,%}$' || continue
         expr "$zeile" :name '^%([^=%t]*%)[=%t]' || name=''
         expr "$zeile" :mail '[=%t]%([^=%t]*%)$' || continue
         print -r "<DT><A HREF=%"mailto:$mail%">$name</A>" >> $Ziel
      done
      ><
      [ $addr != adressen.dat ] && continue
      < "$inp"
      while readl zeile
      do
         conv -l zeile
         expr "$zeile" :: '^%[verteiler]$' && break
      done
      while readl zeile
      do
         expr "$zeile" :: '^%[' && break
         expr "$zeile" :: '^[^=,]%{1,%}=[^=]%{1,%}$' || continue
         expr "$zeile" :name '^%([^=]*%)='
         print -r "<DT><H3 FOLDED>$name</H3>" >> $Ziel
         echo "<DL><p>" >> $Ziel
         conv -"t ?t, " zeile
         for name in `expr "$zeile" : '=%([^=]*%)$'`
         do
            conv -"t? " name
            zeile="`grep -m "^$name"'=[^=%r%n]%{2,%}$' $inp`" ||
                                                     continue
            expr "$zeile" :mail '=%([^=%r%n]*%)$' || continue
            print -r "<DT><A HREF=%"mailto:$mail%">$name</A>" %
                   >> $Ziel
         done
         echo "</DL><p>" >> $Ziel
      done
      ><
   done

   echo '</DL><p>' >> $Ziel
   return 0
   ;;

   ldi_htm)
   local gon=0 s=`prints sf040-`
   Ziel=address.htm
   [ -e address.htm ] && Ziel=ldi_adr.htm
   : ?*.ldi
   [ "$]" -eq 0 ] && echo "Quell-Datei '*.ldi' fehlt!" && return
   echo '<!DOCTYPE NETSCAPE-Addressbook-file-1>' > $Ziel
   echo '<TITLE>Adreßbuch</TITLE>' >> $Ziel
   echo '<H1>Adreßbuch</H1>%n%n<DL><p>' >> $Ziel
   W=`prints sf080-`
   Des=`prints sf0200-`
   Lc=0 Nc=0
   for addr in ?*.ldi
   do
      grep -q '^dn: *cn=' $addr || continue
      Des='' s='' gon=0
      < $addr
      while readl zeile
      do
         [ -z "$zeile" ] && { >> $Ziel
            conv -"t<{t>}t&+" name nick Des
            [ $gon == 1 ] && {
               ifset name || name=L$((++Lc))
               print -r "<DT><H3 FOLDED$nick>$name</H3>" &&
               echo "<DL><p>%n</DL><p>"
            }
            [ $gon == 2 ] && echo "</DL><p>"
            [ $gon == 0 ] && {
               ifset name || name=N$((++Nc))
               print -r "<DT><A HREF=%"mailto:$mail%"$nick>$name</A>"
               ifset Des && catv /"<DD>" Des /%j
            }
            ><
            Des='' s='' gon=0
            continue
         }
         if expr "$zeile" :: '^[a-zA-Z0-9]%{1,%}:%{1,2%}'
         then
            expr "$zeile" :s '^%([a-zA-Z0-9]%{1,%}%):%{1,2%}'
            conv -l s
            expr "$zeile" :W ': %(.*%)$'
            [ "`expr "$zeile" : '^[^:]*%(::*%) '`" == :: ] &&
               print -ru2 "base64-kodiert!: '$W'"
         else
            expr "$zeile" :W '^ %(.*%)$'
         fi
         case "$s" in
           dn)           name='' mail='' nick=''
                         expr " $W" :name '[, ]cn=%([^,]%{1,%}%)'
                         expr " $W" :mail '[, ]mail=%([^, ]%{1,%}%)' ;;
           cn)           ifset name || name="$W" ;;
           mail)         ifset mail || mail="$W" ;;
           ?*nickname)   nick=" NICKNAME=%"$W%"" ;;
           description)  ifset Des && catv '/<BR>%j' W =:,,Des
                         ifset Des || catv W =:,,Des ;;
           objectclass)  expr "$W" :: 'group[Oo]f[Nn]ames' && gon=1 ;;
           member)
             conv -"t<{t>}t&+" name nick
             [ $gon != 2 ] && gon=2 && {
                ifset name || name=L$((++Lc))
                Lnam="$name"
                print -r "<DT><H3 FOLDED$nick>$name</H3>" >> $Ziel
                echo "<DL><p>" >> $Ziel
             }
             name= mail=
             expr " $W" :name '[, ]cn=%([^,]%{1,%}%)'
             expr " $W" :mail '[, ]mail=%([^, ]%{1,%}%)'
             ifset name || name="${Lnam}.N$((++Nc))"
             conv -"t<{t>}t&+" name
             print -r "<DT><A HREF=%"mailto:$mail%">$name</A>" >> $Ziel
             ;;
         esac
      done
      ><
   done
   unset Des W
   echo '</DL><p>' >> $Ziel
   return 0
   ;;

   htm_tol)
   local quelle=address.htm
   [ -s $quelle ] || {
      echo "Quell-Datei '.${T}$quelle' fehlt!"; return; }
   grep -q '<!DOCTYPE NETSCAPE-Addressbook-file-1>' $quelle || {
      echo "'.${T}$quelle': Dateiinhalt fehlerhaft!"; return; }
   while :
   do
      echo "%nGeben Sie das Verzeichnis der T-Online-Software an,"
      echo "in der Regel  c:${T}t_online"
      read "inp?        :  "
      ifset inp || return
      conv -t/${T}F$T inp
      [ -d "$inp" ] && break
      echo "%t$inp  ist kein Verzeichnis!"
   done

   expr "$inp" :: '[?*[]' && {
      echo "$inp": Bitte keine Zeichen "?*["; return; }

   [ -d "$inp${T}email20" ] || {
      echo Kein eMail-Verzeichnis gefunden!; return; }
   inp=$inp${T}email20
   : $inp${T}*${T}adressen.dat
   [ "$]" -eq 0 ] && echo Keine Adressendatei gefunden! && return

   for Ziel in $inp${T}*${T}adressen.dat
   do  echo $Ziel ; done
   echo
   for Ziel in $inp${T}*${T}adressen.dat
   do
      echo $Ziel
      read "inp?verwenden?[jn]:  "
      [ "$inp" == j -o "$inp" == J ] && break
      Ziel=N
   done
   [ "$Ziel" == N ] && return
   expr "$Ziel" :name '^%(..*%)'$T'[^'$T']*$'
   cat $Ziel > $name${T}addr_bish.dat
   echo "Kopiere $Ziel  -->  $name${T}addr_bish.dat"

   local h3=000 hm=000 hi=000
   < $quelle
   while readl zeile
   do
      expr "$zeile" :: '^ *<[Dd][Tt]><[Hh]3' &&
                       let ++h3 "hm= h3>hm ? h3 : hm"
      expr "$zeile" :: '^ *</[Dd][Ll]><[Pp]>' && let --h3
   done
   ><
   Lc=0 Nc=0
   : > aaaa_bish.tmp ; : > vvvv_bish.tmp
   for hi from 0 to $hm repeat
   do
      < $quelle ; h3=0
      while readl zeile
      do
         expr "$zeile" :: '^ *<[Dd][Tt]><[Hh]3' && {
            let ++h3==hi && { hm=''
               expr "$zeile" :inp '>%([^<>]*%)</[Hh]3>%r*$'
               ifset inp || inp=L$((++Lc)) ; Lnam="$inp"
               catv inp /= >> vvvv_bish.tmp; }
         }
         expr "$zeile" :: '^ *<[Dd][Tt]><[Aa]' && {
            expr "$zeile" :mail '"mailto:%([^:"]*%)"'
            expr "$zeile" :name '>%([^<>]*%)</[Aa]>%r*$'
            let "hi==0&&h3==0" && {
               ifset name || name=N$((++Nc))
               catv name /= mail /%j >> aaaa_bish.tmp
            }
            let "hi>0&&h3==hi" && { 
               ifset name || name="${Lnam}.N$((++Nc))"
               catv /$hm name >> vvvv_bish.tmp ; hm=,
               grep -q "^$name=" aaaa_bish.tmp ||
                  catv name /= mail /%j >> aaaa_bish.tmp
            }
         }
         expr "$zeile" :: '^ *</[Dd][Ll]><[Pp]>' &&
           let --h3 "hi>0&&h3+1==hi" && echo >> vvvv_bish.tmp
      done
      ><
   done
   : > zzzz_bish.tmp
   [ -s aaaa_bish.tmp ] && {
      grep -iq '^%[adressen]' $Ziel ||
         echo '[ADRESSEN]' > zzzz_bish.tmp && {
         cat $Ziel >> zzzz_bish.tmp
         cat zzzz_bish.tmp > $Ziel ; }
      expr "`grep -inm '^%[adressen]' $Ziel`" :hi '^%([^:]*%)'
      line -1-$hi $Ziel > zzzz_bish.tmp
      cat aaaa_bish.tmp >> zzzz_bish.tmp
      line -$((hi+1))- $Ziel >> zzzz_bish.tmp
      cat zzzz_bish.tmp > $Ziel
   }
   [ -s vvvv_bish.tmp ] && {
      grep -iq '^%[verteiler]' $Ziel ||
         echo '%n[VERTEILER]' >> $Ziel
      expr "`grep -inm '^%[verteiler]' $Ziel`" :hi '^%([^:]*%)'
      line -1-$hi $Ziel > zzzz_bish.tmp
      cat vvvv_bish.tmp >> zzzz_bish.tmp
      line -$((hi+1))- $Ziel >> zzzz_bish.tmp
      cat zzzz_bish.tmp > $Ziel
   }
   [ $T == \ ] && { DEL aaaa_bish.tmp ; DEL vvvv_bish.tmp
                    DEL zzzz_bish.tmp ; }
   [ $T == / ] && rm aaaa_bish.tmp vvvv_bish.tmp zzzz_bish.tmp
   return 0
   ;;

   htm_agent)
   local quelle=address.htm
   Ziel=agentimp.dat
   [ -s $quelle ] || {
      echo "Quell-Datei '.${T}$quelle' fehlt!"; return; }
   grep -q '<!DOCTYPE NETSCAPE-Addressbook-file-1>' $quelle || {
      echo "'.${T}$quelle': Dateiinhalt fehlerhaft!"; return; }

   Des="`prints s1000-`"
   local h3=000 hm=000 hi=000
   < $quelle
   while readl zeile
   do
      expr "$zeile" :: '^ *<[Dd][Tt]><[Hh]3' &&
                       let ++h3 "hm= h3>hm ? h3 : hm"
      expr "$zeile" :: '^ *</[Dd][Ll]><[Pp]>' && let --h3
   done
   ><
   Lc=0 Nc=0
   :>$Ziel
   for hi from 0 to $hm repeat
   do
      < $quelle ; h3=0 Des=''
      while readl zeile
      do
         ifset zeile || continue
         expr "$zeile" :: '^ *<' || {
            let hi==0 && ifset Des &&
               expr "$zeile" : '^%([^<%r]*%)' | catv "/ ^ " 0 =:,,Des
            continue
         }
         let hi==0 && ifset Des && {
            catv "/Comments: " 68,Des /%j >> $Ziel
            inp=68
            while catv $inp,76,Des =name:
            do  let "inp+=76"; catv "/ " name /%j >> $Ziel;  done
            Des=''
         }
         let hi==0 && expr "$zeile" :: '^ *<[Dd][Dd]>' && Des='' &&
            expr "$zeile" : '<[Dd][Dd]>%([^<%r]*%)' | catv =:,,Des
         expr "$zeile" :: '^ *<[Dd][Tt]><[Hh]3' && {
            let ++h3==hi && { hm=''
               expr "$zeile" :inp '>%([^<>]*%)</[Hh]3>%r*$'
               ifset inp || inp=L$((++Lc)) ; Lnam="$inp"
               catv "/Name: " inp "/%jAddresses: " >> $Ziel; }
         }
         expr "$zeile" :: '^ *<[Dd][Tt]><[Aa]' && {
            expr "$zeile" :mail '"mailto:%([^:"]*%)"'
            expr "$zeile" :name '>%([^<>]*%)</[Aa]>%r*$'
            let "hi==0&&h3==0" && {
               ifset name || name=N$((++Nc))
               catv "/Name: " name "/%jAddresses: " mail /%j >> $Ziel
            }
            let "hi>0&&h3==hi" && { 
               ifset name || name="${Lnam}.N$((++Nc))"
               conv -'t({t)}t"`' name
               catv "/$hm" mail "/ (" name "/)%j" >> $Ziel
               hm=" "
            }
         }
         expr "$zeile" :: '^ *</[Dd][Ll]><[Pp]>' &&
            let --h3 "hi>0&&h3+1==hi" #&& echo >> $Ziel
      done
      ><
   done
   unset hm hi h3 Des
   local flg=000000 b
   cat $Ziel | {
      : > $Ziel
      >> $Ziel
      while readl zeile
      do
         expr "$zeile" :b '^%([a-zA-Z][^: ]*%):' || b=unknown
         case "$b" in
            Name)  let "flg&&!(flg&2)" && catv "/Addresses: %j"
                   let "flg&&!(flg&4)" && catv "/Comments: %j"
                   let flg && catv "/Field-Text: %j%j"
                   flg=1 ;;
            Addresses)  let "flg|=2" ;;
            Comments)   let "flg|=4" ;;
         esac
         catv zeile /%j
      done
      let "flg&&!(flg&2)" && catv "/Addresses: %j"
      let "flg&&!(flg&4)" && catv "/Comments: %j"
      let flg && catv "/Field-Text: %j%j"
      ><
   }
   return 0
   ;;

   htm_ldi)
   local quelle=address.htm
   Ziel=addr_imp.ldi
   [ -s $quelle ] || {
      echo "Quell-Datei '.${T}$quelle' fehlt!"; return; }
   grep -q '<!DOCTYPE NETSCAPE-Addressbook-file-1>' $quelle || {
      echo "'.${T}$quelle': Dateiinhalt fehlerhaft!"; return; }

   Des="`prints s1000-`"
   local h3=000 hm=000 hi=000 end
   < $quelle
   while readl zeile
   do
      expr "$zeile" :: '^ *<[Dd][Tt]><[Hh]3' &&
                       let ++h3 "hm= h3>hm ? h3 : hm"
      expr "$zeile" :: '^ *</[Dd][Ll]><[Pp]>' && let --h3
   done
   ><
   Lc=0 Nc=0
   :>$Ziel
   for hi from 0 to $hm repeat
   do
      < $quelle ; h3=0 Des='' end=''
      while readl zeile
      do
         ifset zeile || continue
         expr "$zeile" :: '^ *<' || {
            let hi==0 && ifset Des &&
               expr "$zeile" : '^%([^<%r]*%)' | catv "/ " 0 =:,,Des
            continue
         }
         let hi==0 && ifset Des && {
            catv "/description: " 65,Des /%j >> $Ziel
            inp=65
            while catv $inp,76,Des =name:
            do  let "inp+=76"; catv "/ " name /%j >> $Ziel;  done
            Des=''
         }
         let hi==0 && expr "$zeile" :: '^ *<[Dd][Dd]>' && Des='' &&
            expr "$zeile" : '<[Dd][Dd]>%([^<%r]*%)' | catv =:,,Des
         ifset end && ifset Des || echo >> $Ziel && end=''
         expr "$zeile" :: '^ *<[Dd][Tt]><[Hh]3' && {
            let ++h3==hi && { hm=''
               expr "$zeile" :inp '>%([^<>]*%)</[Hh]3>%r*$'
               ifset inp || inp=L$((++Lc)) ; Lnam="$inp"
               catv "/dn: cn=" inp "/%jcn: " inp /%j >> $Ziel
               catv "/objectclass: top%jobjectclass: groupOfNames%j" %
                     >> $Ziel
            }
         }
         expr "$zeile" :: '^ *<[Dd][Tt]><[Aa]' && {
            expr "$zeile" :mail '"mailto:%([^:"]*%)"'
            expr "$zeile" :name '>%([^<>]*%)</[Aa]>%r*$'
            let "hi==0&&h3==0" && { end=1
               ifset name || name=N$((++Nc))
               catv "/dn: cn=" name "/,mail=" mail /%j >> $Ziel
               catv "/cn: " name /%j >> $Ziel
               catv "/objectclass: top%jobjectclass: person%j" >> $Ziel
               #description
               catv "/mail: " mail /%j >> $Ziel
               expr "$zeile" :name 'NICKNAME="%([^"]%{1,76%}%)"' &&
                  catv "/xmozillanickname: " name /%j >> $Ziel
            }
            let "hi>0&&h3==hi" && {
               ifset name || name="${Lnam}.N$((++Nc))"
               catv "/member: cn=" name "/,mail=" mail /%j >> $Ziel
            }
         }
         expr "$zeile" :: '^ *</[Dd][Ll]><[Pp]>' &&
            let --h3 "hi>0&&h3+1==hi" && echo >> $Ziel
      done
      ><
   done
   unset Des
   return 0
   ;;

   agent_htm)
   local na=0000 an=xx s=`prints sf040-`
   local offs=0000000000 nc0=0000
   Ziel=address.htm
   [ -e $Ziel ] && Ziel=agentadr.htm
   : agentexp*
   [ "$]" -eq 0 ] && echo "Quell-Datei 'agentexp*' fehlt!" && return
   W=`prints sf080-`
   Des=`prints sf0200-`
   Lc=0 Nc=0
   3> $Ziel
   print -u3 '<!DOCTYPE NETSCAPE-Addressbook-file-1>'
   print -u3 '<TITLE>Adreßbuch</TITLE>'
   print -u3 '<H1>Adreßbuch</H1>%n%n<DL><p>'
   for addr in agentexp*
   do
      grep -qi '^Name: ' $addr || continue
      Des='' s='' na=0 offs=0
      < $addr
      while readl zeile
      do
         ifset zeile || {
            conv -"t<{t>}t&+" name Des
            let "na&16&&na&1" && print -u3 "</DL><p>"
            let "!(na&16)&&na&1" && {
               #let "na&8" || catv / =$offs,,3:
               Nc=$nc0 ; ifset name || name=N$((++Nc))
               catv '/<DT><A HREF="mailto:' mail %
                    '/">' name '/</A>%j' =$offs,,3:
            }
            ifset Des && let "!(na&16)&&na&8" &&
               catv /"<DD>" Des /%j =3
            Des='' s='' na=0 offs=0
            continue
         }
         if expr "$zeile" :: '^[a-zA-Z0-9-]%{1,%}:%{1,2%}'
         then
            expr "$zeile" :s '^%([a-zA-Z0-9-]%{1,%}%):%{1,2%}'
            conv -l s
            expr "$zeile" :W ': %(.*%)$'
            [ "`expr "$zeile" : '^[^:]*%(::*%) '`" == :: ] &&
               print -ru2 "base64-kodiert!: '$W'"
         else
            expr "$zeile" :W '^ %(.*%)$' || W=''
         fi
         case "$s" in
           field-text)  : ;;
           name)        name="$W" mail='' ;;
           comments)    ifset Des && catv '/<BR>%j' W =:,,Des
                        ifset Des || catv W =:,,Des ;;
           addresses)
             set -f
             for 2 an nick  in  `GetAN`
             do
                [ "$an" != e -a $na -eq 0 ] && {
                   let "na|=1" ; offs=`seek + 3`
                   conv -"t<{t>}t&+" name ; inp='' ; Lnam="$name"
                   ifset Lnam || Lnam=L$((++Lc))
                   catv "/<DT><H3 FOLDED>" Lnam "/</H3>%j<DL><p>%j" =3
                }
                case "$an" in
                  a)  mail="$nick"; let "na|=2" ;;
                  n)  conv -"t? " nick; inp="$nick" name="$nick"
                      let "na|=4" ;;
                  e)  let "na&6" || continue
                      let "na&2" || print -u2 "eMail-Adresse fehlt!" &&
                                    mail="name@unknown_host.de"
                      nc0=$Nc
                      ifset inp || inp="${Lnam}.N$((++Nc))"
                      conv -"t<{t>}t&+" inp
                      catv '/<DT><A HREF="mailto:' mail %
                           '/">' inp '/</A>%j' =3
                      let 'na|= na&8 ? 16 : 8, na&=~6'; inp='' ;;
                esac
             done
             set +f
             ;;
         esac
      done
      ><
   done
   print -u3 '</DL><p>'
   ><
   unset Des W
   return 0
   ;;

   pme_htm)
   Ziel=address.htm
   [ -e $Ziel ] && Ziel=postmadr.htm
   : postmexp*
   [ "$]" -eq 0 ] && echo "Quell-Datei 'postmexp*' fehlt!" && return

   echo '<!DOCTYPE NETSCAPE-Addressbook-file-1>' > $Ziel
   echo '<TITLE>Adreßbuch</TITLE>' >> $Ziel
   echo '<H1>Adreßbuch</H1>%n%n<DL><p>' >> $Ziel

   for inp in  postmexp*
   do
      [ -s "$inp" ] || continue
      < "$inp"
      while readl zeile
      do
         ifset zeile || continue
         expr "$zeile" :: '[a-zA-Z]%{3,%}' || continue
         mail= name=
         expr "$zeile" :mail '<%([^<>]%{3,%}%)>' &&
            expr "$zeile" :name '^%([^<>]%{1,%}[^<> ]%)  *<'
         ifset mail ||
         expr "$zeile" :name '(%([^()]%{1,%}%))' &&
            expr "$zeile" :mail '^%([^()]%{3,%}[^() ]%)  *('
         ifset mail ||
         expr "$zeile" :mail '^%([^ ]%{3,%}%) *' || continue
         print -r "<DT><A HREF=%"mailto:$mail%">$name</A>" >> $Ziel
      done
      ><
   done

   echo '</DL><p>' >> $Ziel
   return 0
   ;;

   htm_pme)
   local quelle=address.htm
   Ziel=postmimp.dat
   [ -s $quelle ] ||
      echo "Quell-Datei '$quelle' fehlt!" && return
   grep -q '<!DOCTYPE NETSCAPE-Addressbook-file-1>' $quelle || {
      echo "'.${T}$quelle': Dateiinhalt fehlerhaft!"; return; }
   < $quelle
   while readl zeile
   do
      expr "$zeile" :: '^ *<[Dd][Tt]><[Aa]' || continue
      expr "$zeile" :mail '"mailto:%([^:"]*%)"' || continue
      expr "$zeile" :name '>%([^<>]*%)</[Aa]>%r*$'
      expr "$name" :: '[^ %t]' &&
         print -r "$name <$mail>" >> $Ziel && continue
      print -r "$mail" >> $Ziel
   done
   ><
   return 0
   ;;

   htm_tab)
   [[ -s "$2" && $Ln == ??J ]] || return
   < "$2"
   > ntaba.txt
   while readl zeile
   do
      expr "$zeile" :: '^ *<[Dd][Tt]><[Aa]' && {
         expr "$zeile" :mail '"mailto:%([^:"]*%)"'
         expr "$zeile" :name '>%([^<>]*%)</[Aa]>%r*$'
         catv name /%t mail /%j
      }
   done
   ><<
   return 0
   ;;

   *)  print -ru2 "'$1' existiert nicht!"; exit 1 ;;
   esac
   return 0
}



Einstellungen()  {
   local o=00 i="$1"
   conv -u i
   for o from 0 to ${#i} repeat
   do
      case "$(catv $o,1,i)" in
        J)  catv /J =$o,,Ln
            let o==1 && catv /J =0,,Ln ;;
        N)  catv /N =$o,,Ln ;;
      esac
   done
   return 0
}



Helft_mir_doch()  {
   local n=000
   while :
   do
      n=0
      echo %
"| th:%r
| Die Inhalte jeweils aller Adressenlisten (T-Online)%r
| (addrbook.lst oder adressen.dat) werden in eine address.htm%r
| umgewandelt, zum Import mit Navigator 3+4.%r
| lh:%r
| Eine oder mehrere mit Navigator 4 exportierte *.ldi wird/werden%r
| in eine address.htm oder ldi_adr.htm umgewandelt, die%r
| weiterverwendet werden kann.%r
| (Nav4 verwendet eine binäre Datenbank 'abook.nab'.)%r
| hl:%r
| Eine address.htm (Nav3) wird in eine addr_imp.ldi%r
| umgewandelt, für Mailer, die LDIF importieren können.%r
| ht:%r
| Eine address.htm wird in eine adressen.dat (T-Online)%r
| exportierend eingefügt. (Vorher: adressen.dat --> addr_bish.dat)%r
| ha:%r
| Eine address.htm wird in eine agentimp.dat umgewandelt,%r
| die von ForteAgent importiert werden kann.%r
| ah:%r
| Eine oder mehrere mit ForteAgent exportierte agentexp*%r
| werden in eine address.htm oder agentadr.htm umgewandelt."
      read "inp?$((++n)): "
      ifset inp && return
      echo %
"| hp:%r
| Eine address.htm wird in eine postmimp.dat umgewandelt,%r
| die von PostMe importiert werden kann.%r
| ph:%r
| Eine oder mehrere mit PostMe exportierte postmexp*%r
| werden in eine address.htm oder postmadr.htm umgewandelt."
      read "inp?$((++n)): "
      ifset inp && return
      echo %
"| jxx:%r
| Bei einer erzeugten .htm wechseln Listeneinträge auf die%r
| Normalebene, damit sie garantiert berücksichtigt werden.%r
| xjx:%r
| Entfernt leere Listen. (bedingt jxx)%r
| xxj:%r
| Erzeugt zusätzlich Datei ntaba.txt mit 'name<TAB>adresse'.%r
| %r
| cd arg:  Arg '-' führt ins vorherige Verzeichnis zurück.%r
| %r
| Die Formate der verschiedenen Mailer-Adreßbücher sind%r
| sehr verschieden, ebenso die Begriffsanzahlen.%r
| Übereinstimmung gibt es nur bei Name und MailAdresse.%r
| Man verliert also bei Umwandlungen meistens Informationen%r
| und kann dann durch Rückumwandlung den Ursprung nicht wieder%r
| unterschiedsfrei herstellen!%r
|%r
| Dieses Script kann nicht BELIEBIG lange Zeilen und Einträge%r
| verarbeiten.%r
| Im vierstelligen Bereich kann man an Obergrenzen stoßen.%r
| Bei defekten Quell-Dateien ist die Fehlertoleranz%r
| relativ gering."
      read "inp?$((++n))(EOF): "
      ifset inp && return
   done
   return
}



echo "%r
 |-----------------------------------------------------|%r
 |             bish-Script 'emailadr.bish'               |%r
 |        Copyright (c) 1998  Helmut Schellong         |%r
 |                                                     |%r
 |          Konversionen eMail-Adressenlisten          |%r
 |_____________________________________________________|"


while echo %
"%r
 |----------------------------------------------------|%r
 | Zieldatei: `prints s39- "$Ziel"` |%r
 |----------------------------------------------------|%r
 |                                  Hilfe :  h        |%r
 |      T-Online x.x   -->  Netscape-.htm :  th       |%r
 |      Netscape-.ldi  -->  Netscape-.htm :  lh       |%r
 |      Netscape-.htm  -->  Netscape-.ldi :  hl       |%r
 |      Netscape-.htm  -->  T-Online 2.2x :  ht       |%r
 |      Netscape-.htm  -->  Forte Agent   :  ha       |%r
 |      Forte Agent    -->  Netscape-.htm :  ah       |%r
 |      Netscape-.htm  -->  PostMe        :  hp       |%r
 |      PostMe         -->  Netscape-.htm :  ph       |%r
 |                   Einstellungen  »$Ln« :  j/n..    |%r
 |                  (Ziel)datei editieren :  ed [...] |%r
 |                   Verzeichnis wechseln :  cd ...   |%r
 |                Shell aufrufen (Prompt) :  sh       |%r
 |                                Beenden :  E        |%r
 |____________________________________________________|%r
                                          :  __%b%b%c"
do
   read inp arg
   case "$inp" in
     th)  ABook tol_htm ; Lnorm "$Ziel" ; ABook htm_tab "$Ziel" ;;
     lh)  ABook ldi_htm ; Lnorm "$Ziel" ; ABook htm_tab "$Ziel" ;;
     hl)  ABook htm_ldi ;;
     ht)  ABook htm_tol ;;
     ha)  ABook htm_agent ;;
     ah)  ABook agent_htm ; Lnorm "$Ziel" ; ABook htm_tab "$Ziel" ;;
     hp)  ABook htm_pme ;;
     ph)  ABook pme_htm ; Lnorm "$Ziel" ; ABook htm_tab "$Ziel" ;;
     cd)  [ "$arg" != - ] && [ -d "$arg" ] || echo %a%c && continue
          pwd ; cd "$arg" ; pwd ;;
     ed)  ifset arg || arg="$Ziel"
          [ -s "$arg" ] || echo "'$arg' ungültig!" && continue
          [ $T == \ ] && edit "$arg"
          [ $T == / ] && vi "$arg" ;;
     sh)  echo "%nBeenden durch Eingabe von 'exit'.%n"
          [ $T == \ ] && command.com
          [ $T == / ] && bish -E
          ;;
    H|h)  Helft_mir_doch ;;
      E)  break ;;
[jJnN]*)  Einstellungen "$inp" ;;
      *)  ifset inp && echo %a%c
          continue ;;
   esac
   [ -f "$Ziel" -a ! -s "$Ziel" ] && Ziel="(zero)"
done





###  emailbox.bish  #############################################


T=/
[ `ver s` == dos ] && T=\
nset="`prints s160-`"


tmpfiles()  {
   local dir=$1 vnam=_______________ e=000 tmp
   shift
   for vnam in  $*
   do
      for e from 100 to 199 repeat
      do
         tmp=${dir}bishs_tmp.$e
         [ -e $tmp ] || { :>$tmp; $vnam=$tmp; continue 2; }
      done
      return 1
   done
   return 0
}


boxes()  {
   local cnt=00 box='            '
   local boxd='                            '
   nset=''
                    #drafts      8/16/drafts.snm
   for 2 box boxd in eingang.dat 1/1/eingang.idx %
                     ausgang.dat 1/2/ausgang.idx %
                     ablage.dat  1/4/ablage.idx %
                     abfall.dat  1/8/abfall.idx %
                     inbox       2/1/inbox.snm %
                     unsent      2/2/unsent.snm %
                     sent        2/4/sent.snm %
                     trash       2/8/trash.snm %
                     inbox       4/1/inbox.snm %
                     outbox      4/2/outbox.snm %
                     sent        4/4/sent.snm %
                     trash       4/8/trash.snm %
                     Inbox       8/1/.Inbox.summary %
                     Outbox      8/2/.Outbox.summary %
                     Sent        8/4/.Sent.summary %
                     Trash       8/8/.Trash.summary
   do
      [ $2 == z -a -f "$1$T$box" ] &&
         nset="$nset$box/$boxd " && let ++cnt
      [ $2 == q -a -s "$1$T$box" ] &&
         grep -qmi '^From - [^ %t%r%n]' "$1$T$box" &&
         grep -qmi '^From:[ %t] *[^ %t%r%n]' "$1$T$box" &&
         grep -qmi '^Date:[ %t] *[^ %t%r%n]' "$1$T$box" &&
         grep -qmi '^Subject:[ %t] *[^ %t%r%n]' "$1$T$box" &&
         nset="$nset$box/$boxd " && let ++cnt
   done
   return $cnt
}


copybox()  {
   local flg=000000 n=000000 r=1 t %
   from='^[Ff][Rr][Oo][Mm] - [a-zA-Z 0-9:]%{18,24%}$' %
   msg='^[Mm][Ee][Ss][Ss][Aa][Gg][Ee]-[Ii][Dd]:[ %t] *[^ %t]%{5,80%}'
   n=0
   < $1
   while readl zeile
   do
      expr "$zeile" :: "$from" && {
         let "flg&1" && cat $mail >> $2 && r=0 && let ++n
         print -r "$zeile" > $mail ; let "flg=1" ; continue
      }
      t=''; let flg || continue
      ifset zeile || let "flg&2" || {
         t=`sum -b < $mail`.`sum -w < $mail`.`sum -l < $mail`
         zeile="Message-Id: <$t@emailbox.bish>"; t="`echo`"
      }
      expr "$zeile" :: "$msg" && {
         let "flg|=2"
         echo %r%c ; prints s5ss-66- $n "   " "$zeile"
         grep -mq "$zeile" $mid && { flg=0; continue; }
      }
      print -r "$zeile$t" >> $mail
   done
   ><
   let "flg&1" && cat $mail >> $2 && { r=0; let ++n; }
   let "flg&1" && echo %r%c && prints s5- $n
   echo
   return $r
}


[ $# -eq 1 ] && {
   echo "
   ---------------------------------------------------------------
   bish-Script 'emailbox.bish'
   Copyright (c) Helmut Schellong
   ---------------------------------------------------------------
   Dieses bish-Shell-Script fügt die Inhalte der eMail-Ordner
   eines Quell-Verzeichnisses passenden Ordnern in einem
   Ziel-Verzeichnis automatisch hinzu.
   Die beiden Verzeichnisse können auch als Argumente zu diesem
   Script angegeben werden.
   Folgende Verzeichnis-Verlängerungen werden probiert:
        %"%"  email20${T}[0-9]??*  mail  nsmail
        netscape${T}mail  comm${T}users${T}*${T}mail
   Es muß also nicht immer ein langer Pfad angegeben werden,
   und bei mehreren (?*[) wird abgefragt.
   Fehlende 'Message-Id: <...>' werden automatisch erzeugt
   und eingefügt, damit doppelte Mails vermieden werden.
   Ziel-Index-Dateien werden gelöscht, weil sie ja nicht mehr
   zu den Ordnern passen. Sie werden vom Mailer neu erzeugt.
   Erweiterungsmöglichkeiten dieses Script-Textes sind erkennbar.
   ---------------------------------------------------------------
   "
   exit
}

while [ $# -eq 0 ]
do
   echo "Quell- und Ziel-Verzeichnis [Q Z|<Enter>]:  %c"
   read qdir zdir qz
   ifset qdir || exit
   ifset qz && continue
   ifset qdir zdir && break
done
[ $# -ge 2 ] && qdir="$1" zdir="$2"
ifset qdir zdir || echo "Quelle='$qdir' Ziel='$zdir' !" && exit 2
expr " $qdir$zdir" :: '[*?[]' &&
   echo "Bitte keine Zeichen '*?[' verwenden!" && exit 2

conv -t/${T}F$T qdir zdir
[ $T == \ ] && conv -u qdir zdir
[ ! -d "$qdir" ] && echo "'$qdir' kein Verzeichnis!" && exit 2
[ ! -d "$zdir" ] && echo "'$zdir' kein Verzeichnis!" && exit 2
[ "$qdir" == "$zdir" ] && echo "'$qdir' == '$zdir' !" && exit 2


for 2 qz dir  in  q $qdir z $zdir
do
   for sub in  '' "${T}email20${T}[0-9]??*" ${T}mail ${T}nsmail %
                  ${T}netscape${T}mail %
                  "${T}comm${T}users${T}*${T}mail"
   do
      na=`echo $dir$sub | wc -w`
      let na==1 && tmp=$dir$sub && expr "$tmp" :: '[?*[]' && continue
      let "na>1" && { for tmp in  $dir$sub; do echo $tmp; done ;echo; }
      for sub in  $dir$sub
      do
         [ ! -d $sub ] && continue
         let "na>1" && {
            echo $sub; read "tmp?    verwenden?[jn]: "
            [ "$tmp" != j ] && continue
         }
         boxes $sub $qz || { ${qz}nam="$nset"; ${qz}dir=$sub; break 2; }
      done
   done
   ifset ${qz}nam || echo "Keine Mail-Ordner: '$dir'" && exit 2
done
[ "$qdir" == "$zdir" ] && echo "'$qdir' == '$zdir' !" && exit 2
unset qz na tmp dir sub nset


echo "$qdir  -->  $zdir ?[jn]:  %c"
read qn
[ "$qn" != j ] && exit

tmpfiles .$T mid mail

local box=____________ typ=___ idx=____________________
local qflg=0000000000 delcmd=DEL
[ $T == / ] && delcmd=rm

for qn in  $qnam
do
   conv -t"/ " qn
   for 4 qbox qtyp qtyp idx  in  $qn ; do :; done
   let "qflg&qtyp" && continue
   let "qflg|=qtyp"
   for zn in  $znam
   do
      conv -t"/ " zn
      for 4 box typ typ idx  in  $zn ; do :; done
      let "qtyp&typ" || continue
      grep -is '^Message-Id:[ %t] *[^ %t%r%n]' $zdir$T$box > $mid
      echo "$qdir$T$qbox  -->  $zdir$T$box"
      copybox $qdir$T$qbox $zdir$T$box &&
         [ -f $zdir$T$idx ] && $delcmd $zdir$T$idx
   done
done

$delcmd $mid; $delcmd $mail




###  eq.bish  #############################################


p=/scratch/VALUE
n1=32
while let "n1<67"
do
   let "n2=n1+1"
   while let "n2<=67"
   do
      cmp -s $p/350$n1 $p/350$n2 &&
         echo $p/350$n1 $p/350$n2
      let ++n2
   done
   let ++n1
done



###  etiabs.bish  #############################################

#!/u/bin/bish
OFILE=abs_file.eti
STR="Pestalozzi-Straße 72%r"
ORT="32108  Bad Salzuflen%r"
TEL="Tel/Fax (05222) 84540%r"

stop()  { read "rest?        <Enter> "; }

he_sc()  {
   NAM="Helmut Schellong%r"
}

h_sc()  {
   NAM="H. Schellong%r"
}

sc()  {
   NAM="Schellong%r"
}

ga_sc()  {
   NAM="gggggggg Schellong%r"
}


vorberechnung()  {
   # 5*13 Etiketten; 38.1x21.2, 2.54mm HorAbst.
   global
   VER=0 HOR=0 NUM=0 LBX=0
   STARTX=6 STARTY=-17 ETIVER=13 ETIHOR=5
   # Relativbewegung                 Rechteckgröße
     RXA=$((381+24)) RYA=$((212+0)) RXB=$((381-20)) RYB=$((212-20))
   array LBY 28 47 45 45
   (( LBYSUM= LBY1+LBY2+LBY3+LBY4 ))
 
   echo "%eE%e%1Bin;" >| $OFILE
   # Druckbereich A4: 198x271mm,  DWN: Verschiebung nach unten
   echo "sc0,1980,0,2724,0;" >> $OFILE
   echo "sd1,341,2,1,4,10,5,0,6,0,7,4148ssDT|,1sp1wu0pw0.2lo5;" >> $OFILE
   echo "rf1,2,2,1,0,0,0;" >> $OFILE
   echo "PUpa0,0pr$STARTX,$STARTY;ft11,1;" >> $OFILE
}


set_text()  {
   #TEXTA="$LBY1;sd4,10.0,6,3si.32,.22es-.3lb$TEL|
   #pr0,$LBY2;sd4,11.25,6,3si.37,.24es-.35lb$ORT|
   #si.35,.31[cm];ESchsp[,line];
   TEXTA="$LBY1;sd4,9.0,5,4,6,3lb$TEL|
   pr0,$LBY2;sd4,11.25,6,3es.1lb$ORT|
   pr0,$LBY3;lb$STR|
   pr0,$LBY4;lb$NAM|;"
}


make_outp()  {
   vorberechnung
   set_text
   for VER from 0 to $(( ETIVER-1 )) repeat
   do
      [ $VER -gt 0 ] && echo "pr-$((RXA*(ETIHOR-1) )),$RYA;" >> $OFILE
      for HOR from 0 to $((ETIHOR-1)) repeat
      do
         [ $HOR -gt 0 ] && echo "pr$RXA,0;" >> $OFILE
                                              # Rechteck-Position rel.
        #echo "er$RXB,$RYB;" >> $OFILE        # Zeichne Rechteck rel.
         ((LBX=RXB/2))
         echo "pr$LBX,$TEXTA" >> $OFILE
         echo "pr-$LBX,-$LBYSUM;" >> $OFILE
	 echo "%r   $VER : $HOR     %c"
      done
   done
   echo '%e%%0A%eE' >> $OFILE
}


show()  {
   echo "$NAM%n$STR%n$ORT%n$TEL"
   gewaehlt=1
   stop
}


while echo "%n
%tHelmut Schellong      :  1
%tH. Schellong          :  2
%tSchellong             :  3
%tgggggggg Schellong    :  4
%tDrucken               :  d
%tDrucken (Test)        :  D
%tBeenden               :  e

%t                      :  %c"
do
   read kdo rest
   case "$kdo" in
     1)  he_sc; show ;;
     2)  h_sc; show ;;
     3)  sc; show ;;
     4)  ga_sc; show ;;
     d|D)
         ifset gewaehlt || { echo Erst Auswahl treffen!%a; continue; }
         make_outp
         [ $kdo = d ] && cat $OFILE >> $DRUCKER
         : ;;
     e)  [ -f "$OFILE" ] && rm $OFILE; exit 0;;
     *)  echo %a%c ;;
   esac
done




###  etians.bish  #############################################

#!/u/bin/bish
OFILE=ofile_.eti
ABS="Helmut Schellong * Pestalozzi-Straße 72 * 32108 Bad Salzuflen%r"
LN=1 CR="`echo %r%c`" NL="`echo`"

stop()  { read "rest?        <Enter> "; }

ksk()  {
   ANR="Kreissparkasse Halle/Wf.%r"
   ABT=" %r"
   STR="Eickhof 1%r"
   ORT="33803  Steinhagen%r"
   return 0
}

hs()  {
   ANR="Helmut Schellong%r"
   ABT="Software%r"
   STR="Pestalozzi-Straße 72%r"
   ORT="32108  Bad Salzuflen%r"
   ABS=" %r"
   return 0
}

henrich()  {
   ANR="Walter HHHHHHH%r"
   ABT=" %r"
   STR="Dorotheenstraße 88%r"
   ORT="33615  Bielefeld%r"
   return 0
}


vorberechnung()  {
   DWN=80 LBX=120       # 2*8 Etiketten
   STARTX=0 STARTY=0 ETIVER=8 ETIHOR=2
   # Relativbewegung   Rechteckgröße
     RXA=1000 RYA=360  RXB=680 RYB=500
   echo "%eE%e%1Bin;" >| $OFILE
   # Druckbereich A4: 198x271mm,  DWN: Verschiebung nach unten
   echo "sc0,1980,$DWN,$((2710+DWN)),0;" >> $OFILE
   echo "sd1,341,2,1,4,10,5,0,6,3,7,4148ssDT|,1sp1wu0pw0.0lo2;" >> $OFILE
   echo "rf1,2,2,1,0,0,0;" >> $OFILE
   echo "PUpa0,0pr$STARTX,$STARTY;ft11,1;" >> $OFILE
}


get_zeilen()  {
   static cnt
   local zeile al=0
   [ -z "$cnt" ] && cnt=0
   ((cnt=cnt+1))
   [ $cnt -le 2 -o $cnt -ge 15 ] && {
      ANR="-%r"; ABT="-%r"; STR="-%r"; ORT="-%r"
      [ $cnt -eq 16 ] && cnt=0 ; return 0; }
   while zeile="`line -$LN $ADRFILE`"
   do
      ((LN=LN+1 ; al=al+1))
      conv "-d${CR}d$NL" zeile
      [ -z "$zeile" ] && {
         [ $al -lt 4 -o $al -gt 5 ] && {
            echo "Adressendatei fehlerhaft!(45)%a"; return 2; }
         [ $al -eq 4 ] && { ORT="$STR"; STR="$ABT"; ABT=" %r"; }
         return 0
      }
      case $al in
        1)  ANR="$zeile%r";;
        2)  ABT="$zeile%r";;
        3)  STR="$zeile%r";;
        4)  ORT="$zeile%r";;
        *)  echo "Adressendatei fehlerhaft!(*)%a"; return 2;;
      esac
   done
   LN=1 cnt=0
}


etikett()  {
   $GETZEILEN || { GETZEILEN=ksk; ksk; }
   global
   array LBY 50 90 70 50 55
   [ "$ABT" = " %r" -o -z "$ABT" ] && array LBY 50 110 50 50 55
   (( LBYSUM= LBY1+LBY2+LBY3+LBY4+LBY5 ))
   set_text
   echo "$ABS%n$ANR%n$ABT%n$STR%n$ORT"
   return 0
}


set_text()  {
   TEXTA="$LBY1;sd4,14.5,6,3lb$ORT|
   pr0,$LBY2;sd4,12.75,6,3lb$STR|
   pr0,$LBY3;sd4,12.75,6,0lb$ABT|
   pr0,$LBY4;sd4,13.25,6,3lb$ANR|
   pr0,$LBY5;sd4,6.75,6,0lb$ABS|;"
   #si.35,.31;
}


make_outp()  {
   vorberechnung
   for VER from 0 to $(( ETIVER-1 )) repeat
   do
      [ $VER -gt 0 ] && echo "pr-$((RXA*(ETIHOR-1) )),$RYA;" >> $OFILE
      for HOR from 0 to $((ETIHOR-1)) repeat
      do
         [ $HOR -gt 0 ] && echo "pr$RXA,0;" >> $OFILE
                                              # Rechteck-Position rel.
        #echo "er$RXB,$RYB;" >> $OFILE        # Zeichne Rechteck rel.
        #echo "pr0,$RYA2;rr$RXB2,$RYB2;pr0,-$RYA2;" >> $OFILE
                                              # Kantenschatten
         etikett
         echo "pr$LBX,$TEXTA" >> $OFILE
         echo "pr-$LBX,-$LBYSUM;" >> $OFILE
      done
   done
   echo '%e%%0A%eE' >> $OFILE
}



while echo "%n
Adressendatei '$ADRFILE'($LN)

%tksk                   :  1
%tHelmut Schellong      :  2
%tHHHHHHH               :  3
%tAdressendatei         :  [.[.]]/pfad
%tDrucken               :  d
%tDrucken(Test)         :  D
%tBeenden               :  e

%t                      :  %c"
do
   read kdo rest
   case "$kdo" in
     1)  GETZEILEN=ksk; LN=1; unset ADRFILE; gewahlt=1 ;;
     2)  GETZEILEN=hs; LN=1; unset ADRFILE; gewahlt=1 ;;
     3)  GETZEILEN=henrich; LN=1; unset ADRFILE; gewahlt=1 ;;
     ..[/\]?*|.[/\]?*|[/\]?*)
         LN=1; unset gewahlt ADRFILE
         [ ! -f $kdo ] && { echo Datei $kdo nichtexistent!%a%c
			    continue; }
         GETZEILEN=get_zeilen; ADRFILE=$kdo; gewahlt=1 ;;
     [dD])
         ifset gewahlt || { echo Erst Auswahl treffen!%a; continue; }
         make_outp
         [ $kdo = d ] && cat $OFILE >> $DRUCKER
         [ $LN -gt 1 ] && echo Neues Blatt einlegen.
         [ $LN -eq 1 ] && unset gewahlt ADRFILE
         : ;;
     e)  [ -f "$OFILE" ] && rm $OFILE; exit 0;;
     *)  echo %a%c ;;
   esac
done


#2x8 Etik. 98x36, 2mm Raum zwischen beiden Reihen


###  etidsk.bish  #############################################

#!/u/bin/bish
OFILE=ofile_.eti
FLEN=/u/bish/cmd/flen_.eti
[ -e $FLEN ] || echo 104 > $FLEN
ETISZ=70x52
NUMBEZ=FLEN
NUMMER=`cat $FLEN`
VERS=3.05 MONAT=""
COPYRIGHT="Copyright (C) 1995-1999%r"
ANSCHR="Helmut Schellong ù Pestalozzi-Straße 72 ù 32108 Bad Salzuflen%r"
TEL="Tel/Fax (05222) 84540 ù post@schellong.de%r"

stop()  { read "rest?        <Enter> "; }

plus_docsys()  {
   KANTE="bish + docsys    V$VERS            1v1%r"
   [ $ETISZ = 70x52 ] && KANTE=" %r"
   TITEL="bish  +  docsys%r"
   VERSION="Version $VERS$MONAT      ù      Diskette 1/1%r"
   BESCHR1="Shell-Programm und Kommando-Programmiersprache%r"
   BESCHR2="Dokumentationssystem%r"
   SYSCPU="f~Ar DOS ù òi386sx%r"
}

plus_doc()  {
   KANTE="bish          V$VERS            1v1%r"
   [ $ETISZ = 70x52 ] && KANTE=" %r"
   TITEL="BISH32%r"
   VERSION="Version $VERS$MONAT      ù      Diskette 1/1%r"
   BESCHR1="Shell-Programm und Kommando-Programmiersprache%r"
   BESCHR2="Dokumentation, Zubeh~Tr%r"
   SYSCPU="f~Ar DOS-Console%r"
}

commands()  {
   KANTE="bish - commands    V$VERS            1v1%r"
   [ $ETISZ = 70x52 ] && KANTE=" %r"
   TITEL="bish  -  commands%r"
   VERSION="Version _.__      ù      Diskette 1/1%r"
   BESCHR1="Zusatz-Programm(e) f~Ar bish%r"
   BESCHR2="*.exe,*.com%r"
   SYSCPU="f~Ar DOS ù òi386sx%r"
}

bish_docsys()  {
   KANTE="bish - docsys    V$VERS            1v1%r"
   [ $ETISZ = 70x52 ] && KANTE=" %r"
   TITEL="bish  -  docsys%r"
   VERSION="Version $VERS$MONAT      ù      Diskette 1/1%r"
   BESCHR1="bish-Dokumentationsystem%r"
   BESCHR2="Manuals, Kommandos%r"
   SYSCPU="f~Ar DOS ù òi386sx%r"
}

bish_doc()  {
   KANTE="bish - doc    V$VERS            1v1%r"
   [ $ETISZ = 70x52 ] && KANTE=" %r"
   TITEL="bish  -  doc%r"
   VERSION="Version $VERS$MONAT      ù      Diskette 1/1%r"
   BESCHR1="bish-Dokumentation, einfach%r"
   BESCHR2=" %r"
   SYSCPU="f~Ar DOS%r"
}

bish_wdoc()  {
   KANTE="bish - wdoc    V2.0/$VERS            1v1%r"
   [ $ETISZ = 70x52 ] && KANTE=" %r"
   TITEL="bish  -  wdoc%r"
   VERSION="Version 2.0/$VERS$MONAT      ù      Diskette 1/1%r"
   BESCHR1="Dokumentationspr~Dsentator f~Ar Windows%r"
   BESCHR2=" %r"
   SYSCPU="f~Ar Windows 3.1%r"
}

bish_shw()  {
   KANTE="bish + wdoc    V$VERS            1v1%r"
   [ $ETISZ = 70x52 ] && KANTE=" %r"
   TITEL="bish  +  wdoc%r"
   VERSION="Version $VERS$MONAT      ù      Diskette 1/1%r"
   BESCHR1="Shell-Programm und Kommando-Programmiersprache%r"
   BESCHR2="Dokumentationspr~Dsentator f~Ar Windows 3.1%r"
   SYSCPU="SHAREWARE,  f~Ar DOS ù òi386sx%r"
}

bish_info()  {
   KANTE="bish - info    V$VERS            1v1%r"
   [ $ETISZ = 70x52 ] && KANTE=" %r"
   TITEL="bish  -  info%r"
   VERSION="Version $VERS$MONAT      ù      Diskette 1/1%r"
   BESCHR1="Informationen,  Dokumentation,%r"
   BESCHR2="Dokumentationspr~Dsentator f~Ar Windows 3.1%r"
   SYSCPU="Freeware,  f~Ar DOS ù òi386sx%r"
}

korr()  {
   KANTE="KORREKTUR:             1v1%r"
   [ $ETISZ = 70x52 ] && KANTE=" %r"
   TITEL="KORREKTUR:                    %r"
   VERSION="Version $VERS$MONAT      ù      Diskette 1/1%r"
   BESCHR1="F~Ar Reg.Nr.  FLEN...%r"
   BESCHR2=" %r"
   SYSCPU="f~Ar DOS ù òi386sx%r"
}
 

vorberechnung()  {
   VER=0 HOR=0 NUM=0 LBX=0
   global
   [ $ETISZ = 70x52 ] && { DWN=0   UP=54     # 2*5 Etiketten
      STARTX=190 STARTY=0 ETIVER=5 ETIHOR=2
      # Relativbewegung Rechteckgr~Táe    Kantenschatten
        RXA=929 RYA=518 RXB=680 RYB=500  RXB2=$RXB RYB2=80
      array LBY 30 25 25 45 45 40 40 60 60 90
   }
   [ $ETISZ = 70x70 ] && { DWN=80 UP=0       # 2*4 Etiketten
      STARTX=180 STARTY=0 ETIVER=4 ETIHOR=2
      # Relativbewegung Rechteckgr~Táe    Kantenschatten
        RXA=930 RYA=720 RXB=680 RYB=680  RXB2=$RXB RYB2=30
      array LBY 30 25 25 100 65 40 40 60 60 100
   }
   local
   (( LBYSUM= LBY1+LBY2+LBY3+LBY4+LBY5+LBY6+LBY7+LBY8+LBY9+LBY10 ))
   (( RYA2 = LBYSUM - RYB2 / 2 ))          # Kanteninkrement
 
   echo "%eE%e%1Bin;" >| $OFILE
   # Druckbereich A4: 198x271mm,  DWN: Verschiebung nach unten
   echo "sc0,1980,$DWN,$((2710+DWN)),0;" >> $OFILE
   echo "sd1,341,2,1,4,10,5,4,6,0,7,4148ssDT|,1sp1wu0pw0.0lo5;" >> $OFILE
   echo "rf1,10,8,1,%c" >> $OFILE
   echo "1,1,0,0,0,0,0,0,0,0,%c" >> $OFILE
   echo "0,0,0,0,0,0,0,0,0,0,%c" >> $OFILE
   echo "0,0,0,0,0,1,1,0,0,0,%c" >> $OFILE
   echo "0,0,0,0,0,0,0,0,0,0,%c" >> $OFILE
   echo "1,1,0,0,0,0,0,0,0,0,%c" >> $OFILE
   echo "0,0,0,0,0,0,0,0,0,0,%c" >> $OFILE
   echo "0,0,0,0,0,1,1,0,0,0,%c" >> $OFILE
   echo "0,0,0,0,0,0,0,0,0,0;" >> $OFILE
   #echo "rf1,2,2,1,0,0,0;" >> $OFILE
   echo "PUpa0,$UP;pr$STARTX,$STARTY;ft11,1;" >> $OFILE
}


set_text()  {
   TEXTA="$LBY1;sd4,6.5,6,0lb$TEL|
   pr0,$LBY2;lb$ANSCHR|
   pr0,$LBY3;lb$COPYRIGHT|
   pr0,$LBY4;sd4,8lb$NUMBEZ"
   TEXTB="%r|pr0,$LBY5;sd4,9,6,3lb$SYSCPU|
   pr0,$LBY6;sd4,10,6,0lb$BESCHR2|
   pr0,$LBY7;sd4,10lb$BESCHR1|
   pr0,$LBY8;sd4,11.75,6,3lb$VERSION|
   pr0,$LBY9;sd4,18lb$TITEL|
   pr0,$LBY10;sd4,9lb$KANTE|;"
}


make_outp()  {
   vorberechnung
   set_text
   for VER from 0 to $(( ETIVER-1 )) repeat
   do
      [ $VER -gt 0 ] && echo "pr-$((RXA*(ETIHOR-1) )),$RYA;" >> $OFILE
      for HOR from 0 to $((ETIHOR-1)) repeat
      do
         [ $HOR -gt 0 ] && echo "pr$RXA,0;" >> $OFILE
                                              # Rechteck-Position rel.
         echo "er$RXB,$RYB;" >> $OFILE        # Zeichne Rechteck rel.
         echo "pr0,$RYA2;rr$RXB2,$RYB2;pr0,-$RYA2;" >> $OFILE
                                              # Kantenschatten
         ((LBX=RXB/2))
         echo "pr$LBX,$TEXTA$NUMMER$TEXTB" >> $OFILE
         ((NUMMER=NUMMER+3))
         echo "pr-$LBX,-$LBYSUM;" >> $OFILE
      done
   done
   echo '%e%%0A%eE' >> $OFILE
}


show()  {
   echo "$KANTE%n$TITEL%n$VERSION%n$BESCHR1%n$BESCHR2%n$SYSCPU"
   echo "$NUMBEZ$NUMMER%n$COPYRIGHT%n$ANSCHR%n$TEL"
   gew~Dhlt=1
   stop
}


while echo "%n
Etikett $ETISZ,  Version '$VERS', $NUMBEZ$NUMMER

%tGr~Táe 70x52/70x70     :  g
%tVersion               :  v...
%tbish+docsys           :  1
%tbish+                 :  2
%tbish-commands         :  3
%tbish-docsys           :  4
%tbish-doc              :  5
%tbish-wdoc             :  6
%tbish-shw              :  7
%tbish-info             :  8
%tkorrektur             :  9
%tDrucken               :  d
%tBeenden               :  e

%t                      :  %c"
do
   read kdo rest
   case "$kdo" in
     g)  [ $ETISZ = 70x70 ] && etisz=70x52
         [ $ETISZ = 70x52 ] && etisz=70x70
         ETISZ=$etisz; unset gew~Dhlt; continue ;;
   v?*)  VERS=`expr $kdo : '^.%(..*%)'`; continue ;;
     1)  plus_docsys; show; continue ;;
     2)  plus_doc; show; continue ;;
     3)  commands; show; continue ;;
     4)  bish_docsys; show; continue ;;
     5)  bish_doc; show; continue ;;
     6)  bish_wdoc; show; continue ;;
     7)  bish_shw; show; continue ;;
     8)  bish_info; show; continue ;;
     9)  korr; show; continue ;;
     d)
         ifset gew~Dhlt || { echo Erst Auswahl treffen!%a; continue; }
         NUMMER=`cat $FLEN`
         make_outp
         echo $NUMMER >| $FLEN
         cat $OFILE >> $DRUCKER
         continue ;;
     e)  [ -f "$OFILE" ] && rm $OFILE; exit 0;;
     *)  echo %a%c; continue ;;
   esac
done




###  evtab.bish  #############################################

#!/u/bin/bish
#Korrigieren der Eventtabelle des MMT.
#>bish bish\evtab.bish xyz.html


set Z:.300 Stxt:.200
set Fi:.300 Fo:.300


GetStxt()  {
   local z:.300 tid=00000 f=0 l=000000
   z="$(-grep -m ' { '"$1"', %d%{4}, %d }' ./share/var.c)"
   expr "$z" :tid ' { %d%{4}, %(%d%{4}%), %d }' || { print -u2 tid; exit 3; }
   z="$(-grep -nm ' D_%w%{1,}_%d%d%d_id  '"$tid" ./base/txtbase.h)"
   expr "$z" :l '^%(%d%{1,5}%):' || { print -u2 "line:"; exit 4; }
   z="$(-line -$((l+1)) ./base/txtbase.h)"
   expr "$z" :Stxt ' "%([^"]%{1,50}%)"' || { print -u2 "Stxt"; exit 5; }
   return 0
}



Fi=$1 Fo=$1
expr "$Fi" :Fo '%.[^.]%{1,}$' '@&' || { print -u2 Fo; exit 10; }
print -u2 "$Fi"
print -u2 "$Fo"

local evid=00000 cnt=00000


   0<"$Fi"
   3>"$Fo"
   while readl Z
   do
      catv Z /%n =3
      expr "$Z" :: '<h%d>Eventlist</h%d>' && break
   done
   while readl Z
   do
      catv Z /%n =3
      expr "$Z" :: '</tr>' && break
   done
   while readl Z
   do
      catv Z /%n =3
      expr "$Z" :: ' <td[> ].%{1,}</td>$' || continue
      readl Z
      catv Z /%n =3
      readl Z
      catv Z /%n =3
      readl Z
      catv Z /%n =3
      readl Z
      catv Z /%n =3
      expr "$Z" :evid ' <td>%(%d%{4}%)&nbsp' || { print -u2 evid; exit 1; }
      print -u2 $((++cnt))"%t$evid"
      readl Z
      catv Z /%n =3
      readl Z
      GetStxt "$evid"
      catv '.<td>' Stxt '.&nbsp&nbsp</td>' /%n =3
   done
   ><<
   :




###  exprcache.bish  #############################################



set Z:.300
N=00000000
while readl Z
do
   to 19 repeat
   do
      expr Z cxv:: 'movabsq	%$2305886989678804992, %%rdx # imm = 0x2000280000000000'
   done
   expr Z cxv:: 'movabsq	%$2305886989678804992, %%rdx # imm = 0x2000280000000000' || continue
   let ++N
done
echo $N




###  f.bish  #############################################


CONT='Connected.
INSTANCE_NAME : SID1.domain.com
 
-- ===================================================================
-- check privileges for grantee  ... USERNAME :  SCHEMA1
-- ===================================================================
Status :   privileges o.k.!
 
-- ===================================================================
-- check privileges for grantee  ... USERNAME :  SCHEMA2
-- ===================================================================
Status :   privileges o.k.!
 
-- ===================================================================
-- check privileges for grantee  ... USERNAME :  SCHEMA3
-- ===================================================================
Status :   privileges o.k.!
 
-- ===================================================================
-- check privileges for grantee  ... USERNAME :  SCHEMA4
-- ===================================================================
Status :   privileges o.k.!
 
-- ===================================================================
-- check jobs  ...
-- ===================================================================
Status :  jobs o.k.!
 
-- ===================================================================
-- check tablespace quotas  ...
-- ===================================================================
Status :  quotas o.k.!
'
catv CONT | {
  while readl Z
  do
     ifset INN || { expr "$Z" :INN '^INSTANCE_NAME *: *%(%w%{1,}%)'; continue; }
     expr "$Z" :: '^-- ====' && continue
     expr "$Z" :C '^-- *%(.*%w%) *%.%.%.' && expr "$Z" :U '%(USERNAME.*%)$' || U=
     expr "$Z" :: '^Status' &&
        catv /INSTANCE_NAME: INN '.  ' C '. ' U /%n Z /%n%n
  done
}

#INSTANCE_NAME:SID1  check privileges for grantee USERNAME :SCHEMA1
#Status :   privileges o.k.!


###  find437.bish  #############################################

#!/u/bin/bish

set Z:.200 tmp:.200
local a:132.1 o:148.1 u:129.1 A:142.1 O:153.1 U:154.1

list -fR /u | {
   while read Z
   do
      expr Z cbv:: '437%.bish$' && continue
      expr Z cbv:: '%.bish$' || continue
      grep -qm "[$a$o$u$A$O$U]" "$Z" || continue
      print -r "$Z"
      expr "$Z" :tmp '%.bish$' = '437.bish'
      move -v "$Z" "$tmp"
      iconv -f CP437 -t ISO8859-1 "$tmp" > "$Z"
   done
}

:



###  find55aa.bish  #############################################

#!/u/bish64

#55AA==0xAA55

CvNum() {
   local num:020 m=.
   while [ $# -gt 0 ]
   do
      num="${{1}}"
      expr "$num" :: '^%d%{1,20}$' && {
         let "num-=num%512"; $1=$num
         shift; continue
      }
      expr "$num" :m '^%d%{1,12}%([bmgBMG]%)$' || {
         print -u2 "$num"; exit 2
      }
      expr "$num" :num '^%(%d%{1,}%)'
      case "$m" in
        [bB])  let "num*=512";;
        [mM])  let "num*=1024*1024";;
        [gG])  let "num*=1024*1024*1024";;
      esac
      $1=$num
      shift
   done
   return 0
}



# vname nsect
Ck55aa() {
   local o:010 ns=$2 magic2:0.2 #sect:0.512
   local magic:010 jmp3:0.4 jmp:010 prn:.100
   local oem:.8 fsn:.8 lbl:.11
   for o from 510 by 512 to $(([ns-1]*512+510)) repeat
   do
      catv o,2,$1 =magic2 || break
      base -w magic2 +10 magic
      let "magic!=16#aa55" && continue
      catv $((o-510)),4,$1 =jmp3
      base -l jmp3 +10 jmp
      let "jmp&=16#00ffffff" #%
      #"jmp!=16#c031fc&&jmp!=16#9058eb&&jmp!=16#9052eb&&jmp!=16#3ceb&&jmp!=16#903ceb&&jmp!=0" && continue
      catv $((o-510+3)),8,$1 =oem
      catv $((o-510+82)),8,$1 =fsn
      catv $((o-510+71)),11,$1 =lbl
      expr "$oem" :: '^[A-Za-z_][A-Za-z_0-9. ]%{7}$' || oem=""
      expr "$fsn" :: '^[A-Za-z_][A-Za-z_0-9. ]%{7}$' || fsn=""
      expr "$lbl" :: '^[A-Za-z_0-9. ]%{11}$' || lbl="jmp=$((16#,jmp))"
      [ Ef -eq 0 ] && { Ef=1
         prints vs13bs10bs7bs4bs4bs8bs8bs prn Byte Sektor MB GB MB/s oem fs label
         [ Or -gt 0 ] && Or=0 echo
         echo "$prn"
         echo "$prn" >> $Of
      }
      prints vs13bs10bs7bs4bs4bs8bs8bs prn %
           $((O+o-510)) %
           $(([O+o-510]/512)) %
           $(([O+o-510]/[1024*1024])) %
           $(([O+o-510]/[1024*1024*1024])) %
           $Speed "$oem" "$fsn" "$lbl"
      SecP=$Seconds
      [ Or -gt 0 ] && Or=0 echo
      echo "$prn"
      echo "$prn" >> $Of
   done
   return 0
}


ReadHD() {
   local nsect:010 len:010 s:010
   3<$If
   while catv O,$LEN,3 =BUF
   do
      catv ,.; len=$.;
      let "nsect=len/512"
      Ck55aa BUF $nsect
      let "O+=LEN" "len<LEN" && break
      let "O-Offs>=Count" && break
      s=$SECONDS Seconds=$s
      let "s-Sec>=5" && {
         let "Speed=(O-Os)/(s-Sec)" "Speed/=1024*1024"
         Os=$O Sec=$s
      }
      let "s-SecP>=10" && {
         echo "%r$((O/[1024*1024])) MB     $Speed MB/s%c"
         SecP=$s Or=1
      }
   done
   ><
   return 0
}



If=/dev/ad0
Of=/tmp/find55aa.txt
LEN=$((16*63*512))
set BUF:0.$LEN Seconds:010 Sec:010 SecP:010
set O:020 Offs:020 Count:913 Os:020 Speed:010
Ef=0 Or=0
[ $# -ne 0 -a $# -ne 2 ] && exit 1
[ $# -eq 2 ] && Offs=$1 Count=$2 CvNum Offs Count
echo Offset=$Offs Count=$Count >> $Of
echo Offset=$Offs Count=$Count
echo

O="$Offs" Sec=$SECONDS Speed=0
ReadHD





###  findno_bish.bish  #############################################

#!/u/bin/bish

set Z:.200 Ze:.200

list -fR /u | {
   while read Z
   do
      expr Z cbv:: '/[^./]%{1,}$' || continue
      catv 50,0 =Ze: < "$Z"
      expr "$Ze" :Ze '^%([a-zA-Z_0-9/.]%{4,}%)' || continue
      expr Ze v:: '/bish$' || continue
      print -r "$Z"
   done
}

:



###  findnoshebang.bish  #############################################

#!/u/bin/bish

set Z:.200 Ze:.200

list -fR /u | {
   while read Z
   do
      expr Z cbv:: '%.bish$' || continue
      catv 50,0 =Ze: < "$Z"
      if expr "$Ze" :Ze '^%([a-zA-Z_0-9/.]%{4,}%)'
      then
         expr Ze v:: '/bish$' && continue
      fi
      print -r "$Z"
   done
}

:



###  fixadrbase.bish  #############################################

#!/u/bin/bish

set -f

set Z:.300
Adr=000000
sk=00000000
nelem=0000
pad=0000
padf=0000
waspad=0
Adr=1700

cat "$1" | {

>"$1"
while seek + 0 sk
      readl Z
      seek $sk 0
      read id dd adr grp idlink sort parbn %
           typ bytelen darst nbit bitpos %
           access dflt min max flags einheit name %
           Tinfo Tgrp Tsgrp Tbit Text text
do
   expr "$Z" :: '^:..*' && {
      let "Adr+=200" "Adr+=1000-Adr%1000"
      catv Z /%n
      continue
   }
   expr "$Z" :: '^[@a-z][0-9]%{3,16}' && {
      nelem=1
      expr "$flags" :nelem 'A%([0-9]%{1,}%)'
      expr "$flags" :nelem 'S%([0-9]%{1,}%)'
      if [ $typ == s ]
      then
         if [ nelem -eq 1 ]
         then
            let "pad=80-bytelen"
         else
            if let "nelem*bytelen<=40"
            then  let "pad=100-nelem*bytelen"
            else  let "pad=nelem*bytelen" "pad+=200-(pad*2)%200"
            fi
         fi
      else
         if [ nelem -eq 1 ]
         then
            let "pad=50-bytelen"
         else
            if let "nelem*bytelen<=40"
            then  let "pad=100-nelem*bytelen"
            else  let "pad=nelem*bytelen" "pad+=100-(pad*2)%100"
            fi
         fi
      fi
      if expr "$flags" :padf 'p%([0-9]%{1,}%)'
      then
         pad=$padf waspad=1
      else
         #let "waspad&&Adr%100" && let "Adr+=100-Adr%100"
         waspad=0
      fi
      prints vsf06 Adr $Adr
      expr "$Z" :Z ' %d%{6} ' = " $Adr "
      let "Adr+=nelem*bytelen+pad"
   }
   catv Z /%n
done
><

}

echo $Adr




###  fixid.bish  #############################################

#!/u/bin/bish

FIO="base/cfgdata.c base/cfgbase.txt"
set ZI:.300 ZO:.300 IDLST:.16000
set -f


Check()  {
   local r=0 ni=00000 no=00000 end=..........
   for 2 FI FO in $FIO
   do
      end=`grep -nm '^%$$' $FO` && expr "$end" :end '^%(%d%{1,}%):'
      ni=`grep -c '^# *define %{1,3}D[0-9]%{10}grp ' $FI`
      line -1-$end $FO | no=`grep -c '^@0%{8} '`
      echo $ni $no : $end
      let 'ni!=no' && let ++r
   done
   return $r
}


CtoTXT()  {
   local r=0 ni=00000 no=00000
   for 2 FI FO in $FIO
   do
      IDLST=$( grep '^# *define %{1,3}D[0-9]%{10}grp ' $FI | cut -d'  ' -f2 )
      cat $FO | {
         >$FO
         for ZI in $IDLST
         do
            let ++ni
            expr "$ZI" :ZI '^D%d%d%(%d%{8}%)' || print -u2 "»$ZI«"
            while readl ZO
            do
               expr "$ZO" :ZO '^@0%{8} ' = "@$ZI " || { catv ZO /%n; continue; }
               let ++no; catv ZO /%n; continue 2
            done
            print -u2 ENDE: $ZI
            break
         done
         while readl ZO
         do  catv ZO /%n;  done
         ><
      }
      echo $ni $no
   done
   return 0
}


Check || exit 1

CtoTXT

:




###  fixidbase.bish  #############################################

#!/u/bin/bish

[ $# -le 0 ] && { echo "*base.txt ... angeben!"; exit; }
#FIO="cfgbase.txt mesbase.txt"
FIO="$*"
echo "$FIO"
set FBASE:.50 LNK:010 RIDLNK:32.5000
FIDLNK=/tmp/__idlnk__
Ostep=500 Gstep=500000
OBJ=00000000 GRP=00000000 ADR=000000
Changed=0000
NGE=0000 #anzahl gruppenzeilen
set -f



SetNGE()  {
   local z:.500 sk:010
   seek + 0 sk
   NGE=0
   while readl z
   do
      expr "$z" :: '^%$' && break
      expr "$z" :: '^:..' && break
      expr "$z" :: '^[@x]%d%{8} ' && let ++NGE
   done
   seek $sk 0
   return 0
}


create_write_id()  {
   local fbase:.30 z:.500 flg:.20 id:010 mul:010
   local grp:08 ido:010
   fbase="$FBASE"
   OBJ=0 GRP=500000 ADR=0 Changed=0000
   cat $fbase | {
      >$fbase
      while readl z
      do
         expr "$z" :: '^%$' && { catv z /%n; break; }
         expr "$z" :: '^:..' && {
            OBJ=4000; let "GRP+=Gstep"; SetNGE
            let "mul=(100000-35000)/((NGE+8)*500)" "mul<1" && mul=1
            [ mul -gt 8 ] && mul=8
            print -u2 %t$NGE%t$((Ostep*mul))
         }
         prints vsf03 grp $((GRP/100000))
         prints vsf08 id $((GRP+OBJ))
         expr "$z" :ido '^[@x]%(%d%{8}%) ' && {
            grep -qm "$ido" "$FIDLNK" && addoldnew $ido $id
         }
         expr "$z" :z '^%([@x]%)%d%{8} ' "%1$id " && {
            let ++Changed "OBJ+=Ostep*mul"
            expr "$z" :z '^%(.%{18} %)%d%d%d ' "%1$grp " ||
                print -u2 "grp=$grp: $z"
         }
         catv z /%n
      done
      while readl z
      do  catv z /%n;  done
      ><
   }
   echo Changed=$Changed
   return 0
}


mkidlinks()  {
   local z:.300 mod:010
   <"$FBASE"
   >"$FIDLNK"
   while readl z
   do
      expr "$z" :: '^[@x]%d' || continue
      expr "$z" :z ' %(%d%{8}%) ' || continue
      [ "$z" == 00000000 ] && continue
      let "mod=z%500" "z-=mod"
      prints vsf08 z $z
      catv z "/ " mod /%n
   done
   ><<
   #sortl -f1n -o"$FIDLNK" "$FIDLNK"
   return 0
}


# idold idnew
addoldnew()  {
   local id:030 ido=$1 idn=$2 oi:08 ni:08 lnk:08 mod:03
   for 2 lnk mod in $( grep "$ido" "$FIDLNK" )
   do
      let "oi=ido+mod" "ni=idn+mod"
      prints vsf08ssf08 id $oi " " $ni
      catv id /%n =ADR,,RIDLNK
      let "ADR+=${#id}+1"
   done
   return 0
}

# linkold
getnewlink()  {
   local lnk=$1 ido:010 idn:010
   for 2 ido idn in $RIDLNK
   do
      cmpv lnk ido && { LNK=$idn; return 0; }
   done
   return 1
}


write_idlinks()  {
   local fbase="$FBASE" z:.300 lnk:010
   cat $fbase | {
      >$fbase
      while readl z
      do
         expr "$z" :: '^[@x]%d%{8} ' && {
            expr "$z" :lnk ' %(%d%{8}%) '
            [ "$lnk" != 00000000 ] && {
               getnewlink $lnk && {
                  expr "$z" :z '^%(.%{22} %)%d%{8}' "%1$LNK"
	       }
	    }
         }
         catv z /%n
      done
      ><
   }
   return 0
}


for FBASE in $FIO
do
   mkidlinks
   create_write_id
   write_idlinks
   set RIDLNK:32.5000
done

remove -s $FIDLNK
:




###  fixidbase.bish  #############################################

#!/u/bin/bish

[ $# -le 0 ] && { echo "*base.txt ... angeben!"; exit; }
#FIO="cfgbase.txt mesbase.txt"
FIO="$*"
echo "$FIO"
Ostep=500 Gstep=500000
OBJ=00000000 GRP=00000000
Changed=0000
NGE=0000
set -f



SetNGE()  {
   local z:.500
   seek + 0 sk
   NGE=0
   while readl z
   do
      expr "$z" :: '^%$' && break
      expr "$z" :: '^:..' && break
      expr "$z" :: '^[@x]%d%{8} ' && let ++NGE
   done
   seek $sk 0
   return 0
}


create_write_id()  {
   local fbase:.30 z:.500 flg:.20 id:010 mul:010
   for fbase in $FIO
   do
      OBJ=0 GRP=0 Changed=0000
      cat $fbase | {
         >$fbase
         while readl z
         do
            expr "$z" :: '^%$' && { catv z /%n; break; }
            expr "$z" :: '^:..' && {
               OBJ=4000; let "GRP+=Gstep"; SetNGE
               let "mul=(100000-35000)/((NGE+8)*500)" "mul<1" && mul=1
               [ mul -gt 8 ] && mul=8
               print -u2 %t$NGE%t$((Ostep*mul))
            }
            prints vsf08 id $((GRP+OBJ))
            expr "$z" :z '^%([@x]%)%d%{8} ' "%1$id " && {
               let ++Changed "OBJ+=Ostep*mul"
            }
            catv z /%n
         done
         while readl z
         do  catv z /%n;  done
         ><
      }
      echo Changed=$Changed
   done
   return 0
}


create_write_id

:




###  fmtbase.bish  #############################################




ANAM='id dd adr grp idlink sort parbn typ bytelen darst+ nbit bitpos
access+ dflt min max+
flags einheit name+ Tinfo Tgrp Tsgrp Tbit Text+ text
'
set Z:.200
set feld:.50

[ -t 0 ] && exit 0


Print()  {
   seek + 0 sk
   while readl Z
   do
      expr "$Z" :: '^@[0-9]' && break
   done
   : $Z
   nf=$,
   print -u2 "Felder=$nf"
   n=000
   for n to $nf repeat
   do
      set l$n:08
   done
   seek $sk 0
   while readl Z
   do
      ifset Z || continue
      expr "$Z" :: '^[@a-z;.,][0-9]' || continue
      : $Z
      [ $, -ne nf ] && { print -u2 "$, != $nf"; return 1; }
      n=0
      for feld in $Z
      do
         let ++n; let "${#feld}>l$n" && let "l$n=${#feld}"
      done
   done
   for n to $nf repeat
   do
      catv l$n '/ ' =2
   done
   print -u2
   w=00000
   seek $sk 0
   while readl Z
   do
      ifset Z || { catv /%n; continue; }
      expr "$Z" :: '^[@a-z;.,][0-9]' || { catv Z /%n; continue; }
      n=0
      for feld in $Z
      do
	 let ++n
	 [ n -ge nf ] && { catv feld /%n; continue; }
         w=l$n; w=${{w}}; let ++w
	 [ n -eq 10 -o n -eq 13 -o n -eq 16 -o n -eq 19 -o n -eq 24 ] && let ++w
	 prints s-$w- $feld
      done
   done
   return 0
}


cat | Print


:




###  ft.bish  #############################################

#!/u/bin/bish


Select()  {
   local tim0:012 tim:012 file:.100
   systime tim0
   catv '/user root pfaubeem' /%n
   catv '/verbose%nbinary%nhash%ncd /usr/home/cie%nls%n'
   while readl file
   do
      fstat -mv tim $file
      let "tim0-tim<=1*3600" && catv '/put ' file /%n
   done
   catv '/quit%n'
   return 0
}


list -Rpf wms wms0 | Select | ftp -n vbm




###  ftp_nt.bish  #############################################

#!/u/bin/bish


CDIR=/dos/cie/mc/c
DIRSPD="$CDIR $CDIR/mu2b256 $CDIR/mu2b262 $CDIR/u3b145 $CDIR/u3b149 $CDIR/u3b150"
DIRSP="mu2000 upc3"


for DIRPD in $DIRSPD
do
   [ -d "$DIRPD" ] || continue
   for DIRP in $DIRSP
   do
      DIRP="$DIRPD/$DIRP"
      [ -d "$DIRP" ] || continue
      ABS="$DIRP/abs"
      [ -d "$ABS" ] || continue
      cd "$ABS"; ls -l
      ftp schellong.com
   done
done




###  ftyp.bish  #############################################


cut -f2 -d'		' $1 | sort |
   while readl s
   do  cmpv s S || prints s6s "$n" "  $S" && n=0 S="$s"; let ++n
   done
prints s6s "$n" "  $S"
exit

:>sml
cut -f2 -d'		' $1 | tr ' ' '@' |
   while readl sm
   do  grep -Fsq "$sm" sml || echo "$sm" >> sml;  done
  #do  catv sml | grep -Fq "$sm" || catv sm /%j =:,,sml;  done
#cat sml

for sm  in  $( cat sml )
do
   conv -"t@ " sm
   prints s6s3s $( grep -cF "$sm" $1 ) '' "$sm"
done



###  functions.bish  #############################################




ifdef FUNCTIONS_BISH && return 0
FUNCTIONS_BISH=

set -f

MAILCODEAUTOR=H.Schellong,BadSalzuflen
MAILCODEPROGRAM=Freeware_nur_für_nichtgewerbliche_Verwendung
export MAILCODEAUTOR MAILCODEPROGRAM


# obj action [.../log]
WrLog()  {
   local sz=0000000000 logsz=$SysLogSz log="$3" z
   ifset log || log=$Fadmlog logsz=$AdmLogSz
   [ logsz -le 0 ] && return 0
   [ logsz -lt 300 ] && logsz=300
   Lock loglock
   >> $log
   echo "User=$REMOTE_USER: %c"
   extern date -u +'%A, %e.%b.%Y %X'
   echo "$1%n$2%n"
   ><
   < $log
   fstat -svh sz 0
   let "sz<=logsz" && { ><; Lock loglock del; return 0; }
   seek $((sz-logsz)) 0
   while readl z && ifset z; do done
   catv +0,,0 =0,,3:  3<> $log
   ><
   Lock loglock del
   return 0
}


PutErrHtm()  {
   WrLog "$1" "VBM ERROR"
   [ "$1" != nohdr ] && echo 'Content-type: text/html%n'
   [ "$1" == nohdr ] && shift
   echo '<html><head><title></title></head><body bgcolor="#ff0000">'
   echo '<font color="#ffff00"><br><br><br><br><h1 align="CENTER">'
   print -r "VBM ERROR: $1"
   echo '</h1></font><br><br><center><form><b>
         <input class="butt" type="button" value="Back" onClick="window.back();">
         </b></form></center></body></html>'
   exit 0
   return 0
}


# define MSK16  0x0810= 2064
#/ start= 0x1d0f= 7439
#CRC:EEDATA von WORD @1 ... @949 einschl.
#       Offs 2 ... 1899 = 1898 Byte
#WORD Crc16(crc, word)

# CRC<--  Buf $offs $len
#Crc16()  {
#   local n=00 crc_=0007439 word=000000
#   for word in $( catv $3,$4,$2 | base -w +10 )
#   do
#      for n from 0 to 15 repeat
#      do
#         if let "{{crc_&16#8000} ^ {[word&(1<<n)]<<(15-n)}}&16#ffff"
#         then
#            (( crc_=  ((((crc_^2064)&2064)<<1)|(crc_<<1))
#                     &((((crc_^2064)&2064)<<1)|~(2064<<1)),
#               crc_&=16#ffff, crc_|=1
#            ))
#         else
#            (( crc_=  ((((crc_^~2064)&2064)<<1)|(crc_<<1))
#                     &((((crc_^~2064)&2064)<<1)|~(2064<<1)),
#               crc_&=~1, crc_&=16#ffff
#            ))
#         fi
#      done
#   done
#   $1=$crc_
#   return 0
#}


# basename
# basename del
Lock()  {
   local n=0000 lockf=../tmp/$1
   [ "$2" == del ] && { [ -e $lockf ] && remove $lockf; return 0; }
   while [ -e $lockf ]
   do
      sleep -m 25
      let "++n>=100" && { remove $lockf; WrLog "Lock wait time" "$lockf removed!"; }
   done
   : > $lockf
   return 0
}
#     let "++n>=100" && { remove $lockf; PutErrHtm "$lockf unexpected!"; }



CheckIP()  {
   [ $# -ne 1 -a $# -ne 4 ] && return 1
   [ $# -eq 1 ] && {
      local ip="$1" n
      expr "$ip" :: "^$REip%$" || return 1
      conv -'t. ' ip
      for n in $ip
      do  let "n>255" && return 1;  done
      return 0
   }
   local n
   expr "$1.$2.$3.$4" :: "^$REip%$" || return 1
   for n in  $1 $2 $3 $4
   do  let "n>255" && return 1;  done
   return 0
}


# $telnu
CkTelnu()  {
   expr "$1" :: '[^0-9WPT,]' && return 1
   expr "$1" :: '[0-9]'
   return
}


# Buf $id $adir
GetIval()  {
   [ -d "$3" -a -s "$3/i" -a -n ""$1 ] || return
   local v:.200
   v="$(-grep -m "^$2 " $3/i)" || return
   expr "$v" :$1 "^$2 "'%(.*%)$' || return
   return 0
}



FormConv()  {
   local h=0000 z=00
   conv -'t+ ' $1
   while expr "${{1}" :h '%%%([a-fA-F0-9]%{2%}%)'
   do
      base -16 h +b z
      expr "${{1}" :$1 '%%'$h += "$z"
   done
   return 0
}



#GetIds  #Gid Aid Oid Pid Fid Cid Tid Iid Sid
GetIds()  {
   local id=000 flg=000 g=g a=a o=o p=p f=f c=c t=t i=i s=s
   < $Finfobase
   while read - id - - flg - - && [ -n "$g$a$o$p$f$c$t$i$s" ]
   do
      case "$flg" in
       g)  Gid=$id g= ;;
       a)  Aid=$id a= ;;
       o)  Oid=$id o= ;;
       p)  Pid=$id p= ;;
       f)  Fid=$id f= ;;
       c)  Cid=$id c= ;;
       t)  Tid=$id t= ;;
       i)  Iid=$id i= ;;
       s)  Sid=$id s= ;;
      esac
   done
   ><
   return 0
}



Uvars()  {
   [ -s uvars.bish ] || return
   local nam=$1 o=0000 n=0000 nl:10.1 ibuf
   Lock lockuv
   catv 1000,0 =ibuf:  < uvars.bish
   local buf:.250 obuf
   while let "o+=n"; conv "-o${o}O$nl" ibuf
   do
      let "n=$.-o+1"
      catv $o,$n,ibuf =buf:
      expr "$buf" :: "^$nam=" || { catv buf =:,,obuf:; continue; }
      catv nam "/='" $nam "/'%n" =:,,obuf:
   done
   catv obuf > uvars.bish
   Lock lockuv del
   return 0
}



#_Uvars()  {
#   [ -s uvars.bish ] || return
#   local nam=$1 buf=..............................
#   Lock lockuv
#   cat uvars.bish | {
#      > uvars.bish
#      while readl buf
#      do
#         expr "$buf" :: "^$nam=" || { catv buf /%n; continue; }
#         catv nam "/='" $nam "/'%n"
#      done
#      ><
#   }
#   Lock lockuv del
#   return 0
#}





###  geta.bish  #############################################

#!/u/bin/bish


ANAM='id dd typ bytelen darst nbit bitpos
dflt1 min1 max1
parbn flags einheit name Tinfo Tgrp Tsgrp Tbit Text text
'
F=cfgbase.txt
RA='^[1-9][0-9]*$'
an=0000000
n=n

[ $# -lt 3 ] && { echo "file[.=$F] RA argnum [args]"; exit 0; }
#read "F_? file[.=$F] RA argnum [args]:  " RA an args
F_="$1"
RA="$2"
an="$3"
ifset F_ RA an || exit 0
shift 3
args="$*"
[ "$F_" != . ] && F="$F_"
tty=tty
[ ! -t 0 -o "$F" == - ] && tty=
base=00 base=
[ "$F" == cfgbase.txt -o "$F" == mesbase.txt ] && base=1


Print()  {
   ifset tty && <$F
   cat | {
   while read a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 %
              a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 %
              a21 a22 a23 a24 a25
   do
      ifset base || [ "$a1" == '#@BASE' ] && base=2
      ifset base && [ "$a1" == '$' ] && break
      a=a$an
      ifset base && expr "$a1" :: '^@[^:]' || continue
      expr "${{a}}" :: "$RA" || continue
      expr "${{a}}" :: '[^0-9]' && n=
      for aa in $an $args
      do
         catv /%t a$aa
      done
      echo
   done
   }
   ifset tty && ><
   return 0
}

Print # | sortl -f${n}1

:




###  getdepfrombsd.bish  #############################################

#!/u/bin/bish


Host1='ftp.freebsd.org'
Host2='ftp.de.freebsd.org'
Host3='ftp-archive.freebsd.org'
Host="$Host1"
Path1='/pub/FreeBSD/ports/amd64/packages-9.2-release/All'
Path2='/pub/FreeBSD/ports/i386/packages-stable/All'
Path3='/pub/FreeBSD-Archive/old-releases/amd64/7.1-RELEASE/packages/All'
Path="$Path1"
vdp=y
set Pkg:.50
Pkg=''
[ $# -eq 1 ] && Pkg="$1"
#[ $# -lt 1 -o $# -gt 2 ] && exit 1
#[ $# -eq 2 -a "$2" == 2 ] && Path="$Path2"
#echo URL: "ftp://$Host$Path"

# pkg.tbz
MkFtpInp()  {
   local pkg:.50 tbz:.50 d:.30
   echo open "$Host"
   echo user anonymous pass 'schellong@t-online.de'
   echo binary
   echo cd "$Path"
   pkg_info -r "$1" | {
      while read d pkg
      do
         [ "$d" == "Dependency:" ] || continue
         tbz="$pkg.tbz"
         [ -d "/var/db/pkg/$pkg" -a "$vdp" = y ] && {
            print -u2 "Vorhanden: /var/db/pkg/$pkg"; continue
         }
         [ -s "$tbz" ] && { print -u2 "Vorhanden: $tbz"; continue; }
         echo get "$tbz"
      done
   }
   echo quit
   return 0
}


# pkg.tbz
Get()  {
   MkFtpInp "$1" | ftp -nv
   return 0
}


#Get "$1"
while echo "%n$Host1%n$Host2%n$Host3%n$Path1%n$Path2%n$Path3%n
%tHost           : H $Host
%tPath           : P $Path
%tpackage        : p $Pkg
%t/var/db/pkg [$vdp]: y|n
%tGet            : G
%tBeenden        : E
%t               : _%b%c"
do
   read cmd rest
   case "$cmd" in
     H)  Host="$rest";;
     P)  Path="$rest";;
     p)  [ -s $rest ] || continue
         Pkg=$rest;;
     y|n)  vdp=$cmd;;
     G)  Get "$Pkg";;
     E)  break;;
     *)  echo %a%c; continue;;
   esac
done

exit 0




###  geticnt.bish  #############################################



RE='icnt%.cgi?0%.%(%d%d%)%.'
Icnt()  {
   for F in  $(find . -follow -type f -name '*.htm' -print)
   do
      [ -s "$F" ] || continue
      grep -qm "$RE" "$F" || continue
      Z=$(grep -m "$RE" "$F")
      expr "$Z" :N "$RE" || continue
      echo $N $F
   done
}

Icnt | sortl -f1n
 



###  gew.bish  #############################################

#!/home/bin/bish

GetMax()  {
   local max=000000000000000 v=000000000000
   maxn=$1
   while shift; expr "$1" :v '%([0-9]%{1,}%)'
   do
      let "v>max" && max=$v
   done
   $maxn=$max
   return 0
}

AddP()  {
   local n=00 v=000000000000000 gn=$1 max=$2
   shift 2
   for v in $*
   do
      expr "$v" :v '%([0-9]%{1,}%)'
      let "++n"; let "P$n+=(gn*v*1000)/max"
   done
   return 0
}

Prnt()  {
   [ "$1" == 0 ] && return
   local n=00
   GetMax Max $P1 $P2 $P3 $P4 $P5 $P6
   for n to 6 repeat
   do
      let "P$n=(P$n*100)/Max"
   done
   prints ss6s6s6s6s6s6 "$1:  " $P1 $P2 $P3 $P4 $P5 $P6
   return 0
}

Ifs0="$IFS"
Ifs=",
"
gb0=0
P1=00000

for 8 txt gew bs1 bs2 bs3 bs4 bs5 bs6 in $( IFS="$Ifs" cat $1 ) $( IFS="$Ifs0" )
do
   #echo $gew $bs1 $bs2 $bs3 $bs4 $bs5 $bs6
   expr "$gew" :gb '^%([a-z]%)' || exit 1
   expr "$gew" :gn '^.%([0-9]%{1,}%)' || exit 1
   cmpv gb gb0 || { Prnt $gb0; gb0=$gb P1=00000 P2=00000 P3=00000 P4=00000 P5=00000 P6=00000; }
   GetMax Max $bs1 $bs2 $bs3 $bs4 $bs5 $bs6
   AddP $gn $Max $bs1 $bs2 $bs3 $bs4 $bs5 $bs6
done
Prnt $gb0



###  gift.bish  #############################################


> tgif.gif

catv /GIF89a%120%0%18%0%%$((16#80))%0%0 =1
catv /%0%0%0%255%255%255 =1

catv /%%$((16#21))%%$((16#fe)) =1
catv /%19CGI@HelmutSchellong%0 =1

: > gdat
for n from 0 to 9 repeat
do
   catv /%%$((16#2c))%%$((n*12+0))%0%0%0%12%0%18%0%0 =1
   3< $n.gif
   catv 48,1,3 | base -b +10 | catv =s:
   let "s+=3"
   catv 47,$s,3 =1
   catv /"d1218_$n=%"" >> gdat
   catv 47,$s,3 | base -b +16 >> gdat
   echo '"' >> gdat
   ><
   #catv /%2%1%%$((16#85))%0 =1
done

catv '/;' =1
><

#catv /%%$((16#21))%1%12%0%0%0%0%80%0%16%0%8%16%1%0 =1
#catv /%10 /1234567890 /%0 =1



###  h.bish  #############################################



[ $# -lt 1 ]  &&  exit
file=$1
: > ho
a=0
catv 5000,,0 < $file | base -b +16 |
while readl zeile
do
   for 2 val val2 in $zeile
   do
      prints s5s4s3 $a: $val $val2 >> ho
      let ++a
   done
done





###  h2t.bish  #############################################

#!/u/bin/bish
#bish-Script 'html2txt' h2t.bish
#Copyright (c) 1998  Helmut Schellong


set -f
set +S
[ $# -lt 1 ] && { echo "h2t.bish [-4] datei"; exit; }

Subs='&lt; < &gt; > &amp; & &quot; " &nbsp; @
      &brvbar; | &sect; Paragraph &shy; . &middot; .
      &auml; ä &ouml; ö &uuml; ü &szlig; ß
      &Auml; Ä &Ouml; Ö &Uuml; Ü'

if [ "$1" == -4 ]
then
   shift
   Subs='&lt; < &gt; > &amp; & &quot; " &nbsp; @
      &brvbar; | &sect; ^U &shy; ú &middot; ù
      &auml; ~D &ouml; ~T &uuml; ~A &szlig; á
      &Auml; ~N &Ouml; ~Y &Uuml; ~Z'
fi

[ $# -lt 1 -o ! -s "$1" ] && { echo "h2t.bish [-4] datei"; exit; }

catv /%j =zv:

< "$1"
while readl zeile
do
   while expr "$zeile" :zeile '<[Bb][Rr]>%(.%)' "$zv%1"
   do  :;  done
   expr "$zeile" :zeile '<[^>]%{1,%}>' + ''
   for 2 alt neu  in  $Subs
   do
      conv -t"@ " neu
      expr "$zeile" :zeile "$alt" += "$neu"
   done
   catv zeile /%j
done
><





###  hanoi.bish  #############################################


m() {
   [ $1 -eq 1 ] && { echo $2 $3; return; }
   local nm1
   let "nm1=$1-1"
   m $nm1 $2 $4 $3
   m 1 $2 $3 $4
   m $nm1 $4 $3 $2
}

local f=$1 t=$2 n=$3
if [ $# -eq 3 ] &&
   [ n -ge 1 -a f -le 3 -a f -ge 1 -a t -le 3 -a t -ge 1 -a f -ne t ]
then
   m $n $f $t $((6-f-t))
else
   echo Usage: /bin/sh hanoi.sh from to num
fi

#by rhb



###  hc.bish  #############################################

#!/u/bin/bish


set -f
set +S
[ `ver n` -lt 305 ] && { echo "Shell-Version < 305!"; exit 0; }
[ `ver w` == full -o -t 0 -a -t 1 -a -t 2 ] || exit 0
Script="$0"
expr "$Script" :Script '^%.[/\]' ''
if [ `ver s` == unix ]
then
   expr "$Script" :: '^[^/]' && Script="`-pwd`/$Script"
else
   expr "$Script" :: '^\.' && pwd | catv 0,2,0 Script =Script:
   expr "$Script" :: '^.:\.' || Script="`-pwd`\$Script"
   conv -t/\F\ Script
fi
echo "Script ist: '$Script'"

echo Inhalts-Test...
[ ! -s "$Script" -o ! -w "$Script" %
   -o ! -r "$Script" -o -x "$Script" ] && {
   echo "Ungültige Script-Datei: '$Script'"; exit 1; }
inp=`grep -c '^#@F ......' "$Script"`
let "inp!=551" && { echo "$inp:Script-Inhalt ungültig!"; exit 1; }
inp=`grep -c '^#@G [a-zA-Z0-9,äöüß]%{20%}$' "$Script"`
let "inp!=100" && { echo "$inp:Script-Inhalt ungültig!"; exit 1; }
inp=`grep -c '^#@g [-0-9]%{10%}$' "$Script"`
let "inp!=1" && { echo "$inp:Script-Inhalt ungültig!"; exit 1; }

RGB=000000
GWpos=0000000000
Gpos=0000000000
Dpos=0000000000
Pos=0000000000
NDsel="$(prints sf010-)"
Dsel="$(prints s150-)"
Gsel="$(prints s20-)"
#NL="$(catv /%n)"
Hex=$(prints sf070-)
CN="$(prints s210-)"
zeile="$(prints s300-)"
Such="$(prints s250-)"
Fsel="$(prints s150-)"
Zeile="$(prints s1250-)"

< $Script
while seek + 0 GWpos; readl Zeile
do  expr "$Zeile" :: '^#@g ' && break;  done
catv $((GWpos+=4)),10,0 =Gsel:
echo GruppenGWposition=$GWpos

echo Inhalts-Test G...
inp=000
seek $GWpos 0
while readl Zeile
do  expr "$Zeile" :: '^#@G ' && { let ++inp; continue; }
    let inp && break
done
seek + 0 Dpos
><
let "inp!=100" && { echo "$inp:Script-Inhalt ungültig!"; exit 1; }

< $Script
seek $GWpos 0
while seek + 0 Gpos; readl Zeile
do  expr "$Zeile" :: '^#@G ' && break;  done
echo Gruppenposition=$Gpos

seek $Dpos 0
while seek + 0 Dpos; readl Zeile
do  expr "$Zeile" :: '^#@D[0-9] ' && break;  done
><
echo Dateienposition=$Dpos
let "!GWpos||!Gpos||!Dpos||GWpos>=Gpos||GWpos>=Dpos||Gpos>=Dpos" &&
    { echo "pos:Script-Inhalt ungültig!"; exit 1; }



Fmain()  {
   inp=$1
   shift
   case "$inp" in
      NDGsel)
         local g=00
         NDsel="    0"
         expr "$Gsel" :: '[0-9]' || return
         < $Script
         seek $Dpos 0
         while readl Zeile
         do
            expr "$Zeile" :: '^#@D[0-9] ' || continue
            catv 3,1,Zeile =g:
            expr "$Gsel" :: $g || continue
            let ++NDsel
         done
         ><
         NDsel="$( prints s5- $NDsel )"
         return 0
      ;;
      Gw)
         local g=00
         Gsel=----------
         for g from 0 by 1 to 9 repeat
         do
            expr "-$1" :: "$g" || continue
            catv g =$g,1,Gsel
         done
         catv Gsel =$GWpos,10,0  <> $Script
         return 0
      ;;
      Gcopyg)
         local g="$1" n=00
         ifset g || return
         expr "$g" :: '[^0-9]' && return
         let "g>9" && return
         < $Script
         for n from 0 by 1 to 9 repeat
         do
            catv $((Gpos+g*260+n*26+4)),20,0 =$((n*20)),,CN
         done
         ><
         conv -t", " CN
         return 0
      ;;
      GcopyG)
         local grp="$1" g=00 n=00
         ifset grp || return
         expr "$grp" :: '[^0-9]' && return
         conv -t" ," CN
         <> $Script
         for g from 0 by 1 to 9 repeat
         do
            expr "$grp" :: $g || continue
            for n from 0 by 1 to 9 repeat
            do
               catv $((n*20)),20,CN =$((Gpos+g*260+n*26+4)),,0
            done
         done
         ><
         conv -t", " CN
         return 0
      ;;
      DCheck)
         local n=000 pos
         list -fR | {
            seek + 0 pos
            3< $Script
            seek $Dpos 3
            while readl -u3 Zeile
            do
               expr "$Zeile" :: '^#@D[0-9] ' || continue
               catv 5,,Zeile =Zeile:
               ifset Zeile || continue
               seek $pos 0
               grep -qFx -e "$Zeile" && continue
               #while readl zeile
               #do  cmpv Zeile zeile && continue 2;  done
               let ++n
               print -r "   $Zeile"
            done
            ><
         }
         let n || return 0
         echo "Es wurden $n Dateinamen gefunden, die im aktuellen"
         echo "Verzeichnis nicht existieren."
         echo "Dateieinträge entfernen? [J]: %c"
         read inp
         [ "$inp" != J ] && return 0
         catv $Dpos,,0 < $Script | {
            fstat +s $Dpos $Script
            >> $Script
            while readl Zeile Such
            do
               expr "$Zeile" :: '^#@D[0-9] ' || continue
               catv 5,,Zeile =Zeile:
               ifset Zeile || continue
               list -fR | grep -qFx -e "$Zeile" || continue
	       catv Such /%n
               #list -fR |
               #   while readl zeile
               #   do  cmpv Zeile zeile && { catv Such /%n; break; }
               #   done
            done
            ><
         }
         return 0
      ;;
      SetD)
         local tmp=$1 von=____ bis=____ n=0000 g=00 grp
         shift
         while let $#
         do
            grp="$1"
            expr "$grp" :: '[0-9]=[-0-9]' || continue
            conv -t"= " grp
            for 2 bis grp  in  $grp ; do :; done
            expr "$grp" :: '[^-0-9]' && continue
            expr "$grp" :: '-' && grp=-
            conv -t"- " bis
            for 2 von bis  in  $bis ; do :; done
            ifset bis || bis=$von
            expr "$von$bis" :: '[^0-9]' && continue
            let "!von||!bis||von>bis" && continue
            4< $tmp
            catv $Dpos,,0 < $Script | {
               fstat +s $Dpos $Script
               seek + 0 Pos
               while readl Such
               do
                  expr "$Such" :: '^#@D[0-9] ' || continue
                  catv 3,1,Such =g:
                  catv 5,,Such =Such:
                  seek 0 4; n=0
                  while readl -u4 zeile
                  do
                     let "++n<von||n>bis" && continue
                     cmpv Such zeile && continue 2
                  done
                  catv "/#@D$g " Such /%n >> $Script
               done
               seek 0 4; n=0
               while [ $grp != - ] && readl -u4 zeile
               do
                  let "++n<von||n>bis" && continue
                  for g from 0 by 1 to 9 repeat
                  do
                     expr "$grp" :: "$g" || continue
                     catv "/#@D$g " zeile /%n >> $Script
                  done
               done
            }
            ><
            shift
         done
         return 0
      ;;
      GetGrp)
         local grp=---------- g=0
         < $Script
         seek $Dpos 0
         while readl zeile
         do
            expr "$zeile" :: '^#@D[0-9] ' || continue
            catv 3,1,zeile =g:
            catv 5,,zeile =zeile:
            cmpv $1 zeile && catv g =$g,1,grp
         done
         ><
         $2=$grp
         return 0
      ;;
      Dateien)
         local n=000 tmp
         mktemp tmp
         > $tmp
         list -fR |
            while readl Zeile Such
            do
               conv -L Such
               expr "$Such" :: '.html%{0,1%}$' &&
                  catv Zeile /%n
            done
         ><
         3<&0
         while :
         do
            n=0
            < $tmp
            while readl Zeile
            do
               let ++n
               Fmain GetGrp Zeile inp
               prints ss4s "   $inp " $n ":$Zeile"
               let "n%20==0" && {
                  echo "Auswahl:a[-b]=0123456789- ..."
                  echo "Weiter:<Enter> %c"
                  read -u3 inp
                  ifset inp && Fmain SetD $tmp $inp
               }
            done
            ><
            echo "Auswahl:a[-b]=0123456789- ..."
            echo "Start:<Enter>  Beenden:e (EOF) %c"
            read -u3 inp
            ifset inp || continue
            [ "$inp" == e ] && break
            Fmain SetD $tmp $inp
         done
         ><
         remove $tmp
         return 0
      ;;
      ShowF)
         local nf=-001 rgb=000000000000 nl=-001 sel nam
         inp=""
         3<&0
         grep '^#@[Ff] ' $Script | Fconv | {
         seek + 0 Pos
         while :
         do
            nf=-1 nl=-1
	    seek $Pos 0
            while read nam rgb
            do
               let ++nf
               Zeile="$nam"; conv -U Zeile
               ifset inp && [[ "$Zeile" != "$inp" ]] && continue
               let ++nl
               prints s5s-20s4s4s4  $nf: $nam $rgb
               let "nl>0&&nl%20==0" && {
                  echo "Start:s  Beenden:e  Farbwahl:123 [456]..."
                  echo "Farbname:[*]xyz[*]  Weiter:<Enter>  %c"
                  read -u3 inp
                  conv -t"$(echo %t%c) " inp
                  [ "$inp" == e ] && break 2
                  [ "$inp" == s ] && { inp=; continue 2; }
                  expr "$inp" :: '[^ 0-9]' ||
                     expr "$inp" :: '[0-9]' && sel="$sel$inp " inp=
                  ifset inp && { conv -U inp; continue 2; }
               }
            done
            echo "Start:<Enter>  Beenden:e  Farbwahl:123 [456]..."
            echo "Farbname:[*]xyz[*]  (EOF)  %c"
            read -u3 inp
            conv -t"$(echo %t%c) " inp
            [ "$inp" == e ] && break
            conv -U inp
            ifset inp || continue
            expr "$inp" :: '[^ 0-9]' ||
               expr "$inp" :: '[0-9]' && sel="$sel$inp " inp=
         done
         }
         ><
         ifset sel || return 0
         echo Farbnamen-Selektion...
         nf=-1
         grep '^#@[Ff] ' $Script | Fconv | {
            while read nam rgb
            do
               let ++nf
               expr " $sel " :: " $nf " && Fsel="$Fsel$nf:$nam  "
            done
         }
         return 0
      ;;
      SetRGB)
         local r=$1 g=$2 b=$3
         r=$((16#, r&255)) g=$((16#, g&255)) b=$((16#, b&255))
         let "${#r}==1" && r="0$r"
         let "${#g}==1" && g="0$g"
         let "${#b}==1" && b="0$b"
         RGB="$r$g$b"
         conv -u RGB
         return 0
      ;;
      GetFnam)
         local nu=-001 rgb=000000000000 f="$1" nam
         conv -Ud, f
         while read nam rgb
         do
            let ++nu
            expr "$1" :: '^[0-9]%{1,3%}$' && {
               let "$1!=nu" && continue
               Fmain SetRGB $rgb; echo $nam; return 0
            }
            inp=$nam; conv -U inp
            [[ $inp != "$f" ]] && continue
            Fmain SetRGB $rgb; echo $nam; return 0
         done
         return 1
      ;;
      Help)
         local n=00000 j=/%j
         3<&0
         while :
         do
            echo ; prints sf-72
            n=0 j=/%j
            grep '^#@H ' $Script |
               while readl Zeile
               do
                  catv /%t 4,,Zeile $j
                  let "++n==20" &&
                     echo "Start:s  Beenden:e  Weiter:<Enter> %c"
                  let "n>=20" && { j=
                     read -u3 inp
                     [ "$inp" == e ] && break 2
                     [ "$inp" == s ] && continue 2
                  }
               done
            prints sf-72
            echo "Start:<Enter>  Beenden:e (EOF) %c"
            read -u3 inp
            [ "$inp" == e ] && break
         done
         ><
         return 0
      ;;
      *)  print -u2 "!!! $inp $* ???" ;;
   esac
   return
}


Fconv()  {
   local l=0000 o=0000 n=-00001
   while readl Zeile
   do
      print -nu2 "%t$((++n))    %r"
      expr "$Zeile" :: '^#@f' && { catv 4,,Zeile /%n; continue; }
      let "l=${#Zeile}, l<6||l&1" && {
         print -u2 "l=$l:falscher Wert!"; exit 1; }
      catv 4,,Zeile =Zeile:
      l=${#Zeile}
      while (( l>=16 ))
      do
         catv 0,2,Zeile /" " 2,2,Zeile /" " %
              4,2,Zeile /" " 6,2,Zeile /" " %
              8,2,Zeile /" " 10,2,Zeile /" " %
              12,2,Zeile /" " 14,2,Zeile | base -31 +b
         catv 16,,Zeile =Zeile:
         (( l-=16 ))
      done
      while (( l>=8 ))
      do
         catv 0,2,Zeile /" " 2,2,Zeile /" " %
              4,2,Zeile /" " 6,2,Zeile | base -31 +b
         catv 8,,Zeile =Zeile:
         (( l-=8 ))
      done
      (( o=-2, l+=2 ))
      while (( o+=2, l-=2, l>0 ))
      do
         catv $o,2,Zeile | base -31 +b
      done
      catv /%n
   done
   print -u2
   return 0
}



SetNH()  {
   local r=0
   [ "$1" == '#@W' ] && { r=000; shift; }
   let "$#&1" && { echo Ungerade ArgAnzahl; return 1; }
   let "$#<2" && return 1
   local n=$1 f="$(prints s20-)" pos=0000000000 fnam
   echo "... %c"
   grep '^#@[Ff] ' $Script | Fconv | {
      seek + 0 pos
      while let "$#>=2"
      do
         n=$1 f="$(prints s20-)"
         fnam=$( Fmain GetFnam "$2" )
         ifset fnam || { r=1; break; }
         echo "+$RGB%c"
         [ $r != 000 ] && catv fnam =f
         [ $r != 000 ] && catv f =$((20*[n-1])),20,CN
         catv RGB =$((6*[n-1])),6,Hex
         shift 2
         seek $pos 0
      done
   }
   echo
   return $r
}



Write()  {
   expr "$Gsel" :: '[0-9]' || return
   let $NDsel || return
   local g=00 n=0000 nn=0000
   mktemp zeile
   for g from 0 by 1 to 9 repeat
   do
      expr "$Gsel" :: $g || continue
      echo Gruppe $g...
      > $zeile
      < $Script
      seek $Dpos 0 ; n=0
      while readl Zeile
      do
         expr "$Zeile" :: "^#@D$g " || continue
         catv 5,,Zeile /%n ; let ++n ++nn
      done
      ><<
      let n || continue
      echo $n Dateien
      echo Farbgruppe setzen...
      SetNH '#@W' $(
         for n from 0 by 1 to 9 repeat
         do
            catv /"$((n+1)) " $((Gpos+g*260+n*26+4)),20,0 %
                 /%n  < $Script
         done
      ) || { print -u2 "Write: SetNH()==FALSE"; continue; }
      echo G=$g: HTML schreiben...
      WriteC $*
   done
   remove $zeile
   let nn && read "-?<Enter> "
   return 0
}



WriteC()  {
   [ $# -gt 0 ] || return
   local bgc='BGCOLOR' body='BODY'
   local s="$bgc" rgb=000000 hex
   Such=""
   while [ $# -gt 0 ]
   do
      let "hex=6*($1-1)"
      catv $hex,6,Hex =hex:
      case $1 in
        1)  Such="$Such BODY BGCOLOR $hex" ;;
        2)  Such="$Such TABLE BGCOLOR $hex" ;;
        3)  Such="$Such TR BGCOLOR $hex" ;;
        4)  Such="$Such TD BGCOLOR $hex" ;;
        5)  Such="$Such TH BGCOLOR $hex" ;;
        6)  Such="$Such BODY [^A-Za-z]LINK $hex" ;;
        7)  Such="$Such BODY VLINK $hex" ;;
        8)  Such="$Such BODY ALINK $hex" ;;
        9)  Such="$Such BODY TEXT $hex" ;;
       10)  Such="$Such FONT COLOR $hex" ;;
      esac
      shift
   done
   unset hex body
   local wrn=00 datei
   < $zeile    #DnamenTmpDatei
   while readl datei
   do
      [ -s "$datei" ] || continue
      print -rn "$datei" ...; inp=0
      0<> "$datei"
      while seek + 0 Pos; readl Zeile
      do
         let "${#Zeile}<19" && continue
         wrn=0
         for 3 s bgc rgb in $Such
         do
            [ $rgb == 010101 ] && continue
            expr "$Zeile" =:Zeile %
                 "%(<${s}[ %t][^>]*${bgc}[ %t]*=[ %t]*%"#%)......%"" %
                 "%1$rgb%"" || continue
            let "wrn|=512, ++inp"
         done
         let wrn && catv Zeile =$Pos,,0.
      done
      ><
      echo " $inp Schreibvorgänge"
   done
   ><
   return 0
}



echo Standardfarben setzen...
Fmain Gcopyg 1
#SetNH 1 Holz3 2 Elfenbein1 4 HellStahlBlau3 %
#      3 Elfenbein2 5 Weiß 6 StahlBlau3 7 StahlBlau4 %
#      8 Gold 9 Schwarz 10 Null
echo Dateienabgleich...
Fmain DCheck

Fsel="  " NDsel="    0"

echo
prints s:f-50 " bish-Script 'HTML-Farben' "
prints s:f-50 " Copyright (c) Helmut Schellong "
echo
read "-?<Enter> "


while Fmain NDGsel ; echo "%r
   Farbnamen-Notizen  : %"$Fsel%"%r
   Farbenliste/Notizen               : f [-]%r
   Dateienauswahl            $NDsel   : d%r
   Gruppenauswahl       $Gsel   : gw [0123456789]%r
   Gruppen-Farbensatz kopieren < | > : g n | G n...%r
   Farbziel auf Farbe setzen         : {1-10}={fnam|fnum} [n=f]...%r
   DokumentBG  $(catv   0,20,CN)  1%r
   TabellenBG  $(catv  20,20,CN)  2%r
   TabRowBG    $(catv  40,20,CN)  3%r
   TabColBG    $(catv  60,20,CN)  4%r
   TabHColBG   $(catv  80,20,CN)  5%r
   Link        $(catv 100,20,CN)  6%r
   BesuLink    $(catv 120,20,CN)  7%r
   AktiLink    $(catv 140,20,CN)  8%r
   Textfarbe   $(catv 160,20,CN)  9%r
   Fontfarbe   $(catv 180,20,CN) 10%r
   Link-/Text-/Font-Farben schreiben : L|T|F%r
   Alle Farbziele schreiben          : S%r
   Hilfe                             : h%r
   Beenden                           : E%r
%r
                                     : %c"
do
   read inp rest
   case "$inp" in
     d)  Fmain Dateien ;;
     f)  ifset rest && [ "$rest" == - ] && Fsel="  "
         ifset rest || Fmain ShowF ;;
     gw) Fmain Gw "$rest" ;;
     [Gg])  Fmain Gcopy$inp "$rest" ;;
     [1-9]=?*|10=?*)  conv -t"= " inp rest; SetNH $inp $rest ;;
     L)  Write 6 7 8 ;;
     T)  Write 9 ;;
     F)  Write 10 ;;
     S)  Write 1 2 3 4 5 6 7 8 9 10 ;;
     h)  Fmain Help ;;
     E)  break ;;
     *)  echo %a%c; continue ;;
   esac
done

exit 0

# Ab hier keinesfalls Änderungen an der Datei vornehmen!
# Ausnahmen: Eigene Farben "#@f ..." (siehe unten) und
             Dateiliste "#@D ..." am Ende.



#@F 2g3o3f3f111i111i111i
#@F 2l363b3q343l3t1111111h1111111h1111111h
#@F 2p383c78111j1m1m111j1m1m111j1m1m
#@F 2l363b3h3838111j1m1m111j1m1h111j1m1h
#@F 29383c3m3n2p383c78111j1l1p111j1l1p111j1m1m
#@F 2p383c78383l2k343o363b111j1l1m111j1l1m111j1l1m
#@F 29343c3h3m353i3l3i111j1j1h111j1j1h111j1j1h
#@F 243f3o3g383h2p383c78111j1m1m111j1m1h111j1l1h
#@F 233f3n2l3j3c3n3t38111j1m1k111j1l1m111j1k1h
#@F 2m3o363b2p383c78111j1m1h111j1l1h111j1k1h
#@F 233h3n3c3e2p383c78111j1m1h111j1k1m111j1i1m
#@F 2i343j343s342l343b3h38111j1m1m111j1k1q111j1i1k
#@F 2f343h37383f243f383c363b111j1m1m111j1k1m111j1h1m
#@F 2d383e3m111j1m1m111j1j1p111i1q1n
#@F 2i393c3l3m3c363b111j1m1m111j1i1p111i1p1m
#@F 2g343p343d3i2p383c78111j1m1m111j1j1j111i1o1k
#@F 2f3i3e3e343m3c3h111j1m1m111j1j1p111i1p1i
#@F 2d3i3l3h111j1m1m111j1l1p111j1j1h
#@F 273f39383h35383c3h111j1m1m111j1m1m111j1l1h
#@F 2s3c3n3l3i3h382l383c3738111j1m1m111j1m1h111j1h1m
#@F 2f38383l3g3o3m363b383f111j1m1m111j1l1m111j1k1p
#@F 2a3i3h3c3a3n343o111j1l1h111j1m1m111j1l1h
#@F 2i39383939383l3g3c3h3t2d3l383g38111j1l1m111j1m1m111j1m1h
#@F 233t3o3l111j1l1h111j1m1m111j1m1m
#@F 233f3c3638243f343o111j1l1h111j1l1p111j1m1m
#@F 2e343p383h37383f111j1k1h111j1k1h111j1m1h
#@F 2e343p383h37383f2k4o3n3f3c363b111j1m1m111j1l1h111j1l1m
#@F 2l363b3q34363b2k3i3m34111j1m1m111j1j1p111j1j1m
#@F 263o3h3e383f2l363b3c3839383l293l343o11111l1o11111o1q11111o1q
#@F 2a343f35373o3h3e383f293l343o111i1h1m111i1h1m111i1h1m
#@F 2l363b3c3839383l293l343o111i1i1j111i1j1p111i1l1l
#@F 2a383f3f2l363b3c3839383l293l343o111i1i1q111i1k1n111i1m1k
#@F 293l343o111i1q1h111i1q1h111i1q1h
#@F 2a383f3f293l343o111j1i1i111j1i1i111j1i1i
#@F 2f3c3n3n383l3h34363b3n243f343o11111j1m11111j1m111i1i1j
#@F 2f343l3c3h38243f343o1111111h1111111h111i1j1p
#@F 2d3i3l3h353f3o3g383h243f343o111i1h1h111i1l1q111j1k1o
#@F 263o3h3e383f2l363b3c3839383l243f343o11111o1j11111n1i111i1k1q
#@F 2l363b3c3839383l243f343o111i1h1n11111q1h111j1h1m
#@F 2f3c3n3n383f2l363b3c3839383l243f343o111i1j1k111i1h1l111j1k1p
#@F 2a383f3f2l363b3c3839383l243f343o111i1k1j111i1i1j111j1m1m
#@F 2f3c3n3n383f243f343o1111111h1111111h111j1h1m
#@F 2d4o3h3c3a243f343o11111n1m111i1h1m111j1j1m
#@F 243f343o1111111h1111111h111j1m1m
#@F 29343o3h383l243f343o11111k1h111i1l1l111j1m1m
#@F 2m3c38392a3c3g3g383f243f343o1111111h111i1q1i111j1m1m
#@F 2a3c3g3g383f243f343o111i1k1m111j1h1n111j1k1m
#@F 2a383f3f2a3c3g3g383f243f343o111i1k1m111j1h1n111j1m1h
#@F 2l3n343b3f243f343o11111o1h111i1k1h111i1p1h
#@F 2a383f3f2l3n343b3f243f343o111i1o1n111i1q1n111j1j1j
#@F 2a383f3f243f343o111i1o1k111j1i1n111j1k1h
#@F 2i3o37383l243f343o111i1o1n111j1j1l111j1k1h
#@F 243f34782m453l3e3c3m111i1o1m111j1k1p111j1k1p
#@F 263o3h3e383f2m453l3e3c3m1111111h111j1h1n111j1h1q
#@F 2f3c3n3n383f2m453l3e3c3m11111o1j111j1h1q111j1h1l
#@F 2m453l3e3c3m11111n1l111j1j1l111j1h1p
#@F 253s343h1111111h111j1m1m111j1m1m
#@F 2a383f3f253s343h111j1j1l111j1m1m111j1m1m
#@F 2d3437383n3n243f343o11111q1m111i1m1p111i1n1h
#@F 2f3c3n3n383f233k3o343g343l3c3h111i1h1j111j1h1m111i1o1h
#@F 233k3o343g343l3c3h111i1j1o111j1m1m111j1i1j
#@F 263o3h3e383f293l453h1111111h111i1h1h1111111h
#@F 263o3h3e383f2h3f3c3p293l453h11111p1m111i1h1o11111l1o
#@F 263o3h3e383f2f38383l293l453h111i1l1k111i1p1p111i1l1k
#@F 2f38383l293l453h11111l1n111i1k1q11111p1o
#@F 2f3c3n3n383f2f38383l293l453h11111n1h111i1o1q111i1i1k
#@F 2a383f3f2f38383l293l453h11111k1j111i1o1p111i1o1h
#@F 243f3478293l453h111i1m1j111j1m1i111i1m1j
#@F 283l453b3f3c3h3a293l453h1111111h111j1m1m111i1j1o
#@F 2k343m383h293l453h111i1j1l111j1m1j1111111h
#@F 293l453h1111111h111j1m1m1111111h
#@F 2d3l483o3n383l3f3c3e4o3l111i1j1o111j1m1m1111111h
#@F 2f3c3n3n383f283l453b3f3c3h3a293l453h1111111h111j1m1h111i1m1l
#@F 293l453h29383f35111i1o1k111j1m1m11111l1o
#@F 2e3c3g3i3h38293l453h11111m1h111j1h1m11111m1h
#@F 29383f35293l453h111i1m1l111j1h1m11111m1h
#@F 2p343f37293l453h11111k1l111i1k1q11111k1l
#@F 2h3f3c3p293l343o353l343o3h111i1h1o111i1l1j11111k1m
#@F 263o3h3e383f2d3b343e3c111i1p1q111i1p1k111i1h1o
#@F 2d3b343e3c111j1l1h111j1k1h111i1l1h
#@F 243f34782d343h3i3h383h3a3i3f37111j1k1p111j1k1j111i1o1h
#@F 2a383f3f2d343h3i3h383h3a3i3f3729383f35111j1m1h111j1m1h111j1i1h
#@F 2a383f3f29383f35111j1m1m111j1m1m111j1j1l
#@F 29383f35111j1m1m111j1m1m1111111h
#@F 293i3f37111j1m1m111j1i1m1111111h
#@F 2a383f3f2d343h3i3h383h3a3i3f37111j1k1p111j1j1i111i1k1h
#@F 2d343h3i3h383h3a3i3f37111j1i1p111i1n1m11111k1j
#@F 263o3h3e383f2d343h3i3h383h3a3i3f37111i1p1l111i1k1l11111i1i
#@F 2k3i3m34243l343o3h111i1p1p111i1l1k111i1l1k
#@F 2b3h373c343h383l2k3i3n111j1h1m11111q1j11111q1j
#@F 2l343n3n383f243l343o3h111i1k1q11111n1q11111i1q
#@F 2k3i3n353l343o3h111i1n1h11111p1j11111l1m
#@F 2i383l3o243l343o3h111j1h1m111i1k1k11111n1k
#@F 2a3i3f3t111j1j1j111i1p1l111i1k1m
#@F 24383c3a38111j1l1m111j1l1m111j1j1h
#@F 2g3478111j1l1m111j1j1j111i1o1q
#@F 2l343h37243l343o3h111j1l1l111i1n1l11111q1n
#@F 2a343o3n353l343o3h111j1i1h111i1p1h111i1l1h
#@F 2l363b3i3e3i3f343738111j1i1h111i1h1m11111k1h
#@F 2s3c383a383f3l3i3n111i1o1p11111k1l11111k1l
#@F 243l343o3h111i1n1m11111l1j11111l1j
#@F 263o3h3e383f2e34363b3m111j1k1k111i1m1h111i1j1j
#@F 2e34363b3m111j1m1h111i1j1p111i1i1l
#@F 2a383f3f2e34363b3m111j1m1m111i1n1h111i1j1j
#@F 2h3l343h3a38111j1m1m111i1n1m1111111h
#@F 263o3h3e383f2h3l343h3a38111j1m1m111i1l1h1111111h
#@F 2d3i3l343f3f38111j1m1m111i1j1o11111p1h
#@F 2a383f3f2d3i3l343f3f38111j1l1h111i1j1p111i1j1p
#@F 2m3i3g343n38111j1m1m11111q1q11111o1i
#@F 2h3l343h3a382k3i3n111j1m1m11111n1q1111111h
#@F 2k3i3n111j1m1m1111111h1111111h
#@F 2a3i3n2i3c3h3e111j1m1m111i1h1m111i1p1h
#@F 2m3c38392i3c3h3e111j1m1m11111j1h111i1l1o
#@F 2i3c3h3e111j1m1m111i1q1j111j1h1k
#@F 2a383f3f2i3c3h3e111j1m1m111i1p1j111i1q1k
#@F 243f34782o3c3i3f383n3n2k3i3n111j1i1q111i1i1j111i1l1o
#@F 2d343m3n343h3c38111i1o1n11111l1p11111q1n
#@F 2f3c3n3n383f2o3c3i3f383n3n2k3i3n111i1q1q11111j1i111i1k1k
#@F 2o3c3i3f383n3n2k3i3n111j1h1p11111k1j111i1l1l
#@F 2f343a383h3n34111j1m1m1111111h111j1m1m
#@F 2o3c3i3f383n3n111j1k1p111i1k1h111j1k1p
#@F 2i393f343o3g38111j1j1i111i1n1h111j1j1i
#@F 2h3l363b3c373838111j1i1p111i1i1j111j1i1l
#@F 2f3c3n3n383f2h3l363b3c373838111i1p1n11111p1m111j1i1i
#@F 263o3h3e383f2h3l363b3c373838111i1m1k11111m1h111j1h1l
#@F 263o3h3e383f2o3c3i3f383n3n111i1l1p1111111h111j1i1i
#@F 243f343o2o3c3i3f383n3n111i1k1p11111l1k111j1j1n
#@F 2e3c3f34111i1n1h11111k1j111j1l1h
#@F 2f3c3n3n383f2e3c3f34111i1l1o111i1i1j111j1i1q
#@F 263c3m3n383f111j1i1n111i1q1i111j1i1n
#@F 2l363b3h38381i111j1m1m111j1m1h111j1m1h
#@F 2l363b3h38381j111j1k1p111j1k1k111j1k1k
#@F 2l363b3h38381k111j1h1m111j1h1i111j1h1i
#@F 2l363b3h38381l111i1k1q111i1k1o111i1k1o
#@F 2f38383l3g3o3m363b383f1i111j1m1m111j1l1m111j1k1p
#@F 2f38383l3g3o3m363b383f1j111j1k1p111j1j1q111j1j1j
#@F 2f38383l3g3o3m363b383f1k111j1h1m111i1q1o111i1q1i
#@F 2f38383l3g3o3m363b383f1l111i1k1q111i1k1l111i1k1h
#@F 233h3n3c3e2p383c781i111j1m1m111j1k1q111j1i1q
#@F 233h3n3c3e2p383c781j111j1k1p111j1j1k111j1h1l
#@F 233h3n3c3e2p383c781k111j1h1m111i1q1j111i1o1n
#@F 233h3n3c3e2p383c781l111i1k1q111i1k1i111i1j1h
#@F 2d383e3m1i111j1m1m111j1j1p111i1q1n
#@F 2d383e3m1j111j1k1p111j1i1k111i1p1k
#@F 2d383e3m1k111j1h1m111i1p1k111i1m1p
#@F 2d383e3m1l111i1k1q111i1j1m111i1h1o
#@F 2i393c3l3m3c363b1i111j1m1m111j1i1p111i1p1m
#@F 2i393c3l3m3c363b1j111j1k1p111j1h1k111i1o1k
#@F 2i393c3l3m3c363b1k111j1h1m111i1o1m111i1l1q
#@F 2i393c3l3m3c363b1l111i1k1q111i1i1q111i1h1i
#@F 2g343p343d3i2p383c781i111j1m1m111j1j1j111i1o1k
#@F 2g343p343d3i2p383c781j111j1k1p111j1h1o111i1n1i
#@F 2g343p343d3i2p383c781k111j1h1m111i1o1q111i1k1q
#@F 2g343p343d3i2p383c781l111i1k1q111i1j1i11111q1l
#@F 2s3c3n3l3i3h382l383c37381i111j1m1m111j1m1h111j1h1m
#@F 2s3c3n3l3i3h382l383c37381j111j1k1p111j1k1k111i1q1i
#@F 2s3c3n3l3i3h382l383c37381k111j1h1m111j1h1i111i1n1m
#@F 2s3c3n3l3i3h382l383c37381l111i1k1q111i1k1o111i1i1j
#@F 2d3i3l3h1i111j1m1m111j1l1p111j1j1h
#@F 2d3i3l3h1j111j1k1p111j1k1j111j1h1m
#@F 2d3i3l3h1k111j1h1m111j1h1h111i1o1o
#@F 2d3i3l3h1l111i1k1q111i1k1n111i1j1h
#@F 273f39383h35383c3h1i111j1m1m111j1m1m111j1l1h
#@F 273f39383h35383c3h1j111j1k1p111j1k1p111j1j1l
#@F 273f39383h35383c3h1k111j1h1m111j1h1m111i1q1k
#@F 273f39383h35383c3h1l111i1k1q111i1k1q111i1k1i
#@F 2a3i3h3c3a3n343o1i111j1l1h111j1m1m111j1l1h
#@F 2a3i3h3c3a3n343o1j111j1j1l111j1k1p111j1j1l
#@F 2a3i3h3c3a3n343o1k111i1q1k111j1h1m111i1q1k
#@F 2a3i3h3c3a3n343o1l111i1k1i111i1k1q111i1k1i
#@F 2e343p383h37383f2k4o3n3f3c363b1i111j1m1m111j1l1h111j1l1m
#@F 2e343p383h37383f2k4o3n3f3c363b1j111j1k1p111j1j1l111j1j1q
#@F 2e343p383h37383f2k4o3n3f3c363b1k111j1h1m111i1q1k111i1q1o
#@F 2e343p383h37383f2k4o3n3f3c363b1l111i1k1q111i1k1i111i1k1l
#@F 2l363b3q34363b2k3i3m341i111j1m1m111j1j1p111j1j1m
#@F 2l363b3q34363b2k3i3m341j111j1k1p111j1i1k111j1i1h
#@F 2l363b3q34363b2k3i3m341k111j1h1m111i1p1k111i1p1i
#@F 2l363b3q34363b2k3i3m341l111i1k1q111i1j1m111i1j1k
#@F 233t3o3l1i111j1l1h111j1m1m111j1m1m
#@F 233t3o3l1j111j1j1l111j1k1p111j1k1p
#@F 233t3o3l1k111i1q1k111j1h1m111j1h1m
#@F 233t3o3l1l111i1k1i111i1k1q111i1k1q
#@F 2l363b3c3839383l243f343o1i111i1k1i111i1i1i111j1m1m
#@F 2l363b3c3839383l243f343o1j111i1j1j111i1h1k111j1k1p
#@F 2l363b3c3839383l243f343o1k111i1h1m11111p1q111j1h1m
#@F 2l363b3c3839383l243f343o1l11111o1i11111n1h111i1k1q
#@F 2d4o3h3c3a243f343o1i11111o1j111i1i1p111j1m1m
#@F 2d4o3h3c3a243f343o1j11111n1o111i1i1h111j1k1p
#@F 2d4o3h3c3a243f343o1k11111m1p11111q1m111j1h1m
#@F 2d4o3h3c3a243f343o1l11111k1q11111n1l111i1k1q
#@F 243f343o1i1111111h1111111h111j1m1m
#@F 243f343o1j1111111h1111111h111j1k1p
#@F 243f343o1k1111111h1111111h111j1h1m
#@F 243f343o1l1111111h1111111h111i1k1q
#@F 29343o3h383l243f343o1i11111k1h111i1l1l111j1m1m
#@F 29343o3h383l243f343o1j11111j1p111i1k1l111j1k1p
#@F 29343o3h383l243f343o1k11111j1l111i1i1n111j1h1m
#@F 29343o3h383l243f343o1l11111i1n11111o1p111i1k1q
#@F 2l3n343b3f243f343o1i11111q1q111i1p1l111j1m1m
#@F 2l3n343b3f243f343o1j11111q1j111i1o1j111j1k1p
#@F 2l3n343b3f243f343o1k11111o1q111i1l1p111j1h1m
#@F 2l3n343b3f243f343o1l11111m1l111i1h1h111i1k1q
#@F 2m3c38392a3c3g3g383f243f343o1i1111111h111i1q1i111j1m1m
#@F 2m3c38392a3c3g3g383f243f343o1j1111111h111i1o1p111j1k1p
#@F 2m3c38392a3c3g3g383f243f343o1k1111111h111i1m1l111j1h1m
#@F 2m3c38392a3c3g3g383f243f343o1l1111111h111i1h1l111i1k1q
#@F 2a3c3g3g383f243f343o1i111i1k1m111j1h1n111j1m1m
#@F 2a3c3g3g383f243f343o1j111i1j1n111i1q1j111j1k1p
#@F 2a3c3g3g383f243f343o1k111i1h1p111i1n1n111j1h1m
#@F 2a3c3g3g383f243f343o1l11111o1l111i1i1j111i1k1q
#@F 2a383f3f2a3c3g3g383f243f343o1i111i1o1n111j1j1n111j1m1m
#@F 2a383f3f2a3c3g3g383f243f343o1j111i1n1l111j1i1i111j1k1p
#@F 2a383f3f2a3c3g3g383f243f343o1k111i1l1i111i1p1j111j1h1m
#@F 2a383f3f2a3c3g3g383f243f343o1l11111q1n111i1j1k111i1k1q
#@F 2l363b3c3839383l293l343o1i111i1q1p111j1j1n111j1m1m
#@F 2l363b3c3839383l293l343o1j111i1p1m111j1i1i111j1k1p
#@F 2l363b3c3839383l293l343o1k111i1m1q111i1p1j111j1h1m
#@F 2l363b3c3839383l293l343o1l111i1h1p111i1j1k111i1k1q
#@F 2a383f3f2l3n343b3f243f343o1i111j1h1j111j1j1m111j1m1m
#@F 2a383f3f2l3n343b3f243f343o1j111i1p1p111j1i1h111j1k1p
#@F 2a383f3f2l3n343b3f243f343o1k111i1n1j111i1p1i111j1h1m
#@F 2a383f3f2l3n343b3f243f343o1l111i1i1h111i1j1k111i1k1q
#@F 2a383f3f243f343o1i111i1q1i111j1k1q111j1m1m
#@F 2a383f3f243f343o1j111i1o1p111j1j1k111j1k1p
#@F 2a383f3f243f343o1k111i1m1l111i1q1j111j1h1m
#@F 2a383f3f243f343o1l111i1h1l111i1k1i111i1k1q
#@F 2a383f3f253s343h1i111j1j1l111j1m1m111j1m1m
#@F 2a383f3f253s343h1j111j1h1q111j1k1p111j1k1p
#@F 2a383f3f253s343h1k111i1p1h111j1h1m111j1h1m
#@F 2a383f3f253s343h1l111i1j1j111i1k1q111i1k1q
#@F 243f34782m453l3e3c3m1i111i1p1o111j1m1m111j1m1m
#@F 243f34782m453l3e3c3m1j111i1o1l111j1k1p111j1k1p
#@F 243f34782m453l3e3c3m1k111i1m1h111j1h1m111j1h1m
#@F 243f34782m453l3e3c3m1l111i1h1j111i1k1q111i1k1q
#@F 2d3437383n3n243f343o1i111i1m1j111j1l1m111j1m1m
#@F 2d3437383n3n243f343o1j111i1l1j111j1j1q111j1k1p
#@F 2d3437383n3n243f343o1k111i1j1j111i1q1o111j1h1m
#@F 2d3437383n3n243f343o1l11111p1k111i1k1l111i1k1q
#@F 2m453l3e3c3m1i1111111h111j1l1m111j1m1m
#@F 2m453l3e3c3m1j1111111h111j1j1q111j1k1p
#@F 2m453l3e3c3m1k1111111h111i1q1o111j1h1m
#@F 2m453l3e3c3m1l1111111h111i1k1l111i1k1q
#@F 253s343h1i1111111h111j1m1m111j1m1m
#@F 253s343h1j1111111h111j1k1p111j1k1p
#@F 253s343h1k1111111h111j1h1m111j1h1m
#@F 253s343h1l1111111h111i1k1q111i1k1q
#@F 263o3h3e383f2l363b3c3839383l293l343o1i111i1m1i111j1m1m111j1m1m
#@F 263o3h3e383f2l363b3c3839383l293l343o1j111i1l1i111j1k1p111j1k1p
#@F 263o3h3e383f2l363b3c3839383l293l343o1k111i1j1i111j1h1m111j1h1m
#@F 263o3h3e383f2l363b3c3839383l293l343o1l11111p1j111i1k1q111i1k1q
#@F 233k3o343g343l3c3h1i111i1j1o111j1m1m111j1i1j
#@F 233k3o343g343l3c3h1j111i1i1p111j1k1p111i1q1p
#@F 233k3o343g343l3c3h1k111i1h1j111j1h1m111i1o1h
#@F 233k3o343g343l3c3h1l11111n1q111i1k1q111i1i1n
#@F 263o3h3e383f2f38383l293l453h1i111i1q1k111j1m1m111i1q1k
#@F 263o3h3e383f2f38383l293l453h1j111i1p1h111j1k1p111i1p1h
#@F 263o3h3e383f2f38383l293l453h1k111i1m1m111j1h1m111i1m1m
#@F 263o3h3e383f2f38383l293l453h1l111i1h1m111i1k1q111i1h1m
#@F 2f38383l293l453h1i11111p1l111j1m1m111i1m1q
#@F 2f38383l293l453h1j11111o1p111j1k1p111i1l1p
#@F 2f38383l293l453h1k11111n1o111j1h1m111i1j1p
#@F 2f38383l293l453h1l11111l1n111i1k1q11111p1o
#@F 243f3478293l453h1i111i1m1l111j1m1m111i1m1l
#@F 243f3478293l453h1j111i1l1l111j1k1p111i1l1l
#@F 243f3478293l453h1k111i1j1l111j1h1m111i1j1l
#@F 243f3478293l453h1l11111p1l111i1k1q11111p1l
#@F 283l453b3f3c3h3a293l453h1i1111111h111j1m1m111i1j1o
#@F 283l453b3f3c3h3a293l453h1j1111111h111j1k1p111i1i1p
#@F 283l453b3f3c3h3a293l453h1k1111111h111j1h1m111i1h1j
#@F 283l453b3f3c3h3a293l453h1l1111111h111i1k1q11111n1q
#@F 293l453h1i1111111h111j1m1m1111111h
#@F 293l453h1j1111111h111j1k1p1111111h
#@F 293l453h1k1111111h111j1h1m1111111h
#@F 293l453h1l1111111h111i1k1q1111111h
#@F 2d3l483o3n383l3f3c3e4o3l1i111i1j1o111j1m1m1111111h
#@F 2d3l483o3n383l3f3c3e4o3l1j111i1i1p111j1k1p1111111h
#@F 2d3l483o3n383l3f3c3e4o3l1k111i1h1j111j1h1m1111111h
#@F 2d3l483o3n383l3f3c3e4o3l1l11111n1q111i1k1q1111111h
#@F 2h3f3c3p293l343o353l343o3h1i111i1q1j111j1m1m11111n1j
#@F 2h3f3c3p293l343o353l343o3h1j111i1o1q111j1k1p11111m1p
#@F 2h3f3c3p293l343o353l343o3h1k111i1m1l111j1h1m11111m1h
#@F 2h3f3c3p293l343o353l343o3h1l111i1h1m111i1k1q11111k1l
#@F 263o3h3e383f2h3f3c3p293l453h1i111j1h1j111j1m1m111i1i1j
#@F 263o3h3e383f2h3f3c3p293l453h1j111i1p1p111j1k1p111i1h1l
#@F 263o3h3e383f2h3f3c3p293l453h1k111i1n1j111j1h1m11111q1h
#@F 263o3h3e383f2h3f3c3p293l453h1l111i1i1h111i1k1q11111n1i
#@F 2d3b343e3c1i111j1m1m111j1l1n111i1l1k
#@F 2d3b343e3c1j111j1k1p111j1k1h111i1k1k
#@F 2d3b343e3c1k111j1h1m111i1q1p111i1i1m
#@F 2d3b343e3c1l111i1k1q111i1k1l11111o1p
#@F 2a383f3f2d343h3i3h383h3a3i3f371i111j1m1m111j1k1n111i1k1q
#@F 2a383f3f2d343h3i3h383h3a3i3f371j111j1k1p111j1j1h111i1k1h
#@F 2a383f3f2d343h3i3h383h3a3i3f371k111j1h1m111i1q1h111i1i1j
#@F 2a383f3f2d343h3i3h383h3a3i3f371l111i1k1q111i1j1q11111o1n
#@F 2a383f3f29383f351i111j1m1m111j1m1m111j1j1l
#@F 2a383f3f29383f351j111j1k1p111j1k1p111j1h1q
#@F 2a383f3f29383f351k111j1h1m111j1h1m111i1p1h
#@F 2a383f3f29383f351l111i1k1q111i1k1q111i1j1j
#@F 29383f351i111j1m1m111j1m1m1111111h
#@F 29383f351j111j1k1p111j1k1p1111111h
#@F 29383f351k111j1h1m111j1h1m1111111h
#@F 29383f351l111i1k1q111i1k1q1111111h
#@F 293i3f371i111j1m1m111j1i1m1111111h
#@F 293i3f371j111j1k1p111j1h1i1111111h
#@F 293i3f371k111j1h1m111i1o1k1111111h
#@F 293i3f371l111i1k1q111i1i1o1111111h
#@F 2d343h3i3h383h3a3i3f371i111j1m1m111i1q1k11111k1o
#@F 2d343h3i3h383h3a3i3f371j111j1k1p111i1p1h11111k1l
#@F 2d343h3i3h383h3a3i3f371k111j1h1m111i1m1m11111j1q
#@F 2d343h3i3h383h3a3i3f371l111i1k1q111i1h1m11111j1h
#@F 263o3h3e383f2d343h3i3h383h3a3i3f371i111j1m1m111i1p1m11111i1m
#@F 263o3h3e383f2d343h3i3h383h3a3i3f371j111j1k1p111i1o1k11111i1l
#@F 263o3h3e383f2d343h3i3h383h3a3i3f371k111j1h1m111i1l1q11111i1j
#@F 263o3h3e383f2d343h3i3h383h3a3i3f371l111i1k1q111i1h1i1111111p
#@F 2k3i3m34243l343o3h1i111j1m1m111i1q1k111i1q1k
#@F 2k3i3m34243l343o3h1j111j1k1p111i1p1h111i1p1h
#@F 2k3i3m34243l343o3h1k111j1h1m111i1m1m111i1m1m
#@F 2k3i3m34243l343o3h1l111i1k1q111i1h1m111i1h1m
#@F 2b3h373c343h383l2k3i3n1i111j1m1m111i1h1n111i1h1n
#@F 2b3h373c343h383l2k3i3n1j111j1k1p11111q1q11111q1q
#@F 2b3h373c343h383l2k3i3n1k111j1h1m11111p1m11111p1m
#@F 2b3h373c343h383l2k3i3n1l111i1k1q11111m1p11111m1p
#@F 2k3i3n353l343o3h1i111j1m1m111i1k1h11111o1i
#@F 2k3i3n353l343o3h1j111j1k1p111i1j1i11111n1n
#@F 2k3i3n353l343o3h1k111j1h1m111i1h1l11111m1o
#@F 2k3i3n353l343o3h1l111i1k1q11111o1i11111k1p
#@F 2a3i3f3t1i111j1m1m111j1i1i111i1m1m
#@F 2a3i3f3t1j111j1k1p111i1q1o111i1l1m
#@F 2a3i3f3t1k111j1h1m111i1o1h111i1j1m
#@F 2a3i3f3t1l111i1k1q111i1i1m11111p1m
#@F 2g34781i111j1m1m111j1k1i111i1p1n
#@F 2g34781j111j1k1p111j1i1n111i1o1l
#@F 2g34781k111j1h1m111i1p1n111i1m1h
#@F 2g34781l111i1k1q111i1j1n111i1h1j
#@F 2a343o3n353l343o3h1i111j1m1m111i1n1m11111o1q
#@F 2a343o3n353l343o3h1j111j1k1p111i1m1l11111o1k
#@F 2a343o3n353l343o3h1k111j1h1m111i1k1k11111n1k
#@F 2a343o3n353l343o3h1l111i1k1q11111q1h11111l1k
#@F 2l363b3i3e3i3f3437381i111j1m1m111i1j1o11111k1n
#@F 2l363b3i3e3i3f3437381j111j1k1p111i1i1p11111k1k
#@F 2l363b3i3e3i3f3437381k111j1h1m111i1h1j11111j1q
#@F 2l363b3i3e3i3f3437381l111i1k1q11111n1q11111i1q
#@F 2s3c383a383f3l3i3n1i111j1m1m11111l1p11111l1p
#@F 2s3c383a383f3l3i3n1j111j1k1p11111l1l11111l1l
#@F 2s3c383a383f3l3i3n1k111j1h1m11111k1p11111k1p
#@F 2s3c383a383f3l3i3n1l111i1k1q11111j1n11111j1n
#@F 243l343o3h1i111j1m1m11111n1l11111n1l
#@F 243l343o3h1j111j1k1p11111m1q11111m1q
#@F 243l343o3h1k111j1h1m11111m1i11111m1i
#@F 243l343o3h1l111i1k1q11111k1m11111k1m
#@F 2e34363b3m1i111j1m1m111i1l1h111i1h1m
#@F 2e34363b3m1j111j1k1p111i1k1h11111q1p
#@F 2e34363b3m1k111j1h1m111i1i1j11111p1l
#@F 2e34363b3m1l111i1k1q11111o1n11111m1o
#@F 2a383f3f2e34363b3m1i111j1m1m111i1n1h111i1j1j
#@F 2a383f3f2e34363b3m1j111j1k1p111i1l1q111i1i1l
#@F 2a383f3f2e34363b3m1k111j1h1m111i1j1q11111q1p
#@F 2a383f3f2e34363b3m1l111i1k1q11111p1o11111n1n
#@F 2h3l343h3a381i111j1m1m111i1n1m1111111h
#@F 2h3l343h3a381j111j1k1p111i1m1l1111111h
#@F 2h3l343h3a381k111j1h1m111i1k1k1111111h
#@F 2h3l343h3a381l111i1k1q11111q1h1111111h
#@F 263o3h3e383f2h3l343h3a381i111j1m1m111i1j1o1111111h
#@F 263o3h3e383f2h3l343h3a381j111j1k1p111i1i1p1111111h
#@F 263o3h3e383f2h3l343h3a381k111j1h1m111i1h1j1111111h
#@F 263o3h3e383f2h3l343h3a381l111i1k1q11111n1q1111111h
#@F 2d3i3l343f3f381i111j1m1m111i1i1l11111p1n
#@F 2d3i3l343f3f381j111j1k1p111i1h1n11111p1h
#@F 2d3i3l343f3f381k111j1h1m11111q1i11111n1q
#@F 2d3i3l343f3f381l111i1k1q11111n1j11111l1o
#@F 2m3i3g343n381i111j1m1m11111q1q11111o1i
#@F 2m3i3g343n381j111j1k1p11111q1j11111n1n
#@F 2m3i3g343n381k111j1h1m11111o1q11111m1o
#@F 2m3i3g343n381l111i1k1q11111m1l11111k1p
#@F 2h3l343h3a382k3i3n1i111j1m1m11111n1q1111111h
#@F 2h3l343h3a382k3i3n1j111j1k1p11111n1l1111111h
#@F 2h3l343h3a382k3i3n1k111j1h1m11111m1m1111111h
#@F 2h3l343h3a382k3i3n1l111i1k1q11111k1o1111111h
#@F 2k3i3n1i111j1m1m1111111h1111111h
#@F 2k3i3n1j111j1k1p1111111h1111111h
#@F 2k3i3n1k111j1h1m1111111h1111111h
#@F 2k3i3n1l111i1k1q1111111h1111111h
#@F 2m3c38392i3c3h3e1i111j1m1m11111j1h111i1l1o
#@F 2m3c38392i3c3h3e1j111j1k1p11111i1p111i1k1o
#@F 2m3c38392i3c3h3e1k111j1h1m11111i1n111i1i1p
#@F 2m3c38392i3c3h3e1l111i1k1q11111i1h11111p1h
#@F 2a3i3n2i3c3h3e1i111j1m1m111i1i1h111i1p1h
#@F 2a3i3n2i3c3h3e1j111j1k1p111i1h1n111i1n1o
#@F 2a3i3n2i3c3h3e1k111j1h1m11111q1n111i1l1l
#@F 2a3i3n2i3c3h3e1l111i1k1q11111m1p11111q1p
#@F 2i3c3h3e1i111j1m1m111i1p1i111i1q1o
#@F 2i3c3h3e1j111j1k1p111i1n1q111i1p1l
#@F 2i3c3h3e1k111j1h1m111i1l1m111i1m1p
#@F 2i3c3h3e1l111i1k1q11111q1q111i1h1p
#@F 2a383f3f2i3c3h3e1i111j1m1m111i1o1l111i1p1m
#@F 2a383f3f2i3c3h3e1j111j1k1p111i1n1j111i1o1k
#@F 2a383f3f2i3c3h3e1k111j1h1m111i1l1h111i1l1q
#@F 2a383f3f2i3c3h3e1l111i1k1q11111q1m111i1h1i
#@F 243f34782o3c3i3f383n3n2k3i3n1i111j1m1m111i1k1h111i1o1i
#@F 243f34782o3c3i3f383n3n2k3i3n1j111j1k1p111i1j1i111i1m1q
#@F 243f34782o3c3i3f383n3n2k3i3n1k111j1h1m111i1h1l111i1k1o
#@F 243f34782o3c3i3f383n3n2k3i3n1l111i1k1q11111o1i11111q1k
#@F 2d343m3n343h3c381i111j1m1m11111m1j111i1o1q
#@F 2d343m3n343h3c381j111j1k1p11111l1p111i1n1o
#@F 2d343m3n343h3c381k111j1h1m11111l1i111i1l1l
#@F 2d343m3n343h3c381l111i1k1q11111j1p11111q1p
#@F 2o3c3i3f383n3n2k3i3n1i111j1m1m11111n1j111i1m1h
#@F 2o3c3i3f383n3n2k3i3n1j111j1k1p11111m1p111i1l1h
#@F 2o3c3i3f383n3n2k3i3n1k111j1h1m11111m1h111i1j1h
#@F 2o3c3i3f383n3n2k3i3n1l111i1k1q11111k1l11111p1j
#@F 2f343a383h3n341i111j1m1m1111111h111j1m1m
#@F 2f343a383h3n341j111j1k1p1111111h111j1k1p
#@F 2f343a383h3n341k111j1h1m1111111h111j1h1m
#@F 2f343a383h3n341l111i1k1q1111111h111i1k1q
#@F 2h3l363b3c3738381i111j1m1m111i1k1i111j1m1h
#@F 2h3l363b3c3738381j111j1k1p111i1j1j111j1k1k
#@F 2h3l363b3c3738381k111j1h1m111i1h1m111j1h1i
#@F 2h3l363b3c3738381l111i1k1q11111o1i111i1k1o
#@F 2i393f343o3g381i111j1m1m111i1p1o111j1m1m
#@F 2i393f343o3g381j111j1k1p111i1o1l111j1k1p
#@F 2i393f343o3g381k111j1h1m111i1m1h111j1h1m
#@F 2i393f343o3g381l111i1k1q111i1h1j111i1k1q
#@F 2f3c3n3n383f2h3l363b3c3738381i111j1j1l111i1h1j111j1m1m
#@F 2f3c3n3n383f2h3l363b3c3738381j111j1h1q11111q1m111j1k1p
#@F 2f3c3n3n383f2h3l363b3c3738381k111i1p1h11111p1j111j1h1m
#@F 2f3c3n3n383f2h3l363b3c3738381l111i1j1j11111m1m111i1k1q
#@F 263o3h3e383f2h3l363b3c3738381i111i1q1i11111n1j111j1m1m
#@F 263o3h3e383f2h3l363b3c3738381j111i1o1p11111m1p111j1k1p
#@F 263o3h3e383f2h3l363b3c3738381k111i1m1l11111m1h111j1h1m
#@F 263o3h3e383f2h3l363b3c3738381l111i1h1l11111k1l111i1k1q
#@F 2e3c3f341i111i1m1m11111l1p111j1m1m
#@F 2e3c3f341j111i1l1m11111l1l111j1k1p
#@F 2e3c3f341k111i1j1m11111k1p111j1h1m
#@F 2e3c3f341l11111p1m11111j1n111i1k1q
#@F 2f3c3n3n383f2e3c3f341i111i1o1i111i1k1h111j1m1m
#@F 2f3c3n3n383f2e3c3f341j111i1m1q111i1j1i111j1k1p
#@F 2f3c3n3n383f2e3c3f341k111i1k1o111i1h1l111j1h1m
#@F 2f3c3n3n383f2e3c3f341l11111q1k11111o1i111i1k1q
#@F 263c3m3n383f1i111j1m1m111j1j1m111j1m1m
#@F 263c3m3n383f1j111j1k1p111j1i1h111j1k1p
#@F 263c3m3n383f1k111j1h1m111i1p1i111j1h1m
#@F 263c3m3n383f1l111i1k1q111i1j1k111i1k1q
#@F 293l343o1h1111111h1111111h1111111h
#@F 293l343o1i1111111k1111111k1111111k
#@F 293l343o1j1111111m1111111m1111111m
#@F 293l343o1k1111111p1111111p1111111p
#@F 293l343o1l11111i1h11111i1h11111i1h
#@F 293l343o1m11111i1k11111i1k11111i1k
#@F 293l343o1n11111i1m11111i1m11111i1m
#@F 293l343o1o11111i1p11111i1p11111i1p
#@F 293l343o1p11111j1h11111j1h11111j1h
#@F 293l343o1q11111j1k11111j1k11111j1k
#@F 293l343o1i1h11111j1n11111j1n11111j1n
#@F 293l343o1i1i11111j1p11111j1p11111j1p
#@F 293l343o1i1j11111k1i11111k1i11111k1i
#@F 293l343o1i1k11111k1k11111k1k11111k1k
#@F 293l343o1i1l11111k1n11111k1n11111k1n
#@F 293l343o1i1m11111k1p11111k1p11111k1p
#@F 293l343o1i1n11111l1i11111l1i11111l1i
#@F 293l343o1i1o11111l1k11111l1k11111l1k
#@F 293l343o1i1p11111l1n11111l1n11111l1n
#@F 293l343o1i1q11111l1p11111l1p11111l1p
#@F 293l343o1j1h11111m1i11111m1i11111m1i
#@F 293l343o1j1i11111m1l11111m1l11111m1l
#@F 293l343o1j1j11111m1n11111m1n11111m1n
#@F 293l343o1j1k11111m1q11111m1q11111m1q
#@F 293l343o1j1l11111n1i11111n1i11111n1i
#@F 293l343o1j1m11111n1l11111n1l11111n1l
#@F 293l343o1j1n11111n1n11111n1n11111n1n
#@F 293l343o1j1o11111n1q11111n1q11111n1q
#@F 293l343o1j1p11111o1i11111o1i11111o1i
#@F 293l343o1j1q11111o1l11111o1l11111o1l
#@F 293l343o1k1h11111o1o11111o1o11111o1o
#@F 293l343o1k1i11111o1q11111o1q11111o1q
#@F 293l343o1k1j11111p1j11111p1j11111p1j
#@F 293l343o1k1k11111p1l11111p1l11111p1l
#@F 293l343o1k1l11111p1o11111p1o11111p1o
#@F 293l343o1k1m11111p1q11111p1q11111p1q
#@F 293l343o1k1n11111q1j11111q1j11111q1j
#@F 293l343o1k1o11111q1l11111q1l11111q1l
#@F 293l343o1k1p11111q1o11111q1o11111q1o
#@F 293l343o1k1q11111q1q11111q1q11111q1q
#@F 293l343o1l1h111i1h1j111i1h1j111i1h1j
#@F 293l343o1l1i111i1h1m111i1h1m111i1h1m
#@F 293l343o1l1j111i1h1o111i1h1o111i1h1o
#@F 293l343o1l1k111i1i1h111i1i1h111i1i1h
#@F 293l343o1l1l111i1i1j111i1i1j111i1i1j
#@F 293l343o1l1m111i1i1m111i1i1m111i1i1m
#@F 293l343o1l1n111i1i1o111i1i1o111i1i1o
#@F 293l343o1l1o111i1j1h111i1j1h111i1j1h
#@F 293l343o1l1p111i1j1j111i1j1j111i1j1j
#@F 293l343o1l1q111i1j1m111i1j1m111i1j1m
#@F 293l343o1m1h111i1j1o111i1j1o111i1j1o
#@F 293l343o1m1i111i1k1h111i1k1h111i1k1h
#@F 293l343o1m1j111i1k1k111i1k1k111i1k1k
#@F 293l343o1m1k111i1k1m111i1k1m111i1k1m
#@F 293l343o1m1l111i1k1p111i1k1p111i1k1p
#@F 293l343o1m1m111i1l1h111i1l1h111i1l1h
#@F 293l343o1m1n111i1l1k111i1l1k111i1l1k
#@F 293l343o1m1o111i1l1m111i1l1m111i1l1m
#@F 293l343o1m1p111i1l1p111i1l1p111i1l1p
#@F 293l343o1m1q111i1m1h111i1m1h111i1m1h
#@F 293l343o1n1h111i1m1k111i1m1k111i1m1k
#@F 293l343o1n1i111i1m1n111i1m1n111i1m1n
#@F 293l343o1n1j111i1m1p111i1m1p111i1m1p
#@F 293l343o1n1k111i1n1i111i1n1i111i1n1i
#@F 293l343o1n1l111i1n1k111i1n1k111i1n1k
#@F 293l343o1n1m111i1n1n111i1n1n111i1n1n
#@F 293l343o1n1n111i1n1p111i1n1p111i1n1p
#@F 293l343o1n1o111i1o1i111i1o1i111i1o1i
#@F 293l343o1n1p111i1o1k111i1o1k111i1o1k
#@F 293l343o1n1q111i1o1n111i1o1n111i1o1n
#@F 293l343o1o1h111i1o1q111i1o1q111i1o1q
#@F 293l343o1o1i111i1p1i111i1p1i111i1p1i
#@F 293l343o1o1j111i1p1l111i1p1l111i1p1l
#@F 293l343o1o1k111i1p1n111i1p1n111i1p1n
#@F 293l343o1o1l111i1p1q111i1p1q111i1p1q
#@F 293l343o1o1m111i1q1i111i1q1i111i1q1i
#@F 293l343o1o1n111i1q1l111i1q1l111i1q1l
#@F 293l343o1o1o111i1q1n111i1q1n111i1q1n
#@F 293l343o1o1p111i1q1q111i1q1q111i1q1q
#@F 293l343o1o1q111j1h1i111j1h1i111j1h1i
#@F 293l343o1p1h111j1h1l111j1h1l111j1h1l
#@F 293l343o1p1i111j1h1o111j1h1o111j1h1o
#@F 293l343o1p1j111j1h1q111j1h1q111j1h1q
#@F 293l343o1p1k111j1i1j111j1i1j111j1i1j
#@F 293l343o1p1l111j1i1l111j1i1l111j1i1l
#@F 293l343o1p1m111j1i1o111j1i1o111j1i1o
#@F 293l343o1p1n111j1i1q111j1i1q111j1i1q
#@F 293l343o1p1o111j1j1j111j1j1j111j1j1j
#@F 293l343o1p1p111j1j1l111j1j1l111j1j1l
#@F 293l343o1p1q111j1j1o111j1j1o111j1j1o
#@F 293l343o1q1h111j1j1q111j1j1q111j1j1q
#@F 293l343o1q1i111j1k1j111j1k1j111j1k1j
#@F 293l343o1q1j111j1k1m111j1k1m111j1k1m
#@F 293l343o1q1k111j1k1o111j1k1o111j1k1o
#@F 293l343o1q1l111j1l1h111j1l1h111j1l1h
#@F 293l343o1q1m111j1l1j111j1l1j111j1l1j
#@F 293l343o1q1n111j1l1m111j1l1m111j1l1m
#@F 293l343o1q1o111j1l1o111j1l1o111j1l1o
#@F 293l343o1q1p111j1m1h111j1m1h111j1m1h
#@F 293l343o1q1q111j1m1j111j1m1j111j1m1j
#@F 293l343o1i1h1h111j1m1m111j1m1m111j1m1m
#@F 3m363i2434363e3a3l3i3o3h37111j1h1k111j1h1k111i1q1j
#@F 3m363i283i3l383a3l3i3o3h3711111i1i1111111h111i1i1k
#@F 3m363i2m3i3j2l3b34373i3q111j1m1m111j1l1h111j1l1p
#@F 3m363i23363n3c3p382434363e3a3l3i3o3h37111j1m1m111j1h1n111i1k1o
#@F 3m363i23363n3c3p38283i3l383a3l3i3o3h3711111l1k11111l1m11111l1q
#@F 3m363i23363n3c3p382m3i3j2l3b34373i3q111j1m1l111j1j1j111j1m1m
#@F 3m363i233f3n2434363e3a3l3i3o3h37111i1o1j111i1p1n111j1h1l
#@F 3m363i2a3c3a3b3f3c3a3b3n1111111h1111111h111j1m1m
#@f EigeneFarbe 2 2 2



#@g ----4-----
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Holz3,,,,,,,,,,,,,,,
#@G Elfenbein1,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G HellStahlBlau3,,,,,,
#@G Weiß,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Elfenbein2,,,,,,,,,,
#@G Elfenbein1,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G HellStahlBlau3,,,,,,
#@G Weiß,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Elfenbein2,,,,,,,,,,
#@G Elfenbein1,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G HellStahlBlau3,,,,,,
#@G Weiß,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Holz3,,,,,,,,,,,,,,,
#@G Elfenbein1,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G HellStahlBlau3,,,,,,
#@G Weiß,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,
#@G StahlBlau3,,,,,,,,,,
#@G StahlBlau4,,,,,,,,,,
#@G Gold,,,,,,,,,,,,,,,,
#@G Schwarz,,,,,,,,,,,,,
#@G Null,,,,,,,,,,,,,,,,


#@H Siehe auch bish-Beispiele auf der Homepage.
#@H Diese Hilfe hier ist nur knapp.
#@H 
#@H Dieses Script schreibt in sich selbst hinein,
#@H es verändert seinen eigenen Inhalt.
#@H 
#@H Bei Farbnamenwahl werden Wildcards verarbeitet.
#@H 
#@H 
#@H MENÜ:
#@H Farbnamen-Notizen  : "  16:Mokkasin  "
#@H Farbenliste/Notizen               : f [-]
#@H Dateienauswahl               84   : d
#@H Gruppenauswahl       -1--4-----   : gw [0123456789]
#@H Gruppen-Farbensatz kopieren < | > : g n | G n...
#@H                                     g 4
#@H                                     G 146
#@H Farbziel auf Farbe setzen         : {1-10}={fnam|fnum} [n=f]...
#@H                                      4=203  7=16  8=mokkasin
#@H DokumentBG  Holz3                 1
#@H TabellenBG  Elfenbein1            2
#@H TabRowBG    Null                  3
#@H TabColBG    HellStahlBlau3        4  Farbziel Tabellenspalte (4)
#@H TabHColBG   Weiß                  5
#@H Link        StahlBlau3            6
#@H BesuLink    StahlBlau4            7
#@H AktiLink    Gold                  8
#@H Textfarbe   Schwarz               9
#@H Fontfarbe   Null                 10
#@H Link-/Text-/Font-Farben schreiben : L|T|F
#@H Alle Farbziele schreiben          : S
#@H Hilfe                             : h
#@H Beenden                           : E


#@D1 190.htm
#@D2 ansi.htm
#@D3 atxcool.htm
#@D1 bishbeisp.htm
#@D2 bishmnk.htm
#@D1 c.htm
#@D1 cc.htm
#@D2 cksum.htm
#@D2 cmd.htm
#@D2 compilo.htm
#@D2 delsafe.htm
#@D2 fan.htm
#@D2 forum.htm
#@D2 gew.htm
#@D1 hinw.htm
#@D1 homepage.htm
#@D2 hpinfo.htm
#@D2 istepbish.htm
#@D1 kurz.htm
#@D2 lim.htm
#@D2 lizenz.htm
#@D2 mailcode.htm
#@D2 olinfo.htm
#@D2 overclk.htm
#@D2 pearl.htm
#@D1 sco.htm
#@D4 sco.htm
#@D1 syntax.htm
#@D1 win.htm


###  hd.bish  #############################################

#!/u/bin/bish

set -f
DOS='' MT=tr
[ `ver s` == dos ] && DOS=dos



idtosys()  {
   local sys
   case "$1" in
      0)  sys="--" ;;
      1)  sys="FAT12" ;;
      2|3|ff)  sys="XENIX '$1'" ;;
      4)  sys="FAT16" ;;
      5)  sys="DOS Extended" ;;
      6)  sys="FAT16B" ;;
      7)  sys="NTFS/HPFS" ;;
      8|9)  sys="AIX '$1'" ;;
      a|fe)  sys="IBM '$1'" ;;
      b)  sys="FAT32" ;;
      c)  sys="FAT32X (LBA)" ;;
      e)  sys="FAT16X (VFAT) LBA" ;;
      f)  sys="FAT16X (VFAT) LBA, Sekundär" ;;
     11)  sys="Hidden FAT12" ;;
     12)  sys="Compaq Diagnose" ;;
     14)  sys="Hidden FAT16" ;;
     16)  sys="Hidden FAT16B" ;;
     17)  sys="Hidden NTFS/HPFS" ;;
     1b)  sys="Hidden FAT32" ;;
     1c)  sys="Hidden FAT32X (LBA)" ;;
     1e)  sys="Hidden FAT16X (LBA)" ;;
     3c)  sys="Partition Magic" ;;
     50|51|53|54)  sys="Ontrack '$1'" ;;
     55)  sys="EZ-Drive" ;;
     63)  sys="UNIX" ;;
     64|65|66)  sys="Netware '$1'" ;;
     82|83|85)  sys="Linux '$1'" ;;
     86|87)  sys="NTFS (HPFS) '$1'" ;;
     a5|b7|b8|a6|a9)  sys="BSD '$1'" ;;
     c0|c1|c4|c5|c6|cb|cc|ce)  sys="DRDOS '$1'" ;;
     e2)  sys="DOS (rdonly) (by xfdisk)" ;;
     eb)  sys="BeOS BFS (BSF1)" ;;
     23)  sys="Reserviert '$1'" ;;
      *)  sys="Unbekannt '$1'" ;;
   esac
   echo "$sys%c"
   return 0
}



convert()  {
   local fd=$1 id=_____________________ typ=__ len=___
   shift
   for 3 id typ len  in  $*
   do
      echo $id
      [[ $typ == "[bwl]" ]] && {
         catv $len,$fd | base -$typ +10; continue; }
      [ $typ == n ] && {
         catv $len,$fd | tr '[\6-\31] ' '[\254*26]\250'
         echo; continue; }
      [ $typ == s ] && {
         catv $len,$fd | tr '[\0-\31] ' '[\254*32]\250'
         echo; continue; }
      [ $typ == - ] && seek +$len $fd
   done
   return 0
}



partbl()  {
   local nam=________ pn=00 v0=00000
   local fnam=___________________________ v=00000000000
   dd if=$1 of=d${2}s0.dat bs=1b count=1 || return
   3< d${2}s0.dat
   seek 446 3
   to 4 repeat
   do
      let ++pn
      for 2 nam v  in  `convert 3 bi b 1 sh b 1 ss b 1 sc b 1 %
                        si b 1 eh b 1 es b 1 ec b 1 S l 4 nS l 4`
      do
         case "$nam" in
            bi)  fnam="Aktiv/Passiv" ;;
            sh)  fnam="Start-Kopf" ;;
            ss)  ((v0=[v&~63]<<2, v&=63)) ; fnam="Start-SpurSektor" ;;
            sc)  ((v|=v0)) ; fnam="Start-Zylinder" ;;
            si)  fnam="System" ;;
            eh)  fnam="Ende-Kopf" ;;
            es)  ((v0=[v&~63]<<2, v&=63)) ; fnam="Ende-SpurSektor" ;;
            ec)  ((v|=v0)) ; fnam="Ende-Zylinder" ;;
             S)  fnam="Start-PlattenSektor" ;;
            nS)  fnam="Sektoren-Anzahl" ;;
             *)  continue ;;
         esac
         prints sss2s12s "d$2 " "p$pn " $nam $v "   $fnam" %
                         >> partbl.txt
      done
   done
   v=`catv 2,3 | base -w +16`
   fnam="Magic-Nummer"
   prints sss2s8sf04s "d$2 " "-  " mc "" $v "   $fnam" >> partbl.txt
   ><
   return 0
}



showfdisk()  {
   local d=__ p=__ id=__ si=0000 v0=00000000000 v
   prints ss "Platte Part. Aktiv  Start[$MT]  Ende[$MT]  Größe[$MT]" %
             "  System-Identifikation"
   < partbl.txt
   while read d p id v -
   do
      case $id in
        bi)  catv 1,1,d =d: ; catv 1,1,p =p:
             PR="$d $p"
             let v && PR="$PR *"
             let v || PR="$PR -" ;;
        si)  si=$((16#, v)) ;;
         S)  [ $MT == MB ] && PR="$PR $((v/[1024*2]))"; v0=$v
             [ $MT == tr ] && PR="$PR $((v/63))"; v0=$v ;;
        nS)  [ $MT == MB ] &&
                PR="$PR $(([v0+v-1]/[1024*2])) $((v/[1024*2]))"
             [ $MT == tr ] &&
                PR="$PR $(([v0+v-1]/63)) $((v/63))"
             prints s3s6s7s11s10s11s $PR "     $( idtosys $si )" ;;
      esac
   done
   ><
   return 0
}



PR=________________________
local d=-1
: > partbl.txt
while let "++d<4"
do
   ifset DOS || partbl /dev/ad${d} $d
   ifset DOS && partbl hd${d}:c1023h16s63 $d
done
echo %n%n%n%n%n%n%n%n%n

showfdisk



##pragma pack(1)
#struct part {uchar bootid; //0x00;0x80;0x81,...
#             uchar beghead, begsect, begcyl;
#             uchar systid;
#             uchar endhead, endsect, endcyl;
#             ulong relsect, numsect;
#       //    begcyl |=(begsect&~63)<<2; begsect&=63;
#       //    endcyl |= ...
#};
#struct FAT  {uchar   jmp[3], oem[8];
#       //            eb+oo+nop
#             ushort  bps;
#             uchar   spcl;
#             ushort  res_boot_s;
#             uchar   nfat;
#             ushort  nroot, small_nsect;
#             uchar   media_id;
#             ushort  spfat, spt, heads;
#             ulong   hidds, big_nsect;
#       //            hidds: bei bootbaren dessen platten-offset
#             uchar   phys_drive_id;    // 36
#             uchar   reserv;
#             uchar   dos4;
#             ushort  media_no[2];
#             uchar   label[11], fatstr[8];
#       /*    62      bootcode (jmp+z.B.60==62)
#             412     ERRstring\0
#             486     IO      SYS
#             497     MSDOS   SYS
#             508     00 00 55 aa
#             512 */
#};
#struct FAT32{uchar   jmp[3], oem[8];
#       //            eb+oo+nop
#             ushort  bps;
#             uchar   spcl;
#             ushort  res_boot_s;
#             uchar   nfat;
#             ushort  nroot, small_n_sect;
#             uchar   media_id;
#             ushort  spfat, spt, heads;
#             ulong   hidds, big_nsect;
#       //            hidds: bei bootbaren dessen platten-offset
#             ulong   big_fat_s;     //36
#             ushort  ext_flgs, fs_version;
#             ulong   root_cluster; //(short+unknown-short?)
#             ushort  info_s_loc, backup_boot_s_loc;
#             uchar   fill[12];        // 52
#             uchar   phys_drive_id;   // 64
#             uchar   reserv;
#             uchar   dos4;
#             ushort  media_no[2];
#             uchar   label[11], fatstr[8];
#       /*    90      bootcode
#             412     ERRstring\0  ?
#             486     IO      SYS  ?
#             497     MSDOS   SYS  ?
#             508     00 00 55 aa
#             512 */
#struct info_sector {
#             ulong   signatur;
#             ulong   free_clusters;
#             ulong   last_alloc_cluster;
#      484    ulong   sign2; Buchst_case gewechselt
#             ulong   free_clusters;
#             ulong   last_alloc_cluster;
#};
#};
#struct dosd {uchar  name[8], ext[3],
#                    attr[1], fill[10];
#           //       xxADVSHR
#             ushort time, date,
#           //  h:5,m:6,s:5;  Y:7,M:4,D:5;
#           //  0-23,0-59,s*=2;  Y+=1980,1-12,1-31;
#                    clust;     //0,1;>=2
#             ulong  size;
#};
#In FAT:
#0000: Cluster unbenutzt
#fff7: hat bad Sektor, wenn nicht in chain
#fff8-ffff: Ketten-Ende
#
#dos_ext, id=5:
#Weitere Partitionstabellen in der Ext-Partition:
#Hat 1 oder 2 Part.einträge je 16 Byte ab offs=446.
#rest= 00 00 ..
#Ersterer zeigt relativ (!) zu sich auf einen Fs-Bootblock, der keine
#io.sys-Anknüpfung hat und die weiteren Daten enthält.
#Ggf. zweiter (ID=5) zeigt auf weiteren ext-id=5-Block, der ...
#Der Eintrag mit ID=5 nach dem MBR hat als size natürlich
#die Größe der ganzen Ext-Partition mit allen logischen Laufwerken.
#Auf die Fs-Bootblocks kann auch direkt gezeigt werden, von der
#Partitionstabelle nach dem MBR aus.
#
#FAT32:
#Hat mehrere Bootsektoren, Offsets + Anzahl eingetragen.
#Auch Info-Block.
#Stelle Cluster 2 ist für root-Verz. reserviert: 0x{0-f}fffffff
#Datenaddr=0 nach root, nach dem ersten root-Teil.
#
#VFAT, lange Namen:
#'A-Z',[2],[2],[2],[2],[2],0x000f,0x??(prüfbyte),[2],
#[2],[2],[2],[2],[2],0x0000,[2],[2]==0(end-short);
#0x01,[2],[2],...dito
#...
#Normaler 8.3-Eintrag
#0x000f(attr==VSHR) und 0x0000(cluster) immer so.
#0x01,0x02,...erst ab 'B'.
#shorts nach end-short==0  ==  0xffff
#'A-Z'-Eintrag ist der Namensrest! - Reihenfolge von hinten!
#6+7==13 short-Zeichen pro 32Byte, einschließlich end-short==0.
#Prüfbyte abgeleitet von 8.3-Name.
#
#Masterboot 0-375=376
#Nach mbr (16 Byte):
#70H(1)
#19650(2)n_cyl
#16(1)n_heads
#0(2)wr_reduce_cyl
#65535(2)precomp_cyl
#0(1)ecc
#8(2)controller
#0(2)
#19649(2)land
#63(1)sectors
#offs 440:
#52,75,30,a7





###  hpm.bish  #############################################

#!/u/bin/bish


set -f
set +S
[ `ver n` -lt 305 ] && { echo "Shell-Version < 305!"; exit 0; }
Script="$0"
echo "Script: '$Script'"
[ -w "$Script" ] || {
   print -u2 "Script hat Schreibschutz: '$Script'"; exit 1; }



Tz=000000
Onl=$Tz
local Fpos=000000000000
Fsel=$Fpos
Hsel=$Fpos
Rtotal=$Fpos
Ltotal=$Fpos
Rfiles=$Fpos
Lfiles=$Fpos
UpSz=$Fpos UpN=$Fpos AddSz=$Fpos
DwnSz=$Fpos DwnN=$Fpos SubSz=$Fpos
inp="$( prints s260-)"
FtpCmd="$( prints s150-)"
Host="$( prints s150-)"
File="$( prints s260-)"
Dir="$( prints s260-)"
Zeile="$( prints s300-)"

Rtotal=- Rfiles=- Ltotal=- Lfiles=-
Fsel=0
UpSz=0 UpN=0 AddSz=0
DwnSz=0 DwnN=0 SubSz=0



echo Prüfung Script-Inhalt...
< $Script
inp=0
while seek + 0 Fpos; readl Zeile
do  expr "$Zeile" :: '^#@[a-zA-Z]%{1,8%} ' && inp=1 && break;  done
><
echo "Konfigurations-Position=$Fpos"
let inp==0 && {
   print -u2 "Schreibe #@-Einträge..."
   echo "%n%n%
   #@ftp 1%
   #@ftp0 ftp home-up.t-online.de%
   #@ftp1 ftp -n < {}%
   #@ftp2 ftp -n -s:{}%
   #@ftp3 /usr/bin/ftp -nvd < {}%
   #@cmd0 %
   #@cmd1 /bin/sh /etc/mstppp start%
   #@cmd2 /bin/sh /etc/mstppp stop%
   #@cmd9 bish /u/sh/bish/hpsums.bish >/dev/null%
   #@edit edit%
   #@lign xyz.txt%
   #@rign XyZ%
   #@rfil -%
   #@rtot -%
   #@tz -1%
   #@ddir %
   #@hdir $(-pwd)%n" >> $Script

   < $Script
   while seek + 0 Fpos; readl Zeile
   do  expr "$Zeile" :: '^#@[a-zA-Z]%{1,8%} ' && break;  done
   ><
   echo "Konfigurations-Position=$Fpos"
}


< $Script
seek $Fpos 0
while readl Zeile
do
   ifset Zeile || continue
   expr "$Zeile" :: '^#@[a-zA-Z]%{1,8%} ' && continue
   expr "$Zeile" :: '^[ %t]*#' && continue
   expr "$Zeile" :: '[^ %t%z]' || continue
   ><; print -u2 "Script-Inhalt fehlerhaft!: '$Zeile'"; exit 1
done
><


[ `ver w` == full ] && {
   trap 'for inp  in  FtpInp RemFiles LocFiles
         do  ifset $inp && [ -f "${{inp}" ] &&
                remove "${{inp}" && $inp=""
         done
        ' 0 1 2
}

mktemp FtpInp #"$PWD"
mktemp RemFiles #"$PWD"
mktemp LocFiles #"$PWD"
echo "TempFiles: $FtpInp, $RemFiles, $LocFiles"
expr "$FtpInp" :: '[ %t%r%n%z%%]' && {
   print -ru2 "Verzeichnisteil wird nicht akzeptiert!: '$FtpInp'"
   exit 1
}



Fmain()  {
   case "$1" in  $(shift)
     DatTim)
        #1999MMddhhmm.ss
        local mon=000 Mon='JanFebMärAprMaiJunJulAugSepOktNovDez' dt
        systime -t dt
        catv 4,2,dt =mon:
        catv 6,2,dt /. $(([mon-1]*3)),3,Mon /. 0,4,dt "/, " %
             8,2,dt /: 10,,dt
        return 0
     ;;
     Edit)
        local edo='+/^#@[a-zA-Z]' edf=$Script ed=/usr/bin/vi
        if Fmain Get edit '[^ %t]' File
        then  catv File /%n | read ed -
        else  [ `ver s` == unix ] && ed=vi
              [ `ver s` != unix ] && ed=edit
        fi
        whence -pe "$ed" && return 1
        expr "$ed" :: 'vim%{0,1%}$' || edo=
        [ `ver s` != unix ] && expr "$ed" =:: 'vim$' || edo=
        ifset File || File="$ed"
        [ "$1" != i ] && {
           echo "%n Nur am Dateiende die speziellen Zeilen ändern!%
                 %r Beschreibungen sind dort vorhanden."
           read "-?<Enter> "
        }
        [ "$1" == i ] && { edo=
           edf=hpm_tmpf.inf
           [ -f $edf ] || return
        }
        echo "'$File $edo $edf'..."
        eval "$File $edo $edf"
        return 0
     ;;
     Online)
        [ "$Onl" == j ] && return
        read "Onl?Sind Sie Online?[j]: "
        [ "$Onl" != j ] && Onl=0 && return 1
        return 0
     ;;
     ExecFtp)
        expr "$Host" :Host ';' += '%n'
        cat $FtpInp | {
           4> $FtpInp
           print -u4 "open $Host%nbinary"
           [ $# -eq 0 ] && catv 0 =4
           [ $# -gt 0 ] && print -u4 "$1"
           print -u4 "quit"
           ><
        }
        expr "$Host" :Host '%%n' + ';'
        print -u2 FTP-Übertragung:
        print -ru2 "'$FtpCmd'..."
        eval "$FtpCmd"
        return 0
     ;;
     GetFtpCmd)
        local fsel=$Fsel
        [ $# -gt 0 ] && fsel="$1"
        expr "$fsel" :: '^[0-9]$' || return 1
        Fmain Get "ftp$fsel" '[^ %t]' FtpCmd ||
           print -u2 "Kein ftp-Kommando #$fsel!" && return 1
        expr "$FtpCmd" :FtpCmd '{}' "$FtpInp" ||
           print -u2 "Kommandodatei '{}' fehlt!" && return 1
        Fsel=$fsel
        return 0
     ;;
     GetTz)
        Fmain Get tz '[-0-9]' Tz ||
              echo "#@tz -1" >> $Script && Tz=-1
        tz $Tz
        Tz="$(prints s4- $Tz)"
        return 0
     ;;
     Get)
        local l=${#1} a="$1" b="$2"
        $3=''
        < $Script
        seek $Fpos 0
        while readl Zeile
        do
           expr "$Zeile" :: "^#@$a $b" || continue
           catv $((l+3)),,Zeile =$3:
           >< ; return 0
        done
        ><
        return 1
     ;;
     Set)
        local a="$1" f=0
        catv $Fpos,,0  < $Script | {
           fstat +s $Fpos $Script
           while readl Zeile
           do
              expr "$Zeile" :: "^#@$a " ||
                 catv Zeile /%j >> $Script && continue
              catv "/#@" a ". $2" /%j >> $Script
              f=1
           done
        }
        [ $f == 0 ] && catv "/#@" a ". $2" /%j >> $Script
        return 0
     ;;
     SetTz)
        expr "$1" :: '^-%{0,1%}[0-9]%{1,3%}$' || return
        Tz=$1
        tz $Tz
        Fmain Set tz $Tz
        Tz="$(prints s4- $Tz)"
        return 0
     ;;
     SetFsel)
        local f
        expr "$1" :f '^f%([1-9]%)$' || return
        grep -q "^#@ftp$f [^ %t]" $Script || return
        Fsel=$f
        Fmain Set ftp $Fsel
        Fmain GetFtpCmd
        return 0
     ;;
     SetHsel)
        local h
        expr "$1" :h '^h%([1-9]%)$' || return
        grep -q "^#@host$h [^ %t]" $Script || return
        Hsel=$h
        Fmain Set host $Hsel
        Fmain Get "host$h" '[^ %t]' Host
        expr "$Host" :Host ' *;;* *' + ';'
        return 0
     ;;
     SetHDir)
        [ "${#1}" -gt 0 -a $# -gt 0 ] || return
        local verz
        fullname -v verz "$1"
        [ -d "$verz" ] ||
           print -ru2 "Verzeichnis existiert nicht: '$1'" && return
        Fmain Set hdir "$verz"
        cd "$verz"
        LocList
        return 0
     ;;
     SetDDir)
        [ $# -gt 0 ] || return
        inp="$1"
        ifset inp && fullname -v inp "$inp"
        ifset inp && [ -d "$1" ] || {
           print -ru2 "Verzeichnis existiert nicht: '$1'"
           while echo "<Enter> oder Neues Download-Verzeichnis: %c"
           do
              readl inp
              ifset inp || return 0
              expr "$inp" :: '[ %t]' && echo Zu blank && continue
              fullname -v inp "$inp"
              [ -d "$inp" ] || mkdirs -v "$inp" || continue
              [ -d "$inp" ] || continue
              print -r "$inp"
              break
           done
        }
        Fmain Set ddir "$inp"
        return 0
     ;;
     CkDDir)
        Fmain Get ddir '[^ %t]' inp ||
           Fmain Perr $1 "Kein Download-Verzeichnis eingetragen." &&
           return 1
        [ -d "$inp" ] ||
           Fmain Perr $1 "Download-Verzeichnis ungültig: '$inp'" &&
           return 1
        return 0
     ;;
     CkHDir)
        Fmain Get hdir '[^ %t]' inp ||
           Fmain Perr $1 "Kein Homepage-Verzeichnis eingetragen." &&
           return 1
        [ -d "$inp" ] ||
           Fmain Perr $1 "Homepage-Verzeichnis ungültig: '$inp'" &&
           return 1
        return 0
     ;;
     Perr)
        local s
        [ $# -gt 1 ] && s=s && shift
        print -ru2 "*** $1 ***"
        ifset s && read "-?<Enter> "
        return 0
     ;;
     Help)
        local n=00000 j=/%j z=...
        3<&0
        while :
        do
           echo ; prints sf-79
           n=0 j=/%j z=
           grep '^#%%H' $Script |
              while readl Zeile
              do
                 catv "/     " 4,,Zeile $j
                 let "++n%20==0" &&
                    echo "${z}Start:s  Beenden:e  Weiter:<Enter> %c"
                 let "n>=20" && { j= z=%n
                    read -u3 inp
                    [ "$inp" == e ] && break 2
                    [ "$inp" == s ] && continue 2
                 }
              done
           prints sf-79
           echo "Start:<Enter>  Beenden:e (EOF) %c"
           read -u3 inp
           [ "$inp" == e ] && break
        done
        ><
        return 0
     ;;
     *)  return 1 ;;
   esac
   return 0
}



RemList()  {
   local isz=1 size=000000000000 mon=mmm day=ddd yt=00000 jahr
   Fmain Online || return
   echo Remote Dateienliste...
   Rtotal=0 Rfiles=0 Dir=
   systime jahr; inp=$jahr; ctime jahr - - - - - $jahr
   3> $RemFiles
   Fmain ExecFtp 'dir "-lRA ."' |
   while readl Zeile
   do
      expr "$Zeile" :Zeile '%r%{1,%}$' ''
      echo %r%c; prints s-78- "$Zeile"  #>> hpm_tmpf.log
      ifset Zeile || isz= || continue
      #expr "$Zeile" :size '^total  *%([0-9]%{1,%}%)' && {
      #   let Rtotal+=size; continue; }
      ifset isz || {
         expr "$Zeile" :Dir '^%(.%{1,%}%):$' || isz=1 || continue
         expr "$Dir" :Dir '^%.%{0,1%}/' ''
         catv /"0 0 ?" Dir //%j =3
      }
      isz=1
      expr "$Zeile" :: "^-[-a-zA-Z]%{9%} " || continue
      expr "$Zeile" :File '^.%{10%}  *[^ ]%{1,%}  *%(..*%)$'
      expr "$File" :File '^ *[^ ]%{1,%}  *[^ ]%{1,%}  *%(..*%)$'
      expr "$File" :File %
         ' [a-zA-Z]%{3%}  *[0-9]%{1,2%}  *[:0-9]%{4,5%} %(..*%)$' %
         || continue
      expr "$File" :: '^%.%{1,2%}$' && continue
      ifset Dir && File="$Dir/$File"
      catv Zeile /%n | read - - - - size mon day yt -
      conv -l mon
      expr " jan feb mar apr may jun jul aug sep oct nov dec" %
           :mon "[ a-z]* $mon" || { echo "Monat: '$mon'?!"; exit 1; }
      let "mon/=4"
      if expr "$yt" :yt ':' ' '
      then  inp="$inp@$yt"
            ctime yt $((jahr-1)) $mon $day $yt .59
            let "inp-yt>182*24*3600" && {
               expr "$inp" :yt '@%(..*%)$'
               ctime yt $jahr $mon $day $yt .59
            }
            expr "$inp" :inp '%([0-9]%{1,%}%)'
      else  ctime yt $yt $mon $day 12 0 .0
      fi
      let ++Rfiles Rtotal+=size
      < $Script
      seek $Fpos 0
      grep -qFxm "#@rign $File" && { >< ; continue; }
      ><
      catv size /" " yt "/ *" File "/*" /%j =3
   done
   ><
   echo
   let "Rtotal=(Rtotal+1023)/1024"
   Fmain Set rfil $Rfiles
   Fmain Set rtot $Rtotal
   [ "$1" == + ] && {
      echo quote MDTM path ... ; yt=0
      < $RemFiles
      3> $FtpInp
      print -u3 "verbose"
      while readl Zeile
      do
         expr "$Zeile" :File ' %*%([^*][^*]*%)%*' || continue
         catv "/quote MDTM " File /%j =3
         prints s10- $((++yt)) ; echo "%r%c"
      done
      ><<
      echo "%nexec ftp-Client ..." ; yt=0
      : > hpm_tmpf.rem
      Fmain ExecFtp |
      while readl Zeile
      do
         expr "$Zeile" :File %
         '^2[0-9]%{2%}[ %t]%{1,%}%([0-9]%{12%}%)%([0-9]%{2%}%).*$' %
         '%1.%2' || continue
         ctime $File >> hpm_tmpf.rem
         prints s10- $((++yt)) ; echo "%r%c"
      done
      echo "%nAustausch Sekunden-Zahlen ..." ; yt=0 Dir=0
      cat $RemFiles | {
      4> $RemFiles
      3< hpm_tmpf.rem
      while readl Zeile
      do
         expr "$Zeile" :size ' %([0-9]%{1,10%}%) %*[^*]%{1,%}%*' || {
            print -ru4 "$Zeile" ; continue
         }
         readl -u3 File || break
         let "File>=size" && let "Dir+=File-size"
         let "File<size" && let "Dir+=size-File"
         expr "$Zeile" :Zeile ' [0-9]%{1,10%} ' = " $File "
         print -ru4 "$Zeile"
         prints s10- $((++yt)) ; echo "%r%c"
      done
      ><<
      }
      let yt==0 && yt=1
      echo "%nMittlere Sekunden-Korrektur pro Datei: $((Dir/yt))"
      read "-?<Enter> "
   }
   cat $RemFiles > hpm_tmpf.rem
   return 0
}



LocList()  {
   echo Lokale Dateienliste...
   local size=000000000000 sec=000000000000 ign=00 ic
   Ltotal=0 Lfiles=0
   [ `ver s` != unix ] && ic=i
   3> $LocFiles
   list -fR |
   while readl File
   do
      expr "$File" =:: 'bish_tmpf%.[0-9]%{1,3%}$' && continue
      expr "$File" =:: 'hpm_tmpf%....$' && continue
      fstat -smv size sec "$File"
      [ `ver s` != unix ] && conv -t'\/' File
      < $Script
      seek $Fpos 0 ; ign=' '
      grep -qFxm$ic "#@lign $File" && ign=' i'
      ><
      catv size /" " sec "/$ign*" File "/*" /%j =3
      [ "$ign" == ' i' ] && continue
      let ++Lfiles "Ltotal+=size"
   done
   ><
   let "Ltotal=(Ltotal+1023)/1024"
   #let "Ltotal+=4*$(- list -dR | wc -l )"
   cat $LocFiles > hpm_tmpf.loc
   return 0
}



RInfo()  {
   local ic='     ' lsiz=000000000000
   local rsiz=$lsiz rsec=$(prints sf0100-) lsec=$(prints sf0100-)
   expr "$1" :: 't' && expr "$1" :: 'T' && return 1
   Fmain CkHDir . || return
   LocList || return
   RemList $2 || return
   [ ! -s $RemFiles -a ! -s $LocFiles ] && return
   UpSz=0 UpN=0 AddSz=0 DwnN=0 DwnSz=0 SubSz=0
   [ `ver s` != unix ] && ic=i
   echo Infodaten herstellen...
   : > hpm_tmpf.inf
   < $LocFiles
   while readl Zeile
   do
      expr "$Zeile" :File ' %*%(..*%)%*$' || continue
      expr "$Zeile" :lsiz '^%([0-9]%{1,%}%)' || continue
      expr "$Zeile" :lsec '^[0-9]%{1,%}  *%([0-9]%{1,%}%)' || continue
      Dir="$(- grep -Fm$ic " *$File*" $RemFiles )" || {
         catv "/+new  " Zeile /%j >> hpm_tmpf.inf
         let UpSz+=lsiz ++UpN "AddSz+=lsiz"
         continue
      }
      expr "$Dir" :rsiz '^%([0-9]%{1,%}%)' || continue
      expr "$Dir" :rsec '^[0-9]%{1,%}  *%([0-9]%{1,%}%)' || continue
      #expr "$Dir" :inp ' %*%(..*%)%*$' || continue
      expr "$1" :: 't' && let "lsec>rsec" && {
         [ `ver s` != unix ] && conv '-t/\' File
         fstat +m $((rsec-300)) "$File"
      }
      let "rsec>lsec+16*3600" && {
         catv "/<rem_newer:size=$((rsiz-lsiz)),time=$((rsec-lsec))  " %
              Dir /%j  >> hpm_tmpf.inf
         let DwnSz+=rsiz ++DwnN
      }
      let "lsiz==rsiz&&lsec<=rsec+60" && continue
      let "lsiz!=rsiz&&lsec>rsec+60" && {
         catv "/:size=$((lsiz-rsiz)),time=$((lsec-rsec))  " Zeile /%j %
              >> hpm_tmpf.inf
         let UpSz+=lsiz ++UpN "AddSz+=lsiz-rsiz"
         continue
      }
      let "lsiz!=rsiz" && {
         catv "/.size=$((lsiz-rsiz))  " Zeile /%j >> hpm_tmpf.inf
         let UpSz+=lsiz ++UpN "AddSz+=lsiz-rsiz"
         continue
      }
      let "lsec>rsec+60" && {
         catv "/>time=$((lsec-rsec))  " Zeile /%j >> hpm_tmpf.inf
         let UpSz+=lsiz ++UpN "AddSz+=lsiz-rsiz"
      }
   done
   ><
   < $RemFiles
   while readl Zeile
   do
      expr "$Zeile" :rsiz '^%([0-9]%{1,%}%)' || continue
      expr "$Zeile" :File '%*%(..*%)%*$' || continue
      grep -qFm$ic "*$File*" $LocFiles || {
         catv "/-remote_only  " Zeile /%j >> hpm_tmpf.inf
         let DwnSz+=rsiz ++DwnN "SubSz+=rsiz"
      }
   done
   ><
   < $RemFiles
   while readl Zeile
   do
      expr "$Zeile" :rsiz '^%([0-9]%{1,%}%)' || continue
      expr "$Zeile" :File '%*%(..*%)%*$' || continue
      grep -qFm$ic "*$File*" $LocFiles || continue
      grep -qFm$ic " i*$File*" $LocFiles && {
         catv "/-lign  " Zeile /%j >> hpm_tmpf.inf
         let DwnSz+=rsiz ++DwnN "SubSz+=rsiz"
      }
      expr "$1" :: 'T' || continue
      expr "$Zeile" :rsec '^[0-9]%{1,%}  *%([0-9]%{1,%}%)' || continue
      [ `ver s` != unix ] && conv '-t/\' File
      fstat +m $((rsec-300)) "$File"
   done
   ><
   cat hpm_tmpf.inf | {
      seek + 0 lsiz
      : > hpm_tmpf.inf
      for ic  in  + '>' '%.' : '<' -
      do
         seek $lsiz 0
         grep -e "^$ic" >> hpm_tmpf.inf
      done
   }
   cat hpm_tmpf.inf | {
      : > hpm_tmpf.inf
      while readl Zeile
      do
         expr "$Zeile" :lsec ' %([0-9]%{1,%}%) *%*' && {
            ctime lsec $lsec
            expr "$Zeile" :Zeile ' [0-9]%{1,%}%( *%*%)' " $lsec%1"
         }
         catv Zeile /%j >> hpm_tmpf.inf
      done
   }
   let "UpSz=(UpSz+1023)/1024"
   let "DwnSz=(DwnSz+1023)/1024"
   let "AddSz=(AddSz+1023)/1024"
   let "SubSz=(SubSz+1023)/1024"
   expr "$1" :: '[Rlu]' || return 0
   ic=' '
   [ `ver s` != unix ] && ic=i
   if expr "$1" :: 'R'
   then
      print "hash%nbell%nverbose" > $FtpInp
      lsiz=0
      < $RemFiles
      while readl Zeile
      do
         expr "$Zeile" :Zeile '%*%(..*%)%*$' || continue
         expr "$Zeile" :File '%([^/]%{1,%}%)$' || continue
         rsiz=0
         3< $LocFiles
         while readl -u3 Dir
         do
            expr "$Dir" :Dir '%*%(..*%)%*$' || continue
            expr "$Dir" :lsec '%([^/]%{1,%}%)$' || continue
            cmpv -$ic File lsec || continue
            let "++rsiz>1" && { >< ; continue 2; }
            inp="$Dir"
         done
         ><
         let "rsiz!=1" && continue
         cmpv -$ic Zeile inp && continue
         expr "$inp" :: '/' && {
            Dir="$inp"
            while conv -T'/*' Dir; let "$.>=0"
            do
               catv $.,inp =File:
               grep -qFm$ic " ?$File/" $RemFiles && continue
               grep -qFxm "mkdir $File" $FtpInp && continue
               print -r "mkdir $File" >> $FtpInp ; let ++lsiz
            done
         }
         File="$Zeile" Dir="$inp" inp=
         while expr "$Dir" :lsec '%([^/]%{1,%}%)$' &&
               expr "$File" :rsec '%([^/]%{1,%}%)$' &&
               cmpv -$ic lsec rsec
         do
            expr "$Dir" :Dir '^%(.*/%)[^/]%{1,%}$' || Dir=
            expr "$File" :File '^%(.*/%)[^/]%{1,%}$' || File=
            lsec="$rsec"
            expr "$Dir" :Dir '/$' '' && lsec="/$lsec"
            expr "$File" :File '/$' '' && rsec="/$rsec"
            inp="$lsec$inp"
         done
         inp="$Dir$inp"
         print -r "rename $Zeile $inp" >> $FtpInp ; let ++lsiz
      done
      ><
      cat $FtpInp > hpm_tmpf.ftp
      echo $lsiz ftp-rename-Kommandos...
      read "lsiz?ftp-Client starten?[j]: "
      [ "$lsiz" != j ] && return
      Fmain ExecFtp
      read "-?hpm.bish:<Enter> "
      return 0
   fi
   expr "$1" :: '[lu]' || return 0
   print "hash%nbell%nverbose" > $FtpInp
   inp=0
   < $RemFiles
   while readl Zeile
   do
      expr "$1" :: 'd' ||
         expr "$Zeile" :Zeile '%*%(..*%)%*$' || continue
      expr "$1" :: 'd' &&
         expr "$Zeile" :Zeile '?%(..*%)/$' || continue
      expr "$Zeile" :File '%([^/]%{1,%}%)$' || continue
      expr "$Zeile" :Dir '^%(.*/%)[^/]%{1,%}$' || Dir=
      expr "$1" :: 'l' && conv -l File
      expr "$1" :: 'u' && expr "$1" :: '[x1]' || conv -u File
      expr "$1" :: 'u1' && expr "$1" :: 'x' ||
         expr "$File" :File '^[a-z]' '%U&'
      expr "$1" :: 'xu1' && expr "$File" :: '[^.]%.[^.]%{1,%}$' &&
         expr "$File" :File '%([a-z]%)%(.*%.[^.]%{1,%}%)$' '%U%1%E%2'
      expr "$1" :: 'xu1' && expr "$File" :: '[^.]%.[^.]%{1,%}$' ||
         expr "$File" :File '[a-z]' '%U&'
      [ "$Zeile" == "$Dir$File" ] && continue
      print -r "rename $Zeile $Dir$File" >> $FtpInp
      let ++inp
   done
   ><
   cat $FtpInp > hpm_tmpf.ftp
   echo $inp ftp-rename-Kommandos...
   read "inp?ftp-Client starten?[j]: "
   [ "$inp" != j ] && return
   Fmain ExecFtp
   read "-?hpm.bish:<Enter> "
   return 0
}



UpLoad()  {
   local st=00000000000 dt=00000000000 ic=' ' mkdf
   Fmain CkHDir . || return
   [ -s hpm_tmpf.inf -a -f hpm_tmpf.rem ] || Onl=0 ||
      Fmain Perr . "Info-Datei hpm_tmpf.{inf|rem} fehlt!" && return
   systime st; fstat -mv dt hpm_tmpf.inf
   let "st>dt+2*3600" && Onl=0 &&
      Fmain Perr . "RemInfo erneuern!" && return
   [ `ver s` != unix ] && ic=i
   echo UpLoad...
   mktemp mkdf
   3> $FtpInp
   print -u3 "hash%nbell%nverbose"
   dt=0
   < hpm_tmpf.inf
   while readl Zeile
   do
      expr "$Zeile" :: '^[:.>+].' || continue
      catv 1,Zeile =st:
      expr "$Zeile" :File ' %*%(..*%)%*$' || File=
      [ `ver s` != unix ] && conv -t'/\' File
      [ -r "$File" -a -f "$File" ] || Onl=up ||
         Fmain Perr . "Datei nicht lesbar: '$File'" && break
      [ `ver s` != unix ] && conv -t'\/' File
      expr "$File" :: '[^-a-zA-Z0-9_.+/=]' && Onl=up &&
         Fmain Perr . "Dateinamenzeichen: '$File'" && break
      [ "$st" == + ] && expr "$File" :: '/' && {
         Dir="$File"
         while conv -T'/*' Dir; let "$.>=0"
         do
            catv $.,File =Zeile:
            grep -qFm$ic " ?$Zeile/" hpm_tmpf.rem && continue
            grep -qFxm "mkdir $Zeile" $mkdf && continue
            print -r "mkdir $Zeile" >> $mkdf
            print -ru3 "mkdir $Zeile"; let ++dt
         done
      }
      Dir="$File"
      [ `ver s` != unix ] && conv -t'/\' File
      print -ru3 "put $File $Dir"; let ++dt
   done
   ><<
   [ -f $mkdf ] && remove $mkdf
   [ $dt -eq 0 -o "$Onl" == up ] && Onl=0 && return
   cat $FtpInp > hpm_tmpf.ftp
   Fmain Online || return
   echo $dt ftp-Dateikommandos...
   read "inp?ftp-Client starten?[j]: "
   [ "$inp" != j ] && return
   Fmain ExecFtp
   read "-?hpm.bish:<Enter> "
   return 0
}



DownLoad()  {
   local st=00000000000 dt=00000000000 fst=__
   local ddir=$st$st$st$st
   local rdir=$ddir$ddir
   ddir= rdir=
   Fmain CkHDir . || return
   expr "$1" :: D && { Fmain CkDDir . || return ; ddir="$inp"; }
   expr "$1" :: V && [ -s hpm_tmpf.inf ] || echo LV > hpm_tmpf.inf
   [ -s hpm_tmpf.inf -a -f hpm_tmpf.rem ] || Onl=0 ||
      Fmain Perr . "Info-Datei hpm_tmpf.{inf|rem} fehlt!" && return 1
   expr "$1" :: V || grep -qm '^[-<].' hpm_tmpf.inf || return
   [ "$1" == L ] && grep -qm '^-.' hpm_tmpf.inf || return
   systime st; fstat -mv dt hpm_tmpf.inf
   let "st>dt+2*3600" && Onl=0 &&
      Fmain Perr . "RemInfo erneuern!" && return
   echo Download/Löschen...
   expr "$1" :: L && mktemp rdir
   3> $FtpInp
   print -u3 "hash%nbell%nverbose"
   dt=0
   expr "$1" :: D && print -ru3 "lcd $ddir" && let ++dt
   < hpm_tmpf.inf
   while readl Zeile
   do
      expr "$1" :: V && continue
      expr "$Zeile" :: '^[-<].' || continue
      catv 1,Zeile =fst:
      expr "$Zeile" :File ' %*%(..*%)%*$' || continue
      Dir="$ddir" st=
      expr "$File" :Zeile '^%(.*[^/]%)/[^/]%{1,%}$' &&
         Dir="$Dir/$Zeile" st=1
      expr "$1" :: D && {
         #[ `ver s` != unix ] && conv -t'/\' Dir
         #print -ru3 "lcd $Dir"; let ++dt
         inp="$File"
         [ `ver s` != unix ] && conv -t'/\' inp
         print -ru3 "get $File $inp"; let ++dt
      }
      [ "$fst" != - ] && continue
      expr "$1" :: L && {
         print -ru3 "delete $File"; let ++dt
         ifset st Zeile && grep -qFxm -e "*$Zeile" $rdir ||
                           print -r "*$Zeile" >> $rdir
      }
   done
   Dir="$(-pwd)"
   expr "$1" :: D && print -ru3 "lcd $Dir" && let ++dt
   ><<
   expr "$1" :: V && {
     < hpm_tmpf.rem
     while readl Zeile
     do
        expr "$Zeile" :Zeile ' ?%(..*%)/$' || continue
        grep -qFm -e "*$Zeile/" hpm_tmpf.rem && continue
        print -r "rmdir $Zeile" >> $rdir; let ++dt
     done
     ><
     [ -s "$rdir" ] && sort -r -d $rdir | cat >> $FtpInp
     grep -qm '^LV' hpm_tmpf.inf && : > hpm_tmpf.inf
   }
   if [ -s "$rdir" ] && expr "$1" :: L && [ "$1" != LV ]
   then
     sort -r -d $rdir | cat > $rdir
     < $rdir
     while readl Zeile
     do
        grep -F "$Zeile/" hpm_tmpf.rem |
           while readl File
           do
              expr "$File" :File ' %*%(..*%)%*$' || continue
              Dir="$(-grep -Fm -e "*$File*" hpm_tmpf.inf)" || continue 2
              expr "$Dir" :: '^-' && continue
              continue 2
           done
        catv "/rmdir " 1,,Zeile /%j >> $FtpInp; let ++dt
     done
     ><
   fi
   [ -f "$rdir" ] && remove $rdir
   [ $dt -eq 0 -o "$Onl" == up ] && Onl=0 && return
   cat $FtpInp > hpm_tmpf.ftp
   Fmain Online || return
   echo $dt ftp-Dateikommandos...
   read "inp?ftp-Client starten?[j]: "
   [ "$inp" != j ] && return
   < hpm_tmpf.inf
   while ifset ddir && readl Zeile
   do
      expr "$Zeile" :: '^-.' || continue
      expr "$Zeile" :File ' %*%(..*%)%*$' || continue
      expr "$File" :File '^%(.*[^/]%)/[^/][^/]*$' || continue
      File="$ddir/$File"; conv '-F/' File
      [ `ver s` != unix ] && conv -t'/\' File
      mkdirs -v "$File"
   done
   ><
   ddir="$(-pwd)"
   Fmain ExecFtp
   cd "$ddir"
   read "-?hpm.bish:<Enter> "
   return 0
}



echo Einträge lesen/setzen...
Fmain Get rfil . Rfiles || Rfiles=-
Fmain Get rtot . Rtotal || Rtotal=-
Fmain Get ftp '[0-9]' Fsel || Fsel=1 || Fmain Set ftp 1
catv 1,Fsel =Fsel:
Fmain Get ftp1 '[^ %t]' FtpCmd || FtpCmd='ftp -n < {}' ||
                                     Fmain Set ftp1 "$FtpCmd"
Fmain Get host '[0-9]' Hsel || Hsel=1 || Fmain Set host 1
catv 1,Hsel =Hsel:
Fmain Get host$Hsel '[^ %t]' Host ||
   Host='home-up.t-online.de;user anonymous .' ||
   Fmain Set host1 "$Host"
expr "$Host" :Host ' *;;* *' + ';'
Fmain Get tz '[-0-9]' Tz || Tz=-1 || Fmain Set tz -1

Fmain CkDDir
Fmain CkHDir && cd "$inp" && LocList

Fmain GetTz
Fmain GetFtpCmd
Fmain Get cmd0 . inp && { echo "Ausführung Kommando 0:"
                               print -r "'$inp'..."
                               eval "$inp"; }

echo
prints s:f-50 " bish-Script 'Homepage-Manager' "
prints s:f-50 " Copyright (c) 1999  Helmut Schellong "
echo
read "-?<Enter> "



while echo "%r
%tDatum+Uhrzeit : $( Fmain DatTim )%r
%thost + login $Hsel: $Host%r
%tftp-Kommando $Fsel: $FtpCmd%r
%tKommando     1: $(Fmain Get cmd1 . inp; print -rn "$inp")%r
%tKommando     2: $(Fmain Get cmd2 . inp; print -rn "$inp")%r
%tKommando     3: $(Fmain Get cmd3 . inp; print -rn "$inp")%r
%tLocal  Info   : $Lfiles= ${Ltotal} KB  < $DwnN= ${DwnSz} KB, -:${SubSz} KB%r
%tRemote Info   : $Rfiles= ${Rtotal} KB  > $UpN= ${UpSz} KB, +:${AddSz} KB%r
%tDL-Verzeichnis: $(Fmain Get ddir . inp; print -rn "$inp")%r
%tHP-Verzeichnis: $(Fmain Get hdir . inp; print -rn "$inp")%r
%r
%tAuswahl Zeitzone  $Tz : z [-]stunden%r
%tAuswahl ftp | host     : f{1-9} | h{1-9}%r
%tAuswahl Verzeichnisse  : v|vh|vd  [Pfad]%r
%tKommando ausführen     : 1|2|...|9%r
%tInfo-Daten remote:local: I[+]  [R] [t|T] [d][l][u|u1|xu1]%r
%tUpload                 : U%r
%tDownload|Löschen       : D|L|DL|LV%r
%tEditor: script|info    : ed [s|i]%r
%tHilfe                  : h%r
%tBeenden                : E%r
%r
%t                       : %c"
do
   read inp Zeile
   case "$inp" in
     z)  Fmain SetTz $Zeile ;;
     f[1-9])  Fmain SetFsel $inp ;;
     h[1-9])  Fmain SetHsel $inp ;;
     v|vh)  Fmain SetHDir "$Zeile" ;;
     vd)  Fmain SetDDir "$Zeile" ;;
     [1-9])
         Fmain Get "cmd$inp" . Zeile && {
            print -r "'$Zeile'..."
            let "inp>=1&&inp<=3" && inp=j
            [ "$inp" != j ] && read "inp?Ausführen?[j]: "
            [ "$inp" != j ] && goend
            eval "$Zeile"
         }
         ;;
     I+)       RInfo "$Zeile" + ; continue ;;
     I)       RInfo "$Zeile"; continue ;;
     U)       UpLoad; continue ;;
     D|L|DL|LV)  DownLoad $inp; continue ;;
     ed)  Fmain Edit $Zeile ||
             Fmain Perr . "Edit(): Programm- oder Dateifehlschlag."
          ;;
     h)  Fmain Help ;;
     E)  break ;;
     *)  echo %a%c; continue ;;
   esac
   Onl=0
done



for inp  in  FtpInp RemFiles LocFiles
do  ifset $inp && [ -f "${{inp}" ] && remove "${{inp}" && $inp=''
done

exit 0



#%H Dieses Shell-Script (hpm.bish) für die 'bish' liest aus sich selbst
#%H und schreibt in sich selbst hinein.
#%H Es ist also seine eigene ini-Datei, was möglich ist, weil
#%H Shell-Scripts lesbare Text-Dateien sind.
#%H Das hat die Vorteile einer dauerhaften Speicherung von Daten,
#%H praktisch beliebig viel Speicherplatz, Überschaubarkeit
#%H und die Möglichkeit, mehrere Script-Kopien mit unterschiedlichen
#%H gespeicherten Einstellungen an verschiedenen Plätzen zu haben.
#%H
#%H Dieses Script macht automatische Uploads, Downloads und 
#%H Remote-Löschungen mit dem T-Online-Homepage-Server.
#%H Dazu wird ein Standard-ftp-Client (ftp[.exe]) benutzt, wie er
#%H auf jedem System vorhanden ist, das TCP/IP konfiguriert hat.
#%H Zur Online-Verbindung kann die System-DFÜ als auch die
#%H T-Online-Software benutzt werden.
#%H Man muß dafür Sorge tragen, daß der ftp-Client eine Online=
#%H verbindung (per Socket) benutzen kann.
#%H Über Probleme hierzu weiß das T-Online-Team besser Bescheid
#%H als ich. (z.B. ActiveX)
#%H 
#%H 
#%H Option 'I' im Menü des Scripts beschafft rekursiv alle
#%H Verzeichnisdaten der lokalen und der remote Seite.
#%H Diese Daten werden verglichen und berechnet, und das Script
#%H weiß danach, welche Dateien wohin transportiert werden müssen,
#%H damit Gleichheit beziehungsweise Aktualität auf beiden Seiten
#%H vorliegt.
#%H I+  sendet MDTM-Kommandos zum Server, der daraufhin eine
#%H sekundengenaue Zeit für jede Datei liefert.
#%H Das dauert etwa 0,3 s pro Datei.
#%H 
#%H Erst danach kann eine der Optionen 'U,D,L,DL' gewählt werden.
#%H 'U' steht für Upload und transportiert neue, neuere und
#%H Dateien mit anderer Dateigröße zum Homepage-Server.
#%H Mit 'D' werden Dateien heruntergeladen, die nur auf der
#%H remote Seite vorhanden sind.
#%H 'L' löscht solche Dateien und 'DL' ist Download mit
#%H anschließendem Löschen.
#%H 'LV' löscht leere remote Verzeichnisse.
#%H (Dazu gibt es keinen '-'-Eintrag in der Info-Datei.)
#%H 
#%H Das Homepage-Verzeichnis gleichzeitig als Download-Verzeichnis
#%H kann problematisch(!) sein, je nach Sachlage und Vorhaben.
#%H 
#%H Es kann ein automatischer Umbau der remote Seite vorgenommen
#%H werden, durch 'I', 'L', 'U'.
#%H (Sicherer ist allerdings 'I D L I U'.)
#%H Danach sind die lokale und die remote Seite genau gleich!
#%H In Regelfall verwendet man nur 'I U', um die remote Seite
#%H aktuell zu halten.
#%H 
#%H Man beachte, daß nur Pfade verglichen werden:
#%H         remote:  gifs/abc.gif
#%H          local:  abc.gif
#%H sind von vornherein unterschiedliche Dateien!
#%H Gleiche Namen und Größen bedeuten ja nicht, daß die
#%H Dateien gleichen Inhalt haben!
#%H 
#%H 
#%H Das Menü zeigt u.a. folgende Info:
#%H         Local  Info   : 99=5576KB  < 4=24KB, -:24KB
#%H         Remote Info   : 109=6672KB  > 5=909KB, +:0KB
#%H  99 Dateien=local KB  < 4 download=24KB,  remote -:24KB
#%H 109 Dateien=remoteKB  > 5   upload=909KB, remote +: 0KB
#%H 
#%H Die +Werte sind Erweiterungswerte.
#%H Oben steht +:0KB, weil die 5 Upload-Dateien nicht oder kaum
#%H größer sind als die remote bereits vorhandenen Exemplare.
#%H Davor steht jeweils das Transfervolumen.
#%H 
#%H Oben ist die lokale Anzahl 99 kleiner als 109.
#%H Das u.a. deshalb, weil das Script beliebige lokale und auch
#%H remote Dateien gezielt ignorieren kann! (siehe unten)
#%H Der Hauptzweck ist, daß sie zum Upload nicht angeboten
#%H werden, trotz eventueller Änderungen.
#%H Ignorierte remote Dateien werden aber trotzdem gezählt
#%H und die Größe wird addiert, lokal ignorierte nicht.
#%H Lokal ignorierte werden gegebenenfalls zum Download
#%H und Löschen remote-seitig angeboten.
#%H Das kann verhindert werden, indem sie remote-seitig
#%H ebenfalls ignoriert werden.
#%H 
#%H 
#%H In das Shell-Programm 'bish' ist auch ein Zeitzonen-Mechanismus
#%H eingebaut.  (Hier Option 'z')
#%H Unix und beispielsweise auch WinNT arbeiten mit Zeitzonen.
#%H Wir sind 1 Stunde rückwärts von GMT (Greenwich Mean Time)
#%H entfernt; bei uns geht die Sonne eine Stunde früher auf, was
#%H bedeutet, daß unsere Uhrzeit 1 Stunde weiter ist als GMT.
#%H (Neu: GMT ==> UCT==Universal Conversion Time)
#%H Der Zeitzonenwert beträgt also -1 Std. für unsere MEZ
#%H (Mitteleuropäische Zeit) (CET).
#%H Unter DOS sollte dieser Wert standardmäßig 0 sein.
#%H Auf Sommerzeit/Winterzeit muß auch reagiert werden, falls
#%H dies im jeweiligen Betriebssytem eingestellt ist!
#%H 
#%H Auf jeden Fall kann man mit dieser Einstellmöglichkeit
#%H für Up- und Download korrekte Verhältnisse schaffen.
#%H Siehe unten.
#%H 
#%H Option 'I R':
#%H paßt die remote Seite möglichst weitgehend
#%H mit Hilfe von rename-Kommandos an die lokale Seite an.
#%H Rename-Kommandos ersparen jegliches Transfervolumen!
#%H Gleichnamige Dateien werden dabei ignoriert.
#%H Verzeichnisse werden nötigenfalls angelegt, es werden
#%H jedoch keine gelöscht.
#%H 1.) Homepage lokal umbauen.
#%H 2.) Mit URL-Manager (urls.bish) URLs korrigieren.
#%H 3.) 'I' (+ Info-Dateien anschauen)
#%H 4.) 'I R' (+ Info-Dateien anschauen)
#%H 5.) 'I' (+ Info-Dateien anschauen)
#%H 6.) Eventuell 'I T', 'U', 'D', 'L', 'I', ...
#%H (Neueste bish-Kompilate verwenden!)
#%H 
#%H Option 'I T':
#%H setzt alle lokalen Dateien auf die Zeit
#%H des korrespondierenden remote-Exemplars -5 Minuten.
#%H 'I t' wirkt nur auf nichtversteckte, die einen größeren
#%H Zeitwert als das remote-Exemplar haben.
#%H Die Wirkung ist erst nach einem weiteren 'I' zu sehen.
#%H 
#%H Option 'I'  d l u u1 xu1 :
#%H      d     Bei [lu] werden nur die Verzeichnisse umbenannt,
#%H            ohne d nur Dateien.
#%H      l     Änderung in Kleinschreibung.
#%H      u     Änderung in Großschreibung.
#%H      u1    Nur das erste Zeichen wird einbezogen.
#%H      xu1   Der erste vorkommende Buchstabe wird einbezogen,
#%H            nicht jedoch in einer Erweiterung.
#%H      [x]u1 kann mit und ohne 'l' angegeben werden.
#%H      'l' wirkt zuerst.
#%H dluu1xu1  kann gemeinsam mit t|T angegeben werden.
#%H 
#%H 
#%H Option 'ed' (ed, ed s, ed i) ruft einen Editor auf, um
#%H *dieses* Script zu editieren oder um eine Info-Datei
#%H anzuschauen.
#%H Info-Dateien:  hpm_tmpf.inf
#%H                hpm_tmpf.loc
#%H                hpm_tmpf.rem
#%H                hpm_tmpf.ftp
#%H 
#%H 'ed i' editiert hpm_tmpf.inf .
#%H Diese Dateien werden im aktuellen HP-Verzeichnis angelegt.
#%H Sie werden lokal durch Ausfilterung ignoriert.
#%H Die ersten drei werden durch Option 'I' erzeugt.
#%H Die letzte (.ftp) enthält ftp-Dateikommandos.
#%H 
#%H Format der .inf-Datei:
#%H         +new          ...............
#%H         .size=        ...............
#%H         >time=        ...............
#%H         :size=,time=  ...............
#%H         <rem_newer:   ...............
#%H         -remote_only  ...............
#%H         -lign         ...............
#%H Es kann manchmal sehr nützlich sein, die .inf-Datei
#%H nach einem 'I'-Lauf anzuschauen, um einen Überblick
#%H zu gewinnen.
#%H (size und time sind Differenzwerte.)
#%H (Löschen 'L' nicht möglich bei  <rem_newer)
#%H (<rem_newer: wenn mehr als 16 Std. neuer)
#%H 
#%H 
#%H Am Script-Ende können viele Konfigurationen eingetragen
#%H werden, die vom Menü aus benutzt und gesetzt werden
#%H können:
#%H         #@ftp1 ftp -n  < {}
#%H         #@ftp2 ftp -n -s:{}
#%H Bis zu neun ftp-Kommandos, wobei hier eines für Unix und
#%H eines für WinNT gezeigt sind.
#%H Die Zeichenfolge {} wird vom Script automatisch durch den
#%H Namen einer Kommandodatei ersetzt.
#%H
#%H         #@host1 home-up.t-online.de;user anonymous .
#%H Bis zu neun host+login Angaben sind möglich.
#%H
#%H         #@cmd1 /bin/csh -f -c "/etc/mstppp start"
#%H         #@cmd2 /bin/sh /etc/mstppp stop
#%H         #@cmd8 pwd
#%H Auch Kommandos 0 und 1-9 sind vorhanden.
#%H Zu sehen sind vorstehend Anwahl und Abwahl (Online/Offline)
#%H unter Unix und 'pwd' zur kontrollierenden Anzeige
#%H des aktuellen Verzeichnisses.
#%H
#%H         #@lign cybercom.drv
#%H         #@rign xYz
#%H Ebenfalls sind Angabemöglichkeiten vorhanden, um lokale und
#%H remote Dateien zu ignorieren (lign == local ignore).
#%H 
#%H 
#%H Betriebssyteme mit Zeitzonen-Vorrichtung speichern alle
#%H Zeitwerte in GMT ab.
#%H Das gilt für die Zeitstempel der Dateien und für die
#%H batteriegestützte Uhr des Computers.
#%H Beim Lesen von Zeiten wird der TZ-Wert (MEZ: -1) subtrahiert,
#%H beim Schreiben addiert:  zeit=GMT-(-1), GMT=zeit+(-1).
#%H Bei aktiver Sommerzeit wird zusätzlich 1 Stunde subtrahiert
#%H bzw. addiert:  zeit=GMT-tz-sz, GMT=zeit+tz+sz
#%H 
#%H Bei Unix und DOS auf einem Computer gibt es daher auch
#%H ein zeitliches Durcheinander.
#%H Es sei denn, man schaltet alle Zeitmechanismen komplett ab.
#%H 
#%H Falls ihre Computerzeit vorgeht, würde dies Shell-Script
#%H wahrscheinlich einige Dateien immer wieder zum Upload anbieten!
#%H Beispiel:
#%H Es ist 15:00 Uhr.
#%H Sie haben gerade eine Datei geändert, die jetzt 15:04 Uhr hat,
#%H weil Ihre Computeruhr vorgeht.
#%H Sie machen einen Upload, und die Datei hat dann auf dem
#%H Server 15:01 Uhr, weil dessen Uhr korrekte Zeit hat.
#%H 
#%H Wenn ein Upload nicht sofort erfolgt, sondern erst nach
#%H 5 Minuten, gibt es natürlich kein solches Problem.
#%H Beachten muß man:
#%H         Lokale Computerzeit
#%H         Lokale Zeitstempel
#%H         Lokale Zeitzonen
#%H         Lokale Sommerzeit
#%H         Remote Computerzeit
#%H         Remote Zeitstempel
#%H         Remote Zeitzonen
#%H         Remote Sommerzeit
#%H Bei stets korrekter Uhrzeit und Zeitzoneneinstellung
#%H wird man keine Probleme bekommen.
#%H Priorität hat allerdings die Remote Zeit, dessen Zeit
#%H man folgen muß, wenn man sekunden- oder minuten-genau
#%H arbeiten will.



#-----------------------------------------------------------------
# AB HIER DÜRFEN SIE KONFIGURIEREN:
# Achten Sie auf das Leerzeichen nach dem jeweils ersten Wort!
# Abschnitte ohne Beschreibung davor werden vom Menü aus
# oder automatisch gesetzt.
#-----------------------------------------------------------------

#@ftp 1
#@host 1

# FTP-KOMMANDOS 0-9:
# {} wird automatisch durch einen Kommandodateinamen ersetzt.
#@ftp0 ftp home-up.t-online.de
#@ftp1 ftp -n < {}
#@ftp2 ftp -n -s:{}
#@ftp3 /usr/bin/ftp -nvd < {}
#@ftp9 ftp -n -s:{}

# HOST und LOGIN 0-9:
# user login secret account
#@host1 home-up.t-online.de;user anonymous .

# KOMMANDOS 0-9:
# Kommando 0 wird beim Start ausgeführt, falls eingetragen.
#@cmd0 
#@cmd1 /bin/csh -f -c "/etc/mstppp start"
#@cmd2 /bin/sh /etc/mstppp stop
#@cmd3 Dir=c:\winnt\system32\wsock32; MOVE $Dir.dll ${Dir}_
#@cmd4 edit $Script
#@cmd7 cd /u/hp/1; ftp home-up.t-online.de; cd -
#@cmd8 pwd
#@cmd9 bish /u/sh/bish/hpsums.bish >/dev/null

# GEWÜNSCHTES EDITOR-KOMMANDO:
#@edit 

# DATEIEN, DIE LOKAL IGNORIERT WERDEN SOLLEN:
# Stets '/' angeben als Trennzeichen!
# Nur relative Pfadnamen, wie gezeigt!
#@lign uvw/xyz/XYZ

# DATEIEN, DIE REMOTE IGNORIERT WERDEN SOLLEN:
# Stets '/' angeben als Trennzeichen!
# Nur relative Pfadnamen, wie gezeigt!
#@rign XyZ/xYz

#@rfil 3
#@rtot 2
#@tz -1
#@ddir /u/hp/DL
#@hdir /u/hp/1



###  hpsums.bish  #############################################


#cd /u/hp/1

ziel=txt/01GETchecksum.txt
[ -d de/txt ] && ziel=de/$ziel
echo "Prüfsummen- und Zeitstempel-Liste:" > $ziel
date >> $ziel
echo %n >> $ziel

for wc in  exe zip Z gz bin drv bish
do
   list -fR |
   while readl file
   do
      expr "$file" :: "%.$wc%$" || continue
      expr "$file" :: "cgi/" && continue
      expr "$file" :: "tmp/" && continue
      [ -s "$file" ] || continue
      echo "$file"
      expr "$file" :fil '%([^/]%{1,%}%)$'
      expr "$fil" :fil '01GET' = ''
      prints s16s17s17s3s `sum -b < "$file"`"(sum)" %
                          `crc "$file"`"(crc)" %
                          `fsize "$file"`"(size)" %
                          "" "$fil" >> $ziel
   done
done

echo %n >> $ziel

List()  {
   list -fR |
   while readl zeile
   do
      expr "$zeile" :: 'cgi/' && continue
      expr "$zeile" :: 'tmp/' && continue
      echo $(fstat -m $zeile) $zeile
   done
   return 0
}


List | sortl -r -fn1 |
while read - zeile
do
   ifset zeile || continue
   [ -s "$zeile" ] || continue
   for wc in  exe zip Z gz bin drv bish htm txt
   do
      expr "$zeile" :: "%.$wc%$" && { file="$zeile"; break; }
      file=''
   done
   ifset file || continue
   ls -ltgo "$file" | read - - - mon tag uhr -
   expr "$file" :fil '%([^/]%{1,%}%)$'
   expr "$fil" :fil '01GET' = ''
   prints s3s4s6s3s $tag $mon $uhr "" "$fil" >> $ziel
done

echo %n >> $ziel





###  hpup.bish  #############################################

#!/u/bin/bish
#bish-Script 'hpup.bish'
#Copyright (c) 1998  Helmut Schellong


T=/
[ `ver s` == dos ] && T=\
set -f


err()  {
   local h
   [ "$1" == '-h' ] && h=1 && shift
   print -ru2 "hpup.bish: $1"
   ifset h && print -u2 "bish hpup.bish local_dir [+/-h] [-e]" %
                        '[ [-f] kdo xxx${file} yyy ${file} zzz ]'
   read "-?<Enter> "
   exit 1
}


[ $# -lt 1 ] && err -h "Mindestens HP-Verzeichnis angeben!"
[ -d "$1" ] || err -h "Ist kein Verzeichnis: '$1'"
cd "$1"
[ -s server.lsl ] || err -h "Fehlt: 'server.lsl'"
shift



Sec1970()  {
   [ $# -eq 6 ] || return
   local  cjsj=0 nsj=000 cj=0000 T=$1 M=$2 J=$3
   Sec=0000000000  h=$4 m=$5 s=$6
   (( MA[1]=0, MA[2]=31, MA[3]=MA[2]+28, MA[4]=MA[3]+31,
      MA[5]=MA[4]+30, MA[6]=MA[5]+31, MA[7]=MA[6]+30,
      MA[8]=MA[7]+31, MA[9]=MA[8]+31, MA[10]=MA[9]+30,
      MA[11]=MA[10]+31, MA[12]=MA[11]+30, MA[13]=MA[12]+31 ))
   let "J< 70" && let J+=2000
   let "J<100" && let J+=1900
   let "J<1970" && err "Zu kleines Jahr vom Server: '$J'"
   for cj from 1970 to "$J" repeat
   do
      cjsj=0
      (( !(cj%4) && (cj%100) || !(cj%400) )) && let "cjsj=1, ++nsj"
   done
   (( Sec  = 3600*24 * ( 365 * (J - 1970) + nsj - cjsj ),
      Sec += 3600*24 * ( MA[M] + T - 1 ) + h * 3600 + m * 60 + s,
      cjsj && M >= 3 )) && let "Sec+=3600*24"
   set -A MA ; unset h m s
   #echo "  $Sec Sekunden seit 1.1.1970 00:00:00"
   #echo $Sec
   return 0
}



[ $T == / ] && Jahr=`date +%Y` || err "Fehlschlag: date"
[ $T == \ ] && {
   :>>hpupshow.tmp
   DIR hpupshow.tmp | grep -im '^hpupshow' | read - - - Jahr -
   [ ! -s hpupshow.tmp ] && DEL hpupshow.tmp
   expr "$Jahr" :Jahr '%([0-9]%{2,4%}%)$' ||
      err "Datumsfunktion fehlgeschlagen: '$Jahr'"
   let "Jahr< 80" && let Jahr+=2000
   let "Jahr<100" && let Jahr+=1900
}
let "Jahr<1970" && err "Zu kleines aktuelles Jahr: '$Jahr'"


Add=0000000000
local sz mo ta st mi ja
:>server.ssn
grep '^-[r-][w-][x-][r-][w-][x-][r-][w-][x-]' server.lsl |
   while read - - - - sz mo ta uj nam
   do
      ifset nam || continue
      conv -l mo
      case "$mo" in
        jan)  mo=1 ;; feb)  mo=2 ;; mar)  mo=3 ;; apr)  mo=4 ;;
        may)  mo=5 ;; jun)  mo=6 ;; jul)  mo=7 ;; aug)  mo=8 ;;
        sep)  mo=9 ;; oct)  mo=10 ;; nov)  mo=11 ;; dec)  mo=12 ;;
          *)  err "Monat=='$mo'!?" ;;
      esac
      st=00 mi=00 ja=$Jahr
      expr "$uj" :st '^%([0-9]%{1,2%}%):[0-9]%{1,2%}$' || ja=$uj
      expr "$uj" :mi '^[0-9]%{1,2%}:%([0-9]%{1,2%}%)$' || ja=$uj
      expr "$ja" :: '^[1-9][0-9][0-9][0-9]$' || err "Jahr: '$ja'"
      expr "$sz$ta" :: '[^0-9]' && err "GrößeTag: '$sz'$ta'"
      let "ta<1||ta>31||st<0||st>23||mi<0||mi>59" &&
         err "TagStundeMinute: '$ta'$st'$mi'"
      Sec1970 $ta $mo $ja $st $mi 0
      print -r "$sz $Sec $nam" >> server.ssn
      let "Add+=sz"
   done
[ -s server.ssn ] || err "Kein Inhalt: server.ssn"
unset sz mo ta st mi ja uj
echo KByte auf dem Server: $((Add/1024))
read "-?<Enter>"


local lcmd=ls
[ $T == \ ] && lcmd="DIR /b"
:>local.ssn
$lcmd | while readl nam
        do
           ifset nam || continue
           [ -f "$nam" ] || continue
           [ "$nam" == local.ssn -o "$nam" == LOCAL.SSN -o %
           "$nam" == server.ssn -o "$nam" == SERVER.SSN -o %
           "$nam" == server.upn -o "$nam" == SERVER.UPN -o %
           "$nam" == server.upf -o "$nam" == SERVER.UPF -o %
           "$nam" == server.nur -o "$nam" == SERVER.NUR -o %
           "$nam" == server.lsl -o "$nam" == SERVER.LSL ] && continue
           print -r `fsize $nam` `mtime $nam` "$nam" >> local.ssn
        done
[ -s local.ssn ] || err "Kein Inhalt: local.ssn"
unset lcmd


Add=0000000
while let "$#>0"
do
   case "$1" in
     [-+][0-9]*)  let "Add=$1*3600" ;;
             -e)  Ed=1 ;;
             -f)  Fe=1 ;;
              *)  Cmd="$*"; break ;;
   esac
   shift
done


[ $T == \ ] && {
   local lsec ssec erw
   >server.upn
   3>server.upf
   <local.ssn
   while read - lsec nam
   do
      expr "$nam" :erw '%.%([^.]*%)$' || erw=''
      ifset erw && expr "$nam" :nam '^%(.[^~''.]*%)'
      grep -mi " $nam"'$' server.ssn | read - ssec -
      ifset ssec || print -ru3 "$nam" && continue
      let "lsec>ssec+Add" && print -r "$nam"
   done
   ><<<
   unset lsec ssec erw
   
   
   >server.nur
   <server.ssn
   while read - - nam
   do
      grep -qmi " $nam"'$' local.ssn || print -r "$nam"
   done
   ><<
}


[ $T == / ] && {
   local lsec ssec
   >server.upn
   3>server.upf
   <local.ssn
   while read - lsec nam
   do
      grep -m " $nam"'$' server.ssn | read - ssec -
      ifset ssec || print -ru3 "$nam" && continue
      let "lsec>ssec+Add" && print -r "$nam"
   done
   ><<<
   unset lsec ssec
   
   
   >server.nur
   <server.ssn
   while read - - nam
   do
      grep -qm " $nam"'$' local.ssn || print -r "$nam"
   done
   ><<
}


ifset Ed && [ $T == / ] && Ed=vi
ifset Ed && [ $T == \ ] && Ed=edit
ifset Ed && {
   > hpupshow.tmp
   echo ":: server.upn ::"
   cat -s server.upn
   echo ":: server.upf ::"
   cat -s server.upf
   echo ":: server.nur ::"
   cat -s server.nur
   ><
   $Ed hpupshow.tmp
   [ $T == / ] && rm hpupshow.tmp
   [ $T == \ ] && DEL hpupshow.tmp
}


#[ -s server.upn -o -s server.upf ] || :
ifset Cmd && {
   zeile="$Cmd"
   read "nam?'$Cmd' ausführen?[jn]:  "
   [ "$nam" != j ] && exit
   expr "$Cmd" :nam '%${%([a-zA-Z][a-zA-Z0-9]*%)}' || nam=''
   ifset nam && {
      ifdef $nam && err "'$nam': anderen Namen wählen!"
      <server.upn
      while readl zeile
      do
         $nam="$zeile"
         eval "print -ru2 +n+ $Cmd"
         eval "$Cmd"
      done
      ><
      ifset Fe && {
         <server.upf
         while readl zeile
         do
            $nam="$zeile"
            eval "print -ru2 +f+ $Cmd"
            eval "$Cmd"
         done
         ><
      }
   }
   ifset nam || { eval "print -ru2 +++ $Cmd"; eval "$Cmd"; }
   read "-?<Enter>"
}





###  hpup.bish  #############################################

#!/u/bin/bish
#bish-Script 'hpup.bish'
#Copyright (c) 1998  Helmut Schellong


T=/
[ `ver s` == dos ] && T=\
set -f


err()  {
   local h
   [ "$1" == '-h' ] && h=1 && shift
   print -ru2 "hpup.bish: $1"
   ifset h && print -u2 "bish hpup.bish local_dir [+/-h] [-e]" %
                        '[ [-f] kdo xxx${file} yyy ${file} zzz ]'
   read "-?<Enter> "
   exit 1
}


[ $# -lt 1 ] && err -h "Mindestens HP-Verzeichnis angeben!"
[ -d "$1" ] || err -h "Ist kein Verzeichnis: '$1'"
cd "$1"
[ -s server.lsl ] || err -h "Fehlt: 'server.lsl'"
shift



Sec1970()  {
   [ $# -eq 6 ] || return
   local  cjsj=0 nsj=000 cj=0000 T=$1 M=$2 J=$3
   Sec=0000000000  h=$4 m=$5 s=$6
   (( MA[1]=0, MA[2]=31, MA[3]=MA[2]+28, MA[4]=MA[3]+31,
      MA[5]=MA[4]+30, MA[6]=MA[5]+31, MA[7]=MA[6]+30,
      MA[8]=MA[7]+31, MA[9]=MA[8]+31, MA[10]=MA[9]+30,
      MA[11]=MA[10]+31, MA[12]=MA[11]+30, MA[13]=MA[12]+31 ))
   let "J< 70" && let J+=2000
   let "J<100" && let J+=1900
   let "J<1970" && err "Zu kleines Jahr vom Server: '$J'"
   for cj from 1970 to "$J" repeat
   do
      cjsj=0
      (( !(cj%4) && (cj%100) || !(cj%400) )) && let "cjsj=1, ++nsj"
   done
   (( Sec  = 3600*24 * ( 365 * (J - 1970) + nsj - cjsj ),
      Sec += 3600*24 * ( MA[M] + T - 1 ) + h * 3600 + m * 60 + s,
      cjsj && M >= 3 )) && let "Sec+=3600*24"
   set -A MA ; unset h m s
   #echo "  $Sec Sekunden seit 1.1.1970 00:00:00"
   #echo $Sec
   return 0
}



[ $T == / ] && Jahr=`date +%Y` || err "Fehlschlag: date"
[ $T == \ ] && {
   :>>hpupshow.tmp
   DIR hpupshow.tmp | grep -im '^hpupshow' | read - - - Jahr -
   [ ! -s hpupshow.tmp ] && DEL hpupshow.tmp
   expr "$Jahr" :Jahr '%([0-9]%{2,4%}%)$' ||
      err "Datumsfunktion fehlgeschlagen: '$Jahr'"
   let "Jahr< 80" && let Jahr+=2000
   let "Jahr<100" && let Jahr+=1900
}
let "Jahr<1970" && err "Zu kleines aktuelles Jahr: '$Jahr'"


Add=0000000000
local sz mo ta st mi ja
:>server.ssn
grep '^-[r-][w-][x-][r-][w-][x-][r-][w-][x-]' server.lsl |
   while read - - - - sz mo ta uj nam
   do
      ifset nam || continue
      conv -l mo
      case "$mo" in
        jan)  mo=1 ;; feb)  mo=2 ;; mar)  mo=3 ;; apr)  mo=4 ;;
        may)  mo=5 ;; jun)  mo=6 ;; jul)  mo=7 ;; aug)  mo=8 ;;
        sep)  mo=9 ;; oct)  mo=10 ;; nov)  mo=11 ;; dec)  mo=12 ;;
          *)  err "Monat=='$mo'!?" ;;
      esac
      st=00 mi=00 ja=$Jahr
      expr "$uj" :st '^%([0-9]%{1,2%}%):[0-9]%{1,2%}$' || ja=$uj
      expr "$uj" :mi '^[0-9]%{1,2%}:%([0-9]%{1,2%}%)$' || ja=$uj
      expr "$ja" :: '^[1-9][0-9][0-9][0-9]$' || err "Jahr: '$ja'"
      expr "$sz$ta" :: '[^0-9]' && err "GrößeTag: '$sz'$ta'"
      let "ta<1||ta>31||st<0||st>23||mi<0||mi>59" &&
         err "TagStundeMinute: '$ta'$st'$mi'"
      Sec1970 $ta $mo $ja $st $mi 0
      print -r "$sz $Sec $nam" >> server.ssn
      let "Add+=sz"
   done
[ -s server.ssn ] || err "Kein Inhalt: server.ssn"
unset sz mo ta st mi ja uj
echo KByte auf dem Server: $((Add/1024))
read "-?<Enter>"


local lcmd=ls
[ $T == \ ] && lcmd="DIR /b"
:>local.ssn
$lcmd | while readl nam
        do
           ifset nam || continue
           [ -f "$nam" ] || continue
           [ "$nam" == local.ssn -o "$nam" == LOCAL.SSN -o %
           "$nam" == server.ssn -o "$nam" == SERVER.SSN -o %
           "$nam" == server.upn -o "$nam" == SERVER.UPN -o %
           "$nam" == server.upf -o "$nam" == SERVER.UPF -o %
           "$nam" == server.nur -o "$nam" == SERVER.NUR -o %
           "$nam" == server.lsl -o "$nam" == SERVER.LSL ] && continue
           print -r `fsize $nam` `mtime $nam` "$nam" >> local.ssn
        done
[ -s local.ssn ] || err "Kein Inhalt: local.ssn"
unset lcmd


Add=0000000
while let "$#>0"
do
   case "$1" in
     [-+][0-9]*)  let "Add=$1*3600" ;;
             -e)  Ed=1 ;;
             -f)  Fe=1 ;;
              *)  Cmd="$*"; break ;;
   esac
   shift
done


local io=' ' lsec ssec
[ $T == \ ] && io=i
>server.upn
3>server.upf
<local.ssn
while read - lsec nam
do
   grep -m$io " $nam"'$' server.ssn | read - ssec -
   ifset ssec || print -ru3 "$nam" && continue
   let "lsec>ssec+Add" && print -r "$nam"
done
><<<
unset lsec ssec


>server.nur
<server.ssn
while read - - nam
do
   grep -qm$io " $nam"'$' local.ssn || print -r "$nam"
done
><<
unset io


ifset Ed && [ $T == / ] && Ed=vi
ifset Ed && [ $T == \ ] && Ed=edit
ifset Ed && {
   > hpupshow.tmp
   echo ":: server.upn ::"
   cat -s server.upn
   echo ":: server.upf ::"
   cat -s server.upf
   echo ":: server.nur ::"
   cat -s server.nur
   ><
   $Ed hpupshow.tmp
   [ $T == / ] && rm hpupshow.tmp
   [ $T == \ ] && DEL hpupshow.tmp
}


#[ -s server.upn -o -s server.upf ] || :
ifset Cmd && {
   zeile="$Cmd"
   read "nam?'$Cmd' ausführen?[jn]:  "
   [ "$nam" != j ] && exit
   expr "$Cmd" :nam '%${%([a-zA-Z][a-zA-Z0-9]*%)}' || nam=''
   ifset nam && {
      ifdef $nam && err "'$nam': anderen Namen wählen!"
      <server.upn
      while readl zeile
      do
         $nam="$zeile"
         eval "print -ru2 +n+ $Cmd"
         eval "$Cmd"
      done
      ><
      ifset Fe && {
         <server.upf
         while readl zeile
         do
            $nam="$zeile"
            eval "print -ru2 +f+ $Cmd"
            eval "$Cmd"
         done
         ><
      }
   }
   ifset nam || { eval "print -ru2 +++ $Cmd"; eval "$Cmd"; }
   read "-?<Enter>"
}





###  ht.bish  #############################################

#!/u/bin/bish
#bish-Script 'html2txt' h2t.bish
#Copyright (c) Helmut Schellong


set -f
set +S
[ $# -lt 1 ] && { echo "h2t.bish [-4] datei"; exit; }

Subs='&lt; < &gt; > &amp; & &quot; " &nbsp; @
      &brvbar; | &sect; Paragraph &shy; . &middot; .
      &auml; ä &ouml; ö &uuml; ü &szlig; ß
      &Auml; Ä &Ouml; Ö &Uuml; Ü'

if [ "$1" == -4 ]
then
   shift
   Subs='&lt; < &gt; > &amp; & &quot; " &nbsp; @
      &brvbar; | &sect; ^U &shy; ú &middot; ù
      &auml; ~D &ouml; ~T &uuml; ~A &szlig; á
      &Auml; ~N &Ouml; ~Y &Uuml; ~Z'
fi

[ $# -lt 1 -o ! -s "$1" ] && { echo "h2t.bish [-4] datei"; exit; }

catv /%j =zv:

< "$1"
while readl zeile
do
   while expr "$zeile" :zeile '<[Bb][Rr]>%(.%)' "$zv%1"
   do  :;  done
   expr "$zeile" :zeile '<[^>]%{1,%}>' + ''
   for 2 alt neu  in  $Subs
   do
      conv -t"@ " neu
      expr "$zeile" :zeile "$alt" += "$neu"
   done
   catv zeile /%j
done
><





###  hts.bish  #############################################


[ $# -lt 4 ] && echo Args-ERR && exit 1
h=$1
t=$2
s=$3
#head(0-15/0-255),track(0-1023),sector(1-63)
#nh=255 ist ok, bei 255 im BIOS(0-254)
#aber trotzdem h=0-255 bei biosdisk().
nh=252
while let "++nh<=256"
do
   let "sec=h*63+t*nh*63+s-1"
   echo nhead=$nh sec=$sec file="$4"
   echo nhead=$nh sec=$sec file="$4" >> hts.log
   let "sec<0" && exit 2
   dd if=/dev/rhd00 of=ts bs=1b iseek=$sec count=2 conv=bmode ||
      echo dd-ERR && exit 4
   cmpf ts "$4"
   #let "nh>256&&!t" && break
   #cat ts >> "${4}_"
done



###  hxbin.bish  #############################################




[ -t 0 ] && exit 1
set -f
local a=00000000000 a0=00000000000 i=00 th=00
local out=_________________ s
readl zeile0 || exit 0
array 0 16 h  $zeile0
expr "$h0" :: '[^0-9]' && exit 1
a0=$h0
echo "$h1 $h2 $h3 $h4 $h5 $h6 $h7 $h8 $h9 $h10 $h11 $h12" %
     "$h13 $h14 $h15 $h16" | base -16 +b | catv =out:
[ $# -gt 0 -a -n "$1" ] && { 1<> "$1"; trap '><' 0 ; }
[ -t 1 ] || seek $a0 1

while readl zeile
do
   expr "$zeile" :a '^ *%([0-9]%{1,%}%)' || {
      ifset s && exit 2; s=1; continue; }
   let "a<=a0" && exit 2
   let "h0=a-a0, h0>16" && h0=16
      i=0
      for th in  `catv -$h0:,,zeile0 | base`
      do
         let ++i ; h0=h$i
         let "16#$th==16#${{h0}" && continue
         let "th=16#$th, th!=46" && {
            echo $th | base -10 +b | catv =$((i-1)),1,out
            let "th==9||th==249||th==250" &&
               catv /. =$((i-1)),1,out
         }
      done
   catv out
   let "a-a0>16" && ifset s || [ -t 1 ] || seek $a 1
   ifset s && { s=''; let i=a-a0
      let "i&15||i<32" && exit 2
      while let "i-=16, i>0"; do  catv out;  done
   }
   zeile0="$zeile"
   array 0 16 h  $zeile0
   a0=$h0
   echo "$h1 $h2 $h3 $h4 $h5 $h6 $h7 $h8 $h9 $h10 $h11 $h12" %
        "$h13 $h14 $h15 $h16" | base -16 +b | catv =out:
done

[ $# -gt 0 -a -n "$1" ] && ><





###  i.bish  #############################################

#!/root/bin/bish


CDall()  {
   read "-? CD einlegen "
   mount_cd9660 /dev/acd0a /cdrom || return
   [ -d /cdrom/packages/All ] || return
   list /cdrom/packages/All > all/$1
   umount /cdrom
   ls -l all
   return 0
}


RdDep()  {
   local t:.50 z:.50 nam:.50
   : > dep/1
   cd inst
   for t in $( list )
   do
      pkg_info -r $t |
      while readl z
      do
         ifset z || continue
         expr "$z" :nam '^[ %t]%{1,}%([^ %t]%{1,}%)' || continue
         print -r $nam >> ../dep/1
      done
      [ -s ../dep/1 ] && sortl ../dep/1 | uniq > ../dep/1
   done
   ls -l ../dep
   cd -
   return 0
}


GetDep()  {
   local m=0 cd:.20 dep:.50 fdep:.1000
   catv 0 =fdep: < dep/1
   for cd in $( list all )
   do
      for dep in $fdep
      do
         grep -qm "^$dep.tgz" all/$cd || continue
         [ m -eq 0 ] && {
            read "-? CD $cd einlegen "
            mount_cd9660 /dev/acd0a /cdrom || break
            m=1
            [ -d /cdrom/packages/All ] || break
         }
         cp /cdrom/packages/All/$dep.tgz idep &&
            expr "$fdep" :fdep "$dep" = ''
      done
      [ m -eq 1 ] && m=0 umount /cdrom || break
   done
   echo dep_rest:$fdep:
   return 0
}


ShowDep2()  {
   local d:.50
   cd idep
   for d in $( list )
   do
      read "-? $d: "
      pkg_info -r $d
   done
   cd -
   return 0
}


mkdirs all dep inst idep
while echo "%n
%tCD-All einlesen     : cd bez
%tRead dependencies   : dep
%tGet depen. pkg      : get
%tShow dependencies2  : dep2
%tBeenden             : E

%t                    : %c"
do
   read ausw p
   case "$ausw" in
     cd)  CDall "$p";;
     dep)  RdDep;;
     get)  GetDep;;
     dep2)  ShowDep2;;
     E)  break ;;
     *)  continue;;
   esac
done

exit 0



###  i.bish  #############################################




Dir=/home2/I
l $Dir
dir=x
nam=x0
while :
do
   expr "$nam" :num '%(%d%{1,}%)$' && {
      let "++num"
      expr "$nam" :nam '%d%{1,}$' = "$num"
   }
   read "d?$Dir/$dir $nam [.|[dir] [nam]]: " n
   ifset n || [ "$d" == . ] && break
   ifset d n && dir="$d" nam="$n" d= n=
   ifset d && nam="$d" d=
   [ -d "$Dir/$dir" ] || mkdirs "$Dir/$dir"
   echo $Dir/$dir/$nam
   dd if=/dev/rfd0135ds18 of=$Dir/$dir/$nam bs=18k || echo $?
done





###  icc.bish  #############################################

#!/u/bin/bish

cd /u/bish/tst || exit

$1 -p Tspeed2
$1 -p s70.bish 1111111111 >/dev/null
cd mu
$1 -p texts.bish
$1 -p tpa.bish
$1 -p cfg.bish



###  inc.bish  #############################################


num=0
cat "$1" | {
   > "$1"
   while readl zeile
   do
      let "num<100" && num=0$num
      let "num< 10" && num=0$num
      let "num== 0" && num=000
      expr "$zeile" :zeile '^/%*[0-9]%{3%}' = "/*$num" && let ++num
      print -r "$zeile"
   done
   ><
}



###  inc3.bish  #############################################


num=0 nv=0 nv0=0
cat "$1" | {
   > "$1"
   while readl zeile
   do
      [ ${#num} -eq 1 ] && num=0$num
      expr "$zeile" :nv ' %([0-9]%{1,2%}%)00 ' && let "nv!=nv0" && num=00 nv0=$nv
      expr "$zeile" :zeile ' %([0-9]%{1,2%}%)00 ' " %%1$num " && let ++num
      print -r "$zeile"
   done
   ><
}



###  inch.bish  #############################################


num=0
cat "$1" | {
   > "$1"
   while readl zeile
   do
      let "num<100" && num=" $num"
      let "num< 10" && num=" $num"
      let "num== 0" && num="  0"
      expr "$zeile" :zeile ' [0-9]%{1,3%} ' = " $num " && let ++num
      print -r "$zeile"
   done
   ><
}



###  index.bish  #############################################




#[ $# -eq 0 ] && exit 0
DEL=0
[ "$1" == del ] && DEL=1
Findex=indwd.txt
[ ! -s "$Findex" -a DEL -eq 0 ] && exit 1


Zeile()  {
   local a:17.1 b:19.1 comment:.200
   if { expr "$Z" :: '\verb%>'; inv; } && expr "$Z" :comment '[^\]%(%%.*%)$'
   then  expr "$Z" :Z '%([^\]%)%%.*$' '%1'
   else  comment=
   fi
   #expr "$Z" :Z "%<$N%>" += "$a$N$b"
   #expr "$Z" :Z "\index{$a$N$b" += "\index{$N"
   ##expr "$Z" :Z "\textsc{$a$N$b" += "\textsc{$N"
   #expr "$Z" :Z "\verb%(.%)$a$N$b" + "\verb%1$N"
   #expr "$Z" :Z "\label{%([^}]*%)$a$N$b" + "\label{%1$N"
   #expr "$Z" :Z "\pageref{%([^}]*%)$a$N$b" + "\pageref{%1$N"
   #expr "$Z" :Z "\ref{%([^}]*%)$a$N$b" + "\ref{%1$N"
   #expr "$Z" :Z "\textbf{%([^}]*%)$a$N$b" + "\textbf{%1$N"
   #expr "$Z" :Z "$a$N$b" = "$N\index{$_ind}"
   #expr "$Z" :Z "[$a$b]" += ''
   expr "$Z" :Z '%([ \]*%)$'   "\index{$_ind}%1"
   Z="$Z$comment"
   #ifset comment && catv comment =:,,Z:
   return 0
}


#word
CkZeile()  {
   local ww=0 wd="$1" exp:.50
   expr "$wd" :: '^%w' || let "ww|=1"
   expr "$wd" :: '%w$' || let "ww|=2"
   case $ww in
     0)  exp="%<$wd%>" ;;
     1)  exp="$wd%>" ;;
     2)  exp="%<$wd" ;;
     3)  exp="$wd" ;;
   esac
   expr "$Z" :: "$exp" || return 1
   return 0
}


UseNot()  {
   ifset Z || { catv /%n; return 0; }
   [ Vscan -eq 1 ] && expr "$Z" :: '^%%v%%' && return 1
   expr "$Z" :: '^[ %t]%{0,}%%' &|
   expr "$Z" :: '\[a-z]%{0,9}section[{[]' &|
   expr "$Z" :: '\[a-z]%{0,9}section%*[{[]' &|
   expr "$Z" :: '^\begin{tabular}' &|
   expr "$Z" :: '^\begin{itemize}' &|
   expr "$Z" :: '^\begin{list}' &|
   expr "$Z" :: '^\begin{math}' &|
   expr "$Z" :: '^\label{' &|
   expr "$Z" :: '\pageref{' &|
   expr "$Z" :: '\chapter[{[]' && {
      catv Z /%n; return 0
   }
   return 1
}


#File
SelectWords()  {
   local ww=0 word:.50 wd:.50 exp:.50
   SWD=
   for word in $IND $WD
   do
      wd="$word"
      expr "$wd" :wd '%%s' += ' '
      ww=0
      expr "$wd" :: '^%w' || let "ww|=1"
      expr "$wd" :: '%w$' || let "ww|=2"
      case $ww in
        0)  exp="%<$wd%>" ;;
        1)  exp="$wd%>" ;;
        2)  exp="%<$wd" ;;
        3)  exp="$wd" ;;
      esac
      grep -qm -e "$exp" "$1" || continue
      SWD="$SWD$word "
   done
   ifset SWD || return 1
   return 0
}


set Z:.300
set F:.50
set N:.50
set IND:.50
set ind:.50
set _ind:.50
set WD:.500
set SWD:.500
V=v
Vscan=0

#File ...
Files()  {
   for F in $*
   do
      [ -s "$F" ] || continue
      SelectWords "$F" || continue
      print -u2 "%t%t$F"
      V=v
      cat "$F" | {
         > "$F"
         while readl Z
         do
            case $V in
              v)
               UseNot && continue
               expr "$Z" :: '^\begin{verbatim}' &|
               expr "$Z" :: '^%%v%%\begin{verbatim}' || goend
               V=V; [ Vscan -eq 1 ] && V=s
               catv Z /%n; continue ;;
              V)
               expr "$Z" :: '^\end{verbatim}' &|
               expr "$Z" :: '^%%v%%\end{verbatim}' && V=v
               catv Z /%n; continue ;;
              S|s)
               expr "$Z" :: "%<$ind%>" && V=S
               expr "$Z" :: '^\end{verbatim}' &|
               expr "$Z" :: '^%%v%%\end{verbatim}' && {
                 if [ $V == S ]; then V=i; else V=v; fi
               }
               catv Z /%n; continue ;;
              i)
               if expr "$Z" :: '\input{'
               then catv Z /%n; catv "/\index{$_ind}%n"
               else catv "/\index{$_ind}%n"; catv Z /%n
               fi
               V=v continue ;;
            esac
            for N in $SWD
            do
               [ Vscan -eq 1 ] && break
               expr "$N" :N '%%s' += ' '
               CkZeile "$N" || continue
               #expr "$Z" :: "%<$N%>" || continue
               Zeile; break
            done
            catv Z /%n
         done
         ><
      }
   done
   return 0
}


DELindex()  {
   for F in $*
   do
      [ -s "$F" ] || continue
      grep -qm '\index{' "$F" || continue
      print -u2 "%t$F"
      V=v
      cat "$F" | {
         > "$F"
         while readl Z
         do
            if [ $V == V ]
            then
               expr "$Z" :: '^\end{verbatim}' &|
               expr "$Z" :: '^%%v%%\end{verbatim}' && V=v
               catv Z /%n; continue
            else
               UseNot && continue
               expr "$Z" :: '^\begin{verbatim}' &|
               expr "$Z" :: '^%%v%%\begin{verbatim}' || goend
               V=V; catv Z /%n; continue
            fi
            expr "$Z" :: '^\index{[^}]%{1,}}' && continue
            expr "$Z" :Z '\index{[^}]%{1,}}' += ''
            catv Z /%n
         done
         ><
      }
   done
   return 0
}


[ DEL -eq 1 ] && { DELindex kap/*.tex mod/vorwort.tex; exit 0; }


4< "$Findex"
while read -u4 IND WD
do
   ifset IND || continue
   expr "$IND" :: '^#' && continue
   [ "$IND" == '%v%' -a -z "$WD" ] && continue
   Vscan=0
   [ "$IND" == '%v%' ] && { Vscan=1
      expr "$WD" :IND '^%([^ ]%{1,}%)'
      expr "$WD" :WD '^[^ ]%{1,}' = ''
   }
   ind="$IND"
   expr "$ind" :ind '%%s' += ' '
   _ind="$ind"
   expr "$_ind" :_ind '_' += '\_'
   [ Vscan -eq 1 ] && _ind=".code: $_ind"
   print -u2 "%t$_ind"
   Files kap/*.tex mod/vorwort.tex
done
><

exit 0



###  initee.bish  #############################################




ifdef FUNCTIONS_BISH || . ./functions.bish
ifdef CVARS_BISH || . ./cvars.bish



CopyCmuee()  {
   local ee=$Fmueehv
   [ MUspsw -eq 0 ] && ee=$Fmuee
   [ MUspsw -eq 2 ] && ee=$Fmueebm
   #echo "A:\DATA\$ee > C:\MUEE"
   cat $ee > $Fmueebin
   ee=0
   [ -s $Fmueemuc ] && fstat -sv ee $Fmueemuc
   let "ee==5000+2048" && {
      base -W +w < $Fmueebin | catv 2048,0 =5000,2048,3  3<> $Fmueemuc
      return 0
   }
   #echo "Default C:\DATA.MUC ..."
   prints vs48 Hbuf
   > $Fmueemuc
   cat $Fheadmuc
   to $((100-15)) repeat
   do
      catv 48,Hbuf /%r%n
   done
   base -W +w < $Fmueebin
   ><
   return 0
}


#bin Var: adr typ wlen dst dsteye dflt1 mi1 ma1 dflt2 mi2 ma2 dfltbm flg unit nam txt
# 1  2    3   4   5    6   7      8     9   10  11    12  13  14     15  16   17  18
#MkMUee C:\MUEE A:\DATA\EEBASE $MUspsw
MkMUee()  {
   local b=10 offs=00000 adr=00000 typ=.. blen=00 dst=..
   local df1=........................................
   local df2=....................
   local dfbm=....................
   catv 5,BasePos =offs:
   prints sF2552048-  > $1
   3<> $1
   < $2
   seek $offs 0
   while read adr typ blen dst - df1 - - df2 - - dfbm - - - -
   do
      expr "$adr" :: '^@%d' || { expr "$adr" :: '^%$' || continue; break; }
      conv -D@ adr
      let "blen<<=1, adr=$adr, adr<<=1"
      b=10
      case $dst in
        x)  b=16 ;;
        b)  b=2 ;;
      esac
      [ $3 -eq 1 -a $df2 != '"' ] && df1="$df2"
      [ $3 -eq 2 -a $dfbm != '"' ] && df1="$dfbm"
      case $typ in
        w)  base -$b df1 +w Hbuf ;;
        L)  base -$b df1 +L Hbuf ;;
        S)  conv '-t` ' df1
            [ $dst == 0 ] && prints vs-F000$blen df1 "$df1"
            [ $dst == m -a ${#df1} -lt blen ] && prints vs-$blen df1 "$df1"
            base -w df1 +W Hbuf ;;
      esac
      catv $blen,Hbuf =$adr,,3
   done
   ><<
   return 0
}



prints vs70 EEmin
prints vs40 EEmax
EEdflt=00000000
InputLen=000
ifdef Hbuf || prints vs2048 Hbuf

local L_offs=000000 L_n=000 L_c=.... L_src=000000 L_x=....................


if [ -s $Feebase -a '(' %
     -z "$BasePos" -o %
   ! -s $Feelf -o %
   ! -s $Fsigajs -o %
   ! -s $Fsigabmjs ')' ]
then
   #echo eebase: creating basepos ...
   #prints vs150 BasePos
   L_n=0
   < $Feebase
   while seek + 0 L_offs; readl Hbuf
   do
      expr "$Hbuf" :L_c '^:%(.%)' || continue
      [ "$L_c" == '!' ] && let "L_src=L_offs+1"
      let "++L_offs"
      prints vs-6 L_offs $L_offs
      catv L_offs =$L_n,6,BasePos
      let "L_n+=6"
   done
   [ L_src -ne 0 ] && {
      L_c='    '
      seek $L_src 0
      readl Hbuf
      > $Fsigajs
      catv '/var SigSrc= Array(%n'
      while readl Hbuf
      do
         expr "$Hbuf" :: '^@' || break
         expr "$Hbuf" :: '^@%d%{3} %{1,}L %{1,}2 ' || continue
         expr "$Hbuf" :Hbuf '%([^ %t]%{1,}%)$' || continue
         conv '-t` ' Hbuf
         catv $L_c /%s Hbuf /%s ; L_c='/,%n'
      done
      catv '/);%n'
      ><
      cat $Fsigajs > $Fsigabmjs
   }
   ><
   Uvars BasePos
   #catv BasePos > "A:\DATA\BASEPOS"
   {
      L_c='    '
      >> $Fsigajs
      catv '/var Sig= Array(%n'
      < $Fsigatxt
      while readl Hbuf
      do
         ifset Hbuf || continue
         catv $L_c /%s Hbuf /%s ; L_c='/,%n'
      done
      catv '/);%n'
      ><<
      L_c='    '
      >> $Fsigabmjs
      catv '/var Sig= Array(%n'
      < $Fsigabmtxt
      while readl Hbuf
      do
         ifset Hbuf || continue
         catv $L_c /%s Hbuf /%s ; L_c='/,%n'
      done
      catv '/);%n'
      ><<
   }
else
   :
   #Uvars BasePos
   #catv 0 =BasePos: < "A:\DATA\BASEPOS"
fi


[ -s $Feebase -a ! -s $Feelf ] && {
   #echo creating eelframe ...
   L_n=0
   > $Feelf
   catv Doctype '/<html><head><title>VBM EE-Rubriken</title>%n' Meta
   echo '<base target="EErf">%n</head>%n<body class="main" text="#ffd700"><b>'
   < $Feebase
   for L_offs in $BasePos
   do
      seek $L_offs 0
      readl Hbuf
      let "++L_n"
      catv '.<a class="elf" href="/cgi/muee.cgi?' L_n '.">' Hbuf '.</a><br><br>' /%n
   done
   echo '</b></body></html>'
   ><<
}
#enctype="multipart/form-data">
#accept-charset="UNKNOWN">

for 2 L_c L_x in 1 $Fmueehv 2 $Fmueebm 0 $Fmuee
do
   [ -s $L_x ] && continue
   #echo creating A:\DATA\$L_x ...
   MkMUee $Fmueebin $Feebase $L_c
   cat $Fmueebin > $L_x
done
CopyCmuee





###  ip.bish  #############################################


< ipok
while readl ip
do
   r=`ip $ip`
   echo $r $ip
done
><

< iperr
while readl ip
do
   r=`ip "$ip"`
   echo $r $ip
done
><



###  istep.bish  #############################################

#istep.bish
#Schellong/Sep.1998


set -f

let `ver n`'+0<243' && {
   echo "Dieses Script benötigt mindestens bish-Version 2.43 !"
   ver; exit 1
}
#T=/
#[ `ver s` == dos ] && T=\
[ `ver w` == shw ] && read "-?<Enter>: "

local Ls="DIR /b/l/a:-d/o:en"
VER | grep -iq caldera && Ls="xdir -d /b/x"
VER | grep -iq dr.dos && Ls="xdir -d /b/x"

N=000000
Init=0 Enum=000 Max=000 Flags=Avn Byte=0000000000000 Space=0000.0
Line="`prints s150-`"
Titel="`prints s50-`"
expr `pwd` :isDir '^%([a-zA-Z]:%)' || isDir=''
isDir="$isDir\istep.dir"

TmpDir=.
ifset -E TEMP && { TmpDir="$TEMP"; conv -F\ TmpDir
   [ ! -d "$TmpDir" ] && TmpDir=.
}

[ "$TmpDir" == . ] && { print "%r
%r
 ___________________________________________________________%r
 | Sie sollten idealerweise die Umgebungsvariable TEMP     |%r
 | auf ein gültiges Verzeichnis einer RamDisk setzen.      |%r
 | Siehe 'Hilfe' im Menü.                                  |%r
 -----------------------------------------------------------"
}



err()  {
   local el=e
   [ $# -ge 2 -a "$1" == -l ] && el=l
   [ $# -ge 2 ] && shift
   [ $el == e ] && print -ru2 "istep.bish: --- $1 ---"
   [ -f $isDir\istep.log ] || return 0
   [ $el == e ] && print -r "--- $1 ---" >> $isDir\istep.log
   [ $el == l ] && print -r "+ $1" >> $isDir\istep.log
   return 0
}


vor00()  {
   let "${{#1}==2" && $1=0${{1}
   let "${{#1}==1" && $1=00${{1}
   let "${{#1}==0" && $1=000
}



Funktion())  {
   case "$1" in
   tmpfiles)
      local dir=$2 vnam=_______________ e=000 tmp
      shift 2
      for vnam in  $*
      do
         for e from 200 to 299 repeat
         do
            tmp=$dir\bish_tmpf.$e
            [ -e $tmp ] || { :>$tmp; $vnam=$tmp
               err -l "tmpfiles(): $vnam=$tmp"; continue 2; }
         done
         err "Zuviel temporäre Dateien."
         for vnam in  $*
         do
            [ -f ${{vnam} ] && DEL ${{vnam}
         done
         exit 1
      done
      return 0
   ;;
   homedir)
      if [ ! -e $isDir ]
      then
         echo "Verzeichnis '$isDir' existiert nicht."
         echo "Soll es erzeugt werden? [jn]:  %c"
         read Line
         [ "$Line" == j ] || return
         MD $isDir
         [ ! -d $isDir ] && exit 1
         Funktion mkini || return
         echo "%n%t!!! Besichtigen Sie die erzeugte ini-Datei !!!"
         return 1
      else
         [ ! -d $isDir ] &&
            err "$isDir existiert, ist aber kein Verzeichnis!" &&
            exit 1
         [ -s $isDir\istep.ini ] || {
            err "'$isDir\istep.ini' fehlt!"
            Funktion mkini || return
            echo "%n%t!!! Besichtigen Sie die erzeugte ini-Datei !!!"
            return 1
         }
      fi
      [ "$2" == lesen -o "$2" == edit -o $Init -gt 0 ] && return
      [ -s $isDir\istep.log ] && {
         cat $isDir\istep.log >> $isDir\istep.gol
         catv /%j >> $isDir\istep.gol
      }
      echo > $isDir\istep.log
      DIR $isDir\istep.log | grep -i 'istep  *log' | read - - - Line
      catv /">>> $Line <<<%j" > $isDir\istep.log
      Init=1
      return 0
   ;;
   mkini)
      > $isDir\istep.ini
      echo "[ScanDirs]"
      echo "c: d: e: f: g: h: i: j: k: l: m: n:"
      echo "o: p: q: r: s: t: u: v: w: x: y: z:"
      echo "; Existierende RamDisk-L:, CDROM-L:, etc., weglöschen!"
      echo "; Es können beliebige, reine Dir-Pfade gesetzt werden."
      echo "%n[SaveFiles]"
      echo "c:\autoexec.bat c:\config.sys"
      echo "c:\windows\*.ini c:\windows\*.grp c:\windows\*.dll"
      echo "c:\windows\*.dat c:\windows\system\*.dll"
      echo "; Reine Verzeichnispfade werden rekursiv durchsucht!"
      echo "%n[EditCommand]"
      echo "edit"
      echo "; Nur ein(!) Kommando, auch mit Optionen."
      echo "%n[LineComparator]"
      echo "lnot.exe"
      echo "%n[ScanDirsNFR]"
      echo "; Nicht bei dieser Script-Version."
      echo "%n[ScanDirsNotNFR]"
      echo "; Nicht bei dieser Script-Version."
      echo "%n[SaveFilesNFR]"
      echo "; Nicht bei dieser Script-Version."
      echo "%n[SaveFilesNotNFR]"
      echo "; Nicht bei dieser Script-Version."
      echo "%n[FilterExpressions]"
      echo ";\istep%.dir bish_tmpf%.[0-9]%{3%}"
      echo "; Nicht bei dieser Script-Version."
      echo "%n[PackCommand]"
      echo "; Nicht bei dieser Script-Version."
      echo "%n[CkSumCommand]"
      echo "; Nicht bei dieser Script-Version."
      ><
      [ -s $isDir\istep.ini ] ||
         err "'$isDir\istep.ini' fehlgeschlagen!" && exit 1
      err -l "$1(): $isDir\istep.ini"
      return 0
   ;;
   rdpar)
      [ -f $2 ] || return 0
      err -l "$1(): $2  $3"
      < $2
      while readl Line
      do
         conv -l Line
         expr "$Line" :: "^%[$3]" && break
      done
      while readl Line
      do
         ifset Line || continue
         expr "$Line" :: '[!-~]' || continue
         expr "$Line" :: '^[ %t]*;' && continue
         expr "$Line" :: '^%[[a-zA-Z]%{1,%}]' && break
         print -r "$Line"
      done
      ><
      return 0
   ;;
   mkscanlst)
      local ziel=$isDir\scanlist.$2 file
      err -l "$1(): $2"
      [ -s $ziel ] && :>$ziel
      for file in  `Funktion rdpar $isDir\istep.ini scandirs`
      do
         conv -t/\F\ file
         { expr "$file" :: '^[a-zA-Z]:'; inv; } &|
           expr "$file" :: '^..[^\]' &&
            err "Fehlerhaft: '$file'" && { :>$ziel ; break; }
         [ ! -d "$file" ] && continue
         print -r "$file" >> $ziel
      done
      [ ! -s $ziel ] && { err "Keine g~Altigen [ScanDirs]!"
         [ -f $ziel ] && DEL $ziel
         return 1
      }
      return 0
   ;;
   mksavelst)
      local ziel=$isDir\savelist.$2 file
      err -l "$1(): $2"
      [ -s $ziel ] && :>$ziel
      for file in  `Funktion rdpar $isDir\istep.ini savefiles`
      do
         conv -t/\F\ file
         { expr "$file" :: '^[a-zA-Z]:'; inv; } &|
           expr "$file" :: '^..$' &| expr "$file" :: '^..[^\]' &&
            err "Fehlerhaft: '$file'" && { :>$ziel ; break; }
         Funktion savels "$file" >> $ziel || { :>$ziel ; break; }
      done
      [ ! -s $ziel ] && { err "Keine g~Altigen [SaveFiles]!"
         [ -f $ziel ] && DEL $ziel
         return 1
      }
      return 0
   ;;
   mkdir)
      local nam=$2 l='   ' dir mdir
      expr "$nam" :l '^%([\/]%)'
      expr "$nam" :l '^%([a-zA-Z]:%)' && {
         [ ! -d $l ] && err "Kann '$l' nicht erzeugen!" && return 1
         l=''
      }
      conv -"t\ t/ " nam
      for dir in  $l$nam
      do
         ifset mdir && mdir="$mdir\$dir"
         ifset mdir || mdir=$dir
         [ -d "$mdir" ] && continue
         [ -e "$mdir" ] &&
            err "'$mdir' existiert als Nicht-Verzeichnis!" && return 1
         MD $mdir
         [ -d $mdir ] || err "'MD $mdir' fehlgeschlagen!" && return 1
      done
      return 0
   ;;
   cpmvback)
      local ali=$isDir\alias.$3 qdir=$isDir\save_dir.$3
      local alinam=_____ zdir  #bvp=$4
      err -l "$1(): $3 $2 $4"
      Funktion cktab 2 0 $ali || return 1
      grep "^[$4]%." $ali |
         while read alinam Line
         do
            ifset alinam Line || {
               err "Inhaltslos: '$alinam' '$Line'"; continue; }
            expr "$alinam" :: '^[SNC]%.[a-z]%{3%}$' || {
               err "Fehlerhaft: '$alinam' $Line"; continue; }
            [ ! -w $Line -a -f $Line ] && {
               err "Schreibschutz: $alinam --> $Line"; continue; }
            [ ! -f $Line -a -e $Line ] && {
               err "Keine Datei: $Line"; continue; }
            expr "$Line" :zdir '^%(.*%)\[^\][^\]*$' || {
               err "Fehlerhafter Pfad: $Line"; continue; }
            ifset zdir || zdir=\
            [ -d $zdir ] || Funktion mkdir $zdir || continue
            [ `$2 $qdir\$alinam $Line > NUL |2 wc -c` -gt 0 ] &&
               err "'$2 $qdir\$alinam --> $Line' fehlgeschlagen!"
         done
      return 0
   ;;
   rddat)
      local file=$isDir\istep.dat n=000 f=___ #max=0000 #min=9999
      Enum=000 Max=000 Flags=Avn
      [ -s $file ] || return 0
      err -l "$1(): ..."
      < $file
      while read n f Line
      do
         { ifset n f Line; inv; } &|
         expr "$n" :: '[^0-9]' &| let 'n<1||n>999' &|
         { expr "$f" :: 'A' && let Enum; } &|
         expr "$f" :: '[^Avn]' &| expr "$f" :: '.A' &|
         expr "$f" :: 'n.' &| let "${#f}>3||${#Line}>48" &&
            err "Inhalt ist defekt: '$file'" && { >< ; exit 1; }
         #let "n<min" && min=$n
         let "n>Max" && Max=$n
         expr "$f" :: 'A' && { Enum=$n; Flags="$f"; Titel="$Line"; }
      done
      ><
      vor00 Enum
      err -l "$1(): $Enum $Flags '$Titel'"
      return 0
   ;;
   wrdat)
      local datf=$isDir\istep.dat n0=$2 f0=$3 n=000 f #t="$4"
      n0=$((n0))
      err -l "$1(): $2 $3 '$4'"
      [ -f $datf ] && attrib -r $datf >NUL
      [ -f $datf ] || :>$datf
      Funktion tmpfiles $TmpDir tmpdat
      < $datf
      while read n f Line
      do
         expr "$f" :f '^A%(.*%)$' && [ "$f0" == n ] && f=A${f}n
         expr "$f0" :: '[AD]' && let "n==n0" && f=A$f
         expr "$f0" :: 'D' && let "n>n0" && continue
         prints s4s7s4s $n $f "" "$Line" >> $tmpdat
      done
      ><
      [ "$f0" == v ] && prints s4s7s4s $n0 Av "" "$4" >> $tmpdat
      cat $tmpdat > $datf
      DEL $tmpdat; unset tmpdat
      [ -f $datf ] && attrib +r $datf >NUL
      #Funktion rddat || return
      return 0
   ;;
   cktab)
      local wpz=$2 sub=$3 w=000000 z=000000 c=000000
      [ -s "$4" ] || return 0
      err -l "$1(): Teste Tabellen-Datei: $4"
      [ $# -gt 4 ] && N="$IFS" IFS="$IFS$5"
      wc $4 | read z w c
      [ $# -gt 4 ] && IFS="$N"
      let 'w-=sub,z-=sub,
           w<0||z<0 || !w&&c&&!sub||w%wpz||w/z!=wpz||w%z' &&
         err "Inhalt ist defekt: $4" && return 1
      return 0
   ;;
   free)
      local df=$isDir\istep.ini m=$((1024*1024)) byte
      [ -f $isDir\istep.ini ] || df=''
      DIR $df | grep -L '[0-9]' | catv =byte:
      expr "$byte" :byte '%([0-9][0-9.,]*%)' || byte=0
      conv -d.d, byte
      Space=$((byte/m)).$(({[byte%m]*10}/m))
      Byte=$byte
      err -l "$1(): $Space $Byte"
      return 0
   ;;
   space)
      [ -s "$2" ] || return 0
      local sum=0000000000 cs=$((32*1024)) sz
      < $2
      while readl Line
      do
         expr "$Line" :: '[!-~]' || continue
         [ -s $Line ] || continue
         sz=`fsize $Line`
         let 'sum += [sz&~(cs-1)] + !![sz&(cs-1)]*cs'
      done
      ><
      let 'sum>=Byte' &&
         err "$1(): Speichermangel: $sum >= $Byte" && return 1
      err -l "$1(): $sum < $Byte"
      return 0
   ;;
   savels)
      local file="$2" dir
      err -l "$1(): $2"
      if expr "$file" :: '[*?]'
      then
         expr "$file" :dir '^%([^*?]*\%)[^\]%{1,%}$' ||
            err "Fehlerhaft: '$file'" && return 1
         conv -F\ dir
         $Ls "$file" |
            while readl Line
            do  expr "$Line" :Line '^[a-zA-Z]:%(..*%)$'
                print -r "$dir\$Line"
            done
      else
         [ -d "$file" ] && $Ls /s "$file"
         [ -f "$file" ] && print -r "$file"
      fi
      return 0
   ;;
   mklist)
      local ziel=$3 quelle=$isDir\scanlist.$2 n=000000
      [ -s $quelle ] ||
         err "Keine oder leere Scan-Liste." && return 1
      [ -f $ziel ] && attrib -r $ziel >NUL
      [ -s $ziel ] && :>$ziel
      err -l "$1(): $2 $3"
      < $quelle
      while readl Line
      do
         ifset Line || continue
         [ ! -d "$Line" ] &&
            err "Kein Verzeichnis: $Line" && continue
         echo "%tListe: Filter: ~@-þ,bish_tmpf,istep.dir -- '$Line'"
         3>> $ziel
         $Ls /s "$Line" |
            while readl Line
            do
               expr "$Line" :: '[~@-þ %t%r%z]' &&
                  err "Unerlaubte Zeichen: '$Line'" && continue
               expr "$Line" :: 'bish_tmpf%.[0-9]%{1,3%}' &|
               expr "$Line" :: '\istep%.dir' && continue
               echo "%r%tmklist($((++n)))%c"
               prints su39s11s2s `fsize $Line` `mtime $Line` "" $Line
            done
         ><
         echo
      done
      ><
      [ -f $ziel ] && expr "$ziel" :: 'liste%.' && attrib +r $ziel >NUL
      return 0
   ;;
   mkdiff)
      local neu=$3 ziel=$isDir\diffs.$2 #alt=$isDir\liste.$2
      local size=0000000000 time=0000000000 ncziel=_______
      err -l "$1(): $alt $3 $ziel"
      Funktion cktab 3 0 $neu || return 1
      Funktion cktab 3 0 $alt || return 1
      Funktion tmpfiles $TmpDir new changed deleted alt
      cat $isDir\liste.$2 > $alt
      N=0
      < $neu
      while readl Line
      do
         echo "%r%tmkdiff[neu]($((++N)))%c"
         grep -Fmq -e "$Line" $alt || catv Line /%j >> $deleted
      done
      ><
      echo
      N=0
      echo '[New]' > $new
      echo '[Changed]' > $changed
      < $deleted
      while read size time Line
      do
         echo "%r%tmkdiff[n+a]($((++N)))%c"
         ncziel=new
         aline="`grep -Fm -e "$Line" $alt`" && ncziel=changed
         prints s9s11s2s $size $time "" $Line >> ${{ncziel}
         ifset aline && catv '/;' 1,,aline >> $changed
      done
      ><
      echo
      N=0
      echo '[Deleted]' > $deleted
      < $alt
      while read size time Line
      do
         echo "%r%tmkdiff[alt]($((++N)))%c"
         grep -Fmq -e "$Line" $neu ||
            prints s9s11s2s $size $time "" $Line >> $deleted
      done
      ><
      echo
      [ -f $ziel ] && attrib -r $ziel >NUL
      cat $new $changed $deleted > $ziel
      DEL $new; DEL $changed; DEL $deleted; DEL $alt
      unset new changed deleted aline alt
      [ -s $ziel ] || err "Fehlschlag: $ziel" && return 1
      Funktion cktab 3 3 $ziel ';' || return 1
      attrib +r $ziel >NUL
      return 0
   ;;
   mkdiffE)
      local neu=$3 ziel=$isDir\diffs.$2 #alt=$isDir\liste.$2
      local size=0000000000 time=0000000000 ncziel=_______
      err -l "$1(): $alt $3 $ziel"
      Funktion cktab 3 0 $neu || return 1
      Funktion cktab 3 0 $alt || return 1
      Funktion tmpfiles $TmpDir new changed deleted alt anp
      cat $isDir\liste.$2 > $alt
      echo "%r%t$isDir\lnot.exe ..."
      echo "%r%tmkdiffE[neu](          )%b%b%b%b%b%b%b%b%b%b%b%c"
      $isDir\lnot.exe -v $neu $alt $deleted
      [ $? -lt 4 ] || return
      echo; N=0
      echo '[New]' > $new
      echo '[Changed]' > $changed
      < $deleted
      while read size time Line
      do
         echo "%r%tmkdiffE[n+a]($((++N)))%c"
         ncziel=new
         aline="`grep -Fm -e "$Line" $alt`" && ncziel=changed
         prints s9s11s2s $size $time "" $Line >> ${{ncziel}
         ifset aline && catv '/;' 1,,aline >> $changed
      done
      ><
      echo; N=0
      unset aline
      echo '[Deleted]' > $deleted
      [ -f $ziel ] && attrib -r $ziel >NUL
      cat $new $changed > $ziel
      :>$new ; :>$changed
      < $neu
      while read - - Line
      do  echo "%r%tmkdiffE[neup]($((++N)))%c"
          catv Line /%j >> $new
      done
      ><
      echo; N=0
      < $alt
      while read - - Line
      do  echo "%r%tmkdiffE[altp]($((++N)))%c"
          catv Line /%j >> $changed
      done
      ><
      echo; N=0
      echo "%r%t$isDir\lnot.exe ..."
      echo "%r%tmkdiffE[alt](          )%b%b%b%b%b%b%b%b%b%b%b%c"
      $isDir\lnot.exe -v $changed $new $anp
      [ $? -lt 4 ] || return
      echo; N=0
      < $anp
      while readl Line
      do
         echo "%r%tmkdiffE[anp]($((++N)))%c"
         grep -Fm -e "$Line" $alt >> $deleted ||
            err "Seltsamerweise fehlt '$Line' in '$alt'." && return 1
      done
      ><
      echo
      cat $deleted >> $ziel
      DEL $new; DEL $changed; DEL $deleted; DEL $alt; DEL $anp
      unset new changed deleted alt anp
      [ -s $ziel ] || err "Fehlschlag: $ziel" && return 1
      Funktion cktab 3 3 $ziel ';' || return 1
      attrib +r $ziel >NUL
      return 0
   ;;
   dosave)
      local quelle=$isDir\savelist.$2 zdir=$isDir\save_dir.$2
      local ali=$isDir\alias.$2 anu=$((36#aaa-1)) ziel
      [ -s $quelle ] || return 0
      [ -d $zdir ] || MD $zdir
      [ -d $zdir ] || exit 1
      [ -f $ali ] && attrib -r $ali >NUL
      [ -s $ali ] && :>$ali
      err -l "$1(): $2"
      N=0
      < $quelle
      while readl Line
      do
         ifset Line || continue
         expr "$Line" :: '[~@-þ %t%r%z]' &&
            err "Unerlaubte Zeichen: '$Line'" && continue
         echo "%r%tdosave($((++N)))%c"
         ziel=$zdir\S.$((36#, ++anu))
         COPY $Line $ziel > NUL
         [ -f $ziel ] || err "'COPY $Line $ziel' fehlgeschlagen!"
         [ -f $ziel ] && catv /S.$((36#, anu))%t Line /%j >> $ali
      done
      ><
      echo
      Funktion cktab 2 0 $ali || return 1
      [ -f $ali ] && attrib +r $ali >NUL
      return 0
   ;;
   dodiffs)
      local ali=$isDir\alias.$2 alinam path
      err -l "$1(): $2"
      [ -s $isDir\diffs.$2 ] ||
         err "Fehlt oder leer: 'diffs.$2'" && return 1
      [ -f $ali ] || :>$ali
      Funktion cktab 2 0 $ali || return 1
      Funktion cktab 3 0 $isDir\liste.$2 || return 1
      Funktion cktab 3 3 $isDir\diffs.$2 ';' || return 1
      Funktion tmpfiles $TmpDir chdel alinew
      N=0
      for alinam in  changed deleted
      do
         Funktion rdpar $isDir\diffs.$2 $alinam |
            while read - - path
            do  catv path /%j >> $chdel
                echo "%r%tdodiffs[$alinam]($((++N)))%c"
            done
         echo;N=0
      done
      [ -f $isDir\savemiss.$2 ] && DEL $isDir\savemiss.$2
      < $chdel
      while read path
      do
         echo "%r%tdodiffs[chdel]($((++N)))%c"
         grep -Fmsq -e "$path" $ali ||
            grep -Fms -e "$path" $isDir\liste.$2 %
               >> $isDir\savemiss.$2 ||
               err "'$path' nicht vorhanden in liste.$2!" &&
               catv /000%t000%t path /%j >> $isDir\savemiss.$2
      done
      ><
      echo;N=0
      < $ali
      while read alinam path
      do
         echo "%r%tdodiffs[alias]($((++N)))%c"
         grep -Fmq -e "$path" $chdel && {
            catv alinam /%t path /%j >> $alinew ; continue; }
         DEL $isDir\save_dir.$2\$alinam
      done
      ><
      echo
      [ -f $ali ] && attrib -r $ali >NUL
      cat $alinew > $ali
      [ -f $ali ] && attrib +r $ali >NUL
      DEL $chdel; DEL $alinew
      unset chdel alinew
      Funktion cktab 2 0 $ali || return 1
      return 0
   ;;
   laden)
      local ali=$isDir\alias.$2 anu=$((36#aaa-1))
      local zdir=$isDir\save_dir.$2 bvp=X ziel par
      [ -d $zdir ] || MD $zdir
      [ -d $zdir ] || exit 1
      err -l "$1(): $2"
      Funktion cktab 2 0 $ali || return 1
      Funktion cktab 3 3 $isDir\diffs.$2 ';' || return 1
      [ -f $ali ] && attrib -r $ali >NUL
      N=0
      for 2 bvp par in  N new C changed
      do
         Funktion rdpar $isDir\diffs.$2 $par |
          while read - - path
          do
             echo "%rladen[$bvp]($((++N)))%c"
             expr "$path" :: '[!-~]' || continue
             [ -f $path ] || { err "Fehlt beim Laden: '$path'"
                               continue; }
             ziel=$zdir\$bvp.$((36#, ++anu))
             MOVE $path $ziel > NUL
             [ -f $ziel ] || err "'MOVE $path $ziel' fehlgeschlagen!"
             [ -f $ziel ] &&
                catv /$bvp.$((36#, anu))%t path /%j >> $ali
          done
         echo
      done
      unset path
      [ -f $ali ] && attrib +r $ali >NUL
      Funktion cpmvback COPY $2 S || return
      return 0
   ;;
   delete)
      local zdir=$isDir\save_dir.$2 par=_______ ddir
      err -l "$1(): $2"
      Funktion cktab 3 3 $isDir\diffs.$2 ';' || return 1
      N=0
      for par in  new changed
      do
         Funktion rdpar $isDir\diffs.$2 $par |
          while read - - path
          do
             echo "%rdelete[$par]($((++N)))%c"
             ifset path || continue
             expr "$path" :ddir '^%(.*%)\[^\][^\]*$' || {
                err "Fehlerhafter Pfad: $path"; continue; }
             [ -f "$path" ] || continue
             [ -w $path ] || { err "Schreibschutz: $path"
                               continue; }
             DEL $path
             [ -f $path ] && { err "'DEL $path' fehlgeschlagen!"
                               continue; }
             ifset ddir && [ -d "$ddir" ] &&
                expr "$ddir" :: '^[a-zA-Z]:$' || RD $ddir 2> NUL
          done
         echo
      done
      unset path
      [ -s $isDir\diffs.$2 ] && Funktion cpmvback COPY $2 S || return
      [ -d $zdir ] && { DEL "$zdir\S.*" 2> NUL
                        DEL "$zdir\N.*" 2> NUL
                        DEL "$zdir\C.*" 2> NUL; }
      for par in  scanlist savelist liste diffs alias #savemiss
      do
         ddir=$isDir\$par.$2
         [ -f $ddir ] || continue
         [ -w $ddir ] || attrib -r $ddir >NUL
         echo "%rdelete[DEL]($((++N)))%c"
         DEL $ddir
         [ -f $ddir ] && err "'DEL $ddir' fehlgeschlagen!"
      done
      echo
      return 0
   ;;
   install)
      local ali=$isDir\alias.$2
      err -l "$1(): $2"
      Funktion cpmvback MOVE $2 NC || return
      [ -f $ali ] && attrib -r $ali >NUL
      grep '^S%....' $ali | cat > $ali           #!Pipe-Files nötig!
      [ -f $ali ] && attrib +r $ali >NUL
      Funktion cktab 2 0 $ali || return 1
      return 0
   ;;
   mklnot)
      local r=0
      err -l "$1(): ..."
      Funktion lnotcode
      ifdef -f lnotcode || err "lnotcode() nicht existent!" && return 1
      fprint lnotcode | Funktion decode || r=1
      unset -f lnotcode
      return $r
   ;;
   decode)
      local a=000 b=000 c=000 d=000 ziel=$isDir\lnot.exe
      A=000 B=000 C=000 N=0
      err -l "$1(): ..."
      3> $ziel
      tr -d '[\0- ]=' | tr '[?-~]' '[\0-\63]' | base -b +10 |
         while readl Line
         do
            ifset Line || continue
            echo "%r%tdecode($((++N)))%c"
            for 4 a b c d  in  $Line
            do
               (( A=(a<<2)|(b>>4), B=[(b<<4)&255]|(c>>2),
                  C=[(c<<6)&255]|d ))
               ifset d && catv A /%n B /%n C /%n =3 && continue
               ifset c && catv A /%n B /%n       =3 && continue
               ifset b && catv A /%n             =3
            done
         done
      ><
      echo
      unset A B C
      base -10 +b < $ziel | cat > $ziel           #pipe-files nötig!
      err -l "$1(): crc==527276123? ..."
      [ ! -s $ziel ] &| let `crc $ziel`"!=527276123" &&
         err "Erzeugung '$ziel' fehlgeschlagen!" && return 1
      return 0
   ;;
   lnotcode)
      lnotcode()))  {
RTgw?PC??O?_??s?~~~w?W??????????N_????C?}t@i[_??????????????????????????
???????????@????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
??????????????????????????????????Ay[OCmaPY}?jOorQEJJ_G?apwk?GzYgxG?b?YO
?Gc]b?AHJi_?yGO@gWo?bk?roGnWa~ax~v~{{izbWSKeM?Tt|gBL_N^XaOyI?Jc@?LNb_{KG
_}NwaPyM?GrYI}iJNl_?_^{??fKFno?AaRzW?GFFZ_`qI?K}u_@qGjCCs}|FM}|qEWK}u???
\?]BNlg??FSMno?OM}|v@wn|yoNhA_IJvoNYaPy_?Gc]h?A`c??juGz?lChVrQD^s}^yblIJ
x~kroAyM@jwAnqgGmUwGI{~{{yiBNfoFDFXF_ByQ??LqOF[F_ByR?@xqLz_@UJkA?Ks`[ais
Xwk]^?^LGVG_lCaz?OBLGVGVOIMg?CaMoJPHrQDqAj_@UJk??Ks`[oNhaOEs?KsYaPYU?GcM
e??IoFOKmC??bkAz[??ep_[@K}smb_Y}?jw]AJ{iAMbO?N{ua?B~LgW?~rYC?M_C?dBgUo_m
b_Y}?dXVnagGnqgGyNC?VtzBTd[mb_Y}?bN?a~AxJo?e?_Q?t?@Ewn[lV?tsAZcX?Jgn?M_I
?T|]ownklCqIP_JLGZcM?JhG?McB?Pyw?BVLGWc]\?AK@fW?m?OtrQEHFf_?b?Xy?J_DL[s`
aPx{?GoE^_Aw@bVLGWc]_?AK@gG?m??dbKiMujib?[s`F{K]m??dpPXs?Ks`Fpyw@AVDDf_?
rQC^Fj_DH[SU^?BLGP{]m?WdpPY??Ks`F{Mw??EJtwn]M||sEQY?N~|sBaYIRoCqzRnG[oQJ
oWnR_{KEy}KztvOZa|ge_B{?HkWF~oXs@qZ~VoGFy{Oe~t[A@}m|ozO?a|]Jvbn^\@[e_B~~
\?oeME[@[_Weae[@a|MBooZjxRnV\@mJuaY?No?ep_^~@fOFHn|^?_^jpqZ~ToGFy{BBlCAz
?_BLG[MxF_AyT_?mb`y}?mbi~z_B?DBgAo[???C?TWnkTd]JR_QJ{Onu\AyB^_W?\Ojj?SY?
N?@t}mk]p_O?bTWEyoxEPwgDa?Q?NO@t|WNA?gnYar{J~vVka{WjoT|]V[LTa}qBz@@UTwl}
@Gtu~bNHXglE@eYzA_???EWrseZv{wBAKG_SReYJP_XeK|He|~LeaSWEXgL}@_@tt]kFa_QJ
uW_@OSYJpgtU~bnA\m}Ju[W@?Gn@VtzHotUJzN|u@n|u@M_F?GNC@GnOV[LTa}q@zAY?Td]J
\_PepsZ{?????K\E|_C?psZo??@M_sWE?mlLatzga_]s?Atl?GnW_~kK\qNPwqz~hySGp_Wl
A?FjFkWEJ?_@yp^E@akG?]kOp_WiA?FjAUXi?Mbm@GNC@N|EyGl]yG?~?FUwRgLE@_GJ|fwZ
atwEao]HPmaJVma?Nqtt@Z_@?MkAK{?JoFVP_~wA^?UB~_L}AUXi?Mak@GNC@E_@_Gl]@n{v
y?_M_{OCaSZyA{@|BWl]@n{vY_Fga_QBp?Pg?WAJV_Z~\oJgxOuBp?QHPn_JoFsV~vZyyA{J
_{OAatwE~v[AY_FgVOQBp?QB~_LtMuXg?gM??Wl]@n|v@MaoBWNC@gdE|_n?^Qz~\njg}_iB
p?J~\nbg{OiBp?IJV_Z~\oPi?]_^@GNC@MkKXe_@??A?yL{N_{OCY_Fga_UBp?GJoFODm?C?
yoGroD@i?m`u@WNC?_n?\?Uw?_Bj?bN?U_nOaTZipcZbAguEuj}HPmbhNoML`li~atZgI|?@
TnQHPmYHPmaHPmQJPnO@PmRhtOIJVmYI@w`EwroI\?Nho?IJPmWjPmaHPmoJoFwH_F~~BVSB
~szk_vzk?FSByXgA_BwkA?@sXg?}JO_?\OYB^nW@\DfFPmw@?GlEyaS@??n?\Ov~PmyJPmgd
?_?JoFO|m_g?yoaJucJE`|o?AGNyGFrrXn|E~EYJPnpeSEbe?M`{~WNC@gnOa|jE`}W?AEgS
@\o?SN|uzm`ECWNC@eg?Xeg?~vZwyICC_{OGpsZm??BEPlkIbWZY^wdEwMdP?WuEuf}JTm?j
s?DU{gdEvgdEwGdEvGlE{_DEvMfe?Gl]vggFaCZZN?hs?}fP?GlUvalUwGnAA{@}@w@~~ott
?SgzTmps?}en?GluyGl}wGnIF_^rhghC~rJcHghL~rJlI{CJoFOByW{?gAsGl??JoFTG_Bwj
A?@sO^|uzN|uyN|u|ma]CGNC@blEzFSRY_HgH_F~\nZgapABp?W|?_@sEgL}|_Dt@Z_h?]kE
atwEas[CSEgByCKA_{OCgAgGl??JoFSByS[@~sZmasZmNOG?^A]w?_AHPmwHPnA?NasG?FSH
gAkGl??JoFSDm?C?yoGro?n?\?NhDOEJPlx?aSZ_~sZ]~szq_vzq?FwByPF~bWZY^rlEwFSM
atwE~v[AY_Rgu?EBp?QJPmAHPlyL`lh~aSZ_asZ]MsZ[[paJVlyI@wl]wG_F~sZ_~sZ]asZ]
MsZ[[maL`lh~atZ_I|Aw?C?jodB~\mB~\nbgUouBp?YHPnGJoFwByWj}_vzq?FsMatwE~v[A
Y_Jg[_EBp?Q?^lkI\@Q?^lkY\?yJV_Z~\oHi@]`W?WNC@GL}z_@tWgLM{?E_JOas??n?\RU_
Ioas??n?\Qr~\mr~\mb~\nZgT_}Bp?WzPmptCugAYAW@~vZuyCKN_{OENOG?\?Uw?OBj?bN?
A{@sEgL}|_Dt@Z_h?]kEatwEas[CSEgByN??_{OCasZeOGdEyN|Exn|M|GL}|?@}?}ca~WuE
uj{zPm`tBWl]@n{vY_Rgp?ABp?QJPmaHPmYL`li~aSZgasZeMsZc[paJVmYI@wl]yG_F~sZg
~sZeasZeMsZc[maL`li~atZgI|Aw?C?jodB~\mb~\njgPoqBp?YHPnOJoFwByXr{_vzs?FsL
atwE~r\i?m`^?GNC@G@}wohsCw@}wphsBWl]@n{vY_VgP_ABp?R~\njg?O]Bp?J~\nbg}?YB
p?IB^nW@\?f~\nZgyOYBp?IJPn@^VkfB?KOBqoNJ?{kBjoNJ?{kBqoNJ?zWBqoNJ?zsBTWnk
_}pOTglu@GlE@jgg?Onu\OMyK?EB~_Dt?zhQ?WN}?fSBmfS@_~wB\OMyd?EB~_Pt?zin?WN}
@VSBmlC@Y_@g}?DOA{@s@Zbu?]kAK{@OSgtEkDBgineBp?pObSYoSEgAyKKL_{OEA~XtBUgh
YNo?Y_Jgk_uBp?YJp_SC?DBg]?ABp?H]q[LTa}qBNno@GFSDm?C?ypMJFno@s]MJP_QH`qwG
~oZ{?RN?V[NBTWnkTgluA?nu\PzjBn{M~?EJFno@s]N~dqwG_rz{?O@ty}bL|~{U~_FgTnbg
tn]B^_W?\PKJ|fSG~pW??n{U?_J~\_Rgxn\XVdvA@_@Ta}oroD@O~vWCyIZ~V[LTa}qw?O@O
K{@O~vWCyHR~V[KroDAw?O@OK{@OyGV~oz_@?D@OK{@OyFf~otUJzDYJ\_OJ|foT_~xW^_M}
ToAHL__AagOI?haJ{MkL||yB~b@~y[[EA?J~~wcud?Aw~~|]V[GA?DUJzDYJ\_PUyJr~a{X]
V[GA?DUJzJ_?PGl]@Ks`caU??DvBTWnkatwCs]M@hvwF~~usOghEAgl]@GlMAGlU@ks`[_Jj
@TBg^n}XV[LTa}qJV_RPw~]F^_[A?FOEm?S?SMkQlB}JV_QJR_aJT_ZLGVGAyoPOyDB~V[My
@O?zDfoF[qmJulFbpw\}@o??a|ip@LNbpg]??n}JolN_@VoAa|jRwweFa_HAMpX{@vJTgG?A
eDBgV^|XA{@t@gCe^_J~~Z_??dBv@fwA??Hs@Z_@?MkAK{@OK{@OmFoASMbOAWNCAIAO?h`O
yAf~UOn?\OY@HgwA~~uw??HO|oYM?_?A\?Uw?_Bj?bN?SBN?SJaK?dBgf?eBp?bBTWnkasWC
a|Q@y_?AM{Hr@yM[?BN?yofF@hO?A?Aw~~|\otUJzGlE@GlU@_KEf?ABs_AJq?nQ\PA@oO?A
[_gzrFKE`oY[?MkHpoYS??_?mN~~V[LTa}r~\_RghN|XV[LTa}qJP_QXSdBgl~|XUTvBTWnk
atWGlCQIP_YJV_QJR_jLGVGK_vwE?FSCa{Jj@mkCSM_\~dvBTd]J|Gl[@gNj@FGMMpxe?fOD
yCG?yoNg?o@^VkKxFeOA\AMJ\oJu@?Ds@gcuX_JjGBkuX?HsBWn]yDO?as[AguWAyouJvbN?
guOAguWAgu_AS}_T~tnB~o{zFeOA\@aJ\oIJ@I_@\O{B@wcCar{B}wdt?gn]yoNgK_AJNoNz
aoUg?VO@ooCFa~[B{Gd[?gn^av{EM||sBgc}Y?IJ\oQH\OQH^?ZBpoXg?_??owkuY?GJ|fOO
avoEaToEaTsCaV{EaV[Cowc]Y?IHVoQHVoZBTd]J|GlC@_n?\DGD@O@qLaV}~rsG?FKBm?_?
_rxc?_@sFwk]Y?GJuvOLa|Kx@vKYat{EM|ht|]`e?Mk`yGg?yprgF?BjDrN?ypMJ{GNEABcv
[}fgY~~~@wnB@OO?VtzBSBN?SDBgT^xZUqS@?FOHK|HQSM`F~dlZUD?rutLOyBr}Utk|~~|s
DGnWaPxc?gc]X_HWOGcF_{KCa{NBUrN?ot?rutLOy@V}Utk|~~|sDgnWgUWAaS[AaPxe?d`?
aO]BooQJo{LWK{BBIO]J{oKva~wB}CAH@Gd[?gdt?gNE@GnEownkSt@PSM_T~tmJu?n?\@{]
@~qJ}Glu~gkK_{WCTgNh@\Fh{yUHPnzgHNxZatz}_{OEownA_{GGM|DvLWnPMpxe?fSNaO^~
@oNBStBgYntZU}k]a~kB}Gd\?anOIP]J|oNqaVoAOgcTa{mJv}_v~gnX_{KCotXVTWnkatwG
asWIA{@sLonZ\AuByoQJBseJsGNA@WNa~gNyAFKBm__?M{hqBF[D_{KCyobg`~~j?}`N~wnB
yotOyEV}yoXRyHB|K{@ZVT|]oo??boXm?g{E[?IN@fGAJgo]SOyHLfOAaRxu?nqM@h??ng??
KmOejCAKpW^Ucwkua_@EPjc@?G?}c_?B[`EM@go?a~yp^rJ?{izb[gBp^tAJoONBOAV}~wn{
I~`qWGnf@`{U@tDH{yOqoIiMvW^q`|eJownOO}_\?F[J[cO{BVOPy@G?\~S{GFOGN?ts@BoH
\]OqoMn_A{@s@sIiAk@t?SMEwBJ?}]KTjCckGfON@AG{VFSF_Boa\OIkQOnuo}eW{tcBqayM
FdCMaPxi?cKBuwnsa}ojyvJea}UHJeoAwoyH\_ABpOGuj?j?wNhs{BN?aSW?Jgw]SOyJLfOA
arxu?n{u[_J~Lf?AgUgAgwO?gUoAgwW?~qXm?dUJzGlMAJPBacWEatWCrQDq?xFj@DBg\Nh\
otUJzGlU@BkU^?\qAZ_E?DBgV~jjBwnYs]NF`vwF??@Qy?K?UTvBTWnklByJV_RLGVGKs]NF
`vwF???roMkCSM_o}dvBTWnkTd]J^_OJ~vSDyEw?yuWx^Oxs@Zb~~}l]_rs?^AfvPOGG?FSI
a{[D@O?xPOhtPk[D??AJpoSD?BdDAfSwasSGaSSIyrBjJglD@_KDOGnoIRTOasSGaSSISGhD
@H`OyFwD_{OEM{XsB^\D?_?A\OYBROGOyx{roD|]V[LTa}qBz?HUT{\E~_??arx{@zx{?mkQ
|sOA?o@sADZgWn|X~sZ}_{WOa{\NA{@txwlE~d|]a}T\otUJzDXVavWC_ro?^OiJT?WBDCIJ
}mkJaoQXK{GjognOa~bvP?H??FSkasoI_ro?^PvjASeJuW?~AfS@PwnAQ_n?\^BjCGnXOW?~
AfS@PwnAQ_n?\^AJpt|]V[GA?DUJzDXVavWCavwITmb^~dcJoFODmN~~ys]B~oDtCGK{?FwJ
Tm`{~xchP_WXT_a@X?H^~k[C??AJP?aHP?hV~vWG~vWEacOCeDBgJNeBp?aB}n|tAbv~~vSD
mN~~yoGroD|]V[LTa}qBz?`UavWCm?C?SBN?K|HOSghC@H`OyNbw_{OGaTZ}aSZ{_~j~\O_|
~~|t?}eC?GK{?FtsacOCeLF_a|bv`vwF??`sTz_A?D?roBNQSDIIP?QWSMaz}GNCAGdU}gdE
}GNy~vSDN^~~\D?roDB~\nz~\nqIP?QWSMaV}GNCAGNy~vSLN^~~\Oay~~}w~~~jIglE}glU
}GdE~gdU~DZgf^yX?SZ{CTZ}yolUyHB}eQdE~@dU~glU~glE~DyJxTvBTWnkaswClBqJT_ZL
GVGAyoPOyMJvV[GC?DUJzGl]@AnHI|IsOKs`V[GA?DUJzGNk@DXVavWEavwG|{W?oFSGgOOA
HOB?A~?roDB~\_RgEntXUWdE~n^E??Ds]AK}@_IJpye??VSFm?C?SMaI|wL}~n|tGwK}A?GA
\?j~L__AyFZvy]s?|{]??FOCK{Bj?z_@?GdE~mkK|{W?@FOvmD??SMn[|{Zo?FOX~vWCK{@O
yC~~a~_JoFsByZS?T}bl~DfjCn|u@N|u~m_u~wnwA{@|ZMe[?DZ~\_RgfO@XUWnwA{@{UbN?
SD^grN`XUWdE~Ie??FO]_[w?GN^E?G@sFaV~??s_?DAw?O@OT}ah}GNC@mkI|{W??fOCT}b}
~n\E~_C?\@jvp_?@\@Rvpn??\?yw?O@OSN|u@M_p~GNC@_n~^A~vp_?B\?Uw?@Bj?bN?a|Y@
wn~wA|@Q|sZ}?O@s@BN?yoMw??DYA|AJv|FbaX\}@wnFVtyJxTvBTWnk_}oAk?EJR_ZvoOG?
\Oio?n^@@?@t?j??atWCk^?aR_WIoZO|rQDqEgdE~glE@aV~m?s?_Gl]~lFbaW\}@wlE~mkC
SM_v|gndV[LTa}qBz?PUTwlE@BkE^?\qAj_E?DBgE~ZhhoAJP_`?NOG?[_uJV_RPw~]F^_[?
?fODK{Bhb?B~\_b~\_Z~\_Rg\nYBp?YHPnx?NOG?[_uJV_RPw~]F^_[?OFSDasZ}yuIJRnyJ
\_W]@wn}a|z{jBoY\As{BVODimJsypra{?XRm?C?SGtE~TB~\_RgI~YBp?XZ@~qIPnuiM~lt
?mmXyq@Rm?C?SN^XE{@OS^|u@Mb^|WNCAGl]@LFb_W|}@o?AUqnzdt|]a}T\o}ct~tUJzDYJ
\_QJR_WzLfoF[_Uw@_BjKwnP_]G?oGnAM{DtHGFy?K@sFgn]s]MJbvwFa|zPwwn@H^{~A{IH
`vwFa{Cd?KBj@z_@?DBgFNT]V[LTa}pUTwlu@Gl}AbdsBfSK_vwG?f{E_^~~^vWEmN~~yYW?
_rxy?_@tBgF}b?HtAK[E]_G@?MkR_rxw?_@tBGF}^?Ht@k[E]?G@?GK{?FOPm?C?SBN?K|HO
SdZggNmBp?bvP?GC?FOF~vOGyHFuUWLc?nNFP?W??GnE@OS?aSOGaSOI_vwG?fO}A~|uMk[E
~_FjDgL}@_@tED^gK^\XaSWEA{@t?}dt~wLK?_Rj?}dk~wlE@gdCAgdCAGd{@gL}A?Dt@GLK
?__roD|]V[LTa}q@zG_?Td]J^_QJ\_WzNfoF[_iw@_@OyBFsy]C?asWGOBsA?FKDK{BhsoAJ
v|Fb|w\}@o?G\@Ew?_@OK{?rsd@QT}`a|GNCAGn^s]Nv`vwF?C@tBn|uADXVyI_?_{OEyXo?
a|~PwwEf^_^~~Wdu}glEAGdE~mlL~sz}atzy~sZya_]GPns{AfSCp_OLPghE~W_CPguE]N}J
tanO_^i??FofI~@USD^gUoABp?YJsBnE\@IB}n|t@Zb~~}k|asWGIsZ}yrELlfb~_vz}?FUh
bWXw~qnoa{WJoFW`TguE]N|OT}__?GNC@gnOM{XsBgNy~vRDasWG?{GjpmkBasWGVtyJxTvB
TWnkatwCs]Nv`vwF?O@s@j_D?DBjFzP?atwCaswGatWErQDqBtAJV_RPwwEN^_[?CDbj@DBg
B~L\o}e|~dXVnoO?nfoAypBvP?GB?FODTmbF}DdN_{WOA~|tzD|]oo??????????Oe|qZEDm
XA@BIqk_JQ@BZv@x[edfYFO_KRcxKQ@AZvHkWUxcGCdm\Eom?CxtZEo_[E|hZfPd[a@`[vLh
XuxlXUxsBOhCYVXhXES_XVHqZvGLAcDaZe|qZUDkGF@qZu\qWUs_\ETqZUdmWVPhZuwLA_??
????????????????????????????????????????????????Z_`mA????????????????Epm
ZvOmXV`dGA@uKQwoGA@CRtKpLao_PfHdXV\`[eSkGB?qJc|j\AwpMRcwA_??g??AGA?_GA?_
GA?_GA?_GA?_G?????????????????????@kZe|sGA@ZJVDu]Ut\GA@cWVPdYRC_XEDsXUcq
GDlyYUTkXEDsXUd\A_?LA_@r\EPn\VO?ZExn\Bg_PeTgZETqYEDe\ES_OVHf\UtdZfPkYVLs
XQwI?EpmZvOyGCP`\EThdEXeZeTmGEXdYEpfXVLbYEp`XuTmMa??ZExn\Bg_PeTgZETqGEHd
YUs_PEDsXUdkXVLdZbg_?EpmZvOyGCXdYEpd[a@aXUc_OVTrXuDaXRg_?EpmZvOyGDhdYUpd
IEwhGFhtGEp`Ze[_YUw_PEDsXUcyG?@kZe|sMa@TZfXnZEpr\GPmXEdfXQ@@WfLbYEptwVhd
YUpdMa??Ho?fA_????@kAUoHZ?c?ON~~????CoGA@?SEA?_GD@SDCowU@PCAFackIA_gIA_h
JA_gI?SDIP[VB_wMB_wMB_wMB_wMB_{kGoGkBqggIA_REpoA?_SN?`[gI`KiB_wMB_wMBaKM
FA_VGqSRI?????????????????????????????????????cA?????????????FoA???I?_C?
??????????AK?_???_GA????????????f?G??CKA?o???????????IoA??@A?_O?????????
??A{?_??????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
?????????????????????D???U?AW?H_@I?Ag???????????????????????????????????
????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
???????????????????????Ahog????OSow=
      ))}
      return 0
   ;;
   *)  print -r "Funktion(): '$1' ist ungültig!"; exit 1 ;;
   esac
   return 0
)}



Main()  {
   [ "$1" != help -a "$1" != getname ] && {
      let "!Init" && Funktion homedir $1 || return
      [ -d $isDir -a ! -s $isDir\lnot.exe ] &&
         echo "Erzeuge $isDir\lnot.exe ..." &&
         Funktion mklnot || return
      #Funktion rddat || return
   }
   case "$1" in
   vor)
      let "Enum<Max" && {
         echo "Sie müssen auf Zustand '$Max' gehen"
         echo "oder auf '$Enum' herablöschen, bevor eine neue"
         echo "Registrierung erfolgen kann."
         return
      }
      expr "$Flags" :: 'n' || {
         echo "Sie müssen 'Nach Installation' durchführen"
         echo "oder den unvollständigen Schritt '$Enum' löschen,"
         echo "bevor eine neue Registrierung erfolgen kann."
         return
      }
      let "Enum>=999" && { err "Limit '999' erreicht!"; return; }
      while :
      do
         echo "%nGeben Sie einen Titel für diese Installation ein:"
         echo "%t%t%t:  %c"
         readl Line
         ifset Line || return 0
         let "${#Line}<=48" &&
            expr "$Line" :: '[a-zA-Z]%{3,%}' && break
         echo "Zu lang oder anders fehlerhaft!"
      done
      Titel="$Line"
      let ++Enum
      vor00 Enum
         echo "Erzeugung Scan-Liste ..."
      Funktion mkscanlst $Enum || return
         echo "Erzeugung Save-Liste ..."
      Funktion mksavelst $Enum || return
         echo "Prüfung freier Platz für Save-Dateien ..."
      Funktion space $isDir\savelist.$Enum || return
         echo "Erzeugung Datei-Liste ..."
      Funktion mklist $Enum $isDir\liste.$Enum || return
         echo "Kopieren der Save-Dateien ..."
      Funktion dosave $Enum || return
         echo "Schreiben der Daten-Datei ..."
      Funktion wrdat $Enum v "$Titel" || return
      Funktion rddat || return
      return 0
   ;;
   nach)
      let "Enum<Max" && {
         echo "Sie müssen auf Zustand '$Max' gehen"
         echo "oder auf '$Enum' herablöschen, bevor eine neue"
         echo "Registrierung erfolgen kann."
         return
      }
      expr "$Flags" :: 'n' && {
         echo "'Nach Installation' wurde bereits durchgeführt."
         return
      }
      local lnot=0
      Funktion tmpfiles $TmpDir tmplst
         echo "Erzeugung Datei-Liste ..."
      Funktion mklist $Enum $tmplst || return
         echo "Erzeugung Differenzen-Datei ..."
      Funktion rdpar $isDir\istep.ini linecomparator |
         grep -iq 'lnot' && lnot=1
      [ -s $isDir\lnot.exe ] || lnot=0
      let lnot || Funktion mkdiff $Enum $tmplst || return
      let lnot && Funktion mkdiffE $Enum $tmplst || return
      [ -f $tmplst ] && DEL $tmplst
      unset tmplst
         echo "Maßnahmen aufgrund von Differenzen ..."
      Funktion dodiffs $Enum || return
         echo "Schreiben der Daten-Datei ..."
      Funktion wrdat $Enum n "" || return
      Funktion rddat || return
      return 0
   ;;
   zdown)
      let "Enum<=0" && { echo "Zustand 0 !"; return; }
      expr "$Flags" :: 'n' || {
         echo "Vorgang 'Nach Installation' fehlt."
         return
      }
      local enu=000 n=000
      while :
      do
         echo "%nWählen Sie einen Zustand kleiner als '$Enum':"
         echo "%t%t%t:  %c"
         read Line
         ifset Line || return 0
         expr "$Line" :: '[^0-9]' ||
            let "Line<Enum&&Line>=0" && break
         echo "Nummer '$Line' ist fehlerhaft!"
      done
      enu=$Line
      local r=0
      while let "Enum>enu&&!r"
      do
         Funktion laden $Enum ; r=$?
         echo "Schreiben der Daten-Datei ..."
         let --Enum
         Funktion wrdat $Enum A "" || return
         Funktion rddat || return
      done
      return 0
   ;;
   zup)
      let "Enum>=Max" && { echo "Höchste Stufe liegt vor!"; return; }
      expr "$Flags" :: 'n' || {
         echo "Vorgang 'Nach Installation' fehlt."
         return
      }
      local enu=000 r=0
      while :
      do
         echo "%nWählen Sie einen Zustand größer als '$Enum':"
         echo "%t%t%t:  %c"
         read Line
         ifset Line || return 0
         expr "$Line" :: '[^0-9]' ||
            let "Line>Enum&&Line<=Max" && break
         echo "Nummer '$Line' ist fehlerhaft!"
      done
      enu=$Line
      while let "Enum<enu&&!r"
      do
         let ++Enum
         vor00 Enum
         Funktion install $Enum ; r=$?
         echo "Schreiben der Daten-Datei ..."
         Funktion wrdat $Enum A "" || return
         Funktion rddat || return
      done
      return 0
   ;;
   zdowndel)
      let "Enum<=0" && { echo "Zustand 0 !"; return; }
      expr "$Flags" :: 'n' || {
         echo "Vorgang 'Nach Installation' fehlt."
         return
      }
      local enu=000
      while :
      do
         echo "%nWählen Sie einen Zustand kleiner/gleich '$Enum':"
         echo "%t%t%t:  %c"
         read Line
         ifset Line || return 0
         expr "$Line" :: '[^0-9]' ||
            let "Line<=Enum&&Line>=0&&Line<Max" && break
         echo "Nummer '$Line' ist fehlerhaft,"
         echo "oder kein höherer Zustand vorhanden!"
      done
      enu=$Line
      local r=0
      Enum=$Max
      vor00 Enum
      while let "Enum>enu&&!r"
      do
         Funktion delete $Enum ; r=$?
         echo "Schreiben der Daten-Datei ..."
         let --Enum
         Funktion wrdat $Enum D "" || return
         Funktion rddat || return
      done
      return 0
   ;;
   lesen)
      local z=000000 n=00 inp=_____ path
      while :
      do
         Main getname Line || break
         path=$Line
         while :
         do
            n=0 z=0
            < $path
            while readl Line
            do
               print -r "³ $Line"
               let '++z, ++n>=20' && n=0 && read "inp?$z: " t<CON &&
                  ifset inp && { >< ; continue 3; }
            done
            ><
            read "inp?$z(EOF): " && ifset inp && continue 2
         done
      done
      return 0
   ;;
   edit)
      local edit=`Funktion rdpar $isDir\istep.ini editcommand`
      let "${#edit}>72" &| expr "$edit" :: '[^a-zA-Z0-9_ /:.+-]' &&
         err "Editor '$edit' ist suspekt." && return 1
      local ecmd=`expr "$edit" : '^%([^/ ]*%)'`
      whence -ep "$ecmd" &| [ $? -ne 10 ] &&
         err "Editor '$ecmd' nicht gefunden." && return 1
      while :
      do
         Main getname Line || break
         $edit $Line
      done
      return 0
   ;;
   getname)
      local n=00 nsoll=00 file path
      Line="istep.ini istep.dat istep.log istep.gol
            scanlist.$Enum savelist.$Enum liste.$Enum
            diffs.$Enum alias.$Enum savemiss.$Enum"
      while :
      do
         n=0
         for file in  $Line
         do
            path=$isDir\$file
            [ -s $path ] || continue
            prints s23s4s $((++n)) "" $file
         done
         read "nsoll?<Enter> oder Nummer:  "
         ifset nsoll || return
         expr "$nsoll" :: '[^0-9]' && continue
         n=0
         for file in  $Line
         do
            path=$isDir\$file
            [ -s $path ] || continue
            let '++n==nsoll' && $2=$path && return 0
         done
      done
      return 0
   ;;
   help)
      local n=00 inp
      while :
      do
         n=0
         echo %
"³ Dieses bish-Script ist ein Multistufen De-/Re-Installierer,%r
³ mit dem Sie maximal 999 Installations-Stufen registrieren können.%r
³ Nach Registrierungen kann jede beliebige Stufe in der Kette%r
³ wieder hergestellt werden - und zwar absolut vollständig.%r
³ %r
³ Zur Registrierung einer Stufe müssen die Menü-Punkte%r
³ VOR und NACH der Installation ausgewählt werden.%r
³ Dadurch werden Datei-Listen mit Pfad, Zeitstempel und Größe%r
³ erzeugt, die bei NACH verglichen werden, um eine Differenz%r
³ herausarbeiten zu können.%r
³ Es werden alle Unterschiede auf allen Laufwerken (Dateisystemen)%r
³ jeweils zwischen zwei Zeitpunkten festgestellt.%r
³ Es spielt keine Rolle, was man zwischen VOR und NACH an den%r
³ Dateisystemen verändert. Es werden einfach alle Unterschiede%r
³ festgestellt."
         read "inp?$((++n)): "
         ifset inp && return
         echo %
"³ Zu Anfang werden ein Verzeichnis '\istep.dir' und eine%r
³ ini-Datei 'istep.ini' hergestellt.%r
³ In der .ini kann genau festgelegt werden, welche Laufwerke%r
³ und/oder Verzeichnisse gelistet werden sollen%r
³ und welche Dateien und/oder Verzeichnis-Inhalte beim Schritt%r
³ VOR (zunächst) gerettet werden sollen.%r
³ %r
³ Die ini-Datei enthält zu Anfang die Laufwerke c: bis z: .%r
³ Sicherlich muß man das reduzieren.%r
³ Und zwar sollte man alle existierenden Laufwerke, die nicht%r
³ durchsucht werden sollen, herausnehmen.%r
³ RamDisk-L: und CD-ROM-L: sollte man unbedingt entfernen."
         read "inp?$((++n)): "
         ifset inp && return
         echo %
"³ In der log-Datei 'istep.log' werden Arbeitsinformationen%r
³ einer Sitzung gespeichert.%r
³ Dieser Datei-Inhalt wird bei jedem Sitzungsbeginn an den Inhalt%r
³ der 'istep.gol' angehängt.%r
³ Die 'istep.dat' enthält Infos über die Registrierungsstufen.%r
³ %r
³ Zu Anfang wird auch eine 'lnot.exe' erzeugt, die in kodierter%r
³ Form als ASCII-Text innerhalb(!) dieses Scripts vorhanden ist.%r
³ Diese .exe ist ein hochspezialisierter Zeilenvergleicher, der%r
³ zur Geschwindigkeitssteigerung verwendet wird.%r
³ Wenn man dies in der .ini auskommentiert, wird eine langsamere%r
³ Shell-Funktion benutzt.%r
³ Man bedenke, daß bei 10000 Dateieinträgen im schlechtesten%r
³ Fall 10 Milliarden Zeilenvergleiche pro Arbeitsschritt bei%r
³ der Differenzenfeststellung vorgenommen werden müssen!%r
³ Ohne Spezial-exe kann das eine halbe Stunde und länger dauern."
         read "inp?$((++n)): "
         ifset inp && return
         echo %
"³ Der Menü-Punkt VOR erzeugt 'liste.001', 'alias.001',%r
³ 'scanlist.001', 'savelist.001' und 'save_dir.001/'.%r
³ Die Gruppennummer kann bis .999 gehen.%r
³ Der Menü-Punkt NACH erzeugt 'diffs.001' und 'savemiss.001'.%r
³ Die 'alias.001' wird hier gegebenenfalls reduziert%r
³ und unnötig gerettete Dateien werden gelöscht, was ja wieder%r
³ Festplattenplatz freigibt.%r
³ Die 'savemiss' enthält Einträge von Dateien, die nicht(!)%r
³ gerettet wurden, entsprechend der 'savelist', jedoch von%r
³ einer Installation verändert oder gelöscht wurden!%r
³ Hierzu muß man also gut vorausgeschätzte Angaben in der%r
³ ini-Datei machen!%r
³ Die 'diffs' listet Dateieinträge in drei Gruppen:%r
³ [Neu], [Geändert] und [Gelöscht]."
         read "inp?$((++n)): "
         ifset inp && return
         echo %
"³ Mit 'Zustand Rückwärts', '-Vorwärts' und 'Rückwärts Löschen'%r
³ verändert man den Installationsstand.%r
³ %r
³ Rückwärts ist eine De-Installation, wobei die Dateien vom%r
³ normalen Standort im Dateisystem hinein in das Verzeichnis%r
³ 'save_dir.nnn' bewegt werden (MOVE).%r
³ Die Installation wird also in einem Ladezustand behalten.%r
³ Für gerettete Dateien ist der Weg anders herum.%r
³ %r
³ Vorwärts ist eine Re-Installation, bei der der Vorgang%r
³ wiederum anders herum passiert.%r
³ %r
³ Dieses Installationswerkzeug braucht nur wenig Platz auf%r
³ der Festplatte - etwa 2 bis 20 MByte pro Stufe,%r
³ wobei 5 MByte als normal gelten können.%r
³ Ein Spitzenbedarf entsteht bei VOR, weil dann erst einmal%r
³ relativ viele Dateien gerettet werden, die erst bei NACH%r
³ gegebenenfalls wieder entfernt werden können."
         read "inp?$((++n)): "
         ifset inp && return
         echo %
"³ Dieses Script wurde aus einem größeren Script, das nur mit der%r
³ Unix-Vollversion der 'bish' läuft, abspeckend herausgezogen.%r
³ Die Ressourcen der Shareware sind erheblich schmaler, so daß%r
³ die Programmierung ganz anders und 'unschön' vorgenommen%r
³ werden mußte.%r
³ Auch fehlen einige Ausstattungsmerkmale des Originals.%r
³ %r
³ Dennoch zählt dieses Script zu 'den besseren', weil es recht%r
³ viele Sicherheitsmerkmale und Automatismen enthält.%r
³ %r
³ Man kann mit der 'bish' auch richtige farbige Vollbild-Menüs%r
³ mit Fenster-Technik programmieren.%r
³ Aber das ist erstens nicht nötig, und zweitens ist es doch%r
³ tatsächlich schon vorgekommen, daß jemand seinen ANSI.SYS%r
³ nicht geladen hatte ..."
         read "inp?$((++n)): "
         ifset inp && return
         echo %
"³ Die Menü-Punkte VOR und NACH Installation können völlig%r
³ bedenkenlos ausgeführt werden, weil dabei nur das%r
³ istep-Verzeichnis mit Daten gefüllt wird.%r
³ Soll heißen, daß man damit herumprobieren kann, um dann%r
³ beispielsweise die erzeugten Info-Dateien anzuschauen.%r
³ Aufgrund der Infos kann man auch manuelle Manipulationen%r
³ vornehmen. Auch können danach Stufen manuell wieder%r
³ gelöscht werden.%r
³ Es können insbesondere Dateien gemäß 'savemiss' manuell%r
³ nachträglich gerettet werden, falls man die Arbeitsweise%r
³ verstanden hat und Einträge in der 'alias' vornehmen kann.%r
³ Besser ist es allerdings meistens, mißglückte Schritte oder%r
³ Halbschritte zu löschen und dann nur die 'istep.dat'%r
³ manuell anzupassen. Oder 'Löschen Rückwärts' verwenden.%r
³ Der Schreibschutz einiger Dateien wird gesetzt!%r
³ Die 'liste'-Dateien sind nach NACH entbehrlich!"
         read "inp?$((++n)): "
         ifset inp && return
         echo %
"³ Einrichten einer RamDisk für mehr Arbeitstempo:%r
³ CONFIG.SYS:%r
³ %tdevicehigh=c:\dos\ramdrive.sys 2048 512 128 /e%r
³ AUTOEXEC.BAT:%r
³ %tset TEMP=f:%r
³ falls f: das ramdisk-Laufwerk ist."
         read "inp?$((++n))(EOF): "
         ifset inp && return
      done
      return 0
   ;;
   *)  print -r "Main(): '$1' ist ungültig!"; exit 1 ;;
   esac
   return 0
}



Titel=' '
[ -s $isDir\istep.dat ] && Funktion rddat
Funktion free


echo "%r
________________________________________________________%r
|               bish-Script 'istep.bish'                 |%r
|        Copyright (c) 1998, Helmut Schellong          |%r
|                                                      |%r
|           Multistufen De-/Re-Installierer            |%r
--------------------------------------------------------"


while echo %
"%r
 frei=${Space}MB ù akt,max,flg=$Enum,$Max,$Flags ù '$Titel'%r
___________________________________________________%r
|                      Hilfe :  h                 |%r
|          Vor  Installation :  v                 |%r
|          Nach Installation :  n                 |%r
|          Zustand Rückwärts :  R                 |%r
|          Zustand  Vorwärts :  V                 |%r
|          Löschen Rückwärts :  LR                |%r
|          Dateien     lesen :  l                 |%r
|          Dateien editieren :  ed                |%r
|                    Beenden :  E                 |%r
---------------------------------------------------%r
                             :  __%b%b%c"
do
   read Line
   case "$Line" in
      v)  Main vor ;;
      n)  Main nach ;;
      R)  Main zdown ;;
      V)  Main zup ;;
     LR)  Main zdowndel ;;
      l)  Main lesen; continue ;;
     ed)  Main edit; continue ;;
    H|h)  Main help; continue ;;
      E)  break ;;
      *)  ifset Line && echo %a%c
          continue ;;
   esac
   Funktion free
done



#istep.dir/
#          istep.ini
#          istep.log
#          istep.gol
#          istep.dat    num Avn Titel
#          lnot.exe
#          scanlist.100
#          savelist.100
#             alias.100 alias,path
#             liste.100 Liste:(crc,mode,)size,time,path
#             diffs.100 neu,anders,weg
#          savemiss.100
#          save_dir.100/[SNC].{aaa-zzz}

#whence -ep mem || [ $? -eq 10 ] &&
#   mem /d | grep -iq '[^a-zA-Z]ansi[^a-zA-Z]*' &&
#   whence -ep mode || [ $? -eq 10 ] &&
#   mode con | grep -q '[^0-9]25[^0-9]' &&
#   mode con | grep -q '[^0-9]80[^0-9]' &&
#      R='%e[2C' S='%e[0;30;46m%e[2;3H'
#
#ifset R || {
#   VER | grep -iq caldera &&
#   grep -iq '^device.*=.*ansi%.' c:\config.sys &&
#   R='%e[2C' S='%e[0;30;46m%e[2;3H' &&
#   { echo Caldera-DOS + ANSI; sleep 1; }
#}

#frage()  {
#   local inp
#   [ $# -lt 1 ] && { read "-?istep.bish: <Enter>"; return 0; }
#   while echo "%n$1  [jn]:  %c"
#   do
#     read inp
#     case "$inp" in
#       [jJ])  return 0 ;;
#       [nN])  return 1 ;;
#          *)  continue ;;
#     esac
#   done
#   return 3
#}


###  jet.bish  #############################################

#!/u/bin/bish

#echo $* >/dev/ttyp1
2>/dev/ttyp1

catv '/%e%%-12345X@PJL USTATUSOFF %n@PJL ENTER LANGUAGE = POSTSCRIPT %n' 0 '/%4%e%%-12345X' >$DRUCKER

#exit 0



###  jmptbl.bish  #############################################



[ $# -ne 1 ] && exit
[ -s tbl_$1 ] && : > tbl_$1
echo if=$1 of=tmp_$1 of=tbl_$1
< $1
> tmp_$1
while readl zeile
do
   catv zeile /%j
   expr "$zeile" :: '^[ %t]%{1,%}jmp %*%.L' || continue
   readl zeile || break
   expr "$zeile" :: '^[ %t]%{1,%}%.align' &&
      catv zeile /%j && readl zeile || break
   catv zeile /%j >> tbl_$1
   while readl zeile
   do
      expr "$zeile" :: '%.long %.L' || break
      catv zeile /%j >> tbl_$1
   done
   catv zeile /%j
done
><<

echo if=tmp_$1 of=_$1
< tmp_$1
> _$1
while readl zeile
do
   catv zeile /%j
   expr "$zeile" :: '^[ %t]%.data' || continue
   catv "/%t.align 4%j"
   cat tbl_$1
   while readl zeile
   do  catv zeile /%j ;  done
   break
done
><<

remove tmp_$1 tbl_$1


#	jmp *.L269(,%eax,4)
#.L269:
#	.long .L265
#	.long .L258



###  k4b12.bish  #############################################

#!/u/bin/bish


set -f

SigDoku='doku/signale.htm'
K=4 B=12 nK=000 nB=000 N=000
set Z:.300

[ ! -s "$SigDoku" ] && echo "'$SigDoku' does not exist!%a"


# 'System [1]' | 'Batterie [1]'
Scan()  {
   local z=0
   N=0
   <$SigDoku
   while readl Z
   do
      case "$z" in
        0)  expr "$Z" :: '^<h3.%{20,}>%d%{4}<' && z=1 ;;
        1)  expr "$Z" :: '^<p' && z=2 ;;
        2)  expr "$Z" :: '^</p' && z=0 goend
            expr "$Z" :: "$1" && z=0 let ++N ;;
      esac
   done
   ><
   return 0
}


Scan 'System %[1]'; nK=$N
Scan 'Batterie %[1]'; nB=$N

while echo "
%tKämme+Batterien:  $K  $B
%tEinträge K+B   :  $nK  $nB
%tSignale-Datei  :  S datei  [$SigDoku]
%tKämme     copy :  k
%tBatterien copy :  b
%tBeenden        :  E
%t                  _%b%c"
do
   read cmd rest
   case "$cmd" in
     S)  [ -s "$rest" ] || { echo "%a%c"; goend; }
         SigDoku="$rest";;
     E)  break;;
     *)  echo "%a%c"; continue;;
   esac
done

:




###  kpz_strom.bish  #############################################

#

Strom()  {
   local ip:010 p:010 f:010 ib:010 i10:010
   ib=$1 i10=$2
   if [ ib -lt 0 ]
   then
     p=$etlqual
     if let "-ib>=i10"
     then
        let "ip={1000*[-ib*(130-p)]}/[(p+30)*i10]"
        [ ip -lt 1000 ] && ip=1000
        let "f=(ip+3000+2)/4"
     else  echo $ib $f $ip; return 0
     fi
   else
     p=$ladqual
     if [ ib -ge i10 ]
     then
       let "ip={1000*[ib*(130-p)]}/[(p+30)*i10]"
       [ ip -lt 1000 ] && ip=1000
       [ ip -gt 9000 ] && ip=9000
       let "f=(9000-ip+4)/8"
     else  f=1000
     fi
     let "f=(ladeff*f+50)/100"
   fi
   echo Ieff=$(([f*ib+500]/1000)) $f $ip
   echo Uadd=$((30*24*[5*ib-i10]/[48*i10]))
   return 0
}



set ladeff=000 ladqual=000 etlqual=000
ladeff=75 ladqual=50 etlqual=50

local kapaz:010 strom:010 cmd:.5 val:010
kapaz=100 strom=-100


while echo "
%tLadeeffizienz   [%%] : eff $ladeff
%tLadequalität    [%%] : laq $ladqual
%tEntladequalität [%%] : elq $etlqual
%tKapazität      [Ah] : k $kapaz
%tStrom          [dA] : i $strom
%tBerechnen           : b
%tBeenden             : E
%t                      _%b%c"
do
   read cmd val
   case "$cmd" in
     eff)  ladeff=$val;;
     laq)  ladqual=$val;;
     elq)  etlqual=$val;;
     k)  kapaz=$val;;
     i)  strom=$val;;
     b)  Strom $strom $kapaz;;
     E)  break;;
     *)  echo "%a%c"; continue;;
   esac
done





###  kty.bish  #############################################

#!/u/bin/bish


Rp=$1
Rv=2700
[ $# -gt 1 ] && Rv=$2

Calc()  {
   R2=$( ti "1/[1/$Rp+1/(2000*pow(1.0079,$T-25))]" )
   U=$( ti "(5*$R2)/($Rv+$R2)" )
}

T=25; Calc; U1=$U; echo " " $U
T=50; Calc; U2=$U; echo " " $U
T=75; Calc; U3=$U; echo " " $U
echo %t $( ti "$U2-$U1" )
echo %t $( ti "$U3-$U2" )
echo %t $( ti "($U3-$U2)/($U2-$U1)" )





###  lba.bish  #############################################

#!/u/bin/bish

[[ $# -gt 0 -a "$1" != [0-9]* ]] && {
   echo "[#h(255)]  [sS nS]..."; return; }

set -f
nh=255
let "$#&1" && { nh=$1; shift; }
read "file?datei_s0: "
[ -s "$file" ] || return
[ $# -gt 0 ] && SS=$*
< $file
[ $# -eq 0 ] && SS=`catv $((446+0+8)),4,0 $((446+0+12)),4,0 %
                    $((446+16+8)),4,0 $((446+16+12)),4,0 %
                    $((446+32+8)),4,0 $((446+32+12)),4,0 %
                    $((446+48+8)),4,0 $((446+48+12)),4,0 %
                    | base -l +10`
><

o=0
3<> $file
while let "o<=48"
do
   catv $((446+o+1)),3,3 | base -b +10 | read sh ss sc
   catv $((446+o+5)),3,3 | base -b +10 | read eh es ec
   let "sc|=(ss&16#c0)<<2, ss&=63"
   let "ec|=(es&16#c0)<<2, es&=63"
   echo c=$sc-$ec h=$sh-$eh s=$ss-$es
   let "o+=16"
done
><

3<> $file
o=0
for 2 sS nS  in  $SS
do
   let "eS=sS+nS-1"
   let "ss=sS%63,v=(sS-ss)/63,++ss,sh=v%nh,v=(v-sh)/nh,sc=v%1024"
   let "v>1023" && sc=1023
   let "es=eS%63,v=(eS-es)/63,++es,eh=v%nh,v=(v-eh)/nh,ec=v%1024"
   let "v>1023" && ec=1023
   echo c=$sc-$ec h=$sh-$eh s=$ss-$es sS=$sS nS=$nS eS=$eS
   let "o+=16"
done
><


read "inp?'$nh' schreiben?[j]: "
[ "$inp" != j ] && return
3<> $file
o=0
for 2 sS nS  in  $SS
do
   let "eS=sS+nS-1"
   let "ss=sS%63,v=(sS-ss)/63,++ss,sh=v%nh,v=(v-sh)/nh,sc=v%1024"
   let "v>1023" && sc=1023
   let "es=eS%63,v=(eS-es)/63,++es,eh=v%nh,v=(v-eh)/nh,ec=v%1024"
   let "v>1023" && ec=1023
   echo c=$sc-$ec h=$sh-$eh s=$ss-$es sS=$sS nS=$nS eS=$eS
   echo $sh $((ss|((sc&16#300)>>2))) $((sc&16#ff)) |
        base -10 +b | catv =$((446+o+1)),3,3
   echo $eh $((es|((ec&16#300)>>2))) $((ec&16#ff)) |
        base -10 +b | catv =$((446+o+5)),3,3
   let "o+=16"
done
><





###  lib.bish  #############################################


< val
: > valcl
cl=000000000000 cl0=000000000000
while read pos
do
   let "cl=pos/(64*512)+2,  cl==cl0" && continue
   cl0=$cl
   echo $cl >> valcl
done
><


: > valnot
< path1.lst
while read at cl sz td n
do
   #expr "$n" :: '.L[B#][R0-9][+-]%{0,1%}$' && {
      let "at=(sz+(64*512)-1)/(64*512)"
      while let at
      do  echo $cl >> valnot; let "--at,++cl";  done
   #}
done
><


rm -r /scratch/VALUE
sync
mkdirs /scratch/VALUE
3< /dev/rhd0d
< valcl
while read cl
do
   grep -q $cl valnot && continue
   let "pos={533+[cl-2]*64}*512"
   catv $pos,$((64*512)),3 > /scratch/VALUE/$cl
done
><<





###  link.bish  #############################################


cat | {
   while readl Z
   do
      expr "$Z" :: ' "\[0-9]%{3}[a-z?A-Z]' || { catv Z /%r%n; continue; }
      expr "$Z" :n '/*%(..%)*/'
      expr "$Z" :c '"\...%(.%)'
      expr "$cc" :: "$c" || cc="$cc$c" fst="$fst $c=$n"
      nn=0
      seek + 0 pos
      while readl Z2
      do
         expr "$Z2" :n2 '/*%(..%)*/' || continue
         expr "$n2" :: '^0.' && conv -D0 n2
         expr "$Z2" :c2 '"\...%(.%)' || continue
         [ $c2 == $c ] && nn=$n2 break
      done
      [ ${#nn} -eq 1 ] && nn=" $nn"
      expr "$Z" :Z ', ..,' = ", $nn,"
      catv Z /%r%n
      seek $pos 0
   done
}
catv './* ' fst '.*/' /%r%n



###  lng.bish  #############################################

#!/u/bin/bish

cyr=160
size=0
for id from 1000 to 8000 repeat
do
   grep -qm '_id  '"$id"'$' ./base/txtbase.h || continue
   let "cyr>252" && cyr=160
   base -10 cyr +b c1; let ++cyr
   base -10 cyr +b c2; let ++cyr
   base -10 cyr +b c3; let ++cyr
   base -10 cyr +b c4; let ++cyr
   echo "$id	abc${c1}${c2}${c3}${c4}defABCDE%r"
   let size+=22 "size>=99*1024" && break
done




###  logf.bish  #############################################

#!/u/bin/bish


[ -t 0 ] && { echo 'logf.bish < ifile [ > ofile ]'; exit; }
set Z:.200 hex:.150 dez:.150 str:.200 ms:020
char=000 c=.

while readl Z
do
   expr "$Z" :hex '^RD=%([ 0-9A-Fa-f]%{3,}%)::%d%{1,10} ms.%{0,2}$' || {
      catv Z /%r%n
      continue
   }
   expr "$Z" :ms '^RD=[ 0-9A-Fa-f]%{3,}::%(%d%{1,10}%) ms.%{0,2}$'
   base -16 hex +10 dez
   str=RD=
   for char in $dez
   do
      [ char -lt 32 -o char -gt 127 ] && {
         [ char -eq  0 ] && { str="$str\0"; continue; }
         [ char -eq 10 ] && { str="$str\n"; continue; }
         [ char -eq 13 ] && { str="$str\r"; continue; }
         [ char -eq 46 ] && { str="$str\."; continue; }
         [ char -eq 92 ] && { str="$str\\"; continue; }
	 str="$str."; continue
      }
      base -10 char +b c; str="$str$c"
   done
   str="$str::$ms ms" catv str /%r%n
done




###  logobrief.bish  #############################################

#!/u/bin/bish



Drucken()  {
   /u/bish/cmd/scs.bish $scs
   [ -s "$txt" ] && echo '%e&k2G%e(0N%e&a7L%c'
   [ -s "$txt" ] && cat "$txt"
   echo '%eE%c'
   return 0
}



while echo "
%tText-Datei: t datei ($txt)
%tBank-Text : b ($scs)
%tDrucken   : d
%tBeenden   : E
%t          : _%b%c"
do
   read inp arg
   case "$inp" in
     t) [ -r "$arg" ] || continue
        txt="$arg"
     ;;
     b) if expr "$scs" :: '-nobank'
        then  scs=
        else  scs=-nobank
        fi
     ;;
     d) Drucken >> $DRUCKER ;;
     E) break;;
     *) echo "%a%c";;
   esac
done



#  /bin/echo "^[%-12345X^[E^[&k2G^[(0N^[&a7L\c" > $TF
#  /bin/echo "^[E\c" >> $TF





###  lookup.bish  #############################################




[ $# -lt 1 ] && echo file-arg! && exit
d13='[0-9]%{1,3%}'
ip4="$d13%%.$d13%%.$d13%%.$d13"
cat $1 | {
   > $1
   while readl Z
   do
      expr "$Z" :ip " %%($ip4%%) " || print -r "$Z" && continue
      { cmpv ip ip0; inv; } &| { ifset host; inv; } && {
         host="$(- nslookup $ip )" || print -r "$Z" && continue
         expr "$host" =:host 'Name: *%([^ %t%r%n]%{1,%}%)' ||
	    print -r "$Z" && continue
      }
      prints vs-50 host "$host"
      expr "$Z" :Z " $ip4 " = " $host "
      print -r "$Z"
      ip0="$ip"
   done
   ><
}





###  luefterregler.bish  #############################################

#!/u/bin/bish


Ua=1.9 Ub=3.25 #Ub=3.75
[ $# -ne 2 ] && { echo "luefterregler.bish Rntc_lowT Rntc_highT"; exit; }
Ra=$1 Rb=$2

echo Gegenkopplungswiderstand R1:
echo "scale=2%n$Rb/((1-$Rb/$Ra)*$Ub/($Ub-$Ua)-1)" | bc -l

echo Spannung an OP+ U3:
echo "scale=2%n$Ub-(($Ub-$Ua)/(1-$Rb/$Ra))" | bc -l





###  mailcode.bish  #############################################

#!/u/bin/bish

#C1=' !"#$%&''()*+,-./0123456789:;<=>?@'
CHARS='#$%&()*+,-./0123456789:;<=>?@'%
'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`'%
'abcdefghijklmnopqrstuvwxyz{|}~'
CHAR=.
set FLAGS:1${#CHARS} OUT:ä64
RANDOM=$(date '+%s')


Get95()  {
   local i=000 f=0
   while [ f -eq 0 ]
   do
      let "i=$RANDOM"'%'"${#CHARS}"
      catv i,1,FLAGS =1,f:
   done
   catv /0 =i,1,FLAGS
   catv i,1,CHARS =1,CHAR:
   return 0
}


local i=000


to 32 repeat
do
   for i from 0 to 63 repeat
   do
      Get95
      catv 1,CHAR =i,1,OUT
   done
   print -r "$OUT"
   conv -t01 FLAGS
done

:

#:a5;,7^s-tpKTB!O+%|AhW1R\z(E&.M[v9#V0g{Jqexy)k"XwGPrj]Qi6_I~N/Y$ used
#65tBm$}i#zXs7G0Z-@%^v9UelD8?)R*&~cM!3;+w,nOgp_A:b{yx\T[K/f.CuHWq used
#+&w`kDVB?e"p[|P4;Q0oCL@d3r=XRhOA!T.1#y\$<,9zZMHgalK(GnE}b:ixF%t~
#=m]%|i,fh`zD/gZrc6>(?S_}3J~-U^w{#2Nlexv9HsjaT'EO1CQp[k*AY)I85.tn
#J(UfIpKmxLb_F1NhY+3'la%RT7@~\V;4Bg9^wG>./tz vM8r=ck{s$Eo?5|DyAOP
#MD$4rOZI"#t938SlvP[1=xuNE5pdL(wfJ@;|*yR.0c2bC<{,sXimQ+TnW-)U\hj?
#>}%4SmfbE l=\9Kykt!6I8.jJZWx;iH[dpc#@YLnD*]-$GO&27?h+N)/R1,U(T_X
#<z/E?b*:W;Qm9B7tDqLSOr,3Yc'yNsGV=^X[kA~$foRdaJe{]n(Zvu>M|"P8._IC
#e='p6F7wy4x<.RBsioqk*Ob]arK2}_Jm+,^T1/XHS$Qv\%E[`Cd:t8@U!{5>YWfN
#X#$@`p3t&_aoe<|>ykdcb]%}+M72"?NCQ!lT={i/;-nU.L:(w5,q8*mV9PgsKE\O
#s{NW9RF_Ootu5K1c~qf]m*jT/8vwb:g3Sl0BYz&"Xkn[+DI#42` ;%hAMZC>Hx!)
#3SM^Gl4-TX*BjcY|KdV?WJ!qr7=@%}8U0'2Zi(6hspE_b\OFa[5{L#+,N>HCu&gP
#q~56i/p`&!xV$,MW=h[S*n<Ty:>J%B0A_UQZ9^Lg{7R(Xb+e?ukc"@osfG|P8.Od
#f6Ko&/s3C7yMHS(Ox jBwRa`Yr%"1:vn\.@I^JgX_5d>pi0W$mh~)'FV{lQEPG<c
#u}l~$!V+bUik2P9{a`-,0xXL(rKWCt#/eg:@<s JBH3Z_o]MTnA[\hf=QD8E7N?d
#xOUt{`z[Hr+hDEg1 (QY%f0ep8ZIo>bdP_m;}<#s*N?Rua6!B'3MlAC9n-yFi"/j
#XArDlk-Ht"\5R_7joxG|!316vV@Wf;hISY&.L0~4BTJ)^#}'Z=n$<+wc9 qQg%yd
#+MWaeh4[<V_$?sj98} k\uD'K36xmPpE7IF&0)b>dntw1U|YJr(,Qf!"L.]-%*GS
#~5_ejp@E?&"[`fI]Fa/yB+X:2q(hJHYw|1m;%^}$U'G WDxu>rt3M)z\7RlnP6CA
#lEhKm[]OLe9u?x}dcYAbW kV|>!\vQj~"noByP$XT<tI*CHNRr/(6fMi0sJ_Zw&@
#gtAmG$~CyTF- )h&Z9i1!8nX4z7MaHp'd\S"VI=>oJrRu#YD^Bs;b[W2j.|]w+}c
#{(@F-T*o4Zf']BWlV/9?K1tERs3_reA">MCwS0$j[^im%XL 5=p`:I8~&OcN+Y}h
#p(a36ZTJmE4c$S5b*~-:[1YPL2lzO<QU_Hsr\kG.?MK+W|"I^8h/0}w;qud]FvDn
#SPukRwDIM@^Acp,LK3&X`nZ=tV8-<qd;si2*_TWCF[{+"B]b}v.:|oG!~?zN l4g
#'!|6~*0se`2ZgA:ljI.KW{v"G\_hp]<$}C%-rX@7FQ LnVc;z^1mNEUJ943,5ykS
#_2zb'+\E)?PU>a=fCGckuS7$N3`*goB@8r:x"~,R/ivL0l#MQ16]&|O!DXT9w %^
#JC:O.*Um@(Hx26~3iA9#8}7q{a=X)0DSh;EbITly+1p5vZtsV,NoeMfWK"]`>\R&
#t6!C'xoO(,GF T%K~>2h+X7aj1UA`I?kd#q\HEDgcvSW[w^N9-P;"J0Y3e)f{.&5
#?iA;Sg5x,C}VEp8D oLmcs]J2'aNX_IUb&q*1+Y=0PGM">($duRly`.)rF6~%-Hj
#|53]sLYx$Xirb74?*ST\_>E=}w1{Km:VN,`gAzZalO!J&PQ^[fop-Bd0CqjhH~WD
#$I{BkEWuj]hi`'J57*?+DYe8"K1ScX,mOyL4_~\R@o|)x QsgHfnNA;>=Zl60V^[
#L%Ita?={Q78gpySC(~[2Oz:DsK,}@cJ-4*/W\fF"$];xHk.iT m6`r0VvEX&1Mq|

#ohne ! "'
#0d_7\skL|mRN/;,E]Y?}(*q+1P5l%g{8DM2H#4fVTaS>cBwz^eptZ&`jG-o)9hAF
#CZP7V6b=iJI1dfx}UQOp`2?t3:v(L@jlk+0M.n#*$cFK)y4%NoY~_[5EX<zrG]|,
#/xr)$WYg=1wzm}8MK*LG97VdI]&%BJ{5#D\6+iRbj-f^E?nlO2|o0p(qSyHeZ_~3
#isCJ2Whf0FM|pk3<vPt>bUXo{nI=SOzK]&@4r~_;ywBZ\8qT,l$m1uE(:Dad5[GY
#AG:Wf.7NS(_5;LdI+}R,#\Z>h~J0/E=Qp`Pku-%2)o8KX{j6|cn1rDa@FHU<tebs
#*TeLyaCv.K2$EplIk87hr\s/MX+?&0|@c5>1qj;t3GgQB_x^u#P4w6J([oN,}~Od
#8ab*Oe?:GXFZtW0^9SBl\d3x$T(hf16|R%sm=,I-ygDiHM.`K)wp/k5c~n+LJ<uP
#NoM4vr{xl:U|7]RQ6u%j;$~s[F5<BZaEYiy*m0D&p@KtOL./T,wScA#8-qfeIJ>G
#uLI6W/#3_~8s:|qz+kTant)=NrvwQe.oS;b*17dJ$0?j4BmME2`l[hFyG]&D5K%g
#:c^ao.$7frU<|?#>`=KCL;igd1S,}]W*t6~h\{9qE3V[yX5wQn@T-mjA_NPzp2/8
#u#B@.G{=J|ezS`$*_L7\y6K/P1XF<UOInsw>g0vpto9ibZq,)C&rl:~fMa[V?c}D
#0s9)CNHWt^f_qO4y,~[*+=>n-6S/ku$<l`Ki?pJbZ{1zDE5:\8FjLm(&%VU2]gI;
#rVt1g`ZGSlT%28HL}3<o?|z][U5O6ENFqpB-{CaYKn~09Jey)Mu&bWxj,i+DQ;=X
#<CJ?O9AskQ$=W|_L0INgwHMhPVc3f2K)%,&}~5/E;qmBuGal(`eoy]:vRFi8*bZ[
#1$zl:m5~OI-/)R@Je^}WB|iPKda&rE`c6TfNL2h#.nq([{4+Xv%=s_Q<CDo*Ab]S
#9[`M|NqAvcy+\Z2}ab]wI%CH5h1&p8:@Fo04$R3QDml#>s)J*grE-t.YuPXG?~=7
#L.\f]#|731y)F96ue}vtN*b5~i?S{+&@rdA(>QJ[lc:KqC4RzU%MpW-sHnX=<_2`
#|P^XWafLyM=B6ikr.pUjSz8nC{:/T9?OY0>mItG2@QH-R)d%uZ(4NeAbsDh[x]35
#i9A?sxDj6bm^;rfh`lpUno*%PG{3H70MNVL,yB[(OgK]qc_|W<Cu\$4SF+ZX)5Et
#[K]ukGi|WE1*m+y?t{57;g($@}zopvq.jH84hU6bMT,/QwN<3PFVZd0~-=#XO2>)
#Dx*Wg`e&fH<r2qNJwz]Sv:lZaFhR?(m)M35UA-|;kY.Vy#uG[K6L@I8ncO~P^+}1
#Rs^9iUax3A[Tfn#E]rgCzNbYJ;4I/cXL0Wd5w~vVl<_F6}oZh,QSM&%Bt8m27+K:
#~QVPTa=w(l7y|D[^>xc+3r]f:m`$U1nAo&{4.2i,O@W%jbZG)C-6*kNKMI_?0evu
#*)s|,P`joZ$t5YVHL%I#efylX9Wb1SA}Qz.c_&p7uMKB0+3Jxmd{O>;6(q/-F^]G
#HkBT*6)V@,R{XnU8j7h|?YF5mb`[GwLNJ&]%3As-zo\:~v(1Dy/d_0g$MQOlfc<Z
#UG/T)bFgk?7u9syJ}]<:`-ZXx@oe3^nB51,jKVl*{4Q~zL=fq[|h#v&p.Rd%wP;O
#v$YVRiBd+p;\N(LmXMxn)s>z*Pltb8uED[U3:H_}I5r6cZ-Fkah|f^={/O,2G<w0
#[:7Ar9/|oFxL=\InQj1{%ZPl3N0>qgdMRW2ua6@_X`}Sm4.^ik+KTCfOVY<)(&*]
#Bf#g[obI{.6nwc<yH:Z5&D]C%k;TReQJs=2^z4ih+-E|aVmOKN\9~AWUuYF1}?p,
#?FmnJ}y\w]|26X@uaP0iI,H=(RjtsQA+%)h7v4._eNYWDS1p*cK5C{^`g3zq<ZO~
#aU=jq-n#g<QfRo0kFm_{iu^x@)PY(H\9DSI?+O/KhbG1tr`}%y5E]4$vMZ|lJWL>
#vPAIFQhtZ-+K_w1EoG&4:]\X;SUD.b~87YHq|xp#a,${)eB0=<WulC>N[5/OsV2`




###  mailcode2.bish  #############################################


#:a5;,7^s-tpKTB!O+%|AhW1R\z(E&.M[v9#V0g{Jqexy)k"XwGPrj]Qi6_I~N/Y$
#65tBm$}i#zXs7G0Z-@%^v9UelD8?)R*&~cM!3;+w,nOgp_A:b{yx\T[K/f.CuHWq

mailcode -dn -c '65tBm$}i#zXs7G0Z-@%^v9UelD8?)R*&~cM!3;+w,nOgp_A:b{yx\T[K/f.CuHWq' mailcode.q3 mailcode.z2
mailcode -dn -c ':a5;,7^s-tpKTB!O+%|AhW1R\z(E&.M[v9#V0g{Jqexy)k"XwGPrj]Qi6_I~N/Y$' mailcode.z2 mailcode.z1

#z9fwDy\KzUR)v^3MXBmnRMc%-+,_)TR-eB$i83_[Z^\=
#%^gg-7%g\Q9"(1)v(RBj-sWP\1GjKv==
#Die Technik ist uralt.

#Die Technik ist uralt.
#QVyy?DQy3ETH=@Z!=d|G?BLK3@lGp!''
#v9Df*^Hmve3x@9@#Zv58#^T3&m)q-3{s7\5p@K6czy)=
#die technik ist uralt.
#rVyy?BQy3ETH=@Z!=d|G?BLK3@lGp!''
#);Df*^Htve3x@9@#Zv58#^T3&m)q-3{s7\5p@K6czy)=

#mailcode: Falsche/Fehlposit. Zeichen in Code-Datei: '\1ujKv='

#mailcode -en -c ':a5;,7^s-tpKTB!O+%|AhW1R\z(E&.M[v9#V0g{Jqexy)k"XwGPrj]Qi6_I~N/Y$' mailcode.q1 mailcode.z1
##mailcode -en -c '+&w`kDVB?e"p[|P4;Q0oCL@d3r=XRhOA!T.1#y\$<,9zZMHgalK(GnE}b:ixF%t~' mailcode.q1b mailcode.z1
#mailcode -en -c '65tBm$}i#zXs7G0Z-@%^v9UelD8?)R*&~cM!3;+w,nOgp_A:b{yx\T[K/f.CuHWq' mailcode.z1 mailcode.z2





###  mdbtbl.bish  #############################################

set Z:.200

CreateVonBis()  {
   local dez=00000000000 d1=00000 d2=00000 h1=00000 h2=00000 hex=00000000000
   cat $1 > bish.bak
   cat $1 | {
      >$1
      while readl Z
      do
         expr "$Z" :dez 'IED-MdbTbl[^!]%{1,}!--%(%d%{1,5}:%d%{1,5}%)' || { catv Z /%j; continue; }
         expr "$dez" :d1 '^%(%d*%):' || { catv Z /%j; continue; }
         expr "$dez" :d2 ':%(%d*%)$' || { catv Z /%j; continue; }
         h1=$((16#,d1)) h2=$((16#,d2))
         prints vsf03ssf03- hex "$h1" : "$h2"
         conv -u hex
         expr "$Z" :Z '[0-9a-fA-F]%{1,5}:[0-9a-fA-F]%{1,5}:' "$hex:"
         catv Z /%j
      done
      ><
   }
   return 0
}

DecrementVonBis()  {
   local dez=00000000000 d1=00000 d2=00000 h1=00000 h2=00000 hex=00000000000
   cat $1 > bish.bak
   cat $1 | {
      >$1
      while readl Z
      do
         expr "$Z" :hex 'IED-MdbTbl">%(...:...%):' || { catv Z /%j; continue; }
         expr "$hex" :h1 '^%(...%):' || { catv Z /%j; continue; }
         expr "$hex" :h2 ':%(...%)$' || { catv Z /%j; continue; }
	 let "d1=16#$h1-1" "d2=16#$h2-1"
         h1=$((16#,d1)) h2=$((16#,d2))
         prints vsf03ssf03- hex "$h1" : "$h2"
         conv -u hex
         expr "$Z" :Z '[0-9a-fA-F]%{3}:[0-9a-fA-F]%{3}:' "$hex:"
         catv Z /%j
      done
      ><
   }
   return 0
}

IncrementVonBis()  {
   local dez=00000000000 d1=00000 d2=00000 h1=00000 h2=00000 hex=00000000000
   cat $1 > bish.bak
   cat $1 | {
      >$1
      while readl Z
      do
         expr "$Z" :hex 'IED-MdbTbl">%(...:...%):' || { catv Z /%j; continue; }
         expr "$hex" :h1 '^%(...%):' || { catv Z /%j; continue; }
         expr "$hex" :h2 ':%(...%)$' || { catv Z /%j; continue; }
	 let "d1=16#$h1+1" "d2=16#$h2+1"
         h1=$((16#,d1)) h2=$((16#,d2))
         prints vsf03ssf03- hex "$h1" : "$h2"
         conv -u hex
         expr "$Z" :Z '[0-9a-fA-F]%{3}:[0-9a-fA-F]%{3}:' "$hex:"
         catv Z /%j
      done
      ><
   }
   return 0
}

#CreateVonBis "$1"
#DecrementVonBis "$1"
IncrementVonBis "$1"




###  mk1htm.bish  #############################################

#!/u/bin/bish

Head='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
   <TITLE>.../schellong : Beispiele expr+catv</TITLE>
   <META http-equiv="content-type" content="text/html; charset=iso-8859-1">
   <META NAME="GENERATOR" CONTENT="Mozilla/3.04Gold (X11; I; SCO_SV 3.2 i386) [Netscape]">
   <META NAME="Author" CONTENT="Helmut Schellong">
   <META NAME="KeyWords" CONTENT="beispiele">
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#CDAA7D" LINK="#4F94CD" VLINK="#36648B" ALINK="#FFD700">
'

set -f
set Zeile:.2000

List="$1"

catv Head

for File in  $List
do
   [ -s "$File" ] || { print -u2 "fehlt: '$File'"; continue; }
   echo "<table bgcolor=%"#FFFFF0%" width=%"100%%%" cellpadding=%"7%">"
   echo "<tr><td><font color=%"#8B3A3A%"><b><pre>"
   < $File
   while readl Zeile
   do
      expr "$Zeile" :Zeile '&'  += '&amp;'
      expr "$Zeile" :Zeile '<'  += '&lt;'
      expr "$Zeile" :Zeile '>'  += '&gt;'
      expr "$Zeile" :Zeile '««'  += '<'
      expr "$Zeile" :Zeile '»»'  += '>'
      expr "$Zeile" :Zeile '"'  += '&quot;'
      expr "$Zeile" :Zeile '¯'  += '"'
      #expr "$Zeile" :Zeile '|'  += '&brvbar;'
      expr "$Zeile" :Zeile 'ä'  += '&auml;'
      expr "$Zeile" :Zeile 'ö'  += '&ouml;'
      expr "$Zeile" :Zeile 'ü'  += '&uuml;'
      expr "$Zeile" :Zeile 'ß'  += '&szlig;'
      expr "$Zeile" :Zeile 'Ä'  += '&Auml;'
      expr "$Zeile" :Zeile 'Ö'  += '&Ouml;'
      expr "$Zeile" :Zeile 'Ü'  += '&Uuml;'
      expr "$Zeile" :Zeile 'yright *([cC])'  = 'yright &copy;'
      expr "$Zeile" :Zeile '(r)'  += '&reg;'
      expr "$Zeile" :Zeile '©'  += '&copy;'
      expr "$Zeile" :Zeile '®'  += '&reg;'
      expr "$Zeile" :Zeile '[ú·]'  += '&middot;'
      expr "$Zeile" :Zeile 'ù'  += '.'
      expr "$Zeile" :Zeile '«'  += '&laquo;'
      expr "$Zeile" :Zeile '»'  += '&raquo;'
      expr "$Zeile" :Zeile '°'  += '&deg;'
      expr "$Zeile" :Zeile '±'  += '&plusmn;'
      expr "$Zeile" :Zeile '¹'  += '&sup1;'
      expr "$Zeile" :Zeile '²'  += '&sup2;'
      expr "$Zeile" :Zeile '³'  += '&sup3;'
      expr "$Zeile" :Zeile 'µ'  += '&micro;'
      expr "$Zeile" :Zeile '¼'  += '&frac14;'
      expr "$Zeile" :Zeile '½'  += '&frac12;'
      expr "$Zeile" :Zeile '¾'  += '&frac34;'
      expr "$Zeile" :Zeile ''  += '&para;'
      expr "$Zeile" :Zeile '§'  += '&sect;'
      catv Zeile /%n
   done
   ><
   echo '</pre></b></font></td></tr></table><br>'
done

echo '

</BODY>
</HTML>'




###  mkdirp.bish  #############################################

#!/u/bin/bish -p

#/aaa/bbb/ccc
#/aaa/bbb
#/aaa
# filtert die letzten beiden aus


readl Z0 || exit 0
catv Z0 /%n

while readl Z z
do
   Z="$Z/"
   cmpv Z0 Z && continue
   [ $? -eq 4 ] && continue
   Z0="$z"
   catv Z0 /%n
done

:





###  mkelist.bish  #############################################

#!/u/bin/bish

TXT='Wenn Sie Dateien im Web platzieren wollen, sollten Sie zum Testen Ihrer Dateien mehr als einen Web-Browser verwenden. Verwenden Sie die weit verbreiteten Produkte wie Netscape und den Internet Explorer, wenn es irgendwie geht auch in mehreren Versionen, aber auch mal ein älteres Produkt wie etwa Mosaic. Wenn Sie die Möglichkeit haben, auf mehreren Plattformen (MS-Windows, Macintosh, Sun usw.) zu testen, machen Sie unbedingt Gebrauch davon. Und vielleicht schauen Sie sich Ihre Seiten auch mal mit einem Handheld-Computer an oder mit einer Brille, durch die Sie alles undeutlich sehen.'
RA='D_e_(allg|kamm|batt|fuse|recs)_[0-9][0-9][0-9]_(id|de)  ["1-9]'
evnfile=./share/var.c
txtfile=./base/txtbase.h
htmfile=./doku/signale.htm
set N:.200 T:.200 I:.200
set n:010 t:.100 i:010

1>"$htmfile"
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
<title>UPC4 Signale-Beschreibungen</title>
</head>
<body style="font-family:univers,arial,helvetica,lucida,verdana">
<h2>Event-Nummer &nbsp;&raquo;Signaltitel&laquo;&nbsp; (Text-ID) und Signalbeschreibung</h2>
'

3<"$evnfile"
while readl -u3 N
do
   expr "$N" :: ' EventNo%[[^][]%{1,}]=' && break
done

extern grep -E "$RA" "$txtfile" | {
   while readl I && readl T
   do
      readl -u3 N || { print -u2 "readl N failure"; break; }
      expr "$N" :n '^/[ 0-9*]%{10,12}/ %{1,3}%(%d%d%d%d%)' || { print -u2 "'$N'"; break; }
      expr "$I" :i 'id  %([0-9]%{4}%)' || { print -u2 "'$I'"; break; }
      expr "$T" :t '"%([^"]*%)"' || { print -u2 "'$T'"; break; }
      expr "$t" :t '&' += '&amp;'
      expr "$t" :t '<' += '&lt;'
      expr "$t" :t '>' += '&gt;'
      echo '<h3 style="font-family:fixedsys,''lucida console'',terminal;"><span style="color:#FF4D00;">'"$n"'</span>'
      echo '&nbsp; &raquo;'"$t"'&laquo;&nbsp;'" ($i)"'</h3>'
      echo '<blockquote style="font-weight:bold; padding:9px;padding-top:0px;padding-bottom:0px;'
      echo 'border:1px solid #097ca6; width:40em; background-color:#fffff0">'
      echo '<p style="text-align:justify">'"T"'</p>'
      echo '</blockquote>'
   done
   echo '</body>%n</html>'
   readl T && print -u2 "'$T' überzählig"
   N=''
   readl -u3 N || print -u2 "readl N failure (2)"
   expr "$N" :n '^/[ 0-9*]/ %{1,3}%(%d%d%d%d%)' && print -u2 "'$n' unerwartet"
}
><<

:




###  mkhosts.bish  #############################################




ip='%d%{1,3}%.%d%{1,3}%.%d%{1,3}%.%d%{1,3}'

[ -s addresses ] && remove addresses
< "$1"
while readl Z
do
   ifset Z || continue
   expr "$Z" :addr " %($ip%) " || continue
   catv addr /%n >> addresses
done
><

gethosts <addresses >names
[ -e addresses ] && remove addresses

: > "$1a"
3<names
< "$1"
while readl Z
do
   ifset Z || continue
   expr "$Z" :: " $ip " || continue
   readl -u3 name || break
   expr "$Z" :Z " $ip " = " $name "
   catv Z /%n >> "$1a"
done
><<
[ -e names ] && remove names





###  mkhtm.bish  #############################################

#!/u/bin/bish

Head='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
   <TITLE>.../schellong : bish-Manual (bishmnk.htm)</TITLE>
   <META http-equiv="content-type" content="text/html; charset=iso-8859-1">
   <META NAME="GENERATOR" CONTENT="Mozilla/3.04Gold (X11; I; SCO_SV 3.2 i386) [Netscape]">
   <META NAME="Author" CONTENT="Helmut Schellong">
   <META NAME="KeyWords" CONTENT="shell,bish,bish64,bish32,sh,csh,ksh,bash,tcsh,zsh,perl,python,bourne shell,korn shell,c shell,batch,batch shell,script,scripting,programming,programmieren,programmiersprache,programming language,c,schellong,regulaere ausdruecke,regular expressions,regex,regexp,regex engine,engine,substitution,bish XRE,XRE">
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#CDAA7D" LINK="#4F94CD" VLINK="#36648B" ALINK="#FFD700">
<br>
<table width="150" height="35">
<tr>
<td align=center VALIGN=CENTER BGCOLOR="#000000">
<img SRC="../cgi/icnt.cgi?0.0.d7.b000000.fffffff" height=18 width=84 align=CENTER>
<img SRC="../cgi/icnt.cgi?0.15.i8x12.d6.b000000.fffffff" height=12 width=48 align=CENTER>
</td>
</tr>
</table>
'

cd /u/bish/man
Ziel=/u/hp/2/de/htm/bishmnk.htm
set Zeile:.2000

List='bish.mnk cat.mnk crc.mnk cut.mnk
echo.mnk expr.mnk grep.mnk line.mnk
wc.mnk rel.mnk tr.mnk test.mnk
tee.mnk man.mnk xregexp.mnr regexp.mnr ansi.mnr
readc.mnk bgrep.mnk calc.mnk cmp.mnk comx.mnk
dat.mnk dd.mnk hx.mnk ov.mnk
pg.mnk timex.mnk touch.mnk vi.mns bish.mnv'

catv Head > $Ziel

echo '<a name="topp"></a><br><br>' >> $Ziel
echo '<h1>Manuals zur bish</h1>' >> $Ziel
echo '<table bgcolor="#EEEEE0" width="100%" cellpadding="10"><tr><td>' >> $Ziel
for File in  $List
do
   expr "$File" :Name '^%(..*%)%.mn.$' || continue
   expr "$File" :Man '%(.%)$' || continue
   conv -u Man
   echo "<font size=%"+1%"><a href=%"#$Name$Man%">$Name($Man)</a></font><br>" >> $Ziel
done
echo '<br>Copyright © 1995-2015  Helmut Schellong<br>' >> $Ziel
echo '</td></tr></table><br>' >> $Ziel

for File in  $List
do
   [ -s "$File" ] || { print -u2 "fehlt: '$File'"; continue; }
   expr "$File" :Name '^%(..*%)%.mn.$' || continue
   expr "$File" :Man '%(.%)$' || continue
   conv -u Man
   echo "<a name=%"$Name$Man%"></a><br>" >> $Ziel
   echo '<h1><a href="#topp">^</a></h1>' >> $Ziel
   echo "<table bgcolor=%"#FFFFF0%" width=%"100%%%" cellpadding=%"7%">" >> $Ziel
   echo "<tr><td><font color=%"#8B3A3A%"><b><pre>" >> $Ziel
   echo $File ...
   < $File
   while readl Zeile
   do
      expr "$Zeile" :Zeile '&'  += '&amp;'
      expr "$Zeile" :Zeile '<'  += '&lt;'
      expr "$Zeile" :Zeile '>'  += '&gt;'
      expr "$Zeile" :Zeile '««'  += '<'
      expr "$Zeile" :Zeile '»»'  += '>'
      expr "$Zeile" :Zeile '"'  += '&quot;'
      expr "$Zeile" :Zeile '¯'  += '"'
      #expr "$Zeile" :Zeile '|'  += '&brvbar;'
      expr "$Zeile" :Zeile 'ä'  += '&auml;'
      expr "$Zeile" :Zeile 'ö'  += '&ouml;'
      expr "$Zeile" :Zeile 'ü'  += '&uuml;'
      expr "$Zeile" :Zeile 'ß'  += '&szlig;'
      expr "$Zeile" :Zeile 'Ä'  += '&Auml;'
      expr "$Zeile" :Zeile 'Ö'  += '&Ouml;'
      expr "$Zeile" :Zeile 'Ü'  += '&Uuml;'
      expr "$Zeile" :Zeile 'yright *([cC])'  = 'yright &copy;'
      expr "$Zeile" :Zeile '(r)'  += '&reg;'
      expr "$Zeile" :Zeile '©'  += '&copy;'
      expr "$Zeile" :Zeile '®'  += '&reg;'
      expr "$Zeile" :Zeile '[ú·]'  += '&middot;'
      expr "$Zeile" :Zeile 'ù'  += '.'
      expr "$Zeile" :Zeile '«'  += '&laquo;'
      expr "$Zeile" :Zeile '»'  += '&raquo;'
      expr "$Zeile" :Zeile '°'  += '&deg;'
      expr "$Zeile" :Zeile '±'  += '&plusmn;'
      expr "$Zeile" :Zeile '¹'  += '&sup1;'
      expr "$Zeile" :Zeile '²'  += '&sup2;'
      expr "$Zeile" :Zeile '³'  += '&sup3;'
      expr "$Zeile" :Zeile 'µ'  += '&micro;'
      expr "$Zeile" :Zeile '¼'  += '&frac14;'
      expr "$Zeile" :Zeile '½'  += '&frac12;'
      expr "$Zeile" :Zeile '¾'  += '&frac34;'
      expr "$Zeile" :Zeile ''  += '&para;'
      expr "$Zeile" :Zeile '§'  += '&sect;'
      catv Zeile /%n >> $Ziel
   done
   ><
   echo '</pre></b></font></td></tr></table><br>' >> $Ziel
done

echo '

</BODY>
</HTML>' >> $Ziel

#<P><IMG SRC="http://www.b-online.de/cgi/Count.cgi?sh=0|df=27273.dat" HEIGHT=1 WIDTH=1></P>
      #expr "$Zeile" :Zeile 'ä' += '~D'
      #expr "$Zeile" :Zeile 'ß' += 'á'
      #expr "$Zeile" :Zeile 'ü' += '~A'
      #expr "$Zeile" :Zeile 'ö' += '~T'
      #expr "$Zeile" :Zeile 'Ä' += '~N'
      #expr "$Zeile" :Zeile 'Ü' += '~Z'
      #expr "$Zeile" :Zeile 'Ö' += '~Y'
      #expr "$Zeile" :Zeile '~D'  += 'ä'
      #expr "$Zeile" :Zeile 'á'  += 'ß'
      #expr "$Zeile" :Zeile '~A'  += 'ü'
      #expr "$Zeile" :Zeile '~T'  += 'ö'
      #expr "$Zeile" :Zeile '~N'  += 'Ä'
      #expr "$Zeile" :Zeile '~Z'  += 'Ü'
      #expr "$Zeile" :Zeile '~Y'  += 'Ö'



###  mkplst.bish  #############################################

#!/u/bin/bish


PDIR="/fat/cie/mc/c"
PROJ="mu2000 upc3"
DATA="cfgdata.c mesdata.c"
TEXT="texts256.h"

TEXDIR="/fat/cie/mc/doc/fw_pdf/kap"
TEXFIL="paramlst.tex"
CHAP="Parameter-Listen"
LANG=de

NL='
'
set -f
set BUFpbn:.30000 BUFqual:.20000 FLAGS:.2500 Z:.200
set TXT:.100 SECT:.100 MU:.20 PRJ:.20 DAT:.100 FILE:.100
set Oid:020 Oadr:05 Olen:03 Onbit:03 Obitpos:03 Oxflg:015 Oflags:.100
set Otyp:.30 Odstg:.30 Oinfo1:.5 Oinfo2:05 Oparbn:05 Onelem:05 Ovoffs:.40 Oacc:.8
set Qtyp:.5 Qdstg:.10
set Odfstr:.100 Odf:024 Omi:024 Oma:024 Oname:.40 Oeinh:.30 Oinfo:.100
set OTinfo:.6500 OTgrp:.100 OTsgrp:.100 OTbit:.20000 OText:.200
set OTPinfo:.1000 OTPbit:.2000
set Snstruct:05 Snelem:06 Snbit:06 Snchar:.07
IVals=0 OT1info=0 OT1bit=0
Grp0=-0001 Grp=00000
BUFpbn= BUFqual=

GetFlags()  {
   local num=0000 sym:.15 txt:.100
   F="$TEXDIR/idsys.tex"
   #0   & RO     & Read only \\
   #1   & BAK    & Backup-Parameter (z.\,B. SERNO) \\
   #30  & ABGL   & Abgleich-Parameter \\
   FLAGS=
   <$F
   while readl Z
   do
      expr "$Z" :: '^%%++FLG--%%$' || continue
      break
   done
   while readl Z
   do
      expr "$Z" :: '^%%++FLG--%%$' && break
      expr "$Z" :num '^ *%(%d%{1,2}%) *& *%w%{2,} *& *[^ ]' || continue
      expr "$Z" :sym '^[^&]%{1,}& *%(%w%{2,}%)' || continue
      expr "$Z" :txt '^[^&]%{1,}&[^&]%{1,}& *%(.*[^\ ]%)[\ ]*$' || continue
      conv -t' `' txt
      FLAGS="$FLAGS$num $sym $txt$NL"
   done
   ><
   return 0
}

GetFlags
#catv FLAGS


SetObj()  {
   local fn=000 fsym:.16
   let ++Snstruct
   Oflags=
   for 14 Oid Oadr Olen Onbit Obitpos Oxflg %
          Otyp Odstg Oinfo1 Oinfo2 Oparbn Onelem Ovoffs Oacc in $Z
   do  done
   let 'Snelem+=Onelem' 'Snbit+=Onbit*Onelem'
   expr "000000000$Oid" :Oid '%(%d%{10}%)$'
   expr "$Oid" :Grp '^%d%d%(%d%{3}%)%d%{5}$'
   expr "$Oid" :Oid '^%(%d%)%(%d%)%(%d%{3}%)%(%d%{5}%)$' '%1.%2.%3.%4'
   expr "$Oxflg" :Oxflg '%(%d%{8}%)'
   expr "$Oacc" :Oacc '%([0-9A-Fa-f]%{4}%)'
   for n from 0 to 31 repeat
   do
      let "16#$Oxflg&1<<$n" || continue
      for 3 fn fsym - in $FLAGS
      do
         [ fn -eq n ] || continue
         Oflags="$Oflags \,$fsym"
         [ "$fsym" == IVALS ] && IVals=1
      done
   done
   conv -D' 'D\D, Oflags
   conv -d"'" Otyp
   Qtyp="$Otyp"
   case "$Otyp" in
     s)  Otyp=string ;;
     i)  Otyp="±dec" ;;
     u)  Otyp=dec ;;
     x)  Otyp=hex ;;
     b)  Otyp=dual ;;
   esac
   conv -d"'" Odstg
   Qdstg="$Odstg"
   case "$Odstg" in
     [1-4])  expr "xxxxx.yyyyy" :Odstg '%(x%{'"$((5-Odstg))"'}%.y%{'"$Odstg"'}%)';;
         m)  Odstg="x/60";;
         /)  Odstg="x/10";;
        %%)  Odstg="V.vv";;
   esac
   return 0
}


# s dfstr
SetDflt()  {
   local nam:.15 v:015
   if [ "$1" -ge 1 ]
   then
      Odfstr="$2"
      [ "$1" -ge 2 ] && Odfstr="MAKRO()$Odfstr"
      Odf= Omi= Oma=
   else
      for 3 Odf Omi Oma in $Z
      do  done
      for nam in Odf Omi Oma
      do
         if expr "${{nam}}" :: '^[0-9-]'
         then
            conv -u $nam
            case "$Qdstg" in
              [1-4])  expr "$Qtyp" :: '^[iu]$' &&
                      [ Odf -ne 0 -o Omi -ne 0 -o Oma -ne 0 ] &&
                      DarstXpY $nam ;;
                  m)  let "$nam/=60";;
                  /)  let "$nam/=10";;
                 %%)  v=${{nam}} $nam=$((v/100)).$((v%100))
                      expr "${{nam}}" :$nam '%.%(%d%)$' '.0%1';;
            esac
         else
            $nam="MAKRO()${{nam}}"
         fi
      done
      Odfstr=
   fi
   return 0
}


SetName()  {
   for 2 - Oname in $Z
   do  done
   [ "$Oname" == 0 ] && { Oname=; return 1; }
   expr "$Oname" :Oname '%([A-Za-z_].*%)$'
   return 0
}


# einh
SetEinh()  {
   Oeinh="$1"
   return 0
}


# info
SetInfo()  {
   Oinfo="$1"
   conv -d' 't', ' Oinfo
   return 0
}


# @name ...
DarstXpY()  {
   local d=$Qdstg nam:.15 s=+
   for nam in $*
   do
      ifset $nam || continue
      s='' expr "${{nam}}" :$nam '^-' = '' && s=-
      expr "00000${{nam}}" :$nam '^0*%(%d%{1,}%)%(%d%{'"$d"'}%)$' '%1.%2'
      $nam="$s${{nam}}"
   done
   return 0
}


# typ name ...
ToTex()  {
   local typ=$1 nam:.15
   shift
   for nam in $*
   do
      ifset $nam || continue
      case "$typ" in
        s)
           expr "${{nam}}" :$nam '%([ &$#{}_%]%)' + '\%1'
           expr "${{nam}}" :$nam '[\ ]%{1,}$' = '\textvisiblespace{}'
           expr "${{nam}}" :$nam '°C' += '\textcelsius{}'
           expr "${{nam}}" :$nam '±' += '\textpm{}'
        ;;
        d)
           expr "${{nam}}" :$nam '^-%([^-]%)' '--%1'
           expr "${{nam}}" :$nam '0X%([0-9A-F]%{1,}%)' && $nam="${{nam}}\Sub{H}"
        ;;
        a)
           expr "${{nam}}" :$nam ' ' += '\, '
        ;;
      esac
      expr "${{nam}}" :$nam '^MAKRO()' = '' && $nam="${{nam}}\Sup{M}"
   done
   return 0
}


# one|info|bit zielvar tsymb tnum en|de|..
GetIText()  {
   local cstr=' "%(.*%)" *$'
   local de='^ *# *define  *'"$3_$4_$5"'  *".*" *$'
   local en='^ *# *define  *'"$3_$4_en"'  *".*" *$'
   local ll='^ *# *define  *'"$3_%d%d%d_%l%l"'  *".*" *$'
   local d3='^ *# *define  *'"$3_%(%d%d%d%)_%l%l"'  *".*" *$'
   local l2='^ *# *define  *'"$3_%d%d%d_%(%l%l%)"'  *".*" *$'
   local txt:.100 n=$4 n0=$4 l=$5 z=0 nz=0
   let ++n
   expr "000$n" :n '%(%d%{3}%)$'
   local en1='^ *# *define  *'"$3_${n}_en"'  *".*" *$'
   $2=''
   txt="`grep -m -e "$de" $TXT`" ||
      txt="`grep -m -e "$en" $TXT`" || { print -ru2 "$de"; return 1; }

   if [ "$1" == one ]
   then
      expr "$txt"   :$2 "$cstr"
   else
      if grep -qm -e "$en1" $TXT
      then
         txt=OTP$1 expr "${{txt}}" :: " $3_$4 " && goend
         txt=
         grep -e "$ll" $TXT | {
            while readl Z
            do
               expr "$Z" :n "$d3" || continue
               expr "$Z" :l "$l2" || continue
               case $z in
                 0)  [ "$n" != "$n0" ] && continue
                     z=1 txt="$Z" continue ;;
                 1)  [ "$n" != "$n0" ] && goend
                     [ "$l" == en ] && txt="$Z"
                     [ "$l" == $5 -a "$l" != en ] &&
                     expr "$Z" :: "$cstr" && txt="$Z"
                     continue ;;
               esac
               expr "$txt" :txt "$cstr"
               ifset txt && { let ++nz; catv txt /%n =:,,$2; }
               n0=$n txt="$Z"
            done
         }
         expr "$txt" :txt "$cstr"
         ifset txt && { let ++nz; catv txt /%n =:,,$2; }
         let "nz>8" && catv ." $3_$4 " =:,,OTP$1
      else
         OT1$1=1
         expr "$txt" :$2 "$cstr"
      fi
   fi
   return 0
}

# en|de|..
SetIText()  {
   local info:06 grp:06 sgrp:06 bit:06 ext:06
   local ot:.10 o:.10
   for 5 OTinfo OTgrp OTsgrp OTbit OText in $Z
   do  done
   for 2 ot o in OTinfo info OTgrp grp OTsgrp sgrp OTbit bit OText ext
   do
      [ "${{ot}}" == 0 ] && $ot= continue
      expr "${{ot}}" :$o '+%(%d%{1,3}%)$'
      expr "000${{o}}" :$o '%(%d%{3}%)$'
      expr "${{ot}}" :$ot '^T%(%w%{1,}%)'
      case "$o" in
        grp|sgrp|ext)  GetIText one $ot "D${{ot}}" ${{o}} $1 ;;
        info|bit)      GetIText $o  $ot "D${{ot}}" ${{o}} $1 ;;
      esac
   done
   return 0
}


# s e i
WriteTex()  {
   local num=0000 qual:.15 sg=0 sgt='\Pt ' psgt='\\'
   local p1='\color[rgb]{1,0.2,0}' p2='\color{black}'
   if [ Grp -ne Grp0 ]
   then
      Grp0=$Grp
      echo "%n\subsubsection{$OTgrp}%n"
   fi
   let "Snchar+=${#OTgrp}+${#OTsgrp}+${#OText}"
   ToTex s OTgrp OTsgrp OText Odfstr Otyp Odstg Oname Oeinh
   if [ $1 -eq 0 -a Olen -eq 0 -a Odf -eq 0 -a Omi -eq 0 -a Oma -eq 0 ]
   then  Odf=-- Omi=-- Oma=--
   else  ToTex d Odf Omi Oma
   fi
   ToTex a Oinfo
   ifset OTsgrp || sgt= psgt=
   if [ Oparbn -gt 0 ]
   then  catv Oparbn .' ' MU .' ' Oid .' ' OText /%n =:,,BUFpbn
   else  p1= p2=
   fi
   if ifset Oflags
   then
      for qual in BAK DFLTC HOLD UROOT UHW USYS UCAL
      do
         expr "$Oflags" :: '%<'"$qual"'%>' || continue
         catv qual .' ' Oid .' ' OText /%n =:,,BUFqual
      done
   else  Oflags=--
   fi
   let "${#OTgrp}+${#OTsgrp}>48" && sg=1 sgt=
   ifset Oname || Oname=--
   [ $2 -eq 0 ] && Oeinh=--
   catv .'\begin{tabular}{|c|c|c|c|c|c|}' /%n
   catv .'\hline' /%n
   if [ sg -eq 0 ]
   then
      catv .'\Pl{Gruppe}&\multicolumn{5}{|c|}{' OTgrp sgt OTsgrp .'}\\' /%n
   else
      catv .'\Pl{Gruppe}&\multicolumn{5}{|c|}{' OTgrp .'}\\' /%n
      catv .'\cline{1-1}' /%n
      catv .'\Pl{Subgruppe}&\multicolumn{5}{|c|}{' OTsgrp .'}\\' /%n
   fi
   catv .'\hline' /%n
   catv .'\Pl{Param\,Text}&\multicolumn{5}{|c|}{' OText .'}\\' /%n
   catv .'\hline' /%n
   catv .'{\small\pid}&\Pl{Typ}&\Pl{Dstg}&\Pl{Länge}&{\small\pbn}&\Pl{Elemente}\\' /%n
   catv .'\hline' /%n
   catv  Oid .'&' Otyp .'&' Odstg .'&' Olen .'&' p1 Oparbn p2 .'&' Onelem '/\\%n'
   catv .'\hline' /%n
   if [ $1 -eq 0 ]
   then
      catv .'\Pl{Default}&\Pl{Min}&\Pl{Max}&\Pl{Einheit}&\Pl{Bits}&\Pl{Bit\,Pos}\\' /%n
      catv .'\hline' /%n
      catv Odf .'&' Omi .'&' Oma .'&' Oeinh .'&' Onbit .'&' Obitpos '/\\%n'
   else
      catv .'\multicolumn{3}{|c|}{\Pl{Default}}&\Pl{Einheit}&\Pl{Bits}&\Pl{Bit\,Pos}\\' /%n
      catv .'\hline' /%n
      catv .'\multicolumn{3}{|c|}{' Odfstr .'}&' Oeinh .'&' Onbit .'&' Obitpos /'\\%n'
   fi
   catv .'\hline' /%n
   catv .'\Pl{Symbol}&\Pl{Zgrf}&\multicolumn{3}{|c|}{\Pl{Flags}}&\Pl{Adresse}\\' /%n
   catv .'\hline' /%n
   catv .'{\footnotesize ' Oname .'}&' Oacc .'&\multicolumn{3}{|c|}{\small ' Oflags .'}&' Oadr /'\\%n'
   [ $3 -gt 0 -a IVals -gt 0 ] && {
      catv .'\hline' /%n
      catv .'\Pl{Auswahlwerte}&\multicolumn{5}{|c|}{' Oinfo .'}\\' /%n
   }
   ifset OTbit && [ OT1bit -eq 1 ] && {
      let "Snchar+=${#OTbit}"
      ToTex s OTbit
      catv .'\hline' /%n
      catv .'\Pl{Bit\,Info}&\multicolumn{5}{|c|}{\T{' OTbit .'}}\\' /%n
   }
   ifset OTinfo && [ OT1info -eq 1 ] && {
      let "Snchar+=${#OTinfo}"
      ToTex s OTinfo
      catv .'\hline' /%n
      catv .'\Pl{Info\,Text}&\multicolumn{5}{|c|}{\T{' OTinfo .'}}\\' /%n
   }
   catv .'\hline' /%n
   catv .'\end{tabular}' '/%n%n\bigskip%n'
   if ifset OTinfo && [ OT1info -eq 0 ]
   then
      echo '\udp{Info\,Text}%n'
      echo '\begin{quote}%n\raggedright'
      readv OTinfo =Z
      while readv
      do
         let "Snchar+=${#Z}"
         ToTex s Z
         catv .'\texttt{' Z /'}\\%n'
      done
      readv -=
      echo '\end{quote}%n%n\bigskip%n'
   fi
   if ifset OTbit && [ OT1bit -eq 0 ]
   then
      echo '\udp{Bit\,Info}%n'
      echo '\begin{list}{}{\listlens[1.5em]{888.}\itemsep-1.3ex}'
      num=-1
      readv OTbit =Z
      while readv
      do
         let ++num
         let "Snchar+=${#Z}"
         ToTex s Z
         catv ."\item [\B{$num}] \texttt{" Z /'}%n'
      done
      readv -=
      echo '\end{list}%n%n\bigskip%n'
   fi
   return 0
}


WriteQual()  {
   local qual:.15 id:.15 prj="$PRJ"
   conv -l prj
   catv BUFqual | sortl -f1,2 | {
      echo '%n\subsection{Parameter-Qualifizierungen}'
      echo '\label{paramlst:qual.'"$prj"'}%n'
      echo '\begin{list}{}{\listlens{\Pl{UROOT}}\itemsep-1.0ex}'
      while readl Z
      do
         expr "$Z" :qual '^%(%w%{1,}%) '
         expr "$Z" :Z '^%w%{1,} ' = ''
         expr "$Z" :id '^%([0-9.]%{1,}%) '
         expr "$Z" :Z '^[0-9.]%{1,} ' = ''
         catv .'\item[\Pl{' qual .'}]\makebox[\wofid][r]{' id .'}\hspace{1em}' Z /'%n'
      done
      echo '\end{list}'
      echo '\clearpage%n'
   }
   return 0
}

WritePBN()  {
   local pbn:05 mu:.15 id:.15
   catv BUFpbn | sortl -f1n,2 | {
      >>$TEXDIR/$TEXFIL
      echo '%n\section{\pbn{} -- Parameterbezeichnungsnummern}'
      echo '\label{paramlst:pbn}%n'
      echo '\begin{list}{}{\listlens{\B{44444}}\itemsep-1.0ex}'
      while readl Z
      do
         expr "$Z" :pbn '^%(%d%{1,}%) '
         expr "$Z" :Z '^%d%{1,} ' = ''
         expr "$Z" :mu '^%(%w%{1,}%) '
         expr "$Z" :Z '^%w%{1,} ' = ''
         expr "$Z" :id '^%([0-9.]%{1,}%) '
         expr "$Z" :Z '^[0-9.]%{1,} ' = ''
         #expr "$Z" :Z '%(%w%)-%(%w%)' + '%1"=%2'
         catv .'\item[\B{' pbn .'}]\makebox[\wofmu][r]{\Pl{' mu .'}}' %
              .'\hspace{1em}\makebox[\wofid][r]{' id .'}\hspace{1em}' Z /'%n'
      done
      echo '\end{list}'
      echo '\clearpage%n'
      ><
   }
   return 0
}

WriteCmds()  {
   echo '\newcommand{\Pl}[1]{{\small\sffamily\bfseries #1}}'
   echo '\newcommand{\Pt}{\hspace{1.1em}$\lozenge$\hspace{1.1em}}'
   echo '\newlength{\wofmu}\settowidth{\wofmu}{\Pl{MU2000}}'
   echo '\newlength{\wofid}\settowidth{\wofid}{4.4.444.44444}'
   echo '\newlength{\wofqual}\settowidth{\wofqual}{\Pl{UROOT}}'
   return 0
}

Statistik()  {
   echo '
   \begin{tabular}{rl}
   '"$Snstruct"'& Strukturen \\
   '"$Snelem"'& Elemente \\
   '"$Snbit"'& Bedeutungs\,Bits \\
   '"$Snchar"'& Textzeichen\Sub{\,IT} \,('"$LANG"') \\
   \end{tabular}
   '
   return 0
}


local s=0 e=0 i=0 ztyp:.10 dfstr:.50 einh:.12 info:.100

#>zz.tex
>$TEXDIR/$TEXFIL
echo "%n\chapter{$CHAP}%n\label{paramlst}%n"
WriteCmds

for PRJ in $PROJ
do
   SECT="$PRJ" conv -u SECT; MU="$SECT"
   echo "\section{$SECT}%n"
   TXT=$PDIR/$PRJ/$TEXT
   BUFqual=
   for DAT in $DATA
   do
      expr "$DAT" :: '^cfg' && SECT="Konfiguration"
      expr "$DAT" :: '^mes' && SECT="Meßwerte"
      echo "\subsection{$SECT}%n"
      OTPbit= OTPinfo=
      Snstruct=0 Snelem=0 Snbit=0 Snchar=0
      FILE=$PDIR/$PRJ/$DAT
      <$FILE
      while readl Z
      do
         expr "$Z" :dfstr ' S%d%{10}..= *"%([^"]*%)";' && { s=1 continue; }
         expr "$Z" :dfstr ' S%d%{10}..= *%(%w%w*%);'   && { s=2 continue; }
         expr "$Z" :einh  ' E%d%{10}..= *"%([^"]*%)";' && { e=1 continue; }
         expr "$Z" :info  ' I%d%{10}..= *"%([^"]*%)";' && { i=1 continue; }
         expr "$Z" :ztyp '^ *# *define  *D%d%{10}%(%w%{3,7}%) ' || continue
         expr "$Z" :Z '^ *# *define  *D%d%{10}%w%{3,7}%(.*%)$' || continue
         conv -d' 't', ' Z
         case "$ztyp" in
               grp)  s=0 e=0 i=0 IVals=0 OT1bit=0 OT1info=0 ;;
               obj)  SetObj ;;
               str)  continue ;;
            dfmima)  SetDflt $s "$dfstr" ;;
            szname)  SetName ;;
           einhtxt)  [ e -eq 0 ] && einh=
                     SetEinh "$einh" ;;
              info)  [ i -eq 0 ] && info=
                     SetInfo "$info" ;;
              Text)  SetIText $LANG; WriteTex $s $e $i ;;
         esac
      done
      ><
      echo "\clearpage%n"
      echo "\subsubsection{STATISTIK}%n"
      Statistik
      echo "\clearpage%n"
   done
   ifset BUFqual && WriteQual
done
><

ifset BUFpbn && WritePBN

exit 0
#define D_kpz_018_de  "Signale Kapaz.limit"




###  mkshw.bish  #############################################


DT=181297024000
ADT=`dat`
dat $DT
MD a:\bin
MD a:\man
MD a:\doc
dat $ADT

COPY c:\bish\vk\zuerst.txt a:\
#COPY c:\bish\vk\produkte.txt a:\
COPY c:\bish\vk\version.txt a:\
COPY c:\bish\vk\sharewar.txt a:\
COPY c:\bish\bish.tar a:\
COPY c:\bish\start.bat a:\
COPY c:\bish\start.bish a:\
COPY c:\bish\bish.pif a:\
COPY c:\bish\bishs.exe a:\bish.exe
COPY c:\wapi\bish\manw.exe a:\
COPY c:\bish\bin\l.exe a:\bin
COPY c:\bish\bin\readc.com a:\bin
COPY c:\bish\bin\ov.com a:\bin
COPY c:\bish\doc\bish.mnk a:\doc
COPY c:\bish\doc\bish.mnv a:\doc
: >a:\man\bish.mnk

touch /$DT a:\*.txt
touch /$DT a:\start.* a:\bish.tar a:\bish.pif
touch /$DT a:\bish.exe a:\manw.exe a:\bish.pif
touch /$DT a:\bin\*
touch /$DT a:\doc\* a:\man\bish.mnk

DIR a:\



###  mkskripte.bish  #############################################

#!/u/bin/bish

cd /u/sh/bish || exit

>skripte.bish
for FF in  $( echo /fat/cie/mc/c/mu2000/*.bish %
     ./tape*.bish /fat/cie/bish/*.bish | sortl | uniq )
do
   expr "$FF" :F '%([^/*?]%{1,}%)$' || continue
   echo "%n%n###  $F  #############################################%n"
   cat $FF | tr -d ''
done
><

:




###  mkskripte2.bish  #############################################

#!/u/bin/bish

cd /u/sh/bish || exit

set -f
set Z:.200 Ze:.200

AllPaths()  {
   list -fR /u | {
      while read Z
      do
         expr Z cbv:: '%.bish$' || continue
         print -r "$Z"
      done
   }
   list -fR /u | {
      while read Z
      do
         expr Z cbv:: '%.cgi$' || continue
	 grep -qm '^#NOTINLIST' "$Z" && continue
         print -r "$Z"
      done
   }
   list -fR /u | {
      while read Z
      do
         expr Z cbv:: '/[^./]%{1,}$' || continue
         catv 50,0 =Ze: < "$Z"
         expr "$Ze" :Ze '^%([a-zA-Z_0-9/.]%{4,}%)' || continue
         expr Ze v:: '/bish$' || continue
         print -r "$Z"
      done
   }
   list -fR /fat/cie | {
      while read Z
      do
         expr Z cbv:: '%.bish$' || continue
         print -r "$Z"
      done
   }
   return 0
}


Split()  {
   local name:.50 size:020 time:020
   while readl Z
   do
      expr Z vbc:: '/skripte.%{0,2}%.bish$' && continue
      expr Z vbc:: '01G[a-zA-Z_0-9.]%{3,}$' && continue
      expr Z vbc:: '[ %t]' && { print -ru2 "! $Z !"; exit 1; }
      expr Z vbc:name '/%([^/]%{5,}%)$'
      fstat -smv size time "$Z"
      catv Z /%t time /%t size /%t name /%n
   done
   return 0
}


Sort()  {
   sortl -f4,3nr,2n,1
   return 0
}


Uniq()  {
   local path:.200 time:020 size:020 name:.50
   local size0:020 name0:.50 lz:32.100 n:020
   while read path time size name
   do
      if cmpv name name0
      then
         [ size -eq size0 -o size -le 0 ] && continue
         let "size0/$size.0<1.05" && continue
      fi
      name0="$name"
      size0="$size"
      let "n=60-${#path}" "n= n<1?1:n"
      catv path n,lz time /%t size /%t name /%n
   done
   return 0
}


Output()  {
   local path:.200 name:.50
   print "%n#NOTINLIST%n"
   while read path - - name
   do
      print "%n%n###  $name  #############################################%n"
      cat "$path"
   done
   return 0
}



AllPaths | Split | Sort | Uniq | Output | tr -d ''


:




###  mktxt.bish  #############################################

#!/u/bin/bish

set -f

N=-001

while readl Z
do
   let ++N; prints vsf03 N $N
   prints s-25s-27ss14 '//' '"' '<' '"'
   prints sssss '#define D_xxxxxx_' $N '_en  ' "%"$Z" '"'
done

:



###  multimail.bish  #############################################



ziel=/nsmail/Outbox
asubst='mmmmm@ttttt'
echo $ziel $asubst
read "adrf? Adressenfile Maildummyfile: " mailf

prints vs300 zeile

grep -e '|[^@]%{1,}@[^@]%{4,}|' $adrf |
while readl zeile
do
   expr "$zeile" :ema '|%([^|]%{3,}%)|'
   echo $ema
   3< $mailf
   >> $ziel
   while readl -u3 zeile
   do
      expr "$zeile" :zeile "$asubst" = "$ema"
      catv zeile /%j
   done
   catv /%j
   ><<
done




###  neu.bish  #############################################


NL="
"
li=0
n=0
<def.h
while read Z
do expr "$Z" :: 'BUILDs' && break; done

while read Z
do
  expr "$Z" :: '^//' || break
  ifset t && ifset Z || break
  expr "$Z" :: '^//-%{50,}' && {
     ifset t && { t="$t</li>$NL</ol>$NL"; T$n="$t"; let ++n; }
     t="<ol>$NL" li=
     continue
  }
  #print -r "$Z"
  expr "$Z" :b '^//--> %{1,}%([0-9, ]%{1,}%)' && { B$n="$b"; continue; }
  expr "$Z" :v '^//--> %{1,}V[^0-9]%{2,}%([0-9.]%{1,}%)' && { V$n="$v"; continue; }
  expr "$Z" :Z '^//%(.*%)$'
  expr "$Z" :Z '&' += '&amp;'
  expr "$Z" :Z '<' += '&lt;'
  expr "$Z" :Z '>' += '&gt;'
  if expr "$Z" :: '^[^ ]'
  then
     ifset li && t="$t</li>$NL"
     t="$t<li>" li=1
  else
     expr "$Z" :Z '^ %{1,}%(.*%)$'
  fi
  t="$t$Z<br>$NL"
done
><


v=
for t from 0 to $n repeat
do
   ifset T$t || continue
   ifset V$t && v="$V[t]"
   ifset V$t || V$t="$v" G$t=1
done


>tdsver.htm
catv '.<!--[NEW]-->' /%n
catv '.<table width="100%" cellpadding="10" cellspacing="2"><tbody>' /%n
for n from $n by -1 to 0 repeat
do
   ifset T$n || continue
   h1='<h1>'
   ifset G$n && h1='<h1 style="color: rgb(160,160,0);">'
   catv '.<tr><td bgcolor="#a2b5cd" width="15%" valign="top" align="center">' %
        /%n h1 V$n '.</h1><h3>' B$n '.</h3></td>' /%n
   catv '.<td bgcolor="#fffff0" width="85%">' /%n T$n '.</td></tr>' /%n
done
catv '.</tbody></table>' /%n
catv '.<!--[/NEW]-->' /%n
><



###  neu2000.bish  #############################################


NL="
"
li=0
n=0
<def.h
while read Z
do expr "$Z" :: 'BUILDs' && break; done

while read Z
do
  expr "$Z" :: '^//' || break
  ifset t && ifset Z || break
  expr "$Z" :: '^//-%{50,}' && {
     ifset t && { t="$t</li>$NL</ol>$NL"; T$n="$t"; let ++n; }
     t="<ol>$NL" li=
     continue
  }
  #print -r "$Z"
  expr "$Z" :b '^//--> %{1,}%([0-9, ]%{1,}%)' && { B$n="$b"; continue; }
  expr "$Z" :v '^//--> %{1,}V[^0-9]%{2,}%([0-9.]%{1,}%)' && { V$n="$v"; continue; }
  expr "$Z" :Z '^//%(.*%)$'
  expr "$Z" :Z '&' += '&amp;'
  expr "$Z" :Z '<' += '&lt;'
  expr "$Z" :Z '>' += '&gt;'
  if expr "$Z" :: '^[^ ]'
  then
     ifset li && t="$t</li>$NL"
     t="$t<li>" li=1
  else
     expr "$Z" :Z '^ %{1,}%(.*%)$'
  fi
  t="$t$Z<br>$NL"
done
><


v=
for t from 0 to $n repeat
do
   ifset T$t || continue
   ifset V$t && v="$V[t]"
   ifset V$t || V$t="$v" G$t=1
done


>neu2000.htm
catv '.<!--[NEW]-->' /%n
catv '.<table width="100%" cellpadding="10" cellspacing="2"><tbody>' /%n
for n from $n by -1 to 0 repeat
do
   ifset T$n || continue
   h1='<h1>'
   ifset G$n && h1='<h1 style="color: rgb(160,160,0);">'
   catv '.<tr><td bgcolor="#a2b5cd" width="15%" valign="top" align="center">' %
        /%n h1 V$n '.</h1><h3>' B$n '.</h3></td>' /%n
   catv '.<td bgcolor="#fffff0" width="85%">' /%n T$n '.</td></tr>' /%n
done
catv '.</tbody></table>' /%n
catv '.<!--[/NEW]-->' /%n
><



###  neuvb.bish  #############################################

#!/u/bin/bish

NL="
"
li=0
n=0

<$1
while read Z
do expr "$Z" :: 'BUILDs' && break; done

while read Z
do
  expr "$Z" :: '^//' || break
  ifset t && ifset Z || break
  expr "$Z" :: '^//-%{50,}' && {
     ifset t && { t="$t</li>$NL</ol>$NL"; T$n="$t"; let ++n; }
     t="<ol>$NL" li=
     continue
  }
  #print -r "$Z"
  expr "$Z" :b '^//--> %{1,}%([0-9, ]%{1,}%)' && { B$n="$b"; continue; }
  expr "$Z" :v '^//--> %{1,}V[^0-9]%{2,}%([0-9.]%{1,}%)' && { V$n="$v"; continue; }
  expr "$Z" :Z '^//%(.*%)$'
  expr "$Z" :Z '&' += '&amp;'
  expr "$Z" :Z '<' += '&lt;'
  expr "$Z" :Z '>' += '&gt;'
  if expr "$Z" :: '^[^ ]'
  then
     ifset li && t="$t</li>$NL"
     t="$t<li>" li=1
  else
     expr "$Z" :Z '^ %{1,}%(.*%)$'
  fi
  t="$t$Z<br>$NL"
done
><


v=
for t from 0 to $n repeat
do
   ifset T$t || continue
   ifset V$t && v="$V[t]"
   ifset V$t || V$t="$v" G$t=1
done


>__neu
catv '.<table width="100%" cellpadding="10" cellspacing="2"><tbody>' /%n
for n from $n by -1 to 0 repeat
do
   ifset T$n || continue
   h1='<h1>'
   ifset G$n && h1='<h1 style="color: rgb(160,160,0);">'
   catv '.<tr><td bgcolor="#a2b5cd" width="15%" valign="top" align="center">' %
        /%n h1 V$n '.</h1><h3>' B$n '.</h3></td>' /%n
   catv '.<td bgcolor="#fffff0" width="85%">' /%n T$n '.</td></tr>' /%n
done
catv '.</tbody></table>' /%n
><

:




###  ninc.bish  #############################################

#!/u/bin/bish

start=0
inc=1
muster='@'
width=2
fill=' '
neq=1
nnot=1

[ -t 0 ] &| expr "$1" :: '[^0-9-]' && {
   print -u2 ninc.bish: usage: start inc|inc.neq|inc-nnot muster [-]width fillchar
   exit 0
}

[ $# -gt 0 ] && {
   [ -n "$1" ] && start="$1"
   [ -n "$2" ] && inc="$2"
   [ -n "$3" ] && muster="$3"
                  width="$4"
                  fill="$5"
}
#[ "$fill" == 'space' ] && fill=' '
ifset fill && fill="f$fill"
expr "$width" :width '^-' = '' && sign=-
expr "$inc" :neq '%d%.%(%d%{1,}%)'
expr "$inc" :nnot '%d-%(%d%{1,}%)'
expr "$inc" :inc '^%(%d%{1,}%)'
neqd=$neq
nnotd=1

cat | {
   while readl Z
   do
      prints "vs$sign$fill"$width subst "$start"
      expr "$Z" :: "$muster" || { catv Z /%j; continue; }
      let "--nnotd>0" && { catv Z /%j; continue; }
      expr "$Z" :Z "$muster" += "$subst" &&  {
         let "--neqd==0" && let "start+=inc" "neqd=neq"
         nnotd=$nnot
      }
      catv Z /%j
   done
}

exit 0




###  ninc.bish  #############################################

#!/u/bin/bish

start=0
inc=1
muster='@'
width=2
fill=' '
neq=1

[ -t 0 ] &| expr "$1" :: '[^0-9-]' && {
   print -u2 ninc.bish: usage: start inc.neq muster width fillchar
   exit 0
}

[ $# -gt 0 ] && {
   [ -n "$1" ] && start="$1"
   [ -n "$2" ] && inc="$2"
   [ -n "$3" ] && muster="$3"
                  width="$4"
                  fill="$5"
}
#[ "$fill" == 'space' ] && fill=' '
ifset fill && fill="f$fill"
expr "$width" :width '^-' = '' && sign=-
expr "$inc" :neq '%d%.%(%d%{1,}%)'
expr "$inc" :inc '^%(%d%{1,}%)'
neqd=$neq

cat | {
   while readl Z
   do
      prints "vs$sign$fill"$width subst "$start"
      expr "$Z" :Z "$muster" = "$subst" &&  {
         let "--neqd==0" && let "start+=inc" "neqd=neq"
      }
      catv Z /%j
   done
}

exit 0




###  ninc.bish  #############################################

#!/home/bin/bish

start=0
inc=1
muster='@'
width=2
fill=' '

[ -t 0 ] &| expr "$1" :: '[^0-9-]' && {
   print -u2 ninc.bish: usage: start inc muster width fillchar
   exit 0
}

[ $# -gt 0 ] && {
   [ -n "$1" ] && start="$1"
   [ -n "$2" ] && inc="$2"
   [ -n "$3" ] && muster="$3"
                  width="$4"
                  fill="$5"
}
ifset fill && fill="f$fill"

cat | {
   while readl Z
   do
      prints "vs$fill"$width subst "$start"
      expr "$Z" :Z "$muster" = "$subst" && let "start+=inc"
      catv Z /%j
   done
}

exit 0




###  norm.bish  #############################################

#!/u/bin/bish

[ -t 0 ] && { echo "norm.bish < if [> of]"; exit; }



Max()  {
   local nam=$1 max=000000000000000
   local v=$max
   shift
   for v in $*
   do
      let "v>max" && max=$v
   done
   $nam=$max
   return 0
}


Max100()  {
   local v=000000000000 i=0
   Max Maxv $*
   global
   array 1 7 V $*
   local
   let "Maxv==100" && return 0
   for v in $*
   do
      let "++i, v*=100, v/=Maxv"
      V[i]=$v
   done
   return 0
}


array 1 7 S  0 0 0 0 0 0 0
N=000

while readl Z
do
   ifset Z || continue
   expr "$Z" :z '  %([0-9][ 0-9]*%)' || continue
   expr "$Z" :p '%([^ ].*[^ ]%)  ' || continue
   let ++N
   Max100 $z
   prints s-45s5s5s5s5s5s5s5 "$p" $V1 $V2 $V3 $V4 $V5 $V6 $V7
   let "S1+=V1,S2+=V2,S3+=V3,S4+=V4,S5+=V5,S6+=V6,S7+=V7"
done
echo
prints s5s5s5s5s5s5s5  $S1 $S2 $S3 $S4 $S5 $S6 $S7
Max100 $S1 $S2 $S3 $S4 $S5 $S6 $S7
prints s5s5s5s5s5s5s5  $V1 $V2 $V3 $V4 $V5 $V6 $V7





###  ns.bish  #############################################


: > urls
3< /media/ns/comm47/netscape
< pos   #bgrep-pos
while readl num
do
   catv $num,256,3 | tr '\0[\1-\31][\128-\255]' '\10[ *]' |
      catv =url:
   expr "$url" :url '^%([^%n]*%)'
   expr "$url" :: ' ' && continue
   [ "$url" == "http://" ] && continue
   echo "$num $url" >> urls
done
><<



###  nsp.bish  #############################################


3<> /media/ns/comm47/netscape
< urls
while read num url new
do
   ifset new || continue
   echo "$num $url $new"
   catv new /%0 =$num,,3
done
><<



###  num.bish  #############################################


num=000
cat texte.c | {
: > texte.c
while readl zeile
do
   expr "$zeile" :zeile '^/%*000' = "/*$num" && {
      let ++num
      let "num<100" && num=0$num
      let "num< 10" && num=0$num
   }
   print -r "$zeile" >> texte.c
done
}



###  oct.bish  #############################################

#!/home/bin/bish

for n from 0 to 255 repeat
do
   prints ssf03ssf03s "#define O" $n '  "\' $((8#, n)) '"'
done



###  optis.bish  #############################################


array p %f %F %a %A %x %X %d %D %e %E
i=00000
echo $#
[ $# -lt 5 ] && i=6

for O in $@
do
   let ++i
   print -r "$O"
   #echo %t%c
   #print -r "$p[i] ==> $O"
done



###  ostern.bish  #############################################

#!/u/bin/bish

#http://www.ortelius.de/kalender/east_de.php

#Im Magazin "Nature" vom 20.April 1876 veröffentlichte ein
#anonymer Autor eine Tabelle mit Regeln zur Berechnung des
#(Gregorianischen) Ostersonntages des Jahres J.
#In Formeln ausgedrückt erhält man das Folgende:

Osterdatum() {
   local J=$1 a:010 b:010 c:010 d:010 e:010 f:010 g:010
   local h:010 i:010 k:010 l:010 m:010 n:010 o:010
   ((
      a=J % 19,
      b=J / 100,
      c=J % 100,

      d=b / 4,
      e=b % 4,
      f=(b + 8) / 25,

      g=(b - f + 1) / 3,
      h=(19 * a + b - d - g + 15) % 30,

      i=c / 4,
      k=c % 4,
      l=(32 + 2 * e + 2 * i - h - k) % 7,

      m=(a + 11 * h + 22 * l) / 451,
      n=(h + l - 7 * m + 114) / 31,

      o=(h + l - 7 * m + 114) % 31,
      Monat=n,
      Ostersonntag=o+1
   ))
   #echo $a $b $c $d $e $f $g $h $i $k $l $m $n $o
   return $o
}

Osterdatum $1
echo "Ostersonntag $1: $Ostersonntag.$Monat."


#n ist hierbei die Nummer des Monats,
#o + 1 die Nummer des Tages auf welchen der
#Ostersonntag im Jahr J fällt.
#Dieser Algorithmus kommt ohne Hilfszahlen aus.

#Vom Datum des Ostersonntages hängen einige weitere Feiertage ab.
#Faschingsdienstag und Aschermittwoch liegen 47 bzw. 46 Tage vor Ostern,
#Christi Himmelfahrt 39 Tage nach Ostern,
#Pfingstmontag 50 Tage danach,
#und Fronleichnam wird 60 Tage nach Ostern gefeiert.





###  overlapadr.bish  #############################################

#!/u/bin/bish


set -f
set Z:.300 FILE:.200
R=0 C='%e[7m%e[1m' D='%e[0m%e[1m'
expr $(ver s) :: '^dos' || C='' D=''


Overlap()  {
   local a:010 a0:010 n:010 n0:010 r=0
   while read a n
   do
      let "a<n0" && { echo "$C$FILE: ADDR $a overlaps $a0!$D"; r=1; }
      n0=$n a0=$a
   done
   echo $a $n
   return $r
}


PrintArgs()  {
   local id:010 adr:010 next:06 padd:05
   local bytelen=000 flags:.10 arr:05
   while read id - adr - - - - - bytelen - - - - - - - %
              flags - - - - - - - -
   do
      expr "$id" :: '^%$' && break
      expr "$id" :: '^[@x-]%d%{8,10}$' || continue
      expr "$flags" :padd 'p%(%d%{1,5}%)' || padd=0
      expr "$flags" :arr '[AS]%(%d%{1,4}%)' || arr=1
      let "next=adr+bytelen*arr+padd"
      echo $adr $next
   done
   return 0
}


Check()  {
   PrintArgs | sortl -fn1 | Overlap || return 1
   return 0
}



for FILE in $*
do
   < $FILE
   if Check
   then  echo "$C$FILE: No overlapping address.$D"
   else  R=1
   fi
   ><
done

return $R





###  padcanger.bish  #############################################



for 3 g n nn in REC 96 192 DCC 64 128 INV 32 32 STS 1 8 MMB 2 4 BMB 2 8 %
                DEB 2 4 RYB 2 4 FMB 4 8 FAN 16 32 XXX 16 32 UMD 4 16
do
   for 3 t l ll in TYP 16 16 MAT 16 16 SNO 16 16 HID 8 8 SID 8 8 IND 16 16
   do
      echo $g $t $((n*[ll-l]+[nn-n]*ll))
   done
done




###  perm.bish  #############################################

#!/u/bin/bish

[ -d /u/bin ] && {
   cp /u/bin/htpasswd adm
   cp /u/bin/bish_folso_cgi /u/bin/mailcode cgi
   cp /u/bin/bish_folso_cgi cgi/bish_root
}
ln ./cgi/main.cgi ./cgi/new.cgi
ln ./cgi/main.cgi ./cgi/adm.cgi
rg=wheel
#expr $(-uname)"" =:: 'freebsd' && rg=wheel

chown -R www .
chgrp -R www .

list -Rpf . |
   while readl F
   do
      expr "$F" :: '/DB/' && continue
      expr "$F" :: '/DB[^/]*/' && continue
      expr "$F" :: '/db/' && continue
      echo $F
      expr "$F" :: '%.cgi$' && { chmod 710 $F; continue; }
      expr "$F" :: '%.gif$' && { chmod 400 $F; continue; }
      expr "$F" :: 'perm.bish$' && { chmod 710 $F; continue; }
      expr "$F" :: 'bish_' && { chmod 100 $F; continue; }
      chmod 600 $F
   done

chown root adm/.wmspw adm/htpasswd cgi/NULL adm/syscmd.bish cgi/bish_root
chgrp $rg adm/.wmspw adm/htpasswd cgi/NULL adm/syscmd.bish cgi/bish_root
chmod 644 adm/.wmspw
chmod 555 adm/htpasswd
chmod 755 adm/syscmd.bish
chmod 111 cgi/bish_root
chmod 755 adm/rxtx.bish
chmod u+s,g+s adm/htpasswd adm/syscmd.bish adm/rxtx.bish cgi/bish_root
chmod 100 cgi/mailcode
chmod 444 cgi/NULL
chmod 600 cgi/null
ln hlp/help.htm.de hlp/help.htm.en



###  plcgi.bish  #############################################




cd /u/hp/2
Files=$( find . '(' -name '*.htm' -o -name '*.pl' -o -name '*.txt' ')' -print )
echo $Files
read -
#vi '+/\.pl' $( grep -lm '%.pl' $Files )
Files=$( grep -lm '%.pl' $Files )
echo $Files
read inp
prints vs500 zeile
for f in $Files
do
   echo $f ...
   cat $f | {
   > $f
   while readl zeile
   do
      ifset zeile || { catv /%n ; continue; }
      expr "$zeile" :zeile '%<cie%.pl%>' += cie.cgi
      expr "$zeile" :zeile '%<cntadm%.pl%>' += cntadm.cgi
      expr "$zeile" :zeile '%<coltaB%.pl%>' += coltaB.cgi
      expr "$zeile" :zeile '%<gcnt%.pl%>' += gcnt.cgi
      expr "$zeile" :zeile '%<get%.pl%>' += get.cgi
      expr "$zeile" :zeile '%<icnt%.pl%>' += icnt.cgi
      expr "$zeile" :zeile '%<icntget%.pl%>' += icntget.cgi
      expr "$zeile" :zeile '%<icntvw%.pl%>' += icntvw.cgi
      catv zeile /%n
   done
   ><
   }
done

d=/u/hp/2/de/cgi
for f in cie cntadm coltaB gcnt get icnt icntget icntvw
do
   [ -s $d/$f.pl ] && mv $d/$f.pl $d/$f.cgi
done





###  plist.bish  #############################################

#!/u/bin/bish

#"WP-Art";"ISIN";"Wertpapiername";"Anzahl";"Einheitskennung";"Beobachtungskurs";"Währung";"Beobachtungswert";
#"Währung";"Beobachtungsdatum";"Aktueller Preis";"Währung";"Aktueller Wert";"Währung";"Vortagsveränderung";
#"Währung";"Vortagsveränderung (%)";"Wertentwicklung";"Währung";"Wertentwicklung (%)";"Limitalarm unten";"Limitalarm oben";

<$1
while readl Z
do
   expr "$Z" :: '^"Aktien";"' || continue
   conv '-t _d"t; ' Z
   for 22 art isin name anz kenng bkurs eur bwert eur bdat kurs eur wert eur vtch eur vtchp diff eur diffp limu limo in $Z
   do
      conv -'t_ ' name
      conv -d.t,. bwert wert
      printf '%s %7.2f%s %s\n' "$bdat" $(-bc -e"scale=20;(($wert/$bwert)-1)*100" -e'quit') '%' "$name"
   done
done
><




###  pop.bish  #############################################

#!/u/bin/bish -p

Hosts='
securepop.t-online.de:995 schellong@t-online.de "xxxxxxxxx"
'"$KUNDENSERVER1"'
'"$KUNDENSERVER2"'
'"$KUNDENSERVER3"'
'"$KUNDENSERVER4"'
pop.t-online.de x "."
pop.gmx.net . "."
pop.gmx.net u "."
'
Cols=090


Help='
 I holt nur die Anzahl und ByteSumme
 i holt die komplette Info-Liste
 
 Versteckte Menü-Punkte:
  help
  H host (pop.t-online.de)
  H ? {Host-Liste; siehe Hosts='' im Script}
  H n {Selektiert Host/User/Pass n}
  U user (.)
  P pass (.)
  q quiet
  B bodylines (0)
  C columns (80)
  All
  ed (Unix:vi, Win:notepad)
 (Voreinstellungen)
'

[ $# -eq 1 ] &&
   expr "$1" :: '[?/]' &|
   expr "$1" :: '^-[hH]' && {
 echo " pop.bish
 pop.bish Host
 pop.bish Host User
 pop.bish Host User 'Password'
 $Help"
 exit
}

set -f

set Z:.1200
set Subj:.512
set From:.512
#Tmp=/tmp/bish_pop3
mktemp Tmp
echo "$Tmp"
Nmax=00000
Body='       '
Q=1
Trans=0000000
Size=0000000000

[ $# -gt 0 -a "$1" != '-a' ] && Host="$1" shift
[ $# -gt 0 -a "$1" != '-a' ] && User="$1" shift
[ $# -gt 0 -a "$1" != '-a' ] && Pass="$1" shift
ifset Host || Host="securepop.t-online.de:995"
ifset User || User="schellong@t-online.de"
ifset Pass || Pass="xxxxxxxxx"


# hostname
Hostaddr()  {
   local hostname="$1" port=00000
   IP="???.???.???.???:00000"
   expr "$hostname" :port ':%([0-9]%{1,5}%)$' || port=''
   expr "$hostname" :hostname '^%([^:]%{4,}%)'
   [ $# -ne 1 ] && return 1
   hostaddr "$hostname" | {
      [ $? -ne 0 ] && return 2
      while readl Z
      do
         [ Q -eq 0 ] && catv Z /%j
         expr "$Z" :IP '^addr: %([0-9.]%{7,15}%)' && break
      done
   }
   expr "$IP" :: '^[0-9.]%{7,15}$' || return 3
   ifset port && IP="$IP:$port"
   return 0
}
Hostaddr $Host || { print -u2 "'$Host'?!"; exit 1; }


# ? | n
Hosts()  {
   local n=000
   catv Hosts | {
      while readl Z
      do
         expr "$Z" :: '[a-zA-Z0-9_.-]%{4,}' || continue
         let ++n
         [ "$1" == '?' ] && { catv /%t n '.: ' Z /%j; continue; }
         let "$1!=n" && continue
         expr "$Z" :Host '%([^ %t]%{4,}%)' || break
         expr "$Z" :User '[^ %t]%{4,}[ %t]%{1,}%([^ %t]%{1,}%)' || break
         expr "$Z" :Pass '[ %t]"%(.%{1,}%)"[ %t]*$'
         break
      done
   }
   return 0
}


#file n id
#Zapp()  {
#   local n=0000
#   cat $1 | {
#      > $1
#      while readl Z
#      do
#         expr "$Z" :n '%([0-9]%{1,}%)' || { catv Z /%n; continue; }
#         let "n!=$2" && { catv Z /%n; continue; }
#         catv Z ". $3" /%n
#      done
#      ><
#   }
#   return 0
#}


# [-s]
Holen()  {
   local c=unknown n=00000 m=- t:9.1
   Trans=0
   3> "$Tmp"
   pop3 $1 $Body $IP "$User" "$Pass" | {
      while readl Z
      do
         #ifset Z && conv '-d' Z
         let "Trans+=${#Z}+2"
         [ Q -eq 0 ] && catv $Cols,Z /%j
         case "$Z" in
           QUIT|STAT|LIST|UIDL)
                         c="$Z" Subj= From= conv -l c; continue;;
           TOP% [0-9]*)  c=topn m=- expr "$Z" :n '%([0-9]%{1,}%)'
                         [ Q -gt 0 ] && let 'n%25==0' && prints su2s6s- T "$n" ""
                         continue;;
         esac
         case "$c" in
           stat)  expr "$Z" :Nmax '%([0-9]%{1,}%)  *[0-9]%{1,}'
                  expr "$Z" :Size '[0-9]%{1,}  *%([0-9]%{1,}%)' ;;
           list)  expr "$Z" :n '^ *%([0-9]%{1,}%)  *[0-9]%{1,} *$' ||
                     continue
                  [ n -le 0 ] && continue
                  [ Q -gt 0 ] && let 'n%25==0' && prints su2s6s- L "$n" ""
                  prints vs-20s-75s-2s-520s-520 Z "$Z" '' - '' ''
                  catv Z /%r%n =$(([n-1]*[20+75+2+520+520+2])),,3
                  continue
           ;;
           uidl)  expr "$Z" :n '^ *%([0-9]%{1,}%)  *[!-~]%{1,} *$' ||
                     continue
                  [ n -le 0 ] && continue
                  expr "$Z" :Z '^ *[0-9]%{1,}  *%([!-~]%{1,}%) *$'
                  [ Q -gt 0 ] && let 'n%25==0' && prints su2s6s- U "$n" ""
                  prints vs-75 Z "$Z"
                  catv Z =$(([n-1]*[20+75+2+520+520+2]+20)),,3
                  continue
           ;;
           topn)  expr "$Z" =:Subj '^Subject: %(.*%)$' && continue
                  expr "$Z" =:From '^From: %(..*%)$' && continue
                  expr "$Z" =:: '^Content-Type: text/plain' && m=t continue
                  expr "$Z" =:: '^Content-Type: text/html' && m=H continue
                  expr "$Z" =:: '^Content-Type: multipart/' && m=M continue
                  expr "$Z" :: '^.$' && { c=ende
                     let 'n>0' && let '--n'
                     conv "-t %`t${t}%`" Subj From
                     ifset Subj || Subj='"?"'
                     ifset From || From='"?"'
                     prints vs-2s-520s-520 Z "$m" "$Subj" "$From"
                     catv Z =$((n*[20+75+2+520+520+2]+20+75)),,3
                     continue
                  }
           ;;
              *)  : ;;
         esac
      done
   }
   ><
   echo
   [ -s "$Tmp" ] || return
   cat "$Tmp" | tr -s ' ' ' ' > "$Tmp"
   return 0
}



#{l|h}  a b c d-e
Loeschen()  {
   [ $# -lt 2 -o Nmax -lt 1 ] && return 20
   local lz=tHM- t=...... von=000000000 bis=000000000
   local a:.25
   expr "$*" :: '^[lh]  *[1-9][0-9 -]*$' && t=vb
   [ "$t" != vb ] && {
      t=''
      for a in "$2" "$3"
      do
         expr "$a" :: '^[tHM-]%{1,4}$' && t="${t}mt"
         expr "$a" :bis '^%.%([0-9]%{1,}%)$' && t="${t}sz" von=0
         expr "$a" :von '^%([0-9]%{1,}%)%.$' && t="${t}sz" bis=100000000
         expr "$a" :: '^[0-9]%{1,}%.[0-9]%{1,}$' && t="${t}sz" &&
            expr "$a" :von '^%([0-9]%{1,}%)' &&
            expr "$a" :bis '%([0-9]%{1,}%)$'
      done
   }
   case "$t" in
     vb)  GetIDs vb $( MkNs $* ) | { nop && pop3 - $IP "$User" "$Pass"; }
     ;;
     mt)  [ "$1" == l ] && lz="$2"
          [ "$1" == h ] && expr "$lz" :lz "[$2]" += ''
          ifset lz || return 0
          GetIDs mt $1 "$lz" | { nop && pop3 - $IP "$User" "$Pass"; }
     ;;
     sz)  GetIDs sz $1 $von $bis | { nop && pop3 - $IP "$User" "$Pass"; }
     ;;
     mtsz)
          [ "$1" == l ] && lz="$2"
          [ "$1" == h ] && expr "$lz" :lz "[$2]" += ''
          GetIDs ts $1 $von $bis "$lz" | { nop && pop3 - $IP "$User" "$Pass"; }
     ;;
     szmt)
          [ "$1" == l ] && lz="$3"
          [ "$1" == h ] && expr "$lz" :lz "[$3]" += ''
          GetIDs ts $1 $von $bis "$lz" | { nop && pop3 - $IP "$User" "$Pass"; }
     ;;
      *)  return 21 ;;
   esac
   Nmax=? Size=? Trans=?
   return 0
}


#{l|h}  a b c d-e
MkNs()  {
   [ $# -lt 2 ] && return 1
   local n:010 nm=00000 nmax=$Nmax lh=$1
   shift
   let 'nmax>0' || return 1
   if [ "$lh" == l ]
   then
      for n in $*
      do
         expr "$n" :: '-' || { echo "$n"; continue; }
         expr "$n" :n '-' = ' to ' || continue
         for n from $n repeat
         do  echo "$n";  done
      done
   else
      for nm from 1 to $nmax repeat
      do
         for n in $*
         do
            expr "$n" :: '-' || { let 'n==nm' && continue 2; continue; }
            expr "$n" :n '-' = ' to ' || continue
            for n from $n repeat
            do
               let 'n==nm' && continue 3
            done
         done
         echo "$nm"
      done
   fi
   return 0
}


# id ...
GetIDs()  {
   [ $# -gt 1 ] || { print -u2 narg le 0; return 1; }
   [ -s "$Tmp" ] || { print -u2 TmpSz eq 0; return 2; }
   local r=1 t=.. s=000000000 a:.20 id:.70
   [ $2 == l ] && a="s>=$3 && s<=$4"
   [ $2 == h ] && a="s<$3 || s>$4"
   < "$Tmp"
   case "$1" in
     vb)  shift
          while read s - id - - -
          do
             expr " $* " :: "[ %t]${s}[ %t]" && r=0 catv id /%n
          done
     ;;
     mt)  while read - - id t - -
          do
             expr "$3" :: "$t" && r=0 catv id /%n
          done
     ;;
     sz)  while read - s id - - -
          do
             expr "$s" :: '[^0-9]' && continue
             let "$a" && r=0 catv id /%n
          done
     ;;
     ts)  while read - s id t - -
          do
             expr "$s" :: '[^0-9]' && continue
             expr "$5" :: "$t" && let "$a" && r=0 catv id /%n
          done
     ;;
   esac
   ><
   return $r
}


Show()  {
   [ -s "$Tmp" ] || return 1
   local n=00000 sz:010 m=-
   local ls=30 lf=29
   let 'Cols>80' && let 'lf+=(Cols-80)/2' 'ls+=Cols-80-(lf-29)'
   < "$Tmp"
   while read n sz - m Subj From
   do
      conv '-t` ' Subj From
      prints s5bs9bsbs-${ls}bss-${lf} $n $sz $m "$Subj" ' ' "$From"
   done
   ><
   return 0
}


# [-a]
MainSwitch()  {
   case "$Opt" in
     i)  Holen
         [ "$1" != '--a' ] && Show ;;
     I)  Holen -s ;;
     l|h)
         ifset Arg || return 0
         [ "$Opt" == l -a "$Arg" == '*' ] && Arg="1-$Nmax"
         Loeschen $Opt $Arg || echo ERROR$?: Args? Info-Liste?
         ;;
     All)
         read "Arg? Alles Löschen?[jJyY]: "
         expr "$Arg" :: '^[jJyY]$' || return 0
         pop3 -A $IP "$User" "$Pass" ;;
     U)  User="$Arg" ;;
     P)  Pass="$Arg" ;;
     B)  Q=0 Body=-b$Arg ;;
     C)  Cols="$Arg"
         let 'Cols<80' && Cols=80 ;;
     H)  L_ip=$IP
         ifset Arg || Arg=securepop.t-online.de:995
         [ "$Arg" == '?' ] && { Hosts '?'; return 0; }
         expr "$Arg" :: '^[0-9]%{1,2}$' && { Hosts $Arg; Arg="$Host"; }
         Hostaddr $Arg && Host="$Arg" return 0
         IP=$L_ip print -u2 "'$Arg'?!"
         ;;
     help)
         print -rn "$Help" ;;
     q)  let "Q^=1" ;;
     ed)
         [ `ver s` == dos32 ] && notepad "$Tmp"
         [ `ver s` == unix ] && vi "$Tmp"
         read "-? <Enter> "
         ;;
     E)  return 1;;
     *)  return 0;;
   esac
   return 0
}



L_ip=000000000000000
L_ip=$IP
Nmax=? Size=? Trans=?


[ "$1" == '-a' ] && {
   [ $# -lt 3 ] && { remove -s "$Tmp"; exit 0; }
   Opt=I MainSwitch -a
   let "Nmax>9||Nmax>5&&Size>500000" &&
       Opt=i                MainSwitch -a &&
       Opt="$2" Arg="$3 $4" MainSwitch -a
   remove -s "$Tmp"
   exit 0
}


while prints sf_$Cols
      echo "   $IP  $Host  $User '$Pass'  n=$Nmax b=$Size t=$Trans  q=$Q
   Info-Liste holen :  i | I
           Loeschen :  l  {n|v-b}... | * | tHM- | {min.max|min.|.max}
             Halten :  h  {n|v-b}... |     tHM- | {min.max|min.|.max}
            Beenden :  E
                       _%b%c"
do
   read Opt Arg
   MainSwitch || break
done


remove -s "$Tmp"
exit 0





###  pop.bish  #############################################

#!/u/bin/bish -p

[ $# -eq 1 ] &&
   expr "$1" :: '[?/]' &|
   expr "$1" :: '^-[hH]' && {
 echo " pop.bish
 pop.bish Host
 pop.bish Host User
 pop.bish Host User 'Password'

 Menü+: U user
 Menü+: P pass"
 exit
}

set f

Tmp=/tmp/bish_pop3
Nmax=0000

[ $# -gt 0 ] && Host="$1"
ifset Host || Host="pop.t-online.de"
[ $# -gt 1 ] && User="$2"
ifset User || User=.
[ $# -gt 2 ] && Pass="$3"
ifset Pass || Pass=.

Z="$( hostaddr $Host )" || { print -u2 "'$Host'?!"; exit 1; }
catv Z |
   while readl Z
   do
      expr "$Z" :IP '^addr: %([0-9.]%{7,15}%)' && break
   done


#file n id
Zapp()  {
   local n=0000
   cat $1 | {
      > $1
      while readl Z
      do
         expr "$Z" :n '%([0-9]%{1,}%)' || { catv Z /%n; continue; }
         let "n!=$2" && { catv Z /%n; continue; }
         catv Z "/ $3" /%n
      done
      ><
   }
   return 0
}


Holen()  {
   local c=unknown n=0000 m=-
   : > $Tmp
   pop3 $IP "$User" "$Pass" | {
      while readl Z
      do
         catv 80,Z /%j
         ifset Z || continue
         expr "$Z" =:: '^QUIT$' && c=quit
         expr "$Z" =:: '^STAT$' && c=stat
         expr "$Z" =:: '^LIST$' && c=list
         expr "$Z" =:: '^UIDL$' && c=uidl
         expr "$Z" =:n '^TOP %([0-9]%{1,}%)' && c=topn m=-
         case "$c" in
           stat)  expr "$Z" :Stat '%([0-9]%{1,}  *[0-9]%{1,}%)' ;;
           list)  expr "$Z" :: '^ *[0-9]%{1,}  *[0-9]%{1,} *$' &&
                     catv Z /%n >> $Tmp
           ;;
           uidl)  expr "$Z" :: '^ *[0-9]%{1,}  *[!-~]%{1,} *$' &&
                     Zapp $Tmp $Z
           ;;
           topn)  expr "$Z" =:Subj '^Subject: %(.*%)$'
                  expr "$Z" =:From '^From: %(..*%)$'
                  expr "$Z" =:: '^Content-Type: multipart/' && m=M
                  expr "$Z" :: '^.$' && { c=ende
                     conv '-t _' Subj From
                     Zapp $Tmp $n $m
                     Zapp $Tmp $n $Subj
                     Zapp $Tmp $n $From
                  }
           ;;
              *)  : ;;
         esac
      done
   }
   expr "$Stat" :Nmax '%([0-9]%{1,}%)  *[0-9]%{1,}'
   return 0
}


#{l|h}  a b c d-e
Loeschen()  {
   [ $# -lt 2 ] && return 1
   #echo $( MkNs $* )
   #echo $IP $( GetIDs $( MkNs $* ) )
   pop3 $IP "$User" "$Pass" $( GetIDs $( MkNs $* ) )
   return $?
}


#{l|h}  a b c d-e
MkNs()  {
   [ $# -lt 2 ] && return 1
   local n:010 nm=0000 nmax=$Nmax lh=$1
   shift
   let 'nmax>0' || return 1
   if [ "$lh" == l ]
   then
      for n in $*
      do
         expr "$n" :: '-' || { echo $n; continue; }
         expr "$n" :n '-' = ' to ' || continue
         for n from $n repeat
         do  echo $n;  done
      done
   else
      for nm from 1 to $nmax repeat
      do
         for n in $*
         do
            expr "$n" :: '-' || { let 'n==nm' && continue 2; continue; }
            expr "$n" :n '-' = ' to ' || continue
            for n from $n repeat
            do
               let 'n==nm' && continue 3
            done
         done
         echo $nm
      done
   fi
   return 0
}


# id ...
GetIDs()  {
   [ -s "$Tmp" -o $# -eq 0 ] || return 1
   expr "$*" :: '[^0-9 ]' && return 2
   local n=0000 id:.70
   < $Tmp
   while read n - id - - -
   do
      expr " $* " :: " $n " && echo $id
   done
   ><
   return 0
}


Show()  {
   [ -s "$Tmp" ] || return 1
   local n=0000 sz:010 m=- id:.70 sbj=.140 frm:.140
   < $Tmp
   while read n sz id m sbj frm
   do
      prints s3bs9bsbs-33bs-29 $n $sz $m "$sbj" "$frm"
   done
   ><
   return 0
}


while echo "
%t$IP  $Host  $User '$Pass'  $Stat
%tInfo-Liste holen :  i
%t        Loeschen :  l  * | {num | von-bis}...
%t          Halten :  h  {num | von-bis}...
%t         Beenden :  E
%t                    _%b%c"
do
   read Opt Arg
   case "$Opt" in
     i)  Holen; Show ;;
     l|h)
	 ifset Arg || continue
         [ "$Opt" == l -a "$Arg" == '*' ] && Arg="1-$Nmax"
         expr "$Arg" :: '[^0-9 -]' && continue
         expr "$Arg" :: '[^0-9]-' && continue
         expr "$Arg" :: '-[^0-9]' && continue
         Loeschen $Opt $Arg ;;
     U)  User="$Arg";;
     P)  Pass="$Arg";;
     E)  break;;
     *)  continue;;
   esac
done

exit 0





###  pop0.bish  #############################################

#!/u/bin/bish -p

[ $# -eq 1 ] &&
   expr "$1" :: '[?/]' &|
   expr "$1" :: '^-[hH]' && {
 echo " pop.bish [-qQ]
 pop.bish [-qQ] Host
 pop.bish [-qQ] Host User
 pop.bish [-qQ] Host User 'Password'

 Menü+: U user
 Menü+: P pass
 Menü+: B bodylines
 Menü+: C columns
 Menü+: All"
 exit
}

set f

set Z:.512
#Tmp=/tmp/bish_pop3
mktemp Tmp
echo "$Tmp"
Nmax=00000
Cols=080
Body='       '
Q=0

[ "$1" == -q ] && Q=1 shift
[ "$1" == -Q ] && Q=2 shift
[ $# -gt 0 ] && Host="$1"
[ $# -gt 1 ] && User="$2"
[ $# -gt 2 ] && Pass="$3"
ifset Host || Host="pop.t-online.de"
ifset User || User=.
ifset Pass || Pass=.

hostaddr $Host | {
   [ $? -ne 0 ] && { print -u2 "'$Host'?!"; exit 1; }
   while readl Z
   do
      expr "$Z" :IP '^addr: %([0-9.]%{7,15}%)' && break
   done
}


#file n id
Zapp()  {
   local n=0000
   cat $1 | {
      > $1
      while readl Z
      do
         expr "$Z" :n '%([0-9]%{1,}%)' || { catv Z /%n; continue; }
         let "n!=$2" && { catv Z /%n; continue; }
         catv Z ". $3" /%n
      done
      ><
   }
   return 0
}


Holen()  {
   local c=unknown n=0000 m=- t:9.1
   : > "$Tmp"
   pop3 $Body $IP "$User" "$Pass" | {
      while readl Z
      do
         #ifset Z && conv '-d' Z
         [ Q -eq 0 -o Q -eq 1 -a $c != list -a $c != uidl -a $c != topn ] &&
            catv $Cols,Z /%j
         expr "$Z" =:: '^QUIT$' && c=quit
         expr "$Z" =:: '^STAT$' && c=stat
         expr "$Z" =:: '^LIST$' && c=list
         expr "$Z" =:: '^UIDL$' && c=uidl
         expr "$Z" =:n '^TOP %([0-9]%{1,}%)' && c=topn m=-
         case "$c" in
           stat)  expr "$Z" :Stat '%([0-9]%{1,}  *[0-9]%{1,}%)' ;;
           list)  expr "$Z" :: '^ *[0-9]%{1,}  *[0-9]%{1,} *$' &&
                     catv Z /%n >> "$Tmp"
           ;;
           uidl)  expr "$Z" :: '^ *[0-9]%{1,}  *[!-~]%{1,} *$' &&
                     Zapp "$Tmp" $Z
           ;;
           topn)  expr "$Z" =:Subj '^Subject: %(.*%)$'
                  expr "$Z" =:From '^From: %(..*%)$'
                  expr "$Z" =:: '^Content-Type: text/plain' && m=t
                  expr "$Z" =:: '^Content-Type: text/html' && m=H
                  expr "$Z" =:: '^Content-Type: multipart/' && m=M
                  expr "$Z" :: '^.$' && { c=ende
                     conv "-t _t${t}_" Subj From
                     Zapp "$Tmp" $n "$m $Subj $From"
                  }
           ;;
              *)  : ;;
         esac
      done
   }
   expr "$Stat" :Nmax '%([0-9]%{1,}%)  *[0-9]%{1,}'
   return 0
}


#{l|h}  a b c d-e
Loeschen()  {
   [ $# -lt 2 -o Nmax -lt 1 ] && return 1
   #echo $( MkNs $* )
   #print -ru2 $( GetIDs $( MkNs $* ) )
   GetIDs $( MkNs $* ) | pop3 $IP "$User" "$Pass"
   Nmax=00000
   return $?
}


#{l|h}  a b c d-e
MkNs()  {
   [ $# -lt 2 ] && return 1
   local n:010 nm=00000 nmax=$Nmax lh=$1
   shift
   let 'nmax>0' || return 1
   if [ "$lh" == l ]
   then
      for n in $*
      do
         expr "$n" :: '-' || { echo "$n"; continue; }
         expr "$n" :n '-' = ' to ' || continue
         for n from $n repeat
         do  echo "$n";  done
      done
   else
      for nm from 1 to $nmax repeat
      do
         for n in $*
         do
            expr "$n" :: '-' || { let 'n==nm' && continue 2; continue; }
            expr "$n" :n '-' = ' to ' || continue
            for n from $n repeat
            do
               let 'n==nm' && continue 3
            done
         done
         echo "$nm"
      done
   fi
   return 0
}


# id ...
GetIDs()  {
   [ $# -gt 0 ] || { print -u2 narg le 0; return 1; }
   [ -s "$Tmp" ] || { print -u2 TmpSz eq 0; return 2; }
   expr "$*" :: '[^0-9%t ]' && { print -u2 "wrong arg '$*'"; return 3; }
   local n=00000 id:.70
   < "$Tmp"
   while read n - id - - -
   do
      expr " $* " :: "[ %t]${n}[ %t]" && catv id /%n
   done
   ><
   return 0
}


Show()  {
   [ -s "$Tmp" ] || return 1
   local n=00000 sz:010 m=-
   local ls=31 lf=29
   let 'Cols>80' && let 'lf+=(Cols-80)/2' 'ls+=Cols-80-(lf-29)'
   < "$Tmp"
   while read n sz - m Subj From
   do
      prints s5bs9bsbs-${ls}bs-${lf} $n $sz $m "$Subj" "$From"
   done
   ><
   return 0
}



while prints sf_$Cols
      echo "%t$IP  $Host  $User '$Pass'  n+bsum: $Stat
%tInfo-Liste holen :  i
%t        Loeschen :  l  * | {num | von-bis}...
%t          Halten :  h  {num | von-bis}...
%t         Beenden :  E
%t                    _%b%c"
do
   read Opt Arg
   case "$Opt" in
     i)  Holen; Show ;;
     l|h)
         ifset Arg || continue
         [ "$Opt" == l -a "$Arg" == '*' ] && Arg="1-$Nmax"
         expr "$Arg" :: '[^0-9 -]' && continue
         expr "$Arg" :: '[^0-9]-' && continue
         expr "$Arg" :: '-[^0-9]' && continue
         Loeschen $Opt $Arg || echo ERROR: Args? Info-Liste?
         ;;
     All)
         read "Arg? Alles Löschen?[jJyY]: "
         expr "$Arg" :: '^[jJyY]$' || continue
         pop3 -A $IP "$User" "$Pass" ;;
     U)  User="$Arg";;
     P)  Pass="$Arg";;
     B)  Body="-b$Arg";;
     C)  Cols="$Arg"
         let 'Cols<80' && Cols=80;;
     E)  break;;
     *)  continue;;
   esac
done

remove -s "$Tmp"
exit 0





###  pop3000.bish  #############################################

#!/u/bin/bish

N=3000

Head='Return-Path: <schellong@t-online.de>
Received: from t-online.de (0522284540-0001@[217.0.157.82]) by fwd10.sul.t-online.com
        with esmtp id 183z8r-155vs0C; Tue, 22 Oct 2002 15:32:17 +0200
Message-ID: <3DB55360.8030809@t-online.de>
Date: Tue, 22 Oct 2002 15:32:16 +0200
From: schellong@t-online.de (Helmut Schellong)
User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.1) Gecko/20020925
X-Accept-Language: en-us, en, de
MIME-Version: 1.0
To: Helmut Schellong <schellong@t-online.de>
Subject: Test
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
X-Sender: 0522284540-0001@t-dialin.net

.
'
echo "+OK T-Online POP3 Server fpopd ready.
USER .
+OK Ok.
PASS .
+OK Ok.
STAT
+OK $N $((N*5000))
LIST
+OK $N messages."

for n from 1 to $N repeat
do  echo $n 5000;  done
echo .

echo "UIDL
+OK Ok."
for n from 1 to $N repeat
do  echo $n skdjeof${n}sehhdwlf;  done
echo .

for n from 1 to $N repeat
do
   echo "TOP $n 0%n+OK Ok."
   catv Head
done
echo "QUIT%n+OK closing."




###  proto.bish  #############################################

#!c:\u\bin\bish32.exe


Dir="$(prints s120-)"
F="$(prints s80-)"
liste="$(prints s150-)"
vorne="$(prints s80-)"
funam="$(prints s80-)"
Zeile="$(prints s500-)"


[ $# -lt 1 ] && Dir=.
[ $# -ge 1 ] && Dir="$1"
[ "$Dir" == . ] && Dir=$(pwd)
#expr "$Dir" =:: '[/\]lst$' || Dir="$Dir\lst"
conv -F/F\ Dir
[ -d "$Dir" ] || { echo "Keine Existenz: '$Dir'!"; exit 1; }
cd "$Dir"
echo Verzeichnis: $Dir
: *.c
[ $] -lt 1 ] && { echo "Keine *.c vorhanden!"; exit 1; }



echo "
#if !defined(PROTO_H)
# define PROTO_H
" > _prototypes.h

for F in *.c
do
   echo "%t$F"
   : > c.tmp
   < "$F"
   while readl Zeile
   do
      expr "$Zeile" :: '[ %t*][a-zA-Z_][a-zA-Z_0-9]*(.*)[ %t]*$' && {
         expr "$Zeile" :Zeile '%t' + ' '
         expr "$Zeile" :Zeile '^ *%(..*%)$'
         expr "$Zeile" :Zeile '^%(..*)%) *$'
         print -r "$Zeile" >> c.tmp
	 continue
      }
      expr "$Zeile" :: '[ %t*][a-zA-Z_][a-zA-Z_0-9]*(.*)[ %t]*/[*/].*$' && {
         expr "$Zeile" :Zeile '^%(.*[ %t*][a-zA-Z_][a-zA-Z_0-9]*(.*)%)[ %t]*/[*/].*$'
         expr "$Zeile" :Zeile '%t' + ' '
         expr "$Zeile" :Zeile '^ *%(..*%)$'
         expr "$Zeile" :Zeile '^%(..*)%) *$'
         print -r "$Zeile" >> c.tmp
      }
   done
   ><
   : > c2.tmp
   < c.tmp
   while readl Zeile
   do
      liste= funam= vorne=
      expr "$Zeile" :liste '[ *][a-zA-Z_][a-zA-Z_0-9]*(%(.*%))$' || continue
      expr "$Zeile" :Zeile '^%(.*[ *][a-zA-Z_][a-zA-Z_0-9]*%)(.*)$' || continue
      expr "$Zeile" :funam '[ *]%([a-zA-Z_][a-zA-Z_0-9]*%)$' || continue
      [ "$funam" == if -o %
        "$funam" == for -o %
        "$funam" == while -o %
        "$funam" == do -o %
        "$funam" == switch -o %
        "$funam" == else ] && continue
      expr "$Zeile" :vorne '^%(.*[ *]%)[a-zA-Z_][a-zA-Z_0-9]*$' || continue
      expr "$vorne" :: '[^* %t_a-zA-Z0-9]' && continue
      expr "$vorne" :: '__interrupt' && continue
      expr "$liste" :liste '^  *%(.*%)$'
      expr "$liste" :liste '^%(.*%)  *$'
      expr "$liste" :liste ' %{2,%}' + ' '
      expr "$liste" :liste ', ' + ','
      expr "$liste" :liste ' ,' + ','
      expr "$vorne" :vorne '^  *' ''
      expr "$vorne" :vorne '  *$' ''
      expr "$vorne" :vorne ' %{2,%}' + ' '
      expr "$liste" :liste '%*[][a-zA-Z_0-9]%{1,%}$' '*'
      expr "$liste" :liste ' [][a-zA-Z_0-9]%{1,%}$' ''
      expr "$liste" :liste '%*[][a-zA-Z_0-9]%{1,%},' + '*,'
      expr "$liste" :liste ' [][a-zA-Z_0-9]%{1,%},' + ','
      expr "$liste" :liste ',%([^ %t]%)' + ', %1'
      expr "$liste" :: '[^ %t]' || liste=void
      expr "$vorne" :vorne ' %(%*%{1,%}%)$'  '%1'
      Zeile="$vorne  $funam"
      expr "$Zeile" :Zeile '%*%*  '  '**'
      expr "$Zeile" :Zeile '%*  '  ' *'
      print "%textern $Zeile($liste);" >> c2.tmp
   done
   ><
   cat c2.tmp > c.tmp
   echo "//$F:" >> _prototypes.h
   cat c.tmp >> _prototypes.h
done

echo "
#endif
" >> _prototypes.h

remove c2.tmp c.tmp
read "-?bish:$0: <Enter> "





###  qs.bish  #############################################

#!/u/bin/bish

#Test-Script für quicksort()

echo rand.txt
> rand.txt
to 25000 repeat
do
   echo $RANDOM%n$RANDOM%n$RANDOM%n$RANDOM%n$RANDOM
   echo $RANDOM%n$RANDOM%n$RANDOM%n$RANDOM%n$RANDOM
done
><

echo "rand.txt-->rand.int"
< rand.txt
> rand.int
while readl num
do
   base -10 num +l
done
><<

echo "rand.int-->quicksort()-->rando.int"
qs < rand.int > rando.int

echo "rando.int-->rando.txt"
offs=0
< rando.int
> rando.txt
while catv $offs,4,0 =num:
do
   base -l num +10
   let "offs+=4"
done
><<

echo rand.txt:sort:randoo.txt
sort -b -n < rand.txt > randoo.txt



###  r.bish  #############################################



Z=0000000000000000000000000000000000000000000000000000000000000000000

to 1000000 repeat
do
echo $RANDOM$RANDOM$RANDOM$RANDOM$RANDOM$RANDOM$RANDOM$RANDOM$RANDOM$RANDOM$RANDOM$RANDOM$RANDOM$RANDOM$RANDOM
done




###  rcdat.bish  #############################################


#CR="`echo %r%c`"
#NL="`echo %n%c`"

echo schrift RCDATA PRELOAD PURE
echo BEGIN

for FN in $*
do
   cat $FN | rcdat
done

echo END



###  rcstr.bish  #############################################


#CR="`echo %r%c`"
#NL="`echo %n%c`"

echo STRINGTABLE PURE
echo BEGIN
N=1
echo "$N, %"$#%""

for FN in $*
do
   ((++N))
   NAM=`expr $FN : '.*/%(..*%)%.'`
   expr $FN :: '..*mn[a-zA-Z]$' && {
      rc=`expr $FN : '..*mn%(.%)$'`
      conv -u rc
      NAM="$NAM($rc)"
   }
   echo "$N, %"$NAM%""
   ((++N))
   NZ=`wc -l $FN`
   echo "$N, %"$NZ%""
done

((++N))
for FN in $*
do
   cat $FN | rcstr -$N
   NZ=`wc -l $FN`
   ((N+=NZ))
done

echo END



###  rcstrx.bish  #############################################


#CR="`echo %r%c`"
#NL="`echo %n%c`"

sfn=1
>../bish/manw$sfn.str
echo STRINGTABLE PURE
echo BEGIN
N=1
echo "$N, %"$#%""

for FN in $*
do
   ((N=N+1))
   NAM=`expr $FN : '.*/%(..*%)%.'`
   expr $FN :: '..*mn[a-zA-Z]$' && {
      rc=`expr $FN : '..*mn%(.%)$'`
      conv -u rc
      NAM="$NAM($rc)"
   }
   echo "$N, %"$NAM%""
   ((N=N+1))
   NZ=`wc -l $FN`
   echo "$N, %"$NZ%""
done

((N=N+1))
nn=0
for FN in $*
do
   [ $nn -ge 4000 ] && {
      echo END
      ><
      ((sfn=sfn+1))
      >../bish/manw$sfn.str
      echo STRINGTABLE PURE
      echo BEGIN; nn=0
   }
   cat $FN | rcstr -$N
   NZ=`wc -l $FN`
   ((N=N+NZ ; nn=nn+NZ))
done

echo END
><



###  readv.bish  #############################################



set Z:.250

[ "$1" == v ] && {
   set F:.250000
   catv =F <bish.c
   readv 0,237747,F =Z
   #n=00000 s=000000
   #while readv
   #do let ++n "s+=${#Z}"; done
   #echo $n $s
   to 100 repeat
   do
      readv 0,,F
      while readv
      do
         nop
      done
   done
}

[ "$1" == l ] && {
   to 100 repeat
   do
      <bish.c
      while readl Z
      do
         nop
      done
      ><
   done
}

:




###  reg.bish  #############################################



PSS='soft ug_soll t_ug_s'
PSSK='
   utk ugs_bc ug_max ugs_ub_diff
   ug_strt ug_start
   inh_bc inertia ug_res
   proz_kap proz_kap_s proz_kap_ss
   ilade ilade_s ilade_ss
'
set Z:.300
set F:.50
set N:.50

for F in *.[chCH] ???base.txt
do
   [ -s $F ] || continue
   expr "$F" =:: '^mb.*%.h$' && continue
   expr "$F" =:: '^t' && continue
   print -u2n "%t$F"
   n=0
   cat $F | {
      >$F
      while readl Z
      do
	 ifset Z || { catv /%n; continue; }
         for N in $PSS
         do
	    expr "$Z" :Z '%<PSS%.'"$N"'%>' += "Reg.$N" && let ++n
         done
         for N in $PSSK
         do
	    expr "$Z" :Z '%<PSS%.K%(%[[^][.]%{1,}]%.%)'"$N"'%>' + 'Reg.K%1'"$N" &&
	       let ++n
         done
	 catv Z /%n
      done
      ><
   }
   echo %t$n
done

exit 0

        menu.c  0
        def.h   3
        key.c   0
        init.c  0
        req.c   0
        proto.h 0
        atp.c   0
        maschine.c      56
        cfg.h   0
        bts.c   0
        cfgdata.c       9
        var.c   0
        upc3.c  5
        modem.c 0
        mesz.c  0
        mesdata.c       0
        cfg.c   0
        can.c   0
        uart.c  0
        driver.c        0
        maschine.h      0
        funktion.c      0
        cachefl.c       0
        irptdef.c       0
        cfgdata0.c      9
        cfgdataT.c      0
        mesdata0.c      0
        mesdataT.c      0
        var.h   0
        candev.c        0
        atp.h   0
        mesbase.txt     0
        cfgbase.txt     9





###  rgb.bish  #############################################


> rgb.htm

echo '<html> <head> <title></title> </head>'
echo '<body bgcolor="#ffffff">'
< /u/sc/safe/X/rgbde.txt
#r=000 g=000 b=000
while read cname r g b
do
   #let "r= r<17 ? 17 : r"
   #let "g= g<17 ? 17 : g"
   #let "b= b<17 ? 17 : b"
   #let "r+= (r%16==0 ? 1 : 0)"
   #let "g+= (g%16==0 ? 1 : 0)"
   #let "b+= (b%16==0 ? 1 : 0)"
   R=$((16#, r)) G=$((16#, g)) B=$((16#, b))
   let "${#R}==1" && R="0$R"
   let "${#G}==1" && G="0$G"
   let "${#B}==1" && B="0$B"
   conv -u R G B
   F1= F2=
   let "r+g+b<400" && F1='<font color="#ffffff">' F2='</font>'
   echo "<table bgcolor=%"#$R$G$B%" width=%"67%%%%%" height=%"15%%%%%">%
         <tr><td>%n$F1$cname<br>%
         r=$r g=$g b=$b<br>$R$B$G<br>$F2</td></tr></table>"
done
><
echo '</body>
</html>'

><



###  riso.bish  #############################################

#Spannnungen gemessen am AD-Eingang Uiso in mV
#Ohm   +30V  +40V  +50V  +60V  +70V  +80V       
array R  0 1 5 10 22 50 100 220 500 1000
array A 3296  3569  3850  4123  4400  4668       %
        3283  3551  3828  4096  4368  4631       %
        3234  3485  3744  3995  4250  4497       %
        3179  3412  3652  3885  4121  4349       %
        3077  3275  3479  3676  3877  4071       %
        2927  3073  3223  3369  3517  3659       %
        2790  2889  2992  3090  3190  3287       %
        2661  2716  2772  2827  2883  2936       %
        2575  2600  2627  2652  2678  2703       %
        2535  2546  2559  2570  2582  2593  
#Ohm   -30V  -40V  -50V  -60V  -70V  -80V
array B 1702  1430  1151   882   610   344  %
        1715  1449  1173   908   639   380  %
        1763  1513  1255  1006   754   510  %
        1816  1583  1343  1112   878   652  %
        1916  1717  1512  1315  1115   921  %
        2062  1914  1760  1612  1436  1318  %
        2196  2093  1986  1884  1779  1679  %
        2322  2262  2199  2139  2078  2016  %
        2406  2374  2341  2309  2277  2246  %
        2446  2426  2408  2389  2370  2352

n=000
N=000
for V  in  p30 p40 p50 p60 p70 p80
do
   let n=++N
   for i from 1 to 10 repeat
   do
      $V$i="$A[n]"
      let "n+=6"
   done
done

N=0
for V  in  m30 m40 m50 m60 m70 m80
do
   let n=++N
   for i from 1 to 10 repeat
   do
      $V$i="$B[n]"
      let "n+=6"
   done
done

for V  in  m80 m70 m60 m50 m40 m30 p30 p40 p50 p60 p70 p80
do
   >$V.xy
   for i from 1 to 10 repeat
   do
      s=
      O=$V$i
      O=${{O}
      let "O-=2500"
      O=`calc "50000/$O"`
      expr "$O" :: '^-' && s=-
      echo "$O%t$s$R[i]"
   done
   ><
done




###  rpar.bish  #############################################

#!/u/bin/bish

set -f
ARITH_FMT='%.9Lg'
# r= (10^(1/24))^n ; n=0..23..
 E6='1.0 1.5 2.2 3.3 4.7 6.8'
E12='1.0 1.2 1.5 1.8 2.2 2.7 3.3 3.9 4.7 5.6 6.8 8.2'
E24='1.0 1.1 1.2 1.3 1.5 1.6 1.8 2.0 2.2 2.4 2.7 3.0
     3.3 3.6 3.9 4.3 4.7 5.1 5.6 6.2 6.8 7.5 8.2 9.1'
E48='1.00 1.05 1.10 1.15 1.21 1.27 1.33 1.40 1.47 1.54 1.62 1.69
     1.78 1.87 1.96 2.05 2.15 2.26 2.37 2.49 2.61 2.74 2.87 3.01
     3.16 3.32 3.48 3.65 3.83 4.02 4.22 4.42 4.64 4.87 5.11 5.36
     5.62 5.90 6.19 6.49 6.81 7.15 7.50 7.87 8.25 8.66 9.09 9.53'
E96='1.00 1.02 1.05 1.07 1.10 1.13 1.15 1.18 1.21 1.24 1.27 1.30
     1.33 1.37 1.40 1.43 1.47 1.50 1.54 1.58 1.62 1.65 1.69 1.74
     1.78 1.82 1.87 1.91 1.96 2.00 2.05 2.10 2.15 2.21 2.26 2.32
     2.37 2.43 2.49 2.55 2.61 2.67 2.74 2.80 2.87 2.94 3.01 3.09
     3.16 3.24 3.32 3.40 3.48 3.57 3.65 3.74 3.83 3.92 4.02 4.12
     4.22 4.32 4.42 4.53 4.64 4.75 4.87 4.99 5.11 5.23 5.36 5.49
     5.62 5.76 5.90 6.04 6.19 6.34 6.49 6.65 6.81 6.98 7.15 7.32
     7.50 7.68 7.87 8.06 8.25 8.45 8.66 8.87 9.09 9.31 9.53 9.76'
E=24 Tol=0.3 Zeilen=12
Beg=10.0 End=1e6
Del='1e6
'


Err()  { print -u2 "$1"; exit 1; }

k='${#E'"$E"'}'
eval k=$k
[ -z "$k" -o k -lt 11 ] && Err "Falsche E-Reihe: E$E"


FillBuf()  {
   local er=... r=.... r0=0000 f=0 lg:025 sf:025
   local c:08 o:08 n:08 fak:025
   local sz=$(typeset -F)
   typeset -f a zero
   let "Beg<1.0" && Err "Startwert<1: $Beg"
   let "Beg>=End" && Err "Startwert>=Endwert: $Beg $End"
   [ E -eq $1 ] && return 0
   [ $1 -gt 0 ] && E=$1
   er=E$E  : ${{er}} ; n=$,
   [ n -ne E ] && Err "Falsche Anzahl Werte $er: $n"
   let "fak=pow(10.0,1.0/E), r0=1.0/fak"
   for r in ${{er}}
   do
      let "r<1.0" && Err "$er-Wert < 1: $r"
      let "r>a" || Err "$er-Wert nicht streng monoton steigend: $r"
      let "r/r0>fak*1.05||r/r0<fak/1.05" &&
          Err "$er-Wert-Faktor vom Vorwert her unpassend: $r/$r0"
      a=$r r0=$r
      [ f -eq 1 ] && continue
      let "lg=log10(End/r)" "lg-trunc(lg)>0.0" && continue
      f=1
   done
   [ f -ne 1 ] && Err "Endwert unpassend: $End"
   f=0
   for r in ${{er}}
   do
      let "r<1.0" && Err "$er-Wert < 1: $r"
      [ f -eq 1 ] && continue
      let "lg=log10(Beg/r)" "lg-trunc(lg)>0.0" && continue
      let "sf=Beg/r"
      f=1 echo Startwert-Faktor: $sf
   done
   [ f -ne 1 ] && Err "Startwert unpassend: $Beg"
   set BUF:32.$(( llround(ceil(log10(End/Beg))*E*sz+E*sz) ))
   n=${#BUF}
   echo "Puffergroesse: $n"
   echo "Puffergroesse: $((n/sz)) Einträge"
   f=0 o=0
   while :
   do
      for r in ${{er}}
      do
         let "a=sf*r"
         if [ f -eq 1 ]
         then  catv a =o,sz,BUF
         else  let "a!=Beg" && continue
               f=1 catv a =o,sz,BUF
         fi
         let "o+=sz" "a==End" || continue
         let "n=o/sz"
         break 2
      done
      let "sf*=10"
   done
   N=$n
   echo "Einträge: $n"
   Del=$Del
   [ -z "$Del" ] && return 0
   c=0
   for o from 0 by $sz to $((n*sz-sz)) repeat
   do
      catv o,sz,BUF =a
      for r in $Del
      do
         let "a!=r" && continue
         catv zero =o,sz,BUF
         let "++c"
      done
   done
   echo "Pufferwerte gelöscht: $c"
   set BUFC:32.${#BUF}
   catv BUF =BUFC
   c=0
   for o from 0 by $sz to $((n*sz-sz)) repeat
   do
      catv o,sz,BUFC =a
      let "a<1.0" && continue
      catv a =c,sz,BUF ; let "c+=sz"
   done
   let "N=c/sz"
   echo "Einträge: $N"
   return 0
}

FillBuf -1

GetRpar()  {
   local o:08 oa:08 ob:08 oc:08 m:025 t:08 f=0
   local sz=$(typeset -F)
   typeset -f a b c v zp zm ziel=$1
   let "t=N*sz-sz"
   let "zp=ziel*(1.0+Tol/100.0)" "zm=ziel*(1.0-Tol/100.0)"
   for o from 0 by $sz to $t repeat
   do
      catv o,sz,BUF =v
      let "v>=ziel" && { f=1; break; }
   done
   [ f -ne 1 ] && return 1
   for oa from $o by $sz to $t repeat
   do
      catv oa,sz,BUF =v
      if let "v<=zp&&v>=zm"
      then
         let "m=fabs(v/ziel-1.0), m=llround(m*1e6)"
         echo "%t1 $m # $ziel : $v = $v"
      fi
   done
   for oa from $o by $sz to $t repeat
   do
      catv oa,sz,BUF =a
      for ob from $o by $sz to $t repeat
      do
         catv ob,sz,BUF =b
         let "a==ziel||b==ziel" && break 2
         let "a>b" && continue
         let "v=rpar2(a,b)"
         if let "v<=zp&&v>=zm"
         then
            let "m=fabs(v/ziel-1.0), m=llround(m*1e6)"
            echo "%t2 $m # $ziel : $v = $a|$b"
         fi
      done
   done
   for oa from $o by $sz to $t repeat
   do
      catv oa,sz,BUF =a
      for ob from $o by $sz to $t repeat
      do
         catv ob,sz,BUF =b
         let "a>b" && continue
         for oc from $o by $sz to $t repeat
         do
            catv oc,sz,BUF =c
            let "a==ziel||b==ziel||c==ziel" && break 3
            let "a>c||b>c" && continue
            let "v=rpar3(a,b,c)"
            if let "v<=zp&&v>=zm"
            then
               let "m=fabs(v/ziel-1.0), m=llround(m*1e6)"
               echo "%t3 $m # $ziel : $v = $a|$b|$c"
            fi
         done
      done
   done
   return 0
}


Results()  {
   local zln=$Zeilen ap0=0 ap=0
   local ppm:010 ziel:025 val:025 pr:.40
   GetRpar "$1" | sortl -fn1,n2 | {
      while read ap ppm - ziel - val - pr
      do
         [ ap -ne ap0 ] && { ap0=$ap zln=$Zeilen; echo; }
         [ zln -eq 0 ] && continue
         expr "$pr" :pr '%.0%([^0-9]%)' + '%1'
         expr "$pr" :pr '%.0$' = ''
         expr "$pr" :pr '|' += ' | '
         prints s12bsbs9bsbs-12bsbs $ppm : $ziel : $val = "$pr"
         let "--zln"
      done
   }
   return 0
}


local z=000 e=000 t=000000
prints vs-2 z $Zeilen
prints vs-2 e $E
prints vs-4 t $Tol

while echo "
%tStartwert=$Beg  Endwert=$End
%tReihe=E$e    : e#    (e6 e12 e24 e48 e96)
%tZeilen=$z    : z #
%tToleranz=$t: t #
%tZielwert     : zahl  (123 12.3 12e3 ...)
%tBeenden      : E
%t             : _%b%c"
do
   read cmd arg
   case "$cmd" in
      e6)  FillBuf  6;;
     e12)  FillBuf 12;;
     e24)  FillBuf 24;;
     e48)  FillBuf 48;;
     e96)  FillBuf 96;;
       z)  expr "$arg" :: '[1-9][0-9]*' || { echo '%a%c'; continue; }
           Zeilen=$arg;;
       t)  expr "$arg" :: '[0-9][0-9.]*' || { echo '%a%c'; continue; }
           Tol=$arg;;
     [0-9]*)  Results "$cmd";;
       E)  break;;
       *)  echo '%a%c'; continue;;
   esac
   prints vs-2 z $Zeilen
   prints vs-2 e $E
   prints vs-4 t $Tol
done

:




###  rpar0.bish  #############################################

#!/u/bin/bish

set -f
ARITH_FMT='%.9Lg'
# r= (10^(1/24))^n ; n=0..23..
 E6='1.0 1.5 2.2 3.3 4.7 6.8'
E12='1.0 1.2 1.5 1.8 2.2 2.7 3.3 3.9 4.7 5.6 6.8 8.2'
E24='1.0 1.1 1.2 1.3 1.5 1.6 1.8 2.0 2.2 2.4 2.7 3.0
     3.3 3.6 3.9 4.3 4.7 5.1 5.6 6.2 6.8 7.5 8.2 9.1'
E48='1.00 1.05 1.10 1.15 1.21 1.27 1.33 1.40 1.47 1.54 1.62 1.69
     1.78 1.87 1.96 2.05 2.15 2.26 2.37 2.49 2.61 2.74 2.87 3.01
     3.16 3.32 3.48 3.65 3.83 4.02 4.22 4.42 4.64 4.87 5.11 5.36
     5.62 5.90 6.19 6.49 6.81 7.15 7.50 7.87 8.25 8.66 9.09 9.53'
E96='1.00 1.02 1.05 1.07 1.10 1.13 1.15 1.18 1.21 1.24 1.27 1.30
     1.33 1.37 1.40 1.43 1.47 1.50 1.54 1.58 1.62 1.65 1.69 1.74
     1.78 1.82 1.87 1.91 1.96 2.00 2.05 2.10 2.15 2.21 2.26 2.32
     2.37 2.43 2.49 2.55 2.61 2.67 2.74 2.80 2.87 2.94 3.01 3.09
     3.16 3.24 3.32 3.40 3.48 3.57 3.65 3.74 3.83 3.92 4.02 4.12
     4.22 4.32 4.42 4.53 4.64 4.75 4.87 4.99 5.11 5.23 5.36 5.49
     5.62 5.76 5.90 6.04 6.19 6.34 6.49 6.65 6.81 6.98 7.15 7.32
     7.50 7.68 7.87 8.06 8.25 8.45 8.66 8.87 9.09 9.31 9.53 9.76'
E=24 Tol=0.3 Zeilen=12
Beg=10.0 End=1e6
Del='1e6
'


Err()  { print -u2 "$1"; exit 1; }

k='${#E'"$E"'}'
eval k=$k
[ -z "$k" -o k -lt 11 ] && Err "Falsche E-Reihe: E$E"


FillBuf()  {
   local er=... r=.... r0=0000 f=0 lg:025 sf:025 a:025
   local lz:32.20 c:08 o:08 n:08 fak:025
   let "Beg<1.0" && Err "Startwert<1: $Beg"
   let "Beg>=End" && Err "Startwert>=Endwert: $Beg $End"
   [ E -eq $1 ] && return 0
   [ $1 -gt 0 ] && E=$1
   er=E$E  : ${{er}} ; a=$,
   [ a -ne E ] && Err "Falsche Anzahl Werte $er: $a"
   a=0.0 let "fak=pow(10.0,1.0/E), r0=1.0/fak"
   for r in ${{er}}
   do
      let "r<1.0" && Err "$er-Wert < 1: $r"
      let "r>a" || Err "$er-Wert nicht streng monoton steigend: $r"
      let "r/r0>fak*1.05||r/r0<fak/1.05" &&
          Err "$er-Wert-Faktor vom Vorwert her unpassend: $r/$r0"
      a=$r r0=$r
      [ f -eq 1 ] && continue
      let "lg=log10(End/r)" "lg-trunc(lg)>0.0" && continue
      f=1
   done
   [ f -ne 1 ] && Err "Endwert unpassend: $End"
   f=0
   for r in ${{er}}
   do
      let "r<1.0" && Err "$er-Wert < 1: $r"
      [ f -eq 1 ] && continue
      let "lg=log10(Beg/r)" "lg-trunc(lg)>0.0" && continue
      let "sf=Beg/r"
      f=1 echo Startwert-Faktor: $sf
   done
   [ f -ne 1 ] && Err "Startwert unpassend: $Beg"
   set BUF:32.$(( llround(ceil(log10(End/Beg))*E*20+E*20) ))
   a=${#BUF}
   echo "Puffergroesse: $a"
   echo "Puffergroesse: $((a/20)) Einträge"
   f=0 o=0
   while :
   do
      for r in ${{er}}
      do
         let "a=sf*r"
         if [ f -eq 1 ]
         then  catv a =o,20,BUF
         else  let "a!=Beg" && continue
               f=1 catv a =o,20,BUF
         fi
         let "o+=20" "a==End" || continue
         let "n=o/20"
         break 2
      done
      let "sf*=10"
   done
   N=$n
   echo "Einträge: $n"
   Del=$Del
   [ -z "$Del" ] && return 0
   c=0
   for o from 0 by 20 to $((n*20-20)) repeat
   do
      catv o,20,BUF =a:
      a=$a
      for r in $Del
      do
         let "a!=r" && continue
         catv lz =o,20,BUF
         let "++c"
      done
   done
   echo "Pufferwerte gelöscht: $c"
   set BUFC:32.${#BUF}
   catv BUF =BUFC
   c=0
   for o from 0 by 20 to $((n*20-20)) repeat
   do
      catv o,20,BUFC =a:
      catv 1,a =f:
      [ "$f" = ' ' ] && continue
      catv a =c,20,BUF ; let "c+=20"
   done
   let "N=c/20"
   echo "Einträge: $N"
   return 0
}

FillBuf -1

GetRpar()  {
   local o:08 oa:08 ob:08 oc:08 a:025 b:025 c:025
   local ziel=$1 v:025 m:025 zp:025 zm:025 t:08 f=0
   let "t=N*20-20"
   let "zp=ziel*(1.0+Tol/100.0)" "zm=ziel*(1.0-Tol/100.0)"
   for o from 0 by 20 to $t repeat
   do
      catv o,20,BUF =v: ; v=$v
      let "v>=ziel" && { f=1; break; }
   done
   [ f -ne 1 ] && return 1
   for oa from $o by 20 to $t repeat
   do
      catv oa,20,BUF =a: ; v=$a
      if let "v<=zp&&v>=zm"
      then
         let "m=fabs(v/ziel-1.0), m=llround(m*1e6)"
         echo "%t1 $m # $ziel : $v = $v"
      fi
   done
   for oa from $o by 20 to $t repeat
   do
      catv oa,20,BUF =a: ; a=$a
      for ob from $o by 20 to $t repeat
      do
         catv ob,20,BUF =b: ; b=$b
         let "a==ziel||b==ziel" && break 2
         let "a>b" && continue
         let "v=rpar2(a,b)"
         if let "v<=zp&&v>=zm"
         then
            let "m=fabs(v/ziel-1.0), m=llround(m*1e6)"
            echo "%t2 $m # $ziel : $v = $a|$b"
         fi
      done
   done
   for oa from $o by 20 to $t repeat
   do
      catv oa,20,BUF =a: ; a=$a
      for ob from $o by 20 to $t repeat
      do
         catv ob,20,BUF =b: ; b=$b
         let "a>b" && continue
         for oc from $o by 20 to $t repeat
         do
            catv oc,20,BUF =c: ; c=$c
            let "a==ziel||b==ziel||c==ziel" && break 3
            let "a>c||b>c" && continue
            let "v=rpar3(a,b,c)"
            if let "v<=zp&&v>=zm"
            then
               let "m=fabs(v/ziel-1.0), m=llround(m*1e6)"
               echo "%t3 $m # $ziel : $v = $a|$b|$c"
            fi
         done
      done
   done
   return 0
}


Results()  {
   local zln=$Zeilen ap0=0 ap=0
   local ppm:010 ziel:025 val:025 pr:.40
   GetRpar "$1" | sortl -fn1,n2 | {
      while read ap ppm - ziel - val - pr
      do
         [ ap -ne ap0 ] && { ap0=$ap zln=$Zeilen; echo; }
         [ zln -eq 0 ] && continue
         expr "$pr" :pr '%.0%([^0-9]%)' + '%1'
         expr "$pr" :pr '%.0$' = ''
         expr "$pr" :pr '|' += ' | '
         prints s12bsbs9bsbs-12bsbs $ppm : $ziel : $val = "$pr"
         let "--zln"
      done
   }
   return 0
}


local z=000 e=000 t=000000
prints vs-2 z $Zeilen
prints vs-2 e $E
prints vs-4 t $Tol

while echo "
%tStartwert=$Beg  Endwert=$End
%tReihe=E$e    : e#    (e6 e12 e24 e48 e96)
%tZeilen=$z    : z #
%tToleranz=$t: t #
%tZielwert     : zahl  (123 12.3 12e3 ...)
%tBeenden      : E
%t             : _%b%c"
do
   read cmd arg
   case "$cmd" in
      e6)  FillBuf  6;;
     e12)  FillBuf 12;;
     e24)  FillBuf 24;;
     e48)  FillBuf 48;;
     e96)  FillBuf 96;;
       z)  expr "$arg" :: '[1-9][0-9]*' || { echo '%a%c'; continue; }
           Zeilen=$arg;;
       t)  expr "$arg" :: '[0-9][0-9.]*' || { echo '%a%c'; continue; }
           Tol=$arg;;
     [0-9]*)  Results "$cmd";;
       E)  break;;
       *)  echo '%a%c'; continue;;
   esac
   prints vs-2 z $Zeilen
   prints vs-2 e $E
   prints vs-4 t $Tol
done

:




###  ru.bish  #############################################



<TDSru.htm
while readl Z
do
   #expr "$Z" :: '&[a-zA-Z0-9#]%{1,};' || continue
   while expr "$Z" :U '&%([a-zA-Z0-9#]%{2,}%);'
   do
      expr "$Z" :Z '&[a-zA-Z0-9#]%{1,};' = ''
      echo "$U"
   done
done
><




###  rxtx.bish  #############################################

#!./bish_folso_cgi -p_


set -f

[ $# -eq 0 ] && {
   #cd /home/cie/wms/cgi
   ../adm/rxtx.bish run &
   exit 0
}


#set -o close -o sid
#[ -t 0 ] && 0<&t0
#[ -t 1 ] && 1>&t0
#[ -t 2 ] && 2>&t0
0<&-
1>&-
2>&-
set -o sid
0</dev/null
1>/dev/null
2>/dev/null

#------------------------------------------------------------------------
BuildCT()  {
   [ -s $Fstation  ] || return 0
   local gid=0000 aid=0000 day=00000000
   local time:010 atim:010 btim:010 ctim:010 cttim:016 dir:.20
   systime time
   echo BuildCT
   Lock lockdb
   > $Fconntest
   < $Fstation
   while read gid aid -
   do
      dir=$Ddb/$gid/$aid
      [ -s $dir/i ] || continue
      day="$(- grep -m "^$Cid " $dir/i )" || continue
      expr "$day" :day '^[0-9]%{1,} %([0-9]%{1,}%)' || day=0
      [ day -eq 0 ] && { remove -s $dir/conn; continue; }
      atim=0 btim=0 ctim=0
      [ -f $dir/conn ] && fstat -mv atim $dir/conn
      [ -s $dir/conn ] && catv 10,3 =btim: 3< $dir/conn
      [ atim -ne 0 ] && let "ctim=atim+day*spDay"
      [ atim -eq 0 ] && let "ctim=time, time+=60*5"
      [ atim -ne 0 -a ctim -ne btim -o atim -eq 0 ] && {
         ctime cttim $ctim
         catv ctim '. ' cttim > $dir/conn
         fstat +m $atim $dir/conn
      }
      catv gid '. ' aid '. ' ctim '. ' day '. 0' /%n
   done
   ><<
   Lock lockdb del
   [ -s $Fconntest ] && sortl '-d ' -f3n,4n,1n,2n -o$Fconntest $Fconntest
   [ CTbuild -ne 0 ] && CTbuild=0 Uvars CTbuild
   NextCT build
   return 0
}


NextCT()  {
   local _gid=0000 _aid=0000 _tim:010 _day=0000 _try=00
   local gid=0000 aid=0000 tim:010 day=0000 try=00
   let "tim=16#7fffffff"
   [ -e $Fconntest ] || : > $Fconntest
   < $Fconntest
   while read _gid _aid _tim _day _try
   do
      [ _tim -lt tim ] || continue
      gid=$_gid aid=$_aid tim=$_tim day=$_day try=$_try
      [ "$1" == build ] && break
   done
   ><
   let "tim==16#7fffffff" && tim=-1
   [ "$CTgid"  != "$gid" ] && CTgid=$gid  Uvars CTgid
   [ "$CTaid"  != "$aid" ] && CTaid=$aid  Uvars CTaid
   [ "$CTtime" != "$tim" ] && CTtime=$tim Uvars CTtime
   [ "$CTday"  != "$day" ] && CTday=$day  Uvars CTday
   echo NextCT: $gid $aid $tim $day $try
   return 0
}


# full|try|okay
WriteCT()  {
   local ctim:010 cttim:016 calc:030 dir=$Ddb/$CTgid/$CTaid
   [ -d "$dir" ] || return
   systime ctim
   case "$1" in
     full)  let "ctim+=CTday*spDay"
            calc='++try' ;;
     okay)  let "ctim+=CTday*spDay"
            calc='try=0' ;;
     try)   let "ctim+=5*60"
            calc='++try' ;;
   esac
   ctime cttim $ctim
   catv ctim '. ' cttim > $dir/conn

   local gid=0000 aid=0000 tim:010 day=0000 try=00 tnam=....
   [ -s $Fconntest ] || return
   cat $Fconntest | {
      > $Fconntest
      while read gid aid tim day try
      do
         tnam=tim
         [ gid -eq CTgid -a aid -eq CTaid ] && tnam=ctim let "$calc"
         catv gid '. ' aid '. ' $tnam '. ' day '. ' try /%n
      done
      ><
   }
   return 0
}


# Buf
GetTryCT()  {
   $1=0
   [ -s $Fconntest ] || return
   local try:0100 gid=0000 aid=0000
   let "gid=CTgid, aid=CTaid"
   try="$(- grep -m "^$gid $aid " $Fconntest )" || return
   expr "$try" :try ' %([0-9]%{1,}%)[^0-9]*$' || return
   $1=$try
   return 0
}


FailCT()  {
   local tim:010 sz:010 msg
   [ -e $MUdir/fail ] && {
      fstat -smvT sz tim $MUdir/fail
      msg="Has exist before:size=$sz:time=$tim: "
   }
   catv msg '.Connect test failed:' MUdir /: AnrufZ /%n >> $MUdir/fail
   return 0
}


SetVarsCT()  {
   local dir=$Ddb/$CTgid/$CTaid
   Lock lockdb
   GetIval Telnu $Fid "$dir" || { Lock lockdb del; return 1; }
   Lock lockdb del
   CkTelnu "$Telnu" || return
   MUdir=$dir
   return 0
}


# $adir/i $sernum
CkSetSernum()  {
   local id=0000 sern=$2 buf:.40
   ifset sern || return
   Lock lockdb
   buf=$( grep -m "^$Sid " $1 ) || { Lock lockdb del; return 1; }
   expr "$buf" :buf ' %([^ ].*%)$' || buf=
   cmpv sern buf && { Lock lockdb del; return 1; }
   cat $1 | {
      > $1
      while read id Hbuf
      do
         [ id -eq Sid ] && Hbuf=$sern
         catv id '/ ' Hbuf /%r%n
      done
      ><
   }
   Lock lockdb del
   return 0
}


# $Fmustatus
MUkategorie_c()  {
   local a=. c=. stat:.16 sern:.16 nam:.20 inh:.40
   < $1
   while read - - - nam inh
   do
      [ -n "$a" -a "$nam" == Sernum  ] && a= sern=$inh
      [ -n "$a" -a "$nam" == SN:     ] && a= sern=$inh
      [ -n "$c" -a "$nam" == Station ] && c= stat=$inh
      [ -z "$a$c" ] && break
   done
   ><
   conv '-t` ' stat sern
   stat=$stat
   [ -z "$a" -a -s $MUdir/i ] && CkSetSernum $MUdir/i "$sern"
   return 0
}

# \r\nState: OKAY\r\n
# \r\nState: FAIL\r\n
# 0\t0\t-\t-\t\-\n
# 65535\t0\t-\t-\t\-\n
# \r\n<EEDATA>\r\n
# \r\n</EEDATA>\r\n

# $Fokayfail
OkayFail()  {
   local a=. b=. c=. d=.
   local sk=00000 ask=00000 bsk=00000 mdsk=00000
   local okfa=...... stat:.16 sern:.16 dati:.50
   local gid=0000 aid=00000 adir:.20
   [ ! -s "$1" -o ! -s "$Fstation" ] && {
      WrLog "»$1«, »$Fstation«" "File state"; return 1; }
   < $1
   while seek + 0 sk; readl Hbuf
   do
      ifset Hbuf || continue
      expr "$Hbuf" :: '^<EEDATA>$' && { seek + 0 mdsk; break; }
      [ "$ask" == 00000 ] && expr "$Hbuf" :: '^0%t0%t-%t-%t-$' && ask=$sk
      [ "$bsk" == 00000 ] && expr "$Hbuf" :: '^65535%t0%t-%t-%t-$' && seek + 0 bsk
      [ -z "$a$b$c$d" ] && continue
      ifset a && expr "$Hbuf" :sern 's%tSernum%t%(.*%)$' && a=
      ifset a && expr "$Hbuf" :sern 's%tSN:%t%(.*%)$' && a=
      ifset b &&
         expr "$Hbuf" :dati 's%t-%t%a%{2,},`*%([0-9.]%{8,}``*[0-9:]%{8,}%)' && b=
      ifset b && expr "$Hbuf" :dati ' %([0-9.]%{8,}  *[0-9:]%{8,}%)' && b=
      ifset c && expr "$Hbuf" :stat 's%tStation%t%(.*%)$' && c=
      ifset c && expr "$Hbuf" :stat 'Station: *"%([^"]%{1,}%)"' && c=
      ifset d && expr "$Hbuf" :okfa '^State: %(%u%{4}%)$' && d=
      ifset d && expr "$Hbuf" :okfa 'State: *%(%w%{2,}%)' && d=
   done
   ><
   echo $ask $bsk $mdsk
   conv '-t` ' dati stat
   stat=$stat
   [ -n "$d$c" ] && {
      WrLog "System: »unknown«" "Assignment impossible"
      return 1
   }
   Lock lockdb
   #Hbuf="$(- grep -m "^[0-9]%{1,4} [0-9]%{1,4} $stat%$" $Fstation )"
   < $Fstation
   while read gid aid Hbuf
   do
      ifset Hbuf || continue
      cmpv Hbuf stat && adir="$Ddb/$gid/$aid" break
   done
   ><
   Lock lockdb del
   [ -d "$adir" ] || {
      WrLog "Not exists: »$adir«" "Assignment impossible"
      return 1
   }
   expr "$okfa" :: '^[Oo][Kk]' && : > $adir/okay
   expr "$okfa" :: '^[Ff][Aa]' && {
      if [ -s $adir/fail ]
      then
         systime -t Hbuf
         catv Hbuf '/: FAIL message%n' >> $adir/fail
      else
         : > $adir/fail
      fi
   }
   [ "$ask" != 00000 -a "$bsk" != 00000 -a bsk -gt ask ] &&
      catv $ask,$((bsk-ask)),0  < $1 | tr ' ' '`' > $adir/stat
   [ mdsk -gt 0 ] && [ ! -e $adir/lock -o ! -s $adir/eepr  ] && {
      fstat -sv sk $1
      let "sk<mdsk+2048+13" && {
         WrLog "Incoming data" "Config data wrong size" $adir/log; return 0; }
      catv $mdsk,2061,0 =Ibuf  < $1
      catv 2048,13,Ibuf =Hbuf:
      expr "$Hbuf" :: '^%r%n</EEDATA>%r%n$' || {
         WrLog "Incoming data" "Config data wrong </end>" $adir/log; return 0; }
      catv 0,2,Ibuf =ask:
      base -w ask +10 ask
      mucrc bsk Ibuf 2 1898 || bsk=99999
      [ bsk -ne ask ] &&
         WrLog "Incoming config data" "CRC $ask:$bsk" $adir/log
      catv 0,2048,Ibuf  > $adir/eepr
   }
   [ -z "$a" -a -s $adir/i ] && CkSetSernum $adir/i "$sern"
   return 0
}


# Hbuf
GetMOmsgNr()  {
   local word="${{1}" ifs="$IFS" nr=0000 mnu=0000 msg:.40
   IFS="$RN"
   for word in $word
   do
      IFS="$ifs"
      for 2 msg nr  in  OK 1 'CONNECT *' 2 'CARRIER *' 2 RING 4 ERROR 8 BUSY 16 %
                   'NO CARRIER' 32 'NO DIALTONE' 64 'NO DIAL TONE' 64 %
                   'NO ANSWER' 128 'DIAL LOCKED' 256 'NO MORE DIAL%{1,2}ING' 256 %
                   'DELAYED *' 512 'PROTOCOL[ :]*' 2 'COMPRESSION[ :]*' 2
      do
         expr "$word" :: "^$msg" && let "mnu|=nr"
      done
   done
   IFS="$ifs"
   [ mnu -ne 0 ] && $1=$mnu return 0
   return 1
}



WriteAT()  {
   [ $# -lt 1 ] && return 1
   local c=. ato=-0001 sec=005 msec=700 msg=00 t:010
   if expr "$1" :: 'AT&F'
   then  local ats="$1 $MOinitapp "
   else  local ats="$1 "
   fi
   expr "$ats" :ats '[^!-~]%{1,}' += ' '
   local wr="$ats  "
   local hbuf="$wr"
   wr=
   catv "/'" ats "/'%j"
   while catv $((++ato)),1,ats =c:
   do
      expr "$c" :: '[ %%]' || wr="$wr$c" continue
      [ "$c" == ' ' ] && {
         expr "$wr" :: '+++$' || wr="$wr$RN"
         com -cot20od10o${#wr} wr
         wr=  t=$SECONDS
         while let "$SECONDS-t <= sec"
         do
            #sem -g$SemSigbish && WebServer
            com -p || { sleep -m $msec; continue; }
            com -it300id15i100 Ibuf
            catv $.,Ibuf =Hbuf:
            expr "$Hbuf" :Hbuf '[ %t%r%n]%{1,}$' = ''
            expr "$Hbuf" :Hbuf '[%r%n]%{1,}' += "$RN"
            hbuf="$Hbuf"
            expr "$hbuf" :hbuf '%r%n' += "\r\n"
            catv '/(' hbuf '/)%j'
            [ msg -eq 0 ] && continue 2
            GetMOmsgNr Hbuf || continue
            [ Hbuf -ge 8 ] && return 1
            let "msg&Hbuf" || return 3
            continue 2
         done
         com -ct20od10o2 RN
         com -it300id15i70 Ibuf
         [ $. -gt 0 ] && catv '/((' $.,Ibuf '/))%j'
         [ msg -ne 0 ] && { print -u2 TIMEOUT; return 2; }
         continue
      }
      catv $((++ato)),1,ats =c:
      expr "$c" :: '[%%dpt0COT]' || wr="$wr$c" continue
      [ "$c" == '%' ] && wr="$wr$c" continue
      case "$c" in
        d)  sleep 1 ;;
        p)  sleep -m 250 ;;
        t)  catv $((++ato)),,ats =ats:
            ato=-1
            expr "$ats" :sec '^%([0-9]%{1,}%)' || sec=1
            expr "$ats" :ats '^[0-9]%{1,}' = ''
            let "sec>=1000" && let "sec=(sec+500)/1000"
            let "sec>=100" && sec=1
            let "sec<1" && sec=1
            msec=700
            [ sec -lt 4 ] && let "msec=sec*200"
            ;;
        0)  msg=0 ;;
        C)  msg=2 ;;
        O)  msg=1 ;;
        T)  [ $# -lt 2 ] && return 1
            expr "$2" :: '^[TP]' || wr="$wr$TPwahl"
            wr="$wr$2"
            ;;
      esac
   done
   return 0
}


#Print_uart("\r\nMU1000C  --  Station: \"%s\"\r\n", Modem.station);
#Print_uart("%s, %0*u.%0*u.%0*u   %02u:%02u:%02u\r\n",
#\r\nMU1000C  --  Station: "station"\r\n
#\r\nState: OKAY\r\n
#\r\nState: FAIL\r\n
#Anrufber.:
#PASSWORD: PASSWORD OK EN:
#@DK40mopas
MUanrufen()  {
   local telnu=$1 ch=00 offs=00000 cksum:010 ring="RING$RN.........."
   while :
   do
   case $AnrufZ in
     dialout)
        [ MOwahl -eq 0 ] && AnrufZ=getdata continue
        let "$SECONDS-DOtime<=40" && { sleep 2; continue; }
        WriteAT "$MOdialout" "$telnu" || DOtime=$SECONDS break
        AnrufZ=waitpass TOsec=$SECONDS DOtime=0
     ;;
     waitpass)
        let "$SECONDS-TOsec>10" && break
        com -p || return 0
        AnrufZ=pass
     ;;
     pass)
        com -it400id15i1000 Ibuf
        catv $.,Ibuf =Hbuf:
        catv Hbuf
        expr "$Hbuf" =:: 'PASSWORD:' || break
        ring="@DK40mopas"
        com -cot50od10o10 ring
        sleep -m 150
        com -ocot30od10o2 RN
        AnrufZ=waitpassok TOsec=$SECONDS
     ;;
     waitpassok)
        let "$SECONDS-TOsec>10" && break
        com -p || return 0
        AnrufZ=passok
     ;;
     passok)
        com -it300id15i1000 Ibuf
        catv $.,Ibuf =Hbuf:
        catv Hbuf
        expr "$Hbuf" =:: 'PASSWORD %{1,3}OK' || break
        AnrufZ=getdata
     ;;
     getdata)
        [ Status -eq 2 ] && AnrufZ=writecfg continue
        [ Status -eq 3 ] && AnrufZ=readcfg continue
        GetMUdata $Fmustatus Nn dk40 || {
           echo "$Nn Bytes"
           [ MOwahl -eq 0 ] && break
           ring=@EN:
           com -cot30od10o4 ring
           break
        }
        echo "$Nn Bytes"
        AnrufZ=data
     ;;
     data)
        MUkategorie_c $Fmustatus
        cat $Fmustatus > $MUdir/stat
        [ ! -e "$MUdir/lock" -o ! -s "$MUdir/eepr" ] && AnrufZ=readcfg continue
        [ MOwahl -eq 0 ] && AnrufZ=0 goend
        AnrufZ=mowrite continue
     ;;
     mowrite)
        ring=@EN:
	sleep -m 400
        com -cot50od10o4 ring
	echo @EN: = $.
        AnrufZ=waitmoend TOsec=$SECONDS
     ;;
     waitmoend)
        let "$SECONDS-TOsec>10" && break
        com -p || return 0
        AnrufZ=moend
     ;;
     moend)
        com -it300id15i1000 Ibuf
        catv $.,Ibuf =Hbuf:
        catv Hbuf
        expr "$Hbuf" =:: 'Connection %{1,3}aborted' || break
        AnrufZ=0
        #[ Status -eq 2 -o Status -eq 3 ] && AnrufZ=0
     ;;
     dialin)
        WriteAT "$MOabnehmen" || break
        AnrufZ=getokayfail
     ;;
     getokayfail)
        GetMUdata $Fokayfail Nn rdonly || break
        echo "$Nn Bytes"
        AnrufZ=okayfail
     ;;
     okayfail)
        #< $Fokayfail
        #><
        #MkTbl5data $Ftbl5 addmu "$mustat" "$muokfa" "$mudati"
        AnrufZ=0
     ;;
     writecfg)
        sum -w cksum < $MUdir/eepr
        let "cksum+=16#1d0f, cksum&=65535"
        base -10 cksum +w cksum
        ring=129
        base -10 ring +b ch
        ring=@PC:
        com -cot40od10o4 ring
        com -it400id20i1 Ibuf
        catv 1,Ibuf /%j
        com -cot30od10o1 ch
        com -it400id10i1 Ibuf
        catv 1,Ibuf /%j
        catv 2048,0 =Hbuf < $MUdir/eepr
        for offs from 0 by 32 to 2016 repeat
        do
           com -cot80od10oO${offs}o32 Hbuf
           com -it600id20i1 Ibuf
           catv 1,Ibuf
        done
        com -cot30od10o2 cksum
        com -it400id10i2 ring
        echo
        catv 2,cksum =cksum:
        catv 2,ring =ring:
        base -w cksum +16
        base -w ring +16
        cmpv cksum ring || break
        [ MOwahl -ne 0 ] && AnrufZ=mowrite continue
        AnrufZ=0
     ;;
     readcfg)
        ring=128
        base -10 ring +b ch
        ring=@PC:
        com -cot40od10o4 ring
        com -it400id20i1 Ibuf
        catv 1,Ibuf /%j
        com -cot30od10o1 ch
        com -it3500id20i2050 Ibuf
        echo $.
        catv 2048,Ibuf > ../tmp/eeprin
        sum -w cksum < ../tmp/eeprin
        let "cksum+=16#1d0f, cksum&=65535"
        base -10 cksum +w cksum
        com -cot30od10o2 cksum
        catv 2,cksum =cksum:
        catv 2048,2,Ibuf =ring:
        base -w cksum +16
        base -w ring +16
        cmpv cksum ring || break
        mucrc cksum Ibuf 2 1898 || break
        catv 0,2,Ibuf =ring:
        base -w ring +10 ring
        echo "$cksum : $ring"
        [ cksum -ne ring ] && break
        cat ../tmp/eeprin > $MUdir/eepr
        remove ../tmp/eeprin
        #base -W +w < $MUdir/eepr | catv 2048,0 =5000,2048,3  3<> C:\DATA.MUC
        #catv $(( 960<<1)),2,0 =ring:  < $MUdir/eepr
        #base -w ring +10 ring
        #MUspsw=0
        #let "ring==1" && MUspsw=1
        #catv $((1001<<1)),2,0 =ring:  < $MUdir/eepr
        #base -w ring +10 ring
        #let "ring==1" && MUspsw=2
        [ MOwahl -ne 0 ] && AnrufZ=mowrite continue
        AnrufZ=0
     ;;
   esac
   return 0
   done
   return 1
}


GetMUdata()  {
   local nrw=0000000000 sum=00000
   catv /@DK40: =6,Ibuf
   [ "$3" == dk40 ] && com -cot100od10o6 Ibuf
   until com -p
   do
      let "sum+=10, sum>3000" && break
      sleep -m 10
   done
   echo "InputWait: $sum ms"
   com -it500id20i4000 Ibuf
   nrw=$. $2=$. sum=0
   let "sum+=nrw, nrw==0" && return 1
   > $1
   while [ nrw -gt 0 ]
   do
      [ "$3" == dk40 ] && conv '-t `' Ibuf
      catv $nrw,Ibuf
      com -it500id20i4000 Ibuf
      let "nrw=$., sum+=nrw"
   done
   ><
   $2=$sum
   return 0
}
#------------------------------------------------------------------------

. ./functions.bish
. ./cvars.bish
MOauflegen='%t0%d%p%p+++%d%p%p %t4%OATH'
MOinit='AT AT%O AT&F %dATX3E0L1S0=0S7=99S9=12S10=24'
MOdialout='%t60%CATD%T'
MOabnehmen='%t40%CATA'
spDay=$((3600*24))
#spDay=$((30*60))
Status=0
TOsec=0000000000
DOtime=0000000000
AnrufZ=0000000000000000
set Ibuf:0.4096
set Hbuf:0.2100
#catv /%0 =4095,,Ibuf
prints vs70 Nn
#prints vs20 MUip
#prints vs20 MUstation
#prints vs20 MUpasswd
#MUmoerr=0
#Lock lockuv
. ./uvars.bish
#Lock lockuv del

[ MUcall -ne 0 ] && MUcall=00 Uvars MUcall
#BSD: /dev/cuaa0
case "$OsTyp" in
  FreeBSD)   Sio='/dev/ttyd0' Tty='/dev/console';;
  OpenUnix)  Sio='/dev/term/00t' Tty='/dev/pts016';;
  *)         Sio='/dev/null' Tty='/dev/console';;
esac
1>> $Tty
2>> $Tty
com +L  $Sio || { WrLog "TTY-Device '$Sio'" "open failed"; exit 0; }
[ MOwahl -ne 0 ] && com -B19200
com -s 1
com -H TOsec
fstat -h 0 1 2 $TOsec
GetIds  #Gid Aid Oid Pid Fid Cid Tid Iid Sid

local Wait=500 Sec:010 Stime:010 St:010 Uv:010 Uv0:010 Fst:010 Fct:010
local MOri=0 MOritime:010 MOrings=00 MOisinit=0 MOinittime:010
local CTwait:010
systime Stime
fstat -mv Uv0 uvars.bish
Uv=$Uv0
[ ! -e $Fconntest -o CTtime -eq 0 -o CTbuild -ne 0 -a ConnTest -gt 0 ] && BuildCT


until [ -e ../tmp/rxtx ]
do
   sleep -m $Wait
   Sec=$SECONDS
   case $Status in
     0)
        [ MUcall -ge 30 -a MUcall -le 39 ] && { let "MUcall-=20"; Uvars MUcall; }
        com -p && {
           [ MOwahl -eq 0 ] && { com -ic; continue; }
           com -it60id10i1500 Ibuf
           catv $.,Ibuf =Hbuf:
           catv '/[' Hbuf '/]'
           GetMOmsgNr Hbuf && let "Hbuf&4" && MOri=1 MOrings=0 %
              MOritime=$Sec Wait=150 Status=9 MUcall=39 Uvars MUcall
           continue
        }
        fstat -mv Uv uvars.bish
        [ Uv -ne Uv0 ] && { Uv0=$Uv  . ./uvars.bish; }
        [ MOwahl -ne 0 -a MOisinit -ne 1 ] && {
           Status=7 MOinittime=-30
           [ MOisinit -eq 0 ] && MUcall=37 Uvars MUcall
           continue
        }
        [ MOwahl -eq 0 ] && MOisinit=0
        [ Sec -ge St ] && {
           let "St=Sec+10"; systime Stime
           [ ConnTest -gt 0 ] && [ -s $Fstation ] && {
              [ CTbuild -ne 0 ] && { BuildCT; continue; }
              let "Sec-DOtime<=90||Sec-CTwait<=150" && continue
              [ Stime -ge CTtime -a CTtime -ge 10 ] && {
                 SetVarsCT && MUcall=6; } ||
                 WrLog "Connect test" "SetVars failed: $CTgid/$CTaid"
           }
        }
        [ MUcall -eq  1 ] && Status=1
        [ MUcall -eq  2 ] && Status=2
        [ MUcall -eq  6 ] && Status=6 echo CT: $CTgid $CTaid $CTtime $CTday
        [ MUcall -lt  0 ] && MUcall=00 Uvars MUcall
        [ Status -ne 0 ] && { AnrufZ=dialout let "MUcall=Status+30"; Uvars MUcall; }
        continue
     ;;
     9)
        if com -p
        then
              MOri=0
              com -it60id10i1500 Ibuf
              catv $.,Ibuf =Hbuf:
              catv '/[' Hbuf '/]'
              GetMOmsgNr Hbuf && let "Hbuf&4" && MOri=1
        else  let "MOrings+=MOri, MOrings>=3" && {
                 Status=8 Wait=500 MUcall=38 Uvars MUcall
                 AnrufZ=dialin continue
              }
              MOri=0
        fi
        let "Sec-MOritime>20" && {
           Status=0 Wait=500 MUcall=29 Uvars MUcall
           WrLog "RING event" "less then 3 rings"
           continue
        }
        continue
     ;;
     1)
        MUanrufen $Telnu || { 
           MOisinit=2 Status=0 MUcall=21 Uvars MUcall
           WrLog "Call get data" "failed: $AnrufZ" $MUdir/log
        }
        [ $AnrufZ != 0 ] && continue
        MOisinit=2 Status=0 MUcall=11 Uvars MUcall
        continue
     ;;
     2)
        MUanrufen $Telnu || { 
           MOisinit=2 Status=0 MUcall=22 Uvars MUcall
           WrLog "Call configure" "failed: $AnrufZ" $MUdir/log
        }
        [ $AnrufZ != 0 ] && continue
        MOisinit=2 Status=0 MUcall=12 Uvars MUcall
        continue
     ;;
     6)
        MUanrufen $Telnu || { 
           WrLog "Connect test $MUdir" "failed: $AnrufZ"
           WrLog "Connect test" "failed: $AnrufZ" $MUdir/log
	   GetTryCT Hbuf
           if [ Hbuf -ge CTtries ]
	   then  FailCT; WriteCT full
	   else  WriteCT try
	   fi
	   NextCT; CTwait=$Sec
           MOisinit=2 Status=0 MUcall=26 Uvars MUcall
        }
        [ $AnrufZ != 0 ] && continue
        WriteCT okay; NextCT; CTwait=$Sec
        MOisinit=2 Status=0
        continue
     ;;
     8)
        MUanrufen || { 
           MOisinit=2 Status=0 MUcall=28 Uvars MUcall
           WrLog "Incoming call" "failed: $AnrufZ"
        }
        [ $AnrufZ != 0 ] && continue
        OkayFail $Fokayfail || MUcall=28 Uvars MUcall
        MOisinit=2 Status=0
        continue
     ;;
     7)
        fstat -mv Uv uvars.bish
        [ Uv -ne Uv0 ] && { Uv0=$Uv  . ./uvars.bish; }
        [ MOwahl -eq 0 ] && Status=0 MOisinit=0 continue
        let "$Sec-MOinittime<30" && continue
        WriteAT "$MOauflegen"
        WriteAT "$MOinit" && Status=0 MOisinit=1
        [ MOisinit -eq 2 ] && Status=0 MOisinit=0
        MOinittime=$Sec
        continue
     ;;
   esac
done

remove -s ../tmp/rxtx
MUcall=30 Uvars MUcall
com -
[ -t 1 -a -n "$Tty" -a -c "$Tty" ] && ><
[ -t 2 -a -n "$Tty" -a -c "$Tty" ] && ><
exit 0



             #fstat -mv Fst $Fstation
             #fstat -mv Fct $Fconntest
             #[ Fst -gt Fct ] && { BuildCT; continue; }
#  [ $AnrufZ == 0 ] && {
#     ...
#     ext -p L_c || continue
#     [ MOwahl -eq 0 ] && { ext -ic; continue; }
#     ext -iT100it60id10i1000 Ibuf
#     catv $.,Ibuf =Hbuf:
#     catv '/[' Hbuf '/]'
#     GetMOmsgNr Hbuf && let "Hbuf&4" && let "++MOring>=3" &&
#        MOring=0 MOringtime=0 MUdata= AnrufZ=dialin
#     continue
#  }
#  MUanrufen $Telnu || MOisinit=2
#  [ $AnrufZ == c2written ] && AnrufZ=0 MOisinit=2
#  [ $AnrufZ == mucfgokay ] && AnrufZ=0 MOisinit=2 MUdata="@MUeedata:"
#  [ $AnrufZ != c1written ] && continue
#  AnrufZ=0 MkMUhtm


###  s70.bish  #############################################

#!/u/bin/bish
[ $# -lt 1 ] &&  echo "  Argument:  Sekunden seit 1.1.1970 00:00:00"
[ $# -lt 1 ] &&  exit 1
[ "$1" = -h ] && echo "  Argument:  Sekunden seit 1.1.1970 00:00:00" &&
                 exit

typeset -i10 corr j sec SPT m cjsj
typeset -i10 tm_mday tm_hour tm_min tm_wday tm_sec tm_mon tm_year
to 10000 repeat
do
sec=$1
((SPT=24*3600))
array MA  $SPT $SPT $SPT $SPT $SPT $SPT $SPT $SPT $SPT $SPT $SPT $SPT
(( MA1*=31, MA2*=28, MA3*=31,
   MA4*=30, MA5*=31, MA6*=30,
   MA7*=31, MA8*=31, MA9*=30,
   MA10*=31, MA11*=30, MA12*=31
))
array WA  So Mo Di Mi Do Fr Sa

j=1970
repeat
do
   (( cjsj=0,
      corr= SPT*365 + (j%4==0&&j%100||j%400==0 ? (++cjsj,SPT) : 0),
      sec<corr )) && break
   (( sec-=corr, ++j ))
done

m=1
repeat
do
   (( corr=MA[m] + (m==2&&cjsj ? SPT : 0), sec<corr )) && break
   (( sec-=corr, ++m ))
done

(( tm_mday=sec/SPT+1, sec%=SPT,
   tm_hour=sec/3600, sec%=3600, tm_min=sec/60, sec%=60
))
let "tm_wday=( $1 %% (SPT*7) )/SPT+4"              #1.1.1970=Do=4
(( tm_wday-= tm_wday>6?7:0, ++tm_wday ))

tm_sec=$sec  tm_mon=$m  tm_year=$j
# tm_yday=0 tm_isdst=0

array WAwd=WA tm_wday
# echo "  $WAwd, $tm_mday.$tm_mon.$tm_year  $tm_hour:$tm_min:$tm_sec"
done
echo "  $WAwd, $tm_mday.$tm_mon.$tm_year  $tm_hour:$tm_min:$tm_sec"



###  safe.bish  #############################################

#!/u/bin/bish

TMP=/tmp/safe_$$
[ $# -ne 3 ] && exit 2
[ ! -e "$1" -o ! -d "$2" -o -z "$3" ] && exit 3
DEV="$1" MDIR="$2" LST="$3" DIR="$3"
LST= ARG=
for DIR in $3
do
   [[ ! -d "$DIR" -a "$DIR" == "/*" ]] && continue
   [[ "$DIR" != "/*" ]] && { ARG="$ARG$DIR "; continue; }
   LST="$LST$DIR "
done
C="$0"
expr "$0" :C '%([^/]%{1,}%)$'
echo "%n$C: TMP=$TMP"
echo ----------------------------------------------------------------
M=0
mount > $TMP || exit
grep -q "$DEV .%{2,} $MDIR " $TMP || M=1
[ M -eq 1 ] && mount -v $DEV $MDIR || exit
sleep 3

for DIR in $LST
do
   rsync -aHAXivh --stats --progress --modify-window=5 $ARG $DIR/ $MDIR/$DIR
done

rm $TMP
[ M -eq 1 ] && umount -v "$MDIR" || { sleep 5; umount -v "$MDIR"; } || exit
echo $ARG $LST
echo ----------------------------------------------------------------




###  safe_cp.bish  #############################################

#!/u/bin/bish

TMP=/tmp/safe_$$
[ $# -ne 3 ] && exit 1
[ ! -e "$1" -o ! -d "$2" -o -z "$3" ] && exit 2
DEV="$1" MDIR="$2" LST="$3"
C="$0"
expr "$0" :C '%([^/]%{1,}%)$'
echo "%n$C: TMP=$TMP"
echo ----------------------------------------------------------------
M=0
mount > $TMP || exit
grep -q "$DEV .%{2,} $MDIR " $TMP || M=1
[ M -eq 1 ] && mount -v $DEV $MDIR || exit
sleep 3
set DIR:.500 F:.1000

for DIR in $LST
do
   [ -d $DIR ] || continue
   echo "$C: $DIR ..."
   find $DIR -print > $TMP
   [ -s $TMP ] || continue
   <$TMP
   while readl F
   do
      if [ -L "$F" ]
      then
         [ -f "$F" -o -d "$F" ] || {
            echo "$C: Typ != -f -d: $F"; continue
         }
         fstat -tv T "$F" || {
            echo "$C: Gebrochener Link: $F"; continue
         }
         [ -e "$MDIR$F" ] && [ ! -L "$MDIR$F" ] && {
            echo "$C: Kein SYMLINK: $MDIR$F"; continue
         }
         [ -e "$MDIR$F" ] && continue
         echo "$C: SYMLINK:"
      else
         [ -d "$F" ] && {
            [ -d "$MDIR$F" ] && continue
            [ -e "$MDIR$F" ] && {
               echo "$C: Kein DIR: $MDIR$F"; continue
            }
            mkdir -pv "$MDIR$F"; continue
         }
         [ -e "$MDIR$F" ] && [ ! "$F" -nt "$MDIR$F" ] && continue
      fi
      cp -Rpv "$F" "$MDIR$F"
   done
   ><
done

rm $TMP
[ M -eq 1 ] && umount -v "$MDIR" || { sleep 5; umount -v "$MDIR"; } || exit
echo ----------------------------------------------------------------




###  safecard  #############################################

#!/u/bin/bish

MDIR=/card
[ -d "$MDIR" ] || mkdir "$MDIR"
expr "$0" :A0 '%([^/ ]%{4,20}%)$' || { echo "'$0'"; exit 6; }
LABEL=label
[ $A0 = safecard -o $A0 = safecard8 ] && LABEL=CARD8 LST='/u /home'
[ $A0 = safecard128 ] && LABEL=CARD128 LST='/u /home /root /fat/cie /s/ARCH_win /s/BAK /s/CD /s/ketel /s/tape  /s/zip /s/usr/BSD71_64 /s/usr/BSD92 /s/usr/DOC /s/usr/MEDIA /s/usr/pkg_src /s/usr/VMware'
[ "$LABEL" = label ] && { echo Kommandoname/Label falsch; exit 4; }
[ -n "$*" ] && LST="$*"
#fdisk -s da[0-9]; glabel status|list; usbconfig; camcontrol devlist;
glabel status | grep -m '%<ufs/'"$LABEL"'%>' | readl Z || { echo ufs/$LABEL not found; exit 1; }
set DEV:.50
expr "$Z" :DEV '%(%<da[0-9]%{1,2}s[1-9]%>%)' || { echo "expr da#"; exit 2; }
DEV="/dev/$DEV"
[ -c "$DEV" -o -b "$DEV" ] || { echo "DEV=$DEV"; exit 3; }
echo "Kartengerät: $DEV"

for DIR in $LST
do
   [[ ! -d "$DIR" -a "$DIR" == "/*" ]] && { echo "'$DIR'" existiert nicht oder kein Dir; exit 5; }
done

safe.bish "$DEV" "$MDIR" "$LST" || echo "$0: -> safe.bish: Exit=$?"
:




###  safecard128  #############################################

#!/u/bin/bish

MDIR=/card
[ -d "$MDIR" ] || mkdir "$MDIR"
expr "$0" :A0 '%([^/ ]%{4,20}%)$' || { echo "'$0'"; exit 6; }
LABEL=label
[ $A0 = safecard -o $A0 = safecard8 ] && LABEL=CARD8 LST='/u /home'
[ $A0 = safecard128 ] && LABEL=CARD128 LST='/u /home /root /fat/cie /s/ARCH_win /s/BAK /s/CD /s/ketel /s/tape  /s/zip /s/usr/BSD71_64 /s/usr/BSD92 /s/usr/DOC /s/usr/MEDIA /s/usr/pkg_src /s/usr/VMware'
[ "$LABEL" = label ] && { echo Kommandoname/Label falsch; exit 4; }
[ -n "$*" ] && LST="$*"
#fdisk -s da[0-9]; glabel status|list; usbconfig; camcontrol devlist;
glabel status | grep -m '%<ufs/'"$LABEL"'%>' | readl Z || { echo ufs/$LABEL not found; exit 1; }
set DEV:.50
expr "$Z" :DEV '%(%<da[0-9]%{1,2}s[1-9]%>%)' || { echo "expr da#"; exit 2; }
DEV="/dev/$DEV"
[ -c "$DEV" -o -b "$DEV" ] || { echo "DEV=$DEV"; exit 3; }
echo "Kartengerät: $DEV"

for DIR in $LST
do
   [[ ! -d "$DIR" -a "$DIR" == "/*" ]] && { echo "'$DIR'" existiert nicht oder kein Dir; exit 5; }
done

safe.bish "$DEV" "$MDIR" "$LST" || echo "$0: -> safe.bish: Exit=$?"
:




###  safecard8  #############################################

#!/u/bin/bish

MDIR=/card
[ -d "$MDIR" ] || mkdir "$MDIR"
expr "$0" :A0 '%([^/ ]%{4,20}%)$' || { echo "'$0'"; exit 6; }
LABEL=label
[ $A0 = safecard -o $A0 = safecard8 ] && LABEL=CARD8 LST='/u /home'
[ $A0 = safecard128 ] && LABEL=CARD128 LST='/u /home /root /fat/cie /s/ARCH_win /s/BAK /s/CD /s/ketel /s/tape  /s/zip /s/usr/BSD71_64 /s/usr/BSD92 /s/usr/DOC /s/usr/MEDIA /s/usr/pkg_src /s/usr/VMware'
[ "$LABEL" = label ] && { echo Kommandoname/Label falsch; exit 4; }
[ -n "$*" ] && LST="$*"
#fdisk -s da[0-9]; glabel status|list; usbconfig; camcontrol devlist;
glabel status | grep -m '%<ufs/'"$LABEL"'%>' | readl Z || { echo ufs/$LABEL not found; exit 1; }
set DEV:.50
expr "$Z" :DEV '%(%<da[0-9]%{1,2}s[1-9]%>%)' || { echo "expr da#"; exit 2; }
DEV="/dev/$DEV"
[ -c "$DEV" -o -b "$DEV" ] || { echo "DEV=$DEV"; exit 3; }
echo "Kartengerät: $DEV"

for DIR in $LST
do
   [[ ! -d "$DIR" -a "$DIR" == "/*" ]] && { echo "'$DIR'" existiert nicht oder kein Dir; exit 5; }
done

safe.bish "$DEV" "$MDIR" "$LST" || echo "$0: -> safe.bish: Exit=$?"
:




###  sbrief.bish  #############################################

#!/u/bin/bish
OFILE=ofile_.sbr
TMPF=tmp_file.sbr
LN= NA= SA= CR="`echo %r%c`" NL="`echo`" FF="`echo %f%c`"

stop()  { read "rest?        <Enter> "; }


get_addr()  {
   local zeile al=0
   [ -z "$LN" ] && LN=1
   [ -z "$NA" ] && NA=0
   [ -z "$SA" ] && SA=0
   while zeile="`line -$LN $ADRFILE`"
   do
      ((LN=LN+1 ; al=al+1))
      conv "-d${CR}d$NL" zeile
      [ -z "$zeile" ] && {
         [ $al -lt 4 -o $al -gt 5 ] && {
            echo "Adressendatei fehlerhaft!(45)%a"; return 3; }
         [ $al -eq 4 ] && { ORT="$STR"; STR="$ABT"; ABT="%n"; }
         ((NA=NA+1 ; SA=SA+1))
         return 0
      }
      case $al in
        1)  ANR="$zeile%n";;
        2)  ABT="$zeile%n";;
        3)  STR="$zeile%n";;
        4)  ORT="$zeile%n";;
        *)  echo "Adressendatei fehlerhaft!(*)%a"; return 3;;
      esac
   done
   LN=1
}


prep_txt()  {
   local zeile n1=1 num ns=0 nl
   LINES=""
   zeile="`grep -n $FF $TXTFILE`"
   for num in $zeile
   do
      num=`expr $num : '^%([0-9]%{1,%}%):'`  &&  {
         LINES="$LINES$n1-$((num-1)) "
         ((n1=num+1 ; ns=ns+1))
      }
   done
   nl=`wc -l $TXTFILE`
   ((nl=nl-ns ; ns=ns+1))
   LINES="$LINES$n1-$nl"
   echo $TXTFILE hat $ns Seiten.
   echo Jeweilige Zeilen:  $LINES
   stop
   return 0
}


make_outp()  {
   local  seite vonbis nl nl1 printer=$DRUCKER
   [ "$1" = D ] && printer=/dev/null
   while get_addr
   do
      echo %n»Adresse $((SA-1))«%n"$ANR$ABT$STR$ORT"
      read "rest?Überspringen,Abbruch  [+,a]:  "
      [ "$rest" = + ] &&  continue
      [ "$rest" = a ] &&  return 0
      seite=0
      for vonbis in $LINES
      do
         let "seite=seite+1"
         nl=`eval 'echo $(( -('$vonbis')+1 ))'`
         #/u/bish/bish /u/bish/cmd/scs.bish $seite
         . /u/bish/cmd/scs.bish $seite
         echo "%e(10U%e(s0p9h0s0b4099T%e&k2G%e&a7L%e&l8D%c" > $OFILE
         if [ $seite -eq 1 ]
         then
            echo "%e&a9R%e&l6D%c" >> $OFILE
            echo "$ANR$ABT$STR%n$ORT" >> $OFILE
            echo "%e&l8D%e&a18R%c" >> $OFILE
            ((nl1=nl=nl+8+5 +6 +3))
         else
            echo "%e&a6R%c" >> $OFILE
            ((nl=nl+6 +6 +3))
            [ $nl -gt $nl1 ] && nl1=$nl
            nl=$nl1
         fi
         cat $OFILE >> $printer
         line -$vonbis $TXTFILE > $OFILE
         echo "Seite $seite ..."
         /u/bin/tof -Qp2.40,z$nl,o $OFILE >> $printer
      done
   done
   echo Ende der Adressendatei.
}



while echo "%n
Adressendatei '$ADRFILE'($SA:$LN)   Textdatei '$TXTFILE'

%tAdressendatei         :  aDATEI
%tTextdatei             :  tDATEI
%tDrucken               :  d
%tDrucken(Test)         :  D
%tBeenden               :  e

%t                      :  %c"
do
   read kdo rest
   case "$kdo" in
     a?*)
         LN=1; NA=0; unset ADRFILE
         kdo=`expr $kdo : '.%(..*%)'`
         [ ! -f $kdo ] && { echo Datei $kdo nichtexistent!%a
                            continue; }
         ADRFILE=$kdo
         while get_addr; do :; done
         [ $? -gt 2 -o $NA -lt 1 ] && { unset ADRFILE; continue; }
         echo $ADRFILE enthält $NA Adressen.
         kdo=0
         while [ "$kdo" -lt 1 -o "$kdo" -gt $NA ]
         do
            read "kdo?Startadresse angeben 1...$NA:  "
         done
         SA=$kdo
         to $((SA-1)) repeat; do get_addr; done
         : ;;
     t?*)
         unset TXTFILE
         kdo=`expr $kdo : '.%(..*%)'`
         [ ! -f $kdo ] && { echo Datei $kdo nichtexistent!%a
                            continue; }
         TXTFILE=$kdo
         prep_txt
         : ;;
     [dD])
         { ifset ADRFILE && ifset TXTFILE; } ||
            { echo Erst Auswahl treffen!%a; continue; }
         make_outp $kdo
         #[ $kdo = d ] && cat $OFILE >> $DRUCKER
         : ;;
     e)  [ -f "$OFILE" ] && rm $OFILE; exit 0;;
     *)  echo %a%c ;;
   esac
done




###  scanobj.bish  #############################################

#

D='g:\cie\mc\c\upc4\base'
F="$D\cfgbase.txt $D\mesbase.txt"
N=00000 A=00000 a=0000

for B in $F
do
   N=0 A=0 a=0
   echo "$B"
   <"$B"
   while readl Z
   do
      expr "$Z" :: '^%$' && break
      expr "$Z" :: '^@%d' || continue
      if expr "$Z" :a '[AS]%(%d%{1,}%)'
      then  let "++N" "A+=a"
      else  let "++N"
      fi
   done
   ><
   echo N=$N A=$A
done

:





###  schil.bish  #############################################


OFILE=bish_schi.out
#YMAX=2710 XMAX=1980


init()  {
   echo "%eE%e&a9L%e&k2G%e*t600R%e%1Binsc0,4,0,4,2;
sd1,341,2,1,4,10,5,4,6,0,7,4148ss;
DT³,1sp1wu0pw0.0lo5;
" > $OFILE
}



schild()  {
   echo "pa100,$RH;sd4,$SG;" >> $OFILE
   for NAME in "Junker" "Stork" "KKKKKKK" %
               "Schenk" "Horsthemke" "Rabe" %
               "Torres" "Schulze" "2.OG_re"
   do
      echo "er$RB,$RH;pr$((RB/2)),$((RH/2))pc1,$FARBE;lb$NAME%r³pc1,0,0,0
            pr-$((LOCH/2)),0ci6pr$LOCH,0ci6;
            pr-$((LOCH/2+RB/2)),$((RH/2));" >> $OFILE
   done
}


end_gl()  {
   echo '%e%%0A%c' >> $OFILE
}


druck()  {
   init
   schild
   end_gl
   echo '%eE%c' >> $OFILE
   cat $OFILE >> $DRUCKER
}


#2011: Klingel 64x29, Werbung 80x25, Briefk. 60x15
RH=150 RB=600 LOCH=620 SG=30
FARBE=22,4,198

while :
do

echo "%n%n%thöhe=$RH  breite=$RB  löcher=$LOCH  schrift=$SG  farbe=$FARBE%n
%t%th150b640l630s24    :  1
%t%th140b440l380s15.5  :  2
%t%th150b600l620s30    :  3
%t%tEingabe  h b l s   :  e
%t%tSchriftfarbe       :  f
%t%tDrucken            :  d
%t%tBeenden            :  q

%t%t                   :  %c"
read kdo
case "$kdo" in
   1)  RH=150 RB=640 LOCH=630 SG=24 ;;
   2)  RH=140 RB=440 LOCH=380 SG=15.5 ;;
   3)  RH=150 RB=600 LOCH=620 SG=30 ;;
   e)  read "RH? h b l [mm/10] s: " RB LOCH SG rest ;;
   f)  read "FARBE? rot,grün,blau: " rest ;;
   d)  druck ;;
   q)  break ;;
   *)  : ;;
esac

done

[ -f $OFILE ] && rm $OFILE



###  schilw.bish  #############################################


OFILE=bish_schi.out
#YMAX=2710 XMAX=1980


init()  {
   echo "%eE%e&a9L%e&k2G%e*t600R%e%1Binsc0,4,0,4,2;
sd1,341,2,1,4,10,5,4,6,0,7,4148ss;
DT³,1sp1wu0pw0.0lo5;
" > $OFILE
}


schild()  {
   RH=90 RB=610 SG=20
   NAME="H. Schellong"
   echo "pa100,$RH;sd4,$SG;" >> $OFILE
   echo "er$RB,$RH;pr$((RB/2)),$((RH/2))lb$NAME%r³;" >> $OFILE
}


end_gl()  {
   echo '%e%%0A%c' >> $OFILE
}


druck()  {
   init
   schild
   end_gl
   echo '%eE%c' >> $OFILE
   cat $OFILE >> $DRUCKER
}


druck
[ -f $OFILE ] && rm $OFILE



###  schilwer.bish  #############################################


OFILE=bish_schi.out
#YMAX=2710 XMAX=1980


init()  {
   echo "%eE%e&a9L%e&k2G%e*t600R%e%1Binsc0,4,0,4,2;
sd1,341,2,1,4,10,5,4,6,0,7,4148ss;
DT³,1sp1wu0pw0.0lo5;
" > $OFILE
}


schild()  {
   RH=250 RB=800 SG=18
   FARBE=229,74,44
   #NAME="Bitte keine Werbung und keine Wochenzeitungen einwerfen"
   NAME="Keine Werbung%r%nund keine Zeitungen%r%neinwerfen"
   echo "pa100,$RH;sd4,$SG;" >> $OFILE
   #echo "er$RB,$RH;" >> $OFILE
   echo "pr$((RB/2)),$((RH/2))pc1,$FARBE;lb$NAME%r³pc1,0,0,0;" >> $OFILE
}


end_gl()  {
   echo '%e%%0A%c' >> $OFILE
}


druck()  {
   init
   schild
   end_gl
   echo '%eE%c' >> $OFILE
   cat $OFILE >> $DRUCKER
}


druck
[ -f $OFILE ] && rm $OFILE



###  sco.bish  #############################################



set Z:.300 num:020 p:.300 n:.100 N:.200
num=1000

#cat /u/sco.lst | {
#   > /u/sco2.lst
#   while readl Z
#   do
#      let ++num
#      echo "$Z%t$num.Z"
#   done
#   ><
#}


#for 2 p n in $(cat sco2.lst)
#do
#   cp -pv "$p" "/fat/SCOa/$n"
#done


for 2 p n in $(cat sco2.lst)
do
   expr "$p" :Z '^%(.%{1,}%)%.Z$'
   expr "$n" :N '^%(.%{1,}%)%.Z$'
   cp -pv "/fat/SCOb/$N" "$Z" && rm -v "$p"
   #echo cp -pv "/fat/SCOb/$N" "$Z" && echo rm -v "$p"
done




###  scripts.bish  #############################################

#!/u/bin/bish
#?@(#): Script-Verwaltungs-Script
#LST= BLST= ALST= A= B= F= rest= R= HS= HC=

LST=`ls -iRqF /u/sh | %
awk 'BEGIN { ino=0; dir="" }
     NF == 1  { split($0,A,":"); dir=A[1]; next }
     /..*\*$/ && NF == 2 && $1 != ino  { 
        ino=$1; split($2,A,"*"); print dir "/" A[1]
     }
    '`
    # An dieser Stelle enthält LST etwa 100 Pfadnamen.


scanhlp()  {
   R=1
   for F
   do
     HS="`/bin/grep '^#?@(#).' "$F" | sed -e 's/^......\(..*\)$/\1/' `"
     [ -z "$HS" ] && continue
     HC=`echo "$HS" | sed -e 's/^\(.\).*$/\1/' `
     case "$HC" in
        :)  echo "$HS" | sed -e 's/^.\(.*\)$/\1/';;
        ()  echo " Subscript."  ;;
        -)  csh -f -c "$F"  ;;
        +)  csh -f -c "$F 7___2"  ;;
        [a-zA-Z_0-9]*)  csh -c "$F $HC"  ;;
        *)  continue ;;
     esac
     R=0
   done
   return $R
}

LST="`fgrep -l -e '#!/' $LST`"
BLST="`echo "$LST%c" | awk -F / '{ print $NF }'`"
BLST="`echo "$BLST%c" | sort`"
# BLST enthält eine sortierte Liste von Shellscript-Namen.

while :
do
  echo "$BLST%c" | pr -t -w78 -5 | pg -23 -efns -p'%d: '
  echo " Auswahl: [v|vi] [name]:  %c"
  read A B rest
  [ -z "$A" ] && exit 0
  F=$A
  [ "$A" = v -o "$A" = vi ] && { F=$B A=""; }
  [ -z "$F" ] && continue
  ALST="`echo "$LST%c" | /bin/grep "/$F%$" `"
  [ -n "$A" ] && scanhlp $ALST  ||  {
     [ -n "$ALST" -a -n "$A" ]  &&  pg -23 -fns -p'%d: ' $ALST
  }
  [ -n "$ALST" -a -z "$A" ]  &&  vi $ALST
  echo " <Enter> %c"
  read rest
done


#Shell-Kennungen in Scripts (Zeile 1):  #!/bin/csh  #!/bin/sh  #!/bin/ksh
#Help-Kennungen in Scripts (Zeile 2):
#?@(#)(               Subscript
#?@(#)-               Kein Arg ==> Help
#?@(#)+               Mindestens 1 beliebiges Arg
#?@(#)h               Arg 'h'
#?@(#):Info-Text



###  scs.bish  #############################################

#!/u/bin/bish


#NAME STRASE ORT TELFAX BANK

NAME="Helmut Schellong%r"
STRASE="Pestalozzi-Straße 72%r"
ORT="32108  Bad Salzuflen%r"
TELFAX="Tel/Fax 05222-84540 · var@schellong.biz%r"
BANK="Kreissparkasse RRRRRRR · BLZ 480 501 10 · Konto 7777777%r"

YMAX=2710 XMAX=1980

start()  {
   echo "%eE%e&a9L%e&k2G%e*t600R%e%1BinSC0,$XMAX,0,$YMAX,1;
sd1,14,2,1,4,10,5,0,6,3,7,4148ss;
DT|,1sp1wu0pw0.0lo2;
rf1,10,8,1,%c"
   echo "1,1,0,0,0,0,0,0,0,0,%c"
   echo "0,0,0,0,0,0,0,0,0,0,%c"
   echo "0,0,0,0,0,1,1,0,0,0,%c"
   echo "0,0,0,0,0,0,0,0,0,0,%c"
   echo "1,1,0,0,0,0,0,0,0,0,%c"
   echo "0,0,0,0,0,0,0,0,0,0,%c"
   echo "0,0,0,0,0,1,1,0,0,0,%c"
   echo "0,0,0,0,0,0,0,0,0,0,;"
   echo "PUpa0,0;"
}

#GROU GRL RAD LGRAD LGX LGY LGTXT
GROU=80 GRL=100 RAD=80
LGRAD=70
LGX=1600 LGY=$((YMAX-LGRAD))
#LGRAD=200
#LGX=1600 LGY=$((YMAX-GROU/2-LGRAD/10))
#LGTXT="lo5si.$(((LGRAD*47)/200)),.$((GROU/2))lbSCS|si;"

schatten()  {
   local FARBE=148,186,247
   echo "
pa0,0PM0pr0,$((LGY+GROU/2)),2000,0,0,-$GROU,-$((2000-GRL-RAD)),0;
ar0,-$RAD,90pr0,-$((LGY-GROU/2-2*RAD-GROU))ar$RAD,0,90;
pr$((2000-GRL-RAD)),0,0,-$GROU,-2000,0PM2pc1,$FARBE;ft1fp;pc1,0,0,0;
"
}


logo()  {
   #local rad=25 abs=6 ybr=10 neig=15 y
   local rad=$LGRAD abs=$(([6*LGRAD]/25)) ybr=$(([10*LGRAD]/25))
   local neig=$(([15*LGRAD]/25)) y
   y=$((rad*2-abs*2-ybr))
   echo "
pa$LGX,$LGY;pm0ci$((rad+[rad*4]/10)),0.5pm2tr0ft10,0fp;
pm0ci$rad,0.5pm2ft1fp;
pr0,$((rad-abs))pm0;
pr0,-$ybr,$neig,-$y,0,$ybr,-$neig,$y;
pm2ft10,0fp;
pr0,-$(([rad-abs]*2))pm0;
pr0,$ybr,-$neig,$y,0,-$ybr,$neig,-$y;
pm2fpft1tr1;
"
}

logo0()  {
   echo "
pa$LGX,${LGY}PM0ci${LGRAD}PM2tr0ft10,0FP;
pa$LGX,${LGY}PM0ci$(((LGRAD*3)/4))PM2ft1FP;
pr-$((LGRAD/2)),-$((GROU/2))ft10,0rr$LGRAD,$GROU;
pa$((LGX-LGRAD)),$((LGY+GROU/2+LGRAD/10))rr$((2*LGRAD)),$((LGRAD/2));
pa$((LGX-LGRAD)),$((LGY-GROU/2-LGRAD/10))rr$((2*LGRAD)),-$((LGRAD/2))tr;
pa$LGX,$LGY$LGTXT
pa$LGX,$((LGY-GROU/2-LGRAD/10-40))lo5sd4,12,5,0,6,3si.254,.20;
lbSOFTWARE%r|si;
"
}

abs()  {
   echo "
pa$LGX,$((LGY-LGRAD-100))lo5sd4,12.00,5,4,6,0;
lb$NAME|pr0,-38lb$STRASE|pr0,-38lb$ORT|pr0,-38sd4,9.5lb$TELFAX|;
"
}

striche()  {
   echo "
pupw.35;
pa0,$((1050-115))pdpr40,0pupr0,1050pdpr-40,0pupw.5pr0,-620pdpr40,0;
pupw0;
"
}

bank()  {
   echo "
pa$((GRL+RAD)),0tr0ft10,0rr600,28pr300,0sd4,7.5,6,0lo14lb$BANK|;
"
}

diverses()  {
   echo "
pa0,$((GROU+RAD))tr0ft10,0rr12,170di0,1sd4,2.75,5,0lo13;
lbSie wollen alles ganz genau wissen!|di;
pw0pupa$((200-56-20)),$((2*1050-115+170-20))pdpr30,0,-30,0,0,30,0,-30pu;
pr900,0pdpr-30,0,30,0,0,30,0,-30pupr0,440pdpr0,-30,0,30,-30,0,30,0pu;
pr-900,0pdpr30,0,-30,0,0,-30,0,30pupr$((50+20)),-40lo3sd4,7.00;
lbHelmut Schellong · Pestalozzi-Straße 72 · 32108 Bad Salzuflen%r|;
"
#2700:14.5mm vom oberen Blattrand
#0000:11.5mm vom unteren Blattrand, 5.6mm von links
#Brief:11cm hoch; Fenster 4.4x9cm, 2cm von links, 1.7cm von unten
#Brief:11cm hoch; Fenster 5x9cm, 2cm von links, 1.5cm von unten
#Blatt:296mm hoch; Striche 84, 148, 190mm v.o.; Rand li.=25mm
#      Fensterrahmen: 20+110mm v.l.; 21+71mm v.o.
}

end_gl()  {
   echo '%e%%0A%c'
}


start
schatten
logo
striche

abs
[ "$1" == -nobank ] || bank
diverses

end_gl

#[ $# -lt 1 -o $# -eq 1 -a "$1" = 3 ] && echo '%eE%c'
#cat $OFILE >> $DRUCKER
#[ -f $OFILE ] && rm $OFILE



###  sed.bish  #############################################




cd "$1"
shift
[ $# -ne 0 ] && files="$@"
[ $# -eq 0 ] && files=?*.[ch]

while :
do

read "old?ALT und NEU [aaa nnn]:  " new
ifset old || exit
ifset new || exit
print -r $files
read "abf?Dateien/Aenderungen abfragen? [yn][yn]: "
nowd='[^a-zA-Z_0-9]'

for file in $files
do
   expr "$file" =:: 'mb[0-9]%{2,%}%.h$' && continue
   expr "$file" =:: '^tmp_..*' && continue
   is=1
   grep -q "$nowd$old$nowd" "$file" && is=
   ifset is && grep -q "^$old$nowd" "$file" && is=
   ifset is && grep -q "$nowd$old%$" "$file" && is=
   ifset is && grep -q "^$old%$" "$file" && is=
   ifset is && continue
   inp=y
   echo "$file:"
   [[ "$abf" == y? ]] && read "inp?'$file'? [y]: "
   [ "$inp" != y ] && continue
   cat "$file" > "tmp_$file"
   4<&0
   cat "$file" | {
      3> "$file"
      while readl zeile zeile2
      do
	 is=1
         expr "$zeile" :zeile "%%($nowd%%)$old%%($nowd%%)" + "%%1$new%%2" && is=
         ifset is && expr "$zeile" :zeile "^$old%%($nowd%%)"   "$new%%1" && is=
         ifset is && expr "$zeile" :zeile "%%($nowd%%)$old%$"   "%%1$new" && is=
         ifset is && expr "$zeile" :zeile "^$old%$"   "$new" && is=
         inp=y
         ifset is || [[ "$abf" == ?y ]] && {
	    print -r "$zeile2"
	    echo
	    print -r "$zeile"
	    read -u4 "inp??[y]: "
         }
	 [ "$inp" != y ] && zeile="$zeile2"
         print -ru3 "$zeile"
      done
      ><
   }
   ><
done

read "inp?Sicherheitskopien '$(print -rn tmp_*)' behalten?[y]: "
[ "$inp" != y ] && remove -v tmp_*

read "inp?$0: Beenden?[y]: "
[ "$inp" == y ] && break

done





###  sed.bish  #############################################




[ $# -ne 0 ] && files="$@"
[ $# -eq 0 ] && files=?*.[chCH]
files="$files cfgbase.txt mesbase.txt"
read "old?ALT und NEU [aaa nnn]:  " new
ifset old || exit
ifset new || exit
expr "$old" :old '\s' += ' '
expr "$new" :new '\s' += ' '
print -r $files
read "abf?Dateien/Aenderungen abfragen? [yn][yn]: "
nowd='[^a-zA-Z_0-9]'

for file in $files
do
   expr "$file" =:: '[Mm][Bb][0-9]%{2,%}%.[Hh]$' && continue
   grep -qm -e "%%<$old%%>" "$file" || continue
   inp=y
   [[ "$abf" == y? ]] && read "inp?'$file'? [y]: "
   [ "$inp" != y ] && continue
   #cat "$file" > "tmp_$file"
   4<&0
   cat "$file" | {
      3> "$file"
      while readl zeile zeile2
      do
         is=1
         expr "$zeile" :zeile "%%<$old%%>" + "$new" && is=
         inp=y
         ifset is || [[ "$abf" == ?y ]] && {
            print -r "$zeile2"
            echo
            print -r "$zeile"
            read -u4 "inp??[y]: "
         }
         [ "$inp" != y ] && zeile="$zeile2"
         print -ru3 "$zeile"
      done
      ><
   }
   ><
done

       # expr "$zeile" :zeile "%%($nowd%%)$old%%($nowd%%)" + "%%1$new%%2" && is=
       # ifset is && expr "$zeile" :zeile "^$old%%($nowd%%)"   "$new%%1" && is=
       # ifset is && expr "$zeile" :zeile "%%($nowd%%)$old%$"   "%%1$new" && is=
       # ifset is && expr "$zeile" :zeile "^$old%$"   "$new" && is=
#read "inp?Sicherheitskopien '$(print -rn tmp_*)' loeschen? [y]: "
#[ "$inp" == y ]  && remove -v tmp_*

#read "-?$0: <Enter> "





###  sed.bish  #############################################

#!/u/bin/bish


Wl='%<'
Wr='%>'
O=.........
[ $# -eq 0 -o $# -eq 2 -o $# -eq 3 ] || exit
[ $# -eq 3 ] && O="$1" old="$2" new="$3"
[ $# -eq 3 -a "$O" != '-a' ] && exit 1
[ $# -eq 3 -a "$O" == '-a' ] && unset Wl Wr
[ $# -eq 2 ] && old="$1" new="$2"
sharefiles=./share/?*.[chCH]
mfiles=./mu2000/?*.[chCH]
ufiles=./upc3/?*.[chCH]
madd="./mu2000/cfgbase.txt ./mu2000/mesbase.txt ./mu2000/ver.txt"
uadd="./upc3/cfgbase.txt ./upc3/mesbase.txt ./upc3/ver.txt"
files="$sharefiles $mfiles $ufiles $madd $uadd"
expr "$files" =:files '%./%w%{2,}/mb[0-9]%{2,}%.h%>' += ''
expr "$files" =:files '%./%w%{2,}/t[0-9]h[^ ]%{2,}%>' += ''
expr "$files" =:files '%./%w%{2,}/texts[^ ]*%.h%>' += ''
[ $# -eq 0 ] && read "old?ALT und NEU [aaa nnn]:  " new
ifset old || exit
ifset new || exit
expr "$old" :old '\s' += ' '
expr "$new" :new '\s' += ' '
print -r $files

for file in $files
do
   grep -qm -e "$Wl$old$Wr" "$file" || continue
   cat "$file" | {
      > "$file"
      while readl zeile
      do
         expr "$zeile" :zeile "$Wl$old$Wr" + "$new"
         print -r "$zeile"
      done
      ><
   }
done

exit 0

#read "-?$0: <Enter> "





###  sed.bish  #############################################

#!/u/bin/bish


Wl='%<'
Wr='%>'
O=.........
[ $# -eq 0 -o $# -eq 2 -o $# -eq 3 ] || exit
[ $# -eq 3 ] && O="$1" old="$2" new="$3"
[ $# -eq 3 -a "$O" != '-a' ] && exit 1
[ $# -eq 3 -a "$O" == '-a' ] && unset Wl Wr
[ $# -eq 2 ] && old="$1" new="$2"
files=?*.[chCH]
files="$files cfgbase.txt cfgbase256.txt"
expr "$files" =:files '%<mb[0-9]%{2,}%.h%>' += ''
expr "$files" =:files '%<t[0-9]h[^ ]%{2,}%>' += ''
expr "$files" =:files '%<texts[^ ]*%.h%>' += ''
[ $# -eq 0 ] && read "old?ALT und NEU [aaa nnn]:  " new
ifset old || exit
ifset new || exit
expr "$old" :old '\s' += ' '
expr "$new" :new '\s' += ' '
print -r $files

for file in $files
do
   grep -qm -e "$Wl$old$Wr" "$file" || continue
   cat "$file" | {
      > "$file"
      while readl zeile
      do
         expr "$zeile" :zeile "$Wl$old$Wr" + "$new"
         print -r "$zeile"
      done
      ><
   }
done

exit 0

#read "-?$0: <Enter> "





###  sed.bish  #############################################

#!/u/bin/bish


set files:.1000
set file:.100
O=......... Wl=.... Wr=....
Wl=
Wr=
files=

[ $# -eq 0 -o $# -eq 2 -o $# -eq 3 ] || exit
[ $# -eq 3 ] && O="$1" old="$2" new="$3"
[ $# -eq 3 -a "$O" != '-a' ] && exit 1
[ $# -eq 3 -a "$O" == '-a' ] && Wl='%<' Wr='%>'
[ $# -eq 2 ] && old="$1" new="$2"

for file in  kap/??*.tex  mod/??*.tex
do  files="$files $file";  done

[ $# -eq 0 ] && read "old?ALT und NEU [aaa nnn]:  " new
ifset old || exit
ifset new || exit
expr "$old" :old '\S' += ' '
expr "$new" :new '\S' += ' '
print -r $files

for file in $files
do
   grep -qm -e "$Wl$old$Wr" "$file" || continue
   cat "$file" | {
      > "$file"
      while readl zeile
      do
         expr "$zeile" :zeile "$Wl$old$Wr" + "$new"
         print -r "$zeile"
      done
      ><
   }
done

exit 0

#read "-?$0: <Enter> "





###  sedm.bish  #############################################



RA='
w REQ_MOU1 REQ_MOUE
w REQ_MOU2 REQ_MOUI
'
W=......
set O:.50
set N:.50

for 3 W O N in $RA
do
   [ "$W" == a ] && W=-a
   [ "$W" == w ] && W=
   print -u2 "%t$W: $O $N"
   bish ./sed.bish $W "$O" "$N"
done


exit 0

w uart1sovr uartmsovr
w uart1crc uartmcrc
w uart0hw uartehw
w uart0buf uartebuf
w uart1hw uartmhw
w uart1buf uartmbuf
w uart2hw uartihw
w uart2buf uartibuf
w uart3hw uartfhw
w uart3buf uartfbuf
w uart0recv uarterecv
w uart1recv uartmrecv
w uart2recv uartirecv
w uart3recv uartfrecv
w uart1tmo0 uartmtmo0
w uart1tmo1 uartmtmo1
w uart1tmo2 uartmtmo2
w uart1tmo uartmtmo
w uart1tmo0 uartmtmo0
a TXIRPT(0) TXIRPT(UNE)
a TXIRPT(1) TXIRPT(UNM)
a TXIRPT(2) TXIRPT(UNI)
a TXIRPT(3) TXIRPT(UNF)
a RXIRPT(0) RXIRPT(UNE)
a RXIRPT(1) RXIRPT(UNM)
a RXIRPT(2) RXIRPT(UNI)
a RXIRPT(3) RXIRPT(UNF)
a TXDATA(0) TXDATA(UNE)
a TXDATA(1) TXDATA(UNM)
a TXDATA(2) TXDATA(UNI)
a TXDATA(3) TXDATA(UNF)
a RXDATA(0) RXDATA(UNE)
a RXDATA(1) RXDATA(UNM)
a RXDATA(2) RXDATA(UNI)
a RXDATA(3) RXDATA(UNF)
a ISTXDATA(0) ISTXDATA(UNE)
a ISTXDATA(1) ISTXDATA(UNM)
a ISTXDATA(2) ISTXDATA(UNI)
a ISTXDATA(3) ISTXDATA(UNF)
a ISRXDATA(0) ISRXDATA(UNE)
a ISRXDATA(1) ISRXDATA(UNM)
a ISRXDATA(2) ISRXDATA(UNI)
a ISRXDATA(3) ISRXDATA(UNF)
a CLRRXERR(0) CLRRXERR(UNE)
a CLRRXERR(1) CLRRXERR(UNM)
a CLRRXERR(2) CLRRXERR(UNI)
a CLRRXERR(3) CLRRXERR(UNF)
a GETRXERR(0) GETRXERR(UNE)
a GETRXERR(1) GETRXERR(UNM)
a GETRXERR(2) GETRXERR(UNI)
a GETRXERR(3) GETRXERR(UNF)
a RXERR(0) RXERR(UNE)
a RXERR(1) RXERR(UNM)
a RXERR(2) RXERR(UNI)
a RXERR(3) RXERR(UNF)
w U0t Uet
w U1t Umt
w U2t Uit
w U3t Uft
w U0r Uer
w U1r Umr
w U2r Uir
w U3r Ufr
w Putc0 PutcE
w Putc1 PutcM
w Putc2 PutcI
w Putc0i PutcEi
w Putc1i PutcMi
w Putc2i PutcIi
w Write0 WriteE
w Write1 WriteM
w Write2 WriteI
w Write0s WriteEs
w Write1s WriteMs
w Write2s WriteIs


###  segm.bish  #############################################

#!c:\u\bin\bish32.exe


sum=000000000000
Dir="$(prints s80-)"
F="$(prints s80-)"
vonbis="$(prints s80-)"
size="$(prints s80-)"
name="$(prints s80-)"
namen="$(prints s500-)"


[ $# -lt 1 ] && Dir=.
[ $# -ge 1 ] && Dir="$1"
[ "$Dir" == . ] && Dir=$(pwd)
expr "$Dir" =:: '[/\]lst$' || Dir="$Dir/lst"
conv -F/F\ Dir
[ -d "$Dir" ] || { echo "Keine Existenz: '$Dir'!"; exit 1; }
cd "$Dir"
echo Verzeichnis: $Dir
: *.mp1
[ $] -lt 1 ] && { echo "Keine *.mp1 vorhanden!"; exit 1; }

RamSZ=8 RomSZ=384
read "ramsz?RAM($RamSZ) und FLASH($RomSZ) [KB]: " romsz
expr "$ramsz" :: '^[0-9]%{1,}$' && RamSZ=$ramsz
expr "$romsz" :: '^[0-9]%{1,}$' && RomSZ=$romsz


namen=" "
for F in *.mp1
do
   echo "$F ..."
   5< "$F"
   while read -u5 vonbis size name - - - - -
   do
      expr "$vonbis" :: '^[0-9a-fA-F]%{8%}-[0-9a-fA-F.]%{8%}' || continue
      expr "$namen" :: " $name " || namen="$namen$name "
   done
   ><
   for Dir in $namen
   do
      sum=0
      5< "$F"
      while read -u5 vonbis size name - - - - snam
      do
         [ "$snam" == IOXTND -o "$snam" == INTVECT ] && continue
         expr "$vonbis" :: '^[0-9a-fA-F]%{8%}-[0-9a-fA-F.]%{8%}' || continue
         [ "$name" != "$Dir" ] && continue
         let "sum+=16#$size"
      done
      ><
      prints s20s13 "$Dir:" $sum
      case "$Dir" in
        IO)  IO=$sum;;
        DIR)  DIR=$sum;;
        DATA)  DATA=$sum;;
        STACK)  STACK=$sum;;
        CODE)  CODE=$sum;;
        CONST)  CONST=$sum;;
        DIRC)  DIRC=$sum;;
      esac
   done
done

echo
prints s20s13s13 RAM= $((DIR+DATA+STACK+DIRC)) $((RamSZ*1024-[DIR+DATA+STACK+DIRC]))
prints s20s13s13 FLASH= $((CODE+CONST)) $((RomSZ*1024-[CODE+CONST]))

read
:

#0000013E-........  00000000  DATA  P RW-- 02 REL  LIBINIT
#0000013E-........  00000000  DATA  P RW-- 02 REL  CINIT
#0000013E-0000015D  00000020  DATA  P RW-- 02 REL  INIT_lcd
#0000015E-00000177  0000001A  DATA  P RW-- 02 REL  DATA_uart
#00000178-00000179  00000002  STACK P RW-- 02 REL  USTACK
#00000180-0000018F  00000010  DATA  N RW-- 01 ABS  Register Bank No. 00





###  selT_txt.bish  #############################################

#!/u/bin/bish

set Z:.200 W:.20 N:.10 Np:.10

>"t_1"
for BF in "base/cfgbase.txt" "base/mesbase.txt"
do
   <"$BF"
   while readl Z
   do
      for W in $Z
      do
         expr "$W" :: '^T_[0-9a-z_]%{2,}$' || continue
         expr "$W" :: '^T_e_' && continue
         conv -TTD W
         catv W /%n
      done
   done
   ><
done
><

sortl t_1 | uniq > t_1

N=0 Np=0
>"t_2"
<"base/txtbase.h"
while readl Z
do
   expr "$Z" :Z ' %(D_[0-9a-z_]%{2,}%)_%d%d%d_en ' || continue
   grep -q "$Z" t_1 && { let ++Np; continue; }
   catv Z /%n
   let ++N
done
><<

sortl t_2 | uniq > t_2
catv /"$Np Textbezeichner aus dem Parameterbereich:%n" 0 %
     /"%n$N Textbezeichner außerhalb des Parameterbereichs:%n" 4 >t_3 <t_1 4<t_2
remove t_1 t_2




###  selfv.bish  #############################################

Tt='1011508099'
Nn='758'
Sperre='0'
SelfN='1831'


###  shell.bish  #############################################


cat $1 | {
   >$1
   while readl Z
   do
      expr "$Z" :Z '=$' = '' && { catv Z; continue; }
      catv Z /%n
   done
   ><
}



###  sizes.bish  #############################################

#!/u/bin/bish

K=1024
NA=1024
NV=128
NF=64
echo abuf=$((ABUF=5*K))
echo args=$((ARGS=NA*2)) nargs=$NA
echo vars=$((VARS=NV*8)) nvar=$NV
echo vbuf=$((VBUF=4*K))
echo vbufl=$((VBUFL=2*K))
echo fun=$((FUN=NF*4)) nfu=$NF
echo summe=$((ABUF+ARGS+VARS+VBUF+VBUFL+FUN))



###  sj.bish  #############################################

#!/home/bin/bish

for j from 1970 to 2079 repeat
do
      (( nsj+= cjsj= !(j%4)&&j%100||!(j%400) ))
      echo "/*$j*/  { $cjsj, $nsj },"
done

for j from 1970 to 2079 repeat
do
      (( cjsj= !(j%4)&&j%100||!(j%400) ))
      (( corr+= 24*3600*(365+cjsj) ))
      prints ss13 "/*$j*/  " "${corr}ul,"
done



###  stack.bish  #############################################

#!/u/bin/bish


NB=00000000
nb=00000000
nb0=00000000
esl=SELI
s=111
Dir="$(prints s80-)"
nam="$(prints s80-)"
nam0="$(prints s80-)"
na="$(prints s80-)"
F="$(prints s80-)"
LibStk="$(prints s80-)"
zeile="$(prints s500-)"
Zeile="$(prints s500-)"
ASM_C="../../lib/calib.c"


[ $# -lt 1 ] && Dir=.
[ $# -ge 1 ] && Dir="$1"
[ "$Dir" == . ] && Dir=$(pwd)
expr "$Dir" =:: '[/\]obj$' || Dir="$Dir/obj"
conv -F/F\ Dir
[ -d "$Dir" ] || { echo "Keine Existenz: '$Dir'!"; exit 1; }
cd "$Dir"
echo Verzeichnis: $Dir
: *.stk
[ $] -lt 2 ] && { echo "Keine/zuwenig *.stk vorhanden!"; exit 1; }

for F in *.stk
do
   expr "$F" :: '[lL][iI][bB]9..[slmcSLMC]%....$' && {
      LibStk=$F; continue
   }
done

[ -s "$LibStk" ] || { echo "Keine lib9##x.stk vorhanden!"; exit 1; }

[ -s "$ASM_C" ] && grep '^[ %t]*FOO(%w%w*)' "$ASM_C" | {
   > asm_c_stk
   while readl Zeile
   do
      expr "$Zeile" :zeile 'FOO(%([^)]%{1,}%))' || continue
      catv '/ 4 E ' /_ zeile /%n
   done
   ><
   cat asm_c_stk >> calib.stk
}


GetStkLen()  {
   #local zeile
   #zeile="$( grep -m -e $2 $3 )" || return
   zeile="$( grep -m -e $2 $3 )" || zeile=8
   expr "$zeile" :$1 '^%([0-9]%{1,%}%)'
   return 0
}


GetStkLenLib()  {
   zeile="$( grep -m -e "[ %t]$2[ %t]*" $LibStk )" || return
   expr "$zeile" :$1 '%([0-9]%{1,%}%)'
   return 0
}



echo .stk-Dateien Konversion ...
> fuu.txt
for F in *.stk
do
   expr "$F" :: '[lL][iI][bB]9..[slmcSLMC]%....$' && {
      print -u2 "%t-- $F --"
      continue
   }
   print -u2 "%t$F" 
   < $F
   while read nb esl nam a
   do
      ifset nb esl nam || continue
      expr "$esl" :esl '^%([ESILesil]%)' || continue
      [ "$a" == A -a "$nb" == 0 ] && nb=8
      expr "$nb" :nb '^%([0-9]%{1,%}%)' && print "$nb +$esl$nam+"
   done
   ><
done
><



echo .stk-Dateien Konversion2 und Bytes ...
> stack.txt
for F in *.stk
do
   expr "$F" :: '[lL][iI][bB]9..[slmcSLMC]%....$' && {
      print -u2 "%t-- $F --"
      continue
   }
   print -u2 "%t$F" 
   < $F
   while read nb esl nam a
   do
      ifset nb esl nam || continue
      expr "$esl" :esl '^%([ESILesil]%)' || continue
      na="$nam"
      nam="$esl$nam"
      [ "$a" == A -a "$nb" == 0 ] && nb=8
      expr "$nb" :nb '^%([0-9]%{1,%}%)' && {
         nam0=$nam nb0=$nb
         print "$nam:$nb"
         continue
      }
      expr "$nb" :: '^->' && {
         GetStkLen NB "+$nam+" fuu.txt || GetStkLenLib NB "$na" || {
            print -u2 "'$nam' nicht gefunden!"
            ><< ; read "-?<Enter> "; exit 1
         }
         cmpv nam nam0 && print -u2 "Rekursiv!: $nam0:$nb0 $nam:$NB" && continue
         print "$nam0:$nb0 $nam:$NB"
      }
   done
   ><
done
><


fstat -s stack.txt
nb=0
echo Verschachtelter Scan ...%c
cat stack.txt > fuu.txt
while ifset s
do
   print -u2
   prints su210- $((++nb))
   s="" nb0=0
   #cat stack.txt > fuu.txt
   cat stack.txt | {
      > stack.txt
      while readl Zeile
      do
         print -u2 "%r%c"
         prints su210s10- $nb $((++nb0))
         ifset Zeile || continue
         expr "$Zeile" :nam ' %([^ %t]%{1,%}%)$' || { print -r "$Zeile"; continue; }
         grep -e "^$nam " fuu.txt > fuu2.txt || { print -r "$Zeile"; continue; }
         s=1
         3< fuu2.txt
         while read -u3 - zeile
         do 
            print -r "$Zeile $zeile"
         done
         ><
      done
      ><
   }
done
print -u2



fstat -s stack.txt
echo Summenbildung ...
cat stack.txt | {
   > stack.txt
   while readl Zeile
   do
      NB=0
      for nam in $Zeile
      do
         expr "$nam" :nb ':%([0-9][0-9]*%)'
         let "NB+=nb"
      done
      prints s5s $NB "  $Zeile"
   done
   ><
}


fstat -s stack.txt
echo Sortierung ...
sortl -r -fn1 -ostack.txt stack.txt || echo -$?- Fehler bei sortl-Kommando!
fstat -s stack.txt
echo Interrupts ...
grep ' I' stack.txt > fuu2.txt
echo >> fuu2.txt
cat fuu2.txt stack.txt | cat > stack.txt

fstat -s stack.txt
echo ID-Buchstaben entfernen ...
cat stack.txt | {
   > stack.txt
   while readl Zeile
   do
      expr "$Zeile" :Zeile '%([ %t]%)[ISEL]' + '%1'
      expr "$Zeile" :Zeile '^[ISEL]' ''
      print -r "$Zeile"
   done
   ><
}


fstat -s stack.txt
remove fuu.txt fuu2.txt
read "-?bish:$0: <Enter> "





###  start.bish  #############################################

#!\bish\bish.exe
# Start-Skript für bish-Shell-Programm - Freeware
# Copyright (C) 1997  H.Schellong, Bad Salzuflen


trap 'ifset R && echo "%e[0;37;40m%c"
      #ifset tempfile && [ -f $tempfile ] && DEL $tempfile
      ifset OV && $S_DIR\bin\ov.com -q $OV
      echo "%n*** Skript-Abbruch ***%n"
     ' 1 2

#T=/
#alias copy=cp mkdir=mkdir
#expr "$PWD" :: '^[a-zA-Z]:.*' && { T=\; alias copy=COPY mkdir=MD; }
set -f
#T=\
ifenv S && S='                              '
ifenv R && R=
X=0000000000
e=`echo %e%c`   #ESCape für prints
inp="`prints s300-`"


ifset -E S_DIR BISHTEMP || {
   echo Sie haben dieses Script nicht mittels start.bat gestartet
   echo oder es liegt ein unerwarteter Fehler vor.
   exit
}


whence -ep mem || [ $? -eq 10 ] &&
   mem /d | grep -iq '[^a-zA-Z]ansi[^a-zA-Z]*' &&
   whence -ep mode || [ $? -eq 10 ] &&
   mode con | grep -q '[^0-9]25[^0-9]' &&
   mode con | grep -q '[^0-9]80[^0-9]' &&
      R='%e[2C' S='%e[0;30;46m%e[2;3H'

ifset R || {
   VER | grep -iq caldera &&
   grep -iq '^device.*=.*ansi%.' c:\config.sys &&
   R='%e[2C' S='%e[0;30;46m%e[2;3H' &&
   { echo Caldera-DOS + ANSI; sleep 1; }
}

ifset R || {
   prints sf-72
   echo Es konnte nicht ermittelt werden, daß Ihr ANSI-Treiber
   echo für den Bildschirm %(i.d.R. c:\dos\ansi.sys%) installiert ist!
   echo Diese Batch-Datei benötigt diesen Treiber für Farbeinstellungen
   echo und zur Cursor-Steuerung.
   echo Entweder wurden die externen Kommandos "'mem' und/oder 'mode'"
   echo nicht gefunden oder aber die Ausgabe dieser Kommandos enthielt
   echo nicht die erforderlichen Informationen.
   echo
   echo Folgender Eintrag in Ihrer config.sys:
   echo "     devicehigh=c:\dos\ansi.sys /x"
   echo %(od.ähnl.%) muß vorhanden sein.
   echo
   echo Sie können trotzdem fortsetzen, indem Sie nachfolgend
   echo "das Wort 'ansi' eingeben."
   echo Dabei sollten Sie aber sicher sein, daß ein ANSI-Treiber
   echo geladen wurde und 25/80 Zeilen/Spalten eingestellt sind.
   echo Andernfalls erhielten Sie unleserliches Durcheinander
   echo auf dem Bildschirm!
   prints sf-72
   read "inp?     Eingabe zum Fortsetzen: "
   [ "$inp" != ansi ] && { echo "'$inp' ==> Abbruch"; exit; }
   R='%e[2C' S='%e[0;30;46m%e[2;3H'
}

[ $S_DIR == . -o $S_DIR == .\ ] && S_DIR=$PWD

local ABAT='c:\autoexec.bat' CSYS=c:\config.sys

for ABAT from 100 to 199 repeat
do
   tempfile=$BISHTEMP\startbish.$ABAT ; conv -F\ tempfile
   [ ! -e $tempfile ] && echo $tempfile > $tempfile &&
                         [ -s $tempfile ] && break
   [ $ABAT -ge 199 ] && { echo Fehlschlag $tempfile;tempfile=;exit; }
   tempfile=''
done

echo Temporäre Datei ist: "'$tempfile'"
ABAT=c:\autoexec.bat
[ `ver w` == shw ] && { echo Bitte warten...; sleep 3; }


#fehler()  { echo "%n start.bish:  '$1'%n"; exit 1; }
#stop()  { read "-?start.bish: <Enter> "; }


frage()  {
   [ $# -lt 1 ] && { read "-?start.bish: <Enter>"; return 0; }
   while echo "%n$1  [jn]:  %c"
   do
     read inp
     case "$inp" in
       [jJ])  return 0 ;;
       [nN])  return 1 ;;
         #M)  return 2 ;;
         #!)  read "inp?"`pwd`":> "; system "$inp"; continue ;;
          *)  continue ;;
     esac
   done
   return 3
}


info()  {
   local r="       " rd n=1
   ansiscreen
   ifset R && r='%e[4C '
   while :
   do
   ifset R && { echo '%e[0;37;40m%c'
      for rd from 3 to 23 repeat; do prints ss72- "${e}[$rd;5H" ""; done
      echo '%e[3H%c'
   }
   [ $n == 1 ] &&
echo "$r bish.exe v3.05  -  UNIX-Shell-Programm für DOS
$r -----------------------------------------------------
$r Das Shell-Programm arbeitet jetzt gerade das Skript
$r 'start.bish' ab - eine lesbare Batch-Textdatei.
$r Alle Funktionen, die hier angeboten sind, können allein
$r von der 'bish' erledigt werden. Und wenn externe Programme
$r benutzt werden, dann als Beispiel - notwendig sind sie selten.
$r Die bish (Batch-Shell) mit ihren Shell-Scripts '*[.bish]'
$r ist mit command.com und seinen '*.bat' prinzipiell
$r vergleichbar. Allerdings ist die bish vielleicht um einen
$r Faktor 30-50 leistungsfähiger als command.com.
$r
$r Dieses Start-Skript ist als Anschauungsbeispiel geeignet,
$r jedoch konzeptionell an die begrenzten Möglichkeiten
$r der Shareware-Version angepaßt.
$r Das heißt, mit der Vollversion kann man noch wesentlich
$r 'schöner', einfacher und souveräner programmieren.
$r Sogar Scripts sind möglich, die wie defrag,scandisk,...
$r mit Fenstern auf dem Bildschirm erscheinen!"

   [ $n == 2 ] &&
echo "$r Das Skript ist gleichzeitig als Demo, Anschauungsobjekt,
$r Anregung und kleine Installationshilfe gedacht, wobei letztere
$r kaum notwendig ist.
$r Bei Durchsicht des Skriptes wird man unschwer erkennen, daß
$r sehr darauf geachtet wurde, möglichst wenige Funktionen,
$r Variablen und Verschachtelungen zu erzeugen.
$r Daraus ergibt sich ein streckenweise unschön aussehender
$r und unnötig umfangreicher Skript-Text.
$r Der Grund dafür wurde oben bereits genannt: Shareware-Limits.
$r
$r Trotz der Ressourcenbeschneidung ist es gelungen, einige sehr
$r mächtige Funktionen zu verwirklichen.
$r Das komplexeste Beispiel dieses Skripts ist eine Light-Version
$r des UNIX-Kommandos 'tar', die alle Grundfunktionen bietet und
$r kompatibel mit den Original-Kommandos ist.
$r Das Archiv 'bish.tar' kann hiermit ausgepackt werden.
$r Eine weitere erstaunliche Funktion ist im Menü mittels Punkt 'b'
$r (b=Blocksatz)  aktivierbar.
$r Auf der nächsten Seite mehr davon..."

   [ $n == 3 ] &&
echo "$r Dennoch sind es netto nur etwa 60 Zeilen Skript-Text, die
$r dafür benötigt wurden. - Arbeitsergebnis:
$r
$r           Gebrauch. Nutzung  an  allen  Computern  des
$r           Kunden. Herstellung beliebig  vieler  Kopien
$r           auf Festplatten, die sich  im  Kundenbereich
$r           befinden.  Herstellung  von  bis   zu   zwei
$r           Disketten-Kopien    pro    Computer     oder
$r           Computer-Terminal, die sich im Kundenbereich
$r           befinden.    Sämtliche     Kopien     müssen
$r           Urheberrechts-Vermerke (Copyright) enthalten
$r           bzw. tragen, wie die Original-Software  bzw.
$r           die Original-Diskette(n). Die Software  darf
$r           Dritten  nicht  zugänglich  gemacht  werden.
$r           Kopien     müssen     Urheberrechts-Vermerke
$r
$r Das Ausstattungsmerkmal einer automatischen Worttrennung
$r ist in diesen Demo-Blocksatz allerdings nicht eingebaut.
$r Die Lückenbreite würde dadurch begrenzt."

   [ $n == 4 ] &&
echo "$r Die Blocksatz- und die Tar-Funktion wurden keineswegs
$r mit irgendwelchen Spezial-Kommandos realisiert, sondern nur
$r mit elementarer Grundausstattung der bish.
$r Am Beispiel dieser Funktionen wird erkennbar, daß man allein
$r mit 'bish.exe' nahezu alles machen kann, was vorstellbar ist!
$r Nimmt man die Kommandos 'dd' und 'bgrep' für den Binärbereich
$r hinzu, ist man in der Lage, jede beliebige Byte-Folge von jedem
$r beliebigen Ort zu lesen, an jeden zu schreiben und zu suchen.
$r
$r Bei diesen Schilderungen wird sicher langsam sichtbar, daß die
$r bish ein extrem mächtiges Universal-Werkzeug ist, mit dem
$r letztlich alle in der Praxis vorkommenden Probleme lösbar sind.
$r
$r Die Anwenderschaft wird sich aber stets in mindestens zwei
$r Gruppen spalten. Und zwar gibt es diejenigen, die willens und
$r in der Lage sind, zumindest kleinere Batch-Dateien zu schreiben,
$r und diejenigen, die nur fertige Programme für jeden Einzelzweck
$r kaufen - mit all den Vor- und Nachteilen."

   [ $n == 5 ] &&
echo "$r Nachfolgend wird die Leistungsfähigkeit der bish aufgezeigt
$r und Vergleiche mit anderen Shell-Programmen gezogen:
$r
$r       A r b e i t s g e s c h w i n d i g k e i t
$r ------------------------------------------------------------------
$r bish   ************************************************************
$r ksh   *******************************************
$r zsh   *****
$r bash  ***
$r csh   **
$r 4dos  *
$r sh    -
$r ------------------------------------------------------------------
$r (s.a. Manual bish.mnv)
$r Die bish ist das schnellste aller Shell-Programme.
$r Vergleichbar in diesem Punkt ist bisher nur die ksh unter SCO-Unix.
$r
$r Das Arbeitstempo wird dann wichtig, wenn eine Shell für ein Skript
$r wenige Sekunden benötigt, eine andere jedoch mehrere Minuten!"

   [ $n == 6 ] &&
echo "$r Die Größen der Shell-Executables:
$r ---------------------------------------------------------------
$r bish        95K (DOS), 103K (COFF), 87K (ELF)
$r 4dos      180K (DOS)
$r ksh       152K (ELF)
$r zsh       503K (COFF)
$r bash      528K (COFF)
$r csh        75K (ELF)
$r sh         57K (ELF)
$r ---------------------------------------------------------------
$r Als einzige Shell hat die bish zusätzlich die Kommandos
$r    grep, expr, tr, cut, cat, prints, sum, crc,
$r    wc, line, tee, catv, base, ...
$r eingebaut(!), die man nicht als typische Buildins bezeichnen kann,
$r sondern eher als kleine bis mittelgroße Arbeitskommandos,
$r wobei die ersten beiden sogar Regular Expressions verarbeiten.
$r Unter diesem Blickwinkel und in Anbetracht der noch folgenden
$r Informationen ist die Größe von anderen Shells sehr erstaunlich."

   [ $n == 7 ] &&
echo "$r Arithmetik- und Logik-Modul der bish:
$r ---------------------------------------------------------------
$r ()  []  {}   !  ~  ++  --  +  -  *   *  /  % +  -
$r <<  >> <  <=  >  >= ==  !=   & ^ | && ^^ ||   ?:
$r =  +=  -=  *=  /=  %=  &=  ^=  |=  <<=  >>=   , ;
$r
$r array[...array[arithm_expr]...]
$r Zahlenbasis:  2-36, 256
$r typeset -i   ((...))   %$((...))   let %"...%" ...
$r ---------------------------------------------------------------
$r Die bish verarbeitet alle Operatoren der Sprache C und noch
$r etwas mehr. Der Umfang ist hier mit dem der zsh vergleichbar.
$r
$r Arrays können auch außerhalb von aritm. Ausdrücken gesetzt
$r werden (a[i]=wert) und  cond?true:false  kann auch links
$r vom Gleichheitszeichen stehen.
$r Die modernen Shells (ksh,bash,zsh,bish) haben -insgesamt-
$r eine wesentlich höhere Komplexität als die Sprache C !"

   [ $n == 8 ] &&
echo "$r Weitere Vergleichskriterien:
$r                 bish   ksh   zsh   bash  csh    sh  4dos
$r ---------------------------------------------------------------
$r Kommandos       76    35    58    41    26    27   >50
$r Prozeßmanagem.   0     5    10     7     2     0     0
$r Alternativnamen  1     0    14     1     1     0     0
$r if               -     -     -     -     *     -     *
$r if-elif-else     *     *     *     *     .     *     .
$r for name in      *     *     *     *     *     *     .
$r for n name...    *     -     -     -     -     -     -
$r for ... repeat   *     -     *     -     .     -     *
$r while, until     *     *     *     *     *     *     *
$r case             *     *     *     *     *     *     -
$r function()       8     6     6     6     0     6     0
$r alias            6     7     7     7     9     0     7
$r Arithmetik       8     6     8     6     3     0     2
$r Arrays           9     8     8     8     5     0     2
$r Wildcards        8     9     9     9     8     9     2
$r RegExpr          *     -     -     -     -     -     -"

   [ $n == 9 ] &&
echo "$r Abschließende Vergleichskriterien:
$r                 bish   ksh   zsh   bash  csh    sh  4dos
$r ---------------------------------------------------------------
$r Lokale Objekte   8     3     3     3     0     0     1
$r Umlenkungen      7     8     8     8     4     7     2
$r Dateien          9     5     6     5     5     5     7
$r Pipeline         7     9     9     8     7     6     4
$r Exit-Code        9     7     7     7     3     6     3
$r Struktur.Syntax  8     8     8     8     7     7     1
$r goto             *     -     -     -     *     -     *
$r Syntax-Menge     7     8     9     8     5     4     6
$r Binär-Operat.    8     2     2     1     0     1     1
$r Binär-Variabl.   *     *     *     -     -     -     -
$r Kdo.Substitut.   9     8     8     7     7     7     0
$r Maskierung       8     7     7     7     5     6     2
$r Argum.bildung    8     8     8     7     6     6     2
$r Spelling         -     *     *     *     *     *     *
$r Help             5     5     5     7     5     5     8
$r Portabilität    all   ux    ux    ux    ux     ux   dos"

   [ $n == 10 ] &&
echo "$r Fazit aus den Vergleichsbetrachtungen:
$r ---------------------------------------------------------------
$r Es ist eine Tatsache, daß man bei dem Versuch, die unterschied=
$r lichsten Probleme zu lösen, mit der bish am seltensten in eine
$r Sackgasse läuft. Mit der vorliegenden Version 2.4 ist das in
$r Praxis noch nie vorgekommen.
$r Die zsh ist nach der bish einerseits die erste Wahl, jedoch bei
$r zeitkritischen Aufgaben bekommt die ksh nach der bish den
$r zweiten Platz.
$r Als Autor der bish bin ich natürlich prinzipiell befangen,
$r es läßt sich aber nicht wegdiskutieren, daß die bish, obwohl für
$r DOS und alle anderen Systeme konzipiert, die schnellste,
$r fast die kleinste, und diejenige Shell mit dem mächtigsten
$r Inhalt und der größten Problemlösungskraft ist.
$r Die bish ist allen anderen existierenden Shell-Programmen
$r deutlich bis haushoch überlegen!
$r Die meisten Ausstattungsmerkmale der bish, die über den Grundstock
$r der ksh hinausgehen, sind in Folge konkreter, in der Praxis
$r aufgetauchter Programmiernöte entstanden."

   [ $n == 11 ] &&
echo "$r Zum eingebauten tar-Kommando:
$r
$r Erzeugung eines Archivs:   tar cf arch ./dir ./datei ...
$r Erweitern eines Archivs:   tar rf arch ./dir ./datei ...
$r Inhalt auflisten       :   tar tf arch
$r Archiv auspacken       :   tar xf arch
$r Abbruch                :   <Enter>
$r
$r Verzeichnisse werden rekursiv erfaßt.
$r Wildcards sind möglich:   ./dir/*.txt
$r Bei allen tar-Kommandos sollte man stets relative und
$r mit ./ oder .\ beginnende Angaben machen!
$r tar erzeugt später keine Verzeichnisse, falls man nur
$r ./dir/datei angibt. Dazu muß man (auch) ./dir angeben, weil
$r nur hierbei ein spezieller dir-Dateikopf erzeugt wird.
$r Das ist auch unter Unix teilweise so.
$r Das Verzeichnis kann man unter Menü '#' wechseln!
$r Das Kommando erzeugt Prüfsummen der Dateiköpfe.
$r Bei unpassenden Prüfsummen muß tar abbrechen!"

   [ $n == 12 ] &&
echo "$r tar-Archive wurden unter DOS und unter UNIX mit allen
$r Grundfunktionen erfolgreich getestet.
$r Dieser TARchiver kann nicht direkt mit Disketten arbeiten,
$r dazu braucht man zusätzlich eine dazu fähige 'dd.exe'.
$r (Gibt es für DOS meines Wissens nur von mir.)
$r
$r DOS mag es überhaupt nicht, wenn man von der Festplatte liest
$r und gleichzeitig auf sie schreibt.
$r Es ist mehrere 10x(!) schneller, beispielsweise ein tar-Archiv
$r auf einer RAM-Disk entstehen zu lassen:
$r      :  tar cf r:\ta ./doc ./man
$r      >  dd if=r:\ta of=fd0:c80h2s18 bs=18k
$r Das dd-Kommando ist übrigens recht schnell, es benötigt
$r nur etwa 30 Sekunden pro MByte auf Floppies.
$r
$r Solchermaßen hergestellte Floppies sind unter DOS nicht lesbar,
$r da das tar-Archiv byte-linear ohne Dateisystem kopiert wird.
$r Aber unter UNIX unmittelbar:  tar tvnf /dev/rfd0135ds18."

   [ $n == 13 ] &&
echo "$r Die Shell wird bei manchen Aktionen beträchtlich schneller,
$r wenn man die Variable TEMP auf ein gültiges Verzeichnis einer
$r RamDisk setzt!  Beispielsweise 'set TEMP=e:\'.
$r Die Shell verwendet temporäre Dateien für Funktionen, Substitution
$r und um Pipes nachzubilden.
$r BISHTEMP ist diejenige Variable, die die bish zuallererst sucht.
$r Die Inhalte der Temp-Variablen müssen stets gültig sein.
$r
$r Beim Ratespiel (Menü=r) muß man die Fragen natürlich
$r korrekt beantworten, sonst bleibt der richtige Wert versperrt.
$r Nach maximal 10 Versuchen hat der Algorithmus den Wert
$r gefunden, und zwar weil 1000 ungefähr 2^10=1024 ist.
$r Falls vorhanden, wird eine Lesefunktion benutzt, bei der man
$r nicht mit <Enter> abschließen muß."

   [ $n == 14 ] &&
echo "$r Dieses Skript erzeugt eine temporäre Datei.
$r Diese Datei/en wird/werden nicht gelöscht, damit
$r beispielsweise die Möglichkeit nicht versperrt ist,
$r das Ergebnis einer Blocksatzerzeugung zu verwerten.
$r
$r Zum Dokumentationssystem gehören die Kommandos
$r man.exe, pg.exe und upat.exe.
$r Lesbare Dateien kann man mittels 'man [R] kdo > datei'
$r herstellen, für den Fall, daß im Verzeichnis .\doc
$r nicht alle Dateien aus .\man vorhanden sind.
$r
$r Man beachte bitte, daß der Lieferumfang der Shareware
$r nicht alles enthält, was insgesamt in der Dokumentation
$r beschrieben ist."

   [ $n == 15 ] &&
echo "$r D i e   P r o g r a m m i e r u n g   d e r   b s h
$r ist recht einfach, wenn man Schritt für Schritt vorgeht.
$r Man sollte nicht versuchen, die gesamte Dokumentation
$r auf einen Schlag verstehen zu wollen.
$r
$r Die Manuals bish.mn? und regexp.mnr informieren hierzu.
$r
$r Der Kommandozeilen-Editor in Verbindung mit Ausgabe-Kommandos,
$r wie beispielsweise 'echo', eignet sich sehr gut dazu, mit
$r der Shell auf harmlose Weise allerlei auszuprobieren.
$r
$r Nachfolgend werden Tabellen zu den Zeichen mit Spezialbedeutung
$r und zu den internen Kommandos aufgeführt:
$r ---------------------------------------------------------------
$r ;  NL  (&)       Trennen Kommandos (und Pipes,Listen) voneinander
$r SPACE  TAB       Trennen Argumente voneinander
$r &&  ||  &|       Exit-Code-abhängige Verkettung von Kommandos
$r |   |!  |2 (|h)  Verknüpfung von Aus- und Eingabe von Kommandos"

   [ $n == 16 ] &&
echo "$r Fortsetzung Zeichentabelle:
$r > >> < << <>     Umlenkung von Aus- und Eingabe von Kommandos
$r {...}  {{...}}   Zusammenfassung von Kommandos
$r %$(...)  %`...%`    Einsetzung der Ausgabe von Kommandos
$r %$(-..)  %`-..%`    Einsetzung der Ausgabe von Kommandos
$r %$..  %${..}       Einsetzung eines Variablen- oder Parameterinhalts
$r %${#..}           Einsetzung einer Variablen- oder Param.inh.länge
$r %${..:x..}        Entweder/Oder-Einsetzung
$r %$((...))         Einsetzung des Resultats eines arithm. Ausdrucks
$r ?  *  [          Einsetzung von passenden Dateinamen (Wildcards)
$r name[i]          Arrays
$r ((...))          Berechnung eines arithmetischen Ausdrucks
$r (...)            Sub-Shell-Aufruf
$r %"..%"  '..'  %    Maskierende Einfassungen und Maskierzeichen
$r =                Variablen-Zuweisung
$r ;;  ;,           Beenden eine Kommando-Folge beim case-Kommando
$r fname()  {   }   Definition einer Shell-Funktion
$r fname()) {  )}   Definition einer (verschacht.) Shell-Funktion"

   [ $n == 17 ] &&
echo "$r Fortsetzung Zeichentabelle:
$r %NL               Zeilenverlängerung
$r #                 Kommentar-Zeichen
$r label:            goto-Marke
$r :                 Leer-Kommando
$r [[...]]  [...]    Symbolische Syntax des test-Kommandos
$r ^.*[^a-b]%{a,b%}  Reguläre Ausdrücke = Super-Wildcards
$r  %(%)%1%9%$        Reguläre Ausdrücke = Super-Wildcards
$r
$r S c h l ü s s e l w o r t e :
$r
$r if then else elif fi  case esac     Schlüsselwort-Kommandos
$r   for while until do done  time     Schlüsselwort-Kommandos
$r           in  from by to repeat     Schlüsselwort-Argumente
$r                       { } {{ }}     Schlüsselwort-Kommando-Paare
$r                       [ ] [[ ]]     Kommandos mit Schlußargument
$r           break continue  goend     Programmier-Kommandos
$r                    return  goto     Programmier-Kommandos"

   [ $n == 18 ] &&
echo "$r Kommando-Liste:
$r .           Skript-Aufruf (. datei arg ...)
$r :           Exit-Code
$r true        Exit-Code
$r false       Exit-Code
$r inv         Exit-Code
$r typeset     Variablen-Typ (binär,basis)
$r readonly    Variablen
$r export      Variablen
$r unexport    Variablen
$r unset       Variablen
$r unsetenv    Variablen
$r local       Variablen
$r localset    Variablen
$r static      Variablen
$r global      Variablen
$r env         Variablen
$r array       Variablen, Arrays
$r set         Variablen, Arrays, Optionen"

   [ $n == 19 ] &&
echo "$r Fortsetzung Kommando-Liste:
$r shift       Parameterkette verschieben
$r conv,cmpv   Variablen-Bearbeitung und -Vergleich
$r ifdef       Variablen-Test
$r ifset       Variablen-Test
$r ifenv       Variablen-Test
$r alias       Aliases
$r unalias     Aliases
$r echo        Ausgabe
$r print       Ausgabe
$r prints      Ausgabe, universell, formatiert
$r fprint      Ausgabe, Funktionskörper
$r catv        Extrem universelle, binäre Eingabe/Ausgabe
$r seek        Dateizeiger
$r read        Eingabe
$r readc       Eingabe
$r readl       Eingabe
$r line        Eingabe/Ausgabe
$r test        Universal-Bedingungsprüfer"

   [ $n == 20 ] &&
echo "$r Fortsetzung Kommando-Liste:
$r fmode       Datei-Attribute
$r fsize       Datei-Attribute
$r mtime       Datei-Attribute
$r stime       Datei-Attribute
$r umask       Datei-Attribute
$r basename    Datei-Namen
$r dirname     Datei-Namen
$r let         Arithmetik
$r base        Zahlen-Darstellungsbasis, multi-funktional
$r cd          Directory
$r chdir       Directory
$r pwd         Directory
$r eval        Mehrfache Shell-Interpretation
$r trap        Signal-Reaktionen
$r exec        Programm ausführen und damit Shell beenden
$r exit        Shell beenden
$r extern      Externes Programm ausführen
$r system      Kommandoausführung durch Standard-Shell"

   [ $n == 21 ] &&
echo "$r Abschluß Kommando-Liste:
$r prompt      Shell rekursiv interaktiv aufrufen
$r sleep       Zeitdauer
$r times       Zeitdauer
$r type        Bedeutung von Namen herausfinden
$r whence      Bedeutung von Namen herausfinden
$r sane        Dateinummern rückverknüpfen (sanieren)
$r expr        Operationen mittels regulärer Ausdrücke
$r grep        Zeilensuche mittels regulärer Ausdrücke
$r tr          Universelle Zeichen-Veränderungen
$r cat         Dateien-Verkettung
$r cut         Datei-Ausschnitte
$r crc         Prüfsummen
$r sum         Bytesummen
$r tee         Umlenkungs-Zusatzverzweigung
$r wc          Zählt Zeilen, Worte, Zeichen
$r rel         Entfernt bestimmte Zeilen
$r ver         Programmversion
$r autor       Programmautor"

   let "++n>21" && n=1
   ifset R && echo "%e[23;5H%c"
   read rd"?(e=ende;1,2,3,...=seite) >>>$n"
   [ "$rd" == e ] && break
   expr "$rd" :: '^[1-9][0-9]*$' && n=$rd
   done
}

#prints s-12n- $( cat bishKL.mnk | tr -s ' ' \10 ) >> start.bish



systhem()  {
   ifset R && [ $# -eq 1 -a "$1" != rate ] && echo '%e[0;37;40m%e[2J%c'

   [ "$1" == auto -o "$1" == conf ] && {
     prints sf-72
     echo Bevor $ABAT oder $CSYS verändert werden, werden
     echo garantiert Sicherheitskopien gemacht, genau geprüft
     echo und schreibgeschützt!
     echo "(Bei Dateinamen wird auch / anstatt \ akzeptiert.)"
     echo "(Bei Fragen [jn] kommen Sie per 'n' manchmal zum Hauptmenü"
     echo " zurück - beispielsweise jetzt.)"
     prints sf-72
     frage "Wollen Sie fortsetzen?" || return 0
   }

   case $1 in
     copy)

   local  a='               ' b='            '
   if [ -s $2 -a ! -s $3 ]
   then
      while  a=` ATTRIB $2 `
             expr "$a" :: "[sShHrR][ %t][ %t]*[^ %t][^ %t]*"'$'
      do
         echo Schreibschutz liegt vor: "'$a'" !
         frage "Wollen Sie den Schreibschutz entfernen?" || {
            echo Es erfolgt Rückkehr zum Hauptmenü.; frage; return 1; }
         ATTRIB -S $2 ; ATTRIB -H $2 ; ATTRIB -R $2
      done
      if COPY /Y $2 $3 && [ -s $3 ] && a=`crc $2` &&
         b=`crc $3` && ifset a b && [ "$a" -eq "$b" ] &&
         [ `fsize $2` -eq `fsize $3` ] && ATTRIB +R $3
      then
         echo $2 wurde erfolgreich kopiert: $3
         echo %(Kopiert wird nur, wenn $3 nicht existiert%c
         echo % oder leer ist.%)
         a=`grep -c '%z' $2`
         [ $a -gt 0 ] && {
            echo Sie haben $a ^Z-Zeichen in Ihrer $2 !
            echo Diese Zeichen müssen später entfernt werden
            echo oder am Dateiende stehen.
         }
      else
         echo Beim Kopieren von $2 nach $3 gab es einen Fehler!
         echo Es erfolgt Rückkehr zum Menü.
         return 1
      fi
   else
      echo Eine Kopie von $2 wird nicht erstellt, weil $2 nicht
      echo existiert oder leer ist - oder $3 bereits existiert.
   fi
   return 0
     ;;

     auto)

   local t='[ %t%z]' b a
   prints sf-72
   systhem copy $ABAT c:\auto_cpy.bat || { frage; return 1; }
   prints sf-72
   frage
   [ ! -s $ABAT ] && {
      prints sf-72
      echo $ABAT existiert nicht oder ist leer und wird daher erzeugt.
      echo '@ echo off' > $ABAT
      echo 'loadhigh c:\dos\share.exe /F:4096 /L:32' >> $ABAT
      echo 'c:\dos\smartdrv.exe  a c  2048' >> $ABAT
      echo 'loadhigh c:\dos\doskey /reinstall /overstrike' >> $ABAT
      ifset PATH && echo "PATH=$PATH" >> $ABAT
      ifset PATH || [ -d c:\dos ] && echo 'PATH=c:\dos;' >> $ABAT
      echo 'VERIFY on' >> $ABAT
      echo 'PROMPT $p: ' >> $ABAT
      echo 'set DIRCMD=/p/a:-s-h/o:gne/l' >> $ABAT
      echo 'c:\dos\mode con: rate=27 delay=2' >> $ABAT
      echo 'VER' >> $ABAT
      prints sf-72
      frage
   }

   b=H.Schellong,BadSalzuflen
   for a in bish MAN PG L
   do
      grep -qm "^$t*[sS][eE][tT]$t$t*"${a}AUTOR=$b $ABAT ||
         echo "seT ${a}AUTOR=$b" >> $ABAT
   done
   b=Freeware_nur_für_nichtgewerbliche_Verwendung
   for a in  L READC
   do
      grep -qm "^$t*[sS][eE][tT]$t$t*"${a}PROGRAM=$b $ABAT ||
         echo "seT ${a}PROGRAM=$b" >> $ABAT
   done
   ifset -s I_DIR && aI_DIR=$I_DIR
   ifset -s aI_DIR || aI_DIR=c:\bish
   frage "Welches Verzeichnis für die bish-Dateien soll für weitere
Variableninhalte in der $ABAT zugrundegelegt werden?
- $aI_DIR ?" || {
           while : ; do
              frage "Wollen Sie ein Verzeichnis angeben?" || break
              read "inp?        :  " b
              ifset inp || continue
              ifset b && echo Fehler! && continue
              expr $inp :: '^[a-zA-Z]:' ||
                 echo Mit Laufwerk-Angabe! && continue
              conv -t/\F\ inp
              [ -e $inp -a ! -d $inp ] &&
                 echo $inp existiert als Nicht-Verzeichnis! && continue
              aI_DIR=$inp ; true ; break
           done
                } || return 1

   [ ! -d "$aI_DIR" ] && frage "Soll $aI_DIR angelegt werden?" &&
    makedir $aI_DIR ||
    echo $aI_DIR konnte unerwarteterweise nicht erzeugt werden! &&
    { frage; return 1; }

   grep -qm "^$t*[sS][eE][tT]$t$t*"MANRUBRIK= $ABAT ||
      echo "seT MANRUBRIK=KRSVLABI" >> $ABAT
   grep -qm "^$t*[sS][eE][tT]$t$t*"MANFILES=$aI_DIR\man $ABAT ||
      echo "seT MANFILES=$aI_DIR\man" >> $ABAT
   grep -qi "^PATH .*;$aI_DIR\bin" $ABAT ||
      echo "$PATH" | grep -qi $aI_DIR\bin ||
         echo "PATH $PATH;$aI_DIR\bin" >> $ABAT
   grep -qm "^$t*[sS][eE][tT]$t$t*"HOME=$aI_DIR $ABAT ||
      echo "seT HOME=$aI_DIR" >> $ABAT
   grep -qm "^$t*[sS][eE][tT]$t$t*"CDPATH= $ABAT ||
      echo "seT CDPATH=;\;$aI_DIR" >> $ABAT
   BISHTEMP=c:
   whence -ep mem || [ $? -eq 10 ] && mem /d |
      b="`grep -im '  *[a-zA-Z]:  *.*[^a-zA-Z]ramdrive[^a-zA-Z]*'`" &&
      a=`expr "$b" : '  *%([a-zA-Z]:%)  *..*[rR][aA][mM]'` &&
      BISHTEMP=$a && echo Geladener RAMDRIVE für "'$a'" festgestellt. &&
                    frage
   grep -qm "^$t*[sS][eE][tT]$t$t*"BISHTEMP=$BISHTEMP $ABAT ||
      echo "seT BISHTEMP=$BISHTEMP" >> $ABAT
   grep -iqm "^$t*[sS][eE][tT]$t$t*"TEMP= $ABAT ||
      echo "seT TEMP=$BISHTEMP" >> $ABAT
   unset -s BISHTEMP
   a=`grep -c '^reM ' $ABAT` && [ $a -ge 8 ] && return 0
   systhem bat_ ''
   fprint +"+++  " bat
   frage "Soll vorstehender Inhalt einer $ABAT als Kommentar (REM ...)
an Ihre $ABAT angehängt werden?" && fprint +"reM " bat >> $ABAT
   unset -f bat
   return 0
     ;;

     conf)
   local t='[ %t%z]' a b n
   prints sf-72
   systhem copy $CSYS c:\conf_cpy.sys || { frage; return 1; }
   prints sf-72
   frage
   [ ! -s $CSYS ] && {
      prints sf-72
      echo $CSYS existiert nicht oder ist leer und wird daher erzeugt.
      systhem sys_ ''
      fprint sys > $CSYS
      unset -f sys
      prints sf-72
      frage
   }
   n=256
   a="`grep -iL "^$t*SHELL=....." $CSYS`" &&
      n=`expr "$a" : '/[Ee]:%([1-9][0-9]*%)'` &| n=256
   a=`env | wc -c`
   #b=`export | wc -c`
   #a=$((a-b))
   prints sf-72
   echo Aktuell sind etwa $a Byte von Umgebungsvariablen belegt.
   echo Verfügbar sind $n Byte.
   [ $n -gt 256 ] && echo Einstellung in $CSYS:  /E:$n
   prints sf-72
   frage
   local s='     '
   { [ $n -lt 1536 ] && s=2048; } &|
   { [ $n -lt $(((16*a)/10)) ] && s=$(( ((16*a)/10)&~15 )); } &&
      frage "Wollen Sie den Wert $n auf $s Byte erhöhen?" && {
      local c='                  '
      if a="`grep -inL "^$t*SHELL=....." $CSYS`"
      then
        n=` expr "$a" : '^%([1-9][0-9]*%):.' `
        if expr "$a" :: '/[Ee]:[1-9][0-9]*'
        then
          b="`- expr "$a" : '^[1-9][0-9]*:%(..*/[Ee]:%)[1-9]'`"
          c="`- expr "$a" : '^[1-9][0-9]*:..*/[Ee]:[1-9][0-9]*%(.*%)$'`"
          c="$b$s$c"
        else
          b="`- expr "$a" : '^[1-9][0-9]*:%(..*%)$'`"
          c="$b /E:$s"
        fi
        echo %c > $tempfile
        line -1-$((n-1)) $CSYS >> $tempfile
        echo "$c" >> $tempfile
        line -$((n+1))-1000 $CSYS >> $tempfile
        cat $tempfile > $CSYS
      else
        echo 'SHELL=c:\command.com c:\ /p /e:'$s >> $CSYS
      fi
   }
   grep -qs 'ReM devicehigh=c:' $CSYS && return 0
   a=`grep -c '^reM ' $CSYS` && [ $a -ge 8 ] && return 0
   systhem sys_ ''
   fprint +"+++  " sys
   frage "Soll vorstehender Inhalt einer $CSYS als Kommentar (REM ...)
an Ihre $CSYS angehängt werden?" && fprint +"reM " sys >> $CSYS
   unset -f sys
   return 0
     ;;

     inst)
   local qdir=$S_DIR rest='        ' idir
   prints sf-72
   echo Diese Installations-Routine kopiert alle Dateien von einem
   echo Quell- in ein Ziel-Verzeichnis, ist also nur ein Kopierer.
   echo Weitere Maßnahmen können Sie im Haupt-Menü auswählen.
   echo Es werden Verzeichnisse vorgeschlagen, Sie können aber auch
   echo eigene Angaben machen "(anstelle von \ auch /)".
   echo Auf Wunsch wird vor Überschreibungen gewarnt.
   echo In der Regel sind die bish-Dateien bereits auf Festplatte.
   echo In diesem Fall können Sie sie zu einem weiteren Ort kopieren.
   prints sf-72
   frage "Wollen Sie weitermachen?" || return 0
   prints sf-72
   echo Verzeichnis $qdir ist der Ort dieser aktiven bish-Batch-Datei.
   frage "Soll $qdir als Installations-Quelle benutzt werden?" ||
      while : ; do
         frage "Wollen Sie ein Quellverzeichnis angeben?" || break
         read "inp?        :  " rest
         ifset inp || continue
         ifset rest && echo Fehler! && continue
         expr $inp :: '^[a-zA-Z]:' ||
            echo Mit Laufwerk-Angabe! && continue
         conv -t/\F\ inp
         [ -e $inp -a ! -d $inp ] &&
            echo $inp existiert als Nicht-Verzeichnis! && continue
         [ ! -d $inp ] && echo $inp existiert nicht! && continue
         qdir=$inp ; true ; break
      done || return 1
   ifset -s aI_DIR && idir=$aI_DIR
   ifset -s idir || idir=c:\bish
   frage "Soll $idir als Installations-Ziel benutzt werden?" ||
      while : ; do
         frage "Wollen Sie ein Zielverzeichnis angeben?" || break
         read "inp?        :  " rest
         ifset inp || continue
         ifset rest && echo Fehler! && continue
         expr $inp :: '^[a-zA-Z]:' ||
            echo Mit Laufwerk-Angabe! && continue
         conv -t/\F\ inp
         [ -e $inp -a ! -d $inp ] &&
            echo $inp existiert als Nicht-Verzeichnis! && continue
         idir=$inp ; true ; break
      done || return 1
   [ ! -d $idir ] && makedir $idir ||
      echo Fehler von "'makedir()'" ! && { frage ; return 1; }
   rest=/Y
   frage "Vor Überschreiben warnen?" && rest=/-Y
   frage "Kopieren  $qdir  --->  $idir  ?" || return 0
   xcopy $qdir $idir\/s/e/v$rest || { frage; return 2; }
   I_DIR=$idir
   echo Kopieren beendet.
   frage
   return 0
     ;;

     ldir)
   local l=$S_DIR\bin\l.exe  do='             ' prev=.
   let "X&4" || l=DIR do=/p/a/o:gne/l
   prints sf-72
   [ $l != DIR ] && echo "'l.exe' ist vorhanden und wird verwendet."
   [ $l == DIR ] && echo "'l.exe' fehlt und 'DIR' wird verwendet."
   echo
   echo Sie kommen nachfolgend durch "<Enter>" zum Hauptmenü zurück.
   echo "Bei '.' wird das aktuelle Verzeichnis gelistet."
   echo "Bei '-name' wird für '-' der vorherige Name eingesetzt."
   echo Sie können anstelle von \ auch / verwenden.
   echo Wildcards "(*?)" werden ggf. vom List-Kommando berücksichtigt,
   echo nicht von der bish an dieser Stelle.
   prints sf-72
   frage
   while :
   do
      echo
      read "inp?Verzeichnis oder Datei:  "
      ifset inp || break
      expr "$inp" :: '^-.*$' && inp="$prev\`-expr "$inp" : '^-%(.*%)$'`"
      conv -t/\F\ inp
      $l $do "$inp" && prev="$inp"
      frage
   done
   return 0
     ;;

     lese)
   local rest='     ' A='     ' a='     ' l=lines
   prints sf-72
   echo "Durch 'A' und 'C' werden '$ABAT' bzw. '$CSYS' ausgewählt,"
   echo oder "'B'"locksatzdatei, andernfalls das, was Sie angeben.
   echo Durch Eingabe von nur %<Enter%> wird abgebrochen.
   echo Sie können anstelle von \ auch / verwenden.
   prints sf-72
   while :
   do
      echo
      read "inp?<Enter>,A,C,B oder Datei:  " rest
      ifset inp || break
      ifset rest && continue
      [ $inp == A ] && inp=$ABAT
      [ $inp == C ] && inp=$CSYS
      [ $inp == B ] && inp=$tempfile
      conv -t/\F\ inp
      [ -f $inp -a -r $inp -a -s $inp ] ||
         echo $inp nicht lesbar! && continue
      A=1
      let "X&2" ||
        while :
        do
           for a from $A by 20 repeat
           do
              line -$a-$((a+20-1)) $inp || break
              ifset R && echo "%e[1m$a:e,1,-,<Enter>: %e[0m%c"
              ifset R || echo "<<<$a:e,1,-,<Enter>>>:  %c"
              read rest
              [ "$rest" == e ] && break 2
              [ "$rest" == 1 ] && break
              [ "$rest" == - -a $a -gt 20 ] && { A=$((a-20))
                                                continue 2; }
              [ "$rest" == - -a $a -le 20 ] && break
           done
           A=1
        done
      l=lines
      let "X&2" &&
        while :
        do
           for a from $A by 20 repeat
           do
              line -$a-$((a+20-1)) $inp || break
              ifset R && echo "%e[1m$a:Esc,Home,End,PgU,Enter: %e[0m%c"
              ifset R || echo "<<<$a:Esc,Home,End,PgU,Enter>>>: %c"
              rest=`$S_DIR\bin\readc.com`
              echo
              [ "$rest" == ESC ] && break 2
              [ "$rest" == HOME ] && break
              [ "$rest" == PGU -a $a -gt 20 ] && { A=$((a-20))
                                                  continue 2; }
              [ "$rest" == PGU -a $a -le 20 ] && break
              [ "$rest" == END ] && {
                 [ $l == lines ] && l=`wc -l < $inp`
                 [ $l -le 20 ] && break
                 A=$((l-20+1)) ; continue 2
              }
           done
           A=1
        done
   done
   return 0
     ;;

     blok)
   local s=00000 rw=`prints sf+80-` rz=`prints sf+110-` %
                 oz=`prints sf+110-` sp="`prints s18-`"
   prints sf-72
   echo Geben Sie eine Quelldatei für Blocksatzerzeugung an.
   echo Durch Eingabe von nur %<Enter%> wird abgebrochen.
   echo "Sie können dann im Menü 'd' wählen und dann 'B',"
   echo um sich den Blocksatz anzuschauen.
   echo Andere Menüpunkte dazwischen überschreiben möglicherweise!
   echo Zeitdauer etwa 0,5 bis 2 Sekunden pro 10000 Byte.
   prints sf-72
   while : ; do
     read "inp?Datei für Blocksatz:  "
     ifset inp || return 0
     conv -t/\F\ inp
     [ -f $inp -a -r $inp -a -s $inp ] && break
     echo $inp nicht lesbar!
   done
   s=$SECONDS
   systhem ozad ''
   > $tempfile
   < $inp
   oz=''
   while read inp
   do
      ifset inp || {
         ifset oz && { catv sp oz /%j; oz=''; }
         echo; continue
      }
      ifset oz && oz="$oz $inp"
      ifset oz || oz="$inp"
      [ ${#oz} -lt 44 ] && continue
      while [ ${#oz} -ge 44 ]
      do
         [ ${#oz} -eq 44 ] && { catv sp oz /%j; oz=''; continue 2; }
         #expr "$oz" :rz '^.%{44%}%(.*%)$'
         #expr "$oz" :oz '^%(.%{44%}%)'
         catv 44,,oz =:rz
         catv 44,oz =:oz
         if expr "$rz" :: '^ '
         then
            catv sp oz /%j
            expr "$rz" :oz '^.%(.*%)$'
         elif expr "$oz" :rw ' %([^ ]*%)$'
         then
            rz="$rw$rz"
            expr "$oz" :oz '^%(.*%) [^ ]*$'
            let "rw=44-${#oz}"
            catv sp
            ozadd $rw $oz
            oz="$rz"
            [ $SECONDS -gt $s ] && { s=$SECONDS; print -nu2 .; }
         else
            catv sp oz /%j
            oz="$rz"
         fi
      done
   done
   ifset oz && { catv sp oz /%j; }
   ><<
   unset -f ozadd
   echo %nBlocksatz erledigt.
   frage
   return 0
     ;;

     ozad)
   ozadd()))  {
      typeset -i10 nadd=$1 nz=$# zn
      shift
      (( nz-=2 ))
      for zn from $nz by -1 to 1 repeat
      do
         print -nr "$1"; shift
         prints s$(( nadd/nz+1+[zn<=nadd%nz] ))-
      done
      print -r "$1"
   ))}
   return 0
     ;;

     tar)
   local s=000000000000 S=000000000000
   local file='                                             '
   local arch='                                             '
   set -f
   let "X&4+32" || { echo "l.exe nicht vorhanden";frage; return; }
   let "X&4" && alias lkdo=$S_DIR\bin\l.exe
   let "(X&4+32)==32" && alias lkdo=l.exe
   echo %n%n%n%n
   while :
   do
      read "s? tar crxtvf archiv [datei ...]:  " file arch inp
      ifset s || return
      [ "$s" != tar ] && continue
      ifset file || continue
      ifset arch || continue
      expr "$file" :: c || [ ! -e "$arch" ] &&
         echo "does not exist: '$arch'" && continue
      break
   done
   conv -lt/\ inp arch
   s='' S=0
   
   case "$file" in
   cf|cvf)
   set +f
   for file in $inp
   do
      set -f
      [ ! -e $file ] && { echo does not exist: $file; continue; }
      lkdo -bRpf -F%n\n $file |
      while readl file
      do
        expr "$file" :: ' ' &| expr "$file" :: '\%.%.$' && continue
        expr "$file" :: '\%.$' && expr "$file" :file '^%(..*%)\%.$'
        let "${#file}>=100" && { echo path too long: $file; continue; }
        [ ! -f $file -a ! -d $file ] && { echo special: $file; continue; }
        ifset s || 3>$arch
        prints s-F000100s7sF0001s7sF0001s7sF0001s12s12s-F000130- $file %
           `fmode $file`" " '' "0 " '' "0 " '' %
           `fsize $file | base -10 +8`" " %
           `mtime $file | base -10 +8`" " "        "    |   catv =inp:
        [ -d $file ] && catv /5 =156,1,inp
        conv -t\/ inp
        s=`catv inp | sum`
        prints s6sF0002-  $((8#, s)) " " | catv =148,8,inp
        catv inp =3
        prints su3F000$((512-278))- ''
        [ -d $file ] && { (( S+=512 )) ; continue; }
        cat $file 1>&3
        s=`fsize $file`
        (( s&511 )) && prints su3F000$((512-[s&511]))-
        (( s=[s&~511]+512*!![s&511]+512 ))
        prints sbsbs-9bsbsbs seek = $(( S/1024+!![S&1023] ))K %
                            a $file $(( s/1024+!![s&1023] ))K
        (( S+=s ))
      done
   done
   ifset s && { prints su3F0001024- ; >< ; }
   ;;
   tf|tvf)
   < $arch
   while catv 512,0 =278,inp:
   do
      [ "`catv 148,6,inp | tr 0\0 E0`" = 000000 ] && break
      s=`catv 148,6,inp | tr -c " 01234567" "[E*]"`
      expr "$s" :: E && { echo directory checksum error; break; }
      let 8#$s!=256+`catv 148,inp 156,122,inp | sum` && {
         echo directory checksum error; break
      }
      #[ "`catv 156,1,inp | tr \0 0`" = 5 ] && continue
      catv 103,3,inp =s:
      let s=8#$s ; S=-rwx
      catv $((!!(s&8#400)*1)),1,S  $((!!(s&8#200)*2)),1,S %
           $((!!(s&8#100)*3)),1,S  $((!!(s&8#040)*1)),1,S %
           $((!!(s&8#020)*2)),1,S  $((!!(s&8#010)*3)),1,S %
           $((!!(s&8#004)*1)),1,S  $((!!(s&8#002)*2)),1,S %
           $((!!(s&8#001)*3)),1,S
      echo "  "`catv 108,6,inp | base -8 +10`/%c
      echo `catv 116,6,inp | base -8 +10`" %c"
      s=`catv 124,11,inp | base -8 +10`
      prints s8bs10b- $s `catv 136,11,inp | base -8 +10`
      catv 100,inp | tr -d \0
      S="`catv 156,1,inp | tr \0 0`"
      [ "$S" = 1 ] && echo " ," link to `catv 157,100,inp | tr -d \0`%c
      [ "$S" = 2 ] &&
         echo " , slink->"`catv 157,100,inp | tr -d \0`%c
      [ "`catv 277,1,inp | tr \0 0`" == 1 ] && echo " , compressed%c"
      [ "$S" == 5 ] && echo " , directory%c"
      echo
      [ "$s" -eq 0 -o "$S" == 1 -o "$S" == 2 -o "$S" == 5 ] && continue
      seek +$s 0
      (( s&511 )) && seek +$((512-[s&511])) 0
   done
   ><
   ;;
   rf|rvf)
   file="$inp"
   3<> $arch
   while catv 512,3 =278,inp:
   do
      s=`catv ,`
      [ "`catv 148,6,inp | tr 0\0 E0`" = 000000 ] && {
         [ $s = 512 ] && { seek -512 3 ; break; }
         echo directory checksum error; >< ; goend
      }
      s=`catv 148,6,inp | tr -c " 01234567" "[E*]"`
      expr "$s" :: E && { echo directory checksum error; >< ; goend; }
      let 8#$s!=256+`catv 148,inp 156,122,inp | sum` && {
         echo directory checksum error; >< ; goend
      }
      [ "`catv 156,1,inp | tr \0 0`" = 5 ] && continue
      s=`catv 124,11,inp | base -8 +10`
      S="`catv 156,1,inp | tr \0 0`"
      [ "$s" -eq 0 -o "$S" = 1 -o "$S" = 2 -o "$S" = 5 ] && continue
      seek +$s 3
      (( s&511 )) && seek +$((512-[s&511])) 3
   done
   inp="$file"
   s='' S=`seek + 3`
   set +f
   for file in $inp
   do
      set -f
      [ ! -e $file ] && { echo does not exist: $file; continue; }
      lkdo -bRpf -F%n\n $file |
      while readl file
      do
        expr "$file" :: ' ' &| expr "$file" :: '\%.%.$' && continue
        expr "$file" :: '\%.$' && expr "$file" :file '^%(..*%)\%.$'
        let "${#file}>=100" && { echo path too long: $file; continue; }
        [ ! -f $file -a ! -d $file ] && { echo special: $file; continue; }
        prints s-F000100s7sF0001s7sF0001s7sF0001s12s12s-F000130- $file %
           `fmode $file`" " '' "0 " '' "0 " '' %
           `fsize $file | base -10 +8`" " %
           `mtime $file | base -10 +8`" " "        "    |   catv =inp:
        [ -d $file ] && catv /5 =156,1,inp
        conv -t\/ inp
        s=`catv inp | sum`
        prints s6sF0002-  $((8#, s)) " " | catv =148,8,inp
        catv inp =3
        prints su3F000$((512-278))- ''
        [ -d $file ] && { (( S+=512 )) ; continue; }
        cat $file 1>&3
        s=`fsize $file`
        (( s&511 )) && prints su3F000$((512-[s&511]))-
        (( s=[s&~511]+512*!![s&511]+512 ))
        prints sbsbs-9bsbsbs seek = $(( S/1024+!![S&1023] ))K %
                            a $file $(( s/1024+!![s&1023] ))K
        (( S+=s ))
      done
   done
   ifset s && prints su3F0001024-
   ><
   ;;
   xf|xvf)
   < $arch
   while catv 512,0 =278,inp:
   do
      [ "`catv 148,6,inp | tr 0\0 E0`" = 000000 ] && break
      s=`catv 148,6,inp | tr -c " 01234567" "[E*]"`
      expr "$s" :: E && { echo directory checksum error; break; }
      let 8#$s!=256+`catv 148,inp 156,122,inp | sum` && {
         echo directory checksum error; break
      }
      file=`catv 100,inp | tr -d \0`
      conv -t/\ file
      S="`catv 156,1,inp | tr \0 0`"
      [ "$S" = 5 ] && {
         [ -e $file -a ! -d $file ] &&
            echo exist, but not a dir: $file && break
         [ ! -d $file ] && MD $file
         continue
      }
      s=`catv 124,11,inp | base -8 +10`
      echo x $file, $s bytes, $((s/1024+!![s&1023]))K%c
      [ "$S" = 1 -o "$S" = 2 ] && { arch=`catv 157,100,inp | tr -d \0`
         [ "$S" = 1 ] && echo , link to $arch
         [ "$S" = 2 ] && echo , slink"->"$arch
         continue
      }
      [ "`catv 277,1,inp | tr \0 0`" = 1 ] && echo , compressed%c
      echo
      catv $s,0 > $file
      stime `catv 136,11,inp | base -8 +10` $file
      (( s&511 )) && seek +$((512-[s&511])) 0
      #600 catv 103,3,inp =s:
      #600 let s=8#$s
      #uid `catv 108,6,inp | base -8 +10`
      #gid `catv 116,6,inp | base -8 +10`
   done
   ><
   ;;
   *)  echo "Falsche Option: '$file'" ;;
   esac
   set -f
   echo %ntar-Funktion erledigt.
   frage
   return 0
     ;;

     rate)
   local a=0000 b=0000 x=0000 l=0000 n=0000
   ansiscreen
   while :
   do
    a=1 b=1000
    echo "$S  Geben Sie ein beliebiges Zeichen für Abbruch ein
$R  oder denken Sie sich eine Zahl zwischen $((a+0)) und $((b-0)) aus
$R  und drücken Sie dann <Enter> %c"
    read inp
    ifset inp && return
    for l from 9 to 23 repeat; do prints s- "${e}[$l;36H        "; done
    l=8 n=0
    while :
    do
     ((x=a+(b-a)/2))
     ifset R && echo '%e[7H%c'
     echo "$R  Ist diese Zahl kleiner,größer,gleich [<>=]   $x %c"
     ifset R && echo '    %e[4D%e[37;40m%e[1m%c'
     echo '?%b%c'
     let "X&2+16" || read inp
     let "X&2" && inp=`$S_DIR\bin\readc.com`
     let "(X&2+16)==16" && inp=`readc.com`
     ifset R && echo '%e[0;30;46m%c'
     [ "$inp" == = ] && break
     [ "$inp" == %> -o "$inp" == . ] && a=$x inp='>'
     [ "$inp" == %< -o "$inp" == , ] && b=$x inp='<'
     expr "$inp" :: '^[><]$' || { echo '%a%c'; continue; }
     ((n=n+1;l=l+1))
     prints ss2ss1s4s- "${e}[$l;36H${e}[37;40m" $n " " "$inp" $x "${e}[30;46m"
     [ $l -ge 23 ] && l=8
    done
   done
   return 0
     ;;

     bat_)  bat()))  {
@ echo off
ReM loadhigh c:\dos\mscdex.exe /D:TEAC-CDI /M:10 /L:F
loadhigh c:\dos\share.exe /F:4096 /L:32
c:\dos\smartdrv.exe  a b c d f-   2048
loadhigh c:\dos\doskey /reinstall /bufsize=4096 /overstrike
PATH=c:\dos;c:\cpqdos;c:\usr\bin;c:\usr\cmd;c:\windows;c:\bish\bin
VERIFY on
PROMPT $p: 
set DIRCMD=/p/a:-s-h/o:gne/l
set TEMP=e:\
ReM c:\dos\mode COM2:19200,NONE,8,1
c:\dos\mode con: rate=27 delay=2
ReM call c:\usr\cmd\alias.bat
ReM type c:\usr\cmd\keys
VER
))}
   return 0
     ;;

     sys_)  sys()))  {
device=c:\dos\himem.sys
device=c:\dos\emm386.exe RAM
DOS=HIGH,UMB
BREAK=ON
FCBS=4
LASTDRIVE=G
STACKS=8,256
BUFFERS=32,0
FILES=100
SWITCHES=/F
COUNTRY=049,437,c:\dos\country.sys
SHELL=c:\command.com c:\ /p /e:2048
devicehigh=c:\dos\setver.exe
devicehigh=c:\dos\ramdrive.sys 2048 512 128 /e
devicehigh=c:\dos\ansi.sys /x /r
ReM devicehigh=c:\dos\teac\teac_cdi.sys /D:TEAC-CDI /P:P-S
))}
   return 0
     ;;

   esac

   return 0
}



makedir()  {
   local  N=000 C=' ' B=' ' dirn="$1" dir="$1"
   N=0 B='' dirn=''
   conv -Lt/\F\ dir
   while  expr "$dir" :C '^.%{'$N'%}%(.%)'
   do
      let ++N
      case "$C" in
        :)  [ -z "$B" -o N -ne 2 ] && {
               echo "Fehlerhafte Laufwerkangabe!"; return 1; }
            B=''
            [ -d $dirn:\ ] || { echo "$dirn:\ kein Laufwerk!"
                                      return 1; } ;;
        .)  ;;
        [/\])  [ $C != \ ] && { echo "'$C'"; return 1; }
               test $B && [ -e $dirn -a ! -d $dirn ] &&
               echo "$dirn existiert, ist aber kein Verzeichnis!" &&
               return 1
               [ "$B" -a ! -d "$dirn" ] &&
               { MD $dirn; [ ! -d $dirn ]; } && return 1 ;;
        [a-zA-Z_0-9%!$#'`~@{}-])  B=$C ;;
        *)  echo Unerlaubtes Zeichen "'$C'" && return 1 ;;
      esac
      dirn=$dirn$C
   done
   test $B && [ -e $dirn -a ! -d $dirn ] &&
   echo "$dirn existiert, ist aber kein Verzeichnis!" && return 1
   [ "$B" -a ! -d "$dirn" ] && { MD $dirn; [ ! -d $dirn ]; } && return 1
   return 0
}



ansiscreen()  {
   ifset R || return 1
   local z
   echo "%e[0;30;46m%e[2J%e[33;43m%c"
   echo "%e[25H%e[K%e[H%e[K%c"
   for z from 2 to 24 repeat
   do
      echo "%e[${z}H  %e[76C  %c"
   done
   echo '%e[0;30;46m%c'
   return 0
}


[ -x $S_DIR\bin\ov.com    ] && OV=` $S_DIR\bin\ov.com ` ((X+=1))
[ -x $S_DIR\bin\readc.com ] && ((X+=2))
[ -x $S_DIR\bin\l.exe     ] && ((X+=4))
whence -ep ov.com    || [ $? -eq 10 ] && ((X+=8)) OV=`ov.com`
whence -ep readc.com || [ $? -eq 10 ] && ((X+=16))
whence -ep l.exe     || [ $? -eq 10 ] && ((X+=32))

ifset R && PS1='print -nu2 "%e[s%r%e[53C%e[40;36m"; prints su2-26- $PWD
     print -nu2 "%e[u%e[40;37m$:%e[1m#%e[0m  "'

let "X&(2|16)" && { BISHAUTOR=H.Schellong,BadSalzuflen
   READCPROGRAM=Freeware_nur_für_nichtgewerbliche_Verwendung
   export BISHAUTOR READCPROGRAM
}
let "X&(4|32)" && { LAUTOR=H.Schellong,BadSalzuflen
   LPROGRAM=Freeware_nur_für_nichtgewerbliche_Verwendung
   export LAUTOR LPROGRAM
}
#ifset -s OV && $S_DIR\bin\ov.com -q 38
let "X&1" && $S_DIR\bin\ov.com -q 38
let "(X&9)==8" && ov.com -q 38

sleep -m 800
ansiscreen


while echo %
"$S  ---------------------------------------------------------------------
$R  Shell-Script 'start.bish' - Copyright (C) 1997  Helmut Schellong, B.S.
$R  ---------------------------------------------------------------------
$R
$R
$R                 Infos : i
$R  Verzeichnisse listen : l
$R         Dateien lesen : d
$R             Blocksatz : b
$R          Installieren : I
$R          autoexec.bat : A
$R            config.sys : C
$R     Kleines Ratespiel : r
$R           command.com : !
$R      bish - interaktiv : #
$R             TARchiver : t
$R               Beenden : E%c"

do
   [ -z "$R" ] && echo "%n
                       : %c"
   [ -n "$R" ] && echo "%e[2B%e[2D%e[0;37;40m%e[1m" %
                       "                                  " %
                       "%e[35D%e[s%c"
   read inp
   case "$inp" in
     i)  info ;;
     l)  systhem ldir ;;
     d)  systhem lese ;;
     b)  systhem blok ; sane q ;;
     I)  systhem inst ;;
     A)  systhem auto ;;
     C)  systhem conf ;;
     r)  systhem rate ;;
     t)  systhem tar ; sane q ;;
     !)  [ -n "$R" ] && echo '%e[s%e[0;37;40m%e[2J%e[u%r%c'
         set -C; command.com; set +C; frage ;;
    %#)  ifset R && echo '%e[s%e[0;37;40m%e[2J%e[u%r%c' && set -E
         echo Dies ist kein neuer Prozeß, sondern die bish ruft sich
         echo rekursiv interaktiv auf.%n
         ifset R && echo Kommandozeilen-Editor ist aktiv.%n
         echo Probieren Sie:  SET, env, set, export, echo "*", ...
         echo Falls nötig:  xxx %| more%n
         echo "Beenden Sie mit 'return'.%n"
         set -C;set +f; prompt; set +C;set -f; frage; set +E
         ;;
     E)  break ;;
     *)  ifset R || echo '%a%c'
         ifset R && echo '%e[uFalsche Eingabe%c' && sleep 1 &&
            to 15 repeat; do echo '%e[D %e[D%c'; sleep -m 120; done
         continue ;;
   esac
   ansiscreen
done


ifset OV && $S_DIR\bin\ov.com -q $OV
ifset R && echo "%e[25H%e[0;37;40m%n%e[K"
#ifset tempfile && [ -f $tempfile ] && DEL $tempfile
echo % --- Shell-Script 'start.bish' beendet ---



###  substfat.bish  #############################################



set Z:.500 lc:.500 name:.100

#list -Rf \ | {
#   while readl Z
#   do
#      expr "$Z" :lc '^%(.%{1,}\[^\/]%{1,}%.%)%([A-Z_0-9]%{1,}%)$' + '%1%L%2' || continue
#      #expr "$Z" :lc '^%(.%{1,}\%)%([A-Z_0-9]%{1,}%)$' + '%1%L%2' || continue
#      expr "$lc" :name '[\/]%([^\/]%{1,}%)$' || break
#      echo "%"$Z%" --> %"$name%" ($lc)"
#      #RENAME "%"$Z%"" "%"$name%"" || break
#      #move -V "$Z" "$lc"
#   done
#}

#return 0

list -Rf \ | {
   while readl Z
   do
      #expr "$Z" :lc '^%(.%{1,}\%)%([.A-Z_0-9-]%{1,}%.[A-Z_0-9]%{1,}%)$' + '%1%L%2' || continue
      expr "$Z" :lc '^%(.%{1,}\%)%([.A-Za-z_0-9-]%{1,}%.%)%([A-Z_0-9]%{1,}%)$' + '%1%2%L%3' || continue
      expr "$lc" :name '[\/]%([^\/]%{1,}%)$' || break
      echo "%"$Z%" --> %"$name%" ($lc)"
      RENAME "%"$Z%"" "%"$name%"" || break
      #move -V "$Z" "$lc"
   done
}




###  substfat.bish  #############################################



set Z:.500 lc:.500

list -Rf /fat | {
   while readl Z
   do
      expr "$Z" :lc '^%(.%{1,}/%)%([A-Z_0-9]%{1,}%.[A-Z_0-9]%{1,}%)$' + '%1%L%2' || continue
      #echo "$Z --> $lc"
      move -V "$Z" "$lc"
   done
}




###  svn.bish  #############################################

#!/u/bin/bish

[ `pwd` != /fat/cie/mc/archiv ] && { echo Falsches Arbeitsverzeichnis!; exit 0; }

set ZNAM:.50
local title:.40 title0:.40

#for ZNAM in $( list | sortl )
#do
   #expr "$ZNAM" :title '^%(upc3_[^.]%{1,}%)%.tar%.bz2$' || continue
   #echo $title:
   #bunzip2 -v $ZNAM || continue
   #mkdirs _$title || continue
   #cd _$title || continue
   #tar xf ../$title.tar || { cd ..; continue; }
   #remove upc3/lst/*?.lst
   #remove upc3/obj/*
   #cd ..
   #bzip2 -v $title.tar
#done


: >FileDiff

for ZNAM in $( list | sortl )
do
   expr "$ZNAM" :title '^_%(upc3_.%{1,}%)$' || continue
   [ -d _$title ] || continue
   cd _$title || continue
   echo $title:
   list -R | sortl > ../$title
   cd ..
   expr "$title0" :: '^%.%.%.' || {
      echo diff -bBdaw $title0 '<>' $title >>FileDiff
      diff -aw $title0 $title >>FileDiff
      remove $title0
   }
   title0=$title
done
remove $title0




###  syscmd.bish  #############################################

#!./bish_root -p_


case "$1" in
  date)
         #syscmd.bish date $ta $mo $ja $st $mi
         [ $# -ne 6 ] && goend
         local ta=$2 mo=$3 ja=$4 st=$5 mi=$6
         let "ta=ta, mo=mo, ja=ja, st=st, mi=mi"
         let "ta<1||ta>31||mo<1||mo>12||st>23||mi>=60" && goend
         let "ja<100" && let "ja+=2000"
         let "ja<2000||ja>2030" && goend
         prints vsf02 ta $ta
         prints vsf02 mo $mo
         prints vsf02 st $st
         prints vsf02 mi $mi
         extern /bin/date -u $mo$ta$st$mi$ja
         exit $?
  ;;
  shutdown)
         # shutdown "shutdown|halt [-y ...]"
         cd /
         extern sync
         extern sync
         extern $2
         exit $?
  ;;
esac

exit 1





###  t.bish  #############################################

#   rdir=$1
#   cat $rdir | {
#      seek + 0 Dir
#      : > $rdir
#      while :
#      do
#         seek $Dir 0
#         while readl Zeile
#         do
#            grep -qFxm -e "$Zeile" $rdir && continue
#            seek + 0 st
#            seek $Dir 0
#            grep -qFm -e "$Zeile/" && { seek $st 0; continue; }
#            seek $st 0
#            print -r "$Zeile" >> $rdir
#            continue 2
#         done
#         break
#      done
#   }
#
#tst()  {
#   local a
#   for a in "$@"
#   do
#      echo "-$a-"
#   done
#      echo "+$a+"
#   return
#}
#
#tst aaa bbb 'ccc  ddd' 'eee   fff'
#tst
#CorrPP()  {
#        while expr "${{1}" :$1 '/%./' '/'; do  done
#        expr "${{1}" :$1 '^%./' ''
#        expr "${{1}" :$1 '/%.$' ''
#        expr "${{1}" :$1 '^%.%./' '*/'
#        expr "${{1}" :$1 '/%.%.$' '/*'
#        while expr "${{1}" :$1 '/%.%./' '/*/'; do  done
#        while expr "${{1}" :$1 '/[^/*]%{1,%}/%*/' '/'; do  done
#        expr "${{1}" :$1 '%(.%)/[^/*]%{1,%}/%*$' '%1'
#        expr "${{1}" :$1 '^/[^/*]%{1,%}/%*$' '/'
#        while expr "${{1}" :$1 '/%*/' '/'; do  done
#        expr "${{1}" :$1 '^%*/' '/'
#        expr "${{1}" :$1 '%(.%)/%*$' '%1'
#        expr "${{1}" :$1 '^/%*$' '/'
#        return 0
#}
Fp()  {
   local a=$1 b=$2 a2=$1 b2=$2
   cmpv a b
   echo $.
   catv $.,a =a:
   catv $.,b =b:
   conv -t// a
   echo $.
   catv $.,a /%j
   catv $.,b /%j
   catv $.,,a2 /%j
   catv $.,,b2 /%j
   return 0
}

Ren()  {
   ic="$1" Zeile="$2" inp="$3"
   File="$Zeile" Dir="$inp" inp=
   while expr "$Dir" :lsec '%([^/]%{1,%}%)$' &&
         expr "$File" :rsec '%([^/]%{1,%}%)$' &&
         cmpv -$ic lsec rsec
   do
      expr "$Dir" :Dir '^%(.*/%)[^/]%{1,%}$' || Dir=
      expr "$File" :File '^%(.*/%)[^/]%{1,%}$' || File=
      lsec="$rsec"
      expr "$Dir" :Dir '/$' '' && lsec="/$lsec"
      expr "$File" :File '/$' '' && rsec="/$rsec"
      #expr "$lsec" :: '^/' || expr "$rsec" :rsec '^/' ''
      inp="$lsec$inp"
   done
   inp="$Dir$inp"
   print -r "rename $Zeile $inp"
   return 0
}



###  t.bish  #############################################



set -f

Tout()  {
   local n=0000 e=0 l=000
   while :
   do
      e=0
      while readl ZS && readl -u3 ZR
      do
         expr "$ZS" :: '^ *//' && continue
         expr "$ZS" :Tnam ' %(T_%w%{1,}%) *= *{' || continue
         e=1 break
      done
      [ e -eq 0 ] && break
      n=0
      while readl ZS && readl -u3 ZR
      do
         expr "$ZS" :: '^ *}; *$' && break
         expr "$ZS" :: '^ *//' && continue
         expr "$ZS" :: ' "[^"]%{16%}",' || continue
         expr "$ZS" :S1 ' %("[^"]%{16%}"%)'
         expr "$ZS" :ZS ' "[^"]%{16%}"' = ' '
         expr "$ZS" :S2 ' %("[^"]%{16%}"%)'
         expr "$ZS" :ZS ' "[^"]%{16%}"' = ' '
         expr "$ZS" :S3 ' %("[^"]%{16%}"%)'
         expr "$ZS" :ZS ' "[^"]%{16%}"' = ' '
         expr "$ZS" :S4 ' %("[^"]%{16%}"%)'
         expr "$ZR" :ZR ' "[^"]%{16%}"' = ' '
         expr "$ZR" :ZR ' "[^"]%{16%}"' = ' '
         expr "$ZR" :S5 ' %("[^"]%{16%}"%)'
         prints vsf03 n $n
         let "l= ${#Tnam}+${#n}+14"
	 conv -TTD Tnam
         prints s-${l}ss40s '//' '"' '' '"'
         print -r "#define ${Tnam}_${n}_en  $S1"
         print -r "#define ${Tnam}_${n}_de  $S2"
         print -r "#define ${Tnam}_${n}_sw  $S3"
         print -r "#define ${Tnam}_${n}_it  $S4"
         print -r "#define ${Tnam}_${n}_ru  $S5"
         let ++n
      done
      echo
   done
   return 0
}

0< ../MU1000C/TXT2_STD.C
3< ../MU1000C/TXT2_RUS.C
1> T.OUT
Tout
><<<

0< ../MU1000C/TXT_STD.C
3< ../MU1000C/TXT_RUS.C
1>>T.OUT
Tout
><<<



###  t.bish  #############################################


set -f
sp="                "
l=${#1}
s1=$( catv ".$1" | base -b +10 )
s2=$( catv ".$1" $((11-l)),sp | base -b +10 )

echo "¯$s1®"
start=256
while let "--start>=0"
do
echo $start:
m=-0000000001
while let "++m<1"
do
   MSK8=$m
   #echo $m:
   for cpc in  $s1
   do
      crc=$start cn=8
      while :
      do
         let "(crc&16#80)^^(cpc&16#01)" && {
           (( crc<<=1,
              crc|=16#01 ))
           let "crc&=255,cpc>>=1, --cn<=0" && break
           continue
         }
         (( crc<<=1,
            crc&=~16#01 ))
         let "crc&=255,cpc>>=1, --cn<=0" && break
      done
   done
   [ $# -eq 1 ] && echo " $((16#,crc))%c"
   [ $# -eq 2 ] && {
      let "crc==16#$2" || echo " $((16#,crc))%c"
      let "crc==16#$2" && echo "%a ¯$((16#,crc))®%c" &&
                          echo "¯$1® $2   s=$start m=$m" >> crco
   }
done
echo
done
echo

#        let "(crc&16#80)&&!(cpc&16#01)||!(crc&16#80)&&(cpc&16#01)" && {
#          (( crc={[(crc^MSK8)<<1]|~(MSK8<<1)}&[(crc<<1)|(MSK8<<1)],
#             crc|=16#01 ))
#          let "crc&=255,cpc>>=1, --cn<=0" && break
#          continue
#        }
#        (( crc=(((crc^~MSK8)<<1)|~(MSK8<<1))&((crc<<1)|(MSK8<<1)),
#           crc&=~16#01 ))
#        let "crc&=255,cpc>>=1, --cn<=0" && break



###  t.bish  #############################################


F='/u/bish/bish.c /u/bish/mod/*.c'
grep '%<%w%{3,}(' $F | {
   while readl Z
   do
      while expr "$Z" :f '%(%<%w%{3,}(%)'
      do
	 catv f '/)%n'
         expr "$Z" :Z '%<%w%{3,}(' = ''
      done
   done
}





###  t_exte.bish  #############################################




Files=*.[ch]
files=*base.txt
Files="$Files $files"
expr "$Files" :Files ' texts256.h' = ' '
expr "$Files" :Files ' texts.h' = ' '
expr "$Files" :Files ' text.h' = ' '
expr "$Files" :Files ' texte.h' = ' '
expr "$Files" :Files ' texte.c' = ' '
expr "$Files" :Files ' [tT]%dh%d%{2,}.c' += ' '
t0=XXXXXXXXXXXXXXXX

: > __1__
: > __2__
< texts256.h
while readl Z
do
   ifset Z || continue
   expr "$Z" :t1 ' D_%(%w%{1,}%)_%d%d%d_en ' || continue
   expr "$Z" :t2 ' D_%w%{1,}_%(%d%d%d%)_en '
   expr "$t2" :t2 '^0%{1,2}' = ''
   [ "$t1" != "$t0" ] && catv /T_ t1 /%n >> __1__ ; t0=$t1
   catv /T_ t1 /' ' t2 /%n >> __2__
done
><


echo $Files

for t in  `cat __1__`
do
   catv /%n t
   grep -q '%<'"$t"'%>' $Files && continue
   catv /'  --'
done
catv /%n


for 2 t1 t2 in  `cat __2__`
do
   catv /%n t1 /+ t2
   [ t2 -eq 0 ] && grep -q '%<'"$t1"'%>' cfgdata.c mesdata.c && continue
   grep -q '%<'"$t1"'+'"$t2"'%>' cfgdata.c mesdata.c && continue
   catv /'  --'
done
catv /%n

remove -s __1__ __2__





###  tapebak.bish  #############################################

#!/u/bin/bish

LDIR=/fat/cie/mc/c
RDIR=/home/schellong/cie/mc/c
DN=/
BN=
expr "$RDIR" :BN '%(/[^/]%{1,}%)$'
expr "$RDIR" :DN '^%(/.%{1,}%)/[^/]%{1,}$'
TDIR=/usr/tapeBAK
TMPL=$TDIR/_tbllist
TMPR=$TDIR/_tbrlist
TMPC=$TDIR/_tbclist
[ -d $TDIR ] && rm -r $TDIR
mkdir -p $TDIR$BN
: >$TMPC
N=0
set Z:.200


Copy()  {
   local d
   echo $LDIR/$1 >> $TMPC
   expr "$TDIR$BN/$1" :d '^%(.%{1,}%)/[^/]%{1,}$' || d=/
   [ -d $d ] || mkdir -p $d
   cp -pv $LDIR/$1 $d
   chmod 600 "$TDIR$BN/$1"
   N=1
   return 0
}

ssh -C -l root -p 8108 tape find $RDIR -type f -printf '%T@\ %P\\n' > $TMPR || exit 1
[ -s $TMPR ] || exit 1
cd $LDIR
list -Rf > $TMPL
cd -

< $TMPL
while readl Z
do
   expr "$Z" =:: '%.lst$' && continue
   expr "$Z" =:: '%.obj$' && continue
   expr "$Z" =:: '%.stk$' && continue
   expr "$Z" =:: '%.als$' && continue
   expr "$Z" =:: '%.bin$' && continue
   expr "$Z" =:: '%.abs$' && continue
   mtr=$( grep -m -e " $Z%$" $TMPR ) || { echo neu:; Copy $Z; continue; }
   fstat -mv mtl $LDIR/$Z
   expr "$mtr" :mtr '^%([0-9]%{1,}%)'
   let "mtl>mtr+5" && { print -r $((mtl-mtr))s:; Copy $Z; }
done
><

[ $# -eq 0 -a N -gt 0 ] && scp -rpC -P 8108 $TDIR$BN root@tape:$DN


#Achtung! ssh macht was mit Handle 0.
8< $TMPR
while readl -u8 Z
do
   expr "$Z" :Z '[0-9] %(.%{1,}%)$'
   expr "$Z" =:: '%.abs$' && {
      echo rm $RDIR/$Z ...
      ssh -l root -p 8108 tape rm "$RDIR/$Z" || echo $?
      continue
   }
   expr "$Z" =:: '%.mhx$' || continue
   grep -qm -e "^$Z%$" $TMPL && continue
   echo rm $RDIR/$Z ...
   ssh -l root -p 8108 tape rm "$RDIR/$Z" || echo $?
done
><

exit 0




###  tapemkzip.bish  #############################################

#!/u/bin/bish


DIR=/home/schellong/cie/mc/c/BUILDS
MKZIP=/home/schellong/cie/mc/c/BUILDS/tapemkzip.sh

cps=0
ssh -l root -p 8108 tape  "[ -x $MKZIP ]" || cps=1


[ cps -gt 0 -o $# -gt 0 ] && { 
   echo Kopiere Script ...
   [ -s /u/sh/bish/tapemkzip.sh ] || { echo Kein Script; exit 5; }
   ssh -l root -p 8108 tape  "mkdir -p $DIR; chmod 700 $DIR" || { echo Fail1; exit 1; }
   scp -rpC -P 8108 /u/sh/bish/tapemkzip.sh root@tape:$DIR || { echo Fail2; exit 2; }
   ssh -l root -p 8108 tape  "chmod 700 $MKZIP" || { echo Fail3; exit 3; }
}


ssh -l root -p 8108 tape  $MKZIP || { echo Fail4; exit 4; }

exit 0





###  termine.bish  #############################################


MIETER="Junker Stork KKKKKKK
Schenk Horsthemke Rabe
Torres Schulze 2.OG_re"
array WPOS  El Em Er 1l 1m 1r 2l 2m 2r
array MIETER $MIETER
array WASCH  1 2 3 4 5 6 0 8 0
array BODEN  1 2 3 4 5 6 7 8 9
array TpM  31 28 31 30 31 30 31 31 30 31 30 31
array Mon  Jan Feb Mär Apr Mai Jun Jul Aug Sep Okt Nov Dez
nW=54
T=26 M=12 J=2011

#T=4=Montag(Mo)
#Mieter 3=iFlur soll am 5.1.99 (Di) Flur haben.
#iKell=5 iBod=1

nFlur=1 nFlurF=1 iFlur=2 nKell=1 nKellF=1 iKell=7 nMull=6 iMull=9
nWasch=4 nWaschF=8 iWasch=4 nHeiz=16 iHeiz=8 iBod=9 fBod=0 fGlock=0
nFLUR=1 nFLURF=1 iFLUR=3 nKELL=1 nKELLF=1         nMULL=6
nWASCH=4 nWASCHF=8          nHEIZ=16

[ -s termine.INI ] && {
   until  read "wahl?        q(uit), S, E oder 0...$nW:  " rest
          [ -z "$wahl" -o "$wahl" = q ] && exit
          grep -1 "^$wahl " termine.ini
   do :; done
   for 20 rest T M J nFlur nFlurF iFlur nKell nKellF iKell %
          nMull iMull nWasch nWaschF iWasch nHeiz iHeiz iBod %
          fBod fGlock %
          in `grep "^$wahl " termine.ini`
   do :; done
   /bin/cp termine.ini termine.in_
   echo %c > termine.ini
}

wr_ini()  {
   echo  $1 $T $M $J $nFlur $nFlurF $iFlur%c >> termine.ini
   echo  " "$nKell $nKellF $iKell $nMull $iMull%c >> termine.ini
   echo  " "$nWasch $nWaschF $iWasch $nHeiz $iHeiz%c >> termine.ini
   echo  " "$iBod $fBod $fGlock >> termine.ini
   return
}

aT=$T aM=$M aJ=$J
eT=$T eM=$M eJ=$J



schaltjahr()  {
   local j=$1
   [ $((j%4)) -eq 0 -a $((j%100)) -ne 0 -o $((j%400)) -eq 0 ] && {
      TpM2=29
      return 0
   }
   TpM2=28
   return 1
}

datum_add()  {
   local t m j tpm add=$4
   t=`eval echo '$'$1`
   m=`eval echo '$'$2`
   j=`eval echo '$'$3`
   [ $m -eq 2 ] && schaltjahr $j
   array tpm=TpM $m
   ((t=t+add))
   [ $t -gt $tpm ] && let 't=t-tpm; m=m+1'
   [ $m -gt 12 ] && let 'm=m-12; j=j+1'
   eval $1=$t $2=$m $3=$j
   return
}

set_ae()  {
   aT=$T aM=$M aJ=$J  eT=$T eM=$M eJ=$J
   datum_add aT aM aJ $1
   datum_add eT eM eJ $2
   array aMs=Mon $aM
   array eMs=Mon $eM
   return
}

P_dat_miet()  {
   local mieter wpos
   array mieter=MIETER $1
   array wpos=WPOS $1
   prints sf03ss2ssf03ss2- $aT. $aMs. $aJ " - " $eT. $eMs. $eJ
   prints ss-14- "   $wpos  " $mieter
   return
}


flur()  {
   ((nFlurF=nFlurF-1))
   ((nFlur=nFlur-1)) || {
      set_ae 1 $((1+4))
      for I from 0 by 3 to 6 repeat
      do
        P_dat_miet $((iFlur+I))
        prints s- "Treppe, Handl"
        [ $nFlurF -le 0 ] && prints s- " + Fenst, Fußl, Gel"
        echo
      done
      nFlur=$nFLUR
      ((iFlur=iFlur+1))
      [ $iFlur -gt $iFLUR ] && iFlur=1
   }
   [ $nFlurF -le 0 ] && nFlurF=$nFLURF
   return
}

glocken()  {
   [ $M -ne 10 ] && fGlock=0
   [ $M -eq 10 -a $fGlock != 1 ] && {
      set_ae 0 27
      for I to 9 repeat
      do
         P_dat_miet $I
         prints s Glasglocken
      done
      fGlock=1
   }
   return
}

boden()  {
   local ibod
   [ $M -ne 4 -a $M -ne 9 ] && fBod=0
   [ '(' $M -eq 4 -o $M -eq 9 ')' -a $fBod != 1 ] && {
      set_ae 0 27
      P_dat_miet $iBod
      prints s Dachboden
      fBod=1
      while  let 'iBod=iBod+1'; [ $iBod -gt 9 ] && iBod=1
             array ibod=BODEN $iBod; [ $ibod -le 0 ]
      do :; done
      iBod=$ibod
   }
   return
}

heiz()  {
   local iheiz
   ((nHeiz=nHeiz-1)) || {
      set_ae 0 15
      P_dat_miet $iHeiz
      prints s "Heizungskeller, Zählerraum"
      nHeiz=$nHEIZ
      while  let 'iHeiz=iHeiz+1'; [ $iHeiz -gt 9 ] && iHeiz=1
             array iheiz=BODEN $iHeiz; [ $iheiz -gt 0 ]
      do :; done
   }
   return
}

keller()  {
   ((nKellF=nKellF-1))
   ((nKell=nKell-1)) || {
      set_ae 3 $((3+2))
      P_dat_miet $iKell
      prints s- Keller
      [ $nKellF -le 0 ] && prints s- " + Fenster"
      echo
      nKell=$nKELL
      ((iKell=iKell+1))
      [ $iKell -gt 9 ] && iKell=1
   }
   [ $nKellF -le 0 ] && nKellF=$nKELLF
   return
}

wasch()  {
   local iwasch
   ((nWaschF=nWaschF-1))
   ((nWasch=nWasch-1)) || {
      set_ae 2 $((2+6))
      P_dat_miet $iWasch
      prints s- Waschkeller
      [ $nWaschF -le 0 ] && prints s- " + Fenster"
      echo
      nWasch=$nWASCH
      while  let 'iWasch=iWasch+1'; [ $iWasch -gt 9 ] && iWasch=1
             array iwasch=WASCH $iWasch; [ $iwasch -le 0 ]
      do :; done
      iWasch=$iwasch
   }
   [ $nWaschF -le 0 ] && nWaschF=$nWASCHF
   return
}

mull()  {
   ((nMull=nMull-1)) || {
      set_ae 0 10
      P_dat_miet $iMull
      prints s Mülleimerabstellplatz
      nMull=$nMULL
      ((iMull=iMull+1))
      [ $iMull -gt 9 ] && iMull=1
   }
   return
}



wr_ini S
> termine.all

echo "Terminplan zu den Mieter-Reinigungspflichten      `date +'%x'`%c"
echo ------------------------------------------------------------
echo "Laufzeit ab $T.$M.$J  ·  $nW Wochen"
echo "Waschkeller: %c"
for I to 9 repeat
do
   array ibod=WASCH $I
   array rest=WPOS $I
   [ $ibod -gt 0 ] && echo " $rest%c"
   [ $ibod -le 0 ] && echo " --%c"
done
echo
echo "Dachboden  : %c"
for I to 9 repeat
do
   array ibod=BODEN $I
   array rest=WPOS $I
   [ $ibod -gt 0 ] && echo " $rest%c"
   [ $ibod -le 0 ] && echo " --%c"
done
echo %n%n


while  [ $nW -gt 0 ]
do
   wr_ini $nW
   flur
   #glocken
   keller
   #wasch
   #mull
   #heiz
   boden
   datum_add T M J 7
   ((nW=nW-1))
done

><
wr_ini $nW
wr_ini E

for I to 9 repeat
do
   array wpos=WPOS $I
   grep "  $wpos  " termine.all > termine.$wpos
done





###  test.bish  #############################################

#!/u/bin/bish

a() {
   if [ 1 -gt 1 ]
   then
      b()) {
         echo bf then
      )}
   else
      b()) {
         echo bf else
      )}
   fi
   b
   echo af
}

#a
#b
#echo $0

local v0=00000000 v1=00000000 r=00000000 n=000
local s0=00000000 s1=00000000
s0=0 s1=0
to 16777216 repeat
do
   let "r=random(2)"
   if [ r -eq 0 ]
   then
      let "++v0" "++s0"
      ifset eins$s1 || eins$s1=000000
      [ s1 -gt 0 ] && let "++eins$s1"
      s1=0
   else
      let "++v1" "++s1"
      ifset null$s0 || null$s0=000000
      [ s0 -gt 0 ] && let "++null$s0"
      s0=0
   fi
   #catv r
   #let "++n==66" && n=0 echo
done
[ r -eq 0 -a s1 -gt 0 ] && let "++eins$s1"
[ r -eq 1 -a s0 -gt 0 ] && let "++null$s0"
#echo
echo $v0 $v1
echo "0: %c"
for r to 50 repeat
do
   ifset null$r || continue
   v0=null$r
   echo " $r=${{v0}}%c"
done
echo
echo "1: %c"
for r to 50 repeat
do
   ifset eins$r || continue
   v1=eins$r
   echo " $r=${{v1}}%c"
done
echo

exit
#wc <test.bish >test.out
#echo /u/bin/bish > z
#echo /u/bin/bish >> z

Symbols() {
   <z
      while read i
      do
         echo $i
         nm $i | grep zero
      done
   ><
}

Symbols | less



###  texts.bish  #############################################

#!/u/bin/bish


C=00000
set Z:.150 Z16:.300 LLn:.50
LL=sv l=0 LLn=

read LL < ll.txt || { print -u2 "ll.txt"; exit 1; }
conv -l LL
expr "$LL" :: '^%l%l$' || { print -u2 "LL='$LL'"; exit 2; }

>texts256.h
<txtbase.h
while readl Z
do
   expr "$Z" :: '%<D_%w%{1,}_%d%d%d_%l%l%>' || {
      [ l -eq 1 ] && l=2
      catv Z /%n
      continue
   }
   [ l -lt 2 ] && expr "$Z" :ll '_%d%d%d_%(%l%l%)%>' && {
      l=1 LLn="$LLn$ll "
   }
   expr "$Z" :: '_%d%d%d_[ed][ne]%>' && {
      catv Z /%n
      continue
   }
   expr "$Z" :: '_%d%d%d_'"$LL"'%>' && catv Z /%n
done
><<


conv -u LL LLn
echo %t$LLn
Lang=$(grep -m1 '%<LANG%l_'"$LL"' *, *LANG_'"$LL"'%>' ../share/var.c)
expr "$Lang" :Lang 'LANG_%u%u[ %t]*,[ %t]*"%([^"]%{3,}%)"'
echo %t$Lang

cat cfgbase.txt | {
   >cfgbase.txt
   while readl Z
   do
      expr "$Z" :Z '^%(@:English,Deutsch,%).*$'  '%1'"$Lang"
      catv Z /%n
   done
   ><
}


C=.
cat def.h | {
   >def.h
   while readl Z
   do
      expr "$Z" :: ' LANGX_%u%u%>' && {
         expr "$Z" :Z 'LANGX_%u%u' = "LANGX_$LL"
      }
      expr "$Z" :LLs ' LANGi_%(%u%u%)%>' && {
         C=.
         for ll in $LLn
         do  cmpv ll LLs && C=+ break;  done
         expr "$Z" :Z 'LANGi_%u%u.*$' = "LANGi_$LLs  '$C'"
      }
      catv Z /%n
   done
   ><
}


>texts.h
<texts256.h
while readl Z
do
   base -b Z +16 Z16
   expr "$Z16" :: '[89abcdef][0-9a-f]' || { catv Z /%n; continue; }
   for C in $Z16
   do
      let "16#$C<=127" && { base -16 C +b; continue; }
      base -16 C +8 C
      prints ssf03- '\' $C
   done
   catv /%n
done
><<

remove -s texts.tmp




###  texts.bish  #############################################


C=00000

: > texts.h
base -b +10 < texts256.h |
while readl Z
do
   for C in $Z
   do
      let "C<=127" && {
         base -10 C +b C
         catv 0,1,C >> texts.h
         continue
      }
      base -10 C +8 C
      prints vssf03 C '\' $C
      catv 0,4,C >> texts.h
   done
done


: > cfgbase.txt
base -b +10 < cfgbase256.txt |
while readl Z
do
   for C in $Z
   do
      let "C<=127" && {
         base -10 C +b C
         catv 0,1,C >> cfgbase.txt
         continue
      }
      base -10 C +8 C
      prints vssf03 C '\' $C
      catv 0,4,C >> cfgbase.txt
   done
done



###  texts.bish  #############################################


C=00000

: > texts.h
base -b +10 < texts256.h |
while readl Z
do
   for C in $Z
   do
      let "C<=127" && {
         base -10 C +b C
         catv 0,1,C >> texts.h
         continue
      }
      base -10 C +8 C
      prints vssf03 C '\' $C
      catv 0,4,C >> texts.h
   done
done

exit 0

: > cfgbase.txt
base -b +10 < cfgbase256.txt |
while readl Z
do
   for C in $Z
   do
      let "C<=127" && {
         base -10 C +b C
         catv 0,1,C >> cfgbase.txt
         continue
      }
      base -10 C +8 C
      prints vssf03 C '\' $C
      catv 0,4,C >> cfgbase.txt
   done
done



###  texts.bish  #############################################

#!/u/bin/bish


C=00000
set Z:.150 Z16:.300



>texts.h
print '%n/* Made by script texts.bish (H.Schellong) */%n'
<./base/txtbase.h
while readl Z
do
   base -b Z +16 Z16
   expr "$Z16" :: '[89abcdef][0-9a-f]' || { catv Z /%n; continue; }
   for C in $Z16
   do
      let "16#$C<=127" && { base -16 C +b; continue; }
      base -16 C +8 C
      prints ssf03- '\' $C
   done
   catv /%n
done
><<





###  texts.bish  #############################################

#!/u/bin/bish


C=00000
set Z:.150 Z16:.300

>texts.h
<texts256.h
while readl Z
do
   base -b Z +16 Z16
   expr "$Z16" :: '[89abcdef][0-9a-f]' || { catv Z /%n; continue; }
   for C in $Z16
   do
      let "16#$C<=127" && { base -16 C +b; continue; }
      base -16 C +8 C
      prints ssf03- '\' $C
   done
   catv /%n
done
><<




###  texts.bish  #############################################

#!/u/bin/bish


C=00000

: > texts.h
base -b +10 < texts256.h |
while readl Z
do
   for C in $Z
   do
      let "C<=127" && {
         base -10 C +b C
         catv 0,1,C >> texts.h
         continue
      }
      base -10 C +8 C
      prints vssf03 C '\' $C
      catv 0,4,C >> texts.h
   done
done




###  texts2p1.bish  #############################################

#!/u/bin/bish


C=00000
set Z:.150 Z16:.300 LLn:.50
LL=sv l=0 LLn=

read LL < ./base/ll.txt || { print -u2 "ll.txt"; exit 1; }
conv -l LL
expr "$LL" :: '^%l%l$' || { print -u2 "LL='$LL'"; exit 2; }

>texts256.h
print '%n/* Made by script texts.bish (H.Schellong) */%n'
<./base/txtbase.h
while readl Z
do
   expr "$Z" :: '%<D_%w%{1,}_%d%d%d_%l%l%>' || {
      [ l -eq 1 ] && l=2
      catv Z /%n
      continue
   }
   [ l -lt 2 ] && expr "$Z" :ll '_%d%d%d_%(%l%l%)%>' && {
      l=1 LLn="$LLn$ll "
   }
   expr "$Z" :: '_%d%d%d_[ed][ne]%>' && {
      catv Z /%n
      continue
   }
   expr "$Z" :: '_%d%d%d_'"$LL"'%>' && catv Z /%n
done
><<


conv -u LL LLn
echo %t$LLn
Lang=$(grep -m1 '%<LANG%l_'"$LL"' *, *LANG_'"$LL"'%>' share/var.c)
expr "$Lang" :Lang 'LANG_%u%u[ %t]*,[ %t]*"%([^"]%{3,}%)"'
echo %t$Lang

cat ./base/cfgbase.txt | {
   >./base/cfgbase.txt
   while readl Z
   do
      expr "$Z" :Z '^%(@:English,Deutsch,%).*$'  '%1'"$Lang"
      catv Z /%n
   done
   ><
}


C=.
cat def.h | {
   >def.h
   while readl Z
   do
      expr "$Z" :: ' LANGX_%u%u%>' && {
         expr "$Z" :Z 'LANGX_%u%u' = "LANGX_$LL"
      }
      expr "$Z" :LLs ' LANGi_%(%u%u%)%>' && {
         C=.
         for ll in $LLn
         do  cmpv ll LLs && C=+ break;  done
         expr "$Z" :Z 'LANGi_%u%u.*$' = "LANGi_$LLs  '$C'"
      }
      catv Z /%n
   done
   ><
}


>texts.h
print '%n/* Made by script texts.bish (H.Schellong) */%n'
<texts256.h
while readl Z
do
   base -b Z +16 Z16
   expr "$Z16" :: '[89abcdef][0-9a-f]' || { catv Z /%n; continue; }
   for C in $Z16
   do
      let "16#$C<=127" && { base -16 C +b; continue; }
      base -16 C +8 C
      prints ssf03- '\' $C
   done
   catv /%n
done
><<

remove -s texts.tmp




###  thints.bish  #############################################

#!/u/bin/bish

set -f

ifile=texts256.h
[ $# -ge 1 ] && ifile=$1

set Z:.200 Z0:.200 DZ:.200 Lz:32.100
LEN=16 Len=16
z0=0 dz0=0 len=000 lm=000


#< $ifile
while readl Z
do
   expr "$Z" :DZ '^%( *# *define  *[Dd]_%w%{1,}_%d%d%d_%l%l  *%)["0-9]' || {
      expr "$Z" :LEN '^//|%(%d%d%)|' && Len=$LEN
      expr "$Z" :Len '^//%(%d%d%)'
      expr "$Z" :: '^ *$' && Len=$LEN
      [ z0 -eq 1 ] && catv Z0 /%n
      Z0="$Z" z0=1 dz0=0
      continue
   }
   [ dz0 -eq 0 ] && {
      lm='' let "len=${#DZ}-2"
      expr "$Z0" :lm '^//%([^ %t]%{1,}%)' && let "len-=${#lm}"
      catv './/' lm $len,Lz '.|' $Len,Lz '.|' =Z0:
   }
   [ z0 -eq 1 ] && catv Z0 /%n
   Z0="$Z" z0=1 dz0=1
done
[ z0 -eq 1 ] && catv Z0 /%n
#><

:





###  timecp.bish  #############################################

#!/u/bin/bish
# timecp.bish
# Sinnvolles Backup-System für den täglichen Gebrauch.

T=/ UNIX=ja
[ `ver o` = dos ] && { T=\; unset UNIX; DOS=ja; }
[ `ver w` = shw ] && {
   echo Script $0 für bish-Shareware-Version nicht geeignet!; exit; }


if ifdef UNIX
then
   DIRS0="/u/bish /u/wapi /u/hs /u/l /u/sc /u/helmut /u/sh /u/coor
          /u/frei /u/bin /u/di-so /u/old /u/tmp"
   PACKER=/usr/bin/compress
   ENTPACKER=/usr/bin/uncompress
   NUL=/dev/null
   MNTDEV=/dev/fd0135ds18
   MNTDIR=/mnt
   FSTYP=AFS
   A_=$MNTDIR
   BSZ=1024
   MRO=""
else
   DIRS0="c:\bish c:\wapi c:\usr c:\win"
   #DIRS0="c:\gabi c:\gsschule c:\gswaren c:\usr"
   PACKER=c:\usr\bin\pack.exe
   ENTPACKER=c:\usr\bin\unpack.exe
   NUL=NUL
   MNTDIR=DOS
   A_="A:"
   BSZ=512
fi

MNT=U

FLST=temp_001.tcp
TMPS=size_tmp.tcp
LISTE=time_lst.tcp
ALISTE=time_l_a.tcp
NEWLST=time_l_n.tcp
TCPPATT='[a-zA-Z0-9_]%{4%}_[a-zA-Z0-9_]%{3%}%.[tT][cC][pP]'
conv -"d`echo %0012%c`d`echo %0015%c`f " DIRS0
DIRS=`expr "$DIRS0" : '%([^ ][^ ]*%) '`
#DIRS=`echo "$DIRS0" | cut -f1 -d"  "`
DSKUPCK=`expr $ENTPACKER : '.*%('$T'..*%)'`      # DSKUPCK=\unpack.exe

ifdef DOS  && conv -U PACKER ENTPACKER DIRS0 DIRS NUL A_ FLST TMPS %
                      LISTE ALISTE NEWLST DSKUPCK

[ ! -f $PACKER -o ! -f $ENTPACKER ] && {
   echo %n$PACKER und/oder $ENTPACKER nicht gefunden!
   echo Entsprechend einrichten oder in der Datei "'$0'"
   echo die betreffenden Zuweisungen entsprechend editieren.
   echo Hinweis:
   echo Auf Sicherungs-Disketten ist $DSKUPCK per Packoption
   echo regelmäßig kopiert worden.
   exit
}

aliases()  {
   global
   ifdef DOS  && alias remove=DEL mkdir=MD "copy=COPY /v" %
                       pack=$PACKER unpack=$ENTPACKER
   ifdef UNIX && alias remove=rm mkdir="mkdir -p" "copy=/bin/copy -om" %
                       pack="$PACKER -c -H" unpack="$ENTPACKER -c"
}

aliases

trap 'Delete; Umount' 0  2

fecho()  { echo "%e[1;5m$*%e[0m"; }

echoh()  { echo "%e[1m$*%e[0m"; }

fehler()  { echo "%n $0:  '$1'%n"; exit 1; }

stop()  { read "rest?        <Enter> "; }


Mount()  {
   [ $MNT = F -o $MNT = RW -a -z "$2" -o $MNT = R -a -n "$2" ] &&
      return 0
   frage "Diskette '$1' eingeschoben? (Ende=e)" || return
   [ $MNT != U ] && Umount
   MNT=F
   [ $T = / ] && {
      mount $2 -f $FSTYP $MNTDEV $MNTDIR || return
      MNT=R
      [ -z "$2" ] && MNT=RW
   }
   return 0
}

Umount()  {
   ifdef DOS  && { MNT=U; return 0; }
   [ $MNT = R -o $MNT = RW ] &| mount | grep -e "$MNTDEV" > $NUL &&
      { umount $MNTDEV && MNT=U; } ||
        echoh Kann $MNTDEV nicht abmontieren!
}


Delete()  {
   local  es=-e dat
   [ $# -gt 0 -a -n "$1" ] && es=$1
   for dat in $FLST $TMPS $ALISTE $NEWLST
   do
      [ $es $dat ] && remove $dat
   done
}


frage()  {
   while echo "%n$1  [jne]:  %c"
   do
     read rest
     case "$rest" in
       [jJ])  return 0 ;;
       [nN])  return 1 ;;
       [eE])  exit 0 ;;
          *)  continue ;;
     esac
   done
   return 2
}


getlines()  {
   [ $# -gt 1 ] && { static sl=1 cnt=$1 dat=$2; return 0; }
   line -$sl-$((sl+cnt-1)) "$dat" || return 1
   ((sl=sl+cnt))
   return 0
}


check_liste()  {
   local  nw=`wc -w $1` nl=`wc -l $1`
   [ $((nw%3)) -ne 0 -o "$nw" -lt 3 -o $((nl*3)) -ne "$nw" ] && {
      fecho Inhalt von $1 ist nicht okay!; return 1; }
   return 0
}


make_dirs()  {
   local  dir=$1 von=$2 nach=$3 dz=0 dlst mdir
   ifdef DOS  && dlst="$von$dir `DIR $von$dir /s/b/a:d`"
   ifdef UNIX && dlst="`find $von$dir -type d -print`"
   for mdir in $dlst
   do
      ((dz=dz+1)); echo "%r$dz(md)   %r%c"
      mdir=$nach`expr $mdir : $von'%(.*%)'`
      [ ! -d $mdir ] && {
         [ -e $mdir ] && {
            fecho $mdir existiert bereits, ist aber kein Verzeichnis!
            return 1
         }
         echo % Erzeuge Verzeichnis $mdir; mkdir $mdir
      }
   done
   return 0
}



akt_liste()  {
   echo %c > $ALISTE
   local  liste=$1 new=$2 nz=0 pfad szeit pck g_zeile
   getlines 15 $liste
   while dateien="`getlines`"
   do
      for  3 pfad szeit pck  in $dateien
      do
         ((nz=nz+1)); echo "%r$nz(al1)  %r%c"
         if g_zeile="`grep -m -e "^$pfad " $new`"
         then
            echo $g_zeile >> $ALISTE
         else
            echo $pfad $szeit $pck >> $ALISTE
         fi
      done
   done
   nz=0; echo
   getlines 15 $new
   while dateien="`getlines`"
   do
      for  3 pfad szeit pck  in $dateien
      do
         ((nz=nz+1)); echo "%r$nz(al2)  %r%c"
         grep -cm -e "^$pfad " $ALISTE > $NUL ||
            echo $pfad $szeit $pck >> $ALISTE
      done
   done
   [ -s $ALISTE ] && { echo copy $ALISTE $liste
                            copy $ALISTE $liste > $NUL; }
   return
}



backup_file()  {
   local  datei=$1 floppydat
   [ -z "$md" ] && {
      Mount $dir || return
      make_dirs $dir "$L" $A_ || return
      frage "Dateien bei Absicherung packen?" && PACK=packed
      md=1
      [ ! -e $A_$DSKUPCK -a $PACK = packed ] && {
         copy $ENTPACKER $A_$T > $NUL
         echo copy $ENTPACKER $A_$T
      }
   }
   floppydat=$A_$datei
   local  pzeile fq fz p mtim fmod
   PAC=$PACK
   mtim=`mtime $L$datei`
   fmod=`fmode $L$datei`
   [ ! -f $L$datei -o `fsize $L$datei` -le $BSZ  ] && PAC=unpacked
   [ $PAC = packed ] && ifdef UNIX && {
      p=`expr $datei : '[^/]*$'`
      expr $datei :: '.Z$' &| [ $p -gt 12 ] && PAC=unpacked
   }
   [ $PAC != packed ] && { copy $L$datei $floppydat > $NUL
                           stime $mtim $floppydat; return 0; }
   [ $PAC = packed ] && ifdef DOS && {
      pack $L$datei $floppydat | pzeile="`grep '[0-9]%%'`"
      echo "   Packreduktion  %c"
      expr "$pzeile" : ' %(-%{0,1%}[0-9]%{1,4%}%%%)' && ((lz=lz+1))
   }
   [ $PAC = packed ] && ifdef UNIX && {
      if pack $L$datei > $floppydat
      then
         fq=`fsize $L$datei`; fz=`fsize $floppydat`; ((p=(fz*100)/fq))
         echo "   Komprimiert auf $p%%%%"; ((lz=lz+1))
      else
         copy $L$datei $floppydat > $NUL; PAC=unpacked
      fi
      chmod $fmod $floppydat
   }
   stime $mtim $floppydat
   return 0
}



backup()  {
   PACK=unpacked PAC=unpacked md=""
   echo Bearbeite Verzeichnis $Dir ...
   ifdef DOS  && DIR $Dir /s/b/a:-d/o:s > $FLST
   ifdef UNIX && find $Dir -type f -print > $FLST
   [ ! -e $Dir$T$LISTE ] && { echo "?:?:? 0 p" > $Dir$T$LISTE
                              echoh Allererste Bearbeitung; }
   check_liste $Dir$T$LISTE || exit 1
   echo `wc -l $FLST` Dateien gefunden ; sleep
   getlines 20 $FLST
   lz=0; local  h=0 nz=0 datei zeit Datei g_zeile altezeit diff
   while dateien="`getlines`"
   do
      for Datei in $dateien
      do
         expr $Datei : "$TCPPATT" > $NUL && continue
         zeit=`mtime $Datei`
         datei=`expr $Datei : '%('$T'.*%)'`
         ((nz=nz+1)); echo "%r$nz(td)  %r%c"
         if g_zeile="`grep -m -e "^$datei " $Dir$T$LISTE`"
         then
            #altezeit=`echo $g_zeile | cut -f2 -d"  "`
            echo $g_zeile | read - altezeit -
            [ $zeit -gt $altezeit ] && {
               (( diff=zeit-altezeit ; h=diff/3600 ; s=diff%3600 ))
               [ "$h" != 0 ] &&  h="$h Std. "
               [ "$h" = 0 ] &&  h=""
               echo "Neuere Datei:  $Datei,"
               echo "               um  $h$s Sek.  neuer"
               backup_file $datei || return
               echo $datei $zeit $PAC >> $ALISTE
               echo $datei $zeit $PAC >> $NEWLST
               ((lz=lz+2))
            }
            [ $zeit -gt $altezeit ] || echo $g_zeile >> $ALISTE
         else
            echo "Neuaufnahme-Datei:  $Datei"
            backup_file $datei || return
            echo $datei $zeit $PAC >> $ALISTE
            echo $datei $zeit $PAC >> $NEWLST
            ((lz=lz+1))
         fi
         [ $lz -ge 21 ] && { lz=0; stop; }
      done
   done
   [ $nz -gt 0 ] && echo
   [ -n "$md" ] && {
      echo Aktualisiere Zeitmarken-Liste:
      echo copy $ALISTE $Dir$T$LISTE
      copy $ALISTE $Dir$T$LISTE > $NUL
      if [ ! -s $A_$dir$T$LISTE ]
      then
         echo copy $ALISTE $A_$dir$T$LISTE
         copy $ALISTE $A_$dir$T$LISTE > $NUL
      else
         akt_liste $A_$dir$T$LISTE $NEWLST
      fi
      ifdef DOS  && DIR $A_$T
      ifdef UNIX && { /bin/l $MNTDIR; df -vk $MNTDEV; }
      stop
   }
   Delete
   [ -z "$md" ] && { echoh "*** Keine Datei-Veränderung ***"; stop; }
   return 0
}



restore_file()  {
   local  dat=$1 von=$2 nach=$3 pck=$4 fq fz p pzeile mtim fmod
   if [ ! -f $von$dat ]
   then
      echoh "%r '$von$dat' ist in $von$dir$T$LISTE enthalten,"
      echoh " existiert jedoch nicht!"
      ((lz=lz+2))
   else
      echo " Kopiere   $von$dat  -->  $nach   ($pck)"
      md=1; ((lz=lz+1))
      mtim=`mtime $von$dat`; fmod=`fmode $von$dat`
      if [ $pck = packed ]
      then
         ((lz=lz+1))
         ifdef DOS  && {
            unpack $von$dat $nach$dat | pzeile="`grep '[0-9]%%'`"
            echo "   Entpackerweiterung  %c"
            expr "$pzeile" : ' %(-%{0,1%}[0-9]%{1,4%}%%%)'
            stime $mtim $nach$dat
         }
         ifdef UNIX && {
            mv $von$dat $von$dat.Z
            if unpack $von$dat.Z > $nach$dat
            then
               mv $von$dat.Z $von$dat
               fq=`fsize $von$dat`; fz=`fsize $nach$dat`
               ((p=(fz*100)/fq))
               echo "   Expandiert auf $p%%%%"
            else
               mv $von$dat.Z $von$dat
               fecho Expansion von $von$dat fehlgeschlagen!
               copy $von$dat $nach$dat
               stop
            fi
            stime $mtim $nach$dat
            chmod $fmod $nach$dat
         }
         echo $nach$dat `mtime $nach$dat` packed >> $NEWLST
      else
         copy $von$dat $nach$dat > $NUL
         stime $mtim $nach$dat
         ifdef UNIX && chmod $fmod $nach$dat
         echo $nach$dat `mtime $nach$dat` unpacked >> $NEWLST
      fi
   fi
}


help_ff()  {
   echo "%r%n
   Option '*' überträgt unbedingt alle Dateien, die in der
   Listen-Datei $LISTE auf Laufwerk $A_ enthalten sind
   und löscht alle anderen Optionen.

   Option '+' löscht logischerweise die Optionen, die
   Dateigrößen und das Dateialter vergleichen.
   Bei gepackten Dateien wird vorletztgenannte Option ignoriert.
   Die letztgenannten Optionen müssen beide zutreffen,
   damit (wenn beide angegeben wurden) kopiert wird.

   Man beachte, daß Dateien auf der Diskette vorhanden sein können,
   die nicht mehr in der Listendatei enthalten sind.
   "
   stop
}



restore()  {
   local  datlst;  md="" DA= S_O= T_O= SO= TO=
   Mount $dir $MRO || return
   [ "$L" = $A_ ] && { fecho Zielverzeichnis auf $A_; return; }
   [ ! -s $A_$dir$T$LISTE -o ! -d $A_$dir ] && {
      fecho "$A_$dir oder $A_$dir$T$LISTE fehlen!"; return; }
   check_liste $A_$dir$T$LISTE || exit 1

   while true
   do

   while echo "%r%n
   Datei-Auswahl:  '$DA $S_O $T_O  $datlst'
     Alle Dateien auf Diskette zur Festplatte                 :  *
     Die, die auf Diskette aber nicht auf Festplatte sind     :  +
     Pfadnamen-Einzelangabe:  $T...$T...  (kein Laufw. ang.!)   :  $T...
     Die auf Diskette größer-gleich-kleiner sind: > >= = <= < :  s.li.
     Die auf Diskette neuer-...usw. sind   : >> >>= == <<= << :  s.li.
     Bisherige Auswahl löschen                                :  --
     Bisherige Pfadnamen löschen                              :  $T-
     Kopiervorgang beginnen                                   :  S
     Hinweise                                                 :  ?
     Dieses Menü Verlassen                                    :  v
     Beenden                                                  :  e

                                                              :  %c"
   do
      read kdo rest
      case "$kdo" in
        %*)  DA='*'; S_O=""; T_O=""; SO=""; TO=""; datlst="" ;;
         +)  DA=+;   S_O=""; T_O=""; SO=""; TO="" ;;
        --)  DA=""; S_O=""; T_O=""; SO=""; TO="" ;;
     /-|\-)  datlst="" ;;
   /?*|\?*)  ifdef DOS  && conv -U kdo
             [ ! -f $A_$kdo ] && { fecho Datei $A_$kdo fehlt;continue; }
             datlst="$datlst$kdo " ;;
         >)  S_O='>' ; SO=gt ;;
        >=)  S_O='>='; SO=ge ;;
         =)  S_O='=' ; SO=eq ;;
        <=)  S_O='<='; SO=le ;;
         <)  S_O='<' ; SO=lt ;;
        >>)  T_O='>>' ; TO=gt ;;
       >>=)  T_O='>>='; TO=ge ;;
        ==)  T_O='==' ; TO=eq ;;
       <<=)  T_O='<<='; TO=le ;;
        <<)  T_O='<<' ; TO=lt ;;
        %?)  help_ff; continue ;;
         v)  return ;;
         e)  exit 0 ;;
         S)  [ -n "$DA" -o -n "$datlst" -o -n "$SO" -o -n "$TO" ] &&
                break
             echo %a%c; continue ;;
         *)  echo %a%c; continue ;;
      esac
   done

   make_dirs $dir $A_ "$L" || return

   local  dat pck nz datei dtime ja nein

   for dat in $datlst
   do
      if g_zeile="`grep -m -e "^$dat " $A_$dir$T$LISTE`"
      then
         #pck=`echo $g_zeile | cut -f3 -d"  "`
         echo $g_zeile | read - - pck -
         restore_file $dat $A_ "$L" $pck
      else
         echoh Ausgewählte Datei $dat nicht in Liste $A_$dir$T$LISTE !
      fi
   done

   getlines 15 $A_$dir$T$LISTE
   lz=0 nz=0
   while [ -n "$DA" -o -n "$SO" -o -n "$TO" ] &&
         dateien="`getlines`"
   do
      for  3 datei dtime pck  in $dateien
      do
         ja=0 nein=0
         [ "$DA" = '*' ] && ja=16
         [ "$DA" = + ] && [ ! -e $L$datei ] && ja=8
         [ -n "$SO" -a $pck != packed ] &&
            [ -f $A_$datei -a -f $L$datei ] && ja=4 &&
            [ `fsize $A_$datei` -$SO `fsize $L$datei` ] || nein=4
         [ -n "$TO" ] && [ -f $A_$datei -a -f $L$datei ] && ja=2 &&
            [ $dtime -$TO `mtime $L$datei` ] || nein=2
         ((nz=nz+1)); echo "%r$nz(ff)  %r%c"
         [ $ja -gt 0 -a $nein -eq 0 ] &&
            restore_file $datei $A_ "$L" $pck
         [ $lz -ge 21 ] && { lz=0; stop; }
      done
   done
   [ -n "$md" ] && {
      echo Aktualisiere Zeitmarken-Liste ...
      if [ ! -s $L$dir$T$LISTE ]
      then
         echo copy $A_$dir$T$LISTE $L$dir
         copy $A_$dir$T$LISTE $L$dir > $NUL
      else
         akt_liste $L$dir$T$LISTE $NEWLST
      fi
   }
   Delete
   [ -z "$md" ] && { echoh "*** Keine Datei übertragen ***"; stop; }

   done
}



get_size()  {
   echo " Verzeichnis:  '$1'%n"
   expr $Dir :: "^$A_" &| expr "$L" :: '^[abAB]:' && {
      Mount $dir $MRO || return
   }
   local  dblks=00000 fblks=00000 fsz=00000000000 rblks=00000
   local  verz einträge=0000 fblk=00000 dblk=00000 datei
   local  size=00000000000 rb=00000000000 prz=0000
   ifdef DOS  && verzchnsse="$1 `DIR $1 /s/b/a:d`"
   ifdef UNIX && verzchnsse="`find $1 -type d -print`"
   for verz in $verzchnsse
   do
      echo %r% Bearbeite $verz ...
      ifdef DOS  && DIR $verz /b/a:-d > $TMPS
      ifdef UNIX && ls -p $verz > $TMPS
      ifdef DOS  && einträge=`DIR $verz /b/a | wc -l`
      ifdef UNIX && einträge=`ls $verz | wc -l`
      ((einträge=einträge+2))
      fblk=$fblks dblk=$dblks
      getlines 20 $TMPS
      while dateien="`getlines`"
      do
         for datei in $dateien
         do
            ifdef UNIX && expr $datei : '/$' > $NUL && continue
            size=`fsize $verz$T$datei`  ((fsz=fsz+size))
            (( fblks= fblks + size/BSZ + (rb=((size%BSZ)+BSZ-1)/BSZ) ))
            ((rblks=rblks+rb))
         done
      done
      #einträge<4
      (( size= einträge<<5 ; fsz=fsz+size ;
         dblks= dblks + size/BSZ + (rb=((size%BSZ)+BSZ-1)/BSZ) ))
      ((rblks=rblks+rb))
      echo "%r     " $((fblks-fblk)) %tDateiblöcke
      echo "     " $((dblks-dblk)) %tVerzeichnisblöcke
   done
   [ -e $TMPS ] && remove $TMPS
   echo "%r%n Verzeichnis '$1' wird auf DOS-Diskette belegen:%n"
   echo " $fblks%tDateiblöcke%n $dblks%tVerzeichnisblöcke"
   ((fblks=fblks+dblks))
   [ $fsz -lt $BSZ ] && fsz=$BSZ
   (( prz=(fblks*100)/(fsz/BSZ) - 100 ; rb=fblks-(fsz/BSZ) ))
   echo " $fblks %tBlöcke insgesamt (mit je $BSZ Byte)"
   echo " Komprimiert etwa $(( (fblks*35)/100 )) bis $(( (fblks*70)
          /100 )) Blöcke"
   echo " Eine 3½%"-1440K-Diskette hat $(([(80*2*18-33)*512]/BSZ)) Blöcke"
   echo "%n $rblks Blöcke mit weniger als $BSZ Byte;"
   echo " die Erhöhung durch die Blockbildung beträgt $prz%%%%%c"
   echo " oder $rb Blöcke."
   stop
   unset verzchnsse
}


Test()  {

while echo "%r%n
Zu testendes Verzeichnis:  '$1'

%tListendatei zur Liegenschaft :   l
%tLiegenschaft zur Listendatei :   a
%tHinweise                     :   ?
%tDieses Menü verlassen        :   v
%tBeenden                      :   e

%t                             :   %c"
do
   read kdo rest
   case "$kdo" in
        l)  tst_lst_lieg $1 ;;
        a)  tst_lieg_lst $1 ;;
        v)  return 0 ;;
        e)  exit 0 ;;
       %?)  echoh Keine Hinweise. ;;
        *)  echo %a%c ;;
   esac
done

}


tst_lst_lieg()  {
   expr $Dir : "^$A_" > $NUL &| expr "$L" : '^[abAB]:' > $NUL && {
      Mount $dir $MRO || return
   }
   [ ! -s $Dir$T$LISTE -o ! -d $Dir ] && {
      fecho "$Dir oder $Dir$T$LISTE fehlen!"; return 1; }
   check_liste $Dir$T$LISTE || return 1
   getlines 20 $Dir$T$LISTE
   lz=0; local  nz=0 datei stime pck
   while dateien="`getlines`"
   do
      for 3 datei stime pck in $dateien
      do
         ((nz=nz+1)); echo "%r$nz(tl)  %r%c"
         if [ ! -f "$L$datei" ]
         then
            echoh "%r%n '$L$datei' ist in $Dir$T$LISTE enthalten,"
            echoh " existiert jedoch nicht!"
            ((lz=lz+3))
         else
            :
         fi
         [ $lz -ge 21 ] && { lz=0; stop; }
      done
   done
   echo; stop
}


tst_lieg_lst()  {
   expr $Dir : "^$A_" > $NUL &| expr "$L" : '^[abAB]:' > $NUL && {
      Mount $dir $MRO || return
   }
   [ ! -s $Dir$T$LISTE -o ! -d $Dir ] && {
      fecho "$Dir oder $Dir$T$LISTE fehlen!"; return 1; }
   check_liste $Dir$T$LISTE || return 1

   ifdef DOS  && DIR $Dir /s/b/a:-d/o:s > $FLST
   ifdef UNIX && find $Dir -type f -print > $FLST

   getlines 30 $FLST
   lz=0; local  nz=0 pfad datei
   while dateien="`getlines`"
   do
      for pfad in $dateien
      do
         datei=`expr $pfad : '^'$L'%(..*%)'`
         expr $datei : "$TCPPATT" > $NUL && continue
         ((nz=nz+1)); echo "%r$nz(ta)  %r%c"
         if grep -cm -e "^$datei " $Dir$T$LISTE > $NUL
         then
            :
         else
            echoh "%r%n '$pfad' existiert,"
            echoh " ist jedoch nicht in $Dir$T$LISTE enthalten!"
            ((lz=lz+3))
         fi
         [ $lz -ge 21 ] && { lz=0; stop; }
      done
   done
   [ -e $FLST ] && remove $FLST
   echo; stop
}


choice_dirs()  {
   local  dir r=0
   [ $# -eq 0 ] && read "DIRS?Verzeichnis(se):  "
   [ -z "$DIRS" ] && fecho Kein Verzeichnis angegeben! && r=2
   for dir in $DIRS
   do
      ifdef UNIX && expr $dir :: '^'$MNTDIR && Mount $MNTDIR $MRO || r=2
      ifdef DOS  && expr $dir :: '^[abAB]:' && Mount $MNTDIR $MRO || r=2
      ifdef DOS  && expr $dir :: '^[a-zA-Z]:' ||
         fecho Verzeichnis $dir ohne Laufwerkangabe! && r=2
      [ ! -d $dir ] && echoh Verzeichnis $dir existiert nicht! &&
                       r=1 && [ -e $dir ] &&
                       fecho $dir existiert jedoch als Datei! && r=2
   done
   return $r
}


help()  {
   echo "%r%n
   Die Verzeichnisse sind Quelle beim Absichern (a)
   und Ziel beim Holen (h).
   Ansonsten sind sie Gegenstand der Bearbeitung.

   Bei den Testläufen (A,H) geschieht alles genau so
   wie bei a,h. Es wird lediglich tatsächliches Kopieren
   und Anlegen von Verzeichnissen unterbunden.

   Dateien mit nicht mehr als $BSZ Byte werden trotz eventueller
   Anwahl nicht gepackt.
   "
   stop
}



while echo "%r%n
Sicherungs-Diskette:  '$A_'
Verzeichnis-Liste:  '$DIRS0'
Quell- bzw. Ziel-Verzeichnis(se):  '$DIRS'

%tListen-Verzeichnisse wählen  :   1[,2,...,9]
%tVerzeichnis(se) eingeben     :   v
%tAuf Diskette absichern       :   a
%tVon Diskette holen           :   h
%tAuf Diskette absichern (Test):   A
%tVon Diskette holen (Test)    :   H
%tVerzeichnisgröße feststellen :   g
%tTest-Menü                    :   t
%tHinweise                     :   ?
%tBeenden                      :   e

%t                             :   %c"
do
   read kdo rest
   case "$kdo" in
        v)  choice_dirs; continue ;;
        [1-9]*)
            #DIRS="`echo $DIRS0%c | cut -f$kdo -d"  "`"
            cdn=1
            for DIRS in $DIRS0 ; do
               [ $cdn -eq $kdo ] && break
               ((cdn=cdn+1))
            done
            choice_dirs ""$DIRS; continue ;;
        a)  Delete -s; KDOFKTN=backup; TST=0 ;;
        A)  Delete -s; KDOFKTN=backup; TST=1
            alias mkdir=: copy=: pack=: ;;
        h)  Delete -s; KDOFKTN=restore; TST=0 ;;
        H)  Delete -s; KDOFKTN=restore; TST=1
            alias mkdir=: copy=: unpack=: ;;
        t)  KDOFKTN=Test ;;
        g)  KDOFKTN=get_size ;;
        e)  exit 0 ;;
       %?)  help; continue ;;
        *)  continue ;;
   esac
   choice_dirs ""$DIRS || [ $? -gt 1 ] && continue
   for kdir in $DIRS
   do
      Dir=$kdir
      ifdef DOS  && {
         L=`expr $kdir : '^%([A-Za-z]:%)'`
         dir=`expr $kdir : '%('$T'.*%)'`; }
      ifdef UNIX && {
         L=''`expr $kdir : '^%('$MNTDIR'%)'`
         dir=`expr $kdir : '^'$L'%('$T'.*%)'`; }
      $KDOFKTN $kdir
      Umount
   done
   aliases
done


Delete; Umount


#


###  todsk.bish  #############################################

#

LBL=bish-Shell

while :
do

while echo "%n
%tbish             : 1
%tdocsys           : 2
%tbish+docsys      : 3
%twdoc             : 4
%tshareware        : 5
%tcmp              : 6
%tZur Diskette     : a
%tGesetztes loschen: L
%tBeenden          : Q

%t                 : %c"
do
   read opt rest
   case "$opt" in
     1)  bishx=1 ztxt=1 doku=1 demo=1 docf=1 LBL=bish-Shell ;;
     2)  ztxt=1  docf=1 manf=1 dsysx=1 LBL=bish-docsys ;;
     3)  bishx=1 ztxt=1 doku=1 demo=1 docf=1
         manf=1  dsysx=1 LBL='bish!docsys' ;;
     4)  LBL=bish-manw ;;
     5)  bishS=1 ztxt=1 docf=1 LBL=bish-shw ;;
     6)  cmpx=1; LBL=bish-support;;
     a)  break ;;
     L)  unset bishx bishS ztxt doku demo docf manf dsysx
         unset pgx cmpx calcx ddx hxx touchx timexx ;;
     Q)  exit ;;
     *)  continue ;;
   esac
done
ptxt=1 manwx=1
[ -n "$docf$manf$dsysx$bishx$bishS" ] && {
   DT=`dat`
   dat 021195011500
   [ -n "$dsysx" -o -n "$bishx" -o -n "$bishS" ] && MD a:\bin
   [ -n "$docf" ] && MD a:\doc
   [ -n "$manf" ] && MD a:\man
   dat $DT
}
label a:"$LBL"
ifset ptxt && COPY \bish\vk\produkte.txt a:\/v
ifset manwx && COPY \wapi\bish\manw.exe a:\/v
ifset ztxt && COPY \bish\vk\zuerst.txt a:\/v
ifset ztxt && COPY \bish\vk\kurzdoku.txt a:\/v
ifset doku && COPY \bish\vk\doku.'*' a:\/v
ifset demo && COPY \bish\vk\demo.'*' a:\/v
ifset docf && xcopy \bish\doc a:\doc\/s/v
ifset manf && xcopy \bish\man a:\man\/s/v
ifset dsysx && { xcopy \bish\prog\man.exe a:\bin\/v
                 xcopy \bish\prog\pg.exe a:\bin\/v
                 xcopy \bish\prog\upat.exe a:\bin\/v ; }
ifset bishx && xcopy \bish\bish.exe a:\bin\/v
ifset bishS && xcopy \bish\bishS.exe a:\bin\bish.exe/v
ifset cmpx && { COPY \bish\prog\cmp.exe a:\/v
                COPY \bish\doc\cmp.mnk a:\/v ; }

touch -c /021195011500 a:\?*.?*
for Dir in doc man bin
do
   [ -d a:\$Dir ] && { LST=a:\$Dir\?*.?*
      for D in $LST
      do
         touch -c /021195011500 $D
      done
   }
done
DIR a:\
read rest"?<Enter>"

done



###  tpa.bish  #############################################


set -f

ifile=texts256.h
[ -s "$1" ] && ifile="$1"
[ -s "$ifile" ] || exit 0

Npa=0000 Na=00000

T1()  {
   local k=0 n=000000 len=00
   local tnam=.........................
   local dnam=.........................
   local tnam0=.........................
   local tanam=.........................
   local danam=.........................
   echo text.h texte.h texte.c tsizes.txt
   6> tall.tmp
   5> tpa.tmp
   4> text.h
   3> texte.h
   > texte.c
   < $ifile
   print -u3 'extern cfap_t const FAR T_All[];%n'
   print -u6 '%n%ncfap_t const FAR T_All[]= {'
   print '%n%n#%t%tinclude "def.h"'
   print '#%t%tinclude "text.h"%n%n'
   while readl Z
   do
      expr "$Z" :danam ' %(D_%w%{1,}_%d%d%d_%l%l%)  *["0]' || continue
      len=0
      expr "$Z" :: ' 0%{1,}[ %t]*$' ||
         expr "$Z" :Z '^[^"]%{1,} %(".*%)"[ %t]*$' && len=${#Z}
      tanam="$danam" conv -TDT tanam; let ++Na
      let len && print -ru4 "extern ta_t $tanam;"
      expr "$tanam" :tnam '^%(T_%w%{1,}%)_%d%d%d_%l%l$'
      let len || tanam=0
      cmpv tnam tnam0 && { echo "     $tanam,"; let n+=len; continue; }
      tnam0="$tnam"
      print -ru3 "extern tpa_t $tnam;"
      print -ru6 "   $tnam,"
      [ k -eq 1 ] && { echo "     0%n};%n"; print -u5 "$n $dnam"; n=0; }
      dnam="$tnam" conv -TTD dnam
      echo "tpa_t $tnam= {"; let ++Npa
      echo "     $tanam,"; let n+=len
      k=1
   done
   [ k -eq 1 ] && { echo '     0%n};%n'; print -u5 "$n $dnam"; n=0; }
   [ k -eq 1 ] && { print -u6 '   0%n};%n'; }
   ><<<<<<
   cat tall.tmp >> texte.c
   return 0
}


T1
echo PointerArrays=$Npa StringPointer=$Na
sortl -r -f1n,2r -otpa.tmp tpa.tmp
cat tpa.tmp > tsizes.txt


#texte_c()  {
#   local ll=00
#   cat texte.c | {
#      >texte.c
#      while readl Z
#      do
#         expr "$Z" :: '%<T_%w%{1,}_%d%d%d_%l%l%>' || {
#            catv Z /%n
#            continue
#         }
#         expr "$Z" :: '_[ed][ne]%>' && {
#            catv Z /%n
#            continue
#         }
#         expr "$Z" :ll '_%d%d%d_%(%l%l%>%)' && {
#            conv -u ll
#            echo "#    if defined(LANGX_$ll)"
#            catv Z /%n
#            echo '#    endif'
#         }
#      done
#      ><
#   }
#   return 0
#}
#
#texte_c


# tmpf sizemax(hex)
GetD()  {
   local k=1 size=000000 szmax=000000 sk=00000 sz=000000
   local dnam=.................................
   let "szmax=16#$2"
   <> $1
   while seek + 0 sk; read sz dnam
   do
      expr "$sz" :: '^-' && continue
      let "sz>=64*1024" && print -u2 "$sz ! $dnam"
      let "size+sz>=szmax && (size>0||szmax<64*1024)" && continue
      let "size+=sz"
      catv /- =$sk,1,0.
      echo $dnam
      k=0
   done
   ><
   return $k
}


# filenam dnam ...
WrFromDnam()  {
   [ $# -le 1 ] && return 1
   echo $* $Dnam
   local n64k=000000 sk64k=00000000 len=00
   local tnam=.........................
   local dnam=.........................
   local dnam0=.........................
   local tanam=.........................
   local danam=.........................
   > $1
   shift
   echo '%n%n#%t%tinclude "def.h"'
   echo '#%t%tinclude "texts.h"%n%n'
   < $ifile
   [ SK64k -gt 0 ] && { seek $SK64k 0; dnam0=$Dnam0 SK64k=0; }
   while seek + 0 sk64k; readl Z
   do
      expr "$Z" :danam ' %(D_%w%{1,}_%d%d%d_%l%l%)  *"' || continue
      expr "$danam" :dnam '^%(D_%w%{1,}%)_%d%d%d_%l%l$'
      expr " $* $Dnam " :: "[ %t]${dnam}[ %t]" || continue
      tanam="$danam" tnam="$dnam" conv -TDT tanam tnam

      len=0
      #expr "$Z" :: ' 0%{1,}[ %t]*$' ||
         expr "$Z" :Z '^[^"]%{1,} %(".*%)"[ %t]*$' && len=${#Z}
      let "n64k+=len" 'n64k>=64*1024' &&
         SK64k=$sk64k Dnam0=$dnam0 Dnam=$dnam break

      cmpv dnam0 dnam || dnam0=$dnam echo
      echo "ta_t $tanam= $danam;"
   done
   ><<
   [ SK64k -gt 0 ] && return 64
   Dnam=
   return 0
}


Dnam=.........................
Dnam0=.........................
SK64k=00000000
Dnam=
local HS=..... b=0 n=000 Cnam=...............

for HS in $*
do
   let ++n
   Cnam=t${n}h$HS.c
   echo $Cnam -----------------------
   [ b -eq 0 ] && { WrFromDnam $Cnam $( GetD tpa.tmp $HS ) ; b=$?; }
   [ b -eq 2 ] && { WrFromDnam $Cnam  ' ' ; b=$?; }
   [ b -gt 2 ] && b=2
   [ b -eq 1 ] && echo remove $Cnam ...
   [ b -eq 1 ] && [ -e $Cnam ] && remove $Cnam
done


remove -s tpa.tmp tall.tmp
:





###  tpa.bish  #############################################


set -f

ifile=texts256.h
[ -s "$1" ] && ifile="$1"
[ -s "$ifile" ] || exit 0

NLANG=7 Npa=0000 Na=00000

T1()  {
   local k=0 n=000000 len=00
   local tnam=.........................
   local dnam=.........................
   local tnam0=.........................
   local tanam=.........................
   local danam=.........................
   echo text.h texte.h texte.c tsizes.txt
   6> tall.tmp
   5> tpa.tmp
   4> text.h
   3> texte.h
   > texte.c
   < $ifile
   print -u3 'extern cfap_t const FAR T_All[];%n'
   print -u6 '%n%ncfap_t const FAR T_All[]= {'
   print '%n%n#%t%tinclude "def.h"'
   print '#%t%tinclude "text.h"%n%n'
   while readl Z
   do
      expr "$Z" :danam ' %(D_%w%{1,}_%d%d%d_%l%l%)  *["0]' || continue
      len=0
      expr "$Z" :: ' 0%{1,}[ %t]*$' ||
         expr "$Z" :Z '^[^"]%{1,} %(".*%)"[ %t]*$' && len=${#Z}
      tanam="$danam" conv -TDT tanam; let ++Na
      let len && print -ru4 "extern ta_t $tanam;"
      expr "$tanam" :tnam '^%(T_%w%{1,}%)_%d%d%d_%l%l$'
      let len || tanam=0
      cmpv tnam tnam0 && { echo "     $tanam,"; let n+=len; continue; }
      tnam0="$tnam"
      print -ru3 "extern tpa_t $tnam;"
      print -ru6 "   $tnam,"
      [ k -eq 1 ] && { echo "     0%n};%n"; print -u5 "$n $dnam"; n=0; }
      dnam="$tnam" conv -TTD dnam
      echo "tpa_t $tnam= {"; let ++Npa
      echo "     $tanam,"; let n+=len
      k=1
   done
   [ k -eq 1 ] && { echo '     0%n};%n'; print -u5 "$n $dnam"; n=0; }
   [ k -eq 1 ] && { print -u6 '   0%n};%n'; }
   ><<<<<<
   cat tall.tmp >> texte.c
   return 0
}


T1
echo PointerArrays=$Npa StringPointer=$Na
sortl -r -f1n,2r -otpa.tmp tpa.tmp
cat tpa.tmp > tsizes.txt


# tmpf sizemax(hex)
GetD()  {
   local k=1 size=000000 szmax=000000 sk=00000 sz=000000
   local dnam=.................................
   let "szmax=16#$2"
   <> $1
   while seek + 0 sk; read sz dnam
   do
      expr "$sz" :: '^-' && continue
      let "sz>=64*1024" && print -u2 "$sz ! $dnam"
      let "size+sz>=szmax && (size>0||szmax<64*1024)" && continue
      let "size+=sz"
      catv /- =$sk,1,0.
      echo $dnam
      k=0
   done
   ><
   return $k
}


# filenam dnam ...
WrFromDnam()  {
   [ $# -le 1 ] && return 1
   echo $* $Dnam
   local n64k=000000 sk64k=00000000 len=00
   local tnam=.........................
   local dnam=.........................
   local dnam0=.........................
   local tanam=.........................
   local danam=.........................
   > $1
   shift
   echo '%n%n#%t%tinclude "def.h"'
   echo '#%t%tinclude "texts.h"%n%n'
   < $ifile
   [ SK64k -gt 0 ] && { seek $SK64k 0; dnam0=$Dnam0 SK64k=0; }
   while seek + 0 sk64k; readl Z
   do
      expr "$Z" :danam ' %(D_%w%{1,}_%d%d%d_%l%l%)  *"' || continue
      expr "$danam" :dnam '^%(D_%w%{1,}%)_%d%d%d_%l%l$'
      expr " $* $Dnam " :: "[ %t]${dnam}[ %t]" || continue
      tanam="$danam" tnam="$dnam" conv -TDT tanam tnam

      len=0
      #expr "$Z" :: ' 0%{1,}[ %t]*$' ||
         expr "$Z" :Z '^[^"]%{1,} %(".*%)"[ %t]*$' && len=${#Z}
      let "n64k+=len" 'n64k>=64*1024' &&
         SK64k=$sk64k Dnam0=$dnam0 Dnam=$dnam break

      cmpv dnam0 dnam || dnam0=$dnam echo
      echo "ta_t $tanam= $danam;"
   done
   ><<
   [ SK64k -gt 0 ] && return 64
   Dnam=
   return 0
}


Dnam=.........................
Dnam0=.........................
SK64k=00000000
Dnam=
local HS=..... b=0 n=000 Cnam=...............

for HS in 8000 10000 10000 10000 4000 4000 4000
do
   let ++n
   Cnam=t${n}h$HS.c
   echo $Cnam -----------------------
   [ b -eq 0 ] && { WrFromDnam $Cnam $( GetD tpa.tmp $HS ) ; b=$?; }
   [ b -eq 2 ] && { WrFromDnam $Cnam  ' ' ; b=$?; }
   [ b -gt 2 ] && b=2
   [ b -eq 1 ] && echo remove $Cnam ...
   [ b -eq 1 ] && [ -e $Cnam ] && remove $Cnam
done


remove -s tpa.tmp tall.tmp
:





###  tpa.bish  #############################################


set -f

ifile=texts256.h
[ -s "$1" ] && ifile="$1"
[ -s "$ifile" ] || exit 0

NLANG=5 Npa=0000 Na=00000

T1()  {
   local k=0 n=000000 len=00
   local tnam=.........................
   local dnam=.........................
   local tnam0=.........................
   local tanam=.........................
   local danam=.........................
   echo text.h texte.h texte.c tsizes.txt
   5> tpa.tmp
   4> text.h
   3> texte.h
   > texte.c
   < $ifile
   print '%n%n#%t%tinclude "def.h"'
   print '#%t%tinclude "text.h"%n%n'
   while readl Z
   do
      expr "$Z" :danam ' %(D_%w%{1,}_%d%d%d_%l%l%)  *"' || continue
      expr "$Z" :Z '^[^"]%{1,} %(".*%)"[ %t]*$'; len=${#Z}
      tanam="$danam" conv -TDT tanam; let ++Na
      print -ru4 "extern ta_t $tanam;"
      expr "$tanam" :tnam '^%(T_%w%{1,}%)_%d%d%d_%l%l$'
      cmpv tnam tnam0 && { echo "     $tanam,"; let n+=len; continue; }
      tnam0="$tnam"
      print -ru3 "extern tpa_t $tnam;"
      [ k -eq 1 ] && { echo "     0%n};%n"; print -u5 "$n $dnam"; n=0; }
      dnam="$tnam" conv -TTD dnam
      echo "tpa_t $tnam= {"; let ++Npa
      echo "     $tanam,"; let n+=len
      k=1
   done
   [ k -eq 1 ] && { echo "     0%n};%n"; print -u5 "$n $dnam"; n=0; }
   ><<<<<
   return 0
}


T1
echo PointerArrays=$Npa StringPointer=$Na
sortl -r -f1n,2r -otpa.tmp tpa.tmp
cat tpa.tmp > tsizes.txt


# tmpf sizemax(hex)
GetD()  {
   local k=1 size=000000 szmax=000000 sk=00000 sz=000000
   local dnam=.................................
   let "szmax=16#$2"
   <> $1
   while seek + 0 sk; read sz dnam
   do
      expr "$sz" :: '^-' && continue
      let "sz>=64*1024" && print -u2 "$sz ! $dnam"
      let "size+sz>=szmax && (size>0||szmax<64*1024)" && continue
      let "size+=sz"
      catv /- =$sk,1,0.
      echo $dnam
      k=0
   done
   ><
   return $k
}


# filenam dnam ...
WrFromDnam()  {
   [ $# -le 1 ] && return 1
   echo $*
   local tnam=.........................
   local dnam=.........................
   local dnam0=.........................
   local tanam=.........................
   local danam=.........................
   > $1
   shift
   echo '%n%n#%t%tinclude "def.h"'
   echo '#%t%tinclude "texts.h"%n%n'
   < $ifile
   while readl Z
   do
      expr "$Z" :danam ' %(D_%w%{1,}_%d%d%d_%l%l%)  *"' || continue
      expr "$danam" :dnam '^%(D_%w%{1,}%)_%d%d%d_%l%l$'
      expr " $* " :: "[ %t]${dnam}[ %t]" || continue
      tanam="$danam" tnam="$dnam" conv -TDT tanam tnam
      cmpv dnam0 dnam || dnam0=$dnam echo
      echo "ta_t $tanam= $danam;"
   done
   ><<
   return 0
}


local HS=..... b=0 n=000 Cnam=...............

for HS in 4000 10000 10000 10000 10000
do
   let ++n
   Cnam=t${n}h$HS.c
   echo $Cnam -----------------------
   [ b -eq 0 ] && WrFromDnam $Cnam $( GetD tpa.tmp $HS ) || b=1
   [ b -eq 1 ] && echo remove $Cnam ...
   [ b -eq 1 ] && [ -e $Cnam ] && remove $Cnam
done


remove tpa.tmp
:





###  tpa.bish  #############################################



set -f

ifile=./base/txtbase.h
[ -s "$1" ] && ifile="$1"
[ -s "$ifile" ] || exit 0

Npa=0000 Na=000000 IDmax=000000 Nid=000000 Nchar=0000000
SC='/* Made by script tpa.bish (H.Schellong) */'
set Z:.250


T1()  {
   local k=0 nl=0 id=000000
   local danam:.30 tanam:.30 tnam:.20 tnam0:.20
   echo texte.c texte.h
   6> tall.tmp
   3> texte.h
   > texte.c
   print -u6 "%n$SC%n"
   print -u3 "%n$SC%n"
   print     "%n$SC%n"
   < $ifile
   print -u6 '%n%ntsp_t const T_All[]= {'
   print -u3 'extern tsp_t const T_All[];%n'
   print '%n%n#%t%tinclude "def.h"'
   print '#%t%tinclude "texts.h"%n%n'
   while readl Z
   do
      expr "$Z" :danam ' %(D_%w%{1,}_%d%d%d_%l%l%)  *["0-9]' || continue
      if expr "$Z" :id ' D_%w%{1,}_%d%d%d_id  *%(%d%{1,6}%)'
      then  let ++Nid
      else  id=0 expr "$Z" :Z ' %(".*%)"[ %t]*$' && let "Nchar+=${#Z}"
      fi
      [ id -gt IDmax -a id -lt 9999 ] && IDmax=$id
      tanam="$danam" conv -TDT tanam
      expr "$tanam" :tnam '^%(T_%w%{1,}%)_%d%d%d_%l%l$'
      cmpv tnam tnam0 && { let ++nl
         case "$nl" in
           1)  echo "   { $danam, {";;
         2|3)  echo "     $danam,";;
           4)  nl=0 let Na+=3; echo "     $danam,"
               #expr "$danam" :danam '_%l%l$' = _en
               echo "     0 } },";;
         esac
         continue
      }
      tnam0="$tnam"
      print -ru3 "extern tpa_t $tnam;"
      print -ru6 "   $tnam,"
      [ k -eq 1 ] && echo '   { 0, { 0,0,0,0 } }%n};%n'
      echo "tpa_t $tnam= {"; let ++Npa
      echo "   { $danam, {"; nl=1
      k=1
   done
   [ k -eq 1 ] && echo '   { 0, { 0,0,0,0 } }%n};%n'; %
                  print -u6 '   0%n};%n'
   ><<<<
   cat tall.tmp >> texte.c
   return 0
}


T1
echo PointerArrays=$Npa StringPointer=$Na Zeichen=$Nchar
echo IDs=$Nid MaxID=$IDmax
remove -s tall.tmp
:





###  transbeck  #############################################

#

cd /home/bish
mkdir /home2/merge/fat
mkdir /home2/merge/fat/bish
mkdir /home2/merge/fat/bish/cmd
mkdir /home2/merge/fat/bish/mod
copy -mv cmd/beck.cfg cmd/beck.bat /home2/merge/fat/bish/cmd
copy -mv bish.c /home2/merge/fat/bish
copy -rmv mod /home2/merge/fat/bish/mod
chown -R helmut /home2/merge/fat
chgrp -R other /home2/merge/fat



###  troj.bish  #############################################


hr===================================================
from=0
< $1
while readl zeile
do
   expr "$zeile" :: '^From - ' && {
      [ from -gt 1 ] && cat from_tmp >> from.txt &&
                        catv hr /%n >> from.txt
      : > from_tmp
      from=1
   }
   [ from -gt 0 ] && {
      expr "$zeile" :: '^[!-~]%{60,}$' ||
         catv zeile /%n >> from_tmp
      expr "$zeile" :zeile ' %(filename=..*%)$' &&
         expr "$zeile" =:: '%.gif"*$' ||
         expr "$zeile" =:: '%.jpg"*$' ||
         expr "$zeile" =:: '%.jpeg"*$' ||
         expr "$zeile" =:: '%.htm"*$' ||
         expr "$zeile" =:: '%.html"*$' ||
         expr "$zeile" =:: '%.zip"*$' ||
         expr "$zeile" =:: '%.itr"*$' ||
         expr "$zeile" =:: '%.00"*$' ||
         from=2 catv zeile /%n >> from_fn
   }
done
><
      [ from -gt 1 ] && cat from_tmp >> from.txt &&
                        catv hr /%n >> from.txt
cat from.txt | { catv hr /%n > from.txt
                 cat from_fn >> from.txt
                 catv hr /%n >> from.txt
                 cat >> from.txt
               }
remove from_tmp from_fn



###  ts7.bish  #############################################

#!/u/bin/bish

set -f

ifile=txtbase.h
[ $# -ge 1 ] && ifile=$1

set Zen:.100
set Zde:.100
set Zsw:.100
set Zit:.100
set Zru:.100
set Zhu:.100
s=0
dnanu=.........................
dnanu0=.........................
set text:.50
set text_en:.50
set langs:32.25
langs=


AddLangs()  {
   [ s -eq 0 ] && return 1
   ifset langs || return 2
   ifset text_en && text="$text_en"
   ifset text || return 3
   local l=ll
   for l in  en de sv es #it ru hu ci
   do
      expr " $langs " :: " $l " && { catv Z$l /%n; continue; }
      catv '/#define ' dnanu0 l text /%n
   done
   s=0 langs= text=? text_en=?
   return 0
}


#< $ifile
while readl Z
do
   expr "$Z" :danam ' %(D_%w%{1,}_%d%d%d_%l%l%)  *["0]' || {
      [ s -eq 1 ] && AddLangs
      catv Z /%n
      continue
   }
   expr "$Z" :text '%(  *"[^"]*"%) *$' || text=0
   expr "$danam" :dnanu '^%(D_%w%{1,}_%d%d%d_%)%l%l$'
   expr "$danam" :lang '^D_%w%{1,}_%d%d%d_%(%l%l%)$'
   catv Z =Z$lang:
   [ $lang == en ] && text_en="$text"
   [ s -eq 0 ] && dnanu0=$dnanu
   cmpv dnanu dnanu0 || { AddLangs; dnanu0=$dnanu; }
   s=1 langs="$langs$lang "
done
#><

:





###  txtbase.bish  #############################################

#!/u/bin/bish

if [ "$(-ver s)" == unix ]
then  MORE='gvim -fnR -' #'less -M'
      LESSCHARSET=iso8859; export LESSCHARSET
else  MORE='more' #ultraedit32
fi

set TxtB:.50 cmd:.10 rest:.30
set Z:.200
Lang=de Langs='en de sv'

if [ -s base/txtbase.h ]
then  TxtB=./base/txtbase.h
elif [ -s txtbase.h ]
then  TxtB=./txtbase.h
else  TxtB='???'
fi


Check() {
   local id=000000 nl=000000 nid=00000 ntxt=000000 nchar=0000 idmax=00000
   local z:.80 nam:.40 nam0:.40 len0=016 len=016
   while readl Z
   do
      let ++nl
      expr "$Z" :len0 '^//|%(%d%{1,}%)|' && { len=$len0; continue; }
      expr "$Z" ::  '^[%t ]*$' && { len=$len0; continue; }
      expr "$Z" :len  '^//%(%d%{1,}%)' && continue
      expr "$Z" :: 'D_%w%{1,}_%d%d%d_%l%l' || continue
      expr "$Z" :nam '^#define D_%(%w%{2,24}%)_%d%d%d_id  %d%{4}$' &|
      expr "$Z" :: '^#define D_%w%{2,24}_%d%d%d_%l%l  ".*"$' || {
         catv ".$nl »" Z'/defektes Format%j'; continue
      }
      if expr "$Z" :id '_id  %(%d%{4}%)$'
      then  let ++nid
            [ id -gt idmax -a id -lt 9999 ] && idmax=$id
      elif expr "$Z" :z '  "%(.*%)"$'
      then  let nchar=${#z} ++ntxt
            [ nchar -gt len ] && catv ".$nl »" z .« /len=$nchar%j
      else  catv ".$nl »" Z'/Text fehlt%j'
      fi
   done
   return 0
}


IDCheck() {
   local id=000000 id0=000000 z0:.200 fst=0
   grep -n '^#define D_%w%{2,24}_%d%d%d_id  %d%{4}$' |
   sortl -fn3 | {
      while readl Z
      do
         expr "$Z" :id '_id  %(%d%{4}%)$'
         if [ id -eq id0 ]
	 then  [ fst -eq 0 ] && { fst=1; catv z0 /%j; }
	       catv Z /%j
	 else  fst=0
	 fi
         id0=$id z0="$Z"
      done
   }
   return 0
}


Print() {
   local id=000000 z:.40
   while readl Z
   do
      expr "$Z" :id '^#define D_%w%{2,24}_%d%d%d_id  %(%d%{4}%)$' && continue
      expr "$Z" :z '^#define D_%w%{2,24}_%d%d%d_'"$Lang"'  %(".*"%)$' && {
         catv id /%t z /%j
      }
   done
   return 0
}


while echo "
%tTextbasis  :  f datei  [$TxtB]
%tSprachen   :  $Langs ..
%tSprache  $Lang:  en de sv ..
%tKorrektheit:  c
%tID Prüfung :  i
%tAusgabe    :  a
%tBeenden    :  E
%t              _%b%c"
do
   read cmd rest
   case "$cmd" in
     f)  [ -s "$rest" ] || { echo "%a%c"; continue; }
         TxtB="$rest";;
     [a-z][a-z])
         ifset rest || Lang=$cmd
         ifset rest && Langs="$cmd $rest";;
     c)  Check <"$TxtB" | $MORE;;
     i)  IDCheck <"$TxtB" | $MORE;;
     a)  Print <"$TxtB" | $MORE;;
     E)  break;;
     *)  echo "%a%c"; continue;;
   esac
done

:




###  txtsc.bish  #############################################

# Um z.B. das Wort 'UNIX' in allen Dateien
# in '\textsc{Unix}' zu formatieren.


[ $# -eq 0 ] && exit 0


Zeile()  {
   local a:17.1 b:19.1 comment:.200
   local n:.100
   if expr "$Z" :comment '[^\]%(%%.*%)$'
   then  expr "$Z" :Z '%([^\]%)%%.*$' '%1'
   else  comment=
   fi
   expr "$N" :n '^%(.%)%(.*%)$' '%1%L%2'
   expr "$n" :n ' %([a-z]%)' + ' %U%1'
   expr "$Z" :Z "%<$N%>" + "$a&$b"
   expr "$Z" :Z "\index{$a$N$b" += "\index{$N"
   expr "$Z" :Z "\textsc{$a$N$b" += "\textsc{$N"
   expr "$Z" :Z "\verb%(.%)$a$N$b" + "\verb%1$N"
   expr "$Z" :Z "\label{%([^}]*%)$a$N$b" + "\label{%1$N"
   expr "$Z" :Z "\pageref{%([^}]*%)$a$N$b" + "\pageref{%1$N"
   expr "$Z" :Z "\ref{%([^}]*%)$a$N$b" + "\ref{%1$N"
   expr "$Z" :Z "\textbf{%([^}]*%)$a$N$b" + "\textbf{%1$N"
   expr "$Z" :Z "$a$N$b" += "\textsc{$n}"
   ifset comment && catv comment =:,,Z:
   return 0
}


UseNot()  {
   ifset Z || { catv /%n; return 0; }
   expr "$Z" :: '^[ %t]%{0,}%%' &|
   expr "$Z" :: '\[a-z]*section[{[]' &|
   expr "$Z" :: '\[a-z]*section%*[{[]' &|
   expr "$Z" :: '\chapter[{[]' && {
      catv Z /%n; return 0
   }
   return 1
}


set Z:.300
set Zcmp:.300
set F:.50
set N:.50
V=v

for F in kap/*.tex
do
   [ -s "$F" ] || continue
   [ $# -eq 1 ] && grep -qm "%<$1%>" "$F" || continue
   cat "$F" | {
      > "$F"
      while readl Z Zcmp
      do
         if [ $V == V ]
         then
            expr "$Z" :: '\end{verbatim}' && V=v
            catv Z /%n; continue
         else
            UseNot && continue
            expr "$Z" :: '\begin{verbatim}' || goend
            V=V catv Z /%n; continue
         fi
         for N in "$@"
         do
            [ ${#N} -ge 2 ] || continue
            expr "$Z" :: "%<$N%>" || continue
            Zeile
         done
         cmpv Z Zcmp || print -u2 "$F:$Zcmp%n$F:$Z%n"
         catv Z /%n
      done
      ><
   }
done

exit 0



###  uni.bish  #############################################


TEXT=uni
ADR=unis
A=mba E=mbe
nlt=`wc -l $TEXT`
nla=`wc -l $ADR`
((na=nla/5))
line -1-2 $TEXT > $A
line -7-$nlt $TEXT > $E

az=1
for dnu to $na repeat
do
   cat $A > $TEXT$dnu
   for tz from 3 to 6 repeat
   do
      tzeile="`line -$tz $TEXT`"
      azeile="`line -$az $ADR`"
      ltz=`expr "$tzeile" : '^.*$'`
      laz=`expr "$azeile" : '^.*$'`
      tzeile="`echo "$tzeile%c" | cut -c$((laz+1))-$ltz`"
      conv -d"
" azeile tzeile
      echo '$ '"$azeile $tzeile" >> $TEXT$dnu
      ((az=az+1))
   done
   ((az=az+1))
   cat $E >> $TEXT$dnu
done

rm $A $E



###  uniqadr.bish  #############################################

#!/u/bin/bish


set -f
set Z:.300 FILE:.200 PrintADDR:.50
R=0 C='%e[7m%e[1m' D='%e[0m%e[1m'
expr $(ver s) :: '^dos' || C='' D=''


Unique()  {
   local z:012 r=0
   while readl Z
   do
      [ Z -eq z ] && { echo "$C$FILE: ADDR $Z not unique!$D"; r=1; }
      z=$Z
   done
   return $r
}


PrintADDR_base()  {
   local adr=0000000000
   while readl Z
   do
      expr "$Z" :: '^%$' && break
      expr "$Z" :adr '^[@x-]%d%{8,10} %d %(%d%{6}%) ' || continue
      echo $adr
   done
   return 0
}


Check()  {
   $PrintADDR | sortl -fn1 | Unique || return 1
   return 0
}


local typ:.10

for FILE in $*
do
   expr "$FILE" :: '%<cfgbase.txt%>' && typ=base
   < $FILE
   case "$typ" in
     base)  PrintADDR=PrintADDR_$typ ;;
        *)  ><; exit 2;;
   esac
   if Check
   then  echo "$C$FILE: all addresses are unique.$D"
   else  R=1
   fi
   ><
done

return $R





###  uniqid.bish  #############################################

#!/u/bin/bish


set -f
set Z:.300 FILE:.200 PrintID:.50
R=0 C='%e[7m%e[1m' D='%e[0m%e[1m'
expr $(ver s) :: '^dos' || C='' D=''


Unique()  {
   local z:012 r=0
   while readl Z
   do
      [ Z -eq z ] && { echo "$C$FILE: ID $Z not unique!$D"; r=1; }
      z=$Z
   done
   return $r
}


PrintID_base()  {
   local id=0000000000
   while readl Z
   do
      expr "$Z" :: '^%$' && break
      expr "$Z" :id '^@%(%d%{8,10}%) %d' || continue
      echo $id
   done
   return 0
}

PrintID_text()  {
   local id=0000000000
   while readl Z
   do
      expr "$Z" :id ' D_%w%{1,}_%d%d%d_id  *%(%d%{1,6}%)' || continue
      echo $id
   done
   return 0
}


Check()  {
   $PrintID | sortl -fn1 | Unique || return 1
   return 0
}


local typ:.10

for FILE in $*
do
   expr "$FILE" :: '%<cfgbase.txt%>' && typ=base
   expr "$FILE" :: '%<mesbase.txt%>' && typ=base
   expr "$FILE" :: '%<txtbase.h%>' && typ=text
   < $FILE
   case "$typ" in
     base)  PrintID=PrintID_$typ ;;
     text)  PrintID=PrintID_$typ ;;
        *)  ><; exit 2;;
   esac
   if Check
   then  echo "$C$FILE: all identifiers are unique.$D"
   else  R=1
   fi
   ><
done

return $R





###  uniqid.bish  #############################################

#!/u/bin/bish


set -f
set Z:.300 FILE:.200 PrintID:.50
R=0


Unique()  {
   local z:012 r=0
   while readl Z
   do
      [ Z -eq z ] && { echo "$FILE: ID $Z not unique!"; r=1; }
      z=$Z
   done
   return $r
}


PrintID_base()  {
   local id=0000000000
   while readl Z
   do
      expr "$Z" :: '^%$' && break
      expr "$Z" :id '^@%(%d%{8,10}%) %d' || continue
      echo $id
   done
   return 0
}

PrintID_text()  {
   local id=0000000000
   while readl Z
   do
      expr "$Z" :id ' D_%w%{1,}_%d%d%d_id  *%(%d%{1,6}%)' || continue
      echo $id
   done
   return 0
}


Check()  {
   $PrintID | sortl -fn1 | Unique || return 1
   return 0
}


local typ:.10

for FILE in $*
do
   expr "$FILE" :: '%<cfgbase.txt%>' && typ=base
   expr "$FILE" :: '%<mesbase.txt%>' && typ=base
   expr "$FILE" :: '%<txtbase.h%>' && typ=text
   < $FILE
   case "$typ" in
     base)  PrintID=PrintID_$typ ;;
     text)  PrintID=PrintID_$typ ;;
        *)  ><; exit 2;;
   esac
   if Check
   then  echo $FILE: all identifiers are unique.
   else  R=1
   fi
   ><
done

return $R





###  updhtm.bish  #############################################

#!/u/bin/bish

set -f

ex=000000
LineA=000000
LineB=000000
DIRm='../mu2000'
DIRu='../upc3'
HTM="../share/htm/mu.htm"
BASE="
$DIRm/cfgbase.txt
$DIRm/mesbase.txt
$DIRu/cfgbase.txt
$DIRu/mesbase.txt
"
BASEm="$DIRm/cfgbase.txt $DIRm/mesbase.txt"
BASEu="$DIRu/cfgbase.txt $DIRu/mesbase.txt"
set Z:.16000


# <stdin >stdout
ToHtm()  {
   while readl Z
   do
      expr "$Z" :Z '&' += '&amp;'
      expr "$Z" :Z '<' += '&lt;'
      expr "$Z" :Z '>' += '&gt;'
      expr "$Z" :Z '"' += '&quot;'
      catv Z /%n
   done
   return 0
}


ToHtmTable()  {
   local z=0 F:.50 W:.100
   for F in $*
   do
      cat $F | {
         >$F
         echo '<table cellpadding="0" cellspacing="0"><tbody>'
         while readl Z
         do
            z=0 print -n '<tr>'
            for W in $Z
            do
               conv '-t` ' W; let ++z
               case "$z" in
                 1)  catv '.<td align="right"><tt><b>' W '.</b></tt></td>';;
                 2)  catv '.<td><tt>&nbsp;&nbsp;&nbsp;' W '.</tt></td>';;
                 *)  catv '.<td><tt>&nbsp;&nbsp;' W '.</tt></td>';;
               esac
            done
            print '</tr>'
         done
         echo '</tbody></table>'
         ><
      }
   done
   return 0
}


# RE file
GrepLines()  {
   local z=02 s=000000 e=000000
   grep -nh "$1" "$2" | {
      readl Z && expr "$Z" :s '%([0-9]%{1,6}%):' && z=1
      readl Z && expr "$Z" :e '%([0-9]%{1,6}%):' && z=0
      readl Z && z=-1
   }
   [ z -ne 0 ] && return $z
   LineA=$s
   LineB=$e
   return 0
}


# pattern file
Grep()  {
   GrepLines "<!--{$1}-->" "$2" || return
   local s=$LineA e=$LineB
   let ++s --e
   [ e -gt s ] && line -$s-$e "$2"
   return 0
}


# pattern ofile ifile
FillIn()  {
   local sk=0000000000
   GrepLines "<!--{$1}-->" "$2" || return
   cat "$2" | {
      seek + 0 sk
      >"$2"
      line -1-$LineA
      cat "$3"
      seek $sk 0
      line -$LineB-
      ><
   }
   return 0
}


# $HTM XXX __xxx ... ...
FillInMulti()  {
   local ofile="$1" patt:.20 ifile:.80
   shift
   for 2 patt ifile in $*
   do
      FillIn $patt $ofile $ifile
      echo "$patt: exit=$?"
   done
   return 0
}


Gvim()  {
   local if=- of=__gvim
   >__devnull
   gvim -n -f +'set nonu' +'set syntax=c' +TOhtml +"w! $of" +'q!' +'q!' $if
   ><
   <__gvim
   while readl Z
   do expr "$Z" :: '^ *<body%>' && break; done
   while readl Z
   do expr "$Z" :: '^ *</body%>' && break; catv Z /%n; done
   ><
   remove -s __gvim __devnull
   return 0
}


PreStyle()  {
   echo "<pre style=%"background-color:#$1; padding:10px;%">"
   return 0
}


ParBn()  {
   for F in $*
   do
      bish geta.bish $F '^[#1-9][0-9]*$' 11 14 20
   done
   return 0
}

#ParBn $BASE  | sortl -fn1 | uniq >__pbn
#ParBn $BASEm | sortl -fn1        >__pbnm
#ParBn $BASEu | sortl -fn1        >__pbnu

#bish geta.bish $DIRm/cfgbase.txt 'd' 12 8 9 10 14 20 >__dcpm
#bish geta.bish $DIRm/cfgbase.txt 'h' 12 14 20 >__hldm
#bish geta.bish $DIRm/cfgbase.txt 'b' 12 14 20 >__bakm
#bish geta.bish $DIRm/cfgbase.txt 'u[1234]' 12 14 20 >__usrm

#bish geta.bish $DIRu/cfgbase.txt 'd' 12 8 9 10 14 20 >__dcpu
#bish geta.bish $DIRu/cfgbase.txt 'h' 12 14 20 >__hldu
#bish geta.bish $DIRu/cfgbase.txt 'b' 12 14 20 >__baku
#bish geta.bish $DIRu/cfgbase.txt 'u[1234]' 12 14 20 >__usru

bish ../bish/neuvb.bish $DIRm/ver.txt
copy __neu __nvbm
bish ../bish/neuvb.bish $DIRu/ver.txt
copy __neu __nvbu


#>__flg
#PreStyle FFFFC0
#grep '^ *# *define  *CFG_' $DIRm/ver.txt | ToHtm
#echo '</pre>'
#><

#>__dmm
#PreStyle F0FFF0
#Grep DMM $DIRm/cfg.c | { ex=$?; ToHtm; }
#print -u2 "DMM: exit=$ex"
#echo '</pre>'
#><
#Grep DMM $DIRm/cfg.c | { ex=$?; Gvim >__dmm; }
#echo "DMM: exit=$ex"
#Grep KMP $DIRm/atp.c | { ex=$?; Gvim >__kmp; }
#echo "KMP: exit=$ex"
#Grep CDV $DIRm/candev.c | { ex=$?; Gvim >__cdv; }
#echo "CDV: exit=$ex"


#ToHtm <$DIRm/../share/txt/def.txt | {
#   >__def
#   echo '<pre>'
#   while readl Z
#   do
#      expr "$Z" :: '^=%{60,}' && echo '</pre>%n<pre>'
#      catv Z /%n
#   done
#   echo '</pre>'
#   ><
#}
#
#>>__def
#echo '<a name="user_pass"></a>'
#PreStyle FFF0F0
#grep '^ *# *define  *PA_[UP][SA][ES][RS]_' $DIRm/ver.txt
#echo '</pre>'
#PreStyle F0F8FF
#grep '^ *# *define  *IDT_' $DIRm/ver.txt
#echo '</pre>'
#PreStyle F0F8FF
#grep '^ *# *define  *IDR_' $DIRm/ver.txt
#echo '</pre>'
#PreStyle F0FFF0
#Grep SEV $DIRm/maschine.c | { ex=$?; ToHtm; }
#print -u2 "SEV: exit=$ex"
#echo '</pre>'
#PreStyle F0F0F0
#grep '^ *# *define  *PU_' $DIRm/ver.txt
#echo '</pre>'
#PreStyle F0F0F0
#grep '^ *# *define  *PUCK_' $DIRm/ver.txt
#echo '</pre>'
#PreStyle F0F0F0
#grep '^ *# *define  *CMPBAK_' $DIRm/ver.txt
#echo '</pre>'
#><

#ToHtmTable __pbn __pbnm __pbnu %
#           __dcpm __hldm __bakm __usrm %
#           __dcpu __hldu __baku __usru

#FillInMulti $HTM PBN __pbn PBNm __pbnm PBNu __pbnu %
#                 DCPm __dcpm HLDm __hldm BAKm __bakm USRm __usrm %
#                 DCPu __dcpu HLDu __hldu BAKu __baku USRu __usru %
#                 NVBm __nvbm NVBu __nvbu CDV __cdv %
#                 FLG __flg DMM __dmm KMP __kmp CDV __cdv DEF __def
FillInMulti $HTM NVBm __nvbm NVBu __nvbu

set +f
remove -s  __[a-z][a-z]*

:





###  urls.bish  #############################################

#!/u/bin/bish


[ `ver n` -lt 305 ] && { echo "Shell-Version < 305!"; exit 0; }
set -f
set +S
Script="$0"
echo "Script: '$Script'"
[ -w "$Script" ] || {
   print -u2 "Script hat Schreibschutz: '$Script'"; exit 1; }



iv=___
Cpos=000000000000
inp="$( prints s260-)"
rest="$( prints s260-)"
url="$( prints s260-)"
Url="$( prints s260-)"
File="$( prints s260-)"
Path="$( prints s260-)"
Dir="$( prints s260-)"
Tag="$( prints s300-)"
Zeile="$( prints s1500-)"



echo Prüfung Script-Inhalt...
< $Script
inp=0
while seek + 0 Cpos; readl Zeile
do  expr "$Zeile" :: '^#@[a-zA-Z]%{1,8%} ' && inp=1 && break;  done
><
echo "Konfigurations-Position=$Cpos"
let inp==0 && {
   print -u2 "Schreibe #@-Einträge..."
   echo "%n%n%
   #@dirs %
   #@erw htm html%
   #@tz %
   #@edit %n" >> $Script

   < $Script
   while seek + 0 Cpos; readl Zeile
   do  expr "$Zeile" :: '^#@[a-zA-Z]%{1,8%} ' && break;  done
   ><
   echo "Konfigurations-Position=$Cpos"
}


< $Script
seek $Cpos 0
while readl Zeile
do
   ifset Zeile || continue
   expr "$Zeile" :: '^#@[a-zA-Z]%{1,8%} ' && continue
   expr "$Zeile" :: '^[ %t]*#' && continue
   expr "$Zeile" :: '[^ %t%z]' || continue
   ><; print -u2 "Script-Inhalt fehlerhaft!: '$Zeile'"; exit 1
done
><



[ `ver w` == full ] && {
   trap 'for inp  in  Plist PUlist
         do  ifset $inp && [ -f "${{inp}" ] &&
                remove "${{inp}" && $inp=""
         done
        ' 0 1 2
}

mktemp Plist
mktemp PUlist
echo "TempFiles: $Plist, $PUlist"
expr "$Plist" :: '[ %t%r%n%z%%]' && {
   print -ru2 "Verzeichnisteil wird nicht akzeptiert!: '$Plist'"
   exit 1
}



Fmain()  {
   case "$1" in  $(shift)
     CorrPP)
        local iv=$1
        rest="${{iv}"
        expr "$rest" :: '%./' || expr "$rest" :: '/%.' || return 0
        while expr "$rest" :rest '/%./' '/'; do  done
        expr "$rest" :rest '^%./' '.'
        expr "$rest" :rest '%(.%)/%.$' '%1'
        expr "$rest" :rest '^/%.$' '/'
        expr "$rest" :rest '^%.%./' '*/'
        expr "$rest" :rest '/%.%.$' '/*'
        while expr "$rest" :rest '/%.%./' '/*/'; do  done
        while expr "$rest" :rest '/[^/*]%{1,%}/%*/' '/'; do  done
        expr "$rest" :rest '%(.%)/[^/*]%{1,%}/%*$' '%1'
        expr "$rest" :rest '^/[^/*]%{1,%}/%*$' '/'
        #while expr "$rest" :rest '/%*/' '/'; do  done
        #expr "$rest" :rest '^%*/' '/'
        #expr "$rest" :rest '%(.%)/%*$' '%1'
        #expr "$rest" :rest '^/%*$' '/'
        $iv="$rest"
        expr "$rest" :: '%*' && return 1
        return 0
     ;;
     CorrPP2)
        local iv=$1
        rest="${{iv}"
        expr "$rest" :: '%./' || expr "$rest" :: '/%.' || return 0
        while expr "$rest" :rest '/%./' '/'; do  done
        expr "$rest" :rest '^%./' '.'
        expr "$rest" :rest '%(.%)/%.$' '%1'
        expr "$rest" :rest '^/%.$' '/'
        expr "$rest" :rest '^%.%./' '*/'
        expr "$rest" :rest '/%.%.$' '/*'
        while expr "$rest" :rest '/%.%./' '/*/'; do  done
        while expr "$rest" :rest '/[^/*]%{1,%}/%*/' '/'; do  done
        expr "$rest" :rest '%(.%)/[^/*]%{1,%}/%*$' '%1'
        expr "$rest" :rest '^/[^/*]%{1,%}/%*$' '/'
        while expr "$rest" :rest '^%*/%(.%)' '%1'; do  done
        $iv="$rest"
        expr "$rest" :: '%*' && return 1
        return 0
     ;;
     UrlUcLc)
        local o="$1" iv=$2 r
        rest="${{iv}"
        Tag= inp=
        expr "$rest" :Tag '%([#?].*%)$'
        expr "$rest" :rest '^%([^#?]%{1,%}%)' || return
        while expr "$rest" :r '%([^/]%{1,%}%)$'
        do
           expr "$rest" :rest '^%(.*/%)[^/]%{1,%}$' || rest=
           expr "$o" :: 'l' && conv -l r
           expr "$o" :: 'u' && expr "$o" :: '[x1]' || conv -u r
           expr "$o" :: 'u1' && expr "$o" :: 'x' ||
              expr "$r" :r '^[a-z]' '%U&'
           expr "$o" :: 'xu1' && expr "$r" :: '[^.]%.[^.]%{1,%}$' &&
              expr "$r" :r '%([a-z]%)%(.*%.[^.]%{1,%}%)$' '%U%1%E%2'
           expr "$o" :: 'xu1' && expr "$r" :: '[^.]%.[^.]%{1,%}$' ||
              expr "$r" :r '[a-z]' '%U&'
           expr "$rest" :rest '/$' '' && r="/$r"
           inp="$r$inp"
           expr "$o" :: 'd' || { inp="$rest$inp"; break; }
        done
        $iv="$inp$Tag"
        return 0
     ;;
     DatTim)
        #1999MMddhhmm.ss
        local mon=000 Mon='JanFebMärAprMaiJunJulAugSepOktNovDez' dt
        systime -t dt
        catv 4,2,dt =mon:
        catv 6,2,dt /. $(([mon-1]*3)),3,Mon /. 0,4,dt "/, " %
             8,2,dt /: 10,,dt
        return 0
     ;;
     Get)
        local l=${#1} a="$1" b="$2"
        $3=''
        < $Script
        seek $Cpos 0
        while readl Zeile
        do
           expr "$Zeile" :: "^#@$a $b" || continue
           catv $((l+3)),,Zeile =$3:
           >< ; return 0
        done
        ><
        return 1
     ;;
     Set)
        local a="$1" f=0
        catv $Cpos,,0  < $Script | {
           fstat +s $Cpos $Script
           while readl Zeile
           do
              expr "$Zeile" :: "^#@$a " ||
                 catv Zeile /%j >> $Script && continue
              catv "/#@" a ". $2" /%j >> $Script
              f=1
           done
        }
        [ $f == 0 ] && catv "/#@" a ". $2" /%j >> $Script
        return 0
     ;;
     ChoiceP)
        local iv=$2 n=0000 size=000000000000 zeile
        while :
        do
           n=0
           print -u2
           < "$1"
           while readl zeile
           do
              let ++n
              expr "$zeile" :zeile 'P%*%([^*]%{1,%}%)%*P'
              [ `ver s` != unix ] && conv '-t/\' zeile
              fstat -sv size "$zeile"
              prints s8s12s $n: $size "   $zeile"
           done
           ><
           print -ru2 "${{iv}"
           read "inp?Abbruch:a  Welche Datei?[n]: "
           ifset inp || continue
           [ "$inp" == a ] && { remove "$1"; return 1; }
           expr "$inp" :: '[^0-9]' && continue
           let "inp<1||inp>n" && continue
           $iv="$(- line -$inp "$1" )"
           break
        done
        remove "$1"
        return 0
     ;;
     Edit)
        local edo='+/^#@[a-zA-Z]' edf=$Script ed=/usr/bin/vi
        if Fmain Get edit '.' File
        then  catv File /%n | read ed -
        else  [ `ver s` == unix ] && ed=vi
              [ `ver s` != unix ] && ed=edit
        fi
        whence -pe "$ed" && return 1
        expr "$ed" :: 'vim%{0,1%}$' || edo=
        [ `ver s` != unix ] && expr "$ed" =:: 'vim$' || edo=
        ifset File || File="$ed"
        [ "$1" != i ] && {
           echo "%n Nur am Dateiende die speziellen Zeilen ändern!%
                 %r Beschreibungen sind dort vorhanden."
           read "-?<Enter> "
        }
        [ "$1" == i ] && { edo=
           edf=url_tmpf.inf
           [ -f $edf ] || return
        }
        echo "'$File $edo $edf'..."
        eval "$File $edo $edf"
        return 0
     ;;
     Perr)
        local s
        [ $# -gt 1 ] && s=s && shift
        print -ru2 "*** $1 ***"
        ifset s && read "-?<Enter> "
        return 0
     ;;
     Help)
        local n=00000 j=/%j z=...
        3<&0
        while :
        do
           echo ; prints sf-79
           n=0 j=/%j z=
           grep '^#%%H' $Script |
              while readl Zeile
              do
                 catv "/     " 4,,Zeile $j
                 let "++n%20==0" &&
                    echo "${z}Start:s  Beenden:e  Weiter:<Enter> %c"
                 let "n>=20" && { j= z=%n
                    read -u3 inp
                    [ "$inp" == e ] && break 2
                    [ "$inp" == s ] && continue 2
                 }
              done
           prints sf-79
           echo "Start:<Enter>  Beenden:e (EOF) %c"
           read -u3 inp
           [ "$inp" == e ] && break
        done
        ><
        return 0
     ;;
     *)  return 1 ;;
   esac
   return 0
}



UcLc()  {
   [ $# -lt 2 ] && return
   local pnt=00 o="$1" fd=f e=$(prints sf024-) erw="$(prints s60-)"
   shift
   pnt=
   expr "$o" :: '[^ !adlxut0-9+-]' && return 1
   expr "$o" :: '[lut]' || return
   #expr "$o" :: 'l' && expr "$o" :: 'u' && return 1
   expr "$o" :: 'd' && fd=d
   url=
   expr "$o" :: 't' && {
      systime url
      expr "$o" :e 't%([+-]%{0,1%}[0-9]%{1,%}%)' && let "url+= $e*60"
   }
   [ `ver s` != unix ] && pnt=1
   Fmain Get erw '.' inp; erw="$inp"
   : $erw
   [ $} -lt 1 ] && expr "$o" :: 'a' || return
   expr "$o" :: 'a' && erw=
   inp="$(-pwd)"
   Tag="$inp/url_tmpf.inf"
   ifset pnt && conv '-t/\' Tag
   : > "$Tag"
   for Dir in "$@"
   do
      expr "$Dir" :: '^[/\]' || {
         Fmain Perr . "Falscher Verz.-Pfad: '$Dir'"
         continue
      }
      ifset pnt && conv '-t/\' Dir
      [ -d "$Dir" ] || {
         Fmain Perr . "Verz. existiert nicht: '$Dir'"
         continue
      }
      cd "$Dir" || continue
      echo; print -r "Verzeichnis '$Dir'..."
      list -${fd}R . |
      while readl Zeile File
      do
         ifset pnt && conv '-t\/' File
         for e  in  $erw
         do
            expr "$File" =:: "[^/]%.$e%$" || continue
            e=')*(' ; break
         done
         [ "$e" != ')*(' ] && expr "$o" :: 'a' || continue
         ifset url && fstat +m $url "$Zeile"
         expr "$o" :: '[lu]' || continue
         expr "$File" :Url '/%([^/]%{1,%}%)$' || continue
         expr "$File" :Dir '^%(.*/%)[^/]%{1,%}$' || continue
         expr "$o" :: 'l' && conv -l Url
         expr "$o" :: 'u' && expr "$o" :: '[x1]' || conv -u Url
         expr "$o" :: 'u1' && expr "$o" :: 'x' ||
         expr "$Url" :Url '^[a-z]' '%U&'
         expr "$o" :: 'xu1' && expr "$Url" :: '[^.]%.[^.]%{1,%}$' &&
            expr "$Url" :Url '%([a-z]%)%(.*%.[^.]%{1,%}%)$' '%U%1%E%2'
         expr "$o" :: 'xu1' && expr "$Url" :: '[^.]%.[^.]%{1,%}$' ||
            expr "$Url" :Url '[a-z]' '%U&'
         ifset pnt && conv '-t/\' File Dir Url
         print -r "RENAME: $File --> $Dir$Url"
         print -r "RENAME: $File --> $Dir$Url" >> "$Tag"
         expr "$o" :: '!' && move "$File" "$Dir$Url"
      done
   done
   cd "$inp"
   return 0
}



ScanF()  {
   [ $# -lt 1 ] && return
   local pnt=00 n=00000 e=$(prints sf024-) erw="$(prints s60-)"
   pnt=
   [ `ver s` != unix ] && pnt=1
   Fmain Get erw '.' inp; erw="$inp"
   : $erw
   [ $} -lt 1 ] && return
   : > $Plist
   : > $PUlist
   #inp="$(-pwd)"
   for Dir in "$@"
   do
      expr "$Dir" :: '^[/\]' || {
         Fmain Perr . "Falscher Verz.-Pfad: '$Dir'"
         continue
      }
      ifset pnt && conv '-t/\' Dir
      [ -d "$Dir" ] || {
         Fmain Perr . "Verz. existiert nicht: '$Dir'"
         continue
      }
      #fullname -v Dir "$Dir"
      #[ -d "$Dir" ] || continue
      #cd "$Dir" || continue
      echo; print -r "Verzeichnis '$Dir'..."
      list -fR "$Dir" | sortl -d |
      while readl File Zeile
      do
         ifset pnt && conv '-t\/' File
         print -r "P*$File*P" >> $Plist
         for e  in  $erw
         do
            expr "$File" =:: "[^/]%.$e%$" || continue
            e=')*(' ; break
         done
         [ "$e" != ')*(' ] && continue
         print -r "Datei '$Zeile'..."
         n=0
         3< "$Zeile"
         while readl -u3 Zeile
         do
            let ++n
            while expr "$Zeile" :Tag '%(<[a-zA-Z][^<>]%{8,%}>%)'
            do
               for e  in  HREF SRC BACKGROUND PROFILE CITE DATA %
                          CODE CODEBASE PLUGINURL PLUGINSPAGE %
                          DYNSRC ARCHIVE URL
               do
                  while expr "$Tag" =:Url %
                        "[ %t]${e}"'[ %t]*=[ %t]*"%([^"][^"]*%)"'
                  do
                     expr "$Url" :: '^[#?/\]' ||
                     expr "$Url" :: '^[a-zA-Z][a-zA-Z0-9]%{1,16%}:' ||
                        print -r "$n: P*$File*P U*$Url*U" %
                        >> $PUlist && echo "%r%c" &&
                        prints s-79- "    $n:  '$Url'"
                     expr "$Tag" =:Tag %
                        "[ %t]${e}"'[ %t]*=[ %t]*"[^"][^"]*"' ''
                  done
               done
               expr "$Zeile" :Zeile '<[a-zA-Z][^<>]%{8,%}>' ''
            done
         done
         ><
         echo
      done
   done
   #cd "$inp"
   [ -s $PUlist -o -s $Plist ] && : > url_tmpf.inf
   [ -s $PUlist ] && cat $PUlist >> url_tmpf.inf
   [ -s $Plist ] && cat $Plist >> url_tmpf.inf
   #[ -s url_tmpf.inf ] && read "-?<Enter> "
   return 0
}



CkUrls()  {
   local ic=' ' o="$1" f=00000 n=000000
   [ -s $PUlist -a -s $Plist ] || return
   [ `ver s` != unix ] && ic=i
   expr "$o" :: '[^=adlxu1 ]' && return 1
   #expr "$o" :: '[lu]' || expr "$o" :o '=' + ''
   [ -s url_tmpf.inf ] && : > url_tmpf.inf
   3< $PUlist
   while readl -u3 Zeile
   do
      expr "$Zeile" :n '^%([0-9][0-9]*%)'
      expr "$Zeile" :Url 'U%*%([^*]%{1,%}%)%*U'
      expr "$Url" :url '^%([^#?]%{1,%}%)'
      conv -F/ url
      expr "$Zeile" :Path 'P%*%([^*]%{1,%}%)%*P'
      expr "$Url" :: '^%^' &| expr "$Url" :: '%$$' &|
         expr "$Url" :: '[*[\%]' && {
         Fmain Perr "Falsche Zeichen: %"$Url%" in: ${Path}[$n]"
         print -r "Falsche Zeichen: %"$Url%" in: ${Path}[$n]" %
                  >> url_tmpf.inf
         continue
      }
      expr "$Path" :Dir '^%(.*%)/[^/]%{1,%}$'
      Dir="$Dir/$url"
      expr "$o" :: a || Fmain CorrPP Dir &&
         grep -qFm$ic -e "P*$Dir*P" $Plist && continue
      Fmain CorrPP2 url || {
         Fmain Perr "Keine Datei zu: %"$Url%" in: ${Path}[$n]"
         print -r "Keine Datei zu: %"$Url%" in: ${Path}[$n]" %
                  >> url_tmpf.inf
         continue
      }
      f=0
      until  grep -qFm$ic -e "/$url*P" $Plist && f=1
      do
         expr "$url" :url '^[^/]%{1,%}/%(..*%)$' || break
      done
      let f || {
         Fmain Perr "Keine Datei zu: %"$Url%" in: ${Path}[$n]"
         print -r "Keine Datei zu: %"$Url%" in: ${Path}[$n]" %
                  >> url_tmpf.inf
         continue
      }
      f=$( grep -cF$ic -e "/$url*P" $Plist )
      let "f>1" && {
         grep -F$ic -e "/$url*P" $Plist > url_tmpf.fnd
         Dir="OLD:%"$Url%" NEW:%"${url}[#?...]%" IN: ${Path}[$n]"
         Fmain ChoiceP url_tmpf.fnd Dir || break
      }
      let "f==1" && Dir="$(- grep -Fm$ic -e "/$url*P" $Plist )"
      expr "$Dir" :File 'P%*%([^*]%{1,%}%)%*P'
      [ "$ic" == i ] && conv '-t/\' File
      expr "$Url" :Dir '#%(..*%)$' &&
         grep -qmi -e '<A[ %t].*NAME[ %t]*=[ %t]*"'"$Dir"'"' %
            "$File" || {
               Fmain Perr "Kein Anker: %"$Dir%" in: $File"
               print -r "Kein Anker: %"$Dir%" in: $File" %
                        >> url_tmpf.inf
            }
      [ "$ic" == i ] && conv '-t\/' File
      cmpv Path File
      catv $.,File =url:
      conv '-t//' url
      let "f=$.+1"
      catv $f,,File =url:
      catv $f,,Path =Dir:
      while expr "$Dir" :Dir '^[^/]%{1,%}/' ''
      do  url="../$url";  done
      expr "$Url" :Dir '%([#?].*%)$' && url="$url$Dir"
      expr "$o" :: '=' && url="$Url"
      expr "$o" :: '[lu]' && Fmain UrlUcLc "$o" url
      catv ".FOR: $File" /%j %
           ".OLD: %"$Url%"" /%j %
           ".NEW: %"$url%"" /%j %
           ".IN : ${Path}[$n]" /%j%j  >> url_tmpf.inf
   done
   ><
   return 0
}



WrUrls()  {
   [ -s url_tmpf.inf ] || return
   grep -qm '^NEW: "' url_tmpf.inf || return
   local n=000000 nf=000000 chl=000 e=00
   File= Url= url=
   cat url_tmpf.inf > $PUlist
   : > url_tmpf.inf
   expr "$1" :: '!' && print -r "<!undo>" > url_tmpf.inf
   3< $PUlist
   while readl -u3 Dir
   do
      ifset Dir || continue
      expr "$Dir" :: '^[ONI][LDEWN ]%{2%}: ' || continue
      expr "$Dir" :Url '^OLD: "%(..*%)"$' && continue
      expr "$Dir" :url '^NEW: "%(..*%)"$' && continue
      expr "$Dir" :Path '^IN : %(..*%)%[[0-9]%{1,%}]$' || continue
      expr "$Dir" :n '%([0-9]%{1,%}%)]$'
      ifset Url url || {
         Fmain Perr . "Fehlschlag 'OLD: NEW': ${Path}[$n], in: *.inf"
         ifset File && >< ; >< ; return 1
      }
      [ `ver s` != unix ] && conv '-t/\' Path
      cmpv Path File || {
         ifset File && {
            let chl && expr "$Zeile" :Zeile '<%*>%*<>?"' += '"'
            let chl && catv Zeile /%j >> $Plist
            let chl && catv Zeile /%j >> url_tmpf.inf
            while readl -u4 Zeile; do  catv Zeile /%j >> $Plist;  done
            >< ; expr "$1" :: '!' && cat $Plist > "$File"
         }
         File="$Path" nf=0 chl=0
         4< "$File" ; : > $Plist
      }
      let "nf>n" && {
         Fmain Perr . "Zeilennum.-Fehlschlag in: ${File}[$n<$nf]"
         ifset File && >< ; >< ; return 1
      }
      let "nf<n&&chl" && { chl=0
         expr "$Zeile" :Zeile '<%*>%*<>?"' += '"'
         catv Zeile /%j >> $Plist
         catv Zeile /%j >> url_tmpf.inf
      }
      while let "nf<n" && readl -u4 Zeile
      do
         let "++nf>=n" && break
         chl=0; catv Zeile /%j >> $Plist
      done
      let "nf!=n" && {
         Fmain Perr . "Zeilennum.-Fehlschlag in: ${File}[$n!=$nf]"
         ifset File && >< ; >< ; return 1
      }
      let !chl && catv n '/: ' File /%j Zeile /%j >> url_tmpf.inf
      let ++chl ; e=0
      print -r "${File}[$n]: $Url --> $url"
      expr "$Url" :Url '%.' += '%.'
      expr "$Zeile" :Zeile %
           "%([a-zA-Z]%{3,%}[ %t]*=[ %t]*%)%"$Url%"" %
           "%1%"!)#@<$n>{(}%"" || e=1
      expr "$Zeile" :Zeile "%"!)#@<$n>{(}%"" = "%"$url<*>*<>?%"" || e=${e}2
      let e && {
         Fmain Perr . "Substitutions-Fehlschlag '$e' in: ${File}[$n]"
         ifset File && >< ; >< ; return 1
      }
      Url= url=
   done
   ifset File && {
      let chl && expr "$Zeile" :Zeile '<%*>%*<>?"' += '"'
      let chl && catv Zeile /%j >> $Plist
      let chl && catv Zeile /%j >> url_tmpf.inf
      while readl -u4 Zeile; do  catv Zeile /%j >> $Plist;  done
      >< ; expr "$1" :: '!' && cat $Plist > "$File"
   }
   ><
   return 0
}



Undo()  {
   [ -s url_tmpf.inf ] || return
   local n=000000 a=000000 b=000000 nl=000000
   < url_tmpf.inf
   readl Zeile || { >< ; return 0; }
   expr "$Zeile" :: '^<!undo>$' || { >< ; return 0; }
   : > $PUlist
   while readl Zeile
   do
      expr "$Zeile" :n '^%([0-9]%{1,%}%): .' || n=a
      expr "$Zeile" :File '^[0-9]%{1,%}: %(..*%)$' || n=${n}b
      readl Zeile || n=${n}c
      readl || n=${n}d
      expr "$n" :: '^[1-9]' || n=${n}e
      expr "$n" :: '[^0-9]' && { ><
         Fmain Perr . "Undo-Datei fehlerhaft: [$n]$File"
         print -r "Undo-Datei fehlerhaft: [$n]$File" >> $PUlist
         return 1
      }
      [ -s "$File" ] || { print -ru2 "Fehlt: $File"
         print -r "Fehlt: $File" >> $PUlist; continue; }
      nl=`wc -l "$File"`
      let "nl<n" && { print -ru2 "Zuwenig Zeilen: $File"
         print -r "Zuwenig Zeilen: $File" >> $PUlist; continue; }
      print -r "UNDO: ${File}[$n]..."
      print -r "UNDO: ${File}[$n]..." >> $PUlist
      : > $Plist
      let "a=1, b=n-1, b>0" && line -$a-$b "$File" >> $Plist
      catv Zeile /%j >> $Plist
      let "b+=2, b<=nl" && line -$b- "$File" >> $Plist
      cat $Plist > "$File"
   done
   ><
   [ -s $PUlist ] && cat $PUlist > url_tmpf.inf
   return 0
}



echo Einträge lesen/setzen...
rest=0
[ `ver s` != dos ] && rest=-1
Fmain Get tz . inp || Fmain Set tz $rest
Fmain Get tz '-%{0,1%}[0-9]%{1,%}' inp && tz $inp
rest=vi
[ `ver s` != unix ] && rest=edit
Fmain Get edit '[^ %t]' inp || Fmain Set edit "$rest"
rest='htm html'
Fmain Get erw '[^ %t]' inp || Fmain Set erw "$rest"
rest='/u/hp/1,/u/hp/2'
[ `ver s` != unix ] && rest='\a\bc\1,\x\yz\2'
Fmain Get dirs '[^ %t]' inp || Fmain Set dirs "$rest"


echo
prints s:f-50 " bish-Script 'URL-Manager' "
prints s:f-50 " Copyright (c) 1999  Helmut Schellong "
echo
read "-?<Enter> "



while echo "%r
%tAktuelles Verz. %"$(- pwd )%" : cd [verz]%r
%tDatum+Uhrzeit : $( Fmain DatTim )%r
%tVerzeichnisse : $( Fmain Get dirs . inp; print -rn "$inp")%r
%tErweiterungen : $( Fmain Get erw . inp; print -rn "$inp")%r
%r
%tVerzeichnisse hinzu    : v  [verz[,verz]...]%r
%tErweiterungen hinzu    : e  [erw[ erw]...]%r
%tRename Upp/Low-Case    : R  [!][a][d] [l][u|u1|xu1] [t[[-]min]]%r
%tDatenliste erzeugen    : 1%r
%tUrls herstellen        : 2  [=][a][d] [l][u|u1|xu1]%r
%tUrls schreiben         : 3  [!]%r
%tUndo  3 !              : U%r
%tEditor: script|info    : ed [s|i]%r
%tHilfe                  : h%r
%tBeenden                : E%r
%r
%t                       : %c"
do
   read inp rest
   case "$inp" in
     cd) ifset rest || { cd -; continue; }
         [ -d "$rest" ] || continue
         cd "$rest" ;;
     v)  Fmain Get dirs . inp
         ifset inp && inp="$inp,"
         ifset rest && rest="$inp$rest"
         Fmain Set dirs "$rest" ;;
     e)  Fmain Get erw . inp
         ifset inp && inp="$inp "
         ifset rest && rest="$inp$rest"
         Fmain Set erw "$rest" ;;
     R)  ifset rest || continue
         UcLc "$rest" %
              $(Fmain Get dirs . inp; File="$IFS";IFS=',;') %
              $inp  $(IFS="$File")
         ;;
     1)  ScanF $(Fmain Get dirs . inp; File="$IFS";IFS=',;') %
              $inp  $(IFS="$File")
         ;;
     2)  CkUrls "$rest" ;;
     3)  WrUrls "$rest" ;;
     U)  Undo ;;
     ed)  Fmain Edit $rest ||
             Fmain Perr . "Edit(): Programm- oder Dateifehlschlag."
          ;;
     h)  Fmain Help ;;
     E)  break ;;
     *)  echo %a%c; continue ;;
   esac
done



for inp  in  Plist PUlist
do  ifset $inp && [ -f "${{inp}" ] && remove "${{inp}" && $inp=''
done

exit 0



#%H Dieses Shell-Script (urls.bish) für die 'bish' liest aus sich selbst
#%H und schreibt in sich selbst hinein.
#%H Es ist also seine eigene ini-Datei, was möglich ist, weil
#%H Shell-Scripts lesbare Text-Dateien sind.
#%H Das hat die Vorteile einer dauerhaften Speicherung von Daten,
#%H praktisch beliebig viel Speicherplatz, Überschaubarkeit
#%H und die Möglichkeit, mehrere Script-Kopien mit unterschiedlichen
#%H gespeicherten Einstellungen an verschiedenen Plätzen zu haben.
#%H 
#%H Option 'ed' oder 'ed s' kann verwendet werden, um das Script
#%H zu editieren.
#%H 
#%H Dieser URL-Manager korrigiert alle URLs in allen Dateien
#%H in den angegebenen Verzeichnissen, so daß sie passen.
#%H Auch bereits passende URLs können textmäßig verändert werden.
#%H 
#%H Zwei oder mehr Verzeichnisse gelten als Verknüpfungsgesamtheit.
#%H Es müssen die gewünschten Erweiterungen .eee angegeben werden.
#%H Bei zwei oder mehr gleichnamigen Dateien wird eine Auswahl
#%H angeboten.
#%H 
#%H Zur URL-Korrektur müssen die Optionen '1, 2, 3 !'
#%H der Reihe nach gewählt werden.
#%H Bei jedem Arbeitsgang wird eine Informationsdatei im aktuellen
#%H Verzeichnis erzeugt, die mittels Option 'ed i' angeschaut
#%H werden kann.
#%H Bei den Optionen '2' und '3' dient diese Datei als
#%H Datenbasis für den jeweils nächsten Arbeitsgang.
#%H Man kann diese Datei also gezielt ändern, falls aus
#%H speziellen Gründen gewünscht.
#%H 
#%H Option '3' schreibt die URLs nur mit dem Argument '!'.
#%H Nach '3 !' können mittels 'U(ndo)' alle geänderten
#%H URLs wieder in den Anfangszustand gebracht werden.
#%H 
#%H Vor '3 !' müssen die stets die Gänge '1' und '2'
#%H durchgeführt werden!
#%H 
#%H Option '2' = a d l u u1 xu1 :
#%H      =     URLs werden nur textmäßig (lu) geändert.
#%H      a     Auch passende URLs werden einbezogen (alle).
#%H      d     Bei (lu) werden auch die Verzeichnisteile geändert.
#%H      l     Änderung in Kleinschreibung.
#%H      u     Änderung in Großschreibung.
#%H      u1    Nur das erste Zeichen wird einbezogen.
#%H      xu1   Der erste vorkommende Buchstabe wird einbezogen,
#%H            nicht jedoch in einer Erweiterung.
#%H      [x]u1 kann mit und ohne 'l' angegeben werden.
#%H      'l' wirkt zuerst.
#%H Hiernach kann 'ed i' gegeben werden (Info-Datei).
#%H 
#%H 
#%H Option 'R' dient zum Umbenennen und Zeitstempel-Setzen
#%H aller Dateien und Verzeichnisse
#%H innerhalb der angegebenen Verzeichnisse:
#%H 
#%H Option 'R' ! a d l u u1 xu1 t[[-]min] :
#%H      !     Tatsächliche Umbenennung der Dateien.
#%H            Ohne '!' nur Info-Datei.
#%H      a     Alle Dateien werden einbezogen.
#%H            Ohne 'a' nur diejenigen Dateien mit einer
#%H            passenden Erweiterung.
#%H      d     Es werden nur Verzeichnisse einbezogen.
#%H            Ohne 'd' nur Dateien.
#%H      lxu1  Siehe oben, Option '2'.
#%H      t[-]m Setzt die Zeiten auf die aktuelle Uhrzeit,
#%H            optional mit +/-Minutenwert.
#%H 
#%H 
#%H Verzeichnisse nur so:
#%H      /u/hp/1,/u/hp/2,/u/sh,\usr\homepage
#%H angeben. Keine Laufwerke angeben!
#%H 
#%H Es werden keine URLs:  http://   file:///d|/...   ...
#%H der vorstehenden Art geändert, sowie keine absoluten
#%H Pfade, sondern nur relative Pfade:
#%H      index.htm   ./index.htm   ../../hans2/index.htm
#%H      ../../aaa/bbb/.././ccc/..
#%H 
#%H 
#%H Es ist möglich, daß die DOS16-bish bei sehr langen Zeilen
#%H oder Tags in HTML-Dateien wegen zu kleinen Speicherflächen
#%H abbrechen muß.
#%H Das gilt nicht für bish32 oder Unix-bish.



#-----------------------------------------------------------------
# AB HIER DÜRFEN SIE KONFIGURIEREN:
# Achten Sie auf das Leerzeichen nach dem jeweils ersten Wort!
# Abschnitte ohne Beschreibung davor werden vom Menü aus
# oder automatisch gesetzt.
#-----------------------------------------------------------------



#@dirs 
#@erw htm html
#@tz 
#@edit 



###  uu.bish  #############################################


for N from 1 to 9 repeat
do
echo $N
for C from 0 to 255 repeat
do
   prints sF`prints sf03- $C`$N- > uu
   prints sbsf03 $N $C >> uuu
   uuencode uu remuu | grep -v '^begin' | grep -v '^end' >> uuu
done
done



###  uvars.bish  #############################################

MOwahl='1'
TPwahl='T'
MUcall='18'
MUspsw='0'
MOinitapp=''
VBMip0='192.168.64.100'
VBMip='192.168.64.100'
Telnu='4'
Failall='0'
Update='0'
ConnTest='1'
RxTxAuto='0'
SysLogSz='3000'
AdmLogSz='500000'
CTbuild='1'
CTtries='1'
CTday='1'
CTgid='1'
CTaid='10'
CTtime='1017437431'
MUdir='../db/1/11'
RxTxMsg='RXTX:'
BasePos='750   1873  3354  5025  6677  10027 11679 14118 15593 16136 16694 18945 20033 21425 22460 23395 '


###  var.bish  #############################################

#!c:\u\bin\bish32.exe


Dir="$(prints s80-)"
F="$(prints s80-)"
VF="$(prints s80-)"
isda="$(prints s80-)"
fnam="$(prints s80-)"
vfile="$(prints s80-)"
is=000000000
zeile="$(prints s300-)"
name="$(prints s300-)"


err()  {
   print -r "$0: ERROR: $1"
   read "-? <Enter> "
   exit 0
   return 0
}


[ $# -lt 1 ] && Dir=.
[ $# -ge 1 ] && Dir="$1"
[ "$Dir" == . ] && Dir=$(pwd)
[ -d "$Dir" ] || err "Keine Existenz: '$Dir'"
cd "$Dir"
echo Verzeichnis: $Dir
read "vfile?Datei eingeben [var.c==Enter]: "
ifset vfile || vfile=var.c
[ -s "$vfile" ] || err "Keine Existenz/Kein Inhalt: '$vfile'"


for VF  in  $vfile
do
   3< "$VF"
   while readl -u3 name
   do
      ifset name || continue
      expr "$name" :: '^ */[/*]' && continue
      #expr "$name" :: '^ *static ' && continue
      is=
      expr "$name" :name ' %([a-zA-Z_][a-zA-Z_0-9]*%) *[,;] *$' && is=1
      ifset is || expr "$name" :name ' %([a-zA-Z_][a-zA-Z_0-9]*%) *%[' && is=1
      ifset is || continue
      isda=0 fnam=
      for F  in  *.c
      do
         expr "$F" =:: "^$VF%$" && continue
         is=0
         grep -q "[^a-zA-Z_0-9]${name}[^a-zA-Z_0-9]" "$F" && let ++is
         let is==0 && grep -q "^${name}[^a-zA-Z_0-9]" "$F" && let ++is
         let is==0 && grep -q "[^a-zA-Z_0-9]${name}%$" "$F" && let ++is
         let is==0 && grep -q "^${name}%$" "$F" && let ++is
         let is==0 && continue
         let isda==0 && fnam="$F"
         let ++isda
      done
      let "isda==0" && print "$isda: $name"
      let "isda==1" && print "$isda: $fnam: $name"
   done
   ><
done


read "-? $0: <Enter> "





###  vbm.bish  #############################################

#

HTM1='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head profile="/htm/meta.txt"><title>MU1000_C with NET Services</title>
<meta name="Author" content="Sentelor GmbH, Hetten">
<meta name="GENERATOR" content="bish Script-Interpreter v3.21 for Embedded DOS">
<meta HTTP-EQUIV="expires" CONTENT="0">
'
HTM2='</head>
<body text="#000000" bgcolor="#CDAA7D" link="#000000" vlink="#000000" alink="#000000">
<br>&nbsp;
'
HTMktbl='<table BORDER=4 CELLSPACING=4 CELLPADDING=10 WIDTH="100%" BGCOLOR="#39458f">
'
HTMtbl='<table BORDER=1 CELLSPACING=0 CELLPADDING=20 WIDTH="100%" BGCOLOR="#FFFFF0">
'
#<td ALIGN=LEFT VALIGN=TOP BGCOLOR="#A2B5CD"><b><tt><font size=+1></font></tt></b>
#CDAA7D

HTMinf1='<br>&nbsp;
<table BORDER=1 CELLSPACING=0 CELLPADDING=10 WIDTH="100%" BGCOLOR="#A2B5CD"
align="center" valign="center"><tr><td width="20%"><pre>
<h3><a href="HELP.HTM#vbmkonf" target="_blank">Hilfe</a></h3>
<h3><a href="cfg">Konfiguration</a></h3>
<h4><a href="TEL.HTM">MU-Kontakt</a></h4>
<h4><a href="EE.HTM">MU-Konfiguration</a></h4>
</pre></td><td>
'
HTMinf2='</td></tr></table>
'

HTMcfg1='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>VBM1000C -- Configuration</title>
<meta HTTP-EQUIV="expires" CONTENT="0">
<meta name="GENERATOR" content="bish.exe"></head>
<body bgcolor="#39458f" text="#ffd700" link="#ffd700" vlink="#ffd700" alink="#ffd700">
<center><h2>Konfiguration VBM1000C</h2>
<h3>Sentelor GmbH</h3></center>
<br>&nbsp;
'
HTMcfg2='
<form action="cfgp" method="POST">
<table bgcolor="#39458f" border="3" cellspacing="0" cellpadding="15" width="100%">
<tr valign="top"><td><pre><b>
TEL-Datei entleeren <input name="TELclear" type="checkbox">

Permanent speichern <input name="Default" type="checkbox">

~TPwahl~            <input name="TPwahl" type="checkbox">

~MOwahl ~           <input name="MOwahl" type="checkbox">
</b></pre></td><td>
<pre><b>Tabellenwahl

Meßwerte 1 <input name="T1" value="~1~" size="1" maxlength="1">
Alarmliste <input name="T2" value="~2~" size="1" maxlength="1">
PSS-Geräte <input name="T3" value="~3~" size="1" maxlength="1">
UNV-Geräte <input name="T4" value="~4~" size="1" maxlength="1">
UNB/BM1/MM <input name="T5" value="~5~" size="1" maxlength="1">
Meßwerte 2 <input name="T6" value="~6~" size="1" maxlength="1">
Ereignisse <input name="T7" value="~7~" size="1" maxlength="1">
</b></pre>
</td>
'
HTMcfg3='
<td align="center"><pre><b>Upload für TEL-Datei (600 Byte max.)
<textarea name="TextArea" cols="32" rows="16">
Station____max16 Telefonnummer</textarea>
</b></pre>
</td>
</tr>
<tr><td colspan="3" align="center" valign="center">
<pre><b>Modem-Initialisierung (Zusatz) <input name="MOinit" value="~moinitapp~" size="30" maxlength="40">

<a href="TEL.HTM">MU-Kontakt</a>           <input type="SUBMIT" value=" Absenden ">    <input type="RESET" value=" Eingaben löschen ">           <a href="HELP.HTM#vbmkonf" target="_blank">Hilfe</a></b></pre>
</td></tr>
</table>
</form>
<br>&nbsp;
'
HTMcfg4='
<table bgcolor="#39458f" border="3" cellspacing="0" cellpadding="15" width="100%">
<tr><td><pre><b>Download:

<a href="TEL.TXT">Aktuelle TEL-Datei</a>
</b></pre></td><td>
<form action="cfgp" method="POST" enctype="multipart/form-data">
<pre><b><input type="SUBMIT" value=" Upload: Lokale TEL-Datei ">   (7600 Byte max.)
<input type="FILE" name="Upload" size="40" value="" maxlength="7600" accept="text/plain">
</b></pre></form>
</td></tr>
</table>

</body>
</html>
'
HTMkont1='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>Verbindungsmanager VBM1000C -- Kontakt</title>
<meta HTTP-EQUIV="expires" CONTENT="0">
<meta name="GENERATOR" content="bish.exe">
</head>
<body bgcolor="#39458f" text="#ffd700" link="#ffd700" vlink="#ffd700" alink="#ffd700">
<br>
<center><h2>Verbindungsmanager VBM1000C -- Kontakt</h2>
<h3>Sentelor GmbH</h3></center>
<br>&nbsp;
<br>&nbsp;
<br>&nbsp;
<br>&nbsp;

<h1 align="CENTER"><a href="http://999.888.777.666/TEL.HTM">MU-Kontakt</a></h1>
<h3 align="CENTER"><a href="http://999.888.777.666/EE.HTM">MU-Konfiguration</a></h3>
<h3 align="CENTER"><a href="http://999.888.777.666/cfg">VBM-Konfiguration</a></h3>
<h3 align="CENTER"><a href="http://999.888.777.666/HELP.HTM#start" target="_blank">Hilfe</a></h3>

<br>&nbsp;
<br>&nbsp;
<br>&nbsp;
<br>&nbsp;
<table align="center" border="1" cellpadding="8">
<tr><td>
'
HTMkont2='
<form name="Form1" action="http://999.888.777.666/newip" method="POST">
<pre><b>
Aktuelle IP-Nummer: 999.888.777.666

Neue IP-Nummer      <input name="IP1" value="192" size="3" maxlength="3">.<input name="IP2" value="168" size="3" maxlength="3">.<input name="IP3" value=""    size="3" maxlength="3">.<input name="IP4" value=""    size="3" maxlength="3">

Stationsbezeichnung <input name="Station" value="~Station~" size="16" maxlength="16">

 <input type="SUBMIT" value=" Absenden ">       <input type="RESET" value=" Eingaben löschen ">
</b></pre>
</form>
</td></tr>
</table>
<br>&nbsp;
<br>&nbsp;
'
HTMkont3='
<table align="center" width="65%">
<tr><td>
<p align="justify"><font color="#ffffff">
Sie erhalten nach Eintragung der korrekten IP-Nummer, Anklicken
von ''Absenden'' und nachfolgender Kennwort-Eingabe eine Datei zum Speichern angeboten.
Diese Datei muß im Speicher-Fenster des Browsers einen gewünschten Namen
erhalten, der allerdings mit ''.htm'' oder ''.html'' enden muß.
Die Download-Datei ersetzt diese Datei, mit der Sie gerade arbeiten!<br>
(Siehe auch <a href="http://999.888.777.666/Start.htm">Start.htm</a>)
</font></p>
</td></tr>
</table>

</body>
</html>
'
HTMtelhf='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title></title>
<meta HTTP-EQUIV="expires" CONTENT="0">
<meta name="GENERATOR" content="bish.exe">
</head>
<body>
<form name="FormAnruf" action="telhf" method="GET">
<input name="InpAnruf" value="~telnu~">
</form>
<form name="FormTelhf">
<textarea name="TextTelhf">
~TextTelhf~
</textarea>
</form>
<script language="JavaScript">
parent.frames[0].focus();
</script>
</body>
</html>
'
HTMtelvf1='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>VBM Kontakt - MU-Kontakt</title>
<meta HTTP-EQUIV="expires" CONTENT="0">
<meta name="GENERATOR" content="bish.exe">
<script language="JavaScript" src="data/telvf.js" type="text/javascript"></script>
</head>
<body bgcolor="#39458f" text="#000000" link="#0000ff" vlink="#0000ff" alink="#0000ff">
<br>
<center><font color="#ffd700"><h2>Verbindungsmanager VBM1000C -- MU-Kontakt</h2>
<h3>Sentelor GmbH</h3></font></center>
<br>&nbsp;
<br>&nbsp;
<table align="CENTER" border="0" cellpadding="5">
<tr><td bgcolor="#e0e0e0" align="CENTER" colspan="2">
<a href="KONTAKT.HTM" target="_top">VBM-Kontakt</a>&nbsp;&nbsp;&nbsp;
<a href="TEL.HTM" target="_top">MU-Kontakt</a>&nbsp;&nbsp;&nbsp;
<a href="EE.HTM" target="_top">MU-Konfiguration</a>&nbsp;&nbsp;&nbsp;
<a href="cfg" target="_top">VBM-Konfiguration</a>&nbsp;&nbsp;&nbsp;
<a href="HELP.HTM#mukont" target="_blank">Hilfe</a>
</td></tr>
<tr><td bgcolor="#e0e0e0" align="CENTER" colspan="2">
<a href="MU.HTM" target="_blank">MU-Daten&nbsp;
(manueller Zugriff nach kompletter Anruf-Aktion)</a>
</td></tr>
'
#5-mal:
#<td align="CENTER" valign="CENTER" bgcolor="#ffffff">
#<tt><b><a href="javascript:Anruf('1987654321')">Axxx<br>1987654321</a></b></tt>
#</td>

HTMtelvf2='
<br>&nbsp;
<br>&nbsp;
<br>&nbsp;
<br>&nbsp;

<form name="FormTelvf">
<table border="1" align="center" cellpadding="10">
<tr><td align="center" valign="center">
<textarea name="TextTelvf" cols="44" rows="10" wrap="virtual">
</textarea>
</td><td align="left" valign="center">
<font color="#ffffff">
<tt><b>
<input name="Del" type="BUTTON" value="Stations-Botschaften löschen" onClick="DelMsg('''')">
<br>
<input name="Start" type="BUTTON" value="Start Autoabfrage 1 min" onClick="Start1m(1)">
<br>
<input name="Stop" type="BUTTON" value="Stop Autoabfragen" onClick="Stopp()">
<br>
<input name="Reset" type="RESET" value="Textfenster löschen">
</b></tt></font>
</td></tr>
</table>
</form>
<script language="JavaScript">
   MOinit();
   if (parent.frames[1].document.FormAnruf.InpAnruf.value == "1min")  {
     Start1m(1);
     document.FormTelvf.TextTelvf.value= "Autoabfrage läuft\r\n";
   }
</script>

</body>
</html>
'



Err()  {
   print -ru2 "bish [vbm.bish] ERROR: '$1'"
   #remove -sv "$Fsema"
   sem -"d${SemBishrun}d${SemCgirun}d${SemCfg}d${SemHtm}d${SemSigbish}d${SemSigcgi}"
   ext -
   exit 1
   return 0
}



# define MSK16  0x0810u
# start= 0x1d0f
#WORD Crc16(register WORD crc, register WORD word)
#{
#   register WORD n;
#   for (n=0;  n<16;  ++n)  {
#      if ( (crc&0x8000u) ^ ((word&(1u<<n))<<(15-n)) )  {
#        crc=  ((((crc^MSK16)&MSK16)<<1)|(crc<<1))
#             &((((crc^MSK16)&MSK16)<<1)|~(MSK16<<1));
#        crc|=1;
#      }
#      else  {
#        crc=  ((((crc^~MSK16)&MSK16)<<1)|(crc<<1))
#             &((((crc^~MSK16)&MSK16)<<1)|~(MSK16<<1));
#        crc&= ~1u;
#      }
#   }
#   return (crc);
#}


CheckIP()  {
   [ $# -ne 1 -a $# -ne 4 ] && return 1
   [ $# -eq 1 ] && {
      local ip="$1" n
      expr "$ip" :: "^$REip%$" || return 1
      conv -'t. ' ip
      for n in $ip
      do  let "n>255" && return 1;  done
      return 0
   }
   local n
   expr "$1.$2.$3.$4" :: "^$REip%$" || return 1
   for n in  $1 $2 $3 $4
   do  let "n>255" && return 1;  done
   return 0
}



FormConv()  {
   local h=0000 z=00
   conv -'t+ ' $1
   while expr "${{1}" :h '%%%([a-fA-F0-9]%{2%}%)'
   do
      base -16 h +b z
      expr "${{1}" :$1 '%%'$h += "$z"
   done
   return 0
}



FormRead()  {
   [ -s "$1" ] || return 1
   local nam=................ ip
   catv 0 =Hbuf: < "$1"
   conv -'t& ' Hbuf
   for Hbuf in $Hbuf
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        StartIP)  VBMip=$Hbuf ;;
        Station)  expr "$Hbuf" :Hbuf '^[ %t]%{1,}' = ''
                  expr "$Hbuf" :Hbuf '[ %t]%{1,}$' = ''
                  ifset Hbuf && VBMstation="$Hbuf"
                  ;;
        IP1)      ip=$Hbuf ;;
        IP2)      ip=$ip.$Hbuf ;;
        IP3)      ip=$ip.$Hbuf ;;
        IP4)      ip=$ip.$Hbuf ;;
        InpAnruf) InpAnruf=$Hbuf
                  expr "$Hbuf" :: '^DELALL:' && {
                     MkTbl5data $Ftbl5 submu " "
                     InpAnruf=. goend
                  }
                  expr "$Hbuf" :Hbuf '^DEL:%(.*%)$' && {
                     MkTbl5data $Ftbl5 submu "$Hbuf"
                     InpAnruf=. goend
                  }
                  ;;
      esac
   done
   ifset ip && VBMip="$ip"
   cmpv VBMstation0 VBMstation || {
      VBMstation0="$VBMstation"
      WrChipIni DEVICE NAME "$VBMstation"
   }
   return 0
}



ReadCfg()  {
   [ -s "$1" ] || return 1
   catv 1000,0 =Hbuf: < $1
   if expr "$Hbuf" :: '[ %t%r%n]'
   then
      local n=00 boundary
      < $1
      while readl Hbuf
      do
         expr "$Hbuf" :boundary '%(-%{2,}[^-]%{1,}%)"%{0,1}$' && break
         let "++n>0" && { >< ; return 1; }
      done
      while readl Hbuf
      do
         ifset Hbuf || break
      done
      boundary="$boundary--"
      > $Fteltxt
      while readl Hbuf
      do
         ifset Hbuf && { catv Hbuf /%j ; continue; }
         while readl Hbuf
         do
            ifset Hbuf || continue
            expr "$Hbuf" :: "$boundary" && break
            catv Hbuf /%j
            continue 2
         done
         break
      done
      ><<
      MkTbl5data $Ftbl5 start
      return 0
   fi
   local dflt=00 nam=................ teltxt
   conv -'t& ' Hbuf
   for Hbuf in $Hbuf
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        TELclear)  : > "$Fteltxt"; : > $Ftbl5 ;;
         Default)  dflt=1 ;;
          MOinit)  expr "$Hbuf" :Hbuf '[^!-~]%{1,}' += ' '
                   conv -u Hbuf
                   expr "$Hbuf" :Hbuf 'AT' += ' AT'
                   Hbuf=$Hbuf
                   expr "$Hbuf" :: '^AT' && MOinitapp=$Hbuf
                   ifset Hbuf || MOinitapp=''
                   ;;
          T[1-9])  expr "$Hbuf" :Hbuf '[^0-9]' += ''
                   let "Hbuf+=0, Hbuf==0" && Hbuf=-
                   ifset Hbuf || Hbuf=-
                   catv 1,2,nam =nam:
                   prints vs-3 Hbuf "$Hbuf"
                   catv Hbuf =$(([nam-1]*3)),3,TblFolge
                   conv -t ' ' TblFolge
                   ;;
          TPwahl)  [ $TPwahl == P ] && TPwahl=T continue
                   [ $TPwahl == T ] && TPwahl=P
                   ;;
          MOwahl)  [ MOwahl -eq 0 ] && MOwahl=2 MOisinit=2 continue
                   [ MOwahl -ne 0 ] && MOwahl=0 MOisinit=1
                   ;;
        TextArea)  teltxt="$Hbuf" ;;
      esac
   done
   ifset teltxt && {
      expr "$teltxt" :teltxt 'Station____max16[^%r%n]*[%r%n]*' = ''
      expr "$teltxt" :: '%w' || teltxt=
   }
   ifset teltxt && {
      catv teltxt /%j >> "$Fteltxt"
      cat $Fteltxt | {
         > $Fteltxt
         while readl Hbuf
         do  ifset Hbuf || continue
             expr "$Hbuf" :Hbuf '^[ %t]%{1,}' = ''
             expr "$Hbuf" :Hbuf '[ %t]%{1,}$' = ''
             expr "$Hbuf" :: '^[^ %t]' || continue
             expr "$Hbuf" :: '[ %t][0-9W,PT]%{1,}$' || continue
             expr "$Hbuf" :Hbuf '[ %t]%{1,}%([0-9W,PT]%{1,}%)$'  ' %1'
             catv Hbuf /%j
         done
         ><
      }
      MkTbl5data $Ftbl5 grow
   }
   [ "$dflt" == 1 ] && catv TPwahl MOwahl TblFolge /MOINIT: MOinitapp > "$Fcfgcfg"
   return 0
}



GetMOmsgNr()  {
   local word="${{1}" ifs="$IFS" nr=00 mnu=0000 msg
   IFS="$RN"
   for word in $word
   do
      IFS="$ifs"
      for 2 msg nr  in  OK 1 'CONNECT *' 2 'CARRIER *' 2 RING 4 ERROR 8 BUSY 16 %
                   'NO CARRIER' 32 'NO DIALTONE' 64 'NO DIAL TONE' 64 %
                   'NO ANSWER' 128 'DIAL LOCKED' 256 'NO MORE DIAL%{1,2}ING' 256 %
                   'DELAYED *' 512 'PROTOCOL[ :]*' 2 'COMPRESSION[ :]*' 2
      do
         expr "$word" :: "^$msg" && let "mnu|=nr"
      done
   done
   IFS="$ifs"
   [ mnu -ne 0 ] && $1=$mnu return 0
   return 1
}



WriteAT()  {
   [ $# -lt 1 ] && return 1
   local peek=00 c=. ato=-0001 sec=005 msec=700 msg=00 t=0000000000
   if expr "$1" :: 'AT&F'
   then  local ats="$1 $MOinitapp "
   else  local ats="$1 "
   fi
   expr "$ats" :ats '[^!-~]%{1,}' += ' '
   local wr="$ats  "
   local hbuf="$wr"
   wr=
   catv "/'" ats "/'%j"
   while catv $((++ato)),1,ats =c:
   do
      expr "$c" :: '[ %%]' || wr="$wr$c" continue
      [ "$c" == ' ' ] && {
         expr "$wr" :: '+++$' || wr="$wr$RN"
         ext -icocot20od4o${#wr} wr
         wr=  t=$SECONDS
         while let "$SECONDS-t <= sec"
         do
            sem -s$SemBishrun
            sem -g$SemSigbish && WebServer
            ext -p peek || { sleep -m $msec; continue; }
            ext -it300id15i100 Ibuf
            catv $.,Ibuf =Hbuf:
            expr "$Hbuf" :Hbuf '[ %t%r%n]%{1,}$' = ''
            expr "$Hbuf" :Hbuf '[%r%n]%{1,}' += "$RN"
            hbuf="$Hbuf"
            expr "$hbuf" :hbuf '%r%n' += "\r\n"
            catv '/(' hbuf '/)%j'
            [ msg -eq 0 ] && continue 2
            AnrufMsg=$Hbuf
            GetMOmsgNr Hbuf || continue
            [ Hbuf -ge 4 ] && return 1
            let "msg&Hbuf" || return 1
            continue 2
         done
         ext -icoct20od4o2 RN
         ext -it300id15i70 Ibuf
         [ $. -gt 0 ] && catv '/((' $.,Ibuf '/))%j'
         [ msg -ne 0 ] && { AnrufMsg=TIMEOUT; print -u2 $AnrufMsg; return 1; }
         continue
      }
      catv $((++ato)),1,ats =c:
      expr "$c" :: '[%%dpt0COT]' || wr="$wr$c" continue
      [ "$c" == '%' ] && wr="$wr$c" continue
      case "$c" in
        d)  sleep 1 ;;
        p)  sleep -m 250 ;;
        t)  catv $((++ato)),,ats =ats:
            ato=-1
            expr "$ats" :sec '^%([0-9]%{1,}%)' || sec=1
            expr "$ats" :ats '^[0-9]%{1,}' = ''
            let "sec>=1000" && let "sec=(sec+500)/1000"
            let "sec>=100" && sec=1
            let "sec<1" && sec=1
            msec=700
            [ sec -lt 4 ] && let "msec=sec*200"
            ;;
        0)  msg=0 ;;
        C)  msg=2 ;;
        O)  msg=1 ;;
        T)  [ $# -lt 2 ] && return 1
            expr "$2" :: '^[TP]' || wr="$wr$TPwahl"
            wr="$wr$2"
            ;;
      esac
   done
   return 0
}



MkCfgHtm()  {
   local a=0000 b=0000 tpw=Pulswahl moinit="$MOinitapp"
   local mow='Modem AUS'
   Hbuf="$HTMcfg2"
   for  b  in  $TblFolge
   do
      let "++a"
      [ "$b" == - ] && b=
      expr "$Hbuf" :Hbuf "~$a~" = "$b"
   done
   [ $TPwahl == P ] && tpw="Tonwahl "
   [ MOwahl -eq 0 ] && mow="Modem EIN"
   expr "$Hbuf" :Hbuf '~TPwahl~' = "$tpw"
   expr "$Hbuf" :Hbuf '~MOwahl ~' = "$mow"
   > "$1"
   catv HTMcfg1 Hbuf
   moinit=$MOinitapp
   expr "$HTMcfg3" :Hbuf '~moinitapp~' = "$moinit"
   catv Hbuf HTMcfg4
   ><
   return 0
}



MkKontHtm()  {
   > $1
   expr "$HTMkont1" :Hbuf '999.888.777.666' += "$VBMip"
   catv Hbuf
   expr "$HTMkont2" :Hbuf '999.888.777.666' += "$VBMip"
   expr "$Hbuf" :Hbuf '~Station~' += "$VBMstation"
   catv Hbuf
   expr "$HTMkont3" :Hbuf '999.888.777.666' += "$VBMip"
   catv Hbuf
   ><
   cat $1 > A:\KONTAKT.HTM
   return 0
}



MkTelhfHtm()  {
   ifset InpAnruf || { catv HTMtelhf > $1; return 0; }
   [ "$InpAnruf" != . ] && AnrufMsg="Anrufen $InpAnruf"
   > $1
   expr "$HTMtelhf" :Hbuf '~TextTelhf~' = "$AnrufMsg"
   expr "$Hbuf" :Hbuf '~telnu~' = "$2"
   catv Hbuf
   ><
   return 0
}



WrChipIni()  {
   local rub=$1 nam=$2 inh="$3" f=A:\CHIP.INI zv=.........
   local buf=...................................
   zv=000
   [ -s $f ] || : > $f
   cat $f > A:\CHIP.BAK
   cat $f | {
      > $f
      while readl buf
      do
         catv buf /%r%n
         expr "$buf" =:: '^%['"$rub"']' || continue
         zv=
         while readl buf
         do
            ifset buf || { zv=/%r%n ; break; }
            expr "$buf"  :: '^%[[A-Za-z]' && zv=' ' break
            expr "$buf" =:: '^[ %t]*'"$nam"'[ %t]*=' && break
            catv buf /%r%n
         done
         catv nam /= inh /%r%n $zv
         [ "$zv" == ' ' ] && catv buf /%r%n
      done
      [ "$zv" == 000 ] && catv '/[' rub '/]%r%n' nam /= inh /%r%n
      ><
   }
   return 0
}



RdChipIni()  {
   local rub=$1 nam=$2 inh=$3 f=A:\CHIP.INI zv=1
   local buf=...................................
   [ -s $f ] || return 1
   < $f
   while readl buf
   do
      expr "$buf" =:: '^%['"$rub"']' || continue
      while readl buf
      do
         expr "$buf" =:: '^%['"$rub"']' && continue
         expr "$buf"  :: '^%[[A-Za-z]' && continue 2
         expr "$buf" =:: '^[ %t]*'"$nam"'[ %t]*=' || continue
         expr "$buf"  :$inh '=[ %t]*%(..*%)[ %t]*$' && zv=0
      done
   done
   ><
   return $zv
}



MUkategorie_c()  {
   local o=00000 nam
   prints vs40 nam
   local kat=0000000000 inh
   prints vs150 inh
   expr "$KatOffs" :o '%tc %(%d%{1,5}%)' || return 1
   < "$1"
   seek $o 0
   while read kat - - nam inh
   do
      [ "$kat" != c ] && break
      conv '-t` ' inh
      [ "$nam" == IPether ] && MUip="$inh"
      [ "$nam" == Station ] && MUstation="$inh"
      [ "$nam" == Passwd ] && MUpasswd="$inh"
      [ "$nam" == MOerr ] && MUmoerr="$inh"
   done
   ><
   return 0
}



#Print_uart("\r\nMU1000C  --  Station: \"%s\"\r\n", Modem.station);
#Print_uart("%s, %0*u.%0*u.%0*u   %02u:%02u:%02u\r\n",
#\r\nMU1000C  --  Station: "station"\r\n
#\r\nState: OKAY\r\n
#\r\nState: FAIL\r\n
#Anrufber.:
#PASSWORD: PASSWORD OK EN:
#@DK40mopas
MUanrufen()  {
   local telnu=$1 ch=00 offs=00000 cksum=0000000000 ring="RING$RN.........."
   while :
   do
   case $AnrufZ in
     dialout)
        [ MOwahl -eq 0 ] && AnrufZ=getdata continue
        WriteAT "$MOdialout" "$telnu" || break
        AnrufZ=waitpass TOsec=$SECONDS
     ;;
     waitpass)
        let "$SECONDS-TOsec>10" && AnrufMsg=TimeOut break
        ext -p ch || return 0
        AnrufZ=pass
     ;;
     pass)
        ext -it400id15i1000 Ibuf
        catv $.,Ibuf =Hbuf:
        catv Hbuf
        expr "$Hbuf" =:: 'PASSWORD:' || AnrufMsg="NO PASSWORD:" break
        ring="@DK40mopas"
        ext -icocot30od4o10 ring
        sleep -m 150
        ext -ocot30od4o2 RN
        AnrufZ=waitpassok TOsec=$SECONDS
     ;;
     waitpassok)
        let "$SECONDS-TOsec>10" && AnrufMsg=TimeOut break
        ext -p ch || return 0
        AnrufZ=passok
     ;;
     passok)
        ext -it300id15i1000 Ibuf
        catv $.,Ibuf =Hbuf:
        catv Hbuf
        expr "$Hbuf" =:: 'PASSWORD %{1,3}OK' || AnrufMsg="PASSWORD NOT OK" break
        AnrufZ=getdata
     ;;
     getdata)
        [ $MUee == tomu  ] && AnrufZ=writecfg continue
        [ $MUee == tovbm ] && AnrufZ=readcfg continue
        GetMUdata $Fc1 Nn dk40 || {
           AnrufMsg="NREAD==0"
           echo "$Nn Bytes"
           [ MOwahl -eq 0 ] && break
           ring=@EN:
           ext -icocot30od4o4 ring
           break
        }
        echo "$Nn Bytes"
        AnrufZ=data
     ;;
     data)
        ScanOffsets $Fc1
        sem -g$SemSigbish && WebServer
        MUkategorie_c $Fc1
        #CKkategorie_c $Fmucfg
        [ MOwahl -eq 0 ] && AnrufZ=c1written goend
        AnrufZ=mowrite continue
     ;;
     mowrite)
        ring=@EN:
        ext -icocot30od4o4 ring
        AnrufZ=waitmoend TOsec=$SECONDS
     ;;
     waitmoend)
        let "$SECONDS-TOsec>10" && AnrufMsg=TimeOut break
        ext -p ch || return 0
        AnrufZ=moend
     ;;
     moend)
        ext -it300id15i1000 Ibuf
        catv $.,Ibuf =Hbuf:
        catv Hbuf
        AnrufZ=c1written
        [ $MUee != none ] && AnrufZ=mucfgokay
        expr "$Hbuf" =:: 'Connection %{1,3}aborted' || AnrufMsg="NO ABORT" break
     ;;
     dialin)
        WriteAT "$MOabnehmen" || break
        AnrufZ=gettext
     ;;
     gettext)
        GetMUdata $Fc2 Nn rdonly || AnrufMsg="NREAD==0" break
        echo "$Nn Bytes"
        AnrufZ=text
     ;;
     text)
        local a=- b=- c=- muokfa=...... mustat=................ mudati
        < $Fc2
        while readl Hbuf
        do
           ifset Hbuf || continue
           expr "$Hbuf" :mudati ' %([0-9.]%{8,}  *[0-9:]%{8,}%)' && a=.
           expr "$Hbuf" :mustat 'Station: *"%([^"]%{1,}%)"' && b=.
           expr "$Hbuf" :muokfa 'State: *%(%w%{2,}%)' && c=.
           [ "$a$b$c" == ... ] && break
        done
        ><
        MkTbl5data $Ftbl5 addmu "$mustat" "$muokfa" "$mudati"
        AnrufZ=c2written
     ;;
     writecfg)
        sum -w cksum < C:\MUEE
        let "cksum+=16#1d0f, cksum&=65535"
        base -10 cksum +w cksum
        ring=129
        base -10 ring +b ch
        ring=@PC:
        ext -icocot30od4o4 ring
        ext -it400id20i1 Ibuf
        catv 1,Ibuf /%j
        ext -icocot30od4o1 ch
        ext -it400id10i1 Ibuf
        catv 1,Ibuf /%j
        < C:\MUEE
        for offs from 0 by 32 to 2016 repeat
        do
           catv $offs,32,0 =Hbuf
           ext -icocot30od4o32 Hbuf
           ext -it600id20i1 Ibuf
           catv 1,Ibuf
        done
        ><
        ext -icocot30od4o2 cksum
        ext -it400id10i2 ring
        echo
        catv 2,cksum =cksum:
        catv 2,ring =ring:
        base -w cksum +16
        base -w ring +16
        cmpv cksum ring || AnrufMsg="Checksum wrong" break
        [ MOwahl -ne 0 ] && AnrufZ=mowrite continue
        AnrufZ=mucfgokay
     ;;
     readcfg)
        ring=128
        base -10 ring +b ch
        ring=@PC:
        ext -icocot30od4o4 ring
        ext -it400id20i1 Ibuf
        catv 1,Ibuf /%j
        ext -icocot30od4o1 ch
        ext -it2000id20i1500 Ibuf
        echo $. ${#Ibuf}
        ext -it800id20i550 Hbuf
        echo $.
        > C:\MUEEIN
        catv 1500,Ibuf
        catv 548,Hbuf
        ><
        sum -w cksum < C:\MUEEIN
        let "cksum+=16#1d0f, cksum&=65535"
        base -10 cksum +w cksum
        ext -icocot30od4o2 cksum
        catv 2,cksum =cksum:
        catv 548,2,Hbuf =ring:
        base -w cksum +16
        base -w ring +16
        cmpv cksum ring || AnrufMsg="Checksum wrong" break
        cat C:\MUEEIN > C:\MUEE
        remove C:\MUEEIN
        base -W +w < C:\MUEE | catv 2048,0 =5000,2048,3  3<> C:\DATA.MUC
        catv $(( 960<<1)),2,0 =ring:  < C:\MUEE
        base -w ring +10 ring
        MUspsw=0
        let "ring==1" && MUspsw=1
        catv $((1001<<1)),2,0 =ring:  < C:\MUEE
        base -w ring +10 ring
        let "ring==1" && MUspsw=2
        [ MOwahl -ne 0 ] && AnrufZ=mowrite continue
        AnrufZ=mucfgokay
     ;;
     test)
        cat A:\1 > $Fc1
        ScanOffsets $Fc1
        MUkategorie_c $Fc1
        AnrufZ=c1written
     ;;
   esac
   AnrufMsg=$AnrufZ
   return 0
   done
   [ $AnrufZ != c1written ] && AnrufZ=0
   print -u2 $AnrufMsg
   AnrufMsg="ERROR: $AnrufMsg"
   return 1
}


GetMUdata()  {
   local peek=00 nrw=0000000000 sum=00000
   catv /@DK40: =6,Ibuf
   [ "$3" == dk40 ] && ext -icocot100od4o6 Ibuf
   until ext -p peek
   do
      let "sum+=10, sum>3000" && break
      sleep -m 10
   done
   echo "InputWait: $sum ms"
   ext -iT2000it400id15i1500 Ibuf
   nrw=$. $2=$. sum=0
   let "sum+=nrw, nrw==0" && return 1
   > $1
   while let "nrw>0"
   do
      [ "$3" == dk40 ] && conv '-t `' Ibuf
      catv $nrw,Ibuf
      ext -iT2000it400id15i1500 Ibuf
      let "nrw=$., sum+=nrw"
   done
   ><
   $2=$sum
   return 0
}



ScanOffsets()  {
   local o=000000 n=0000 kat0=xxx kat=xxx tab=9
   KatOffs=
   catv /%t =tab:
   < "$1"
   while seek + 0 o ; read kat - - - -
   do
      ifset kat || kat=$kat0
      [ "$kat" != "$kat0" ] && KatOffs="$KatOffs$tab$kat $o " kat0="$kat"
   done
   ><
   return 0
}



#<td align="CENTER" valign="CENTER" width="20%">
#<tt><b><a href="javascript:Anruf('1987654321')">Axxx<br>1987654321</a></b></tt>
#</td>
MkTelCells()  {
   [ ! -e "$Ftbl5" ] && MkTbl5data $Ftbl5 start
   local station=................ okfa=...... ifs="$IFS" tab=t co=ffffff
   local st=station tn=telnu
   local dati=......................................................
   local telnu=$dati$dati end=0
   catv /%t =tab:
   >> "$1"
   telnu=Modem
   [ MOwahl -eq 0 ] && telnu=Direkt
   catv '.<tr><td bgcolor="#e0e0e0" align=center>' %
        '.Verbindungsart VBM&lt;-&gt;MU (Modem/Direkt)</td>' %
        '.<td bgcolor="#e0e0e0" align=center>' telnu '.</td></tr>' /%n
   telnu='<tr><td bgcolor="#e0e0e0" align=center>MU-Konfiguration'
   case $MUee in
      tomu) dati='<a href="muee?none">Deaktivieren</a></td></tr>'
            telnu="$telnu (VBM--&gt;MU)" ;;
     tovbm) dati='<a href="muee?tomu">VBM--&gt;MU</a></td></tr>'
            telnu="$telnu (VBM&lt;--MU)" ;;
      none) dati='<a href="muee?tovbm">Aktivieren</a></td></tr>'
            telnu="$telnu (Inaktiv)" ;;
   esac
   catv telnu '.</td><td bgcolor="#e0e0e0" align=center>' dati /%n
   catv '.</table><br>&nbsp;<br>&nbsp;' /%n

   [ MOwahl -eq 0 ] && {
      catv '.<table height="9%" align="CENTER" border="0"' %
           '. cellpadding="10" bgcolor="#ffffff"><tr>' /%n
      catv '.<td nowrap valign="CENTER"><tt><b>' /%n
      catv '.<a href="javascript:Anruf(''1'')">'
      catv '.Direkt verbundene MU-Einheit kontaktieren</a>' /%n
      catv '.</b></tt></td></tr></table>' /%n
      ><
      return 0
   }

   < $Ftbl5
   catv '.<table width="90%" align="CENTER" border="0" cellspacing="5"' %
        '. cellpadding="5">' /%n
   IFS="$tab"
   to 4 repeat
   do
      echo '<tr>'
      to 5 repeat
      do
         if read station telnu okfa dati && ifset station telnu okfa dati
         then  [ "$station" == ' ' ] && station='&nbsp;'
               [ "$telnu" == ' ' ] && telnu='&nbsp;'
               [ "$okfa" == ' ' ] && okfa='&nbsp;'
               [ "$dati" == ' ' ] && dati='&nbsp;'
         else  station='&nbsp;' telnu='&nbsp;' okfa='&nbsp;' dati='&nbsp;' end=1
         fi
         st=station tn=telnu
         [ "$station" == "&nbsp;" ] && st='. '
         [ "$telnu" == "&nbsp;" ] && tn='. '
         co=ffffff
         [ "$okfa" == OKAY ] && co=00ff00
         [ "$okfa" == FAIL ] && co=ff0000
         catv '.<td nowrap align="CENTER" valign="CENTER" width="19%" bgcolor="#ffffff">' /%n
         catv '.<tt><b><a href="javascript:Anruf(''' "$tn" '.'')">'
         catv station '.<br>' telnu '.</a><br>' %
              '.<a href="javascript:DelMsg(''' "$st" '.'')">' okfa %
              ".&nbsp;</a><font color=%"#$co%">" dati '.</font></b></tt>' /%n %
              '.</td>' /%n
      done
      echo '</tr>'
      [ end -eq 1 ] && break
   done
   catv '.</table>' /%n
   ><<
   IFS="$ifs"
   return 0
}


#$Ftbl5 mode ["$mustat" "$muokfa" "$mudati"]
MkTbl5data()  {
   [ ! -e "$Fteltxt" ] && : > $Fteltxt
   [ ! -e "$1" -a $2 != start ] && MkTbl5data $1 start
   local station=................
   local telnu=.......................................
   case "$2" in
     start)
           < $Fteltxt
           > "$1"
           while readl telnu
           do
              expr "$telnu" :station '^%(.*[^ ]%) %{1,}[^ ]%{1,}$' || station=Station
              expr "$telnu" :telnu '%([^ ]%{1,}%)$' || telnu=0000000
              catv station /%t telnu "/%t %t %j"
           done
           ><<
           ;;
      grow)
           < $Fteltxt
           while readl telnu
           do
              expr "$telnu" :station '^%(.*[^ ]%) %{1,}[^ ]%{1,}$' || station=Station
              expr "$telnu" :telnu '%([^ ]%{1,}%)$' || telnu=0000000
              grep -q "^$station%t" $1 ||
                 catv station /%t telnu "/%t %t %j" >> $1
           done
           ><
           ;;
     addmu)
           local ifs="$IFS" tab=t a=0 okfa=......
           local dati=........................................
           catv /%t =tab:
           cat $1 | {
              > $1
              IFS="$tab"
              while read station telnu okfa dati
              do
                 [ "$3" == "$station" ] && okfa="$4" dati="$5" a=1
                 catv station /%t telnu "/%t$okfa%t$dati%j"
              done
              [ a -eq 0 ] && catv "/$3%t0000000%t$4%t$5%j"
              ><
           }
           IFS="$ifs"
           ;;
     submu)
           local ifs="$IFS" tab=t a=0 okfa=......
           local dati=........................................
           catv /%t =tab:
           cat $1 | {
              > $1
              IFS="$tab"
              while read station telnu okfa dati
              do
                 [ "$3" == "$station" -o "$3" == " " ] && okfa=" " dati=" "
                 catv station /%t telnu "/%t$okfa%t$dati%j"
              done
              ><
           }
           IFS="$ifs"
           ;;
   esac
   return 0
}



MkInfTbl()  {
   >> "$1"
   catv HTMinf1
   if [ ! -s "$Fteltxt" ]
   then
      catv ".${MUstation}&lt;------&gt;"
   else
      local ip=................ st
      prints vs40 st
      local zeile
      prints vs150 zeile
      < "$Fteltxt"
      while readl zeile
      do
         expr "$zeile" :ip '[ %t]%([0-9W,PT]%{1,}%)[ %t]*$' || continue
         expr "$zeile" :st '^%(..*%)[ %t][0-9W,PT]%{1,}[ %t]*$' || st=--
         catv ".${st}&lt;$ip&gt;&nbsp;&nbsp;&nbsp;" /%n
      done
      ><
   fi
   catv HTMinf2
   ><
   return 0
}


#$Fc1 $Fc2 1 HTMktbl "<center><b>" "</b></center>" "<h3>" "</h3>" ["titel"]
MkTbl()  {
   local o=00000 bgc='"#A2B5CD"' nam
   prints vs40 nam
   local kat=0000000000 num=0000000000 typ=0000000000 inh
   prints vs150 inh
   expr "$KatOffs" :o '%t'"$3"' %(%d%{1,5}%)' || return
   >> "$2"
   catv '/<br>&nbsp;%n' $4 '/<tr>'
   [ $# -ge 9 ] && catv '.<td align=center valign=top width="20%" ' %
                        "/bgcolor=$bgc><h2>$9</h2></td>%n"
   catv "/<td>$5%n"
   < "$1"
   seek $o 0
   while read kat num typ nam inh
   do
      [ "$kat" != "$3" ] && break
      conv '-t` '"$Tconv" nam inh
      expr "$nam" :nam '<' += '&lt;'
      expr "$inh" :inh '<' += '&lt;'
      [ "$nam" != - ] && nam="$nam  "
      [ "$nam" == - ] && nam=
      expr "$typ" :: 't' && catv '/<ul>%n'
      expr "$typ" :: 'n' && catv /%n
      catv ".$7" nam inh ".$8" /%n
      expr "$typ" :: 'N' && catv /%n
      expr "$typ" :: 'T' && catv '/</ul>%n'
   done
   ><
   catv ".$6</td></tr></table>" /%n
   ><
   return 0
}



MkMUhtm()  {
   local iv a=0000 b=0000
   prints vs40 iv
   catv HTM1 HTM2 > $Fc2
   echo "<tt>$N &nbsp;$SECONDS</tt>" >> $Fc2
   MkTbl $Fc1 $Fc2 1 HTMktbl '<center><font color="#ffd700">' %
                             '</font></center>' '<h3>' '</h3>'
   MkInfTbl $Fc2
   b=2
   for a in $TblFolge
   do
      let "++b, a<=0||a>12" && continue
      prints vs-3 b "$b"
      catv b =$((a*3-3)),3,iv
   done
   for a in $iv
   do
      expr "$KatOffs" :: "%t$a " || continue
      MkTbl $Fc1 $Fc2 $a HTMtbl  "<pre><b>" "</b></pre>" "" "" "$TblTitle[a]"
   done
   echo '</body></html>' >> $Fc2
   return 0
}



CopyCmuee()  {
   local ee=MUEEHV
   [ MUspsw -eq 0 ] && ee=MUEE
   [ MUspsw -eq 2 ] && ee=MUEEBM
   echo "A:\DATA\$ee > C:\MUEE"
   cat A:\DATA\$ee > C:\MUEE
   ee=0
   [ -s C:\DATA.MUC ] && fstat -sv ee C:\DATA.MUC
   let "ee==5000+2048" && {
      base -W +w < C:\MUEE | catv 2048,0 =5000,2048,3  3<> C:\DATA.MUC
      return 0
   }
   echo "Default C:\DATA.MUC ..."
   prints vs48 Hbuf
   > C:\DATA.MUC
   cat A:\DATA\HEAD.MUC
   to $((100-15)) repeat
   do
      catv 48,Hbuf /%r%n
   done
   base -W +w < C:\MUEE
   ><
   return 0
}


#C:\DATA.MUC $Fmueep
MkMucFile()  {
   local n=00000 sz=00000 o0=00000 o=00000 zv=.. c=.. boundary
   catv /%r%n =zv:
   < $2
   while readl Hbuf
   do
      expr "$Hbuf" :boundary '%(-%{2,}[^-]%{1,}%)"%{0,1}$' && break
      let "++n>0" && { >< ; return 1; }
   done
   while readl Hbuf
   do
      ifset Hbuf || break
   done
   n=0
   > $1
   while catv +0,50,0 =Hbuf:
   do
      let "${#Hbuf}!=50" && break
      catv 48,2,Hbuf =c:
      cmpv zv c || break
      catv Hbuf
      let "++n>=100" && break
   done
   let "n!=100" && { ><< ; return 2; }
   catv /%r%n boundary /--%r%n =boundary:
   catv /%r%r =c:
   seek + 0 o0
   while seek + 0 o; catv +0,1000,0 =Hbuf:
   do
      conv "-T$c" Hbuf
      let "o+=$., $.<0" && continue
      catv $o,${#boundary},0 =Hbuf:
      cmpv Hbuf boundary || { let "++o"; seek $o 0; continue; }
      catv $o0,$((o-o0)),0
      let "o+=${#boundary}"
      catv $o,,0
      break
   done
   ><<
   fstat -sv sz $1
   let "sz!=5000+2048" && return 3
   catv 5000,2048,0  < $1 | base -W +w > C:\MUEE
   return 0
}


#bin Var: adr typ wlen dst dsteye dflt1 mi1 ma1 dflt2 mi2 ma2 dfltbm flg unit nam txt
# 1  2    3   4   5    6   7      8     9   10  11    12  13  14     15  16   17  18
EEconvertTxt()  {
   local b=10 len=00000 blen=00$5 dflt="$8" min="$9" max="${10}"
   EEmin=''
   let "blen<<=1"
   len=$blen
   [ MUspsw -eq 1 -a "${11}" != '"' ] && dflt="${11}"
   [ MUspsw -eq 1 -a "${12}" != '"' ] && min="${12}" max="${13}"
   [ MUspsw -eq 2 -a "${14}" != '"' ] && dflt="${14}"
   case $6 in
     x)  b=16 ;;
     b)  b=2 ;;
   esac
   [ $7 == b ] && b=2
   case $4 in
     w)  base -w $2 +$b $2
         [ $6 == i -a $2 -gt 32767 ] && let "$2-=65536" ;;
     L)  base -L $2 +$b $2 ;;
     S)  base -W $2 +w $2
         [ $6 == 0 ] && $2="${{2}" let "--len"
         [ $6 == m ] && expr "${{2}" :$2 ' %{1,}$' = ''
         InputLen=$len
         return 0 ;;
   esac
   if [ $max != '"' ]
   then
      len=${#max}
      [ ${#min} -gt len ] && len=${#min}
      [ $6 == x -a $7 == b ] && let "len<<=2"
      [ b -ne 10 ] && goend
      local v=........
      EEmin=$min EEmax=$max EEdflt=$dflt
      for v in EEmin EEmax EEdflt
      do
         case $7 in
           .1)  expr "${{v}" :$v '.$'   '.&' ;;
           .2)  let "${{#v}==1" && $v="${{v}0"
                expr "${{v}" :$v '..$'   '.&' ;;
            1)  let "$v/=10" ;;
            m)  let "$v/=60" ;;
            =)  ;;
            *)  EEmin='' goend 2 ;;
         esac
         expr "${{v}" :: '^%.' && $v="0${{v}"
      done
   else
      case $b in
        16)  let "len<<=1";;
         2)  let "len<<=3";;
        10)  len=${#dflt};;
      esac
   fi
   [ b -ne 10 ] && prints vsf0$len $2 "${{2}"
   case $7 in
     .1)  let "++len"; expr "${{2}" :$2 '.$'   '.&' ;;
     .2)  let "++len, ${{#2}==1" && $2="${{2}0"
          expr "${{2}" :$2 '..$'   '.&' ;;
      1)  let "--len, $2/=10" ;;
      m)  let "--len, $2/=60" ;;
      b)  ;;
      a)  let "$2=512-$2"; len=4 ;;
     bb)  let "b=$2&255, $2>>=8"
          prints vssf02 $2 ${{2}. $b
          len="${{#2}" ;;
      J)  let "$2<100" && let "$2+=2000"
          let "$2>2079" && let "$2-=100"
          len=4 ;;
   esac
   expr "${{2}" :: '^%.' && $2="0${{2}" #let "++len"
   [ $6 == i ] && expr "${{2}" :: '^[-+]' || let "++len"
   InputLen=$len
   return 0
}


#eye var:$VAL adr typ wlen dst dsteye dflt1 mi1 ma1 dflt2 mi2 ma2 dfltbm flg unit nam txt
# 1  2        3   4   5    6   7      8     9   10  11    12  13  14     15  16   17  18
EEconvertEye()  {
   [ $15 == ro ] && return 1
   local var=........ val="$2" _7=$7
   local b=10 len=000 blen=00$5
   let "blen<<=1, len=blen-1"
   expr "$2" :var '^%([^:]%{1,}%):'
   expr "$val" :val '^[^:]%{1,}:' = ''
   [ $7 == .1 -o $7 == .2 -o $7 == 1 -o $7 == m -o $7 == a -o $7 == J ] &&
      expr "$val" :val '[^0-9-]' += ''
   [ $7 == = -a $4 != S ] && _7=$6
   case $_7 in
     u)  expr "$val" :val '[^0-9]' += '' ;;
     i)  expr "$val" :val '[^0-9-]' += '' ;;
     b)  expr "$val" :val '[^01]' += ''
         b=2 ;;
     x)  expr "$val" :val '[^0-9a-fA-F]' += ''
         b=16 ;;
     1)  let "val*=10" ;;
     m)  let "val*=60" ;;
     a)  let "val=512-val" ;;
    bb)  expr "$val" :val '%(%d%.%d%{1,2}%)'
         expr "$val" :val '%(%d%)%.%(%d%{1,2}%)'   '(%1<<8)+%2'
         let "val=$val" ;;
     J)  let "val-=1900, val>=100" && let "val-=100"
         let "val<0" && val=80
         let "val>99" && val=79 ;;
   esac
   case $4 in
     w)  base -$b val +w $var; return 0 ;;
     L)  base -$b val +L $var; return 0 ;;
     S)  [ $6 == 0 ] && {
            catv $len,val =val:
            prints vs-F000$blen val "$val"
         }
         [ $6 == m -a ${#val} -lt blen ] && prints vs-$blen val "$val"
         base -w val +W $var ;;
   esac
   return 0
}


#htm $TXT adr typ wlen dst dsteye dflt1 mi1 ma1 dflt2 mi2 ma2 dfltbm flg unit nam txt
# 1  2    3   4   5    6   7      8     9   10  11    12  13  14     15  16   17  18
EEconvertHtm()  {
   local adr=00000 txt="${18}" min=$9 max=${10} unit
   let "adr=$3"
   [ MUspsw -eq 1 -a "${12}" != '"' ] && min="${12}" max="${13}"
   [ ${16} != '"' ] && unit=" ${16}"
   local onfoc
   [ $6 == u -a $min == 0 -a $max == 1 ] && onfoc=" onFocus=%"Toggle01(this)%""
   ifset EEmin || EEmax= EEdflt=
   ifset EEmin && EEmin="</b><font color=%"#bbbbbb%"> &nbsp;&nbsp;[$EEmin " %
                  EEmax=" $EEmax]</font><b>"
   conv '-t` ' txt
   prints s25ss  "$txt" %
      "  <input name=%"A$adr%" value=%"$2%" size=%"$InputLen%"" %
      " maxlength=%"$InputLen%"$onfoc>$unit$EEmin$EEdflt$EEmax"
   return 0
}


#bin Var: adr typ wlen dst dsteye dflt1 mi1 ma1 dflt2 mi2 ma2 dfltbm flg unit nam txt
# 1  2    3   4   5    6   7      8     9   10  11    12  13  14     15  16   17  18
#MkMUee C:\MUEE A:\DATA\EEBASE $MUspsw
MkMUee()  {
   local b=10 offs=00000 adr=00000 typ=.. blen=00 dst=..
   local df1=........................................
   local df2=....................
   local dfbm=....................
   catv 5,BasePos =offs:
   prints sF2552048-  > $1
   3<> $1
   < $2
   seek $offs 0
   while read adr typ blen dst - df1 - - df2 - - dfbm - - - -
   do
      expr "$adr" :: '^@%d' || { expr "$adr" :: '^%$' || continue; break; }
      conv -D@ adr
      let "blen<<=1, adr=$adr, adr<<=1"
      b=10
      case $dst in
        x)  b=16 ;;
        b)  b=2 ;;
      esac
      [ $3 -eq 1 -a $df2 != '"' ] && df1="$df2"
      [ $3 -eq 2 -a $dfbm != '"' ] && df1="$dfbm"
      case $typ in
        w)  base -$b df1 +w Hbuf ;;
        L)  base -$b df1 +L Hbuf ;;
        S)  conv '-t` ' df1
            [ $dst == 0 ] && prints vs-F000$blen df1 "$df1"
            [ $dst == m -a ${#df1} -lt blen ] && prints vs-$blen df1 "$df1"
            base -w df1 +W Hbuf ;;
      esac
      catv $blen,Hbuf =$adr,,3
   done
   ><<
   return 0
}


#ChangeMUee C:\MUEE A:\DATA\EEBASE $Fmueep Nn
ChangeMUee()  {
   local rub=00 offs=000000 nam=........ sp=00 sw=00 spsw=0
   local adr=00000 typ=.... len=00000 flg=........
   local val=.....................................
   local f=............................................
   catv 0 =1000,Hbuf: < $3
   conv '-t& ' Hbuf
   < $2
   3<> $1
   for Hbuf in $Hbuf
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
         Rubrik)  rub=$Hbuf $4=$Hbuf
                  let "offs=(rub-1)*6"
                  catv $offs,5,BasePos =offs:
                  seek $offs 0
                  readl Hbuf
                  ;;
        A[0-9]*)  val="$Hbuf"
                  conv -DA nam
                  while readl Hbuf
                  do
                     expr "$Hbuf" :: '^@' || break 2
                     expr "$Hbuf" :: '^@%d' || continue
                     conv -D@ Hbuf
                     for 16 adr typ len f f f f f f f f f flg f f f in $Hbuf
                     do break; done
                     let "len<<=1, adr=$adr, adr<<=1, (nam<<1)==adr" || continue
                     EEconvertEye eye "Hbuf:$val" $Hbuf || continue 2
                     [ $flg == SP ] && sp=$val
                     [ $flg == SW ] && sw=$val
                     catv $len,Hbuf =$adr,,3
                     continue 2
                  done
                  ;;
      esac
   done
   ><<
   [ sw -eq 1 ] && sp=0 spsw=2
   [ sp -eq 1 ] && spsw=1
   [ MUspsw -ne spsw ] && MUspsw=$spsw CopyCmuee
   return 0
}


#MkMUeeHtm $Fmueehtm C:\MUEE A:\DATA\EEBASE $Nn
MkMUeeHtm()  {
   local r=0 e=0 n=$4 offs=000000
   local adr=00000 len=00000 siga=..........
   let "n<1" && n=1
   catv $(([n-1]*6)),5,BasePos =offs:
   < $3
   seek $offs 0
   readl Hbuf
   seek + 0 offs
   ><
   expr "$Hbuf" :: '^!' && r=e conv -D! Hbuf
   > $1
   echo '<html><head><title></title>%
         <script language="JavaScript">%
         function Toggle01(i)%
         {%
            var inh= i.value;%
            if (inh=="0" || inh=="" || inh==" ")%
                  i.value= "1";%
            else  i.value= "0";%
            i.blur();%
         }%
         </script>%012%c'
   siga=siga.js
   [ MUspsw -eq 2 ] && siga=sigabm.js
   [ $r == e ] &&
      echo "<script language=%"JavaScript%" %
            src=%"data/$siga%" type=%"text/javascript%"></script>%
            <script language=%"JavaScript%" %
            src=%"data/sig.js%" type=%"text/javascript%"></script>%
            %012%c"
   echo '</head>%
         <body bgcolor="#39458f" text="#ffd700" link="#ffd700" %
          vlink="#ffd700" alink="#ffd700">%012%c'
   [ $r == e ] && echo '<script language="JavaScript">Wr(' "%"$Hbuf%"" ');</script>%012%c'
   catv '.<form name="Vis" action="mueep" method="POST"><pre><b>' /%n %
        '.<input name="Rubrik" type="HIDDEN" value="' n '.">' /%n
   [ $r == e ] && catv '.<font color="#000000">' %
                       '.<input name="Submit" type="SUBMIT" value="Submit">' %
                       '.                   ' %
                       '.<input name="Reset" type="BUTTON" value="Reset"' %
                       '. onClick="Dflt(1);">' %
                       '.</font>' /%n
   [ $r == 0 ] && catv '.<h2>' Hbuf '.</h2>' /%n%n
   < $3
   seek $offs 0
   while readl Hbuf
   do
      expr "$Hbuf" :e '^@%(.%)' || break
      [ "$e" == : ] && {
         conv -D@D: Hbuf
         prints s27s "" "</b><font color=%"#ffffff%">$Hbuf</font><b>"
         continue
      }
      conv -D@ Hbuf
      for 3 adr len len in $Hbuf; do break; done
      let "len<<=1" "adr=$adr" "adr<<=1"
      catv $adr,$len,3 =Nn:  3<> $2
      EEconvertTxt txt Nn $Hbuf
      EEconvertHtm htm "$Nn" $Hbuf
   done
   [ $r == 0 ] && {
      catv /%n%n '.<font color="#000000"><input name="Submit" type="SUBMIT" value="Submit">'
      catv '.                   <input name="Reset" type="RESET" value="Reset"></font>' /%n
   }
   echo '</b></pre></form>%012%c'
   [ $r == e ] && echo '<script language="JavaScript">Dflt(0);</script>%012%c'
   echo '</body></html>%012%c'
   ><<
   return 0
}



WebServer()  {
   sem -R$SemCfg:10000 || return 0
   [ -e $Fstart ] && {
      FormRead $Fstart
      remove $Fstart
      sem -R$SemHtm:10000 && { MkKontHtm $Fkonthtm; sem -r$SemHtm; }
      sem -s$SemSigcgi
   }
   [ -e $Fnewip ] && {
      FormRead $Fnewip
      remove $Fnewip
      CheckIP "$VBMip" || VBMip=$VBMip0
      sem -R$SemHtm:10000 && { MkKontHtm $Fkonthtm; sem -r$SemHtm; }
      sem -s$SemSigcgi
      cmpv VBMip0 VBMip || {
         sleep 5
         VBMip0=$VBMip
         WrChipIni IP ADDRESS $VBMip
         sleep 2
         system reboot
      }
   }
   [ -e $Fcfgp ] && {
      [ -s $Fcfgp ] && ReadCfg $Fcfgp
      #cat $Fcfgp > C:\CFG.BAK
      remove $Fcfgp
      sem -R$SemHtm:10000 && { MkCfgHtm $Fcfghtm; sem -r$SemHtm; }
      sem -s$SemSigcgi
   }
   [ -e $Fanruf ] && {
      if [ -s $Fanruf ]
      then  FormRead $Fanruf || InpAnruf=
      else  InpAnruf=
      fi
      remove $Fanruf
      [ MOisinit -eq 0 ] && MUdata=@MOnoinit: %
                            AnrufMsg="Modem-Initialisierung fehlgeschlagen!" %
                            InpAnruf=. AnrufZ=0
      expr "$InpAnruf" :: '^[0-9W,PT]%{1,}$' &&
         AnrufZ=dialout MUdata= Telnu=$InpAnruf
      sem -R$SemHtm:10000 && { MkTelhfHtm $Ftelhfhtm $MUdata; sem -r$SemHtm; }
      sem -s$SemSigcgi
   }
   [ -e $Ftelvf ] && {
      remove $Ftelvf
      sem -R$SemHtm:10000 && {
         catv HTMtelvf1 > $Ftelvfhtm
         MkTelCells $Ftelvfhtm
         catv HTMtelvf2 >> $Ftelvfhtm
         sem -r$SemHtm
      }
      sem -s$SemSigcgi
   }
   [ -e $Fmuee ] && {
      local n=00000
      catv 0 =n: < $Fmuee
      n=$n ifset n || n=0
      remove $Fmuee
      [ -s C:\MUEE ] || CopyCmuee
      case $n in
         tomu|tovbm|none)
            MUee=$n
            sem -R$SemHtm:10000 || goend
            catv HTMtelvf1 > $Fmueehtm
            MkTelCells $Fmueehtm
            catv HTMtelvf2 >> $Fmueehtm
         ;;
         defaults)
            CopyCmuee
            sem -R$SemHtm:10000 || goend
            cat A:\EE.HTM > $Fmueehtm
         ;;
         *)
            sem -R$SemHtm:10000 || goend
            MkMUeeHtm $Fmueehtm C:\MUEE A:\DATA\EEBASE $n
         ;;
      esac
      sem -r$SemHtm
      sem -s$SemSigcgi
   }
   [ -e $Fmueep ] && {
      local sz=00000
      fstat -sv sz $Fmueep
      if let "sz>=2048"
      then
         MkMucFile C:\DATA.MUC $Fmueep || [ $? -gt 1 ] && CopyCmuee
         #MkMucFile C:\DATA.MUC $Fmueep || echo -$?- && cat $Fmueep >C:\MUC
         remove $Fmueep
         sem -R$SemHtm:10000 && { cat A:\EELF.HTM > $Fmueehtm; sem -r$SemHtm; }
      else
         MUee=tomu
         [ -s C:\MUEE ] || CopyCmuee
         ChangeMUee C:\MUEE A:\DATA\EEBASE $Fmueep Nn
         remove $Fmueep
         base -W +w < C:\MUEE | catv 2048,0 =5000,2048,3  3<> C:\DATA.MUC
         sem -R$SemHtm:10000 && { MkMUeeHtm $Fmueehtm C:\MUEE A:\DATA\EEBASE $Nn
                                  sem -r$SemHtm; }
      fi
      sem -s$SemSigcgi
   }
   sem -r$SemCfg
   return 0
}



set -f

#C:\BISH_TEMP\
Fmuhtm='C:\MU.HTM'
Fsema='C:\SEMA'
Fstart='C:\CFG\START'
Fnewip='C:\CFG\NEWIP'
Fcfgp='C:\CFG\CFGP'
Fanruf='C:\CFG\ANRUF'
Ftelvf='C:\CFG\TELVF'
Fmuee='C:\CFG\MUEE'
Fmueep='C:\CFG\MUEEP'
Fkonthtm='C:\HTM\KONTAKT.HTM'
Fcfghtm='C:\HTM\CFG.HTM'
Ftelhfhtm='C:\HTM\TELHF.HTM'
Ftelvfhtm='C:\HTM\TELVF.HTM'
Fmueehtm='C:\HTM\MUEE.HTM'
Fc1='C:\1'
Fc2='C:\2'
Ftbl5='C:\TBL5.TXT'
#Fmucfg='A:\MU.CFG'
Fcfgcfg='A:\CFG.CFG'
Fteltxt='A:\TEL.TXT'

MOauflegen='%t0%d%p%p+++%d%p%p %t4%OATH'
MOinit='AT AT%O AT&F %dATX3E0L1S0=0'
MOinitapp='                           '
MOdialout='%t50%CATD%T'
MOabnehmen='%t40%CATA'
MOisinit=0
MOwahl=1
TPwahl=T
MUee=.....
MUee=none
MUspsw=0
prints vs70 EEmin
prints vs40 EEmax
EEdflt=00000000

catv /%r%n =RN:
N=0000000000
ext -b9600h1icocs N || Err "ext-Init fehlgeschlagen"
echo $N

[ -e "$Fsema" ] && {
   base -l +16 SemBishrun < $Fsema
   sem -c$SemBishrun
   echo $SemBishrun:$?
}
# bish runs                                cgi-->bish   bish-->cgi
SemBishrun=0 SemCgirun=1 SemCfg=2 SemHtm=3 SemSigbish=4 SemSigcgi=5
Nn="$SemBishrun $SemCgirun $SemCfg $SemHtm $SemSigbish $SemSigcgi"
echo $Nn
sem -g$SemSigbish ; echo $?
sem -g$SemSigcgi ; echo $?

catv /%0 =1500,,Ibuf
catv /%0 =1000,,Hbuf
N=0000000000
TOsec=0000000000
REip='%d%{1,3}%.%d%{1,3}%.%d%{1,3}%.%d%{1,3}'
VBMip0=192.168.111.222
VBMip=192.168.111.222
Telnu=0000000000000000000000000000000
InputLen=000
prints vs150 KatOffs
prints vs20 MUip
prints vs20 MUstation
prints vs20 MUpasswd
MUmoerr=0
prints vs20 VBMstation0
prints vs20 VBMstation
prints vs20 VBMpasswd
prints vs30 TblFolge
prints vs20 AnrufZ
prints vs30 AnrufMsg
prints vs30 InpAnruf
prints vs10 MUdata

local MOinittime=000000000000 MOring=00 MOringtime=000000000000
MOinittime=$SECONDS
local L_offs=000000 L_n=000 L_c=.... L_src=000000 L_x=....................

TblFolge="1  2  3  4  5  6  7  "
AnrufZ=0
Nn='116 239 246 116 245 252 116 223 176'
base -10 Nn +b Tconv
echo "$Tconv"
array TblTitle "1" "2" "Haupt-<br>Messwerte" "Alarmdaten" %
               "PSS-<br>Geräte" "UNV-<br>Geräte" "UNB<br>BM1<br>MM" "Meßwerte2" "Ereignisse"

#cd c: || Err "Fehlschlag  CD C:"

[ -s "$Fcfgcfg" ] && {
   catv 0 =Hbuf: < $Fcfgcfg
   expr "$Hbuf" :TPwahl '^%([TP]%)'
   expr "$Hbuf" :MOwahl '^.%([01]%)'
   expr "$Hbuf" :TblFolge '^..%([0-9 ]%{1,}%)'
   expr "$Hbuf" :MOinitapp 'MOINIT:%(..*%)$' && MOinitapp=$MOinitapp
}


sem -s$SemBishrun
if [ -s "A:\DATA\EEBASE" -a '(' %
   ! -s "A:\EELF.HTM" -o %
   ! -s "A:\DATA\BASEPOS" -o %
   ! -s "A:\DATA\SIGA.JS" -o %
   ! -s "A:\DATA\SIGABM.JS" ')' ]
then
   echo eebase: creating basepos ...
   prints vs150 BasePos
   L_n=0
   < "A:\DATA\EEBASE"
   while seek + 0 L_offs; readl Hbuf
   do
      expr "$Hbuf" :L_c '^:%(.%)' || continue
      [ "$L_c" == '!' ] && let "L_src=L_offs+1"
      let "++L_offs"
      prints vs-6 L_offs $L_offs
      catv L_offs =$L_n,6,BasePos
      let "L_n+=6"
   done
   [ L_src -ne 0 ] && {
      L_c='    '
      seek $L_src 0
      readl Hbuf
      > "A:\DATA\SIGA.JS"
      catv '/var SigSrc= Array(%n'
      while readl Hbuf
      do
         expr "$Hbuf" :: '^@' || break
         expr "$Hbuf" :: '^@%d%{3} %{1,}L %{1,}2 ' || continue
         expr "$Hbuf" :Hbuf '%([^ %t]%{1,}%)$' || continue
         conv '-t` ' Hbuf
         catv $L_c /%s Hbuf /%s ; L_c='/,%n'
      done
      catv '/);%n'
      ><
      cat "A:\DATA\SIGA.JS" > "A:\DATA\SIGABM.JS"
   }
   ><
   catv BasePos > "A:\DATA\BASEPOS"
   {
      L_c='    '
      >> "A:\DATA\SIGA.JS"
      catv '/var Sig= Array(%n'
      < "A:\DATA\SIGA.TXT"
      while readl Hbuf
      do
         ifset Hbuf || continue
         catv $L_c /%s Hbuf /%s ; L_c='/,%n'
      done
      catv '/);%n'
      ><<
      L_c='    '
      >> "A:\DATA\SIGABM.JS"
      catv '/var Sig= Array(%n'
      < "A:\DATA\SIGABM.TXT"
      while readl Hbuf
      do
         ifset Hbuf || continue
         catv $L_c /%s Hbuf /%s ; L_c='/,%n'
      done
      catv '/);%n'
      ><<
   }
else
   [ -s "A:\DATA\BASEPOS" ] || : > "A:\DATA\BASEPOS"
   catv 0 =BasePos: < "A:\DATA\BASEPOS"
fi
echo BasePos: $BasePos


[ -s "A:\DATA\EEBASE" -a ! -s "A:\EELF.HTM" ] && {
   sem -s$SemBishrun
   echo creating eelframe ...
   L_n=0
   > "A:\EELF.HTM"
   echo '<html><head><title></title></head>%
         <body bgcolor="#39458f" text="#ffd700" link="#ffd700"%
          vlink="#ffd700" alink="#ffd700"><b>'
   < "A:\DATA\EEBASE"
   for L_offs in $BasePos
   do
      seek $L_offs 0
      readl Hbuf
      let "++L_n"
      catv '.<a href="muee?' L_n '." target="EErf">' Hbuf '.</a><br><br>' /%n
   done
   catv '.<br><h3 align="center"><a href="HELP.HTM#mukonf" target="_blank">Hilfe</a></h3>' /%n
   catv '.<br><h3 align="center"><a href="Tel.htm" target="_top">MU-Kontakt</a></h3>' /%n
   catv '.<br><h3 align="center"><a href="muee?defaults" target="_top">Standard-Werte</a></h3>' /%n
   catv '.<br><h3 align="center"><a href="Data.muc">Download .muc-Datei</a></h3>' /%n
   catv '.<br>
<form action="mueep" method="POST" enctype="multipart/form-data">
<input type="SUBMIT" value=" Upload .muc-Datei ">
<input type="FILE" name="Upload" size="20" maxlength="7600" accept="*/*">
</form>' /%n
   echo '</b></BODY></HTML>'
   ><<
}
#enctype="multipart/form-data">
#accept-charset="UNKNOWN">

for 2 L_c L_x in 1 MUEEHV 2 MUEEBM 0 MUEE
do
   [ -s A:\DATA\$L_x ] && continue
   sem -s$SemBishrun
   echo creating A:\DATA\$L_x ...
   MkMUee C:\MUEE A:\DATA\EEBASE $L_c
   cat C:\MUEE > A:\DATA\$L_x
done
sem -s$SemBishrun
CopyCmuee
catv /%0 =1000,,Hbuf


MkTbl5data $Ftbl5 start

VBMip0=1.1.1.1
RdChipIni IP ADDRESS Hbuf && VBMip0=$Hbuf
VBMip=$VBMip0
VBMstation0=Station1
RdChipIni DEVICE NAME Hbuf && VBMstation0="$Hbuf"
VBMstation="$VBMstation0"
echo $VBMip
echo "'$VBMstation'"

if [ MOwahl -ne 0 ]
then  WriteAT "$MOauflegen"
      WriteAT "$MOinit" && MOisinit=1
else  MOisinit=1
fi

#CB_START:  fcfg=Fstart; fhtm=Fkonthtm;
#CB_NEWIP:  fcfg=Fnewip; fhtm=Fkonthtm;
#CB_CFG  :  fcfg=Fcfgp   fhtm=Fcfghtm;
#CB_CFGP :  fcfg=Fcfgp ; fhtm=Fcfghtm;
#CB_TELHF:  fcfg=Fanruf; fhtm=Ftelhfhtm;
#CB_TELVF:  fcfg=Ftelvf; fhtm=Ftelvfhtm;


while :
do
   [ -e c:\exitbish ] && {
      remove -sv c:\exitbish $Fc2
      break
   }
   sem -s$SemBishrun
   ((++N))
   sleep -m 700

   sem -g$SemSigbish && WebServer

   [ $AnrufZ == 0 ] && {
      [ MOring -gt 0 ] && {
         [ MOringtime -eq 0 ] && MOringtime=$SECONDS
         let "$SECONDS-MOringtime>=30" && MOring=0 MOringtime=0
      }
      [ MOisinit -ne 1 ] && {
         [ MOisinit -ne 0 ] && MOinittime=0
         [ MOwahl -eq 0 ] && MOisinit=1 continue
         let "$SECONDS-MOinittime<30" && continue
         WriteAT "$MOauflegen"
         WriteAT "$MOinit" && MOisinit=1
         MOinittime=$SECONDS
         [ MOisinit -ne 1 ] && MOisinit=0
         continue
      }
      ext -p L_c || continue
      [ MOwahl -eq 0 ] && { ext -ic; continue; }
      ext -iT100it60id10i1000 Ibuf
      catv $.,Ibuf =Hbuf:
      catv '/[' Hbuf '/]'
      GetMOmsgNr Hbuf && let "Hbuf&4" && let "++MOring>=3" &&
         MOring=0 MOringtime=0 MUdata= AnrufZ=dialin
      continue
   }
   MUanrufen $Telnu || MOisinit=2
   [ $AnrufZ == c2written ] && AnrufZ=0 MOisinit=2
   [ $AnrufZ == mucfgokay ] && AnrufZ=0 MOisinit=2 MUdata="@MUeedata:"
   [ $AnrufZ != c1written ] && continue
   AnrufZ=0 MkMUhtm
   #[ -e $Fmuhtm ] && remove $Fmuhtm
   #move $Fc2 $Fmuhtm
   cat $Fc2 > $Fmuhtm
   MUdata="@MUdata:"
   MOisinit=2
done



#remove -sv "$Fsema"
sem -"d${SemBishrun}d${SemCgirun}d${SemCfg}d${SemHtm}d${SemSigbish}d${SemSigcgi}"
ext -
exit 0





###  wc.bish  #############################################

#!/u/bin/bish

RANDOM=1007                  #Nachfolgend stets gleiche Sequenz
D=/usr/tmp
mkdirs $D                    #Entspricht mkdir -p
set Buf:05000                #Buf mit 5000 '0' füllen
                             #(Buf:0.5000 wäre '\0')
local f=0000 r=00000         #Dateilokal

for f to 1000 repeat         #f= "1".."1000"; signed long
do                           #[for V from a by s to b] repeat
   catv Buf >$D/$f           #Wie cat, nur Buf ist keine Datei
done
echo created

to 100 repeat                #Laufvariable intern; 1..100
do                           #>=50; Dauer >=3 Sync-Zyklen
   print -n .
   for f to 1000 repeat      #f= "1".."1000"
   do
      let "r=$RANDOM%5000"   #r=Zufallszahl 0..4999
      catv /r =$r,,0 <>$D/$f
   done                      #Schreibe "r" auf Handle 0, offs=$r
done                         #Wie cat, nur /r ist "r"
echo %nwritten


[ $# -gt 0 ] && exit 0       #Löschen verhindern

for f to 1000 repeat
do
   remove $D/$f
done
echo deleted



###  words.bish  #############################################




Zeile()  {
   return 0
}


UseNot()  {
   expr "$Z" :: '^[ %t]%{0,}%%' &|
   expr "$Z" :: '\[a-z]*section[{[]' &|
   expr "$Z" :: '\[a-z]*section%*[{[]' &|
   expr "$Z" :: '\chapter[{[]' && return 0
   return 1
}


set Z:.300
set F:.50
set W:.50
V=v

> words.txt
for F in kap/*.tex mod/*.tex
do
   [ -s "$F" ] || continue
   print -u2 "%t$F"
   < "$F"
   while readl Z
   do
      UseNot && continue
      if [ $V == V ]
      then
         expr "$Z" :: '\end{verbatim}' && V=v
         continue
      else
         expr "$Z" :: '\begin{verbatim}' || goend
         V=V continue
      fi
      while ifset Z
      do
         expr " $Z " :W ' %([a-zA-ZäöüßÄÖÜ][a-zA-Z0-9äöüßÄÖÜ]%{1,}%)[ ,.!:]' || break
         expr " $Z " :Z ' [a-zA-ZäöüßÄÖÜ][a-zA-Z0-9äöüßÄÖÜ]%{1,}[ ,.!:]' = ''
         catv W /%n
      done
   done
   ><
done
><

sortl -owords.txt words.txt
cat words.txt | uniq > words.txt

#cat kap/*.tex | tr -cs '[a-z][A-Z][0-9]äöüßÄÖÜ_-' '[\10*]'

exit 0



###  words.bish  #############################################




Zeile()  {
   return 0
}


UseNot()  {
   expr "$Z" :: '^[ %t]%{0,}%%' &|
   expr "$Z" :: '\[a-z]*section[{[]' &|
   expr "$Z" :: '\[a-z]*section%*[{[]' &|
   expr "$Z" :: '\chapter[{[]' && return 0
   return 1
}


set Z:.300
set F:.50
set W:.50
V=v

> words.txt
for F in kap/*.tex mod/*.tex
do
   [ -s "$F" ] || continue
   print -u2 "%t$F"
   < "$F"
   while readl Z
   do
      UseNot && continue
      if [ $V == V ]
      then
         expr "$Z" :: '\end{verbatim}' && V=v
         continue
      else
         expr "$Z" :: '\begin{verbatim}' || goend
         V=V continue
      fi
      while ifset Z
      do
         expr " $Z " :W ' %([a-zA-ZäöüßÄÖÜ][a-zA-Z0-9äöüßÄÖÜ]%{1,}%)[ ,.!:]' || break
         expr " $Z " :Z ' [a-zA-ZäöüßÄÖÜ][a-zA-Z0-9äöüßÄÖÜ]%{1,}[ ,.!:]' = ''
         catv W /%n
      done
   done
   ><
done
><

sortl -owords.txt words.txt
cat words.txt | uniq > words.txt

exit 0



###  adm.cgi  #############################################

#!./bish_folso_cgi -p_



# Buf
Escape()  {
   local c=. h=... spez="${{1}"
   expr "${{1}" :spez '[a-zA-Z_0-9&=.-]' += ''
   ifset spez || return 0
   conv '-d%' spez
   [ $. -ge 0 ] && expr "${{1}" :$1 '%%' += '%25'
   while ifset spez
   do
      catv 1,spez =c
      conv "-d$c" spez
      base -b c +16 h
      expr "${{1}" :$1 "$c" += '%'$h
   done
   return 0
}


CkPasswd()  {
   [ 0${#1} -lt 3 -o 0${#1} -gt 15 ] && return 1
   expr "$1" :: '[^!-~]' && return 1
   #expr "$1" :: '[+&]' && return 1
   return 0
}


RxTxRun()  {
   [ $# -eq 0 ] && {
      extern $ps_cmd | grep -qm 'rxtx.bish[ %t]%{1,}run'
      return
   }
   [ "$1" == sigterm ] && {
      local pid
      extern $ps_cmd | pid=$( grep -m 'rxtx.bish[ %t]%{1,}run' ) || return
      catv pid /%n | read - pid -
      expr "$pid" :: '^[0-9]%{1,}$' || return
      kill $pid
   }
   return
}


# $Adir "$sta"
CkChStation()  {
   local sta="$2" gid=0000 aid=0000 buf:.200
   expr "$1" :gid '%([0-9]*%)/[0-9]*$'
   expr "$1" :aid '[0-9]*/%([0-9]*%)$'
   buf="$(- grep -m "^$gid $aid " $Fstation )" || return
   expr "$buf" :buf "^$gid $aid "'%(.*%)$' || return
   cmpv buf sta && return 0
   cat $Fstation | {
      > $Fstation
      while readl buf
      do
         expr "$buf" :: "^$gid $aid " || { catv buf /%n; continue; }
         print -r "$gid $aid $sta"
      done
      ><
   }
   return 0
}

# $Adir "$sta"
AddStation()  {
   local gid=0000 aid=0000
   expr "$1" :gid '%([0-9]*%)/[0-9]*$'
   expr "$1" :aid '[0-9]*/%([0-9]*%)$'
   print -r "$gid $aid $2" >> $Fstation
   [ CTbuild -eq 0 ] && CTbuild=1 Uvars CTbuild
   return 0
}


#CkGA Gdir $Ddb  "$grp" || MkGA $Gdir $Ddb  "$grp"
#CkGA Adir $Gdir "$anl" || MkGA $Adir $Gdir "$anl"
CkGA()  {
   local ali=$2/$Fali dali=0000 dali0=0000 min=0000
   local bez; prints vs50 bez
   mkdirs $2
   [ -e $ali ] || : > $ali
   < $ali
   while read dali bez
   do
      [ "$bez" == "$3" ] && { ><; $1=$2/$dali; return 0; }
      let "min==0&&dali-dali0>1" && let "min=dali0+1"
      dali0=$dali
   done
   ><
   let "++dali, min==0" && $1=$2/$dali
   let "min>0" && $1=$2/$min
   return 1
}

#CkGA Gdir $Ddb  "$grp" || MkGA $Gdir $Ddb  "$grp"
#CkGA Adir $Gdir "$anl" || MkGA $Adir $Gdir "$anl"
MkGA()  {
   local ali=$2/$Fali dali=0000 dali0=0000 w=0
   local bez; prints vs50 bez
   mkdirs $2 $1
   expr "$1" :dali0 '/%([0-9]%{1,4}%)$'
   [ -s $ali ] || { catv dali0 ". $3" /%n > $ali; return 0; }
   cat < $ali | {
      > $ali
      while read dali bez
      do
         [ dali -gt dali0 -a w -eq 0 ] && w=1 catv dali0 ". $3" /%n
         catv dali ". " bez /%n
      done
      [ w -eq 0 ] && catv dali0 ". $3" /%n
      ><
   }
   return 0
}


# len
FormInfoRead()  {
   local g=g a=a i=i n=000 nam=.................... tmp=../tmp/newtmp
   local ctv=0000 ctv0=0000 sta=....................
   local grp; prints vs50 grp
   local anl; prints vs50 anl
   expr "$1" :: '^[0-9]%{2,4}$' || PutErrHtm "Length value: »$1«"
   let "$1<=3||$1>5000" && PutErrHtm "Length value: »$1«"
   catv $1,0 =Hbuf:
   conv -'t& ' Hbuf
   > $tmp
   for Hbuf in $Hbuf
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        I[0-9]*)
           Hbuf=$Hbuf
           [ ${#Hbuf} -eq 0 ] && goend
           [ $nam == I$Gid ] && grp="$Hbuf" unset g
           [ $nam == I$Aid ] && anl="$Hbuf" unset a
           [ $nam == I$Iid ] && sta="$Hbuf" unset i
           [ $nam == I$Cid ] && ctv="$Hbuf"
        ;;
        W[0-9]*)
           conv "-t${CR}${ESC}t$NL${CA}"'t `' Hbuf
        ;;
        P[0-9]*)
           expr "$Hbuf" :: '^®[^®]%{3,}®$' && { conv -d® Hbuf; goend; }
           CkPasswd "$Hbuf" || { ><; remove $tmp; PutErrHtm "Password wrong!"; }
           catv Hbuf | extern ./mailcode -en -c "$MC64" | catv 0 =Hbuf:
        ;;
      esac
      expr "$nam" :: '^[IWP][0-9]%{1,3}$' || continue
      catv 1,3,nam "/ " Hbuf RN
   done
   ><
   [ -n "$g$a$i" ] && { remove $tmp
      PutErrHtm "Group, System and Sys-ID are essential!"; }
   expr "$grp" :: '^[!* ]' && { remove $tmp; PutErrHtm "!* not allowed: »$grp«"; }
   CkGA Gdir $Ddb  "$grp" || MkGA $Gdir $Ddb  "$grp" && MkGrpArr $Fgrpajs
   CkGA Adir $Gdir "$anl" || MkGA $Adir $Gdir "$anl" && AddStation $Adir "$sta"
   [ -s $Adir/i ] && ctv0="$(- grep -m "^$Cid " $Adir/i )" && {
      expr "$ctv0" :ctv0 '^[0-9]%{1,} %([0-9]%{1,}%)' || ctv0=0
      [ ctv -ne ctv0 -a CTbuild -eq 0 ] && CTbuild=1 Uvars CTbuild
   }
   cat $tmp > $Adir/i
   remove $tmp
   CkChStation $Adir "$sta" || PutErrHtm "Change to »$sta« failed."
   return 0
}

#/db/gruppe/mu/
#/db/alias.txt
#/db/1/alias.txt
#/db/1/1/i(info) ee status fail okay
# first/get Gdir=''/Gdir="grpbez"
GetGrpDir()  {
   [ -s $Ddb/$Fali ] || return 1
   local id=0000 inh
   case $1 in
     first)
          catv 5000,0 =Hbuf: < $Ddb/$Fali
          expr "$Hbuf" :Hbuf '%([0-9]%{1,} %)[^%n]*%n' + '%1'
          set +f
          for id in $Hbuf
          do
             : $Ddb/$id/[1-9]*/i
             [ "$]" -gt 0 ] && { set -f; $2=$Ddb/$id; return 0; }
          done
          set -f
     ;;
     get)
          < $Ddb/$Fali
          while read id inh
          do
             cmpv $2 inh || continue
             $2=$Ddb/$id; ><; return 0
          done
          ><
     ;;
   esac
   return 1
}


# Adir $Gdir
GetAnlDir()  {
   local id=0000 inh
   [ -s $2/$Fali ] || return 1
   < $2/$Fali
   while read id inh
   do
      cmpv $1 inh || continue
      $1=$2/$id; ><; return 0
   done
   ><
   return 1
}


# $Fgrpajs
# $Fgrpaejs "Err"
MkGrpArr()  {
   local r=0 n=000 i=000 id=0000 grp
   Lock lockga
   [ -e $Ddb/$Fali ] || : > $Ddb/$Fali
   [ $# -ge 2 ] && r=1
   [ $# -lt 2 ] && Newgrparr=1
   > $1
   < $Ddb/$Fali
   while readl grp
   do  let ++n;  done
   echo "var GrpAn$2= $n;"
   [ n -gt 0 ] && echo "var GrpArr$2= new Array($n);"
   [ n -eq 0 ] && echo "var GrpArr$2= new Array(1);%nGrpArr${2}[0]= %"%";"
   i=0
   seek 0 0
   set +f
   while read id grp
   do
      [ $# -ge 2 ] && {
         grp='  '
         : $Ddb/$id/[1-9]*/fail
         [ $] -gt 0 ] && r=0 grp='! '
      }
      print -r "GrpArr${2}[$i]= %"$grp%";"
      let ++i
   done
   ><<
   set -f
   Lock lockga del
   #[ $# -ge 2 ] && read - - i < $Fgrpajs && [ i -ne n ] && MkGrpArr $Fgrpajs
   return $r
}


# user pass
SetPass()  {
   local pw="$2"
   WrLog "Password operation: $1" "change"
   [ 0${#1} -lt 1 -o 0${#2} -lt 3 -a 0${#2} -gt 0 ] &&
      PutErrHtm "User/Pass length not accepted."
   [ 0${#2} -eq 0 ] && pw='`{!@#$%^vI*")7Q'
   expr "$1" :: '[^a-zA-Z0-9_]' && PutErrHtm "User name contains wrong chars."
   expr "$1" :: '^[a-zA-Z]' || PutErrHtm "User name must begin with [a-zA-Z]."
   cd ../adm
   htpasswd -bm .wmspw "$1" "$pw" 2>/dev/null ||
            PutErrHtm "Password operation failed."
   cd -
   return 0
}


# $txtfile
PutTxt2Htm()  {
   catv Doctype '/<head><title>TXT2HTML</title>%n' Meta
   print -r '</head>
    <body class="main"><div class="stat1"><form><b>
    <input class="butt" type="button" value="Back" onClick="window.back();">
    </b></form></div>'
   print -rn '<div class="stat"><pre><b>'
   cat "$1"
   print -r '</b></pre></div></body></html>'
   return 0
}


# boundary: ---------12345 (mindestens: --)
# boundary: erste Zeile
# Beginn: nach Leerzeile (%r%n)
# Ende: %r%nboundary--%r%n
# Achtung: boundary aus CONTENT_TYPE hat vorn "--" weniger!
# len
FormAdmBakRead()  {
   local boundary="$CONTENT_TYPE" arch=../tmp/db.tar
   local sz:010 bp6:010 z:.500
   expr "$boundary" =:boundary 'boundary=%(..*%)' || return 1
   #catv boundary > ../tmp/boundary
   let "bp6=${#boundary}+8"
   catv 1000,0 | {
      while readl z
      do
         ifset z || break
      done
      catv 0 > $arch
      catv ,.
   }
   [ $. -le 0 ] && { remove -s $arch; return 2; }
   cat >> $arch
   fstat -sv sz $arch
   [ sz -lt bp6 ] && { remove -s $arch; return 3; }
   catv -$bp6:,,0 =z:  < $arch
   expr "$z" :: "^%r%n--$boundary--%r%n%$" || { remove -s $arch; return 4; }
   let "sz-=bp6"
   fstat +s $sz $arch || { remove -s $arch; return 5; }
   return 0
}


# len
FormAdmRead()  {
   local ja=---- mo=-- ta=-- st=-- mi=-- se=00 ip=999.888.777.666
   local tp=T md=0 rt=0 ct=0 ctb=0 as=0 sig=0
   local nam=.................... user=................
   expr "$1" :: '^[0-9]%{1,4}$' || PutErrHtm "Length value: »$1«"
   let "$1<=3||$1>2000" && PutErrHtm "Length value: »$1«"
   catv $1,0 =Hbuf:
   conv -'t& ' Hbuf
   for Hbuf in $Hbuf
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        Shut)  : > ../tmp/rxtx
               sleep -m 800
               RxTxRun && RxTxRun sigterm
               [ "$OsTyp" == FreeBSD ] && {
                  echo "Content-type: text/plain%n"
                  extern ../adm/syscmd.bish shutdown "shutdown -h now"
		  sleep 10
		  return 2
                  #extern ../adm/syscmd.bish shutdown halt
                  #UW: shutdown -y -g0
               }
        ;;
        RxTx)  rt=1 ;;
        Auto)  as=1 ;;
        Term)  sig=1 ;;
        Modem) md=1 ;;
        Puls)  tp=P ;;
        Conn)  ct=1 ;;
        Build) ctb=1 ;;
        MInit) cmpv MOinitapp Hbuf || MOinitapp="$Hbuf" Uvars MOinitapp ;;
        Day)   ta=$Hbuf ;;
        Mon)   mo=$Hbuf ;;
        Year)  ja=$Hbuf ;;
        Hour)  st=$Hbuf ;;
        Min)   mi=$Hbuf ;;
        IP)
           CheckIP "$Hbuf" || PutErrHtm "IP address: »$Hbuf«"
           ip=$Hbuf
        ;;
        User)
           for ip in admin new vbm root adm cie sam selotronic cfg config pass
           do  cmpv -i ip Hbuf && PutErrHtm "User name not applicable."; done
           user="$Hbuf" ;;
        Pass)   [ -n "$user" ] && SetPass "$user" "$Hbuf" ;;
        AdmPw)  [ -n "$Hbuf" ] && SetPass admin   "$Hbuf" ;;
        NewPw)  [ -n "$Hbuf" ] && SetPass new     "$Hbuf" ;;
        AdmLs)
           expr "$Hbuf" :: '^[0-9]%{1,}$' &&
              [ Hbuf -ne AdmLogSz ] && AdmLogSz=$Hbuf Uvars AdmLogSz
        ;;
        SysLs)
           expr "$Hbuf" :: '^[0-9]%{1,}$' &&
              [ Hbuf -ne SysLogSz ] && SysLogSz=$Hbuf Uvars SysLogSz
        ;;
      esac
   done
   [ "$TPwahl" != "$tp" ] && TPwahl=$tp Uvars TPwahl
   [ MOwahl -ne md ] && MOwahl=$md Uvars MOwahl
   [ RxTxAuto -ne as ] && RxTxAuto=$as Uvars RxTxAuto
   [ ConnTest -ne ct ] && ConnTest=$ct Uvars ConnTest
   [ CTbuild -ne ctb ] && CTbuild=$ctb Uvars CTbuild
   if RxTxRun
   then
      [ rt -gt 0 ] && goend
      : > ../tmp/rxtx
      sleep -m 800
      [ sig -gt 0 ] && RxTxRun && RxTxRun sigterm
   else
      [ MUcall -ne 0 ] && MUcall=00 Uvars MUcall
      remove -s ../tmp/rxtx
      [ rt -eq 0 ] && goend
      extern ../adm/rxtx.bish
      sleep -m 200
   fi
   expr "$ta$mo$ja$st$mi$se" :: '^[0-9]%{7,14}$' && {
      : $ta $mo $ja $st $mi
      [ 0$} -eq 5 ] && extern ../adm/syscmd.bish date $ta $mo $ja $st $mi
   }
   return 0
}
#date -u MMDDhhmmCCYY


# "dir|file=obj act=aaa"
AdmAction()  {
   local id=0000 nam=.......... obj=..............................
   for Hbuf in $1
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        file)  obj="$Hbuf" ;;
        act)
           case "$Hbuf" in
             del)  [ -f "$obj" ] || PutErrHtm "File not found: »$obj«"
                   remove -s $obj ;;
             trun) [ -f "$obj" ] || PutErrHtm "File not found: »$obj«"
                   : > $obj ;;
             log)  echo "Content-type: text/html%n"
                   PutTxt2Htm $obj
                   return 0 ;;
             src)  echo "Content-type: text/plain%n"
                   cat $obj
                   return 0 ;;
             bak)  #tar xepf -
                   cat uvars.bish > $Ddb/uvars.bish
                   extern tar chf $obj $Ddb
                   WrLog "File:$obj" "created" ;;
             down) WrLog "File:$obj" "downloaded"
                   expr "$obj" :obj '^%.%./%(..*%)$'
                   echo "Location: http://$SERVER_ADDR:$SERVER_PORT/$obj%n"
                   return 0 ;;
             upda) extern tar xepf $obj || PutErrHtm "Backup Update failed"
                   WrLog "File:$obj" "database updated from file"
                   [ -s $Ddb/uvars.bish ] && cat $Ddb/uvars.bish > uvars.bish
                   ;;
           esac
        ;;
      esac
   done
   #echo "Status: 204 No Content%n"
   echo "Content-type: text/html%n"
   MkAdmHtm
   return 0
}


#
MkAdmHtm()  {
   local exist=1 iv=0 s=00 titel=.............................. script=........
   local file=$titel act=........ action=$titel titel0=starttitel
   catv Doctype '/<head><title>VBM admin</title>%n' Meta
   echo '<script language="JavaScript" src="/js/help.js" type="text/javascript">
         </script>
         <script language="JavaScript" type="text/javascript">
          function GrpSel(sel)  { return; }
         </script>'
   print -r '</head>
    <body class="main">
    <div class="dctl"><b><font size="+2">'"VBM Administration"'</font>
     </b><br><br>
    '
   extern /bin/date -u +'%A, %e. %b. %Y &nbsp;%X &nbsp;%Z'
   echo '</div><div class="dctlm"><pre><b>%c'
   echo '<center><u>Files</u></center>%c'
   for 6 titel file act action iv script in %
         ADMLOG  $Fadmlog          log  Display  2 adm %
         ADMLOG  $Fadmlog          src  Source   2 adm %
         ADMLOG  $Fadmlog          trun Truncate 2 adm %
       SYSIDTXT  $Fstation         log  Display  2 adm %
       SYSIDTXT  $Fstation         src  Source   2 adm %
       CONNTEST  $Fconntest        log  Display  2 adm %
       CONNTEST  $Fconntest        src  Source   2 adm %
       PASSWORD  ../adm/.wmspw     src  Source   2 adm %
         BACKUP  ../tmp/db.tar     bak  Create   0 adm %
         BACKUP  ../tmp/db.tar     down Download 2 adm %
         BACKUP  ../tmp/db.tar     del  Delete   3 adm %
         BACKUP  ../tmp/db.tar     upda !Update! 2 adm
   do
      Hbuf="$file" Escape Hbuf
      let "s=10-${#action}"
      cmpv titel titel0 || {
         echo %n
         prints s14- "$titel: "
         PutFileDate $file; exist=$?
         echo '   %c'
      }
      if [ exist -eq iv -o iv -eq 3 -a exist -gt 0 ]
      then
         prints ssss$s- '<a class="actl" href="/cgi/'"$script"'.cgi?req=admact' %
                        '&file='"$Hbuf" %
                        '&act='"$act"'">'"$action"'</a>' ''
      else
         prints   ss$s- '<font color="#b0b0b0">'"$action"'</font>' ''
      fi
      titel0=$titel
   done
   unset titel titel0 file act action iv script exist s
   local w=00 n=- siz=000 max=000 nam=........ typ=........
   local txt=.............................. val=..............................
   local ja=2002 mo=12 ta=31 st=24 mi=60 se=60 rxtx=0 puls=0
   systime val
   ctime ja mo ta st mi se $val
   [ "$TPwahl" != T ] && puls=1
   RxTxRun && rxtx=1
   echo '</b></pre></div>
    <div class="dctlm"><form name="af" action="/cgi/adm.cgi" method="POST"><pre><b>%c'
   for 8 txt w nam typ val siz max n in %
         "        Shutdown  "  24  Shut checkbox "0"           0  0 ' ' %
         " RxTx daemon run  "  24  RxTx checkbox "$rxtx"       0  0 ' ' %
         " RxTx    SIGTERM  "  24  Term checkbox "0"           0  0 ' ' %
         " RxTx auto start  "  24  Auto checkbox "$RxTxAuto"   0  0 ' ' %
         "    Connect test  "  24  Conn checkbox "$ConnTest"   0  0 ' ' %
         " Build Conn test  "  24 Build checkbox "$CTbuild"    0  0 ' ' %
         "      Modem mode  "  24 Modem checkbox "$MOwahl"     0  0 ' ' %
         "      Pulse dial  "  24  Puls checkbox "$puls"       0  0 ' ' %
        "Modem init append  "  24 MInit     text "$MOinitapp" 22 30 ' ' %
         "DD MM YYYY hh mm  "  24   Day     text "$ta"         2  2 '-' %
         " "                   ''   Mon     text "$mo"         2  2 '-' %
         " "                   ''  Year     text "$ja"         4  4 '-' %
         " "                   ''  Hour     text  ""           2  2 '-' %
         " "                   ''   Min     text  ""           2  2 ' ' %
         "              IP  "  24    IP     text "$VBMip"     15  0 ' ' %
         "     User + Pass  "  24  User     text  ""          15 15 '-' %
         " "                   ''  Pass password  ""          15 15 ' ' %
         "      Admin Pass  "  24 AdmPw password  ""          15 15 ' ' %
         "        New Pass  "  24 NewPw password  ""          15 15 ' ' %
         "  AdmLogSize max  "  24 AdmLs     text "$AdmLogSz"   6  6 ' ' %
         "  SysLogSize max  "  24 SysLs     text "$SysLogSz"   4  4 '-'
   do
      case $typ in
      text|password)
        se= [ max -eq 0 ] && max=$siz se='onFocus="this.form.'"$nam"'.blur();"'
        prints s${w}ss$n "$txt" '<input name="'"$nam"'" type="'"$typ"'"' %
               'value="'"$val"'" size="'"$siz"'" maxlength="'"$max"'"'"$se"'>'
      ;;
      checkbox)
        [ val -gt 0 ] && val=checked
        prints s${w}ss$n "$txt" '<input class="butt" name="'"$nam" %
               '" type="'"$typ"'"'" $val>"
      ;;
      esac
   done
   echo '</b></pre></form>'
   print -r '<form action="/cgi/adm.cgi" method="POST" enctype="multipart/form-data">
     <br><center><b><input class="butt" type="SUBMIT" value=" Upload Backup file: ">&nbsp;
     <input class="butt" type="FILE" name="UpLd"
      size="40" maxlength="30000000" accept="*/*">'
   echo '</b></center></form></div><br><tt><font color="#d0d0d0">'
   uname
   echo "- $SERVER_SOFTWARE=$SERVER_ADDR:$SERVER_PORT - $REMOTE_ADDR<br>&nbsp;"
   echo '</font></tt></body></html>'
   return 0
}


#Arg: "req=info&group=" + escape(grp) + "&anl=" + escape(anl);
MkInfoFrameset()  {
   catv Doctype '/<head><title>VBM-MU-Status/Control</title>%n' Meta
   print -r '</head>
   <frameset rows="*,77" bordercolor="#ffd700" border="2">
   <frame name="Info" src="/cgi/main.cgi?'"$1"'"
    scrolling="auto" frameborder="0" marginwidth="0" marginheight="0">
   <frame name="InfoButtons" src="/htm/infobuttons.htm"
    scrolling="no" frameborder="0" marginwidth="30" marginheight="10">
   </frameset>
   <body bgcolor="#39458f" text="#ffd700"
    link="#ffd700" vlink="#ffd700" alink="#39458f">
   <br>&nbsp;
   <h1 align="center">Browser NoFrames!</h1>
   </body>
   </html>'
   return 0
}


# .../eepr
Ee2Muc()  {
   local ft=0000000000 ja=2002 mo=12 ta=31 st=24 mi=60 se=60
   local V=00 v=00 sn=..............................
   Hbuf="$(- extern /bin/date -u +'%A, %e.%b.%Y %X' )"
   fstat -mv ft "$1"
   ctime ja mo ta st mi se $ft
   < "$1"
   catv $((962<<1)),2,0 =ft:
   catv $((965<<1)),16,0 =sn:
   ><
   base -w ft +10 ft
   let "V=ft>>8, v=ft&255"
   base -W sn +w sn
   conv -d sn
   expr "$sn" :: '[^JY0-9.-]' && sn=YY000000-000.000
   prints s-48s- "Konfiguration file MU1000C :" "$RN"
   prints s-48s- "Work.-No.   :  $sn" "$RN"
   prints s50s50s50- "$RN" "$RN" "$RN"
   prints s-48s- "Project     :  VBM" "$RN"
   prints s-48s- "Firmware    :  Version $V.$v" "$RN"
   prints s-48s- "Pfad        :  data.muc" "$RN"
   prints s-48s- "Version :  1.23" "$RN"
   prints s-48s- "Prüfungsdatum: $ta.$mo.$ja $st:$mi" "$RN"
   prints s-48s- "Memo :" "$RN"
   prints s-48s- "VBM created" "$RN"
   prints s-48s- "$Hbuf" "$RN"

   to $((100-13)) repeat
   do
      prints s50- "$RN"
   done
   base -W +w < "$1"
   return 0
}


# kat class "<h3>" "</h3>" ["titel"]
MkStatTbl()  {
   local kat=00000 num=00000 typ=00000 nam:.20 inh:.200
   echo "<div class=%"$2%">"
   [ "0${#5}" -gt 0 ] && echo "<h1><u>$5</u></h1>"
   [ $1 -gt 1 ] && echo "<pre><b>%c"
   while read kat num typ nam inh
   do
      #[ "$kat" != "$1" ] && break
      conv '-t` '"$Tconv" nam inh
      expr "$nam" :nam '<' += '&lt;'
      expr "$inh" :inh '<' += '&lt;'
      [ "$nam" != - ] && nam="$nam  "
      [ "$nam" == - ] && nam=
      expr "$typ" :: 't' && catv '/<ul>%n'
      expr "$typ" :: 'n' && catv /%n
      catv ".$3" nam inh ".$4" /%n
      expr "$typ" :: 'N' && catv /%n
      expr "$typ" :: 'T' && catv '/</ul>%n'
   done
   [ $1 -gt 1 ] && echo '</b></pre>'
   [ $1 -eq 1 ] && echo '<form><b><input class="butt" type="button" value="Back" onClick="window.back();"></b></form>%c'
   echo "</div>"
   return 0
}


# .../stat
MkStatHtm()  {
   base -10 Tconv +b Tconv
   local n=000 class=stat1 fa='<h3>' fb='</h3>'
   local title=........................................
   catv Doctype '/<head><title>MU-Status</title>%n' Meta
   print -r '</head><body class="main">'
   for n to 20 repeat
   do
      ifset TblTitle$n || break
      title="$TblTitle[n]"
      [ "$title" == '-' ] && continue
      [ "$title" == ' ' ] && title=
      class=stat fa= fb=
      [ n -eq 1 ] && class=stat1 fa='<h3>' fb='</h3>'
      grep "^$n"'[ %t]' $1 | MkStatTbl $n $class "$fa" "$fb" "$title"
   done
   echo '</body></html>'
   return 0
}


XmsgExit()  {
   RxTxMsg="FAIL: $1" Uvars RxTxMsg
   echo "Status: 204 No Content%n"
   exit 0
   return 0
}


# "dir=adir&pass=pw&act=call|quit"
CallSys()  {
   local pw:9.16 nam=.......... adir=....................
   local iph=..............................  ipw=....................
   RxTxRun || {
      [ MUcall -ne 0 ] && MUcall=00 Uvars MUcall
      [ RxTxAuto -gt 0 ] && {
         [ -e ../tmp/rxtx ] && remove ../tmp/rxtx
         extern ../adm/rxtx.bish
         XmsgExit "RxTx process still not running."
      }
      XmsgExit "RxTx process not running."
   }
   RxTxMsg="RXTX:" Uvars RxTxMsg
   Hbuf="$1"
   conv '-t& ' Hbuf
   for Hbuf in $Hbuf
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        dir)   adir="$Hbuf" ;;
        pass)  pw="$Hbuf" ;;
        act)
           [ "$Hbuf" == quit ] && {
              [ MUcall -gt 0 -a MUcall -le 9 ] && MUcall=-1 Uvars MUcall
              return 0
           }
           [ MUcall -gt 0 -a MUcall -le 9 -o MUcall -lt 0 %
             -o MUcall -ge 30 -a MUcall -le 39 ] && XmsgExit ""
           GetIval Hbuf $Fid "$adir" || XmsgExit "Phone number not found."
           iph="$Hbuf"
           CkTelnu "$iph" || XmsgExit "Phone wrong: »$iph«"
           GetIval Hbuf $Pid "$adir" || XmsgExit "Password not found."
           ipw="$Hbuf"
           expr "$pw" :: '^%t%t%t' || {
              expr "$pw" :: '^...' || XmsgExit "Password wrong"
              expr "$ipw" :: '^...' || XmsgExit "iPassword wrong: »$ipw«"
              catv ipw | extern ./mailcode -dns -c "$MC64" | catv 0 =ipw:
              cmpv ipw pw || XmsgExit "Password does not match"
              MUcall=02
           }
           MUdir=$adir Uvars MUdir
           Telnu=$iph Uvars Telnu
           [ MUcall -ne 2 ] && MUcall=01
           Uvars MUcall
        ;;
      esac
   done
   return 0
}


MkCtlhHtm()  {
   local code="$MUcall" msg:.50
   msg=STAT
   #[ code -ge 30                ] && msg=STAT
   [ code -ge 20 -a code -le 29 ] && msg=FAIL #MUcall=00 Uvars MUcall
   #[ code -ge 10 -a code -le 19 ] && msg=STAT
   [ code -ge 11 -a code -le 12 ] && msg=OKAY
   #[ code -gt  0 -a code -le  9 ] && msg=STAT
   #[ code -eq  0                ] && msg=STAT
   #[ code -lt  0                ] && msg=STAT
   let "code+=0"
   case "$code" in
     -1)  msg="$msg: [$code] User quit.";;
      0)  msg="$msg: [$code] Default state.";;
     11)  msg="$msg: [$code] RxTx got data.";;
     12)  msg="$msg: [$code] RxTx configured.";;
     16)  msg="$msg: [$code] Connection tested.";;
     17)  msg="$msg: [$code] Modem initialized.";;
     18)  msg="$msg: [$code] Data received.";;
     20)  msg="$msg: [$code] RxTx error.";;
     21)  msg="$msg: [$code] RxTx get data failed.";;
     22)  msg="$msg: [$code] RxTx config failed.";;
     26)  msg="$msg: [$code] Connect test failed.";;
     28)  msg="$msg: [$code] Dial in failed.";;
     29)  msg="$msg: [$code] RING event broken.";;
     30)  msg="$msg: [$code] RxTx daemon exited.";;
     36)  msg="$msg: [$code] Testing connection.";;
     37)  msg="$msg: [$code] Modem initialization.";;
     38)  msg="$msg: [$code] Incoming call.";;
     39)  msg="$msg: [$code] RING event.";;
      *)  msg="$msg: RxTx code: »$code«";;
   esac
   expr "$RxTxMsg" :: '^FAIL:' && {
      catv .FAIL =msg
      [ "$RxTxMsg" != "FAIL: " ] && msg="$RxTxMsg"
      RxTxMsg="RXTX:" Uvars RxTxMsg
   }

   print -r '<html><head><title></title></head><body><form>
   <input name="CtlhInp" type="hidden" value="'"$msg"'">
   </form><script language="JavaScript" type="text/javascript">
     parent.frames[0].focus();
   </script></body></html>'
   return 0
}


#Arg: "req=ctl&group=" + escape(grp) + "&anl=" + escape(anl);
MkCtlFrameset()  {
   catv Doctype '/<head><title>VBM System-Directory</title>%n' Meta
   print -r '</head>
   <frameset cols="100%,*" bordercolor="#d0d0d0" border="0">
   <frame name="Ctlv" src="/cgi/main.cgi?'"$1"'"
    scrolling="auto" frameborder="0" marginwidth="0" marginheight="0">
   <frame name="Ctlh" src="/cgi/main.cgi?req=ctlh"
    scrolling="no" frameborder="0" marginwidth="0" marginheight="0">
   </frameset>
   <body bgcolor="#39458f" text="#ffd700"
    link="#ffd700" vlink="#ffd700" alink="#39458f">
   <br>&nbsp;
   <h1 align="center">Browser NoFrames!</h1>
   </body>
   </html>'
   return 0
}


# "dir|file=obj grp=ggg anl=sss act=aaa"
CtlAction()  {
   local id=0000 nam=.......... obj=..............................
   local gid=0000 grp=$obj$obj anl=$obj$obj adir=$obj
   for Hbuf in $1
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        dir)   obj="$Hbuf" adir="$obj"
               [ -d "$obj" ] || PutErrHtm "Directory not found: »$obj«" ;;
        file)  obj="$Hbuf" expr "$obj" :adir '/[^/]%{1,}$' = '' ;;
        grp)   grp="$Hbuf" ;;
        anl)   anl="$Hbuf" ;;
        act)
           case "$Hbuf" in
             delete)
                   expr "$obj" :id '%([0-9]*%)$'
                   expr "$obj" :Hbuf '[0-9]*$' = $Fali
                   grep -v "^$id " $Hbuf | cat > $Hbuf
                   extern rm -rf $obj
                   WrLog "System:$obj [$grp : $anl]" "removed"
                   expr "$obj" :gid '%([0-9]*%)/[0-9]*$'
                   grep -v "^$gid $id " $Fstation | cat > $Fstation
                   [ CTbuild -eq 0 ] && CTbuild=1 Uvars CTbuild
                   [ -s $Hbuf ] && break
                   expr "$obj" :Hbuf '[0-9]*/[0-9]*$' = $Fali
                   grep -v "^$gid " $Hbuf | cat > $Hbuf
                   expr "$obj" :Hbuf '/[0-9]*$' = ''
                   extern rm -rf $Hbuf
                   WrLog "Group:$Hbuf [$grp]" "removed"
             ;;
             del)  [ -f "$obj" ] || PutErrHtm "File not found: »$obj«"
                   remove -s $obj
                   expr "$obj" :: '/conn$' &&
                      [ CTbuild -ne 1 ] && CTbuild=1 Uvars CTbuild
                   echo "Content-type: text/html%n"
                   MkCtlHtm "$grp" "$anl" "$adir"
                   return 0 ;;
             set)  : > $obj
                   [ -f "$obj" ] || PutErrHtm "File not found: »$obj«"
                   echo "Content-type: text/html%n"
                   MkCtlHtm "$grp" "$anl" "$adir"
                   return 0 ;;
             stat) echo "Content-type: text/html%n"
                   MkStatHtm $obj
                   return 0 ;;
             log)  echo "Content-type: text/html%n"
                   PutTxt2Htm $obj
                   return 0 ;;
             src)  echo "Content-type: text/plain%n"
                   cat $obj
                   return 0 ;;
             down) echo "Content-type: application/octet-stream%n"
                   Ee2Muc $obj
                   return 0 ;;
           esac
        ;;
      esac
   done
   echo "Status: 204 No Content%n"
   return 0
}


# $file
PutFileDate()  {
   [ -f "$1" ] || { echo "</b>--.--.---- --:--   -----<b>%c"; return 0; }
   local ft=0000000000 sz=0000000000 ja=2002 mo=12 ta=31 st=24 mi=60 se=60
   fstat -msv ft sz "$1"
   ctime ja mo ta st mi se $ft
   catv ta /. mo /. ja '/ ' st /: mi
   prints s8- $sz
   ft=1 [ sz -gt 0 ] && ft=2
   return $ft
}

#  extern date +' %A, %e. %B %Y %X %Z   KW%V  TJ%j'

# "$Grp" "$Anl" $Adir
MkCtlHtm()  {
   [ -d "$3"   ] || PutErrHtm nohdr "Directory not found: »$3«"
   [ -f "$3/i" ] || PutErrHtm nohdr "File not found: »$3/i«"
   local exist=1 iv=0 s=00 titel=.............................. script=........
   local file=$titel act=........ action=$titel titel0=starttitel
   local grp=$titel$titel anl=$titel$titel gid=0000 aid=0000
   expr "$3" :aid '%([0-9]%{1,}%)$'
   expr "$3" :gid '%([0-9]%{1,}%)/[0-9]%{1,}$'
   catv Doctype '/<head><title>VBM-MU-Status/Control</title>%n' Meta
   echo '<script language="JavaScript" src="/js/help.js" type="text/javascript">
         </script>
         <script language="JavaScript" src="/js/ctl.js" type="text/javascript">
         </script>'
   print -r '</head>
    <body class="main">
    <div class="dctl"><form><b><font size="+2">'"$1 : $2 &nbsp;&nbsp;"'</font>
    <input class="butt" type="button" value="Delete"
     onClick="DelSys('''"$3"''','''"$1"''','''"$2"''');">
    <input class="butt" type="button" value="Rename"
     onClick="void(prompt(''Rename dummy. Group : System.\r\nDelimiter is » : «'','''"$1 : $2"'''));">
     </b></form>
    '
   extern /bin/date -u +'%A, %e. %b. %Y &nbsp;%X'
   echo '</div><div class="dctlm"><pre><b>%c'
   echo '<center><u>Flags and Files</u></center>%c'
   Hbuf="$1" Escape Hbuf; grp="$Hbuf"
   Hbuf="$2" Escape Hbuf; anl="$Hbuf"
   for 6 titel file act action iv script in %
           FAIL  $3/fail del  Unset    3 main %
           FAIL  $3/fail set  Set      0 main %
           FAIL  $3/fail src  Source   2 main %
           OKAY  $3/okay del  Unset    3 main %
           OKAY  $3/okay set  Set      0 main %
        CFGLOCK  $3/lock del  Unset    3 new  %
        CFGLOCK  $3/lock set  Set      0 new  %
       CONNTEST  $3/conn log  Display  2 main %
       CONNTEST  $3/conn src  Source   2 main %
       CONNTEST  $3/conn del  Delete   3 adm  %
        INFOSET  $3/i    log  Display  2 main %
        INFOSET  $3/i    src  Source   2 main %
          STATE  $3/stat stat Display  2 main %
          STATE  $3/stat src  Source   2 main %
         CONFIG  $3/eepr down Download 2 main %
            LOG  $3/log  log  Display  2 main %
            LOG  $3/log  src  Source   2 main %
            LOG  $3/log  del  Delete   2 new
   do
      Hbuf="$file" Escape Hbuf
      let "s=10-${#action}"
      cmpv titel titel0 || {
         echo %n
         prints s11- "$titel: "
         PutFileDate $file; exist=$?
         echo '   %c'
      }
      if [ exist -eq iv -o iv -eq 3 -a exist -gt 0 ]
      then
         prints ssss$s- '<a class="actl" href="/cgi/'"$script"'.cgi?req=ctlact' %
                        '&file='"$Hbuf"'&grp='"$grp"'&anl='"$anl" %
                        '&act='"$act"'">'"$action"'</a>' ''
      else
         prints   ss$s- '<font color="#b0b0b0">'"$action"'</font>' ''
      fi
      titel0=$titel
   done
   echo '</b></pre></div>
    <div class="dctl"><form><br>Password<b>
    <input name="ConfPass" type="password" value="" size="15" maxlength="15">
    <input class="butt" type="button" value="Call (configure)"
     onClick="CallSys(1,'''"$3"''',this.form.ConfPass.value);">&nbsp;&nbsp;
    <input class="butt" type="button" value="Call (get data)"
     onClick="CallSys(1,'''"$3"''',''\t\t\t'');">
    <a href="javascript:void(LedAction(1))">
    <img name="led" align="middle" src="/img/ledge0.jpg" width="21" height="21"
     hspace="5" vspace="5" border="0"></a>
     <br><br>
    <input class="butt" type="button" value="Compose configuration"'
   [ -s "$3/eepr" ] &&
   echo 'onClick="top.location.href=''/cgi/muee.cgi?eemain.'"$gid.$aid"''';">'
   [ -s "$3/eepr" ] ||
   echo 'onClick="alert(''This system directory contains no config data.'');">'
   echo '&nbsp;&nbsp;&nbsp;
    <input class="butt" type="button" value="Reload"
     onClick="top.location.reload();">
    <input class="butt" type="button" value="Close"
     onClick="top.close();">&nbsp;
    <input class="butt" type="button" value="Help"
     onClick="Help(''#sysctl'');">
    </b></form></div>
    </body></html>'
   return 0
}


# $headtail
PutSysTblTxt()  {
   case "$1" in
     head)
   print -r '
      <table width="100%" border="0" align="center" valign="center"
       bgcolor="#01669a" cellpadding="2" cellspacing="2" cols="4">
   <tr><td width="8%" bgcolor="#01669a" align="center" valign="center">
   <font color="#ff9966" size="-1">State</font>
   </td>
   <td width="33%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <font color="#ff9966" size="-1">System name</font>
   </td>
   <td width="17%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <font color="#ff9966" size="-1">System type</font>
   </td>
   <td width="42%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <font color="#ff9966" size="-1">Site location</font>
   </td></tr></table>
   <font color="#000000"><hr noshade width="100%" size="1"></font>'
     ;;
     tail)
   print -r '
   <br><br><br>
   <font color="#000000" size="-2">
    &gt; Click on state to show system state informations<br>
    &gt; Click on system text to show system informations<br>
   </font>'
     ;;
   esac
   return 0
}


# $f "$ginh" "$ainh" "$tinh" "$oinh"
PutSysTbl()  {
   #<img align="middle" border="0" width="40" height="16" src="/img/red24.gif">
   local ctlhref="javascript:MkWinAnlCtl('$2','$3');"
   local newhref="javascript:MkWinAnlNew('$2','$3');"
   local _3='<font size="-1">'"$3"'</font>'
   local _4='<font size="-1">'"$4"'</font>'
   local _5='<font size="-1">'"$5"'</font>'
   local color='/img/ok.jpg'
   #[ "$1" == '+' ] && color='#00ff00'
   [ "$1" == '!' ] && color='/img/fail.jpg'
   print -r '<tr><td width="8%" bgcolor="#01669a" align="center" valign="center">
   <a class="aanl" href="'"$ctlhref"'">
   <img src="'"$color"'" border="0" width="29" height="32"></a>
   </td>
   <td width="33%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <b><a class="aanl" href="'"$newhref"'">'"&nbsp;$_3&nbsp;"'</a></b>
   </td>
   <td width="17%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <b><a class="aanl" href="'"$newhref"'">'"&nbsp;$_4&nbsp;"'</a></b>
   </td>
   <td width="42%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <b><a class="aanl" href="'"$newhref"'">'"&nbsp;$_5&nbsp;"'</a></b>
   </td></tr>'
   return 0
}


# "$Gdir"
MkAnlHtm()  {
   local ali=$1/$Fali id=0000 fail='&nbsp;' faila=0 ifile=................
   local ginh=........................................
   local ainh=........................................
   local oinh=........................................
   local tinh=........................................
   local gdir="$1"
   [ -z "$1" ] && gdir=.. ali=./null
   [ -d "$gdir"   ] || PutErrHtm nohdr "Directory not found: »$gdir«"
   [ -f "$ali" ] || PutErrHtm nohdr "File not found: »$ali«"
   catv Doctype '/<head><title>VBM SysTable</title>%n' Meta
   print -r %
     '<script language="JavaScript" src="/js/anl.js" type="text/javascript"></script>
      </head><body class="main">'
   PutSysTblTxt head
   print -r %
     '<table width="100%" border="0" align="center" valign="center"
       bgcolor="#01669a" cellpadding="2" cellspacing="2" cols="4">'
   < $ali
   while read id -
   do
      ifile=$gdir/$id/i
      [ -s $ifile ] || continue
      fail='&nbsp;'
      [ -f $gdir/$id/okay ] && fail='+'
      [ -f $gdir/$id/fail ] && fail='!'
      local g=g a=a o=o t=t
      5< $ifile
      while read -u5 id Hbuf && [ -n "$g$a$o$t" ]
      do
         [ id -eq Gid ] && ginh="$Hbuf" unset g
         [ id -eq Aid ] && ainh="$Hbuf" unset a
         [ id -eq Oid ] && oinh="$Hbuf" unset o
         [ id -eq Tid ] && tinh="$Hbuf" unset t
      done
      ><
      PutSysTbl "$fail" "$ginh" "$ainh" "$tinh" "$oinh"
   done
   ><
   [ -z "$1" ] &| expr "$ifile" :: '^%.%.%.' && {
      echo --
      MkGrpArr $Fgrpajs
      Failall=0
      MkGrpArr $Fgrpaejs Err && Failall=1
      Uvars Failall
   }
   print -r '</table>'
   PutSysTblTxt tail
   print -r '
    <script language="JavaScript" type="text/javascript">
     if ('"0$Update"'>0)  parent.frames[2].location.reload();
       window.setTimeout(''parent.frames[2].SetSel("anl"); parent.frames[2].SetSelOpt("'"$ginh"'",'"$Failall"');'',1500);
    </script>
    </body></html>'
   [ Update -ne 0 ] && Update=0 Uvars Update
   return 0
}


#GetInfoZ 5 Hbuf $id
GetInfoZ()  {
   local id=000 s=0
   while read -u$1 id $2
   do
      [ $id == $3 ] && return 0
   done
   seek 0 $1
   while read -u$1 id $2
   do
      [ $id == $3 ] && return 0
   done
   seek 0 $1
   $2=''
   return 1
}


        # function SetGInp(s, g)%
        # {%
        #    var df= "document.FormInfo.";%
        #    eval(df+g).value=%
        #       eval(df+s+".options["+df+s+".selectedIndex]").text;%
        # }%
# typ id len maxlen flg dflt text
# typ id cols rows  flg dflt text
# MkInfoHtm new
# MkInfoHtm exist $Adir/i
MkInfoHtm()  {
   [ -s $Finfobase ] || PutErrHtm nohdr "File not found: »$Finfobase«"
   local n=00 name=........
   local typ=.... id=000 len=00 max=00 flg=...
   local dflt=....................
   local text=...........................................................
   #[ $# -eq 0 -o "$1" == new ] && Hbuf=
   catv Doctype '/<head><title>VBM-MU-Dataset</title>%n' Meta %
        '/<script language="JavaScript" type="text/javascript">%n' %
        '/function GrpSel(sel)  {%n' %
        '/   document.forms[0].I' Gid '/.value=%n' %
        '/      sel.options[sel.selectedIndex].text.slice(2);%n' %
        '/}%n' %
        '/</script>%n' %
        '/</head>%n' %
        '/<body class="main" text="#ffd700">%n' %
        '/<form name="FormInfo" action="/cgi/new.cgi" method="POST">%n' %
        '/<pre><b>%n'
   [ "$1" == exist ] && 5< $2
   < $Finfobase
   while read typ id len max flg dflt text
   do
      ifset typ || continue
      expr "$typ" :: '^#' && continue
      conv '-t` ' text dflt
      [ ${#text} -gt 1 ] && prints sns36s- "" "$text" "  "
      [ "$max" == '=' ] && max=$len
      [ "$max" == '-' ] && let "max=len+len"
      let ++n
      [ "$dflt" == ' ' ] && dflt=
      Hbuf="$dflt"
      [ "$1" == exist ] && {
         GetInfoZ 5 Hbuf $id
         [ id -eq Pid ] && Hbuf="®$Hbuf®"
      }
      case $typ in
        itxt) name=I$id
              catv ".<input name=%"$name%" type=%"TEXT%" value=%"$Hbuf%"" %
                   ". size=%"$len%" maxlength=%"$max%"> "
        ;;
        ptxt) name=P$id
              catv ".<input name=%"$name%" type=%"PASSWORD%" value=%"$Hbuf%"" %
                   ". size=%"$len%" maxlength=%"$max%"> "
        ;;
        wtxt) name=W$id
              conv "-t${CA}${NL}t$ESC$CR"'t` ' Hbuf
              catv ".<textarea name=%"$name%" cols=%"$len%" rows=%"$max%"" %
                   ". wrap=%"soft%">" Hbuf ".</textarea>"
        ;;
      esac
   done
   ><
   [ "$1" == exist ] && ><
   catv '/%n</b></pre></form>%n'
   ifdef Newgrparr &&
   echo '<script language="JavaScript" type="text/javascript">
         window.setTimeout("parent.frames[2].location.reload();", 1500);
         </script>'
   catv '/</body></html>%n'
   return 0
}



. ./functions.bish
catv /%0 =5119,,Hbuf
. ./cvars.bish
#Lock lockuv
. ./uvars.bish
#Lock lockuv del

#mkdirs $Ddb
GetIds  #Gid Aid Oid Pid Fid Tid Iid Sid
VBMip=$SERVER_ADDR
#[ "$VBMip" == 999.888.777.666 ] && {
#   Gdir=$(grep '^[ %t]*[0-9.]%{7,15}[ %t]%{1,}scouw' /etc/hosts) &&
#      expr "$Gdir" :VBMip '%([0-9.]%{7,15}%)' && {
#         VBMip0=$VBMip Uvars VBMip; Uvars VBMip0; }
#}



[ "$REQUEST_METHOD" == GET ] && {
   [ -s $Fgrpajs ] || MkGrpArr $Fgrpajs
   [ -s $Fgrpaejs ] || MkGrpArr $Fgrpaejs Err && nop
   case "$QUERY_STRING" in
     main)
         [ RxTxAuto -gt 0 ] && RxTxRun || {
            [ MUcall -ne 0 ] && MUcall=00 Uvars MUcall
            [ -e ../tmp/rxtx ] && remove ../tmp/rxtx
            extern ../adm/rxtx.bish
            sleep -m 600
            RxTxRun || PutErrHtm "Start of RxTx daemon failed."
         }
         #GetGrpDir first Gdir || { echo "Location: /hlp/help.htm#start%n"; goend; }
         GetGrpDir first Gdir || Gdir=
         echo "Content-type: text/html%n"
         MkAnlHtm "$Gdir"
     ;;
     admin)
         #expr "$REQUEST_URI" :: '/adm.cgi?admin$' || PutErrHtm "Sorry!"
         echo "Content-type: text/html%n"
         MkAdmHtm
     ;;
     req=admact&?*)
         expr "$QUERY_STRING" :Hbuf '^req=admact&%(..*%)$'
         expr "$Hbuf" :Hbuf '&' += ' '
         Lock lockdb
         AdmAction "$Hbuf"
         Lock lockdb del
     ;;
     new)
         echo "Content-type: text/html%n"
         MkInfoHtm new
     ;;
     update)
         MkGrpArr $Fgrpajs
         local _Fail=0
         MkGrpArr $Fgrpaejs Err && _Fail=1
         [ _Fail -ne Failall ] && Failall=$_Fail Uvars Failall
         [ Update -eq 0 ] && Update=1 Uvars Update
         echo "Status: 204 No Content%n"
     ;;
     req=infofset&?*)
         expr "$QUERY_STRING" :Gdir 'req=infofset&' = 'req=info&' || Gdir=GX
         echo "Content-type: text/html%n"
         MkInfoFrameset "$Gdir"
     ;;
     req=info&?*)
         expr "$QUERY_STRING" :Gdir '&group=%([^&=]*%)' || Gdir=GX
         expr "$QUERY_STRING" :Adir '&anl=%([^&=]*%)$' || Adir=AX
         FormConv Gdir
         FormConv Adir
         GetGrpDir get Gdir || PutErrHtm "Not found: »$Gdir«"
         GetAnlDir Adir $Gdir || PutErrHtm "Not found: »$Adir«"
         echo "Content-type: text/html%n"
         MkInfoHtm exist $Adir/i
     ;;
     req=callsys&?*)
         expr "$QUERY_STRING" :Gdir '^req=callsys&%(..*%)$' || Gdir=
         CallSys "$Gdir"
         echo "Status: 204 No Content%n"
     ;;
     req=ctlfset&?*)
         expr "$QUERY_STRING" :Gdir 'req=ctlfset&' = 'req=ctl&' || Gdir=GX
         echo "Content-type: text/html%n"
         MkCtlFrameset "$Gdir"
     ;;
     req=ctlh)
         echo "Content-type: text/html%n"
         MkCtlhHtm
     ;;
     req=ctl&?*)
         expr "$QUERY_STRING" :Gdir '&group=%([^&=]*%)' || Gdir=GX
         expr "$QUERY_STRING" :Adir '&anl=%([^&=]*%)$' || Adir=AX
         FormConv Gdir
         FormConv Adir
         Grp="$Gdir" Anl="$Adir"
         GetGrpDir get Gdir || PutErrHtm "Not found: »$Gdir«"
         GetAnlDir Adir $Gdir || PutErrHtm "Not found: »$Adir«"
         echo "Content-type: text/html%n"
         MkCtlHtm "$Grp" "$Anl" $Adir
     ;;
     req=ctlact&?*)
         expr "$QUERY_STRING" :Hbuf '^req=ctlact&%(..*%)$'
         expr "$Hbuf" :Hbuf '&' += ' '
         Lock lockdb
         CtlAction "$Hbuf"
         Lock lockdb del
     ;;
     selinhaltget=?*)
         expr "$QUERY_STRING" :Hbuf '^[^=]%{1,}=%(..*%)$' || Hbuf=SGX
         FormConv Hbuf
         Gdir="$Hbuf"
         GetGrpDir get Gdir || Gdir=  #PutErrHtm "Not found: »$Hbuf«"
         echo "Content-type: text/html%n"
         MkAnlHtm $Gdir
     ;;
     *)  echo "Status: 205 Reset Content%n" ;;
   esac
   exit 0
}


[ "$REQUEST_METHOD" == POST ] && {
   [ "$CONTENT_LENGTH" -eq 0 ] && PutErrHtm "No content"
   case "$REQUEST_URI" in
     *adm.cgi)
         Lock lockdb
         if expr "$CONTENT_TYPE" =:: 'boundary=.'
         then
            FormAdmBakRead "$CONTENT_LENGTH" || { Gdir=$?
               Lock lockdb del
               PutErrHtm "Backup Upload failed [$Gdir]"
            }
         else
            FormAdmRead "$CONTENT_LENGTH" || echo "Status: 205 Reset Content%n"
         fi
         Lock lockdb del
         echo "Content-type: text/html%n"
         MkAdmHtm
     ;;
     *new.cgi)
         [ "$CONTENT_LENGTH" -gt 5000 ] && PutErrHtm "Content too large"
         Lock lockdb
         FormInfoRead "$CONTENT_LENGTH"
         Lock lockdb del
         echo "Content-type: text/html%n"
         MkInfoHtm exist $Adir/i
     ;;
     *main.cgi)
         PutErrHtm "Sorry!"
     ;;
     *)  echo "Status: 205 Reset Content%n" ;;
   esac
}

exit 0


#HTTP_HOST=www.schellong.com
#HTTP_REFERER=http://www.schellong.com/icnt.htm
#HTTP_USER_AGENT=Mozilla/4.73 [en] (X11; I; SCO_SV 3.2 i386)
#REMOTE_ADDR=193.159.66.48
#REMOTE_HOST=localhost
#SERVER_ADDR=195.20.225.17
#SERVER_NAME=schellong.com
#QUERY_STRING=0.1.i8x12.l0.d5.b000000.fffffff.r0
#REQUEST_METHOD=POST
#REQUEST_URI=.../new.cgi?new
#CONTENT_LENGTH=12345
#CONTENT_TYPE=x/y
#Location: url
#Status: 204 No Content
#Status: 205 Reset Content
#Status: 413 Request Entidy Too Large
#"Content-type: application/zip%n"
#"Content-type: application/x-tar%n"

#  <a class="elf" href="javascript:alert(''*** ALARM ***'');">alert()</a>
#  <a class="elf" href="javascript:void(confirm(''Wenn ja, dann nein! Oder vielleicht doch?''));">confirm()</a>
#  <a class="elf" href="javascript:void(prompt(''Was eingeben - aber prompt!'',''Dödel''));">prompt()</a>


###  bizcie.cgi  #############################################

#!./bish_folso_cgi -p

set -f

HTMa='<html>
<head>
<title>Downloads selotronic.schellong.biz</title>
</head>
<body>
<br><br>
<pre><b>
'
HTMb='
</b></pre>
</body>
</html>
'

# $file
PutFileSzDateName()  {
   local ft=0000000000 sz=0000000000 ja=2002 mo=12 ta=31 st=24 mi=60 se=60
   fstat -msv ft sz "$1"
   ctime ja mo ta st mi se $ft
   prints s10- $sz
   catv "/  " ta /. mo /. ja '/ ' st /: mi "/  "
   return 0
}


dir="$DOCUMENT_ROOT/cie"

catv 20,0 =KW:
expr "$KW" :KW '^[^=]%{1,}=%(.*%)' || KW=0
[ "$KW" == selotronik -o "$KW" == selo ] || {
   echo "Status: 204 No Content%n"
   exit 0
}
catv "/Content-type: text/html%n%n" HTMa

for F in $( list -f $dir | sortl )
do
   print -n "        "
   PutFileSzDateName "$dir/$F"
   print -rn '<a href="http://selotronic.schellong.biz/'"$F%">"
   echo "$F"'</a>'
done

catv HTMb

exit 0





###  cie.cgi  #############################################

#!./bish_folso_cgi
#!/u/bin/bish

#HTTP_HOST=www.schellong.com
#HTTP_REFERER=http://www.schellong.com/icnt.htm
#HTTP_USER_AGENT=Mozilla/4.73 [en] (X11; I; SCO_SV 3.2 i386)
#REMOTE_ADDR=193.159.66.48
#REMOTE_HOST=localhost
#SERVER_ADDR=195.20.225.17
#SERVER_NAME=schellong.com
#QUERY_STRING=0.1.i8x12.l0.d5.b000000.fffffff.r0
#REQUEST_METHOD=POST
#CONTENT_LENGTH=12345
#CONTENT_TYPE=x/y

html0='<HTML>
<HEAD>
   <TITLE>repeat</TITLE>
   <META NAME="Author" CONTENT="Helmut Schellong">
</HEAD>
<frameset cols="17%,83%" bordercolor="#ffff00" border="10" frameborder="10" framespacing="0">
<frame name="links" frameborder="10" marginwidth="10" marginheight="30" src="cie.cgi?l">
<frameset rows="70%,30%" bordercolor="#ffff00" border="10" frameborder="10" framespacing="0">
<frame name="roben" frameborder="10" scrolling="yes" src="cie.cgi?ro">
<frame name="runten" frameborder="10" marginwidth="15" marginheight="15" src="cie.cgi?ru">
</frameset>
</frameset>
<BODY TEXT="#000000" BGCOLOR="#CDAA7D" LINK="#4F94CD" VLINK="#36648B" ALINK="#FFD700">

<h1 align="center"><br><br>
<a href="cie.cgi?nof" target="_top">NoFrames-Version</a>
</h1>

</BODY>
</HTML>
'

htmlRO='<HTML>
<HEAD>
   <TITLE>repeat_sec</TITLE>
   <META NAME="Author" CONTENT="Helmut Schellong">
   <META HTTP-EQUIV="refresh" CONTENT="~sec~">
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#eeeee0" LINK="#4F94CD" VLINK="#36648B" ALINK="#FFD700">
<br><br>
<br><br>
<hr width="90%" size="4" noshade align="center">
<h2 align="center">~date~</h2>
<hr width="90%" size="4" noshade align="center">
<center>
<table bgcolor="#~bgcolor~" width="28%" cellpadding="8" border="3" align="center" valign="center">
<tr><td align="center" valign="center">
<font color="#ffffff">
<h4>~oldcnt~</h4>
<h1>~newcnt~</h1>
</font>
</td><td bgcolor="#000000">
<table width="77" height="44" border="0" cellspacing="6" cellpadding=0>
<tr><td bgcolor="#~bgc1~" width="15" height="15">&nbsp;</td>
<td bgcolor="#~bgc2~" width="15" height="15">&nbsp;</td>
<td bgcolor="#~bgc1~" rowspan="2" width="15" height="36" align="center" valign="center"><font color="#ffffff"><b>B<br>2</b></font></td></tr>
<tr><td bgcolor="#~bgc3~" width="15" height="15">&nbsp;</td>
<td bgcolor="#~bgc4~" width="15" height="15">&nbsp;</td></tr>
</table>
</td></tr></table>
</center>
<hr width="90%" size="4" noshade align="center">

</BODY>
</HTML>
'

htmlL='<HTML>
<HEAD>
   <TITLE>repeat_sec</TITLE>
</HEAD>
<BODY TEXT="#ffffff" BGCOLOR="#cdaa7d" LINK="#4F94CD" VLINK="#36648B" ALINK="#FFD700">
<h2 align="center">
<p>Sekunden</p>
<a href="cie.cgi?2">2</a><br>
<a href="cie.cgi?3">3</a><br>
<a href="cie.cgi?4">4</a><br>
<a href="cie.cgi?5">5</a><br>
<a href="cie.cgi?7">7</a><br>
<a href="cie.cgi?10">10</a><br>
<a href="cie.cgi?30">30</a><br>
<a href="cie.cgi?60">60</a><br>
<a href="cie.cgi?300">300</a><br>
</h2>
</BODY>
</HTML>
'

htmlRU='<HTML>
<HEAD>
   <TITLE>repeat_sec</TITLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#dddddd" LINK="#4F94CD" VLINK="#36648B" ALINK="#FFD700">
<h3 align="justify">
Images, Java und JavaScript sind abschaltbar, deshalb
ist diese Demo ohne Grafiken und ohne JavaScript konstruiert.
Die kleinen Tabellenspalten ändern sich in Abhängigkeit der
Sekunden der Uhrzeit.
Die Farbe der großen Tabelle geht auf ROT, wenn sich der
globale Zählerstand meiner WebSite geändert hat.
Es wird nur der Rahmen rechts oben zyklisch geladen.
</h3>
</BODY>
</HTML>
'

htmlE='<HTML> <HEAD> <TITLE>ERROR</TITLE> </HEAD>
<BODY TEXT="#ffffff" BGCOLOR="#ffff00">
<h1 align="center">*** ERROR ***</h1>
</BODY> </HTML>
'

set -f
tz -2
TZ='CET-1CETDST,M3.5.0/2,M10.5.0/2'
export TZ

arg="$QUERY_STRING"
deroot="$DOCUMENT_ROOT/de"
expr "$deroot" :deroot '/de/de' '/de'


ok=0 sec=4
expr "$arg" :: '^l$' && ok=l
expr "$arg" :: '^ro$' && ok=ro
expr "$arg" :: '^ru$' && ok=ru
expr "$arg" :: '^nof$' && ok=nof
expr "$arg" :sec '^%([1-9][0-9]%{0,2%}%)$' && ok=1
ifset arg || ok=start
# Input ist x-www-form-urlencoded

datf="$deroot/tmp/count.dat"
secf="$deroot/tmp/ciesec.dat"
cntf="$deroot/tmp/ciecnt.dat"

#expr "$HTTP_HOST" :: 'localhost' && {
#   expr "$html0" :html0 'www%.schellong%.com' += 'localhost'
#   expr "$htmlRO" :htmlRO 'www%.schellong%.com' += 'localhost'
#   expr "$htmlL" :htmlL 'www%.schellong%.com' += 'localhost'
#}

echo "Content-type: text/html%n"

case "$ok" in
   start)  catv html0 ;;
   l)      catv htmlL ;;
   1)      catv sec > $secf; catv htmlL ;;
   ru)     catv htmlRU ;;
   ro|nof)
      date="$( extern /bin/date +' %A, %e. %B %Y %X %Z   KW%V  TJ%j' )"
      [ -s $secf ] && catv 3,0 =sec: < $secf
      newcnt=22222
      oldcnt=$newcnt
      [ -s $cntf ] && catv 10,0 =oldcnt: < $cntf
      [ -s $datf ] && {
         catv 4,0 =newcnt: < $datf
         base -L newcnt +10 newcnt
         catv newcnt > $cntf
      }
      expr "$date" :sek ':%([0-9][0-9]%) '
      bgc1=ff0000 bgc2=00ff00 bgc3=ffff00 bgc4=0000ff
      let "sek&1" && bgc1=0000ff bgc4=ff0000
      let "sek&7" || bgc2=00ddff
      let "sek>35" && bgc3=808080
      bgcolor=0000ff
      let "newcnt!=oldcnt" && bgcolor=ff0000
      for xy in  sec date bgcolor oldcnt newcnt %
		 bgc1 bgc2 bgc3 bgc4
      do
         expr "$htmlRO" :htmlRO "~$xy~" += "${{xy}"
      done
      catv htmlRO
   ;;
   *)      catv htmlE ;;
esac

exit 0





###  coltab.cgi  #############################################

#!./bish_folso_cgi
#!/u/bin/bish

arg="$QUERY_STRING"
doc=$DOCUMENT_ROOT/de/coltaB.htm
expr "$doc" :doc '/de/de/' '/de/'
echo "Content-type: text/html%n"
d='[0-9]'
d13='[0-9]%{1,3%}'

expr "$arg" :: %
   "^[mp]-$d%%{1,2%%}-[a-z]%%{3,5%%}-$d13-$d13-$d13%$" || {
   exit 0
}

conv -t'- ' arg
for  6  pm inc col r g b  in  $arg ; do  done
[ $pm == m ] && inc=-$inc
[ $col == red   ] && let r+=inc
[ $col == green ] && let g+=inc
[ $col == blue  ] && let b+=inc
let "r<0" && r=0
let "g<0" && g=0
let "b<0" && b=0
((r>255)) && r=255
((g>255)) && g=255
((b>255)) && b=255
R=$r G=$g B=$b
prints vsf02sf02sf02 col $((16#,r)) $((16#,g)) $((16#,b))
conv -u col

< $doc
while readl Z
do
   expr "$Z" :Z "$d13,$d13,$d13;%%(..*%%)#[0-9a-fA-F]%%{6%%}" %
     "$R,$G,$B;%%1#$col" && print -r "$Z" && break
   print -r "$Z"
done
while readl Z
do
   expr "$Z" =:: '<table .* bgcolor *= *"#[0-9a-fA-F]%{6%}"' &&
     expr "$Z" =:Z '%( bgcolor *= *"#%)......' "%%1$col" &&
       print -r "$Z" && break
   print -r "$Z"
done
while readl Z
do
   expr "$Z" :: "[mp]-$d%%{1,2%%}-[a-z]%%{3,5%%}-$d13-$d13-$d13" &&
     expr "$Z" :Z '%(-[a-z]%{3,5%}%)'"-$d13-$d13-$d13" + %
     "%%1-$R-$G-$B" &&
     expr "$Z" :Z '"[^"?]*/%([^/"?]%{1,%}?[^?"]%{1,%}"%)' + '"%1'
   print -r "$Z"
done
><
expr "$REMOTE_ADDR" :: '127%.0%.0%.' || exec ./icnt.cgi 99.20.i0
exit 0



###  dati.cgi  #############################################

#!./bish_folso_cgi
#!/u/bin/bish

#HTTP_HOST=www.schellong.com
#HTTP_REFERER=http://www.schellong.com/icnt.htm
#HTTP_USER_AGENT=Mozilla/4.73 [en] (X11; I; SCO_SV 3.2 i386)
#REMOTE_ADDR=193.159.66.48
#REMOTE_HOST=localhost
#SERVER_ADDR=195.20.225.17
#SERVER_NAME=schellong.com
#QUERY_STRING=0.1.i8x12.l0.d5.b000000.fffffff.r0
#REQUEST_METHOD=POST
#CONTENT_LENGTH=12345
#CONTENT_TYPE=x/y


js1='var vdati= "Datum+Zeit";
var ldati= vdati;
var DHTM=0, DOM=0, MS=0, NS=0, OP=0;
function fdati()
{
   parent.frames[1].document.forms[0].submit();
   vdati= parent.frames[1].document.forms[0].dati.value;
   ldati= ''<center><font color="#0000ff" size="+2"><b>'' + vdati + ''</b></font></center>'';
   if (window.opera)  OP=1;
   if (document.getElementById)  DOM=1, DHTM=1;
   if (!OP && document.all)  MS=1, DHTM=1;
   if (!OP && document.layers)  NS=1, DHTM=1;

   if (DOM)
     document.getElementById("divdati").firstChild.nodeValue= vdati;
   else
   if (MS)  document.all.divdati.innerTEXT= vdati;
   else
   if (NS)  {
     document.laydati.document.open();
     document.laydati.document.write(ldati);
     document.laydati.document.close();
   }
   window.setTimeout("fdati()", 9000);
}
/*function fsubm()*/
/*{*/
   /*parent.frames[1].document.forms[0].submit();*/
   /*window.setTimeout("fsubm()", 9000);*/
/*}*/
'
js2='window.setTimeout("fdati()", 800);
/*window.setTimeout("fsubm()", 9000);*/
'

#  <META HTTP-EQUIV="refresh" CONTENT="9">
htmlU='<HTML>
<HEAD>
   <TITLE></TITLE>
</HEAD>
<BODY TEXT="#ffffff" BGCOLOR="#eeeeee" LINK="#4F94CD" VLINK="#36648B" ALINK="#FFD700">
<form name="form_dati" action="/de/cgi/dati.cgi" method="POST">
<input type="HIDDEN" name="dati" value="~dati~" maxlength="80">
</form>
</BODY>
</HTML>
'

set -f
tz -2
TZ='CET-1CETDST,M3.5.0/2,M10.5.0/2'
export TZ
prints vs1000 html

arg="$QUERY_STRING"
deroot="$DOCUMENT_ROOT/de"
expr "$deroot" :deroot '/de/de' '/de'


ok=0
expr "$arg" :: '^u$' && ok=u
expr "$arg" :: '^nof$' && ok=nof
expr "$arg" :: '^c1$' && ok=c1
expr "$arg" :: '^c2$' && ok=c2
ifset arg || ok=start
[ "$REQUEST_METHOD" == POST ] && ok=u
# Input ist x-www-form-urlencoded

[ "$ok" == c1 -o "$ok" == c2 ] && echo "Content-type: text/javascript%n"
[ "$ok" != c1 -a "$ok" != c2 ] && echo "Content-type: text/html%n"

case "$ok" in
   u)
      date="$( extern /bin/date +' %A, %e. %B %Y %X %Z   KW%V  TJ%j' )"
      expr "$htmlU" :html '~dati~' = "$date"
      catv html
   ;;
   c1)     catv js1 ;;
   c2)     catv js2 ;;
esac

exit 0





###  dati0.cgi  #############################################

#!/u/bin/bish
#!./bish_folso_cgi

#HTTP_HOST=www.schellong.com
#HTTP_REFERER=http://www.schellong.com/icnt.htm
#HTTP_USER_AGENT=Mozilla/4.73 [en] (X11; I; SCO_SV 3.2 i386)
#REMOTE_ADDR=193.159.66.48
#REMOTE_HOST=localhost
#SERVER_ADDR=195.20.225.17
#SERVER_NAME=schellong.com
#QUERY_STRING=0.1.i8x12.l0.d5.b000000.fffffff.r0
#REQUEST_METHOD=POST
#CONTENT_LENGTH=12345
#CONTENT_TYPE=x/y

html0='<HTML>
<HEAD>
   <TITLE>repeat</TITLE>
   <META NAME="Author" CONTENT="Helmut Schellong">
</HEAD>
<frameset cols="100%,*" border="0" frameborder="0" framespacing="0">
<frame name="oben" src="Dati0.cgi?o" scrolling="yes" frameborder="0" marginwidth="0" marginheight="0">
<frame name="unten" src="Dati0.cgi?u" scrolling="no" frameborder="0" marginwidth="0" marginheight="0">
</frameset>
<BODY TEXT="#000000" BGCOLOR="#CDAA7D" LINK="#4F94CD" VLINK="#36648B" ALINK="#FFD700">

<h1 align="center"><br><br>
<a href="Dati0.cgi?nof" target="_top">NoFrames-Version</a>
</h1>

</BODY>
</HTML>
'

js1='var vdati= "Datum+Zeit";
var col= ''<font color="#0000FF">''
function fdati()
{
   parent.frames[1].document.forms[0].submit();
   vdati= col +''<h2 align="center">''+ parent.frames[1].document.forms[0].dati.value +"</h2></font>";
   if (document.layers)  {
     document.nsdati.document.open();
     document.nsdati.document.write(vdati);
     document.nsdati.document.close();
   }
   if (document.all)  {
     document.all.iedati.innerHTML= vdati;
   }
   window.setTimeout("fdati()", 9000);
}
/*function fsubm()*/
/*{*/
   /*parent.frames[1].document.forms[0].submit();*/
   /*window.setTimeout("fsubm()", 9000);*/
/*}*/
'
js2='window.setTimeout("fdati()", 800);
/*window.setTimeout("fsubm()", 9000);*/
'

htmlO='<HTML>
<HEAD>
   <TITLE>repeat_sec</TITLE>
   <META NAME="Author" CONTENT="Helmut Schellong">
<script language="JavaScript1.2" src="Dati0.cgi?c1" type="text/javascript"></script>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#cdaa7d" LINK="#4F94CD" VLINK="#36648B" ALINK="#FFD700">

<div id="iedati"></div><layer id="nsdati"></layer>
<script language="JavaScript1.2" src="Dati0.cgi?c2" type="text/javascript"></script>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>
X<br>

</BODY>
</HTML>
'

#  <META HTTP-EQUIV="refresh" CONTENT="9">
htmlU='<HTML>
<HEAD>
   <TITLE></TITLE>
</HEAD>
<BODY TEXT="#ffffff" BGCOLOR="#eeeeee" LINK="#4F94CD" VLINK="#36648B" ALINK="#FFD700">
<form name="form_dati" action="Dati0.cgi" method="POST">
<input type="HIDDEN" name="dati" value="~dati~" maxlength="80">
</form>
</BODY>
</HTML>
'

set -f
tz -2
TZ='CET-1CETDST,M3.5.0/2,M10.5.0/2'
export TZ
prints vs1000 html

arg="$QUERY_STRING"
deroot="$DOCUMENT_ROOT/de"
expr "$deroot" :deroot '/de/de' '/de'


ok=0
expr "$arg" :: '^o$' && ok=o
expr "$arg" :: '^u$' && ok=u
expr "$arg" :: '^nof$' && ok=nof
expr "$arg" :: '^c1$' && ok=c1
expr "$arg" :: '^c2$' && ok=c2
ifset arg || ok=start
[ "$REQUEST_METHOD" == POST ] && ok=u
# Input ist x-www-form-urlencoded

[ "$ok" == c1 -o "$ok" == c2 ] && echo "Content-type: text/javascript%n"
[ "$ok" != c1 -a "$ok" != c2 ] && echo "Content-type: text/html%n"

case "$ok" in
   start)  catv html0 ;;
   o)      catv htmlO ;;
   u|nof)
      date="$( extern /bin/date +' %A, %e. %B %Y %X %Z   KW%V  TJ%j' )"
      expr "$htmlU" :html '~dati~' = "$date"
      catv html
   ;;
   c1)     catv js1 ;;
   c2)     catv js2 ;;
esac

exit 0





###  eepr.cgi  #############################################

#!./bish_folso_cgi -p_

. ./functions.bish
. ./cvars.bish
#Lock lockuv
. ./uvars.bish
#Lock lockuv del
prints vs70 Nn
catv /%0 =2047,,Hbuf
. ./initee.bish

#bin Var: adr typ wlen dst dsteye dflt1 mi1 ma1 dflt2 mi2 ma2 dfltbm flg unit nam txt
# 1  2    3   4   5    6   7      8     9   10  11    12  13  14     15  16   17  18
EEconvertTxt()  {
   local b=10 len=00000 blen=00$5 dflt="$8" min="$9" max="${10}"
   EEmin=''
   let "blen<<=1"
   len=$blen
   [ MUspsw -eq 1 -a "${11}" != '"' ] && dflt="${11}"
   [ MUspsw -eq 1 -a "${12}" != '"' ] && min="${12}" max="${13}"
   [ MUspsw -eq 2 -a "${14}" != '"' ] && dflt="${14}"
   case $6 in
     x)  b=16 ;;
     b)  b=2 ;;
   esac
   [ $7 == b ] && b=2
   case $4 in
     w)  base -w $2 +$b $2
         [ $6 == i -a $2 -gt 32767 ] && let "$2-=65536" ;;
     L)  base -L $2 +$b $2 ;;
     S)  base -W $2 +w $2
         [ $6 == 0 ] && $2="${{2}" let "--len"
         [ $6 == m ] && expr "${{2}" :$2 ' %{1,}$' = ''
         InputLen=$len
         return 0 ;;
   esac
   if [ $max != '"' ]
   then
      len=${#max}
      [ ${#min} -gt len ] && len=${#min}
      [ $6 == x -a $7 == b ] && let "len<<=2"
      [ b -ne 10 ] && goend
      local v=........
      EEmin=$min EEmax=$max EEdflt=$dflt
      for v in EEmin EEmax EEdflt
      do
         case $7 in
           .1)  expr "${{v}" :$v '.$'   '.&' ;;
           .2)  let "${{#v}==1" && $v="${{v}0"
                expr "${{v}" :$v '..$'   '.&' ;;
            1)  let "$v/=10" ;;
            m)  let "$v/=60" ;;
            =)  ;;
            *)  EEmin='' goend 2 ;;
         esac
         expr "${{v}" :: '^%.' && $v="0${{v}"
      done
   else
      case $b in
        16)  let "len<<=1";;
         2)  let "len<<=3";;
        10)  len=${#dflt};;
      esac
   fi
   [ b -ne 10 ] && prints vsf0$len $2 "${{2}"
   case $7 in
     .1)  let "++len"; expr "${{2}" :$2 '.$'   '.&' ;;
     .2)  let "++len, ${{#2}==1" && $2="${{2}0"
          expr "${{2}" :$2 '..$'   '.&' ;;
      1)  let "--len, $2/=10" ;;
      m)  let "--len, $2/=60" ;;
      b)  ;;
      a)  let "$2=512-$2"; len=4 ;;
     bb)  let "b=$2&255, $2>>=8"
          prints vssf02 $2 ${{2}. $b
          len="${{#2}" ;;
      J)  let "$2<100" && let "$2+=2000"
          let "$2>2079" && let "$2-=100"
          len=4 ;;
   esac
   expr "${{2}" :: '^%.' && $2="0${{2}" #let "++len"
   [ $6 == i ] && expr "${{2}" :: '^[-+]' || let "++len"
   InputLen=$len
   return 0
}


#eye var:$VAL adr typ wlen dst dsteye dflt1 mi1 ma1 dflt2 mi2 ma2 dfltbm flg unit nam txt
# 1  2        3   4   5    6   7      8     9   10  11    12  13  14     15  16   17  18
EEconvertEye()  {
   [ $15 == ro ] && return 1
   local var=........ val="$2" _7=$7
   local b=10 len=000 blen=00$5
   let "blen<<=1, len=blen-1"
   expr "$2" :var '^%([^:]%{1,}%):'
   expr "$val" :val '^[^:]%{1,}:' = ''
   [ $7 == .1 -o $7 == .2 -o $7 == 1 -o $7 == m -o $7 == a -o $7 == J ] &&
      expr "$val" :val '[^0-9-]' += ''
   [ $7 == = -a $4 != S ] && _7=$6
   case $_7 in
     u)  expr "$val" :val '[^0-9]' += '' ;;
     i)  expr "$val" :val '[^0-9-]' += '' ;;
     b)  expr "$val" :val '[^01]' += ''
         b=2 ;;
     x)  expr "$val" :val '[^0-9a-fA-F]' += ''
         b=16 ;;
     1)  let "val*=10" ;;
     m)  let "val*=60" ;;
     a)  let "val=512-val" ;;
    bb)  expr "$val" :val '%(%d%.%d%{1,2}%)'
         expr "$val" :val '%(%d%)%.%(%d%{1,2}%)'   '(%1<<8)+%2'
         let "val=$val" ;;
     J)  let "val-=1900, val>=100" && let "val-=100"
         let "val<0" && val=80
         let "val>99" && val=79 ;;
   esac
   case $4 in
     w)  base -$b val +w $var; return 0 ;;
     L)  base -$b val +L $var; return 0 ;;
     S)  [ $6 == 0 ] && {
            catv $len,val =val:
            prints vs-F000$blen val "$val"
         }
         [ $6 == m -a ${#val} -lt blen ] && prints vs-$blen val "$val"
         base -w val +W $var ;;
   esac
   return 0
}


#htm $TXT adr typ wlen dst dsteye dflt1 mi1 ma1 dflt2 mi2 ma2 dfltbm flg unit nam txt
# 1  2    3   4   5    6   7      8     9   10  11    12  13  14     15  16   17  18
EEconvertHtm()  {
   local adr=00000 txt="${18}" min=$9 max=${10} unit
   let "adr=$3"
   [ MUspsw -eq 1 -a "${12}" != '"' ] && min="${12}" max="${13}"
   [ ${16} != '"' ] && unit=" ${16}"
   local onfoc
   [ $6 == u -a $min == 0 -a $max == 1 ] && onfoc=" onFocus=%"Toggle01(this)%""
   ifset EEmin || EEmax= EEdflt=
   ifset EEmin && EEmin="</b><font color=%"#bbbbbb%"> &nbsp;&nbsp;[$EEmin " %
                  EEmax=" $EEmax]</font><b>"
   conv '-t` ' txt
   prints s25ss  "$txt" %
      "  <input name=%"A$adr%" value=%"$2%" size=%"$InputLen%"" %
      " maxlength=%"$InputLen%"$onfoc>$unit$EEmin$EEdflt$EEmax"
   return 0
}


#C:\DATA.MUC $Fmueep
MkMucFile()  {
   local n=00000 sz=00000 o0=00000 o=00000 zv="$RN" c=.. boundary
   cat > $Fmucupld
   #< $2
   < $Fmucupld
   while readl Hbuf
   do
      expr "$Hbuf" :boundary '%(-%{2,}[^-]%{1,}%)"%{0,1}$' && break
      let "++n>0" && { >< ; return 1; }
   done
   while readl Hbuf
   do
      ifset Hbuf || break
   done
   n=0
   > $1
   while catv +0,50,0 =Hbuf:
   do
      let "${#Hbuf}!=50" && break
      catv 48,2,Hbuf =c:
      cmpv zv c || break
      catv Hbuf
      let "++n>=100" && break
   done
   let "n!=100" && { ><< ; return 2; }
   catv /%r%n boundary /--%r%n =boundary:
   catv /%r%r =c:
   seek + 0 o0
   while seek + 0 o; catv +0,1000,0 =Hbuf:
   do
      conv "-T$c" Hbuf
      let "o+=$., $.<0" && continue
      catv $o,${#boundary},0 =Hbuf:
      cmpv Hbuf boundary || { let "++o"; seek $o 0; continue; }
      catv $o0,$((o-o0)),0
      let "o+=${#boundary}"
      catv $o,,0
      break
   done
   ><<
   fstat -sv sz $1
   let "sz!=5000+2048" && return 3
   catv 5000,2048,0  < $1 | base -W +w > $Fmueebin
   return 0
}


# C:\MUEE A:\DATA\EEBASE $Fmueep Nn (alt)
# Nn
ChangeMUee()  {
   local rub=00 offs=000000 nam=........ sp=00 sw=00 spsw=0
   local adr=00000 typ=.... len=00000 flg=........ gid=0000 aid=0000
   local val=.....................................
   local f=............................................
   catv 0 =1000,Hbuf:
   conv '-t& ' Hbuf
   < $Feebase
   for Hbuf in $Hbuf
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
         Rubrik)  $1="$Hbuf"
                  for 3 rub gid aid in $Hbuf; do break; done
                  let "offs=(rub-1)*6"
                  catv $offs,5,BasePos =offs:
                  seek $offs 0
                  readl Hbuf
                  3<> $Ddb/$gid/$aid/eepr
                  ;;
        A[0-9]*)  val="$Hbuf"
                  conv -DA nam
                  while readl Hbuf
                  do
                     expr "$Hbuf" :: '^@' || break 2
                     expr "$Hbuf" :: '^@%d' || continue
                     conv -D@ Hbuf
                     for 16 adr typ len f f f f f f f f f flg f f f in $Hbuf
                     do break; done
                     let "len<<=1, adr=$adr, adr<<=1, (nam<<1)==adr" || continue
                     EEconvertEye eye "Hbuf:$val" $Hbuf || continue 2
                     [ $flg == SP ] && sp=$val
                     [ $flg == SW ] && sw=$val
                     catv $len,Hbuf =$adr,,3
                     continue 2
                  done
                  ;;
      esac
   done
   ><<
   [ sw -eq 1 ] && sp=0 spsw=2
   [ sp -eq 1 ] && spsw=1
   [ MUspsw -ne spsw ] && { MUspsw=$spsw  Uvars MUspsw; CopyCmuee; }
   return 0
}



# $Fmueehtm C:\MUEE A:\DATA\EEBASE $Nn (alt)
# $rubrik $gid $aid
MkEErfHtm()  {
   local r=0 e=0 rub=$1 offs=000000 feepr=$Ddb/$2/$3/eepr
   local adr=00000 len=00000 siga=..........
   let "rub<1" && rub=1
   catv $(([rub-1]*6)),5,BasePos =offs:
   < $Feebase
   seek $offs 0
   readl Hbuf
   seek + 0 offs
   ><
   expr "$Hbuf" :: '^!' && r=e conv -D! Hbuf
   catv Doctype '/<html><head><title></title>%n' Meta
   echo '<script language="JavaScript">%
         function Toggle01(i)%
         {%
            var inh= i.value;%
            if (inh=="0" || inh=="" || inh==" ")%
                  i.value= "1";%
            else  i.value= "0";%
            i.blur();%
         }%
         </script>%012%c'
   siga=siga.js
   [ MUspsw -eq 2 ] && siga=sigabm.js
   [ $r == e ] &&
      echo '<script language="JavaScript" %
            src="/js/'"$siga"'" type="text/javascript"></script>%
            <script language="JavaScript" %
            src="/js/sig.js" type="text/javascript"></script>%
            %012%c'
   echo '</head>%012<body class="main" text="#ffd700">%012%c'
   [ $r == e ] && echo '<script language="JavaScript">Wr("'"$Hbuf"'");</script>%012%c'
   catv '.<form name="Vis" action="/cgi/eepr.cgi" method="POST"><pre><b>' /%n %
        '.<input name="Rubrik" type="HIDDEN" value="'"$rub $2 $3"'">' /%n
   [ $r == e ] && catv '.<input name="Signal" type="HIDDEN">' /%n
                       #Reset=="Dflt(1);"
   [ $r == 0 ] && catv '.<h2>' Hbuf '.</h2>' /%n%n
   < $Feebase
   seek $offs 0
   while readl Hbuf
   do
      expr "$Hbuf" :e '^@%(.%)' || break
      [ "$e" == : ] && {
         conv -D@D: Hbuf
         prints s27s "" "</b><font color=%"#ffffff%">$Hbuf</font><b>"
         continue
      }
      conv -D@ Hbuf
      for 3 adr len len in $Hbuf; do break; done
      let "len<<=1" "adr=$adr" "adr<<=1"
      catv $adr,$len,3 =Nn:  3<> $feepr
      EEconvertTxt txt Nn $Hbuf
      EEconvertHtm htm "$Nn" $Hbuf
   done
   echo '</b></pre></form>%012%c'
   [ $r == e ] && echo '<script language="JavaScript">Dflt(0);</script>%012%c'
   echo '</body></html>%012%c'
   ><
   return 0
}


# gid.aid
MkEElfHtm()  {
   local n=00 offs=000000
   catv Doctype '/<html><head><title>VBM EE-Rubriken</title>%n' Meta
   echo '<base target="EErf">%n</head>%n<body class="main" text="#ffd700"><b>'
   < $Feebase
   for offs in $BasePos
   do
      seek $offs 0
      readl Hbuf
      let "++n"
      catv '.<a class="elf" href="/cgi/muee.cgi?eerf.' n "..$1" %
           '.">' Hbuf '.</a><br><br>' /%n
   done
   echo '</b></body></html>'
   ><
   return 0
}


# gid.aid
MkEeFrameset()  {
   catv Doctype '/<head><title>VBM eemain</title>%n' Meta
   print -r '</head>
   <frameset rows="*,77" bordercolor="#ffd700" border="2">
      <frameset cols="20%,*" bordercolor="#ffd700" border="2">
         <frame name="EElf" src="/cgi/muee.cgi?eelf.'"$1"'" scrolling="auto"
          frameborder="0" marginwidth="10" marginheight="30">
         <frame name="EErf" src="/cgi/muee.cgi?eerf.0.'"$1"'" scrolling="yes"
          frameborder="0" marginwidth="20" marginheight="0">
      </frameset>
      <frame name="EEbuttons" src="/htm/eebuttons.htm" scrolling="no"
       frameborder="0" marginwidth="30" marginheight="10">
   </frameset>
   <body bgcolor="#39458f" text="#ffd700"
    link="#ffd700" vlink="#ffd700" alink="#39458f">
   <br>&nbsp;
   <h1 align="center">Browser NoFrames!</h1>
   </body>
   </html>'
   return 0
}




[ "$REQUEST_METHOD" == POST ] && {
   expr "$REQUEST_URI" :: '/eepr%.cgi$' || PutErrHtm "Sorry!"
   local sz="$CONTENT_LENGTH"
   if [ sz -ge 2048 ]
   then
      #MkMucFile $Fmueemuc Fmueep || [ $? -gt 1 ] && CopyCmuee
      #cat $Feelf > $Fmueehtm
      #echo "Status: 204 No Content%n"
      PutErrHtm "Not implemented."
      echo "Status: 205 Reset Content%n"
   else
      #MUee=tomu  Uvars MUee
      #[ -s $Fmueebin ] || CopyCmuee
      ChangeMUee Nn
      #base -W +w < $Fmueebin | catv 2048,0 =5000,2048,3  3<> $Fmueemuc
      echo "Content-type: text/html%n"
      MkEErfHtm $Nn
   fi
   exit 0
}


[ "$REQUEST_METHOD" == GET ] && {
   local n="$QUERY_STRING"
   case "$n" in
      defaults__)
         CopyCmuee
         echo "Content-type: text/html%n"
         cat ../eemain.htm
      ;;
      eelf.?*)
         expr "$n" :n '^eelf.%(..*%)$'
         echo "Content-type: text/html%n"
         MkEElfHtm $n
      ;;
      eerf.?*)
         expr "$n" :n '^eerf.%(..*%)$'
         expr "$n" :n '[^0-9]' += ' '
         echo "Content-type: text/html%n"
         MkEErfHtm $n
      ;;
      eemain.?*)
         expr "$n" :n '^eemain.%(..*%)$'
         echo "Content-type: text/html%n"
         MkEeFrameset $n
      ;;
      *)
         #[ -s $Fmueebin ] || CopyCmuee
         #echo "Content-type: text/html%n"
         #MkEErfHtm Fmueehtm $Fmueebin $Feebase $n
         echo "Status: 205 Reset Content%n" ;;
   esac
}
exit 0


#HTTP_HOST=www.schellong.com
#HTTP_REFERER=http://www.schellong.com/icnt.htm
#HTTP_USER_AGENT=Mozilla/4.73 [en] (X11; I; SCO_SV 3.2 i386)
#REMOTE_ADDR=193.159.66.48
#REMOTE_HOST=localhost
#SERVER_ADDR=195.20.225.17
#SERVER_NAME=schellong.com
#QUERY_STRING=0.1.i8x12.l0.d5.b000000.fffffff.r0
#REQUEST_METHOD=POST
#CONTENT_LENGTH=12345
#CONTENT_TYPE=x/y
#Location: url
#Status: 204 No Content
#Status: 205 Reset Content





###  env.cgi  #############################################

#!./bish_folso_cgi -p_
#!/home/bin/bish

hl=-----------------------------------------------------
2>&1
echo "Content-Type: text/plain%n"

#print -u1 /dev/console > /dev/console
#print -u3 /dev/pts015 3> /dev/pts015

ver
echo $hl
autor
echo $hl
pwd
echo $hl
env
echo $hl
extern ls -lA
echo $hl

><
exit 0



###  env.cgi  #############################################

#!./bish_folso_cgi
#!/home/bin/bish

echo "Content-Type: text/plain%n"

ver
autor
pwd
echo ---------------------------------------------
env

exit 0



###  env2.cgi  #############################################

#!./bish_folso_cgi
#!/home/bin/bish

echo "Content-Type: text/plain%n"
2>&1
extern ./bish4 -c "echo ./bish4:; ver; autor; echo"
><

ver
autor
pwd
echo ---------------------------------------------
env

exit 0



###  gcnt.cgi  #############################################

#!./bish_folso_cgi
#!/u/bin/bish


set -f

arg="$QUERY_STRING"
ok=0
expr "$arg" :zn '^%([0-9]%{1,4%}%.[0-9]%{1,3%}%):.' && {
   expr "$arg" :nam ':%(..*%)$' || nam=
   expr "$nam" =:nam '%%2f' += '/'
   Url="$nam"
   expr "$nam" :nam '%([^/][^/]*%)$' || nam=
   expr "$nam" :erw '%.%([^/.]%{1,%}%)$' || erw=
   ifset nam && ok=1
}

[ ok -eq 0 ] && {
   echo "Content-type: text/plain%n"
   echo "%n*** FEHLER ***  bei '$arg'"
   exit 0
}

HTTP_REFERER="$HTTP_REFERER::$Url"
export HTTP_REFERER

expr "$REMOTE_ADDR" :: '127%.0%.0%.' || extern ./icnt.cgi $zn.i0

ifset erw || erw=bin
conv -l erw
ct=text/plain

case "$erw" in
  html|htm|shtml|shtm)  ct=text/html ;;
  txt|bish|pl|text)      ct="text/plain" ;;
  exe|bin|zip|gz|tar|drv|z|obj|o)
                        ct="application/octet-stream" ;;
  gif)                  ct=image/gif ;;
  jpg|jpeg)             ct=image/jpeg ;;
  *)                    ct=text/plain ;;
esac


catv ."Content-type: " ct /"%nLocation: $Url%n%n"

exit 0





###  main.cgi  #############################################

#!./bish_folso_cgi -p_



# Buf
Escape()  {
   local c=. h=... spez="${{1}"
   expr "${{1}" :spez '[a-zA-Z_0-9&=.-]' += ''
   ifset spez || return 0
   conv '-d%' spez
   [ $. -ge 0 ] && expr "${{1}" :$1 '%%' += '%25'
   while ifset spez
   do
      catv 1,spez =c
      conv "-d$c" spez
      base -b c +16 h
      expr "${{1}" :$1 "$c" += '%'$h
   done
   return 0
}


CkPasswd()  {
   [ 0${#1} -lt 3 -o 0${#1} -gt 15 ] && return 1
   expr "$1" :: '[^!-~]' && return 1
   #expr "$1" :: '[+&]' && return 1
   return 0
}


RxTxRun()  {
   [ $# -eq 0 ] && {
      extern $ps_cmd | grep -qm 'rxtx.bish[ %t]%{1,}run'
      return
   }
   [ "$1" == sigterm ] && {
      local pid
      extern $ps_cmd | pid=$( grep -m 'rxtx.bish[ %t]%{1,}run' ) || return
      catv pid /%n | read - pid -
      expr "$pid" :: '^[0-9]%{1,}$' || return
      kill $pid
   }
   return
}


# $Adir "$sta"
CkChStation()  {
   local sta="$2" gid=0000 aid=0000 buf:.200
   expr "$1" :gid '%([0-9]*%)/[0-9]*$'
   expr "$1" :aid '[0-9]*/%([0-9]*%)$'
   buf="$(- grep -m "^$gid $aid " $Fstation )" || return
   expr "$buf" :buf "^$gid $aid "'%(.*%)$' || return
   cmpv buf sta && return 0
   cat $Fstation | {
      > $Fstation
      while readl buf
      do
         expr "$buf" :: "^$gid $aid " || { catv buf /%n; continue; }
         print -r "$gid $aid $sta"
      done
      ><
   }
   return 0
}

# $Adir "$sta"
AddStation()  {
   local gid=0000 aid=0000
   expr "$1" :gid '%([0-9]*%)/[0-9]*$'
   expr "$1" :aid '[0-9]*/%([0-9]*%)$'
   print -r "$gid $aid $2" >> $Fstation
   [ CTbuild -eq 0 ] && CTbuild=1 Uvars CTbuild
   return 0
}


#CkGA Gdir $Ddb  "$grp" || MkGA $Gdir $Ddb  "$grp"
#CkGA Adir $Gdir "$anl" || MkGA $Adir $Gdir "$anl"
CkGA()  {
   local ali=$2/$Fali dali=0000 dali0=0000 min=0000
   local bez; prints vs50 bez
   mkdirs $2
   [ -e $ali ] || : > $ali
   < $ali
   while read dali bez
   do
      [ "$bez" == "$3" ] && { ><; $1=$2/$dali; return 0; }
      let "min==0&&dali-dali0>1" && let "min=dali0+1"
      dali0=$dali
   done
   ><
   let "++dali, min==0" && $1=$2/$dali
   let "min>0" && $1=$2/$min
   return 1
}

#CkGA Gdir $Ddb  "$grp" || MkGA $Gdir $Ddb  "$grp"
#CkGA Adir $Gdir "$anl" || MkGA $Adir $Gdir "$anl"
MkGA()  {
   local ali=$2/$Fali dali=0000 dali0=0000 w=0
   local bez; prints vs50 bez
   mkdirs $2 $1
   expr "$1" :dali0 '/%([0-9]%{1,4}%)$'
   [ -s $ali ] || { catv dali0 ". $3" /%n > $ali; return 0; }
   cat < $ali | {
      > $ali
      while read dali bez
      do
         [ dali -gt dali0 -a w -eq 0 ] && w=1 catv dali0 ". $3" /%n
         catv dali ". " bez /%n
      done
      [ w -eq 0 ] && catv dali0 ". $3" /%n
      ><
   }
   return 0
}


# len
FormInfoRead()  {
   local g=g a=a i=i n=000 nam=.................... tmp=../tmp/newtmp
   local ctv=0000 ctv0=0000 sta=....................
   local grp; prints vs50 grp
   local anl; prints vs50 anl
   expr "$1" :: '^[0-9]%{2,4}$' || PutErrHtm "Length value: »$1«"
   let "$1<=3||$1>5000" && PutErrHtm "Length value: »$1«"
   catv $1,0 =Hbuf:
   conv -'t& ' Hbuf
   > $tmp
   for Hbuf in $Hbuf
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        I[0-9]*)
           Hbuf=$Hbuf
           [ ${#Hbuf} -eq 0 ] && goend
           [ $nam == I$Gid ] && grp="$Hbuf" unset g
           [ $nam == I$Aid ] && anl="$Hbuf" unset a
           [ $nam == I$Iid ] && sta="$Hbuf" unset i
           [ $nam == I$Cid ] && ctv="$Hbuf"
        ;;
        W[0-9]*)
           conv "-t${CR}${ESC}t$NL${CA}"'t `' Hbuf
        ;;
        P[0-9]*)
           expr "$Hbuf" :: '^®[^®]%{3,}®$' && { conv -d® Hbuf; goend; }
           CkPasswd "$Hbuf" || { ><; remove $tmp; PutErrHtm "Password wrong!"; }
           catv Hbuf | extern ./mailcode -en -c "$MC64" | catv 0 =Hbuf:
        ;;
      esac
      expr "$nam" :: '^[IWP][0-9]%{1,3}$' || continue
      catv 1,3,nam "/ " Hbuf RN
   done
   ><
   [ -n "$g$a$i" ] && { remove $tmp
      PutErrHtm "Group, System and Sys-ID are essential!"; }
   expr "$grp" :: '^[!* ]' && { remove $tmp; PutErrHtm "!* not allowed: »$grp«"; }
   CkGA Gdir $Ddb  "$grp" || MkGA $Gdir $Ddb  "$grp" && MkGrpArr $Fgrpajs
   CkGA Adir $Gdir "$anl" || MkGA $Adir $Gdir "$anl" && AddStation $Adir "$sta"
   [ -s $Adir/i ] && ctv0="$(- grep -m "^$Cid " $Adir/i )" && {
      expr "$ctv0" :ctv0 '^[0-9]%{1,} %([0-9]%{1,}%)' || ctv0=0
      [ ctv -ne ctv0 -a CTbuild -eq 0 ] && CTbuild=1 Uvars CTbuild
   }
   cat $tmp > $Adir/i
   remove $tmp
   CkChStation $Adir "$sta" || PutErrHtm "Change to »$sta« failed."
   return 0
}

#/db/gruppe/mu/
#/db/alias.txt
#/db/1/alias.txt
#/db/1/1/i(info) ee status fail okay
# first/get Gdir=''/Gdir="grpbez"
GetGrpDir()  {
   [ -s $Ddb/$Fali ] || return 1
   local id=0000 inh
   case $1 in
     first)
          catv 5000,0 =Hbuf: < $Ddb/$Fali
          expr "$Hbuf" :Hbuf '%([0-9]%{1,} %)[^%n]*%n' + '%1'
          set +f
          for id in $Hbuf
          do
             : $Ddb/$id/[1-9]*/i
             [ "$]" -gt 0 ] && { set -f; $2=$Ddb/$id; return 0; }
          done
          set -f
     ;;
     get)
          < $Ddb/$Fali
          while read id inh
          do
             cmpv $2 inh || continue
             $2=$Ddb/$id; ><; return 0
          done
          ><
     ;;
   esac
   return 1
}


# Adir $Gdir
GetAnlDir()  {
   local id=0000 inh
   [ -s $2/$Fali ] || return 1
   < $2/$Fali
   while read id inh
   do
      cmpv $1 inh || continue
      $1=$2/$id; ><; return 0
   done
   ><
   return 1
}


# $Fgrpajs
# $Fgrpaejs "Err"
MkGrpArr()  {
   local r=0 n=000 i=000 id=0000 grp
   Lock lockga
   [ -e $Ddb/$Fali ] || : > $Ddb/$Fali
   [ $# -ge 2 ] && r=1
   [ $# -lt 2 ] && Newgrparr=1
   > $1
   < $Ddb/$Fali
   while readl grp
   do  let ++n;  done
   echo "var GrpAn$2= $n;"
   [ n -gt 0 ] && echo "var GrpArr$2= new Array($n);"
   [ n -eq 0 ] && echo "var GrpArr$2= new Array(1);%nGrpArr${2}[0]= %"%";"
   i=0
   seek 0 0
   set +f
   while read id grp
   do
      [ $# -ge 2 ] && {
         grp='  '
         : $Ddb/$id/[1-9]*/fail
         [ $] -gt 0 ] && r=0 grp='! '
      }
      print -r "GrpArr${2}[$i]= %"$grp%";"
      let ++i
   done
   ><<
   set -f
   Lock lockga del
   #[ $# -ge 2 ] && read - - i < $Fgrpajs && [ i -ne n ] && MkGrpArr $Fgrpajs
   return $r
}


# user pass
SetPass()  {
   local pw="$2"
   WrLog "Password operation: $1" "change"
   [ 0${#1} -lt 1 -o 0${#2} -lt 3 -a 0${#2} -gt 0 ] &&
      PutErrHtm "User/Pass length not accepted."
   [ 0${#2} -eq 0 ] && pw='`{!@#$%^vI*")7Q'
   expr "$1" :: '[^a-zA-Z0-9_]' && PutErrHtm "User name contains wrong chars."
   expr "$1" :: '^[a-zA-Z]' || PutErrHtm "User name must begin with [a-zA-Z]."
   cd ../adm
   htpasswd -bm .wmspw "$1" "$pw" 2>/dev/null ||
            PutErrHtm "Password operation failed."
   cd -
   return 0
}


# $txtfile
PutTxt2Htm()  {
   catv Doctype '/<head><title>TXT2HTML</title>%n' Meta
   print -r '</head>
    <body class="main"><div class="stat1"><form><b>
    <input class="butt" type="button" value="Back" onClick="window.back();">
    </b></form></div>'
   print -rn '<div class="stat"><pre><b>'
   cat "$1"
   print -r '</b></pre></div></body></html>'
   return 0
}


# boundary: ---------12345 (mindestens: --)
# boundary: erste Zeile
# Beginn: nach Leerzeile (%r%n)
# Ende: %r%nboundary--%r%n
# Achtung: boundary aus CONTENT_TYPE hat vorn "--" weniger!
# len
FormAdmBakRead()  {
   local boundary="$CONTENT_TYPE" arch=../tmp/db.tar
   local sz:010 bp6:010 z:.500
   expr "$boundary" =:boundary 'boundary=%(..*%)' || return 1
   #catv boundary > ../tmp/boundary
   let "bp6=${#boundary}+8"
   catv 1000,0 | {
      while readl z
      do
         ifset z || break
      done
      catv 0 > $arch
      catv ,.
   }
   [ $. -le 0 ] && { remove -s $arch; return 2; }
   cat >> $arch
   fstat -sv sz $arch
   [ sz -lt bp6 ] && { remove -s $arch; return 3; }
   catv -$bp6:,,0 =z:  < $arch
   expr "$z" :: "^%r%n--$boundary--%r%n%$" || { remove -s $arch; return 4; }
   let "sz-=bp6"
   fstat +s $sz $arch || { remove -s $arch; return 5; }
   return 0
}


# len
FormAdmRead()  {
   local ja=---- mo=-- ta=-- st=-- mi=-- se=00 ip=999.888.777.666
   local tp=T md=0 rt=0 ct=0 ctb=0 as=0 sig=0
   local nam=.................... user=................
   expr "$1" :: '^[0-9]%{1,4}$' || PutErrHtm "Length value: »$1«"
   let "$1<=3||$1>2000" && PutErrHtm "Length value: »$1«"
   catv $1,0 =Hbuf:
   conv -'t& ' Hbuf
   for Hbuf in $Hbuf
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        Shut)  : > ../tmp/rxtx
               sleep -m 800
               RxTxRun && RxTxRun sigterm
               [ "$OsTyp" == FreeBSD ] && {
                  echo "Content-type: text/plain%n"
                  extern ../adm/syscmd.bish shutdown "shutdown -h now"
		  sleep 10
		  return 2
                  #extern ../adm/syscmd.bish shutdown halt
                  #UW: shutdown -y -g0
               }
        ;;
        RxTx)  rt=1 ;;
        Auto)  as=1 ;;
        Term)  sig=1 ;;
        Modem) md=1 ;;
        Puls)  tp=P ;;
        Conn)  ct=1 ;;
        Build) ctb=1 ;;
        MInit) cmpv MOinitapp Hbuf || MOinitapp="$Hbuf" Uvars MOinitapp ;;
        Day)   ta=$Hbuf ;;
        Mon)   mo=$Hbuf ;;
        Year)  ja=$Hbuf ;;
        Hour)  st=$Hbuf ;;
        Min)   mi=$Hbuf ;;
        IP)
           CheckIP "$Hbuf" || PutErrHtm "IP address: »$Hbuf«"
           ip=$Hbuf
        ;;
        User)
           for ip in admin new vbm root adm cie sam selotronic cfg config pass
           do  cmpv -i ip Hbuf && PutErrHtm "User name not applicable."; done
           user="$Hbuf" ;;
        Pass)   [ -n "$user" ] && SetPass "$user" "$Hbuf" ;;
        AdmPw)  [ -n "$Hbuf" ] && SetPass admin   "$Hbuf" ;;
        NewPw)  [ -n "$Hbuf" ] && SetPass new     "$Hbuf" ;;
        AdmLs)
           expr "$Hbuf" :: '^[0-9]%{1,}$' &&
              [ Hbuf -ne AdmLogSz ] && AdmLogSz=$Hbuf Uvars AdmLogSz
        ;;
        SysLs)
           expr "$Hbuf" :: '^[0-9]%{1,}$' &&
              [ Hbuf -ne SysLogSz ] && SysLogSz=$Hbuf Uvars SysLogSz
        ;;
      esac
   done
   [ "$TPwahl" != "$tp" ] && TPwahl=$tp Uvars TPwahl
   [ MOwahl -ne md ] && MOwahl=$md Uvars MOwahl
   [ RxTxAuto -ne as ] && RxTxAuto=$as Uvars RxTxAuto
   [ ConnTest -ne ct ] && ConnTest=$ct Uvars ConnTest
   [ CTbuild -ne ctb ] && CTbuild=$ctb Uvars CTbuild
   if RxTxRun
   then
      [ rt -gt 0 ] && goend
      : > ../tmp/rxtx
      sleep -m 800
      [ sig -gt 0 ] && RxTxRun && RxTxRun sigterm
   else
      [ MUcall -ne 0 ] && MUcall=00 Uvars MUcall
      remove -s ../tmp/rxtx
      [ rt -eq 0 ] && goend
      extern ../adm/rxtx.bish
      sleep -m 200
   fi
   expr "$ta$mo$ja$st$mi$se" :: '^[0-9]%{7,14}$' && {
      : $ta $mo $ja $st $mi
      [ 0$} -eq 5 ] && extern ../adm/syscmd.bish date $ta $mo $ja $st $mi
   }
   return 0
}
#date -u MMDDhhmmCCYY


# "dir|file=obj act=aaa"
AdmAction()  {
   local id=0000 nam=.......... obj=..............................
   for Hbuf in $1
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        file)  obj="$Hbuf" ;;
        act)
           case "$Hbuf" in
             del)  [ -f "$obj" ] || PutErrHtm "File not found: »$obj«"
                   remove -s $obj ;;
             trun) [ -f "$obj" ] || PutErrHtm "File not found: »$obj«"
                   : > $obj ;;
             log)  echo "Content-type: text/html%n"
                   PutTxt2Htm $obj
                   return 0 ;;
             src)  echo "Content-type: text/plain%n"
                   cat $obj
                   return 0 ;;
             bak)  #tar xepf -
                   cat uvars.bish > $Ddb/uvars.bish
                   extern tar chf $obj $Ddb
                   WrLog "File:$obj" "created" ;;
             down) WrLog "File:$obj" "downloaded"
                   expr "$obj" :obj '^%.%./%(..*%)$'
                   echo "Location: http://$SERVER_ADDR:$SERVER_PORT/$obj%n"
                   return 0 ;;
             upda) extern tar xepf $obj || PutErrHtm "Backup Update failed"
                   WrLog "File:$obj" "database updated from file"
                   [ -s $Ddb/uvars.bish ] && cat $Ddb/uvars.bish > uvars.bish
                   ;;
           esac
        ;;
      esac
   done
   #echo "Status: 204 No Content%n"
   echo "Content-type: text/html%n"
   MkAdmHtm
   return 0
}


#
MkAdmHtm()  {
   local exist=1 iv=0 s=00 titel=.............................. script=........
   local file=$titel act=........ action=$titel titel0=starttitel
   catv Doctype '/<head><title>VBM admin</title>%n' Meta
   echo '<script language="JavaScript" src="/js/help.js" type="text/javascript">
         </script>
         <script language="JavaScript" type="text/javascript">
          function GrpSel(sel)  { return; }
         </script>'
   print -r '</head>
    <body class="main">
    <div class="dctl"><b><font size="+2">'"VBM Administration"'</font>
     </b><br><br>
    '
   extern /bin/date -u +'%A, %e. %b. %Y &nbsp;%X &nbsp;%Z'
   echo '</div><div class="dctlm"><pre><b>%c'
   echo '<center><u>Files</u></center>%c'
   for 6 titel file act action iv script in %
         ADMLOG  $Fadmlog          log  Display  2 adm %
         ADMLOG  $Fadmlog          src  Source   2 adm %
         ADMLOG  $Fadmlog          trun Truncate 2 adm %
       SYSIDTXT  $Fstation         log  Display  2 adm %
       SYSIDTXT  $Fstation         src  Source   2 adm %
       CONNTEST  $Fconntest        log  Display  2 adm %
       CONNTEST  $Fconntest        src  Source   2 adm %
       PASSWORD  ../adm/.wmspw     src  Source   2 adm %
         BACKUP  ../tmp/db.tar     bak  Create   0 adm %
         BACKUP  ../tmp/db.tar     down Download 2 adm %
         BACKUP  ../tmp/db.tar     del  Delete   3 adm %
         BACKUP  ../tmp/db.tar     upda !Update! 2 adm
   do
      Hbuf="$file" Escape Hbuf
      let "s=10-${#action}"
      cmpv titel titel0 || {
         echo %n
         prints s14- "$titel: "
         PutFileDate $file; exist=$?
         echo '   %c'
      }
      if [ exist -eq iv -o iv -eq 3 -a exist -gt 0 ]
      then
         prints ssss$s- '<a class="actl" href="/cgi/'"$script"'.cgi?req=admact' %
                        '&file='"$Hbuf" %
                        '&act='"$act"'">'"$action"'</a>' ''
      else
         prints   ss$s- '<font color="#b0b0b0">'"$action"'</font>' ''
      fi
      titel0=$titel
   done
   unset titel titel0 file act action iv script exist s
   local w=00 n=- siz=000 max=000 nam=........ typ=........
   local txt=.............................. val=..............................
   local ja=2002 mo=12 ta=31 st=24 mi=60 se=60 rxtx=0 puls=0
   systime val
   ctime ja mo ta st mi se $val
   [ "$TPwahl" != T ] && puls=1
   RxTxRun && rxtx=1
   echo '</b></pre></div>
    <div class="dctlm"><form name="af" action="/cgi/adm.cgi" method="POST"><pre><b>%c'
   for 8 txt w nam typ val siz max n in %
         "        Shutdown  "  24  Shut checkbox "0"           0  0 ' ' %
         " RxTx daemon run  "  24  RxTx checkbox "$rxtx"       0  0 ' ' %
         " RxTx    SIGTERM  "  24  Term checkbox "0"           0  0 ' ' %
         " RxTx auto start  "  24  Auto checkbox "$RxTxAuto"   0  0 ' ' %
         "    Connect test  "  24  Conn checkbox "$ConnTest"   0  0 ' ' %
         " Build Conn test  "  24 Build checkbox "$CTbuild"    0  0 ' ' %
         "      Modem mode  "  24 Modem checkbox "$MOwahl"     0  0 ' ' %
         "      Pulse dial  "  24  Puls checkbox "$puls"       0  0 ' ' %
        "Modem init append  "  24 MInit     text "$MOinitapp" 22 30 ' ' %
         "DD MM YYYY hh mm  "  24   Day     text "$ta"         2  2 '-' %
         " "                   ''   Mon     text "$mo"         2  2 '-' %
         " "                   ''  Year     text "$ja"         4  4 '-' %
         " "                   ''  Hour     text  ""           2  2 '-' %
         " "                   ''   Min     text  ""           2  2 ' ' %
         "              IP  "  24    IP     text "$VBMip"     15  0 ' ' %
         "     User + Pass  "  24  User     text  ""          15 15 '-' %
         " "                   ''  Pass password  ""          15 15 ' ' %
         "      Admin Pass  "  24 AdmPw password  ""          15 15 ' ' %
         "        New Pass  "  24 NewPw password  ""          15 15 ' ' %
         "  AdmLogSize max  "  24 AdmLs     text "$AdmLogSz"   6  6 ' ' %
         "  SysLogSize max  "  24 SysLs     text "$SysLogSz"   4  4 '-'
   do
      case $typ in
      text|password)
        se= [ max -eq 0 ] && max=$siz se='onFocus="this.form.'"$nam"'.blur();"'
        prints s${w}ss$n "$txt" '<input name="'"$nam"'" type="'"$typ"'"' %
               'value="'"$val"'" size="'"$siz"'" maxlength="'"$max"'"'"$se"'>'
      ;;
      checkbox)
        [ val -gt 0 ] && val=checked
        prints s${w}ss$n "$txt" '<input class="butt" name="'"$nam" %
               '" type="'"$typ"'"'" $val>"
      ;;
      esac
   done
   echo '</b></pre></form>'
   print -r '<form action="/cgi/adm.cgi" method="POST" enctype="multipart/form-data">
     <br><center><b><input class="butt" type="SUBMIT" value=" Upload Backup file: ">&nbsp;
     <input class="butt" type="FILE" name="UpLd"
      size="40" maxlength="30000000" accept="*/*">'
   echo '</b></center></form></div><br><tt><font color="#d0d0d0">'
   uname
   echo "- $SERVER_SOFTWARE=$SERVER_ADDR:$SERVER_PORT - $REMOTE_ADDR<br>&nbsp;"
   echo '</font></tt></body></html>'
   return 0
}


#Arg: "req=info&group=" + escape(grp) + "&anl=" + escape(anl);
MkInfoFrameset()  {
   catv Doctype '/<head><title>VBM-MU-Status/Control</title>%n' Meta
   print -r '</head>
   <frameset rows="*,77" bordercolor="#ffd700" border="2">
   <frame name="Info" src="/cgi/main.cgi?'"$1"'"
    scrolling="auto" frameborder="0" marginwidth="0" marginheight="0">
   <frame name="InfoButtons" src="/htm/infobuttons.htm"
    scrolling="no" frameborder="0" marginwidth="30" marginheight="10">
   </frameset>
   <body bgcolor="#39458f" text="#ffd700"
    link="#ffd700" vlink="#ffd700" alink="#39458f">
   <br>&nbsp;
   <h1 align="center">Browser NoFrames!</h1>
   </body>
   </html>'
   return 0
}


# .../eepr
Ee2Muc()  {
   local ft=0000000000 ja=2002 mo=12 ta=31 st=24 mi=60 se=60
   local V=00 v=00 sn=..............................
   Hbuf="$(- extern /bin/date -u +'%A, %e.%b.%Y %X' )"
   fstat -mv ft "$1"
   ctime ja mo ta st mi se $ft
   < "$1"
   catv $((962<<1)),2,0 =ft:
   catv $((965<<1)),16,0 =sn:
   ><
   base -w ft +10 ft
   let "V=ft>>8, v=ft&255"
   base -W sn +w sn
   conv -d sn
   expr "$sn" :: '[^JY0-9.-]' && sn=YY000000-000.000
   prints s-48s- "Konfiguration file MU1000C :" "$RN"
   prints s-48s- "Work.-No.   :  $sn" "$RN"
   prints s50s50s50- "$RN" "$RN" "$RN"
   prints s-48s- "Project     :  VBM" "$RN"
   prints s-48s- "Firmware    :  Version $V.$v" "$RN"
   prints s-48s- "Pfad        :  data.muc" "$RN"
   prints s-48s- "Version :  1.23" "$RN"
   prints s-48s- "Prüfungsdatum: $ta.$mo.$ja $st:$mi" "$RN"
   prints s-48s- "Memo :" "$RN"
   prints s-48s- "VBM created" "$RN"
   prints s-48s- "$Hbuf" "$RN"

   to $((100-13)) repeat
   do
      prints s50- "$RN"
   done
   base -W +w < "$1"
   return 0
}


# kat class "<h3>" "</h3>" ["titel"]
MkStatTbl()  {
   local kat=00000 num=00000 typ=00000 nam:.20 inh:.200
   echo "<div class=%"$2%">"
   [ "0${#5}" -gt 0 ] && echo "<h1><u>$5</u></h1>"
   [ $1 -gt 1 ] && echo "<pre><b>%c"
   while read kat num typ nam inh
   do
      #[ "$kat" != "$1" ] && break
      conv '-t` '"$Tconv" nam inh
      expr "$nam" :nam '<' += '&lt;'
      expr "$inh" :inh '<' += '&lt;'
      [ "$nam" != - ] && nam="$nam  "
      [ "$nam" == - ] && nam=
      expr "$typ" :: 't' && catv '/<ul>%n'
      expr "$typ" :: 'n' && catv /%n
      catv ".$3" nam inh ".$4" /%n
      expr "$typ" :: 'N' && catv /%n
      expr "$typ" :: 'T' && catv '/</ul>%n'
   done
   [ $1 -gt 1 ] && echo '</b></pre>'
   [ $1 -eq 1 ] && echo '<form><b><input class="butt" type="button" value="Back" onClick="window.back();"></b></form>%c'
   echo "</div>"
   return 0
}


# .../stat
MkStatHtm()  {
   base -10 Tconv +b Tconv
   local n=000 class=stat1 fa='<h3>' fb='</h3>'
   local title=........................................
   catv Doctype '/<head><title>MU-Status</title>%n' Meta
   print -r '</head><body class="main">'
   for n to 20 repeat
   do
      ifset TblTitle$n || break
      title="$TblTitle[n]"
      [ "$title" == '-' ] && continue
      [ "$title" == ' ' ] && title=
      class=stat fa= fb=
      [ n -eq 1 ] && class=stat1 fa='<h3>' fb='</h3>'
      grep "^$n"'[ %t]' $1 | MkStatTbl $n $class "$fa" "$fb" "$title"
   done
   echo '</body></html>'
   return 0
}


XmsgExit()  {
   RxTxMsg="FAIL: $1" Uvars RxTxMsg
   echo "Status: 204 No Content%n"
   exit 0
   return 0
}


# "dir=adir&pass=pw&act=call|quit"
CallSys()  {
   local pw:9.16 nam=.......... adir=....................
   local iph=..............................  ipw=....................
   RxTxRun || {
      [ MUcall -ne 0 ] && MUcall=00 Uvars MUcall
      [ RxTxAuto -gt 0 ] && {
         [ -e ../tmp/rxtx ] && remove ../tmp/rxtx
         extern ../adm/rxtx.bish
         XmsgExit "RxTx process still not running."
      }
      XmsgExit "RxTx process not running."
   }
   RxTxMsg="RXTX:" Uvars RxTxMsg
   Hbuf="$1"
   conv '-t& ' Hbuf
   for Hbuf in $Hbuf
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        dir)   adir="$Hbuf" ;;
        pass)  pw="$Hbuf" ;;
        act)
           [ "$Hbuf" == quit ] && {
              [ MUcall -gt 0 -a MUcall -le 9 ] && MUcall=-1 Uvars MUcall
              return 0
           }
           [ MUcall -gt 0 -a MUcall -le 9 -o MUcall -lt 0 %
             -o MUcall -ge 30 -a MUcall -le 39 ] && XmsgExit ""
           GetIval Hbuf $Fid "$adir" || XmsgExit "Phone number not found."
           iph="$Hbuf"
           CkTelnu "$iph" || XmsgExit "Phone wrong: »$iph«"
           GetIval Hbuf $Pid "$adir" || XmsgExit "Password not found."
           ipw="$Hbuf"
           expr "$pw" :: '^%t%t%t' || {
              expr "$pw" :: '^...' || XmsgExit "Password wrong"
              expr "$ipw" :: '^...' || XmsgExit "iPassword wrong: »$ipw«"
              catv ipw | extern ./mailcode -dns -c "$MC64" | catv 0 =ipw:
              cmpv ipw pw || XmsgExit "Password does not match"
              MUcall=02
           }
           MUdir=$adir Uvars MUdir
           Telnu=$iph Uvars Telnu
           [ MUcall -ne 2 ] && MUcall=01
           Uvars MUcall
        ;;
      esac
   done
   return 0
}


MkCtlhHtm()  {
   local code="$MUcall" msg:.50
   msg=STAT
   #[ code -ge 30                ] && msg=STAT
   [ code -ge 20 -a code -le 29 ] && msg=FAIL #MUcall=00 Uvars MUcall
   #[ code -ge 10 -a code -le 19 ] && msg=STAT
   [ code -ge 11 -a code -le 12 ] && msg=OKAY
   #[ code -gt  0 -a code -le  9 ] && msg=STAT
   #[ code -eq  0                ] && msg=STAT
   #[ code -lt  0                ] && msg=STAT
   let "code+=0"
   case "$code" in
     -1)  msg="$msg: [$code] User quit.";;
      0)  msg="$msg: [$code] Default state.";;
     11)  msg="$msg: [$code] RxTx got data.";;
     12)  msg="$msg: [$code] RxTx configured.";;
     16)  msg="$msg: [$code] Connection tested.";;
     17)  msg="$msg: [$code] Modem initialized.";;
     18)  msg="$msg: [$code] Data received.";;
     20)  msg="$msg: [$code] RxTx error.";;
     21)  msg="$msg: [$code] RxTx get data failed.";;
     22)  msg="$msg: [$code] RxTx config failed.";;
     26)  msg="$msg: [$code] Connect test failed.";;
     28)  msg="$msg: [$code] Dial in failed.";;
     29)  msg="$msg: [$code] RING event broken.";;
     30)  msg="$msg: [$code] RxTx daemon exited.";;
     36)  msg="$msg: [$code] Testing connection.";;
     37)  msg="$msg: [$code] Modem initialization.";;
     38)  msg="$msg: [$code] Incoming call.";;
     39)  msg="$msg: [$code] RING event.";;
      *)  msg="$msg: RxTx code: »$code«";;
   esac
   expr "$RxTxMsg" :: '^FAIL:' && {
      catv .FAIL =msg
      [ "$RxTxMsg" != "FAIL: " ] && msg="$RxTxMsg"
      RxTxMsg="RXTX:" Uvars RxTxMsg
   }

   print -r '<html><head><title></title></head><body><form>
   <input name="CtlhInp" type="hidden" value="'"$msg"'">
   </form><script language="JavaScript" type="text/javascript">
     parent.frames[0].focus();
   </script></body></html>'
   return 0
}


#Arg: "req=ctl&group=" + escape(grp) + "&anl=" + escape(anl);
MkCtlFrameset()  {
   catv Doctype '/<head><title>VBM System-Directory</title>%n' Meta
   print -r '</head>
   <frameset cols="100%,*" bordercolor="#d0d0d0" border="0">
   <frame name="Ctlv" src="/cgi/main.cgi?'"$1"'"
    scrolling="auto" frameborder="0" marginwidth="0" marginheight="0">
   <frame name="Ctlh" src="/cgi/main.cgi?req=ctlh"
    scrolling="no" frameborder="0" marginwidth="0" marginheight="0">
   </frameset>
   <body bgcolor="#39458f" text="#ffd700"
    link="#ffd700" vlink="#ffd700" alink="#39458f">
   <br>&nbsp;
   <h1 align="center">Browser NoFrames!</h1>
   </body>
   </html>'
   return 0
}


# "dir|file=obj grp=ggg anl=sss act=aaa"
CtlAction()  {
   local id=0000 nam=.......... obj=..............................
   local gid=0000 grp=$obj$obj anl=$obj$obj adir=$obj
   for Hbuf in $1
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        dir)   obj="$Hbuf" adir="$obj"
               [ -d "$obj" ] || PutErrHtm "Directory not found: »$obj«" ;;
        file)  obj="$Hbuf" expr "$obj" :adir '/[^/]%{1,}$' = '' ;;
        grp)   grp="$Hbuf" ;;
        anl)   anl="$Hbuf" ;;
        act)
           case "$Hbuf" in
             delete)
                   expr "$obj" :id '%([0-9]*%)$'
                   expr "$obj" :Hbuf '[0-9]*$' = $Fali
                   grep -v "^$id " $Hbuf | cat > $Hbuf
                   extern rm -rf $obj
                   WrLog "System:$obj [$grp : $anl]" "removed"
                   expr "$obj" :gid '%([0-9]*%)/[0-9]*$'
                   grep -v "^$gid $id " $Fstation | cat > $Fstation
                   [ CTbuild -eq 0 ] && CTbuild=1 Uvars CTbuild
                   [ -s $Hbuf ] && break
                   expr "$obj" :Hbuf '[0-9]*/[0-9]*$' = $Fali
                   grep -v "^$gid " $Hbuf | cat > $Hbuf
                   expr "$obj" :Hbuf '/[0-9]*$' = ''
                   extern rm -rf $Hbuf
                   WrLog "Group:$Hbuf [$grp]" "removed"
             ;;
             del)  [ -f "$obj" ] || PutErrHtm "File not found: »$obj«"
                   remove -s $obj
                   expr "$obj" :: '/conn$' &&
                      [ CTbuild -ne 1 ] && CTbuild=1 Uvars CTbuild
                   echo "Content-type: text/html%n"
                   MkCtlHtm "$grp" "$anl" "$adir"
                   return 0 ;;
             set)  : > $obj
                   [ -f "$obj" ] || PutErrHtm "File not found: »$obj«"
                   echo "Content-type: text/html%n"
                   MkCtlHtm "$grp" "$anl" "$adir"
                   return 0 ;;
             stat) echo "Content-type: text/html%n"
                   MkStatHtm $obj
                   return 0 ;;
             log)  echo "Content-type: text/html%n"
                   PutTxt2Htm $obj
                   return 0 ;;
             src)  echo "Content-type: text/plain%n"
                   cat $obj
                   return 0 ;;
             down) echo "Content-type: application/octet-stream%n"
                   Ee2Muc $obj
                   return 0 ;;
           esac
        ;;
      esac
   done
   echo "Status: 204 No Content%n"
   return 0
}


# $file
PutFileDate()  {
   [ -f "$1" ] || { echo "</b>--.--.---- --:--   -----<b>%c"; return 0; }
   local ft=0000000000 sz=0000000000 ja=2002 mo=12 ta=31 st=24 mi=60 se=60
   fstat -msv ft sz "$1"
   ctime ja mo ta st mi se $ft
   catv ta /. mo /. ja '/ ' st /: mi
   prints s8- $sz
   ft=1 [ sz -gt 0 ] && ft=2
   return $ft
}

#  extern date +' %A, %e. %B %Y %X %Z   KW%V  TJ%j'

# "$Grp" "$Anl" $Adir
MkCtlHtm()  {
   [ -d "$3"   ] || PutErrHtm nohdr "Directory not found: »$3«"
   [ -f "$3/i" ] || PutErrHtm nohdr "File not found: »$3/i«"
   local exist=1 iv=0 s=00 titel=.............................. script=........
   local file=$titel act=........ action=$titel titel0=starttitel
   local grp=$titel$titel anl=$titel$titel gid=0000 aid=0000
   expr "$3" :aid '%([0-9]%{1,}%)$'
   expr "$3" :gid '%([0-9]%{1,}%)/[0-9]%{1,}$'
   catv Doctype '/<head><title>VBM-MU-Status/Control</title>%n' Meta
   echo '<script language="JavaScript" src="/js/help.js" type="text/javascript">
         </script>
         <script language="JavaScript" src="/js/ctl.js" type="text/javascript">
         </script>'
   print -r '</head>
    <body class="main">
    <div class="dctl"><form><b><font size="+2">'"$1 : $2 &nbsp;&nbsp;"'</font>
    <input class="butt" type="button" value="Delete"
     onClick="DelSys('''"$3"''','''"$1"''','''"$2"''');">
    <input class="butt" type="button" value="Rename"
     onClick="void(prompt(''Rename dummy. Group : System.\r\nDelimiter is » : «'','''"$1 : $2"'''));">
     </b></form>
    '
   extern /bin/date -u +'%A, %e. %b. %Y &nbsp;%X'
   echo '</div><div class="dctlm"><pre><b>%c'
   echo '<center><u>Flags and Files</u></center>%c'
   Hbuf="$1" Escape Hbuf; grp="$Hbuf"
   Hbuf="$2" Escape Hbuf; anl="$Hbuf"
   for 6 titel file act action iv script in %
           FAIL  $3/fail del  Unset    3 main %
           FAIL  $3/fail set  Set      0 main %
           FAIL  $3/fail src  Source   2 main %
           OKAY  $3/okay del  Unset    3 main %
           OKAY  $3/okay set  Set      0 main %
        CFGLOCK  $3/lock del  Unset    3 new  %
        CFGLOCK  $3/lock set  Set      0 new  %
       CONNTEST  $3/conn log  Display  2 main %
       CONNTEST  $3/conn src  Source   2 main %
       CONNTEST  $3/conn del  Delete   3 adm  %
        INFOSET  $3/i    log  Display  2 main %
        INFOSET  $3/i    src  Source   2 main %
          STATE  $3/stat stat Display  2 main %
          STATE  $3/stat src  Source   2 main %
         CONFIG  $3/eepr down Download 2 main %
            LOG  $3/log  log  Display  2 main %
            LOG  $3/log  src  Source   2 main %
            LOG  $3/log  del  Delete   2 new
   do
      Hbuf="$file" Escape Hbuf
      let "s=10-${#action}"
      cmpv titel titel0 || {
         echo %n
         prints s11- "$titel: "
         PutFileDate $file; exist=$?
         echo '   %c'
      }
      if [ exist -eq iv -o iv -eq 3 -a exist -gt 0 ]
      then
         prints ssss$s- '<a class="actl" href="/cgi/'"$script"'.cgi?req=ctlact' %
                        '&file='"$Hbuf"'&grp='"$grp"'&anl='"$anl" %
                        '&act='"$act"'">'"$action"'</a>' ''
      else
         prints   ss$s- '<font color="#b0b0b0">'"$action"'</font>' ''
      fi
      titel0=$titel
   done
   echo '</b></pre></div>
    <div class="dctl"><form><br>Password<b>
    <input name="ConfPass" type="password" value="" size="15" maxlength="15">
    <input class="butt" type="button" value="Call (configure)"
     onClick="CallSys(1,'''"$3"''',this.form.ConfPass.value);">&nbsp;&nbsp;
    <input class="butt" type="button" value="Call (get data)"
     onClick="CallSys(1,'''"$3"''',''\t\t\t'');">
    <a href="javascript:void(LedAction(1))">
    <img name="led" align="middle" src="/img/ledge0.jpg" width="21" height="21"
     hspace="5" vspace="5" border="0"></a>
     <br><br>
    <input class="butt" type="button" value="Compose configuration"'
   [ -s "$3/eepr" ] &&
   echo 'onClick="top.location.href=''/cgi/muee.cgi?eemain.'"$gid.$aid"''';">'
   [ -s "$3/eepr" ] ||
   echo 'onClick="alert(''This system directory contains no config data.'');">'
   echo '&nbsp;&nbsp;&nbsp;
    <input class="butt" type="button" value="Reload"
     onClick="top.location.reload();">
    <input class="butt" type="button" value="Close"
     onClick="top.close();">&nbsp;
    <input class="butt" type="button" value="Help"
     onClick="Help(''#sysctl'');">
    </b></form></div>
    </body></html>'
   return 0
}


# $headtail
PutSysTblTxt()  {
   case "$1" in
     head)
   print -r '
      <table width="100%" border="0" align="center" valign="center"
       bgcolor="#01669a" cellpadding="2" cellspacing="2" cols="4">
   <tr><td width="8%" bgcolor="#01669a" align="center" valign="center">
   <font color="#ff9966" size="-1">State</font>
   </td>
   <td width="33%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <font color="#ff9966" size="-1">System name</font>
   </td>
   <td width="17%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <font color="#ff9966" size="-1">System type</font>
   </td>
   <td width="42%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <font color="#ff9966" size="-1">Site location</font>
   </td></tr></table>
   <font color="#000000"><hr noshade width="100%" size="1"></font>'
     ;;
     tail)
   print -r '
   <br><br><br>
   <font color="#000000" size="-2">
    &gt; Click on state to show system state informations<br>
    &gt; Click on system text to show system informations<br>
   </font>'
     ;;
   esac
   return 0
}


# $f "$ginh" "$ainh" "$tinh" "$oinh"
PutSysTbl()  {
   #<img align="middle" border="0" width="40" height="16" src="/img/red24.gif">
   local ctlhref="javascript:MkWinAnlCtl('$2','$3');"
   local newhref="javascript:MkWinAnlNew('$2','$3');"
   local _3='<font size="-1">'"$3"'</font>'
   local _4='<font size="-1">'"$4"'</font>'
   local _5='<font size="-1">'"$5"'</font>'
   local color='/img/ok.jpg'
   #[ "$1" == '+' ] && color='#00ff00'
   [ "$1" == '!' ] && color='/img/fail.jpg'
   print -r '<tr><td width="8%" bgcolor="#01669a" align="center" valign="center">
   <a class="aanl" href="'"$ctlhref"'">
   <img src="'"$color"'" border="0" width="29" height="32"></a>
   </td>
   <td width="33%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <b><a class="aanl" href="'"$newhref"'">'"&nbsp;$_3&nbsp;"'</a></b>
   </td>
   <td width="17%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <b><a class="aanl" href="'"$newhref"'">'"&nbsp;$_4&nbsp;"'</a></b>
   </td>
   <td width="42%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <b><a class="aanl" href="'"$newhref"'">'"&nbsp;$_5&nbsp;"'</a></b>
   </td></tr>'
   return 0
}


# "$Gdir"
MkAnlHtm()  {
   local ali=$1/$Fali id=0000 fail='&nbsp;' faila=0 ifile=................
   local ginh=........................................
   local ainh=........................................
   local oinh=........................................
   local tinh=........................................
   local gdir="$1"
   [ -z "$1" ] && gdir=.. ali=./null
   [ -d "$gdir"   ] || PutErrHtm nohdr "Directory not found: »$gdir«"
   [ -f "$ali" ] || PutErrHtm nohdr "File not found: »$ali«"
   catv Doctype '/<head><title>VBM SysTable</title>%n' Meta
   print -r %
     '<script language="JavaScript" src="/js/anl.js" type="text/javascript"></script>
      </head><body class="main">'
   PutSysTblTxt head
   print -r %
     '<table width="100%" border="0" align="center" valign="center"
       bgcolor="#01669a" cellpadding="2" cellspacing="2" cols="4">'
   < $ali
   while read id -
   do
      ifile=$gdir/$id/i
      [ -s $ifile ] || continue
      fail='&nbsp;'
      [ -f $gdir/$id/okay ] && fail='+'
      [ -f $gdir/$id/fail ] && fail='!'
      local g=g a=a o=o t=t
      5< $ifile
      while read -u5 id Hbuf && [ -n "$g$a$o$t" ]
      do
         [ id -eq Gid ] && ginh="$Hbuf" unset g
         [ id -eq Aid ] && ainh="$Hbuf" unset a
         [ id -eq Oid ] && oinh="$Hbuf" unset o
         [ id -eq Tid ] && tinh="$Hbuf" unset t
      done
      ><
      PutSysTbl "$fail" "$ginh" "$ainh" "$tinh" "$oinh"
   done
   ><
   [ -z "$1" ] &| expr "$ifile" :: '^%.%.%.' && {
      echo --
      MkGrpArr $Fgrpajs
      Failall=0
      MkGrpArr $Fgrpaejs Err && Failall=1
      Uvars Failall
   }
   print -r '</table>'
   PutSysTblTxt tail
   print -r '
    <script language="JavaScript" type="text/javascript">
     if ('"0$Update"'>0)  parent.frames[2].location.reload();
       window.setTimeout(''parent.frames[2].SetSel("anl"); parent.frames[2].SetSelOpt("'"$ginh"'",'"$Failall"');'',1500);
    </script>
    </body></html>'
   [ Update -ne 0 ] && Update=0 Uvars Update
   return 0
}


#GetInfoZ 5 Hbuf $id
GetInfoZ()  {
   local id=000 s=0
   while read -u$1 id $2
   do
      [ $id == $3 ] && return 0
   done
   seek 0 $1
   while read -u$1 id $2
   do
      [ $id == $3 ] && return 0
   done
   seek 0 $1
   $2=''
   return 1
}


        # function SetGInp(s, g)%
        # {%
        #    var df= "document.FormInfo.";%
        #    eval(df+g).value=%
        #       eval(df+s+".options["+df+s+".selectedIndex]").text;%
        # }%
# typ id len maxlen flg dflt text
# typ id cols rows  flg dflt text
# MkInfoHtm new
# MkInfoHtm exist $Adir/i
MkInfoHtm()  {
   [ -s $Finfobase ] || PutErrHtm nohdr "File not found: »$Finfobase«"
   local n=00 name=........
   local typ=.... id=000 len=00 max=00 flg=...
   local dflt=....................
   local text=...........................................................
   #[ $# -eq 0 -o "$1" == new ] && Hbuf=
   catv Doctype '/<head><title>VBM-MU-Dataset</title>%n' Meta %
        '/<script language="JavaScript" type="text/javascript">%n' %
        '/function GrpSel(sel)  {%n' %
        '/   document.forms[0].I' Gid '/.value=%n' %
        '/      sel.options[sel.selectedIndex].text.slice(2);%n' %
        '/}%n' %
        '/</script>%n' %
        '/</head>%n' %
        '/<body class="main" text="#ffd700">%n' %
        '/<form name="FormInfo" action="/cgi/new.cgi" method="POST">%n' %
        '/<pre><b>%n'
   [ "$1" == exist ] && 5< $2
   < $Finfobase
   while read typ id len max flg dflt text
   do
      ifset typ || continue
      expr "$typ" :: '^#' && continue
      conv '-t` ' text dflt
      [ ${#text} -gt 1 ] && prints sns36s- "" "$text" "  "
      [ "$max" == '=' ] && max=$len
      [ "$max" == '-' ] && let "max=len+len"
      let ++n
      [ "$dflt" == ' ' ] && dflt=
      Hbuf="$dflt"
      [ "$1" == exist ] && {
         GetInfoZ 5 Hbuf $id
         [ id -eq Pid ] && Hbuf="®$Hbuf®"
      }
      case $typ in
        itxt) name=I$id
              catv ".<input name=%"$name%" type=%"TEXT%" value=%"$Hbuf%"" %
                   ". size=%"$len%" maxlength=%"$max%"> "
        ;;
        ptxt) name=P$id
              catv ".<input name=%"$name%" type=%"PASSWORD%" value=%"$Hbuf%"" %
                   ". size=%"$len%" maxlength=%"$max%"> "
        ;;
        wtxt) name=W$id
              conv "-t${CA}${NL}t$ESC$CR"'t` ' Hbuf
              catv ".<textarea name=%"$name%" cols=%"$len%" rows=%"$max%"" %
                   ". wrap=%"soft%">" Hbuf ".</textarea>"
        ;;
      esac
   done
   ><
   [ "$1" == exist ] && ><
   catv '/%n</b></pre></form>%n'
   ifdef Newgrparr &&
   echo '<script language="JavaScript" type="text/javascript">
         window.setTimeout("parent.frames[2].location.reload();", 1500);
         </script>'
   catv '/</body></html>%n'
   return 0
}



. ./functions.bish
catv /%0 =5119,,Hbuf
. ./cvars.bish
#Lock lockuv
. ./uvars.bish
#Lock lockuv del

#mkdirs $Ddb
GetIds  #Gid Aid Oid Pid Fid Tid Iid Sid
VBMip=$SERVER_ADDR
#[ "$VBMip" == 999.888.777.666 ] && {
#   Gdir=$(grep '^[ %t]*[0-9.]%{7,15}[ %t]%{1,}scouw' /etc/hosts) &&
#      expr "$Gdir" :VBMip '%([0-9.]%{7,15}%)' && {
#         VBMip0=$VBMip Uvars VBMip; Uvars VBMip0; }
#}



[ "$REQUEST_METHOD" == GET ] && {
   [ -s $Fgrpajs ] || MkGrpArr $Fgrpajs
   [ -s $Fgrpaejs ] || MkGrpArr $Fgrpaejs Err && nop
   case "$QUERY_STRING" in
     main)
         [ RxTxAuto -gt 0 ] && RxTxRun || {
            [ MUcall -ne 0 ] && MUcall=00 Uvars MUcall
            [ -e ../tmp/rxtx ] && remove ../tmp/rxtx
            extern ../adm/rxtx.bish
            sleep -m 600
            RxTxRun || PutErrHtm "Start of RxTx daemon failed."
         }
         #GetGrpDir first Gdir || { echo "Location: /hlp/help.htm#start%n"; goend; }
         GetGrpDir first Gdir || Gdir=
         echo "Content-type: text/html%n"
         MkAnlHtm "$Gdir"
     ;;
     admin)
         #expr "$REQUEST_URI" :: '/adm.cgi?admin$' || PutErrHtm "Sorry!"
         echo "Content-type: text/html%n"
         MkAdmHtm
     ;;
     req=admact&?*)
         expr "$QUERY_STRING" :Hbuf '^req=admact&%(..*%)$'
         expr "$Hbuf" :Hbuf '&' += ' '
         Lock lockdb
         AdmAction "$Hbuf"
         Lock lockdb del
     ;;
     new)
         echo "Content-type: text/html%n"
         MkInfoHtm new
     ;;
     update)
         MkGrpArr $Fgrpajs
         local _Fail=0
         MkGrpArr $Fgrpaejs Err && _Fail=1
         [ _Fail -ne Failall ] && Failall=$_Fail Uvars Failall
         [ Update -eq 0 ] && Update=1 Uvars Update
         echo "Status: 204 No Content%n"
     ;;
     req=infofset&?*)
         expr "$QUERY_STRING" :Gdir 'req=infofset&' = 'req=info&' || Gdir=GX
         echo "Content-type: text/html%n"
         MkInfoFrameset "$Gdir"
     ;;
     req=info&?*)
         expr "$QUERY_STRING" :Gdir '&group=%([^&=]*%)' || Gdir=GX
         expr "$QUERY_STRING" :Adir '&anl=%([^&=]*%)$' || Adir=AX
         FormConv Gdir
         FormConv Adir
         GetGrpDir get Gdir || PutErrHtm "Not found: »$Gdir«"
         GetAnlDir Adir $Gdir || PutErrHtm "Not found: »$Adir«"
         echo "Content-type: text/html%n"
         MkInfoHtm exist $Adir/i
     ;;
     req=callsys&?*)
         expr "$QUERY_STRING" :Gdir '^req=callsys&%(..*%)$' || Gdir=
         CallSys "$Gdir"
         echo "Status: 204 No Content%n"
     ;;
     req=ctlfset&?*)
         expr "$QUERY_STRING" :Gdir 'req=ctlfset&' = 'req=ctl&' || Gdir=GX
         echo "Content-type: text/html%n"
         MkCtlFrameset "$Gdir"
     ;;
     req=ctlh)
         echo "Content-type: text/html%n"
         MkCtlhHtm
     ;;
     req=ctl&?*)
         expr "$QUERY_STRING" :Gdir '&group=%([^&=]*%)' || Gdir=GX
         expr "$QUERY_STRING" :Adir '&anl=%([^&=]*%)$' || Adir=AX
         FormConv Gdir
         FormConv Adir
         Grp="$Gdir" Anl="$Adir"
         GetGrpDir get Gdir || PutErrHtm "Not found: »$Gdir«"
         GetAnlDir Adir $Gdir || PutErrHtm "Not found: »$Adir«"
         echo "Content-type: text/html%n"
         MkCtlHtm "$Grp" "$Anl" $Adir
     ;;
     req=ctlact&?*)
         expr "$QUERY_STRING" :Hbuf '^req=ctlact&%(..*%)$'
         expr "$Hbuf" :Hbuf '&' += ' '
         Lock lockdb
         CtlAction "$Hbuf"
         Lock lockdb del
     ;;
     selinhaltget=?*)
         expr "$QUERY_STRING" :Hbuf '^[^=]%{1,}=%(..*%)$' || Hbuf=SGX
         FormConv Hbuf
         Gdir="$Hbuf"
         GetGrpDir get Gdir || Gdir=  #PutErrHtm "Not found: »$Hbuf«"
         echo "Content-type: text/html%n"
         MkAnlHtm $Gdir
     ;;
     *)  echo "Status: 205 Reset Content%n" ;;
   esac
   exit 0
}


[ "$REQUEST_METHOD" == POST ] && {
   [ "$CONTENT_LENGTH" -eq 0 ] && PutErrHtm "No content"
   case "$REQUEST_URI" in
     *adm.cgi)
         Lock lockdb
         if expr "$CONTENT_TYPE" =:: 'boundary=.'
         then
            FormAdmBakRead "$CONTENT_LENGTH" || { Gdir=$?
               Lock lockdb del
               PutErrHtm "Backup Upload failed [$Gdir]"
            }
         else
            FormAdmRead "$CONTENT_LENGTH" || echo "Status: 205 Reset Content%n"
         fi
         Lock lockdb del
         echo "Content-type: text/html%n"
         MkAdmHtm
     ;;
     *new.cgi)
         [ "$CONTENT_LENGTH" -gt 5000 ] && PutErrHtm "Content too large"
         Lock lockdb
         FormInfoRead "$CONTENT_LENGTH"
         Lock lockdb del
         echo "Content-type: text/html%n"
         MkInfoHtm exist $Adir/i
     ;;
     *main.cgi)
         PutErrHtm "Sorry!"
     ;;
     *)  echo "Status: 205 Reset Content%n" ;;
   esac
}

exit 0


#HTTP_HOST=www.schellong.com
#HTTP_REFERER=http://www.schellong.com/icnt.htm
#HTTP_USER_AGENT=Mozilla/4.73 [en] (X11; I; SCO_SV 3.2 i386)
#REMOTE_ADDR=193.159.66.48
#REMOTE_HOST=localhost
#SERVER_ADDR=195.20.225.17
#SERVER_NAME=schellong.com
#QUERY_STRING=0.1.i8x12.l0.d5.b000000.fffffff.r0
#REQUEST_METHOD=POST
#REQUEST_URI=.../new.cgi?new
#CONTENT_LENGTH=12345
#CONTENT_TYPE=x/y
#Location: url
#Status: 204 No Content
#Status: 205 Reset Content
#Status: 413 Request Entidy Too Large
#"Content-type: application/zip%n"
#"Content-type: application/x-tar%n"

#  <a class="elf" href="javascript:alert(''*** ALARM ***'');">alert()</a>
#  <a class="elf" href="javascript:void(confirm(''Wenn ja, dann nein! Oder vielleicht doch?''));">confirm()</a>
#  <a class="elf" href="javascript:void(prompt(''Was eingeben - aber prompt!'',''Dödel''));">prompt()</a>


###  muee.cgi  #############################################

#!./bish_folso_cgi -p_

. ./functions.bish
. ./cvars.bish
#Lock lockuv
. ./uvars.bish
#Lock lockuv del
prints vs70 Nn
catv /%0 =2047,,Hbuf
. ./initee.bish

#bin Var: adr typ wlen dst dsteye dflt1 mi1 ma1 dflt2 mi2 ma2 dfltbm flg unit nam txt
# 1  2    3   4   5    6   7      8     9   10  11    12  13  14     15  16   17  18
EEconvertTxt()  {
   local b=10 len=00000 blen=00$5 dflt="$8" min="$9" max="${10}"
   EEmin=''
   let "blen<<=1"
   len=$blen
   [ MUspsw -eq 1 -a "${11}" != '"' ] && dflt="${11}"
   [ MUspsw -eq 1 -a "${12}" != '"' ] && min="${12}" max="${13}"
   [ MUspsw -eq 2 -a "${14}" != '"' ] && dflt="${14}"
   case $6 in
     x)  b=16 ;;
     b)  b=2 ;;
   esac
   [ $7 == b ] && b=2
   case $4 in
     w)  base -w $2 +$b $2
         [ $6 == i -a $2 -gt 32767 ] && let "$2-=65536" ;;
     L)  base -L $2 +$b $2 ;;
     S)  base -W $2 +w $2
         [ $6 == 0 ] && $2="${{2}" let "--len"
         [ $6 == m ] && expr "${{2}" :$2 ' %{1,}$' = ''
         InputLen=$len
         return 0 ;;
   esac
   if [ $max != '"' ]
   then
      len=${#max}
      [ ${#min} -gt len ] && len=${#min}
      [ $6 == x -a $7 == b ] && let "len<<=2"
      [ b -ne 10 ] && goend
      local v=........
      EEmin=$min EEmax=$max EEdflt=$dflt
      for v in EEmin EEmax EEdflt
      do
         case $7 in
           .1)  expr "${{v}" :$v '.$'   '.&' ;;
           .2)  let "${{#v}==1" && $v="${{v}0"
                expr "${{v}" :$v '..$'   '.&' ;;
            1)  let "$v/=10" ;;
            m)  let "$v/=60" ;;
            =)  ;;
            *)  EEmin='' goend 2 ;;
         esac
         expr "${{v}" :: '^%.' && $v="0${{v}"
      done
   else
      case $b in
        16)  let "len<<=1";;
         2)  let "len<<=3";;
        10)  len=${#dflt};;
      esac
   fi
   [ b -ne 10 ] && prints vsf0$len $2 "${{2}"
   case $7 in
     .1)  let "++len"; expr "${{2}" :$2 '.$'   '.&' ;;
     .2)  let "++len, ${{#2}==1" && $2="${{2}0"
          expr "${{2}" :$2 '..$'   '.&' ;;
      1)  let "--len, $2/=10" ;;
      m)  let "--len, $2/=60" ;;
      b)  ;;
      a)  let "$2=512-$2"; len=4 ;;
     bb)  let "b=$2&255, $2>>=8"
          prints vssf02 $2 ${{2}. $b
          len="${{#2}" ;;
      J)  let "$2<100" && let "$2+=2000"
          let "$2>2079" && let "$2-=100"
          len=4 ;;
   esac
   expr "${{2}" :: '^%.' && $2="0${{2}" #let "++len"
   [ $6 == i ] && expr "${{2}" :: '^[-+]' || let "++len"
   InputLen=$len
   return 0
}


#eye var:$VAL adr typ wlen dst dsteye dflt1 mi1 ma1 dflt2 mi2 ma2 dfltbm flg unit nam txt
# 1  2        3   4   5    6   7      8     9   10  11    12  13  14     15  16   17  18
EEconvertEye()  {
   [ $15 == ro ] && return 1
   local var=........ val="$2" _7=$7
   local b=10 len=000 blen=00$5
   let "blen<<=1, len=blen-1"
   expr "$2" :var '^%([^:]%{1,}%):'
   expr "$val" :val '^[^:]%{1,}:' = ''
   [ $7 == .1 -o $7 == .2 -o $7 == 1 -o $7 == m -o $7 == a -o $7 == J ] &&
      expr "$val" :val '[^0-9-]' += ''
   [ $7 == = -a $4 != S ] && _7=$6
   case $_7 in
     u)  expr "$val" :val '[^0-9]' += '' ;;
     i)  expr "$val" :val '[^0-9-]' += '' ;;
     b)  expr "$val" :val '[^01]' += ''
         b=2 ;;
     x)  expr "$val" :val '[^0-9a-fA-F]' += ''
         b=16 ;;
     1)  let "val*=10" ;;
     m)  let "val*=60" ;;
     a)  let "val=512-val" ;;
    bb)  expr "$val" :val '%(%d%.%d%{1,2}%)'
         expr "$val" :val '%(%d%)%.%(%d%{1,2}%)'   '(%1<<8)+%2'
         let "val=$val" ;;
     J)  let "val-=1900, val>=100" && let "val-=100"
         let "val<0" && val=80
         let "val>99" && val=79 ;;
   esac
   case $4 in
     w)  base -$b val +w $var; return 0 ;;
     L)  base -$b val +L $var; return 0 ;;
     S)  [ $6 == 0 ] && {
            catv $len,val =val:
            prints vs-F000$blen val "$val"
         }
         [ $6 == m -a ${#val} -lt blen ] && prints vs-$blen val "$val"
         base -w val +W $var ;;
   esac
   return 0
}


#htm $TXT adr typ wlen dst dsteye dflt1 mi1 ma1 dflt2 mi2 ma2 dfltbm flg unit nam txt
# 1  2    3   4   5    6   7      8     9   10  11    12  13  14     15  16   17  18
EEconvertHtm()  {
   local adr=00000 txt="${18}" min=$9 max=${10} unit
   let "adr=$3"
   [ MUspsw -eq 1 -a "${12}" != '"' ] && min="${12}" max="${13}"
   [ ${16} != '"' ] && unit=" ${16}"
   local onfoc
   [ $6 == u -a $min == 0 -a $max == 1 ] && onfoc=" onFocus=%"Toggle01(this)%""
   ifset EEmin || EEmax= EEdflt=
   ifset EEmin && EEmin="</b><font color=%"#bbbbbb%"> &nbsp;&nbsp;[$EEmin " %
                  EEmax=" $EEmax]</font><b>"
   conv '-t` ' txt
   prints s25ss  "$txt" %
      "  <input name=%"A$adr%" value=%"$2%" size=%"$InputLen%"" %
      " maxlength=%"$InputLen%"$onfoc>$unit$EEmin$EEdflt$EEmax"
   return 0
}


#C:\DATA.MUC $Fmueep
MkMucFile()  {
   local n=00000 sz=00000 o0=00000 o=00000 zv="$RN" c=.. boundary
   cat > $Fmucupld
   #< $2
   < $Fmucupld
   while readl Hbuf
   do
      expr "$Hbuf" :boundary '%(-%{2,}[^-]%{1,}%)"%{0,1}$' && break
      let "++n>0" && { >< ; return 1; }
   done
   while readl Hbuf
   do
      ifset Hbuf || break
   done
   n=0
   > $1
   while catv +0,50,0 =Hbuf:
   do
      let "${#Hbuf}!=50" && break
      catv 48,2,Hbuf =c:
      cmpv zv c || break
      catv Hbuf
      let "++n>=100" && break
   done
   let "n!=100" && { ><< ; return 2; }
   catv /%r%n boundary /--%r%n =boundary:
   catv /%r%r =c:
   seek + 0 o0
   while seek + 0 o; catv +0,1000,0 =Hbuf:
   do
      conv "-T$c" Hbuf
      let "o+=$., $.<0" && continue
      catv $o,${#boundary},0 =Hbuf:
      cmpv Hbuf boundary || { let "++o"; seek $o 0; continue; }
      catv $o0,$((o-o0)),0
      let "o+=${#boundary}"
      catv $o,,0
      break
   done
   ><<
   fstat -sv sz $1
   let "sz!=5000+2048" && return 3
   catv 5000,2048,0  < $1 | base -W +w > $Fmueebin
   return 0
}


# C:\MUEE A:\DATA\EEBASE $Fmueep Nn (alt)
# Nn
ChangeMUee()  {
   local rub=00 offs=000000 nam=........ sp=00 sw=00 spsw=0
   local adr=00000 typ=.... len=00000 flg=........ gid=0000 aid=0000
   local val=.....................................
   local f=............................................
   catv 0 =1000,Hbuf:
   conv '-t& ' Hbuf
   < $Feebase
   for Hbuf in $Hbuf
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
         Rubrik)  $1="$Hbuf"
                  for 3 rub gid aid in $Hbuf; do break; done
                  let "offs=(rub-1)*6"
                  catv $offs,5,BasePos =offs:
                  seek $offs 0
                  readl Hbuf
                  3<> $Ddb/$gid/$aid/eepr
                  ;;
        A[0-9]*)  val="$Hbuf"
                  conv -DA nam
                  while readl Hbuf
                  do
                     expr "$Hbuf" :: '^@' || break 2
                     expr "$Hbuf" :: '^@%d' || continue
                     conv -D@ Hbuf
                     for 16 adr typ len f f f f f f f f f flg f f f in $Hbuf
                     do break; done
                     let "len<<=1, adr=$adr, adr<<=1, (nam<<1)==adr" || continue
                     EEconvertEye eye "Hbuf:$val" $Hbuf || continue 2
                     [ $flg == SP ] && sp=$val
                     [ $flg == SW ] && sw=$val
                     catv $len,Hbuf =$adr,,3
                     continue 2
                  done
                  ;;
      esac
   done
   ><<
   [ sw -eq 1 ] && sp=0 spsw=2
   [ sp -eq 1 ] && spsw=1
   [ MUspsw -ne spsw ] && { MUspsw=$spsw  Uvars MUspsw; CopyCmuee; }
   return 0
}



# $Fmueehtm C:\MUEE A:\DATA\EEBASE $Nn (alt)
# $rubrik $gid $aid
MkEErfHtm()  {
   local r=0 e=0 rub=$1 offs=000000 feepr=$Ddb/$2/$3/eepr
   local adr=00000 len=00000 siga=..........
   let "rub<1" && rub=1
   catv $(([rub-1]*6)),5,BasePos =offs:
   < $Feebase
   seek $offs 0
   readl Hbuf
   seek + 0 offs
   ><
   expr "$Hbuf" :: '^!' && r=e conv -D! Hbuf
   catv Doctype '/<html><head><title></title>%n' Meta
   echo '<script language="JavaScript">%
         function Toggle01(i)%
         {%
            var inh= i.value;%
            if (inh=="0" || inh=="" || inh==" ")%
                  i.value= "1";%
            else  i.value= "0";%
            i.blur();%
         }%
         </script>%012%c'
   siga=siga.js
   [ MUspsw -eq 2 ] && siga=sigabm.js
   [ $r == e ] &&
      echo '<script language="JavaScript" %
            src="/js/'"$siga"'" type="text/javascript"></script>%
            <script language="JavaScript" %
            src="/js/sig.js" type="text/javascript"></script>%
            %012%c'
   echo '</head>%012<body class="main" text="#ffd700">%012%c'
   [ $r == e ] && echo '<script language="JavaScript">Wr("'"$Hbuf"'");</script>%012%c'
   catv '.<form name="Vis" action="/cgi/eepr.cgi" method="POST"><pre><b>' /%n %
        '.<input name="Rubrik" type="HIDDEN" value="'"$rub $2 $3"'">' /%n
   [ $r == e ] && catv '.<input name="Signal" type="HIDDEN">' /%n
                       #Reset=="Dflt(1);"
   [ $r == 0 ] && catv '.<h2>' Hbuf '.</h2>' /%n%n
   < $Feebase
   seek $offs 0
   while readl Hbuf
   do
      expr "$Hbuf" :e '^@%(.%)' || break
      [ "$e" == : ] && {
         conv -D@D: Hbuf
         prints s27s "" "</b><font color=%"#ffffff%">$Hbuf</font><b>"
         continue
      }
      conv -D@ Hbuf
      for 3 adr len len in $Hbuf; do break; done
      let "len<<=1" "adr=$adr" "adr<<=1"
      catv $adr,$len,3 =Nn:  3<> $feepr
      EEconvertTxt txt Nn $Hbuf
      EEconvertHtm htm "$Nn" $Hbuf
   done
   echo '</b></pre></form>%012%c'
   [ $r == e ] && echo '<script language="JavaScript">Dflt(0);</script>%012%c'
   echo '</body></html>%012%c'
   ><
   return 0
}


# gid.aid
MkEElfHtm()  {
   local n=00 offs=000000
   catv Doctype '/<html><head><title>VBM EE-Rubriken</title>%n' Meta
   echo '<base target="EErf">%n</head>%n<body class="main" text="#ffd700"><b>'
   < $Feebase
   for offs in $BasePos
   do
      seek $offs 0
      readl Hbuf
      let "++n"
      catv '.<a class="elf" href="/cgi/muee.cgi?eerf.' n "..$1" %
           '.">' Hbuf '.</a><br><br>' /%n
   done
   echo '</b></body></html>'
   ><
   return 0
}


# gid.aid
MkEeFrameset()  {
   catv Doctype '/<head><title>VBM eemain</title>%n' Meta
   print -r '</head>
   <frameset rows="*,77" bordercolor="#ffd700" border="2">
      <frameset cols="20%,*" bordercolor="#ffd700" border="2">
         <frame name="EElf" src="/cgi/muee.cgi?eelf.'"$1"'" scrolling="auto"
          frameborder="0" marginwidth="10" marginheight="30">
         <frame name="EErf" src="/cgi/muee.cgi?eerf.0.'"$1"'" scrolling="yes"
          frameborder="0" marginwidth="20" marginheight="0">
      </frameset>
      <frame name="EEbuttons" src="/htm/eebuttons.htm" scrolling="no"
       frameborder="0" marginwidth="30" marginheight="10">
   </frameset>
   <body bgcolor="#39458f" text="#ffd700"
    link="#ffd700" vlink="#ffd700" alink="#39458f">
   <br>&nbsp;
   <h1 align="center">Browser NoFrames!</h1>
   </body>
   </html>'
   return 0
}




[ "$REQUEST_METHOD" == POST ] && {
   expr "$REQUEST_URI" :: '/eepr%.cgi$' || PutErrHtm "Sorry!"
   local sz="$CONTENT_LENGTH"
   if [ sz -ge 2048 ]
   then
      #MkMucFile $Fmueemuc Fmueep || [ $? -gt 1 ] && CopyCmuee
      #cat $Feelf > $Fmueehtm
      #echo "Status: 204 No Content%n"
      PutErrHtm "Not implemented."
      echo "Status: 205 Reset Content%n"
   else
      #MUee=tomu  Uvars MUee
      #[ -s $Fmueebin ] || CopyCmuee
      ChangeMUee Nn
      #base -W +w < $Fmueebin | catv 2048,0 =5000,2048,3  3<> $Fmueemuc
      echo "Content-type: text/html%n"
      MkEErfHtm $Nn
   fi
   exit 0
}


[ "$REQUEST_METHOD" == GET ] && {
   local n="$QUERY_STRING"
   case "$n" in
      defaults__)
         CopyCmuee
         echo "Content-type: text/html%n"
         cat ../eemain.htm
      ;;
      eelf.?*)
         expr "$n" :n '^eelf.%(..*%)$'
         echo "Content-type: text/html%n"
         MkEElfHtm $n
      ;;
      eerf.?*)
         expr "$n" :n '^eerf.%(..*%)$'
         expr "$n" :n '[^0-9]' += ' '
         echo "Content-type: text/html%n"
         MkEErfHtm $n
      ;;
      eemain.?*)
         expr "$n" :n '^eemain.%(..*%)$'
         echo "Content-type: text/html%n"
         MkEeFrameset $n
      ;;
      *)
         #[ -s $Fmueebin ] || CopyCmuee
         #echo "Content-type: text/html%n"
         #MkEErfHtm Fmueehtm $Fmueebin $Feebase $n
         echo "Status: 205 Reset Content%n" ;;
   esac
}
exit 0


#HTTP_HOST=www.schellong.com
#HTTP_REFERER=http://www.schellong.com/icnt.htm
#HTTP_USER_AGENT=Mozilla/4.73 [en] (X11; I; SCO_SV 3.2 i386)
#REMOTE_ADDR=193.159.66.48
#REMOTE_HOST=localhost
#SERVER_ADDR=195.20.225.17
#SERVER_NAME=schellong.com
#QUERY_STRING=0.1.i8x12.l0.d5.b000000.fffffff.r0
#REQUEST_METHOD=POST
#CONTENT_LENGTH=12345
#CONTENT_TYPE=x/y
#Location: url
#Status: 204 No Content
#Status: 205 Reset Content





###  new.cgi  #############################################

#!./bish_folso_cgi -p_



# Buf
Escape()  {
   local c=. h=... spez="${{1}"
   expr "${{1}" :spez '[a-zA-Z_0-9&=.-]' += ''
   ifset spez || return 0
   conv '-d%' spez
   [ $. -ge 0 ] && expr "${{1}" :$1 '%%' += '%25'
   while ifset spez
   do
      catv 1,spez =c
      conv "-d$c" spez
      base -b c +16 h
      expr "${{1}" :$1 "$c" += '%'$h
   done
   return 0
}


CkPasswd()  {
   [ 0${#1} -lt 3 -o 0${#1} -gt 15 ] && return 1
   expr "$1" :: '[^!-~]' && return 1
   #expr "$1" :: '[+&]' && return 1
   return 0
}


RxTxRun()  {
   [ $# -eq 0 ] && {
      extern $ps_cmd | grep -qm 'rxtx.bish[ %t]%{1,}run'
      return
   }
   [ "$1" == sigterm ] && {
      local pid
      extern $ps_cmd | pid=$( grep -m 'rxtx.bish[ %t]%{1,}run' ) || return
      catv pid /%n | read - pid -
      expr "$pid" :: '^[0-9]%{1,}$' || return
      kill $pid
   }
   return
}


# $Adir "$sta"
CkChStation()  {
   local sta="$2" gid=0000 aid=0000 buf:.200
   expr "$1" :gid '%([0-9]*%)/[0-9]*$'
   expr "$1" :aid '[0-9]*/%([0-9]*%)$'
   buf="$(- grep -m "^$gid $aid " $Fstation )" || return
   expr "$buf" :buf "^$gid $aid "'%(.*%)$' || return
   cmpv buf sta && return 0
   cat $Fstation | {
      > $Fstation
      while readl buf
      do
         expr "$buf" :: "^$gid $aid " || { catv buf /%n; continue; }
         print -r "$gid $aid $sta"
      done
      ><
   }
   return 0
}

# $Adir "$sta"
AddStation()  {
   local gid=0000 aid=0000
   expr "$1" :gid '%([0-9]*%)/[0-9]*$'
   expr "$1" :aid '[0-9]*/%([0-9]*%)$'
   print -r "$gid $aid $2" >> $Fstation
   [ CTbuild -eq 0 ] && CTbuild=1 Uvars CTbuild
   return 0
}


#CkGA Gdir $Ddb  "$grp" || MkGA $Gdir $Ddb  "$grp"
#CkGA Adir $Gdir "$anl" || MkGA $Adir $Gdir "$anl"
CkGA()  {
   local ali=$2/$Fali dali=0000 dali0=0000 min=0000
   local bez; prints vs50 bez
   mkdirs $2
   [ -e $ali ] || : > $ali
   < $ali
   while read dali bez
   do
      [ "$bez" == "$3" ] && { ><; $1=$2/$dali; return 0; }
      let "min==0&&dali-dali0>1" && let "min=dali0+1"
      dali0=$dali
   done
   ><
   let "++dali, min==0" && $1=$2/$dali
   let "min>0" && $1=$2/$min
   return 1
}

#CkGA Gdir $Ddb  "$grp" || MkGA $Gdir $Ddb  "$grp"
#CkGA Adir $Gdir "$anl" || MkGA $Adir $Gdir "$anl"
MkGA()  {
   local ali=$2/$Fali dali=0000 dali0=0000 w=0
   local bez; prints vs50 bez
   mkdirs $2 $1
   expr "$1" :dali0 '/%([0-9]%{1,4}%)$'
   [ -s $ali ] || { catv dali0 ". $3" /%n > $ali; return 0; }
   cat < $ali | {
      > $ali
      while read dali bez
      do
         [ dali -gt dali0 -a w -eq 0 ] && w=1 catv dali0 ". $3" /%n
         catv dali ". " bez /%n
      done
      [ w -eq 0 ] && catv dali0 ". $3" /%n
      ><
   }
   return 0
}


# len
FormInfoRead()  {
   local g=g a=a i=i n=000 nam=.................... tmp=../tmp/newtmp
   local ctv=0000 ctv0=0000 sta=....................
   local grp; prints vs50 grp
   local anl; prints vs50 anl
   expr "$1" :: '^[0-9]%{2,4}$' || PutErrHtm "Length value: »$1«"
   let "$1<=3||$1>5000" && PutErrHtm "Length value: »$1«"
   catv $1,0 =Hbuf:
   conv -'t& ' Hbuf
   > $tmp
   for Hbuf in $Hbuf
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        I[0-9]*)
           Hbuf=$Hbuf
           [ ${#Hbuf} -eq 0 ] && goend
           [ $nam == I$Gid ] && grp="$Hbuf" unset g
           [ $nam == I$Aid ] && anl="$Hbuf" unset a
           [ $nam == I$Iid ] && sta="$Hbuf" unset i
           [ $nam == I$Cid ] && ctv="$Hbuf"
        ;;
        W[0-9]*)
           conv "-t${CR}${ESC}t$NL${CA}"'t `' Hbuf
        ;;
        P[0-9]*)
           expr "$Hbuf" :: '^®[^®]%{3,}®$' && { conv -d® Hbuf; goend; }
           CkPasswd "$Hbuf" || { ><; remove $tmp; PutErrHtm "Password wrong!"; }
           catv Hbuf | extern ./mailcode -en -c "$MC64" | catv 0 =Hbuf:
        ;;
      esac
      expr "$nam" :: '^[IWP][0-9]%{1,3}$' || continue
      catv 1,3,nam "/ " Hbuf RN
   done
   ><
   [ -n "$g$a$i" ] && { remove $tmp
      PutErrHtm "Group, System and Sys-ID are essential!"; }
   expr "$grp" :: '^[!* ]' && { remove $tmp; PutErrHtm "!* not allowed: »$grp«"; }
   CkGA Gdir $Ddb  "$grp" || MkGA $Gdir $Ddb  "$grp" && MkGrpArr $Fgrpajs
   CkGA Adir $Gdir "$anl" || MkGA $Adir $Gdir "$anl" && AddStation $Adir "$sta"
   [ -s $Adir/i ] && ctv0="$(- grep -m "^$Cid " $Adir/i )" && {
      expr "$ctv0" :ctv0 '^[0-9]%{1,} %([0-9]%{1,}%)' || ctv0=0
      [ ctv -ne ctv0 -a CTbuild -eq 0 ] && CTbuild=1 Uvars CTbuild
   }
   cat $tmp > $Adir/i
   remove $tmp
   CkChStation $Adir "$sta" || PutErrHtm "Change to »$sta« failed."
   return 0
}

#/db/gruppe/mu/
#/db/alias.txt
#/db/1/alias.txt
#/db/1/1/i(info) ee status fail okay
# first/get Gdir=''/Gdir="grpbez"
GetGrpDir()  {
   [ -s $Ddb/$Fali ] || return 1
   local id=0000 inh
   case $1 in
     first)
          catv 5000,0 =Hbuf: < $Ddb/$Fali
          expr "$Hbuf" :Hbuf '%([0-9]%{1,} %)[^%n]*%n' + '%1'
          set +f
          for id in $Hbuf
          do
             : $Ddb/$id/[1-9]*/i
             [ "$]" -gt 0 ] && { set -f; $2=$Ddb/$id; return 0; }
          done
          set -f
     ;;
     get)
          < $Ddb/$Fali
          while read id inh
          do
             cmpv $2 inh || continue
             $2=$Ddb/$id; ><; return 0
          done
          ><
     ;;
   esac
   return 1
}


# Adir $Gdir
GetAnlDir()  {
   local id=0000 inh
   [ -s $2/$Fali ] || return 1
   < $2/$Fali
   while read id inh
   do
      cmpv $1 inh || continue
      $1=$2/$id; ><; return 0
   done
   ><
   return 1
}


# $Fgrpajs
# $Fgrpaejs "Err"
MkGrpArr()  {
   local r=0 n=000 i=000 id=0000 grp
   Lock lockga
   [ -e $Ddb/$Fali ] || : > $Ddb/$Fali
   [ $# -ge 2 ] && r=1
   [ $# -lt 2 ] && Newgrparr=1
   > $1
   < $Ddb/$Fali
   while readl grp
   do  let ++n;  done
   echo "var GrpAn$2= $n;"
   [ n -gt 0 ] && echo "var GrpArr$2= new Array($n);"
   [ n -eq 0 ] && echo "var GrpArr$2= new Array(1);%nGrpArr${2}[0]= %"%";"
   i=0
   seek 0 0
   set +f
   while read id grp
   do
      [ $# -ge 2 ] && {
         grp='  '
         : $Ddb/$id/[1-9]*/fail
         [ $] -gt 0 ] && r=0 grp='! '
      }
      print -r "GrpArr${2}[$i]= %"$grp%";"
      let ++i
   done
   ><<
   set -f
   Lock lockga del
   #[ $# -ge 2 ] && read - - i < $Fgrpajs && [ i -ne n ] && MkGrpArr $Fgrpajs
   return $r
}


# user pass
SetPass()  {
   local pw="$2"
   WrLog "Password operation: $1" "change"
   [ 0${#1} -lt 1 -o 0${#2} -lt 3 -a 0${#2} -gt 0 ] &&
      PutErrHtm "User/Pass length not accepted."
   [ 0${#2} -eq 0 ] && pw='`{!@#$%^vI*")7Q'
   expr "$1" :: '[^a-zA-Z0-9_]' && PutErrHtm "User name contains wrong chars."
   expr "$1" :: '^[a-zA-Z]' || PutErrHtm "User name must begin with [a-zA-Z]."
   cd ../adm
   htpasswd -bm .wmspw "$1" "$pw" 2>/dev/null ||
            PutErrHtm "Password operation failed."
   cd -
   return 0
}


# $txtfile
PutTxt2Htm()  {
   catv Doctype '/<head><title>TXT2HTML</title>%n' Meta
   print -r '</head>
    <body class="main"><div class="stat1"><form><b>
    <input class="butt" type="button" value="Back" onClick="window.back();">
    </b></form></div>'
   print -rn '<div class="stat"><pre><b>'
   cat "$1"
   print -r '</b></pre></div></body></html>'
   return 0
}


# boundary: ---------12345 (mindestens: --)
# boundary: erste Zeile
# Beginn: nach Leerzeile (%r%n)
# Ende: %r%nboundary--%r%n
# Achtung: boundary aus CONTENT_TYPE hat vorn "--" weniger!
# len
FormAdmBakRead()  {
   local boundary="$CONTENT_TYPE" arch=../tmp/db.tar
   local sz:010 bp6:010 z:.500
   expr "$boundary" =:boundary 'boundary=%(..*%)' || return 1
   #catv boundary > ../tmp/boundary
   let "bp6=${#boundary}+8"
   catv 1000,0 | {
      while readl z
      do
         ifset z || break
      done
      catv 0 > $arch
      catv ,.
   }
   [ $. -le 0 ] && { remove -s $arch; return 2; }
   cat >> $arch
   fstat -sv sz $arch
   [ sz -lt bp6 ] && { remove -s $arch; return 3; }
   catv -$bp6:,,0 =z:  < $arch
   expr "$z" :: "^%r%n--$boundary--%r%n%$" || { remove -s $arch; return 4; }
   let "sz-=bp6"
   fstat +s $sz $arch || { remove -s $arch; return 5; }
   return 0
}


# len
FormAdmRead()  {
   local ja=---- mo=-- ta=-- st=-- mi=-- se=00 ip=999.888.777.666
   local tp=T md=0 rt=0 ct=0 ctb=0 as=0 sig=0
   local nam=.................... user=................
   expr "$1" :: '^[0-9]%{1,4}$' || PutErrHtm "Length value: »$1«"
   let "$1<=3||$1>2000" && PutErrHtm "Length value: »$1«"
   catv $1,0 =Hbuf:
   conv -'t& ' Hbuf
   for Hbuf in $Hbuf
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        Shut)  : > ../tmp/rxtx
               sleep -m 800
               RxTxRun && RxTxRun sigterm
               [ "$OsTyp" == FreeBSD ] && {
                  echo "Content-type: text/plain%n"
                  extern ../adm/syscmd.bish shutdown "shutdown -h now"
		  sleep 10
		  return 2
                  #extern ../adm/syscmd.bish shutdown halt
                  #UW: shutdown -y -g0
               }
        ;;
        RxTx)  rt=1 ;;
        Auto)  as=1 ;;
        Term)  sig=1 ;;
        Modem) md=1 ;;
        Puls)  tp=P ;;
        Conn)  ct=1 ;;
        Build) ctb=1 ;;
        MInit) cmpv MOinitapp Hbuf || MOinitapp="$Hbuf" Uvars MOinitapp ;;
        Day)   ta=$Hbuf ;;
        Mon)   mo=$Hbuf ;;
        Year)  ja=$Hbuf ;;
        Hour)  st=$Hbuf ;;
        Min)   mi=$Hbuf ;;
        IP)
           CheckIP "$Hbuf" || PutErrHtm "IP address: »$Hbuf«"
           ip=$Hbuf
        ;;
        User)
           for ip in admin new vbm root adm cie sam selotronic cfg config pass
           do  cmpv -i ip Hbuf && PutErrHtm "User name not applicable."; done
           user="$Hbuf" ;;
        Pass)   [ -n "$user" ] && SetPass "$user" "$Hbuf" ;;
        AdmPw)  [ -n "$Hbuf" ] && SetPass admin   "$Hbuf" ;;
        NewPw)  [ -n "$Hbuf" ] && SetPass new     "$Hbuf" ;;
        AdmLs)
           expr "$Hbuf" :: '^[0-9]%{1,}$' &&
              [ Hbuf -ne AdmLogSz ] && AdmLogSz=$Hbuf Uvars AdmLogSz
        ;;
        SysLs)
           expr "$Hbuf" :: '^[0-9]%{1,}$' &&
              [ Hbuf -ne SysLogSz ] && SysLogSz=$Hbuf Uvars SysLogSz
        ;;
      esac
   done
   [ "$TPwahl" != "$tp" ] && TPwahl=$tp Uvars TPwahl
   [ MOwahl -ne md ] && MOwahl=$md Uvars MOwahl
   [ RxTxAuto -ne as ] && RxTxAuto=$as Uvars RxTxAuto
   [ ConnTest -ne ct ] && ConnTest=$ct Uvars ConnTest
   [ CTbuild -ne ctb ] && CTbuild=$ctb Uvars CTbuild
   if RxTxRun
   then
      [ rt -gt 0 ] && goend
      : > ../tmp/rxtx
      sleep -m 800
      [ sig -gt 0 ] && RxTxRun && RxTxRun sigterm
   else
      [ MUcall -ne 0 ] && MUcall=00 Uvars MUcall
      remove -s ../tmp/rxtx
      [ rt -eq 0 ] && goend
      extern ../adm/rxtx.bish
      sleep -m 200
   fi
   expr "$ta$mo$ja$st$mi$se" :: '^[0-9]%{7,14}$' && {
      : $ta $mo $ja $st $mi
      [ 0$} -eq 5 ] && extern ../adm/syscmd.bish date $ta $mo $ja $st $mi
   }
   return 0
}
#date -u MMDDhhmmCCYY


# "dir|file=obj act=aaa"
AdmAction()  {
   local id=0000 nam=.......... obj=..............................
   for Hbuf in $1
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        file)  obj="$Hbuf" ;;
        act)
           case "$Hbuf" in
             del)  [ -f "$obj" ] || PutErrHtm "File not found: »$obj«"
                   remove -s $obj ;;
             trun) [ -f "$obj" ] || PutErrHtm "File not found: »$obj«"
                   : > $obj ;;
             log)  echo "Content-type: text/html%n"
                   PutTxt2Htm $obj
                   return 0 ;;
             src)  echo "Content-type: text/plain%n"
                   cat $obj
                   return 0 ;;
             bak)  #tar xepf -
                   cat uvars.bish > $Ddb/uvars.bish
                   extern tar chf $obj $Ddb
                   WrLog "File:$obj" "created" ;;
             down) WrLog "File:$obj" "downloaded"
                   expr "$obj" :obj '^%.%./%(..*%)$'
                   echo "Location: http://$SERVER_ADDR:$SERVER_PORT/$obj%n"
                   return 0 ;;
             upda) extern tar xepf $obj || PutErrHtm "Backup Update failed"
                   WrLog "File:$obj" "database updated from file"
                   [ -s $Ddb/uvars.bish ] && cat $Ddb/uvars.bish > uvars.bish
                   ;;
           esac
        ;;
      esac
   done
   #echo "Status: 204 No Content%n"
   echo "Content-type: text/html%n"
   MkAdmHtm
   return 0
}


#
MkAdmHtm()  {
   local exist=1 iv=0 s=00 titel=.............................. script=........
   local file=$titel act=........ action=$titel titel0=starttitel
   catv Doctype '/<head><title>VBM admin</title>%n' Meta
   echo '<script language="JavaScript" src="/js/help.js" type="text/javascript">
         </script>
         <script language="JavaScript" type="text/javascript">
          function GrpSel(sel)  { return; }
         </script>'
   print -r '</head>
    <body class="main">
    <div class="dctl"><b><font size="+2">'"VBM Administration"'</font>
     </b><br><br>
    '
   extern /bin/date -u +'%A, %e. %b. %Y &nbsp;%X &nbsp;%Z'
   echo '</div><div class="dctlm"><pre><b>%c'
   echo '<center><u>Files</u></center>%c'
   for 6 titel file act action iv script in %
         ADMLOG  $Fadmlog          log  Display  2 adm %
         ADMLOG  $Fadmlog          src  Source   2 adm %
         ADMLOG  $Fadmlog          trun Truncate 2 adm %
       SYSIDTXT  $Fstation         log  Display  2 adm %
       SYSIDTXT  $Fstation         src  Source   2 adm %
       CONNTEST  $Fconntest        log  Display  2 adm %
       CONNTEST  $Fconntest        src  Source   2 adm %
       PASSWORD  ../adm/.wmspw     src  Source   2 adm %
         BACKUP  ../tmp/db.tar     bak  Create   0 adm %
         BACKUP  ../tmp/db.tar     down Download 2 adm %
         BACKUP  ../tmp/db.tar     del  Delete   3 adm %
         BACKUP  ../tmp/db.tar     upda !Update! 2 adm
   do
      Hbuf="$file" Escape Hbuf
      let "s=10-${#action}"
      cmpv titel titel0 || {
         echo %n
         prints s14- "$titel: "
         PutFileDate $file; exist=$?
         echo '   %c'
      }
      if [ exist -eq iv -o iv -eq 3 -a exist -gt 0 ]
      then
         prints ssss$s- '<a class="actl" href="/cgi/'"$script"'.cgi?req=admact' %
                        '&file='"$Hbuf" %
                        '&act='"$act"'">'"$action"'</a>' ''
      else
         prints   ss$s- '<font color="#b0b0b0">'"$action"'</font>' ''
      fi
      titel0=$titel
   done
   unset titel titel0 file act action iv script exist s
   local w=00 n=- siz=000 max=000 nam=........ typ=........
   local txt=.............................. val=..............................
   local ja=2002 mo=12 ta=31 st=24 mi=60 se=60 rxtx=0 puls=0
   systime val
   ctime ja mo ta st mi se $val
   [ "$TPwahl" != T ] && puls=1
   RxTxRun && rxtx=1
   echo '</b></pre></div>
    <div class="dctlm"><form name="af" action="/cgi/adm.cgi" method="POST"><pre><b>%c'
   for 8 txt w nam typ val siz max n in %
         "        Shutdown  "  24  Shut checkbox "0"           0  0 ' ' %
         " RxTx daemon run  "  24  RxTx checkbox "$rxtx"       0  0 ' ' %
         " RxTx    SIGTERM  "  24  Term checkbox "0"           0  0 ' ' %
         " RxTx auto start  "  24  Auto checkbox "$RxTxAuto"   0  0 ' ' %
         "    Connect test  "  24  Conn checkbox "$ConnTest"   0  0 ' ' %
         " Build Conn test  "  24 Build checkbox "$CTbuild"    0  0 ' ' %
         "      Modem mode  "  24 Modem checkbox "$MOwahl"     0  0 ' ' %
         "      Pulse dial  "  24  Puls checkbox "$puls"       0  0 ' ' %
        "Modem init append  "  24 MInit     text "$MOinitapp" 22 30 ' ' %
         "DD MM YYYY hh mm  "  24   Day     text "$ta"         2  2 '-' %
         " "                   ''   Mon     text "$mo"         2  2 '-' %
         " "                   ''  Year     text "$ja"         4  4 '-' %
         " "                   ''  Hour     text  ""           2  2 '-' %
         " "                   ''   Min     text  ""           2  2 ' ' %
         "              IP  "  24    IP     text "$VBMip"     15  0 ' ' %
         "     User + Pass  "  24  User     text  ""          15 15 '-' %
         " "                   ''  Pass password  ""          15 15 ' ' %
         "      Admin Pass  "  24 AdmPw password  ""          15 15 ' ' %
         "        New Pass  "  24 NewPw password  ""          15 15 ' ' %
         "  AdmLogSize max  "  24 AdmLs     text "$AdmLogSz"   6  6 ' ' %
         "  SysLogSize max  "  24 SysLs     text "$SysLogSz"   4  4 '-'
   do
      case $typ in
      text|password)
        se= [ max -eq 0 ] && max=$siz se='onFocus="this.form.'"$nam"'.blur();"'
        prints s${w}ss$n "$txt" '<input name="'"$nam"'" type="'"$typ"'"' %
               'value="'"$val"'" size="'"$siz"'" maxlength="'"$max"'"'"$se"'>'
      ;;
      checkbox)
        [ val -gt 0 ] && val=checked
        prints s${w}ss$n "$txt" '<input class="butt" name="'"$nam" %
               '" type="'"$typ"'"'" $val>"
      ;;
      esac
   done
   echo '</b></pre></form>'
   print -r '<form action="/cgi/adm.cgi" method="POST" enctype="multipart/form-data">
     <br><center><b><input class="butt" type="SUBMIT" value=" Upload Backup file: ">&nbsp;
     <input class="butt" type="FILE" name="UpLd"
      size="40" maxlength="30000000" accept="*/*">'
   echo '</b></center></form></div><br><tt><font color="#d0d0d0">'
   uname
   echo "- $SERVER_SOFTWARE=$SERVER_ADDR:$SERVER_PORT - $REMOTE_ADDR<br>&nbsp;"
   echo '</font></tt></body></html>'
   return 0
}


#Arg: "req=info&group=" + escape(grp) + "&anl=" + escape(anl);
MkInfoFrameset()  {
   catv Doctype '/<head><title>VBM-MU-Status/Control</title>%n' Meta
   print -r '</head>
   <frameset rows="*,77" bordercolor="#ffd700" border="2">
   <frame name="Info" src="/cgi/main.cgi?'"$1"'"
    scrolling="auto" frameborder="0" marginwidth="0" marginheight="0">
   <frame name="InfoButtons" src="/htm/infobuttons.htm"
    scrolling="no" frameborder="0" marginwidth="30" marginheight="10">
   </frameset>
   <body bgcolor="#39458f" text="#ffd700"
    link="#ffd700" vlink="#ffd700" alink="#39458f">
   <br>&nbsp;
   <h1 align="center">Browser NoFrames!</h1>
   </body>
   </html>'
   return 0
}


# .../eepr
Ee2Muc()  {
   local ft=0000000000 ja=2002 mo=12 ta=31 st=24 mi=60 se=60
   local V=00 v=00 sn=..............................
   Hbuf="$(- extern /bin/date -u +'%A, %e.%b.%Y %X' )"
   fstat -mv ft "$1"
   ctime ja mo ta st mi se $ft
   < "$1"
   catv $((962<<1)),2,0 =ft:
   catv $((965<<1)),16,0 =sn:
   ><
   base -w ft +10 ft
   let "V=ft>>8, v=ft&255"
   base -W sn +w sn
   conv -d sn
   expr "$sn" :: '[^JY0-9.-]' && sn=YY000000-000.000
   prints s-48s- "Konfiguration file MU1000C :" "$RN"
   prints s-48s- "Work.-No.   :  $sn" "$RN"
   prints s50s50s50- "$RN" "$RN" "$RN"
   prints s-48s- "Project     :  VBM" "$RN"
   prints s-48s- "Firmware    :  Version $V.$v" "$RN"
   prints s-48s- "Pfad        :  data.muc" "$RN"
   prints s-48s- "Version :  1.23" "$RN"
   prints s-48s- "Prüfungsdatum: $ta.$mo.$ja $st:$mi" "$RN"
   prints s-48s- "Memo :" "$RN"
   prints s-48s- "VBM created" "$RN"
   prints s-48s- "$Hbuf" "$RN"

   to $((100-13)) repeat
   do
      prints s50- "$RN"
   done
   base -W +w < "$1"
   return 0
}


# kat class "<h3>" "</h3>" ["titel"]
MkStatTbl()  {
   local kat=00000 num=00000 typ=00000 nam:.20 inh:.200
   echo "<div class=%"$2%">"
   [ "0${#5}" -gt 0 ] && echo "<h1><u>$5</u></h1>"
   [ $1 -gt 1 ] && echo "<pre><b>%c"
   while read kat num typ nam inh
   do
      #[ "$kat" != "$1" ] && break
      conv '-t` '"$Tconv" nam inh
      expr "$nam" :nam '<' += '&lt;'
      expr "$inh" :inh '<' += '&lt;'
      [ "$nam" != - ] && nam="$nam  "
      [ "$nam" == - ] && nam=
      expr "$typ" :: 't' && catv '/<ul>%n'
      expr "$typ" :: 'n' && catv /%n
      catv ".$3" nam inh ".$4" /%n
      expr "$typ" :: 'N' && catv /%n
      expr "$typ" :: 'T' && catv '/</ul>%n'
   done
   [ $1 -gt 1 ] && echo '</b></pre>'
   [ $1 -eq 1 ] && echo '<form><b><input class="butt" type="button" value="Back" onClick="window.back();"></b></form>%c'
   echo "</div>"
   return 0
}


# .../stat
MkStatHtm()  {
   base -10 Tconv +b Tconv
   local n=000 class=stat1 fa='<h3>' fb='</h3>'
   local title=........................................
   catv Doctype '/<head><title>MU-Status</title>%n' Meta
   print -r '</head><body class="main">'
   for n to 20 repeat
   do
      ifset TblTitle$n || break
      title="$TblTitle[n]"
      [ "$title" == '-' ] && continue
      [ "$title" == ' ' ] && title=
      class=stat fa= fb=
      [ n -eq 1 ] && class=stat1 fa='<h3>' fb='</h3>'
      grep "^$n"'[ %t]' $1 | MkStatTbl $n $class "$fa" "$fb" "$title"
   done
   echo '</body></html>'
   return 0
}


XmsgExit()  {
   RxTxMsg="FAIL: $1" Uvars RxTxMsg
   echo "Status: 204 No Content%n"
   exit 0
   return 0
}


# "dir=adir&pass=pw&act=call|quit"
CallSys()  {
   local pw:9.16 nam=.......... adir=....................
   local iph=..............................  ipw=....................
   RxTxRun || {
      [ MUcall -ne 0 ] && MUcall=00 Uvars MUcall
      [ RxTxAuto -gt 0 ] && {
         [ -e ../tmp/rxtx ] && remove ../tmp/rxtx
         extern ../adm/rxtx.bish
         XmsgExit "RxTx process still not running."
      }
      XmsgExit "RxTx process not running."
   }
   RxTxMsg="RXTX:" Uvars RxTxMsg
   Hbuf="$1"
   conv '-t& ' Hbuf
   for Hbuf in $Hbuf
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        dir)   adir="$Hbuf" ;;
        pass)  pw="$Hbuf" ;;
        act)
           [ "$Hbuf" == quit ] && {
              [ MUcall -gt 0 -a MUcall -le 9 ] && MUcall=-1 Uvars MUcall
              return 0
           }
           [ MUcall -gt 0 -a MUcall -le 9 -o MUcall -lt 0 %
             -o MUcall -ge 30 -a MUcall -le 39 ] && XmsgExit ""
           GetIval Hbuf $Fid "$adir" || XmsgExit "Phone number not found."
           iph="$Hbuf"
           CkTelnu "$iph" || XmsgExit "Phone wrong: »$iph«"
           GetIval Hbuf $Pid "$adir" || XmsgExit "Password not found."
           ipw="$Hbuf"
           expr "$pw" :: '^%t%t%t' || {
              expr "$pw" :: '^...' || XmsgExit "Password wrong"
              expr "$ipw" :: '^...' || XmsgExit "iPassword wrong: »$ipw«"
              catv ipw | extern ./mailcode -dns -c "$MC64" | catv 0 =ipw:
              cmpv ipw pw || XmsgExit "Password does not match"
              MUcall=02
           }
           MUdir=$adir Uvars MUdir
           Telnu=$iph Uvars Telnu
           [ MUcall -ne 2 ] && MUcall=01
           Uvars MUcall
        ;;
      esac
   done
   return 0
}


MkCtlhHtm()  {
   local code="$MUcall" msg:.50
   msg=STAT
   #[ code -ge 30                ] && msg=STAT
   [ code -ge 20 -a code -le 29 ] && msg=FAIL #MUcall=00 Uvars MUcall
   #[ code -ge 10 -a code -le 19 ] && msg=STAT
   [ code -ge 11 -a code -le 12 ] && msg=OKAY
   #[ code -gt  0 -a code -le  9 ] && msg=STAT
   #[ code -eq  0                ] && msg=STAT
   #[ code -lt  0                ] && msg=STAT
   let "code+=0"
   case "$code" in
     -1)  msg="$msg: [$code] User quit.";;
      0)  msg="$msg: [$code] Default state.";;
     11)  msg="$msg: [$code] RxTx got data.";;
     12)  msg="$msg: [$code] RxTx configured.";;
     16)  msg="$msg: [$code] Connection tested.";;
     17)  msg="$msg: [$code] Modem initialized.";;
     18)  msg="$msg: [$code] Data received.";;
     20)  msg="$msg: [$code] RxTx error.";;
     21)  msg="$msg: [$code] RxTx get data failed.";;
     22)  msg="$msg: [$code] RxTx config failed.";;
     26)  msg="$msg: [$code] Connect test failed.";;
     28)  msg="$msg: [$code] Dial in failed.";;
     29)  msg="$msg: [$code] RING event broken.";;
     30)  msg="$msg: [$code] RxTx daemon exited.";;
     36)  msg="$msg: [$code] Testing connection.";;
     37)  msg="$msg: [$code] Modem initialization.";;
     38)  msg="$msg: [$code] Incoming call.";;
     39)  msg="$msg: [$code] RING event.";;
      *)  msg="$msg: RxTx code: »$code«";;
   esac
   expr "$RxTxMsg" :: '^FAIL:' && {
      catv .FAIL =msg
      [ "$RxTxMsg" != "FAIL: " ] && msg="$RxTxMsg"
      RxTxMsg="RXTX:" Uvars RxTxMsg
   }

   print -r '<html><head><title></title></head><body><form>
   <input name="CtlhInp" type="hidden" value="'"$msg"'">
   </form><script language="JavaScript" type="text/javascript">
     parent.frames[0].focus();
   </script></body></html>'
   return 0
}


#Arg: "req=ctl&group=" + escape(grp) + "&anl=" + escape(anl);
MkCtlFrameset()  {
   catv Doctype '/<head><title>VBM System-Directory</title>%n' Meta
   print -r '</head>
   <frameset cols="100%,*" bordercolor="#d0d0d0" border="0">
   <frame name="Ctlv" src="/cgi/main.cgi?'"$1"'"
    scrolling="auto" frameborder="0" marginwidth="0" marginheight="0">
   <frame name="Ctlh" src="/cgi/main.cgi?req=ctlh"
    scrolling="no" frameborder="0" marginwidth="0" marginheight="0">
   </frameset>
   <body bgcolor="#39458f" text="#ffd700"
    link="#ffd700" vlink="#ffd700" alink="#39458f">
   <br>&nbsp;
   <h1 align="center">Browser NoFrames!</h1>
   </body>
   </html>'
   return 0
}


# "dir|file=obj grp=ggg anl=sss act=aaa"
CtlAction()  {
   local id=0000 nam=.......... obj=..............................
   local gid=0000 grp=$obj$obj anl=$obj$obj adir=$obj
   for Hbuf in $1
   do
      expr "$Hbuf" :nam '^%([^=]%{1,}%)=' || continue
      expr "$Hbuf" :Hbuf '^[^=]%{1,}=%(.*%)$' || continue
      FormConv Hbuf
      case "$nam" in
        dir)   obj="$Hbuf" adir="$obj"
               [ -d "$obj" ] || PutErrHtm "Directory not found: »$obj«" ;;
        file)  obj="$Hbuf" expr "$obj" :adir '/[^/]%{1,}$' = '' ;;
        grp)   grp="$Hbuf" ;;
        anl)   anl="$Hbuf" ;;
        act)
           case "$Hbuf" in
             delete)
                   expr "$obj" :id '%([0-9]*%)$'
                   expr "$obj" :Hbuf '[0-9]*$' = $Fali
                   grep -v "^$id " $Hbuf | cat > $Hbuf
                   extern rm -rf $obj
                   WrLog "System:$obj [$grp : $anl]" "removed"
                   expr "$obj" :gid '%([0-9]*%)/[0-9]*$'
                   grep -v "^$gid $id " $Fstation | cat > $Fstation
                   [ CTbuild -eq 0 ] && CTbuild=1 Uvars CTbuild
                   [ -s $Hbuf ] && break
                   expr "$obj" :Hbuf '[0-9]*/[0-9]*$' = $Fali
                   grep -v "^$gid " $Hbuf | cat > $Hbuf
                   expr "$obj" :Hbuf '/[0-9]*$' = ''
                   extern rm -rf $Hbuf
                   WrLog "Group:$Hbuf [$grp]" "removed"
             ;;
             del)  [ -f "$obj" ] || PutErrHtm "File not found: »$obj«"
                   remove -s $obj
                   expr "$obj" :: '/conn$' &&
                      [ CTbuild -ne 1 ] && CTbuild=1 Uvars CTbuild
                   echo "Content-type: text/html%n"
                   MkCtlHtm "$grp" "$anl" "$adir"
                   return 0 ;;
             set)  : > $obj
                   [ -f "$obj" ] || PutErrHtm "File not found: »$obj«"
                   echo "Content-type: text/html%n"
                   MkCtlHtm "$grp" "$anl" "$adir"
                   return 0 ;;
             stat) echo "Content-type: text/html%n"
                   MkStatHtm $obj
                   return 0 ;;
             log)  echo "Content-type: text/html%n"
                   PutTxt2Htm $obj
                   return 0 ;;
             src)  echo "Content-type: text/plain%n"
                   cat $obj
                   return 0 ;;
             down) echo "Content-type: application/octet-stream%n"
                   Ee2Muc $obj
                   return 0 ;;
           esac
        ;;
      esac
   done
   echo "Status: 204 No Content%n"
   return 0
}


# $file
PutFileDate()  {
   [ -f "$1" ] || { echo "</b>--.--.---- --:--   -----<b>%c"; return 0; }
   local ft=0000000000 sz=0000000000 ja=2002 mo=12 ta=31 st=24 mi=60 se=60
   fstat -msv ft sz "$1"
   ctime ja mo ta st mi se $ft
   catv ta /. mo /. ja '/ ' st /: mi
   prints s8- $sz
   ft=1 [ sz -gt 0 ] && ft=2
   return $ft
}

#  extern date +' %A, %e. %B %Y %X %Z   KW%V  TJ%j'

# "$Grp" "$Anl" $Adir
MkCtlHtm()  {
   [ -d "$3"   ] || PutErrHtm nohdr "Directory not found: »$3«"
   [ -f "$3/i" ] || PutErrHtm nohdr "File not found: »$3/i«"
   local exist=1 iv=0 s=00 titel=.............................. script=........
   local file=$titel act=........ action=$titel titel0=starttitel
   local grp=$titel$titel anl=$titel$titel gid=0000 aid=0000
   expr "$3" :aid '%([0-9]%{1,}%)$'
   expr "$3" :gid '%([0-9]%{1,}%)/[0-9]%{1,}$'
   catv Doctype '/<head><title>VBM-MU-Status/Control</title>%n' Meta
   echo '<script language="JavaScript" src="/js/help.js" type="text/javascript">
         </script>
         <script language="JavaScript" src="/js/ctl.js" type="text/javascript">
         </script>'
   print -r '</head>
    <body class="main">
    <div class="dctl"><form><b><font size="+2">'"$1 : $2 &nbsp;&nbsp;"'</font>
    <input class="butt" type="button" value="Delete"
     onClick="DelSys('''"$3"''','''"$1"''','''"$2"''');">
    <input class="butt" type="button" value="Rename"
     onClick="void(prompt(''Rename dummy. Group : System.\r\nDelimiter is » : «'','''"$1 : $2"'''));">
     </b></form>
    '
   extern /bin/date -u +'%A, %e. %b. %Y &nbsp;%X'
   echo '</div><div class="dctlm"><pre><b>%c'
   echo '<center><u>Flags and Files</u></center>%c'
   Hbuf="$1" Escape Hbuf; grp="$Hbuf"
   Hbuf="$2" Escape Hbuf; anl="$Hbuf"
   for 6 titel file act action iv script in %
           FAIL  $3/fail del  Unset    3 main %
           FAIL  $3/fail set  Set      0 main %
           FAIL  $3/fail src  Source   2 main %
           OKAY  $3/okay del  Unset    3 main %
           OKAY  $3/okay set  Set      0 main %
        CFGLOCK  $3/lock del  Unset    3 new  %
        CFGLOCK  $3/lock set  Set      0 new  %
       CONNTEST  $3/conn log  Display  2 main %
       CONNTEST  $3/conn src  Source   2 main %
       CONNTEST  $3/conn del  Delete   3 adm  %
        INFOSET  $3/i    log  Display  2 main %
        INFOSET  $3/i    src  Source   2 main %
          STATE  $3/stat stat Display  2 main %
          STATE  $3/stat src  Source   2 main %
         CONFIG  $3/eepr down Download 2 main %
            LOG  $3/log  log  Display  2 main %
            LOG  $3/log  src  Source   2 main %
            LOG  $3/log  del  Delete   2 new
   do
      Hbuf="$file" Escape Hbuf
      let "s=10-${#action}"
      cmpv titel titel0 || {
         echo %n
         prints s11- "$titel: "
         PutFileDate $file; exist=$?
         echo '   %c'
      }
      if [ exist -eq iv -o iv -eq 3 -a exist -gt 0 ]
      then
         prints ssss$s- '<a class="actl" href="/cgi/'"$script"'.cgi?req=ctlact' %
                        '&file='"$Hbuf"'&grp='"$grp"'&anl='"$anl" %
                        '&act='"$act"'">'"$action"'</a>' ''
      else
         prints   ss$s- '<font color="#b0b0b0">'"$action"'</font>' ''
      fi
      titel0=$titel
   done
   echo '</b></pre></div>
    <div class="dctl"><form><br>Password<b>
    <input name="ConfPass" type="password" value="" size="15" maxlength="15">
    <input class="butt" type="button" value="Call (configure)"
     onClick="CallSys(1,'''"$3"''',this.form.ConfPass.value);">&nbsp;&nbsp;
    <input class="butt" type="button" value="Call (get data)"
     onClick="CallSys(1,'''"$3"''',''\t\t\t'');">
    <a href="javascript:void(LedAction(1))">
    <img name="led" align="middle" src="/img/ledge0.jpg" width="21" height="21"
     hspace="5" vspace="5" border="0"></a>
     <br><br>
    <input class="butt" type="button" value="Compose configuration"'
   [ -s "$3/eepr" ] &&
   echo 'onClick="top.location.href=''/cgi/muee.cgi?eemain.'"$gid.$aid"''';">'
   [ -s "$3/eepr" ] ||
   echo 'onClick="alert(''This system directory contains no config data.'');">'
   echo '&nbsp;&nbsp;&nbsp;
    <input class="butt" type="button" value="Reload"
     onClick="top.location.reload();">
    <input class="butt" type="button" value="Close"
     onClick="top.close();">&nbsp;
    <input class="butt" type="button" value="Help"
     onClick="Help(''#sysctl'');">
    </b></form></div>
    </body></html>'
   return 0
}


# $headtail
PutSysTblTxt()  {
   case "$1" in
     head)
   print -r '
      <table width="100%" border="0" align="center" valign="center"
       bgcolor="#01669a" cellpadding="2" cellspacing="2" cols="4">
   <tr><td width="8%" bgcolor="#01669a" align="center" valign="center">
   <font color="#ff9966" size="-1">State</font>
   </td>
   <td width="33%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <font color="#ff9966" size="-1">System name</font>
   </td>
   <td width="17%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <font color="#ff9966" size="-1">System type</font>
   </td>
   <td width="42%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <font color="#ff9966" size="-1">Site location</font>
   </td></tr></table>
   <font color="#000000"><hr noshade width="100%" size="1"></font>'
     ;;
     tail)
   print -r '
   <br><br><br>
   <font color="#000000" size="-2">
    &gt; Click on state to show system state informations<br>
    &gt; Click on system text to show system informations<br>
   </font>'
     ;;
   esac
   return 0
}


# $f "$ginh" "$ainh" "$tinh" "$oinh"
PutSysTbl()  {
   #<img align="middle" border="0" width="40" height="16" src="/img/red24.gif">
   local ctlhref="javascript:MkWinAnlCtl('$2','$3');"
   local newhref="javascript:MkWinAnlNew('$2','$3');"
   local _3='<font size="-1">'"$3"'</font>'
   local _4='<font size="-1">'"$4"'</font>'
   local _5='<font size="-1">'"$5"'</font>'
   local color='/img/ok.jpg'
   #[ "$1" == '+' ] && color='#00ff00'
   [ "$1" == '!' ] && color='/img/fail.jpg'
   print -r '<tr><td width="8%" bgcolor="#01669a" align="center" valign="center">
   <a class="aanl" href="'"$ctlhref"'">
   <img src="'"$color"'" border="0" width="29" height="32"></a>
   </td>
   <td width="33%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <b><a class="aanl" href="'"$newhref"'">'"&nbsp;$_3&nbsp;"'</a></b>
   </td>
   <td width="17%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <b><a class="aanl" href="'"$newhref"'">'"&nbsp;$_4&nbsp;"'</a></b>
   </td>
   <td width="42%" bgcolor="#01669a" align="CENTER" valign="CENTER">
   <b><a class="aanl" href="'"$newhref"'">'"&nbsp;$_5&nbsp;"'</a></b>
   </td></tr>'
   return 0
}


# "$Gdir"
MkAnlHtm()  {
   local ali=$1/$Fali id=0000 fail='&nbsp;' faila=0 ifile=................
   local ginh=........................................
   local ainh=........................................
   local oinh=........................................
   local tinh=........................................
   local gdir="$1"
   [ -z "$1" ] && gdir=.. ali=./null
   [ -d "$gdir"   ] || PutErrHtm nohdr "Directory not found: »$gdir«"
   [ -f "$ali" ] || PutErrHtm nohdr "File not found: »$ali«"
   catv Doctype '/<head><title>VBM SysTable</title>%n' Meta
   print -r %
     '<script language="JavaScript" src="/js/anl.js" type="text/javascript"></script>
      </head><body class="main">'
   PutSysTblTxt head
   print -r %
     '<table width="100%" border="0" align="center" valign="center"
       bgcolor="#01669a" cellpadding="2" cellspacing="2" cols="4">'
   < $ali
   while read id -
   do
      ifile=$gdir/$id/i
      [ -s $ifile ] || continue
      fail='&nbsp;'
      [ -f $gdir/$id/okay ] && fail='+'
      [ -f $gdir/$id/fail ] && fail='!'
      local g=g a=a o=o t=t
      5< $ifile
      while read -u5 id Hbuf && [ -n "$g$a$o$t" ]
      do
         [ id -eq Gid ] && ginh="$Hbuf" unset g
         [ id -eq Aid ] && ainh="$Hbuf" unset a
         [ id -eq Oid ] && oinh="$Hbuf" unset o
         [ id -eq Tid ] && tinh="$Hbuf" unset t
      done
      ><
      PutSysTbl "$fail" "$ginh" "$ainh" "$tinh" "$oinh"
   done
   ><
   [ -z "$1" ] &| expr "$ifile" :: '^%.%.%.' && {
      echo --
      MkGrpArr $Fgrpajs
      Failall=0
      MkGrpArr $Fgrpaejs Err && Failall=1
      Uvars Failall
   }
   print -r '</table>'
   PutSysTblTxt tail
   print -r '
    <script language="JavaScript" type="text/javascript">
     if ('"0$Update"'>0)  parent.frames[2].location.reload();
       window.setTimeout(''parent.frames[2].SetSel("anl"); parent.frames[2].SetSelOpt("'"$ginh"'",'"$Failall"');'',1500);
    </script>
    </body></html>'
   [ Update -ne 0 ] && Update=0 Uvars Update
   return 0
}


#GetInfoZ 5 Hbuf $id
GetInfoZ()  {
   local id=000 s=0
   while read -u$1 id $2
   do
      [ $id == $3 ] && return 0
   done
   seek 0 $1
   while read -u$1 id $2
   do
      [ $id == $3 ] && return 0
   done
   seek 0 $1
   $2=''
   return 1
}


        # function SetGInp(s, g)%
        # {%
        #    var df= "document.FormInfo.";%
        #    eval(df+g).value=%
        #       eval(df+s+".options["+df+s+".selectedIndex]").text;%
        # }%
# typ id len maxlen flg dflt text
# typ id cols rows  flg dflt text
# MkInfoHtm new
# MkInfoHtm exist $Adir/i
MkInfoHtm()  {
   [ -s $Finfobase ] || PutErrHtm nohdr "File not found: »$Finfobase«"
   local n=00 name=........
   local typ=.... id=000 len=00 max=00 flg=...
   local dflt=....................
   local text=...........................................................
   #[ $# -eq 0 -o "$1" == new ] && Hbuf=
   catv Doctype '/<head><title>VBM-MU-Dataset</title>%n' Meta %
        '/<script language="JavaScript" type="text/javascript">%n' %
        '/function GrpSel(sel)  {%n' %
        '/   document.forms[0].I' Gid '/.value=%n' %
        '/      sel.options[sel.selectedIndex].text.slice(2);%n' %
        '/}%n' %
        '/</script>%n' %
        '/</head>%n' %
        '/<body class="main" text="#ffd700">%n' %
        '/<form name="FormInfo" action="/cgi/new.cgi" method="POST">%n' %
        '/<pre><b>%n'
   [ "$1" == exist ] && 5< $2
   < $Finfobase
   while read typ id len max flg dflt text
   do
      ifset typ || continue
      expr "$typ" :: '^#' && continue
      conv '-t` ' text dflt
      [ ${#text} -gt 1 ] && prints sns36s- "" "$text" "  "
      [ "$max" == '=' ] && max=$len
      [ "$max" == '-' ] && let "max=len+len"
      let ++n
      [ "$dflt" == ' ' ] && dflt=
      Hbuf="$dflt"
      [ "$1" == exist ] && {
         GetInfoZ 5 Hbuf $id
         [ id -eq Pid ] && Hbuf="®$Hbuf®"
      }
      case $typ in
        itxt) name=I$id
              catv ".<input name=%"$name%" type=%"TEXT%" value=%"$Hbuf%"" %
                   ". size=%"$len%" maxlength=%"$max%"> "
        ;;
        ptxt) name=P$id
              catv ".<input name=%"$name%" type=%"PASSWORD%" value=%"$Hbuf%"" %
                   ". size=%"$len%" maxlength=%"$max%"> "
        ;;
        wtxt) name=W$id
              conv "-t${CA}${NL}t$ESC$CR"'t` ' Hbuf
              catv ".<textarea name=%"$name%" cols=%"$len%" rows=%"$max%"" %
                   ". wrap=%"soft%">" Hbuf ".</textarea>"
        ;;
      esac
   done
   ><
   [ "$1" == exist ] && ><
   catv '/%n</b></pre></form>%n'
   ifdef Newgrparr &&
   echo '<script language="JavaScript" type="text/javascript">
         window.setTimeout("parent.frames[2].location.reload();", 1500);
         </script>'
   catv '/</body></html>%n'
   return 0
}



. ./functions.bish
catv /%0 =5119,,Hbuf
. ./cvars.bish
#Lock lockuv
. ./uvars.bish
#Lock lockuv del

#mkdirs $Ddb
GetIds  #Gid Aid Oid Pid Fid Tid Iid Sid
VBMip=$SERVER_ADDR
#[ "$VBMip" == 999.888.777.666 ] && {
#   Gdir=$(grep '^[ %t]*[0-9.]%{7,15}[ %t]%{1,}scouw' /etc/hosts) &&
#      expr "$Gdir" :VBMip '%([0-9.]%{7,15}%)' && {
#         VBMip0=$VBMip Uvars VBMip; Uvars VBMip0; }
#}



[ "$REQUEST_METHOD" == GET ] && {
   [ -s $Fgrpajs ] || MkGrpArr $Fgrpajs
   [ -s $Fgrpaejs ] || MkGrpArr $Fgrpaejs Err && nop
   case "$QUERY_STRING" in
     main)
         [ RxTxAuto -gt 0 ] && RxTxRun || {
            [ MUcall -ne 0 ] && MUcall=00 Uvars MUcall
            [ -e ../tmp/rxtx ] && remove ../tmp/rxtx
            extern ../adm/rxtx.bish
            sleep -m 600
            RxTxRun || PutErrHtm "Start of RxTx daemon failed."
         }
         #GetGrpDir first Gdir || { echo "Location: /hlp/help.htm#start%n"; goend; }
         GetGrpDir first Gdir || Gdir=
         echo "Content-type: text/html%n"
         MkAnlHtm "$Gdir"
     ;;
     admin)
         #expr "$REQUEST_URI" :: '/adm.cgi?admin$' || PutErrHtm "Sorry!"
         echo "Content-type: text/html%n"
         MkAdmHtm
     ;;
     req=admact&?*)
         expr "$QUERY_STRING" :Hbuf '^req=admact&%(..*%)$'
         expr "$Hbuf" :Hbuf '&' += ' '
         Lock lockdb
         AdmAction "$Hbuf"
         Lock lockdb del
     ;;
     new)
         echo "Content-type: text/html%n"
         MkInfoHtm new
     ;;
     update)
         MkGrpArr $Fgrpajs
         local _Fail=0
         MkGrpArr $Fgrpaejs Err && _Fail=1
         [ _Fail -ne Failall ] && Failall=$_Fail Uvars Failall
         [ Update -eq 0 ] && Update=1 Uvars Update
         echo "Status: 204 No Content%n"
     ;;
     req=infofset&?*)
         expr "$QUERY_STRING" :Gdir 'req=infofset&' = 'req=info&' || Gdir=GX
         echo "Content-type: text/html%n"
         MkInfoFrameset "$Gdir"
     ;;
     req=info&?*)
         expr "$QUERY_STRING" :Gdir '&group=%([^&=]*%)' || Gdir=GX
         expr "$QUERY_STRING" :Adir '&anl=%([^&=]*%)$' || Adir=AX
         FormConv Gdir
         FormConv Adir
         GetGrpDir get Gdir || PutErrHtm "Not found: »$Gdir«"
         GetAnlDir Adir $Gdir || PutErrHtm "Not found: »$Adir«"
         echo "Content-type: text/html%n"
         MkInfoHtm exist $Adir/i
     ;;
     req=callsys&?*)
         expr "$QUERY_STRING" :Gdir '^req=callsys&%(..*%)$' || Gdir=
         CallSys "$Gdir"
         echo "Status: 204 No Content%n"
     ;;
     req=ctlfset&?*)
         expr "$QUERY_STRING" :Gdir 'req=ctlfset&' = 'req=ctl&' || Gdir=GX
         echo "Content-type: text/html%n"
         MkCtlFrameset "$Gdir"
     ;;
     req=ctlh)
         echo "Content-type: text/html%n"
         MkCtlhHtm
     ;;
     req=ctl&?*)
         expr "$QUERY_STRING" :Gdir '&group=%([^&=]*%)' || Gdir=GX
         expr "$QUERY_STRING" :Adir '&anl=%([^&=]*%)$' || Adir=AX
         FormConv Gdir
         FormConv Adir
         Grp="$Gdir" Anl="$Adir"
         GetGrpDir get Gdir || PutErrHtm "Not found: »$Gdir«"
         GetAnlDir Adir $Gdir || PutErrHtm "Not found: »$Adir«"
         echo "Content-type: text/html%n"
         MkCtlHtm "$Grp" "$Anl" $Adir
     ;;
     req=ctlact&?*)
         expr "$QUERY_STRING" :Hbuf '^req=ctlact&%(..*%)$'
         expr "$Hbuf" :Hbuf '&' += ' '
         Lock lockdb
         CtlAction "$Hbuf"
         Lock lockdb del
     ;;
     selinhaltget=?*)
         expr "$QUERY_STRING" :Hbuf '^[^=]%{1,}=%(..*%)$' || Hbuf=SGX
         FormConv Hbuf
         Gdir="$Hbuf"
         GetGrpDir get Gdir || Gdir=  #PutErrHtm "Not found: »$Hbuf«"
         echo "Content-type: text/html%n"
         MkAnlHtm $Gdir
     ;;
     *)  echo "Status: 205 Reset Content%n" ;;
   esac
   exit 0
}


[ "$REQUEST_METHOD" == POST ] && {
   [ "$CONTENT_LENGTH" -eq 0 ] && PutErrHtm "No content"
   case "$REQUEST_URI" in
     *adm.cgi)
         Lock lockdb
         if expr "$CONTENT_TYPE" =:: 'boundary=.'
         then
            FormAdmBakRead "$CONTENT_LENGTH" || { Gdir=$?
               Lock lockdb del
               PutErrHtm "Backup Upload failed [$Gdir]"
            }
         else
            FormAdmRead "$CONTENT_LENGTH" || echo "Status: 205 Reset Content%n"
         fi
         Lock lockdb del
         echo "Content-type: text/html%n"
         MkAdmHtm
     ;;
     *new.cgi)
         [ "$CONTENT_LENGTH" -gt 5000 ] && PutErrHtm "Content too large"
         Lock lockdb
         FormInfoRead "$CONTENT_LENGTH"
         Lock lockdb del
         echo "Content-type: text/html%n"
         MkInfoHtm exist $Adir/i
     ;;
     *main.cgi)
         PutErrHtm "Sorry!"
     ;;
     *)  echo "Status: 205 Reset Content%n" ;;
   esac
}

exit 0


#HTTP_HOST=www.schellong.com
#HTTP_REFERER=http://www.schellong.com/icnt.htm
#HTTP_USER_AGENT=Mozilla/4.73 [en] (X11; I; SCO_SV 3.2 i386)
#REMOTE_ADDR=193.159.66.48
#REMOTE_HOST=localhost
#SERVER_ADDR=195.20.225.17
#SERVER_NAME=schellong.com
#QUERY_STRING=0.1.i8x12.l0.d5.b000000.fffffff.r0
#REQUEST_METHOD=POST
#REQUEST_URI=.../new.cgi?new
#CONTENT_LENGTH=12345
#CONTENT_TYPE=x/y
#Location: url
#Status: 204 No Content
#Status: 205 Reset Content
#Status: 413 Request Entidy Too Large
#"Content-type: application/zip%n"
#"Content-type: application/x-tar%n"

#  <a class="elf" href="javascript:alert(''*** ALARM ***'');">alert()</a>
#  <a class="elf" href="javascript:void(confirm(''Wenn ja, dann nein! Oder vielleicht doch?''));">confirm()</a>
#  <a class="elf" href="javascript:void(prompt(''Was eingeben - aber prompt!'',''Dödel''));">prompt()</a>


###  ref.cgi  #############################################

#!./bish_folso_cgi
#!/home/bin/bish


set -f

deroot="$DOCUMENT_ROOT/de"
expr "$deroot" :deroot '/de/de' '/de'

arg="$QUERY_STRING"
ok=0
expr "$arg" :kn '^%([0-9]%{1,2%}%)%..%{3,250%}' && {
   expr "$arg" :Ref '^[0-9]%{1,2%}%.%(..*%)$'
   Frfr=$deroot/tmp/${kn}_rfr.txt
   [ -e "$Frfr" ] || : >> $Frfr
}



FormConv()  {
   local h=0000 z=00
   conv -'t+ ' $1
   while expr "${{1}" :h '%%%([a-fA-F0-9]%{2%}%)'
   do
      base -16 h +b z
      expr "${{1}" :$1 '%%'$h += "$z"
   done
   return 0
}

# [del]
Lock()  {
   local n=0000 lockf=$deroot/tmp/lockrfr
   [ "$1" == del ] && { remove -s $lockf; return 0; }
   while [ -e $lockf ]
   do
      sleep -m 20
      let "++n>=200" && { remove -s $lockf; echo "Status: 204 No Content%n"; exit 0; }
   done
   : > $lockf
   return 0
}


FormConv Ref
expr "$Ref" :: '.?.*%w=%w' || [ -f "$Frfr" ] && ok=1

[ ok -eq 0 ] && {
   echo "Status: 204 No Content%n"
   exit 0
}
LenRef=${#Ref}


systime TimRef
prints vs10 TimRef $TimRef
Nz=0000
N=0000000000
Set=0000000000
Tim=0000000000
MinSk=000000
Sk=000000
MinTim=$((16#7fffffff))
MinN=$MinTim
prints vs300 Z
Lock
< $Frfr
while seek + 0 Sk; readl Z
do
   let "++Nz"
   [ ${#Z} -lt 24 ] && continue
   catv 0,10,Z =Tim:
   catv 11,10,Z =N:
   let "N<MinN" && MinN=$N MinSk=$Sk MinTim=$Tim
   let "Tim<MinTim&&N<=MinN" && MinSk=$Sk MinTim=$Tim
   let "${#Z}!=24+LenRef" && continue
   catv 24,,Z =Z:
   cmpv Z Ref || continue
   let "Set=N+1"
   break
done
><
[ Set -gt 0 ] && {
   prints vs10 Set $Set
   catv TimRef '/ ' Set '/   ' =$Sk,24,0  <>$Frfr
   Lock del
   echo "Status: 204 No Content%n"
   exit 0
}
[ Nz -ge 200 ] && cat $Frfr | { >$Frfr; catv $MinSk,0; readl Z; cat; ><; }
Set='         1'
catv TimRef '/ ' Set '/   ' Ref /%n >> $Frfr


Lock del
echo "Status: 204 No Content%n"
exit 0

#Status: 204 No Content





###  selfhtml.cgi  #############################################

#!./bish_folso_cgi -p

set -f

SetVar()  {
   [ -s ./selfv.bish ] || return
   local nam=$1 buf=....................................
   cat ./selfv.bish | {
      > ./selfv.bish
      while readl buf
      do
         expr "$buf" :: "^$nam=" || { catv buf /%n; continue; }
         catv nam "/='" $nam "/'%n"
      done
      ><
   }
   return 0
}

HTM='<html>
<head>
<title>Download selfhtml8 von schellong.de</title>
</head>
<body text="#ffd700" bgcolor="#39458f">
<br><br>
<h1 align="center">Verwenden Sie bitte einen anderen Link.</h1>
<br>
<h3 align="center">Das Tranfervolumen pro Zeiteinheit ist momentan überschritten.</h3>
<br><br>
<pre><b>
       Transfer-Summe: ~kbist___~  [KB]
                  Ist: ~kp5ma___~  [KB pro 5min]
                  Max: ~kp5m____~  [KB pro 5min]
     Wieder bereit in: ~bereit__~  [min]
</b></pre>
</body>
</html>
'
deroot="$DOCUMENT_ROOT/de"
expr "$deroot" :deroot '/de/de' '/de'

HTTP_REFERER=http://www.schellong.de/
QS="$QUERY_STRING"
[ $# == 1 -a "$1" == get ] && QS=get

Zip=$deroot/selfhtml80.zip

systime t
[ -s ./selfv.bish ] ||
   echo "Tt='1011508099'%nNn='755'%nSperre='1'%nSelfN='0'" > ./selfv.bish
. ./selfv.bish

expr "$QS" :: '^[+=]%{0,1}[0-9]%{1,}$' && {
   expr "$QS" :Nn '^=' = '' && SetVar Nn
   expr "$QS" :: '^+' && { let "Nn+=QS-SelfN"; SetVar Nn; }
   expr "$QS" :: '^[0-9]' && SelfN=$QS SetVar SelfN
   QS=info
}

let "Nn>300000" && { Tt=$t Nn=0 Sperre=0 SelfN=0
   echo "Tt='$t'%nNn='0'%nSperre='0'%nSelfN='0'" > ./selfv.bish
}

kp5m=$(( (7*1024*1024) / [(3600/300)*24*30] ))
ka=$(( Nn*[(7185598+834+4096)/1024] ))
kp5ma=$(( ka / {(t+300-Tt)/300} ))
bereit=$(( {(ka/kp5m)-[(t+300-Tt)/300]}*5 ))

if [ kp5ma -gt kp5m -a "$QS" != test -o "$QS" == info ]
then
   prints vs10 kp5m "$kp5m"
   prints vs10 kp5ma "$kp5ma"
   prints vs10 ka "$ka"
   prints vs10 bereit "$bereit"
   expr "$HTM" :HTM '~kp5m____~' = "$kp5m"
   expr "$HTM" :HTM '~kp5ma___~' = "$kp5ma"
   expr "$HTM" :HTM '~kbist___~' = "$ka"
   expr "$HTM" :HTM '~bereit__~' = "$bereit"
   if [ "$QS" != get ]
   then
      catv "/Content-type: text/html%n%n" HTM
   else
      umask 073
      catv HTM > $deroot/self.htm
      [ -e $Zip ] && remove $Zip
      link $deroot/self.htm $Zip
      exit 0
   fi
   [ "$QS" == info ] && exit 0
   [ Sperre -eq 0 ] && Sperre=1 SetVar Sperre
   #HTTP_REFERER="${HTTP_REFERER}selfhtml_fail"
   #export HTTP_REFERER
   #extern ./icnt.cgi 0.191.i0
else
   [ Sperre -ne 0 ] && Sperre=0 SetVar Sperre
   if [ "$QS" != get ]
   then
      echo "Location: http://www.schellong.de/selfhtml80.zip%n"
   else
      umask 073
      [ -e $Zip ] && remove $Zip
      link $deroot/01GETselfhtml80.zip $Zip
      exit 0
   fi
   #HTTP_REFERER="${HTTP_REFERER}selfhtml_okay"
   #export HTTP_REFERER
   #extern ./icnt.cgi 0.190.i0
   [ "$QS" == test ] && exit 0
   #let ++Nn; SetVar Nn
fi

exit 0