NOS/VE Libraries & Command Utilities

Command Lists

Each NOS/VE job had a current command list, which was similar to an MS-DOS or UNIX path. Apparently, entries in a command list could be libraries or catalogs. (My notes on this are skimpy.) An SCL procedure could be run by name if it was in a library in your command list, or by file name. I suppose if it were run by file name, the first PROC in that file was run. I believe the same applied to executables.

The concept of a library of commands that could be invoked from a command prompt would be new to MS-DOS and UNIX users, but would be familiar to users of some other OSs, including older CDC operating systems. These libraries were called object libraries and were managed by a command utility called CREate_Object_Library.

Command Utilities and CREate_Object_Library

Command utilities were special programs that interacted with the user via a command language all their own, and used SCL to parse this language. Hence, the syntax of commands with command utilities had to conform to the rules of SCL. In face, command utilities were simply extensions of SCL--each command in a utility was just an entry point. Command utilities just added their own library of entry points to the beginning of your command list. Hence, you could execute any SCL command from within a command utility as long as it didn't have the same name as one of the utility's commands. Command utilities typically presented an interactive prompt with their name followed by a slash, as opposed to the usual system prompt of just /.

Many CDC programs, including CREate_Object_Library, worked by creating a new file rather than directly modifying an existing file. This was safer than changing a file on the fly, though it did require more I/O and disk space.

The following sample session adds a procedure (the find_primes PROC sample) to an existing library. It also demonstrates information maintained by the file system, the fact that NOS/VE was apparently Year 2000-compliant, and the fact that CDC was at least as fanatical about time precision as I am. You also see that back then, I liked to work very late at night.

/primes 1001 1012  "Called from a file name <> the proc name"
1009
/find_primes from=2 to=33  "Proc name doesn't work because not in command list"
--ERROR--  FIND_PRIMES is not a command.
/create_file mrrlib.$next  "Create new cycle of mrrlib"
/disce mrrlib              "Display details of particular catalog entry (file)"
    NUMBER OF CYCLES:     2, ACCOUNT: SYSTEMS, PROJECT: SYSTEMS
    PASSWORD: , LOG SELECTION: FALSE
    CYCLE NUMBER:     4, ACCESS COUNT: 0,
    CREATION DATE AND TIME: 1985-06-23 23:54:29.845,
    LAST ACCESS DATE AND TIME: 1985-06-23 23:54:29.845,
    LAST MODIFICATION DATE AND TIME: 1985-06-23 23:54:29.845,
    EXPIRATION DATE: NONE
    CYCLE NUMBER:     3, ACCESS COUNT: 59,
    CREATION DATE AND TIME: 1985-06-02 04:11:21.228,
    LAST ACCESS DATE AND TIME: 1985-06-17 23:46:04.549,
    LAST MODIFICATION DATE AND TIME: 1985-06-02 04:26:18.148,
    EXPIRATION DATE: NONE
/detach_file $local.mrrlib  "This was necessary so that CREOL won't try with"
/attach_file mrrlib am=all sm=(read,execute)  "the wrong share mode"
/create_object_library      "We create a new object library, so we have to first"
                            "add the contents of the old one"
COL/add_module l=mrrlib.3   "Already open, so doesn't reopen"
COL/add_module l=primes     "Use replace_module for replace"
COL/generate_library mrrlib.$high  "Overwrites high cycle of mrrlib.  Technically"
                            "flawed, because others do have read access at this time"
COL/quit
/detach_file $local.mrrlib  "Immediately detach to prevent sharing problems (?)"
/set_program_attribute add_library=mrrlib  "This command only adds the library to"
/find_primes to=20          "your subroutine list, not to list used for commands"
--ERROR--  FIND_PRIMES is not a command.
/set_command_list a=mrrlib  "This adds library to place where commands are."
/find_primes to=20          "Default value for parameter FROM"
3
5
7
11
13
17
19
/

Source Code Utility

