Sunday, June 8, 2008

It's been a while

So, it's been about four months since the last time I really did any work on the utility. Looking at the source code after all this time is almost like seeing it for the first time. I re-tested the functions that currently exist just to make sure I hadn't left anything broken or non-working from before, and realized that I had omitted a couple of things.

I'm in the process of adding in the omissions but I haven't found any problems. One other thing I need to add before the program gets too big is some sort of logging. I'm thinking that a record of each session, showing things like members moved, deleted, copied, etc. might come in handy if members in one dataset or the other were accidentally altered or destroyed.


Tuesday, February 5, 2008

Slow progress this past week

Things have been a little slow this past week. I'm (still) working on two commands, Copy and Synchronize.

The first version of the Synchronize just didn't work well at all, so I've rewritten it. I also wrote new code for reporting errors. Now a panel is displayed after an error that tells the paragraph name the error occurred in, the operation that got the error, the dataset names involved, and information from the ZERRSM and ZERRLM variables. All of the new code seems to be working well and I'm doing testing right now.

The Copy command was working fine but the program calls IKJEFTSR to execute TSO commands. In case of errors in TSO commands you usually get error messages displayed on the screen. But I trap screen output to a compound variable using OUTTRAP and i want to read those variables and display the messages in the new error message panel. After a lot of fumbling around I finally figured out I could just VCOPY the terminal output variables into the program and report them.

So now I'm testing the new code and by the end of the week I hope to move on to the next thing.

Thursday, January 31, 2008

Primary Commands Under Development

Most of the primary commands are written: Locate, Flip, Copy, and Synchronize. But after I got the Synchronize command written I decided I didn't like the way it works, so I'm re-writing it. After that, I'll work on the Swap command.

I've added about a thousand lines of code to the program in just the last week. That's not as dramatic as it sounds because once a section of code is written for the dataset displayed on one side of the screen I can just duplicate that code for the other dataset and change some of the field names.

So things are still progressing, but starting to slow down a bit.


Tuesday, January 22, 2008

A Milestone reached today

Today I reached a milestone of sorts. All of the work up to now has been on the basic operation of the main and member list panels: validation of datasets, error detection and recovery, display of proper PDS directory information for both "source" and load module datasets, and proper operation of the fields that select which members of the datasets are displayed. So far five programs have been written (3 COBOL and 2 Assembler) for a total of about 3500 lines of code. There's also a couple of hundred lines of REXX code for validation of panel fields and other things.

After some final desk checking, tweaking of panels, changes to programs, and testing of the code thus far, I'm finally ready to declare this phase finished and move on to the next.

The next phase is to start writing code to execute the various commands. There are primary commands which are entered on the ISPF command line, what I call global commands that operate on the entire dataset(s), and line commands which operate on individual member or member pairs.

The primary commands will be written first, then the global commands, and finally the line commands. I keep thinking of new commands I want to add, so these are a moving target for now.

Below are current screen images of the main and member list panels.


The main panel:




The Member List Panel:







Sunday, January 20, 2008

Load Module info now on member list panel

Today I modified the programs and member list panel so they would display the PDS directory information for load modules. The new assembler language subroutine that I finished a couple of days ago interprets this information and passes it back to the main program, and now the main program will show this information on the member list panel.

Wednesday, January 16, 2008

Another subroutine completed

Today I finished another Assembler language subroutine. This one interprets the PDS directory information for load modules.

So the next task is to modify the member list panel to display these. Then I have to finish the Help panels, and then I may be close to being able to start writing the code that executes the global and line commands. It seems like every time I get close to this point I remember something else that hasn't been done yet.


Monday, January 7, 2008

Forgot about the Help Panels

As I was finishing up last night it hit me that I hadn't started working on the ISPF Help Panels yet. So now I have all of the help panels finished for all of the parts that work. I'll add the remaining help panels as the code is written for those functions.

I also restructured the User Guide this afternoon to improve its appearance. So I'll spend the rest of this week tidying up everything that's been done up to now, and next week I hope to start coding for the various commands.

Sunday, January 6, 2008

Lots More Progress

Lots more progress made last night and today. I've added documentation and comments into each COBOL program and REXX exec for things like program purpose, contact information for the author, who calls the program, who does the program call, etc.

I added the 'LOCATE' primary command to the member list panel for locating specific members in the display.

I moved the in-line REXX code from the panels to the REXX library. There are four panels, so each REXX program was duplicated four times. Each time the code changed, I had to change it in four places. Now all of the REXX code is in the REXX library and only has to be changed once.

I'm very close to wrapping up this phase of development and moving on to adding the code for the Global and Line commands.

Saturday, January 5, 2008

ISPF Panels Almost Finalized

I think I'm finished tinkering with the appearance of the ISPF member display panels. The 80-column panel was tough, because there just isn't enough room to show all the information at one time that I'd like. But I fooled with it enough to create something that I think will work.

Earlier versions of the utility only showed the statistics information for source datasets but not for load libraries. I found some documentation that may explain how to decode this information for load modules. If so, I hope to be able to display this information for load libraries.

One idea I'm thinking about is whether to allow users to change the statistics information for source-type pds members. There is an ISPF service that will do this. All I have to do is display the statistics data in input fields and allow the user to change it. But I'm not sure yet if I want to do that. One idea would be to provide a pull-down menu at the top of the panel for Options. One of the options could be to display the statistics data in input or display-only fields. I've also thought of a couple of other options that might be useful.

Thursday, January 3, 2008

LE Callable Services vs. Assembler

The main program has a need to acquire storage in memory to store the member lists of the two datasets that are being compared. I used the LE Callable Services CEECRHP, CEEGTST, and CEEDSHP to acquire and release storage. These services are fairly easy to use but it just seemed like a lot of code to write to accomplish such a trivial task.

So I took all of that code out and instead I wrote an Assembler language program to invoke the GETMAIN and FREEMAIN macros directly to manage the needed storage. The new program source code is less than 100 lines long and the load module is around 500 bytes in size. I just use a static call to compile and link it in with the main program. The main program calls the new Assembler module to to all GETMAINs and FREEMAINs.

The source code for the main program is about a hundred lines smaller than it was when coded to call the LE services.