[Info-vax] Example of random access by record number on an RMS fixed record size, relative organization file?

Arne Vajhøj arne at vajhoej.dk
Tue Sep 19 20:50:34 EDT 2023


On 9/19/2023 8:44 PM, Arne Vajhøj wrote:
> On 9/16/2023 4:16 PM, Arne Vajhøj wrote:
>> I don't think I have ever used ORG=REL.
> 
> But then I could start now!

C / RMS:

$ type relwrt.c
#include <stdio.h>
#include <string.h>

#include <starlet.h>
#include <rms.h>

#define FNM "rel.dat"

int main(int argc, char *argv[])
{
    long stat;
    struct FAB fab;
    struct RAB rab;
    int i;
    char buf[80];
    fab = cc$rms_fab;
    fab.fab$l_fna = (char *)FNM;
    fab.fab$b_fns = strlen(FNM);
    fab.fab$b_org = FAB$C_REL;
    fab.fab$b_rfm = FAB$C_VAR;
    fab.fab$l_fop = FAB$M_CIF;
    fab.fab$w_mrs = 512;
    fab.fab$b_fac = FAB$M_PUT;
    stat = sys$create(&fab, 0, 0);
    if(!(stat & 1)) {
        printf("sys$create stat = %d\n", stat);
    }
    rab = cc$rms_rab;
    rab.rab$l_fab = &fab;
    rab.rab$b_rac = RAB$C_KEY;
    stat = sys$connect(&rab, 0 ,0);
    if(!(stat & 1)) {
       printf("sys$connect stat = %d\n", stat);
    }
    for(i = 1; i <= 100; i++)
    {
       sprintf(buf, "This is line #%04d!", i);
       rab.rab$l_kbf = (char *)&i;
       rab.rab$b_ksz = sizeof(i);
       rab.rab$l_rbf = buf;
       rab.rab$w_rsz = strlen(buf);
       stat = sys$put(&rab, 0, 0);
       if(!(stat & 1)) {
          printf("sys$put stat = %d\n", stat);
       }
    }
    stat = sys$disconnect(&rab, 0, 0);
    if(!(stat & 1)) {
       printf("sys$disconnect stat = %d\n", stat);
    }
    stat = sys$close(&fab, 0, 0);
    if(!(stat & 1)) {
       printf("sys$close stat = %d\n", stat);
    }
    return 0;
}

$ cc relwrt
$ link relwrt
$ run relwrt
$ type relrdseq.c
#include <stdio.h>
#include <string.h>

#include <starlet.h>
#include <rms.h>

#define FNM "rel.dat"

int main(int argc, char *argv[])
{
    long stat;
    struct FAB fab;
    struct RAB rab;
    char buf[80];
    fab = cc$rms_fab;
    fab.fab$l_fna = (char *)FNM;
    fab.fab$b_fns = strlen(FNM);
    fab.fab$b_org = FAB$C_REL;
    fab.fab$b_rfm = FAB$C_VAR;
    fab.fab$w_mrs = 512;
    fab.fab$b_fac = FAB$M_GET;
    stat = sys$open(&fab, 0, 0);
    if(!(stat & 1)) {
        printf("sys$open stat = %d\n", stat);
    }
    rab = cc$rms_rab;
    rab.rab$l_fab = &fab;
    rab.rab$b_rac = RAB$C_SEQ;
    stat = sys$connect(&rab, 0 ,0);
    if(!(stat & 1)) {
       printf("sys$connect stat = %d\n", stat);
    }
    for(;;)
    {
       rab.rab$l_ubf = buf;
       rab.rab$w_usz = sizeof(buf);
       stat = sys$get(&rab, 0, 0);
       if(stat == RMS$_EOF) break;
       if(!(stat & 1)) {
          printf("sys$get stat = %d\n", stat);
       }
       buf[rab.rab$w_rsz] = 0;
       printf("|%s|\n", buf);
    }
    stat = sys$disconnect(&rab, 0, 0);
    if(!(stat & 1)) {
       printf("sys$disconnect stat = %d\n", stat);
    }
    stat = sys$close(&fab, 0, 0);
    if(!(stat & 1)) {
       printf("sys$close stat = %d\n", stat);
    }
    return 0;
}

$ cc relrdseq
$ link relrdseq
$ run relrdseq
|This is line #0001!|
|This is line #0002!|
...
|This is line #0100!|
$ type relrddir.c
#include <stdio.h>
#include <string.h>

#include <starlet.h>
#include <rms.h>

#define FNM "rel.dat"

int main(int argc, char *argv[])
{
    long stat;
    struct FAB fab;
    struct RAB rab;
    int i;
    char buf[80];
    fab = cc$rms_fab;
    fab.fab$l_fna = (char *)FNM;
    fab.fab$b_fns = strlen(FNM);
    fab.fab$b_org = FAB$C_REL;
    fab.fab$b_rfm = FAB$C_VAR;
    fab.fab$w_mrs = 512;
    fab.fab$b_fac = FAB$M_GET;
    stat = sys$open(&fab, 0, 0);
    if(!(stat & 1)) {
        printf("sys$open stat = %d\n", stat);
    }
    rab = cc$rms_rab;
    rab.rab$l_fab = &fab;
    rab.rab$b_rac = RAB$C_KEY;
    stat = sys$connect(&rab, 0 ,0);
    if(!(stat & 1)) {
       printf("sys$connect stat = %d\n", stat);
    }
    for(i = 1; i <= 100; i++)
    {
       rab.rab$l_kbf = (char *)&i;
       rab.rab$b_ksz = sizeof(i);
       rab.rab$l_ubf = buf;
       rab.rab$w_usz = sizeof(buf);
       stat = sys$get(&rab, 0, 0);
       if(!(stat & 1)) {
          printf("sys$get stat = %d\n", stat);
       }
       buf[rab.rab$w_rsz] = 0;
       printf("|%s|\n", buf);
    }
    stat = sys$disconnect(&rab, 0, 0);
    if(!(stat & 1)) {
       printf("sys$disconnect stat = %d\n", stat);
    }
    stat = sys$close(&fab, 0, 0);
    if(!(stat & 1)) {
       printf("sys$close stat = %d\n", stat);
    }
    return 0;
}

$ cc relrddir
$ link relrddir
$ run relrddir
|This is line #0001!|
|This is line #0002!|
...
|This is line #0100!|

Arne





More information about the Info-vax mailing list