#-------------------------------------------------------------------------------
# Track Debug Package argument(s) are option(s) and/or a debug message to be saved to a file
# Usage:
# package require tracks
# pTrack ?-on? ?-off? ?-clear? ?-overflow? ?-overflowGo? ?-abend? ?"104 message text"?
#
# A user-specified text message is written to a file "tracklst.txt" in the same directory
# as the source program. Tracking can be turned on or off, and the clear option sets the
# file to zero bytes. The program defaults to raise an error if the tracklst.txt file
# gets too big (default is one megabyte), but the overflowGo option will cause it to just
# turn off tracking and continue. The abend option will raise an optional error. The
# message is whatever the user wants it to be, but suggested usage is to always start
# with three digits that identify a proc and a fourth alphabetic character that marks
# the track uniquely and allows searching for a specific track.
#
# e.g.: pTrack -clear "Start a new test by emptying the track file"
# pTrack "140d date adjusted to $tMon of $tYear"
# pTrack "135b Current working directory is [pwd]"
#
#------------------------------------------------------------------------------
package provide tracks 1.0
namespace eval tracks { ;# define the tracks namespace:
namespace export pTrack pDisplay ;# export pTrack and pDisplay debug tools
variable bTrackFlag On ;# tracking on/off flag
variable nOverflow 1000000 ;# max size of track file before turnoff is triggered
variable bOverflowGo 0 ;# if file size is exceeded, if true, continue the program
variable bSilentDisplay Off ;# pDisplay is in silent mode (no displays wanted)
} ;# end namespace tracks
proc pTrack { args } { ;# write debug text to a debug log file
if { $tracks::bTrackFlag == Off } { ;# if tracking is turned off
return "tracking turned off" ;# go back to caller
}
if {$tracks::bTrackFlag==""} { ;# if track flag is empty
set tracks::bTrackFlag On ;# turn the track flag on
}
if {[llength $args] < 1} {
return "no args"
}
set sMsg "" ;# initialize the debug message
set bAbend Off ;# initialize the abend flag
set bOption Off ;# initialize the option flag
# pTrack ?-on? ?-off? ?-clear? ?-overflow=99999? ?-overflowGo? ?-abend? ?"104 message text"? ;# handle -options:
foreach sItem [lrange $args 0 end] { ;# for each arg in the track arguments
#pDisplay "next item is <$sItem>"
if { [string range $sItem 0 0] == "-" } { ;# if item starts with a hyphen ('-')
set sItem [string tolower $sItem] ;# convert arg to lower case
set bOption On ;# set the option flag
#pDisplay "next item is<$sItem> (case adjusted)"
}
if {[string range $sItem 0 9] == "-overflow=" } { ;# if -overflow option
#pDisplay "overflow recognized in: <$sItem>"
set n [string range $sItem 10 end] ;# get the number
#pDisplay "overflow number is <$n>"
set m [split $n ".,b'"] ;# strip the commas etc out of the overflow number
#pDisplay "m=<$m> a list without commas"
set n [join $m ""]
#pDisplay "n=<$n> a string integer without punctuation"
if { [string length $n] > 8 } { ;# if overflow has too many digits
set n "x" ;# kill the overflow value so it will be rejected
set sItem " + <$sItem> ignored, max is 8 digits + " ;# error message
}
if {[ string is integer -strict $n ]} { ;# if overflow is an integer (else error, ignore the number)
set tracks::nOverflow $n ;# set max file size to the integer
#pDisplay "$tracks::nOverflow=<$n>--overflow set"
continue ;# continue with the next foreach loop iteration
}
}
switch $sItem {
-abend {
set sMsg "$sMsg + $sItem " ;# accumulate the abend message
set bAbend On ;# set the abend flag on
}
-clear {
set hFile1 [open "tracklst.txt" w] ;# open for write (will clear the file)
close $hFile1 ;# close the file
}
-off {
set tracks::bTrackFlag Off ;# turn the track flag off
}
-on {
set tracks::bTrackFlag On ;# turn the track flag on
}
-overflowGo {
set tracks::bOverflowGo 1 ;# turn the track overflow-continue flag on
}
default {
set sMsg "$sMsg $sItem " ;# accumulate the message (all non-option stuff is concatenated)
}
}
}
set now [clock seconds] ;# get the current time for a timestamp
set sTrkTimeStamp [clock format $now -format "%Y/%m/%d-%k:%M:%S>"] ;# format the timestamp into the track message
set hFile1 [open "tracklst.txt" a] ;# open the track file
if { $tracks::bTrackFlag == "On" || $bOption } { ;# if track flag is on or options are specified
puts $hFile1 "$sTrkTimeStamp Track: <$sMsg>" ;# append track message to track file
}
if { $bAbend eq On } { ;# if abend flag is ON
close $hFile1 ;# close the track file
error "ABEND TR1002: pTrack caller has chosen to raise an error" ;# rais an error
pDisplay "9998 after the error abend line"
exit ;# quit
pDisplay "9998 after the exit abend line"
}
set nSize [file size "tracklst.txt"] ;# get the track file size
if { $nSize > $tracks::nOverflow } { ;# if track file is too big OVERFLOW ERROR!
set sOverflowMessage "Track File Overflow Error. Tracking has been turned off (pTrack is choosing to raise an error \
because the track file is too big (tracklst.txt is [pTracksCommify $nSize] characters long)"
puts $hFile1 "$sTrkTimeStamp Track: 999x <$sOverflowMessage>" ;# append text to track file
set tracks::bTrackFlag Off ;# turn off tracking
if { $tracks::bOverflowGo == 0 } { ;# if overflow continue has not been set
puts $hFile1 "$sTrkTimeStamp Track: 999y Overflow Continue has NOT been specified, so program is exiting."
close $hFile1 ;# close the track file
exit 16 ;# exit to the system with a return code
}
set answer [tk_messageBox -message "pTrack File Overflow Error" \
-icon question -type yesno \
-detail "Tracking halted. Select \"YES\" to make the application exit, or NO to continue \
(might be in an infinite loop)."]
if {$answer == yes} { ;# if user wants to abort, end the program
puts $hFile1 "$sTrkTimeStamp Track: 999z User chose EXIT option in dialog, so program is exiting"
close $hFile1 ;# close the track file
exit 16 ;# exit to the system with a return code
}
puts $hFile1 "$sTrkTimeStamp Track: 999w Program is continuing with tracking turned off"
}
close $hFile1 ;# close the track file
return $tracks::bTrackFlag ;# go back to caller
} ;# end proc pTrack
#---------------------------------------------------------------------
# Proc: pTracksCommify num sep
# commify -- put commas into a decimal number
# Arguments: num 1000000 an integer
# sep , separator char (defaults to English format ",")
# Returns: number 1,000,000 with commas in the appropriate places
#---------------------------------------------------------------------
proc pTracksCommify {num {sep ,}} {
while {[regsub {^([-+]?\d+)(\d\d\d)} $num "\\1$sep\\2" num]} {} ;# the magic regexp
return $num
} ;# end proc pTracksCommify
#---------------------------------------------------ppp---------------
# Proc: pDisplay show a debug message and handle responses
#---------------------------------------------------------------------
proc pDisplay { sMsg } {
# display a debug message in a msgbox dialog with options "OK" "CANCEL" and "SILENT"
# Arg: sMsg a debug text message line
# Returns: "yes" "no" "cancel"
if { $tracks::bSilentDisplay == On } { ;# if user has selected SILENT mode
return 0 ;# just go back, no message wanted now
}
set sText "$sMsg\n\nContinue displaying pDisplay messages? (YES to continue, \
NO to continue without pDisplay messages, or CANCEL to stop the program.)"
set sAnswer [tk_messageBox -message $sText -default yes \
-icon question -type yesnocancel -title "pDisplay Debug Message"]
switch -- $sAnswer {
no { set tracks::bSilentDisplay On }
cancel { exit "User canceled in a pDisplay call."}
}
return 0 ;# go back to the caller
} ;# end proc pDisplay