Benefiting from VESOFT's MPEX on MPE/iX by Michael D. Hensley, VESOFT Dear HP3000 User: The following (unsolicited, unpaid) user's testimonial recently appeared in an article on migrating to SPECTRUM: If you don't own MPEX now, buy it. ...its basic ability to do almost anything with any set of files will be needed during the conversion. Think that's too much of a brag? Bet me! What do you do when you need to find every instance of a global variable among seven gazillion source files? This is something you are likely to do once you find an intrinsic that now requires a 32 bit variable when it used to require a 16 bit one. With MPEX it's as simple as: PRINT @.SOURCE.@;SEARCH="variable" -- Guy Smith, "Migration Effort Lands Safely With New 960", The HP Chronicle, January 1990 (Thanks, Guy, for the kind words!) Of course, Guy did not have enough space to extol all of the potential benefits of using MPEX on MPE/iX, and while I can't do that either (users are constantly coming up with new uses for MPEX that we at VESOFT never even dreamed of), I would like to share some of the major ones with you. This may seem lengthy, but a reasonable presentation could not be made any shorter and still cover the most important topics (I tried very hard). Of our 6000+ MPEX customers worldwide, more than 4000 have purchased MPEX MPE/iX upgrades, thus confirming the value of MPEX on MPE/iX. These customers include major software vendors, Hewlett-Packard itself, turnkey sites, single-CPUs, multi-CPU LANs, etc.; large sites, small sites, and everybody in between. And remember, virtually all of the MPEX features described below are available on CLASSIC (MPE V) systems, too! In addition, MPEX running on CLASSIC systems implements virtually all of the MPE/iX User Interface features. In the words of Guy Smith, [MPEX] walks, talks and waddles just like the XL Command Interpreter (CI). This makes it a ducky training tool for your shop. Please read the following pages carefully -- it should help you! If you have any questions, thoughts, ideas, or suggestions, or you would like a free demo tape of our products (MPEX, SECURITY, and VEAUDIT), please call me at 213-282-0420. Thank you, INTRODUCTION MPE/iX is the version of the MPE operating system created for the new HP3000 series 9xx (RISC, HPPA, SPECTRUM, or whatever we're supposed to call them this week) computers. MPE/iX, with all of its advantages (extended address ranges, performance, etc.) still does not solve the deficiencies of the MPE command interpreter that are corrected by VESOFT's MPEX. MPEX is a System Control tool for all HP3000s, both Classic and Spectrum -- an extremely useful utility that has been changing the way HP3000 users do system management, program development, and console operations tasks for over 10 years. It saves valuable time for managers and programmers (this means YOUR time), improves the reliability of their work, helps system performance, and increases file system security, all through the use of simple enhanced MPE commands. This allows busy managers and programmers to concentrate on their own business applications, rather than complex MPE systems programming tasks. While the "X" stands for "eXtended" in both "MPE/XL" and "MPEX", there are a lot of ways to extend an operating system. Hewlett-Packard did it by improving the hardware, speeding up the command execution, and expanding the addressing range. VESOFT did it by improving the user interface (the Command Interpreter), thus increasing both user efficiency and accuracy. MPE/iX can execute your commands much faster than MPE/V; MPEX can improve the usefulness of the commands you execute! MPEX provides extensions to MPE/iX in several areas: * It lets you EXECUTE MPE COMMANDS (like :FCOPY, :COBOL, :RENAME, :PURGE, etc.) on FILESETS. * It lets you SELECT FILES by attributes like disc space used, last access date, file creator, etc. * It implements entirely NEW COMMANDS like %ALTFILE that can do things no existing MPE command can do. * With its MPEXHOOK feature, MPEX adds a REDO facility that lets you redo up to the last 1000 (or more) commands that you've typed in EDITOR, QEDIT, TDP -- virtually ANY program! MPEXHOOK also allows you to SAVE files across account boundaries (if you have SM capability). Also, you may execute any MPEX commands directly from any HOOKed utility. * MPEX GREATLY ENHANCES THE MPE/iX USER INTERFACE by providing new functions, new control structures, and an enhanced :REDO facility. EXECUTE MPE COMMANDS ON FILESETS MPEX allows you to EXECUTE MPE COMMANDS (like :FCOPY, :COBOL, :RENAME, :PURGE, etc.) on FILESETS (as opposed to the single-file MPE/iX commands). Although an MPE/iX command file could be constructed to process a simplified fileset, a great deal of time and effort would be required. Even on the old, MPE V (CLASSIC) systems, you could have written something similar. However, whether on the CLASSIC or the SPECTRUM, implementation of such a command file is much more complex than it may at first appear, requiring a great deal of time and effort (which could be much more profitably spent on your company's business -- which, after all, is what you're being paid for, isn't it?). This probably explains why the INTEREX Contributed Library itself has been a customer of MPEX for many years. MPEX commands allow you to do things like: %COBOL GL@S.SOURCE,GL@P.PUB which means compile (via COBOL) each file in the SOURCE group that starts with "GL" and ends with "S", putting the compiled program in the PUB group, and replacing the "S" with "P". This is especially useful when you want to re-compile all of your programs using the new, Native Mode compilers (thus gaining the performance benefits you purchased your MPE/iX computer for in the first place)! The increased power of the new RISC machines increases the need for efficient, fileset-handling, commands. MPEX also allows "[fileset+fileset...][-fileset-fileset...]". This permits you to say %PURGE K#######.@.@ + LOG####.PUB.SYS or %COPY @.DATA+@.SOURCE-MYDB@.DATA-GL@.SOURCE, =.=.NEWDEV Indirect files ("^indirectfile") allow you to use a file containing a list of filenames in all commands (not just :STORE). In addition to fileset handling for existing MPE commands, MPEX provides a simple mechanism ("%REPEAT...FORFILES") to efficiently implement full MPEX fileset-handling in your own command files. FURTHER FILE SELECTION Probably the most useful aspect of MPEX filesets is the ability to select files based on file attributes instead of (as in MPE/iX's LISTF command) just by the filename. MPEX provides over 100 fileset attribute variables and functions that may be used in selecting files. Some of the things you can not select files by without MPEX are: * file size (# of sectors used, # of sectors on LDEV 1, ...); * LAST ACCESS DATE/TIME, LAST RESTORE DATE/TIME, and CREATION TIME; * IMAGE database attributes (like DBSETCAPACITY, DBSETFULLNESS, ...); * program file attributes (like program capabilities); * file security attributes (ISRELEASED, ACCESSIBLE, ...); * file contents (MPEX can LISTF all files containing a given string or strings); * combinations (AND, OR, expressions, etc.) of attributes * and many, many more. Some practical examples: %LISTF @.@.@(ACCDATE"PRIV"),3 Finds all files (except IMAGE databases, CODE="PRIV") that haven't been accessed in the last 6 months (you could then save a lot of disc space by %MPEXSTOREing and %PURGEing them). %ALTFILE @.DATA(ONDEVICE(1) and CODE="PRIV");DEV=2 Moves all IMAGE datasets from the LDEV 1 (the system disc) to LDEV 2 for better disc balancing. (Note: "%ALTFILE" is an MPEX command, discussed in "NEW COMMANDS", below). %COBOL @.PRODSRC(MODDATETIME>VEFINFO(FILE+".PUB").MODDATETIME), =.PUB This recompiles all of the sources that have been modified but not recompiled into PUB. %LISTF @.@.AP(DBSETFULLNESS>.70),DB Shows database information (dataset name, type, capacity, etc.) for all datasets in the AP account that are MORE THAN 70% FULL. NEW COMMANDS MPEX implements several entirely NEW COMMANDS that can do things no existing MPE command can do. For example, the "%ALTFILE" command can change many of a file's attributes. It enables you to: * Save disc space (XLTRIM) by eliminating the wasted space that often occurs in MPE/iX disc files. * Better manage the disc space you have by letting you move files from drive to drive (DEVICE); * Transfer ownership of files from one user to another (CREATOR); * Change the capabilities of improperly :LINKed (or :PREPed) program files without having to re-:LINK them (and probably re-compile them), preventing run-time capability errors (CAP); * Alter the file codes and lockwords of files or filesets (CODE, LOCKWORD). On an MPE/iX system, the single command %ALTFILE @.@.@;XLTRIM;KEEPAMDATES can save you TENS OF THOUSANDS (or MORE!) of sectors of disc space, without changing any file's flimit or blocking factor (please see the MPEX Reference Manual for details). On our 925 LX, which only had 2 404-Mb disc drives, we saved 400,000 sectors (100Mb) using XLTRIM! Another new command, "%EDITCHG", is used to change all occurrences of a string in a set of files. For example, %EDITCHG @.source,"PART-NUM","PART-NO" changes all occurrences of "PART-NUM" in all files in the SOURCE group to "PART-NO"; and, it will only /KEEP those files which were actually changed. The "%EDIT" command will execute ANY commands of EDITOR on a fileset. %EDIT @.SOURCE(CODE="EDTCT"), SET VARIABLE converts all EDITOR COBOL-format files in the SOURCE group to be variable length files, saving 30-50% of the disc space while still leaving them editable, compilable, etc. IMPROVING EXISTING SUBSYSTEMS AND UTILITIES (MPEXHOOK) MPEXHOOK adds features to enhance existing programs and utilities, like EDITOR, QEDIT, POWERHOUSE, etc. A multi-line REDO facility (like in MPE/iX's command interpreter, but with our enhanced VEMODIFY available, too) is part of all HOOKed programs. This allows you to REDO any of the last 1000 (or more) commands you've entered into the program. REDO (and DO, which means REDO without changes) is not just for correcting typos. It can also save you a great deal of time and effort when you need to execute a long command (or a group of commands) repeatedly, providing a sort of "instant function key"! Additionally, it keeps a complete log of all the commands you've entered, which can be saved into a permanent disc file. This can be very useful in retracing your steps later, or seeing where you left off before lunch! :RUN EDITOR.PUB.VESOFT; LIB=P /TEXT MYSOURCE << make changes to your program >> /KEEP MYSOURCE /%COBOL MYSOURCE,MYOBJ /%LINK FROM=MYOBJ,LIBOBJ,FILEOBJ; TO=MYPROG; XL=MYXL /%RUN MYPROG << find errors in program, make corrections >> /,, << ",," means LISTREDO >> 133) /KEEP MYSOURCE 134) /%COBOL MYSOURCE,MYOBJ 135) /%LINK FROM=MYOBJ,LIBOBJ,FILEOBJ; TO=MYPROG; XL=MYXL 136) /%RUN MYPROG /,.133/136 << re-execute the KEEP through the %RUN >> ... All of the features of MPEX's %LISTREDO, %REDO, and %DO are available in all HOOKed programs, including: * saving your redo-stack (the list of all commands you've entered since running the program) into a permanent disc file so that even if you :BYE off and sign on again tomorrow, all the saved commands will be available to you; * using the abbreviations (",," means LISTREDO, "," means REDO, and ",." means DO); * advanced editing features in REDO, including VEMODIFY, VESOFT's powerful "visual modify" line editing facility; * REDOing the last command that started with, or contains, a given string (i.e. %DO RUN to re-execute the last %RUN command entered). One of the nicest features of HOOKed programs is their ability to build files in other accounts (assuming, of course, that you have SM capability). For instance, if you're signed on as MANAGER.SYS and run EDITOR.PUB.VESOFT, you'll be able to say /KEEP MYFILE.DATA.AP thus saving your work in another account. No need to sign on into the AP account -- no need even to /KEEP the file as some temporary file and then use MPEX's %COPY command to copy the file into another account. The same can be done with other HOOKed programs (FCOPY, etc.). HOOKed programs can be suspended, re-activating the father process without terminating the HOOKed program itself. SUSPENDing and REACTIVATEing is much more efficient than re-RUNning; this saves your time, and system resources. Finally, MPEXHOOK lets you execute MPEX COMMANDS from within virtually any program, such as EDITOR, QUERY, TDP, etc. ENHANCEMENTS TO THE NEW MPE/iX COMMAND INTERPRETER In addition to giving users of CLASSIC (pre-XL) HP3000s the full benefits of the new MPE/iX Command Interpreter, MPEX provides many important improvements to existing MPE/iX commands and functions. One of the most useful enhancements to MPE/iX is the ";SEARCH=" option added to the PRINT command. This allows you to search an entire fileset for a string! Some examples: %PRINT AP@.SOURCE;SEARCH="CUSTNUM";NUM will show you all of the lines (with line numbers, as per ;NUM) that contain "CUSTNUM" in all of the files in AP@.SOURCE. Even better, you can also say: %PRINT @.SOURCE;SEARCH="CUSTNUM" OR "CUSTNO" %PRINT @.JOB;SEARCH="JOB" and "MANAGER.SYS" %PRINT @.DOC;SEARCH=CASELESS "INVOICE" And finally, perhaps the most powerful feature of PRINT;SEARCH= is: %PRINT @.DEV;SEARCH="CUSTNUM";PREV="PROCEDURE" OR "FUNCTION";NUM which will show you all occurrences of "CUSTNUM", and the immediately preceding line that contains "PROCEDURE" or "FUNCTION". With the new Native Mode spooler on MPE/iX version 2.1, all spool files are ordinary disc files in the group OUT.HPSPOOL. MPEX's "PRINT;SEARCH=" allows you to search existing SPOOL files for strings! This makes "PRINT;SEARCH=", which is already an extremely powerful tool, more valuable than ever before. No longer will you have to pore over long $STDLISTs, looking for errors (and hoping you notice all of them). To look at all of the FSERRs and CIERRs in a set of job $STDLISTs (and the preceding :JOB card!): %PRINT @.OUT.HPSPOOL;SEARCH="FSERR" OR "CIERR"; PREV=":JOB" To find the $STDLISTs for all jobs that ran the AP0010 program last night: %PRINT @.OUT.HPSPOOL(CREDATE>=TODAY-1);SEARCH="RUN AP0010";PREV=":JOB" MPEX has many new %LISTF modes, and gives you the ability to create your own, customized, %LISTF modes! * %LISTF,3 shows CREATION, MODIFY, ACCESS, and RESTORE dates (plus CREATOR and MODIFY TIME). This is much more useful than MPE/iX's ":LISTF,3", which shows 20 lines per file vs MPEX's 1 line per file. An MPE/iX ":LISTF,3" of 2,351 files will take over 700 pages. * %LISTF,SEC shows information on file security; unlike MPE/iX's ":LISTF,4", MPEX's "%LISTF,SEC" factors in the account and group security as well as the file security, thus giving you a true picture of the security of the file. Remember, a file with R:ANY in a group with R:AC can still only be read by AC users; where MPE/iX would have told you the file has R:ANY, MPEX would have correctly told you it was actually secured with R:AC. * %LISTF,4 shows disc space information like the extent map (not available from any MPE/iX command), sectors, savable sectors (via %ALTFILE;XLTRIM on MPE/iX), etc. * %LISTF,5 shows program file information, like capabilities, maxdata, etc. * %LISTF,ACCESS shows who is accessing a file! There is no way to get this information with MPE/iX alone! * %LISTF,DB shows IMAGE database information, including filename, datasetname, dbsettype, number of entries, capacity, %full, blocking factor, sectors, %block wasted, and sectors wasted. * %LISTF,DISCUSE shows for each file the number of sectors in that file on each disc drive (useful for load balancing). * %LISTF,SAVABLE lists files sorted by the number of sectors savable by an %ALTFILE;XLTRIM. * %LISTF,??? -- you can write your own customized %LISTF modes to show virtually anything you want. For example, on early versions of MPE/iX, the :REPORT command did not correctly show the amount of disc space used by groups and accounts. Many of our users simply wrote their own (simple) %LISTF mode to show the filespace portion of the :REPORT output (accurately, of course)! MPEX's improved %COPY command allows you to: * copy filesets (of course)! * copy IMAGE databases and KSAM files (for program testing, change prototyping, or a quick disc-to-disc backup)! * copy files into other accounts (if you have SM capability)! * specify new file parameters for the newly-built files (e.g. DEV=3 to place the new file on LDEV 3). * preserve the last access and modify dates on the from files! MPEX also allows you to %RENAME a file into another account! (Of course, this ability is limited to SM users.) A peculiarity of MPE (including MPE/iX) is that only a file's CREATOR can :RENAME, :RELEASE, :SECURE, or :ALTSEC a file; even if you have full access to the file, and can :COPY it and :PURGE it, you can't :RENAME it (ever had a job stream abort because it tried to :RENAME a file built by the "wrong" CREATOR?) MPEX allows anyone with READ, WRITE and EXECUTE access to a file (and SAVE access to the group/account, of course) to %RENAME the file (or %RELEASE, %SECURE, or %ALTSEC it). This is in no way a security violation. Anyone with READ, WRITE, and EXECUTE access to a file can already do whatever they like to it. We simply made it more convenient. Another enhancement to MPE/iX is MPEX's improved :REDO facility, which allows you to: * :REDO/:DO/:LISTREDO from within virtually any program, like EDITOR, QEDIT, FCOPY, etc., (full, multi-line :REDO, with all of the enhancements described below), not just from the Command Interpreter * save the command history in a permanent disc file, so that the next time you log on (or re-run EDITOR), you still have all of your commands available to you for :REDO/:DO/:LISTREDO-ing! * use the powerful VEMODIFY "full-line" modification feature for :REDOing commands! * DO/REDO a RANGE of commands instead of just a single command! * use abbreviations -- "," means "%REDO", ",," means "%LISTREDO", and ",." means "%DO"! * "DO/REDO/LISTREDO string" or "DO/REDO/LISTREDO @string" to DO/REDO the last command (or LISTREDO all commands) that start with or contain a given string. To :REDO a command in MPE/iX, you must know the command number (the first command you enter after you log on is 1, the second is 2, etc.). With MPEX, you can say: %REDO COBOL << redo the last COBOL command, with changes >> %DO PREP << immediately re-execute the last PREP command >> %LISTREDO PURGE << list all of the PURGE commands entered >> MPEX can be a powerful process-handling environment. Process-handling provides for more efficient use of system resources. Loading a program (i.e. :RUNing it) consumes a lot of system resources; SUSPENDing and reACTIVATEing it significantly reduces the system load. MPEX allows you to: * Manage suspended programs (all MPEXHOOKed programs can SUSPEND) * Run son processes and pass them input * Hit [BREAK] and return to the father process, rather than aborting your entire process tree * Use additional new MPEX :RUN command keywords like ;GOON (GO ON), ;PRI=, etc. "MPE programming" refers to methods of using MPE commands (either in job streams, UDCs, or command files) to accomplish tasks rather than writing custom programs. While the new MPE/iX Command Interpreter has numerous new features that make MPE programming easier than ever before (including string and boolean variables, functions like FINFO, :WHILE/:ENDWHILE, etc.), these features do not provide the capabilities of the MPEX commands and features already discussed. MPE/iX command files, variables, etc. cannot be said to "compete" with MPEX. Indeed, VESOFT added these features to MPEX on MPE/V as a minor enhancement (we didn't even increase the price of MPEX). The major value of MPEX is in the features already discussed. However, there are several MPE programming features we did add, because they are rather sorely lacking in MPE/iX; these include new operators and functions, new data types, new control structures, and new predefined variables. Rather than show syntax diagrams of the 100+ new predefined variables and functions supported by MPEX, we'll just show you a few examples of some of the things our customers have used them for. Please note: in all of the following examples, keywords and features that are underlined are extensions to the Command Interpreter available only in MPEX! New data types and functions: * date operators and functions MPEX provides a rich set of operators and functions to do calculations with dates. %MPEXSTORE @.@.@(MODDATE>=TODAY-HPDAY+2); *TAPE Stores all files modified since last Monday (the day of the last full backup). This uses today's date (TODAY), minus a number of days (HPDAY, the current day of the week), plus 2 days to calculate the date of last Monday. %CALC 2/9/90 - 5/14/60 Calculates the number of days between 5/14/60 and 2/9/90. %CALC DATEADD(TODAY,0,3,0) Calculates the date 3 months from today. %RENAME DATAFILE,DF![CDATE(TODAY-1,'YYMMDD')] Renames DATAFILE to DFyymmdd; (e.g. if today is 5-NOV-89, renames DATAFILE to DF891104). %REPEAT % FILE INPUT=!MPEXCURRENTFILE % IF DATEDAYOFWEEK(DATEPARSE(RFILE.FILE[2:6],'YMD') = 6 % RUN MYPROGA % ELSE % RUN MYPROGB % ENDIF %FORFILES DF######.DATA Processes all of the DFyymmdd.DATA files, running MYPROGA for the ones that are named with a Friday date, and MYPROGB for all others. %IF HPDAY=6 and DATEMONTH(TODAY+7)<>DATEMONTH(TODAY) THEN % COMMENT It's the last Friday of the month, do the % COMMENT month-end payroll processing here. %ELSE % COMMENT Do the non-month-end payroll here. %ENDIF %RUN MYPROG; INFO="![(TODAY - 01/01/!HPYEAR])+1]" Run MYPROG, passing it today's "Julian date". PARM MONTH=!HPMONTH,YEAR=!HPYEAR :SETVAR LF_FOM & DATEADD(DATEBUILD(!YEAR,!MONTH,1),0,1,0) :SETVAR LF_FDOW & DATEDAYOFWEEK(DATEPARSE(LF_FOM,"YMD")) :SETVAR LF_DATE & DATEPARSE(LF_FOM,"YMD")-(LF_FDOW MOD 7 + 1) ECHO The last friday of !MONTH, 19!YEAR is !LF_DATE This is a command file that calculates the last Friday of a given month. If this file is named LASTFRI, then %LASTFRI 12,90 shows you that the last Friday of December, 1990 is 12/28/90. * time operators and functions MPEX also provides numerous operators and functions to do calculations on time-of-day values. !JOB CPUHOG,MGR.MRP !RUN MPEX.PUB.VESOFT %IF BETWEEN(CLOCK,8AM,5PM) THEN % COMMENT It is during normal business hours now. % COMMENT This job should only be run at night... % EXIT !EOJ %ENDIF %EXIT ... This prevents CPUHOG from being executed during the day (CLOCK returns the current time). %CALC 5:00PM-CLOCK Calculates how many seconds remain until 5:00 PM. %PURGE XYZZY %SETVAR STARTPLUS30MINS "![CLOCK+(30*60)]"-" " %WHILE (CLOCK <= !STARTPLUS30MINS and NOT FEXISTS("XYZZY") % RJEDWNLD XYZZY % COMMENT -- RJEDWNLD is a command file that retrieves a file % COMMENT via RJE from a remote system. % PAUSE 300 % COMMENT -- Wait 5 minutes and try again. %ENDWHILE This will try to download the file XYZZY via RJE; if it doesn't succeed within 30 minutes, it will quit trying. * additional integer, boolean, and string functions MPEX provides some necessary integer and boolean functions missing from MPE/iX. %IF BETWEEN(HPDAY,2,6) THEN % COMMENT it is a week day... %ELSE % COMMENT it is a weekend... %ENDIF %INPUT PROGNAME;PROMPT="What program do you want to run? " %SETVAR PROGNAME STRCHANGE(PROGNAME,".PUB.SYS",".MYPUB.SYS") %INPUT FILENAME;PROMPT="What file do you want to process? " %IF FILENAME NMATCHES "?????###" THEN % ECHO Data files must end with 3 numbers! %ENDIF * real operators and functions MPEX adds functions to do calculations on REAL (e.g. floating point) numbers. These include arithmetic operators, boolean operators, ABS, MIN, MAX, BETWEEN, exponentiation, ROUND, LOG, SIN, COS, TAN, SQRT, etc. They all work on HPPA 32-bit REAL numbers. And MPEX adds a number of special-purpose functions: * special MPE access and file access functions. The MPE access functions do special MPE-dependent things like look up your capabilities, parse/format file codes, interact with the console operator, etc. The file access functions give you access to the full range of MPEX file attribute variables and functions discussed earlier, under "FURTHER FILE SELECTION". In particular, VEFINFO is more powerful and easier to use than MPE/iX's FINFO because you don't have to remember any "magic numbers". Here are just a few examples. !JOB JOBA,MGR.PROD !RUN MPEX.PUB.VESOFT %WHILE JSCOUNT('JOBB,MGR.PROD')<>0 DO % PAUSE 120 %ENDWHILE %EXIT ... If the job JOBB,MGR.PROD is logged on, waits until it logs off before continuing execution of JOBA. !JOB JOBA,MGR.PROD !RUN MPEX.PUB.VESOFT %WHILE VEFINFO('DATAFILE').OPENED DO % PAUSE 120 %ENDWHILE %EXIT ... If the file DATAFILE is opened, waits until it is closed before continuing execution. !JOB JOBA,MGR.PROD ... !RUN MPEX.PUB.VESOFT %SETVAR FNAME PRINTOPREPLY('Which file should we output to?') %IF FEXISTS(FNAME) THEN % IF PRINTOPREPLY('OK to purge '+FNAME+'?')='Y' THEN % CONTINUE % PURGE !FNAME % ENDIF %ENDIF %FILE MYOUTFIL=!FNAME,NEW;SAVE %EXIT Asks the console operator for feedback via the :REPLY command and uses it to set up a :FILE equation and possibly purge the file (if it already exists). * terminal input, terminal control, output formatting functions MPEX also provides a set of functions to do extensive terminal input editing; HP terminal control functions (like clear screen, position the cursor, etc.); flexible formatting of string, integer, date, time, and real values; and a SECURITY/3000 logging function. CONCLUSION Whew! As I said in the beginning, it is impossible to mention all of the benefits of MPEX to MPE/iX (and CLASSIC) users (short of repeating the entire MPEX User Manual) but I hope this can serve as a starting point in making your new life with MPE/iX (HPPA?, RISC?, SPECTRUM?) much easier -- and after all, isn't that what computers are supposed to be for? As another MPEX user said: MPEX. The Swiss army knife of HP3000 software. Worth its weight in gold. Will save you more time than you will believe. Now, it is with its own command language so you can customize to your heart's content. The one package to buy if you can afford only one. -- Scott Hirsch, "Managing Your Data Center", Interact, October 1989 (Thank you, Scott.)