DEBUG.MSG

From Pickwiki
Jump to navigationJump to search

HomePage>>SourceCode>>BasicSource>>SvnWrapper>>DEBUG.MSG

Builds a list of Debug messages for later display/email/etc.

                         subroutine DEBUG.MSG( MSG, Params )
* @SUB Add a message to the current Debug list
* =======================================================================================
* 02.Mar.2010 james: 'A' is finally '[[AppendToPreviousLine]]' as it was supposed to be.
* 22.Feb.2010 james: Add DEBUG.MSG DEBUG.FLAG in case caller breaks before finishing.
* 14.Jul.2009 james: s'W'ap lines
* 07.Jul.2009 james: First draft
* =======================================================================================
* $Id$
* =======================================================================================
*
*  Move code from SELECT.FORMS into this subroutine so it can also be used from AUDIT.SUB.
*
* Example usage:
*
* - First clear the Messages and turn on message tracking (like 'S' option) :
*
*    call DEBUG.MSG( '', 'C' )
*
* - Now add messages as necessary; start with '|' to force a new line:
*
*    call DEBUG.MSG( "| Plan Selection Type is '":PLAN$SELECT.TYPE:"'", '' )
*    call DEBUG.MSG( '| Executing saved DELETE commands ...', '' )

*   call DEBUG.MSG( 'Error Message', 'A' )  ;*  Append the message to the last line
*   call DEBUG.MSG( '', 'P' ) ;*  'P'rint debug messages
*   call DEBUG.MSG( ' Document Selection for ':WS.NUM:' ', 'D' )

* =======================================================================================

  $include RMS.BP RMS.COMMON
  $include RMS.BP DEBUG.COMMON

  *  Use this in case the program you're working on never gets to the 'D' call; i.e.
  *  it's blowing before you see anything in here !:
  locate 'DEBUG.MSG' in DEBUG.FLAG<1> setting dum then [[DebugIt]] = @TRUE else [[DebugIt]] = @FALSE

  Opt = Params<1>
  begin case
    case Opt = 'A' ; gosub [[AppendToPreviousLine]]
    case Opt = 'S' ; DEBUG.ON = @TRUE    ;*  'S'tart
    case Opt = 'E' ; DEBUG.ON = @FALSE   ;*  'E'nd
    case Opt = 'C' ; DEBUG.DISPLAY = MSG ; DEBUG.ON = @TRUE  ;*  'C'lear and start
    case Opt = 'D' ; gosub [[DisplayDebugMessages]] ; DEBUG.ON = @FALSE
    case Opt = 'P' ; gosub [[PrintDebugMessages]]   ; DEBUG.ON = @FALSE
    case Opt = 'R' ; MSG = DEBUG.DISPLAY        ;*  'R'eturn the current display
    case Opt = 'W' ; if DEBUG.ON and MSG # '' then gosub [[SwapMessages]]
    case 1         ; if DEBUG.ON and MSG # '' then gosub [[AddMsg]]
  end case
  
return

[[AppendToPreviousLine]]:
  if DEBUG.DISPLAY'R#1' = @FM then DEBUG.DISPLAY = DEBUG.DISPLAY[1, len(DEBUG.DISPLAY) - 1]
  gosub [[AddMsg]]
return

*  This is a little trick: if you're in the middle of adding a line; but find some
*  condition that needs to be put ABOVE this line; use 'W' to 'Swap out' the current
*  line with the message (i.e. insert MSG BEFORE the last line...).

[[SwapMessages]]:
  [[NumLines]] = dcount( DEBUG.DISPLAY, @FM )
  [[LastLine]] = DEBUG.DISPLAY< [[NumLines]] >
  DEBUG.DISPLAY< [[NumLines]] > = MSG
  if MSG[len(MSG),1] # ':' then  ;*  ':' at the end means 'no new line'
    DEBUG.DISPLAY := @FM
  end

  MSG = [[LastLine]] ; gosub [[AddMsg]]
return

[[AddMsg]]:
  if [[DebugIt]] then crt 'Adding ':MSG
  loop while MSG[1,1] = '|' do     ;*  '|' at the beginning means 'new lines'
    DEBUG.DISPLAY := @FM
    MSG = MSG[2, 99999]
  repeat

  DEBUG.DISPLAY := MSG   ;*  Finally add text OR a chunk of lines or whatever.

  if MSG[len(MSG),1] # ':' then  ;*  ':' at the end means 'no new line'
    DEBUG.DISPLAY := @FM
  end
return

[[DisplayDebugMessages]]:
  Heading = MSG
  OPTIONS = 'FULL.SCREEN'
  call BOX.DISP.ITEM( DEBUG.DISPLAY, Heading, '', '', OPTIONS, OUT)
  DEBUG.DISPLAY = ''    ;*  never print something twice: just in case calling logic is messed up.
return

*  Does this even work ?
 
[[PrintDebugMessages]]:
  printer on
  [[NumLines]] = dcount(DEBUG.DISPLAY, @FM)
  for N.L = 1 to [[NumLines]]
    print DEBUG.DISPLAY< N.L >
  next N.L
  call PRT.OFF
return