Difference between revisions of "CQDFRTVFD"

From MidrangeWiki
Jump to: navigation, search
(another version usrspc)
(DISPINFOC1 Vesion with User Space)
Line 587: Line 587:
  
  
===DISPINFOC1  Vesion with User Space ===
+
===DISPINFOC1  Version with User Space ===
  
  
Line 595: Line 595:
 
/* Function: This program uses the QDFRTVFD API to return the */
 
/* Function: This program uses the QDFRTVFD API to return the */
 
/* structure of a display file.  */
 
/* structure of a display file.  */
 +
 +
 +
DISPINFOC1
 +
 +
/* Function: This program uses the QDFRTVFD API to return the */
 +
/* structure of a display file.  */
 +
 
   
 
   
 
#include <stdio.h>
 
#include <stdio.h>
Line 601: Line 608:
 
#include "QSYSINC/H/QUSEC"
 
#include "QSYSINC/H/QUSEC"
 
#include "QSYSINC/H/QDFRTVFD"
 
#include "QSYSINC/H/QDFRTVFD"
 +
 
#include <mispace.h>
 
#include <mispace.h>
 
#include <pointer.h>
 
#include <pointer.h>
Line 606: Line 614:
 
#include <except.h>
 
#include <except.h>
 
#include <qtes.h>
 
#include <qtes.h>
 +
 
   
 
   
 
     /* Link up the Create User Space API */
 
     /* Link up the Create User Space API */
 
     #pragma linkage(CreateUserSpace,OS)
 
     #pragma linkage(CreateUserSpace,OS)
 
     #pragma map(CreateUserSpace,"QUSCRTUS")
 
     #pragma map(CreateUserSpace,"QUSCRTUS")
 +
 
     void    CreateUserSpace(char[20],
 
     void    CreateUserSpace(char[20],
 
                         char[10],
 
                         char[10],
Line 619: Line 629:
 
                         _TE_ERROR_CODE_T *
 
                         _TE_ERROR_CODE_T *
 
                         );
 
                         );
 +
 
     /* Link up the Delete User Space API */
 
     /* Link up the Delete User Space API */
 
     #pragma linkage(DeleteUserSpace,OS)
 
     #pragma linkage(DeleteUserSpace,OS)
Line 625: Line 636:
 
                         _TE_ERROR_CODE_T *
 
                         _TE_ERROR_CODE_T *
 
                         );
 
                         );
 +
 
     /* Link up the Retrieve Pointer to User Space API */
 
     /* Link up the Retrieve Pointer to User Space API */
 
     #pragma linkage(RetrievePointerToUserSpace,OS)
 
     #pragma linkage(RetrievePointerToUserSpace,OS)
Line 632: Line 644:
 
                                 _TE_ERROR_CODE_T *
 
                                 _TE_ERROR_CODE_T *
 
                                 );
 
                                 );
 +
 
   
 
   
 
#define EQ      ==
 
#define EQ      ==
 +
 
#define fail() do { printf("\nLine %d FAILED in file %s", \
 
#define fail() do { printf("\nLine %d FAILED in file %s", \
 
__LINE__,__FILE__); \
 
__LINE__,__FILE__); \
 
} while(0)
 
} while(0)
 +
 
/* Pointers to structures required to be used by this program. */
 
/* Pointers to structures required to be used by this program. */
 
QDFFBASE_t *p_QDFFBASE;
 
QDFFBASE_t *p_QDFFBASE;
Line 667: Line 682:
 
QDFKEDTR_t *p_QDFKEDTR;
 
QDFKEDTR_t *p_QDFKEDTR;
 
QDFKDFPM_t *p_QDFKDFPM;
 
QDFKDFPM_t *p_QDFKDFPM;
 +
 
   
 
   
 
     /* Global variables */
 
     /* Global variables */
Line 676: Line 692:
 
     char *p_iCol;
 
     char *p_iCol;
 
     char *p_iFunc;
 
     char *p_iFunc;
 +
 
/* returned data  */
 
/* returned data  */
 
typedef struct FieldData {
 
typedef struct FieldData {
Line 689: Line 706:
 
     int  EndDta;
 
     int  EndDta;
 
   } FieldData_t;
 
   } FieldData_t;
 +
 
FieldData_t *p_FieldData;
 
FieldData_t *p_FieldData;
 
FieldData_t *Odata;
 
FieldData_t *Odata;
 +
 
     typedef struct inputArguments
 
     typedef struct inputArguments
 
     {
 
     {
Line 703: Line 722:
 
         FieldData_t *iOdata;
 
         FieldData_t *iOdata;
 
     } main_args_t;
 
     } main_args_t;
 +
 
     int RtvApiDta (void);
 
     int RtvApiDta (void);
 
     int ProcessRec (void);
 
     int ProcessRec (void);
Line 710: Line 730:
 
     int ProcessCat23(void);
 
     int ProcessCat23(void);
 
     int ProcessCat24(void);
 
     int ProcessCat24(void);
 +
 
     int RecIndex;
 
     int RecIndex;
 +
 
   /* Area into which the QDFRTVFD returns  the requested data.*/
 
   /* Area into which the QDFRTVFD returns  the requested data.*/
 +
 
     char *pBuffer;
 
     char *pBuffer;
 
     _TE_ERROR_CODE_T errorCode;
 
     _TE_ERROR_CODE_T errorCode;
 +
 
   
 
   
 
     char FileName[20] = "                    ";
 
     char FileName[20] = "                    ";
    char Fldblank[3000] = { " " };
 
 
     char Format[8];
 
     char Format[8];
 
     int  EndFlds = 0;
 
     int  EndFlds = 0;
 +
 
     /* 4 bytes WDFFRETN Length of the returned data. */
 
     /* 4 bytes WDFFRETN Length of the returned data. */
 
     /* 4 bytes WDFFSIZE Size of the display file description */
 
     /* 4 bytes WDFFSIZE Size of the display file description */
Line 726: Line 750:
 
         int ReturnSiz;
 
         int ReturnSiz;
 
     } RtvSizeInfo_t;
 
     } RtvSizeInfo_t;
 +
 +
 
   
 
   
 
   /* ########################################################  */
 
   /* ########################################################  */
 
int main(int argc, main_args_t *main_args)
 
int main(int argc, main_args_t *main_args)
 
{
 
{
 +
 
     char Funct[10] = "          ";
 
     char Funct[10] = "          ";
 +
 
     p_iFile  =  main_args->iFile;
 
     p_iFile  =  main_args->iFile;
 
     p_iLib    =  main_args->iLib;
 
     p_iLib    =  main_args->iLib;
Line 739: Line 767:
 
     p_iFunc  =  main_args->iFunc;
 
     p_iFunc  =  main_args->iFunc;
 
     Odata    =  main_args->iOdata;
 
     Odata    =  main_args->iOdata;
 +
 +
 
   
 
   
 
       /* On First pass get the API data */
 
       /* On First pass get the API data */
Line 745: Line 775:
 
             RtvApiDta();
 
             RtvApiDta();
 
             };
 
             };
 +
 
         if (!memcmp(Funct, "#NEXT", 5)) {
 
         if (!memcmp(Funct, "#NEXT", 5)) {
 
     /*! call RetrievePointerToUserSpace - Retrieve Pointer to User Space */
 
     /*! call RetrievePointerToUserSpace - Retrieve Pointer to User Space */
Line 752: Line 783:
 
                             &errorCode);
 
                             &errorCode);
 
       }
 
       }
 +
 
     ProcessRec();
 
     ProcessRec();
 +
 
   
 
   
 
     /*  free(ReturnVar);  */
 
     /*  free(ReturnVar);  */
 
}
 
}
 +
 +
 
   
 
   
 
   
 
   
 
   /* ######################################### */
 
   /* ######################################### */
 +
 
     RtvApiDta() {
 
     RtvApiDta() {
 +
 
     RtvSizeInfo_t *RtvSize;
 
     RtvSizeInfo_t *RtvSize;
 
     int  API_Len;
 
     int  API_Len;
 +
 
     Qus_EC_t Error_Code = {0};
 
     Qus_EC_t Error_Code = {0};
 +
 
   
 
   
 
     /* Define the API format requested and the display file to access */
 
     /* Define the API format requested and the display file to access */
Line 769: Line 808:
 
     memmove(FileName,p_iFile, strlen(p_iFile));
 
     memmove(FileName,p_iFile, strlen(p_iFile));
 
     memmove(FileName + 10 ,p_iLib, strlen(p_iLib ));
 
     memmove(FileName + 10 ,p_iLib, strlen(p_iLib ));
 +
 
     /* Invoke the API. to get the size needed */
 
     /* Invoke the API. to get the size needed */
 
     RtvSize =  malloc(8);
 
     RtvSize =  malloc(8);
Line 782: Line 822:
 
     API_Len  =  RtvSize->ReturnSiz;
 
     API_Len  =  RtvSize->ReturnSiz;
 
     free(RtvSize);
 
     free(RtvSize);
 +
 
     CreateUserSpace("RTVFDUSPC QTEMP      ",
 
     CreateUserSpace("RTVFDUSPC QTEMP      ",
 
                     "USRSPC    ",
 
                     "USRSPC    ",
Line 791: Line 832:
 
                     &errorCode
 
                     &errorCode
 
                     );
 
                     );
 +
 
     /*! call RetrievePointerToUserSpace - Retrieve Pointer to User Space */
 
     /*! call RetrievePointerToUserSpace - Retrieve Pointer to User Space */
 
     /*!! (pass: Name and library of user space, pointer variable */
 
     /*!! (pass: Name and library of user space, pointer variable */
Line 799: Line 841:
 
                             &pBuffer,
 
                             &pBuffer,
 
                             &errorCode);
 
                             &errorCode);
 +
 
     QDFRTVFD (pBuffer,
 
     QDFRTVFD (pBuffer,
 
                 API_Len,
 
                 API_Len,
Line 810: Line 853:
 
     }
 
     }
 
}
 
}
 +
 +
 
   
 
   
 
   
 
   
 
   /* ######################################### */
 
   /* ######################################### */
 
