Achtung! Diese HTML-Datei können Sie nicht von bsh.exe ausführen lassen!

Es müßten alle HTML-Elemente entfernt bzw. in ISO8859-Zeichen umgewandelt
und dann alle iso-Zeichen in IBM437-Zeichen umgewandelt werden.


#istep.bsh
#Schellong/Sep.1998


set -f

let `ver n`'+0<242' && {
   echo "Dieses Script benötigt mindestens bsh-Version 2.42 !"
   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.bsh: --- $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\bsh_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 bsh_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ültigen [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ültigen [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: Ç-×,bsh_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" :: 'bsh_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
      Funktion tmpfiles $TmpDir exetmp
      #fprint lnotcode ¦ Funktion decode $exetmp ¦¦ r=1
      fprint lnotcode > $exetmp
      Funktion decode $exetmp ¦¦ r=1
      [ -f $exetmp ] && DEL $exetmp
      unset exetmp
      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- ]=' < $2 ¦ 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 bsh-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 'bsh' 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 'bsh' 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
×               bsh-Script 'istep.bsh'                 ×%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.bsh: <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
#}