Coding a program in C

the following sample C program shows how the different parts of a command-level program fit together, and how the EXEC DLI commands are coded in a CICS® online program.

Except for a few commands, this program applies to batch, BMP, and CICS programs. Any differences are highlighted in the notes for the sample C code. The numbering on the right of the sample code references those notes.

#include < string.h>                                              				 1 
#include < stdio.h >                                              				 2 
 
   char  DIVIDER[120] = "-----------------------------------------\
 ------------------------------------------------------------------";
   char  BLANK[120]   = "                                         \
                                                                  \0";
   char  BLAN2[110]   = "                                         \
                                                        \0";
   char  SCHED[120] = "Schedule PSB(PC3COCHD)         "                 	 3 
   char  GN1[120] = "GN using PCB(2) Segment(SE2ORDER) check dibstat \
is blank";
   char   GNP1[120] = "GNP using PCB(2) check dibstat = GK or blank \
(or GE for last GNP)";
   char   GU1[120]  = "GU using PCB(2) Segment(SE2ORDER) where(\
FE2OGREF=000000'') check dibstat blank";
   char   GU2[120]  = "GU using PCB(2) Segment(SE2ORDER) where(\
FE2OGREF=000999'') check dibstat blank";
   char  REP1[120]  = "REPLACE using PCB(2) Segment(SE2ORDER) check \
dibstat is blank";
   char  DEL1[120]   = "DELETE using PCB(2) Segment(SE2ORDER) check \
dibstat is blank";
   char  INS1[120]   = "INSERT using PCB(2) Segment(SE2ORDER) where\
(FE2OGREF=''000999'') check dibstat is blank";
   char  TERM[120]   = "TERM - check dibstat is blank";
   char  STAT[120]   = "STAT USING PCB(2) VSAM FORMATTED";
   char  DATAB[6]    = "000999";
   char  DATAC[114]  = " REGRUN TEST INSERT NO1.";
   char  START[120]  = "PROGXIV STARTING";
   char  OKMSG[120]  = "PROGXIV COMPLETE";
   int   TLINE = 120;
   int   L11 = 11;
   int   L360 = 11;
   struct {
         char NEWSEGB[6];
         char NEWSEGC[54];
   } NEWSEG;
   char  OUTLINE[120];                                                 		 4 
   struct {
         char OUTLINA[9];
         char OUTLINB[111];
   } OUTLIN2;
   struct {
         char  OUTLINX[9];
         char  OUTLINY[6];
         char  OUTLINZ[105];
   } OUTLIN3;
   char  GUIOA[60];
   char  GNIOA[60];
   struct {
         char ISRT1[6];
         char ISRT2[54];
   } ISRTIOA;
   struct {
         char REPLIO1[6];
         char REPLIO2[54];
   } REPLIOA;
   struct {
         char DLET1[6];
         char DLET2[54];
   } DLETIOA;
   struct {
         char STATA1[120];
         char STATA2[120];
         char STATA3[120];
   } STATAREA;
   struct {
         char DHPART[2];
         char RETCODE[2]
   } DHABCODE;
 
