[comp.sys.dec] QIO on vaxen - solved!

stergios@rocky.STANFORD.EDU (Stergios Marinopoul) (11/26/87)

Finally got the "C" based use of QIO to work.  Here's the program
... I know I don't indent the way you 'purist' like for me to but here
it is anyway with one or two comments for you! Thats why someone wrote cb,
right?




main()
{
int ind;
int i,j,k,l,m,n,nrec;
unsigned char a[32767];
nrec = 0;
for(i = 0 ;  ; )
{
ind = rtap(a);  /*  Here's the tape reading routine ... */
                /*   read the tape into buffer 'a'      */
if(ind < 1)
{
printf("Number Of Records = %d\n",nrec);
exit();
}
nrec++;
}
}

/*  Here's the Source for the rtap routine   */

#include iodef
#include ssdef
#include descrip
#include stdlib

/* Here's The Structure For The IOSTATUS Block  */

struct
{
short cond_val;
short xfer_count;
int info;
} status_block;

int rtap(buff)
unsigned char buff[];
{
register status;
$DESCRIPTOR(tape,"MFA0:");
                            /*  This the CRITICAL One!     It 'properly' */
                            /*  Initializes 'MFA0:' the way QIO wants it */
static int opndone = { 0 };
static short chan;
unsigned int i,k,l,m,n,ind,dummy;
dummy = 0;
if(opndone == 0)
{
opndone = 1;
               /*  OK, Let's do the ASSIGN  */
if(((status = sys$assign(&tape,&chan,0,0)) & 1) != 1)
  LIB$STOP(status);
}
               /*  Now, For the READ */
status = sys$qiow(1,chan,IO$_READLBLK,&status_block,
0,&status_block,buff,32767,0,0,0,0);
if(status == SS$_ENDOFFILE || status == SS$_ENDOFTAPE)return(0);
if((status & 1) != 1)
{
printf("Error Occurred: System Status Return Value = %d\n",status);
return(-1);
}
return(status_block.xfer_count); 
}



That's about it!  The $DESCRIPTOR was the big 'catch'.

-- 
% Stergios Marinopoulos			% GO:     Wall Street
% UUCP:   !sun!rocky!stergios 		% DECNET: star::stergios
% ARPA:	  f.flex@macbeth.stanford.edu 	% BELL:   (415) 321-7678
% USnail: S. Marinopoulos Crothers Memorial #690, Stanford, CA. 94305