Difference between revisions of "CQDFRTVFD"

From MidrangeWiki
Jump to: navigation, search
(Created page with " code")
 
Line 1: Line 1:
    
+
   __FORCETOC__
  
code
+
 
 +
== Introduction ==
 +
 
 +
C version of the RPG prpgram DSPINFO. (in development)
 +
is a work in progress
 +
 
 +
<pre>
 +
 
 +
 
 +
/* 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;
 +
QDFFRDPD_t *p_QDFFRDPD;
 +
QDFFRCTB_t *p_QDFFRCTB;
 +
QDFWFLEI_t *p_QDFWFLEI;
 +
QDFFNTBL_t *p_QDFFNTBL;
 +
QDFWRCDI_t *p_QDFWRCDI;
 +
QDFWFLDI_t *p_QDFWFLDI;
 +
QDFFRCTE_t *p_QDFFRCTE;
 +
QDFFSFCR_t *p_QDFFSFCR;
 +
QDFFSFHR_t *p_QDFFSFHR;
 +
QDFFSCRA_t *p_QDFFSCRA;
 +
QDFFFITB_t *p_QDFFFITB;
 +
QDFFFINF_t *p_QDFFFINF;
 +
 
 +
 
 +
    /* Global variables */
 +
 
 +
    typedef struct inputArguments
 +
    {
 +
        char *pgmname;
 +
        char *Lib;
 +
        char *File;
 +
    } main_args_t;
 +
 
 +
    int FindRec (void);
 +
    int FindField (void);
 +
 
 +
    int ProcessRec (void);
 +
    int ProcessField (void);
 +
 
 +
    int RecIndex;
 +
 
 +
  /* Area into which the QDFRTVFD returns  the requested data.*/
 +
    char *ReturnVar;
 +
 
 +
    char Format[8];
 +
    char FileName[20] = "                    ";
 +
    char RecordName[10];
 +
 
 +
/* DSPF information TEST ONLY  */
 +
    char MyRec[] = "C01      "; /* Test name */
 +
    char MyField[] = "SRS01    "; /* Test name */
 +
 
 +
    /* 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};
 +
 
 +
 
 +
    char *p_file ;
 +
    char *p_lib ;
 +
    int  API_Len;
 +
 
 +
    p_file =  main_args->File;
 +
    p_lib  =  main_args->Lib;
 +
 
 +
 
 +
/* Define the API format requested and the display file to access */
 +
    memcpy(Format,"DSPF0100",8);
 +
 
 +
/* Point to your DSPF */
 +
    memmove(FileName,p_file, strlen(p_file));
 +
    memmove(FileName + 10 ,p_lib, strlen(p_lib ));
 +
 
 +
 
 +
/* 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);
 +
    }
 +
 
 +
    FindRec();
 +
        printf("\nEnd of test");
 +
 
 +
    ProcessRec();
 +
 
 +
 
 +
  free(ReturnVar);
 +
}
 +
 
 +
int ProcessRec() {
 +
 
 +
      int i;
 +
    /* 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_QDFFRDPD = (QDFFRDPD_t *)((char *) p_QDFFRINF + p_QDFFRINF->WDFFRAOF);
 +
    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 */
 +
 
 +
    for (i=0; i<p_QDFFBASE->WDFFRCS; ++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(RecordName,p_QDFARFTE->WDFARFNM,sizeof(p_QDFARFTE->WDFARFNM));
 +
 
 +
 
 +
    ProcessField();
 +
 
 +
    }
 +
 
 +
}
 +
 
 +
 
 +
