sreda, 02. junij 2021 ob 21:03:41 UTC+2 je oseba JShepherd napisala:
Hi,
I'm still trying to understand why my code doesn't work. I think that something is wrong with the structures.
This tal program was written by my coworker.
?symbols !NCPSTASTAT
?inspect !NCPSTASTAT
!NCPSTASTAT
?nolist, source $system.system.extdecs0( !NCPSTASTAT
? close, !NCPSTASTAT
? initializer, !NCPSTASTAT
? myterm, !NCPSTASTAT
? numout, !NCPSTASTAT
? open, !NCPSTASTAT
? time, !NCPSTASTAT
? serverclass_send_, !NCPSTASTAT
? serverclass_send_info_, !NCPSTASTAT
? shiftstring, !NCPSTASTAT
? write ) !NCPSTASTAT
!NCPSTASTAT
?nolist, source $data02.aciutils.sysmsgs( !NCPSTASTAT
? ci^startup ) !NCPSTASTAT
!NCPSTASTAT
?nolist, source $data02.ba60src.bancptal( !NCPSTASTAT
? attributes, !NCPSTASTAT
? constants, !NCPSTASTAT
? defs, !NCPSTASTAT
? ncp^lex^struct, !NCPSTASTAT
? errors^and^warnings, !NCPSTASTAT
? requests, !NCPSTASTAT
? responses, !NCPSTASTAT
? structs, !NCPSTASTAT
? token ) !NCPSTASTAT
!NCPSTASTAT
!NCPSTASTAT
! globals !!NCPSTASTAT
string .pmon^nam^g[0:14] := [$occurs( pmon^nam^g ) * [" "]], !NCPSTASTAT
.sta^nam^g[0:15] := [$occurs( sta^nam^g ) * [" "]]; !NCPSTASTAT
!NCPSTASTAT
!NCPSTASTAT
proc startupproc( rucb, passthru, !NCPSTASTAT
startupbuf, startup^len, !NCPSTASTAT
match ) variable; !NCPSTASTAT
int .rucb, !NCPSTASTAT
.passthru, !NCPSTASTAT
.startupbuf, !NCPSTASTAT
startup^len, !NCPSTASTAT
match; !NCPSTASTAT
!NCPSTASTAT
begin !NCPSTASTAT
!NCPSTASTAT
int .startups( ci^startup ) := @startupbuf; !NCPSTASTAT
!NCPSTASTAT
string .start^list[0:23] := [$occurs( start^list ) * [" "]], !NCPSTASTAT
.sptr, !NCPSTASTAT
.eptr; !NCPSTASTAT
!NCPSTASTAT
!NCPSTASTAT
! !!NCPSTASTAT
! Get argument parameters !!NCPSTASTAT
! !!NCPSTASTAT
if not startups.parm then !NCPSTASTAT
begin !NCPSTASTAT
! no arguments provided !!NCPSTASTAT
end !NCPSTASTAT
else !NCPSTASTAT
begin !NCPSTASTAT
! arguments provided, parse them !!NCPSTASTAT
start^list ':=' startups.parm for 12 words; !NCPSTASTAT
! all uppercase !!NCPSTASTAT
call shiftstring( start^list, $occurs( start^list ), 0 ); !NCPSTASTAT
!NCPSTASTAT
scan start^list until " " -> @sptr; !NCPSTASTAT
if not $carry then !NCPSTASTAT
begin !NCPSTASTAT
pmon^nam^g ':=' start^list for ( @sptr - @start^list ); !NCPSTASTAT
!NCPSTASTAT
scan sptr[1] until %h00 -> @eptr; !NCPSTASTAT
sta^nam^g ':=' sptr[1] for ( @eptr - @sptr[1] ); !NCPSTASTAT
end; !NCPSTASTAT
end; !NCPSTASTAT
!NCPSTASTAT
end; !NCPSTASTAT
!NCPSTASTAT
proc ncp^sta^stat main; !NCPSTASTAT
begin !NCPSTASTAT
!NCPSTASTAT
struct .ncp^rqst( ncp^lex^struct^def ); !NCPSTASTAT
!NCPSTASTAT
int .cnt^read := 0, !NCPSTASTAT
err := 0, !NCPSTASTAT
file^err := 0, !NCPSTASTAT
term^num := -1, !NCPSTASTAT
.ncp^resp( ncp^resp^struct^def ), !NCPSTASTAT
.ncp^resp^tkn( var^token^def ), !NCPSTASTAT
.ncp^resp^stat( ncp^resp^status^sta^def ), !NCPSTASTAT
.tim^array[0:6], !NCPSTASTAT
.term^name[0:11], !NCPSTASTAT
.buff[0:39]; !NCPSTASTAT
!NCPSTASTAT
string .srv^class[0:14] := ["SERVER-NCP "], !NCPSTASTAT
.cur^state[0:8], !NCPSTASTAT
.log^state[0:8], !NCPSTASTAT
.q^cnt[0:4], !NCPSTASTAT
.err^s[0:4], !NCPSTASTAT
.file^err^s[0:4]; !NCPSTASTAT
!NCPSTASTAT
!NCPSTASTAT
call initializer( ! rucb ! , !NCPSTASTAT
!passthru ! , !NCPSTASTAT
startupproc , !NCPSTASTAT
!paramproc ! , !NCPSTASTAT
!assignproc ! , !NCPSTASTAT
!flags! ); !NCPSTASTAT
!NCPSTASTAT
call myterm( term^name ); !NCPSTASTAT
! open hometerm !!NCPSTASTAT
call open( term^name, term^num ); !NCPSTASTAT
if <> then !NCPSTASTAT
begin !NCPSTASTAT
return; !NCPSTASTAT
end; !NCPSTASTAT
!NCPSTASTAT
! check if startup arguments were provided !!NCPSTASTAT
if pmon^nam^g = " " or !NCPSTASTAT
sta^nam^g = " " then !NCPSTASTAT
begin !NCPSTASTAT
buff ':=' "Provide PATHWAY PPD and STATION NAME arguments!"; !NCPSTASTAT
call write( term^num, buff, 47 ); !NCPSTASTAT
!NCPSTASTAT
call close( term^num ); !NCPSTASTAT
return; !NCPSTASTAT
end; !NCPSTASTAT
!NCPSTASTAT
ncp^rqst.static.cmd := ncp^cmd^status; ! STATUS command !!NCPSTASTAT
ncp^rqst.static.obj^typ := ncp^obj^process; ! for STATIONS !!NCPSTASTAT
ncp^rqst.static.obj ':=' sta^nam^g for $occurs( sta^nam^g ); !NCPSTASTAT
ncp^rqst.static.rn ':=' [" "] & !NCPSTASTAT
ncp^rqst.static.rn for !NCPSTASTAT
$len( ncp^rqst.static.rn ) - 1; !NCPSTASTAT
!NCPSTASTAT
ncp^rqst.static.end^user^id.user ':=' ! USERNAME !!NCPSTASTAT
[" "] & !NCPSTASTAT
ncp^rqst.static.end^user^id.user for !NCPSTASTAT
$len( ncp^rqst.static.end^user^id.user ) - 1; !NCPSTASTAT
ncp^rqst.static.user^info ':=' ! PASSWORD !!NCPSTASTAT
[" "] & !NCPSTASTAT
ncp^rqst.static.user^info for !NCPSTASTAT
$len( ncp^rqst.static.user^info ) - 1; !NCPSTASTAT
!NCPSTASTAT
ncp^rqst.static.end^user^id.sess^id ':=' !NCPSTASTAT
[" "] & !NCPSTASTAT
ncp^rqst.static.end^user^id.sess^id for !NCPSTASTAT
$len( ncp^rqst.static.end^user^id.sess^id ) - 1; !NCPSTASTAT
!NCPSTASTAT
ncp^rqst.static.cmd^timout := 1000d; !NCPSTASTAT
!NCPSTASTAT
call time( tim^array ); !NCPSTASTAT
! insert timestamp in NCP request structure !!NCPSTASTAT
call numout( ncp^rqst.static.tstamp.byte[0], !NCPSTASTAT
tim^array[0], 10, 2 ); !NCPSTASTAT
call numout( ncp^rqst.static.tstamp.byte[2], !NCPSTASTAT
tim^array[1], 10, 2 ); !NCPSTASTAT
call numout( ncp^rqst.static.tstamp.byte[4], !NCPSTASTAT
tim^array[2], 10, 2 ); !NCPSTASTAT
call numout( ncp^rqst.static.tstamp.byte[6], !NCPSTASTAT
tim^array[3], 10, 2 ); !NCPSTASTAT
call numout( ncp^rqst.static.tstamp.byte[8], !NCPSTASTAT
tim^array[4], 10, 2 ); !NCPSTASTAT
call numout( ncp^rqst.static.tstamp.byte[10], !NCPSTASTAT
tim^array[5], 10, 2 ); !NCPSTASTAT
call numout( ncp^rqst.static.tstamp.byte[12], !NCPSTASTAT
tim^array[6], 10, 2 ); !NCPSTASTAT
!NCPSTASTAT
ncp^rqst.static.max^resps := ncp^val^max^resps^fill; !NCPSTASTAT
ncp^rqst.static.rqst^vsn ':=' ncp^val^version^300; !NCPSTASTAT
!NCPSTASTAT
ncp^rqst.static.ctx^info ':=' !NCPSTASTAT
[" "] & !NCPSTASTAT
ncp^rqst.static.ctx^info for !NCPSTASTAT
$len( ncp^rqst.static.ctx^info ) - 1; !NCPSTASTAT
!NCPSTASTAT
ncp^rqst.static.resp^typ := ncp^val^resp^err^warn^norm; !NCPSTASTAT
ncp^rqst.static.rqst^cntl := ncp^val^rqst^err^warn^norm; !NCPSTASTAT
!NCPSTASTAT
ncp^rqst.dynamic^var1 ':=' !NCPSTASTAT
[%h00] & !NCPSTASTAT
ncp^rqst.dynamic^var1 for !NCPSTASTAT
$len( ncp^rqst.dynamic^var1 ) - 1; !NCPSTASTAT
!NCPSTASTAT
ncp^rqst.dynamic^area^lgth := $len( ncp^rqst.dynamic^area^lgth ); !NCPSTASTAT
! calculate NCP request length !!NCPSTASTAT
ncp^rqst.static.lgth := !NCPSTASTAT
$len( ncp^rqst.static ) + !NCPSTASTAT
$len( ncp^rqst.dynamic^area^lgth ) + !NCPSTASTAT
ncp^rqst.dynamic^area^lgth; !NCPSTASTAT
!NCPSTASTAT
! PATHSEND to SERVER-NCP !!NCPSTASTAT
err := serverclass_send_( pmon^nam^g, !NCPSTASTAT
$occurs( pmon^nam^g ), !NCPSTASTAT
srv^class, !NCPSTASTAT
$occurs( srv^class ), !NCPSTASTAT
ncp^rqst, !NCPSTASTAT
$len( ncp^rqst ), !NCPSTASTAT
$len( ncp^resp^struct^def ), !NCPSTASTAT
cnt^read ); !NCPSTASTAT
!NCPSTASTAT
if not err then !NCPSTASTAT
begin !NCPSTASTAT
@ncp^resp^tkn := @ncp^rqst.dynamic^var1.dynamic^area; !NCPSTASTAT
@ncp^resp := @ncp^resp^tkn.var^data; !NCPSTASTAT
if ncp^resp.resp^code <> ncp^err^ok then !NCPSTASTAT
begin !NCPSTASTAT
! server NCP returned error !!NCPSTASTAT
end !NCPSTASTAT
else !NCPSTASTAT
begin !NCPSTASTAT
if ncp^rqst.static.max^resps >= 1 then !NCPSTASTAT
begin !NCPSTASTAT
! print field info !!NCPSTASTAT
buff ':=' " CURRENT LOGICAL"; !NCPSTASTAT
call write( term^num, buff, 36 ); !NCPSTASTAT
buff ':=' "STATION STATE STATE " & !NCPSTASTAT
" QUEUE COUNT"; !NCPSTASTAT
call write( term^num, buff, 50 ); !NCPSTASTAT
buff ':=' "---------------- ------- -------" & !NCPSTASTAT
" -----------"; !NCPSTASTAT
call write( term^num, buff, 50 ); !NCPSTASTAT
end; !NCPSTASTAT
!NCPSTASTAT
! loop parse response STATION data and show the STATES !!NCPSTASTAT
use x; x := 0; !NCPSTASTAT
while x < ncp^rqst.static.max^resps do !NCPSTASTAT
begin !NCPSTASTAT
@ncp^resp^stat := @ncp^resp.resp^data[16]; !NCPSTASTAT
!NCPSTASTAT
! check current state !!NCPSTASTAT
case ncp^resp^stat.current^state of !NCPSTASTAT
begin !NCPSTASTAT
ncp^val^abnormal -> cur^state ':=' "ABNORMAL "; !NCPSTASTAT
ncp^val^started -> cur^state ':=' "STARTED "; !NCPSTASTAT
ncp^val^starting -> cur^state ':=' "STARTING "; !NCPSTASTAT
ncp^val^stopped -> cur^state ':=' "STOPPED "; !NCPSTASTAT
ncp^val^stopping -> cur^state ':=' "STOPPING "; !NCPSTASTAT
ncp^val^suspended -> cur^state ':=' "SUSPENDED"; !NCPSTASTAT
otherwise -> cur^state ':=' "UNKNOWN "; !NCPSTASTAT
end; !NCPSTASTAT
! check logical state !!NCPSTASTAT
case ncp^resp^stat.logical^state of !NCPSTASTAT
begin !NCPSTASTAT
ncp^val^abnormal -> log^state ':=' "ABNORMAL "; !NCPSTASTAT
ncp^val^started -> log^state ':=' "STARTED "; !NCPSTASTAT
ncp^val^starting -> log^state ':=' "STARTING "; !NCPSTASTAT
ncp^val^stopped -> log^state ':=' "STOPPED "; !NCPSTASTAT
ncp^val^stopping -> log^state ':=' "STOPPING "; !NCPSTASTAT
ncp^val^suspended -> log^state ':=' "SUSPENDED"; !NCPSTASTAT
otherwise -> log^state ':=' "UNKNOWN "; !NCPSTASTAT
end; !NCPSTASTAT
!NCPSTASTAT
! convert queue count to ascii !!NCPSTASTAT
call numout( q^cnt, ncp^resp^stat.queue^count, !NCPSTASTAT
10, $occurs( q^cnt ) ); !NCPSTASTAT
!NCPSTASTAT
buff ':=' ncp^resp.resp^obj for !NCPSTASTAT
$len( ncp^resp.resp^obj ) & " " & !NCPSTASTAT
cur^state for $occurs( cur^state ) & " " & !NCPSTASTAT
log^state for $occurs( log^state ) & !NCPSTASTAT
" " & !NCPSTASTAT
q^cnt for $occurs( q^cnt ); !NCPSTASTAT
call write( term^num, buff, 53 ); !NCPSTASTAT
!NCPSTASTAT
! position on next STATION data !!NCPSTASTAT
if ncp^rqst.static.max^resps > 1 then !NCPSTASTAT
@ncp^resp := @ncp^resp.resp^data[28]; !NCPSTASTAT
!NCPSTASTAT
! increment counter !!NCPSTASTAT
x := x + 1; !NCPSTASTAT
end; !NCPSTASTAT
drop x; !NCPSTASTAT
end; !NCPSTASTAT
end !NCPSTASTAT
else !NCPSTASTAT
if err = 233 then !NCPSTASTAT
begin !NCPSTASTAT
! PATHSEND error, get error details !!NCPSTASTAT
call serverclass_send_info_( err, file^err ); !NCPSTASTAT
!NCPSTASTAT
! convert errors to ascii !!NCPSTASTAT
call numout( err^s, err, 10, $occurs( err^s ) ); !NCPSTASTAT
call numout( file^err^s, file^err, 10, $occurs( file^err^s ) );!NCPSTASTAT
!NCPSTASTAT
buff ':=' "PATHSEND error: " & err^s for $occurs( err^s ) & !NCPSTASTAT
", file error: " & file^err^s for $occurs( file^err^s ); !NCPSTASTAT
call write( term^num, buff, 40 ); !NCPSTASTAT
end !NCPSTASTAT
else !NCPSTASTAT
begin !NCPSTASTAT
! <> 233, unknown pathsend error !!NCPSTASTAT
end; !NCPSTASTAT
!NCPSTASTAT
! close hometerm !!NCPSTASTAT
call close( term^num ); !NCPSTASTAT
!NCPSTASTAT
end; !NCPSTASTAT
Uros