SUBROUTINE DISPLAY.WINDOW(ULC,ULR,LRC,LRR,ARRAY,DELIM.CHAR,STARTPOS,CONV,FPAT)
****
* DISPLAY.WINDOW - DISPLAY A WINDOW OF DATA
* Last updated by DIGNAN (MIS.SNA.PROG.JDD) on 02/26/87
*
****
*
* DESCRIPTION
*
* Display elements from the dynamic array ARRAY in a window.  The window
* is defined by the diagonal corners ULC,ULR (upper left) and LRC,LRR
* (lower right). Display as much data as will fit with the given FMT
* pattern.
*
* PARAMETERS
* ================
* I/O  Req    Parameter    Description
* ---  ---    ----------   ----------------------------------------------------------------------------------------------
*
* (I)  Req    ULC          Upper-left column.
* (I)  Req    ULR          Upper-left row.
* (I)  Req    LRC          Lower-right column.
* (I)  Req    LRR          Lower-right row.
* (I)  Req    ARRAY        Dynamic array to display from.
* (I)  Req    DELIM.CHAR   The delimiter which separates the elements in ARRAY
* (I)  Req    STARTPOS     Starting field, value, or sub-value position in ARRAY.
* (I)  Opt    CONV         Conversion code for OCONV().
* (I)  Req    FPAT         Format pattern for FMT().
*
****
*                           R E V I S I O N   L O G
* PR#     WHEN     WHO        WHY
* ======= ======== ========== ==========================================
* SP0026B 02/26/87 J DIGNAN   INITIAL CODING
*
****

**** BEGIN CODE

** SYMBOL DEFINITIONS

$INSERT SYSLIB>INSERTS>STDDEF.INS.IBAS
$INSERT SYSLIB>INSERTS>STD.SUBROUTINES.INS.IBAS

** MAIN ROUTINE

     GOSUB INITIALIZE
     GOSUB DISPLAY

     RETURN

** SUBROUTINES

DISPLAY:

     COL = ULC
     COLUMN = 1

     LOOP WHILE COLUMN <= NUMCOLS
        ROW = ULR
        LOOP WHILE (ROW <= LRR)
           VALUE = ''
           LOOP
              VALUE := REMOVE(ARRAY,REMOVE.DELIM)
           UNTIL (REMOVE.DELIM = 0) ! (REMOVE.DELIM = DELIM)
           REPEAT
           PRINT @(COL,ROW): FMT(OCONV(VALUE,CONV),FPAT):
           ROW += 1
        REPEAT
        COL += COLUMN.WIDTH + COLUMN.SPACING
        COLUMN += 1
     REPEAT

     RETURN

*

INITIALIZE:

     WINDOW.WIDTH  = LRC - ULC + 1
     WINDOW.HEIGHT = LRR - ULR + 1

     COLUMN.WIDTH  = MATCHFIELD(FPAT,"0N0X",1)
     IF COLUMN.WIDTH = NULL$ THEN
        COLUMN.WIDTH = MATCHFIELD(FPAT,"0X0N",2)
        IF COLUMN.WIDTH = NULL$ THEN COLUMN.WIDTH = COUNT(FPAT,'#')
     END

     COLUMN.SPACING = 1
     IF WINDOW.WIDTH = COLUMN.WIDTH THEN
        NUMCOLS = 1
     END ELSE
        NUMCOLS = INT((WINDOW.WIDTH+COLUMN.SPACING) / (COLUMN.WIDTH+COLUMN.SPACING))
     END

     DELIM = 256 - SEQ(DELIM.CHAR)      ;* TO AGREE WITH REMOVE()

     IF STARTPOS < 0 THEN
        STARTPOS = -STARTPOS + (WINDOW.HEIGHT * NUMCOLS)
        IF STARTPOS > (COUNT(ARRAY,DELIM.CHAR) + 1) THEN STARTPOS = 1
     END

     POS = 1
     ARRAY = ARRAY                      ;* RESET REMOVE POINTER
     REMOVE.DELIM = -1
     LOOP WHILE (REMOVE.DELIM # 0) & (POS < STARTPOS)
        REMOVE.DELIM = -1
        LOOP WHILE (REMOVE.DELIM # 0) & (REMOVE.DELIM # DELIM)
           VALUE = REMOVE(ARRAY,REMOVE.DELIM)
        REPEAT
        POS += 1
     REPEAT

     RETURN

**** END CODE

  END