int ProcessField() {
 +
 
 +
      int SflCtl;
 +
      int SizeIdx;
 +
      int FldIdx;
 +
      int NumFlds;
 +
      char ScrnSize[1];
 +
      char Attrib[1];
 +
      char X01    =  0x01 ;
 +
 
 +
      /*  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 -1; ++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) {
 +
 
 +
    p_QDFFFINF = (QDFFFINF_t *)((char *) p_QDFFRINF + p_QDFFFITB->WDFFFOFS);
 +
 
 +
    memmove(Attrib,p_QDFFFINF->WDFFFIOA, 1);
 +
    if (strncmp(Attrib,X01, 1) == 0) {
 +
      NumFlds += 1;
 +
    }
 +
 
 +
 
 +
 
 +
 
 +
 
 +
  /***********  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;
 +
 
 +
 
 +
 
 +
    }
 +
 
 +
}
 +
 
 +
 
 +
 
 +
int FindRec() {
 +
        int i;
 +
    /* 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);
 +
    /* While there are records, look for the requested record name */
 +
    /* in the QDFARFTE structure. */
 +
    for (i=0; i<p_QDFFBASE->WDFFRCS; ++i) {
 +
    if (strncmp(p_QDFARFTE->WDFARFNM,MyRec,10) == 0) {
 +
        RecIndex = i + 1; /* Entry in QDFARFTE table for the requested name*/
 +
 
 +
    /* Access additional structures. */
 +
        p_QDFFRINF = (QDFFRINF_t *)((char *) p_QDFFINFO + p_QDFARFTE->WDFARFOF);
 +
        p_QDFFRDPD = (QDFFRDPD_t *)((char *) p_QDFFRINF + p_QDFFRINF->WDFFRAOF);
 +
    /* 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);
 +
            FindField(); /* Find the requested field */
 +
        return(0); /* Task is done. */
 +
}
 +
    else
 +
        p_QDFARFTE = (QDFARFTE_t *)((char *) p_QDFARFTE + sizeof(QDFARFTE_t));
 +
}
 +
    /* If this point is reached, there was no match for the requested */
 +
    /* record. */
 +
        printf("\nThe requested record was not found %s",MyRec);
 +
        return(0);
 +
}
 +
 
 +
 
 +
int FindField () {
 +
    int j;
 +
    int k;
 +
    int NtblIndex;
 +
    char *NamePtr;
 +
    int RCIndex;
 +
    int RecNumber;
 +
    /* Find where used section */
 +
      p_QDFWFLEI = (QDFWFLEI_t *)((char *) p_QDFFINFO + p_QDFFINFO->WDFFWUOF);
 +
    /* Find name table. There is one entry for each unique field */
 +
    /* name used in the file. A given name may be used in more than */
 +
    /* one record format. */
 +
      p_QDFFNTBL = (QDFFNTBL_t *)((char *) p_QDFWFLEI + p_QDFWFLEI->WDFWNTBO);
 +
    /* Prepare to search table. Start search after the fixed portion. */
 +
        NamePtr = (char *) p_QDFFNTBL + sizeof(QDFFNTBL_t);
 +
        NtblIndex = 0;
 +
    /* Find requested name */
 +
    for (j=0; j<p_QDFFNTBL->WDFFNMS; ++j) {
 +
        if (strncmp(NamePtr,MyField,10) == 0) {
 +
            NtblIndex = j + 1;
 +
    /* The requested name was found  Get first QDFWRCDI structure. */
 +
  p_QDFWRCDI = (QDFWRCDI_t *)((char *) p_QDFWFLEI +p_QDFWFLEI->WDFWXLEN);
 +
            RecNumber = 1;
 +
 
 +
    /* For each record, find the first field structure.          +
 +
    Then, find a match for the field name table index            +
 +
    If found, the field structure containing the matched index  +
 +
    also contains the row/column index. */
 +
 
 +
    for (j=0; j<p_QDFFBASE->WDFFRCS; ++j) {
 +
    /* Make sure the field matching is for the correct record. */
 +
        if (RecNumber == RecIndex) {
 +
        p_QDFWFLDI = (QDFWFLDI_t *)((char *) p_QDFWRCDI + p_QDFWRCDI->WDFWRLEN);
 +
    /* Search for the correct field structure */
 +
        for (k=0; k<p_QDFFRINF->WDFFFLD; ++k) {
 +
    /* Find the correct structure by finding a match for the */
 +
    /* index into the field name table. */
 +
        if (NtblIndex == p_QDFWFLDI->WDFWNMEI) {
 +
            RCIndex = p_QDFWFLDI->WDFWRRDX; /* Row/Col index */
 +
    /* Point to first Row/Col Entry */
 +
    p_QDFFRCTE = (QDFFRCTE_t *)((char *) p_QDFFRCTB + sizeof(QDFFRCTB_t));
 +
    /* Point to correct Row/Col Entry. Each entry is 2 bytes. */
 +
    p_QDFFRCTE = (QDFFRCTE_t *)((char *) p_QDFFRCTE + ((RCIndex - 1) * 2 ));
 +
        printf("\n%s %s Row and column (hex) %02x %02x",MyRec,MyField,
 +
            *(char *) p_QDFFRCTE,*((char *) p_QDFFRCTE+1));
 +
        return(0); /* Task is done */
 +
    }
 +
    else
 +
        p_QDFWFLDI = (QDFWFLDI_t *)((char *) p_QDFWFLDI + p_QDFWFLDI->WDFWFLDL);
 +
    }
 +
    }
 +
    else {
 +
    /* Bump ptr to next record structure */
 +
        p_QDFWRCDI = (QDFWRCDI_t *)((char *) p_QDFWRCDI + p_QDFWRCDI->WDFWNXTR);
 +
    RecNumber = RecNumber + 1;
 +
        }
 +
    }
 +
    }
 +
    else
 +
        NamePtr = NamePtr + 10; /* Size of field name*/
 +
    }
 +
    /* If this point is reached, the field was not found */
 +
        printf("\nThe requested field was not found %s %s",MyRec,MyField);
 +
    return (0);
 +
}
 +
 
 +
