From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 929 invoked from network); 27 Jul 1998 12:27:14 -0000 Received: from math.gatech.edu (list@130.207.146.50) by ns1.primenet.com.au with SMTP; 27 Jul 1998 12:27:14 -0000 Received: (from list@localhost) by math.gatech.edu (8.9.1/8.9.1) id IAA25296; Mon, 27 Jul 1998 08:18:26 -0400 (EDT) Resent-Date: Mon, 27 Jul 1998 08:18:26 -0400 (EDT) Message-Id: <199807271213.OAA02354@hydra.ifh.de> X-Authentication-Warning: hydra.ifh.de: pws owned process doing -bs To: zsh-workers@math.gatech.edu (Zsh hackers list) Cc: Mark Hessling Subject: Re: Extending zsh capabilities In-reply-to: "Bruce Stephens"'s message of "27 Jul 1998 12:18:16 MST." Date: Mon, 27 Jul 1998 14:13:33 +0200 From: Peter Stephenson Resent-Message-ID: <"E-2Ps2.0.8B6.H07lr"@math> Resent-From: zsh-workers@math.gatech.edu X-Mailing-List: archive/latest/4254 X-Loop: zsh-workers@math.gatech.edu Precedence: list Resent-Sender: zsh-workers-request@math.gatech.edu Bruce Stephens wrote: > > Executing a Rexx program within a current process is straighforward, > > I need to call the API function RexxStart() with the filename as one > > of the arguments. The interface is simple; its knowing where to > > hook it into zsh that is my biggest problem. > > How about, as a first cut, writing a builtin "rexx" which would > execute a Rexx script? That could be done as a module (like stat). I would have thought that was a good place to start; adding additional capabilities in modules is very much preferred from the development point of view, and makes it much more likely the code would be acceptable in the main distribution. This should be very easy: just take e.g. stat.c, rename everything, and prune it right down so that you just have one function bound to the builtin rexx which calls RexxStart on its filename. What you really then want is for a shell function beginning /* to run Rexx. You can do this by sleight of hand. % fpath=(. $fpath) # just for convenience in this example % alias '/*'='rexx_load $0' % cat rexx_load local file=$1 dir for dir in $fpath; do [[ -f $dir/$file ]] && file=$dir/$file && break done print "Executing $file using Rexx" # rexx $file # Now force the calling function to return immediately. trap 'return 0' EXIT % cat rtest /* This is to test rexx_load */ Rexx commands here % autoload rexx_load rtest % rtest Executing ./rtest using Rexx This works because zsh allows you to alias '/*' which presumably isn't going to appear as a command anywhere else. The other tricky bit is the trap in rexx_load which forces its parent (in this case the function rtest running under zsh, which you don't want to continue) to return immediately, since the EXIT trap is executed in the surrounding context. You could extend rexx_load so that it redefines rtest to run rexx on a series of commands (if e.g. rexx has a -e switch like perl), eliminating the intermediate step for subsequent calls. -- Peter Stephenson Tel: +39 50 844536 WWW: http://www.ifh.de/~pws/ Gruppo Teorico, Dipartimento di Fisica Piazza Torricelli 2, 56100 Pisa, Italy