main()
{
         EXEC CICS ADDRESS EIB(dfheiptr);                          			 5 
         strcpy(OUTLINE,DIVIDER);
         SENDLINE();
         strcpy(OUTLINE,START);
         SENDLINE();
    /*                                                      */
    /* SCHEDULE PSB                                         */
    /*                                                      */
         strcpy(OUTLINE,SCHED);
         SENDLINE();
         EXEC DLI SCHEDULE PSB(PC3COCHD);                          			 6 
         SENDSTAT();
         TESTDIB();
    /*                                                     */
    /* ISSUE GU REQUEST                                    */
    /*                                                     */
         strcpy(OUTLINE,GU1);
         SENDLINE();
         EXEC DLI GET UNIQUE USING PCB(2)                         				 7 
               SEGMENT(SE2ORDER)
               WHERE(FE2OGREF>="000000")
               INTO(&GUIOA) SEGLENGTH(60);
         strcpy(OUTLIN2.OUTLINA,"SE2ORDER=");
         strcpy(OUTLIN2.OUTLINB,GUIOA);
         SENDLIN2();
         SENDSTAT();
         TESTDIB();
    /*                                                   */
    /* ISSUE GNP REQUEST                                 */
    /*                                                   */
 do {
         strcpy(OUTLINE,GNP1);
         SENDLINE();
         EXEC DLI GET NEXT IN PARENT USING PCB(2)                  			 8 
               INTO(&GNIOA) SEGLENGTH(60);
         strcpy(OUTLIN2.OUTLINA,"SEGMENT=");
         strcpy(OUTLIN2.OUTLINB,GNIOA);
         SENDLIN2();
         SENDSTAT();
         if (strncmp(dibptr->dibstat,"GE",2) != 0)                				 9 
            TESTDIB();
  } while (strncmp(dibptr->dibstat,"GE",2) != 0);
    /*                                                    */
    /* ISSUE GN REQUEST                                   */
    /*                                                    */
         strcpy(OUTLINE,GN1);
         SENDLINE();
         EXEC DLI GET NEXT USING PCB(2)
               SEGMENT(SE2ORDER)                                      		 10 
               INTO(&GNIOA) SEGLENGTH(60);
         strcpy(OUTLIN2.OUTLINA,"SE2ORDER=");
         strcpy(OUTLIN2.OUTLINB,GNIOA);
         SENDLIN2();
         SENDSTAT();
         TESTDIB();
    /*                                                     */
    /* INSERT SEGMENT                                      */
    /*                                                     */
         strcpy(OUTLINE,INS1);
         SENDLINE();
         strcpy(NEWSEG.NEWSEGB,DATAB);                                		 11 
         strcpy(NEWSEG.NEWSEGC,DATAC);
         strcpy(ISRTIOA.ISRT1,NEWSEG.NEWSEGB);
         strcpy(ISRTIOA.ISRT2,NEWSEG.NEWSEGC);
         strcpy(OUTLIN3.OUTLINX,"ISRT SEG=");
         strcpy(OUTLIN3.OUTLINY,ISRTIOA.ISRT1);
         strcpy(OUTLIN3.OUTLINZ,ISRTIOA.ISRT2);
         SENDLIN3();
         EXEC DLI ISRT USING PCB(2)
               SEGMENT(SE2ORDER)
               FROM(&ISRTIOA) SEGLENGTH(60);
         SENDSTAT();
         if (strncmp(dibptr->dibstat,"II",2) == 0)
               strncpy(dibptr->dibstat,"  ",2);
         TESTDIB();
    /*                                                     */
    /* ISSUE GN REQUEST                                    */
    /*                                                     */
         strcpy(OUTLINE,GN1);
         SENDLINE();
         EXEC DLI GET NEXT USING PCB(2)                                 	 12 
               SEGMENT(SE2ORDER)
               INTO(&GNIOA) SEGLENGTH(60);
         strcpy(OUTLIN2.OUTLINA,"SE2ORDER=");
         strcpy(OUTLIN2.OUTLINB,GNIOA);
         SENDLIN2();
         SENDSTAT();
         TESTDIB();
    /*                                             */
    /* GET INSERTED SEGMENT TO BE REPLACED         */
    /*                                             */
         strcpy(OUTLINE,GU2);
         SENDLINE();
         EXEC DLI GET UNIQUE USING PCB(2)                                  13 
               SEGMENT(SE2ORDER)
               WHERE(FE2OGREF="000999")
               INTO(&ISRTIOA) SEGLENGTH(60);
         strcpy(OUTLIN3.OUTLINX,"ISRT SEG=");
         strcpy(OUTLIN3.OUTLINY,ISRTIOA.ISRT1);
         strcpy(OUTLIN3.OUTLINZ,ISRTIOA.ISRT2);
         SENDLIN3();
         SENDSTAT();
         TESTDIB();
    /*                                                   */
    /* REPLACE SEGMENT                                   */
    /*                                                   */
         strcpy(OUTLINE,REP1);
         SENDLINE();
         strcpy(REPLIOA.REPLIO1,DATAB);                                			 14 
         strcpy(REPLIOA.REPLIO2,"REGRUN REPLACED SEGMENT NO1.");
         strcpy(OUTLIN3.OUTLINX,"REPL SEG=");
         strcpy(OUTLIN3.OUTLINY,REPLIOA.REPLIO1);
         strcpy(OUTLIN3.OUTLINZ,REPLIOA.REPLIO2);
         SENDLIN3();
         EXEC DLI REPLACE USING PCB(2)
               SEGMENT(SE2ORDER)
               FROM(&REPLIOA) SEGLENGTH(60);
         SENDSTAT();
         TESTDIB();
    /*                                                     */
    /* ISSUE GN REQUEST                                    */
    /*                                                     */
         strcpy(OUTLINE,GN1);
         SENDLINE();
         EXEC DLI GET NEXT USING PCB(2)                                  		 15 
               SEGMENT(SE2ORDER)
               INTO(&GNIOA) SEGLENGTH(60);
         strcpy(OUTLIN2.OUTLINA,"SE2ORDER=");
         strcpy(OUTLIN2.OUTLINB,GNIOA);
         SENDLIN2();
         SENDSTAT();
         TESTDIB();
    /*                                               */
    /* GET REPLACED SEGMENT                          */
    /*                                               */
         strcpy(OUTLINE,GU2);
         SENDLINE();
         EXEC DLI GET UNIQUE USING PCB(2)                                		 16 
               SEGMENT(SE2ORDER)
               WHERE(FE2OGREF="000999")
               INTO(&REPLIOA) SEGLENGTH(60);
         strcpy(OUTLIN3.OUTLINX,"REPL SEG=");
         strcpy(OUTLIN3.OUTLINY,REPLIOA.REPLIO1);
         strcpy(OUTLIN3.OUTLINZ,REPLIOA.REPLIO2);
         SENDLIN3();
         SENDSTAT();
         TESTDIB();
    /*                                                              */
    /* ISSUE DELETE REQUEST                                         */
    /*                                                              */
         strcpy(OUTLINE,DEL1);
         SENDLINE();
         strcpy(DLETIOA.DLET1,REPLIOA.REPLIO1);                           	 17 
         strcpy(DLETIOA.DLET2,REPLIOA.REPLIO2);
         strcpy(OUTLIN3.OUTLINX,"DLET SEG=");
         strcpy(OUTLIN3.OUTLINY,DLETIOA.DLET1);
         strcpy(OUTLIN3.OUTLINZ,DLETIOA.DLET2);
         SENDLIN3();
         EXEC DLI DELETE USING PCB(2)
               SEGMENT(SE2ORDER)
               FROM(&DLETIOA) SEGLENGTH(60);
         SENDSTAT();
         TESTDIB();
    /*                                                              */
    /* ISSUE STAT REQUEST                                           */
    /*                                                              */
         strcpy(OUTLINE,STAT);
         SENDLINE();
         EXEC DLI STAT USING PCB(2)                                       	 18 
               VSAM FORMATTED
               INTO(&STATAREA);
         SENDSTT2();
         TESTDIB();
    /*                                                              */
    /* ISSUE TERM REQUEST                                           */
    /*                                                              */
         strcpy(OUTLINE,TERM);
         SENDLINE();
         EXEC DLI TERM;                                                   	 19 
         SENDSTAT();
         TESTDIB();
         strcpy(OUTLINE,DIVIDER);
         SENDLINE();
         SENDOK();
    /*                                                              */
    /* RETURN TO CICS                                               */
    /*                                                              */
         EXEC CICS RETURN;
}
    /*                                                              */
    /*                                                              */
    /*                                                              */
 SENDLINE()
 {
         EXEC CICS SEND FROM(OUTLINE) LENGTH(120);                        	 20 
         EXEC CICS WRITEQ TD QUEUE("PRIM") FROM(OUTLINE) LENGTH(TLINE);
         strcpy(OUTLINE,BLANK);
         return;
 }
 
 SENDLIN2()
{
         EXEC CICS SEND FROM(OUTLIN2) LENGTH(120);
         EXEC CICS WRITEQ TD QUEUE("PRIM") FROM(OUTLIN2) LENGTH(TLINE);
         strcpy(OUTLIN2.OUTLINA,BLANK,9);
         strcpy(OUTLIN2.OUTLINB,BLANK,111);
         return;
 }
 
 SENDLIN3()
{
         EXEC CICS SEND FROM(OUTLIN3) LENGTH(120);
         EXEC CICS WRITEQ TD QUEUE("PRIM") FROM(OUTLIN3) LENGTH(TLINE);
         strcpy(OUTLIN3.OUTLINX,BLANK,9);
         strcpy(OUTLIN3.OUTLINY,BLANK,6);
         strcpy(OUTLIN3.OUTLINZ,BLANK,105);
         return;
 }
 
