PAK

Compress numeric data

WSupported on Windows
USupported on Unix
VSupported on OpenVMS

 

Note

The PAK routine is deprecated; we recommend you use the p data type instead. See Packed and implied-packed for information on the p data type.

xcall PAK(record, size, field[, ...])

Arguments

record

The record that contains the fields to be compressed. (a)

size

A variable that contains the size of the compressed record after the PAK operation. (n)

field

One or more decimal fields in the specified record. These fields must exist in record and must be listed in ascending order as they appear in the record. (d)

Discussion

The PAK subroutine compresses fields of numeric data to save disk space. Each packed field produced by PAK has the following length:

(number of characters/2) + 1

Use the UNPAK subroutine to restore the fields’ original values.

Examples

If we have the following data division:

record rec1
    fld1        ,d5
    fld2        ,a4
    fld3        ,d18
    fld4        ,d9
    fld5        ,a33
    fld6        ,d3
record ,x
    fld1x       ,a3
    fld2x       ,a4
    fld3x       ,a10
    fld4x       ,a5
    fld5x       ,a33
    fld6x       ,a2
record
    size        ,d2

the following statement compresses rec1 down to the fields described in the overlay record:

xcall pak(rec1, size, fld1, fld3, fld4, fld6)

This shortened record can then be output to a file to save space. When you’re ready to read the record back, the following statement restores the original values to the fields.

xcall unpak(rec1, fld1, fld3, fld4, fld6)

Assuming the above layout is in the file layout.def, the following subroutine save the data from one file to a packed backup file.

subroutine bck_restore
    a_flag              ,d
    a_source            ,a
    a_bckup             ,a
.include "layout.def"
.define BCKUP           ,1
.define RESTORE         ,2
.define SRCCHN          ,10
.define BCKCHN          ,11
proc
    if (a_flag.eq.BCKUP) then
      begin
        open(BCKCHN, o, a_bckup)
        open(SRCCHN, i, a_source)
        repeat
          begin
            reads(SRCCHN, rec1) [eq = done]
            xcall pak(rec1, size, fld1, fld3, fld4, fld6)
            puts(BCKCHN, rec1)
          end
      end
    else
      begin
        open(BCKCHN, i, a_bckup)
        open(SRCCHN, o, a_source)
        repeat
          begin
            gets(BCKCHN, rec1) [eq = done]
            xcall unpak(rec1, fld1, fld3, fld4, fld6)
            writes(SRCCHN, rec1)
          end
      end
done,
    close SRCCHN
    close BCKCHN
    xreturn
endsubroutine