× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.






Thanks for the advice Scott.
I have got the following code to work.
This pointer stuff is pretty simple, I am embarrassed for asking.
I used a MODS to effectively allocate 16 * 64K memory and
I got the API to pass back 1M (approx) of data max.
I then got the addr of the MODS and used based DS to get
the info I want, namely the Receiver names.
I understand I can 'fine tune' the actual size to pass to
the API but as I got a 16 occur DS I dont think its needed.
If the code below has flaws I would appreciate comments
as I am still a bit afraid of pointers, I know its possible to
crash stuff (OS maybe) if pointers go awry.

Thanks
Frank Kolmann


     H DFTACTGRP(*NO) ACTGRP(*CALLER)  OPTIMIZE(*NONE)

     D RtvJrnInf       PR                  ExtProc( 'QjoRetrieveJournal+
     D                                               Information' )
     D  RjRcvrVar                     1    Const
     D                                     Options( *VarSize )
     D  RjLenRcvrVar                 10I 0 Const
     D  RjQlJrnName                  20    Const
     D  RjFmtName                     8    Const
     D  RjJrnInf                      1    Const
     D                                     Options( *VarSize )
     D  RjApiErr                           Like( ApiErr )

     D ApiErr          DS
     D  AeBytesProv                  10U 0
     D  AeBytesRetd                  10U 0
     D  AeMsgId                       7
     D                                1
     D  AeMsgDta                    256

      * This DS is initialised to request that we want ALL the
      * receivers associated with the journal
      * VD Key = 1 means Journal Receiver Directory Information
      *JrnInfToRtv     DS
      * JtrNumVarLenR  This is 1  as I am only sending(asking) for 1 set of
info
      * VDLen          The length of this request is 16 bytes (not incl
JtrNumVarLenR)
      * VDKey          I am asking for the reveivers  (code is 1)
      * VDLenDta       This req passes no data but a min of 4 bytes must be
specified
      * VDDta          This is the 4 empty bytes

     D JrnInfToRtv     DS
     D  JtrNumVarLenR                10I 0 Inz(1)
     D  VDLen                        10U 0 Inz(16)
     D  VDKey                        10U 0 Inz(1)
     D  VDLenDta                     10U 0 Inz(4)
     D  VDDta                         4

     D PrmJrnName      S             10
     D PrmJrnLib       S             10
     D DtaStr          S             10U 0
     D KeyDtaPos       S             10U 0
     D RcvDtaPos       S             10U 0
     D I               S             10U 0
     D J               S             10U 0

     D Psize           S             10U 0 Inz(1048560)
     D PS              S               *
     D P1              S               *
     D P2              S               *
     D P3              S               *

     D RJRN0100        DS         65535    OCCURS(16)
     D  RjBytesRetd                  10I 0
     D  RjBytesAvl                   10I 0
     D  RjKeyOffs                    10I 0
     D  RjJnlNam                     10
     D  RjJnlLib                     10
     D  RjAttachRcvrN        201    210
     D  RjAttachRcvrL        211    220
     D  Rfill1               448    448
     D  RjKeys                       10U 0

     *****  Use offsets to get to the receiver info
     D ApiKeys         DS                  based(P1)
     D  RjKey                        10U 0
     D  RjKeyOff                     10U 0
     D  RjKeyHdrLen                  10U 0
     D  RjKeyNumEnt                  10U 0
     D  RjKeyEntLen                  10U 0

     *****  KEY 1 (Jnl Receiver data)
     D RcvInf          DS                  based(P2)
     D  RjTotRcv                     10U 0
     D  RjTotRcvSiz                  10U 0
     D  RjTotSizMult                 10U 0
     D  RjResrv1                      8

     D RcvInfDS        DS                  based(P3)
     D  RjRcvNam                     10
     D  RjRcvLib                     10
     D  RjRcvNbr                      5
     D  RjRcvAttDte                  13
     D  RjRcvSts                      1
     D  RjRcvSavDte                  13
     D  RjRcvLclSys                   8
     D  RjRcvSrcSys                   8
     D  RjRcvSiz                     10U 0
     D  RjResrv2                     56

     C     *Entry        Plist
     C                   Parm                    PrmJrnName
     C                   Parm                    PrmJrnLib
      /Free

          *INLR = *On;

       // Initialize bytes provided in two data structures
          AeBytesProv = %Size( ApiErr );
          RjBytesAvl  = Psize;

       //  Invoke the QjoRetrieveJournal API
          CallP     RtvJrnInf( RJRN0100:
                             Psize:
                      PrmJrnName + PrmJrnLib:
                              'RJRN0100':
                              JrnInfToRtv:
                              ApiErr  );

       //  Following the above CallP, if AeBytesRetd = *Zero, then
       //  RjAttachedRcvrName contains the attached receiver name and
       //  RjAttachedRcvrLib contains the attached receiver library name
        RjAttachRcvrN  =   RjAttachRcvrN;
        RjAttachRcvrL  =   RjAttachRcvrL;
        DtaStr         =   RjKeyOffs + 4; //Key data actually starts from
RjKeys on

        PS             =   %Addr(RJRN0100);
        P1             =   PS + DtaStr - 20;

        for j = 1 to RjKeys;
        P1             =   P1        + 20;
        If  RjKey = 1;   // Process Receiver Info
       // Now we are going to get all the receiver names
        ExSR  GetRcvNam;
        EndIf;
        endfor;


        BegSR  GetRcvNam;

        P2             =   PS + DtaStr + RjKeyOff ;
        P3             =   PS + DtaStr + RjKeyOff  + RjKeyHdrLen-
RjKeyEntLen;

        for j = 1 to RjKeyNumEnt;

        P3             =   P3        +  RjKeyEntLen;
          // Here we have the name of each Receiver in turn in RjRcvNam
        RjRcvNam       = RjRcvNam;

        endfor;
        EndSR;

      /end-free

>
>from: Scott Klement <rpg400-l@xxxxxxxxxxxxxxxx>
>subject: Re: Journal Receiver Example. Help needed.
>> I have used code posted recently that showed how to get the name of the
>> attached journal receiver,
>
>Hmmm... some of the coding style looks like Carsten Flensburg (I read a
>lot of his code for some reason) other parts of it don't look familiar --
>I assume that that's your part of it.
>
>[SNIP]
>> In the archives I note Carsten Flensburg and others mention pointer
>> handles.
>
>Not sure what you mean by "handles" but yes, a little bit of pointer logic
>would certainly solve your problem.
>
>> Can I use pointers to get back more than 64K bytes of data in case I
have
>> more than 512 associated receivers.
>
>Well, a pointer just points to an address in RAM, it does not infer any
>length by itself.   You can ask the system to allocate memory for you in a
>few different ways...  The most basic way is to use the %ALLOC() BIF (or
>ALLOC op-code) to grab a chunk of memory from the heap -- which is limited
>to about 16mb of data.  Much more than 64k!
>
>Other methods would be to get a pointer to a user space, which would give
>you a 16mb area that could be configured to automatically expand as
>needed.
>
>Or to use teraspace, which would give you the ability to address gigabytes
>of memory at once -- if you really need to go that high ;)
>
>> Can I get the API to populate a User Space or a MODS.
>> I have used User Spaces previously but those APIs directly populated.
>> I have searched the archives but I am too thick to get it, any help is
>> muchly appreciated.
>
>It's too late and I'm too tired to code a complete example of this.
>Try taking the following steps:
>
>   1) Call the API with a very small data structure that contains only
>       two fields, the "bytes provided" and "bytes available" fields.
>       The API will put the number of bytes of memory that it needs
>       into the "bytes available" field -- you can use this to create
>       a data area or memory allocation of the appropriate size.
>
>   2) Create a user space, or allocate memory.  In either case, you'll
>       want to get a pointer to that memory.
>
>   3) Base a variable on the pointer from step 2.
>
>   4) Call the API again, this time pass the variable from step 3 as
>       the receiver variable to the API.  The API will load up the memory
>       that the variable is in -- and since the variable is based on the
>       pointer, that area of memory will be the area that the user space
>       or ALLOC-ed memory resides in.
>
>   5) Access the memory as needed with a pointer.
>
>   6) When you're done, either deallocate the memory with the DEALLOC
>      op-code or delete the user space.
>
>Hope that helps...


As an Amazon Associate we earn from qualifying purchases.

This thread ...

Follow-Ups:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.