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.