Source Code Utility (SCU) was a source code maintenance program. It maintained libraries containing "decks" (files) consisting of lines of text, similar to today's UNIX RCS and SCCS. Unlike RCS and SCCS but like CDC's older UPDATE program, each line had a name consisting of a deck or modification name followed by an ordinal number of the line within that deck or modification.

We didn't use SCU much because we didn't use NOS/VE much. However, under SCOPE/Hustler, we did use the very similar UPDATE program extensively. It was essential to our development process.

In the following example, we use SCU to access an existing text libray containing several decks, including CRETL, which is a CYBIL program. This deck contains lines added or changed by a previous modification with name SYSCLASS. We perform a modification named MRR1 using SCU's subutility edit_library. Note that SCU was one of the few programs whose command didn't follow the usual 3-1-1 naming convention. As usual, my annotations are included in double-quotes.

"Attach existing library to local file mybase"
/attf .student.sysclass mybase sm=(read,execute)
/scu $local.mybase result=mynewscu "At exit, new file goes to mynewscu"
"Create mod named mrr1.  a= means author, md= mod description"
sc/create_modification mrr1 a='MRR' md='Just a sample mod.'
sc/display_deck_list
CRETL                            ERROR
EXTFTL                           TEXT_LIBRARY_DEFINITIONS
sc/edit_library m-mrr1 d=cretl
Begin editing deck CRETL         "Now we enter edit submode of SCU"
sce/l l=1..5  "List lines 1-5"
SYSCLASS       1 MODULE create_text_library;
SYSCLASS       2 ?? RIGHT := 110 ??
SYSCLASS       3 {
SYSCLASS       4 { Name:   CREATE_TEXT_LIBRARY - Create a "text" library from one or more
SYSCLASS       5 {                               ordinary text files.
sce/r 'create' 'crunch' l=sysclass.1  "Replace text on line sysclass.1"
MRR1           1 MODULE crunch_text_library;
sce/i il=sysclass.4   "Insert lines after line sysclass.4"
Enter text
? { Insert a random comment...
? **                  "This terminates input"
sce/d l=sysclass.3
Deleted:
SYSCLASS       3 {
Current:
SYSCLASS       4 { Name:   CREATE_TEXT_LIBRARY - Create a "text" library from one or more
sce/quit              "Exit edit submode"
"Create file (default name COMPILE) containing all decks."
"I believe ab= specified the place to look for the equiv of include files"
sc/expand_deck d=all ab=$system.cybil.osf$program_interface sc=command
sc/quit true     "TRUE means write result file"

FSE Editor

The system editor in NOS/VE was FSE (Full Screen Editor). If you had a "smart" terminal (i.e, a terminal like a VT100 with escape sequences to move the cursor and the like), FSE was quite easy to use. (FSE looked at the terminal mode; see the sample prolog file.) Otherwise, you could still use the editor using commands similar to those in UNIX ed. FSE--a command utility--had a command name of EDIt_File. You entered FSE via:

edit_file filename

Some of the common commands were:

L ['text search string'] L=line_range to list lines
I IL=line_number to insert after line
D L=line_range to delete lines
R 'search_string' 'replacement' L=line_range   to replace text in lines

line_number was an ordinal line number (like UNIX ed and vi), or an SCU line ID.

line_range was  line_number..line_number  or  A  for all.

As in UNIX shells, multiple commands could be placed on a line by separating them with a semicolon. Here is a very short FSE session performed on the updated source code file created in the above example. It simply lists the first six lines of the file.

/edif compile; l l=1..6; qui false   "False means don't save file on quit"
Begin editing file :NVE.MRR.COMPILE
MODULE crunch_text_library;                                               MRR1           1 
?? RIGHT := 110 ??                                                        SYSCLASS       2
{ Name:   CREATE_TEXT_LIBRARY - Create a "text" library from one or more  SYSCLASS       3
{ Insert a random comment...                                              MRR1           2
{                               ordinary text files.                      SYSCLASS       5
{                                                                         SYSCLASS       6
/