GMRCUTIL ;SLC/DCM - Utilities for formatting word procesing fields and setting into ^TMP("GMRCR" globals for use by List Manager routines ;4/30/98  10:47
 ;;3.0;CONSULT/REQUEST TRACKING;**1,4**;DEC 27, 1997
GSET(LN,GLOB,J1,FLG) ;Set the word processing formatted local array WP() fields into the ^TMP Global.
 ;  LN:  Line in the ^TMP global where the data is to be placed.  LN is
 ;       incremented and passed back to the calling routine so that it
 ;       can set data into the next global node as needed.
 ;  GLB: The ^TMP global where the data is to be placed.(i.e.,
 ;       ^TMP("GMRCR",$J,"CS").
 ;  J1:  The last entry in the WP array.  It is passed back to the
 ;       calling routine so that WP(J1) can be concatenated to the next
 ;       line, if necessary
 ;  FLG: If the first line of the the data in WP needs to be formatted
 ;       differently than succeeding lines, FLG signals this fact by
 ;       being passed as FLG=1; otherwise, FLG is passed as FLG=0.
 S (J,J1)=0 F  S J=$O(WP(J)) Q:J=""  S DTA=$S('FLG:$E(TAB,1,17)_WP(J),1:WP(J)) S @GLOB@(LN,0)=DTA,LN=LN+1,J1=J,FLG=0
 K J,DTA
 Q
WPFMT(LINE,GMRCSL) ;FORMAT GLOBALS TO PRINT OUT IN A WORD PROCESSING FORMAT
 ;  LINE:  The line of text that needs to be broken into 80 column
 ;      or less lines for printing on the screen.
 ;  GMRCSL:  This is the desired line length, to break LINE into; i.e.
 ;      60, 70, or 80 columns (or smaller/larger) for screen display.
  K WP S WP="" Q:LINE?1.80P  F LIN=1:1 D  S WP(LIN)=$E(BKLN,1,$L(BKLN)-1) Q:'$L(LINE)
 .S (BKLN,WRD)="" F I=1:1 S WRD=$P(LINE," ",1) Q:($L(BKLN)+$L(WRD)+1)>GMRCSL  S BKLN=BKLN_WRD_" ",LINE=$P(LINE," ",2,256),WRD="" Q:$P(LINE," ",1,30)=""
 .I $L(LINE),'$L(BKLN) S BKLN=$E(LINE,1,GMRCSL),LINE=$E(LINE,$L(BKLN),$L(LINE))
 .Q
 K I,LIN,BKLN,WRD Q
 ;
WPSET(GLOBAL,TMPGBL,LINE,LNO,TAB,FLG) ;Set the lines into a the ^TMP global in word-processing format.
 ;  GLOBAL:  Global where data is comming from.
 ;  TMPGBL:  Global where formatted data is being placed
 ;  LINE:    Line is passed because it may contain some data already.
 ;           If it does, it is concatenated to the data from GLOBAL.
 ;  LNO:     This is a counter to where the next line of data should
 ;           be set in TMPGLOBAL.  It is incremented and passed back
 ;           to the calling routine so it knows where the next piece
 ;           of data is to be placed in TMPGBL.
 ;  TAB:     A string of spaces concatenated to the data in TMPGBL
 ;           that acts like a tab character. TAB is passed to GSET.
 ;  FLG:     If the first line of data is not tabbed, then FLG is
 ;           passed as FLG=1 and no tab character is concatenated to
 ;           this line.  If FLG=0, then the data is tabbed.
 N LN
 S (LN,LN1,J1)=0 F  S LN=$O(@(GLOBAL)@(LN)) Q:LN=""!(LN?1A.E)  S LINE=LINE_@(GLOBAL)@(LN,0) D
 .I @(GLOBAL)@(LN,0)?1.240" " D WPFMT(LINE,$S('FLG:60,1:70)),GSET(.LNO,TMPGBL,.J1,.FLG) S @(TMPGBL)@(LNO,0)=@(GLOBAL)@(LN,0),LNO=LNO+1 S LINE="" Q
 .I $O(@(GLOBAL)@(LN)),$O(@(GLOBAL)@(LN))'?1A S LN1=$O(@(GLOBAL)@(LN)) I $S((@(GLOBAL)@(LN1,0))?1.240" ":1,(@(GLOBAL)@(LN1,0))="":1,1:0) D WPFMT(LINE,$S('FLG:60,1:70)),GSET(.LNO,TMPGBL,.J1,.FLG) S LN=LN1,LINE="" Q
 .I FLG,$L(LINE)<79,$O(@(GLOBAL)@(LN))]"",$O(@(GLOBAL)@(LN))'?1A.E S LN=$O(@(GLOBAL)@(LN)),LINE=LINE_" "_@(GLOBAL)@(LN,0) D WPFMT(LINE,79),GSET(.LNO,TMPGBL,.J1,.FLG) D
 ..I $O(@(GLOBAL)@(LN))?1A.E S LINE="" Q
 ..I $O(@(GLOBAL)@(LN))]"",$D(WP(J1)),$L(WP(J1))<60 S LINE=WP(J1)_" ",LNO=LNO-1 Q
 ..I $D(WP(J1)),$L(WP(J1))>60 S LINE=WP(J1),LNO=LNO-1 Q
 ..S LINE="" Q
 .Q:LINE=""
 .I $L(LINE)>70,FLG S LINE(0)=$E(LINE,1,$F(LINE," ",69)-1),LINE=$E(LINE,$F(LINE," ",69),$L(LINE)),@(TMPGBL)@(LNO,0)=LINE(0),FLG=$S($L(LINE(0)):0,1:1),LNO=LNO+1
 .D WPFMT(LINE,$S('FLG:60,1:70)),GSET(.LNO,TMPGBL,.J1,.FLG) I $O(@(GLOBAL)@(LN))]"",$D(WP(J1)),$L(WP(J1))<60 S LINE=WP(J1)_" ",LNO=LNO-1,FLG=0
 .E  S LINE=""
 .Q
 K J1,LN1,WP Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HGMRCUTIL   3949     printed  Sep 23, 2025@19:23:46                                                                                                                                                                                                    Page 2
GMRCUTIL  ;SLC/DCM - Utilities for formatting word procesing fields and setting into ^TMP("GMRCR" globals for use by List Manager routines ;4/30/98  10:47
 +1       ;;3.0;CONSULT/REQUEST TRACKING;**1,4**;DEC 27, 1997
GSET(LN,GLOB,J1,FLG) ;Set the word processing formatted local array WP() fields into the ^TMP Global.
 +1       ;  LN:  Line in the ^TMP global where the data is to be placed.  LN is
 +2       ;       incremented and passed back to the calling routine so that it
 +3       ;       can set data into the next global node as needed.
 +4       ;  GLB: The ^TMP global where the data is to be placed.(i.e.,
 +5       ;       ^TMP("GMRCR",$J,"CS").
 +6       ;  J1:  The last entry in the WP array.  It is passed back to the
 +7       ;       calling routine so that WP(J1) can be concatenated to the next
 +8       ;       line, if necessary
 +9       ;  FLG: If the first line of the the data in WP needs to be formatted
 +10      ;       differently than succeeding lines, FLG signals this fact by
 +11      ;       being passed as FLG=1; otherwise, FLG is passed as FLG=0.
 +12       SET (J,J1)=0
           FOR 
               SET J=$ORDER(WP(J))
               if J=""
                   QUIT 
               SET DTA=$SELECT('FLG:$EXTRACT(TAB,1,17)_WP(J),1:WP(J))
               SET @GLOB@(LN,0)=DTA
               SET LN=LN+1
               SET J1=J
               SET FLG=0
 +13       KILL J,DTA
 +14       QUIT 
WPFMT(LINE,GMRCSL) ;FORMAT GLOBALS TO PRINT OUT IN A WORD PROCESSING FORMAT
 +1       ;  LINE:  The line of text that needs to be broken into 80 column
 +2       ;      or less lines for printing on the screen.
 +3       ;  GMRCSL:  This is the desired line length, to break LINE into; i.e.
 +4       ;      60, 70, or 80 columns (or smaller/larger) for screen display.
 +5        KILL WP
           SET WP=""
           if LINE?1.80P
               QUIT 
           FOR LIN=1:1
               Begin DoDot:1
 +6                SET (BKLN,WRD)=""
                   FOR I=1:1
                       SET WRD=$PIECE(LINE," ",1)
                       if ($LENGTH(BKLN)+$LENGTH(WRD)+1)>GMRCSL
                           QUIT 
                       SET BKLN=BKLN_WRD_" "
                       SET LINE=$PIECE(LINE," ",2,256)
                       SET WRD=""
                       if $PIECE(LINE," ",1,30)=""
                           QUIT 
 +7                IF $LENGTH(LINE)
                       IF '$LENGTH(BKLN)
                           SET BKLN=$EXTRACT(LINE,1,GMRCSL)
                           SET LINE=$EXTRACT(LINE,$LENGTH(BKLN),$LENGTH(LINE))
 +8                QUIT 
               End DoDot:1
               SET WP(LIN)=$EXTRACT(BKLN,1,$LENGTH(BKLN)-1)
               if '$LENGTH(LINE)
                   QUIT 
 +9        KILL I,LIN,BKLN,WRD
           QUIT 
 +10      ;
WPSET(GLOBAL,TMPGBL,LINE,LNO,TAB,FLG) ;Set the lines into a the ^TMP global in word-processing format.
 +1       ;  GLOBAL:  Global where data is comming from.
 +2       ;  TMPGBL:  Global where formatted data is being placed
 +3       ;  LINE:    Line is passed because it may contain some data already.
 +4       ;           If it does, it is concatenated to the data from GLOBAL.
 +5       ;  LNO:     This is a counter to where the next line of data should
 +6       ;           be set in TMPGLOBAL.  It is incremented and passed back
 +7       ;           to the calling routine so it knows where the next piece
 +8       ;           of data is to be placed in TMPGBL.
 +9       ;  TAB:     A string of spaces concatenated to the data in TMPGBL
 +10      ;           that acts like a tab character. TAB is passed to GSET.
 +11      ;  FLG:     If the first line of data is not tabbed, then FLG is
 +12      ;           passed as FLG=1 and no tab character is concatenated to
 +13      ;           this line.  If FLG=0, then the data is tabbed.
 +14       NEW LN
 +15       SET (LN,LN1,J1)=0
           FOR 
               SET LN=$ORDER(@(GLOBAL)@(LN))
               if LN=""!(LN?1A.E)
                   QUIT 
               SET LINE=LINE_@(GLOBAL)@(LN,0)
               Begin DoDot:1
 +16               IF @(GLOBAL)@(LN,0)?1.240" "
                       DO WPFMT(LINE,$SELECT('FLG:60,1:70))
                       DO GSET(.LNO,TMPGBL,.J1,.FLG)
                       SET @(TMPGBL)@(LNO,0)=@(GLOBAL)@(LN,0)
                       SET LNO=LNO+1
                       SET LINE=""
                       QUIT 
 +17               IF $ORDER(@(GLOBAL)@(LN))
                       IF $ORDER(@(GLOBAL)@(LN))'?1A
                           SET LN1=$ORDER(@(GLOBAL)@(LN))
                           IF $SELECT((@(GLOBAL)@(LN1,0))?1.240" ":1,(@(GLOBAL)@(LN1,0))="":1,1:0)
                               DO WPFMT(LINE,$SELECT('FLG:60,1:70))
                               DO GSET(.LNO,TMPGBL,.J1,.FLG)
                               SET LN=LN1
                               SET LINE=""
                               QUIT 
 +18               IF FLG
                       IF $LENGTH(LINE)<79
                           IF $ORDER(@(GLOBAL)@(LN))]""
                               IF $ORDER(@(GLOBAL)@(LN))'?1A.E
                                   SET LN=$ORDER(@(GLOBAL)@(LN))
                                   SET LINE=LINE_" "_@(GLOBAL)@(LN,0)
                                   DO WPFMT(LINE,79)
                                   DO GSET(.LNO,TMPGBL,.J1,.FLG)
                                   Begin DoDot:2
 +19                                   IF $ORDER(@(GLOBAL)@(LN))?1A.E
                                           SET LINE=""
                                           QUIT 
 +20                                   IF $ORDER(@(GLOBAL)@(LN))]""
                                           IF $DATA(WP(J1))
                                               IF $LENGTH(WP(J1))<60
                                                   SET LINE=WP(J1)_" "
                                                   SET LNO=LNO-1
                                                   QUIT 
 +21                                   IF $DATA(WP(J1))
                                           IF $LENGTH(WP(J1))>60
                                               SET LINE=WP(J1)
                                               SET LNO=LNO-1
                                               QUIT 
 +22                                   SET LINE=""
                                       QUIT 
                                   End DoDot:2
 +23               if LINE=""
                       QUIT 
 +24               IF $LENGTH(LINE)>70
                       IF FLG
                           SET LINE(0)=$EXTRACT(LINE,1,$FIND(LINE," ",69)-1)
                           SET LINE=$EXTRACT(LINE,$FIND(LINE," ",69),$LENGTH(LINE))
                           SET @(TMPGBL)@(LNO,0)=LINE(0)
                           SET FLG=$SELECT($LENGTH(LINE(0)):0,1:1)
                           SET LNO=LNO+1
 +25               DO WPFMT(LINE,$SELECT('FLG:60,1:70))
                   DO GSET(.LNO,TMPGBL,.J1,.FLG)
                   IF $ORDER(@(GLOBAL)@(LN))]""
                       IF $DATA(WP(J1))
                           IF $LENGTH(WP(J1))<60
                               SET LINE=WP(J1)_" "
                               SET LNO=LNO-1
                               SET FLG=0
 +26              IF '$TEST
                       SET LINE=""
 +27               QUIT 
               End DoDot:1
 +28       KILL J1,LN1,WP
           QUIT