int ProcessRec() {
 
int ProcessRec() {
 +
 
     int  NumRecs;
 
     int  NumRecs;
 
     int i;
 
     int i;
Line 826: Line 872:
 
     p_QDFWRCDI = (QDFWRCDI_t *)((char *) p_QDFWFLEI + p_QDFWFLEI->WDFWXLEN);
 
     p_QDFWRCDI = (QDFWRCDI_t *)((char *) p_QDFWFLEI + p_QDFWFLEI->WDFWXLEN);
 
     p_QDFFNTBL = (QDFFNTBL_t *)((char *) p_QDFWFLEI + p_QDFWFLEI->WDFWNTBO);
 
     p_QDFFNTBL = (QDFFNTBL_t *)((char *) p_QDFWFLEI + p_QDFWFLEI->WDFWNTBO);
 +
 
     /*  here is the place to retreive File Keywords */
 
     /*  here is the place to retreive File Keywords */
 +
 
     NumRecs = p_QDFFBASE->WDFFRCS;
 
     NumRecs = p_QDFFBASE->WDFFRCS;
 +
 
     for (i=0; i< NumRecs ; ++i) {
 
     for (i=0; i< NumRecs ; ++i) {
 +
 
         /* Bump ptr to next record structure */
 
         /* Bump ptr to next record structure */
 
       if  (i  != 0)
 
       if  (i  != 0)
 
     {p_QDFWRCDI = (QDFWRCDI_t *)((char *) p_QDFWRCDI + p_QDFWRCDI->WDFWNXTR);
 
     {p_QDFWRCDI = (QDFWRCDI_t *)((char *) p_QDFWRCDI + p_QDFWRCDI->WDFWNXTR);
 
       p_QDFARFTE = (QDFARFTE_t *)((char *) p_QDFARFTE + sizeof(QDFARFTE_t));  }
 
       p_QDFARFTE = (QDFARFTE_t *)((char *) p_QDFARFTE + sizeof(QDFARFTE_t));  }
 +
 
     memcpy(Odata->RecordName,
 
     memcpy(Odata->RecordName,
 
             p_QDFARFTE->WDFARFNM,sizeof(p_QDFARFTE->WDFARFNM));
 
             p_QDFARFTE->WDFARFNM,sizeof(p_QDFARFTE->WDFARFNM));
 +
 
     if  (i EQ NumRecs - 1) {
 
     if  (i EQ NumRecs - 1) {
 
       EndFlds = 1;
 
       EndFlds = 1;
 
       }
 
       }
 +
 
     ProcessField(&GotIt);
 
     ProcessField(&GotIt);
 +
 +
 
   
 
   
 
     }
 
     }
 +
 
}
 
}
 +
 
   /* ######################################### */
 
   /* ######################################### */
 +
 
int ProcessField(int *GotIt) {
 
int ProcessField(int *GotIt) {
 +
 
       int SflCtl;
 
       int SflCtl;
 
       int SizeIdx;
 
       int SizeIdx;
Line 852: Line 911:
 
       char X01    =  0x01 ;
 
       char X01    =  0x01 ;
 
       char Functn[10] = "          ";
 
       char Functn[10] = "          ";
 +
 
       /*  record header  */
 
       /*  record header  */
 
       p_QDFFRINF = (QDFFRINF_t *)((char *) p_QDFFINFO + p_QDFARFTE->WDFARFOF);
 
       p_QDFFRINF = (QDFFRINF_t *)((char *) p_QDFFINFO + p_QDFARFTE->WDFARFOF);
Line 867: Line 927:
 
     p_QDFFSFHR  = (QDFFSFHR_t *)((char *) p_QDFFSFCR + sizeof(QDFFSFCR_t));
 
     p_QDFFSFHR  = (QDFFSFHR_t *)((char *) p_QDFFSFCR + sizeof(QDFFSFCR_t));
 
         }
 
         }
 +
 
     for (SizeIdx=0; SizeIdx<p_QDFFBASE->WDFFSCR ; ++SizeIdx) {
 
     for (SizeIdx=0; SizeIdx<p_QDFFBASE->WDFFSCR ; ++SizeIdx) {
 
     p_QDFFSCRA  = (QDFFSCRA_t *)((char *) p_QDFFBASE + sizeof(QDFFBASE_t)
 
     p_QDFFSCRA  = (QDFFSCRA_t *)((char *) p_QDFFBASE + sizeof(QDFFBASE_t)
Line 878: Line 939:
 
     /* used. */
 
     /* used. */
 
       p_QDFFRCTB = (QDFFRCTB_t *)((char *) p_QDFFRINF + p_QDFFRDPD->WDFFDRCO);
 
       p_QDFFRCTB = (QDFFRCTB_t *)((char *) p_QDFFRINF + p_QDFFRDPD->WDFFDRCO);
 +
 
     /********  HERE include code for Record Keywords ********/
 
     /********  HERE include code for Record Keywords ********/
 +
 
     /*  PROCESS THE RECORDS FIELDS    */
 
     /*  PROCESS THE RECORDS FIELDS    */
 
         /* Find where used section */
 
         /* Find where used section */
 +
 
       p_QDFWFLDI = (QDFWFLDI_t *)((char *) p_QDFWRCDI + p_QDFWRCDI->WDFWRLEN);
 
       p_QDFWFLDI = (QDFWFLDI_t *)((char *) p_QDFWRCDI + p_QDFWRCDI->WDFWRLEN);
 
       p_QDFFFITB = (QDFFFITB_t *)((char *) p_QDFFRINF + p_QDFFRINF->WDFFOFIT
 
       p_QDFFFITB = (QDFFFITB_t *)((char *) p_QDFFRINF + p_QDFFRINF->WDFFOFIT
 
                   +  ( p_QDFWFLDI->WDFWRRDX -1) * sizeof(QDFFFITB_t));
 
                   +  ( p_QDFWFLDI->WDFWRRDX -1) * sizeof(QDFFFITB_t));
 +
 
   
 
   
 
     for (FldIdx=0; FldIdx < p_QDFFRINF->WDFFFLD; ++FldIdx) {
 
     for (FldIdx=0; FldIdx < p_QDFFRINF->WDFFFLD; ++FldIdx) {
 +
 
       /* Field Header  */
 
       /* Field Header  */
 
     p_QDFFFINF = (QDFFFINF_t *)((char *) p_QDFFRINF + p_QDFFFITB->WDFFFOFS);
 
     p_QDFFFINF = (QDFFFINF_t *)((char *) p_QDFFRINF + p_QDFFFITB->WDFFFOFS);
 +
 
     if (p_QDFFFINF->WDFFFIOA EQ 0x01)  {
 
     if (p_QDFFFINF->WDFFFIOA EQ 0x01)  {
 
       /* constant  */
 
       /* constant  */
Line 901: Line 968:
 
       /* Field Extension  */
 
       /* Field Extension  */
 
     p_QDFFXFDP = (QDFFXFDP_t *)((char *) p_QDFFFINF + p_QDFFFDPD->WDFFXFDO);
 
     p_QDFFXFDP = (QDFFXFDP_t *)((char *) p_QDFFFINF + p_QDFFFDPD->WDFFXFDO);
 +
 
       /* Row Column  */
 
       /* Row Column  */
 
     p_QDFFRCTB = (QDFFRCTB_t *)((char *) p_QDFFRINF + p_QDFFRDPD->WDFFDRCO
 
     p_QDFFRCTB = (QDFFRCTB_t *)((char *) p_QDFFRINF + p_QDFFRDPD->WDFFDRCO
 
                     + (p_QDFWFLDI->WDFWRRDX - 1) *2);
 
                     + (p_QDFWFLDI->WDFWRRDX - 1) *2);
 
     p_QDFFRCTE = (QDFFRCTE_t *)((char *) p_QDFFRCTB + sizeof(QDFFRCTB_t));
 
     p_QDFFRCTE = (QDFFRCTE_t *)((char *) p_QDFFRCTB + sizeof(QDFFRCTB_t));
 +
 
       *Odata->ROW  =  p_QDFFRCTE->WDFFSROW;
 
       *Odata->ROW  =  p_QDFFRCTE->WDFFSROW;
 
       *Odata->COL  =  p_QDFFRCTE->WDFFSCOL;
 
       *Odata->COL  =  p_QDFFRCTE->WDFFSCOL;
 +
 
       /*  here can extract data time flags */
 
       /*  here can extract data time flags */
 +
 
       /* CONSTANTS  */
 
       /* CONSTANTS  */
 
     if (p_QDFFFINF->WDFFFIOA EQ 0x01)  {
 
     if (p_QDFFFINF->WDFFFIOA EQ 0x01)  {
 
       /* constant  */
 
       /* constant  */
 
       ProcessCons();
 
       ProcessCons();
 +
 
     }
 
     }
 
     else {
 
     else {
 
         /*  Field Name  */
 
         /*  Field Name  */
 +
 
       p_QDFFNTB  = (QDFFNTB_t *)((char *) p_QDFFNTBL + sizeof(QDFFNTBL_t)
 
       p_QDFFNTB  = (QDFFNTB_t *)((char *) p_QDFFNTBL + sizeof(QDFFNTBL_t)
 
                           +  10 * (p_QDFWFLDI->WDFWNMEI -1) );
 
                           +  10 * (p_QDFWFLDI->WDFWNMEI -1) );
 +
 
   
 
   
 
       /*Field attribute.  */
 
       /*Field attribute.  */
Line 927: Line 1,001:
 
       /*X'07' indicates Program to System (P) */
 
       /*X'07' indicates Program to System (P) */
 
       *Odata->FldIO    = p_QDFFFINF->WDFFFIOA;
 
       *Odata->FldIO    = p_QDFFFINF->WDFFFIOA;
 +
 
       /* Keyboard shift and data type.  */
 
       /* Keyboard shift and data type.  */
 
       /* X'00' indicates Alpha shift/character (A), */
 
       /* X'00' indicates Alpha shift/character (A), */
 +
 
   
 
   
 
         *Odata->FldAtr  = p_QDFFFNAM->WDFFKBDT;
 
         *Odata->FldAtr  = p_QDFFFNAM->WDFFKBDT;
 
         memcpy(Odata->FldNam,
 
         memcpy(Odata->FldNam,
 
               p_QDFFNTB->WDFFNAM,sizeof(p_QDFFNTB->WDFFNAM));
 
               p_QDFFNTB->WDFFNAM,sizeof(p_QDFFNTB->WDFFNAM));
         memcpy(Odata->FldCom,Fldblank,3000);
+
         memset(Odata->FldCom,' ',3000);
 
         Odata->FldPlen  = p_QDFFFNAM->WDFFPLEN;
 
         Odata->FldPlen  = p_QDFFFNAM->WDFFPLEN;
 
         Odata->FldDec  = p_QDFFFNAM->WDFFDEC;
 
         Odata->FldDec  = p_QDFFFNAM->WDFFDEC;
 
     }
 
     }
 +
 
   /***********  HERE include code for Field KEYWORDS **********/
 
   /***********  HERE include code for Field KEYWORDS **********/
 
       if (FldIdx < p_QDFFRINF->WDFFFLD -1) {
 
       if (FldIdx < p_QDFFRINF->WDFFFLD -1) {
Line 943: Line 1,020:
 
                   +  ( p_QDFWFLDI->WDFWRRDX -1) * sizeof(QDFFFITB_t));
 
                   +  ( p_QDFWFLDI->WDFWRRDX -1) * sizeof(QDFFFITB_t));
 
       }
 
       }
 +
 
       NumFlds += 1;
 
       NumFlds += 1;
 +
 
       Odata->EndDta  = 0;
 
       Odata->EndDta  = 0;
 +
 
   /* End ofthe Fields  */
 
   /* End ofthe Fields  */
 
       if ((EndFlds EQ 1) && (FldIdx EQ p_QDFFRINF->WDFFFLD -1) ) {
 
       if ((EndFlds EQ 1) && (FldIdx EQ p_QDFFRINF->WDFFFLD -1) ) {
Line 952: Line 1,032:
 
                         &errorCode);
 
                         &errorCode);
 
       };
 
       };
 +
 
       /* Return the requested Field  */
 
       /* Return the requested Field  */
 
       memmove(Functn,p_iFunc, strlen(p_iFunc));
 
       memmove(Functn,p_iFunc, strlen(p_iFunc));
 +
 
         if (!memcmp(Functn , "#FIRST", 6)) {
 
         if (!memcmp(Functn , "#FIRST", 6)) {
 
             *GotIt = 1;
 
             *GotIt = 1;
 
           };
 
           };
 +
 
         if (*GotIt)  {
 
         if (*GotIt)  {
 
             *GotIt  = 0;
 
             *GotIt  = 0;
 
             exit(0);
 
             exit(0);
 
           };
 
           };
 +
 
     /* We know we are about to get the NEXT record when we have */
 
     /* We know we are about to get the NEXT record when we have */
 
     /* found the record just before                            */
 
     /* found the record just before                            */
Line 974: Line 1,058:
 
           };
 
           };
 
         };
 
         };
 +
 +
 
   
 
   
 
     }
 
     }
 +
 
}
 
}
 +
 
   /* ######################################### */
 
   /* ######################################### */
 +
 
