Whoops! The copy of #!REBOL.BAT I included had 2 bugs and one slower part, all fixed in the version I've included with this message. My bad! At 09:32 AM 2/15/00 -0600, I wrote: >REBOL starts in the REBOL home directory, not the current >directory. If your script is in a different directory, you >have to specify the whole path to the script on the command >line to REBOL. Apparently this is different with /View. #!REBOL.BAT still works with /View, but I should take /View into account when it is released. Brian Hawley
@ECHO OFF shift rem *** The folowing call must be on ONE line *** C:\Lang\Rebol\REBOL.exe --do "application-dirs: parse/all {%PATH%} {;}" --script C:\Utilities\bin\#!REBOL.BAT %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 goto end-of-REBOL-launcher REBOL [ Title: "#!REBOL Script Launcher" Date: 15-Feb-2000 File: %#!REBOL.BAT Author: "Brian Hawley" Email: [EMAIL PROTECTED] Rights: "Copyright (C) Brian Hawley 2000, rights under GPL" Purpose: "Make it easy to run a REBOL script as a DOS batch file." Usage: trim/auto { #!REBOL.BAT helps you to express a REBOL script as a DOS batch file. The first argument is the name of the calling batch file (expressed best as {%0} to handle spaces, etc.). A REBOL batch file that uses #!REBOL.BAT looks something like this: @echo off #!REBOL {%0} -q %1 %2 %3 %4 %5 %6 %7 %8 %9 REBOL [ Title: "Hello World" ] print "Hello World!" print system/script/args if confirm "Do you want to quit? (Y or N) " [quit] } Comments: trim/auto { In order to work, you must name this file #!REBOL.BAT so that it will be treated as a batch file. The .BAT is essential, but the #! is only there as part of the #!language script calling convention from Unix, useful on other OS's too. #!REBOL can now handle batch files that aren't on the path or whose name can change by passing {%0} as the batch name. You must put #!REBOL.BAT somewhere on the OS path and change the call to REBOL.exe above to reflect the location of the files REBOL.exe and #!REBOL.BAT. This script incorporates the function to-rebol-file which is seperately licensed under the LGPL. } Category: [file script] ] if not value? 'to-rebol-file [ ; The wierd bit with init here is to work around a GC bug :( use [init] [ init: make object! [ alpha: charset [#"A" - #"Z" #"a" - #"z"] dos-char: complement charset [ #"^(0)" - #"^(1f)" {\/:*?<>|"} ] amiga-char: complement charset ":/" ] to-rebol-file: func [ "Changes a valid platform filename into a rebol file." file-name [string!] "A platform-format filename." /default "Return this file instead of none when not valid." default-file [file!] /dir "Add a trailing /, if needed, to indicate a directory." /platform "Follow the filename conventions of a given platform." which [integer!] "A REBOL major platform number" /local DOS Amiga MacOS Unix rebol-file tmp ] head insert bind/copy [ ; Initialize the transformation rules DOS: [ rebol-file: make file! length? file-name if not parse/all file-name [ [ ; Prefix, if any ; Drive letter copy tmp alpha ":\" ( insert insert insert rebol-file #"/" tmp #"/" ) | copy tmp alpha ":" ( if (to-char tmp) <> (second what-dir) [ insert insert insert rebol-file #"/" tmp #"/" ] ) | ; UNC path (no single-letter computer names!) "\\" (insert rebol-file #"/") | ; Root dir of current drive "\" (insert rebol-file "//") | none ] [ ; File path, if any copy tmp some dos-char (insert tail rebol-file tmp) any ["\" copy tmp some dos-char ( insert insert tail rebol-file #"/" tmp ) ] ["\" (insert tail rebol-file #"/") | none] | none ] ] [ ; Parse failed rebol-file: none ] ] Amiga: [ rebol-file: make file! length? file-name if not parse/all file-name [ ; Device [copy tmp 0 30 amiga-char ":" ( insert insert insert rebol-file #"/" any [tmp ""] #"/" ) | none] ; Directory path copy tmp any "/" ( if tmp [insert/dup rebol-file "../" length? tmp] ) any [ copy tmp 1 30 amiga-char "/" ( insert insert tail rebol-file tmp #"/" ) copy tmp any "/" ( if tmp [ insert/dup tail rebol-file "../" length? tmp ] ) ] ; Filename copy tmp 0 30 amiga-char ( if tmp [insert tail rebol-file tmp] ) ] [ ; Parse failed rebol-file: none ] ] MacOS: [ ; REBOL doesn't support "/" in MacOS file names if not find file-name "/" [ rebol-file: parse/all file-name ":" either (first file-name) = #":" [ change rebol-file "./" ] [ if (length? rebol-file) > 1 [insert rebol-file "/"] ] rebol-file: to-file rebol-file ] ] Unix: [ rebol-file: to-file file-name ] ; Perform the transformation either any [(none? file-name) (file-name = "")] [ rebol-file: none ] [ rebol-file: none if not platform [which: fourth system/version] switch/default which reduce [ 1 Amiga 2 MacOS 3 DOS 4 Unix 5 Unix 6 Unix 7 Unix 8 Unix 9 Unix 10 Unix 11 Unix 12 Unix 13 DOS 15 DOS 16 DOS 17 Unix 19 Unix 20 Unix 22 Unix 23 Unix 24 Unix 26 Unix ; I don't know the syntax for the following: ; 14 PalmOS 18 OS400 21 VMS 25 Netware ] [ rebol-file: to-file parse/all file-name ":\/" ] ] ; Apply dir or default as appropriate either rebol-file [ if all [(dir) ((last rebol-file) <> #"/")] [ insert tail rebol-file #"/" ] ] [ if file? default-file [rebol-file: copy default-file] ] ; Return rebol-file head rebol-file ] in init 'self init ] ; end use ] ; end if ; Change the application dirs to rebol format use [tmp] [ while [not tail? application-dirs] [ tmp: to-rebol-file/dir first application-dirs application-dirs: insert remove application-dirs any [tmp []] ] ] ; Prepend the path that #!REBOL is called from application-dirs: head insert head application-dirs system/script/parent/path ; Find the script on the path and do it if found either (none? system/script/args) [ print [newline system/script/header/usage] if confirm "Do you want to quit? (Y or N) " [quit] ] [ ; Find and run the script do/args use [arg args dir s has-ext] [ ; Initialize the locals (dir: arg: s: none) (has-ext: false) either error? s: try [ change-dir first application-dirs ; Retrieve the first arg and skip past it parse/all system/script/args [any " " ["{" copy arg to "}" skip | copy arg [to " " | to end]] any " " args: any skip (system/script/args: args) ] parse/all (to-rebol-file arg) [ [copy dir some [thru "/"] (dir: to-file dir) | none] arg: [some [thru "."] (has-ext: true) | none] thru end ] ; print [mold dir mold arg mold join dir arg] either (tail? arg) [s: none] [ foreach dir ( either (dir) [reduce [dir]] [application-dirs] ) [ dir: change-dir dir either ( either has-ext [exists? s: join dir arg] [ any [ (exists? s: join dir [arg ".bat"]) (exists? s: join dir [arg ".cmd"]) (exists? s: join dir [arg ".r"]) ] ] ) [break] [s: none] ] ] script? s ] [none] [s] ] system/script/args ; Reset the args system/script/args: head system/script/args ] ; if confirm "Do you want to quit? (Y or N) " [quit] end-of-REBOL-launcher: none :end-of-REBOL-launcher