ORVYL and WYLBUR


ORVYL is a timesharing monitor developed by Stanford University for IBM System/360 and System/370 computers in 1967–68. ORVYL was one of the first time-sharing systems to be made available for IBM computers. Wylbur is a text editor and word processor program designed to work either without ORVYL, or in conjunction with ORVYL.

Overview

The names ORVYL and WYLBUR are often used interchangeably, but:
WYLBUR is not a full standalone operating system in the mold of Dartmouth Time Sharing System or Unix. Instead it runs on top of an IBM batch operating system. It takes the form of an editor with a Remote Job Entry system and thus has much the same relationship to the IBM operating systems as Emacs does to Unix. For these reasons WYLBUR is often thought of as a text editor rather than a time-sharing system. However, whereas Unix does not need Emacs to provide text editing services, IBM's operating systems originally needed WYLBUR. Later innovations such as IBM's Time Sharing Option made WYLBUR less relevant for IBM users and gradually replaced it.
This article will use the full upper case spelling for commands and keywords. All references to characters and string assume an EBCDIC code page.

Use

ORVYL and WYLBUR were used at the Stanford Linear Accelerator Center, the European Organization for Nuclear Research, the U.S. National Institutes of Health, and many other sites. Retired from most sites in the late 1990s owing to concerns about Y2K issues, they remained in use at NIH until December 2009. ORVYL and WYLBUR are still available as open source from Stanford. There are also proprietary versions such as SuperWYlbur.
ORVYL and WYLBUR were much admired as shown by this excerpt from a 2004 article titled "Computing at CERN: the mainframe era":

Advantages and disadvantages

ORVYL and WYLBUR first became available in 1967–68, before TSS/360, TSO, or any other official time-sharing solution from IBM. This was roughly the same time that third-party time-sharing systems such as MTS became available and the under the radar development effort of CP-67 at IBM's own Cambridge Scientific Center took place. WYLBUR had the additional advantage that it could be used in conjunction with IBM's mainstream operating system, OS/360.
WYLBUR is a single-address-space system, unlike TSO. This conserved memory in the days when memory was precious. So even when TSO was available, organizations seeking to minimize memory use would often keep some or even a majority of their users on WYLBUR rather than letting them use the TSO interactive environment.
WYLBUR provides compressed Partitioned Data Sets to save disk space. In MVS source code is typically stored as a sequence of card images. If a line contained only one or just a few characters, 80 characters were still used to store that line. Even when data, e.g., source code, are stored as variable blocked, space could be wasted on strings of embedded blanks. WYLBUR implements stream-oriented storage of text in PDSs, so that a one character line might only take 16 characters rather than 80 to store. WYLBUR, or an external program run via JCL was used to convert files to and from the WYLBUR EDIT format.
Although TSO allows a user to do more than a locked-down WYLBUR system did, it is possible to write WYLBUR Exec scripts that execute batch jobs to perform functions that ordinarily would have required a TSO account, filling a batch job skeleton out with parameters, submitting the batch job, retrieving the output and displaying it on the screen.
WYLBUR has some security advantages over TSO, and some disadvantages. Advantages include:
Disadvantages related to security included:
Wylbur had a special edit format for Wylbur data sets, which are compressed and have a line number and revision flag for each line. In addition Wylbur supports standard FB and VB datasets. A Wylbur user normally specifies a default volume, which may be the special word CATLG. requesting a search of the catalogue for an existing dataset and requesting that a new dataset be cataloged. Wylbur has the ability to convert line numbers between edit and IBM data sets, either as scaled integers or with an explicit decimal point.

Editing

Wylbur provides a line editor that works with temporary data sets, similar to buffers in other editors. At any point in time one of the temporary data sets is designated as default. Wylbur maintains a current line pointer for each temporary data set. The user may specify an explicit working data set on a command; if he omits it, then the default temporary data set is used as the working data set.
The unit of operation is a set of lines and individual lines are identified with a line number in the range 0.0 to 99999.999; leading zeros in the integer part and trailing zeros in the fractional part may be omitted. The user can specify a line number in any of the following ways
  1. Absolute line number: ddddd.ddd
  2. FIRST: first line in the working data set
  3. CURRENT: the current line for the working data set
  4. LAST: last line in the working data set
  5. END: a target for copies, following the last line in the working data set
  6. relative: line+ordinal or line -ordinal.
  7. macro variable containing a line
Wylbur libraries have a nonstandard format, however it allows the user to export to native OS files with integer sequence numbers and to import native OS files with integer sequence and rescale the line number by a factor of 1000.
A range can be specified as a combination of
  1. An explicit range, e.g.,
  2. A pattern, e.g.,
  3. A pattern with a column range, e.g.,
  4. An ordinal, e.g.,
  5. An ordinal relative to a match, e.g.,
  6. A sequence of lines following a match, e.g.,
  7. A Boolean operation, e.g.,
  8. A specification in parentheses prefixed by SET, e.g.,
