Copyright (C) 1983 Carnegie Mellon University Computation Center
FNDP Computing Centre, Namur Belgium
1. INTRODUCTION
1.1. Programmable Command Language
The PCL Extension to the TOPS-20 EXEC puts a language and executor into the
TOPS-20 EXEC. With this high level language and its extensions, users can
easily to write their own PCL programs which will will look like existing TOPS
commands complete with parameter substitution and TOPS-20 style recognition.
PCL is due to Ray SCOTT from Carnegie Mellon University Computation Center:
Carnegie-Mellon University,
Computation Center,
Schenley Park
5000 Forbes Avenue,
Pittsburgh PA 15213 (phone +1.412.578-26-42).
This manual describes an extended version of PCL, with extensions by Michel E
Debar: FNDP Computing Centre, Rue Grandgagnage, 21 B-5000 Namur Belgium (phone
+32.81.22-06-31, telex 59.222 Fac.Nam. B. Belgium).
You should consult the "TOPS-20 PROGRAMMABLE COMMAND LANGUAGE - User's Guide
and Reference Manual" from CMU for the complete documentation of the official
(non extended) version of PCL. (That manual is on our distribution tape in
<pcl5.doc>pcl.lpt. The present manual is in <pcl5.x-doc>pclx.lpt. )
1.2. PCL Uses
PCL may be used in a variety of different ways. Users might write friendly
front ends to existing programs. The command parsing with recognition makes a
very easy way to do parameter passing to a program. Periodic or repetitive
tasks can be coded in PCL routines which would reduce the amount of typing
needed to accurately execute all the steps necessary to complete a piece of
production.
PCL also will provide a means for implementing completely new functions which
are not possible in the current EXEC. For example, if the user has a graphics
terminal which takes special support then PCL can be used to provide new
support commands.
System administrators can tailor their EXEC to provide local commands that
override the function of standard commands. An administrator may wish to
eliminate the PLOT command if there is no plotter on the system.
1.3. PCL Features
The main features of PCL are:
- ALGOL-like language constructs
- string manipulation
- callable procedures with parameters
- system services
- flexible user interface
- program interface
- input/output capabilities
1.4. Notational conventions
In this document the format of commands is given using simple conventions:
- [...] is used to denote an optional item.
- "integer1 [,integer2 ...]" denotes one more integers, separated by
commas.
- {option1 | option2} denotes alternative items.
2. EXEC INTERFACE
PCL commands can be written with any text editor. The source for these
commands is stored in files with the default type PCL. Source files are
compiled into a command by the new EXEC command DECLARE . Once the command is
successfully compiled, it is stored in the EXEC and becomes a part of the list
of commands that the user has available during that job. If the DECLARE
command detects an error in the PCL source, an error message will be typed on
the terminal along with the line in error and a pointer indicating about where
the error occurred. Once an error is detected the compilation stops at that
point.
Any user command which has the same name as an existing command overlays the
existing command. The new EXEC command ORIGINAL may be used to execute any of
the standard EXEC commands. Commands may be removed with the UNDECLARE
command.
In addition to declaring PCL commands, the user may use the DECLARE command
to declare procedures which may be called from user commands, string variables,
and integer variables. One PCL source file may contain many command,
procedure, and variable declarations. The variables may be given values by
using the SET command with the new options STRING-VARIABLE or INTEGER-VARIABLE.
For example:
@SET STRING-VARIABLE myname (TO) scott
The string variable MYNAME may be accessed from any declared command or
procedure.
A new option to the INFORMATION command, the PCL-OBJECTS option, will show
the user all user defined commands, procedures, and variables.
Once the user has a set of procedures and commands defined, these may be
saved in an ENVIRONMENT using the ENVIRONMENT option to the new PRESERVE
command. To recall an environment, use the DECLARE command with the
ENVIRONMENT option. Commands and procedures in environment files are stored in
an internal format, so they are not recompiled when declared. The user may
declare multiple ENVIRONMENT files and the commands from each environment will
be added to the user's EXEC command list. Commands (re)defined are listed on
the user terminal unless you use the /NOCONFIRM option of DECLARE.
3. THE PCL LANGUAGE
3.1. General Command Format
The formal definition of a command is :
COMMAND name;
PCL statement
A simple example would be:
COMMAND simple;
Display "This is a simple command";
If the above 2 lines were in the file simple.pcl then
@DECLARE PCL simple.pcl
would enter the command simple into the users EXEC. If the user types:
@SIMPLE
at the "@" prompt then
This is a simple command
would be typed on the user's terminal.
The most general (and useful) simple definition of a command is:
COMMAND name;
Begin
[INTEGER, STRING and EXTERNAL declarations]
PCL-Statement;
[...;]
End
where any number of PCL statements separated by semi-colons may be between the
BEGIN-END pair. Note that all Integer, String and External statements must
appear before any other PCL statement.
Begin...End may be used to group any number of PCL statements into a single
statement. Note that braces {...} may be used in lieu of Begin..End:
if i > 100 then begin
display "Out of Range";
i = 50;
end;
Statement labels may be up to 40 characters long and are terminated with a
colon. Labels are used by the GOTO statement (see page 32) and by the parse
error handler (see page 11):
if i gtr 100 then goto horror;
...
Horror:
display "Can't proceed";
exit;
Comments may be placed anywhere in PCL source files.
Simple comments start with an exclamation mark and extend to the end of the
current line:
Display "Hi" + !This is a comment
" Mate";
Inline Comments are enclosed between !{...}!. They may appear in the middle
of a line, they may extend over several lines and they may be nested. Inline
comments are useful for commenting out large sections of code, long comments,
and in-line commenting:
!{ Ring the
terminal Bell }!
call $Jsys1 ( 8%74 !{pbout}!, 8%7);
3.2. PCL Constants
PCL knows of only two types of constants: integers and strings.
Integers are signed integers (expressed as 36 bit quantities). Integer
constants are of the form:
Format 1.
number
Format 2.
base%number
The first form is a number in base 10. The second form allows to enter numbers
in any base from 2 to 36. For bases higher than 10 the letters "a" through "z"
are used to enter the digits 10 through 35:
The system procedures $string and $integer are used to convert numbers to
strings and back, with an optional radix.
Strings are of the form "string". They may be freely concatenated using the
"+" operator. Presently string constants are limited to 512 characters. String
variables do not have that restriction.
3.3. PCL Variables
PCL has two types of variables: string and integer variables. Variables may
be either local to a procedure or global.
Variables to be used in PCL commands must be declared at the beginning of the
command. For example:
COMMAND simple;
BEGIN
STRING name_in_full;
INTEGER count;
EXTERNAL INTEGER screen_size;
...
END
would define the local variables name_in_full (string) and count (integer), and
give the procedure access to a global variable screen_size (integer). Variable
names may be any combination of letters, numbers, and the under-score
character. Names may be up to 40 characters in length.
Variables may be assigned values using a simple assign statement.
COMMAND simple;
BEGIN
STRING name_in_full;
INTEGER count;
count = 3;
name_in_full = "J. Ray Scott";
...
END
Local variables are known only within the command or procedure in which they
are declared.
Global variables are known to any procedure which declares them external.
They may be manipulated either by PCL commands, or by the Exec commands:
@DECLARE INTEGER-VARIABLE or
@DECLARE STRING-VARIABLE (see page 25)
@SET INTEGER-VARIABLE or
@SET STRING-VARIABLE (see page 51)
@INFORMATION (about) VARIABLE variable_name
(see page 35)
If they are to be used by a specific set of library routines, it is best to
declare them as global variables in the PCL source file:
integer screen_size ! global variable
command set-screen;
begin
external integer screen_size;
...
end
3.4. Reserved names
PCL uses a number of reserved names which you may not use outside of their
normal context. For instance, you may not use them as variable names:
ABORT INPUT SYNONYM
ALWAYS INRANGE THEN
BEGIN INTEGER TIME
BINARY INVISIBLE TO
CALL INVOKE TOPROGRAM
CASE KILLPROGRAM TYPEIN
CLEARTYPEOUT LEQ UNTIL
COMMAND LET WHILE
DATE LSS WILD
DCM NEQ WORDS
DEFAULT NOECHO
DEFAULT_DEV NOHELP
DEFAULT_DIR NOINDIRECT
DEFAULT_EXT NOORIGINAL
DEFAULT_GEN NOP
DEFAULT_NAM NORETURN
DELETED OF
DISPLAY ORIGINAL
DO OTHERWISE
DOCOMMAND OUTPUT
ELSE PARSE
END PARSEONLY
EQL PASO
EXIT PASSOUTPUT
EXTERNAL PROCEDURE
FROM PROMPT
GEQ RADIX
GETTYPEOUT RETURN
GOTO SAVE
GTR SELECT
GUIDE SELECTALL
HELP STDHELP
IF STRING
3.5. String Manipulation
Strings may be concatenated using simple addition statements.
where n is the starting character number and m is the number of characters to
extract. The leftmost character is character position 1. The user may use
th
[n:*] to extract from the n character to the end of the string.
The length of a string may be obtained using the $LENGTH system service.
count = $LENGTH(conc_string)
would assign the length of the string conc_string to the integer variable
count.
A PCL routine may search for a substring of a string by using the $SEARCH
system service:
count = $SEARCH(conc_string,"SCOTT")
would assign the starting location of the string SCOTT to count if it was found
in the string conc_string. If no match is found $search returns 0.
3.6. Logical expressions
Several PCL statements use logical expressions comparing integers or strings.
String comparison is based on the Ascii character sequence. So that "ABC" is
less than "ABD" for instance.
The syntax of a logical expression is:
operand1 logical-operator operand2
where:
operand1,operand2
are both integer expressions or both string expressions
operator
is one of:
- LSS or <
- LEQ or <=
- EQL or =
- NEQ or <>
- GEQ or >=
- GTR or >
3.7. Procedures
The format of a procedure definition in a source file is the same at that of
a command definition except that the word COMMAND is replaced with the word
PROCEDURE. A RETURN statement will return to the calling PCL routine.
PROCEDURE doit;
Begin
...
Return
End
To use the procedure DOIT in a command it must be declared and then called.
COMMAND callit;
Begin
EXTERNAL PROCEDURE doit;
...
CALL doit;
...
End
Parameters to procedures are declared by placing the list of parameters in
parenthesis after the procedure name. The parameters must be typed, i.e., they
must be specified as being either integers or strings.
PROCEDURE doit (INTEGER para_1,para_2; STRING para_1);
Procedures may have a type and thus return a value. To have a typed
procedure the word INTEGER or STRING is placed in front of the PROCEDURE
keyword in the source file. The value to be returned is placed after the
RETURN. This may be any expression of the appropriate type.
INTEGER PROCEDURE upone (INTEGER in);
RETURN in+1
Procedures may modify their arguments (they are Input and Output formals):
PROCEDURE CAT (string s1,s2,s3);
s3 = s1 +s2;
3.8. PCL Flow Control
PCL provides several ways to control the sequence of execution:
- ABORT
- EXIT
- RETURN
- DO, WHILE, UNTIL
- IF ... THEN ... ELSE ...
- CASE
- SELECT
- GOTO
3.8.1. ABORT
Abort stops the execution of a PCL command and returns at Exec command level
after printing an error message preceded by "?". See page 18.
3.8.2. EXIT
Exit stops the execution of a PCL command without printing any message. see
page 29.
3.8.3. RETURN
Return exits from the current PCL procedure and returns to its caller. If
used in a command RETURN acts as EXIT.
3.8.4. DO, WHILE, UNTIL
DO, WHILE, and UNTIL are available for program loops. These may be used in
the following combinations:
1. DO PCL statement WHILE logical expression
2. DO PCL statement UNTIL logical expression
3. WHILE logical expression DO PCL statement
4. UNTIL logical expression DO PCL statement
...
i = 3;
do begin
display i;
i = i - 1;
end
until
i eql 0;
3.8.5. IF
The IF statement will execute a PCL statement if the condition is true. IF
may have an ELSE clause.
IF str_val = "xyz" THEN
PCL statement
ELSE
PCL statement
3.8.6. CASE
The case statement provides a method of selectively executing PCL statements
depending on the value of an integer variable. The variable value is tested for
a match with specified constants. If a match is found the corresponding PCL
statement is executed:
CASE count FROM 1 to 10 of BEGIN
1,2 : BEGIN ... END;
3 TO 6, 10 : BEGIN ... END;
5 : BEGIN ... END;
INRANGE : BEGIN ... END
OUTRANGE : BEGIN ... END
END
3.8.7. SELECT
The SELECT statement is similar to the CASE statement. Instead of choosing
among a set of integer values in a range, SELECT chooses among arbitrary
expressions. The expression and the test values must be of the same type,
either integer or string.
SELECT str_var of BEGIN
"abc" : BEGIN ... END;
"xyz" : BEGIN ... END;
OTHERWISE : Display "Not found"
END
In the above example. If str_var contains the string abc then the statements
in the BEGIN-END pair after "abc": will be executed. If str_var is neither abc
nor xyz then the OTHERWISE clause will be executed, in this case it will
display
Not found
on the terminal and proceed to the next PCL statement after the SELECT
statement.
3.8.8. SELECTALL
The SelectAll statements is basically similar to Select, except that after
executing one case it goes on to try to find more matches:
SELECTALL int_var of begin
1,3 : display "1 or 3";
2,4 : display "2 or 4";
1 TO 2 : display "1 or 2";
ALWAYS : display "Always";
OTHERWISE : display "Neither 1,2,3,4";
end;
If Int_var is 2, this will display "2 or 4", then "1 or 2" and "always".
ALWAYS always gives a match, OTHERWISE matches only if no previous case matched
(for instance if int_var is 5).
3.8.9. GOTO
The GOTO PCL statement causes an unconditional transfer to a label.
COMMAND xfer;
BEGIN
...;
loop1:
...;
GOTO loop1;
...
END
4. SYSTEM SERVICES
Various system services are provided to return specific system information or
perform system functions.
4.1. System Constants
PCL provides pre-defined constants that are useful in writing PCL routines,
or necessary to specify the arguments to some PCL system procedures.
$Append INTEGER - An option to $OPEN for append mode.
$Cr STRING - Contains just a carriage return.
$Crlf STRING - Contains a carriage return and a line feed.
$Input INTEGER - An option to $OPEN for input mode.
$Lf STRING - A string containing a line feed.
$Nul STRING - Read/write string like NUL:, returns a null string.
$Output INTEGER - An option to $OPEN for output mode.
$Parse INTEGER - Specifies the file currently parsed for the
$File_Dev, $File_Dir, $File_Dir, $File_Nam, $File_Typ,
$File_Gen, $Fileinfo_I, $FileInfo_S and $FileSet system
procedures (see page 8).
$Quote STRING - A string containing a double quote character.
Other constants are provided by PCL specifically to ease the use of certain
system procedures: see pages 8, 8.
4.2. System Variables
Some system procedures look like variables and may be used in most statements
where PCL allows to use a variable. Some of these variables may be changed by
the user (eg the prompts).
The restrictions on the use of system variables are:
- they may not be used as the arguments to PARSE options:
- a string system variable may not be used as argument to $Strloc.
Most of these restrictions are NOT detected when you declare a PCL statement,
but their violation leads to wrong behaviour when executing the command.
The system service variables are:
$Ac1, $Ac2, $Ac3, $ac4
INTEGER - Contain the first four register values after the last
$Jsys executed.
$Account STRING - The account of the current job.
$ARPAnet_Node STRING - The system's ARPAnet node name. This is a null string
if the system is not on the ARPAnet.
$Atom STRING - After a PARSE statement, contains the text typed in
for most parse types (all but Noise, EOL, Comma, and Token.)
$Batch_Job INTEGER - Non-zero if the job is a batch job.
$Command STRING - Contains the complete text of the last command parsed,
or of the current command up to the last field parsed with a
PARSE PCL statement.
$ConnectedDirectory
STRING - The name of the currently connected directory
$Curtad INTEGER - The current date and time in system internal format.
(Date and Time: Tops 20 stores dates and time internally in a
single integer with in the left half the day counted since the
18th of November 1858, and in the right half the fraction of
the day elapsed since midnight. The fraction is the numerator
of a fraction that has a denominator of 2**18. When entering a
date and time into Tops 20, all usual formats are valid: 3-DEC-
83, 03/DEC/83, 08:51, 16:50, 4:50PM, etc. The system routines
$Curtad, $Date, $InputTad, $OutputTad, $ExpandTad and $MergeTad
deal with dates and times. )
$Date STRING - Current date in DD-MON-YY format
$DECnet_Node STRING - The system's DECnet node name. This is a null string
if the system is not on a DECnet.
$Directory STRING - After executing a parse of Directory(ies) with PARSE
DIRECTORY or DIRECTORYLIST, contains the name of the current
directory parsed, including the angle brackets ("<...>"). (see
page 10).
$EMACSTerminal INTEGER - Returns a 1 if the current terminal can be
"effectively" used by EMACS, 0 if not. [CMU and sites who
customize PCL only].
$FileL STRING - After executing a PARSE FILE statement or some similar
PARSE (INPUTFILE, OUTPUTFILE, FILELIST), this contains the file
name entered in the longest form,
DEV:<DIRECTORY>FILE.EXT.VERSION
$FileN STRING - After parsing a filename this contains the file name
entered in the normal form, FILE.EXT.VERSION
$FileS STRING - After parsing a filename this contains the file name
entered in the form FILE.EXT. It will contain device: and
<directory> if they are different from the connected device and
directory.
$FileV INTEGER - After parsing a filename this contains contains just
the generation number as an integer variable
$JobNo INTEGER - The number of the current job
$JsysOk INTEGER - Set to 1 when $Jsys succeeds, to 0 when it fails.
$LastErrCode INTEGER - The number of the last JSYS error
$LastError STRING - The text of the last JSYS error
$PromptEnb STRING - The standard enabled prompt string, may be changed.
$PromptEnbSub STRING - The standard enabled subcommand prompt string, may be
changed.
$PromptReg STRING - The standard prompt string, which may be changed if
the usual "@" is not suitable:
$PromptReg = "Tops20>";
$PromptSub STRING - The standard subcommand prompt string, may also be
changed.
$TermNumber INTEGER - The number of the controlling terminal
$TermWidth INTEGER - The terminal width of the controlling terminal.
$TermLength INTEGER - The terminal length of the controlling terminal.
$Time STRING - Current time in HH:MM:SS format.
$TType INTEGER - The terminal type index (GTTYP%) of the controlling
terminal.
$Typeahead_Count
INTEGER - The number of characters which have been typed-ahead
on the controlling terminal.
$User STRING - After parsing a user name with PARSE USER or USERLIST
this contains the current User Name parsed, (without angle
brackets "<...>"). (see page 10).
$UserName STRING - The user name of the current job
$Value INTEGER - Contains a number returned by a Parse: The number
typed in for a Number field, the value for a Keyword or Switch,
or the internal date and time for a DayTime.
$Xatom STRING - Contains the atom parsed by the last PARSE statement.
Note that when parsing a Filelist, DirectoryList or UserList,
this does not contain the whole field but only the last atom
actually parsed by the Comnd JSYS.
4.3. System Procedures
PCL provides pre-defined procedures. Some are typed procedures and therefore
may be used like variables in PCL statements. Others return their results in
parameters. In the following list of system procedures, if a procedure returns
a value then STRING or INTEGER precedes the description, otherwise we indicate
PROCEDURE. A simple procedure that does not return a value must be called:
$And (int1, int2)
INTEGER - Returns the bitwise AND of the integers int1 and
int2.
$Close (channel)
PROCEDURE - Closes the file that is open on Channel.
$CvItC (integer)
STRING - Returns the character whose value is equal the
Integer. This is useful for manipulating control characters.
$CvCtI (string) INTEGER - Converts the first character in String into an
integer. This is useful for control character manipulation.
$DirectoryInfo_I (directory, code)
INTEGER -
$DirectoryInfo_S (directory, code)
STRING - $DirectoryInfo_I and $DirectoryInfo_S return integer
or string information that may be obtained using the GTDIR or
GTDAL JSYS's (refer to the Tops 20 Monitor Calls Reference
Manual for more details). Directory is the directory name
(string). The CRDIR directory block layout is reproduced in
appendix II.
$DirectoryInfo_I returns an integer. It admits the following
values for Code:
$CDDFE default off-line expunge date and time (-- not
yet implemented in tops20 v5 --)
$CDDNE -- not yet implemented in tops20 v5 --
$CDDPT directory protection
$CDFPT default file protection
$CDLEN default on-line expiration date (-- not yet
implemented in Tops 20 V5 --)
$CDLIQ working disk quota
$CDLLD date last login
$CDLOQ permanent disk quota
$CDMOD directory mode word
$CDNUM directory number
$CDPRV capabilities word
$CDRET default number of generations to keep
$CDSDQ maximum number of subdirectories
$CDUSD Disk space used (as returned by the GTDAL Jsys,
and usually not correct under Tops20 V5).
$DirectoryInfo_S returns a string. It admits the following
values of Code:
$CDCUG subdirectory groups
$CDDAC default account string
$CDDGP directory groups
$CDPSW password string
$CDUGP user groups
The user/directory groups and the subdirectory groups are
returned as a string with all the group numbers separated by
commas. For example:
Presently there is no $DirectorySet function in PCL.
$Eof (channel) INTEGER - Set to -1 if a $READ reaches an end of file on
Channel, otherwise returns 0.
$ExpandTad (idate, year, month, day of month, day of week, hour, minute)
PROCEDURE - Converts the date and time held in internal format
in Idate into 6 integers representing the year, month, day of
month, day of week, hour and minute. The converse is done by
$MERGETAD.
$File_Dev (fil) STRING
$File_Dir (fil) STRING
$File_Nam (fil) STRING
$File_Typ (fil) STRING
$File_Gen (fil) STRING - $File_Dev through $File_Gen return the part of the
file name of Fil expressing respectively the Device, Directory,
Name, Type and Generation. Fil may be either $parse, or a
channel number, or a file name (see $FileInfo_S 8).
$FileInfo_I (fil, code)
INTEGER
$FileInfo_S (fil, code [,format])
STRING - $FileInfo_I and $FileInfo_S return information about
a file. The file is selected by Fil and the information to
return is selected by Code.
Fil may be:
$Parse the file currently being parsed by a PARSE FILE
or PARSE FILELIST,
a channel number
for a file currently opened by a call to $open,
a filename The filename is given as a string. If some
parts of the file name are omitted they default
to the connected device and directory, null
file type, and highest existing generation. The
name itself may not be defaulted.
$FileInfo_I returns an integer from the file FDB (File
Descriptor Block). For $FileInfo_I code is the index of the
word requested in the FDB (File Descriptor Block). See the
Tops20 Monitor Calls Reference Manual for details. Appendix I
gives the layout of the FDB. PCL constants are provided for
all permissible codes:
$FBADR disk address of file index block
$FileAddress idem
$FBBBT size file had when deleted from disk (in pages)
$FBBK0
$FBBYV file i/o information
$FBCNT count of read/write of the file
$FBCRE date last written either by user or system
("system" write date)
$FileCreation idem
$FBCRV creation date
$FBCTL control word
$FileControl idem
$FBFET off-line expiration date
$FBGEN generation and directory numbers
$FBNET on-line expiration date and time
$FBPRT file access codes
$FileProtection idem
$FBREF date last read
$FileRead idem
$FBSIZ number of bytes in file
$FileSize idem
$FBTDT date file was last written to tape (archiving)
$FBUSW user settable word
$FBWRT date last written by the user
$FileWrite idem
$FileInfo_S returns a string from information pointed to by the
FDB, or the result of a JFNS Jsys call, with specific
formatting bits given by Format (Refer to the Tops 20 Monitor
Call Reference Manual for details): The values of Code for
$FileInfo_S are either FDB offsets, or special values
requesting a specific function):
$FBACT file account
$FileAccount idem
$FBAUT file author
$Author idem
$FBFMT specifies that $FileInfo_s must return the
result of a JFNS Jsys, using the format bits
specified in Format. (An obsolete format of
$FileInfo_S specified that if code was an
integer greater than 63 the result was the
string returned by a JFNS Jsys with the
formatting parameter set to the field code
minus 64.)
$FBLWR last writer of file
$Writer idem
$FileSet allows to change the information read by $FileInfo_I
and $FileInfo_S.
$FileSet (fil, code, mask, value)
PROCEDURE - $FileSet allows to set the information contained in
the FDB (for a complete explanation of the File Descriptor
Block, refer to the Tops20 Monitor Calls Reference Manual).
Presently, features relating to the Archiving system are not
implemented.
Fil is selected as for $FileInfo: $Parse, or channel number, or
filename (see page 8).
Code defines which entry of the FDB we want to change.
Permissible values are the same as for $FileInfo (see page 8).
It is the FDB offset of the entry that we want to modify (see
the list of codes page 8, and appendix I for a description of
the FDB). If the entry is a pointer to a string, the
information to be changed is the string itself, not the
pointer.
Mask is an integer indicating the bit positions that we want to
change. It must contain ones in all positions to be changed. If
the information to be changed is a string, this argument is
ignored.
Value is either an integer or a string, depending on the
information to be changed.
$FileInfo_I and $FileInfo_S read the information that may be
changed with $FileSet.
Several fields of the FDB may not be changed, or only
with certain capabilities.
The information in the FDB that is modified by the ARCF
and SFTAD Jsys's is not currently changeable with
$FileSet.
$GetField (ival, pos, wid)
INTEGER - Returns the Wid bits found at bit positions Pos+1 to
Pos+Wid in ival (numbered 0..35 from right to left), stored
right justified in an integer and filled with zeroes to the
left. For example, $Getfield(ival,18,18) returns the left half
of ival. Ival, Pos and Wid are integers. See $SetField for
the reverse operation.
$InputTad (string)
INTEGER - Converts a string time and date into internal format.
The converse is done by $OutputTad.
$Integer (string [,radix])
INTEGER - Converts decimal number in string into an integer.
An optional second argument (integer) gives the radix to be
used (2 to 10). Returns 0 on an error.
$IsFile (fil) INTEGER - Returns 1 if the file specified by Fil exists,
otherwise returns 0. Fil is specified as for $FileInfo:
$Parse, or a channel number, or the file name.
$Length (string)
INTEGER - Returns the length of string
$MergeTad (year,month,day of month,hour,minute)
INTEGER - Returns the conversion to internal date and time
format of the date expressed by the five integers Year, Month,
Day of month, Hour, Minutes. The converse is done by
$ExpandTad.
$NextDirectory INTEGER - Used to step to the next directory when parsing a
DirectoryList or Directory with Wild turned on. Returns zero at
the end of the list, and nonzero otherwise. (see page 10).
$NextFile INTEGER - Used to step to the next file when parsing a FileList
or File with Wild turned on. Returns zero at the end of the
list, and nonzero otherwise.
$NextUser INTEGER - Used to step to the next User when parsing a UserList
or UserName with Wild turned on. Returns zero at the end of the
list, and nonzero otherwise. (see page 10).
$Open (string, mode)
INTEGER - Opens the file named in the string for I/O, in the
mode specified by the integer mode (either $Input, $Output, or
$Append). Returns the PCL channel number assigned, or zero if
the open could not be done.
$Or (int1,int2) INTEGER - Returns the bitwise OR of the integers int1 and int2.
$OutputTad (integer)
STRING - Convert internal date and time to string. The
converse is done by $InputTad.
$Read (channel) STRING - Reads a record from the file opened for input on
Channel.
$ReadBinary (max, string [,timeout])
STRING - Reads from the terminal, in binary, up to Max
characters or until the character specified in String is read.
This will time out and return an empty string if nothing is
typed within a second. The optional integer argument Timeout
can be used to provide the number of milliseconds to use for
the timeout period. This is useful for reading control
information transmitted by the VT100 terminal in response to
requests such as "send terminal model ID" and "send cursor
position."
$Search (string1, string2 [,start])
INTEGER - Searches the String1 for String2 and returns the
position in String1 of the first character of the first
occurence of String2. If not found, returns 0. The optional
integer argument Start gives the character position at which
the search starts.
$SearchRaised (string1, string2 [,integer])
INTEGER - Same as $SEARCH except lower case alphabetics are
raised to upper case.
$SetField (field, word, pos, wid)
INTEGER - Returns the integer Word with the rightmost Wid bits
of Field stored in the bit positions Pos+1 to Pos+wid (numbered
0..35 from right to left). For example:
I = $SETFIELD(123,8%777777777777,3,9)
returns 777777771237 (displayed in octal)
$String (integer [,radix])
STRING - Converts the integer into a string. Radix is
optional. It gives the radix to be used (2 to 10). If omitted
the integer is expressed in decimal. If the radix is other
than 10, the number is output as unsigned:
$Wait (integer) PROCEDURE - Waits the specified number of milliseconds, or
forever if zero.
$Write (channel,record)
PROCEDURE - Writes the string Record into the output file
opened on Channel.
4.4. System Procedures specific to $Jsys Interface, memory management
A JSYS interface is provided in PCL extended. It gives facilities to set/read
the registers, set/read argument blocks. The routines in this section should be
considered provisional; there will be changes for instance if vectors are
implemented.
$Get_Mem (size) INTEGER - Acquires Size words from dynamic memory (actually PCL
string space), and returns the address of the first word. When
referencing dynamic memory with $Iget, $Iput, $Sget and $Sput
the first word has index zero, not one. The memory is zeroed
before you get it.
$Ret_mem (address, size)
PROCEDURE - Frees the memory at Address. Size should be the
same as given when the memory was acquired by "address =
$get_mem (size)".
$Iput (value, address [,index [,count]])
PROCEDURE - Sets count words starting at Address+Index to the
integer Value. This is used to store integers in dynamic memory
acquired through $Get_Mem. Index starts at 0 and defaults to
0. Count defaults to 1.
$Iget (address, [,index])
INTEGER - Returns the value stored at Address+Index. Index is
expressed with zero base, and defaults to 0.
$Sput (string, address [,index [,charpos]])
PROCEDURE - Stores the asciz String starting at the character
in char position Charpos (counted from 0) in the word at
Address+Index (Note that Index starts at zero). If Charpos, or
both Charpos and Index, are omitted, they default to zero.
$Sget (address, [,index[,charpos]])
STRING - Returns the asciz string starting at the character in
position Charpos (counted from zero) in the word at
Address+Index. If Charpos, or both Charpos and Index are
omitted, they default to zero.
$Jfn (channel) INTEGER - If Channel is > 0 and a file is currently associated
with that channel ( see page 13), return the jfn associated
with it.
If Channel is < 0 return the Indexable File Handle associated
with the current parse: if the PARSE used the WILD option the
flag bits are returned in the left half, and the jfn in the
right half, otherwise only the JFN is returned.
$Jsys (jsys [,ac1 [,ac2 [,ac3[,ac4]]]])
INTEGER - Executes the jsys number Jsys with the contents of
the registers defined by the optional arguments Ac1 through
Ac4. Returns 1 for success, and 0 for failure. The success
indicator is also stored in the system variable $Jsysok. After
execution, the registers 1 through 4 are stored in the system
variables $Ac1 through $ac4.
$Jsys1 (jsys [,ac1 [,ac2 [,ac3[,ac4]]]])
PROCEDURE - Totally similar to $Jsys, except does not return a
value.
$Strloc (string)
INTEGER - Returns the actual memory address of a string primary
(ie a string constant or a string variable). This may not be
used with string expressions or with strings returned by a
system procedure:
mydir = $connectedDirectory;
i = $strloc (mydir); ! Is Legal
i = $strloc ($ConnectedDirectory); ! Is Wrong
5. USER INTERFACE
Parameters are often passed to commands from the terminal, just like normal
Exec commands. PCL allows the user to specify such parameter parsing using the
same monitor call as the Exec uses, so the user is able to write commands which
look like standard Exec commands.
When creating commands, it is easiest first to parse all the parameters and
to store them in appropriate variables, then to parse the end of the line to
allow the user to confirm the command, and only then to perform the actions
which comprise the command. It is possible, using the COMND% JSYS, to make
programs which parse a few arguments, do some irreversible action (such as
deleting a file), and then parse a few more arguments; such programs upset
users who, for instance, type ^U while entering those last parameters, since
the program has already deleted the file. PCL enforces and encourages the more
desirable mode of operation, in part by performing an assumed End-of-line Parse
before performing major actions such as DoCommand.
Command parsing is done a line at a time, where the user types a line and the
program parses it. This means that once a line has been confirmed with an End-
of-line Parse, no more fields can be parsed with the Parse statement, since
there is no command line to parse from. The Prompt statement can be used to
allow the user to enter another line to be parsed; see Prompt on page 47.
If a PCL command contains none of the three forms of command parsing, it is
built as if it started off with an End-of-line Parse.
The Complete description of the PARSE statement is given page 42.
5.1. Parse Formats
There are three ways to cause PCL to parse such parameters; in each case the
user specifies what type of parameter is expected, and PCL parses it from the
command line and delivers it to the PCL command.
5.1.1. Simple PARSE
The simple PARSE statement may be placed anywhere within the command.
COMMAND getarg;
BEGIN
INTEGER repeat_count;
...;
PARSE NUMBER;
repeat_count = $VALUE;
...;
PARSE EOL;
...
END
would parse for a number, store it in a variable for use, execute some more PCL
statements, and then parse for a carriage return. The PARSE statement would
store the value that the user entered in the system variable $VALUE.
5.1.2. Complex PARSE
The complex parse provides a way for one PARSE statement to parse for any one
of several parse types. The syntax of this form of PARSE looks very much like
the SELECT verb.
COMMAND CMPLX;
BEGIN
...;
PARSE
BEGIN
NUMBER: BEGIN ... END;
EOL : BEGIN ... END
END;
...
END
This would allow the user to enter either a number or a carriage return; the
corresponding statements (enclosed in BEGIN - END) would be executed depending
on which field type matched the user's input. In either case more information
would be available from variables like $VALUE.
5.1.3. Command Arguments
An easy way to specify the arguments is to use command arguments. These must
be specified in the command declaration (the statement with the keyword COMMAND
and the name of the command). The user specifies the type of parameter to be
parsed and the variable to store the result into (see page 24 for details).
The variable must not be declared later; the use in the command arguments
completely declares the variable.
COMMAND AllAtOnce (NUMBER:count);
BEGIN
!No INTEGER declaration necessary
DISPLAY $STRING(count)
END
5.2. Parse Options
In each of these 3 methods, the user may specify options to the parse type.
Parse options are enclosed in parentheses immediately after the parse type.
There are many options that the user can specify, e.g. the default value to
use if the user skips this parameter or a help message to type if the user
enters a question mark at the parameter. The parse options available vary with
the parse type.
COMMAND optn
BEGIN
...;
PARSE NUMBER (Help "Value of count", Default "2");
| | |
| ----> Parse options <----
--> Field type
...
END
If the user DECLARES this command and then types:
@optn ?
at the "@" prompt, the system will respond:
Value of count
as it would in any EXEC command. If the user skips the field by typing:
@optn<return>
at the "@" prompt or if the user uses ESCAPE to complete the command then the
PARSE will return the default value, in this case 2.
5.3. Parse Results
The results of each Parse are returned by PCL in several system variables:
$Xatom returns exactly the Atom parsed (i.e. what the user typed,
eventually completed by the user hitting the ESCape key). This
field is not correct for the parsing of field types FileList,
DirectoryList and Userlist.
$Command holds the text of the complete command up to the point reached
in the current parse.
$Value returns an integer result if necessary, for example after
parsing a number or a keyword (see page 42).
$Atom returns a string result if necessary, for example after parsing
a token (see page 42).
5.4. FILELIST
One powerful extension to PARSE is the FILELIST option. This allows the user
to parse for file names which may contain wild cards, be separated by commas,
or both. The name of the first file which matches the specification that the
user entered is returned in the system variables $FileL, $FileN, $FileS,
$FileV. Successive file names may be returned by using the $NEXTFILE system
service procedure: $NextFile returns zero when the list of files has been
exhausted, and returns nonzero otherwise.
COMMAND ALLFILES;
BEGIN
GUIDE "Files";
PARSE FILELIST;
DO
DISPLAY $FILEL
UNTIL $NEXTFILE EQL 0;
END
The user may type:
@allfiles ABC.*,XYZ%Y.*,A.Z
The first file that matches the specification of ABC.* will be returned. For
each call to $NEXTFILE the system will return file names that match the wild
cards until all that match ABC.* have been exhausted . Next, it will look for
files that match XYZ%Y.*. Finally, it will return the file name A.Z.
FILELIST may only be specified once per command and it may only be in a
simple parse.
Note that the same effect may be achieved by using the WILD option when
parsing a FILE field type, with the restriction that only one specification
(containing wildcards) may be given. In the above example, "PARSE FILELIST"
would be replaced by "PARSE (FILE (WILD))".
5.5. DIRECTORYLIST, USERLIST
DIRECTORYLIST and USERLIST are extensions allowing to parse lists of
Directories of lists of Users (login directories), using wildcard input in the
way of FILELIST. The successive Directories or Users are returned in the
variables $DIRECTORY and $USER . Successive directories or users are returned
by using the $NEXTDIRECTORY or $NEXTUSER integer system procedures. When the
list has been exhausted these return 0, otherwise they return nonzero.
COMMAND ALLUSERS;
BEGIN
PARSE USERLIST;
DO
DISPLAY $USER
UNTIL $NEXTUSER EQL 0;
END;
The user might type in:
@allusers info.1lic.*,info.2lic.*
or
@alldirectories <info.1lic.*>,<info.2lic.*>
Directory names must be given with the "<...>" (angle brackets), while user
names may not include them.
Only one of either DirectoryList or UserList may be specified per command,
and it must be in a simple parse.
Note also that a similar effect may be achieved by using the wild option when
parsing a field of type DIRECTORY or USERNAME. However, in this case, only one
specification with wildcards may be entered:
COMMAND ALLDIRECTORIES;
BEGIN
PARSE (DIRECTORY (WILD));
DO
DISPLAY $DIRECTORY;
UNTIL $NEXTDIRECTORY EQL 0;
END;
5.6. Parse error handling
Errors found during parsing are handled differently depending on which type
of parse was executed. In command arguments, the user can specify a label to
branch to by using the ERROR parse option. This is only available for command
arguments. The command will begin execution at that label if the user entered
something which was not legal for the specified parse type.
In simple parsing, the command is terminated and the standard error message
for that parse type is displayed at the terminal. In complex parsing, the user
may have an OTHERWISE parse option which will be executed if the parse fails.
COMMAND CMPLX;
BEGIN
...
PARSE BEGIN
NUMBER: BEGIN ... END;
EOL: BEGIN ... END;
OTHERWISE: BEGIN
Display "Error in parameter";
Exit
END
END;
...
END
6. PROGRAM AND COMMAND INTERFACE
6.1. Running Programs
The INVOKE PCL statement runs a program much like the EXEC run command does
now. The PCL command continues to execute when the program has started. If
the PCL routine exits, the program is left in a ^C state. INVOKE takes a
string argument which contains the name of the program to run. The TYPEIN PCL
statement "types" characters into the program. When a TYPEIN is executed, the
PCL command will wait until the program goes into terminal input wait. It will
then send the characters to the program and continue to execute PCL statements.
The GETTYPEOUT statement is used to return the data that the program would have
typed on the terminal, placing it in the string that the user specifies.
GETTYPEOUT will get all characters since the INVOKE or since the last
GETTYPEOUT. The PASSOUTPUT option to the INVOKE statement causes all of the
data from the program to go to the controlling terminal. The CLEARTYPEOUT
command will throw away all the program type out that has accumulated. This
may be used in place of a GETTYPEOUT to get rid of unwanted startup messages
from programs.
COMMAND prog;
BEGIN
STRING prog_data;
...;
INVOKE "payrol.exe";
CLEARTYPEOUT;
TYPEIN $DATE; $DATE is a system service
GETTYPEOUT prog_data;
DISPLAY prog_data;
...
END
6.2. Executing EXEC Commands
The DOCOMMAND PCL statement takes a string argument and performs the EXEC
command that is in the string.
COMMAND whome;
DOCOMMAND "systat " + $UserName;
After typing whome at the "@" prompt the user would see:
Job Line Program User
30* 44 SYSTAT JS5A
at the terminal. The output from the command is displayed on the terminal
unless the optional TO parameter is specified. In this case the type out from
the command is placed in a string specified by the user:
DOCOMMAND "systat all" TO exec_string
To execute a command and ignore the output, do:
DOCOMMAND command TO $NUL;
7. INPUT/OUTPUT
PCL provides simple file manipulation facilities. Up to 36 files may be
opened in input, output, or append mode. Only record level reads and writes
are possible. A record is terminated by a carriage return/line feed pair. The
$OPEN system service takes the name of the file and whether it is to be opened
for input, output, or append access. $OPEN returns the PCL channel number to
be associated with the file. If the file does not exist and you open it for
Input, $open returns 0 for the channel number; otherwise the channel is a
positive integer.
channel = $OPEN("mail.txt",$INPUT)
The string procedure $READ takes a channel number as argument and returns the
next record in the file. $WRITE takes a channel number as the first argument
and a string as the second argument, and writes the string to the file.
The user may test for end of file by calling the $EOF system procedure. If a
$READ reaches the end of file, then $EOF will return -1, otherwise it returns
zero. $EOF takes the channel number of the file as an argument.
Files may be closed with the $CLOSE call. $CLOSE takes the channel number of
the file to close. It may not be necessary to close files open for input, as
they will be closed automatically at the end of the PCL command.
8. REFERENCE
EXPRESSIONS
8.1. EXPRESSIONS
Expressions are the fundamental arithmetic, string, and logical entities of
the PCL language.
8.1.1. Integer expressions
Integer expressions are composed of integer constants, integer variables, and
integer procedure calls, operated on by arithmetic operators. PCL has the
usual operators for addition, subtraction, multiplication, and division, with
the usual precedence rules, and allowing the use of parentheses to add to the
default precedence.
count*(shift+1) + offset(commandstring)
8.1.2. String expressions
String expressions and likewise composed of string variables, string
constants, and string procedure calls, operated on by operators. The string
operators are concatenation (indicated by the "+" symbol) and substring
extraction (indicated by square brackets). Concatenation takes two strings and
generates a new string from them. Substring extraction looks like
substring = str[start:count]
where start is the location of the first character to extract, and count is the
number of characters to extract. An asterisk can be used for the count to
extract to the end of the string.
8.1.3. Logical expressions
Logical expressions are only used to control conditional statements; there
are no logical variables. Logical expressions are generated from typed
variables, constants, or procedure calls (either integer or string), compared
with relational operators: "<", "<=", "=", "<>", ">=", and ">". The
relationals "lss", "leq", "eql", "neq", "geq" and "gtr" may be used
alternatively.
if my_dir eql $connectedDirectory
...
if count <= 20
...
STATEMENTS
8.2. STATEMENTS
Statements are the fundamental execution entities of the PCL language. They
may be grouped together to form a compound statement, by enclosing them in a
BEGIN/END pair, and separating them by semicolons. Anywhere that the
documentation for a statement says that a statement may be used, a compound
statement may be used just as well.
IF i EQL 0
THEN
BEGIN
j=6;
k=10
END
ELSE
j=0
Braces may be substituted for BEGIN ... END:
if i eql 0 then {
begin
j=6;
k=10
}
else
j=0
PCL FILES
8.3. PCL files
A PCL file contains PCL declarations for commands, procedures and variables,
as well as PCL statements like NOORIGINAL and SYNONYM. PCL files are compiled
using the Exec DECLARE PCL-ROUTINES command.
The structure of a PCL file is:
declaration [; declaration ...]
where:
declaration is:
command-declaration or
procedure-declaration or
variable-declaration or
NOORIGINAL command or
SYNONYM command
A command declaration declares a PCL command. It is described in 8.10, page
24. Within a command declaration, we find declarations of local variables and
the code to execute the command.
A procedure declaration declares a PCL procedure for use by other PCL
commands and procedures (see page 46). Its contents are similar to those of a
command.
A variable declaration declares global PCL variables, either integers or
strings. These variables will be available to all PCL commands and procedures,
with the EXTERNAL declaration.
The NOORIGINAL command removes an original Exec command (see page 40).
The SYNONYM command declares a synonym to an existing command (see page 52).
ABORT
8.4. ABORT
Function
The ABORT PCL statement will abort a PCL execution with an error message
typed to the user.
Format
ABORT string
Notes
1. The string error message will be typed on the terminal, preceded by
"?".
Example
COMMAND ohdear;
BEGIN
...;
IF $LENGTH(input_line) > 120 then ABORT "Line too long";
...
END
Related
EXIT - page 29
RETURN - page 48
ASSIGNMENT
8.5. ASSIGNMENT
Function
The assignment statement generates a value and deposits it in a variable.
Format
variable name = expression
Notes
1. The expression must be either integer or string, depending on the
type of the variable.
Example
COMMAND look;
BEGIN
...;
target_user = $Atom;
...
END
Related
Expressions - page 15
BEGIN - END
8.6. BEGIN - END
Function
BEGIN is paired with an END to group several PCL statements into one
statement.
Format
BEGIN
PCL statement;
...
END
or
{ PCL statement;
...
}
Notes
1. Every BEGIN must have a corresponding END.
2. A BEGIN/END pair may enclose any number of PCL statements. Anywhere
a PCL statement is called for, a BEGIN/END grouping may be
substituted.
3. It is not necessary to have a semicolon following the final PCL
statement before the END. If present, a null statement is formed
which will not affect the execution of the PCL command.
4. Begin...End may be replaced by {...}.
Example
If $JOBNO > 6 then BEGIN
Display "Job number greater than 6";
A = 5;
name = "Scott";
END
Related
CALL
8.7. CALL
Function
The CALL PCL statement will call a previously declared procedure.
Format
CALL procedure [ (arguments) ]
arguments is:
parameter1 [ ,parameter2... ]
parameter is:
integer-expression or
string expression
Notes
1. CALL may call system procedures or user declared procedures.
2. If the procedure expects arguments they must be provided in the
call.
3. Note that typed procedures are not exactly referenced using the same
form without the call.
4. Arguments are expressions, either integer or string as expected by
the called procedure. Those arguments which are to be modified by
the procedure must be simple variables.
5. Parameters are always passed by reference; all accesses made by the
called procedure are actually made to the caller's variables.
Example
COMMAND a_rtn;
BEGIN
EXTERNAL PROCEDURE match;
EXTERNAL INTEGER PROCEDURE drop;
...
IF drop ("abc") eql 1 then
CALL match ("abc");
...
END
Related
EXTERNAL - page 30
PROCEDURE - page 46
CASE
8.8. CASE
Function
The CASE statement provides an orderly way of choosing one of several paths
to take based on the current value of an integer expression. The statement
tagged with the current value is executed, and all others are ignored.
Format
CASE integer_expression FROM low TO high OF BEGIN
test : PCL-statement;
test : PCL-statement;
...
END;
low, high are:
integer constants
test is:
tag1 [ ,tag2 ... ]
tag is:
constant or
constant1 TO constant2 or
INRANGE or
OUTRANGE
Notes
1. The integer expression is tested against each test for a match
against any of the tags expressed in it. When a match is found, the
statement corresponding to the test is executed. The FROM and TO
keywords precede integers defining the lowest and highest
permissible value of the expression. If the expression is outside
the limits and an OUTRANGE tag was specified, the statement labelled
by the OUTRANGE tag is executed. If the expression is outside the
limits and no OUTRANGE tag was specified, PCL issues an error.
2. After a sucessful match, and execution of the corresponding code,
execution proceeds after the CASE.
3. The INRANGE keyword indicates that the tagged statement is to be
executed if the integer expression is within the range allowed, but
is not explicitly provided for by any of the other integer constant
tags. The INRANGE tag must be the last in the list.
4. If the integer expression is within the FROM-TO limits, but there is
no statement tagged with that value, and there is no INRANGE tag,
then nothing is done and execution continues with the statement
following the CASE.
5. The CASE statement should be used when the values to be tested are
very thightly packed (eg most numbers between 1 and 10). It should
never be used to test on a wide range like 1,2,100 (Use a Select
Instead).
6. The CASE tests against integer constants. For testing agains values
that are known only when executing the command or against strings
use SELECT or SELECTALL.
Example
...
CASE $Value FROM 1 to 7 OF BEGIN
1 TO 3, 5 : {executed if $value
is between 1 and 3, or 5};
6,9 : {executed if $value is 6 or 9};
INRANGE : {executed if $value is 4, 7, 8 or 10}
END;
field-type, options:
are defined as for PARSE (see page 42,
and page 43)
declarations is:
type name1,name2,...;
Declaring Local variables
EXTERNAL type name1, name2,...;
Declaring Global variables that will be used.
EXTERNAL [ type ] PROCEDURE name1, name2,...;
Declaring external procedures that will be called.
...
type is:
INTEGER or
STRING
Notes
1. The COMMAND keyword must be the first word in a command definition.
2. Format 2 allows to declare local variables, references to global
variables, and references to other PCL procedures.
3. The command will be called name. It may contain any alphanumeric
characters, including the underscore which will be converted to a
hyphen when it is entered into the Exec's command table.
4. The commands arguments are optional. If given, the parameters to the
command are specified on the command declaration line, avoiding the
use of PARSE. The command may not do any explicit PARSE statement
unless it uses subcommands with PROMPT (see page 47). For each
field parsed, the variable associated with the command is
automatically declared INTEGER or STRING and is set to $VALUE or
$Atom, depending on the type of field parsed:
integer for KEYWORD, NUMBER, SWITCH
string for INPUTFILE, OUTPUTFILE, FILE, FIELD, DIRECTORY,
USERNAME, DEVICE, TEXT, DAYTIME, QUOTEDSTRING,
TOKEN, NODE.
5. For example:
COMMAND TRY (NOISE "Number";
NUMBER (Default "10") : number);
begin
display $string(number);
end;
6. More than one command declaration may appear in a source file.
Example
COMMAND newone;
...
COMMAND more (number:job_val;text:entry_type);
...
Related
PROCEDURE - page 46
PROMPT - page 47
DECLARE
8.11. DECLARE
Function
EXEC command to merge user written commands, procedures, or variables into
the EXEC.
Format
@DECLARE (for PCL) [ cfm ] option
cfm is:
/Confirm or
/NoConfirm
option is:
ENVIRONMENT (from file) FileName1 [ ,filename2 ... ] or
INTEGER-VARIABLE (named) integer-name or
PCL-ROUTINES (from file) FileName1 [ ,filename2 ... ] or
STRING-VARIABLE (named) string-name or
SYNONYM (to new name) new-name
(to old command named) command-name
Notes
1. The DECLARE command will confirm its action with a message typed to
the user's terminal. The user may alter this default on a permanent
basis with a SET DEFAULT command. To override the default or the
SET status the user may specify the Confirm or NoConfirm switches.
2. To DECLARE PCL routines the source files are specified by a list of
files specification separated by commas, each specification may
contain wildcards. Each file specified is read, compiled into an
internal format, and stored in the EXEC. The source file may
contain any combination of procedures, commands, and variable
declarations. If the user does not specify any file name then the
source input is read from the terminal. For procedures which will
be used often, the EXEC environment should be saved using the
ENVIRONMENT option of the Exec @PRESERVE command. This environment
may then be recalled with the DECLARE ENVIRONMENT command. The user
may declare a command with the same name as a predefined command.
If the user wishes to execute the predefined command then the
ORIGINAL command should be used.
3. The PCL environment is the entire collection of user defined
objects, which must have unique names. This includes commands and
variables. The user may save the PCL environment at any time using
the exec PRESERVE command. To re-establish a previous environment
use the ENVIRONMENT option of the DECLARE command. The environments
to DECLARE are specified by a list of file specifications, each
specification may contain wild cards. The default file name is
EXEC.ENV. The requested environments are merged into the existing
environment so all commands and variables already declared will
remain.
4. The INTEGER-VARIABLE and STRING-VARIABLE options to the DECLARE
command will create variables in the EXEC which may be referenced by
user written commands or procedures. This provides a mechanism for
one command to pass data to another command or for one global value
that many commands may reference. These variables may be assigned
values by using the SET (see page 51) command if at the EXEC level
or by a simple assignment statement if in a command. The user may
view the current value of these global variables by using the
INFORMATION VARIABLE command.
5. The SYNONYM option declares a synonym name to an existing command
(Exec or PCL) .
INFORMATION - page 35
ORIGINAL - page 41
SAVE - page 45
SET - page 51
UNDECLARE - page 54
DISPLAY
8.12. DISPLAY
Function
The DISPLAY PCL statement will type its argument on the terminal.
Format
DISPLAY [ option ] expression
option is:
NORETURN or
BINARY
expression is:
an integer or string expression
Notes
1. By default, DISPLAY will type out the string or number in ordinary
character mode with a carriage return added.
2. The NORETURN option will not type out the carriage return.
3. The BINARY option is used to display without any character
conversion. This is useful for controlling display or graphics
terminals. It will not add a carriage return to the string.
4. To concatenate strings and numbers in DISPLAY use the $String
procedure:
COMMAND showoff;
BEGIN
STRING status;
INTEGER value;
...;
DISPLAY "starting";
...;
DISPLAY "Status : " + status;
...
DISPLAY value * 37;
...;
DISPLAY BINARY "$H$J";
...
END
DO
8.13. DO
Function
The DO PCL statement provides loop control within PCL commands.
Format
Format 1.
DO PCL statement WHILE logical expression
Format 2.
DO PCL statement UNTIL logical expression
Notes
1. PCL statement may be any legal PCL statement or a BEGIN/END grouping
of PCL statements.
2. Format 1 will loop as long as the logical expression is true.
Presumably some statement in the PCL statement will alter something
that is being tested in the logical expression. Otherwise the DO
may loop forever. There is no ENDLOOP or ESCAPE command. The user
may wish to GOTO out of the loop but this is not recommended.
3. Format 2 will loop as long as the logical expression is false. Once
the test becomes true the loop terminates.
4. Both formats will execute at least once. The logical expressions
are not checked until after the PCL statements have been executed.
Example
command DoWhile;
begin integer i;
i = 5;
DO begin display $string(i);i = i - 1 end WHILE i > 0;
end
Execution:
@DoWhile
5
4
3
2
1
Related
WHILE - page 56
UNTIL - page 55
DOCOMMAND
8.14. DOCOMMAND
Function
The DOCOMMAND PCL statement passes commands to the EXEC.
Format
DOCOMMAND [ ORIGINAL ] string1 [ TO string2 ]
Notes
1. The optional keyword ORIGINAL causes the DOCOMMAND to execute the
EXEC's original definition of a command and not the user's declared
command.
2. Normally, Docommand types the results of the command on the
terminal.
3. If the optional TO string2 is specified docommand places the results
of the command in String2. The output will be formatted as if the
Exec were typing to a terminal with a width of zero, since this is
most easily parsed by programs.
4. A carriage return will be added to the end of the string containing
the command.
5. The DoCommand statement can be abbreviated DCM .
6. A Docommand terminates any PARSE currently in progress. The best
rule is not to use any Docommand before a PARSE EOL has been
executed.
Example
COMMAND bigeez;
DOCOMMAND "vdir,
larger 100
"
EXIT
8.15. EXIT
Function
The EXIT PCL statement will cause the PCL command to return to the EXEC.
Format
EXIT [ option ]
option is:
SAVE or
TOPROGRAM
Notes
1. EXIT will always go back to the EXEC even if executed within a
procedure.
2. If the PCL command executes to the END of the command, an EXIT will
be simulated.
3. It is permissible to have more than one exit in a PCL command or
procedure.
4. When a PCL command exits, any invoked programs are killed during the
cleanup. The SAVE option will prevent the invoked program from
being killed, and leaves it as if a ^C had been typed.
5. The TOPROGRAM option acts as if the command was exited totally and a
@continue was typed to the Exec for the invoked program.
Example
COMMAND checkvalue;
BEGIN
INTEGER count;
...;
IF count > 6 THEN EXIT;
...;
EXIT
END
8.16. EXTERNAL
Function
The EXTERNAL PCL statement allows commands to use externally defined
procedures and global variables.
Format
EXTERNAL type name1 [ ,name2 ... ] or
EXTERNAL [ type ] PROCEDURE name1 [ ,name2 ... ]
type is:
INTEGER or
STRING
Notes
1. The "EXTERNAL type name" form allows a PCL command or procedure to
reference global variables (defined by INTEGER or STRING in a PCL
source file, or by the Exec @Declare command).
2. The "EXTERNAL [type] PROCEDURE name" form allows a PCL command or
procedure to reference externally defined procedures (typed or
untyped). If the type is not specified the procedure is referenced
by "CALL name", otherwise its name may be used as a variable name.
Example
COMMAND outside;
BEGIN
INTEGER int;
EXTERNAL STRING message;
EXTERNAL INTEGER PROCEDURE finger;
EXTERNAL PROCEDURE mark;
...
display message;
int = finger;
call mark;
...
END
8.17. GETTYPEOUT
Function
The PCL statement GETTYPEOUT will place the terminal output from an invoked
program into a string.
Format
GETTYPEOUT string
Notes
1. When a GETTYPEOUT statement is executed, PCL will gather all
terminal output from the invoked program since the INVOKE or since
the last GETTYPEOUT and put it in the string. When the invoked
program goes into terminal input wait, the GETTYPEOUT will return
with the type out in the string.
2. A CLEARTYPEOUT PCL statement is more efficient that doing a
GETTYPEOUT and then not using the returned data.
Example
COMMAND runprog (text (help "program to run"):prog_to_run);
BEGIN
STRING program_text;
...;
INVOKE prog_to_run;
...;
GETTYPEOUT program_text;
...
END
8.18. GOTO
Function
The GOTO statement alters the flow of execution of PCL. It causes execution
to jump directly to a labeled statement (see page 4). Its use should be
minimized because of the great possibility of confusion, but at times it may be
essential.
Format
GOTO label
Notes
1. The label must be defined somewhere in the command or procedure.
Example
COMMAND xfer;
BEGIN
...;
loop1:
...;
GOTO loop1;
...
END
Related
PCL Labels - see page 4
GUIDE
8.19. GUIDE
Function
The GUIDE statement can be used in conjunction with the PARSE statement to
provide a pleasing user interface. It tells the system that a particular guide
word is to be displayed if the user requests it by hitting the Escape key. It
is equivalent to PARSE NOISE.
Format
GUIDE string-constant
Notes
1. The GUIDE statement has the same restrictions as the PARSE
statement: It can not be used except where a command line is being
parsed.
2. The GUIDE statement is actually a PARSE statement with the NOISE
field-type.
Example
GUIDE "Input File";
PARSE FILE (INPUT);
Related
PARSE - page 42
IF ... ELSE
8.20. IF ... ELSE
Function
IF ... ELSE provides the conditional execution of PCL statements depending on
testing integer or string expressions.
Format
IF logical-expression THEN
PCL-statement
[ ELSE
PCL-statement ]
Notes
1. If the expression is true then the statement after THEN is executed;
otherwise the ELSE statement is executed.
2. The ELSE part is optional. If omitted it corresponds to a Null ELSE
(ie if the test fails then nothing is executed).
3. IF ... ELSE may be cascaded (although CASE or SELECT might be more
appropriate if the cascade is lengthy).
Example
IF $value < 10 then display "less than 10"
ELSE IF $value <100 then display "more than 9 but less than 100"
ELSE display "More than 99";
Related
CASE - page 22
SELECT - page 49
SELECTALL - page 50
INFORMATION
8.21. INFORMATION
Function
New options to the EXEC INFORMATION command give information about the
current PCL environment.
Format
INFORMATION (About) DEFAULTS (For) DECLARE
INFORMATION (About) PCL-OBJECTS
INFORMATION (About) VARIABLE string
Notes
1. The DEFAULTS DECLARE option lists the defaults for the DECLARE
command. The defaults for the DECLARE command are also listed by
INFORMATION DEFAULTS ALL.
2. The PCL-OBJECTS option lists the names of all the commands,
procedures, and variables that are currently declared in the user's
EXEC. This provides a way for the user to see exactly what commands
have been established and avoid any confusion about redefined
commands.
3. The VARIABLE option will display the current value of a string or
integer variable which was declared by the DECLARE STRING-VARIABLE
or the DECLARE INTEGER-VARIABLE commands. It does not display
values for variables declared inside commands or procedures.
Example
@INFORMATION (ABOUT) PCL
Commands: DRP, REMIND, NETMAILCHECK, DIALUPLINE, COURIER
Procedures: MATCH
Variables: String MESSAGE
@
@set string message (TO) grades are due today
@info var message
grades are due today
8.22. INTEGER - STRING
Function
The INTEGER (STRING) statement declares variables to be of type integer
(String). If inside a command it defines it as a variable local to the
procedure; otherwise it defines a global variable.
Format
1. In PCL every variable must be declared by a type statement.
2. If a global variable is referenced in a command or procedure it must
be declared with an EXTERNAL statement.
Example
INTEGER today,tomorrow; ! dates in internal format
STRING mydir; ! current directory
Related
EXTERNAL - page 30
INVOKE
8.23. INVOKE
Function
The PCL statement INVOKE will start a program running in a lower fork. This
provides the program with only a simple form of terminal I/O; it is possible to
make programs which expect more advanced terminal control than PCL can provide.
Format
INVOKE [PASSOUTPUT] string
Notes
1. INVOKE should be used when the user wishes to control the type in
and type out of the invoked program.
2. After PCL starts the program, it waits for the program to either
halt or wait for terminal input.
3. If the PCL command exits before the program completes, the invoked
program will be left in a ^C state.
4. Data may be sent to the invoked program using the TYPEIN command.
Type out from the program may be retrieved with the GETTYPEOUT
command.
5. If the PASSOUTPUT option is used all output from the program is sent
directly to the terminal. This eliminates the need to do a
GETTYPEOUT and a DISPLAY.
6. The PASSOUTPUT option can be abbreviated PASO.
Example
COMMAND runprog (text (help "program to run"):prog_to_run);
BEGIN
...;
INVOKE prog_to_run;
...
END
8.25. NOP
Function
The NOP statement performs exactly Nothing.
Format
NOP
Notes
1. NOP may be used to clarify the intent of a procedure.
Example
CASE $value FROM 1 TO 6 OF BEGIN
1 TO 3 : {some code};
4 : NOP; !If 4, do exactly nothing
INRANGE : {code if 5 or 6};
END;
Related
NOORIGINAL
8.26. NOORIGINAL
Function
The NOORIGINAL PCL statement undeclares an original exec command.
Format
NOORIGINAL command-name
Notes
1. This command is placed in PCL source files, but may not be used
inside a command or procedure. Its use is equivalent to the Exec
"@UNDECLARE ORIGINAL-COMMAND" command.
2. The command thus undeclared does not appear when querying the
available commands with "?" but it may still be invoked with the
"@ORIGINAL" Exec command (see page 41).
Example
NOORIGINAL ARCHIVE;
Related
UNDECLARE - page 54
ORIGINAL
8.27. ORIGINAL
Function
The Exec @Original command allows to run an original command even if PCL has
defined an other command by the same name, or if it has been undeclared by the
Exec "@UNDECLARE ORIGINAL-COMMAND" command or by the PCL "NOORIGINAL"
declaration.
Format
8.28. PARSE
Function
The PARSE PCL statement is used to read command input parameters from the
terminal. Specific types of parameters may be requested such as numbers or
input file specifications. Refer to the parse introduction page 10 for an
introduction to the working of PARSE.
Format
Format 1.
PARSE field-type [ (field-option; ... ) ]
Format 2.
PARSE
BEGIN
field-type [ (field-option; ... ) ] [ : PCL statement ];
field-type [ (field-option; ... ) ] [ : PCL statement ];
. . .
END
field-type is:
the type of atom parsed, cfr infra
field-option is:
options modifying the parse, cfr infra
Format 1 is called a simple parse. Format 2 is a complex parse,
allowing to parse one of several possible field types.
Example
COMMAND getinfo;
BEGIN
STRING type_in;
PARSE text;
type_in = $ATOM;
DISPLAY "You entered>> " + type_in;
PARSE EOL;
...
END
COMMAND choice;
BEGIN
STRING a_user; INTEGER the_job;
PARSE BEGIN
username :
BEGIN
a_user = $ATOM;
DOCOMMAND "systat " + a_user
END;
number :
BEGIN
the_job = $VALUE;
DOCOMMAND "systat " + $string(the_job)
END
END
;
...
END
To the user, the above command choice would look like:
@decl pcl choice
[Command CHOICE defined]
@
@choice ? user name
or decimal number
@choice te04
14 42 EMACS TE04
@choice 10
10 13 OPR IO00
@
The following command defines a keyword to be parsed.
COMMAND keywd;
BEGIN
...;
PARSE KEYWORD ( WORDS("day":1, "week":2, "year":3) );
...
END
To the user, the keywd command would look like:
@keywd ? one of the following:
DAY WEEK YEAR
@keywd day
Notes
1. The parse field types are a subset of the COMND JSYS Function codes
for the expected field to be parsed. For a complete description of
the actions of these fields, see their corresponding description in
the TOPS-20 MONITOR CALLS manual. The legal field types are listed
page 42.
2. The last atom typed by the user is returned in $xatom (except for
FileList, DirectoryList and UserList). The complete command up to
the last atom parsed is in $command.
3. The values for NUMBER, the integer-constant in a KEYWORD or SWITCH
(see below), and the internal date and time for DAYTIME are returned
in $VALUE.
4. The value for file parses is returned in system variables $Parse
(see page 7), and $filen, $FileL, $FileS and $FileV (see page 7).
5. The text typed in for NUMBER, FIELD, DEVICE, TEXT, TOKEN,
QUOTEDSTRING, DIRECTORY, USERNAME, KEYWORD, SWITCH, and NODE is
returned in $ATOM.
6. Each Field type may have optional Field Options enclosed in
parentheses and separated by commas. These options modify or extend
the parse type of the field; they are closely Related to the COMAND
JSYS. The parse field options are described page 43.
7. PARSE takes care of re-parsing and redisplay if the user corrects
the command line. The PCL author should code the command as though
the user will never make a mistake or change what was typed in.
8. Once an EOL has been parsed, no more PARSE statements may be
executed without first doing a PROMPT statement to reinitialize the
parsing system. Reparsing will occur only back to the last executed
prompt statement.
9. A DoCommand statement generates an implicit Parse EOL statement, to
require that commands first parse their parameters and then perform
their actions. Subsequent PARSE must thus be preceded by a PROMPT.
If you fail to follow this rule, stange failures may happen,
including falling back in the standard exec if you delete too far
back, etc.
10. The GUIDE statement is equivalent to PARSE NOISE;
8.28.1. Parse Field Types
The legal parse field types are:
COMMA parses a comma. Spaces may appear on either side of the comma.
DAYTIME inputs a date and time field. The format is any general
date/time format. Both date and time must be entered unless
the date or time parse options are specified. The date is
returned in internal form in $Value, and in expanded form in
$atom.
DEVICE parses a device name, including the closing ":". Returned in
$atom (without the closing ":").
DIRECTORY parses a directory name, including the angle brackets.
Returned in $atom, fully expanded as device:<directory>.
DIRECTORYLIST allows the user to enter a list of directories separated by
commas. Each directory specification may contain wildcards. The
$NEXTDIRECTORY system procedure allows to loop through the list
of directories matching the list. The current directory name is
returned in the $Directory system variable. (See page 10). The
system variable $xatom does not work for this field type.
EOL is used to parse a carriage return. If the user is doing simple
parses then the command will continue to execute after each
parse. Once a PARSE EOL has been executed the PCL command
cannot do any more PARSE statements. See the PROMPT PCL
statement on page 47. It is not necessary, nor is it
permitted, to specify a EOL when using command arguments.
FIELD parses an arbitrary parameter delimited by a nonalphanumeric
character. No standard help message is available. (See the
HELP field option, page 43). Returned in $atom.
FILE is more general than INPUTFILE and OUTPUTFILE (cfr infra).
This field type has many more options available. Defaults may
be specified for any of the file specification fields. The
user may specify that the field is to be "parse only" which
merely checks for a valid file specification. (See field
options DEFAULT_DEV, DEFAULT_DIR, DEFAULT_EXT, DEFAULT_GEN,
DEFAULT_NAM, INPUT, OUTPUT, and WILD.) It is not possible to
have more than one FILE field in a single Parse statement. The
file name is returned under various forms in the $File* system
variables (see page 7) and $parse (see page 7).
FILELIST allows the user to enter a list of files separated by commas.
Each file specification may contain wildcards. The $NEXTFILE
system procedure allows to loop through the files that match
the list. The current file is returned in the same way as for
the FILE field type (cfr supra). The system variable $xatom
does not work for this field type.
INPUTFILE allows the user to specify a file that already exists. This
field type does not allow any fields of the file specification
to be defaulted. (See FILE and FILELIST field types. The file
is returned in the same way as for the FILE field type (cfr
supra).
KEYWORD allows a list of keywords to be specified. The user may select
one of the keywords in the list. The list is defined by using
the WORDS field option (see page 43). The keyword string is
returned in $atom, and the value associated with it is returned
in $value.
NODE parses a network node name. This must be an available node,
unless the PARSEONLY option is specified. Returned in $atom.
NOISE string-constant
mostly used for command arguments. This field type will cause
the text in the string to be typed out in parentheses if the
user types an escape. The command GUIDE "text" is equivalent to
PARSE NOISE "text".
NUMBER parses an integer input field. The RADIX field option allows
for numbers in some radix other than 10 (see page 43). The
value is returned in $value, and the string in $atom.
OTHERWISE is a special field-type which is meaningful only in the complex
Parse (see page 10). If specified, it must be the last field
in the Parse statement. The Otherwise case will be taken if
the input available matches none of the field types provided.
The otherwise field type does not consume any of the input; it
only indicates that it was not recognizable.
OUTPUTFILE causes the system to parse for a file name that does not exist.
This field type does not allow any fields of the file
specification to be defaulted. Wild cards may not be
specified. The file is returned in the same way as for the
FILE field type (cfr supra).
QUOTEDSTRING parses a field contained in double quotes. The field is
returned in $ATOM without the quotes.
SWITCH is similar to KEYWORD except that a list of switches (i.e.
KEYWORDS preceded by a slash) is parsed. The list is defined
by using the WORDS field option (see page 43). The switch
string is returned in $atom, and the associated value in
$value.
TEXT parses all the input up to the carriage return. Returned in
$ATOM.
TOKEN string-constant
parses a field that exactly matches the string. Returned in
$atom.
USERLIST allows the user to enter a list of directories separated by
commas. Each user specification may contain wildcards. The
$NEXTUSER system procedure allows to loop through the list of
users matching the list. The current user name is returned in
the $USER system variable. (See page 10). The system variable
$xatom does not work for this field type.
USERNAME parses a username (without angle brackets). Returned in $atom.
8.28.2. Parse Field Options
The Field options directly related to parsing file names (File, InputFile,
OutputFile, and FileList) are:
DEFAULT_DEV string
For FILE and FILELIST fields, specify the default device. The
string may be a string constant or a user string variable. It
may not include the field delimiters (: for device, <..> for
the directory, etc). The string given may not be a string
expression (eg formed by concatenation), nor a string system
variable:
DEFAULT_DIR string
For FILE and FILELIST fields, specify the default directory.
The allowed forms of String are the same as for Default_dev.
DEFAULT_NAM string
For FILE and FILELIST fields, specify the default file name.
The allowed forms of String are the same as for Default_dev.
DEFAULT_EXT string
For FILE and FILELIST fields, specify the default extension.
The allowed forms of String are the same as for Default_dev.
DEFAULT_GEN code
For FILE and FILELIST fields, specify the default generation.
The codes are 0 (highest generation), + (next generation), -
(first generation), * (all generations), or a generation
number:
DELETED For field types FILE and FILELIST, parses for a deleted file.
Turns on COMAND JSYS bit GJ%DEL.
INPUT For field types FILE and FILELIST, parses for an existing file.
Turns on COMAND JSYS bit GJ%OLD.
INVISIBLE For field types FILE and FILELIST, parses for an invisible
file. Turns on COMAND JSYS bit GJ%IIN.
OUTPUT For field types FILE and FILELIST, parses for a new file.
Turns on COMAND JSYS bit GJ%FOU.
PARSEONLY For file parses, allows the command to parse for a validly
formatted file specification without requiring that the file
actually exist. For Node parses, allows the node not to exist;
similarly for Device, Directory, and User. The string that the
user enters for this field will be returned in $ATOM.
WILD For FILE field type, allows the user to specify a wild card.
This allows to step through the files matching the
specification in the same way as for a FILELIST. See the
FILELIST field option for the most general file wild card
parsing method.
The Fields options not directly related to file name parsing are:
DATE Parse only the date for field type DAYTIME.
DEFAULT string Specifies that the field may be skipped and that the default
value should be string. String may be either a string constant
or a user string variable. It may not be a string expression
(eg formed by concatenation) nor a string PCL variable (like
$ConnectedDirectory).
ERROR For command arguments only, branch to label on a parse error.
In complex parse use the OTHERWISE field-type.
HELP string If the user enters a ? at the field prompt, the help message in
string is displayed. String may be either a string constant or
a user string variable. It may not be a string expression (eg
formed by concatenation) nor a string PCL variable (like
$ConnectedDirectory). By default the use of this option turns
off the system default help. If you wish to append the default
help message, give the STDHELP option after the HELP option:
PARSE KEYWORD (WORDS ("Usage":1, "Days_unreferenced":2),
HELP "Next Field for Sorting", STDHELP ) ;
Will give the ? help:
?Next field for sorting, one of the following:
Days-Unreferenced Usage
NOHELP Suppresses the default system help. This is the default if you
use the HELP option.
NOINDIRECT Specifies that an indirect command file may not be used at this
field. Turns on bit CM%XIF in the COMAND JSYS.
RADIX Integer-constant
For field type NUMBER, specifies that the number typed in is in
radix integer constant.
STDHELP Use the standard help message provided by Tops20, eventually
appending it to the HELP option help text (in this case STDHELP
must be given after the HELP option. Not applicable for the
field type FIELD.
TIME Parse only the time for field type DAYTIME.
WILD For the DIRECTORY and USERNAME field types, allows the user to
specify a wild card. This allows to step through the
directories or users matching the specification in the same way
as for a DIRECTORYLIST or USERLIST. See these field-types for
the most general wild card parsing method.
WORDS (word1 : int1 [,word2 : int2 ...])
or
WORDS (word1 :: int1 [,word2 :: int2 ...])
For the field types KEYWORD and SWITCH, the WORDS option gives
the list of keywords (or switches). Each word may be:
a string enclosed in double quotes
for example "68_cobol". This is the Preferred
syntax; it is needed for words which start with
a digit.
a number an integer number like 123.
a word an alphanumeric string beginning by a letter,
like a13.
The integer after the ":" will be stored in $value. The second
form of the WORDS option, wich uses "::" is reserved for
parsing SWITCHes of the form: "/delete:"; it may not be used in
command arguments, but only in PARSE statements.
If an underscore ("_") appears within a word it is converted
into a hyphen ("-").
For example:
PARSE BEGIN
KEYWORD (WORDS ("blue":1, "red":2),
HELP "Select Colour", STDHELP)
: colour = $value;
OTHERWISE: display "Invalid colour";
END;
Related
GUIDE - page 33
PROMPT - page 47
PRESERVE
8.29. PRESERVE
Function
The PRESERVE command allows the user to save the current PCL environment for
later recall. It allows system administrators to modify the Exec with PCL and
then save the entire Exec for use at his or her site.
Format
PRESERVE option file-name
option is:
ENVIRONMENT
EXEC
Notes
1. An ENVIRONMENT is all the PCL commands, procedures, and variables
that the user has defined.
2. The ENVIRONMENT file contains the internal, compiled version of the
PCL objects. It will not be recompiled when declared.
3. The default file name for environments is EXEC.ENV.
4. Format 2 is for system administrators. The EXEC that is written may
be placed on <SYSTEM> for use by the installation. All commands
that have been defined may not be un-declared by the users.
5. The default file name for PRESERVE EXEC is EXEC.EXE.
8.30. PROCEDURE
Function
A PROCEDURE definition in a PCL source file creates a procedure. All
procedures are declared globally and on the "top level;" there are no inner
procedures.
Format
[ type ] PROCEDURE name [ (arguments) ]
arguments is:
arglist [ ; arglist ... ]
arglist is:
type param1 [ ,param2... ]
type is:
INTEGER or
STRING
Notes
1. A PROCEDURE need not have arguments; if it has none then the
parentheses are not necessary.
2. A PROCEDURE, may have either INTEGER arguments, STRING arguments, or
both. The string and integer arguments may appear in any order in
the arguments list.
3. The procedure may change the value of its arguments. The modified
value is returned to the caller. In this case the argument must be a
variable.
4. If the type is not given the procedure is untyped and must be CALLed
(see page 21).
5. If type is given the procedure is typed. The type may be either
INTEGER or STRING. The procedure must return a result of that type
(see the RETURN statement on page 48). A typed procedure may be
used in place of a variable in PCL statements.
6. Specifying the names of the parameters in the argument list defines
them for all purposes; they need not be declared again within the
body of the procedure.
Example
PROCEDURE match (string input_string,str_match;
integer start_point);
BEGIN
...;
RETURN
END
If a user has an integer procedure called finger that looks at a SYSTAT and
returns the job number of the requested user, that procedure could be used:
COMMAND findem (username:guy);
BEGIN
EXTERNAL INTEGER PROCEDURE finger;
IF finger(guy) neq -1 THEN
DISPLAY guy + " is at " + $string(finger(guy))
ELSE
DISPLAY guy + "not on";
EXIT
END
The procedure finger would look like:
INTEGER PROCEDURE FINGER (STRING name);
BEGIN
STRING gotem;
DOCOMMAND "systat " + name TO gotem;
IF $length(gotem) = 0 THEN return -1
ELSE return $integer(gotem[3:2])
END
8.31. PROMPT
Function
When using PARSE to parse parameters, it only permits you to parse one
command line; once the line has been completely parsed, with PARSE EOL, you can
not use PARSE again, without causing PCL to obtain and begin parsing a new
command line. The PROMPT PCL statement allows the PCL command to prompt for
more input parameters after a PARSE EOL has been executed.
Format
PROMPT [ NOECHO ] string
Notes
1. The PROMPT statement allows the user to have subcommands to
commands.
2. After a PROMPT statement, the user may again do PARSE statements.
3. The NOECHO option turns off echoing for that entire line of command
typein; this must be done at the Prompt because of the way command
typein and echoing is done.
4. In command parsing, it is permissible for the user to type in a
field and have it recognized by PCL and then to type enough rubouts
or ^W to make the entire field invalid, or even an earlier, already
parsed field. When this happens, the system signals to the Exec
that a "reparse" occurred, and that the system will now reset its
internal pointer to the beginning of the command line and start
again. When a reparse happens during basic command line parsing,
PCL aborts the executing command completely and restarts the command
program from the beginning. During subcommand parsing, this is
undesirable. Instead, when a reparse occurs during subcommand
parsing (properly identified as such by a PROMPT statement), PCL
jumps back to the last-executed Prompt statement as if a GoTo had
been performed and resumes execution of the PCL program from that
point. Then, when the user's Parse statements re-execute, they will
match the fields which the system will re-present to the program.
Example
COMMAND subcomm;
BEGIN INTEGER a_value;
PARSE NUMBER;
a_value = $VALUE
...;
PARSE EOL;
...;
PROMPT "@@";
PARSE KEYWORD ( Words("first":1, "last":2, "all":3));
...;
PARSE EOL;
PROMPT NOECHO "Please enter your password: "
PARSE TEXT;
...
END
Related
PARSE - page 42
RETURN
8.32. RETURN
Function
The RETURN PCL statement causes a procedure to return to the calling routine.
Format
RETURN [ expression ]
Notes
1. A RETURN always returns to the calling routine. If in a command,
the command returns to the EXEC.
2. The optional expression must be provided if within a typed
procedure, and must be of the same type as the procedure. It
defines the value returned by the procedure (see page 46).
Example
PROCEDURE show;
BEGIN
display $jobno + " " + $username;
RETURN
END
INTEGER PROCEDURE calc;
BEGIN
INTEGER total;
...;
RETURN total + 5
END
Related
ABORT - page 18
PROCEDURE - page 46
SELECT
8.33. SELECT
Function
The SELECT statement provides an orderly way of choosing one of several paths
to take based on the current value of an integer or string expression. The
statement tagged with the expression having the same value is executed, and all
others are ignored.
Format
SELECT test_expression OF BEGIN
test : PCL-statement;
test : PCL-statement;
..
END;
test is:
tag1 [ , tag2 ... ]
tag is:
expression or
expression1 TO expression2 or
OTHERWISE
Notes
1. All the tags expressions must be of the same type as the test
expression (ie integer or string).
2. Unlike the CASE statement, the tags may be complex expressions
instead of constants. After evaluating the select expression, PCL
will evaluate each tagging expression in turn and compare the value
to the value of the select expression. If they are equal, the
corresponding statement will be executed. Execution will then
proceed after the SELECT statement.
3. The OTHERWISE keyword indicates that the tagged statement is to be
executed if all the preceding tests fail. If present, the OTHERWISE
must be the only tag in a test, and should be the last test given.
4. If all the tests fail, and there is no OTHERWISE, then execution
continues following the SELECT statement.
5. The intent of providing SELECT in addition to CASE is that CASE is
implemented with a table of statement addresses, making it
appropriate for small ranges of the selection expression, say from 1
to 10, whereas SELECT is implemented by a series of tests which
might as well have been coded by user statements like:
IF x=1 THEN s1
ELSE IF x=58 THEN s2
ELSE IF x=101 THEN s3
ELSE ...
This form is suitable for a large range in the selection range.
Example
...
SELECT $Value OF BEGIN
1 TO 3, 100 : {executed if $value
is between 1 and 3, or 100};
6,9 : {executed if $value is 6 or 9};
OTHERWISE : {executed if none of the above};
END;
...
COMMAND seltest(USERNAME:unam);
...
SELECT unam OF
BEGIN
"OPERATOR": display "the operator";
"DIAGNOSTICS": display "the engineers"
END
END
Related
IF - page 34
CASE - page 22
SELECTALL - page 50
SELECTALL
8.34. SELECTALL
Function
The SELECTALL statement is very similar to the SELECT statement except that
after a match has been found, the testing continues ("falls through the
SelectAll" so that multiple PCL statements may be selected one after the other.
Format
SELECTALL test_expression OF BEGIN
test : PCL-statement;
test : PCL-statement;
..
END;
test is:
tag1 [ , tag2 ... ]
tag is:
expression or
expression1 TO expression2 or
ALWAYS or
OTHERWISE
Notes
1. All the tags expressions must be of the same type as the test
expression (ie integer or string).
2. Unlike the CASE statement, the tags may be complex expressions
instead of constants. After evaluating the select expression, PCL
will evaluate each tagging expression in turn and compare the value
to the value of the select expression. If they are equal, the
corresponding statement will be executed. After that the execution
proceeds by testing against the next tests in the SELECTALL, until
all tests have been made.
3. The OTHERWISE tag matches if no previous test matched. Within a
test, it must be the only tag.
4. The ALWAYS tag matches any expression. For this reason, OTHERWISE
should always precede any ALWAYS. If present ALWAYS must the only
tag in a test.
5. SELECTALL must be used where a SELECT would be used and multiple
successive selections are needed.
Example
SELECTALL $value OF BEGIN
1 TO 3 : {executed if $value is between 1 and 3}
1, 5 : {executed if $value is 1 or 5}
OTHERWISE : {executed if $value is not 1, 2, 3 or 5}
ALWAYS : {executed whatever the value of $value}
END;
Related
CASE - page 22
IF - page 34
SELECT - page 49
SET
8.35. SET
Function
New options to the EXEC SET command will set the values of global variables
declared by the DECLARE command.
Format
SET INTEGER-VARIABLE (named) variable (to) value
SET STRING-VARIABLE (named) variable (to) value
SET [ NO ] COMMAND-TRACE (OF GENERATED COMMANDS)
SET DEFAULT DECLARE /CONFIRM
/NOCONFIRM
Notes
1. The variable must have been previously declared by a DECLARE
command. see page 25.
2. The INFORMATION command may be used to display the setting of a
global variable. see page 35.
3. Setting COMMAND-TRACE causes PCL to display at the terminal all
DoCommand statements as they are executed.
4. Setting the default for DECLARE allows you to say whether the
DECLARE command should, by default, confirm its actions.
8.36. SYNONYM
Function
The SYNONYM command defines a synonym to an original Exec command.
Format
SYNONYM new-name original-name
Notes
1. The SYNONYM command may not be given inside a command or procedure.
It is used in PCL source files in the same way as the Exec "@DECLARE
SYNONYM" command (see page 25).
Example
SYNONYM AuRevoir LOGOUT
Related
DECLARE - page 25
TYPEIN
8.37. TYPEIN
Function
The TYPEIN PCL statement will send a character string to an invoked program.
Format
TYPEIN [ NORETURN ] string
Notes
1. TYPEIN will send string to the invoked program as though it had been
typed on the controlling terminal. A carriage return will be added
to string, unless the NORETURN option is specified.
2. Several lines may be sent to the invoked program with one TYPEIN
statement. PCL will strip the extra line feeds from the string
before sending it, because programs normally expect their terminal
input to be terminated by carriage returns only.
TYPEIN "tape copytp:
density 1600
ssname area backup"
3. After the string has been passed to the program, PCL waits until the
program either halts or waits for more terminal input.
Example
COMMAND runprog (text (help "program to run"):prog_to_run);
BEGIN
STRING program_text;
...;
INVOKE prog_to_run;
...;
GETTYPEOUT program_text;
...;
TYPEIN "week";
...
END
@
8.38. UNDECLARE
Function
The Exec UNDECLARE command removes PCL customizations (and even original Exec
commands from the Exec.
Format
@UNDECLARE (from PCL) [ cfm ] option
cfm is:
/Confirm or
/NoConfirm
option is:
ALL (Customizations) or
COMMAND (Named) PCL-command-name or
ORIGINAL-COMMAND (Named) Exec-command-name or
PROCEDURE (Named) PCL-procedure-name or
SYNONYM (Named) synonym-name or
VARIABLE (Named) PCL-variable-name
Example
@Undeclare (from PCL) variable Term_typ;
Related
DECLARE - page 25
INFORMATION - page 35
NOORIGINAL - page 40
UNTIL
8.39. UNTIL
Function
The UNTIL PCL statement provides loop control for PCL routines.
Format
UNTIL condition DO PCL statement
Notes
1. As long as the condition is not true, the PCL statement is
repeatedly executed.
Example
Related
DO - page 27
WHILE - page 56
WHILE
8.40. WHILE
Function
The WHILE PCL statement provides loop control for PCL routines.
Format
WHILE condition DO PCL statement
Notes
1. As long as the condition is true the PCL statement is repeatedly
executed.
Example
Related
DO - page 27
UNTIL - page 55
I. FDB Codes
II. CRDIR/GTDIR Directory Argument Block
III. Facilities specific to the FNDP version of PCL
I have introduced several extensions to the standard version of PCL. These
extensions are listed briefly here (their documentation is in the main body of
the manual). If you are interested in these extensions, contact:
Michel E Debar
FNDP Computing Centre
Rue Grandgagnage, 21
B-5000 Namur
Belgium
WILD option allowed for FILE, DIRECTORY and USERNAME parse field types.
$NEXTFILE working after PARSE (FILE (WILD)).
DIRECTORYLIST and USERLIST parse field type, with associated variables and
procedures $DIRECTORY, $USER, $NEXTDIRECTORY and $NEXTUSER.
Based numbers of the form base%number.
$Getfield and $Setfield to manipulate bit fields within integers.
$and and $or to provide logical and/or of integers.
$DirectoryInfo_I and $DirectoryInfo_s read the information returned by the
GTDIR and GTDAL JSYS's.
$FileInfo_I, $FileInfo_S, $FileSet accept mnemonic codes for the information
desired. They also accept the file name as a string argument in addition to the
usual $parse or channel number.
$FileSet sets individual entries in the FDB.
$xatom and $command, return the last atom parsed and the last command parsed.
$termlength returns the length of the controlling terminal.
A jsys interface is provided with the routines:
$get_men and $Ret_mem
to acquire and release memory
$iput and $iget to set/read integers in memory
$sput and $sget do the same for strings
$jfn returns the jfn associated with a channel
$strloc returns the address in memory of a string
$jsys, $Jsys1 execute a Jsys
$ac1 to $ac4 return the accumulators 1 to 4 after $jsys or $jsys1
$jsysok indicates the success or failure of the last $jsys or $jsys1
Inline comments of the form !{...}! are allowed. They may span several lines
and may be nested.
{...} may serve as a substitute to Begin...End.
Case and Select may have multiple tags in each case; each tag may be of the
form Value1 TO Value2.
The SelectAll statement implements a select that "falls through" and goes on
matching (it is to Select in PCL as Select is to Selectone in Bliss).
The WORDS option allows quoted strings:
(WORDS ("68_cobol":1, ...))
$Isfile (Filename) returns 1 if a file exists, else 0.
In $string if the radix is other than 10 the number is output in magnitude
form, ignoring the sign bit.