|
||||||||
|
|
![]() |
|
|
|
|
||
|
Where Is My Source Code? Hey, Ted: In the April 4 edition of Midrange Guru, the first tip tells how to find out which source member was used to create both OPM and ILE programs. How can I determine which source member was used to create a file? --Larry Use the Display Object Description (DSPOBJD) command. As I've written before, I consider DSPOBJD to be one of the handiest commands on the system. DSPOBJD OBJ(MYLIB/MYFILE) OBJTYPE(*FILE) Choose option 8 to view the service attributes. You may want to take this a step further and go directly to the source code. Here is the source code for a command I call FS (Find Source):
/* =============================================================== */
/* FS - Find source code for an object */
/* =============================================================== */
/* To create: */
/* */
/* CRTCMD CMD(XXX/FS) PGM(*LIBL/FSC) */
/* SRCFILE(XXX/QCMDSRC) SRCMBR(FS) */
/* =============================================================== */
CMD PROMPT('Find source for an object')
PARM KWD(OBJECT) TYPE(Q1) MIN(1) PROMPT('Object')
PARM KWD(TYPE) TYPE(*CHAR) LEN(10) MIN(1) +
EXPR(*YES) PROMPT('Object type')
PARM KWD(OPTION) TYPE(*CHAR) LEN(1) RSTD(*YES) +
DFT(M) VALUES(D E M) EXPR(*YES) +
CHOICE('D=Display, E=edit, M=message') +
PROMPT('Option')
Q1: QUAL TYPE(*NAME) MIN(1) EXPR(*YES)
QUAL TYPE(*NAME) DFT(*LIBL) SPCVAL((*LIBL) +
(*CURLIB)) EXPR(*YES) PROMPT('Library')
Here is the command-processing program, FSC.
/* =============================================================== */
/* FS - Find source code for an object */
/* =============================================================== */
/* To create: */
/* */
/* CRTCLPGM PGM(XXX/FSC) SRCFILE(XX/QCLSRC) SRCMBR(FSC) */
/* =============================================================== */
PGM PARM(&QOBJ &OBJTYPE &OPTION)
DCL &QOBJ *CHAR 21
DCL &OBJNAME *CHAR 10
DCL &OBJTYPE *CHAR 10
DCL &OBJLIB *CHAR 10
DCL &OPTION *CHAR 1
DCLF QADSPOBJ
DCL &ERROR *LGL
DCL &MSGDTA *CHAR 80
DCL &MSGID *CHAR 7
DCL &MSGF *CHAR 10
DCL &MSGFLIB *CHAR 10
MONMSG MSGID(CPF0000) EXEC(GOTO ABEND)
CHGVAR VAR(&OBJNAME) VALUE(%SST(&QOBJ 1 10))
CHGVAR VAR(&OBJLIB) VALUE(%SST(&QOBJ 11 10))
CHKOBJ OBJ(&OBJLIB/&OBJNAME) OBJTYPE(&OBJTYPE)
DSPOBJD OBJ(&OBJLIB/&OBJNAME) OBJTYPE(&OBJTYPE) +
OUTPUT(*OUTFILE) OUTFILE(QTEMP/QADSPOBJ)
OVRDBF FILE(QADSPOBJ) TOFILE(QTEMP/QADSPOBJ)
RCVF
MONMSG CPF0864 EXEC(RETURN)
IF COND(&OPTION *EQ 'E') THEN(STRSEU +
SRCFILE(&ODSRCL/&ODSRCF) SRCMBR(&ODSRCM) +
OPTION(2))
ELSE CMD(IF COND(&OPTION *EQ 'D') THEN(STRSEU +
SRCFILE(&ODSRCL/&ODSRCF) SRCMBR(&ODSRCM) +
OPTION(5)))
ELSE CMD(SNDPGMMSG MSG('Source is located in +
member' *BCAT &ODSRCM *BCAT 'in file' +
*BCAT &ODSRCL *TCAT '/' *CAT &ODSRCF +
*TCAT '.') MSGTYPE(*COMP))
DLTOVR FILE(QADSPOBJ)
RETURN /* normal end of job */
ABEND: /* Abnormal end routine */
/* prevent loop in Abend routine */
IF COND(&ERROR) THEN(RETURN)
CHGVAR VAR(&ERROR) VALUE('1')
/* resend the error msg to the caller */
RCVMSG MSGTYPE(*EXCP) MSGDTA(&MSGDTA) MSGID(&MSGID) +
MSGF(&MSGF) SNDMSGFLIB(&MSGFLIB)
SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
MSGDTA(&MSGDTA) MSGTYPE(*ESCAPE)
ENDPGM
FS gives you three options: to see the name of the source member in a message, to view the source in SEU, or to edit in SEU. If you like this command, you may want to create some SEU options to run it from the WRKOBJPDM screen. For example, you might place the following command behind option ES to edit source code. FS OBJECT(&L/&N) TYPE(&T) OPTION(E) --Ted
|
Editors
Contact the Editors |
| Copyright © 1996-2008 Guild Companies, Inc. All Rights Reserved. |