Difference between revisions of "C version of DISPR"

From MidrangeWiki
Jump to: navigation, search
(Remove GLOBAL variable for OpenFiles)
m
 
Line 363: Line 363:
 
                 memcpy (&func, sfrcd.S01FUNC, 2);
 
                 memcpy (&func, sfrcd.S01FUNC, 2);
  
             //  convert to upper case radj blank fill
+
             //  convert to upper case ladj blank fill
 
                 for(j = 0; j EQ 1; j++) {func[j] = toupper(func[j]); }
 
                 for(j = 0; j EQ 1; j++) {func[j] = toupper(func[j]); }
 
                 if (memcmp(&func[0], " ", 1) EQ 0 )
 
                 if (memcmp(&func[0], " ", 1) EQ 0 )

Latest revision as of 04:24, 7 April 2014


C Program

A C program that uses a subfile. I named the program CDISPR and it is a conversion of the RPGLE program DISPR. (see UDDS file displayer)


CDISPR C


/*                 */
#include <stdio.h>
#include <stdlib.h>
#include <recio.h>
#include <string.h>
#include <ctype.h>
#include <decimal.h>
#include <xxcvt.h>

enum Panels
     {
     TOP , S01BLD, S01PRC, S01PRS, S02BLD, S02PRC
     };

#define NUM_RECS   9999

#define PFILENAME    "*LIBL/REL"
#define SOPFILE     "*LIBL/SEL"
#define SUBFILENAME  "*LIBL/CDISPRF"

#pragma mapinc("ddhpf","*libl/REL(*ALL)","input"," ",,"")
#include "ddhpf"
#define REL_t    QWHFDACP_i_t

#pragma mapinc("ddspf","*libl/SEL(*ALL)","input"," ",,"")
#include "ddspf"
#define SEL_t    QWHFDSO_i_t

#pragma mapinc("ddhdf","*LIBL/CDISPRF(*ALL)","both indicators"," ",,"")
#include "ddhdf"
#define RECS01i  S01_i_t
#define RECS01o  S01_o_t
#define RECC01i  C01_i_t
#define RECC01o  C01_o_t
#define RECS02i  S02_i_t
#define RECS02o  S02_o_t
#define RECC02i  C02_i_t
#define RECC02o  C02_o_t



#define RECLENPF sizeof(REL_t)
#define RECLENSEL sizeof(SEL_t)
#define RECLENS01i sizeof(RECS01i)
#define RECLENS01o sizeof(RECS01o)
#define RECLENC01i sizeof(RECC01i)
#define RECLENC01o sizeof(RECC01o)
#define RECLENS02i sizeof(RECS02i)
#define RECLENS02o sizeof(RECS02o)
#define RECLENC02i sizeof(RECC02i)
#define RECLENC02o sizeof(RECC02o)

#define IND_ON '1'
#define IND_OFF '0'
#define I03      2
#define I12     11
#define I51     50
#define I52     51
#define I53     52
#define I56     55
#define EQ      ==
#define SHARE   static
#define EXPORT
#define IMPORT  extern
#define forever for (;;) /* infinite loop */


void fOpenFiles(_RFILE **, _RFILE **,_RFILE **);
void fS01BLD(_RFILE *, _RFILE *, int *, char *, char *);
void fS01PRC(_RFILE *, int *, char *, char *);
void fS01PRS(_RFILE *, int *, char *, char *);
void fS02BLD(_RFILE *, _RFILE *, int *,char *, char *);
void fS02PRC(_RFILE *, int *,char *, char *);



EXPORT    enum Panels Panel[99]  ;
EXPORT    int  pnl_lvl = 0;
EXPORT    _SYSindara       indicator_area;



