Re: Fortran problem with QIO



gerry77@xxxxxxxxxxxxxxxx wrote:
On Wed, 2 Dec 2009 10:07:27 -0800 (PST), Hein RMS van den Heuvel
<heinvandenheuvel@xxxxxxxxx> wrote:

Call me crazy, but I'm trying to (re)learn Fortran while experimenting with
some system services, and I have chosen the steepest approach to the matter:
I'm trying to create a file with $QIOW in Fortran 77 on a VAX. :-P
You are Crazy!
Nobody does that.

Well, I'm crazy, so I DO that! :->

After posting my message here, and also following the good suggestion about
looking into the Unzip sources, I understood that my problem was due to some
bad descriptors. I've managed to create them right, and now the program
works! :-) It's just a proof of concept (I want to stress it again), and as
a matter of facts there are also some hard-coded values (e.g. the DID), but
it does what it's expected do to. It was a very instructive experience...

Here it is, comments are welcome:

PROGRAM IOTEST

IMPLICIT NONE

INCLUDE '($SYSSRVNAM)'
INCLUDE '($EFNDEF)'
INCLUDE '($FIBDEF)'
INCLUDE '($ATRDEF)'
INCLUDE '($DSCDEF)'
INCLUDE '($IODEF)'
INCLUDE '($SSDEF)'

STRUCTURE /FATDEF/ ! As per FATDEF in LIB.REQ et al.
PARAMETER FAT$K_LENGTH = '00000020'X
PARAMETER FAT$C_LENGTH = '00000020'X
PARAMETER FAT$S_FATDEF = '00000020'X
UNION
MAP
BYTE FAT$B_RTYPE
END MAP
MAP
PARAMETER FAT$C_UNDEFINED = '00000000'X
PARAMETER FAT$C_FIXED = '00000001'X
PARAMETER FAT$C_VARIABLE = '00000002'X
PARAMETER FAT$C_VFC = '00000003'X
PARAMETER FAT$C_STREAM = '00000004'X
PARAMETER FAT$C_STREAMLF = '00000005'X
PARAMETER FAT$C_STREAMCR = '00000006'X
BYTE FAT$V_RTYPE
END MAP
MAP
PARAMETER FAT$C_SEQUENTIAL = '00000000'X
PARAMETER FAT$C_RELATIVE = '00000008'X
PARAMETER FAT$C_INDEXED = '00000010'X
PARAMETER FAT$C_DIRECT = '0000001F'X
BYTE FAT$V_FILEORG
END MAP
END UNION
PARAMETER FAT$C_FORTRANCC = '00000001'X
PARAMETER FAT$C_IMPLIEDCC = '00000002'X
PARAMETER FAT$C_PRINTCC = '00000004'X
PARAMETER FAT$C_NOSPAN = '00000008'X
PARAMETER FAT$C_MSBRCW = '00000010'X
BYTE FAT$B_RATTRIB
INTEGER*2 FAT$W_RSIZE
UNION
MAP
INTEGER*4 FAT$L_HIBLK
END MAP
MAP
INTEGER*2 FAT$W_HIBLKH
INTEGER*2 FAT$W_HIBLKL
END MAP
END UNION
UNION
MAP
INTEGER*4 FAT$L_EFBLK
END MAP
MAP
INTEGER*2 FAT$W_EFBLKH
INTEGER*2 FAT$W_EFBLKL
END MAP
END UNION
INTEGER*2 FAT$W_FFBYTE
BYTE FAT$B_BKTSIZE
BYTE FAT$B_VFCSIZE
INTEGER*2 FAT$W_MAXREC
INTEGER*2 FAT$W_DEFEXT
INTEGER*2 FAT$W_GBC
BYTE %FILL(8)
INTEGER*2 FAT$W_VERSIONS
END STRUCTURE

STRUCTURE /IOSBDEF/ ! Official definition somewhere?
INTEGER*2 IOSB_W_STATUS
INTEGER*2 IOSB_W_BYTECOUNT
INTEGER*4 IOSB_L_BLKCOUNT END STRUCTURE

STRUCTURE /ATRDSC/ ! Made up of two different pieces:
UNION !
MAP !
RECORD /DSCDEF1/ DSC1 ! 1. Sort of generic header
END MAP !
MAP !
RECORD /DSCDEF5/ DSC5 ! 2. Specific body for array descriptors
END MAP
END UNION
END STRUCTURE

RECORD /ATRDEF/ ATR(4)
RECORD /FIBDEF/ FIB
RECORD /FATDEF/ FAT
RECORD /IOSBDEF/ IOSB
RECORD /DSCDEF1/ FIBDSC ! String/generic descriptor
RECORD /ATRDSC/ ATRDSC ! Array descriptor

INTEGER*4 + SS_STATUS,
+ CHAN,
+ FUNC

INTEGER*2
+ UIC(2),
+ FPRO ! File protection bitmask

CHARACTER
+ DEVNAM*9 /'SYS$DISK:'/,
+ FILNAM*10 /'MYFILE.DAT'/