int ProcessCons() {
 
int ProcessCons() {
 
       /*------------------------------------------------*/
 
       /*------------------------------------------------*/
Line 983: Line 1,072:
 
       /*  for a constant field (text on the screen.)    */
 
       /*  for a constant field (text on the screen.)    */
 
       /*------------------------------------------------*/
 
       /*------------------------------------------------*/
 +
 
   int cc;
 
   int cc;
 +
 
     if  (p_QDFFFDPD->WDFFFDOC > 0) {
 
     if  (p_QDFFFDPD->WDFFFDOC > 0) {
 +
 
   /* p_QDFFRINF = (QDFFRINF_t *)((char *) p_QDFFINFO + p_QDFFFINF );*/
 
   /* p_QDFFRINF = (QDFFRINF_t *)((char *) p_QDFFINFO + p_QDFFFINF );*/
 
   /* p_QDFFRINF  = p_QDFFINFO + QDFARFTE.WDFARFOF */
 
   /* p_QDFFRINF  = p_QDFFINFO + QDFARFTE.WDFARFOF */
 +
 
         p_QDFFCOSA = (QDFFCOSA_t *) ((char *) p_QDFFFINF +
 
         p_QDFFCOSA = (QDFFCOSA_t *) ((char *) p_QDFFFINF +
 
                                                 p_QDFFFDPD->WDFFFDOC);
 
                                                 p_QDFFFDPD->WDFFFDOC);
 
       cc = 0;
 
       cc = 0;
 
       for (cc=0; cc<=p_QDFFCOSA->WDFFCCT -1 ; ++cc) {
 
       for (cc=0; cc<=p_QDFFCOSA->WDFFCCT -1 ; ++cc) {
 +
 
           p_QDFFCCOA  = (QDFFCCOA_t *)((char *) p_QDFFCOSA +
 
           p_QDFFCCOA  = (QDFFCCOA_t *)((char *) p_QDFFCOSA +
 
                             sizeof(QDFFCOSA_t) + sizeof(QDFFCCOA_t) * cc);
 
                             sizeof(QDFFCOSA_t) + sizeof(QDFFCCOA_t) * cc);
 +
 
   
 
   
 
           if (p_QDFFCCOA->WDFFCAID EQ 0x22) {
 
           if (p_QDFFCCOA->WDFFCAID EQ 0x22) {
Line 999: Line 1,094:
 
               ProcessCat22();
 
               ProcessCat22();
 
             }
 
             }
 +
 
   
 
   
 
           if (p_QDFFCCOA->WDFFCAID EQ 0x23) {
 
           if (p_QDFFCCOA->WDFFCAID EQ 0x23) {
Line 1,005: Line 1,101:
 
               ProcessCat23();
 
               ProcessCat23();
 
             }
 
             }
 +
 
   
 
   
 
           if (p_QDFFCCOA->WDFFCAID EQ 0x24) {
 
           if (p_QDFFCCOA->WDFFCAID EQ 0x24) {
Line 1,011: Line 1,108:
 
               ProcessCat24();
 
               ProcessCat24();
 
             }
 
             }
 +
 
       }
 
       }
 +
 +
 
   
 
   
 
   
 
   
 
     }
 
     }
 +
 
   
 
   
 
}
 
}
 +
 
   /* ######################################### */
 
   /* ######################################### */
 +
 
int ProcessCat22() {
 
int ProcessCat22() {
 
       /*-----------------------------------------------*/
 
       /*-----------------------------------------------*/
Line 1,024: Line 1,127:
 
       /*-----------------------------------------------*/
 
       /*-----------------------------------------------*/
 
}
 
}
 +
 
   /* ######################################### */
 
   /* ######################################### */
 +
 
int ProcessCat23() {
 
int ProcessCat23() {
 
       /*------------------------------------------------*/
 
       /*------------------------------------------------*/
Line 1,033: Line 1,138:
 
     char Temp[3000];
 
     char Temp[3000];
 
} KwdData_t;
 
} KwdData_t;
 +
 
   KwdData_t  *p_KwdData;
 
   KwdData_t  *p_KwdData;
 
   int        ck;
 
   int        ck;
 +
 
   for (ck=1; ck <= p_QDFKDFT->WDFKDFS ; ++ck) {
 
   for (ck=1; ck <= p_QDFKDFT->WDFKDFS ; ++ck) {
 +
 
     if  (ck EQ 1 )  {
 
     if  (ck EQ 1 )  {
 
     p_QDFKDFPM = (QDFKDFPM_t *)((char *) p_QDFKDFT + sizeof(QDFKDFT_t));  }
 
     p_QDFKDFPM = (QDFKDFPM_t *)((char *) p_QDFKDFT + sizeof(QDFKDFT_t));  }
 
     else
 
     else
 
     {p_QDFKDFPM = (QDFKDFPM_t *)((char *) p_QDFKDFPM  + sizeof(QDFKDFPM_t)); }
 
     {p_QDFKDFPM = (QDFKDFPM_t *)((char *) p_QDFKDFPM  + sizeof(QDFKDFPM_t)); }
 +
 
         if (p_QDFKDFPM->WDFKDFID EQ 0x01)  {
 
         if (p_QDFKDFPM->WDFKDFID EQ 0x01)  {
 +
 
         memcpy(Odata->FldNam,"          ",10);
 
         memcpy(Odata->FldNam,"          ",10);
 +
 
         Odata->FldPlen  = p_QDFKDFPM->WDFKDFLN;
 
         Odata->FldPlen  = p_QDFKDFPM->WDFKDFLN;
 
         *Odata->FldIO  = p_QDFFFINF->WDFFFIOA;
 
         *Odata->FldIO  = p_QDFFFINF->WDFFFIOA;
Line 1,047: Line 1,158:
 
         memcpy(Odata->FldCom,
 
         memcpy(Odata->FldCom,
 
                 p_KwdData->Temp, p_QDFKDFPM->WDFKDFLN);
 
                 p_KwdData->Temp, p_QDFKDFPM->WDFKDFLN);
 +
 
         }
 
         }
 +
 
     }
 
     }
 +
 
   
 
   
 
}
 
}
 +
 
   /* ######################################### */
 
   /* ######################################### */
 +
 
