home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume30 / rc / part03 / EXAMPLES next >
Text File  |  1992-05-30  |  17KB  |  750 lines

  1. There is no repository for useful rc code snippets as yet, so I'm including
  2. a (short) file in the distribution with some helpful/intriguing pieces of
  3. rc code.
  4.  
  5. A sample .rcrc
  6. --------------
  7. Here is the .rcrc I use on archone:
  8.  
  9. umask 022 
  10. path=(/bin /usr/bin /usr/ucb)
  11. ht=`/usr/arch/bin/hosttype
  12. h=$home
  13. history=$h/.history
  14. bin=$h/bin/$ht
  15. lib=$h/lib/$ht
  16. sh=$h/bin/sh
  17. include=$h/lib/include
  18.  
  19. switch ($ht) {
  20. case sun*
  21.     OBERON='. '$h/other/oberon
  22.     p=/usr/ucb
  23.     compiler='gcc -Wall -O -g'
  24.     MANPATH=$h/man:/usr/arch/man:/usr/man
  25.     if (! ~ $TERM ()) {
  26.         stty dec
  27.         /usr/arch/bin/msgs -q
  28.     }
  29. case next
  30.     p=(/usr/ucb /usr/bin /NextApps)
  31.     compiler='cc -Wall -O -g -DNODIRENT'
  32.     MANPATH=$h/man:/usr/arch/man:/usr/man
  33.     if (! ~ $TERM ())
  34.         stty dec
  35. case sgi
  36.     p=(/usr/ucb /usr/sbin /usr/bin)
  37.     compiler='gcc -Wall -O -g -DNOSIGCLD'
  38.     MANPATH=$h/man:/usr/arch/man:/usr/catman
  39.     if (!{~ $TERM () || ~ $TERM *iris*})
  40.         stty line 1 intr '' erase '' kill ''
  41. case *
  42.     echo .rcrc not configured for this machine
  43. }
  44.  
  45. path=(. $sh $bin /usr/arch/bin $p /bin /usr/bin/X11 /etc /usr/etc)
  46. cdpath=(. .. $h $h/src $h/misc $h/other $h/adm)
  47. RNINIT=-d$h' -t -M -2400-h -2400+hfrom'; DOTDIR=$h/misc/news
  48. PRINTER=lw
  49.  
  50. fn s {
  51.     echo $status
  52. }
  53. fn cd {
  54.     builtin cd $1 && \
  55.     switch ($1) {
  56.     case ()
  57.         dir=$home
  58.     case *
  59.         dir=()
  60.     }
  61. }
  62. fn pwd {
  63.     if (~ $dir ())
  64.         dir=`/bin/pwd
  65.     echo $dir
  66. }
  67. fn x {
  68.     if (~ `tty /dev/console)
  69.         clear_colormap
  70.     clear
  71.     exit
  72. }
  73. fn p {
  74.     if (~ $history ()) {
  75.         echo '$history not set' >[1=2]
  76.         return 1
  77.     }
  78.  
  79.     if (! ~ $#* 0 1 2) {
  80.         echo usage: $0 '[egrep pattern] [sed command]' >[1=2]
  81.         return 1
  82.     }
  83.  
  84.     command=`{
  85.         egrep -v '^[     ]*p([     ]+|$)' $history | switch ($#*) {
  86.         case 0
  87.             cat
  88.         case 1
  89.             egrep $1
  90.         case 2
  91.             egrep $1 | sed $2
  92.         } | tail -1
  93.     }
  94.  
  95.     echo $command
  96.     eval $command
  97. }
  98.  
  99. if (~ $TERM dialup network) {
  100.     TERM=vt100
  101.     biff y
  102. }
  103.  
  104. A front-end to NeXT's "openfile"
  105. --------------------------------
  106.  
  107. Named after the sam "B" command for opening a file, this script was written
  108. by Paul Haahr. (Assumes the "pick" command from Kernighan and Pike is also
  109. in your path.)
  110.  
  111. #!/bin/rc
  112. if (~ $#* 0)
  113.         exec openfile
  114. create = ()
  115. files = ()
  116. for (i in $*)
  117.         if (test -f $i) {
  118.                 files = ($files $i)
  119.         } else {
  120.                 create = ($create $i)
  121.     }
  122. create = `{ pick $create }
  123. files = ($files $create)
  124. for (i in $create)
  125.         > $i
  126. if (! ~ $#files 0)
  127.     openfile $files
  128.  
  129. A read function
  130. ---------------
  131.  
  132. Unlike sh, rc doesn't have a read. This clever alternative returns an
  133. exit status as well as fetch a variable. Use as
  134.  
  135.     read foo
  136.  
  137. to set $foo to a single line from the terminal.
  138.  
  139. (due to John Mackin <john@syd.dit.csiro.au>)
  140.  
  141. fn read {
  142.         x=() {
  143.                 x = `` ($nl) { awk '{print; print 0; exit}' ^ $nl ^ \
  144.                                    'END {print 1; print 1}' }
  145.                 $1 = $x(1)
  146.                 return $x(2)
  147.         }
  148. }
  149.  
  150. From cs.wisc.edu!dws Fri Aug  2 18:16:14 1991
  151.  
  152. #-------
  153. # ls front end
  154. #-------
  155. fn ls    \
  156. {
  157.     test -t 1 && * = (-FCb $*)
  158.     builtin ls $*
  159. }
  160. #-------
  161. # nl - holds a newline, useful in certain command substitutions
  162. #-------
  163. nl='
  164. '
  165. #-------
  166. # show - tell me about a name
  167. #
  168. # Runs possibly dangerous things through cat -v in order to protect
  169. # me from the effects of control characters I might have in the
  170. # environment.
  171. #-------
  172. fn show    \
  173. {
  174.     * = `` $nl {whatis -- $*}
  175.     for(itis)
  176.     {
  177.         switch($^itis)
  178.         {
  179.         case 'fn '*    ; echo $itis | cat -v -t
  180.         case builtin*    ; echo $itis
  181.         case /*        ; file $itis; ls -ld $itis
  182.         case *'='*    ; echo $itis | cat -v -t
  183.         case *        ; echo $itis: UNKNOWN: update show
  184.         }
  185.     }
  186.     itis = ()
  187. }
  188. #-------
  189. # Tell me automatically when a command has a nonzero status.
  190. #-------
  191. fn prompt    \
  192. {
  193.     Status = $status
  194.     ~ $Status 0 || echo '[status '$Status']'
  195. }
  196.  
  197. #-------
  198. # chop - echo the given list, less its final member
  199. #
  200. # e.g. chop (a b c) -> (a b)
  201. #-------
  202. fn chop {
  203.     ~ $#* 0 1 && return 0
  204.     ans = '' {    # local variable
  205.         ans = ()
  206.         while(! ~ $#* 1)
  207.         {
  208.             ans = ($ans $1)
  209.             shift
  210.         }
  211.         echo $ans
  212.     }
  213. }
  214.  
  215. From arnold@audiofax.com Thu May 30 08:49:51 1991
  216.  
  217. # cd.rc --- souped up version of cd
  218.  
  219. # this is designed to emulate the fancy version of cd in ksh,
  220. # so if you're a purist, feel free to gag
  221.  
  222. _cwd=$home
  223. _oldcwd=$home
  224.  
  225. fn cd {
  226.     if (~ $#* 0) {
  227.         if (~ $_cwd $home) {    # do nothing
  228.         } else {
  229.             builtin cd && { _oldcwd=$_cwd ; _cwd=$home }
  230.         }
  231.     } else if (~ $#* 1) {
  232.         if (~ $1 -) {
  233.             _t=$_cwd
  234.             builtin cd $_oldcwd && {
  235.                 _cwd=$_oldcwd
  236.                 _oldcwd=$_t
  237.                 echo $_cwd
  238.             }
  239.             _t=()
  240.         } else {
  241.             # if a cd happens through the cdpath, rc echos
  242.             # the directory on its own.  all we have to do
  243.             # is track where we end up
  244.             _dopwd = 1
  245.             { ~ $1 /* } && _dopwd = 0    # absolute path
  246.             builtin cd $1 && {
  247.                 _oldcwd=$_cwd
  248.                 _cwd=$1
  249.                 { ~ $_dopwd 1 } && _cwd=`/bin/pwd
  250.             }
  251.             _dopwd=()
  252.         }
  253.     } else if (~ $#* 2) {
  254.         _t=`{ echo $_cwd | sed 's<'$1'<'$2'<' }
  255.         builtin cd $_t && {
  256.             _oldcwd=$_cwd
  257.             _cwd=$_t
  258.             echo $_cwd
  259.         }
  260.         _t=()
  261.     } else {
  262.         echo cd: takes 0, 1, or 2 arguments >[1=2]
  263.         builtin cd $1 && { _oldcwd=$_cwd ; _cwd=`/bin/pwd ; echo $_cwd }
  264.     }
  265. }
  266.  
  267. fn pwd { echo $_cwd }
  268.  
  269. From vlsi.cs.caltech.edu!drazen Tue Jan 21 16:03:14 1992
  270.  
  271. # A kill builtin.
  272.  
  273. #ifdef B_KILL
  274. #include <ctype.h>
  275. static void b_kill(char **av)
  276. {
  277.     int signal = SIGTERM;
  278.     int n = 1;
  279.     pid_t pid;
  280.     boolean res;
  281.  
  282.     if (!av[1]) {
  283.         set(TRUE);
  284.         return;
  285.     }
  286. #undef  STRCMP
  287. #define STRCMP strcmp
  288.     if ( '-' == av[1][0]) {
  289.         char *p = 1+av[1];
  290.         if (0 == strcmp(av[1], "-l")){
  291.             int r; const int nsig = NUMOFSIGNALS;
  292.             const int C = 4, R = 1 + (int)((nsig-2)/C);
  293.             for (r=1; r<=R; r++){
  294.               int j;
  295.               for (j=r; j<nsig; j+=R){
  296.                 fprint(1, "%s%d. %s\t", j<10?" ":"", j, signals[j][0]);
  297.               }
  298.               fprint(1,"\n");
  299.             }
  300.             set(TRUE);
  301.             return;
  302.         }
  303.         n++;
  304.         if ( (signal=a2u(p)) < 0){
  305.             int i;
  306.             for (i = 1; i < NUMOFSIGNALS; i++){
  307.                 char UPPER[31], *u=UPPER, *q;
  308.                 for (q=signals[i][0]; *q; q++, u++) *u = toupper(*q);
  309.                 *u = '\0';
  310.  
  311.                 if (*signals[i][0] &&
  312.                   (!STRCMP(signals[i][0], p) || !STRCMP(3+signals[i][0],p)
  313.                    || !STRCMP(UPPER, p) || !STRCMP(3+UPPER, p) )  )
  314.                 {
  315.                     signal = i;
  316.                     break;
  317.                 }
  318.             }
  319.             if (signal < 0){
  320.                 fprint(2,"kill: bad signal %s\n", av[1]);
  321.                 set(FALSE);
  322.                 return;
  323.             }
  324.         }
  325.     }
  326. #undef STRCMP
  327.  
  328.     for (res=TRUE; av[n]; n++){
  329.         if( (pid = (pid_t) a2u(av[n])) < 0){
  330.             fprint(2, "kill: bad process number %s\n", av[n]);
  331.             res = FALSE;
  332.             continue;
  333.         }
  334.         if (kill(pid,signal)){
  335.             uerror("kill");
  336.             res = FALSE;
  337.             continue;
  338.         }
  339.     }
  340.     set(res);
  341. }
  342. #endif
  343. From acc.stolaf.edu!quanstro Thu Apr  2 02:51:10 1992
  344. Received: from thor.acc.stolaf.edu ([130.71.192.1]) by archone.tamu.edu with SMTP id <45339>; Thu, 2 Apr 1992 02:50:56 -0600
  345. Received: by thor.acc.stolaf.edu; Thu, 2 Apr 92 02:49:31 -0600
  346. Date: Thu, 2 Apr 1992 02:49:31 -0600
  347. From: quanstro@acc.stolaf.edu
  348. Message-Id: <9204020849.AA26566@thor.acc.stolaf.edu>
  349. To: byron@archone.tamu.edu
  350. Subject: EXAMPLES in 1.4beta
  351. Status: RO
  352.  
  353.  
  354. I have a little bit of code which might be a little more general than
  355. the souped-up version that is already there. Here it is, if you are
  356. interested. 
  357.  
  358. # directory functions ###################################################
  359. fn pwd { echo $PWD; }
  360.  
  361. fn pushd {
  362.   dirs = ($PWD $dirs);        
  363.   builtin cd $*;
  364.   PWD = `{builtin pwd};
  365. }
  366.  
  367. fn popd {
  368.   switch ($#*)
  369.     {
  370.     case 0
  371.       ;
  372.     case 1
  373.       echo 'popd: argument '^$1^' ignored.' >[1=2];
  374.     case *
  375.       echo 'popd: usage: popd [n].';
  376.     }
  377.  
  378.   if (! ~ $dirs ()) 
  379.     {
  380.       builtin cd $dirs(1);
  381.       PWD = $dirs(1);
  382.       echo $PWD;
  383.       * = $dirs;
  384.       shift
  385.       dirs = $*;
  386.     }
  387. }
  388.  
  389. fn cd {
  390.   ~ $* () && * = $home;
  391.   !~ $#* 1 && echo 'cd: too many arguments' >[1=2] && return 1;
  392.  
  393.   if (test -r $* ) {
  394.     pushd $*;
  395.   } else {
  396.     echo cd: $* does not exist. >[1=2]
  397.     return 1;
  398.   } 
  399. }
  400.  
  401. fn back { popd $*; }
  402.  
  403. fn Back { 
  404.   cd $home;
  405.   PWD = $home;
  406.   dirs = ();
  407. }
  408.  
  409. fn dirs {
  410.   echo $dirs;
  411. }
  412.  
  413. PWD = `{builtin pwd} ; dirs = $PWD        # kickstart
  414.  
  415.  
  416.  
  417.  
  418.  
  419. From acc.stolaf.edu!quanstro Thu Apr  2 02:53:40 1992
  420. Received: from thor.acc.stolaf.edu ([130.71.192.1]) by archone.tamu.edu with SMTP id <45339>; Thu, 2 Apr 1992 02:53:38 -0600
  421. Received: by thor.acc.stolaf.edu; Thu, 2 Apr 92 02:51:46 -0600
  422. Date: Thu, 2 Apr 1992 02:51:46 -0600
  423. From: quanstro@acc.stolaf.edu
  424. Message-Id: <9204020851.AA26573@thor.acc.stolaf.edu>
  425. To: byron@archone.tamu.edu
  426. Subject: EXAMPLES
  427. Status: RO
  428.  
  429.  
  430. Little yp hack which act's like ~ w/o syntatic sugar (for those who do
  431. not have the luxury of seting up symbolic links to all user's homes
  432.  
  433. # user function #########################################################
  434. fn u user {  
  435.   info = ()
  436.   info = `` (':') {ypmatch $1 passwd >[2] /dev/null }
  437.  
  438.   if (~ $info ()) {
  439.     echo user $1 unknown >[1=2];
  440.     return 1;
  441.   } else {
  442.     echo $info(6)
  443.     if (~ $0 user) 
  444.       cd $info(6)
  445.   }
  446. }
  447.  
  448.  
  449. From stolaf.edu!quanstro Sun Apr  5 04:53:34 1992
  450. Date: Sun, 5 Apr 1992 04:53:08 -0500
  451. From: quanstro@stolaf.edu (Erik Quanstrom)
  452. To: byron@archone.tamu.edu
  453. Subject: man written in rc 
  454. Status: RO
  455.  
  456. I whipped this up because the NeXTs here insist on using MANPAGER
  457. instead of PAGER and otherwise being obnoxious . . . 
  458.  
  459. Anyway ... I hope you approve
  460.  
  461. #!/bin/rc
  462. #########################################################################
  463. # file:        man                            #
  464. #                                    #
  465. # object:    display man pages                    #
  466. #                                    #
  467. # bugs:        * slow                            #
  468. #        * does not know about fmt files                #
  469. #                                    #
  470. # Erik Quanstrom                            #
  471. # 11. Februar 1992                            #
  472. #########################################################################
  473. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:$PATH ; 
  474. TROFF = (nroff -hq -Tcrt);
  475. macros=an;
  476. sections=(cat1 cat2 cat3 cat4 cat5 cat6 cat7 cat8 catl man1 man2 man3 man4 \
  477.       man5 man6 man7 man8 manl)
  478. $nl='
  479. '
  480. fn sigint sighup sigquit sigalrm sigterm { rm -f $Bat; exit 2;}
  481.   
  482. fn usage {
  483.   echo usage: $0 [-] [-t] [-M path] [-T macros] [[section] title] ...>[1=2];
  484.   exit 1;
  485. }
  486.  
  487. n=();
  488. fn shiftn {
  489.   n=($n 1)
  490. }
  491.  
  492. ~ $PAGER () && test -t 1 && PAGER=more; #default pager
  493.      
  494. while (~ $1 -*)
  495.   { 
  496.     switch ($1)
  497.       {
  498.       case -
  499.     if (~ $PAGER troff)
  500.       echo bad combination of flags >[1=2] && usage;
  501.     PAGER=cat;
  502.       case -t
  503.     ~ TROFF () && TROFF = (troff -t);
  504.     ~ TCAT  () && PAGER=(lpr -t);
  505.       case -M
  506.     shift;
  507.     ~ $1 () && usage;
  508.     
  509.     MANPATH=$1;
  510.       case -T
  511.     shift;
  512.     ~ $1 () && usage;
  513.     macros=$1;
  514.       case -k
  515.     fflag=(); kflag=1;
  516.         shift;
  517.         break;
  518.       case -f
  519.     # locate related too filenames
  520.     kflag=(); fflag=1;
  521.         shift;
  522.         break;
  523.       case -*
  524.     echo bad flag '`'^$1^'''' >[1=2];
  525.     usage;
  526.       }
  527.     shift;
  528.   }
  529.  
  530. if (!~ $#* 1) {
  531.   ~ $1 [l1-8] && { sname=$1 ; sections=(cat man)^$1 ; shift }
  532.   #hack for sun-style man pages
  533.   ~ $1 [l1-8]? && { sname=$1 ; sections=(cat man)^`{echo $1| cut -c1} ; shift }
  534. }
  535.  
  536. if (~ 1 $fflag $kflag) {
  537.   dirlist=();
  538.   for (d in ``(:$nl) {echo $MANPATH})
  539.     test -s $d^/whatis && dirlist=($dirlist $d^/whatis);
  540.   
  541.   ~ $1 () && usage;
  542.   
  543.   if (~ $fflag 1) { 
  544.     while (!~ $1 ()) {
  545.       cmd=`{echo $1 | sed 's/^.*\///g'}
  546.       egrep -h '^'^$cmd' ' $dirlist;
  547.       shift;
  548.     }
  549.   } else {
  550.     while (!~ $1 ()) {
  551.       grep -h $1 $dirlist;
  552.       shift;
  553.     }
  554.   }
  555.  exit 0;
  556. }
  557.  
  558. s=0;     
  559. while (!~ $1 ()) {
  560.   for (dir in ``(:$nl) {echo $MANPATH}) {
  561.     filelist=($filelist `{echo $dir/^$sections^/$1^.* |\
  562.                 tr ' ' '\12' | grep -v '*'})
  563.  
  564.     # coment this out if you don't care about speed, but 
  565.     # would rather find all the pages.
  566.     ~ $filelist () || break;
  567.   }
  568.  
  569.   if (~ $filelist ()) {
  570.     if (~ $#sections 2) {
  571.       echo no entry for $1 in section '`'$sname'''' of the manual >[1=2];
  572.     } else {
  573.       echo no entry for '`'$1'''' found. >[1=2];
  574.     }
  575.     s=1;
  576.   } else {
  577.  
  578.     echo $filelist '(' $#filelist ')' >[1=2];
  579.  
  580.     for (file in $filelist) {
  581.       if (~ $file */cat[1-8l]/*) {
  582.     Cat = ($Cat $file);
  583.       } else {
  584.     # search for dups
  585.     dont=()
  586.     for (x in $Cat) {
  587.       if (~ `{echo $x |  sed 's/\/[mc]a[nt][1-8l]//'} \
  588.             `{echo $file |  sed 's/\/[mc]a[nt][1-8l]//'}) {
  589.         dont=1;
  590.         break;
  591.       }
  592.     }
  593.  
  594.     if (~ $dont ()) {
  595.       cd `{echo $file | sed 's/man[1-8].*//'}
  596.       echo -n Formatting ...
  597.       $TROFF -m^$macros $file > /tmp/man^$pid^$#n && \
  598.         Bat = ($Bat /tmp/man^$pid^$#n)
  599.  
  600.       shiftn;
  601.       echo ' 'done.
  602.     }
  603.       }
  604.     }
  605.   } 
  606.   shift;
  607. }
  608.  
  609. { !~ () $Cat || !~ () $Bat } && $PAGER $Cat $Bat;
  610.  
  611. rm -f $Bat;
  612. ~ $s () || exit $s;
  613.      
  614. exit 0;
  615.  
  616.  
  617.  
  618. From osf.org!rsalz Thu Apr 23 16:22:32 1992
  619. Date: Thu, 23 Apr 1992 16:22:07 -0500
  620. From: rsalz@osf.org
  621. To: byron@archone.tamu.edu
  622. Subject: One for your EXAMPLES file
  623. Status: RO
  624.  
  625. Use
  626.     trimhist [-#lines]
  627. trims your history file back; useful for folks with dis quota's :-)
  628. fn trimhist { p1=-100 {
  629.     cp $history $history^'~'
  630.     ~ $#* 1 && p1=$1
  631.     tail $p1 <$history^'~' >$history
  632.     rm $history^'~'
  633. } }
  634.  
  635. From Pa.dec.com!uucp Mon Apr 27 12:25:02 1992
  636. Date: Mon, 27 Apr 1992 12:15:18 -0500
  637. From: haahr@adobe.com
  638. To: Byron Rakitzis <byron@archone.tamu.edu>
  639. Subject: a neat little rc script
  640.  
  641. what you have to know to understand this:
  642.     $md for me is usually obj.$machine
  643.     my mkfiles build *.o, *.a, and the a.outs in $md
  644.     this is my acc script, which i use for compiling adobe routines
  645. ---
  646. #! /user/haahr/bin/next/rc
  647.  
  648. cc = cc
  649. proto = '-DPROTOTYPES=1'
  650.  
  651. switch ($md) {
  652. case noproto.$machine;    proto = '-DPROTOTYPES=0'
  653. case gprof.$machine;    cc = ($cc -pg)
  654. case prof.$machine;    cc = ($cc -p)
  655. case lcomp.$machine;    cc = lcomp
  656. }
  657. exec $cc $proto '-DPACKAGE_SPECS="package.h"' '-DISP=isp_mc68020' '-DOS=os_mach' $*
  658.  
  659. From rc-owner Tue May 12 14:54:10 1992
  660. Received: from postman.osf.org ([130.105.1.152]) by archone.tamu.edu with SMTP id <45337>; Tue, 12 May 1992 14:38:16 -0500
  661. Received: from earth.osf.org by postman.osf.org (5.64+/OSF 1.0)
  662.     id AA14480; Tue, 12 May 92 13:25:03 -0400
  663. Received: by earth.osf.org (5.64/4.7) id AA03499; Tue, 12 May 92 13:25:02 -0400
  664. Date: Tue, 12 May 1992 12:25:02 -0500
  665. From: rsalz@osf.org
  666. Message-Id: <9205121725.AA03499@earth.osf.org>
  667. To: rc@archone.tamu.edu
  668. Subject: Useful function
  669. Status: R
  670.  
  671. It looks like line noise, but it turns things like
  672.     /home/rsalz/foo/bar
  673. into
  674.     ~/foo/bar
  675.  
  676. Useful for when you put your current directory up in your icon title.
  677. By duplicating the $home section you can make things like
  678.     /project/dce/build/dce1.0.1/src/rpc
  679. become
  680.     $MYBT/src/rpc
  681.  
  682. ##  If a pathname starts with $home, turn $home into ~.  Uses all built-ins.
  683. fn tildepath { p1=() i=() {
  684.     p1=$1
  685.     switch ($p1) {
  686.     case $home $home/*
  687.     # Split arg into components
  688.     *=`` (/) { echo -n $p1 }
  689.     # Shift down by number of components in $home
  690.     for (i in `` (/) { echo -n $home } ) shift
  691.     # Glue back together
  692.     p1='~'
  693.     for (i) p1=$p1 ^ '/' ^ $i
  694.     echo $p1
  695.     case *
  696.     echo $p1
  697.     }
  698.     return 0
  699. } }
  700.  
  701. From osf.org!rsalz Tue May 12 15:47:12 1992
  702. Received: from postman.osf.org ([130.105.1.152]) by archone.tamu.edu with SMTP id <45316>; Tue, 12 May 1992 15:47:06 -0500
  703. Received: from earth.osf.org by postman.osf.org (5.64+/OSF 1.0)
  704.     id AA21070; Tue, 12 May 92 16:46:58 -0400
  705. Received: by earth.osf.org (5.64/4.7) id AA09396; Tue, 12 May 92 16:46:56 -0400
  706. Date: Tue, 12 May 1992 15:46:56 -0500
  707. From: rsalz@osf.org
  708. Message-Id: <9205122046.AA09396@earth.osf.org>
  709. To: byron@archone.tamu.edu
  710. Subject: Re: Useful function
  711. Status: R
  712.  
  713. >wow. thanks, i'll add it to EXAMPLES.
  714. Glad you like.  Getting something added to EXAMPLES has been a goal of mine...
  715.  
  716. I've been thinking, a bit, about a more general way of doing it.  I want
  717. a "prefix-sub" function, like this
  718.     prefix $some_path var1 var2 var3 var4 var5
  719. That would take some_path and replace any leading $var1 (etc) values
  720. with the variable name.  Return on the first match.
  721.  
  722. Hmm -- come to think of it, that's very easy to do:
  723.  
  724. # Use pathprefix filename var1 var2 var3
  725. # returns filename, with leading prefixes (in $var1...) turned into the
  726. # string $var1...
  727. fn pathprefix { p1=() i=() j=() {
  728.     p1=$1 ; shift
  729.     for (i) {
  730.     ~ $p1 $$i $$i^/* && {
  731.         *=`` (/) { echo -n $p1 }
  732.         for (j in `` (/) { echo -n $$i } ) shift
  733.         p1='$'^$i
  734.         for (j) p1=$p1 ^ '/' ^ $j
  735.         echo $p1
  736.         return 0
  737.     }
  738.     }
  739.     echo $p1
  740.     return 0
  741. } }
  742.  
  743. home=/user/users/rsalz
  744. z=/usr/users
  745. pathprefix /usr/users/rsalz home usr    # --> $home
  746. pathprefix /usr/users/rsalz z        # --> $z/rsalz
  747. pathprefix /usr/users/rsalz/foo z home    # --> $z/rsalz/foo
  748. pathprefix /usr/users/rsalz/foo home    # --> $home/foo
  749.  
  750.