Re: Class Notes for a PL/I Course.

"Bernd Oppolzer berndoppolzer-/[email protected] [H390-MVS]" <[email protected]> Sat, 5 Oct 2019 00:28:59 +0200
Newsgroups gmane.comp.emulators.hercules390.mvs
Message-ID <[email protected]>
Am 04.10.2019 um 18:53 schrieb Giuseppe Vitillaro giuseppe-yuD/ahkh7LvrZ44/[email protected] 
[H390-MVS]:
>
>
> By the way. PL/I(F) doesn't have LEAVE/CYCLE
> to control a WHILE loop, isn't it? So a GOTO
> is a must for these case?
>
You're right; I didn't notice this until now.

I have some PL/1 books (PL/1 360 compiler, from 1966 and 1968),
which must be close to PL/1 (F), and there is no LEAVE statement.
This is really strange.

I learned PL/1 in 1991, when I had the first assignment at a customer
of mine to do PL/1 classes for developers there. I did only ASSEMBLER 
classes
until then, but they had a strong need for PL/1. My languages before PL/1
included Pascal, Fortran, COBOL, RPG, several ASSEMBLERs, of course,
and Microsoft BASIC etc.; some experience with ALGOL.

This was OS/PL1 V2.3; this compiler was very successful and was IBM's 
flagship
compiler until the late 1990s. Then came Visual Age PL/1 (which had a 
Windows
variant, too) and then today's Enterprise PL/1.

I never could imagine a PL/1 compiler WITHOUT a LEAVE statement.
LEAVE without arguments leaves the innermost DO group; but if you
put a label behind LEAVE, you can LEAVE a surrounding (labeled) DO 
group, too.

Today's compilers have ITERATE, too.


>
> >
> > ....
> >
> > DO WHILE (^ SW_EOF);
> > ?? READ FILE(INPF) INTO (BUF);
> > ?? ...
> >
> > END;
> >
> > /* processing continues here at EOF */
> >
>
> The problem I'm facing now, is to retrieve
> from PL/I (F) the LRECL/BLKSIZE of an IEBCOPY
> dataset at "runtime".
>
> Infact restoring an IEBCOPY dataset from
> a packed F[B](80) dataset requires to restore
> also the original LRECL/BLKSIZE, otherwise
> IEBCOPY would miserably fail at load time,
> beside the F[B](80) dataset being basically
> correct.
>
> For what I've seen there are not builtin
> functions for that, even in modern PL/I
> implementation.
>

there are some functions, for example you can retrieve the jobname etc,
IIRC. What you can get is the name of the current PL/1 procedure, which
is very handy ... PROCNAME () in Enterprise PL/1. I use this for a macro
which does trace output (for example).

But, yes, you are right, there are no functions to retrieve the attributes
of files.


>
> But I've the C code to access DDNAMES
> for an open dataset, using MVS control blocks.
>
> I guess the same logic, starting from PSA,
> at absolute address ZERO, and following down
> the chain of control blocks to JFCB can be
> also implemented in PL/I (F), as I've seen
> it implemented in modern PL/I implementations,
> under Z/OS.
>

Yes, this can be done, and I have code somewhere to find the allocated 
DDNames
in the TIOT, for example. Written in PL/1.

But: there are some troubles with the JFCBs and the file attributes on
modern systems. To access the DSN attributes, you need a macro called
SWAREQ. This cannot be done using pure PL/1 (or C) logic. Even the
TIOT is replaced by something called XTIOT on modern systems.
So that will be sort of a nightmare.

That's why I often use the functions of the C runtime from PL/1 programs,
when I need to do special things. Believe it or not: I have a C function
callable from PL/1, which allows me to do a C fopen, C fread, C fwrite
and C fclose from PL/1 programs. This way I can use all the nice features
that the C runtime provides, for example: specify DD-Names or DS-Names
at runtime, doing all sorts of dynamic allocations, that is, let them do by
the C runtime, specify LRECL, BLKSIZE and RECFM dynamically in the fopen 
string
etc. etc.

I am talking of IBMs C compiler, of course ...


>
> Does it happen you have a PL/I implementation
> already available, Bernd?
>

the code to find the TIOT etc. must be somewhere, but at the moment
I cannot find it ... maybe next week at my working site.

Kind regards

Bernd


>
> Thanks again for your nice words and your time,
>
> Peppe.
>
> .
>
>