int ProcessCat24() {
 
int ProcessCat24() {
 
       /*-----------------------------------------------*/
 
       /*-----------------------------------------------*/
Line 1,058: Line 1,174:
 
       /*-----------------------------------------------*/
 
       /*-----------------------------------------------*/
 
}
 
}
 +
 +
 +
 +
 +
RTVFLD1
 +
    h Option(*NODEBUGIO)  DFTACTGRP(*NO)
 +
 +
    D RTVFLD1        PR
 +
    D                              10A
 +
    D                              10A
 +
 +
    D RTVFLD1        PI
 +
    D iLib                          10A
 +
    D iFile                        10A
 +
 +
    D DISPINFOC1      PR                  ExtPgm('DISPINFOC1')
 +
    D Lib                          10A  const
 +
    D File                          10A  const
 +
    D oRecord                      10A  const
 +
    D oField                        10A  const
 +
    D oRow                          1A  const
 +
    D oCol                          1A  const
 +
    D Func                          10A  const
 +
    D Fdata                              like(RTVDATA)
 +
          // returned data
 +
    D RTVDATA        DS
 +
    D RecordName                    10A
 +
    D ROW                            1A
 +
    D COL                            1A
 +
    D FldIO                          1A
 +
    D FldAtr                        1A
 +
    D FldNam                        10A
 +
    D FldCom                      3000A
 +
    D FLdPlen                      10I 0
 +
    D FldDec                        10I 0
 +
    D EndDta                        10I 0
 +
 +
    D oRecordName                  10A
 +
    D oFldNam                      10A
 +
    D oRow                          1A
 +
    D oCol                          1A
 +
 +
      /free
 +
 +
          *INLR = *ON;
 +
 +
          DISPINFOC1( iLib  : iFile    : '  ': '  ' : '  ': '  ':
 +
                    '#FIRST' : RTVDATA  );
 +
 +
        DOW (EndDta = 0);
 +
 +
                    oRecordName  =    RecordName ;
 +
                    oFldNam      =    FldNam    ;
 +
                    oROW        =    ROW        ;
 +
                    oCOL        =    COL        ;
 +
 +
      // To get the next record the previous fields info is also passed
 +
          DISPINFOC1(iLib  :  iFile    :
 +
                    oRecordName  :
 +
                    oFldNam      :
 +
                    oROW        :
 +
                    oCOL        :
 +
                    '#NEXT ' : RTVDATA  );
 +
 +
        ENDDO;
 +
 +
      /end-free
 +
 +
 +
 +
 +
 
   
 
   
  

Revision as of 10:57, 17 September 2014


Introduction

C version of the RPG prpgram DSPINFO. This program works differently to the RPG version. I coded it to return only one field or constant at a time. So to see all the fields in a DSPF it needs to loop.

DISPINFOC is coded quite inefficiently but it still works quite fast. It retreives the API data for every time it is called then iterates though all the fields. I coded it this way so as to hide the API retreival within DISPINFOC.

I did not include any of the logic to retreive FILE, RECORD, or FIELD attributes. Also there is no logic for any other caterories (eg Date/Time) other than Cat 23 (Conatants)


DISPINFOC



 /* Function: This program uses the QDFRTVFD API to return the */
 /* structure of a display file.  */


 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include "QSYSINC/H/QUSEC"
 #include "QSYSINC/H/QDFRTVFD"

 #define EQ      ==

 #define fail() do { printf("\nLine %d FAILED in file %s", \
 __LINE__,__FILE__); \
 } while(0)

/* Pointers to structures required to be used by this program. */
 QDFFBASE_t *p_QDFFBASE;
 QDFFINFO_t *p_QDFFINFO;
 QDFARFTE_t *p_QDFARFTE;
 QDFFRINF_t *p_QDFFRINF;
 QDFFDPDD_t *p_QDFFDPDD;
 QDFFRDPD_t *p_QDFFRDPD;
 QDFWFLEI_t *p_QDFWFLEI;
 QDFFNTBL_t *p_QDFFNTBL;
 QDFWRCDI_t *p_QDFWRCDI;
 QDFWFLDI_t *p_QDFWFLDI;
 QDFFSFCR_t *p_QDFFSFCR;
 QDFFSFHR_t *p_QDFFSFHR;
 QDFFSCRA_t *p_QDFFSCRA;
 QDFFFITB_t *p_QDFFFITB;
 QDFFFINF_t *p_QDFFFINF;
 QDFFFCON_t *p_QDFFFCON;
 QDFFFDPD_t *p_QDFFFDPD;
 QDFFFNAM_t *p_QDFFFNAM;
 QDFFFDIC_t *p_QDFFFDIC;
 QDFFXFDP_t *p_QDFFXFDP;
 QDFFRCTB_t *p_QDFFRCTB;
 QDFFRCTE_t *p_QDFFRCTE;
 QDFFNTB_t  *p_QDFFNTB;
 QDFFCOSA_t *p_QDFFCOSA;
 QDFFCCOA_t *p_QDFFCCOA;
 QDFKMFDK_t *p_QDFKMFDK;
 QDFKDFT_t  *p_QDFKDFT;
 QDFKEDTR_t *p_QDFKEDTR;
 QDFKDFPM_t *p_QDFKDFPM;


    /* Global variables */
    char *p_iLib;
    char *p_iFile;
    char *p_iRecord;
    char *p_iField;
    char *p_iRow;
    char *p_iCol;
    char *p_iFunc;

 /* returned data   */
typedef struct FieldData {
    char RecordName[10];
    char ROW[1];
    char COL[1];
    char FldIO[1];
    char FldAtr[1];
    char FldNam[10];
    char FldCom[3000];
    int  FldPlen;
    int  FldDec;
    int  EndDta;
  } FieldData_t;

 FieldData_t *p_FieldData;
 FieldData_t *Odata;

    typedef struct inputArguments
    {
        char *pgmname;
        char *iLib;
        char *iFile;
        char *iRecord;
        char *iField;
        char *iRow;
        char *iCol;
        char *iFunc;
        FieldData_t *iOdata;
    } main_args_t;


    int ProcessRec (void);
    int ProcessField (int *);
    int ProcessCons(void);
    int ProcessCat22(void);
    int ProcessCat23(void);
    int ProcessCat24(void);

    int RecIndex;

   /* Area into which the QDFRTVFD returns  the requested data.*/
    char *ReturnVar;


    char FileName[20] = "                    ";
    char Fldblank[3000] = { " " };
    char Format[8];
    int  EndFlds = 0;

    /* 4 bytes WDFFRETN Length of the returned data. */
    /* 4 bytes WDFFSIZE Size of the display file description */
    typedef struct RtvSizeInfo
    {
        int ReturnLen;
        int ReturnSiz;
    } RtvSizeInfo_t;



   /* ########################################################  */
 int main(int argc, main_args_t *main_args)
 {

    RtvSizeInfo_t *RtvSize;
    Qus_EC_t Error_Code = {0};



    int  API_Len;

    p_iFile   =  main_args->iFile;
    p_iLib    =  main_args->iLib;
    p_iRecord =  main_args->iRecord;
    p_iField  =  main_args->iField;
    p_iRow    =  main_args->iRow;
    p_iCol    =  main_args->iCol;
    p_iFunc   =  main_args->iFunc;
    Odata     =  main_args->iOdata;

/* Define the API format requested and the display file to access */
    memcpy(Format,"DSPF0100",8);

/* Point to your DSPF */
    memmove(FileName,p_iFile, strlen(p_iFile));
    memmove(FileName + 10 ,p_iLib, strlen(p_iLib ));


 /* Invoke the API. */
    RtvSize =  malloc(8);
    QDFRTVFD (RtvSize,
                8,
                Format,
                FileName,
                &Error_Code);
    if ( Error_Code.Bytes_Available != 0 ) {
            fail();
            exit (1);
    }
    API_Len  =  RtvSize->ReturnSiz;
    free(RtvSize);

    ReturnVar =  malloc(API_Len);
    QDFRTVFD (ReturnVar,
                API_Len,
                Format,
                FileName,
                &Error_Code);
    if ( Error_Code.Bytes_Available != 0 ) {
            fail();
            printf( "\nExcId: %s" , Error_Code.Exception_Id );
            exit (1);
    }


    ProcessRec();


   free(ReturnVar);
 }
  /* ######################################### */