int main(void)
{

  _RFILE           *pf   ;
  _RFILE           *subf ;
  _RFILE           *sopf ;
    int              i;
    int              n;
    int              *pn  = &n;
    int              n2;
    int              *pn2  = &n2;


    char C01FILE[10] = "          ";
    char C01LIB[10]  = "          ";
    char *p_c01file ;
    char *p_c01lib ;
    char C02FILE[10] = "          ";
    char C02LIB[10]  = "          ";
    char *p_c02file ;
    char *p_c02lib ;

    p_c01file =  C01FILE;
    p_c01lib  =  C01LIB;
    p_c02file =  C02FILE;
    p_c02lib  =  C02LIB;

    Panel[++pnl_lvl] = TOP ;
    Panel[++pnl_lvl] =  S01BLD ;

    for (i = 0; i <= 98; i++)
        { indicator_area[i] = IND_OFF;}


   //  OPEN the FILES

    fOpenFiles(&pf, &subf, &sopf );


forever
{
  switch (Panel[pnl_lvl])
  {
    case S01BLD:
       fS01BLD(pf, subf, pn, p_c01file, p_c01lib );
      break;

    case S01PRC:
       fS01PRC(subf, pn, p_c01file, p_c01lib );
      break;

    case  S01PRS:
       fS01PRS(subf, pn,  p_c02file, p_c02lib);
      break;

    case S02BLD:
       fS02BLD(sopf, subf, pn2, p_c02file, p_c02lib);
      break;

    case S02PRC:
       fS02PRC(subf, pn2,p_c02file, p_c02lib);
      break;

    case TOP:
  //  EXIT THE PROGRAM
      exit(0);
  }

  //  CF3 EXIT
    if (indicator_area[I03] EQ IND_ON)
    { exit(0); }
  //  CF12  PREVIOUS
    if (indicator_area[I12] EQ IND_ON)
    { indicator_area[I12] = IND_OFF,pnl_lvl--; }

}


/* Close the physical files and the subfile.                           */
     _Rclose(pf);
     _Rclose(sopf);
     _Rclose(subf);
}

//  ###################################



void fS01BLD(_RFILE *pf, _RFILE *subf, int *n, char *f, char *l)
 {
   _RIOFB_T      *fb;
    int           i;
    REL_t         pfrcd;
    RECS01o       sfrcd;
    RECS01o       *p_sfrcd;
    char          wfile[10];
    char          wlib[10];

    p_sfrcd    =  &sfrcd;
    _Rindara(subf, indicator_area );

/* CLEAR the SUBFILE  */
     _Rformat(subf, "C01");
    indicator_area[I51] = IND_OFF;
    indicator_area[I52] = IND_OFF;
    indicator_area[I53] = IND_ON;
      fb = _Rwrite(subf, "" , 0);


/* Select the subfile record format.                                  */
        _Rformat(subf, "S01");
        *n = 0;
        for (i = 1; i <= NUM_RECS; i++)
        {
               fb = _Rreadn(pf, &pfrcd, RECLENPF, __DFT);
               if (fb->num_bytes != EOF)
               {


                memcpy (f , pfrcd.APFILE, 10);
                memcpy (l , pfrcd.APLIB , 10);
                if (( memcmp(pfrcd.APFILE, wfile, 10) EQ 0 ) &&
                    ( memcmp(pfrcd.APLIB, wlib, 10) EQ 0 ))
                {
                indicator_area[I56] = IND_ON;
                memset (&sfrcd, ' ', sizeof(sfrcd)) ;
                memcpy (sfrcd.S01APKSEQ, pfrcd.APKSEQ, 1  );
                memcpy (sfrcd.S01APKSIN, pfrcd.APKSIN, 1  );
                memcpy (sfrcd.S01APKEYF, pfrcd.APKEYF, 10 );
                }
                else
                {
                indicator_area[I56] = IND_OFF;
                memcpy (sfrcd.S01FUNC  , "          ", 2  );
                memcpy (wfile, pfrcd.APFILE, 10 );
                memcpy (wlib, pfrcd.APLIB, 10 );
                memcpy (sfrcd.S01APLIB , pfrcd.APLIB , 10 );
                memcpy (sfrcd.S01APFILE, pfrcd.APFILE, 10 );
                memcpy (sfrcd.S01APLIB , pfrcd.APLIB , 10 );
                memcpy (sfrcd.S01APACCP, pfrcd.APACCP, 1  );
                memcpy (sfrcd.S01APUNIQ, pfrcd.APUNIQ, 1  );
                memcpy (sfrcd.S01APSELO, pfrcd.APSELO, 1  );
                memcpy (sfrcd.S01APFTYP, pfrcd.APFTYP, 1  );
                memcpy (sfrcd.S01APJOIN, pfrcd.APJOIN, 1  );
                memcpy (sfrcd.S01APKEYO, pfrcd.APKEYO, 1  );
                memcpy (sfrcd.S01APKSEQ, pfrcd.APKSEQ, 1  );
                memcpy (sfrcd.S01APKSIN, pfrcd.APKSIN, 1  );
                memcpy (sfrcd.S01APKEYF, pfrcd.APKEYF, 10 );
                }

                 fb = _Rwrited(subf, p_sfrcd, RECLENS01o, i);

                 if (fb->num_bytes != RECLENS01o )
                 {
                   printf("error occurred during write\n");
                   exit(3);
                 }
                 else
                 {
                   *n = i;
                 }


               }
               else
               {
               break;
               }
        }
        Panel[++pnl_lvl] =  S01PRC ;

 }
