overview:
1000 %TITLE "Advocate_client_xxx"
%IDENT "Version_1.03"
!=========================================================================================================================
!1 2 3 4 5 6 7 8 9 0 1 2 3
!0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
!=========================================================================================================================
! Title : Advocate_client_xxx
! Author : Neil S. Rieck
! Purpose: Sends DCL commands (from people with no privs) to advocate_server which executes them on their behalf
! Notes :
!=========================================================================================================================
! History:
!
! Ver Who When What
! ---- --- ------ -------------------------------------------------------------------------------------------------------
! 1.01 NSR 010309 1. derived from advocate_server_101.bas
! 2. now non-priv users connect to mailboxes with $assign rather than $crembx
! 3. added a third mailbox (lck) which is only used to control client access to the tool
! NSR 010726 4. added a 100 try limit to the initial mailbox cleanup
! 1.02 NSR 030807 1. started STARLET renovation
! 1.03 NSR 070813 1. inlined a few functions for release to public domain
!=========================================================================================================================
! Overview:
!
! +--------+ +---------+ +--------+
! | client +-----+ MBX:lck | | server |
! | | +---------+ | |
! | | +---------+ | |
! | +---->+ MBX:cmd +---->+--->+ |
! | | +---------+ | | |
! | | +---------+ | | |
! | +<----+ MBX:rsp +<----+<---+ |
! +--------+ +---------+ +--------+
!
!=========================================================================================================================
option type = explicit ! cuz tricks are for kids
set no prompt !
!
%include "starlet" %from %library "sys$library:basic$starlet" ! system services
%include "$ssdef" %from %library "sys$library:basic$starlet" ! ss$
%include "$iodef" %from %library "sys$library:basic$starlet" ! io$
%include "lib$routines" %from %library "sys$library:basic$starlet" ! lib$
%include "$libdef" %from %library "sys$library:basic$starlet" ! eg. lib$_normal
!
external long ast_service_routine ! my AST service routine
!
%if %declared ( %basic$quadword_declared ) = 0 %then
record basic$quadword
long fill ( 2 )
end record
%let %basic$quadword_declared = 1
%end %if
!
! /// I/O Status Block ///
!
%if %declared (%IOSBREC) = 0 %then
record IosbRec ! structure of I/O Status Block
variant
case
group one
word rc ! return code
word xfer_count ! transfer count
long long_0 ! device specific info
end group one
case
group two
basic$quadword quad_0 ! unsigned quad word (system calls)
end group two
end variant
end record IosbRec
%let %IOSBREC = 1
%end %if
!+
!========================================
! Internal Declarations
!========================================
!-
external string function WCSM_DT_Stamp ! home brewed code
external string function WCSM_TrnLnm( string, string)
!
%include "[.inc]device_controls.inc"
declare string constant dq = '34'C ! double quote
!
declare long rc% , ! Return Code (system status) &
cs% , ! completion status &
word funct% , ! &
long junk% , ! &
debug% , ! &
count% , ! &
got_one% , ! &
got_total% , ! &
time_out_count% , ! &
try% , ! &
string junk$ , ! &
temp$ , ! &
menu_choice$ , ! &
my_cmd$ , ! &
my_que$ , ! &
my_dns$ , ! &
my_port$ , ! &
my_device$
!+
!========================================
! Misc Declarations
!========================================
!-
map(xyz)string dcl_response_line = 255%
!
! the next constant and map must be identical with the one in the AST
!
declare long constant k_ring_size = 60%
map(qio)IosbRec qio_sb_recv , ! &
qio_sb_xmit , ! &
string qio_buffer_recv = 255% , ! &
qio_buffer_xmit = 255% , ! &
line$(k_ring_size) = 255% , ! ring buffer &
word chan_recv% , ! &
chan_xmit% , ! &
long line_insert% , ! insert pointer (subscript) &
line_remove% , ! remove pointer (subscript) &
qio_rc% !
!+
!========================================
! Main
!========================================
!-
2000 on error goto trap
margin #0, 132%
!
declare string constant mbx_name_cmd = "CSMIS$ADVOCATE_CMD" !
declare string constant mbx_name_rsp = "CSMIS$ADVOCATE_RSP" !
declare string constant mbx_name_lck = "CSMIS$ADVOCATE_LCK" !
!
print
print "-i- allocating device: "; mbx_name_lck
rc% = sys$alloc( mbx_name_lck,,,,) !
junk% = rc% and 7% ! keep lower 3 bits
select junk%
case 1% ! normal
case else
select rc%
case 324% ! no such mailbox
print "-"; mid$("wseif???",junk%+1%,1%);"- alloc-rc: ";rc%
print "-i- MAILBOX not found, start the ADVOCATE server and try again"
goto fini
case else
print "-"; mid$("wseif???",junk%+1%,1%);"- alloc-rc: ";rc%
print "-i- the tool is locked by someone else, please try again later"
goto fini
end select
end select
!
%let %non_priv_user=1% !
%if %non_priv_user=1% %then ! support non-priv users
rc% = sys$assign( mbx_name_rsp, chan_recv%,,) !
print "-i- sys$assign-rc: ";rc% !
%else ! support only priv users
! create the permanent mailbox (if it already exists, a new one won't be created but a channel will be opened to it)
print "-i- Creating MailBox: ";mbx_name_rsp ! this is 'cmd' in server
rc% = sys$CreMbx( 1% by value ! mbx=permanent &
,chan_recv%,,,, ! VMS will assign the channel number &
,mbx_name_rsp, ! mbx name &
) !
print "-i- sys$CreMbx-rc: ";rc% !
%end %if !
print "-i- chan-recv: ";str$(chan_recv%) !
!
%if %non_priv_user=1% %then ! support non-priv users
rc% = sys$assign( mbx_name_cmd, chan_xmit%,,) !
print "-i-sys$assign-rc: ";rc% !
%else ! support only priv users
print "-i-Creating MailBox: ";mbx_name_cmd ! this is 'rsp' in server
rc% = sys$CreMbx( 1% by value ! mbx=permanent &
,chan_xmit%,,,, ! VMS will assign the channel number &
,mbx_name_cmd, ! mbx name &
) !
print "-i-sys$CreMbx-rc: ";rc% !
print "-i-chan-xmit: ";str$(chan_xmit%) !
%end %if
!
! purge mbx-read
!
print "-i-purge-mbx-recv"
try% = 0%
qio_sb_recv::rc = ss$_normal
while qio_sb_recv::rc = ss$_normal
try% = try% + 1%
map (QioPurge) string qio_purge$=80
qio_rc% = sys$qiow( ,chan_recv% by value &
,(io$_readvblk or io$m_now) by value &
,qio_sb_recv::quad_0 by ref &
,, &
,qio_purge$ by ref &
,len( qio_purge$ ) by value &
,,,, )
print "-e- $qio-rc(1): ";str$(qio_rc%) if (qio_rc% and 7%) <> 1
!
select qio_sb_recv::rc
case ss$_normal
print "Discarded-recv = ";left$(qio_purge$, qio_sb_recv::xfer_count )
if try% >= 100% then
print "Discarded-xmit- Mailbox not emptied in 100 trys, the server may be down"
goto fini
end if
case ss$_EndOfFile
case else
print "-e-qiow-recv-rc = ";qio_sb_recv::rc
end select
next
!
! purge mbx-xmit
!
print "-i-purge-mbx-xmit"
qio_sb_xmit::rc = ss$_normal
while qio_sb_xmit::rc = ss$_normal
qio_rc% = sys$qiow( ,chan_xmit% by value &
,(io$_readvblk or io$m_now) by value &
,qio_sb_xmit::quad_0 by ref &
,, &
,qio_purge$ by ref &
,len( qio_purge$ ) by value &
,,,, )
print "-e- $qio-rc(2): ";str$(qio_rc%) if (qio_rc% and 7%) <> 1
!
select qio_sb_xmit::rc
case ss$_normal
print "Discarded-xmit = ";left$(qio_purge$, qio_sb_xmit::xfer_count )
case ss$_EndOfFile
case else
print "-e-qiow-xmit-rc = ";qio_sb_xmit::rc
end select
next
!
! do the first qio READ to start things off
!
! SYS$QIO [efn] ,chan ,func ,[iosb] ,[astadr] ,[astprm] ,[p1] ,[p2] ,[p3] ,[p4] ,[p5] ,[p6]
!
print "-i-Starting 1st qio"
qio_rc% = sys$Qio( ! event flag &
,chan_recv% by value ! channel &
,io$_readvblk by value ! function &
,qio_sb_recv::quad_0 by ref ! i/o status &
,ast_service_routine by ref ! ast address &
, ! ast parameter &
,qio_buffer_recv by ref ! p1 buf address &
,len( qio_buffer_recv ) by value ! p2 buf length &
,,,, )
print "-e- $qio-rc(3): ";str$(qio_rc%) if (qio_rc% and 7%) <> 1
!
debug% = 0%
print vt$clear + vt$home;
while 1
print "============================"
print " ICSIS tcp print-queue tool"
print "============================"
my_que$ = "ICSIS$SPOOL_TOOL"
print " 1. show queue: "; my_que$
print " 2. conf queue: "; my_que$
print " 3. start queue: "; my_que$
print " 4. stop queue: "; my_que$
print " 5. delete queue: "; my_que$
print " 8. print 59x80 to: "; my_que$
print " 9. quit"
print " ?. help/notes"
print "choice> ";
input menu_choice$
menu_choice$ = edit$(menu_choice$, 32%+2%)
select menu_choice$
case "1"
my_cmd$ = "SHOW QUEUE/ALL/FULL "+ my_que$
gosub send_n_receive
case "2"
print "enter 'full dns name' or 'i/p' > ";
input my_dns$
my_dns$ = edit$(my_dns$, 2%)
iterate if my_dns$ = ""
!
print "enter tcp port (eg. HP/LJ=9100) > ";
input my_port$
my_port$ = edit$(my_port$, 2%)
iterate if my_port$ = ""
!
my_cmd$ = "STOP/QUEUE/RESET "+ my_que$
gosub send_n_receive
!
my_cmd$ = "DELETE/QUEUE "+ my_que$
gosub send_n_receive
!
my_device$ = my_dns$ +","+ my_port$
my_cmd$ = "INITIALIZE/QUEUE/START/RETAIN=ERROR/DEFAULT=(NOFLAG,FEED,FORM=DEFAULT,NOTRAIL)"
my_cmd$ = my_cmd$ + "/PROCESSOR=TCPWARE_TSSYM/ON="+ dq + my_device$ +",KEEP"+ dq +"/LIBRARY=SYSDEVCTL"
my_cmd$ = my_cmd$ + "/SEPARATE=RESET=(PRT_BLANK_LINE)/DEFAULT=(FORM=NEIL88) "+ my_que$
gosub send_n_receive
case "3"
my_cmd$ = "START/QUEUE "+ my_que$
gosub send_n_receive
case "4"
my_cmd$ = "STOP/QUEUE/RESET "+ my_que$
gosub send_n_receive
case "5"
my_cmd$ = "DELETE/QUEUE "+ my_que$
gosub send_n_receive
case "6"
case "7"
case "8"
my_cmd$ = "PRINT/QUEUE="+ my_que$ +" csmis$com:TEST_59X80.TXT"
gosub send_n_receive
case "99"
my_cmd$ = "SHOW TIME"
gosub send_n_receive
case "9","Q","E",""
goto fini
case "?","H"
! 123456789012345678901234567890123456789012345678901234567890123456789012345678
print "help:"
print "1. this print queue is not available from any ICSIS application. Use command"
print " 8 to send a test page"
print "2. this print queue is not permanent (parameters may be changed by the next"
print " person running this tool"
print "3. this program can't change line parameters of far end devices (like flow"
print " control settings of Synoptics-3395 or DS200 terminal servers since they"
print " have usually been password protected by other groups)"
print "4. some printers have been known not to work properly on the very first"
print " document sent just after a queue is defined. This means that you may need"
print " to print twice before you see your first document."
case "D"
select debug%
case 0%
debug% = 1%
print "-i- Debug: ON"
case else
debug% = 0%
print "-i- Debug: OFF"
end select
end select
next
!----------------------------------------------------------------------------------------------------
! send and receive
!----------------------------------------------------------------------------------------------------
send_n_receive:
print " ===== transaction start ====="
line_insert% = line_remove% ! turf anything in the receive buffer
gosub send_to_server ! send command to server
!
got_one% = 0%
got_total% = 0%
time_out_count% = 0%
!
while 1%=1%
!
while line_insert% <> line_remove% ! if we have work to do...
!
got_total% = got_total% + 1% ! tally for early exit logic
time_out_count% = 0% ! reset
!
! extract the data from the ring buffer
!
dcl_response_line = edit$( line$( line_remove% ), 128%+4% )
!
! advance the remove pointer NOW
!
select line_remove%
case < k_ring_size
line_remove% = line_remove% + 1%
case else
line_remove% = 0%
end select
!
! process the extracted string
!
junk$ = edit$( dcl_response_line, 128% ) ! no trailing
print "resp>";junk$
!
next
!
if got_total% = 0% then ! if nothing yet received...
goto recv_exit if time_out_count% >= 7% ! 14 seconds
print "-i- waiting for response" if time_out_count% >= 3% ! 6 seconds
sleep 2
time_out_count% = time_out_count% + 1%
else ! if something already received...
goto recv_exit if time_out_count% >= 2% ! 2 seconds
sleep 1
time_out_count% = time_out_count% + 1%
end if
next
recv_exit:
print bel,"-e- timeout, no response from server" if got_total% = 0%
print " ===== transaction finish ====="
return
!----------------------------------------------------------------------------------------------------
! send response back to connected process
!----------------------------------------------------------------------------------------------------
send_to_server:
print "-i-Starting qio write" if debug% > 0%
print "send>$";my_cmd$
my_cmd$ = my_cmd$ + cr
qio_buffer_xmit = my_cmd$
funct% = io$_writevblk or io$m_now or io$m_norswait
qio_rc% = sys$Qio( ! event flag &
,chan_xmit% by value ! channel &
,funct% by value ! function &
,qio_sb_xmit::quad_0 by ref ! i/o status &
, ! ast address &
, ! ast parameter &
,qio_buffer_xmit ! p1 buf address &
,len( my_cmd$ ) by value ! p2 buf length &
,,,, )
print "-e- $qio-rc(4): ";str$(qio_rc%) if (qio_rc% and 7%) <> 1
return
!
!========================================
! Trap (BASIC error handler)
!
! this will go to sys$output (sys$error)
!========================================
20000 trap:
print cr + lf + "Line = "+ str$(erl) + &
cr + lf + "Error= "+ str$(err) + &
cr + lf + "Text = "+ ert$(err)
resume fini ! fix stack + exit
!========================================
! adios
!========================================
Fini:
rc% = sys$dalloc( mbx_name_lck,) ! de-allocate
print ""
print "enter MENU to re-run the ICSIS menu"
32000 end !
!
!########################################################################################################################
!
!===============================================================================================================
! <<< ast_service_routine >>>
!
! param%: user defined parameter
! gpr_0%: general purpose register 0
! gpr_1%: general purpose register 1
! pc% : program counter
! pcl% : program status long word
!
! Note : this routine works like an interrupt service routine so it should do as little processing as possible
!===============================================================================================================
32100 sub ast_service_routine by ref (LONG param%, gpr_0%, gpr_1%, pc%, psl%)
!
OPTION type = explicit ! cuz tricks are for kids
!
%include "starlet" %from %library "sys$library:basic$starlet" ! system services
%include "$ssdef" %from %library "sys$library:basic$starlet" ! ss$
%include "$iodef" %from %library "sys$library:basic$starlet" ! io$
%include "lib$routines" %from %library "sys$library:basic$starlet" ! lib$
%include "$libdef" %from %library "sys$library:basic$starlet" ! eg. lib$_normal
external long ast_service_routine ! my AST service routine
!
%if %declared ( %basic$quadword_declared ) = 0 %then
record basic$quadword
long fill ( 2 )
end record
%let %basic$quadword_declared = 1
%end %if
!
! /// I/O Status Block ///
!
%if %declared (%IOSBREC) = 0 %then
record IosbRec ! structure of I/O Status Block
variant
case
group one
word rc ! return code
word xfer_count ! transfer count
long long_0 ! device specific info
end group one
case
group two
basic$quadword quad_0 ! unsigned quad word (system calls)
end group two
end variant
end record IosbRec
%let %IOSBREC = 1
%end %if
!
! the next constant and map must be identical with the one in MAIN
!
declare long constant k_ring_size = 60%
map(qio)IosbRec qio_sb_recv , ! &
qio_sb_xmit , ! &
string qio_buffer_recv = 255% , ! &
qio_buffer_xmit = 255% , ! &
line$(k_ring_size) = 255% , ! ring buffer &
word chan_recv% , ! &
chan_xmit% , ! &
long line_insert% , ! insert pointer (subscript) &
line_remove% , ! remove pointer (subscript) &
qio_rc% !
!
!~~~ print "ast iosb_rc: " + str$( qio_sb_recv::rc) + " iosb_bc: " + str$( qio_sb_recv::xfer_count )
!
! erase old mapped string
! then copy over received data
!
line$( line_insert% ) = "" ! zap old text
line$( line_insert% ) = left$( qio_buffer_recv, integer(qio_sb_recv::xfer_count) )
!
! Anomaly #3:
! There is a in the middle of this mapped string so remove it before printing (or the trailing blanks will
! overwrite your text and make it disappear)
!
!~~~ print "ast buf: "+ edit$( line$( line_insert% ), 128%+4%)
!
! move the insertion pointer (main will try to catch up by advancing the removal pointer)
!
select line_insert%
case < k_ring_size
line_insert% = line_insert% + 1%
case else
line_insert% = 0%
end select
!
! SYS$QIO [efn] ,chan ,func ,[iosb] ,[astadr] ,[astprm] ,[p1] ,[p2] ,[p3] ,[p4] ,[p5] ,[p6]
!
qio_rc% = sys$Qio( ! event flag &
,chan_recv% by value ! channel &
,io$_readvblk by value ! function &
,qio_sb_recv::quad_0 by ref ! i/o status &
,ast_service_routine by ref ! ast address &
, ! ast parameter &
,qio_buffer_recv by ref ! p1 buf address &
,len( qio_buffer_recv ) by value ! p2 buf length &
,,,, )
print "-e- $qio-rc(5): ";str$(qio_rc%) if (qio_rc% and 7%) <> 1
!
! the upper half of this program may be hybernating so wake it up
!
call sys$wake(,) ! wake up main
!
subend ! that's all
!========================================================================================================================
!
32200 function string WCSM_TrnLnm ( string logical_name$, table_name$ )
!========================================================================================================================
! Title : wcsm_trnlnm.fun
! Author : Neil S. Rieck
! Purpose: an external function to translate logical names
! Notes : 1. all our programs call this function so optimizations here will speed up the whole system
! : 2. use LIB$TRNLNM if speed isn't important
! History:
! 100 NSR 910911 1. original work
! NSR 940420 2. changed mapsize from 31 to 255
! NSR 000208 3. modified for use with 'starlet'
! NSR 021019 4. optimizations
! NSR 040516 5. now only do SUPERVISOR mode translations bf_100.5
! NSR 040519 6. returned this program to its previous functionality
!========================================================================================================================
! Notes :
!
! 1. please include the next line near the top of your source program (after 'option type=explicit')
!
! external string function WCSM_TrnLnm (string, string)
!
! 2. please include the next 2 lines near the bottom of of your source program (after 'END' of the main module)
!
! %include "[.fun]wcsm_trnlnm.fun"
!! ! function string WCSM_TrnLnm ( logical_name$, table_name$ )
!
!========================================================================================================================
option type=explicit ! cuz tricks are for kids...
!
!~~~ %include "[.inc]vms_externals.inc" x calls many modules from starlet
%include "starlet" %from %library "sys$library:basic$starlet" ! system services
%include "$ssdef" %from %library "sys$library:basic$starlet" ! ss$
%include "$lnmdef" %from %library "sys$library:basic$starlet" ! lnm$
%include "$psldef" %from %library "sys$library:basic$starlet" ! psl$
%include "[.inc]vms_structures.inc" ! IosbRec etc.
!
declare long constant MapSize% = 255
!
! <<< declare variables >>>
!
map(WCSM_TrnLnm)string Equiv_Name$ = MapSize%
declare long sys_status , ! for return codes &
bytes_returned% , ! for system calls &
my_attributes% , ! '' &
string temp$ , ! &
byte access_mode% !
!
declare ItemRec LogLst(2) ! 3 items (0-2)
!
!==================================================
! clean up data (before table fill)
!==================================================
!
logical_name$ = edit$(logical_name$, 32+4+2)
table_name$ = edit$(table_name$, 32+4+2)
!~~~ access_mode% = PSL$C_SUPER x bf_100.5
!
!==================================================
! prep for call (fill in table)
!==================================================
!
my_attributes% = LNM$M_TERMINAL
!
LogLst(0%)::BuffLen = 4% ! 4 bytes=long
LogLst(0%)::ItemCode = lnm$_Attributes ! desired code
LogLst(0%)::BuffAddr = loc(my_attributes%) !
LogLst(0%)::RtnLenAdr = 0% ! don't care
!
LogLst(1%)::BuffLen = MapSize% ! from map statement
LogLst(1%)::ItemCode = lnm$_String ! desired code
LogLst(1%)::BuffAddr = loc(Equiv_Name$) ! address of string variable
LogLst(1%)::RtnLenAdr = loc(Bytes_Returned%) ! address of length variable
!
LogLst(2%)::List_Terminator = 0% ! end of list
!
! this is it folks, the big Kahoona...
!
sys_status = sys$trnlnm( , ! attributes &
table_name$ , ! &
logical_name$ , ! &
, ! bf_105.6 &
LogLst() ) !
!
select sys_status
case ss$_nolognam
temp$ = "" ! make sure this is clear
case ss$_normal
temp$ = left$(Equiv_Name$, bytes_returned%)
case else ! paranoia, should never happen
temp$ = "-e-SYSERR_" + str$(sys_status) !
print temp$ + bel + " In 'WCSM_TrnLnm'" !
sleep 2% !
end select
!
! copy data back to function and return to caller
!
WCSM_TrnLnm = temp$
!
end function
!
32300 function string Wcsm_DT_Stamp
!===================================================================================================================
! Title : Wcsm_DT_Stamp_100?.inc
! Author : Neil S. Rieck
! Purpose: an external function to return a y2k compliant system time in the form ccyymmddhhmmss (14 chars)
! Notes : all our programs call this function so optimizations here will speed up the whole system
! History:
! 100a NSR 911229 1. original work
! NSR 940423 2. changed 'ON ERROR' to 'WHEN ERROR'
! 100b NSR 961108 1. cleaned up
! 100c NSR 961108 1. optimized
! 100d NSR ?????? 1. optimized
! 100e NSR 980618 1. optimized
! 2. added XX to month names so adding a skew wouldn't be necessary
! 3. replaced left hand mid$ with tens mapping
! 100f NSR 980619 1. optimized
! 2. added some code so I could remove the call to RSET (this may increase the size of both $PDATA
! and $CODE but might reduce execution time by avoiding one call to the BASIC RTL. Only
! benchmarking will determine wether this change is better or worse)
!===================================================================================================================
! Usage:
!
! 1. please include the next line near the top of your source
! program (after 'option type=explicit' )
!
! external string function Wcsm_DT_Stamp (string, long)
!
! 2. please include the next 2 lines near the bottom of of your
! source program (after 'END' of the main module)
!
! %include "[.fun]wcsm_dt_stamp.fun"
!! ! function string Wcsm_DT_Stamp
!===================================================================================================================
option type=explicit ! cuz tricks are for kids...
!
external long function sys$asctim
!
declare long sys_status
!
! this map is required for the call to sys$asctim (format: 19-JUN-1998 23:59:59.1)
!
map (WcsmDTStamp0) string Sys_buf_22 = 22
map (WcsmDTStamp0) string Sys_day = 2, ! &
Sys_dash1 = 1, !- &
Sys_month = 3, ! &
Sys_dash2 = 1, !- &
Sys_year = 4, ! &
Sys_space = 1, ! &
Sys_Hour = 2, ! &
Sys_colon1 = 1, !: &
Sys_Minute = 2, ! &
Sys_colon2 = 1, !: &
Sys_Second = 2, ! &
Sys_period = 1, !. &
Sys_Tenth = 1 !
!
! map for Wcsm date (output)
!
map (WcsmDTStamp1) string Wcsm_buf_14 = 14 !
map (WcsmDTStamp1) string Wcsm_year = 4, ! &
Wcsm_month = 2, ! &
Wcsm_day = 2, ! &
Wcsm_Hour = 2, ! &
Wcsm_Minute = 2, ! &
Wcsm_Second = 2
map (WcsmDTStamp1) string Wcsm_year = 4, ! &
Wcsm_month_tens = 1, ! &
Wcsm_month_ones = 1, ! &
Wcsm_day_tens = 1, ! &
Wcsm_day_ones = 1, ! &
Wcsm_Hour = 2, ! &
Wcsm_Minute = 2, ! &
Wcsm_Second = 2
!
! string constants
! 00000000011111111112222222222333333333
! 12345678901234567890123456789012345678
declare string constant k_month_names$ = "XXJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
! ||
! ++-- so I don't have to provide an offset in pos()
declare string constant my_space = '32'C
!
! <<< function 'code' starts here >>>
!
when error in
!
sys_status = sys$asctim(,Sys_buf_22,,) ! get ASCII time into sys_buf_22
!~~~ if (sys_status and 7%) <> 1% then cause error 11 x not required - call will never fail
!
! transfer data from one map to the other
!
Wcsm_year = Sys_year !
!~~~ rset Wcsm_month = str$( pos(k_month_names$,Sys_Month,1%) / 3%) x bf_100f
Wcsm_day = Sys_day !
Wcsm_hour = Sys_hour !
Wcsm_minute = Sys_minute !
Wcsm_second = Sys_second !
!
declare long temp% ! bf_100f
temp% = pos(k_month_names$,Sys_Month,1%) / 3% ! compute month number bf_100f
if temp% < 10% then ! if less than 10... bf_100f
Wcsm_month_ones = str$(temp%) ! ...then this goes into ONES bf_100f
Wcsm_month_tens = "0" ! ...and this goes into TENS bf_100f
else ! else >= 10 bf_100f
Wcsm_month = str$(temp%) ! bf_100f
end if
!
! make sure there are no spaces in the TENS area of our mapped variables (pad with '0' if necessary)
!
!~~~ Wcsm_month_tens = "0" if Wcsm_month_tens = my_space x disabled - see above code bf_100f
Wcsm_day_tens = "0" if Wcsm_day_tens = my_space !
!
! now pass result back to caller
!
Wcsm_DT_Stamp = Wcsm_Buf_14 ! this is it folks
use
Wcsm_DT_Stamp = "" ! error so return blank
end when
!
END Function
!========================================================================================================================
Back
to Home