int ProcessRec() {

    int  NumRecs;
    int i;
    int GotIt = 0;
    /* Access returned structures. The base structure starts at */
    /* the begining of the returned space. */
     p_QDFFBASE = (QDFFBASE_t *)ReturnVar;
     p_QDFFINFO = (QDFFINFO_t *)((char *) p_QDFFBASE + p_QDFFBASE->WDFFINOF);
     p_QDFARFTE = (QDFARFTE_t *)((char *) p_QDFFINFO + p_QDFFINFO->WDFFDFLO);
     p_QDFWFLEI = (QDFWFLEI_t *)((char *) p_QDFFINFO + p_QDFFINFO->WDFFWUOF);
     p_QDFFDPDD = (QDFFDPDD_t *)((char *) p_QDFFINFO + p_QDFFINFO->WDFFXDOF);
     p_QDFWRCDI = (QDFWRCDI_t *)((char *) p_QDFWFLEI + p_QDFWFLEI->WDFWXLEN);
     p_QDFFNTBL = (QDFFNTBL_t *)((char *) p_QDFWFLEI + p_QDFWFLEI->WDFWNTBO);

    /*  here is the place to retreive File Keywords */

     NumRecs = p_QDFFBASE->WDFFRCS;

     for (i=0; i< NumRecs ; ++i) {

         /* Bump ptr to next record structure */
      if  (i  != 0)
     {p_QDFWRCDI = (QDFWRCDI_t *)((char *) p_QDFWRCDI + p_QDFWRCDI->WDFWNXTR);
      p_QDFARFTE = (QDFARFTE_t *)((char *) p_QDFARFTE + sizeof(QDFARFTE_t));   }

     memcpy(Odata->RecordName,
            p_QDFARFTE->WDFARFNM,sizeof(p_QDFARFTE->WDFARFNM));

    if  (i EQ NumRecs - 1) {
      EndFlds = 1;
      }

     ProcessField(&GotIt);



    }

 }

  /* ######################################### */

int ProcessField(int *GotIt) {

      int SflCtl;
      int SizeIdx;
      int FldIdx;
      int NumFlds;
      char ScrnSize[1];
      char Attrib[1];
      char X01     =  0x01 ;
      char Functn[10] = "          ";

      /*  record header   */
       p_QDFFRINF = (QDFFRINF_t *)((char *) p_QDFFINFO + p_QDFARFTE->WDFARFOF);
      /*  record dev dept  */
       p_QDFFRDPD = (QDFFRDPD_t *)((char *) p_QDFFRINF + p_QDFFRINF->WDFFRAOF);
      /*  SFLCTL                                                              */
      /* 12  C       BIN(31) WDFFRFLG    Miscellaneous record contents.       */
      /* 12  C   0   BIT(1)  WDFFUDDS    If on, USRDFN keyword is specified.  */
      /* 12  C   1   BIT(1)  WDFFSFL If on, SFL keyword is specified (next rec*/
      /* 12  C   2   BIT(1)  WDFFSFLC    If on, SFLCTL keyword is specified (p*/
       SflCtl = 0;
       if (p_QDFFRINF->WDFFRFLG.WDFFSFLC)
        {  SflCtl = 1;
     p_QDFFSFCR  = (QDFFSFCR_t *)((char *) p_QDFFRINF + p_QDFFRINF->WDFFRAOF);
     p_QDFFSFHR  = (QDFFSFHR_t *)((char *) p_QDFFSFCR + sizeof(QDFFSFCR_t));
         }

     for (SizeIdx=0; SizeIdx<p_QDFFBASE->WDFFSCR ; ++SizeIdx) {
     p_QDFFSCRA  = (QDFFSCRA_t *)((char *) p_QDFFBASE + sizeof(QDFFBASE_t)
                          + sizeof(QDFFSCRA_t) * SizeIdx    ) ;
    *ScrnSize =  p_QDFFSCRA->WDFFSCIA ;
     }
    /* Find RowColumn table. Note: this is the first row/col table */
    /* so this code only works for the PRIMARY DISPLAY SIZE. */
    /* See QDFFRDPD.WDFFDRCO field description for finding the */
    /* correct QDFFRCTB structure if more than one screen size is */
    /* used. */
      p_QDFFRCTB = (QDFFRCTB_t *)((char *) p_QDFFRINF + p_QDFFRDPD->WDFFDRCO);

    /********  HERE include code for Record Keywords ********/

    /*  PROCESS THE RECORDS FIELDS    */
        /* Find where used section */

      p_QDFWFLDI = (QDFWFLDI_t *)((char *) p_QDFWRCDI + p_QDFWRCDI->WDFWRLEN);
      p_QDFFFITB = (QDFFFITB_t *)((char *) p_QDFFRINF + p_QDFFRINF->WDFFOFIT
                   +  ( p_QDFWFLDI->WDFWRRDX -1) * sizeof(QDFFFITB_t));


    for (FldIdx=0; FldIdx < p_QDFFRINF->WDFFFLD; ++FldIdx) {

       /* Field Header  */
     p_QDFFFINF = (QDFFFINF_t *)((char *) p_QDFFRINF + p_QDFFFITB->WDFFFOFS);

    if (p_QDFFFINF->WDFFFIOA EQ 0x01)  {
      /* constant  */
     p_QDFFFCON = (QDFFFCON_t *)((char *) p_QDFFFINF + sizeof(QDFFFINF_t));
     p_QDFFFDPD = (QDFFFDPD_t *)((char *) p_QDFFFINF + p_QDFFFCON->WDFFFAOC);
    }
    else {
      /*  variable */
     p_QDFFFNAM = (QDFFFNAM_t *)((char *) p_QDFFFINF + sizeof(QDFFFINF_t));
     p_QDFFFDPD = (QDFFFDPD_t *)((char *) p_QDFFFINF + p_QDFFFNAM->WDFFFAOF);
     p_QDFFFDIC = (QDFFFDIC_t *)((char *) p_QDFFFDPD + sizeof(QDFFFDPD_t));
    }
      /* Field Extension  */
     p_QDFFXFDP = (QDFFXFDP_t *)((char *) p_QDFFFINF + p_QDFFFDPD->WDFFXFDO);

      /* Row Column  */
     p_QDFFRCTB = (QDFFRCTB_t *)((char *) p_QDFFRINF + p_QDFFRDPD->WDFFDRCO
                     + (p_QDFWFLDI->WDFWRRDX - 1) *2);
     p_QDFFRCTE = (QDFFRCTE_t *)((char *) p_QDFFRCTB + sizeof(QDFFRCTB_t));

       *Odata->ROW  =  p_QDFFRCTE->WDFFSROW;
       *Odata->COL  =  p_QDFFRCTE->WDFFSCOL;

      /*   here can extract data time flags */

      /* CONSTANTS  */
    if (p_QDFFFINF->WDFFFIOA EQ 0x01)  {
      /* constant  */
      ProcessCons();

    }
    else {
        /*   Field Name   */

       p_QDFFNTB  = (QDFFNTB_t *)((char *) p_QDFFNTBL + sizeof(QDFFNTBL_t)
                          +  10 * (p_QDFWFLDI->WDFWNMEI -1) );


      /*Field attribute.  */
      /*X'01' indicates Constant (see structure QDFFFCON, Constant Field  */
      /*X'02' indicates Output (O), */
      /*X'03' indicates Message (M), h (B), */
      /*X'04' indicates Input (I),  (P)  */
      /*X'05' indicates Both (B), */
      /*X'06' indicates Hidden (H), and */
      /*X'07' indicates Program to System (P) */
       *Odata->FldIO     = p_QDFFFINF->WDFFFIOA;

      /* Keyboard shift and data type.  */
      /* X'00' indicates Alpha shift/character (A), */


        *Odata->FldAtr   = p_QDFFFNAM->WDFFKBDT;
        memcpy(Odata->FldNam,
               p_QDFFNTB->WDFFNAM,sizeof(p_QDFFNTB->WDFFNAM));
        memcpy(Odata->FldCom,Fldblank,3000);
        Odata->FldPlen  = p_QDFFFNAM->WDFFPLEN;
        Odata->FldDec   = p_QDFFFNAM->WDFFDEC;
    }

   /***********  HERE include code for Field KEYWORDS **********/
      if (FldIdx < p_QDFFRINF->WDFFFLD -1) {
       p_QDFWFLDI = (QDFWFLDI_t *)((char *) p_QDFWFLDI + p_QDFWFLDI->WDFWFLDL);
       p_QDFFFITB = (QDFFFITB_t *)((char *) p_QDFFRINF + p_QDFFRINF->WDFFOFIT
                   +  ( p_QDFWFLDI->WDFWRRDX -1) * sizeof(QDFFFITB_t));
       }

      NumFlds += 1;

       Odata->EndDta   = 0;

   /* End ofthe Fields  */
      if ((EndFlds EQ 1) && (FldIdx EQ p_QDFFRINF->WDFFFLD -1) ) {
        Odata->EndDta   = 1;
         *GotIt = 1;
       };

       /* Return the requested Field  */
       memmove(Functn,p_iFunc, strlen(p_iFunc));

        if (!memcmp(Functn , "#FIRST", 6)) {
            *GotIt = 1;
          };

        if (*GotIt)  {
            *GotIt  = 0;
            free(ReturnVar);
            exit(0);
          };

    /* We know we are about to get the NEXT record when we have */
    /* found the record just before                             */
        if (!memcmp(Functn , "#NEXT"  , 5)) {
          if (!memcmp(p_iRecord, Odata->RecordName, sizeof(*p_iRecord))) {
            if(!memcmp(p_iField, Odata->FldNam,sizeof(*p_iField) ))      {
              if(!memcmp(p_iRow, Odata->ROW, sizeof(*p_iRow) ))          {
                if(!memcmp(p_iCol,Odata->COL, sizeof(*p_iCol)))          {
           *GotIt = 1;
                };
              };
            };
          };
        };



    }

 }

  /* ######################################### */

