home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / system / csh / demo.sh < prev    next >
Text File  |  1995-02-27  |  12KB  |  447 lines

  1. # This is a comment:
  2. # --------------------------- Main menu ------------------------------
  3.  
  4. # check if we're running a csh 5.16 or above. $_version contians the current
  5. # version, and the return command returns from a batch file.
  6.  
  7. if $_version < 516
  8.  echo "Sorry, csh version 5.16 needed";return 0
  9. endif
  10.  
  11.  
  12.  
  13. cls  # clears the screen
  14.  
  15. # The echo command is used for printing lines to the screen.  Note that a
  16. # trailing quote is not necessary
  17.  
  18. echo "This is a sample script for csh. It contains quite a few useful
  19. echo "aliases you might want to keep permanently, but its main purpose
  20. echo "is to be used as a tutorial. Look at it and modify it.
  21. echo
  22.  
  23.  
  24.  
  25. # Every csh command accepts ^-codes in its command line, e.g. ^A is 
  26. # the same as CTRL-A, which is ASCII code 1. This can be used to gene-
  27. # rate escape sequences.
  28.  
  29. echo -n ^[[30m^[[41m                    # reverse video, no CR
  30. echo -n @center( " C H O I C E S " 76 ) # centered display
  31. echo    ^[[0m
  32. echo
  33. echo "[1] Prime numbers
  34. echo "[2] 'More' text viewer
  35. echo "[3] Labyrinth game
  36. echo "[4] Towers of Hanoi game
  37. echo "[5] Backup/Version control system
  38. echo "[6] Useful aliases
  39. echo "[7] Mansplit, split up your csh.doc
  40.  
  41.  
  42.  
  43. # The input command reads a line from the console and stores it in
  44. # the indicated variable.
  45.  
  46. echo -n "> "
  47. input choice
  48.  
  49. goto Start$choice   # Jumps to label Start1 or Start2 and so on
  50.  
  51.  
  52.  
  53.  
  54.  
  55. # ------------------------- Prime number -----------------------------
  56. # Interesting about this program is the use of the 'fornum' command
  57. # and the tricks used the generate arrays. The information whether
  58. # 93 is prime or not is stored in variable $prime93 .
  59.  
  60. label Start1    # entrypoint... here we get from the goto
  61.  
  62. set max 100     # highest number checked for prime
  63. echo "Computing prime numbers from 1 to "$max
  64. fornum i 2 $max "set prime$i 1
  65.  
  66. # This is a statement block. Everything will be concatted on one line
  67. # internally, separated by semicolons. Therefore, ending quotes are
  68. # mandatory and comments are forbidden.
  69. fornum i 2 $max {
  70.  exec "set bool $prime"$i
  71.  if $bool
  72.   echo -n $i^i
  73.   fornum -s j $i $max $i "set prime$j 0"
  74.  endif
  75. }
  76. echo
  77.  
  78. return 0
  79.  
  80.  
  81.  
  82.  
  83. # ------------------------------ More -------------------------------
  84. # This script does about what the program 'more' does. It is supposed
  85. # to demonstrate the file I/O commands and the file handling functions.
  86.  
  87. label Start2
  88.  
  89. # the help screen for 'more', defined as an alias
  90. alias morehelp {
  91.  echo "  space     down one page"
  92.  echo "  enter     down one line"
  93.  echo "  backspace up one page"
  94.  echo "  <         top of file"
  95.  echo "  >         bottom of file"
  96.  echo "  ESC, q    quit"
  97.  echo "  h         help"
  98. }
  99.  
  100. echo "This is a simple approach to programming a text viewer as a csh script.
  101. echo "Functions:"
  102. echo
  103. morehelp
  104. echo
  105.  
  106. echo -n "Enter name of text file to view: "
  107. input text
  108. #set text test
  109. if -nf $text;echo "File not found";return 20;endif
  110.  
  111. # This reads the file into memory. Every line will be one 'word', even
  112. # if it contains blanks. For definition of word, refer to csh.doc.
  113. readfile file $text
  114. # Every use of $file will from now one generate a HUGE command line.
  115. set pos    1
  116. set page   @rpn( @winrows( ) 1 - )
  117. set lines  @flines( file )
  118. set bottom @rpn( $lines $page - 1 + )
  119.  
  120.  
  121. label Disp
  122.  
  123. cls
  124. set screen @subfile( file $pos $page )   # store screenful in $screen
  125. writefile screen
  126.                                            # compute & display percentage
  127. set perc @rpn( $pos $page + 1 - 100 \* $lines / 100 MIN )
  128. echo -n ^[[3m^[[30m^[[41m "-- More -- ("$perc"%)"^[[0m ""
  129.  
  130.  
  131. input -r c    # inputs one single keystroke without waiting for CR
  132. set c x$c     # prevents '<' from being misinterpreted in 'if'
  133.  
  134. if $c = x" ";if $pos = $bottom;unset file;return 0;endif;endif
  135. if $c = x" ";inc pos $page;if $pos > $bottom;set pos $bottom;endif;endif
  136. if $c = x^m ;inc pos   1  ;if $pos > $bottom;set pos $bottom;endif;endif
  137. if $c = x^h ;dec pos $page;if $pos < 1;set pos 1;endif;endif
  138. if $c = x"<";set pos 1;endif       
  139. if $c = x">";set pos $bottom;endif 
  140. if $c = xq  ;unset file;return 0;endif
  141. if $c = x^[ ;unset file;return 0;endif
  142. if $c = xh  ;cls;morehelp;echo "Press any key";input -r a;endif
  143. #if $c = x/  ;set char xf;endif
  144. #if $c = xf
  145. # echo -n "Search string: ";input str;search -fq $text $str | input found;
  146. # set found @subwords( $found 2 1000 );set c xn
  147. #endif
  148. #if $c = xn
  149. # set hop 0
  150. # foreach i ( $found ) "if $i > $pos;if $hop = 0;set hop $i;endif;endif
  151. # if $hop;set pos $hop;endif
  152. #endif
  153.  
  154. goto Disp
  155.  
  156.  
  157.  
  158.  
  159.  
  160. # ---------------------------- Labyrinth -------------------------------
  161. # I always wanted to do an action game as a script :-)
  162. # The laby is stored as one single string, with every line one word.
  163. # Feel free to modify it, the size is detected automatically. Don't
  164. # use auto key repeat when playing, this can cause console trouble.
  165.  
  166. label Start3
  167.  
  168. set lab      "#########################"
  169. set lab $lab "#   #     #   #     #   #"
  170. set lab $lab "# # # ### ### ### # ### #"
  171. set lab $lab "# #   # #   #     # #   #"
  172. set lab $lab "# ##### ### ### ### # ###"
  173. set lab $lab "#   #   #   #   # #     #"
  174. set lab $lab "### # ### ### # # ##### #"
  175. set lab $lab "#       #     #   #      "
  176. set lab $lab "#########################"
  177.  
  178. cls
  179. writefile lab
  180. echo -n ^j"8=up 2=down 4=left 6=right "^j^[[2A
  181. set x 2
  182. set y 2
  183. set wid @strlen( @word( $lab 1 ) )
  184. set up  @words( $lab )
  185. echo -n ^[[$up\A^[[B^[[C.^[[D
  186. alias test "%a%b set xx @rpn( $x $a + );set yy @rpn( $y $b + );\
  187.  set f @strmid( @word( $lab $yy ) $xx 1 )
  188.  
  189.  
  190. date -s
  191.  
  192. label Loop
  193.  
  194. input -r c
  195. if $c = 8;test 0 -1;if -n $f = "#";echo -n " "^H^[[A.^H;dec y;endif;endif
  196. if $c = 2;test 0  1;if -n $f = "#";echo -n " "^H^[[B.^H;inc y;endif;endif
  197. if $c = 6;test  1 0;if -n $f = "#";echo -n " "^H^[[C.^H;inc x;endif;endif
  198. if $c = 4;test -1 0;if -n $f = "#";echo -n " "^H^[[D.^H;dec x;endif;endif
  199. if $x >= $wid;cls;echo Congrats, escaped in `date -r` seconds.;return 0;endif
  200. goto Loop
  201.  
  202. return 0
  203.  
  204.  
  205.  
  206. # ------------------------------ Towers of hanoi -----------------------------
  207. # This game has been optimized for speed, and is therefore not very nice
  208. # to look at.
  209.  
  210. label Start4
  211.  
  212. set height 7 # set to uneven numbers up to 7
  213.  
  214. set h2 $height;inc h2
  215. cls
  216. unset t
  217. set t1 "9"; set t2 "9"; set t3 "9"   # the three towers
  218. fornum -s i $h2 2 -1 "set t1 $i$t1
  219. set done $t1
  220.  
  221. #prepare imaging
  222. set im "x";set h @rpn( $height 2 \* 1 + )
  223. fornum -s i 1 $h 2 "set im $im @center( @strleft( XXXXXXXXXXXXXXX $i ) $h )
  224. fornum i $height 10 "set im $im \"               \"
  225.  
  226. cls
  227. echo
  228. echo "T O W E R S   O F   H A N O I
  229. echo "-----------------------------
  230. echo
  231. echo "This game is not very comfortable, but it works fine. You have to move
  232. echo "a pile of disks from the first of three poles to the third one without
  233. echo "ever putting a larger disk on a smaller one. To move the disk at the 
  234. echo "top of pile one to pile three, first press '1' and then '3'. When you're 
  235. echo "done, the time it took you will be printed, and you have to press 
  236. echo "CTRL-C to end the game. You won't see any output but the stacks while
  237. echo "the game is running.
  238. echo
  239. echo "PS: Tell me if you get below 60 seconds for one go...   *grin*
  240. echo
  241. echo "Press any key when ready...
  242.  
  243. input -r x
  244. date -s
  245. cls
  246.  
  247. #display stack
  248. fornum  i 2 $h2 "echo \" \" @word( $im $i )
  249. echo
  250.  
  251. set m1 1;set m2 17;set m3 33
  252.  
  253. forever {
  254.  label Disp
  255.  input -r x;input -r y
  256.  exec "set src $t"$x";set dst $t"$y";set rt1 $m"$x";set rt2 $m"$y
  257.  strleft move $src 1
  258.  if a$move""a >= a$dst""b
  259.   echo -n ^g
  260.  else
  261.   strlen up1 $src; strlen up2 $dst; inc up2
  262.   echo -n \233$up1""A\233$rt1""C"                "^m\233$up1""B\
  263. \233$up2""A\233$rt2""C @word( $im $move ) ^m\233$up2""B
  264.   set t$y $move$dst
  265.   strmid t$x $src 2
  266.  endif
  267.  if $t3 = $done;echo ^j^j;date -r;endif
  268. }
  269.  
  270. return 0
  271.  
  272.  
  273.  
  274.  
  275. # ---------------------- Backup/Version control -------------------------------
  276. # Now this is a script you'd really want to use regularly. It backs up
  277. # a set of files to a different directory, keeping any number of old
  278. # old versions. Extract this script and call it from your .login or
  279. # whenever you start your C development system. By setting a delay of
  280. # zero you make sure that every time this script a backup is done.
  281.  
  282. label Start5
  283.  
  284. set versions 3         # maximum number of versions kept per file
  285. set delay    1         # minimum number of days between backups
  286. set dest     bak       # the destination subdirectory of the backup
  287. set pattern  "*.c *.h" # the pattern for files to back up
  288. set exlude   "x.c y.c" # the files NOT to back up
  289.  
  290.  
  291. #----- set up environment -----
  292. if -nd $dest
  293.  echo -n "Directory "$dest" not present... create? y/n: ";input x
  294.  if $x = y;mkdir $dest;else;echo "Aborted...";return 0;endif
  295. endif
  296.  
  297. if -f $dest/timestamp
  298.  set last @age( $dest/timestamp )
  299.  if $last < $delay
  300.   echo "No backup done... last backup was "$last" day(s) ago."
  301.   return 0
  302.  endif
  303. else
  304.  echo >$dest/timestamp
  305. endif
  306.  
  307.  
  308. #----- determine altered files ----
  309. echo "Checking files...."
  310. exec set all $pattern              # wild card expansion happens here
  311.  
  312. set cp ""                          # the files to copy
  313. foreach i ( $all ) "if -nt $i $dest/$i;set cp $cp $i;endif
  314.  
  315. exec set exclude $exclude          # wild card expansion happens here
  316. set cp @without( $cp , $exclude )
  317.  
  318. if $cp = "";echo "All done.";touch $dest/timestamp;return 0;endif
  319. echo "The files to back up:"
  320. echo $cp
  321. # Uncomment the following line if you want a sanity check...
  322. # set cp @confirm( Backup $cp )
  323. if $cp = "";echo "All done.";touch $dest/timestamp;return 0;endif
  324.  
  325.  
  326. #------ do the backup -------
  327. alias name "%a set n $dest/$i;if $a;set n $n.$a;endif
  328.  
  329. foreach i ( $cp ) {
  330.  set v $versions;dec v
  331.  name $v;dec v
  332.  if -f $n;rm $n;endif
  333.  fornum -s j $v 0 -1 "set hi $n;name $j;if -f $n;mv $n $hi;endif"
  334.  cp $i $dest
  335. }
  336.  
  337. touch $dest/timestamp
  338. echo "All done."
  339.  
  340. return 0
  341.  
  342.  
  343.  
  344.  
  345.  
  346. # ---------------------- The useful aliases -------------------------------
  347. # Read the comments for every single alias to find out which ones you
  348. # like. Copy those into your login.
  349.  
  350. label Start6
  351.  
  352. # first a few useful aliases for dir
  353. alias  d   "*a dir @pickopts( $a ) -ze \"%6s %-.12n%m\" @pickargs( $a )
  354. alias  lst "*a ls -t $a"    # sorts by access time
  355. alias  lsl "*a ls -l $a"    # sorts by length
  356. alias  move "cp -m
  357.  
  358. # sc searches *.c, even 'sc -c main()' works
  359. alias  sc "%a search @pickopts( $a ) *.c @pickargs( $a )
  360.  
  361. # edf edits a function in CygnusEd if the name starts in the first column:
  362. alias  edf {
  363. %func 
  364.  set b ""
  365.  search -afl *.c $func | inp b
  366.  if $b
  367.   split b file line
  368.   lced $file
  369.   waitforport rexx_ced
  370.   inc line 1
  371.   rxsend rexx_ced "jump to file "$file "jumpto "$line" 0"
  372.  else
  373.   echo Not found
  374.  endif
  375. }
  376.  
  377. # this aliases suppress wild card expansion for certain commands
  378. alias  zoo     "*a Zoo $a
  379. alias  lharc   "*a Lharc $a
  380. alias  lz      "*a Lz $a
  381. alias  newlist "*a Newlist $a
  382. alias  eval    "*a Eval $a
  383.  
  384.  
  385. # this one will show all pictures, the newest first
  386. alias  newpix  "ls -nt | forline i STDIN \"ShowIFF $i
  387.  
  388. # if you want to run cshell internal commands in the backrund, use rs
  389. alias  rs      "rback csh -c
  390.  
  391. # some aliases for UNIX compatibility
  392.  
  393. # this ceates a chmod command that expects the bits first and the files after
  394. alias chmod "%a protect @subwords( $a 2 9999 ) @first( $a )
  395.  
  396. # the same with grep:
  397. alias grep "%a search @subwords( $a 2 9999 ) @first( $a )
  398.  
  399. set stk ""
  400. # pushd pushes the current directory on a stack
  401. alias  pushd "%a set stk $_cwd @subwords( $stk 1 10 );\\cd $a;e $stk
  402.  
  403. # popd  retrieves it from there
  404. alias  popd  "\\cd @first( $stk );set stk @subwords( $stk 2 10 );e $stk
  405.  
  406. echo "Useful aliases defined. Read this batch file to find out their
  407. echo "names and what they do.
  408.  
  409. return 0
  410.  
  411.  
  412.  
  413.  
  414.  
  415. # ----------------------- Mansplit.sh - splits up csh.doc ------------------
  416. # Splits up csh.doc in small files, one per man entry. So external 'man'
  417. # programs can work with it, which is usually faster then csh's own method.
  418.  
  419. label Start7
  420.  
  421. echo Patience...
  422. set dest ram:cshdoc/           # set your destination directory here
  423. if -nd ram:cshdoc;mkdir ram:cshdoc;endif   # ...and here
  424. set mode skip
  425. forline i csh:csh.doc {
  426.  if $mode = write
  427.   if @strleft( $i^a 1 ) < " " 
  428.    echo >>$dest$file $i
  429.   else
  430.    set mode skip
  431.   endif
  432.  endif
  433.  if $mode = skip
  434.   if "    " = @strleft( $i 4 )
  435.    set mode write
  436.    set a @index( $i "(" )
  437.    if $a > 0;dec a 1;strleft i $i $a;endif
  438.    set file $i
  439.    echo >$dest$file $i
  440.    echo $file
  441.   endif
  442.  endif
  443. }
  444. echo "csh.doc split up and written to "$dest
  445.  
  446. return 0
  447.