XOPEN

Written June 2020

XOPEN #ch, fspec$, mode, recsiz {, flags}

XOPEN is an alternative to the traditional OPEN statement, offering the following advantages:

•   Replacement of the literal compiler keywords (e.g. WAIT'RECORD) with a flexible flags parameter, allowing a single generic, parameterized, XOPEN statement to be used for all variations.

•   Elimination of the requirement for the recnovar to remain in scope, by eliminating it entirely. Instead, you can specify the record number explicitly using the XREAD, XWRITE, XUNLOKR or SET'RECNO statements.

Parameters

ch  (Num)  [in]

an integer expression (>0) specifying the file channel which will be needed for subsequent I/O operations on the file. copied from random open.

fspec  (String)  [in]

string expression containing file specification, in native or AMOS syntax. May contain embedded %env% variables, e.g. "%temp%\myfile.dat".  If no directory information is included, the search path consists of the current directory, followed by the [p,0] directory. copied from random open.

mode  (literal keyword)  [in]

specifies the file access mode, and must be one of the following (case insensitive) compiler keywords:

Symbol

Description

RANDOM

When LOKSER enabled, requests exclusive access; otherwise same as RANDOM'FORCED

RANDOM'FORCED

Shared access

 

Note that unlike with the traditional OPEN, here the you can specify RANDOM and then use the flags argument to change it to RANDOM'FORCED, thereby eliminating the need for two separate literal variations of the XOPEN statement in your code.

recsiz  (Num)  [in]

integer expression specifying the record size—i.e. the number of bytes transferred in each subsequent READ and WRITE operations. See SPAN'BLOCKS below.

flags  (B,4 or numeric expression)  [in]

flags optionally specifies zero or more of the following modifiers:caution: this table is duplicated in XOPEN for ISAM

Symbol

Value

Meaning

FDVF_FORCED

&h0010

Convert RANDOM to RANDOM'FORCED (shared)

FDVF_EXCLUSIVE

&h0800

Convert INDEXED to INDEXED'EXCLUSIVE

FDVF_READONLY

&h1000

READONLY

FDVF_SPANBLOCKS

&h2000

SPAN'BLOCKS

FDVF_W_RECORD

&h4000

WAIT'RECORD

FDVF_W_FILE

&h8000

WAIT'FILE

Definition file: ashinc:addsfdv.def

 

Note that if flags is expressed as a variable, it must be of type B,4. Since flags occupies the same position as recnovar in the traditional OPEN statement, requiring it to be of type B,4 here reduces the chance of accidentally confusing the two statements in your coding.

Example

XOPEN makes it possible to create a generic function for opening random files, such as the following:

call Fn'XOPEN'Random(ch=CH, fspec$="test.dat", recsiz=128, flags=FDVF_FORCED+FDVF_W_RECORD+FDVF_FILE)

XREAD #CH, 1    ! read rec # 1

...

Function Fn'XOPEN'Random(ch as b2:inputonly, fspec$ as s260:inputonly, recsiz as b2:inputonly, flags as b4:inputonly) as i4

    XOPEN #ch, fspec$, RANDOM, recsiz, flags

EndFunction

 

The above function could easily be upgraded to trap errors and deal file locking conflicts, including logging, user interfacing, etc., allowing you to implement all of that logic in a single place with more modularity than would otherwise be possible with the traditional OPEN statement.

See Also

•   OPEN

•   XREAD, XWRITE, XUNLOKR

•   ASFLAG.SBR

•   SET'RECNO

•   .RECNO(ch)