int ProcessCons() {
      /*------------------------------------------------*/
      /* This loops through all keyword categories      */
      /*  for a constant field (text on the screen.)    */
      /*------------------------------------------------*/

   int cc;

     if   (p_QDFFFDPD->WDFFFDOC > 0) {

      p_QDFFCOSA = (QDFFCOSA_t *) ((char *) p_QDFFFINF +
                                              p_QDFFFDPD->WDFFFDOC);
       cc = 0;
       for (cc=0; cc<=p_QDFFCOSA->WDFFCCT -1 ; ++cc) {

          p_QDFFCCOA  = (QDFFCCOA_t *)((char *) p_QDFFCOSA +
                             sizeof(QDFFCOSA_t) + sizeof(QDFFCCOA_t) * cc);


           if (p_QDFFCCOA->WDFFCAID EQ 0x22) {
              p_QDFKMFDK = (QDFKMFDK_t *)((char *) p_QDFFFINF  +
                                                p_QDFFCCOA->WDFFCAOF);
              ProcessCat22();
            }


           if (p_QDFFCCOA->WDFFCAID EQ 0x23) {
              p_QDFKDFT  = (QDFKDFT_t *)((char *) p_QDFFFINF  +
                                                p_QDFFCCOA->WDFFCAOF);
              ProcessCat23();
            }


           if (p_QDFFCCOA->WDFFCAID EQ 0x24) {
              p_QDFKEDTR = (QDFKEDTR_t *)((char *) p_QDFFFINF  +
                                                p_QDFFCCOA->WDFFCAOF);
              ProcessCat24();
            }

       }

     }


 }

  /* ######################################### */

int ProcessCat22() {
      /*-----------------------------------------------*/
      /* This loops through all keywords that fall into*/
      /*  category 22                                  */
      /*-----------------------------------------------*/
}

  /* ######################################### */

int ProcessCat23() {
      /*------------------------------------------------*/
      /* This loops through all keywords that fall into */
      /*  category 23 (DFT, MSGCON, DFTVAL, HTML)       */
      /*------------------------------------------------*/
 typedef _Packed struct  KwdData {
    char Temp[3000];
} KwdData_t;

   KwdData_t  *p_KwdData;
   int        ck;

  for (ck=1; ck <= p_QDFKDFT->WDFKDFS ; ++ck) {

    if   (ck EQ 1 )  {
     p_QDFKDFPM = (QDFKDFPM_t *)((char *) p_QDFKDFT + sizeof(QDFKDFT_t));  }
    else
    {p_QDFKDFPM = (QDFKDFPM_t *)((char *) p_QDFKDFPM  + sizeof(QDFKDFPM_t)); }

        if (p_QDFKDFPM->WDFKDFID EQ 0x01)  {

        memcpy(Odata->FldNam,"          ",10);

        Odata->FldPlen  = p_QDFKDFPM->WDFKDFLN;
        *Odata->FldIO   = p_QDFFFINF->WDFFFIOA;
  p_KwdData =  (KwdData_t *) ((char *) p_QDFKDFPM + sizeof(QDFKDFPM_t) );
        memcpy(Odata->FldCom,
                p_KwdData->Temp, p_QDFKDFPM->WDFKDFLN);

        }

    }


}

  /* ######################################### */

int ProcessCat24() {
      /*-----------------------------------------------*/
      /* This loops through all keywords that fall into*/
      /*  category 24  (Date, Time)                    */
      /*-----------------------------------------------*/
}


RTVFLD (RPG code DISPINFOC driver)

RPG Driver program for DISPINFOC This program is coded to loop to invoke DISPINFOC for one field at a time.

It needs to pass a parameter (#FIRST | #NEXT) to tell DISPINFOC what to do.



     h Option(*NODEBUGIO)  DFTACTGRP(*NO)

     D RTVFLD          PR
     D                               10A
     D                               10A

     D RTVFLD          PI
     D iLib                          10A
     D iFile                         10A

     D DISPINFOC       PR                  ExtPgm('DISPINFOC')
     D Lib                           10A   const
     D File                          10A   const
     D oRecord                       10A   const
     D oField                        10A   const
     D oRow                           1A   const
     D oCol                           1A   const
     D Func                          10A   const
     D Fdata                               like(RTVDATA)
           // returned data
     D RTVDATA         DS
     D RecordName                    10A
     D ROW                            1A
     D COL                            1A
     D FldIO                          1A
     D FldAtr                         1A
     D FldNam                        10A
     D FldCom                      3000A
     D FLdPlen                       10I 0
     D FldDec                        10I 0
     D EndDta                        10I 0

     D oRecordName                   10A
     D oFldNam                       10A
     D oRow                           1A
     D oCol                           1A

      /free

          *INLR = *ON;

          DISPINFOC( iLib  : iFile    : '  ': '  ' : '  ': '  ':
                    '#FIRST' : RTVDATA   );

        DOW (EndDta = 0);

                    oRecordName  =    RecordName ;
                    oFldNam      =    FldNam     ;
                    oROW         =    ROW        ;
                    oCOL         =    COL        ;

       // To get the next record the previous fields info is passed
          DISPINFOC(iLib   :  iFile    :
                    oRecordName  :
                    oFldNam      :
                    oROW         :
                    oCOL         :
                    '#NEXT ' : RTVDATA   );

        ENDDO;

      /end-free


DISPINFOC1 Version with User Space

 
/* Function: This program uses the QDFRTVFD API to return the */
/* structure of a display file.  */
 

DISPINFOC1
 
/* Function: This program uses the QDFRTVFD API to return the */
/* structure of a display file.  */
 
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "QSYSINC/H/QUSEC"
#include "QSYSINC/H/QDFRTVFD"
 
#include <mispace.h>
#include <pointer.h>
#include <mispcobj.h>
#include <except.h>
#include <qtes.h>
 
 
    /* Link up the Create User Space API */
    #pragma linkage(CreateUserSpace,OS)
    #pragma map(CreateUserSpace,"QUSCRTUS")
 
    void    CreateUserSpace(char[20],
                        char[10],
                        long int,
                        char,
                        char[10],
                        char[50],
                        char[10],
                        _TE_ERROR_CODE_T *
                        );
 
    /* Link up the Delete User Space API */
    #pragma linkage(DeleteUserSpace,OS)
    #pragma map(DeleteUserSpace,"QUSDLTUS")
    void    DeleteUserSpace(char[20],
                        _TE_ERROR_CODE_T *
                        );
 
    /* Link up the Retrieve Pointer to User Space API */
    #pragma linkage(RetrievePointerToUserSpace,OS)
    #pragma map(RetrievePointerToUserSpace,"QUSPTRUS")
    void RetrievePointerToUserSpace(char[20],
                                char **,
                                _TE_ERROR_CODE_T *
                                );
 
 
#define EQ      ==
 
#define fail() do { printf("\nLine %d FAILED in file %s", \
__LINE__,__FILE__); \
} while(0)
 
/* Pointers to structures required to be used by this program. */
QDFFBASE_t *p_QDFFBASE;
QDFFINFO_t *p_QDFFINFO;
QDFARFTE_t *p_QDFARFTE;
QDFFRINF_t *p_QDFFRINF;
QDFFDPDD_t *p_QDFFDPDD;
QDFFRDPD_t *p_QDFFRDPD;
QDFWFLEI_t *p_QDFWFLEI;
QDFFNTBL_t *p_QDFFNTBL;
QDFWRCDI_t *p_QDFWRCDI;
QDFWFLDI_t *p_QDFWFLDI;
QDFFSFCR_t *p_QDFFSFCR;
QDFFSFHR_t *p_QDFFSFHR;
QDFFSCRA_t *p_QDFFSCRA;
QDFFFITB_t *p_QDFFFITB;
QDFFFINF_t *p_QDFFFINF;
QDFFFCON_t *p_QDFFFCON;
QDFFFDPD_t *p_QDFFFDPD;
QDFFFNAM_t *p_QDFFFNAM;
QDFFFDIC_t *p_QDFFFDIC;
QDFFXFDP_t *p_QDFFXFDP;
QDFFRCTB_t *p_QDFFRCTB;
QDFFRCTE_t *p_QDFFRCTE;
QDFFNTB_t  *p_QDFFNTB;
QDFFCOSA_t *p_QDFFCOSA;
QDFFCCOA_t *p_QDFFCCOA;
QDFKMFDK_t *p_QDFKMFDK;
QDFKDFT_t  *p_QDFKDFT;
QDFKEDTR_t *p_QDFKEDTR;
QDFKDFPM_t *p_QDFKDFPM;
 
 
    /* Global variables */
    char *p_iLib;
    char *p_iFile;
    char *p_iRecord;
    char *p_iField;
    char *p_iRow;
    char *p_iCol;
    char *p_iFunc;
 
/* returned data   */
typedef struct FieldData {
    char RecordName[10];
    char ROW[1];
    char COL[1];
    char FldIO[1];
    char FldAtr[1];
    char FldNam[10];
    char FldCom[3000];
    int  FldPlen;
    int  FldDec;
    int  EndDta;
  } FieldData_t;
 
FieldData_t *p_FieldData;
FieldData_t *Odata;
 
    typedef struct inputArguments
    {
        char *pgmname;
        char *iLib;
        char *iFile;
        char *iRecord;
        char *iField;
        char *iRow;
        char *iCol;
        char *iFunc;
        FieldData_t *iOdata;
    } main_args_t;
 
    int RtvApiDta (void);
    int ProcessRec (void);
    int ProcessField (int *);
    int ProcessCons(void);
    int ProcessCat22(void);
    int ProcessCat23(void);
    int ProcessCat24(void);
 
    int RecIndex;
 
   /* Area into which the QDFRTVFD returns  the requested data.*/
 
    char *pBuffer;
    _TE_ERROR_CODE_T errorCode;
 
 
    char FileName[20] = "                    ";
    char Format[8];
    int  EndFlds = 0;
 
    /* 4 bytes WDFFRETN Length of the returned data. */
    /* 4 bytes WDFFSIZE Size of the display file description */
    typedef struct RtvSizeInfo
    {
        int ReturnLen;
        int ReturnSiz;
    } RtvSizeInfo_t;
 
 
 
   /* ########################################################  */