A pattern is similar to a regular expression, but the syntax is closer to that of SNOBOL than to that of Unix or Perl, there is no backtracking and only the NIH Wylbur has capture of subpatterns. A pattern may be:
Equal, comma, blank
Equals, commas, blanks
Sample commands

CHANGE 73/80 TO X10+10 IN EVERY 3RD LINE OF 'ABC' 1/3 in 1.5-2/3.7+2
COPY 'BAL' 10/15 TO EMD
CHANGE 73/80 TO IN EVERY 3RD LINE START 2 OF 'BAL' 10/15
CHANGE
TO SUBSTRING 2/4

The specification of base+increment means that the replacement text on the first line is base and is incremented on subsequent lines, so that X10+10 replaces the matched text on the first line with X10, on the second line with X20 and on the third line with X30. The specification of SUBSTRING 2/4 means columns 2-4 of the matched string; note that this is less flexible than captures.

Enhanced versions

Various organizations developed enhanced versions of Wylbur. These included
SuperWylbur has several enhancements over the original Wylbur. The most important are
  1. Supporting 3270, 3767 and NTO terminals via VTAM; as with other proprietary Wylbur versions, SuperWylbur does not use MILTEN for VTAM terminals.
  2. An enhanced macro facility.
  3. Supporting user-written full-screen panels

    SuperWylbur macro Facility

The macro processor adds commands, constants, functions and expressions to Wylbur. Even when the command syntax does not include parameters defined to be expressions, the user can use the forms % and %% to force evaluation. If the expression is a function with no argument or a variable then the parentheses may be omitted, e.g., %.TIME instead of %. A doubled % requests that the valued be quoted.

SuperWylbur constants

SuperWylbur has two types of constants:
SuperWylbur operators whose names contain only special characters need not be separated by spaces. Operators whose names contain a period and letters must be separated by spaces. SuperWylbur has the following types of operators:
SuperWylbur arithmetic operators
The name of a macro function begins with a period. If there are arguments, a colon separates them from the name. A semicolon separates successive arguments. SuperWylbur provides the following types of macro functions:
arithmetic functions
accounting functions:
date and time conversion: s parameters default to current date or time
environmental queries; most of these return values from SET commands:
full screen functions:
JES functions:
macro functions:
string functions:
working file functions; s arguments default to current default working data set
Complete list of macro functions:
Absolute value
  • .ACCOUNT
Account number from logon id
Arc cosine x
1 if beep on next terminal write
Arguments passed to macro
Arc sine x
Arc tangent x
Value of SET AUTOLOG; used for recovery from previous session
SET option: BACK or NOBACK
Value of SET BATCH option s
  • .BIN
Value from SET ROOM
  • .BYTE:
Convert byte
i of s to integer
  • .CARG
Arguments passed to a user defined command defined with SET COMMAND
  • .CASE
Value from SET CASE: UPPER or UPLOW
Truncate up
Convert i to a single EBCDIC character
  • .CHARGE
Current session charge in dollars and cents
  • .CMCOUNT
Macro commands with no terminal I/O
  • .CMDCOUNT
Macro commands with no terminal I/O
  • .CMDLIMIT
Value from SET CMDLIMIT; maximum macro commend without terminal I/O
  • .CMDMAX
Maximum allowed in SET CMDLIMIT
  • .CMLIMIT
Value from SET CMDLIMIT; maximum macro commend without terminal I/O
Substring of s from column i1 to column i2
1 if SET CONFIRM
Connect tinme in seconds to 2 decimal places
Continuation character
Cosine x
Hyperbolic cosine x
Cotangent x
  • .CPU
CPU id from SMF
  • .CPUTIME
CPU time in seconds to 2 decimal places
  • .CURRENT
Current line number of working data set
s; -1 if it does not exist, -2 if it is empty
  • .CURPOSN
Cursor position at last interrupt in form row+col/1000; -1 if not 3270
  • .CURSORVAR
Variable name for field containing cursor at last interrupt
  • .DASH
Dash character used by HYPHENATE
  • .DATE
Convert Julian date
s to mm/dd/yy
  • .DATE4
Convert Julian date
s to mm/dd/yyyy
  • .DAY
Day of week
s falls on
  • .DAYS
Days since 01/01/1900 to
s
Convert x radians to degrees
Next integer after last line number in working data set s
  • .ENTRYKEY