//  ###################################

void fS01PRC(_RFILE *subf, int *n, char *f, char *l)
 {

 /*
 +Write the subfile to the display by writing a record to the
 +subfile control format.
 */
    int             i;
    _RIOFB_T      *fb;

    RECC01o       cfrcd;
    RECC01o       *p_cfrcd;

    p_cfrcd    = &cfrcd;

    _Rformat(subf, "R01");
    fb = _Rwrite(subf, "", 0);

 forever
  {
     _Rformat(subf, "C01");
     _Rindara(subf, indicator_area );

      i = 1;
      QXXITOZ (cfrcd.SRS01 , 4 , 0, i);

      memcpy (cfrcd.C01APBOF, f , 10);
      memcpy (cfrcd.C01APBOL, l , 10);

    indicator_area[I51] = IND_OFF;
    indicator_area[I52] = IND_ON;
    indicator_area[I53] = IND_OFF;
    if (n != 0)
    { indicator_area[I51] = IND_ON; }

     fb = _Rwrite(subf, p_cfrcd, RECLENC01o);

     if (fb->num_bytes != RECLENC01o )
                 {
                   printf("error occurred during write\n");
                   exit(3);
                 }


     _Rreadn(subf, "", 0, __DFT);

      //  CF3 EXIT
    if (indicator_area[I03] EQ IND_ON) { break; }

     //  CF12 Previous
         if (indicator_area[I12] EQ IND_ON)
         {pnl_lvl--; break; }

    //  Process the subfile

    Panel[++pnl_lvl] =  S01PRS ;
    break;

   }
 }

 //  ###################################
void fS01PRS(_RFILE *subf, int *n,  char *f, char *l)
 {

  _RIOFB_T      *fb;
    RECS01i       sfrcd;
    RECS01i       *p_sfrcd;
    long        rrn;
    int         i;
    int         j;
    char        func[2];

   p_sfrcd    =  &sfrcd;
   _Rindara(subf, indicator_area );


/* Select the subfile record format.                                  */
        _Rformat(subf, "S01");


    for (i = 1; i <= *n ; i++)
    {
        rrn = i;
         fb = _Rreadd(subf, p_sfrcd, RECLENS01i, __DFT,rrn);
               if (fb->num_bytes EQ EOF)
               {
               {pnl_lvl--; break; }
               }
               else
               {
                memcpy (f, sfrcd.S01APFILE , 10 );
                memcpy (l, sfrcd.S01APLIB , 10 );
                memcpy (&func, sfrcd.S01FUNC, 2);

             //  convert to upper case ladj blank fill
                for(j = 0; j EQ 1; j++) {func[j] = toupper(func[j]); }
                if (memcmp(&func[0], " ", 1) EQ 0 )
                  {
                  memmove(&func[0] , &func[1] ,1);
                  memcpy(&func[1] ," ", 1);
                  }

               if (memcmp(func, "X ", 2) EQ 0 )
               {
               indicator_area[I03] = IND_ON ;  break;
               }

               if (memcmp(func, "R ", 2) EQ 0 )
               {
                memcpy (sfrcd.S01FUNC  , "          ", 2  );
                fb  =  _Rupdate(subf,p_sfrcd, RECLENS01i);
                Panel[++pnl_lvl] =  S02BLD ; break;
               }
               if (fb->rrn  EQ *n)
               {  --pnl_lvl;   }

               }

    }


 }

//  ###################################

