# Dies hier ist ein Kommentar.
# --------------------------- Hauptmenu ------------------------------

# Nachsehen, ob wir hier eine Csh 5.16 ode rhöher am Werke haben.
# Die Variable $_version enthält die aktuelle Version, ein 'return'
# Kommando beendet eine Stapeldatei.

if $_version < 516
 echo "Schade, Csh Version 5.16 wird benötigt!";return 0
endif



cls  # löscht Schirm.

# Das Echo Kommando wird benutzt eine Zeile auf den Schirm zu schreiben.
# Achtung, ein schliessendes Anführungszeichen ist nicht notwendig.

echo "Das ist eine Beispiel Stapeldatei der Csh. Sie enthält eine Menge
echo "nützlicher Aliase die Sie vielleicht fest installieren wollen,
echo "aber der Hauptzweck ist es, als Anleitung zu dienen. Sehen Sie sich
echo "um und verändern Sie nach belieben.
echo


# Jedes Csh KOmmando akzeptiert ^-Kode in seiner Kommandozeile, z.B.
# ist ^A dasselbe wie CTRL-A, welches den ASCII Kode 1 repräsentiert.
# Das kann benutzt werden, um z.B. ESC-Sequenzen zu generieren.

echo -n ^[[30m^[[41m                    # reverse Schrift, kein CR
echo -n @center( " C H O I C E S " 76 ) # zentrierte Ausgabe
echo    ^[[0m
echo
echo "[1] Primzahlen
echo "[2] 'More' Textanzeiger
echo "[3] Labyrinth Spiel
echo "[4] Türme von Hanoi Spiel
echo "[5] Backup/Versions Kontroll System
echo "[6] Sinnvolle Aliase
echo "[7] Mansplit, trennt ihre Csh-Anleitung auf.


# Das 'input' Kommando liest eine Zeile von der Konsole und speichert
ä diese in der angegebenen Variablen.

echo -n "> "
input wahl

goto Start$wahl# Springt zu den Marken Start1, Start2, etc.





# ------------------------- Primzahlen -----------------------------
# Das interessante an diesem Programm ist die Nutzung des 'fornum'
# Kommandos und der Trick eine Matrix zu generieren. Die Information
# ob 93 eine Primzahl ist, wird in der Variablen $prime93 gespeichert.

label Start1    # Startpunkt... Hierhin wird vom obigen Goto gesprungen

set max 100     # Höchste Zahl die auf Prim getestet werden soll
echo "Berechne Primzahlen von 1 bis"$max
fornum i 2 $max "set prime$i 1

# Jetzt folgt ein Kommandoblock. Alles wird intern zu einer Kommandozeile
# verknüpft, getrennt durch Semikola. Deshalb sind schliessende
# Anführungszeichen Pflicht, und Kommentare verboten.

fornum i 2 $max {
 exec "set bool $prime"$i
 if $bool
  echo -n $i^i
  fornum -s j $i $max $i "set prime$j 0"
 endif
}
echo

return 0




# ------------------------------ More -------------------------------
# Diese Stapeldatei macht in etwa das, was auch das Programm 'More' tut.
# Es demonstriert die Datei Ein- und Ausgabe-Kommandos und Datei
# Behandlungsfunktionen.

label Start2

# Der Hilfstext für 'More', als Alias definiert.
alias morehelp {
 echo "  Leertaste Eine Seite weiter"
 echo "  Enter     Eine Zeile weiter"
 echo "  Backspace Eine Seite zurück"
 echo "  <         An Anfang der Datei"
 echo "  >         An Ende der Datei"
 echo "  ESC, q    Ende"
 echo "  h         Hilfe"
}

echo "Das ist eine Annäherung eines Textanzeiger als Csh Stapeldatei.
echo "Funktionen:"
echo
morehelp
echo

echo -n "Geben Sie den Namen der anzusehenden Datei ein:"
input text
#set text test
if -nf $text;echo "Datei nicht gefunden.";return 20;endif

# Hier wird die Datei in den Speicher eingeladen. Jede Zeile wird als
# ein 'Wort' eingelesen, selbst wenn sie Leerzeichen beinhält. Für die
# Wort-Definierung bitte in der csh.doc Anleitung nachsehen.
readfile file $text
# Jeder Gebrauch von $file wird von nun an eine GROSSE Kommandozeile
# erbeben.
set pos    1
set page   @rpn( @winrows( ) 1 - )
set lines  @flines( file )
set bottom @rpn( $lines $page - 1 + )


label Disp

cls
set screen @subfile( file $pos $page )   # Schirmposition in $screen absichern
writefile screen
                                         # Berechnung, Anzeige der Prozent
set perc @rpn( $pos $page + 1 - 100 \* $lines / 100 MIN )
echo -n ^[[3m^[[30m^[[41m "-- More -- ("$perc"%)"^[[0m ""


input -r c    # Wartet auf einen einfachen Tastenduck ohne CR
set c x$c     # Hält das 'if' davon ab ein '<' misszuverstehen.

if $c = x" ";if $pos = $bottom;unset file;return 0;endif;endif
if $c = x" ";inc pos $page;if $pos > $bottom;set pos $bottom;endif;endif
if $c = x^m ;inc pos   1  ;if $pos > $bottom;set pos $bottom;endif;endif
if $c = x^h ;dec pos $page;if $pos < 1;set pos 1;endif;endif
if $c = x"<";set pos 1;endif
if $c = x">";set pos $bottom;endif
if $c = xq  ;unset file;return 0;endif
if $c = x^[ ;unset file;return 0;endif
if $c = xh  ;cls;morehelp;echo "Bitte Taste drücken.";input -r a;endif
#if $c = x/  ;set char xf;endif
#if $c = xf
# echo -n "Zeichenkette: ";input str;search -fq $text $str | input found;
# set found @subwords( $found 2 1000 );set c xn
#endif
#if $c = xn
# set hop 0
# foreach i ( $found ) "if $i > $pos;if $hop = 0;set hop $i;endif;endif
# if $hop;set pos $hop;endif
#endif

goto Disp





# ---------------------------- Labyrinth -------------------------------
# Ich wollte schon immer mal ein Action Game als Stapeldatei schreiben :-)
# Das Labyrinth ist als eine Zeichenkette abgespeichert, jede Zeile als
# ein Wort. Ändern Sie es nach Ihrem belieben, die Größe wird automatisch
# angepasst. Bitte keine automatische Tastenwiederholung einsetzen.

label Start3

set lab      "#########################"
set lab $lab "#   #     #   #     #   #"
set lab $lab "# # # ### ### ### # ### #"
set lab $lab "# #   # #   #     # #   #"
set lab $lab "# ##### ### ### ### # ###"
set lab $lab "#   #   #   #   # #     #"
set lab $lab "### # ### ### # # ##### #"
set lab $lab "#       #     #   #      "
set lab $lab "#########################"

cls
writefile lab
echo -n ^j"8=hoch 2=runter 4=links 6=rechts "^j^[[2A
set x 2
set y 2
set wid @strlen( @word( $lab 1 ) )
set up  @words( $lab )
echo -n ^[[$up\A^[[B^[[C.^[[D
alias test "%a%b set xx @rpn( $x $a + );set yy @rpn( $y $b + );\
 set f @strmid( @word( $lab $yy ) $xx 1 )


date -s

label Loop

input -r c
if $c = 8;test 0 -1;if -n $f = "#";echo -n " "^H^[[A.^H;dec y;endif;endif
if $c = 2;test 0  1;if -n $f = "#";echo -n " "^H^[[B.^H;inc y;endif;endif
if $c = 6;test  1 0;if -n $f = "#";echo -n " "^H^[[C.^H;inc x;endif;endif
if $c = 4;test -1 0;if -n $f = "#";echo -n " "^H^[[D.^H;dec x;endif;endif
if $x >= $wid;cls;echo Glückwunsch, freigekommen in `date -r` Sekunden.
 return 0
endif
goto Loop

return 0



# ------------------------------ Türme von Hanoi -----------------------
# Dieses Spiel wurde auf Geschwindigkeit optimiert, es sieht daher nicht
# so toll aus.

label Start4

set height 7 # Setze auf ungerade Zahlen bis 7

set h2 $height;inc h2
cls
unset t
set t1 "9"; set t2 "9"; set t3 "9"   # die drei Türme
fornum -s i $h2 2 -1 "set t1 $i$t1
set done $t1

#Anzeige vorbereiten
set im "x";set h @rpn( $height 2 \* 1 + )
fornum -s i 1 $h 2 "set im $im @center( @strleft( XXXXXXXXXXXXXXX $i ) $h )
fornum i $height 10 "set im $im \"               \"

cls
echo
echo "T Ü R M E  V O N  H A N O I
echo "---------------------------
echo
echo "Das Spiel ist nicht sehr komfortable, aber es funktioniert ganz gut.
echo "Sie müssen einen Stapel von Scheiben von dem ersten Turm auf den
echo "dritten Umlegen, ohne dabei eine grössere Scheibe auf eine kleinere
echo "zu legen. Um eine Scheibe von Turm 1 auf den Turm 3 zu bewegen, drücken
echo "Sie erst '1' dann '3'. Sind Sie fertig, wird die benötigte Zeit
echo "ausgegeben, nach CTRL-C wird das Spiel beendet. Sie werden keine
echo "andere Ausgabe als die Türme sehen, solange das Spiel läuft.
echo
echo "PS: Teilen Sie mir mit, wenn Sie unter 60 Sekunden bleiben *grins*
echo
echo "Bitte eine Taste drücken, wenn fertig."

input -r x
date -s
cls

#display stack
fornum  i 2 $h2 "echo \" \" @word( $im $i )
echo

set m1 1;set m2 17;set m3 33

forever {
 label Disp
 input -r x;input -r y
 exec "set src $t"$x";set dst $t"$y";set rt1 $m"$x";set rt2 $m"$y
 strleft move $src 1
 if a$move""a >= a$dst""b
  echo -n ^g
 else
  strlen up1 $src; strlen up2 $dst; inc up2
  echo -n \233$up1""A\233$rt1""C"                "^m\233$up1""B\
\233$up2""A\233$rt2""C @word( $im $move ) ^m\233$up2""B
  set t$y $move$dst
  strmid t$x $src 2
 endif
 if $t3 = $done;echo ^j^j;date -r;endif
}

return 0




# ---------------------- Backup/Version control -------------------------------
# Das ist eine Stapeldatei, die Sie vielleicht wirklich regelmäßig
# anwenden wollen. Sie kopiert (backup) eine Menge von Dateien in einen
# anderen Ordner, dabei werden alte Versionen nicht überschrieben.
# Trennen Sie diese Stapeldatei heraus, und rufen Sie es aus .login
# oder woher auch immer aufm wenn Sie ihre C-Programmierumgebung
# installieren. Wird die Verzögerung auf 0 gesetzt, stellen Sie sicher
# das diese Stapeldatei immer ausgeführt wird.

label Start5

set versions 3         # Maximale Anzahl alter zu behaltender Versionen
set delay    1         # Minimale Anzahl Tage zwischen den Kopien
set dest     bak       # Der Zielordner der Kopien
set pattern  "*.c *.h" # Das Suchmuster für zu kopierende Dateien
set exlude   "x.c y.c" # Nicht zu kopierende Dateien


#----- Umgebung setzen -----
if -nd $dest
 echo -n "Ordner "$dest" existiert nicht... erstellen? y/n: ";input x
 if $x = y;mkdir $dest;else;echo "Beendet...";return 0;endif
endif

if -f $dest/timestamp
 set last @age( $dest/timestamp )
 if $last < $delay
  echo "Keine Kopie erstellt... Letze erstelle Kopie ist "$last" Tag(e) alt."
  return 0
 endif
else
 echo >$dest/timestamp
endif


#----- Teste auf geänderte Dateien ----
echo "Teste Dateien...."
exec set all $pattern              # Hier wird das Suchmuster expandiert

set cp ""                          # Zu kopierende Dateien
foreach i ( $all ) "if -nt $i $dest/$i;set cp $cp $i;endif

exec set exclude $exclude          # Die exklusiven Dateien werden expandiert
set cp @without( $cp , $exclude )

if $cp = "";echo "Fertig.";touch $dest/timestamp;return 0;endif
echo "Zu kopierende Dateien:"
echo $cp
# Löschen Sie das Kommentarzeichen um einen Sicherheitscheck erfolgen zu
# lassen.
# set cp @confirm( Backup $cp )
if $cp = "";echo "Fertig.";touch $dest/timestamp;return 0;endif


#------ Kopien erstellen -------
alias name "%a set n $dest/$i;if $a;set n $n.$a;endif

foreach i ( $cp ) {
 set v $versions;dec v
 name $v;dec v
 if -f $n;rm $n;endif
 fornum -s j $v 0 -1 "set hi $n;name $j;if -f $n;mv $n $hi;endif"
 cp $i $dest
}

touch $dest/timestamp
echo "Fertig."

return 0





# ---------------------- Hilfsreiche Aliase --------------------------
# Lesen Sie die Kommentare eines jeden Alias, um herauszufinden, ob
# das Alias für Sie hilfsreich ist. Kopieren Sie es dann in die login
# Datei.

label Start6
# Ein paar nützliche Aliase für das dir Kommando
alias  d   "*a dir @pickopts( $a ) -ze \"%6s %-.12n%m\" @pickargs( $a )
alias  lst "*a ls -t $a"    # sortiert nach Alter
alias  lsl "*a ls -l $a"    # sortiert nach Länge
alias  move "cp -m

# sc searches *.c, even 'sc -c main()' works
alias  sc "%a search @pickopts( $a ) *.c @pickargs( $a )

# edf editiert eine Funktion im CygnusEd wenn der Name in der ersten
# Zeile angegeben wird:
alias  edf {
%func
 set b ""
 search -afl *.c $func | inp b
 if $b
  split b file line
  lced $file
  waitforport rexx_ced
  inc line 1
  rxsend rexx_ced "jump to file "$file "jumpto "$line" 0"
 else
  echo Not found
 endif
}

# Diese Aliase unterdrücken Suchmuster Expandierng in einigen Kommandos
alias  zoo     "*a Zoo $a
alias  lharc   "*a Lharc $a
alias  lz      "*a Lz $a
alias  newlist "*a Newlist $a
alias  eval    "*a Eval $a

# Dieses hier wird alle Bilder anzeigen, das neueste zuerst.
alias  newpix  "ls -nt | forline i STDIN \"ShowIFF $i

# Wollen Sie ein Csh Kommando mit 'run' im Hintergrund starten, benutzen
# sie dieses Alias:
alias rs "rback csh -c

# Ein paar Aliase für die UNIX Freunde unter uns

# Dieses Alias ahmt das chmod Kommando nach, welches die Bits zuerst und
# dann erst die Dateien erwartet:
alias chmod "%a protect @subwords( $a 2 9999 ) @first( $a )

# Genauso bei grep:
alias grep "%a search @subwords( $a 2 9999 ) @first( $a )

# pushd schiebt den aktuellen Ordner auf den Stack
set stk ""
alias  pushd "%a set stk $_cwd @subwords( $stk 1 10 );\\cd $a;e $stk

# popd  holt den mit pushd erzeugten Ordner, und wechselt dorthin
alias  popd  "\\cd @first( $stk );set stk @subwords( $stk 2 10 );e $stk

echo "Hilfsreiche Aliase erzeugt. Lesen Sie diese Stapeldatei um
echo "herauszufinden ob ein paar für Sie sinnvolle dabei sind.

return 0





# ----------------------- Mansplit.sh - Trennt das csh.doc -------------
# Trennt das csh.doc in kleine Dateien auf, eins pro Hilfseintrag.
# So können externe 'Man' Kommandos mit ihnen arbeiten, diese sind normal
# schneller als das interne.

label Start7

echo "Ein wenig Geduld...
set dest ram:cshdoc/           # Setzen Sie hier Ihren Ordner ein
if -nd ram:cshdoc;mkdir ram:cshdoc;endif   # ...und hier
set mode skip
forline i csh:csh.doc {
 if $mode = write
  if @strleft( $i^a 1 ) < " "
   echo >>$dest$file $i
  else
   set mode skip
  endif
 endif
 if $mode = skip
  if "    " = @strleft( $i 4 )
   set mode write
   set a @index( $i "(" )
   if $a > 0;dec a 1;strleft i $i $a;endif
   set file $i
   echo >$dest$file $i
   echo $file
  endif
 endif
}
echo "csh.doc auftrennung erfolgt im Ordner "$dest

return 0
