[Info-vax] CRTL and RMS vs SSIO

Arne Vajhøj arne at vajhoej.dk
Thu Oct 7 09:34:23 EDT 2021


On 10/7/2021 8:59 AM, Simon Clubley wrote:
> On 2021-10-07, Greg Tinkler <tinklerg at gmail.com> wrote:
>> On Thursday, 7 October 2021 at 11:26:38 pm UTC+11, Simon Clubley wrote:
>>> How do you find byte 12,335,456 in a variable length RMS sequential file
>>> without reading from the start of the file ?
>>>
>>> That's why there are restrictions on RMS supported file formats in an
>>> application in some cases.
>>
>> The same way it is done on Unix, calculate the block offset, go get it, and extract the byte.  no difference and nothing to do with the underlying format.
> 
> You don't know the block offset without scanning the file when it comes
> to some RMS file formats.
> 
> IOW, data byte 12,335,456 will not be the same thing as file byte 12,335,456
> unless you restrict yourself to record formats that do not have embedded
> record metadata.

Yes.

And it does not get better when using standard C IO.

I suspect that the variable length file output below will
surprise a few *nix developers.

$ type var.txt
A
BB
CCC
$ type stmlf.txt
A
BB
CCC
$ type process.c
#include <stdio.h>
#include <sys/stat.h>

void sequential(const char *fnm, int mode)
{
     FILE *fp;
     int ix, c;
     printf("%s sequential read (%s):", fnm, mode ? "binary" : "text");
     fp = fopen(fnm, mode ? "rb" : "r");
     ix = 0;
     while((c = fgetc(fp)) >= 0)
     {
         ix++;
         if(c >= 0)
         {
             printf(" %d=%02X", ix, c);
         }
         else
         {
             printf(" %d=-1", ix);
         }
     }
     printf("\n");
     fclose(fp);
}

void direct(const char *fnm, int mode, int siz)
{
     FILE *fp;
     int ix, c;
     printf("%s direct read (%s):", fnm, mode ? "binary" : "text");
     fp = fopen(fnm, mode ? "rb" : "r");
     for(ix = 0; ix < siz; ix++)
     {
         fseek(fp, ix, SEEK_SET);
         c = fgetc(fp);
         if(c >= 0)
         {
             printf(" %d=%02X", ix + 1, c);
         }
         else
         {
             printf(" %d=-1", ix + 1);
         }
     }
     printf("\n");
     fclose(fp);
}

int main(int argc,char *argv[])
{
     struct stat buf;
     stat(argv[1], &buf);
     printf("%s size = %d bytes\n", argv[1], (int)buf.st_size);
     sequential(argv[1], 0);
     sequential(argv[1], 1);
     direct(argv[1], 0, (int)buf.st_size);
     direct(argv[1], 1, (int)buf.st_size);
     return 0;
}
$ cc process
$ link process
$ mcr sys$disk:[]process var.txt
var.txt size = 14 bytes
var.txt sequential read (text): 1=41 2=0A 3=42 4=42 5=0A 6=43 7=43 8=43 9=0A
var.txt sequential read (binary): 1=41 2=42 3=42 4=43 5=43 6=43
var.txt direct read (text): 1=41 2=-1 3=02 4=-1 5=42 6=-1 7=-1 8=-1 9=43 
10=-1 11=-1 12=-1 13=FF 14=-1
var.txt direct read (binary): 1=41 2=-1 3=02 4=-1 5=42 6=-1 7=-1 8=-1 
9=43 10=-1 11=-1 12=-1 13=FF 14=-1
$ mcr sys$disk:[]process stmlf.txt
stmlf.txt size = 9 bytes
stmlf.txt sequential read (text): 1=41 2=0A 3=42 4=42 5=0A 6=43 7=43 
8=43 9=0A
stmlf.txt sequential read (binary): 1=41 2=0A 3=42 4=42 5=0A 6=43 7=43 
8=43 9=0A
stmlf.txt direct read (text): 1=41 2=0A 3=42 4=42 5=0A 6=43 7=43 8=43 9=0A
stmlf.txt direct read (binary): 1=41 2=0A 3=42 4=42 5=0A 6=43 7=43 8=43 9=0A

Arne



More information about the Info-vax mailing list