RexxExtra --------- Documentation on the rexxextra.library (Version 1.2) Date: March 18, 1990 Introduction ------------ rexxextra.library is an ARexx external function library. It's purpose is to extend the string manipulation and mathematical capabilities of ARexx by defining new functions. This library is intended for users of ARexx, the Amiga implementation of the high level language by William S. Hawes, who wish to expand the set of functions available, just as the libraries supplied with ARexx (rexxsupport, rexxarplib, and rexxmathlib.library) add new functions. Archive Contents ---------------- The following files should be contained in this archive file. File Size Description ----------------- ----- ----------- rexxextra.library 7060 The ARexx library. Copy to libs: RexxExtra.doc 16226 This file. This size may vary some. Test.rexx 3946 Exercises and verifies the library functions rexx/ directory 37960 Example programs (approx.) Please distribute the library archive only in it's original form, without changes or additions. If possible, when uploading to a BBS, name the archive RXXTRA12.LZH so we may all know which version it is. Although WShell (also by Mr. Hawes), an Amiga command shell, is not needed to use RexxExtra, all example programs have only been run under WShell, so these may have to be modified to run under your own shell. Probably by adding "address command" in front of any CLI callable command strings. Installation ------------ First, copy the included rexxextra.library file to your libs: directory. The size is only about 7K. copy rexxextra.library libs: Adding the library to ARexx --------------------------- The functions are available to any ARexx program once the command: call addlib 'rexxextra.library',-20,-30,0 has been issued in any Arexx program. This only need be done once per session (I do all mine at bootup, then I don't have to worry about it). The included ARexx programs contains this step. Description of library functions -------------------------------- Basically, you've now got some new functions available you can call from any ARexx program. More are being added, so this list will grow in the future. o Replace() - replace one string with another throughout a third. o Sortwords() - sorts string of words into alphabetical order. o Cparse() - "parse" a command line. o Fparse() - "parse" a file name. You also have some example ARexx programs using and testing these functions. Following is a detailed description of each of the functions. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Replace - replace one string with another in a string ------- Syntax ====== string4 = Replace(string1,string2,string3,['Case']) string1 is the string to replace with. string2 is the string to look for. string3 is string to perform replacment on. 'Case' is an optional argument and, if supplied, case will be ignored when searching for string2 in string3. string4 is returned value when all string2's have been replaced by string1's in string3. Description =========== This function was the first one I tried the library out with, and its such a simple and useful function, I decided to leave it in. Restrictions ============ The result string cannot be longer than 10 times string3. If anybody knows of a good way to compute the length needed for the result string before doing the replace, let me know. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Sortwords - sort a string of words --------- Syntax ====== string2 = SortWords(string1) string1 is list of words to sort string2 is sorted string1 Description =========== This function will returns its argument, which is a string of words, into ascending alphabetical order. Currently, the space is the only delimiter for words. As with ARexx itself, string1 and the returned string are limited to about 65,500 characters. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Cparse - parse a command line ------ Syntax ====== string = Cparse(commandline,template,stem) commandline is as recieved from the user, ie, "parse arg commandline". template is standard AmigaDOS/ARP command template (with extensions), ie, "Q=QUICK/S,BUF=BUFFER/K,FROM,TO/A". Note: Any single keyword should not be more than 30 characters. stem is the name of the stem variable to use for the compound variables to create. You might want to keep this relatively short, especially if you're getting many arguments from the command line. You do not need to include the ending period. Description =========== This function allows you to quickly and easily determine the input to your ARexx program, and "parse" the command line into a whole set of user-defined variables. This gives your ARexx programs the power of AmigaDOS/ARP command parsing with one function call. You supply to the function in a standard AmigaDOS/ARP template format (with certain extensions) what to expect on the command line. The function scans the command line, determining what flags, arguments, qualifiers and such are present, and returns a "program string" (a string suitable for INTERPRETing) containing the commands neccessary to assign values from the command line to variables in the program. Got that? Well, fortunately using Cparse is simpler than explaining it. For instance, we want to write an ARexx program that accepts the same arguments as the LIST command. Let's call it TREE. The TREE command has a template of: DIR,P=PAT/K,KEYS/S,DIRS/S,FILES/S,SORT/S,SINCE/K,UPTO/K, DATES/S,NODATES/S,SUB/K,BLOCK=BLOCKS/S,NOHEAD/S,LFORMAT/K This function will fill in args.DIR, args.P, args.KEYS, args.DIRS, etc. from the supplied command line. Arguments, qualifiers, and flags may appear on the command line in any order, just as with AmigaDOS/ARP. Command lines are verified for missing arguments, and a variable is assigned a severity level (0...2) so you can determine the the error, if any. You must format the template in this order: flags (/S), qualifiers (/K), arguments (/A & /R) and optional arguments (in the order to expect them from the user), then lists (/... & /L). For example, the TREE command would pass a template of: KEYS/S,DIRS/S,FILES/S,SORT/S,DATES/S,NODATES/S,BLOCK=BLOCKS/S, NOHEAD/S,SINCE/K,UPTO/K,P=PAT/K,SUB/K,LFORMAT/K,DIR You must also decide on a stem variable name before calling this routine. You may assign values to the compound variables for default responses (except switches); these will not be changed if that option is missing from the command line. Switches will always be in the returned string, and will always be a boolean value. Synonyms for keywords (those following an "=" in the template) are supported, but the assigned variable will always be the keyword on the LEFT of the equals sign. If, after resolving all template tokens, there is still some commandline left, a variable "stem.REMAIN" is added equaling what's left. Consequently, you may find it difficult to use "REMAIN" as a keyword in your template. A variable, "stem.ERRCODE" is added indicating if any errors were encountered while parsing the commandline. If errors are encountered, another variable "stem.ERRTEXT" is also added to explain the error. Consequently, you may find it difficult to use "ERRCODE" and "ERRTEXT" as keywords in your template. Either single or double quotes are recognized for delimiting an argument containing spaces. However, the "double quoting" convention (two quotes in a row to denote one in the string) is not accepted. In summary, token variable description ----- -------- ----------- FLAG/S stem.FLAG 1 if present, 0 if not. QUALIFIER/K stem.QUALIFIER value of following string or not changed if not present. ARGUMENT/A stem.ARGUMENT value of following string if keyword present, first string found after removing flags and qualifiers if not. ARGUMENT/R same as /A but keyword is required ARGUMENT stem.ARGUMENT value of first string found after removing flags and qualifiers LIST/... stem.LIST.0 count of items in list. 0 if none. stem.LIST.1 list items thru stem.LIST.n LIST/L same as /... but list is required. stem.REMAIN remainder of command line after all tokens have been parsed out stem.ERRCODE 0 if no errors parsing commandline 1 if remainder but no other problems 2 if required argument missing or qualifier keyword specified w/o value stem.ERRTEXT explanation of error (currently if > 1) Note: The AmigaDOS tempate structure of multiple commas (",,,,,,,") is not supported. Using Cparse ============ There are probably many ways Cparse could be used, but here's what I do. This adds complete interactive command line parsing to any ARexx program. In each ARexx program I want to add command parsing capabilities to, I start with or add this "template" and modify to suit. This template contains statements to do the preliminary work for Cparse, such as handling "?" on the command line, presenting a template to the user, showing additional help upon entry of a second "?", calling the Cparse function, and exiting if an invalid command line is found. The user may request additional help by entering a second "?" at the display of the template. The program will display help information contained in the source code of the program. Place this "self-documenting" help using a comment in the ARexx program. The beginning of the comment must be the third source line, and continues until a close comment is found. --------------------------------------------------------------- /* typical.rexx */ /* Typical ARexx program using Command Line Parsing and help system USAGE: TYPICAL [FROM] [TO ] [QUIET] */ dtemplate = 'FROM/A,TO/K,QUIET/S' /* template displayed to the user */ template = 'QUIET/S,FROM/A,TO/K' /* template supplied to Cparse */ args.='' /* stem variable to use */ parse arg g_c do while g_c='?' options prompt dtemplate parse pull g_c if g_c='?' then do g_s=sourceline(3) if pos('/*',g_s)=0 then break; if pos('*/',g_s)>0 then break say g_s=sourceline(4) do i=5 while pos('*/',g_s)=0; say g_s; g_s=sourceline(i); end say end end interpret Cparse(g_c,template,'args') if args.ERRCODE > 1 then do; say args.ERRTEXT; exit 5; end /* This is the body of the program, that would actually do something. From here on in the program, ARGS.FROM, ARGS.TO, and ARGS.QUIET will contain the values from the command line. */ exit 0 --------------------------------------------------------------- Or, of course, you can figure out your own way to use it. Example programs ================ I've included many example programs illustrating the above in this release. The programs are also useful in their own right. Limits ====== Variable names (keywords in the template) are limited to 30 characters. Stem variable names should be reasonably short, perhaps less than 8 characters. The returned string is limited to 1023 characters. If this isn't long enough, I can change it. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Fparse - parse a file name ------ Syntax ====== string = Fparse(start_dir,filespec,[defaultspec], [relatedspec],[item]) start_dir is beginning directory. If I knew more about all this stuff, this argument wouldn't be needed. We could find out the current directory and use that. I accually tried that first but it didn't seem to work (crashed). For now, just put "pragma('D')" here when calling this routine. filespec is the name of the file you want. It can include a volume name and/or directories, including leading /'s to move up from the start_dir. defaultspec and relatedspec are optional parameters containing all or parts of a filespec, and is supplied in the same form as filespec. Any parts of the file name missing from filespec will be supplied from defaultspec, then relatedspec. item is one of: 'Volume' Volume: 'Directory' dir/ 'Name' filename 'Type' .type 'File' filename.type 'c' (any character) Volume:dir/filename.type (null or missing Volume:[dir/]filename[.type] Description =========== Given a partial filename (ie, "file.type" or "/over1/file"), this function will return a string containing the complete filename, or any or all parts of the filename. Defaults may be supplied (for any of the categories volume, directory, name, or type) in two optional arguments. Wildcard characters are left as found. No check is made for the existence of any device or directory. If you want a spec ending in a directory, be sure and include a trailing '/'. The start_dir parameter does not need one, as it is assumed to be a directory, and the others aren't. Examples ======== say fparse(pragma('D'),'name','.type') ==> Work:files/name.type say fparse(pragma('D'),'/name','.type') ==> Work:name.type =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Conditions for use and distribution ----------------------------------- RexxExtra is Copyright (c) 1990 by Dale W. Thompson RexxExtra is a copyrighted program that is provided "as is". There is no warranty, either expressed or implied, as to the quality or usefullness of the program. The user of the program accepts all risks associated with it's use. RexxExtra is freely distributable provided: 1. The files are included in their original form without additions, deletions, or modifications of any kind. 2. No charge is made for RexxExtra (other than a reasonable copy charge of $6.00 or less). 3. RexxExtra is not packaged as a part of a commercial product. 4. RexxExtra may not be uploaded to any electronic service that claims a copyright to it's files and programs. Requests for additional functions --------------------------------- The author is always looking for candidate functions to add to the library. If you have an idea for a function or, better yet, if you have C source code for a function you would like to see available from ARexx, send it to me and I'll try to include it in the next release. Author ------ This software was developed by Dale W. Thompson from an example library supplied on the ARexx disk (version 1.10), by William S. Hawes. All changes and additions by me. This library was compiled with A68K, a public domain assembler, and Lattice C V4.0. Any comments, questions, suggestions, flames, improvements, bug reports (what bug? that's a feature.), etc., can be directed to the following address: Dale W. Thompson 542 N. 95th Circle Mesa, AZ 85207 or you can leave me a message on one of the following boards: AmAzing Connection - Phoenix, AZ - (602) 843-6574 Database 2000 - Phoenix, AZ - (602) 242-6734