Inside COBOL #45
by
Shawn Gordon
President
The Kompany

Well I didn’t have time, or opportunity to compile any interesting COBOL type items from HP World, hopefully I will have something by next issue. So this month I bring to you a little information on programmatically using operating system variables. You probably/hopefully know how to use the OS variables, i.e., SHOWVAR myvar, or SETVAR,myvar, or DELETEVAR myvar. However, what if you want to access these babies from your program?

OS Variables are a logical extension to the old JCW’s, but JCW’s could only contain integer data. Variables can contain integer, string, and boolean data, which makes for a pretty versatile vehicle for getting input into your program, or putting data out.

First there are essentially three intrinsics you need to be concerned with, they are HPCIDELETEVAR, HPCIGETVAR, HPCIPUTVAR. This gives you the same functionality as you do from the command interpreter. To retrieve variables we specify a type of 1 for integer, 2 for string and 3 for boolean. Take a look at figure 1 and you will see a small example of a macro that will try to return both an integer and string value for every variable it returns. Later you will see the use of the GETVAR macro, and how we use it to get and store various string and integer data.

Booleans are another issue however, and the HPTYPEAHEAD variable is a good one to use as an example. In figure 2 we want to see if the HPTYPEAHEAD variable is on, since it is a boolean it will return a value of 1 if it is true. If it is true, then I want to set it to false, so I use HPCIPUTVAR with HPTYPEAHEAD set to 0, and that’s it.

Another way to do the SET and DELETE is to just use the COMMAND or HPCICOMMAND intrinsic and pass “SETVAR HPTYPEAHEAD,FALSE” or “DELETEVAR MYVAR”. Sometimes this is much easier than going through and setting up the whole environment for calling the intrinsics. I typically only use the HPCIGETVAR, the rest I use the HPCICOMMAND intrinsic now, because I always have that macro set up in my code.

Ok, so after 4 years of saying I am out of ideas for this column, and only missing 1 issue, I really really am running out of tips and information. So anyone with any clever ideas, like how to use NETIPC from COBOL, or something like that, pony up and share with the rest of us.

Figure 1

  01 VAR-NAME           PIC X(40)   VALUE SPACES.
  01 VAR-INT            PIC S9(9)   COMP VALUE 0.
  01 VAR-STRING         PIC X(255)  VALUE SPACES.
 *
  01 VAR-STATUS.
     03 VS-1            PIC S9(4)   COMP VALUE 0.
     03 VS-2            PIC S9(4)   COMP VALUE 0.
 *
 $DEFINE %GETVAR=
      MOVE SPACES             TO VAR-STRING
      MOVE ZEROES             TO VAR-INT
      MOVE !1 TO VAR-NAME
      CALL INTRINSIC "HPCIGETVAR" USING VAR-NAME, VAR-STATUS,
                                        1, VAR-INT,
                                        2, VAR-STRING,
                                        0.
      IF VS-1 <> 0
         DISPLAY 'Error ' VS-1 ' in HPCIGETVAR'
         DISPLAY 'Failed on variable ' VAR-NAME
         CALL INTRINSIC 'QUIT' USING \21\
      END-IF#

  A2000-GET-VARS.
      %GETVAR("REC"#).
      COMPUTE TAPE-LEN = VAR-INT * -1.
      %GETVAR("BLK"#).
      MOVE VAR-INT                 TO TAPE-BLK.
      COMPUTE TAPE-LEN = TAPE-LEN * TAPE-BLK.
      %GETVAR("A_OR_E"#).
      MOVE VAR-STRING(1:1)         TO A-OR-E.
      %GETVAR("DISKFILE"#).
      MOVE VAR-STRING(1:36)        TO DISK-FILE.
  A2000-EXIT.  EXIT.
 *

Figure 2

  01 SPECTRUM-VARS.
     03 VAR-NAME          PIC X(11)  VALUE "HPTYPEAHEAD".
     03 VAR-STATUS        PIC S9(9)  COMP VALUE 0.
     03 VAR-ITEM-NUM      PIC S9(9)  COMP VALUE 3.
     03 VAR-ITEM          PIC S9(9)  COMP VALUE 0.

      CALL INTRINSIC "HPCIGETVAR" USING VAR-NAME, VAR-STATUS,
                                  VAR-ITEM-NUM, VAR-ITEM.
      IF VAR-ITEM = 1 THEN
         MOVE 0                 TO VAR-ITEM
         CALL INTRINSIC "HPCIPUTVAR" USING VAR-NAME, VAR-STATUS,
                                     VAR-ITEM-NUM, VAR-ITEM.