SENDSTAT()
{
         strncpy(OUTLIN2.OUTLINA,BLANK,9);
         strncpy(OUTLIN2.OUTLINB,BLAN2,110);
         strcpy(OUTLIN2.OUTLINA," DIBSTAT=");
         strcpy(OUTLIN2.OUTLINB,dibptr->dibstat);
         EXEC CICS SEND FROM(OUTLIN2) LENGTH(11);
         EXEC CICS WRITEQ TD QUEUE("PRIM") FROM(OUTLIN2) LENGTH(L11);
         strcpy(OUTLINE,DIVIDER);
         SENDLINE();
         return;
 }
 
SENDSTT2()
{
         strncpy(OUTLIN2.OUTLINA,BLANK,9);
         strncpy(OUTLIN2.OUTLINB,BLAN2,110);
         strcpy(OUTLIN2.OUTLINA," DIBSTAT=");
         strcpy(OUTLIN2.OUTLINB,dibptr->dibstat);
         EXEC CICS SEND FROM(STATAREA) LENGTH(360);
         EXEC CICS WRITEQ TD QUEUE("PRIM") FROM(STATAREA)
                   LENGTH(L360);
         return;
 }
 
SENDOK()
{
         EXEC CICS SEND FROM(OKMSG) LENGTH(120);
         EXEC CICS WRITEQ TD QUEUE("PRIM") FROM(OKMSG) LENGTH(TLINE);
         return;
 }
 