void fS02BLD(_RFILE *sopf, _RFILE *subf, int *n2, char *f, char *l)
 {

  _RIOFB_T      *fb;
    SEL_t         pfrcd;
    RECS02o       sfrcd;
    RECS02o       *p_sfrcd;
    long        rrn;
    int         i;
    int         j;
    char        wfile[10];
    char        wlib[10];

    p_sfrcd =  &sfrcd;
   _Rindara(subf, indicator_area );

    memcpy (wfile , f, 10);
    memcpy (wlib , l , 10);

    /* CLEAR the SUBFILE  */
     _Rformat(subf, "C02");
    indicator_area[I51] = IND_OFF;
    indicator_area[I52] = IND_OFF;
    indicator_area[I53] = IND_ON;
      fb = _Rwrite(subf, "" , 0);


/* Select the subfile record format.                                  */
    _Rformat(subf, "S02");
    *n2 = 0;
    j = 0;

    for (i = 1; i < NUM_RECS; i++)
    {
        rrn = i;
         fb = _Rreadd(sopf, &pfrcd, RECLENSEL, __NO_LOCK,rrn);
               if (fb->num_bytes EQ EOF)
               {
               break;
               }
               else
               {

               if (( memcmp(pfrcd.SOFILE, wfile, 10) EQ 0 ) &&
                    ( memcmp(pfrcd.SOLIB, wlib, 10) EQ 0 ))
               {
                memcpy (sfrcd.S02SOFLD, pfrcd.SOFLD, 10  );
                memcpy (sfrcd.S02SORULE, pfrcd.SORULE, 1  );
                memcpy (sfrcd.S02SOCOMP, pfrcd.SOCOMP, 2 );
                memcpy (sfrcd.S02SOVALU, pfrcd.SOVALU, 32 );

               fb = _Rwrited(subf, p_sfrcd, RECLENS02o, ++j);

                 if (fb->num_bytes != RECLENS02o )
                 {
                   printf("error occurred during write\n");
                   exit(3);
                 }
                 else
                 {
                   *n2 = j;
                 }
                }

               }

    }
             Panel[++pnl_lvl] =  S02PRC ;

   }

//  ###################################

void fS02PRC(_RFILE *subf, int *n, char *f, char *l)
 {

 /*
 +Write the subfile to the display by writing a record to the
 +subfile control format.
 */
    int             i;
    _RIOFB_T      *fb;

    RECC02o       cfrcd;
    RECC02o       *p_cfrcd;

    p_cfrcd    = &cfrcd;

    _Rformat(subf, "R02");
    fb = _Rwrite(subf, "", 0);

  forever
   {
     _Rformat(subf, "C02");
     _Rindara(subf, indicator_area );

      i = 1;
      QXXITOZ (cfrcd.SRS02 , 4 , 0, i);

      memcpy (cfrcd.C02APFILE, f , 10);
      memcpy (cfrcd.C02APLIB, l , 10);

    indicator_area[I51] = IND_OFF;
    indicator_area[I52] = IND_ON;
    indicator_area[I53] = IND_OFF;
    if (n != 0)
    { indicator_area[I51] = IND_ON; }

     fb = _Rwrite(subf, p_cfrcd, RECLENC02o);

     if (fb->num_bytes != RECLENC02o )
                 {
                   printf("error occurred during write\n");
                   exit(3);
                 }


     _Rreadn(subf, "", 0, __DFT);

      //  CF3 EXIT
    if (indicator_area[I03] EQ IND_ON) { break; }

     //  CF12 Previous
    if (indicator_area[I12] EQ IND_ON)
            { indicator_area[I12] = IND_OFF; }

     //  ENTER  and F12
        pnl_lvl--;pnl_lvl--;break;
    }
 }

 //  ###################################

static void fOpenFiles(_RFILE **f, _RFILE **sf,_RFILE **so)
{

    /* Open the Relations  file.                            */
      *f = _Ropen(PFILENAME, "rr");
      if (*f EQ NULL)
         {
            printf("can't open file %s\n", PFILENAME);
            exit(1);
         }


    /* Open the subfile  file.                            */
      *sf = _Ropen(SUBFILENAME, "wr+ indicators=y");
      if (*sf EQ NULL)
         {
            printf("can't open file %s\n", SUBFILENAME);
            exit(2);
         }

    /* Open the Select/Omit  file.                            */
      *so = _Ropen(SOPFILE, "rr");
      if (*so EQ NULL)
         {
            printf("can't open file %s\n", SOPFILE);
            exit(3);
         }

}




#top


CDISPR needed files

You need to create these file


To create files REL and SEL

DSPFD FILE(*libl/urfile*) TYPE(*ACCPTH) OUTPUT(*OUTFILE) OUTFILE(QTEMP/REL)
DSPFD FILE(*libl/urfile*) TYPE(*select) OUTPUT(*OUTFILE) OUTFILE(QTEMP/SEL) 