Key causing last interrupt: CLEAR, CURSEL, ENTER, PA1-PA3, PFK1-PRK24
Error function
Error function
e^x
1 if sessiona supports 3270 extended data stream
Append as many copies of s2 as necessary to s1 to get length i
Lines fetched by FETCH command
First line number of working data set s; -1 if it does not exist, -2 if it is empty
Truncate down
Fractional part of n
Size of 3270 full screen area
Convert mm/dd/yy or mm/dd/yyyy to month day, yyyy
Gamma
  • .HELPDSN
Name of help data set
  • .HELPVOL
Volume serial number of help data set or CATLG
  • .HEX:
Convert
i1 to hexadecimal, zero padded to length i2
Convert hexadecimal s to string
First column at which s2 occurs in s1; 0 if no match
1 if variable s initialized
Contents of current line of channel i; advance current line pointer
Convert s from mm/dd/yy or mm/dd/yyyy to Julian date yy.ddd
Convert s from mm/dd/yy or mm/dd/yyyy to Julian date yyyy.ddd
Last line number of working data set s; -1 if it does not exist, -2 if it is empty
Job number of last job submitted with the RUN command
Line number of line excuting when attention exit was taken at the current macro level; -1 if cleared or no exit taken
Value from SET LENGTH
1 if CONTROL NATIVE is in effect at macro level i
Current line pointer for channel i
1 if SET NOTIFY is in effect
String representation of the value of expression s
  • .NUMTEMPS
Number of non-default temporaries in use by session
Quote s1 using framing character s2
Convert x degrees to radians
Data set name of recovery data set after LOGOFF INTACT
Volume on which to create recovery data sets or CATLG
Reverse the order of string s
  • .RJECMD
Number of JES commands issued during session
Lower case Roman numerals for i
Value from SET ROOM
Round n to i decimal places
Size of 3270 reserve screen area
The user updated a panel field since the last write
Screen size as rows.columns 3 digits after decimal point) or -1 if not 3270
Sine x
Hyperbolic sine x
Number of lines in working data set s; -1 if it does not exist
Square root of x
  • .SSASIZE
Size of 3270 standard screen area
Convert first 127 characters in EBCIDIC string s to hexadecimal
Value of expression with no exponential notation
  • .STRING:
Value of expression with length
i1
  • .STRING:
Value of expression with length
i1 and i2 decimal places
  • .STRING:
Value of expression with maximum length
i1
  • .STRING:
Value of expression with maximum length
i1 and i2 decimal places
Number of characters in s
Substring of s from column i1 for i2 columns
Number of users logged on to this SuperWylbur task
System data set prefix
Public system macro data set name
Public system macro volume serial number or CATLG
Task name of current SuperWylbur instance
Tab settings, comma separated
Value from SET TALK : TALK or NOTALK
Tangent x
Hyperbolic tangent x
Unique name for new temporary
Number of available non-default temporaries for session
1 if working file s has been updated since last SAVE
Terminal name or value of .PORT
Number of terminal I/O operations in current session
TERSE or VERBOSE
Current default working data set
12-hour time in form hh:mm:ss x.m.
  • .TIMEMIC
11 digit microseconds since midnight
  • .TIMEOUT
    0 if SET NO TIMEOUT, 1 if SET TIMEOUT, -1 if no TIME privilege
  • .TIMEOUT:
Value of i'th timeout interval for
s
  • .TIME100
Number of seconds since midnight to 2 decimal places
  • .TIME24
24-hour time
  • .TRANSLATE:
Translate
s1 using input table s2 and output table s3
  • .TRIM:
Remove
s2 from the ends of s1 according to s3: L = left, R = right, B = both
  • .TRUNCATE:
Truncate
n to i decimal places
  • .T3270
1 if 3270
Convert s to upper case
User portion of logon id
Number of panel screen variables that the user updated since the last write; -1 if not 3270
First position in s1 not present in s2; 0 if all characters in s1 are in s2
SuperWylbur level in form version.release - PTF
Volume set for the session, CATLG or null
Value of SET WIDTH
Line number of attention exit for current macro level; -1 if no attention exit set
Line number of error exit for current macro level; -1 if no error exit set

SuperWylbur macro pseudofunctions

Pseudofunctions are like functions, except that they appear on the left hand side of an assignment, e.g., LET.foo:bar=baz.
Replace columnsi1 through i2 of v
Set panel variable on which to place cursor
Associate a working data set with channel i
  • .LINE:
Replace or insert line
n in working data set s if i is omitt6ed or zero
Replace line
i lines after line 'n' in working data set 's'
Set current line pointer for channel i
Add or replace current line of channel i, advance current line pointer
  • .SUBSTRING:
Replace column
i1 of v for i2 columns
Replace the last line read from channel i

SuperWylbur macro statements