*DECK DB$LINB 
      PROC DB$LINB(MESSAGE,(LENGTH)); 
      BEGIN 
 #
* *   DB$LINB -- BUILD A PAGE OF LINE IMAGES     PAGE  1
* *   BOB MCALLESTER                             DATE  12/15/80 
* 
* DC  PURPOSE 
* 
*     COMPOSE A PAGE TO BE PRINTED. 
*     ARRANGE SHORT LINE MESSAGES IN COLUMNS SO THAT MORE WILL BE 
*     PRINTED ON EACH PAGE. 
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
# 
#     PAGE DIMENSIONS                                                  #
      DEF DFLINSIZ #130#;    # PAGE WIDTH -- CHARACTERS PER LINE       #
      DEF DFLINLIM #056#;    # PAGE LENGTH (LESS ONE) -- MAX SUBSCRIPT #
  
      ITEM MESSAGE C(DFLINSIZ);  # MESSAGE TO BE BUFFERED INTO PAGE    #
      ITEM LENGTH I;         # LENGTH OF THE MESSAGE                   #
# 
* D   ASSUMPTIONS 
* 
*     NONE
* 
* DC  EXIT CONDITIONS 
* 
*     THE MESSAGE HAS BEEN ADDED TO THE PAGE. 
* 
*     IF LENGTH EQUALS ZERO, THE PAGE BUFFER HAS BEEN FLUSHED TO THE
*     OUTPUT FILE.
* 
* DC  CALLING ROUTINES
* 
*     DB$FLRP                FLOW POINT REPORT PROGRAM
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$LINE;     # WRITE A LINE TO THE OUTPUT FILE         #
      XREF PROC DB$PUNT;     # INTERNAL ERROR ROUTINE                  #
# 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     NONE
* 
* DC  DESCRIPTION 
* 
*     IF THE MESSAGE DOES NOT FIT ON THE PORTION OF A LINE THAT IS
*     AVAILABLE, THE PAGE IS FLUSHED TO THE OUTPUT FILE.
*     LENGTH EQUAL TO ZERO CONSTITUTES A SPECIAL REQUEST TO FLUSH THE 
*     PAGE.  IN THAT CASE NO MESSAGE IS PROCESSED.
* 
*     AFTER FLUSHING THE PAGE ANY LEGAL SIZED MESSAGE WILL FIT. 
* 
*     THE MESSAGE IS ADDED TO THE COLUMN CURRENTLY BEING PROCESSED. 
*     THE ITEM 'MAXLEN' IS USED TO KEEP TRACK OF THE LONGEST MESSAGE
*     THAT HAS BEEN PLACED IN THE COLUMN. 
*     THIS PREVENTS ADJACENT COLUMNS FROM OVERLAPPING.
* 
*     AFTER ADDING THE MESSAGE TO THE COLUMN, THE LINE INDEX IS 
*     INCREMENTED.
*     WHEN THE END OF THE COLUMN IS REACHED, THE LINE INDEX IS RESET
*     AND THE COLUMN TABULATOR IS SET FOR THE NEXT COLUMN.
* 
*     IF THERE IS INSUFFICIENT SPACE FOR ANOTHER COLUMN, THAT IS
*     DISCOVERED WHEN THERE IS AN ATTEMPT TO ADD ANOTHER MESSAGE. 
 #
# 
*     LOCAL VARIABLES 
# 
      ITEM LX I = 0;         # LINE INDEX                              #
      ITEM LXX I;            # LINE INDEX INDUCTION VARIABLE           #
      ITEM MAXLEN I = 0;     # LONGEST LINE ITEM IN THE COLUMN         #
      ITEM TAB I = 0;        # COLUMN TABULATOR                        #
  
      ARRAY PAGEBUF [0:DFLINLIM] S(13);  # PAGE BUFFER                 #
        BEGIN 
        ITEM LINEBUF C(00,00,DFLINSIZ)   # LINE BUFFER                 #
          = [" ",DFLINLIM(" ")];         # PRESET TO SPACES            #
        END 
  
#     B E G I N   O F   D B $ L I N B   E X E C U T A B L E   C O D E .#
  
      IF LENGTH GR DFLINSIZ 
      THEN
        BEGIN 
        DB$PUNT("DB$LINB");  # MESSAGE LENGTH IS TOO LONG              #
        END 
  
      IF TAB+LENGTH GR DFLINSIZ-2  # IF MESSAGE WONT FIT               #
        OR LENGTH EQ 0       # OR A BUFFER FLUSH IS SPECIFICALLY REQSTD#
      THEN                   # FLUSH THE PAGE TO THE OUTPUT FILE       #
        BEGIN 
        IF TAB NQ 0          # IF NOT THE FIRST COLUMN                 #
        THEN
          BEGIN 
          LX = DFLINLIM;     # OUTPUT A FULL PAGE                      #
          END 
        TAB = TAB + MAXLEN;  # SET LINE LENGTH                         #
  
        FOR LXX = 0 STEP 1 UNTIL LX 
        DO
          BEGIN 
          DB$LINE(LINEBUF[LXX],TAB);  # OUTPUT A LINE                  #
          LINEBUF[LXX] = " "; 
          END 
        LX = 0; 
        TAB = 0;
        MAXLEN = 0; 
        DB$LINE(0,0);        # FORCE A NEW PAGE                        #
        IF LENGTH EQ 0
        THEN
          BEGIN 
          RETURN; 
  
          END 
        END 
                             # MOVE THE MESSAGE INTO THE PAGE BUFFER   #
      C<TAB,LENGTH>LINEBUF[LX] = C<0,LENGTH>MESSAGE;
  
      IF LENGTH GR MAXLEN 
      THEN
        BEGIN 
        MAXLEN = LENGTH;     # SETS COLUMN WIDTH                       #
        END 
      LX = LX+1;             # ADVANCE LINE INDEX                      #
      IF LX GR DFLINLIM 
      THEN
        BEGIN 
                             # SET UP FOR THE NEXT COLUMN              #
        TAB = TAB + MAXLEN;  # SET COLUMN TABULATOR                    #
        LX = 0; 
        MAXLEN = 0; 
        END 
      END 
      TERM
