home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / archives / kerm-mgb.lzh / ZKR.ROU < prev    next >
Text File  |  1990-04-24  |  52KB  |  1,195 lines

  1. ZKR ROUTINES, %ROU, %GI
  2. TUE 24 APR 90 9:04 PM
  3. ZKR
  4. ZKR ;DGR NYSCVM ;17APR90 9:11PM
  5.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  6.  ;Kermit - executive
  7. SETUP ;
  8.  ;B 1 K  S $ZE="ERR^ZKR" D CURRENT^%IS U 0:(RM:"") ;** M/11 V5
  9.  ;B 1 K  S $ZT="ERR^ZKR" D CURRENT^%IS U 0:(RM:"") ;** M/11+ V1
  10.  ;K  S FF="#",BS=$C(8),RO=$C(8,32,8),RM=79,SL=24 ;** STD
  11.  B 1 K  S $ZT="ERR^ZKR",FF="#",BS=$C(8),RO=$C(8,32,8),RM=79,SL=24 U 0:("MR":0) ;** CCSM
  12.  ;B 1 K  S $ZT="^%ER",FF="#",BS=$C(8),RO=$C(8,32,8),RM=79,SL=24 U 0:("MR":0) ;** CCSM
  13.  ;** enable user interrupts, set up error trapper ;** STD
  14.  S B="\",S=";"
  15.  D INITPAR
  16.  W @FF,!!,"Welcome to Kermit-M version ",^ZKRX("VERSION"),"; enter HELP for instructions",!!
  17. START ;
  18.  D ^ZKRT20 G XIT:E!'VI,@(CSS(1))
  19. RESTART ;
  20.  ;S $ZE="ERR^ZKR" ;** M/11 V5
  21.  S $ZT="ERR^ZKR" ; ** CCSM
  22.  ;reset error handler ;** STD
  23.  K (FF,BS,RO,RM,SL,B,S,TTY,FDX,RPSIZ,SPSIZ,RTO,STO,MAXTRY,DELAY,PAUSE,SSOH,RSOH,SEOL,SPADN,SPAD,SQA,SQB,CESC,PAR,BAUD,KAF,FW,DEBUG,SPN,RPN,BCNT,EFB)
  24.  W @FF G START
  25. BYE ;
  26.  I 'TTY W !,"? No remote Kermit to log out" G START
  27.  S SPT="G",SDAT="L",SPN=0 D SPACK,RACK E  U 0 W !,"Error - BYE command not effected" G START
  28.  U 0 W " Remote Kermit has been logged out" G XIT
  29. CONNECT ;
  30.  I $S('$D(CMD(2)):0,CMD(2)="":0,1:1) S A=$S($D(^ZKRX("LINE",CMD(2))):^(CMD(2)),1:CMD(2)) C:$S('TTY:0,TTY=+A:0,1:1) TTY S TTY=+A
  31.  D ^ZKRC G START
  32. FINISH ;
  33.  I 'TTY W !,"? No remote Kermit server to shut down" G START
  34.  S SPT="G",SDAT="F",SPN=0 D SPACK,RACK E  U 0 W !,"Error - FINISH command not effected" G START
  35.  U 0 W " Remote Kermit server has been shut down" G START
  36. EXIT G XIT
  37. GET ;
  38.  I 'TTY W !,"? No remote Kermit from which to GET files" G START
  39.  S SDAT=CMD(2),SPT="R",SPN=0 D SPACK G RECEIVE
  40. HELP ;
  41.  S GREF="^ZKRX(""HELP""" F I=2:1:VI S GREF=GREF_","""_CSS(I)_""""
  42.  S GREF=GREF_",0)" I '$D(@GREF) W !,"? Kermit: no help on that topic" G HX
  43.  W ! S $Y=0 F I=1:1:^(0) W !,^(I) I $Y+2>SL W !,"Press any key for more..." R *A:600 W $C(13),$J("",25),$C(13) S $X=0,$Y=0
  44. HX K GREF,I W ! G START
  45. MUMPS G START^ZKRM
  46. QUIT G XIT
  47. RECEIVE ;
  48.  U 0 W !,"Starting RECEIVE command...",! U TTY
  49.  D TTYON I 'E D ^ZKRR,TTYOFF
  50.  I TTY U 0 W !,"** Done with RECEIVE command"
  51.  G START
  52. RESET ;
  53.  G SETUP
  54. SEND ;
  55.  S FSPEC=CMD(2) D GETFIL I E W !,"? ",FSPEC K FSPEC G START
  56.  U 0 W !,"Starting SEND command...",! U TTY
  57.  ;** turn off echo ;** STD
  58.  D TTYON I 'E H DELAY D ^ZKRS,TTYOFF
  59.  I TTY U 0 W !,"** Done with SEND command"
  60.  G START
  61. SERVER ;
  62.  U 0 W !!,"Entering SERVER mode",!,"Enter the BYE command to stop the server and EXIT",!,"Enter the FINISH command to stop the server and return to the command level",!
  63.  D TTYON G START:E,^ZKRSRV
  64. SET ;
  65.  D ^ZKRSET G START
  66. SHOW ;
  67.  D SHOW^ZKRUM G START
  68. STATISTI ;
  69.  W !!,"Most recent transmission: " W $S('EFB:"** none yet",EFB<0:"** aborted",1:BCNT_" bytes, "_(EFB/10)_" cps thruput"),!
  70.  G START
  71. XIT C:TTY TTY 
  72.  ;K  
  73.  S $ZT="" U 0:("EC":0:"EP":0) W !,"** All done with Kermit-M" Q
  74. ERR ;
  75.  B 0 ;** M/11 ;**M/11+ V1
  76.  ;** disable user interrupts ;** STD
  77.  D TTYOFF
  78.  I 'KAF,$D(F1),$D(F2),F1]"",F2]"",$D(^ZKR(F1,F2)),$P(^(F2),"\",3)="" K ^(F2)
  79.  L
  80.  ;I $ZE["<INRPT>" U 0 W !,"(Interrupt received - restarting)" S $ZE="ERR^ZKR" B 1 G START ;** M/11
  81.  ;I $ZE["<INTERRUPT>" U 0 W !,"(Interrupt received - restarting)" ZQ  B 1 G START ;** M/11+ V1
  82.  ;** if user interrupt, renable them and return to start ;** STD
  83.  I $ZN=24 U 0 W !,"(Interrupt received - restarting)" B 1 G START ;** CCSM
  84.  W !,"** Fatal MUMPS error : ",$ZE B 1 ;** M/11 ;**M/11+ V1 ;** CCSM
  85.  ;** report a real error, enable user interrupts ;** STD
  86.  ;ZQ  ;**M/11+ V1 (unstack all DOs, FORs, etc)
  87.  Q
  88. GETFIL G GETFIL^ZKRUM
  89. INITPAR G INITPAR^ZKRUM
  90. TTYON ;
  91.  ;S E=0 U TTY:(0:"S") I TTY D ^ZKRTC S E=POP K POP I E W *7," Can't set up that port correctly" ;** M/11 V5 ;**M/11+ V1
  92.  S E=0 U TTY:("EC":1:"MR":0) I TTY D ^ZKRTC S E=POP K POP I E W *7," Can't set up that port correctly" ;** CCSM
  93.  ;** turn off echo, set line parameters ;** STD
  94.  Q
  95. TTYOFF ;
  96.  ;U TTY:("":"") U 0 ;** M/11 V5 ;**M/11+ V1
  97.  U TTY:("EC":0:"EP":0) U 0 ;** CCSM
  98.  ;** turn echo on, direct I/O to local terminal ;** STD
  99.  Q
  100. SPACK G SPACK^ZKRUP
  101. RACK D RPACK^ZKRUP I $S(E:0,RPT'="Y":0,SPN'=RPN:0,1:1)
  102.  Q
  103.  
  104. ZKRC
  105. ZKRC ;DGR NYSCVM  ;15APR90 3:58PM
  106.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  107.  ;Kermit - talk-thru to another machine
  108.  I 'TTY W !,"? No line specified" Q
  109.  O TTY::0 E  W !,"? Can't get that line now" Q  ;** M/11
  110.  ;** OWN the line, timeout if it's unavailable ;** STD
  111.  D ^ZKRTC I POP W !,"? Illegal line parameters specified" Q  ;** M/11 V5 ;** M/11+ V1
  112.  ;** Set speed, parity, 7 or 8-bit data ;** STD
  113.  U 0 W ! D AST W !,"You are now in 'talk thru' mode",!,"Everything you type will go to the CONNECTed line",!,"Enter CTRL/",$C(CESC+64)," followed by 'C' to get back to Kermit-M",!!
  114.  ;I FDX U 0:("":"IS") U TTY:("":"IS":$C(10)) ;** M/11 V5 ;** M/11+ V1
  115.  ;E  U 0:("":"I") U TTY:("":"IS":$C(10)) ;** M/11 V5 ;** M/11+ V1
  116.  B 0
  117.  I FDX U 0:("BK":1:"EC":1) U TTY:("EC":1:"BK":1:"MR":0) ;** CCSM
  118.  E  U 0:("BK":1:"EC":0) U TTY:("EC":1:"BK":1:"MR":0) ;** CCSM
  119.  ;** keyboard reads: image mode (no special chars.) ;** STD
  120.  ;** port reads : image mode, also terminate on LF ;** STD
  121.  ;** note : in OUT and IN, I have changed the 1-sec timeouts to 0-sec. timeouts to speed up communications.  This increases the system load which may be undesirable on large multiuser systems.
  122. OUT ;F I=0:0 U 0 R *A:1 Q:'$T  G:A=CESC CESC U TTY W *A
  123.  F I=0:0 U 0 R *A:0 Q:'$T  G:A=CESC CESC U TTY W *A  ;** CCSM
  124. IN ;F I=0:0 U TTY R A:1 U 0 W:A]"" A G:'$T OUT W *10 R *A:0 I  G:A=CESC CESC U TTY W *A G OUT  ;** M/11
  125.  F I=0:0 U TTY R A:0 U 0 W:A]"" A G:'$T OUT R *A:0 I  G:A=CESC CESC U TTY W *A G OUT  ;** CCSM
  126. CESC ;
  127.  U 0 R *A:RTO G @$S(A=67:"DONE",A=99:"DONE",A=83:"SHOW",A=115:"SHOW",A=63:"CHELP",A=CESC:"SESC",1:"EESC")
  128. DONE U 0 W !!,"End of connection; you still own the line" D AST W !
  129.  ;U 0:("":"") U TTY:("":"") ;** M/11 V5 ;** M/11+ V1
  130.  ;U 0:(0:0) U TTY:(0:0) ;** M/11 V4
  131.  B 1 U 0:("EC":0) U TTY:("EC":0) ;** CCSM
  132.  ;** turn on both echoes ;** STD
  133.  ;U 0 W *-1 U TTY W *-1 ;** M/11 V5 ;** M/11+ V1
  134.  ;** discard any type-ahead ;** STD
  135.  U 0 Q
  136. SHOW D AST W !,"You're connected to TTY number ",TTY," ; ",$S(FDX:"full",1:"half")," duplex ; baud rate ",BAUD,!,! D AST W !
  137.  G OUT
  138. CHELP U 0 D AST W !,"The following characters can follow the link 'escape':",!
  139.  W !?3,"C or c -- close the connection",!?3,"S or s -- show the status of the connection",!?3,"? -- show these options",!?3,"Another CTRL/",$C(CESC+64)," will be transmitted to the other machine",!?3,"Anything else will be ignored",!
  140.  D AST W ! G OUT
  141. SESC U TTY W *A G OUT
  142. EESC U 0 W !,"Illegal character following link 'escape' - ignored",! G OUT
  143. AST W ! F I=1:1:RM\6 W "******"
  144.  Q
  145.  
  146. ZKRM
  147. ZKRM ;DGR NYSCVM ;16APR90 8:34PM
  148.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  149.  ;Kermit <--> MUMPS interface - main options
  150.  W !,"Must enter via the MUMPS command in Kermit-M" Q
  151. START ;
  152.  ;S $ZE="ERR^ZKRM" ;** M/11 V5
  153.  S $ZT="ERR^ZKRM" ;** M/11+ V1
  154.  K ^ZKRZ($J) W @FF
  155.  S OPTS=";Help;Directory;Erase;Rename;Copy;Input;Output;Xit"
  156. MOPT ;
  157.  U 0 W !!,"Kermit-M file system -- MAIN options",!! F I=2:1:9 S X=$P(OPTS,S,I) W "(",$E(X),")",$E(X,2,99) I I<9 W "; "
  158.  W !!,"Option (? for help) : X => " D READ G MOPT:E,XIT:A="" S:$E(A)="?" A="H" S:$E(A)?1L A=$C($A(A)-32)_$E(A,2,99) F I=2:1:$L(A) I $E(A,I)?1U S A=$E(A,1,I-1)_$C($A(A,I)+32)_$E(A,I+1,99)
  159.  S F=$F(OPTS,S_A) I F<2 W *7," No such option" G MOPT
  160.  W @FF G @("MOPT"_$E(A))
  161. MOPTH S HREF="""MOPT""" D HELP G MOPT
  162. MOPTD D DIR G MOPT
  163. MOPTE D ERA^ZKRMF G MOPT
  164. MOPTR D REN^ZKRMF G MOPT
  165. MOPTC D COP^ZKRMF G MOPT
  166. MOPTO D ^ZKRMO G MOPT
  167. MOPTI D ^ZKRMI G MOPT
  168. MOPTX ;
  169. XIT ;
  170.  I $D(IO),$D(ZDS) U IO S $ZDS=ZDS C:$I'=IO IO
  171.  U 0
  172.  K ^ZKRZ($J),ZDS,ZIO,FN
  173.  G RESTART^ZKR
  174. DIR ;
  175.  W !,"DIRECTORY of files",! D GFSPEC I E Q
  176.  D GETFIL S FILE=$O(^ZKRZ($J,"FILE","")) I FILE="" W *7," ** no files match this specification" K FILE Q
  177.  W !!,"** Directory of files ",FSPEC," on " D ^%OUTDAT W " at " D TIM W !!,"name",?15,"quote",?25,"created",?50,"# of bytes",!
  178.  S FILE="" F I=0:1 S FILE=$O(^ZKRZ($J,"FILE",FILE)) Q:FILE=""  W !,FILE S F1=$P(FILE,"."),F2=$P(FILE,".",2),X=^ZKR(F1,F2) W ?15,$P(X,B,2) S DATIM=$P(X,B,4) D DATIM W ?25,DATIM,?50,$J($P(X,B,5),10)
  179.  K FILE,DATIM,F1,F2,X Q
  180. TIM ;
  181.  S X=$P($H,",",2) W $S(X>43199:X\3600-12,1:X\3600),":" S XX=X#3600\60_"" S:$L(XX)=1 XX="0"_XX W XX,$S(X>43199:" PM",1:" AM") K X,XX Q
  182.  Q
  183. DATIM G DATIM^ZKRMU
  184. GETFIL D GETFIL^ZKRMU Q
  185. GFSPEC D GFSPEC^ZKRMU Q
  186. GFILE D GFILE^ZKRMU Q
  187. HELP S HREF="^ZKRX(""MHELP"","_HREF_")" I '$D(@HREF) W *7," Sorry, no help on that topic" Q
  188.  W @FF S SUB=0 F I=0:0 S SUB=$O(@HREF@(SUB)) Q:SUB'?1.N  W !,^(SUB)
  189.  W !!,"Press <RETURN> when done reading..." D READ W @FF
  190.  Q
  191. READ R A:120 S E=$S(A="":0,"<#@^>"[$E(A):1,1:0)
  192.  W:E " Can't do that here." Q
  193. ERR ;
  194.  B 0 ;** M/11 ;** M/11+ V1
  195.  ;** disable user interrupts ;** STD
  196.  K ^ZKRZ($J)
  197.  B 1 ;** M/11 ;** M/11+ V1
  198.  ;** enable user interrupts ;** STD
  199.  ;G START:$ZE["<INRPT>" ;** M/11 V5
  200.  ;I $ZE["<INTERRUPT>" ZQ  G START ;** M/11+ V1
  201.  I $ZN=24 G START ;** CCSM
  202.  U 0 W !,"** Fatal MUMPS error : ",$ZE Q  ;** M/11 ;** M/11 V1
  203.  ;** restart on user interrupt, otherwise report error and quit ;** STD
  204.  
  205. ZKRMF
  206. ZKRMF ;DGR NYSCVM ; 13 Feb 85  17:12
  207.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  208.  ;Kermit <--> MUMPS interface -- process file-oriented options
  209. ERA ;
  210.  W !,"ERASE files",! D GFSPEC Q:E  D GETFIL I E W " ",FSPEC,! G ERA
  211.  W *7,!,"** Erase ",FSPEC,", are you sure (Y or N)? N ==> " D READ I A'="Y" W " [no change]" Q
  212.  W !!,"Deleting files that match ",FSPEC,"..." D KILL
  213.  W !!,"** done"
  214.  Q
  215. REN ;
  216.  S KILL=1 G RC
  217. COP ;
  218.  S KILL=0 G RC
  219. RC ;
  220.  W !!,$S(KILL:"RENAME",1:"COPY")," files",!!,"Enter the set of files to be ",$S(KILL:"renam",1:"copi"),"ed::",! D GFSPEC Q:E  I FSPEC="*.*" W *7,!!,"?? can't specify all files" G RC
  221.  D GETFIL I E W " ",FSPEC,! G RC
  222.  S OFN=$P(FSPEC,"."),OFT=$P(FSPEC,".",2),OFNW=$F(OFN,"*")-2,OFTW=$F(OFT,"*")-2
  223.  W !!,$S(KILL:"RENAME",1:"COPY")," ",FSPEC," to what files?",! D GFSPEC I E Q
  224.  S NFN=$P(FSPEC,"."),NFT=$P(FSPEC,".",2),NFNW=$F(NFN,"*")-2,NFTW=$F(NFT,"*")-2
  225.  I $S(NFNW>0&(OFNW>0):0,NFNW=OFNW:0,1:1) W *7,!!,"** ?? -- old & new filespecs do not have the same format" G RC
  226.  I $S(OFN'=NFN:0,OFT'=NFT:0,1:1) W *7,!!,"** ?? -- old & new filespecs must be different" G RC
  227.  W !!,"Moving files..." S FILE="" F I=0:1 S FILE=$O(^ZKRZ($J,"FILE",FILE)) Q:FILE=""  D MOVE
  228.  I KILL W !!,"Deleting old files..." D KILL
  229.  W !!,"** Done"
  230.  Q
  231. MOVE S OF1=$P(FILE,"."),OF2=$P(FILE,".",2,9),NF1=$S(NFNW<0:NFN,1:$E(NFN,1,NFNW)_$E(OF1,OFNW+1,99)),NF2=$S(NFTW<0:NFT,1:$E(NFT,1,NFTW)_$E(OF2,OFTW+1,99)) W !,OF1_"."_OF2_" --> "_NF1_"."_NF2_"..."
  232.  I $S($L(NF1)>8:1,$L(NF2)>3:1,1:0) W *7," ?? new file name is too long - no change" K ^ZKRZ($J,"FILE",FILE) Q
  233.  I $D(^ZKR(NF1,NF2)) W *7,!,NF1,".",NF2," is already on file.  Overwrite? N => " D READ I A'="Y" W " [no change]" Q
  234.  S ^ZKR(NF1,NF2)=^ZKR(OF1,OF2) S SUB="" F I=0:0 S SUB=$O(^ZKR(OF1,OF2,SUB)) Q:SUB=""  S X=^(SUB),^ZKR(NF1,NF2,SUB)=X
  235.  W " ** Done"
  236.  Q
  237. KILL S FILE="" F I=0:1 S FILE=$O(^ZKRZ($J,"FILE",FILE)) Q:FILE=""  K ^ZKR($P(FILE,"."),$P(FILE,".",2,9)) W:I#5=0 ! W ?(I#5*16),FILE
  238.  Q
  239. GETFIL D GETFIL^ZKRMU Q
  240. GFSPEC D GFSPEC^ZKRMU Q
  241. READ R A:120 S E=$S(A="":0,"<#@"[$E(A):1,1:0)
  242.  W:E " Can't do that here." Q
  243.  
  244. ZKRMFIO
  245. ZKRMFIO ;DGR NYSCVM  ;17APR90 11:08PM
  246.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  247.  ;Kermit <--> MUMPS interface -  file i/o utilities
  248. KIN ;
  249.  G KIC:LIN'?.ANP,KIQ:LIN[FQA S C=LIN D KINL S CL=CL_FQA_"M"_FQA_"J",CC=CC+4 Q
  250. KIQ S F=$F(LIN,FQA) I F<2 S C=LIN D KINL S CL=CL_FQA_"M"_FQA_"J",CC=CC+4 Q
  251.  S C=$E(LIN,1,F-2),LIN=$E(LIN,F,255) D KINL S CL=CL_FQA_FQA,CC=CC+2 G KIQ
  252. KINL S X=251-CC I $L(C)<X S CL=CL_C,CC=CC+$L(C) Q
  253.  S ^ZKR(F1,F2,F3)=CL_$E(C,0,X),C=$E(C,X+1,255),F3=F3+1,CL="",BCNT=BCNT+CC,CC=1 G KINL
  254. KIC F I=1:1:$L(LIN) S C=$E(LIN,I),C=$S(C=FQA:C_C,C?1C:FQA_$C($A(C)+64),1:C) D KINC1
  255.  S C=FQA_"M" D KINC1 S C=FQA_"J" D KINC1
  256.  Q
  257. KINC1 I CC>250 S ^ZKR(F1,F2,F3)=CL,CL="",BCNT=BCNT+CC,CC=1,F3=F3+1
  258.  S CL=CL_C,CC=CC+$L(C)
  259.  Q
  260. KOUT ;
  261.  S LIN=""
  262. KOS Q:F3=""  I CL="" D KOG I F3="" Q
  263.  S F=$F(CL,FQA) I 'F S LIN=LIN_CL,CL="" G KOS
  264.  S LIN=LIN_$E(CL,1,F-2),X=$E(CL,F),CL=$E(CL,F+1,255) D:CL="" KOG
  265.  I X="M",$E(CL,1,2)=(FQA_"J") S CL=$E(CL,3,255) Q
  266.  S LIN=LIN_$S(X=FQA:FQA,X?1U:$C($A(X)-64),X="?":$C(127),1:"") G KOS
  267. KOG S F3=$O(^ZKR(F1,F2,F3)) Q:F3=""  S CL=^(F3) Q
  268. FOPENW ;
  269.  S E=0 I '$D(FILE) S E=1 Q
  270.  S F1=$P(FILE,"."),F2=$P(FILE,".",2,9) I $S(F1="":1,F2="":1,$D(^ZKR(F1,F2)):1,1:0) S E=1 K F1,F2 Q
  271.  S FQA=$S($D(FQA):FQA,1:"#"),CL="",(F3,CC)=1,BCNT=0
  272.  S FQB=$S($D(FQB):FQB,1:"&")
  273.  ;B 0 S OZE=$ZE,$ZE="FERRW^ZKRMFIO" ;** M/11
  274.  B 0 S $ZT="FERRW^ZKRMFIO" ;** M/11+ V1, CCSM
  275.  ;** disable interrupts, set up error trapper ;** STD
  276.  D WLOCK
  277.  S ^ZKR(F1,F2)="0\"_FQA_","_FQB_B_$H
  278.  B 1 ;** M/11 ;** M/11+ V1, CCSM
  279.  ;** enable interrupts ;** STD
  280.  Q
  281. FCLOSEW ;
  282.  S E=0 I $S('$D(F1):1,'$D(F2):1,F1="":1,F2="":1,'$D(CL):1,'$D(F3):1,'$D(^ZKR(F1,F2))#10:1,1:0) S E=1 Q
  283.  B 0 ;** M/11 ;** M/11+ V1, CCSM
  284.  ;** disable user iterrupts ;** STD
  285.  I CL]"" S ^ZKR(F1,F2,F3)=CL,CL="",BCNT=BCNT+CC,CC=1,F3=F3+1
  286.  S $P(^ZKR(F1,F2),B,4,5)=$H_B_BCNT
  287.  D ULOCK
  288.  ;S $ZE=OZE K OZE B 1 ;** M/11
  289.  S $ZT="" B 1 ;** M/11+ V1, CCSM
  290.  ;** restore previous error trapper, enable interrupts ;** STD
  291.  K F1,F2,F3,BCNT,CL,CC,FQA,FQB Q
  292. FERRW ;
  293.  ;B 0 I $ZE'["<INRPT>" G @OZE ;** M/11
  294.  ;B 0 I $ZE'["<INTERRUPT>" ZQ 1 W "!" H 1 G @$ZT ;** M/11+ V1
  295.  U 0 B 0 I $ZN'=24 W $ZE,! H 1 ;** CCSM
  296.  ;** disable interrupts, report real errors ;** STD
  297.  W *7,!!,"Interrupted while writing to ",FILE," -- this file is not complete" D FCLOSEW H 2 G START^ZKRM
  298.  Q
  299. FOPENR ;
  300.  S E=0 I '$D(FILE) S E=1 Q
  301.  S F1=$P(FILE,"."),F2=$P(FILE,".",2,9) I F1=""!(F2="") S E=1 K F1,F2 Q
  302.  S F3=$O(^ZKR(F1,F2,0)) I F3="" S E=1 K F1,F2,F3 Q
  303.  D RLOCK
  304.  S FQA=$P($P(^ZKR(F1,F2),B,2),","),FQB=$P($P(^ZKR(F1,F2),B,2),",",2),CL=^ZKR(F1,F2,F3),CC=1
  305.  Q
  306. FCLOSER ;
  307.  D ULOCK
  308.  K F1,F2,F3,CL,CC,FQA,FQB Q
  309. FKILL ;
  310.  S E=0 I '$D(FILE) S E=1 Q
  311.  S X1=$P(FILE,"."),X2=$P(FILE,".",2,9) I $S(X1="":1,X2="":1,1:0) S E=1 K X1,X2 Q
  312.  K ^ZKR(X1,X2),X1,X2
  313.  Q
  314. RLOCK L ^ZKR(FILE,$J) Q
  315. WLOCK L ^ZKR(FILE) Q
  316. ULOCK L  Q
  317.  
  318. ZKRMI
  319. ZKRMI ;DGR NYSCVM  ;23APR90 10:51PM
  320.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  321.  ;Kermit <--> MUMPS interface - Input Kermit -> MUMPS
  322. IOPT ;
  323.  W !!,"Input options (Kermit-M file system --> MUMPS data structures)",! F I=1:1:6 W !?5,I,") ",$P("Sequential file in;Routine in (.MMP files);Routine in (.ROU file);Global in;Sequential global in;Binary file in",S,I)
  324. IO1 W !!,"Your choice (? for help) : X => " D READ G IO1:E Q:"Xx^>"[A  I "?Hh"[$E(A) S HREF="""IOPT""" D HELP^ZKRM G IOPT
  325.  I A?1N1"?",$E(A)>0,$E(A<7) S HREF="""IOPT"","""_$P("SFI;RIM;RIR;GI;SGI;BFI",S,+A)_"""" D HELP^ZKRM G IOPT
  326.  I $S(A'?1N:1,A<1:1,A>6:1,1:0) W *7," ? no such option" G IO1
  327.  W @FF D @$P("SFI;RIM;RIR;GI;SGI;BFI",S,A) G IOPT
  328. SFI ;
  329.  W !!,"Input Kermit-M files to a sequential device",! D GFSPEC Q:E  D GETFIL I E W " ",FSPEC,! G SFI
  330. SFI1 W !,"Write to device 0,2,5 or 6: " R IO I IO="" Q
  331.  I IO=5!(IO=6) R !,"File name: ",FN Q:FN=""
  332.  I IO=5!(IO=6) S IOSL=0 O IO:("FN":FN:"FA":2):5 E  Q
  333.  I IO=2 O IO:("MR":80):30 E  U 0 W *7," Printer busy - try later!" Q
  334.  ;I "\TRM\SDP\MT\"'[(B_IOT_B) W *7," I can't deal with that type of device" G SFI1
  335.  ;set IO as $I on which to list, IOT as device type, then OPEN it with correct parameters ;** STD
  336.  ;if IOT="TRM" also set up IOST (subtype), IOF (form feed), IOSL (page length) ;** STD
  337.  I IO S IOT="SDP",TRM=0
  338.  E  S TRM=1,IOT="TRM"
  339.  S TRM=IOT="TRM",PTR=IO=2 
  340.  I IOT="TRM" S IOF="#",IOSL=24
  341.  I PTR S IOF="#",IOSL=66
  342.  U IO S FILE="" F J=0:1 S FILE=$O(^ZKRZ($J,"FILE",FILE)) Q:FILE=""  D FOPENR D:'E SFIL D FCLOSER
  343.  I PTR W @IOF
  344.  I 'TRM U IO W $C(26),! I IOT="MT" W *3
  345.  U 0 I IO W !,"** Done for this set of files" C IO ;** CCSM
  346.  ;** if not listing on local screen, message & close device ;** STD
  347.  K TRM,PTR,IO,IOT,IOST,IOF,IOSL,IOPAR
  348.  Q
  349. SFIL I TRM S X=^ZKR(F1,F2),DATIM=$P(X,B,4) D DATIM W:PTR @IOF W !!,"Kermit file : ",FILE," received at ",DATIM," ; ",$P(X,B,5)," bytes",!!
  350.  U 0 I $I'=IO W !,"starting ",FILE,"..." U IO ;** M/11 ;** M/11+ V1
  351.  ;** if not listing on local screen, show progress ;** STD
  352.  F I=0:0 D KOUT W:PTR&($Y+3>IOSL) @IOF S:LIN[$C(26) LIN=$E(LIN,0,$F(LIN,$C(26)-2)),F3="" W LIN,! I F3="" Q
  353.  U 0 I $I'=IO W "done" U IO ;** M/11 ;** M/11+ V1
  354.  ;** if not listing on local screen, show progress ;** STD
  355.  Q
  356. BFI S $ZT="" B 1
  357.  W !!,"Input from Kermit-M files to a binary DOS file",! D GFSPEC Q:E  D GETFIL I E W " ",FSPEC,! G BFI
  358. BFI1 S IO=5  
  359.  R !,"DOS file name to write to: ",FN Q:FN=""
  360.  C IO
  361.  O IO:("FN":FN:"FA":2:"TR":1):5 E  Q
  362.  U IO S FILE="" F J=0:1 S FILE=$O(^ZKRZ($J,"FILE",FILE)) Q:FILE=""  D FOPENR D:'E BFIL D FCLOSER
  363.  U 0 I IO W !,"** Done for this set of files" C IO ;** CCSM
  364.  ;** if not listing on local screen, message & close device ;** STD
  365.  K IO
  366.  Q
  367. BFIL U 0 S X=^ZKR(F1,F2),DATIM=$P(X,B,4) D DATIM W !!,"Kermit file : ",FILE," received at ",DATIM," ; ",$P(X,B,5)," bytes",!!
  368.  U 0 W !,"starting ",FILE," to ",FN U IO S $ZDS=0 ;** CCSM
  369.  ;** if not listing on local screen, show progress ;** STD
  370.  F  D BFIL1 S F3=$O(^ZKR(F1,F2,F3)) Q:F3=""
  371.  U 0 W "done" U IO ;** CCSM
  372.  K BIN,CL,LIN,C1
  373.  Q
  374. BFIL1 S CL=^ZKR(F1,F2,F3),LIN=""
  375.  F I=1:1 Q:I>$L(CL)  S C=$A(CL,I) D BFIL2
  376.  U IO W LIN U 0 W "." 
  377.  Q
  378. BFIL2 S BIN=0
  379.  I C=$A(FQB) S I=I+1,C=$A(CL,I),BIN=1 D:C=-1 BFIL3 
  380.  I C=$A(FQA) S I=I+1,C=$A(CL,I) D:C=-1 BFIL3 I C'=$A(FQB),C'=$A(FQA) S C=$S(C=63:C+64,1:C-64) 
  381.  I BIN S C=C+128
  382.  S LIN=LIN_$C(C)
  383.  Q
  384. BFIL3 S F3=$O(^ZKR(F1,F2,F3)),CL=^(F3),I=1,C=$A(CL,I) 
  385.  Q
  386. RIM G RIM^ZKRMIR
  387. RIR G RIR^ZKRMIR
  388. GI ;
  389.  W !!,"Global input from a Kermit-M file",!
  390. GI1 D GFILE Q:E  D FOPENR I E W *7," [file undefined or empty]" G GI1
  391.  D KOUT W !,LIN,! D KOUT W LIN,! ;pkw 4/15/90 - display comment, date
  392.  S GNAM="" W !,"Starting global input..."
  393. GIF D KOUT G:LIN="" GIFX I $E(LIN)'="^" W *7,!,"ERROR - no global reference where one was expected",!,"No more input from file" G GIFX
  394.  S REF=LIN I $P(REF,"(")'=GNAM S GNAM=$P(REF,"(") W !,GNAM,"..."
  395.  I F3="" W *7,!,"ERROR - last reference had no data!" G GIFX
  396.  D KOUT S @REF=LIN G:F3]"" GIF W !,"** done" D FCLOSER
  397. GIFX W !,"** All done" K FILE,REF,GNAM
  398.  Q
  399. SGI ;
  400.  W !!,"Sequential global input from a Kermit-M file",!
  401. SGI1 D GFILE Q:E  D FOPENR I E W *7," [file undefined or empty]" G SGI1
  402. SGI2 W !,"Enter the root of the global subtree under which to file:" D GRT Q:E  I $D(@(GRF(1)))\10 W *7,!!,"** that subtree already has descendents, try again",! G SGI2
  403.  W !,"Starting input..."
  404.  F GI=1:1 D KOUT S @GRF(1)@(GI)=LIN W:GI#100=0 "." I F3="" D FCLOSER W "** done" Q
  405.  K GI Q
  406. DATIM ;
  407.  Q:DATIM'?1.6N1","1.6N  S Y=$P(DATIM,",",2) S TIM=$S(Y>43199:Y\3600-12,1:Y\3600)_":" S YY=Y#3600\60_"" S:$L(YY)=1 YY="0"_YY S TIM=TIM_YY_$S(Y>43199:" PM",1:" AM") K Y,YY
  408.  ;S DATIM=$ZD(+DATIM,2)_", "_TIM K TIM
  409.  S %HDAT=DATIM D %DAT^%OUTDAT S DATIM=%DAT
  410.  Q
  411. KOUT G KOUT^ZKRMFIO
  412. FOPENR G FOPENR^ZKRMFIO
  413. FCLOSER G FCLOSER^ZKRMFIO
  414. GFILE G GFILE^ZKRMU
  415. GETFIL G GETFIL^ZKRMU
  416. GFSPEC G GFSPEC^ZKRMU
  417. GRT G GRT^ZKRMU
  418. READ R A:120 S E=$S(A="":0,"<#@^>"[$E(A):1,1:0)
  419.  W:E " Can't do that here." Q
  420.  
  421. ZKRMIR
  422. ZKRMIR ;DGR NYSCVM  ;14APR90 11:03AM
  423.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  424.  ;Kermit <--> MUMPS interface - Input Kermit -> MUMPS - routines
  425. RIM ;
  426.  W !!,"Routine input from .MMP files",! D GFSPEC Q:E  I $P(FSPEC,".",2)'="MMP" W *7," MUST have filetype .MMP" G RIM
  427.  D GETFIL I E W " ",FSPEC,! G RIM
  428.  S FILE="" F I=0:0 S FILE=$O(^ZKRZ($J,"FILE",FILE)) Q:FILE=""  S ROU=$P(FILE,".") D RCHECK I 'E D FOPENR,RFILE,FCLOSER
  429.  K ^ZKRZ($J,"ROU"),RI,FILE W !,"** done" Q
  430. RIR ;
  431.  W !!,"Routine input from a .ROU file",! D GFILE Q:E  I $P(FILE,".",2)'="ROU" W *7," MUST have filetype .ROU" G RIR
  432.  D FOPENR I E W *7," [file undefined or empty]" G RIR
  433.  D KOUT W !,"File description: ",LIN D KOUT W !,"Written on: ",LIN
  434.  F I=0:0 D KOUT Q:LIN=""!($E(LIN)=$C(26))  S ROU=LIN D RCHECK D:E RIRSK D:'E RFILE
  435.  D FCLOSER K ^ZKRZ($J,"ROU"),RI W !,"** done"
  436.  Q
  437. RIRSK W " skipping ",ROU,"..." F I=0:0 D KOUT I LIN="" Q
  438.  Q
  439. RFILE ;
  440.  W !,"now filing routine ",ROU,"..." K ^ZKRZ($J,"ROU") F RI=1:1 D KOUT Q:LIN=""  S ^ZKRZ($J,"ROU",RI)=LIN
  441.  ;X "ZR  F RI=1:1 S X=$D(^ZKRZ($J,""ROU"",RI)) X ""I X ZI ^(RI)"" I 'X ZS @ROU Q" ;** M/11 ;** M/11+ V1
  442.  S %GLB="^ZKRZ("_$J_","_"""ROU"""_")" D ^%RSAVE  ;** CCSM
  443.  ;** load into routine buffer and save on disk ;** STD
  444.  S ^UTILITY("ROU",ROU)="" ;** M/11 ;**M/11+ V1
  445.  ;** update global directory ;** STD
  446.  W "done" Q
  447. RCHECK ;
  448.  S E=0 I $D(^UTILITY("ROU",ROU)) W *7,!,"Routine ",ROU," is already on file.  Overwrite? No => " D READ S E=$S("\N\No\NO\no\\"[(B_A_B):1,"\Y\YES\yes\Yes\"[(B_A_B):0,1:2) I E=2 W *7," ??" G RCHECK ;** M/11 ;** M/11+ V1
  449.  ;** check if routine already exists ;** STD
  450.  Q
  451. KOUT G KOUT^ZKRMFIO
  452. FOPENR G FOPENR^ZKRMFIO
  453. FCLOSER G FCLOSER^ZKRMFIO
  454. GFILE G GFILE^ZKRMU
  455. GETFIL G GETFIL^ZKRMU
  456. GFSPEC G GFSPEC^ZKRMU
  457. READ R A:120 S E=$S(A="":0,"<#@^>"[$E(A):1,1:0)
  458.  W:E " Can't do that here." Q
  459.  
  460. ZKRMO
  461. ZKRMO ;DGR NYSCVM  ;24APR90 6:39AM
  462.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  463.  ;Kermit <--> MUMPS interface - Output MUMPS-->Kermit
  464. OOPT ;
  465.  W !!,"Output options (MUMPS data structures --> Kermit-M file system)",! F I=1:1:6 W !?5,I,") ",$P("Sequential file out;Routine out (.MMP files);Routine out (.ROU file);Global out;Sequential global out;Binary file out",S,I)
  466. OO1 W !!,"Your choice (? for help) : X => " D READ G OO1:E Q:"Xx^>"[A  I "?Hh"[$E(A) S HREF="""OOPT""" D HELP^ZKRM G OOPT
  467.  I A?1N1"?",$E(A)>0,$E(A<7) S HREF="""OOPT"","""_$P("SFO;ROM;ROR;GO;SGO",S,+A)_"""" D HELP^ZKRM G OOPT
  468.  I $S(A'?1N:1,A<1:1,A>6:1,1:0) W *7," ? no such option" G OO1
  469.  W @FF D @$P("SFO;ROM;ROR;GO;SGO;BFO",S,A) G OOPT
  470.  Q
  471. SFO ;
  472.  W !!,"Write a sequential MUMPS file to a Kermit-M file",!
  473. SFO1 ;W !,"Read from" D ^%IS I POP Q  ;** M/11 ;** M/11+ V1
  474.  ;W !,"Read from device 0,5 or 6: " R IO I IO="" Q
  475.  S IO=5
  476.  I IO R !,"File name: ",FN 
  477.  I IO O IO:("FN":FN:"FA":0):5 E  Q
  478.  ;I "\TRM\SDP\MT\"'[(B_IOT_B) W *7," I can't deal with that type of device" G SFO1
  479.  ;set IO as $I from which to read, IOT as device type, IOST as subtype, then OPEN it with correct parameters ;** STD
  480.  I IO S IOT="SDP",TRM=0
  481.  E  S TRM=1,IOT="TRM"
  482. SFOF W !,"Write to which Kermit-M file?" D GFILE G:E SFOX D FOPENW I E W *7," ?? that file is already defined" G SFOF
  483.  U 0 I TRM,IO'=$I W !,"Enter your text lines at terminal #",IO,!
  484.  I TRM U IO W !!!,"Enter lines of text; enter <CR> only when done",!
  485.  E  U 0 W !,"Writing to file ",FILE,"..." U IO S $ZDS=0  ;** CCSM
  486.  U IO F I=0:0 W:TRM !,">" R LIN D SFEOF Q:E  D KIN
  487.  D FCLOSEW
  488.  I TRM W !!,"The above text is now in file ",FILE
  489.  E  U 0 W "** done"
  490. SFOX U 0 I $D(IO),IO,IO'=$I C IO
  491.  K TRM,FILE Q
  492. SFEOF S E=0 I IOT="TRM" S E=$S(LIN="":1,1:0) Q
  493.  ;I IOT="SDP" S E=$S(LIN=$C(26):1,1:0) Q
  494.  I IOT="SDP" S E=$ZIO\256=36 Q
  495.  I IOT="MT" S E=$S(LIN=$C(26):1,$ZA\16384#2:1,1:0) Q
  496.  S E=1
  497.  Q
  498. BFO ; **CCSM specific
  499.  W !!,"Write a binary DOS file to a Kermit-M file",!
  500.  S IO=5  
  501.  R !,"Read from DOS file name: ",FN Q:FN=""
  502.  C IO
  503.  O IO:("FN":FN:"FA":0:"TR":1):5 E  Q
  504.  U IO S ZDS=$ZDS ;eof
  505. BFOF U 0 W !,"Write to which Kermit-M file?" D GFILE G:E BFOX D FOPENW I E W *7," ?? that file is already defined" G BFOF
  506.  U 0 W !,"Writing ",FN," to file ",FILE 
  507.  U IO S $ZDS=0 ;** CCSM
  508.  F  U IO R LIN#80 S ZIO=$ZIO U 0 W "." D BKIN Q:ZIO\256=36  
  509.  S CL="" D FCLOSEW
  510.  U 0 W "** done" 
  511. BFOX U IO C IO
  512.  K FN,FILE,ZIO,ZDS Q
  513. BKIN I $L(LIN)'=80,ZIO\256'=36 S LIN=LIN_$C(13)
  514.  F I=1:1 Q:I>$L(LIN)  S C=$A(LIN,I) D
  515.  .I C>127 S C=C-128,LIN=$E(LIN,1,I-1)_FQB_$C(C)_$E(LIN,I+1,255),I=I+1
  516.  .I C<32 S C=C+64,LIN=$E(LIN,1,I-1)_FQA_$C(C)_$E(LIN,I+1,255),I=I+1
  517.  .I C=127 S C=C-64,LIN=$E(LIN,1,I-1)_FQA_$C(C)_$E(LIN,I+1,255),I=I+1 
  518.  .I C=$A(FQA)!(C=$A(FQB)) S LIN=$E(LIN,1,I-1)_FQA_$C(C)_$E(LIN,I+1,255),I=I+1
  519.  S ^ZKR(F1,F2,F3)=LIN,BCNT=BCNT+$L(LIN),LIN="",F3=F3+1 
  520.  Q
  521. ROM G ROM^ZKRMOR
  522. ROR G ROR^ZKRMOR
  523. GO ;
  524.  W !!,"Global output to a Kermit file",!
  525. GOR D GROOT I 'GRF Q
  526. GOF W !!,"Write into what Kermit-M file?",! D GFILE Q:E  D FOPENW I E W *7," ?? that file is already defined" G GOF
  527.  D HEAD F GI=1:1:GRF S GR=GRF(GI) D GOW
  528.  D FCLOSEW K GI,GR,GRF,DEF,L,M,REF,SUB W *7,!,"** All done" Q
  529. GOW W !,"Starting ",GR,"..." I '$D(@GR) W *7," ** [undefined]" Q
  530.  S L=$S(GR["(":1,1:0),M=L,REF(L)=GR,L(L)=$L(GR)-1 D GOVIS:$D(@GR)#10 S M=L+1 D GODOWN
  531.  Q
  532. GODOWN S SUB(L)="" F I=0:0 S SUB(L)=$O(@REF(L)@(SUB(L))) Q:SUB(L)=""  S REF(M)=$S('L:REF(L)_"("""_SUB(L)_""")",1:$E(REF(L),1,L(L))_","""_SUB(L)_""")"),L(M)=$L(REF(M))-1,DEF=$D(@REF(M)) D:DEF#10 GOVIS I DEF\10 S L=M,M=M+1 D GODOWN S M=L,L=L-1
  533.  Q
  534. GOVIS S LIN=REF(M) D KIN S LIN=@(REF(M)) D KIN Q
  535.  Q
  536. SGO ;
  537.  W !!,"Write one level of one or more globals to a Kermit file",!
  538. SGOR D GROOT I 'GRF Q
  539. SGOF W !!,"Write into what Kermit-M file?",! D GFILE Q:E  D FOPENW I E W *7," ?? that file is already defined" G SGO
  540.  W " writing..." F GI=1:1:GRF S GR=GRF(GI) D SGOW
  541.  D FCLOSEW K GI,GR,GRF,SUB W *7,!,"** All done" Q
  542. SGOW W !,"Starting ",GR,"..." I $D(@GR)\10=0 W *7," ** [undefined]" Q
  543.  S SUB="" F I=0:0 S SUB=$O(@GR@(SUB)) Q:SUB=""  I $D(@GR@(SUB))#10 S LIN=@GR@(SUB) D KIN
  544.  Q
  545. GROOT G GROOT^ZKRMU
  546. GFILE G GFILE^ZKRMU
  547. FOPENW G FOPENW^ZKRMFIO
  548. FCLOSEW G FCLOSEW^ZKRMFIO
  549. KIN G KIN^ZKRMFIO
  550. DATIM G DATIM^ZKRMU
  551. READ R A:120 S E=$S(A="":0,"<#@"[$E(A):1,1:0)
  552.  W:E " Can't do that here." Q
  553. HEAD ;
  554.  W !!,"Please enter a free-text description of this file: " D READ
  555.  W " writing..." S LIN=A D KIN S DATIM=$H D DATIM S LIN=DATIM D KIN K DATIM
  556.  Q
  557.  
  558. ZKRMOR
  559. ZKRMOR ;DGR NYSCVM  ; 18 Apr 85  15:52
  560.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  561.  ;Kermit <--> MUMPS interface - Output MUMPS-->Kermit - routines
  562. ROM ;
  563.  W !!,"Routine output to Kermit-M files (.MMP)",!,"Please specify the set of routines to write:"
  564.  D RSET G ROMX:'RCT W !,"Writing routines to Kermit files now..."
  565.  S ZL="ZL @A F J=1:1 S X=$T(+J) Q:X=""""  S ^ZKRZ($J,""ROM"",J)=X",A=0 ;** M/11 ;** M/11+ V1
  566.  ;** SET ZL=an Xecutable string to load a routine named in var. A into scratch global;** STD
  567. ROM1 S A=$O(^ZKRZ($J,"RSET",A)) I A="" W !,"All done for this set of routines" G ROMX
  568.  W !,A,"..." K ^ZKRZ($J,"ROM") X ZL I J>1 S FILE=A_".MMP" D FOPENW I E W *7,FILE," is already defined - NOT overwritten" G ROM1
  569.  F J=1:1 S LIN=$S('$D(^ZKRZ($J,"ROM",J)):"",1:^(J)) D:LIN]"" KIN I LIN="" D FCLOSEW W "done" Q
  570.  G ROM1
  571. ROMX K RCT,ZL,^ZKRZ($J,"ROM"),^("RSET")
  572.  Q
  573. ROR ;
  574.  W !!,"Routine output to a Kermit-M file (.ROU)",!,"Please specify the set of routines to write:"
  575.  D RSET G RORX:'RCT
  576. RORF W !!,"Write these routines to what Kermit-M file?",! D GFILE Q:E  I $P(FILE,".",2,3)'="ROU" W *7," ?? must have file type of .ROU" G RORF
  577.  D FOPENW I E W *7," ?? that file is already defined" G RORF
  578.  S ZL="ZL @A F J=1:1 S X=$T(+J) Q:X=""""  S ^ZKRZ($J,""ROR"",J)=X",A=0 ;** M/11 ;** M/11+ V1
  579.  ;** SET ZL=an Xecutable string to load a routine named in var. A into scratch global;** STD
  580.  D HEAD S A=0
  581. ROR1 S A=$O(^ZKRZ($J,"RSET",A)) I A="" S LIN="" D KIN D FCLOSEW W !,"All done for this set of routines" G RORX
  582.  W !,A,"..." K ^ZKRZ($J,"ROR") S LIN=A D KIN X ZL F J=1:1 S LIN=$S('$D(^ZKRZ($J,"ROR",J)):"",1:^(J)) D KIN I LIN="" W "done" Q
  583.  G ROR1
  584. RORX K RCT,ZL,^ZKRZ($J,"ROR"),^("RSET")
  585.  Q
  586. RSET G RSET^ZKRMUR
  587. GFILE G GFILE^ZKRMU
  588. FOPENW G FOPENW^ZKRMFIO
  589. FCLOSEW G FCLOSEW^ZKRMFIO
  590. KIN G KIN^ZKRMFIO
  591. DATIM G DATIM^ZKRMU
  592. READ R A:120 S E=$S(A="":0,"<#@"[$E(A):1,1:0)
  593.  W:E " Can't do that here." Q
  594. HEAD ;
  595.  W !!,"Please enter a free-text description of this file: " D READ
  596.  W " writing..." S LIN=A D KIN S DATIM=$H D DATIM S LIN=DATIM D KIN K DATIM
  597.  Q
  598.  
  599. ZKRMU
  600. ZKRMU ;DGR NYSCVM  ;16MAR90 10:37PM
  601.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  602.  ;Kermit <--> MUMPS interface - utility parts
  603. DATIM ;
  604.  Q:DATIM'?1.6N1","1.6N  S Y=$P(DATIM,",",2) S TIM=Y\3600_":" S YY=Y#3600\60 S:$L(YY)=1 YY="0"_YY S TIM=TIM_YY K Y,YY
  605.  ;S DATIM=$ZD(+DATIM,2) ;** M/11 V5 ;** M/11+ V1
  606.  S %HDAT=+DATIM D %DAT^%OUTDAT S DATIM=%DAT
  607.  ;** set DATIM to readable date, like '2 APR 83' ;** STD
  608.  S DATIM=$J(DATIM,9)_", "_TIM K TIM
  609.  Q
  610. GFSPEC ;
  611.  W !,"-- File specification : " D READ S:A="" E=1 Q:E  S FN=$P(A,"."),FT=$P(A,".",2) I $S($L(FN)>8:1,$L(FT)>3:1,FN="":1,FT="":1,FN'?.1"%".8UN.1"*":1,FT'?.3UN.1"*":1,1:0) W *7," ** like TEST.DAT, or T*.D*, or, *.MMP" G GFSPEC
  612.  E  S FSPEC=A
  613.  K FN,FT Q
  614. GETFIL ;
  615.  K ^ZKRZ($J,"FILE") S (E,CT)=0,FN=$P(FSPEC,"."),FT=$P(FSPEC,".",2)
  616.  S FNL=$L(FN),FTL=$L(FT),FNW=$E(FN,FNL)="*",FTW=$E(FT,FTL)="*"
  617.  I 'FNW S F1=FN D GF2 G GFX
  618.  S FN=$E(FN,0,FNL-1),F1=FN D:$S(F1="":0,'$D(^ZKR(F1)):0,1:1) GF2 F I=0:0 S F1=$O(^ZKR(F1)) Q:F1=""!($E(F1,0,FNL-1)'=FN)  D GF2
  619.  G GFX
  620. GF2 I 'FTW S F2=FT D:$D(^ZKR(F1,F2)) GFSET Q
  621.  S FT=$E(FT,0,FTL-1),F2=FT D:$S(F2="":0,'$D(^ZKR(F1,F2)):0,1:1) GFSET F I=0:0 S F2=$O(^ZKR(F1,F2)) Q:F2=""!($E(F2,0,FTL-1)'=FT)  D GFSET
  622.  Q
  623. GFSET S ^ZKRZ($J,"FILE",F1_"."_F2)="",CT=CT+1 Q
  624. GFX I '$D(^ZKRZ($J,"FILE")) S E=1,FSPEC="File(s) not found for "_FSPEC
  625.  E  S ^ZKRZ($J,"FILE")=CT W " --> ",CT," file",$S(CT=1:"",1:"s")," meet",$S(CT=1:"s",1:"")," the specification"
  626.  K FN,FT,FNW,FTW,FNL,FTL,F1,F2,I,CT Q
  627. GFILE ;
  628.  W !,"- File specification : " D READ S:"^>"[A E=1 Q:E  I A'?1.8UN1"."1.3UN,A'?1"%".7UN1"."1.3UN W *7," Enter a single file name, like TEST.DAT" G GFILE
  629.  S FILE=A
  630.  Q
  631. GROOT ;
  632.  K GRF S GRF=0 W !,"Enter global references, one at a time:",!
  633. GR1 W !,"Global ^" D READ Q:E  I "^>"[A S E=1 Q
  634.  I $E(A)="?" D GRH G GR1
  635.  D VERGRF I E W *7," [ syntax ]" G GR1
  636.  S GRF=GRF+1,GRF(GRF)=A K X1,X2 G GR1
  637.  Q
  638. GRH W ! F I=2:1 S X=$T(GRH+I) Q:$P(X," ")]""  W !?5,$P(X,";",2,99)
  639.  W ! Q
  640.  ;Enter a full global reference, including ending parentheses (if any).
  641.  ;For example:
  642.  ;
  643.  ; ^A   -- or --   ^A("ONE",2,"three")
  644.  ;
  645.  ;Each reference will be processed in the order in which you enter it.
  646.  ;It is possible to list the same subtree more than once in the list.
  647.  ;
  648.  ;Press <RETURN> to end the list.  To abort an incorrect list so that
  649.  ;it is not processed, press CTRL/C.
  650. GRT ;
  651.  W !,"Enter a global reference:",!
  652. GRT1 W !,"Global ^" D READ Q:E  I "^>"[A S E=1 Q
  653.  I $E(A)="?" D GRTH G GRT1
  654.  D VERGRF I E W *7," [ syntax ]" G GRT1
  655.  S GRF=1,GRF(1)=A Q
  656. GRTH W ! F I=2:1 S X=$T(GRTH+I) Q:$P(X," ")]""  W !?5,$P(X,";",2,99)
  657.  W ! Q
  658.  ;Enter a full global reference, including ending parentheses (if any).
  659.  ;For example:
  660.  ;
  661.  ; ^A   -- or --   ^A("ONE",2,"three")
  662.  ;
  663. READ U 0:("TR":0:"EP":0:"MR":80) ;** CCSM
  664.  R A:120 S E=$S(A="":0,"<#@"[$E(A):1,1:0)
  665.  ;S A=$ZU(A) ;** M/11 V5 (NYSCVM only)
  666.  S A=$TR(A,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") ;** M/11+ V1
  667.  ;Convert A to upper case ;** STD
  668.  Q
  669. VERGRF ;
  670.  S E=0 S:$E(A)'="^" A="^"_A S X1=$P(A,"("),X2=$P(A,"(",2,255) I $S(X1?1"^"1.8AN:0,X1?1"^%".7AN:0,1:1) S E=1 Q
  671.  I $S(X2=""&(A'["("):0,X2=""&(A'[")"):1,$E(X2,$L(X2))'=")":1,1:0) S E=1 Q
  672.  I X2]"" S X2=$E(X2,0,$L(X2)-1) F I=1:1:$L(X2,",") S X1=$P(X2,",",I) I $S(+X1=X1:0,$E(X1)=""""&($E(X1,$L(X1))=""""):0,1:1) S E=1 Q
  673.  Q
  674.  
  675. ZKRMUR
  676. ZKRMUR ;DGR NYSCVM ; 19 Apr 85  8:38
  677.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  678.  ;Kermit <--> MUMPS interface - utilities - pick a routine set
  679. RSET ;
  680. REF R !,"Refresh routine directory in ^UTILITY? No=> " D READ G REF:E,HELP2:$E(A)="?" I A?1"Y".E D ^%ROU ;** M/11 ;** M/11+ V1
  681.  ;** rebuild routine directory if appropriate ;** STD
  682.  K ^ZKRZ($J,"RSET") S RCT=0,SEL=1,E=0
  683. ROU R !,"Routine: " D READ G ROU:E I A="" W ! G XIT
  684.  I A["?" D @$S(A="?L":"DISP",1:"HELP") G ROU
  685.  S SEL=1 I A?1"'".E S SEL=0,A=$E(A,2,99)
  686.  I A?.E1"*" S A=$E(A,1,$L(A)-1),X=A S:X="" X=0 D SING,MULT G ROU
  687.  I A["-" D RANGE G ROU
  688.  D SING I E W *7," I don't have that routine on file"
  689.  G ROU
  690. SING S E=0 I A]"",$D(^UTILITY("ROU",A)) S X=A
  691.  E  S E=1 Q
  692. S I SEL,'$D(^ZKRZ($J,"RSET",X)) S ^(X)="",RCT=RCT+1 Q
  693.  I 'SEL,$D(^ZKRZ($J,"RSET",X)) K ^(X) S RCT=RCT-1
  694.  Q
  695. MULT S X=$O(^UTILITY("ROU",X)) Q:X=""!($E(X,1,$L(A))'=A)
  696.  D S G MULT
  697.  Q
  698. RANGE S X=$P(A,"-",1),Y=$P(A,"-",2) I X]Y W " ???" Q
  699.  I $D(^UTILITY("ROU",X)) D S
  700. R2 S X=$O(^UTILITY("ROU",X)) Q:X=""  Q:X]Y  D S G R2
  701.  Q
  702. XIT K A,X,Y,SEL S ^ZKRZ($J,"RSET",0)=RCT W RCT," routine",$S(RCT=1:" was",1:"s were")," selected",!
  703.  Q
  704. READ R A D UPPER S E=$S(A="":0,"^<>#@"[$E(A,1):1,1:0)
  705.  W:E " Can't do that here." Q
  706. HELP W !!,"Choose routines as in these examples:"
  707.  W !,"  RNAM",?18,"one routine"
  708.  W !,"  RNAM1-RNAM2",?18,"range of routines"
  709.  W !,"  CD*",?18,"all routines beginning with CD"
  710.  W !,"  *",?18,"all routines"
  711.  W !,"  'RNAM",?18,"exclude this routine from those already selected"
  712.  W !,"  'RNAM1-RNAM2",?18,"exclude this range of routines from those already selected"
  713.  W !,"  'CD*",?18,"exclude all routines beginning with CD from the routines",!?18,"already selected"
  714.  W !!,"Enter '?L' to get a list of routines selected so far"
  715.  W ! Q
  716. DISP W "  ",$S('RCT:"** no",1:RCT)," routine",$S(RCT=1:" has",1:"s have")," been selected thus far",$S('RCT:" **",1:":") I RCT S X=0,E=1 F Y=1:1 W ! F A=0:1:7 S X=$O(^ZKRZ($J,"RSET",X)) G:X="" DISP1 W ?(A*10),X
  717. DISP1 Q
  718. HELP2 W !,"It may take time (if there are a lot of routines), but it ensures that the",!,"routine directory is accurate." G REF
  719. UPPER ;Convert A to upper-case
  720.  ;S A=$ZU(A) ;** M/11 V5 (NYSCVM only)
  721.  S A=$TR(A,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") ;** M/11+ V1
  722.  ;Convert A to upper case characters ;** STD
  723.  Q
  724.  
  725. ZKRR
  726. ZKRR ;DGR NYSCVM ;22APR90 9:01AM
  727.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  728.  ;Kermit - receive files
  729.  S (TRY,OLDTRY,SPN)=0
  730.  S TRY=TRY+1 I TRY>MAXTRY G A
  731.  D RPACK I E D NAK G R
  732.  G A:RPT'="S"
  733. RI ;
  734.  S SPN=RPN D RPAR S SPT="Y",SDAT=$C(RPSIZ+32)_$C(STO+32)_"   "_SQA_SQB D SPACK,BUMP S OLDTRY=0 K F1,F2 G RF
  735. RF ;
  736.  S TRY=TRY+1 I TRY>MAXTRY G A
  737.  D RPACK I E D NAK G RF
  738.  G A:"SZFB"'[RPT,@("RF"_RPT)
  739. RFS S OLDTRY=OLDTRY+1 G A:OLDTRY>MAXTRY D PREV G A:SPN'=RPN,RI
  740. RFZ D PREV G A:SPN'=RPN D ACK G RF
  741. RFF ;
  742.  I SPN'=RPN D NAK G RF
  743.  S FILE=RDAT D FOPEN K FILE I E S SPT="E",SDAT=$E(E,2,99) D SPACK Q
  744.  I TTY U 0 W !,"Receiving file : ",F1,".",F2,"..." U TTY
  745.  S OLDTRY=TRY D ACK,BUMP G RD
  746. RFB I SPN'=RPN D NAK G RF
  747.  D ACK S E=0 Q
  748.  Q
  749. RD ;
  750.  S TRY=TRY+1 I TRY>MAXTRY G A
  751.  D RPACK I E D NAK G RD
  752.  G A:"DFZ"'[RPT,@("RD"_RPT)
  753. RDD I SPN'=RPN S OLDTRY=OLDTRY+1 G A:OLDTRY>MAXTRY D PREV G A:SPN'=RPN D ACK,BUMP G RD
  754.  D PDATA,ACK S OLDTRY=TRY D BUMP G RD
  755. RDF S OLDTRY=OLDTRY+1 G A:OLDTRY>MAXTRY D PREV G A:SPN'=RPN D ACK,BUMP G RD
  756. RDZ G A:SPN'=RPN S ^ZKR(F1,F2)=^ZKR(F1,F2)_B_$H_B_BCNT S H2=$H D EFBAUD K H1,H2,F1,F2,F3 D ACK,BUMP
  757.  D ULOCK
  758.  I TTY U 0 W "done" U TTY
  759.  G RF
  760.  Q
  761. A ;
  762.  I 'KAF,$D(F1),$D(F2),F1]"",F2]"",$D(^ZKR(F1,F2)),$P(^(F2),B,3)="" K ^(F2)
  763.  K F1,F2,F3,BCNT
  764.  I TTY U 0 W !,"Aborting RECEIVE operation" U TTY
  765.  S E=1 Q
  766. UTIL ;
  767. BUMP S TRY=0,SPN=SPN+1#64 Q
  768. PREV S SPN=SPN-1#64 Q
  769. NAK S SPT="N",SDAT="" D SPACK Q
  770. ACK S SPT="Y",SDAT="" D SPACK S TRY=0 Q
  771. SPACK G SPACK^ZKRUP
  772. RPACK I TTY,RPN#8=1 U 0 W "." U TTY
  773.  G RPACK^ZKRUP
  774. PDATA ;
  775.  S ^ZKR(F1,F2,F3)=RDAT,BCNT=BCNT+$L(RDAT),F3=F3+1
  776.  Q
  777. RPAR G RPAR^ZKRUM
  778. FOPEN ;
  779.  S E=0 I FILE'?.1"%"1.8UN1"."1.3UN S E="1 bad filespec" Q
  780.  S F1=$P(FILE,"."),F2=$P(FILE,".",2) I $D(^ZKR(F1,F2)),FW S E="1 file already defind" K F1,F2 Q
  781.  D WLOCK
  782.  K ^ZKR(F1,F2) S ^ZKR(F1,F2)=B_RQA_","_RQB_B_$H,H1=$H,EFB=-1,BCNT=0,F3=1
  783.  Q
  784. EFBAUD S EFB=BCNT*10\(H2-H1*86400+$P(H2,",",2)-$P(H1,",",2)) Q
  785. WLOCK L ^ZKR(FILE) Q
  786. ULOCK L  Q
  787.  
  788. ZKRS
  789. ZKRS ;DGR NYSCVM ;24APR90 6:40AM
  790.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  791.  ;Kermit - send a group of files
  792.  S (SPN,TRY)=0,RPT=""
  793. S ;
  794.  S TRY=TRY+1 I TRY>MAXTRY G A
  795.  S SPT="S",SDAT=$C(RPSIZ+32)_$C(STO+32)_"   "_SQA_SQB D SPACK,RACK E  G S:RPT'="E",RACKER
  796.  D RPAR,BUMP G NXTFIL
  797. SF ;
  798.  S TRY=TRY+1 I TRY>MAXTRY G A
  799.  S SPT="F",SDAT=FILE D SPACK,RACK E  G SF:RPT'="E",RACKER
  800.  D BUMP,BDATA G SD:SDAT]"",SZ
  801. SD ;
  802.  S TRY=TRY+1 I TRY>MAXTRY G A
  803.  S SPT="D" D SPACK,RACK E  G SD:RPT'="E",RACKER
  804.  D BUMP,BDATA G SD:SDAT]"",SZ
  805. SZ ;
  806.  S TRY=TRY+1 I TRY>MAXTRY G A
  807.  S SPT="Z",SDAT="" D SPACK,RACK E  G SZ:RPT'="E",RACKER
  808.  D ULOCK
  809.  S H2=$H D EFBAUD
  810.  I TTY U 0 W "done" U TTY
  811.  D BUMP G NXTFIL
  812. SB ;
  813.  S TRY=TRY+1 I TRY>MAXTRY G A
  814.  S SPT="B",SDAT="" D SPACK,RACK E  G SB:RPT'="E",RACKER
  815.  D BUMP S E=0 Q
  816. A ;
  817.  S E=1 Q
  818. NXTFIL ;
  819.  S:'$D(FILE) FILE="" S FILE=$O(^ZKRZ($J,"FILE",FILE)) I FILE="" G SB
  820.  D RLOCK
  821.  S F1=$P(FILE,"."),F2=$P(FILE,".",2),F3=$O(^ZKR(F1,F2,0)) G NXTFIL:F3="" S CL=^(F3),LL=$L(CL),CC=1,FQA=$P($P(^ZKR(F1,F2),B,2),","),FQB=$P($P(^(F2),B,2),",",2),BCNT=$P(^(F2),B,5),H1=$H,EFB=-1
  822.  I TTY U 0 W !,"Sending file : ",FILE,"..." U TTY
  823.  G SF
  824. RACKER ;
  825.  I TTY U 0 W !,"Error - ",RDAT," - transfer aborted" U TTY
  826.  S E=1 Q
  827. UTIL ;
  828. RACK D RPACK I $S(E:0,RPT'="Y":0,SPN'=RPN:0,1:1)
  829.  Q
  830. BUMP S TRY=0,SPN=SPN+1#64 Q
  831. SPACK I TTY,SPN#8=1 U 0 W "." U TTY
  832.  G SPACK^ZKRUP
  833. RPACK G RPACK^ZKRUP
  834. BDATA ;
  835.  S SDAT="" I F3="" Q
  836.  I CC>LL D BGLIN I F3="" Q
  837.  S NC=SPSIZ-7 ;I SQA'=FQA G BD2
  838.  G BD3
  839. BD1 S F=$F(CL,FQA,CC) G:F BD11 I LL-CC<NC S SDAT=SDAT_$E(CL,CC,LL),NC=NC-LL+CC+1 D BGLIN G:F3]"" BD1 Q
  840.  S X=CC+NC,SDAT=SDAT_$E(CL,CC,X-1),CC=X
  841.  Q
  842. BD11 S X=F-CC+1 I X'>NC S SDAT=SDAT_$E(CL,CC,F),NC=NC-X,CC=F+1 G BD1:NC Q
  843.  S X=CC+NC-1,SDAT=SDAT_$E(CL,CC,X-1),CC=X
  844.  Q
  845. BD2 S C=$E(CL,CC),CC=CC+1 I C="" D BGLIN G:F3]"" BD2 Q
  846.  I C=SQA S SDAT=SDAT_SQA_SQA,NC=NC-2 G:NC>0 BD2 Q
  847.  I C'=FQA S SDAT=SDAT_C,NC=NC-1 G:NC>0 BD2 Q
  848.  S C=$E(CL,CC),CC=CC+1 I C="" ABORT ; note by pkw - not a legal MUMPS statement - I don't know what this was meant to do
  849.  I C=FQA S SDAT=SDAT_FQA,NC=NC-1 G:NC>0 BD2 Q
  850.  S SDAT=SDAT_SQA_C,NC=NC-2 G:NC>0 BD2 Q
  851.  Q
  852. BGLIN S F3=$O(^ZKR(F1,F2,F3)) I F3]"" S CL=^(F3),LL=$L(CL),CC=1
  853.  Q
  854. BD3 S C=$E(CL,CC) I C="" D BGLIN G:F3]"" BD3 Q
  855.  I C=FQB,NC>2 D FQB G BD3 
  856.  I C=FQB,NC<3 Q
  857.  I C=FQA,NC>1 D FQA G BD3
  858.  I C=FQA,NC<2 Q
  859.  S SDAT=SDAT_C,CC=CC+1,NC=NC-1 G:NC>0 BD3 Q
  860. FQB S CC=CC+1,SDAT=SDAT_SQB,NC=NC-1 Q
  861. FQA S CC=CC+1,SDAT=SDAT_SQA,NC=NC-1 Q
  862. RPAR G RPAR^ZKRUM
  863. EFBAUD S EFB=BCNT*10\(H2-H1*86400+$P(H2,",",2)-$P(H1,",",2)) Q
  864. RLOCK L ^ZKR(FILE,$J) Q
  865. ULOCK L  Q
  866.  
  867. ZKRSET
  868. ZKRSET ;DGR NYSCVM ;17APR90 7:32PM
  869.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  870.  ;Kermit - set Kermit parameters (SET command)
  871. SET ;
  872.  D @("S"_$E(CSS(2),1,3)) Q
  873. SABO S KAF=CMD(3)="KEEP" Q
  874. SBAU S BAUD=CMD(3) Q
  875. SDEB S DEBUG=CMD(3)="ON" Q
  876. SDEL S DELAY=CMD(3) Q
  877. SDUP S FDX=CMD(3)="FULL" Q
  878. SESC S CESC=$A(CMD(3),2)-64 Q
  879. SFIL S FW=CMD(3)="ON" Q
  880. SLIN I '$D(CMD(3)) C:TTY TTY S TTY=0 U 0 W " Ok - no line is assigned" Q
  881.  I $S(CMD(3)'?1.N:0,CMD(3)'<8&(CMD(3)'>47):1,1:0) S A=CMD(3) G SLIN1 ;** CCSM
  882.  I '$D(^ZKRX("LINE",CMD(3))) W !,"? No such line" Q
  883.  S A=+^(CMD(3))
  884. SLIN1 O A::0 E  W !,"? Can't get that line now" Q  ;** CCSM
  885.  ;Open the port if possible, else error message and QUIT ;** STD
  886.  S TTY=A W " Line ",TTY," is now assigned"
  887.  Q
  888. SPAR ;
  889.  I $E(CMD(3))="M" W !,"? Can't set MARK parity in CCSM" Q  ;** CCSM
  890.  I $E(CMD(3))="S" W !,"? Use NONE in CCSM" Q  ;** CCSM
  891.  S PAR=$E(CMD(3)) Q
  892. SPAU S PAUSE=CMD(3) Q
  893. SREC G @("SR1"_$E(CMD(3),1,3))
  894. SR1PAC S RPSIZ=CMD(4) Q
  895. SR1STA S RSOH=$A(CMD(4),2)-64 Q
  896. SR1TIM S RTO=CMD(4) Q
  897. SRET S MAXTRY=CMD(3)+1 Q
  898. SSEN G @("SS1"_$E(CMD(3),1,3))
  899. SS1END S SEOL=$A(CMD(4),2)-64 Q
  900. SS1PAC S SPSIZ=CMD(4) Q
  901. SS1QUO S SQA=CMD(4) Q
  902. SS1STA S SSOH=$A(CMD(4),2)-64 Q
  903. SS1TIM S STO=CMD(4) Q
  904. SS1QOB S SQB=CMD(4) Q
  905.  
  906. ZKRSRV
  907. ZKRSRV ;DGR NYSCVM  ; 03 MAR 84  3:47 PM
  908.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  909.  ;Kermit - Server executive
  910.  S SPN=0
  911. SRV ;
  912.  D RPACK I E D NAK G SRV
  913.  I "SRG"'[RPT D NAK G SRV
  914.  G @("SRV"_RPT)
  915. SRVS ;
  916.  D RI^ZKRR G SRV
  917. SRVR ;
  918.  S FN=$P(RDAT,"."),FT=$P(RDAT,".",2) I $S($L(FN)>8:1,$L(FT)>3:1,FN="":1,FT="":1,FN'?.1"%".8UN.1"*":1,FT'?.3UN.1"*":1,1:0) K FN,FT S SPT="E",SDAT="Illegal filespec : "_RDAT D SPACK G SRV
  919.  K FN,FT S FSPEC=RDAT D GETFIL K FSPEC I E S SPT="E",SDAT="No file(s) match "_RDAT D SPACK G SRV
  920.  D ^ZKRS G SRV
  921. SRVG ;
  922.  S C=$E(RDAT) I "LF"'[C S SDAT="Unrecognized 'Generic' command "_RDAT,SPT="E" D SPACK G SRV
  923.  G @("SRVG"_C)
  924. SRVGL D ACK U 0 W !,"Session terminated by local Kermit's BYE command" C:TTY'=$I TTY K  Q
  925. SRVGF D ACK U 0 W !,"Server shut down by local Kermit's FINISH command" G START^ZKR
  926. NAK S SPT="N",SDAT="" D SPACK Q
  927. ACK S SPT="Y",SDAT="" D SPACK S TRY=0 Q
  928. SPACK G SPACK^ZKRUP
  929. RPACK G RPACK^ZKRUP
  930. GETFIL D GETFIL^ZKRUM Q
  931.  
  932. ZKRT20
  933. ZKRT20 ;DGR NYSCVM  ;15APR90 6:22PM
  934.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  935.  ;Kermit - command parser
  936.  ;U 0:(RM:"":$C(27)) ;** M/11 V5 ;** M/11+ V1
  937.  U 0:("EP":0) ;** CCSM
  938.  ;Make sure 'Escape' is read with READ * ;** STD
  939.  D INIT
  940. RCOM W !
  941. RC1 W "Kermit-M>" F I=1:1:CI-1 W CMD(I)," "
  942.  I CI W CMD(CI) I CI=VI W " " S A=32
  943. RCS ;S LA=A R *A:600 G TO:'$T,CR:A=13,ESC:A=27,QM:A=63,DEL:A=127,CTRLU:A=21,CTRLC:A=3
  944.  S LA=A R *A:600 G TO:'$T,CR:A=13,ESC:A=27,QM:A=63,DEL:A=8,CTRLU:A=21,CTRLC:A=3
  945.  I A>96,A<123 S A=A-32
  946.  I A>32 S:LA=32!'LA&(A-40) CI=CI+1,CMD(CI)="" S C=$C(A),CMD(CI)=CMD(CI)_C
  947.  G RCS
  948. TO W !,"? No response for 10 minutes" D INIT G XIT
  949. CR ;
  950.  S:LA'=32 A=32 S E=0 F EI=VI+1:1:CI D VER I E D VERMSG,INIT G RCOM
  951.  S GI=VI D BCREF I $D(@CREF)#10=0 W !,"? Incomplete" D INIT G RCOM
  952. XIT ;
  953.  K CI,EI,GI,A,C,LA,QREF,CREF,GREF,KW,LSS,SS
  954.  ;U 0:(RM:"") ;** M/11 V5 ;** M/11+ V1
  955.  ;reset terminal protocol if necessary ;** STD
  956.  U 0:("EP":0:"EC":0)
  957.  Q
  958. ESC ;
  959.  I LA=32!'LA W *7 S A=LA G RCS
  960.  S E=0 F EI=VI+1:1:CI-1 D VER I E D VERMSG,INIT G RCOM
  961.  S EI=CI D VER I 'E G ESC1
  962.  I E=1 D VERMSG,INIT G RCOM
  963.  W *7 S A=LA G RCS
  964. ESC1 I CSS(VI)[CMD(VI) S X=$F(CSS(VI),CMD(VI)) W $E(CSS(VI),X,99)," " S CMD(VI)=CSS(VI)
  965.  S A=32 D BGREF G:$D(@GREF)#10=0 RCS S X=$P(CMD(VI)," ")_" ("_(@GREF)_")",X=$E(X,$F(X,CMD(VI)),255),CMD(VI)=CMD(VI)_X W $S($E(X)=" ":$E(X,2,255),1:X)," " G RCS
  966. QM ;
  967.  S E=0 F EI=VI+1:1:CI-1 D VER I E D VERMSG,INIT G QMX
  968.  I LA=32,CI S EI=CI D VER I E D VERMSG,INIT G QMX
  969.  D BQREF I $D(@(QREF_",1)")) F I=1:1 G QMX:'$D(@(QREF_","_I_")")) W !?3,@(QREF_","_I_")")
  970.  K KW S KW=0,LSS=$S('LA:"",LA=32:"",1:CMD(CI)),SS=LSS S GI=VI D BCREF I VI,SS]"",$D(@CREF@(SS)) S KW=1,KW(1)=SS
  971.  F I=1:1 S SS=$O(@CREF@(SS)) Q:SS=""  Q:$E(SS,0,$L(LSS))'=LSS  S KW=KW+1,KW(KW)=SS
  972.  I VI,LSS="",$D(@CREF)#10 W "  confirm with carriage return" G QMX:'KW W !,"   or, enter"
  973.  I KW W " one of the following:",! S X=2 F I=1:1:KW S L=$L(KW(I))+1 X $S(L+X>RM:"W ! S X=2",1:"") W ?X,KW(I) S X=L\10+1*10+X
  974.  E  W " confirm with carriage return"
  975. QMX K QREF,CREF,KW,LSS,SS,EI,GI,X,L S A=LA G RCOM
  976. DEL S A=32 G RCS:'CI I LA=32 S:VI VI=VI-1 S A=$A($E(CMD(CI)),$L(CMD(CI))) W RO G RCS
  977.  S CMD(CI)=$E(CMD(CI),0,$L(CMD(CI))-1) I '$L(CMD(CI)) K CMD(CI) S:CI CI=CI-1,A=32 W RO G RCS
  978.  S A=$A($E(CMD(CI)),$L(CMD(CI))) W RO G RCS
  979. CTRLU W *13,$J("",$X),$C(13) D INIT G RC1
  980. CTRLC D INIT Q
  981. INIT K CMD,CSS S (CI,VI,E,A)=0,CMD(CI)="" Q
  982. VER G VER^ZKRT20A
  983. BCREF S CREF="^ZKRX(""COMMAND""" F I=1:1:GI S CREF=CREF_","""_CSS(I)_""""
  984.  S CREF=CREF_")" Q
  985. BQREF S QREF="^ZKRX(""?""" F I=1:1:VI S QREF=QREF_","""_CSS(I)_""""
  986.  Q
  987. BGREF S GREF="^ZKRX(""GUIDE""" F I=1:1:VI S GREF=GREF_","""_CSS(I)_""""
  988.  S GREF=GREF_")" Q
  989. VERMSG G VERMSG^ZKRT20A
  990.  
  991. ZKRT20A
  992. ZKRT20A ;DGR NYSCVM  ;15APR90 6:29PM
  993.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  994.  ;Kermit - command parser - overflow
  995. VER S E=0 Q:CMD(EI)=""  S GI=EI-1 D BCREF S A=$P(CMD(EI)," "),SS=$O(@CREF@("~")) I $E(SS)="~" D @("V"_$E(SS,2,9)) S:'E VI=EI,CSS(EI)=SS Q
  996.  I $D(@CREF@(A)) S VI=EI,CSS(EI)=A Q
  997.  S SS=A F I=1:1 S LSS=SS,SS=$O(@CREF@(SS)) Q:SS=""!($E(SS,1,$L(A))'=A)
  998.  I I=2 S VI=EI,CSS(EI)=LSS Q
  999.  S E=$S(I=1:1,1:2) Q
  1000. VERMSG W " ",$S(E=1:"? Does not match switch or keyword",E=2:"? Ambiguous",1:"") Q
  1001. VCTRL I A'?1"^".1UP!($A(A,2)>95!($A(A,2)<65)) W !,"? Enter a control character like '^A' or '^]'" S E=3
  1002.  Q
  1003. VFSPEC I A'?1.8UN1"."1.3UN,A'?1"%".7UN1"."1.3UN W !,"? Illegal file spec" S E=3
  1004.  Q
  1005. VFSPECW S FN=$P(A,"."),FT=$P(A,".",2) I $S($L(FN)>8:1,$L(FT)>3:1,FN="":1,FT="":1,FN'?.1"%".8UN.1"*":1,FT'?.3UN.1"*":1,1:0) W !,"? Illegal file spec" S E=3
  1006.  K FN,FT,X Q
  1007. VPLEN I +A'=A!(A<10)!(A>94) W !,"? packet length from 10 thru 94" S E=3
  1008.  Q
  1009. VQUOTE S A=$A(A) I $S(A<33:1,A>126:1,A>62&(A<96):1,1:0) W !,"? a character from '!' -> '>' or '`' -> '~'" S E=3
  1010.  E  S A=$C(A)
  1011.  Q
  1012. VRFSPEC Q
  1013. VSEC I +A'=A!(A<0) W !,"? Illegal number of seconds" S E=3
  1014.  Q
  1015. VTRY I +A\1'=A!(A<0) W !,"? retries, 0 or more" S E=3
  1016.  Q
  1017. VTTY I $S(A'?1.N:0,A>7!(A<48):1,1:0) Q  ;** CCSM PORTS 8-47 
  1018.  I '$D(^ZKRX("LINE",A)) W !,"? No such line" S E=3
  1019.  Q
  1020. BCREF S CREF="^ZKRX(""COMMAND""" F I=1:1:GI S CREF=CREF_","""_CSS(I)_""""
  1021.  S CREF=CREF_")" Q
  1022.  
  1023. ZKRTC
  1024. ZKRTC ;PKW ;15APR90 3:29PM
  1025.  ;Kermit - Set Terminal Characteristics 
  1026.  ;** CCSM -- entire routine
  1027.  U 0 S %DV=$S(TTY:TTY,1:$I) D CN G:POP XIT D GET
  1028.  I $D(PAR) S %A=PAR D CP G:POP XIT
  1029.  I $D(BAUD) S %A=BAUD D CS G:POP XIT
  1030.  D SET C %DV O %DV U %DV,0 
  1031. XIT ;
  1032.  K %A,%I,%DV,%O,%PAR,%S,%P,%SPD,%WL
  1033.  Q
  1034. GET S %S="110,19200,300,600,1200,2400,4800,9600" 
  1035.  F %I=0:1:7 S %S($P(%S,",",%I+1))=%I
  1036.  S %P="N,O,E" F %I=0:1:2 S %P($P(%P,",",%I+1))=%I
  1037.  Q
  1038. SET ;O %DV:("BK":1:"MR":0,"BR":%SPD,"PA":0,"WL":3,"SB":0,"XO":0,"TR":1:"EC":1) 
  1039.  I $D(BAUD) O %DV:("BR":%SPD:"BK":1:"EC":1:"SB":0:"MR":0:"XO":0:"TR":1)
  1040.  I $D(PAR) O %DV:("PA":%PAR:"BK":1:"EC":1:"SB":0:"MR":0:"XO":0:"WL":%WL:"TR":1)
  1041.  S POP=0
  1042.  Q
  1043. CN ; check number of port
  1044.  S POP=%DV<8!(%DV>47) Q  ; allowable serial ports
  1045. CS ; check speed
  1046.  S POP='$D(%S(%A)) S:'POP %SPD=%S(%A) Q
  1047. CP ; check parity, adjust word length
  1048.  S POP='$D(%P(%A)) S:'POP %PAR=%P(%A),%WL=$S(%A="N":3,1:2) Q
  1049.  
  1050. ZKRUM
  1051. ZKRUM ;DGR NYSCVM  ;22APR90 11:11AM
  1052.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  1053.  ;Kermit - utility parts - miscellanous
  1054. RPAR ;
  1055.  S X=$A(RDAT)-32 I X<SPSIZ S SPSIZ=X
  1056.  S RTO=$A(RDAT,2)-32,SPADN=$A(RDAT,3)-32,SPAD=$A(RDAT,4) S SPAD=$S(SPAD=63:127,1:SPAD-64)
  1057.  S SEOL=$A(RDAT,5)-32 I SEOL<1 S SEOL=13
  1058.  S RQA=$E(RDAT,6) S:RQA=" "!(RQA="") RQA="#"
  1059.  S RQB=$E(RDAT,7) S:RQB=" "!(RQB="") RQB="&"
  1060.  Q
  1061. GETFIL ;
  1062.  K ^ZKRZ($J,"FILE") S E=0,FN=$P(FSPEC,"."),FT=$P(FSPEC,".",2)
  1063.  S FNL=$L(FN),FTL=$L(FT),FNW=$E(FN,FNL)="*",FTW=$E(FT,FTL)="*"
  1064.  I 'FNW S F1=FN D GF2 G GFX
  1065.  S FN=$E(FN,0,FNL-1),F1=FN D:$S(F1="":0,'$D(^ZKR(F1)):0,1:1) GF2 F I=0:0 S F1=$O(^ZKR(F1)) Q:F1=""!($E(F1,0,FNL-1)'=FN)  D GF2
  1066.  G GFX
  1067. GF2 I 'FTW S F2=FT D:$D(^ZKR(F1,F2)) GFSET Q
  1068.  S FT=$E(FT,0,FTL-1),F2=FT D:$S(F2="":0,'$D(^ZKR(F1,F2)):0,1:1) GFSET F I=0:0 S F2=$O(^ZKR(F1,F2)) Q:F2=""!($E(F2,0,FTL-1)'=FT)  D GFSET
  1069.  Q
  1070. GFSET S ^ZKRZ($J,"FILE",F1_"."_F2)="" Q
  1071. GFX I '$D(^ZKRZ($J,"FILE")) S E=1,FSPEC="File(s) not found for "_FSPEC
  1072.  K FN,FT,FNW,FTW,FNL,FTL,F1,F2,I Q
  1073. INITPAR ;
  1074.  S TTY=0,FDX=1,RPSIZ=94,SPSIZ=94,RTO=16,STO=5
  1075.  S MAXTRY=3,DELAY=5,PAUSE=0
  1076.  S (SSOH,RSOH)=1,SEOL=13,(SPADN,SPAD)=0
  1077.  S SQA="#",SQB="&"
  1078.  S CESC=25,PAR="N",BAUD=2400
  1079.  S KAF=0,FW=0
  1080.  S DEBUG=0
  1081.  S (SPN,RPN)=0
  1082.  S (BCNT,EFB)=0
  1083.  Q
  1084. SHOW ;
  1085.  W !!,"This is Kermit-M Version ",^ZKRX("VERSION")
  1086.  W !,"Line assigned : ",$S(TTY:TTY,1:"local terminal")," ; we are ",$S(TTY:"local",1:"remote")
  1087.  W !,"Connections are ",$S(FDX:"full",1:"half")," duplex, ",$S(PAR="N":"no",PAR="E":"even",PAR="O":"odd",PAR="M":"mark",PAR="S":"space")," parity, ",BAUD," baud"
  1088.  W !,"We will receive packets of at most ",RPSIZ," characters"
  1089.  W !,"We will send packets of at most ",SPSIZ," characters"
  1090.  W !,"Maximum number of tries is ",MAXTRY," ; receiver timeout after ",RTO," seconds"
  1091.  W !,"Delay ",DELAY," seconds before sending the first 'send intialize' packet"
  1092.  W !,"Pause ",PAUSE," seconds before sending each packet"
  1093.  W !,"We send CTRL/",$C(SSOH+64)," as a packet header, and expect CTRL/",$C(RSOH+64)
  1094.  W !,"We send CTRL/",$C(SEOL+64)," at the end of each packet; we do not require a packet terminator"
  1095.  W !,"Our 'escape' character for remote connection is CTRL/",$C(CESC+64)
  1096.  W !,"Partially-received files are ",$S(KAF:"kept",1:"discarded")," if transmission is aborted"
  1097.  W !,"The file-warning flag is ",$S(FW:"on",1:"off")
  1098.  W !,"We quote control characters with ",SQA," when sending files"
  1099.  W !,"We quote binary characters (above 127 decimal) with ",SQB," when sending files"
  1100.  W ! Q
  1101.  
  1102. ZKRUP
  1103. ZKRUP ;DGR NYSCVM ;14APR90 10:33AM
  1104.  ;Copyright (c) 1984 New York State College of Veterinary Medicine
  1105.  ;Kermit - utility parts - packets
  1106. SPACK ;
  1107.  U TTY I PAUSE H PAUSE
  1108.  F I=1:1:SPADN W *SPAD
  1109.  S CHKSUM=$L(SDAT)+67+SPN+$A(SPT) F I=1:1:$L(SDAT) S CHKSUM=CHKSUM+$A(SDAT,I)
  1110.  S CHKSUM=CHKSUM\64#4+CHKSUM#64
  1111.  S A=$C(SSOH)_$C($L(SDAT)+35)_$C(SPN+32)_SPT_SDAT_$C(CHKSUM+32)_$C(SEOL)
  1112.  I TTY,DEBUG U 0 W !,"Sending packet #",SPN," of type ",SPT," ; Data: ^"_$C($A(A)+64)_$E(A,2,255) U TTY
  1113.  W A Q
  1114. RPACK ;U 5 W "IN RPACK, RTO=",RTO,! U TTY
  1115.  U TTY
  1116.  S E=0 F I=0:0 R *A:RTO G RTO:'$T Q:A=RSOH
  1117.  R *A:RTO G RTO:'$T,RPACK:A=RSOH S RPLEN=A-32,CHKSUM=A
  1118.  R A#RPLEN:RTO G RTO:'$T 
  1119.  S RPN=$A(A)-32,RPT=$E(A,2),CHKSUM=CHKSUM+$A(A)+$A(A,2)
  1120.  S RDAT=$E(A,3,RPLEN-1) F I=3:1:RPLEN-1 S CHKSUM=CHKSUM+$A(A,I)
  1121.  S CHKSUM=CHKSUM\64#4+CHKSUM#64 I CHKSUM'=($A(A,RPLEN)-32) S E=1
  1122.  I DEBUG,TTY U 0 W !,"Received packet # ",RPN," of type ",RPT," ; Data : ",RDAT," ; Checksum : ",$A(A,RPLEN)-32 W:E !,"** Checksum error - wanted ",CHKSUM U TTY
  1123.  ;U 5 W !,"Received packet # ",RPN," of type ",RPT," ; Data : ",RDAT," ; Checksum : ",$A(A,RPLEN)-32,! W:E "** Checksum error - wanted ",CHKSUM,! U TTY
  1124.  Q
  1125. RTO ;U 5 W "IN RTO",! U TTY
  1126.  S E=1 Q:'DEBUG!'TTY  U 0 W !,"(receiver timed out)" U TTY Q
  1127.  
  1128. ZKRZ
  1129. ZKRZ ;JDG NYSCVM  ; 20 APR 84  11:38
  1130.  ;Kermit Maintenance Utilties
  1131. CHRCHG ;Change a character throughout ^ZKRX (incl. subscripts)
  1132.  S REF="^YGT2",L=0,CHR="~",NCHR="|",NRF="^ZKRX"
  1133.  S L=0,REF(L)=REF
  1134. DOWN S L=L+1,R(L)=""
  1135. ACROSS S R(L)=$O(@REF(L-1)@(R(L))) I R(L)="" S L=L-1 Q
  1136.  S REF(L)=REF_"("""_R(1)_""""
  1137.  F I=2:1:L S REF(L)=REF(L)_","""_R(I)_""""
  1138.  S REF(L)=REF(L)_")"
  1139.  D DOWN:$D(@REF(L))\10
  1140.  I $D(@REF(L))#10 D NSET W "." ;S @NREF=@REF(L) K @REF(L)
  1141.  G ACROSS
  1142. NSET S NREF=NRF_"("
  1143.  S I=1 D REPL S NREF=NREF_""""_NR_""""
  1144.  F I=2:1:L D REPL S NREF=NREF_","""_NR_""""
  1145.  S NREF=NREF_")"
  1146.  Q
  1147. REPL S NR=R(I)
  1148.  F II=1:0 Q:NR'[CHR  S NR=$P(NR,CHR,1)_NCHR_$P(NR,CHR,2,999)
  1149.  Q
  1150.  
  1151. %ROU
  1152. %ROU ;PKW,%ROU,,;24MAR90 6:36PM;REFRESHES ^UTILITY("ROU".;
  1153.  S ZGD=$ZGD,ZG=$ZG,$ZGD=$ZRD,$ZG=$ZR
  1154.  S A="^%"
  1155.  F  S A=$O(@A) Q:A=""  S $ZG=ZG,$ZGD=ZGD,^UTILITY("ROU",A)="",$ZG=$ZR,$ZGD=$ZRD,A="^"_A
  1156.  S A="^A"
  1157.  F  S A=$O(@A) Q:A=""  S $ZG=ZG,$ZGD=ZGD,^UTILITY("ROU",A)="",$ZG=$ZR,$ZGD=$ZRD,A="^"_A
  1158.  S $ZGD=ZGD,$ZG=ZG
  1159.  Q
  1160.  
  1161. %GI
  1162. %GI ;PKW,%GI,,;11MAR90 6:10PM;GLOBAL INPUT;
  1163.  ;reads ascii files prepared by %GD
  1164.  N %,%DEV,%T,%TGD,%SAVE,%F,DG,DGD,%X,%Y
  1165.  S %SAVE=$ZG_$ZGD,$ZT="FILERR"
  1166.  S %T=$ZG,%TGD=$ZGD,DG="%T",DGD="%TGD" 
  1167.  W !!,"Restore globals saved with %GD utility to - ",! D ^%RD
  1168.  S $ZG=%T,$ZGD=%TGD
  1169.  R !,"Using device [6] // ",%DEV
  1170.  S %DEV=$S(%DEV=5:5,1:6)
  1171. NAME R !,"[PATH:]FILE NAME : ",%F I %F="" G CLEANUP
  1172.  C %DEV
  1173.  O %DEV:("FN":%F:"FA":0)
  1174.  U %DEV S $ZDS=0
  1175.  R %X,%Y
  1176.  Q:$ZIO\256=36
  1177.  U 0 W !,%X,!,%Y,!
  1178.  R "Continue with restore (Y/N)? [Y] // ",%#1 S %=$S(%="N"!(%="n"):1,1:0) I % G CLEANUP
  1179.  C %DEV
  1180.  J GI2(%F,%DEV)::5 E  U 0 W "UNABLE TO START BACKGROUND JOB!",! H 2 Q
  1181.  G NAME
  1182. CLEANUP C %DEV U 0
  1183.  S $ZT="",$ZG=$E(%SAVE),$ZGD=$E(%SAVE,2)
  1184.  Q
  1185. FILERR W $ZE,! G CLEANUP
  1186. GI2 (FILENAME,DEV)
  1187.  S $ZT="^%ER"
  1188.  O DEV:("FN":FILENAME:"FA":0)
  1189.  U DEV S $ZDS=0
  1190.  R %X,%Y
  1191.  U DEV F  R %X,%Y Q:$ZIO\256=36  S @%X=%Y
  1192.  Q
  1193.  
  1194.  
  1195.