DDS for  CDISPRF

     A*%%TS  SD  
     A*
     A*%%EC
     A                                      INDARA
     A                                      DSPSIZ(24 80 *DS3)
     A                                      PRINT
     A                                      CF03(03)
     A                                      CF12(12)
     A          R S01                       SFL
     A*%%TS  SD  
     A            S01FUNC        2A  B  4  3
     A  55
     AO 56                                  DSPATR(PR ND)
     A            S01APFILE R        O  4  6REFFLD(QWHFDACP/APFILE QTEMP/REL)
     A            S01APLIB  R        O  4 17REFFLD(QWHFDACP/APLIB QTEMP/REL)
     A            S01APACCP R        O  4 29REFFLD(QWHFDACP/APACCP QTEMP/REL)
     A            S01APUNIQ R        O  4 33REFFLD(QWHFDACP/APUNIQ QTEMP/REL)
     A            S01APSELO R        O  4 37REFFLD(QWHFDACP/APSELO QTEMP/REL)
     A            S01APFTYP R        O  4 41REFFLD(QWHFDACP/APFTYP QTEMP/REL)
     A            S01APJOIN R        O  4 45REFFLD(QWHFDACP/APJOIN QTEMP/REL)
     A            S01APKEYO R        O  4 48REFFLD(QWHFDACP/APKEYO QTEMP/REL)
     A            S01APKSEQ R        O  4 53REFFLD(QWHFDACP/APKSEQ QTEMP/REL)
     A            S01APKSIN R        O  4 57REFFLD(QWHFDACP/APKSIN QTEMP/REL)
     A            S01APKEYF R        O  4 61REFFLD(QWHFDACP/APKEYF QTEMP/REL)
     A          R C01                       SFLCTL(S01)
     A*%%TS  SD  
     A                                      SFLSIZ(0019)
     A                                      SFLPAG(0018)
     A                                      OVERLAY
     A  50                                  SFLEND
     A  51                                  SFLDSP
     A  52                                  SFLDSPCTL
     A  53                                  SFLCLR
     A            SRS01          4S 0H      SFLRCDNBR(CURSOR)
     A*
     A                                  1 18'FILE RELATIONS for '
     A            C01APBOF  R        O  1 39REFFLD(QWHFDACP/APBOF QTEMP/REL)
     A                                  1 51'Lib.'
     A            C01APBOL  R        O  1 56REFFLD(QWHFDACP/APBOL QTEMP/REL)
     A                                  2 32'Uni SEL         LIFO ASC Key'
     A                                  3  6'File       Library    Acc Key OMT -
     A                                      TYP  J  FIFO DSC Sgn Key'
     A          R R01
     A                                 24  3'F3-Exit'
     A                                 22  3'R - Display Select/Omit rules'
     A                                 23  3'X - Select for display'
      *
     A          R R02
     A                                 24  3'F3-Exit'
     A          R S02                       SFL
     A                                      SFLNXTCHG
     A            S02SOFLD  R        O  4  4REFFLD(QWHFDSO/SOFLD QTEMP/SEL)
     A            S02SORULE R        O  4 17REFFLD(QWHFDSO/SORULE QTEMP/SEL)
     A            S02SOCOMP R        O  4 22REFFLD(QWHFDSO/SOCOMP QTEMP/SEL)
     A            S02SOVALU R        O  4 28REFFLD(QWHFDSO/SOVALU QTEMP/SEL)

     A          R C02                       SFLCTL(S02 )
     A                                      OVERLAY
     A  50                                  SFLEND
     A  51                                  SFLDSP
     A  52                                  SFLDSPCTL
     A  53                                  SFLCLR
     A                                      SFLSIZ(0019)
     A                                      SFLPAG(0018)
     A            SRS02          4S 0H      SFLRCDNBR(CURSOR)
     A*
     A                                  1  6'FILE SELECTS   for '
     A            C02APFILE R        O  2  7REFFLD(QWHFDSO/SOFILE QTEMP/SEL)
     A                                  2 20'Lib.'
     A            C02APLIB  R        O  2 25REFFLD(QWHFDSO/SOLIB QTEMP/SEL)
     A                                  3  4'Field'
     A                                  3 28'Select/Omit Value'
     A                                  3 16'S/O'
     A                                  3 21'COMP'






#top