</pre>

Revision as of 12:55, 19 August 2014


Contents

Introduction

C version of the RPG prpgram DSPINFO. (in development) is a work in progress



 /* 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;
 QDFFRDPD_t *p_QDFFRDPD;
 QDFFRCTB_t *p_QDFFRCTB;
 QDFWFLEI_t *p_QDFWFLEI;
 QDFFNTBL_t *p_QDFFNTBL;
 QDFWRCDI_t *p_QDFWRCDI;
 QDFWFLDI_t *p_QDFWFLDI;
 QDFFRCTE_t *p_QDFFRCTE;
 QDFFSFCR_t *p_QDFFSFCR;
 QDFFSFHR_t *p_QDFFSFHR;
 QDFFSCRA_t *p_QDFFSCRA;
 QDFFFITB_t *p_QDFFFITB;
 QDFFFINF_t *p_QDFFFINF;


    /* Global variables */

    typedef struct inputArguments
    {
        char *pgmname;
        char *Lib;
        char *File;
    } main_args_t;

    int FindRec (void);
    int FindField (void);

    int ProcessRec (void);
    int ProcessField (void);

    int RecIndex;

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

    char Format[8];
    char FileName[20] = "                    ";
    char RecordName[10];

 /* DSPF information TEST ONLY  */
    char MyRec[] = "C01       "; /* Test name */
    char MyField[] = "SRS01     "; /* Test name */

    /* 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};


    char *p_file ;
    char *p_lib ;
    int  API_Len;

    p_file =  main_args->File;
    p_lib  =  main_args->Lib;


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

/* Point to your DSPF */
    memmove(FileName,p_file, strlen(p_file));
    memmove(FileName + 10 ,p_lib, strlen(p_lib ));


 /* 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);
    }

    FindRec();
        printf("\nEnd of test");

    ProcessRec();


   free(ReturnVar);
 }

int ProcessRec() {

       int i;
    /* 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_QDFFRDPD = (QDFFRDPD_t *)((char *) p_QDFFRINF + p_QDFFRINF->WDFFRAOF);
     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 */

     for (i=0; i<p_QDFFBASE->WDFFRCS; ++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(RecordName,p_QDFARFTE->WDFARFNM,sizeof(p_QDFARFTE->WDFARFNM));


     ProcessField();

    }

 }


