Compaq BASIC for OpenVMS  
           Alpha and VAX Systems
Reference Manual
  
    
       
      
DECLARE LONG rec-num 
MAP (cusrec) WORD cus_num                                   & 
    STRING cus_nam=20, cus_add=20, cus_city=10,  cus_zip=9 
OPEN "CUS_ACCT.DAT" FOR INPUT AS #1,                        & 
      RELATIVE FIXED,                                       & 
      ACCESS MODIFY                                         & 
      MAP cusrec 
INPUT "Which record number would you like to delete";rec_num 
FIND #1, RECORD rec_num, WAIT 
DELETE #1 
CLOSE #1 
END 
 | 
FIX
The FIX function truncates a floating-point value at the decimal point 
and returns the integer portion represented as a floating-point value.
Format
Syntax Rules
None
Remarks
  - The FIX function returns the integer portion of a floating-point 
  value, not an integer value.
  
 - BASIC expects the argument of the FIX function to be a real 
  expression. When the argument is a real expression, BASIC 
  returns a value of the same floating-point size. When the argument is 
  not a real expression, BASIC converts the argument to the 
  default floating-point size and returns a value of the default 
  floating-point size.
  
 - If real-exp is negative, FIX returns the negative integer 
  portion. For example, FIX(-5.2) returns -5.
 
Example
  
    
       
      
DECLARE SINGLE result 
result = FIX(-3.333) 
PRINT FIX(24.566), result 
 
 | 
Output
FNEND
The FNEND statement is a synonym for the END DEF statement. See the END 
statement for more information.
Format
FNEXIT
The FNEXIT statement is a synonym for the EXIT DEF statement. See the 
EXIT statement for more information.
Format
FOR
The FOR statement repeatedly executes a block of statements, while 
incrementing a specified control variable for each execution of the 
statement block. FOR loops can be conditional or unconditional, and can 
modify other statements.
Format
Syntax Rules
  - Num-unsubs-var must be a numeric, unsubscripted variable. 
  Num-unsubs-var cannot be a record field.
  
 - Num-unsubs-var is the loop variable. It is incremented 
  each time the loop executes.
  
 - In unconditional FOR loops, num-exp1 is the initial value 
  of the loop variable; num-exp2 is the maximum value.
  
 - In conditional FOR loops, num-exp1 is the initial value of 
  the loop variable, while the cond-exp in the WHILE or UNTIL 
  clause is the condition that controls loop iteration.
  
 - Num-exp3 in the STEP clause is the value by which the loop
variable is incremented after each execution of the loop.
 
Remarks
  - There is a limit to the number of inner loops you can contain 
  within a single outer loop. This number varies according to the 
  complexity of the loops. If you exceed the limit, BASIC signals 
  an error message.
  
 - An inner loop must be entirely within an outer loop; the loops 
  cannot overlap.
  
 - You cannot use the same loop variable in nested FOR loops. For 
  example, if the outer loop uses FOR I = 1 TO 10, you cannot 
  use the variable I as a loop variable in an inner loop.
  
 - The default for num-exp3 is 1 if there is no STEP clause.
  
 - You can transfer control into a FOR loop only by returning from a 
  function
invocation, a subprogram call, a subroutine call, or an error handler 
that was invoked in the loop.
  
 - The starting, incrementing, and ending values of the loop do not 
  change during loop execution.
  
 - The loop variable can be modified inside the FOR loop.
  
 - BASIC converts num-exp1, num-exp2, and 
  num-exp3 to the data type of the loop variable before storing 
  them.
  
 - When an unconditional FOR loop ends, the loop variable contains the 
  value last used in the loop, not the value that caused loop termination.
  
 - During each iteration of a conditional loop, BASIC tests 
  the value of cond-exp before it executes the loop.
  
    - If you specify a WHILE clause and cond-exp is false (value 
    zero), BASIC exits from the loop. If the cond-exp is 
    true (value nonzero), the loop executes again.
    
 - If you specify an UNTIL clause and cond-exp is true (value 
    nonzero), BASIC exits from the loop. If the exp is 
    false (value zero), the loop executes again.
  
 
   - When FOR is used as a statement modifier, BASIC executes 
  the statement until the loop variable equals or exceeds 
  num-exp2 or until the WHILE or UNLESS condition is satisfied.
  
 - Each FOR statement must have a corresponding NEXT statement or 
  BASIC signals an error. (This is not the case if the FOR 
  statement is used as a statement modifier.)
 