int main(int argc, main_args_t *main_args)
{
 
    char Funct[10] = "          ";
 
    p_iFile   =  main_args->iFile;
    p_iLib    =  main_args->iLib;
    p_iRecord =  main_args->iRecord;
    p_iField  =  main_args->iField;
    p_iRow    =  main_args->iRow;
    p_iCol    =  main_args->iCol;
    p_iFunc   =  main_args->iFunc;
    Odata     =  main_args->iOdata;
 
 
 
       /* On First pass get the API data */
       memmove(Funct,p_iFunc, strlen(p_iFunc));
         if (!memcmp(Funct, "#FIRST", 6)) {
            RtvApiDta();
            };
 
         if (!memcmp(Funct, "#NEXT", 5)) {
    /*! call RetrievePointerToUserSpace - Retrieve Pointer to User Space */
           errorCode.BytesProvided = 0;
           RetrievePointerToUserSpace("RTVFDUSPC QTEMP      ",
                            &pBuffer,
                            &errorCode);
       }
 
    ProcessRec();
 
 
     /*  free(ReturnVar);  */
}
 
 
 
 
  /* ######################################### */
 
    RtvApiDta() {
 
    RtvSizeInfo_t *RtvSize;
    int  API_Len;
 
    Qus_EC_t Error_Code = {0};
 
 
    /* Define the API format requested and the display file to access */
    memcpy(Format,"DSPF0100",8);
    /* Point to your DSPF */
    memmove(FileName,p_iFile, strlen(p_iFile));
    memmove(FileName + 10 ,p_iLib, strlen(p_iLib ));
 
    /* Invoke the API. to get the size needed */
    RtvSize =  malloc(8);
    QDFRTVFD (RtvSize,
                8,
                Format,
                FileName,
                &Error_Code);
    if ( Error_Code.Bytes_Available != 0 ) {
            fail();
            exit (1);
    }
    API_Len  =  RtvSize->ReturnSiz;
    free(RtvSize);
 
    CreateUserSpace("RTVFDUSPC QTEMP      ",
                    "USRSPC    ",
                    API_Len,
                    0,
                    "*ALL      ",
                    " ",
                    "*YES      ",
                    &errorCode
                    );
 
    /*! call RetrievePointerToUserSpace - Retrieve Pointer to User Space */
    /*!! (pass: Name and library of user space, pointer variable */
    /*!! return: nothing (pointer variable is left pointing to start*/
    /*!! of user space) */
       errorCode.BytesProvided = 0;
       RetrievePointerToUserSpace("RTVFDUSPC QTEMP      ",
                            &pBuffer,
                            &errorCode);
 
    QDFRTVFD (pBuffer,
                API_Len,
                Format,
                FileName,
                &Error_Code);
    if ( Error_Code.Bytes_Available != 0 ) {
            fail();
            printf( "\nExcId: %s" , Error_Code.Exception_Id );
            exit (1);
    }
}
 
 
 
 
  /* ######################################### */
int ProcessRec() {
 
    int  NumRecs;
    int i;
    int GotIt = 0;
    /* Access returned structures. The base structure starts at */
    /* the begining of the returned space. */
     p_QDFFBASE = (QDFFBASE_t *)pBuffer;
     p_QDFFINFO = (QDFFINFO_t *)((char *) p_QDFFBASE + p_QDFFBASE->WDFFINOF);
     p_QDFARFTE = (QDFARFTE_t *)((char *) p_QDFFINFO + p_QDFFINFO->WDFFDFLO);
     p_QDFWFLEI = (QDFWFLEI_t *)((char *) p_QDFFINFO + p_QDFFINFO->WDFFWUOF);
     p_QDFFDPDD = (QDFFDPDD_t *)((char *) p_QDFFINFO + p_QDFFINFO->WDFFXDOF);
     p_QDFWRCDI = (QDFWRCDI_t *)((char *) p_QDFWFLEI + p_QDFWFLEI->WDFWXLEN);
     p_QDFFNTBL = (QDFFNTBL_t *)((char *) p_QDFWFLEI + p_QDFWFLEI->WDFWNTBO);
 
    /*  here is the place to retreive File Keywords */
 
     NumRecs = p_QDFFBASE->WDFFRCS;
 
     for (i=0; i< NumRecs ; ++i) {
 
         /* Bump ptr to next record structure */
      if  (i  != 0)
     {p_QDFWRCDI = (QDFWRCDI_t *)((char *) p_QDFWRCDI + p_QDFWRCDI->WDFWNXTR);
      p_QDFARFTE = (QDFARFTE_t *)((char *) p_QDFARFTE + sizeof(QDFARFTE_t));   }
 
     memcpy(Odata->RecordName,
            p_QDFARFTE->WDFARFNM,sizeof(p_QDFARFTE->WDFARFNM));
 
    if  (i EQ NumRecs - 1) {
      EndFlds = 1;
      }
 
     ProcessField(&GotIt);
 
 
 
    }
 
}
 
  /* ######################################### */
 
int ProcessField(int *GotIt) {
 
      int SflCtl;
      int SizeIdx;
      int FldIdx;
      int NumFlds;
      char ScrnSize[1];
      char Attrib[1];
      char X01     =  0x01 ;
      char Functn[10] = "          ";
 
      /*  record header   */
       p_QDFFRINF = (QDFFRINF_t *)((char *) p_QDFFINFO + p_QDFARFTE->WDFARFOF);
      /*  record dev dept  */
       p_QDFFRDPD = (QDFFRDPD_t *)((char *) p_QDFFRINF + p_QDFFRINF->WDFFRAOF);
      /*  SFLCTL                                                              */
      /* 12  C       BIN(31) WDFFRFLG    Miscellaneous record contents.       */
      /* 12  C   0   BIT(1)  WDFFUDDS    If on, USRDFN keyword is specified.  */
      /* 12  C   1   BIT(1)  WDFFSFL If on, SFL keyword is specified (next rec*/
      /* 12  C   2   BIT(1)  WDFFSFLC    If on, SFLCTL keyword is specified (p*/
       SflCtl = 0;
       if (p_QDFFRINF->WDFFRFLG.WDFFSFLC)
        {  SflCtl = 1;
     p_QDFFSFCR  = (QDFFSFCR_t *)((char *) p_QDFFRINF + p_QDFFRINF->WDFFRAOF);
     p_QDFFSFHR  = (QDFFSFHR_t *)((char *) p_QDFFSFCR + sizeof(QDFFSFCR_t));
         }
 
     for (SizeIdx=0; SizeIdx<p_QDFFBASE->WDFFSCR ; ++SizeIdx) {
     p_QDFFSCRA  = (QDFFSCRA_t *)((char *) p_QDFFBASE + sizeof(QDFFBASE_t)
                          + sizeof(QDFFSCRA_t) * SizeIdx    ) ;
    *ScrnSize =  p_QDFFSCRA->WDFFSCIA ;
     }
    /* Find RowColumn table. Note: this is the first row/col table */
    /* so this code only works for the PRIMARY DISPLAY SIZE. */
    /* See QDFFRDPD.WDFFDRCO field description for finding the */
    /* correct QDFFRCTB structure if more than one screen size is */
    /* used. */
      p_QDFFRCTB = (QDFFRCTB_t *)((char *) p_QDFFRINF + p_QDFFRDPD->WDFFDRCO);
 
    /********  HERE include code for Record Keywords ********/
 
    /*  PROCESS THE RECORDS FIELDS    */
        /* Find where used section */
 
      p_QDFWFLDI = (QDFWFLDI_t *)((char *) p_QDFWRCDI + p_QDFWRCDI->WDFWRLEN);
      p_QDFFFITB = (QDFFFITB_t *)((char *) p_QDFFRINF + p_QDFFRINF->WDFFOFIT
                   +  ( p_QDFWFLDI->WDFWRRDX -1) * sizeof(QDFFFITB_t));
 
 
    for (FldIdx=0; FldIdx < p_QDFFRINF->WDFFFLD; ++FldIdx) {
 
       /* Field Header  */
     p_QDFFFINF = (QDFFFINF_t *)((char *) p_QDFFRINF + p_QDFFFITB->WDFFFOFS);
 
    if (p_QDFFFINF->WDFFFIOA EQ 0x01)  {
      /* constant  */
     p_QDFFFCON = (QDFFFCON_t *)((char *) p_QDFFFINF + sizeof(QDFFFINF_t));
     p_QDFFFDPD = (QDFFFDPD_t *)((char *) p_QDFFFINF + p_QDFFFCON->WDFFFAOC);
    }
    else {
      /*  variable */
     p_QDFFFNAM = (QDFFFNAM_t *)((char *) p_QDFFFINF + sizeof(QDFFFINF_t));
     p_QDFFFDPD = (QDFFFDPD_t *)((char *) p_QDFFFINF + p_QDFFFNAM->WDFFFAOF);
     p_QDFFFDIC = (QDFFFDIC_t *)((char *) p_QDFFFDPD + sizeof(QDFFFDPD_t));
    }
      /* Field Extension  */
     p_QDFFXFDP = (QDFFXFDP_t *)((char *) p_QDFFFINF + p_QDFFFDPD->WDFFXFDO);
 
      /* Row Column  */
     p_QDFFRCTB = (QDFFRCTB_t *)((char *) p_QDFFRINF + p_QDFFRDPD->WDFFDRCO
                     + (p_QDFWFLDI->WDFWRRDX - 1) *2);
     p_QDFFRCTE = (QDFFRCTE_t *)((char *) p_QDFFRCTB + sizeof(QDFFRCTB_t));
 
       *Odata->ROW  =  p_QDFFRCTE->WDFFSROW;
       *Odata->COL  =  p_QDFFRCTE->WDFFSCOL;
 
      /*   here can extract data time flags */
 
      /* CONSTANTS  */
    if (p_QDFFFINF->WDFFFIOA EQ 0x01)  {
      /* constant  */
      ProcessCons();
 
    }
    else {
        /*   Field Name   */
 
       p_QDFFNTB  = (QDFFNTB_t *)((char *) p_QDFFNTBL + sizeof(QDFFNTBL_t)
                          +  10 * (p_QDFWFLDI->WDFWNMEI -1) );
 
 
      /*Field attribute.  */
      /*X'01' indicates Constant (see structure QDFFFCON, Constant Field  */
      /*X'02' indicates Output (O), */
      /*X'03' indicates Message (M), h (B), */
      /*X'04' indicates Input (I),  (P)  */
      /*X'05' indicates Both (B), */
      /*X'06' indicates Hidden (H), and */
      /*X'07' indicates Program to System (P) */
       *Odata->FldIO     = p_QDFFFINF->WDFFFIOA;
 
      /* Keyboard shift and data type.  */
      /* X'00' indicates Alpha shift/character (A), */
 
 
        *Odata->FldAtr   = p_QDFFFNAM->WDFFKBDT;
        memcpy(Odata->FldNam,
               p_QDFFNTB->WDFFNAM,sizeof(p_QDFFNTB->WDFFNAM));
        memset(Odata->FldCom,' ',3000);
        Odata->FldPlen  = p_QDFFFNAM->WDFFPLEN;
        Odata->FldDec   = p_QDFFFNAM->WDFFDEC;
    }
 
   /***********  HERE include code for Field KEYWORDS **********/
      if (FldIdx < p_QDFFRINF->WDFFFLD -1) {
       p_QDFWFLDI = (QDFWFLDI_t *)((char *) p_QDFWFLDI + p_QDFWFLDI->WDFWFLDL);
       p_QDFFFITB = (QDFFFITB_t *)((char *) p_QDFFRINF + p_QDFFRINF->WDFFOFIT
                   +  ( p_QDFWFLDI->WDFWRRDX -1) * sizeof(QDFFFITB_t));
       }
 
      NumFlds += 1;
 
       Odata->EndDta   = 0;
 
   /* End ofthe Fields  */
      if ((EndFlds EQ 1) && (FldIdx EQ p_QDFFRINF->WDFFFLD -1) ) {
        Odata->EndDta   = 1;
         *GotIt = 1;
        DeleteUserSpace("RTVFDUSPC QTEMP      ",
                        &errorCode);
       };
 
       /* Return the requested Field  */
       memmove(Functn,p_iFunc, strlen(p_iFunc));
 
        if (!memcmp(Functn , "#FIRST", 6)) {
            *GotIt = 1;
          };
 
        if (*GotIt)  {
            *GotIt  = 0;
            exit(0);
          };
 
    /* We know we are about to get the NEXT record when we have */
    /* found the record just before                             */
        if (!memcmp(Functn , "#NEXT"  , 5)) {
          if (!memcmp(p_iRecord, Odata->RecordName, sizeof(*p_iRecord))) {
            if(!memcmp(p_iField, Odata->FldNam,sizeof(*p_iField) ))      {
              if(!memcmp(p_iRow, Odata->ROW, sizeof(*p_iRow) ))          {
                if(!memcmp(p_iCol,Odata->COL, sizeof(*p_iCol)))          {
           *GotIt = 1;
                };
              };
            };
          };
        };
 
 
 
    }
 
}
 
  /* ######################################### */
 