int ProcessField() {

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

      /*  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 -1; ++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) {

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

    memmove(Attrib,p_QDFFFINF->WDFFFIOA, 1);
     if (strncmp(Attrib,X01, 1) == 0) {
      NumFlds += 1;
     }





   /***********  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;



    }

 }



int FindRec() {
        int i;
    /* 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);
    /* While there are records, look for the requested record name */
    /* in the QDFARFTE structure. */
    for (i=0; i<p_QDFFBASE->WDFFRCS; ++i) {
    if (strncmp(p_QDFARFTE->WDFARFNM,MyRec,10) == 0) {
        RecIndex = i + 1; /* Entry in QDFARFTE table for the requested name*/

    /* Access additional structures. */
        p_QDFFRINF = (QDFFRINF_t *)((char *) p_QDFFINFO + p_QDFARFTE->WDFARFOF);
        p_QDFFRDPD = (QDFFRDPD_t *)((char *) p_QDFFRINF + p_QDFFRINF->WDFFRAOF);
    /* 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);
            FindField(); /* Find the requested field */
        return(0); /* Task is done. */
 }
    else
        p_QDFARFTE = (QDFARFTE_t *)((char *) p_QDFARFTE + sizeof(QDFARFTE_t));
 }
    /* If this point is reached, there was no match for the requested */
    /* record. */
        printf("\nThe requested record was not found %s",MyRec);
        return(0);
 }


int FindField () {
    int j;
    int k;
    int NtblIndex;
    char *NamePtr;
    int RCIndex;
    int RecNumber;
    /* Find where used section */
       p_QDFWFLEI = (QDFWFLEI_t *)((char *) p_QDFFINFO + p_QDFFINFO->WDFFWUOF);
    /* Find name table. There is one entry for each unique field */
    /* name used in the file. A given name may be used in more than */
    /* one record format. */
       p_QDFFNTBL = (QDFFNTBL_t *)((char *) p_QDFWFLEI + p_QDFWFLEI->WDFWNTBO);
    /* Prepare to search table. Start search after the fixed portion. */
        NamePtr = (char *) p_QDFFNTBL + sizeof(QDFFNTBL_t);
        NtblIndex = 0;
    /* Find requested name */
    for (j=0; j<p_QDFFNTBL->WDFFNMS; ++j) {
        if (strncmp(NamePtr,MyField,10) == 0) {
            NtblIndex = j + 1;
    /* The requested name was found   Get first QDFWRCDI structure. */
   p_QDFWRCDI = (QDFWRCDI_t *)((char *) p_QDFWFLEI +p_QDFWFLEI->WDFWXLEN);
            RecNumber = 1;

    /* For each record, find the first field structure.          +
    Then, find a match for the field name table index            +
     If found, the field structure containing the matched index  +
     also contains the row/column index. */

     for (j=0; j<p_QDFFBASE->WDFFRCS; ++j) {
    /* Make sure the field matching is for the correct record. */
        if (RecNumber == RecIndex) {
        p_QDFWFLDI = (QDFWFLDI_t *)((char *) p_QDFWRCDI + p_QDFWRCDI->WDFWRLEN);
    /* Search for the correct field structure */
        for (k=0; k<p_QDFFRINF->WDFFFLD; ++k) {
    /* Find the correct structure by finding a match for the */
    /* index into the field name table. */
        if (NtblIndex == p_QDFWFLDI->WDFWNMEI) {
            RCIndex = p_QDFWFLDI->WDFWRRDX; /* Row/Col index */
    /* Point to first Row/Col Entry */
    p_QDFFRCTE = (QDFFRCTE_t *)((char *) p_QDFFRCTB + sizeof(QDFFRCTB_t));
    /* Point to correct Row/Col Entry. Each entry is 2 bytes. */
    p_QDFFRCTE = (QDFFRCTE_t *)((char *) p_QDFFRCTE + ((RCIndex - 1) * 2 ));
         printf("\n%s %s Row and column (hex) %02x %02x",MyRec,MyField,
            *(char *) p_QDFFRCTE,*((char *) p_QDFFRCTE+1));
         return(0); /* Task is done */
    }
    else
        p_QDFWFLDI = (QDFWFLDI_t *)((char *) p_QDFWFLDI + p_QDFWFLDI->WDFWFLDL);
    }
    }
    else {
    /* Bump ptr to next record structure */
        p_QDFWRCDI = (QDFWRCDI_t *)((char *) p_QDFWRCDI + p_QDFWRCDI->WDFWNXTR);
    RecNumber = RecNumber + 1;
        }
    }
    }
    else
        NamePtr = NamePtr + 10; /* Size of field name*/
    }
    /* If this point is reached, the field was not found */
        printf("\nThe requested field was not found %s %s",MyRec,MyField);
    return (0);
 }