TESTDIB()                                                                		 21 
{
    if (strncmp(dibptr->dibstat,"  ",2) == 0)
       return;
    else if (strncmp(dibptr->dibstat,"GK",2) == 0)
       return;
    else if (strncmp(dibptr->dibstat,"GB",2) == 0)
       return;
    else if (strncmp(dibptr->dibstat,"GE",2) == 0)
       return;
    else
       {
            EXEC CICS ABEND ABCODE("PETE");                              		 22 
            EXEC CICS RETURN;
       }
         return;
 }
 

Notes for the sample C code:

  •  1 You must include a standard header file string.h to gain access to string manipulation facilities.
  •  2 You must include standard header file stdio.h to access the standard I/O library.
  •  3 Define DL/I messages.
  •  4 Define the I/O areas.
  •  5 Program start.
  •  6 Define PSB PC3COCHD.
  •  7 Issue the first command. Retrieves the first occurrence of segment SE2ORDER and puts it into array OUTLIN2.
  •  8 Issue the GNP command to get the next segment and put it into array OUTLIN2.
  •  9 GE status codes indicate no more segments to get.
  •  10 Get next segment SE2ORDER and put it into the array OUTLIN2.
  •  11 Insert segment into array OUTLIN3.
  •  12 Issue GN to retrieve next segment and put it into array OUTLIN2.
  •  13 Get next segment that will be replaced and put it into OUTLIN3.
  •  14 Replace the segment and put it into array OUTLIN3.
  •  15 Get next segment and put it into array OUTLIN2.
  •  16 Get the replaced segment and put it into array OUTLIN3.
  •  17 Issue DELETE command after putting content of segment into array OUTLIN3.
  •  18 Issue STAT REQUEST command.
  •  19 Issue TERM command.
  •  20 Output processing.
  •  21 Check return code.
  •  22 Do not code EXEC CICS commands in a batch or BMP program.