int ProcessCons() {
      /*------------------------------------------------*/
      /* This loops through all keyword categories      */
      /*  for a constant field (text on the screen.)    */
      /*------------------------------------------------*/
 
   int cc;
 
     if   (p_QDFFFDPD->WDFFFDOC > 0) {
 
   /* p_QDFFRINF = (QDFFRINF_t *)((char *) p_QDFFINFO + p_QDFFFINF );*/
   /* p_QDFFRINF  = p_QDFFINFO + QDFARFTE.WDFARFOF */
 
         p_QDFFCOSA = (QDFFCOSA_t *) ((char *) p_QDFFFINF +
                                                p_QDFFFDPD->WDFFFDOC);
       cc = 0;
       for (cc=0; cc<=p_QDFFCOSA->WDFFCCT -1 ; ++cc) {
 
          p_QDFFCCOA  = (QDFFCCOA_t *)((char *) p_QDFFCOSA +
                             sizeof(QDFFCOSA_t) + sizeof(QDFFCCOA_t) * cc);
 
 
           if (p_QDFFCCOA->WDFFCAID EQ 0x22) {
              p_QDFKMFDK = (QDFKMFDK_t *)((char *) p_QDFFFINF  +
                                                p_QDFFCCOA->WDFFCAOF);
              ProcessCat22();
            }
 
 
           if (p_QDFFCCOA->WDFFCAID EQ 0x23) {
              p_QDFKDFT  = (QDFKDFT_t *)((char *) p_QDFFFINF  +
                                                p_QDFFCCOA->WDFFCAOF);
              ProcessCat23();
            }
 
 
           if (p_QDFFCCOA->WDFFCAID EQ 0x24) {
              p_QDFKEDTR = (QDFKEDTR_t *)((char *) p_QDFFFINF  +
                                                p_QDFFCCOA->WDFFCAOF);
              ProcessCat24();
            }
 
       }
 
 
 
 
     }
 
 
}
 
  /* ######################################### */
 
int ProcessCat22() {
      /*-----------------------------------------------*/
      /* This loops through all keywords that fall into*/
      /*  category 22                                  */
      /*-----------------------------------------------*/
}
 
  /* ######################################### */
 
int ProcessCat23() {
      /*------------------------------------------------*/
      /* This loops through all keywords that fall into */
      /*  category 23 (DFT, MSGCON, DFTVAL, HTML)       */
      /*------------------------------------------------*/
typedef _Packed struct  KwdData {
    char Temp[3000];
} KwdData_t;
 
   KwdData_t  *p_KwdData;
   int        ck;
 
  for (ck=1; ck <= p_QDFKDFT->WDFKDFS ; ++ck) {
 
    if   (ck EQ 1 )  {
     p_QDFKDFPM = (QDFKDFPM_t *)((char *) p_QDFKDFT + sizeof(QDFKDFT_t));  }
    else
    {p_QDFKDFPM = (QDFKDFPM_t *)((char *) p_QDFKDFPM  + sizeof(QDFKDFPM_t)); }
 
        if (p_QDFKDFPM->WDFKDFID EQ 0x01)  {
 
        memcpy(Odata->FldNam,"          ",10);
 
        Odata->FldPlen  = p_QDFKDFPM->WDFKDFLN;
        *Odata->FldIO   = p_QDFFFINF->WDFFFIOA;
  p_KwdData =  (KwdData_t *) ((char *) p_QDFKDFPM + sizeof(QDFKDFPM_t) );
        memcpy(Odata->FldCom,
                p_KwdData->Temp, p_QDFKDFPM->WDFKDFLN);
 
        }
 
    }
 
 
}
 
  /* ######################################### */
 
int ProcessCat24() {
      /*-----------------------------------------------*/
      /* This loops through all keywords that fall into*/
      /*  category 24  (Date, Time)                    */
      /*-----------------------------------------------*/
}
 
 
 
 
RTVFLD1
     h Option(*NODEBUGIO)  DFTACTGRP(*NO)
 
     D RTVFLD1         PR
     D                               10A
     D                               10A
 
     D RTVFLD1         PI
     D iLib                          10A
     D iFile                         10A
 
     D DISPINFOC1      PR                  ExtPgm('DISPINFOC1')
     D Lib                           10A   const
     D File                          10A   const
     D oRecord                       10A   const
     D oField                        10A   const
     D oRow                           1A   const
     D oCol                           1A   const
     D Func                          10A   const
     D Fdata                               like(RTVDATA)
           // returned data
     D RTVDATA         DS
     D RecordName                    10A
     D ROW                            1A
     D COL                            1A
     D FldIO                          1A
     D FldAtr                         1A
     D FldNam                        10A
     D FldCom                      3000A
     D FLdPlen                       10I 0
     D FldDec                        10I 0
     D EndDta                        10I 0
 
     D oRecordName                   10A
     D oFldNam                       10A
     D oRow                           1A
     D oCol                           1A
 
      /free
 
          *INLR = *ON;
 
          DISPINFOC1( iLib  : iFile    : '  ': '  ' : '  ': '  ':
                    '#FIRST' : RTVDATA   );
 
        DOW (EndDta = 0);
 
                    oRecordName  =    RecordName ;
                    oFldNam      =    FldNam     ;
                    oROW         =    ROW        ;
                    oCOL         =    COL        ;
 
       // To get the next record the previous fields info is also passed
          DISPINFOC1(iLib   :  iFile    :
                    oRecordName  :
                    oFldNam      :
                    oROW         :
                    oCOL         :
                    '#NEXT ' : RTVDATA   );
 
        ENDDO;
 
      /end-free