Review of ClibGen
by
Shawn M. Gordon
President
S.M.Gordon & Associates
Introduction
This time around we have a COBOL programmers utility, and as far as I am concerned, you can never have to many tools for making programming easier, especially for COBOL. ClibGen is a utility that build and maintains COBOL copy libraries and include files. ClibGen will also establish Procedure Division programming for various IMAGE database calls, to help enforce coding standards.
I ran ClibGen on my HP 3000 series 925 running MPE/iX 4.0.
Features
ClibGen is a command line interface program, some of the commands have immediate actions, and other commands set options for generating output. So what is it that ClibGen actually do? Well at it’s most basic, you can point it to a dataset, or an entire database, and have it generate all the working storage records layouts for you in either a COPYLIB or as an INCLUDE file. Optionally it can also generate the PROCEDURE DIVISION code that will add, update, retrieve, and delete your database, for the datasets that you generated. There is even an option to generate code to take advantage of SpeedDemon routines from Robelle.
The manual states that ClibGen can work with Image databases, COBOL copy libraries, COBOL INCLUDE files, SpeedWare catalogs, COGNOS data dictionaries, and Self Describing files. However my release only worked with IMAGE, and generated COBOL output. The version that supports all the other file formats should be available by the time you read this review.
So how would a typical session with ClibGen work, see Figure 1 for a sample of how you would start up. The ClibGen command is CG>
------------------------------------------------------
Figure 1
:clibgen.pub.vvl
ClibGen A.00.00 Copyright (c) 1994-1995 VVL Associates, Inc.
Liscensed to: Shawn Gordon <[>Demo 12/1/95]
I TRACE.PUB
Input file is set to TRACE.PUB()
FO
Database: TRACE.PUB
No. Dataset Type Words B/F Entries Capacity % Full
1. INNER-JOB-A A 13 85 5 809 0.61
2. RUN-STAT-A A 3 145 113 251 45.01
3. OUTER-JOB-M M 106 16 264 853 30.94
4. ALIAS-M M 38 18 1 18 5.55
5. INNER-JOB-D D 29 55 5 770 0.64
6. RUN-STAT-D D 34 48 3395 6048 56.13
7. ALIAS-D D 9 16 2 16 12.50
>
FO (@
Database: TRACE.PUB
INNER-JOB-A ;Automatic
Entry: Offset Bytes
INNER-JOB, U26 1 26 <>
Capacity: 809 Entries: 5 Total Bytes: 26
RUN-STAT-A ;Automatic
Entry: Offset Bytes
RUN-DATE, X6 1 6 <>
Capacity: 251 Entries: 113 Total Bytes: 6
OUTER-JOB-M ;Manual
Entry: Offset Bytes
OUTER-JOB, U26 1 26 <>
FLAGS, X6 27 6
JOB-DESC, 3X60 33 180
Capacity: 853 Entries: 264 Total Bytes: 212
ALIAS-M ;Manual
Entry: Offset Bytes
ALIAS-FLAG, X2 1 2 <>
ALIAS-DESC, X74 3 74
Capacity: 18 Entries: 1 Total Bytes: 76
INNER-JOB-D ;Detail
Entry: Offset Bytes
OUTER-JOB, U26 1 26 <>
INNER-JOB, U26 27 26 <>
FLAGS, X6 53 6
Capacity: 770 Entries: 5 Total Bytes: 58
RUN-STAT-D ;Detail
Entry: Offset Bytes
OUTER-JOB, U26 1 26 <>
STREAMER, X26 27 26
RUN-DATE, X6 53 6 <>
RUN-TIME, X8 59 8
WALL-TIME, J1 67 2
Capacity: 6048 Entries: 3395 Total Bytes: 68
ALIAS-D ;Detail
Entry: Offset Bytes
ALIAS-NAME, X16 1 16
ALIAS-FLAG, X2 17 2 <<<<;>
Capacity: 16 Entries: 2 Total Bytes: 18
----------------------------------------------------
So what we have done here is open the database for input with the I (or INPUT) command, check to see what sets where in it with the QUERY like command FO, then get a detail QUERY like listing by using the FO command with the @ parameter. We could specify a data set name here to get a specific set, but the @ indicates ALL data sets.
It’s important to note that ClibGen is pretty forgiving when it comes to accepting commands from you. As you saw, all the commands can be abbreviated, and if there is an option that is required at processing time that you didn’t supply by setting it on, then ClibGen will prompt for it.
Now we are going to go ahead and take all the default options, which means generate pretty much everthing. See figure two for that dialog;
----------------------------------------------------------------------------------- Figure 2 CG>LIB TRLIB.SOURCE Creating COBOL Copylib TRLIB.SOURCE Enter Keyfile Name - TRLIBK Output File is set to "TRLIB.SOURCE,CLIB". X Generating TRACE Database Declarations. Enter Password (Programmatic Access) - FUGAZI Generating TRACE database routines. Enter a COBOL Prefix for OUTER-JOB-M, (up to 5 Chars) - OJM Generating OUTER-JOB-M dataset Data decalarations. Generating OUTER-JOB-M dataset Read routines. Generating OUTER-JOB-M dataset Write routines. Enter a COBOL Prefix for ALIAS-M, (up to 5 Chars) - AM Generating ALIAS-M dataset Data decalarations. Generating ALIAS-M dataset Read routines. Generating ALIAS-M dataset Write routines. Enter a COBOL Prefix for INNER-JOB-D, (up to 5 Chars) - IJD Generating INNER-JOB-D dataset Data decalarations. Generating INNER-JOB-D dataset Read routines. Generating INNER-JOB-D dataset Write routines. Enter a COBOL Prefix for RUN-STAT-D, (up to 5 Chars) - RSD Generating RUN-STAT-D dataset Data decalarations. Generating RUN-STAT-D dataset Read routines. Generating RUN-STAT-D dataset Write routines. Enter a COBOL Prefix for ALIAS-D, (up to 5 Chars) - AD Generating ALIAS-D dataset Data decalarations. Generating ALIAS-D dataset Read routines. Generating ALIAS-D dataset Write routines. 001220 Lines Created. --------------------------------------------------------------------------
Now what we did here was specify a copy library to generate with the LIB command, and then entered an X to eXecute the request. ClibGen responds by asking us for the database password, and prefix information for each data set that you are processing.
ClibGen has an enhanced interface to copy libraries over what COBEDIT has. You can use wild cards to find all the copy members that start with a particular string, and you can also look at INCLUDE files. Here again, if you don’t know a parameter, then ClibGen will prompt for it, or list everything. Look at figure 3 to see the modules that were generated by our previous session, as well as the code generated for a particular set.
---------------------------------------------------------------------------
Figure 3
CG>LIST
Enter Copylib Member (KEY) -
CopyLib TRLIB.SOURCE Text Modules:
ADDD
ADGT
ADUP
AMDD
AMGT
AMUP
IJDDD
IJDGT
IJDUP
OJMDD
OJMGT
OJMUP
RSDDD
RSDGT
RSDUP
TRACEDD
TRACEOP
CG>LIST TRACEDD
000001 TRACEDD
001000******************************************************************TRACEDD
001100* Database Declarations for TRACE [CG] TRACEDD
001200******************************************************************TRACEDD
001300 TRACEDD
001400 01 TRACE-BASE. TRACEDD
001500 05 FILLER PIC X(02) VALUE SPACES. TRACEDD
001600 05 TRACE-BASE-NAME PIC X(26) VALUE "TRACE;". TRACEDD
001700 TRACEDD
001800 01 TRACE-PASS PIC X(08) VALUE "FUGAZI;". TRACEDD
001900 TRACEDD
002000 01 TRACE-SECOND-PATH PIC X(28) VALUE SPACES. TRACEDD
002100 TRACEDD
CG>LIST TRACEOP
000001 TRACEOP
001000******************************************************************TRACEOP
001100 OPEN-TRACE. TRACEOP
001200******************************************************************TRACEOP
001300 TRACEOP
001400 CALL "DBOPEN" USING TRACE-BASE, TRACE-PASS, TRACEOP
001500 DB-MODE-1, DB-STATUS. TRACEOP
001600 TRACEOP
001700 IF NOT DB-CALL-OK TRACEOP
001800 MOVE SPACES TO PUNT-MESSAGE TRACEOP
001900 STRING "Unable to OPEN ", TRACE-BASE-NAME TRACEOP
002000 DELIMITED BY SIZE INTO PUNT-MESSAGE TRACEOP
002100 PERFORM DB-PUNT TRACEOP
002200 END-IF. TRACEOP
002300 TRACEOP
002400******************************************************************TRACEOP
002500 CLOSE-TRACE. TRACEOP
002600******************************************************************TRACEOP
002700 TRACEOP
002800 CALL "DBCLOSE" USING TRACE-BASE, DB-SET-NAME, TRACEOP
002900 DB-MODE-1, DB-STATUS. TRACEOP
003000 TRACEOP
003100 IF NOT DB-CALL-OK TRACEOP
003200 MOVE SPACES TO PUNT-MESSAGE TRACEOP
003300 STRING "Unable to CLOSE ", TRACE-BASE-NAME TRACEOP
003400 DELIMITED BY SIZE INTO PUNT-MESSAGE TRACEOP
003500 PERFORM DB-PUNT TRACEOP
003600 END-IF. TRACEOP
003700 TRACEOP
003800******************************************************************TRACEOP
003900 UNLOCK-TRACE. TRACEOP
004000******************************************************************TRACEOP
004100 TRACEOP
004200 CALL "DBUNLOCK" USING TRACE-BASE, DB-SET-NAME, TRACEOP
004300 DB-MODE-1, DB-STATUS. TRACEOP
004400 TRACEOP
004500 IF NOT DB-CALL-OK TRACEOP
004600 MOVE SPACES TO PUNT-MESSAGE TRACEOP
004700 STRING "Unable to UNLOCK ", TRACE-BASE-NAME TRACEOP
004800 DELIMITED BY SIZE INTO PUNT-MESSAGE TRACEOP
004900 PERFORM DB-PUNT TRACEOP
005000 END-IF. TRACEOP
005100 TRACEOP
CG>LIST RSD@
000001 RSDDD
001000******************************************************************RSDDD
001100* Dataset Declarations for RUN-STAT-D of TRACE [CG] RSDDD
001200******************************************************************RSDDD
001300 RSDDD
001400 01 RSD-SET PIC X(16) VALUE "RUN-STAT-D;". RSDDD
001500 RSDDD
001600 01 RSD-ITEM-LIST. RSDDD
001700 05 FILLER PIC X(10) VALUE "OUTER-JOB,". RSDDD
001800 05 FILLER PIC X(09) VALUE "STREAMER,". RSDDD
001900 05 FILLER PIC X(09) VALUE "RUN-DATE,". RSDDD
002000 05 FILLER PIC X(09) VALUE "RUN-TIME,". RSDDD
002100 05 FILLER PIC X(10) VALUE "WALL-TIME;". RSDDD
002200 RSDDD
002300 01 RSD-ITEM-LIST-R REDEFINES RSD-ITEM-LIST. RSDDD
002400 05 RSD-SAME-LIST PIC X(02). RSDDD
002500 05 FILLER PIC X(45). RSDDD
002600 RSDDD
002700 01 RSD-GET-INDICATOR PIC X(02) VALUE "N". RSDDD
002800 88 RSD-RECORD-FOUND VALUE "Y". RSDDD
002900 88 RSD-NO-MORE-RECORDS VALUE "N". RSDDD
003000 RSDDD
003100 01 RSD-RECORD. RSDDD
003200 05 RSD-OUTER-JOB PIC A(26). RSDDD
003300 05 RSD-STREAMER PIC X(26). RSDDD
003400 05 RSD-RUN-DATE PIC X(06). RSDDD
003500 05 RSD-RUN-TIME PIC X(08). RSDDD
003600 05 RSD-WALL-TIME PIC S9(04) COMP. RSDDD
003700 RSDDD
003800 01 RSD-INIT-DATA PIC X(68). RSDDD
003900 RSDDD
000001 RSDGT
001000******************************************************************RSDGT
001100 GET-RSD-BY-OUTER-JOB. RSDGT
001200******************************************************************RSDGT
001300 RSDGT
001400 PERFORM FIND-RSD-BY-OUTER-JOB. RSDGT
001500 RSDGT
001600 IF RSD-RECORD-FOUND RSDGT
001700 PERFORM GET-NEXT-RSD RSDGT
001800 END-IF. RSDGT
001900 RSDGT
002000******************************************************************RSDGT
002100 FIND-RSD-BY-OUTER-JOB. RSDGT
002200******************************************************************RSDGT
002300 RSDGT
002400 MOVE "OUTER-JOB" TO DB-SEARCH-ITEM. RSDGT
002500 MOVE RSD-OUTER-JOB TO DB-VALUE. RSDGT
002600 PERFORM FIND-RSD. RSDGT
002700 RSDGT
002800******************************************************************RSDGT
002900 GET-RSD-BY-RUN-DATE. RSDGT
003000******************************************************************RSDGT
003100 RSDGT
003200 PERFORM FIND-RSD-BY-RUN-DATE. RSDGT
003300 RSDGT
003400 IF RSD-RECORD-FOUND RSDGT
003500 PERFORM GET-NEXT-RSD RSDGT
003600 END-IF. RSDGT
003700 RSDGT
003800******************************************************************RSDGT
003900 FIND-RSD-BY-RUN-DATE. RSDGT
004000******************************************************************RSDGT
004100 RSDGT
004200 MOVE "RUN-DATE" TO DB-SEARCH-ITEM. RSDGT
004300 MOVE RSD-RUN-DATE TO DB-VALUE. RSDGT
004400 PERFORM FIND-RSD. RSDGT
004500 RSDGT
004600******************************************************************RSDGT
004700 GET-RSD-SERIALLY. RSDGT
004800******************************************************************RSDGT
004900 RSDGT
005000 MOVE 2 TO DB-MODE. RSDGT
005100 PERFORM GET-RSD. RSDGT
005200 RSDGT
005300******************************************************************RSDGT
005400 GET-RSD-BACKWARDS. RSDGT
005500******************************************************************RSDGT
005600 RSDGT
005700 MOVE 3 TO DB-MODE. RSDGT
005800 PERFORM GET-RSD. RSDGT
005900 RSDGT
006000******************************************************************RSDGT
006100 REWIND-RSD. RSDGT
006200******************************************************************RSDGT
006300 RSDGT
006400 CALL "DBCLOSE" USING TRACE-BASE, RSD-SET, DB-MODE-3, RSDGT
006500 DB-STATUS. RSDGT
006600 RSDGT
006700 IF NOT DB-CALL-OK RSDGT
006800 MOVE SPACES TO PUNT-MESSAGE RSDGT
006900 STRING "REWIND FAILED FOR RSD" RSDGT
007000 DELIMITED BY SIZE INTO PUNT-MESSAGE RSDGT
007100 PERFORM DB-PUNT RSDGT
007200 END-IF. RSDGT
007300 RSDGT
007400******************************************************************RSDGT
007500 FIND-RSD. RSDGT
007600******************************************************************RSDGT
007700 RSDGT
007800 CALL "DBFIND" USING TRACE-BASE, RSD-SET, DB-MODE-1, RSDGT
007900 DB-STATUS, DB-SEARCH-ITEM, DB-VALUE. RSDGT
008000 RSDGT
008100 IF NOT (DB-CALL-OK OR DB-RECORD-NOT-FOUND) RSDGT
008200 STRING "FIND FAILED FOR RSD ", DB-SEARCH-ITEM RSDGT
008300 " KEY=" DB-VALUE DELIMITED BY SIZE RSDGT
008400 INTO PUNT-MESSAGE RSDGT
008500 PERFORM DB-PUNT RSDGT
008600 END-IF. RSDGT
008700 IF DB-NO-CHAIN-FOUND OR DB-RECORD-NOT-FOUND RSDGT
008800 MOVE "N" TO RSD-GET-INDICATOR RSDGT
008900 ELSE RSDGT
009000 MOVE "Y" TO RSD-GET-INDICATOR RSDGT
009100 END-IF. RSDGT
009200 RSDGT
009300******************************************************************RSDGT
009400 GET-NEXT-RSD. RSDGT
009500******************************************************************RSDGT
009600 RSDGT
009700 MOVE 5 TO DB-MODE. RSDGT
009800 PERFORM GET-RSD. RSDGT
009900 RSDGT
010000******************************************************************RSDGT
010100 GET-PREV-RSD. RSDGT
010200******************************************************************RSDGT
010300 RSDGT
010400 MOVE 6 TO DB-MODE. RSDGT
010500 PERFORM GET-RSD. RSDGT
010600 RSDGT
010700******************************************************************RSDGT
010800 GET-RSD. RSDGT
010900******************************************************************RSDGT
011000 RSDGT
011100 CALL "DBGET" USING TRACE-BASE, RSD-SET, DB-MODE, RSDGT
011200 DB-STATUS, RSD-ITEM-LIST, RSD-RECORD, DB-PARM. RSDGT
011300 RSDGT
011400 IF NOT (DB-CALL-OK OR DB-END-OF-CHAIN OR DB-END-OF-FILE RSDGT
011500 OR DB-BEGINNING-OF-CHAIN OR DB-BEGINNING-OF-FILE) RSDGT
011600 MOVE SPACES TO PUNT-MESSAGE RSDGT
011700 STRING "GET FAILED FOR RSD " RSDGT
011800 " KEY=" DB-VALUE DELIMITED BY SIZE RSDGT
011900 INTO PUNT-MESSAGE RSDGT
012000 PERFORM DB-PUNT RSDGT
012100 END-IF. RSDGT
012200 RSDGT
012300 IF DB-CALL-OK RSDGT
012400 MOVE "Y" TO RSD-GET-INDICATOR RSDGT
012500 MOVE "*;" TO RSD-SAME-LIST RSDGT
012600 ELSE RSDGT
012700 MOVE "N" TO RSD-GET-INDICATOR RSDGT
012800 END-IF. RSDGT
012900 RSDGT
013000******************************************************************RSDGT
013100 SPDEDBINIT-RSD. RSDGT
013200******************************************************************RSDGT
013300 RSDGT
013400 MOVE 3 TO DB-MODE. RSDGT
013500 CALL "SPDEDBINIT" USING TRACE-BASE, RSD-SET, DB-MODE, RSDGT
013600 DB-STATUS, SPEED-DB-CONTROL, RSD-ITEM-LIST. RSDGT
013700 RSDGT
013800 IF NOT DB-CALL-OK RSDGT
013900 MOVE SPACES TO PUNT-MESSAGE RSDGT
014000 STRING "ERROR INIT FOR RSD-FAST " RSDGT
014100 DELIMITED BY SIZE INTO PUNT-MESSAGE RSDGT
014200 CALL "SPDEEXPLAIN" USING DB-STATUS RSDGT
014300 PERFORM PROG-PUNT RSDGT
014400 END-IF. RSDGT
014500 RSDGT
014600 IF DB-CALL-OK RSDGT
014700 MOVE "Y" TO RSD-GET-INDICATOR RSDGT
014800 MOVE "*;" TO RSD-SAME-LIST RSDGT
014900 ELSE RSDGT
015000 MOVE "N" TO RSD-GET-INDICATOR RSDGT
015100 END-IF. RSDGT
015200 RSDGT
015300******************************************************************RSDGT
015400 SPDEDBSHUT-RSD. RSDGT
015500******************************************************************RSDGT
015600 RSDGT
015700 MOVE 1 TO DB-MODE. RSDGT
015800 CALL "SPDEDBSHUT" USING TRACE-BASE, RSD-SET, DB-MODE, RSDGT
015900 DB-STATUS, SPEED-DB-CONTROL, RSD-ITEM-LIST. RSDGT
016000 RSDGT
016100 IF NOT DB-CALL-OK RSDGT
016200 MOVE SPACES TO PUNT-MESSAGE RSDGT
016300 STRING "ERROR SHUT FOR RSD-FAST " RSDGT
016400 DELIMITED BY SIZE INTO PUNT-MESSAGE RSDGT
016500 CALL "SPDEEXPLAIN" USING DB-STATUS RSDGT
016600 PERFORM PROG-PUNT RSDGT
016700 END-IF. RSDGT
016800 RSDGT
016900******************************************************************RSDGT
017000 GET-FAST-RSD. RSDGT
017100******************************************************************RSDGT
017200 RSDGT
017300 CALL "SPDEDBSCAN" USING TRACE-BASE, DB-STATUS, RSDGT
017400 RSD-RECORD, DB-PARM. RSDGT
017500 RSDGT
017600 IF NOT (DB-CALL-OK OR DB-END-OF-FILE) RSDGT
017700 MOVE SPACES TO PUNT-MESSAGE RSDGT
017800 STRING "GET FAST FAILED FOR RSD " RSDGT
017900 " KEY=" DB-VALUE DELIMITED BY SIZE RSDGT
018000 INTO PUNT-MESSAGE RSDGT
018100 CALL "SPDEEXPLAIN" USING DB-STATUS RSDGT
018200 PERFORM PROG-PUNT RSDGT
018300 END-IF. RSDGT
018400 RSDGT
018500 IF DB-CALL-OK RSDGT
018600 MOVE "Y" TO RSD-GET-INDICATOR RSDGT
018700 ELSE RSDGT
018800 MOVE "N" TO RSD-GET-INDICATOR RSDGT
018900 END-IF. RSDGT
019000 RSDGT
000001 RSDUP
001000******************************************************************RSDUP
001100 PUT-TO-RSD. RSDUP
001200******************************************************************RSDUP
001300 RSDUP
001400 CALL "DBPUT" USING TRACE-BASE, RSD-SET, DB-MODE-1, RSDUP
001500 DB-STATUS, RSD-ITEM-LIST, RSD-RECORD. RSDUP
001600 RSDUP
001700 IF NOT DB-CALL-OK RSDUP
001800 MOVE SPACES TO PUNT-MESSAGE RSDUP
001900 STRING "PUT FAILED FOR RSD " RSDUP
002000 "OUTER-JOB = " RSD-OUTER-JOB RSDUP
002100 DELIMITED BY SIZE INTO PUNT-MESSAGE RSDUP
002200 PERFORM DB-PUNT RSDUP
002300 END-IF. RSDUP
002400 RSDUP
002500******************************************************************RSDUP
002600 UPDATE-RSD. RSDUP
002700******************************************************************RSDUP
002800 RSDUP
002900 CALL "DBUPDATE" USING TRACE-BASE, RSD-SET, DB-MODE-1, RSDUP
003000 DB-STATUS, RSD-ITEM-LIST, RSD-RECORD. RSDUP
003100 RSDUP
003200 IF NOT DB-CALL-OK RSDUP
003300 MOVE SPACES TO PUNT-MESSAGE RSDUP
003400 STRING "UPDATE FAILED FOR RSD " RSDUP
003500 "OUTER-JOB = " RSD-OUTER-JOB RSDUP
003600 DELIMITED BY SIZE INTO PUNT-MESSAGE RSDUP
003700 PERFORM DB-PUNT RSDUP
003800 END-IF. RSDUP
003900 RSDUP
004000******************************************************************RSDUP
004100 DELETE-RSD. RSDUP
004200******************************************************************RSDUP
004300 RSDUP
004400 CALL "DBDELETE" USING TRACE-BASE, RSD-SET, DB-MODE-1, RSDUP
004500 DB-STATUS. RSDUP
004600 RSDUP
004700 IF NOT DB-CALL-OK RSDUP
004800 MOVE SPACES TO PUNT-MESSAGE RSDUP
004900 STRING "DELETE FAILED FOR RSD " RSDUP
005000 "OUTER-JOB = " RSD-OUTER-JOB RSDUP
005100 DELIMITED BY SIZE INTO PUNT-MESSAGE RSDUP
005200 PERFORM DB-PUNT RSDUP
005300 END-IF. RSDUP
005400 RSDUP
005500******************************************************************RSDUP
005600 LOCK-RSD. RSDUP
005700******************************************************************RSDUP
005800 RSDUP
005900 CALL "DBLOCK" USING TRACE-BASE, RSD-SET, DB-MODE-3, RSDUP
006000 DB-STATUS. RSDUP
006100 RSDUP
006200 IF NOT DB-CALL-OK RSDUP
006300 MOVE SPACES TO PUNT-MESSAGE RSDUP
006400 STRING "LOCK FAILED FOR RSD " RSDUP
006500 "OUTER-JOB = " RSD-OUTER-JOB RSDUP
006600 DELIMITED BY SIZE INTO PUNT-MESSAGE RSDUP
006700 PERFORM DB-PUNT RSDUP
006800 END-IF. RSDUP
006900 RSDUP
-----------------------------------------------------------------------------------
You can quickly review what variables you have set on a global basis with the SHOW command.
CG>SHOW
Settings:
Infile = TRACE.PUB(@)
Infileformat = IMAGE
Outfile = TRLIB.SOURCE
Outfileformat = CLIB
Outputmode = NEW
Data = ON
Read = ON
Write = ON
Prefix = AD
Key = = prefix+gentype
SList = OFF
SpeedDemon = ON
You can check individual options by typing the command with no parameters. So typing INPUT would show you what input file was opened, but typing INPUT FILENAME would set the input to the FILENAME specified.
That’s pretty much it, ClibGen has a few other features, but this is the basics of what it does.
Usability (also installation)
Well ClibGen is pretty darn easy to use, and is quick. The installation is even easier than most, just restore the tape with a CREATE option and you are set. All and all a pretty simple process.
Reliability
ClibGen generates good code, doesn’t abort, and is pretty forgiving with your command syntax. It is a very reliable tool as far as I am concerned.
Performance
ClibGen is performing a few interesting tricks. It is reading your data base root file, generating COBOL record layouts, and generating code for various database I/O routines. This happens within about a second, so you would have to say that ClibGen performs quit nicely.
Supportability (including Doc)
The product is pretty darn straight forward to use, and the documentation is a good reference guide, but the tutorial is tucked away in Appendix A, which makes it a bit difficult to find. The support is good, although the lack of an 800 number is a bit of a nuisance, but the product doesn’t really require much in the way of support, there just aren’t that many options, and it’s pretty easy to use.
Summary
This is a cool little program, a nice enhancement would be to print nicely formatted output for the copylib’s, with page numbers and an index. When they add the support for the other file formats, it will greatly expand the available market place. I see this program being very useful for consultants where you are constantly seeing new data bases’, and not necessarily very good copy libraries. Shop’s that aren’t doing any new development, probably won’t get much use out of it, because it is geared as a starting up utility.
One other enhancement I would like to see, would be the ability to set up code templates for the PROCEDURE DIVISION code. This way you could make the output look like how you want to work, and not how someone else decided it should look. We all have our own personal preferences when it comes to coding.
I like ClibGen a lot, but I think it is over priced for what you are getting, but that’s me, some people might think it’s a bargain It’s a new product, so the company will probably start to adjust as they get more feedback from the user community. If you are coding, and building copylib’s, you should check out ClibGen.
At-a-Glance box
ClibGen version A.00.00
VVL Associates Inc.
One Lauren Ln.
New Egypt, NJ 08533
Phone (609) 758-8858
FAX (609) 758-7114
email vince@vvl.com
Call, write, fax, or email to get a copy. The demo requires an HPSUSAN number. Price ranges from $1200-$4000, with support being $300. Includes one 67 page manual.