Examples
Example 1
  
    
       
      
!Unconditional 
DECLARE LONG course_num, STRING course_nam 
FOR I = 3 TO 12 STEP 3 
INPUT "Course number";course_num 
INPUT "Course name";course_nam 
NEXT I 
 
 | 
Output
  
    
       
      
Course number? 221 
Course name? Botany 
Course number? 231 
Course name? Organic Chemistry 
Course number? 237 
Course name? Life Science II 
Course number? 244 
Course name? Programming in BASIC
 
 | 
Example 2
  
    
       
      
!Unconditional Statement Modifier 
DECLARE INTEGER counter 
PRINT "This is an unconditional statement modifier" FOR counter = 1 TO 3 
END 
 
 | 
Output
  
    
       
      
This is an unconditional statement modifier 
This is an unconditional statement modifier 
This is an unconditional statement modifier 
 
 | 
Example 3
  
    
       
      
!Conditional Statement Modifier 
DECLARE INTEGER counter, & 
        STRING my_name 
INPUT "Try and guess my name";my_name FOR counter = 1 UNTIL my_name = "BASIC" 
PRINT "You guessed it!" 
 | 
Output
  
    
       
      
Try and guess my name? VAX PASCAL 
Try and guess my name? VAX SCAN 
Try and guess my name? BASIC
You guessed it! 
 
 | 
FORMAT$
The FORMAT$ function converts an expression to a formatted string.
Format
Syntax Rules
The rules for building a format string are the same as those for 
printing numbers with the PRINT USING statement. See the description of 
the PRINT USING statement for more information.
Remarks
It is recommended that you use compile-time constant expressions for 
string expressions whenever possible. When you do this, the 
BASIC compiler compiles the string at compilation time rather 
than at run time, thus improving the performance of your code.
Example
  
    
       
      
DECLARE STRING result,         & 
        INTEGER num_exp 
num_exp = 12345 
result = FORMAT$(num_exp,"##,###") 
PRINT result 
 | 