FIB.FIB$W_DID_NUM = 146 ! Actual DID of my work directory
FIB.FIB$W_DID_SEQ = 34 !
FIB.FIB$W_DID_RVN = 0 !
FIB.FIB$L_ACCTL = FIB$M_WRITETHRU
FIB.FIB$W_NMCTL = FIB$M_NEWVER
FIB.FIB$W_EXCTL = FIB$M_EXTEND + FIB$M_ALDEF
FIB.FIB$L_EXSZ = 3
FIB.FIB$L_EXVBN = 0

FAT.FAT$B_RTYPE = FAT$C_FIXED + FAT$C_SEQUENTIAL
FAT.FAT$W_RSIZE = 30
FAT.FAT$W_MAXREC = 30
FAT.FAT$W_EFBLKH = 0
FAT.FAT$W_EFBLKL = 1
FAT.FAT$W_FFBYTE = 0

UIC(1) = '201'O ! My actual UIC in octal and reversed
UIC(2) = '200'O !

FPRO = '1100110011001100'B ! RW for everyone (S,O,G,W)

ATR(1).ATR$W_SIZE = ATR$S_RECATTR
ATR(1).ATR$W_TYPE = ATR$C_RECATTR
ATR(1).ATR$L_ADDR = LOC(FAT)

ATR(2).ATR$W_SIZE = ATR$S_UIC
ATR(2).ATR$W_TYPE = ATR$C_UIC
ATR(2).ATR$L_ADDR = LOC(UIC)

ATR(3).ATR$W_SIZE = ATR$S_FPRO
ATR(3).ATR$W_TYPE = ATR$C_FPRO
ATR(3).ATR$L_ADDR = LOC(FPRO)

ATR(4).ATR$W_SIZE = 0 ! Values to signal list-end
ATR(4).ATR$W_TYPE = 0 !

FIBDSC.DSC$W_MAXSTRLEN = FIB$K_LENGTH
FIBDSC.DSC$B_DTYPE = DSC$K_DTYPE_T
FIBDSC.DSC$B_CLASS = DSC$K_CLASS_S
FIBDSC.DSC$A_POINTER = LOC(FIB)

ATRDSC.DSC1.DSC$W_MAXSTRLEN = SIZEOF(ATR)
ATRDSC.DSC1.DSC$B_DTYPE = DSC$K_DTYPE_T
ATRDSC.DSC1.DSC$B_CLASS = DSC$K_CLASS_A ! Array type descriptor
ATRDSC.DSC1.DSC$A_POINTER = LOC(ATR) ATRDSC.DSC5.DSC$B_SCALE = 0 ! Are all this things
ATRDSC.DSC5.DSC$B_DIGITS = 0 ! really needed?
ATRDSC.DSC5.DSC$B_AFLAGS = 0 !
ATRDSC.DSC5.DSC$B_DIMCT = 1 !
ATRDSC.DSC5.DSC$L_ARSIZE = SIZEOF(ATR) !
ATRDSC.DSC5.DSC$A_A0 = LOC(ATR) !

You are not using ATRDSC !?!?

FUNC = IO$_CREATE + IO$M_CREATE

SS_STATUS = SYS$ASSIGN(%DESCR(DEVNAM),CHAN,,,)

SS_STATUS = SYS$QIOW(EFN$C_ENF, ! Efn (no EF used)

I would try %VAL on that!

+ %VAL(CHAN), ! Chan
+ %VAL(FUNC), ! Func
+ %REF(IOSB), ! Iosb
+ , ! ASTadr
+ , ! ASTprm
+ %REF(FIBDSC), ! P1 (FIB)
+ %DESCR(FILNAM), ! P2 (file name)
+ , ! P3
+ , ! P4
+ %REF(ATR), ! P5 (file attr.)
+ ) ! P6

SS_STATUS = SYS$DASSGN(%VAL(CHAN))

END

Arne
.



Relevant Pages

  • Re: Liskov Substitution Principle and Abstract Factories
    ... Because it wasn't clear if X and Y map from the same S. ... >> individual dogs instead. ... > it's no matter, if you choose it to be of no matter. ... Real.Get_Value but constructing a composition: ...
    (comp.object)
  • Re: infinity
    ... This is provably true no matter what X is, ... > fail to map any element of X to w. ... >> and derive a contradiction from assuming any natural mapping to ... How many significant bits do your naturals ...
    (sci.math)
  • Re: Vineland
    ... >>I don't know that the parchment is 17th century. ... >>It doesn't matter what the burden of Seppo's post was, ... >>am unclouding the issue by arguing that the map lacks proper ... The above posting is neither a legal opinion nor legal advice, ...
    (sci.archaeology)
  • Re: Fortran problem with QIO
    ... and I have chosen the steepest approach to the matter: ... PROGRAM IOTEST ... END MAP ... String/generic descriptor ...
    (comp.os.vms)
  • Re: epoll and timeouts
    ... I'd recommend just using the descriptor. ... descriptors to internal socket structures is probably best. ... I don't think I understand why the map is better. ... hasn't exactly been known to keep the most thought-out interfaces. ...
    (comp.unix.programmer)