Output
FREE
The FREE statement unlocks all records and buckets associated with a 
specified channel.
Format
Syntax Rules
Chnl-exp is a numeric expression that specifies a channel 
number associated with a file. It must be immediately preceded by a 
number sign (#).
Remarks
  - The file specified by chnl-exp must be open.
  
 - You cannot use the FREE statement with files not on disk.
  
 - If there are no locked records or buckets on the specified channel, 
  the FREE statement has no effect and BASIC does not signal an 
  error.
  
 - The FREE statement does not change record buffers or pointers.
  
 - After a FREE statement has executed, your program must execute a 
  GET or FIND statement before a PUT, UPDATE, or DELETE statement can 
  execute successfully.
 
Example
  
    
       
      
OPEN "CUST_ACCT.DAT" FOR INPUT AS #3 
   .
   .
   .
INPUT "Enter customer record number to retrieve";cust_rec_num 
FREE #3 
GET #3 
 
 | 
In this example, CUST_ACCT.DAT is opened for input. The FREE statement 
unlocks all records associated with the specified channel contained in 
the file. Once the FREE statement successfully executes, the user can 
then obtain a record with either a FIND or GET statement.
FSP$
The FSP$ function returns a string describing an open file on a 
specified channel.
Format
Syntax Rules
  - A file must be open on chnl-exp.
  
 - The FSP$ function must come immediately after the OPEN statement 
  for the file.
 
Remarks
  - Use the FSP$ function with files opened as ORGANIZATION UNDEFINED. 
  Then use multiple MAP statements to interpret the returned data.
  
 - See the Compaq BASIC for OpenVMS Alpha and  VAX Systems User Manual and the OpenVMS Record Management Services  Reference Manual for more information 
  about FSP$ values.
  Note 
BASIC supports the FSP$ function for compatibility with 
BASIC-PLUS-2. It is recommended that you use the USEROPEN routine to 
identify file characteristics. 
     | 
  
 
Example
  
    
       
      
10 MAP (A) STRING A = 32 
   MAP (A) BYTE org, rat, WORD mrs, LONG alq,  & 
           WORD bks_bls, num_keys,LONG mrn 
   OPEN "STUDENT.DAT" FOR INPUT AS #1%,        & 
         ORGANIZATION UNDEFINED,               & 
         RECORDTYPE ANY, ACCESS READ 
   A = FSP$(1%) 
   PRINT "RMS organization = ";org 
   PRINT "RMS record attributes = ";rat 
   PRINT "RMS maximum record size = ";mrs 
   PRINT "RMS allocation quantity = ";alq 
   PRINT "RMS bucket size = ";bks_bls 
   PRINT "Number of keys = ";num_keys 
   PRINT "RMS maximum record number = ";mrn 
 | 
Output
  
    
       
      
RMS organization = 2 
RMS record attributes = 2 
RMS maximum record size = 5 
RMS allocation quantity = 1 
RMS bucket size = 0 
Number of keys = 0 
RMS maximum record number = 0 
 
 | 
FUNCTION
The FUNCTION statement marks the beginning of a FUNCTION subprogram and 
defines the subprogram's parameters.
Format
Syntax Rules
  -  Note that both Alpha BASIC and VAX BASIC are able to pass 
  actual parameters by value, but only Alpha BASIC allows formal 
  parameters to be passed in by value. This means that while 
  Alpha BASIC can use BY VALUE in a definition and a call, 
  VAX BASIC can use BY VALUE only in a call. It cannot define a 
  function that takes parameters BY VALUE.
  
 - Func-name names the FUNCTION subprogram.
  
 - Func-name can be from 1 through 31 characters. The first 
  character must be an alphabetic character (A to Z). The remaining 
  characters, if present, can be any combination of letters, digits (0 to 
  9), dollar signs ($), periods (.), or underscores (_).
  
 - Data-type can be any BASIC data type keyword or a 
  data type defined in the RECORD statement. Data type keywords, size, 
  range, and precision are listed in Table 1-2.
  
 - The data type that precedes the func-name specifies the 
  data type of the value returned by the function.
  
 - Formal-param specifies the number and type of parameters 
  for the arguments the function expects to receive when invoked.
  
    - Empty parentheses indicate that the function has no parameters.
    
 - Data-type specifies the data type of a parameter. If you 
    do not specify a data type, parameters are of the default data type and 
    size. When you do specify a data type, all following parameters are of 
    that data type until you specify a new data type. 
If the data type 
    is STRING and the passing mechanism is by reference (BY REF), the 
    =int-const clause allows you to specify the length of the 
    string.
     - Parameters defined in formal-param must agree in number 
    and type with the arguments specified in the function invocation. 
    BASIC allows you to specify from 1 to 255 formal parameters.
  
 
   - Pass-mech specifies the parameter-passing mechanism by 
  which the FUNCTION subprogram receives arguments when invoked. A 
  pass-mech clause should be specified only when the FUNCTION 
  subprogram is being called by a non BASIC program or when the FUNCTION 
  receives a string or array by reference.
  
 - A pass-mech clause outside the parentheses applies by 
  default to all function parameters. A pass-mech clause in the 
  formal-param list overrides the specified default and applies 
  only to the immediately preceding parameter.
  
 - Exp specifies the function result, which supersedes any 
  function assignment. Exp must be compatible with the 
  function's data type.
 
Remarks
  - The FUNCTION statement must be the first statement in the FUNCTION 
  subprogram.
  
 - Every FUNCTION statement must have a corresponding END FUNCTION or 
  FUNCTIONEND statement.
  
 - Any BASIC statement except END, PICTURE, END PICTURE, 
  PROGRAM, END PROGRAM, SUB, SUBEND, END SUB, or SUBEXIT can appear in a 
  FUNCTION subprogram.
  
 - FUNCTION subprograms must be declared with the EXTERNAL statement 
  before your BASIC program can invoke them.
  
 - FUNCTION subprograms receive parameters by reference, by 
  descriptor, or by value.
  
    - BY REF specifies that the function receives the argument's address.
    
 - BY DESC specifies that the function receives the address of a 
    BASIC descriptor. For information about the format of a 
    BASIC descriptor for strings and arrays, see the Compaq BASIC for OpenVMS Alpha and  VAX Systems User Manual; 
    for information about other types of descriptors, see the OpenVMS 
    Calling Standard.
    
 - BY VALUE specifies that the function receives a copy of the 
    argument value. 
Alpha BASIC can use BY VALUE in both definitions 
    and calls. VAX BASIC can use BY VALUE only in calls; it cannot 
    define a function that takes parameters BY VALUE.
   
   - By default, FUNCTION subprograms receive numeric unsubscripted 
  variables by reference, and all other parameters by descriptor. You can 
  override these defaults with a BY clause:
  
    - If you specify a string length with the =int-const clause, 
    you must also specify BY REF. If you specify BY REF and do not specify 
    a string length, BASIC uses the default string length of 16.
    
 - If you specify array bounds, you must also specify BY REF.
  
 
   - All variables and data, except virtual arrays, COMMON areas, MAP 
  areas, and EXTERNAL variables, in a FUNCTION subprogram, are local to 
  the subprogram.
  
 - BASIC initializes local numeric variables to zero and local 
  string
variables to the null string each time the FUNCTION subprogram is 
invoked.
  
 - If an exception is not handled within the FUNCTION subprogram, 
  control is transferred back to the main program that invoked the 
  function.
 
Example
  
    
       
      
FUNCTION REAL sphere_volume (REAL R) 
IF R < 0 THEN EXIT FUNCTION 
sphere_volume = 4/3 * PI *R **3 
END FUNCTION 
 
 | 
FUNCTIONEND
The FUNCTIONEND statement is a synonym for the END FUNCTION statement. 
See the END statement for more information.
Format
FUNCTIONEXIT
The FUNCTIONEXIT statement is a synonym for the EXIT FUNCTION 
statement. See the EXIT statement for more information.
Format
GET
The GET statement copies a record from a file to a record buffer and 
makes the data available for processing. GET statements are valid on 
sequential, relative, and indexed files.
Format
Syntax Rules
  - Chnl-exp is a numeric expression that specifies a channel 
  number associated with a file. It must be immediately preceded by a 
  number sign (#).
  
 - If you specify a lock-clause, it must follow the 
  position-clause. If the lock-clause precedes the 
  position-clause, BASIC signals an error.
  
 - If you specify the REGARDLESS lock-clause, you cannot 
  specify another lock-clause in the same GET statement.
 
Remarks
  - Position-clause
  
    - Position-clause specifies the position of a record in a 
    file. BASIC signals an error if you specify a 
    position-clause and chnl-exp is not associated with a 
    disk file.
If you do not specify a position-clause, GET retrieves records 
sequentially. Sequential record access is valid on all files.
    
 - The RFA position-clause allows you to randomly retrieve 
    records by specifying the record file address (RFA); you specify the 
    disk address of a record, and RMS retrieves the record at that address. 
    All file organizations can be accessed by RFA. 
Rfa-exp in 
    the RFA position-clause is an expression of the RFA data type 
    that specifies the record's file address. An RFA expression must be a 
    variable of the RFA data type or the GETRFA function. Use the GETRFA 
    function to obtain the RFA of a record.
     - The RECORD position-clause allows you to randomly retrieve 
    records in relative and sequential fixed files by specifying the record 
    number.
    
      - Num-exp in the RECORD position-clause specifies 
      the number of the record you want to retrieve. It must be between 1 and 
      the number of the record with the highest number in the file.
      
 - When you specify a RECORD clause, chnl-exp must be a 
      channel associated with an open relative or sequential fixed file.
    
 
     - The KEY position-clause allows you to randomly retrieve 
    records in indexed files by specifying a key of reference, a relational 
    test, or a key value.
    
 - An RFA value is valid only for the life of a specific version of a 
    file. If a new version of a file is created, the RFA values may change.
    
 - Attempting to access a record with an invalid RFA value results in 
    a run-time error.
  
 
   - Lock-clause
  
    - Lock-clause allows you to control how a record is locked 
    to other access streams, to override lock checking when accessing 
    shared files that may contain locked records, or to specify what action 
    to take in the case of a locked record.
    
 - The type of lock you impose on a record remains in effect until you 
    explicitly unlock it with a FREE or UNLOCK statement, until you close 
    the file, or until you perform a GET, FIND, UPDATE or DELETE on the 
    same channel (unless you specified UNLOCK EXPLICIT).
    
 - The REGARDLESS lock-clause specifies that the GET 
    statement can override lock checking and read a record locked by 
    another program.
    
 - When you specify a REGARDLESS lock-clause, BASIC 
    does not impose a lock on the retrieved record.
    
 - If you specify an ALLOW lock-clause, the file associated 
    with chnl-exp must have been opened with the UNLOCK EXPLICIT 
    clause or BASIC signals the error "Illegal record locking 
    clause."
    
 - The ALLOW allow-clause can be one of the following:
    
      - ALLOW NONE denies access to the record. This means that other 
      access streams cannot retrieve the record unless they bypass lock 
      checking with the REGARDLESS clause.
      
 - ALLOW READ provides read access to the record. This means that 
      other access streams can retrieve the record, but cannot DELETE or 
      UPDATE the record.
      
 - ALLOW MODIFY provides both read and write access to the record. 
      This means that other access streams can GET, FIND, DELETE, or UPDATE 
      the record.
    
 
     - If you do not open a file with ACCESS READ or specify an ALLOW 
    lock-clause, locking is imposed as follows:
    
      - If the file associated with chnl-exp was opened with 
      UNLOCK EXPLICIT, BASIC imposes the ALLOW NONE lock on the 
      retrieved record and the next GET or FIND statement does not unlock the 
      previously locked record.
      
 - If the file associated with chnl-exp was not opened with 
      UNLOCK EXPLICIT, BASIC locks the retrieved record and unlocks 
      the previously locked record.
    
 
     - The WAIT lock-clause accepts an optional int-exp. 
    Int-exp represents a timeout value in seconds. 
    Int-exp must be from 0 to 255 or BASIC issues a 
    warning message.
    
      - WAIT followed by a timeout value causes RMS to wait for a locked 
      record for a given period of time.
      
 - WAIT followed by no timeout value indicates that RMS should wait 
      indefinitely for the record to become available.
      
 - If you specify a timeout value and the record does not become 
      available within that period, BASIC signals the run-time error 
      "Keyboard wait exhausted" (ERR=15). VMSSTATUS and RMSSTATUS 
      then return RMS$_TMO. For more information about these functions, see 
      the RMSSTATUS and VMSSTATUS functions in this chapter and the 
      Compaq BASIC for OpenVMS Alpha and  VAX Systems User Manual.
      
 - If you attempt to wait for a record that another user has locked, 
      and consequently that user attempts to wait for the record you have 
      locked, a deadlock condition occurs. When a deadlock condition persists 
      for a period of time (as defined by the SYSGEN parameter 
      DEADLOCK_WAIT), RMS signals the error "RMS$_DEADLOCK" and 
      BASIC signals the error "Detected deadlock error while 
      waiting for GET or FIND" (ERR=193).
      
 - If you specify a WAIT clause followed by a timeout value that is 
      less than the SYSGEN parameter DEADLOCK_WAIT, then BASIC 
      signals the error "Keyboard wait exhausted" (ERR=15) even 
      though a deadlock condition may exist.
      
 - If you specify a WAIT clause on a GET operation to a unit device, 
      the timeout value indicates how long to wait for the input to complete. 
      This is equivalent to the WAIT statement.
    
 
   
   - Key-clause
  
    - In a key-clause, int-exp1 is the target key of 
    reference. It must be an integer value in the range of zero to the 
    highest-numbered key for the file. The primary key is #0, the first 
    alternate key is #1, the second alternate key is #2, and so on. 
    Int-exp1 must be preceded by a number sign (#) or 
    BASIC signals an error.
    
 - When you specify a key-clause, chnl-exp must be a 
    channel associated with an open indexed file.
  
 
   - Rel-op
  
    - Rel-op specifies how key-exp is to be compared 
    with int-exp1 in the key-clause.
    
      - EQ means "equal to"
      
 - NXEQ means "next or equal to"
      
 - GE means "greater than or equal to" (a synonym for NXEQ)
      
 - NX means "next"
      
 - GT means "greater than" (a synonym for NX)
    
 
     - With an exact key match (EQ), a successful GET operation retrieves 
    the first record in the file that equals the key value specified in 
    key-exp. If the key expression is a str-exp whose 
    length is less than the key length, characters specified by the 
    str-exp are matched approximately rather than exactly. That 
    is, if you specify a string expression ABC and the key length is six 
    characters, BASIC matches the first record that begins with 
    ABC. If you specify ABCABC, BASIC matches only a record with 
    the key ABCABC. If no match is possible, BASIC signals the 
    error "Record not found" (ERR=155).
    
 - If you specify a next or equal to key match (NXEQ), a successful 
    GET operation retrieves the first record that equals the key value 
    specified in key-exp. If no exact match exists, BASIC 
    retrieves the next record in the key sort order. If the keys are in 
    ascending order, the next record will have a greater key value. If the 
    keys are in descending order, the next record will have a lesser key 
    value.
    
 - If you specify a greater than key match (GT), a successful GET 
    operation retrieves the first record with a value greater than 
    key-exp. If no such record exists, BASIC signals the 
    error "Record not found" (ERR=155).
    
 - If you specify a next key match (NX), a successful GET operation 
    retrieves the first record that follows the key expression in the key 
    sort order. If no such record exists, BASIC signals the error 
    "Record not found" (ERR=155).
    
 - If you specify a greater than or equal to key match (GE), the 
    behavior is identical to that of next or equal to (NXEQ). Likewise, the 
    behavior of GT is identical to NX. However, the use of GE in a 
    descending key file may be confusing because GE will retrieve the next 
    record in the key sort order, but the next record will have a lesser 
    key value. For this reason, it is recommended that you use NXEQ in new 
    program development, especially if you are using descending key files.
  
 
   - Key-exp
  
    - Int-exp2 in the key-clause specifies an integer 
    value to be compared with the key value of a record.
    
 - Str-exp in the key-clause specifies a string 
    value to be compared with the key value of a record. The string 
    expression can contain fewer characters than the key of the record you 
    want to retrieve but it cannot be a null string. 
Str-exp 
    cannot contain more characters than the key of the record you want to 
    locate. If str-exp does contain more characters than the key, 
    BASIC signals "Key size too large" (ERR = 145).
     - Decimal-exp in the key-clause specifies a packed 
    decimal value to be compared with the key value of a record.
    
 - Quadword-exp in the key-clause specifies a record 
    or group exactly 8 bytes long to be compared with the key value of a 
    record.
  
 
   - The file specified by chnl-exp must be opened with ACCESS 
  READ or ACCESS MODIFY or SCRATCH before your program can execute a GET 
  statement. The default ACCESS clause is MODIFY.
  
 - If the last I/O operation was a successful FIND operation, a 
  sequential GET operation retrieves the current record located by the 
  FIND operation and sets the next record pointer to the record logically 
  succeeding the pointer.
  
 - If the last I/O operation was not a FIND operation, a sequential 
  GET operation retrieves the next record and sets the record logically 
  succeeding the record pointer to the current record.
  
    - For sequential files, a sequential GET operation retrieves the next 
    record in the file.
    
 - For relative files, a sequential GET operation retrieves the record 
    with the next higher cell number.
    
 - For indexed files, a sequential GET operation retrieves the next 
    record in the current key of reference.
  
 
   - A successful random GET operation by RFA or by record retrieves the 
  record specified by rfa-exp or int-exp.
  
 - A successful random GET operation by key retrieves the first record 
  whose key satisfies the key-clause comparison.
  
 - A successful random GET operation by RFA, record, or key sets
the value of the current record pointer to the record just read. The 
next record pointer is set to the next logical record.
  
 - An unsuccessful GET operation leaves the record pointers and the 
  record buffer in an undefined state.
  
 - If the retrieved record is smaller than the receiving buffer, 
  BASIC fills the remaining buffer space with nulls.
  
 - If the retrieved record is larger than the receiving buffer, 
  BASIC truncates the record and signals an error.
  
 - A successful GET operation sets the value of the RECOUNT variable 
  to the number of bytes transferred from the file to the record buffer.
  
 - You should not use a GET statement on a terminal-format or virtual 
  array file.
 
Example