home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / archives / unisysaseries.zip / uasker.alg next >
Text File  |  1990-07-13  |  332KB  |  3,834 lines

  1.  $SET INSTALLATION 1-500                                                00100000037
  2.  $VERSION 1.040              % [DS] 02-89                               00101000040
  3.  $SET ASCII                 %  BURROUGHS USES 8 BITS FOR ASCII          00102000
  4. BEGIN                                                                   00103000
  5. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%       01000000
  6. %                                                                       01001000
  7. %  K E R M I T  File Transfer Utility                                   01002000
  8. %                                                                       01003000
  9. %  Burroughs 7800, University of California at Davis, 1986              01004000
  10. %    Larry Johnson, Dave Squire, Katie Stevens                          01005000
  11. %                                                                       01006000
  12. %                                                                       01007000
  13. %%%%% REVISIONS                                                         01008000
  14. %       1.017 [KS] 1-86                                                 01170000
  15. %                  ENABLED REPEAT PROCESSING                            01171000
  16. %                  ELIMINATE BLANK RECORD ADDED TO END OF RCV FILES     01172000
  17. %       1.018 [KS] 3-86                                                 01180000
  18. %                  FIXED PACKET # BUG CAUSED BY DUP VARIABLE NAMES      01181000
  19. %       1.019 [KS] 4-86                                                 01190000
  20. %                  FIXED RE-TRY BUG IN SENDSW/SBREAK                    01191000
  21. %                  OVERHAULED HELP PROCEDURES                           01192000
  22. %                  ENABLED 8-TH BIT QUOTING                             01193000
  23. %                  ENABLED VARIABLE START-OF-PACKET CHAR                01194000
  24. %                  FIXED SERVER-SPAR RETRY BUG IN RECSW/RFILE           01195000
  25. %       1.020 [KS] 7-86                                                 01200000
  26. %                  FIXED EXTRA CHARS WITH RETRY IN RECSW/RDATA          01201000
  27. %       1.021 [KS] 5-87                                                 01210000
  28. %                  FIXED BUG WHEN LAST CHAR IN PKT IS A REPT CHAR       01211000
  29. %                  FIXED BUG WHEN CONSECUTIVE BLANK LINES SET OFF REPT  01212000
  30. %                     COUNT PROCESSING                                  01213000
  31. %       1.022 [KS] 5-87                                                 01220000
  32. %                  FIXED GETFILETITLE TO STRIP (USERCODE) PREFIXES      01221000
  33. %       1.023 [DS] 11-87                                                01230000
  34. %                  CHANGED PROMPTS,GET MACHINE FROM TIME(24)            01231000
  35. %       1.024 [DS] 09-88                                                0124000001.040.024
  36. %                  FIRST STEP OF A GENERAL UPGRADE OF KERMIT            0124100001.040.024
  37. %                  RPACK AND SPACK REWRITTEN TO IMPROVE                 0124200001.040.024
  38. %                  EFFICIENCY AND REDUCE INIT-PBIT'S.                   0124300001.040.024
  39. %                  FIX BUG IN RINIT THAT PREVENTED MULTIPLE             0124400001.040.024
  40. %                  RECEIVES.                                            0124500001.040.024
  41. %       1.025 [DS] 10-88                                                0125000001.040.025
  42. %                  MAKE SPAR AND RPAR EASIER TO UNDERSTAND AND          0125100001.040.025
  43. %                  EASIER TO MODIFY                                     0125200001.040.025
  44. %       1.026 [DS] 11-88                                                0126000001.040.026
  45. %                  MINOR CHANGE TO REDUCE INIT-PBITS.                   0126100001.040.026
  46. %                  ALSO FIX SEG ARRAY ERROR IN SCANIT                   0126200001.040.026
  47. %       1.027 [DS] 11-88                                                0127000001.040.027
  48. %                  ADD BLOCK CHECK TYPES 2 AND 3.                       0127100001.040.027
  49. %       1.028 [DS] 11-88                                                0128000001.040.028
  50. %                  FIX MESSAGE AND BUG OUTPUT ROUTINES.                 0128100001.040.028
  51. %       1.029 [DS] 11-88                                                0129000001.040.029
  52. %                  IMPLEMENT OPTIONAL LONG PACKETS.                     0129100001.040.029
  53. %       1.030 [DS] 11-88                                                0130000001.040.030
  54. %                  IMPLEMENTING THE TAKE COMMAND, AND KERMIT            0130100001.040.030
  55. %                  INIT FILE                                            0130200001.040.030
  56. %       1.031 [DS] 11-88                                                0131000001.040.031
  57. %                  CHANGE THE PARAMETER TO HELPER TO AN ARRAY.          0131100001.040.031
  58. %                  THIS IS REALLY A MATTER OF AESTHETICS.               0131200001.040.031
  59. %       1.032 [DS] 11-88                                                0132000001.040.032
  60. %                  CHANGE SEND AND PROCESSIT SO THAT WE CAN SEND        0132100001.040.032
  61. %                  SEVERAL FILES WITH 1 SEND COMMAND. GETFILETITLE      0132200001.040.032
  62. %                  SAVES THE EXTRA TITLES AND ANOTHERFILETITLE          0132300001.040.032
  63. %                  RETRIEVES THEM.                                      0132400001.040.032
  64. %       1.033 [DS] 11-88                                                0133000001.040.033
  65. %                  CHANGE TO SEND. PACKETS THAT NEED TO BE RESENT       0133100001.040.033
  66. %                  WILL BE RESENT RATHER THAT RECONSTRUCTED. SEND'S     0133200001.040.033
  67. %                  MAINLINE WILL BE USED ONLY TO CHANGE STATES.         0133300001.040.033
  68. %       1.034 [DS] 11-88                                                0134000001.040.034
  69. %                  REWRITING GETC AND BUFILL TO IMPROVE EFFICIENCY.     0134100001.040.034
  70. %                  GETC IS NOW CALLED GETCHARS.                         0134200001.040.034
  71. %       1.035 [DS] 11-88                                                0135000001.040.035
  72. %                  REWRITING BUFEMP AND PUTC TO BE MORE EFFICIENT.      0135100001.040.035
  73. %                  ADDING PUTCHARS.                                     0135200001.040.035
  74. %       1.036 [DS] 12-88                                                0136000001.040.036
  75. %                  CONVERT ALL DATA TO/FROM KERMIT PACKET FORM, NOT     0136100001.040.036
  76. %                  JUST DATA FOR 'D' PACKETS.                           0136200001.040.036
  77. %       1.037 [DS] 12-88                                                0137000001.040.037
  78. %                  FIX TO RFILE TO ALLOW USERS TO SPECIFY UNISYS        0137100001.040.037
  79. %                  STYLE FILENAME FOR FILE RECEIVED.                    0137200001.040.037
  80. %       1.038 [DS] 12-88                                                0138000001.040.038
  81. %                  ALLOW USE OF ACTUAL FILE TITLE IN SENDS RATHER       0138100001.040.038
  82. %                  THAN TRYING TO MAKE AN MS-DOS TITLE.  ALLOWS         0138200001.040.038
  83. %                  ATTEMPTED USE OF ACTUAL TITLE IN RECEIVES RATHER     0138300001.040.038
  84. %                  THAN TRYING TO MAKE A UNISYS TITLE.                  01384000
  85. %       1.039 [DS] 02-89                                                0139000001.040.039
  86. %                  IT SEEMS THAT UNPACKDATA/BUFEMP DIDN'T HANDLE        0139100001.040.039
  87. %                  NULLS CORRECTLY. IN FACT IT WAS RATHER UGLY.         0139200001.040.039
  88. %                  THIS PATCH FIXES THE PROBLEM.                        0139300001.040.039
  89. %       1.040 [DS] 02-89                                                0140000001.040.040
  90. %                  SENDING RAW REQUIRED SET FILE FIXED.  THIS SEEMS     0140100001.040.040
  91. %                  A LITTLE UNWEILDY, SO IT HAS BEEN CHANGED.           0140200001.040.040
  92. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     01990000
  93.                                                                         01991000
  94.  % SYMBOL DEFINITIONS                                                   02000000
  95.                                                                         02001000
  96. DEFINE ABSOLUTEMAXPACKSIZE=3018#,%SYSTEM LIMITATION                     0200200001.040.029
  97.        MAXPACKSIZ     = 2000#,  % SITE DEPENDENT                        0200210001.040.029
  98.        SHORTPACKSIZ   =  94#,   % IF THE OTHER SIDE CANT DO LONG PACKETS0200220001.040.029
  99.        DEFLONGPACKSIZ = 500#,   % IF LONG PACKETS OK BUT NO LENGTH      0200230001.040.029
  100.        MAXPACKWDS     = (ABSOLUTEMAXPACKSIZE DIV 6)#,                   0200300001.040.029
  101.        MAXSENDFILESIZ =  11#,   % LARGEST FILE NAME I SHOULD SEND       02004000
  102.        MAXREPT        =  94#,   % LARGEST REPEAT COUNT (126-32)         02005000
  103.        EOF            = 4"201"#,% EOF FOR BUFILL                        02006000
  104.        NULC           = 48"00"#,% ASCII NULL CHARACTER                  02007000
  105.        DEFSOH         =   1#,   % [1.019] START OF HEADER               02008000
  106. %      SOHC           = 48"01"#,% SOH CHARACTER                         02009000
  107.        ETXC           = 48"03"#,% ETX CHARACTER                         02010000
  108.        BEL            =   7#,   % ASCII BELL                            02011000
  109.        HT             =   9#,   % ASCII HORIZONTAL TAB                  02012000
  110.        LF             =  10#,   % ASCII LINE FEED                       02013000
  111.        NL             =  LF#,   % NEWLINE CHARACTER                     02014000
  112.        CR             =  13#,   % ASCII CARRIAGE RETURN                 02015000
  113.        SP             =  32#,   % ASCII SPACE                           02016000
  114.        DEL            = 127#,   % ASCII DELETE (RUBOUT)                 02017000
  115.                                                                         02018000
  116.        REPTTHRESH     =   3#,   % CHARACTER REPEAT THRESHOLD            0201900001.040.034
  117.        DEFINITRETRY   =  20#,   % TIMES TO RETRY INITIALIZATION         02020000
  118.        DEFPACKETRETRY =  10#,   % TIMES TO RETRY A PACKET               02021000
  119.        TABLEN         =   8#,   % LENGTH OF A TAB IF EXPANDED           02022000
  120.        DEFRECSIZE     =  15#,   % MAXRECSIZE IN WORDS OF RECEIVED FILE  02023000
  121.        DEFBLOCKSIZE   = 420#,   % BLOCKSIZE IN WORDS OF RECEIVED FILE   02024000
  122.        DEFUNITS       = VALUE(WORDS)#, % UNITS OF RECEIVED FILE         02025000
  123.        DEFPAD         =   0#,   % DEFAULT # OF PADDING CHARACTERS       02026000
  124.        DEFPCHAR       =   0#,   % DEFAULT PADDING CHARACTER             02027000
  125.        DEFEOL         =  CR#,   % DEFAULT END OF LINE CHAR FOR BURROUGHS02028000
  126.        DEFQUOTE       = "#"#,   % DEFAULT QUOTE CHARACTER               02029000
  127.        DEFQBIN        = "&"#,   % DEFAULT BINARY QUOTE CHARACTER        02030000
  128.        DEFREPT        = "~"#,   % DEFAULT REPEAT CHARACTER              02032000
  129.        DEFPAUSE       =   0#,   % DEFAULT PAUSE BEFORE ACK              02033000
  130.        DEFDELAY       =   5#,   % DEFAULT DELAY FOR FIRST SEND          02034000
  131.        DEFESCCHR      = "^"#,   % DEFAULT ESCAPE CHARACTER FOR CONNECT  02035000
  132.        DEFTIME        =   5#,   % DEFAULT TIMEOUT INTERVAL              02036000
  133.        MAXTIM         =  60#,   % MAXIMUM TIMEOUT INTERVAL              02037000
  134.        MINTIM         =   2#    % MINUMUM TIMEOUT INTERVAL              0203800001.040.027
  135.       ,CSTYPE1        = 1#                                              0203900001.040.027
  136.       ,CSTYPE2        = 2#                                              0204000001.040.027
  137.       ,CSTYPE3        = 3#                                              0204100001.040.027
  138.       ,DEFCHKTYPE     = CSTYPE1#% DEFAULT CHECKSUM TYPE                 0204200001.040.027
  139.       ,DEFWINDOWS     = 0#      % DEFAULT WINDOW SIZE (FOR NOW)         0204300001.040.029
  140.       ;                                                                 0207900001.040.027
  141.                                                                         02080000
  142.  % MACRO DEFINITIONS                                                    02081000
  143.                                                                         02082000
  144.  %                                                                      02083000
  145.  % TOCHAR: CONVERTS A CONTROL CHARACTER TO A PRINTABLE ONE BY ADDING A S02084000
  146.  %                                                                      02085000
  147.  % UNCHAR: UNDOES TOCHAR.                                               02086000
  148.  %                                                                      02087000
  149.  % CTL:    CONVERTS BETWEEN CONTROL CHARACTERS AND PRINTABLE CHARACTERS 02088000
  150.  %    TOGGLING THE CONTROL BIT (IE. ^A BECOMES A AND A BECOMES ^A).     02089000
  151.                                                                         02090000
  152. DEFINE TOCHAR(CH)     = ((CH) + 32)  #;                                 02091000
  153. DEFINE UNCHAR(CH)     = ((CH) - 32)  #;                                 02092000
  154. DEFINE CTL(CH)        = ((CH) & (1-(CH).[6:1])[6:1]) #;                 02093000
  155. DEFINE TONUM (CH)     = ((CH) + "0") #;                                 0209400001.040.027
  156. DEFINE UNNUM (CH)     = ((CH) - "0") #;                                 0209500001.040.027
  157.                                                                         0209600001.040.027
  158.  % GLOBAL VARIABLES                                                     02100000
  159.                                                                         02101000
  160. REAL                                                                    02102000
  161.         BSIZE,          % SIZE OF PRESENT DATA                          02103000
  162.         RPSIZ,          % MAXIMUM RECEIVE PACKET SIZE                   02104000
  163.         SPSIZ,          % MAXIMUM SEND PACKET SIZE                      02105000
  164.         TIMINT,         % TIMEOUT FOR FOREIGN HOST ON SENDS             02106000
  165.         PAD,            % HOW MUCH PADDING TO SEND                      02107000
  166.         PCHAR,          % PADDING CHARACTER TO SEND                     02108000
  167.         EOL,            % END-OF-LINE CHARACTER TO SEND                 02109000
  168.         SOHCHAR,        % [1.019] START-OF-PACKET CHAR TO SEND          02110000
  169.         QUOTE,          % QUOTE CHARACTER IN INCOMING DATA              02111000
  170.         QBIN,           % BINARY QUOTE CHARACTER IN INCOMING DATA       02112000
  171.         CHKTYPE,        % ERROR DETECTION TYPE IN INCOMING DATA         02113000
  172.         REPT,           % REPEAT CHARACTER IN INCOMING DATA             02114000
  173.         N,              % PACKET NUMBER                                 02115000
  174.         NUMTRY,         % TIMES THIS PACKET RETRIED                     02116000
  175.         OLDTRY          % TIMES PREVIOUS PACKET RETRIED                 0211700001.040.027
  176.        ,THECHKTYPE      % THE CHECKSUM AGREED UPON FOR FILE TRASFER     0211800001.040.027
  177.        ,MSGLEN          % NUMBER OF BYTES IN LAST PACKET SENT           0211900001.040.033
  178.        ;                                                                0214900001.040.033
  179. BOOLEAN                                                                 02200000
  180.         SERVER,         % MEANS WE'RE A KERMIT SERVER                   02201000
  181.         BINARYON,       % [1.019] MEANS 8-BIT QUOTING MODE ENABLED      02202000
  182.         HIBITOK,        % MEANS 8-BIT MODE IN ACTION                    02203000
  183.         REPTOK,         % [1.017] TRUE MEANS REPEAT ENCRIPTION OK       02205000
  184.         DEBUG,          % INDICATES LEVEL OF DEBUGGING OUTPUT (0=NONE)  02206000
  185.         EXPTABS,        % EXPAND TABS ON INPUT                          02207000
  186.         FIXEDRECS,      % SEND FIXEDRECS LENGTH RECORDS                 02208000
  187.         RAW,            % DONT USE NL AS RECORD SEPARATOR               02209000
  188.         KEEPFILE        % KEEP THE OUTPUT FILE                          0221000001.040.029
  189.        ,LONGPACKETSOK   % TRANSMIT LONG PACKETS                         0221100001.040.029
  190.        ,WINDOWING       % DO WINDOWING                                  0221200001.040.029
  191.        ,TAKING          % CURRENT COMMAND IS FROM A DISK FILE           0221300001.040.030
  192.        ,SENDACTUALTITLE % DON'T CONVERT TITLE SENT TO MS-DOS FORM       0221400001.040.038
  193.        ,RECACTUALTITLE  % DON'T CONVERT TITLE REC'D TO UNISYS FORM      0221500001.040.038
  194.        ;                                                                0224900001.040.029
  195. REAL                                                                    02300000
  196.         INITRETRY,      % NUMBER OF RETRIES ON INITIALIZATION           02301000
  197.         PACKETRETRY,    % NUMBER OF RETRIES FOR A DATA PACKET           02302000
  198.         FILERECSIZE,    % MAXRECSIZE OF RECEIVED FILE                   02303000
  199.         FILEBLOCKSIZE,  % BLOCKSIZE OF RECEIVED FILE                    02304000
  200.         FILEUNITS,      % UNITS OF RECEIVED FILE                        02305000
  201.         FILECOUNT,      % NUMBER OF FILES LEFT TO SEND                  02306000
  202.         STATE,          % PRESENT STATE OF THE AUTOMATON                02307000
  203.         MYPACKSIZ,      % MY MAXIMUM PACKET SIZE                        02308000
  204.         MYTIME,         % MY TIMEOUT INTERVAL                           02309000
  205.         MYPAD,          % MY NUMBER OF PADDING CHARACTERS               02310000
  206.         MYPCHAR,        % MY PADDING CHARACTER                          02311000
  207.         MYEOL,          % MY END OF LINE CHARACTER                      02312000
  208.         MYSOH,          % [1.019] MY START-OF-PACKET CHAR               02313000
  209.         MYQUOTE,        % MY QUOTE CHARACTER                            02314000
  210.         MYQBIN,         % MY BINARY QUOTE CHARACTER                     02315000
  211.         MYCHKTYPE,      % MY CHECKSUM TYPE                              02316000
  212.         MYREPT,         % MY REPEAT CHARACTER                           02317000
  213.         MYPAUSE,        % MY PAUSE AFTER ACK TIME                       02318000
  214.         MYDELAY,        % MY DELAY FOR FIRST SEND TIME                  02319000
  215.         MYESCCHR        % MY ESCAPE CHARACTER FROM CONNECT              0232000001.040.029
  216.        ,MYWINDOWSIZE    % THE WINDOW SIZE I WANT TO USE                 0232100001.040.029
  217.        ,WINDOWSIZE      % THE WINDOW SIZE WE AGREE TO USE               0232200001.040.029
  218.        ;                                                                0234900001.040.029
  219. ARRAY                                                                   02400000
  220.         FILNAM[0:MAXPACKWDS]    % TITLE OF CURRENT DISK FILE            0240100001.040.026
  221.        ,AC[0:3]                 % SCRATCH BUFFER FOR SCANNERS           0240200001.040.026
  222.        ,FILNAM1[0:MAXPACKWDS]   % EBCDIC FILE TITLE                     0240300001.040.030
  223.        ;                                                                0240900001.040.026
  224. POINTER                                                                 02500000
  225.         PFILNAM;        % POINTER TO FILNAM                             02501000
  226.                                                                         02502000
  227. ARRAY                                                                   02600000
  228.         RECPKT[0:MAXPACKWDS],% RECEIVE PACKET BUFFER                    02601000
  229.         PACKET[0:MAXPACKWDS];% PACKET BUFFER                            02602000
  230.                                                                         02603000
  231. FILE                                                                    02700000
  232.         REM             %  FILE FOR REMOTE INPUT / OUTPUT               02701000
  233.           (KIND=REMOTE,MYUSE=IO,UNITS=CHARACTERS,BUFFERS=1,             02702000
  234.                  MAXRECSIZE=ABSOLUTEMAXPACKSIZE,FILETYPE=3),            0270300001.040.029
  235.         LOG             %  FILE POINTER FOR LOGFILE                     02704000
  236.            (KIND=DISK,UNITS=CHARACTERS,MAXRECSIZE=96,BLOCKSIZE=2880,    02705000
  237.                     PROTECTION=SAVE,NEWFILE,SAVEFACTOR=1,BUFFERS=1,     02706000
  238.                     TITLE=8"KERMIT/LOG.");                              02707000
  239. FILE    KERMITINI;      %  FOR FILE-EQUATING FILENAME, IF DESIRED       0270800001.040.030
  240. TRANSLATETABLE TOUPPER(  ASCII TO ASCII,                                02800000
  241.        "abcdefghijklmnopqrstuvwxyz" TO "ABCDEFGHIJKLMNOPQRSTUVWXYZ"),   02801000
  242.                TOLOWER(  ASCII TO ASCII,                                02802000
  243.        "ABCDEFGHIJKLMNOPQRSTUVWXYZ" TO "abcdefghijklmnopqrstuvwxyz"),   02803000
  244.                TOBURROUGHS( ASCII TO ".",                               02804000
  245.        "abcdefghijklmnopqrstuvwxyz" TO "ABCDEFGHIJKLMNOPQRSTUVWXYZ",    02805000
  246.        "ABCDEFGHIJKLMNOPQRSTUVWXYZ" TO "ABCDEFGHIJKLMNOPQRSTUVWXYZ",    02806000
  247.        "0123456789"                 TO "0123456789" );                  02807000
  248. TRANSLATETABLE ASCTOEBC(                                                02808000
  249.    47"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F" 02809000
  250. TO 48"00010203372D2E2F1605250B0C0D0E0F101112133C3D322618193F271C1D1E1F" 02810000
  251.   ,47"202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F" 02811000
  252. TO 48"404F7F7B5B6C507D4D5D5C4E6B604B61F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F" 02812000
  253.   ,47"404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F" 02813000
  254. TO 48"7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6D7D8D9E2E3E4E5E6E7E8E94AE05A5F6D" 02814000
  255.   ,47"606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F" 02815000
  256. TO 48"79818283848586878889919293949596979899A2A3A4A5A6A7A8A9C06AD0A107" 02816000
  257.             );                                                          02817000
  258. TRANSLATETABLE FIXSLASHES( ASCII TO ASCII , "/" TO "_" );               02818000
  259. TRUTHSET NUMBERS(   "0" OR "1" OR "2" OR "3" OR "4" OR                  03000000
  260.                     "5" OR "6" OR "7" OR "8" OR "9");                   03001000
  261. TRUTHSET QUOTECHARS( "!" OR 48"7F" OR "#" OR "$" OR "%" OR "&"          03002000
  262.    OR "'" OR "(" OR ")" OR "*" OR "+" OR "," OR "-" OR "."              03003000
  263.    OR "/" OR "0" OR NUMBERS OR ":" OR ";" OR "<" OR "=" OR ">"          03004000
  264.    OR "`" OR "{" OR "|" OR "}" OR "~" );                                03005000
  265. ARRAY ACNTRL[0:15],              %  TRUTHSET FOR ALL CONTROL CHARS      03100000
  266.       BCNTRL[0:15];              %  TRUTHSET FOR JUST QUOTE,QBIN,REPT   03101000
  267.  %     4"0000FFFFFFFF",          %  ADD IN FROM 0 THRU 31               03102000
  268.  %     0,0,                      %  LEAVE OUT  32 THRU 95               03103000
  269.  %     4"000000000001",          %  ADD IN BIT FOR 127                  03104000
  270.  %     0,0,0,0                   %  ZERO OUT END (MAY NEED FOR EBCDIC)  03105000
  271.  %  TABLE ALGORITHM:                                                    03106000
  272.  %    BOOLEAN(TABLE[CHAR.[7:3]].[(31-CHAR.[4:5]):1]) => IN TABLE        03107000
  273.  %                                                                      03108000
  274. DEFINE TABLEIT(TAB,C)  = TAB[C.[7:3]].[(31-C.[4:5]):1] := 1#,           03109000
  275.        UNTABLE(TAB,C)  = TAB[C.[7:3]].[(31-C.[4:5]):1] := 0#;           03110000
  276.                                                                         03111000
  277. ARRAY FBUF_[0:29],      %  USED BY FPRINT                               03200000
  278.       EBUF_[0:15],      %  USED BY ERROR                                03201000
  279.       TBUF_[0:15],      %  TEMPORARY BUFFER FOR DIGITS CONVERSION       03202000
  280.       GBUF_[0:99],      %  USED BY GETC                                 03203000
  281.       PBUF_[0:99];      %  USED BY PUTC                                 03204000
  282. POINTER PG_,            %  POINTS TO GBUF_                              03300000
  283.         PP_             %  POINTS TO PBUF_                              0330100001.040.028
  284.        ,PF_             %  POINTS TO FBUF_                              0330200001.040.028
  285.        ,PT_             %  POINTS TO TBUF_                              0330300001.040.028
  286.        ;                                                                0330900001.040.028
  287. REAL RD,                %  RESULT DESCRIPTOR FOR EVERYBODY              03400000
  288.      GCNT_,             %  NUMBER OF CHARACTERS IN GBUF_                03401000
  289.      PCNT_,             %  NUMBER OF CHARACTERS IN PBUF_                03402000
  290.      RECSIZ_,           %  MAXRECSIZE OF FP                             03403000
  291.      UNITS_,            %  CHARACTERS PER "UNIT" OF FP                  03404000
  292.      HUH_               %  SILLY LITTLE FILLER                          0340500001.040.030
  293.     ,PROMPTLENGTH       %  LENGTH OF INTERACTIVE PROMPT                 0340600001.040.030
  294.     ,PROMPTOFFSET       %  USED FOR ERROR MESSAGE ALIGNMENT             0340700001.040.030
  295.     ,NEXTSENDL          %  KEEPS TRACK OF LENGTH OF NEXTSEND            0340800001.040.032
  296.     ;                                                                   0344900001.040.030
  297. BOOLEAN BRD = RD;       %  BOOLEAN RD                                   03500000
  298. DEFINE                  %  SOME BURROUGHS FIELD DEFINES                 03501000
  299.     LENGTHF = [47:20]#, %  CHAR. COUNT RETURNED FROM RESLT. DESCR.      03502000
  300.     EOFBIT  = [ 9: 1]#, %  EOF ON I/O FROM RESLT. DESCR.                03503000
  301.     BRKBIT  = [13: 1]#, %  BREAK ON I/O FROM RESLT. DESCR.              03504000
  302.  TIMEOUTBIT = [15: 1]#, %  TIMEOUT ON I/O FROM RESLT. DESCR.            03505000
  303.     ERRORF  = [16:17]#, %  THE WHOLE ERROR FIELD                        03506000
  304.     MOD64   = .[5:6]#;  %  N MOD 64 == N.[5:6]                          03507000
  305.                                                                         03508000
  306. DEFINE                                                                  03600000
  307.     INDENT   = TRUE#,   %  BOOLEAN CONSTANTS                            03601000
  308.     NOINDENT = FALSE#;                                                  03602000
  309.                                                                         03603000
  310. ARRAY NULLDATA[0:0];                                                    03700000
  311.                                                                         03701000
  312. DEFINE SENDIT =                                                         0380000001.040.028
  313.          BEGIN                                                          0380100001.040.028
  314.          IF SERVER THEN                                                 0380200001.040.028
  315.            ERROR(FBUF_)                                                 0380300001.040.028
  316.          ELSE                                                           0380400001.040.028
  317.            BRD := WRITE(REM,OFFSET(PF_),FBUF_[*]);                      0380500001.040.028
  318.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             0380600001.040.028
  319.          END#                                                           0380700001.040.028
  320.       ,FORM   (STR) =                                                   0381000001.040.028
  321.          BEGIN                                                          0381100001.040.028
  322.          REPLACE PF_:POINTER(FBUF_) BY STR;                             0381200001.040.028
  323.          END#                                                           0381300001.040.028
  324.       ,FORM1  (STR,NUMBER) =                                            0382000001.040.028
  325.          BEGIN                                                          0382100001.040.028
  326.          REPLACE PT_:TBUF_ BY 8"-" FOR REAL(NUMBER LSS 0),              0382200001.040.028
  327.              NUMBER FOR * DIGITS;                                       0382300001.040.028
  328.          REPLACE PF_:POINTER(FBUF_) BY STR,TBUF_ FOR OFFSET(PT_)        0382400001.040.028
  329.              WITH EBCDICTOASCII;                                        0382500001.040.028
  330.          END#                                                           0382600001.040.028
  331.       ,APPEND (STR) =                                                   0383000001.040.028
  332.          BEGIN                                                          0383100001.040.028
  333.          REPLACE PF_:PF_ BY STR;                                        0383200001.040.028
  334.          END#                                                           0383300001.040.028
  335.       ,APPEND1(STR,NUMBER) =                                            0384000001.040.028
  336.          BEGIN                                                          0384100001.040.028
  337.          REPLACE PT_:TBUF_ BY 8"-" FOR REAL(NUMBER LSS 0),              0384200001.040.028
  338.              NUMBER FOR * DIGITS;                                       0384300001.040.028
  339.          REPLACE PF_:PF_ BY STR,TBUF_ FOR OFFSET(PT_)                   0384400001.040.028
  340.              WITH EBCDICTOASCII;                                        0384500001.040.028
  341.          END#                                                           0384600001.040.028
  342.        ;                                                                0385000001.040.028
  343. DEFINE CH(NUMBER,N)  = (NUMBER).[ 7:48] FOR N#,% TO USE NUMBER AS A CHAR04000000
  344.        SAY(STR)      =                                                  04100000
  345.          BEGIN                                                          04101000
  346.          FORM(STR);                                                     0410200001.040.028
  347.          SENDIT;                                                        0410300001.040.028
  348.          END#,                                                          04108000
  349.        SAY1(STR,NUMBER)=                                                04200000
  350.          BEGIN                                                          04201000
  351.          FORM1(STR,NUMBER);                                             0420200001.040.028
  352.          SENDIT;                                                        0420300001.040.028
  353.          END#,                                                          04211000
  354.        SAYC(STR,NUMBER)=                                                04300000
  355.          BEGIN                                                          04301000
  356.          IF TBUF_[0] := NUMBER LSS SP THEN                              04302000
  357.            REPLACE PF_:POINTER(FBUF_) BY STR,                           0430300001.040.028
  358.                "CTRL-",CH(NUMBER+64,1),                                 0430310001.040.028
  359.                " (HEX ",POINTER(TBUF_,4)+10 FOR 2 WITH HEXTOASCII,")"   0430400001.040.028
  360.          ELSE                                                           04305000
  361.            REPLACE PF_:POINTER(FBUF_) BY STR, CH(NUMBER,1), " (HEX ",   0430600001.040.028
  362.                POINTER(TBUF_,4)+10 FOR 2 WITH HEXTOASCII,")";           0430700001.040.028
  363.          SENDIT;                                                        0430800001.040.028
  364.          END#,                                                          04313000
  365.        SAYN(STR,PTR) =                                                  04400000
  366.          BEGIN                                                          04401000
  367.          FORM(STR);                                                     0440200001.040.028
  368.          APPEND(PTR FOR (96 - OFFSET(PF_)) UNTIL = NULC);               0440300001.040.028
  369.          SENDIT;                                                        0440400001.040.028
  370.          END#,                                                          04409000
  371.        SAYP(PTR,WHITESPACE) =                                           04500000
  372.          BEGIN                                                          04501000
  373.          IF WHITESPACE THEN                                             04502000
  374.            REPLACE PF_:POINTER(FBUF_) BY "   ",                         0450300001.040.028
  375.                                       PTR FOR (96-3) WHILE GEQ " "      0450400001.040.028
  376.          ELSE                                                           04505000
  377.            REPLACE PF_:POINTER(FBUF_) BY PTR FOR 96 WHILE GEQ " ";      0450600001.040.028
  378.          SENDIT;                                                        0450700001.040.028
  379.          END#,                                                          04512000
  380.                                                                         04513000
  381.        SAYQ(STR)     =                                                  04600000
  382.          BEGIN                                                          04601000
  383.          REPLACE PF_:POINTER(FBUF_) BY                                  0460200001.040.028
  384.               " " FOR COL_BASE + PROMPTOFFSET - COL_OK_TIL,             0460210001.040.030
  385.                                    "?";                                 04603000
  386.          BRD := WRITE(REM,OFFSET(PF_),FBUF_[*]);                        0460400001.040.028
  387.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             04605000
  388.          REPLACE PF_:POINTER(FBUF_) BY "  missing or invalid ",         0460600001.040.028
  389.                                    STR,                                 04607000
  390.                                    " parameter";                        04608000
  391.          BRD := WRITE(REM,OFFSET(PF_),FBUF_[*]);                        0460900001.040.028
  392.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             04610000
  393.          END#,                                                          04611000
  394.                                                                         04612000
  395.        SAYQOPT(STR)  =                                                  04700000
  396.          BEGIN                                                          04701000
  397.          COL_OK_TIL := COL_BASE + PROMPTOFFSET - COL_OK_TIL;            0470200001.040.030
  398.          REPLACE PF_:POINTER(FBUF_) BY " " FOR COL_OK_TIL,              0470300001.040.028
  399.                                    "?";                                 04704000
  400.          BRD := WRITE(REM,OFFSET(PF_),FBUF_[*]);                        0470500001.040.028
  401.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             04706000
  402.          REPLACE PF_:POINTER(FBUF_) BY "  missing or invalid ",         0470700001.040.028
  403.                                    STR,                                 04708000
  404.                                    " parameter - options are:";         04709000
  405.          BRD := WRITE(REM,OFFSET(PF_),FBUF_[*]);                        0471000001.040.028
  406.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             04711000
  407.          END#,                                                          04712000
  408.                                                                         04713000
  409.                                                                         04800000
  410.        BUG(STR)      =                                                  04801000
  411.          BEGIN                                                          04802000
  412.          FORM(STR);                                                     0480300001.040.028
  413.          BRD := WRITE(LOG,96,FBUF_[*]);                                 04804000
  414.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             04805000
  415.          END#,                                                          04806000
  416.        BUG1(STR,NUMBER)=                                                04900000
  417.          BEGIN                                                          04901000
  418.          FORM1(STR,NUMBER);                                             0490200001.040.028
  419.          BRD := WRITE(LOG,96,FBUF_[*]);                                 04906000
  420.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             04907000
  421.          END#,                                                          04908000
  422.        BUGH(STR,NUMBER)=                                                05000000
  423.          BEGIN                                                          05001000
  424.          TBUF_[0] := NUMBER;                                            05002000
  425.          REPLACE PF_:POINTER(FBUF_) BY STR,                             0500300001.040.028
  426.              POINTER(TBUF_,4) FOR 12 WITH HEXTOASCII;                   05004000
  427.          BRD := WRITE(LOG,96,FBUF_[*]);                                 05005000
  428.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             05006000
  429.          END#,                                                          05007000
  430.        BUGC(STR,NUMBER)=                                                05100000
  431.          BEGIN                                                          05101000
  432.          IF TBUF_[0] := NUMBER LSS SP THEN                              05102000
  433.            REPLACE PF_:POINTER(FBUF_) BY STR,                           0510300001.040.028
  434.                "CTRL-",CH(NUMBER+64,1),                                 0510310001.040.028
  435.                " (HEX ",POINTER(TBUF_,4)+10 FOR 2 WITH HEXTOASCII,")"   0510320001.040.028
  436.          ELSE                                                           05104000
  437.            REPLACE PF_:POINTER(FBUF_) BY STR, "     ",CH(NUMBER,1),     0510500001.040.028
  438.                " (HEX ",POINTER(TBUF_,4)+10 FOR 2 WITH HEXTOASCII,")";  0510510001.040.028
  439.          BRD := WRITE(LOG,96,FBUF_[*]);                                 05106000
  440.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             05107000
  441.          END#,                                                          05108000
  442.        BUGN(STR,PTR) =                                                  05200000
  443.          BEGIN                                                          05201000
  444.          FORM(STR);                                                     0520200001.040.028
  445.          APPEND(PTR FOR (96 - OFFSET(PF_)) UNTIL = NULC);               0520300001.040.028
  446.          BRD := WRITE(LOG,96,FBUF_[*]);                                 05204000
  447.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             05205000
  448.          END#,                                                          05206000
  449.        BUGP(PTR)     =                                                  05300000
  450.          BEGIN                                                          05301000
  451.          FORM(PTR FOR 96 UNTIL = NULC);                                 0530200001.040.028
  452.          BRD := WRITE(LOG,96,FBUF_[*]);                                 05303000
  453.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             05304000
  454.          END#;                                                          05305000
  455.                                                                         05306000
  456. %                                                                       05400000
  457. % E R R O R                                                             05401000
  458. %                                                                       05402000
  459. % PRINT ERROR MESSAGE.                                                  05403000
  460. %                                                                       05404000
  461. % IF LOCAL, PRINT ERROR MESSAGE WITH PRINTMSG.                          05405000
  462. % IF REMOTE, SEND AN ERROR PACKET WITH THE MESSAGE.                     05406000
  463. %                                                                       05407000
  464. DEFINE ERROR(ARA) =                                                     05408000
  465.          BEGIN                                                          05409000
  466.          REPLACE EBUF_ BY ARA FOR HUH_:(96 - 5) WHILE GEQ " ";          0541000001.040.028
  467.          HUH_ := (96 - 5) - HUH_;                                       0541100001.040.028
  468.          REPLACE FBUF_ BY " " FOR 16 WORDS; %SO DEBUGGING IN SPACK IS OK05412000
  469.          SPACK("E",N:=(N+1) MOD64,HUH_,EBUF_);                          05413000
  470.          REPLACE EBUF_ BY " " FOR 16 WORDS;                             05414000
  471.          END#;                                                          05415000
  472. TRANSLATETABLE STRIP_PARITY (                                           0550000001.040.024
  473.    ASCII TO ASCII                                                       0550100001.040.024
  474.   ,47"808182838485868788898A8B8C8D8E8F" TO                              0550200001.040.024
  475.    47"000102030405060708090A0B0C0D0E0F"                                 0550300001.040.024
  476.   ,47"909192939495969798999A9B9C9D9E9F" TO                              0550400001.040.024
  477.    47"101112131415161718191A1B1C1D1E1F"                                 0550500001.040.024
  478.   ,47"A0A1A2A3A4A5A6A7A8A9AAABACADAEAF" TO                              0550600001.040.024
  479.    47"202122232425262728292A2B2C2D2E2F"                                 0550700001.040.024
  480.   ,47"B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF" TO                              0550800001.040.024
  481.    47"303132333435363738393A3B3C3D3E3F"                                 0550900001.040.024
  482.   ,47"C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF" TO                              0551000001.040.024
  483.    47"404142434445464748494A4B4C4D4E4F"                                 0551100001.040.024
  484.   ,47"D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF" TO                              0551200001.040.024
  485.    47"505152535455565758595A5B5C5D5E5F"                                 0551300001.040.024
  486.   ,47"E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF" TO                              0551400001.040.024
  487.    47"606162636465666768696A6B6C6D6E6F"                                 0551500001.040.024
  488.   ,47"F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF" TO                              0551600001.040.024
  489.    47"707172737475767778797A7B7C7D7E7F"                                 0551700001.040.024
  490.                                );                                       0551800001.040.024
  491. ARRAY SBUFFER,RBUFFER[0:(MAXPACKWDS - 1)];                              0551900001.040.029
  492. POINTER SPB,SPC,RPB,RPC,RPD;                                            0552000001.040.024
  493. REAL CHKSUM;                                                            0552100001.040.024
  494. DEFINE PACKETMOD     = 95#;                                             0552500001.040.024
  495. DEFINE RESERVEDBIT5 = 5#                                                0552700001.040.029
  496.       ,RESERVEDBIT4 = 4#                                                0552800001.040.029
  497.       ,APACKETBIT   = 3#                                                0552900001.040.029
  498.       ,WINDOWSBIT   = 2#                                                0553000001.040.029
  499.       ,LONGPACKETBIT= 1#                                                0553100001.040.029
  500.       ,MORECAPASBIT = 0#                                                0553200001.040.029
  501.       ;                                                                 0553300001.040.029
  502. POINTER CP;                      %  CHAR POINTER                        06000000
  503. REAL COL;                        %  COLUMN COUNTER FOR SCANNER          06001000
  504. REAL COL_BASE;                   %  BEGINNING COLUMN COUNT FOR SCANNER  06002000
  505. REAL COL_OK_TIL;                 %  COLUMN COUNTER FOR PREVIOUS SCAN    06003000
  506. ARRAY NEXTSEND[0:MAXPACKWDS];    %  NEXT FILE(S) TO SEND                06004000
  507. BOOLEAN MORETOSEND;              %  SOMETHING IN NEXTSEND               06005000
  508. EBCDIC ARRAY MACHINE[0:5];       %  WHAT MACHINE (B7800, A10)  [1.023]  06006000
  509. ARRAY KPROMPT[0:15];             %  THE KERMIT PROMPT                   06007000
  510. ARRAY REFERENCE SPECARA[0];      %  CURRENT COMMAND ARRAY               06008000
  511. INTEGER MACHINENAMEL;            %  LENGTH OF MACHINE NAME     [1.023]  06009000
  512.                                                                         06010000
  513. VALUE ARRAY SPECIAL(             %  ALL THE COMMANDS                    07000000
  514.   48"01" "?    "  ,              %  ? FOR HELP                          07001000
  515.   48"04" "EXIT " ,                                                      07002000
  516.   48"04" "HELP " ,                                                      07003000
  517.   48"04" "QUIT " ,                                                      07004000
  518.   48"07" "RECEIVE    " ,                                                07005000
  519.   48"04" "SEND " ,                                                      07006000
  520.   48"06" "SERVER     " ,                                                07007000
  521.   48"03" "SET  " ,                                                      07008000
  522.   48"04" "SHOW " ,                                                      07009000
  523.   48"06" "STATUS     " ,                                                07010000
  524.   48"04" "TAKE ",                                                       0701100001.040.030
  525.             0);                                                         0702900001.040.030
  526.                                                                         0703000001.040.030
  527. %  DEFINES FOR COMMANDS                                                 07050000
  528.                                                                         07051000
  529. DEFINE                                                                  07052000
  530.   QMARKV              =   0#,                                           07053000
  531.   EXITV               =   1#,                                           07054000
  532.   HELPV               =   2#,                                           07055000
  533.   QUITV               =   3#,                                           07056000
  534.   RECEIVEV            =   4#,                                           07057000
  535.   SENDV               =   6#,                                           07058000
  536.   SERVERV             =   7#,                                           07059000
  537.   SETV                =   9#,                                           07060000
  538.   SHOWV               =  10#,                                           07061000
  539.   STATUSV             =  11#,                                           07062000
  540.   TAKEV               =  13#,                                           0706300001.040.030
  541.   QUESTIONV           =  -98#,                                          0709000001.040.030
  542.   INVALIDV            =  -99#,                                          0709100001.040.030
  543.   NOERRORV            =  101#;                                          0709200001.040.030
  544.                                                                         0709300001.040.030
  545. VALUE ARRAY SPECSET(             %  ALL THE SPECIAL 'SET' COMMANDS      07100000
  546.   48"01" "?    "  ,                                                     07101000
  547.   48"09" "DEBUGGING  " ,                                                07102000
  548.   48"05" "DELAY" ,                                                      07103000
  549.   48"04" "FILE " ,                                                      07104000
  550.   48"0A" "INCOMPLETE " ,                                                07105000
  551.   48"05" "RETRY" ,                                                      07106000
  552.   48"07" "RECEIVE    " ,                                                07107000
  553.   48"04" "SEND " ,                                                      07108000
  554.   48"06" "BINARY     " ,                                                07109000
  555.   48"0B" "BLOCK-CHECK",                                                 0711000001.040.027
  556.                                                                         07111000
  557.             0);                                                         0712900001.040.027
  558.                                                                         0713000001.040.027
  559. %  DEFINES FOR SET COMMAND                                              07150000
  560.                                                                         07151000
  561. DEFINE                                                                  07152000
  562. % QMARKV              =   0#,                                           07153000
  563.   DEBUGV              =   1#,                                           07154000
  564.   DELAYV              =   3#,                                           07155000
  565.   FILEV               =   4#,                                           07156000
  566.   INCOMPLETEV         =   5#,                                           07157000
  567.   RETRYV              =   7#,                                           07158000
  568.   SETRECEIVEV         =   8#,                                           07159000
  569.   SETSENDV            =  10#,                                           07160000
  570.   BINARYV             =  11#                                            0716100001.040.027
  571.  ,CHECKSUMTYPEV       =  13#                                            0716200001.040.027
  572.  ;                                                                      0718900001.040.027
  573. VALUE ARRAY SPECFILE(            %  FOR SET FILE COMMANDS               07200000
  574.   48"01" "?    " ,                                                      07201000
  575.   48"0A" "BLOCK-SIZE " ,                                                07202000
  576.   48"0B" "EXPAND-TABS" ,                                                07203000
  577.   48"05" "FIXED" ,                                                      07204000
  578.   48"03" "RAW  " ,                                                      07205000
  579.   48"0B" "RECORD-SIZE" ,                                                07206000
  580.   48"05" "UNITS" ,                                                      07207000
  581.             0);                                                         07208000
  582.                                                                         07209000
  583. %       DEFINES FOR SET FILE COMMANDS                                   07250000
  584. DEFINE                                                                  07251000
  585. % QMARK                   =  0#,                                        07252000
  586.   BLOCKSIZEV              =  1#,                                        07253000
  587.   EXPTABSV                =  3#,                                        07254000
  588.   FIXEDV                  =  5#,                                        07255000
  589.   RAWV                    =  6#,                                        07256000
  590.   RECORDSIZEV             =  7#,                                        07257000
  591.   UNITSV                  =  9#;                                        07258000
  592.                                                                         07259000
  593. VALUE ARRAY SPECABORT(           %  FOR SET ABORTED-FILE                07300000
  594.   48"01" "?    " ,                                                      07301000
  595.   48"07" "DISCARD    " ,                                                07302000
  596.   48"04" "KEEP " ,                                                      07303000
  597.             0);                                                         07304000
  598.                                                                         07305000
  599. %  DEFINES FOR SPECABORT                                                07350000
  600.                                                                         07351000
  601. DEFINE                                                                  07352000
  602. % QMARKV              =   0#,                                           07353000
  603.   DISCARDV            =   1#,                                           07354000
  604.   KEEPV               =   3#;                                           07355000
  605.                                                                         07356000
  606. VALUE ARRAY SPECDEBUG(           %  FOR SET DEBUGGING                   07400000
  607.   48"01" "?    " ,                                                      07401000
  608.   48"06" "STATES     " ,                                                07402000
  609.   48"07" "PACKETS    " ,                                                07403000
  610.   48"08" "LOG-FILE   " ,                                                07404000
  611.   48"03" "OFF  ",                                                       07405000
  612.             0);                                                         07406000
  613.                                                                         07407000
  614. %  DEFINES FOR SPECDEBUG                                                07450000
  615.                                                                         07451000
  616. DEFINE                                                                  07452000
  617. % QMARKV              =   0#,                                           07453000
  618.   STATESV             =   1#,                                           07454000
  619.   PACKETSV            =   3#,                                           07455000
  620.   LOGFILEV            =   5#,                                           07456000
  621.   DOFFV               =   7#;                                           07457000
  622.                                                                         07458000
  623. VALUE ARRAY SPECRETRY(           %  FOR SET RETRY                       07500000
  624.   48"01" "?    " ,                                                      07501000
  625.   48"12" "INITIAL-CONNECTION     " ,                                    07502000
  626.   48"07" "PACKETS    " ,                                                07503000
  627.             0);                                                         07504000
  628.                                                                         07505000
  629. %  DEFINES FOR SPECRETRY                                                07550000
  630.                                                                         07551000
  631. DEFINE                                                                  07552000
  632. % QMARKV              =   0#,                                           07553000
  633.   INITCONNV           =   1#,                                           07554000
  634.   RETRYPACKETSV       =   5#;                                           07555000
  635.                                                                         07556000
  636. VALUE ARRAY SPECONOFF(           %  FOR ON/OFF                          07600000
  637.   48"01" "?    " ,                                                      07601000
  638.   48"02" "ON   " ,                                                      07602000
  639.   48"03" "OFF  " ,                                                      07603000
  640.             0);                                                         07604000
  641.                                                                         07605000
  642. %  DEFINES FOR SPECONOFF                                                07650000
  643.                                                                         07651000
  644. DEFINE                                                                  07652000
  645. % QMARKV              =   0#,                                           07653000
  646.   ONV                 =   1#,                                           07654000
  647.   OFFV                =   2#;                                           07655000
  648.                                                                         07656000
  649. VALUE ARRAY SPECRECEIVE(         %  FOR SET RECEIVE, SET SEND           07700000
  650.   48"01" "?    " ,                                                      07701000
  651.   48"0B" "END-OF-LINE" ,                                                07702000
  652.   48"0D" "PACKET-LENGTH    " ,                                          07703000
  653.   48"07" "PADDING    " ,                                                07704000
  654.   48"07" "PADCHAR    " ,                                                07705000
  655.   48"05" "PAUSE" ,                                                      07706000
  656.   48"05" "QUOTE" ,                                                      07707000
  657.   48"0F" "START-OF-PACKET  " ,                                          07708000
  658.   48"07" "TIMEOUT    " ,                                                07709000
  659.   48"0C" "ACTUAL-TITLE     ",                                           0771000001.040.038
  660.                                                                         07711000
  661.             0);                                                         0774800001.040.038
  662.                                                                         0774900001.040.038
  663. %  DEFINES FOR SPECRECEIVE                                              07750000
  664.                                                                         07751000
  665. DEFINE                                                                  07752000
  666. % QMARKV              =   0#,                                           07753000
  667.   EOLV                =   1#,                                           07754000
  668.   LENV                =   3#,                                           07755000
  669.   PADV                =   6#,                                           07756000
  670.   PCHARV              =   8#,                                           07757000
  671.   PAUSEV              =  10#,                                           07758000
  672.   QUOTEV              =  11#,                                           07759000
  673.   STARTOFPACKV        =  12#,                                           07760000
  674.   TIMEOUTV            =  15#                                            0776100001.040.038
  675.  ,ACTUALTITLEV        =  17#                                            0776200001.040.038
  676.  ;                                                                      0779800001.040.038
  677.                                                                         0779900001.040.038
  678. VALUE ARRAY SPECUNITS(           %  FOR SET RECEIVE UNITS               07800000
  679.   48"01" "?    ",                                                       07801000
  680.   48"05" "WORDS",                                                       07802000
  681.   48"0A" "CHARACTERS ",                                                 07803000
  682.             0);                                                         07804000
  683.                                                                         07805000
  684. %  DEFINES FOR SPECUNITS                                                07850000
  685.                                                                         07851000
  686. DEFINE                                                                  07852000
  687. % QMARKV              =   0#,                                           07853000
  688.   UWORDSV             =   1#,                                           07854000
  689.   UCHARACTERSV        =   2#;                                           07855000
  690.                                                                         07856000
  691. VALUE ARRAY SPECSHOW(            %  FOR SHOW SEND/RECEIVE               07900000
  692.   48"04" "SEND " ,                                                      07901000
  693.           0);                                                           07902000
  694.                                                                         07903000
  695. DEFINE                                                                  07950000
  696.   SHOSENDV            =   0#;                                           07951000
  697.                                                                         07952000
  698.                                                                         07953000
  699.                                                                         09000000
  700. VALUE ARRAY PLAINHELP(           %  GLOBAL HELP STUFF                   09001000
  701.   48"0D" "EXIT to CANDE    ",                                           09002000
  702.   48"1B" "HELP by giving this message  ",                               09003000
  703.   48"10" "QUIT (like EXIT) ",                                           09004000
  704.   48"16" "RECEIVE file from host ",                                     09005000
  705.   48"11" "SEND file to host",                                           09006000
  706.   48"20" "SERVER   make me a Kermit Server   ",                         09007000
  707.   48"0F" "SET a parameter  ",                                           09008000
  708.   48"0D" "SHOW settings    ",                                           09009000
  709.   48"12" "STATUS (like SHOW)     ",                                     09010000
  710.   48"1E" "TAKE commands from a disk file     ",                         0901100001.040.030
  711.             0),                                                         0904900001.040.030
  712.             SETHELP(             %  SET HELP STUFF                      09050000
  713.   48"20" "   BINARY (do 8th bit transfers)   " ,                        09051000
  714.   48"13" "   BLOCK-CHECK type    " ,                                    0905150001.040.027
  715.   48"19" "   DEBUGGING level option    ",                               09052000
  716.   48"1F" "   DELAY seconds for first SEND    ",                         09053000
  717.   48"11" "   FILE parameter" ,                                          09054000
  718.   48"19" "   INCOMPLETE disposition    " ,                              09055000
  719.   48"0E" "   RETRY count   ",                                           09056000
  720.   48"14" "   RECEIVE parameter   ",                                     09057000
  721.   48"11" "   SEND parameter",                                           09058000
  722.             0),                                                         09059000
  723.             SETFILEHELP(         %  SET FILE  HELP STUFF                09100000
  724.   48"14" "   BLOCK-SIZE length   ",                                     09101000
  725.   48"17" "   EXPAND-TABS on input",                                     09102000
  726.   48"32" "   FIXED (send blanks found at the end of records)" ,         09103000
  727.   48"2A" "   RAW (without any line delimiting chars)     ",             09104000
  728.   48"15" "   RECORD-SIZE length  ",                                     09105000
  729.   48"1E" "   UNITS (words or characters)    ",                          09106000
  730.             0),                                                         09107000
  731.             SENDHELP(            %  SET RECEIVE/SEND HELP               09150000
  732.   48"1C" "   END-OF-LINE (number 0-31) ",                               09151000
  733.   48"17" "   PACKET-LENGTH length",                                     09152000
  734.   48"20" "   PADDING  (number of PADCHARS)   ",                         09153000
  735.   48"19" "   PADCHAR  (number 0-31)    ",                               09154000
  736.   48"1B" "   PAUSE seconds before ACK  ",                               09155000
  737.   48"12" "   QUOTE character     ",                                     09156000
  738.   48"20" "   START-OF-PACKET (number 0-31)   " ,                        09157000
  739.   48"15" "   TIMEOUT in seconds  ",                                     09158000
  740.             0),                                                         09159000
  741.             UNITSHELP(           %  SET RECEIVE UNITS HELP              09200000
  742.   48"08" "   WORDS   ",                                                 09201000
  743.   48"0D" "   CHARACTERS    ",                                           09202000
  744.             0),                                                         09203000
  745.             ABORTHELP(           %  SET ABORTED-FILE HELP               09250000
  746.   48"1C" "   DISCARD the file on abort ",                               09251000
  747.   48"19" "   KEEP the file on abort    ",                               09252000
  748.             0),                                                         09253000
  749.             DEBUGHELP(           %  SET DEBUGGING HELP                  09300000
  750.   48"1E" "   STATES - flag state changes     ",                         09301000
  751.   48"19" "   PACKETS- flag all data    ",                               09302000
  752.   48"20" "   LOG-FILE changes log filename   ",                         09303000
  753.   48"1E" "   OFF    - turn off all flags     ",                         09304000
  754.             0),                                                         09305000
  755.             RETRYHELP(           %  SET RETRY HELP                      09350000
  756.   48"1C" "    INITIAL-CONNECTION count ",                               09351000
  757.   48"11" "    PACKETS count",                                           09352000
  758.             0),                                                         09353000
  759.             ONOFFHELP(           %  ONLY ON OR OFF                      09400000
  760.   48"05" "   ON",                                                       09401000
  761.   48"06" "   OFF     ",                                                 09402000
  762.             0),                                                         09403000
  763.             LONUMBERHELP(        %  ONLY NUMBERS ALLOWED                09450000
  764.   48"24" "   must be an integer from 0 thru 31    ",                    09451000
  765.             0),                                                         09452000
  766.             QUOTEHELP(           %  ONLY 32 < N < 127                   09500000
  767.   48"2B" "   must be an ASCII character from ! thru ~    ",             09501000
  768.   48"2E" "                              (HEX 21 thru 7E) ",             09502000
  769.             0),                                                         09503000
  770.             NUMBERHELP(          %  ANY NUMBERS ALLOWED                 09550000
  771.   48"21" "   can be any decimal digit > 0  ",                           09551000
  772.             0)                                                          0955200001.040.027
  773.            ,CHKTYPEHELP(         %  NUMBERS 1 THRU 3 ONLY               0960000001.040.027
  774.   48"23" "   must be an integer from 1 thru 3",                         0960100001.040.027
  775.             0)                                                          0960200001.040.027
  776.            ,TAKEHELP(            %  A FILENAME                          0965000001.040.030
  777.   48"1C" "   must be a valid file name ",                               0965100001.040.030
  778.             0)                                                          0965200001.040.030
  779.            ;                                                            0989900001.040.030
  780. BOOLEAN PROCEDURE SENDSW;                    FORWARD;                   10000000
  781. BOOLEAN PROCEDURE RECSW(ISTATE);                          % [1.017]     10001000
  782.   REAL ISTATE;                               FORWARD;     % [1.017]     10002000
  783. PROCEDURE SPACK(TYPE,NUM,LEN,DATA);                                     10003000
  784.   VALUE TYPE,NUM,LEN;                                                   10004000
  785.   REAL TYPE;                                                            10005000
  786.   REAL NUM,LEN;                                                         10006000
  787.   ARRAY DATA[0];                             FORWARD;                   10007000
  788. REAL PROCEDURE RPACK(LEN,NUM,DATA);                                     10008000
  789.   REAL LEN,NUM;                                                         10009000
  790.   ARRAY DATA[0];                             FORWARD;                   10010000
  791. REAL PROCEDURE BUFILL(FID,BUFFER);                                      10011000
  792.   FILE FID;                                                             10012000
  793.   ARRAY BUFFER[0];                           FORWARD;                   10013000
  794. PROCEDURE BUFEMP(FID,BUFFER,LEN);                                       10014000
  795.   VALUE LEN;                                                            10015000
  796.   REAL LEN;                                                             10016000
  797.   FILE FID;                                                             10017000
  798.   ARRAY BUFFER[0];                           FORWARD;                   10018000
  799. PROCEDURE SPAR(LEN,DATA,FIRSTCALL);                                     1001900001.040.025
  800.   VALUE   FIRSTCALL;                                                    1001910001.040.025
  801.   BOOLEAN FIRSTCALL;                                                    1001920001.040.025
  802.   REAL    LEN;                                                          1002000001.040.025
  803.   ARRAY   DATA[0];                           FORWARD;                   1002100001.040.025
  804. PROCEDURE RPAR(LEN,DATA,FIRSTCALL);                                     1002200001.040.025
  805.   VALUE   FIRSTCALL;                                                    1002210001.040.025
  806.   BOOLEAN FIRSTCALL;                                                    1002220001.040.025
  807.   REAL    LEN;                                                          1002300001.040.025
  808.   ARRAY   DATA[0];                           FORWARD;                   1002400001.040.025
  809. PROCEDURE FLUSHINPUT;                        FORWARD;                   10025000
  810.   PROCEDURE PRERRPKT(MSG);                                              10026000
  811.   ARRAY MSG[0];                              FORWARD;                   10027000
  812. REAL PROCEDURE CHECKSUM(PB,LEN,TYPE);                                   1002800001.040.024
  813.   VALUE   PB,LEN,TYPE;                                                  1002900001.040.024
  814.   POINTER PB;                                                           1003000001.040.024
  815.   INTEGER    LEN,TYPE;                                                  1003100001.040.024
  816.                                             FORWARD;                    1003200001.040.024
  817. PROCEDURE TAKER(INITIALIZED);                                           1003300001.040.030
  818.   VALUE   INITIALIZED;                                                  1003400001.040.030
  819.   BOOLEAN INITIALIZED;                                                  1003500001.040.030
  820.                                             FORWARD;                    1003600001.040.030
  821. BOOLEAN PROCEDURE PROCESSIT;                FORWARD;                    1003700001.040.030
  822. INTEGER PROCEDURE MAKEPACKETDATA(SPTR,SCOUNT,DPTR,SPACEAVAILABLE);      1003800001.040.036
  823.   VALUE   SPTR,SCOUNT,DPTR,SPACEAVAILABLE;                              1003900001.040.036
  824.   POINTER SPTR,DPTR;                                                    1004000001.040.036
  825.   INTEGER SCOUNT,SPACEAVAILABLE;                                        1004100001.040.036
  826.                                             FORWARD;                    1004200001.040.036
  827. INTEGER PROCEDURE GETPACKETDATA(SPTR,SCOUNT,DPTR,DCOUNT);               1004300001.040.036
  828.   VALUE   SPTR,SCOUNT,DPTR,DCOUNT;                                      1004400001.040.036
  829.   POINTER SPTR,DPTR;                                                    1004500001.040.036
  830.   INTEGER SCOUNT,DCOUNT;                                                1004600001.040.036
  831.                                             FORWARD;                    1004700001.040.036
  832. BOOLEAN PROCEDURE COBBLE(FILENAME,LEN);                                 1005300001.040.037
  833.   VALUE   LEN;                                                          1005400001.040.037
  834.   ARRAY   FILENAME[0];                                                  1005500001.040.037
  835.   INTEGER LEN;                                                          1005600001.040.037
  836.                                             FORWARD;                    1005700001.040.037
  837.                                                                         11000000
  838. %                                                                       11001000
  839. % A B O R T R U N                                                       11002000
  840. %                                                                       11003000
  841. % SENDS AN ERROR PACKET AND ABORTS                                      11004000
  842. %                                                                       11005000
  843. PROCEDURE ABORTRUN;                                                     11006000
  844.   BEGIN                                                                 11007000
  845.   REPLACE TBUF_[0] BY COL FOR * DIGITS,"      ";                        11008000
  846.   REPLACE EBUF_ BY "KERMIT ABORTING DUE TO FAULT # ",                   11009000
  847.       TBUF_ FOR 2 WITH EBCDICTOASCII," @ ",                             11010000
  848.       KPROMPT FOR 50 WITH EBCDICTOASCII;                                11011000
  849.   SPACK("E",( N := *+1 ) MOD64, MAXPACKSIZ-5,EBUF_);                    11012000
  850.   IF NOT SERVER THEN                                                    11013000
  851.     SAYP(EBUF_,NOINDENT);                                               11014000
  852.   IF (MYSELF.OPTION).[VALUE(FAULT) : 1]=1 THEN                          11015000
  853.     PROGRAMDUMP(ARRAYS,FILES);                                          11016000
  854.   WHEN(10);                                                             11017000
  855.   MYSELF.STATUS := VALUE(TERMINATED);                                   11018000
  856.   END ABORTRUN;                                                         11019000
  857.                                                                         12000000
  858. %                                                                       12001000
  859. % I N I T I A L I Z E                                                   12002000
  860. %                                                                       12003000
  861. % INITIALIZE SETS UP INITIAL VALUES                                     12004000
  862. %                                                                       12005000
  863. PROCEDURE INITIALIZE;                                                   12006000
  864.   BEGIN                                                                 12007000
  865.   ARRAY GREETING[0:13];                                                 12008000
  866.   EBCDIC ARRAY VERSION[0:7];                                            12009000
  867.                                                                         12010000
  868.   REPLACE MACHINE BY TIME(24);                               % [1.023]  12011000
  869.   SCAN MACHINE FOR MACHINENAMEL:6 UNTIL = 8" ";              % [1.023]  12012000
  870.   MACHINENAMEL := 6 - MACHINENAMEL;                          % [1.023]  12013000
  871.   REPLACE VERSION BY COMPILETIME(20) FOR 1 DIGITS,8".",                 12014000
  872.       COMPILETIME(21) FOR 3 DIGITS;                                     12015000
  873.   REPLACE GREETING BY "UCD A-SERIES KERMIT-",                % [1.023]  12016000
  874.       MACHINE FOR MACHINENAMEL WITH EBCDICTOASCII,           % [1.023]  12017000
  875.       " - VERSION ",VERSION FOR 5 WITH EBCDICTOASCII,NULC;              12018000
  876.   REPLACE FBUF_ BY " " FOR 30 WORDS;                                    12019000
  877.   REPLACE EBUF_ BY " " FOR 16 WORDS;                                    12020000
  878.   SAYP(GREETING,NOINDENT);                                              12021000
  879.   PROMPTOFFSET := PROMPTLENGTH := 8 + MACHINENAMEL;                     1202110001.040.030
  880.   REPLACE KPROMPT BY "KERMIT-",MACHINE FOR MACHINENAMEL      % [1.023]  12022000
  881.       WITH EBCDICTOASCII," ";                                % [1.023]  12023000
  882.                                                                         12024000
  883. % INITIALIZE THESE VALUES AND HOPE THE FIRST PACKET WILL GET ACROSS OK  12025000
  884.                                                                         12026000
  885.   EOL        := CR;                %  EOL FOR OUTGOING PACKETS          12027000
  886.   SOHCHAR    := DEFSOH;            %  SOH FOR OUTGOING PACKETS          12028000
  887.   QUOTE      := "#";               %  STANDARD CONTROL-QUOTE CHAR "#"   12029000
  888.   PAD        := 0;                 %  NO PADDING                        12030000
  889.   PCHAR      := NULC;              %  USE NULC IF ANY PADDING WANTED    12031000
  890.   QBIN       := "N";               %  DEFAULT TO NO BINARY QUOTING      12032000
  891.   REPT       := DEFREPT;           %  [1.021] DEFAULT TO TILDE          12033000
  892.   CHKTYPE    := DEFCHKTYPE;        %  DEFAULT                           1203400001.040.027
  893.   MYPACKSIZ  := SHORTPACKSIZ;      %  SET MINE TO DEFAULTS              1203500001.040.029
  894.   INITRETRY  := DEFINITRETRY;      %  INITIALIZE RETRIES                12036000
  895.   PACKETRETRY:= DEFPACKETRETRY;                                         12037000
  896.   FILERECSIZE:= DEFRECSIZE;                                             12038000
  897.   FILEBLOCKSIZE:= DEFBLOCKSIZE;                                         12039000
  898.   FILEUNITS  := DEFUNITS;                                               12040000
  899.   MYTIME     := DEFTIME;                                                12041000
  900.   MYPAD      := DEFPAD;                                                 12042000
  901.   MYPCHAR    := DEFPCHAR;                                               12043000
  902.   MYEOL      := DEFEOL;                                                 12044000
  903.   MYSOH      := DEFSOH;            % [1.019]                            12045000
  904.   MYQUOTE    := DEFQUOTE;                                               12046000
  905.   MYQBIN     := DEFQBIN;           % [1.019]                            12047000
  906.   MYCHKTYPE  := DEFCHKTYPE;                                             12048000
  907.   MYREPT     := DEFREPT;                                                12049000
  908.   MYPAUSE    := DEFPAUSE;          %  SECONDS ( INPUT IS IN 10THS )     12050000
  909.   MYDELAY    := DEFDELAY;                                               12051000
  910.   MYESCCHR   := DEFESCCHR;                                              12052000
  911.   MYCHKTYPE  := DEFCHKTYPE;                                             1205300001.040.027
  912.   FIXEDRECS  := FALSE;             %  DEFAULT                           12054000
  913.   EXPTABS    := TRUE;              %  DEFAULT -> EXPAND THEM            12055000
  914.   HIBITOK    := FALSE;             % [1.017] 8-BIT ONLY WHEN REQUESTED  12056000
  915.   BINARYON   := FALSE;             % [1.019] CHANGED BY SET BINARY CMD  12057000
  916.   REPTOK     := TRUE;              % [1.021] ENABLE REPEAT PROCESSING   12058000
  917.   KEEPFILE   := TRUE;              %  DEFAULT TO KEEP ALL FILES MADE    12059000
  918.   RAW        := FALSE;             %  USE CR FOR END-OF-LINE            12060000
  919.                                    %  INITIALIZE ACNTRL TABLE           12061000
  920.   REPLACE ACNTRL BY 48"0000FFFFFFFF",0,0,48"000000000001",0,0,0,0;      12062000
  921.   REPLACE BCNTRL BY 0 FOR 8 WORDS;                                      12063000
  922.                                                                         12064000
  923.   THECHKTYPE := DEFCHKTYPE;                                             1206500001.040.027
  924.   MYWINDOWSIZE := DEFWINDOWS;                                           1206600001.040.029
  925.   WINDOWSIZE   := DEFWINDOWS;                                           1206700001.040.029
  926.   PFILNAM := POINTER(FILNAM);                                           1206900001.040.030
  927.   REPLACE CP:POINTER(PACKET) BY KERMITINI.FILENAME;                     1207000001.040.030
  928.   COL := OFFSET(CP) - 1;                                                1207100001.040.030
  929.   REPLACE PACKET BY CP:=POINTER(PACKET) FOR COL WITH EBCDICTOASCII;     1207200001.040.030
  930.   TAKER(FALSE);                                                         1207300001.040.030
  931.   END INITIALIZE;                                                       12099000
  932.                                                                         13000000
  933. %                                                                       13001000
  934. % S C A N I T                                                           13002000
  935. %                                                                       13003000
  936. % SCANS INPUT AND PUTS ITEMS INTO ARRAY AC IN KUNKER-FORM.  PLACES      13004000
  937. % ITEM LENGTH INTO LEN AND RETURNS THE ITEM'S INDEX IN THE SPECIAL      13005000
  938. % ARRAY.                                                                13006000
  939. %                                                                       13007000
  940.                                                                         13008000
  941. REAL PROCEDURE SCANIT;                                                  13009000
  942.   BEGIN                                                                 13010000
  943.   REAL I,J,SAVEJ,CNT;                                                   13012000
  944.                                                                         13013000
  945.   SCANIT := -1;                                                         13014000
  946.   COL_OK_TIL := COL - 1;                                                1301500001.040.030
  947.   SCAN CP:CP FOR COL:COL UNTIL GTR " ";                                 13016000
  948.   IF COL GTR 0 THEN                                                     13017000
  949.     BEGIN                                                               13018000
  950.     COL_OK_TIL := COL;                                                  1301810001.040.030
  951.     SCAN CP FOR I:COL WHILE GTR " ";                                    1301900001.040.026
  952.     IF (I := COL - I) LEQ 23 THEN                                       1301910001.040.026
  953.       BEGIN                                                             1301920001.040.026
  954.       IF CP + (I - 1) = "?" THEN                                        1302000001.040.026
  955.         IF I GTR 1 THEN                                                 13021000
  956.           I := *-1;                                                     13022000
  957.       REPLACE POINTER(AC) BY I.[7:48] FOR 1,                            1302300001.040.026
  958.           CP FOR I, 0 FOR (23-I);                                       1302400001.040.026
  959.       J := SIZE(SPECARA);                                               13025000
  960.       SAVEJ := CNT := -1;                                               13026000
  961.       WHILE J:=*-1 GEQ 0 DO                                             13027000
  962.         IF J := MASKSEARCH(AC[0],                                       13028000
  963.                     40"E0" & REAL(NOT FALSE)[39:MIN(40,I*8)],SPECARA[J])13029000
  964.              GEQ 0 THEN                                                 13030000
  965.           IF CP = POINTER(SPECARA[J])+1 FOR I THEN                      13031000
  966.             TBUF_[CNT:=*+1] := SAVEJ := J;                              13032000
  967.       IF (CNT:=*+1 GTR 1) OR (CP+I = "?") THEN                          13034000
  968.         BEGIN                                                           13035000
  969.         IF CP+I NEQ "?" THEN                                            13036000
  970.           SAY("  ambiguous command, please supply more characters");    13037000
  971.         SAY("  possible commands:");                                    13038000
  972.         WHILE CNT GTR 0 DO                                              13039000
  973.           IF SAVEJ := TBUF_[CNT := *-1] GTR 0 THEN                      13040000
  974.             SAYP(POINTER(SPECARA[SAVEJ])+1,INDENT);                     13041000
  975.         SCANIT := NOERRORV;                                             13042000
  976.         END                                                             13043000
  977.       ELSE                                                              13044000
  978.         SCANIT := SAVEJ;                                                13045000
  979.       CP  := *+I;                                                       13046000
  980.       COL := *-I;                                                       13047000
  981.       END;                                                              1304790001.040.026
  982.     END;                                                                13048000
  983.   END SCANIT;                                                           13049000
  984.                                                                         14000000
  985. %                                                                       14001000
  986. % S C A N U M                                                           14002000
  987. %                                                                       14003000
  988. REAL PROCEDURE SCANUM;                                                  14004000
  989.   BEGIN                                                                 14005000
  990.   REAL I,J,SAVEJ,CNT;                                                   14007000
  991.                                                                         14008000
  992.   SCANUM := INVALIDV;                                                   14009000
  993.   COL_OK_TIL := COL - 1;                                                1401000001.040.030
  994.   SCAN CP:CP FOR COL:COL UNTIL GTR " ";                                 14011000
  995.   IF COL GTR 0 THEN                                                     14012000
  996.     BEGIN                                                               1401210001.040.030
  997.     COL_OK_TIL := COL;                                                  1401220001.040.030
  998.     IF CP IN NUMBERS THEN                                               14013000
  999.       BEGIN                                                             14014000
  1000.       SCAN CP FOR I:COL WHILE IN NUMBERS;                               14015000
  1001.       IF I := COL-I LSS 12 THEN                                         14016000
  1002.         BEGIN                                                           14017000
  1003.         REPLACE AC BY CP FOR I WITH ASCIITOEBCDIC;                      14018000
  1004.         SCANUM := INTEGER(AC,I);                                        14019000
  1005.         END                                                             14020000
  1006.       ELSE                                                              14021000
  1007.         SCANUM := INVALIDV;                                             14022000
  1008.       END                                                               14023000
  1009.     ELSE                                                                14024000
  1010.       IF CP = "?" THEN                                                  14025000
  1011.         SCANUM := QUESTIONV;                                            14026000
  1012.     END;                                                                1402610001.040.030
  1013.   END OF PROCEDURE SCANUM;                                              14027000
  1014. %                                                                       15000000
  1015. % H E L P E R                                                           15001000
  1016. %                                                                       15002000
  1017. % DOES ALL THE HELP STUFF FROM ? OR HELP INPUT                          15003000
  1018. %                                                                       15004000
  1019.                                                                         15005000
  1020.  $BEGINSEGMENT                                                          15006000
  1021.                                                                         15007000
  1022. PROCEDURE HELPER(HELPARA);                                              1500800001.040.031
  1023. ARRAY HELPARA[0];                                                       1500900001.040.031
  1024.   BEGIN                                                                 15011000
  1025.   POINTER P;                                                            15013000
  1026.   REAL LENGTH;                                                          15014000
  1027.   P := POINTER(HELPARA);                                                15083000
  1028.   WHILE LENGTH := REAL(P,1) GTR 0 DO                                    15084000
  1029.     BEGIN                                                               15085000
  1030.     BRD := WRITE(REM,LENGTH,P+1);                                       15086000
  1031.     P := *+(((LENGTH + 6) DIV 6) *6);                                   15087000
  1032.     END;                                                                15088000
  1033.   END HELPER;                                                           15090000
  1034.                                                                         15091000
  1035. %                                                                       1600000001.040.030
  1036. % O P E N I N P U T                                                     1600100001.040.030
  1037. %                                                                       1600200001.040.030
  1038. % OPEN A DISK FILE FOR INPUT                                            1600300001.040.030
  1039. %                                                                       1600400001.040.030
  1040. BOOLEAN PROCEDURE OPENINPUT(FP,LEN);                                    1600500001.040.030
  1041. FILE    FP;                                                             1600600001.040.030
  1042. INTEGER LEN;                                                            1600700001.040.030
  1043.   BEGIN                                                                 1600800001.040.030
  1044.   IF FP.OPEN THEN                                                       1600900001.040.030
  1045.     CLOSE (FP);                                                         1601000001.040.030
  1046.   FP(KIND=DISK,FILETYPE=8,      %  CURRENT DISK FILE                    1601100001.040.030
  1047.      INTMODE=ASCII,             %  SO CHECKSUM, ETC, WILL WORK          1601200001.040.030
  1048.      TRANSLATE=FORCESOFT,INPUTTABLE=EBCDICTOASCII,                      1601300001.040.030
  1049.      MYUSE=IN);                                                         1601400001.040.030
  1050.   SCAN PFILNAM FOR LEN:MAXPACKSIZ UNTIL = NULC;                         1601500001.040.030
  1051.   LEN := MAXPACKSIZ - LEN;      %  LENGTH OF A-SERIES TITLE             1601600001.040.030
  1052.   REPLACE FILNAM1 BY PFILNAM FOR LEN WITH ASCIITOEBCDIC;                1601700001.040.030
  1053.   REPLACE FP.TITLE BY FILNAM1;  %  GIVE IT THE NEW NAME                 1601800001.040.030
  1054.   IF                                                                    1601900001.040.030
  1055.      (IF FP.ATTERR THEN                                                 1602000001.040.030
  1056.         TRUE                                                            1602100001.040.030
  1057.       ELSE                                                              1602200001.040.030
  1058.         (NOT FP.PRESENT))   THEN % FILE ISN'T THERE                     1602300001.040.030
  1059.     BEGIN                                                               1602400001.040.030
  1060.     OPENINPUT := TRUE;                                                  1602500001.040.030
  1061.     END                                                                 1602600001.040.030
  1062.   ELSE                                                                  1602700001.040.030
  1063.     BEGIN                                                               1602800001.040.030
  1064.     IF FP.EXTMODE = VALUE(EBCDIC) THEN % DEFAULT IS TO TRANSLATE IT...  1602900001.040.030
  1065.       BEGIN                                                             1603000001.040.030
  1066.       CLOSE(FP);                                                        1603100001.040.030
  1067.       FP.EXTMODE := VALUE(EBCDIC);                                      1603200001.040.030
  1068.       FP.OPEN := TRUE;                                                  1603300001.040.030
  1069.       END                                                               1603400001.040.030
  1070.     ELSE                                                                1603500001.040.030
  1071.       IF FP.EXTMODE = VALUE(ASCII) THEN % DONT TRANSLATE IT...          1603600001.040.030
  1072.         BEGIN                                                           1603700001.040.030
  1073.         CLOSE(FP);                                                      1603800001.040.030
  1074.         FP.EXTMODE := VALUE(ASCII);                                     1603900001.040.030
  1075.         FP.TRANSLATE := VALUE(FULLTRANS);                               1604000001.040.030
  1076.         FP.OPEN := TRUE;                                                1604100001.040.030
  1077.         END                                                             1604200001.040.030
  1078.       ELSE                                                              1604300001.040.030
  1079.         ;                       %  GIVE UP...?                          1604400001.040.030
  1080.     RECSIZ_ := FP.MAXRECSIZE;                                           1604500001.040.030
  1081.     UNITS_  := IF FP.UNITS=VALUE(CHARACTERS) THEN 1 ELSE 6;             1604600001.040.030
  1082.     END;                                                                1604700001.040.030
  1083.   END OPENINPUT;                                                        1604800001.040.030
  1084. %                                                                       1610000001.040.030
  1085. % D I S K R E A D E R                                                   1610100001.040.030
  1086. %                                                                       1610200001.040.030
  1087. % READ A COMMAND FROM A DISK FILE FOR PROCESSING                        1610300001.040.030
  1088. %                                                                       1610400001.040.030
  1089. BOOLEAN PROCEDURE DISKREADER(FP,MAXREC,UNITZ);                          1610500001.040.030
  1090. VALUE   MAXREC,UNITZ;                                                   1610600001.040.030
  1091. INTEGER MAXREC,UNITZ;                                                   1610700001.040.030
  1092. FILE    FP;                                                             1610800001.040.030
  1093.   BEGIN                                                                 1610900001.040.030
  1094.   CP := POINTER(PACKET);                                                1611000001.040.030
  1095.   IF NOT DISKREADER := READ(FP,MAXREC,PACKET) THEN                      1611100001.040.030
  1096.     BEGIN                                                               1611200001.040.030
  1097.     REPLACE CP BY CP FOR (COL := MAXREC*UNITZ) WITH TOUPPER;            1611300001.040.030
  1098.     END;                                                                1611400001.040.030
  1099.   END;                                                                  1611500001.040.030
  1100. %                                                                       1620000001.040.030
  1101. % R E M O T E R E A D E R                                               1620100001.040.030
  1102. %                                                                       1620200001.040.030
  1103. % READ A COMMAND FROM THE TERMINAL FOR PROCESSING                       1620300001.040.030
  1104. %                                                                       1620400001.040.030
  1105. BOOLEAN PROCEDURE REMOTEREADER;                                         1620500001.040.030
  1106.   BEGIN                                                                 1620600001.040.030
  1107.   REPLACE CP := PACKET BY NULC FOR MAXPACKWDS WORDS;                    1620700001.040.030
  1108.   IF NOT REMOTEREADER := BRD :=                                         1620800001.040.030
  1109.          WRITE(REM[STOP],PROMPTLENGTH,KPROMPT) THEN                     1620900001.040.030
  1110.     BEGIN                                                               1621000001.040.030
  1111.     IF NOT REMOTEREADER := BRD := READ(REM,80,PACKET) THEN              1621100001.040.030
  1112.       BEGIN                                                             1621200001.040.030
  1113.       REPLACE CP BY CP FOR (COL := RD.LENGTHF) WITH TOUPPER;            1621300001.040.030
  1114.       END;                                                              1621400001.040.030
  1115.     END;                                                                1621500001.040.030
  1116.   END;                                                                  1621600001.040.030
  1117.                                                                         20000000
  1118. %                                                                       20001000
  1119. % S E T S T U F F                                                       20002000
  1120. %                                                                       20003000
  1121. % SETS THE VARIOUS THINGS                                               20004000
  1122. %                                                                       20005000
  1123. PROCEDURE SETSTUFF;                                                     20006000
  1124.   BEGIN                                                                 20007000
  1125.   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                         20100000
  1126.   PROCEDURE ABORTER;                                                    20101000
  1127.     BEGIN                                                               20102000
  1128.     SPECARA := SPECABORT;                                               20103000
  1129.     CASE SCANIT OF                                                      20104000
  1130.       BEGIN                                                             20105000
  1131.       QMARKV:                                                           20106000
  1132.         SAY("determines what to do if RECEIVE transfer fails - "        20107000
  1133.             "options are:");                                            20107100
  1134.         HELPER(ABORTHELP);                                              2010800001.040.031
  1135.       DISCARDV:                                                         20109000
  1136.         KEEPFILE := FALSE;                                              20110000
  1137.       KEEPV:                                                            20111000
  1138.         KEEPFILE := TRUE;                                               20112000
  1139.       ELSE:                                                             20113000
  1140.         SAYQOPT("INCOMPLETE");                                          20114000
  1141.         HELPER(ABORTHELP);                                              2011500001.040.031
  1142.       END CASE;                                                         20116000
  1143.     END ABORTER;                                                        20117000
  1144.   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                         20200000
  1145.   PROCEDURE DEBUGGER;                                                   20201000
  1146.     BEGIN                                                               20202000
  1147.     POINTER P;                                                          20203000
  1148.     SPECARA := SPECDEBUG;                                               20204000
  1149.     CASE SCANIT OF                                                      20205000
  1150.       BEGIN                                                             20206000
  1151.       QMARKV:                                                           20207000
  1152.         SAY("  sets level of DEBUGGING output -- options are:");        20208000
  1153.         HELPER(DEBUGHELP);                                              2020900001.040.031
  1154.       STATESV:                                                          20210000
  1155.         DEBUG := TRUE;                                                  20211000
  1156.       PACKETSV:                                                         20212000
  1157.         DEBUG := BOOLEAN(3);                                            20213000
  1158.       LOGFILEV:                                                         20214000
  1159.         IF NOT DEBUG THEN DEBUG := TRUE;                                20215000
  1160.         SCAN CP:CP FOR COL:COL WHILE LEQ " ";                           20216000
  1161.         IF COL GTR 0 THEN                                               20217000
  1162.           BEGIN                                                         20218000
  1163.           SCAN P:CP FOR COL WHILE GEQ "A";                              20219000
  1164.           REPLACE P BY "."48"00";                                       20220000
  1165.           IF LOG.OPEN THEN LOCK(LOG,CRUNCH);                            20221000
  1166.           REPLACE CP BY CP FOR COL+1 WITH ASCIITOEBCDIC;                20222000
  1167.           REPLACE LOG.TITLE BY CP;                                      20223000
  1168.           END;                                                          20224000
  1169.       DOFFV:                                                            20225000
  1170.         DEBUG := FALSE;                                                 20226000
  1171.       ELSE:                                                             20227000
  1172.         SAYQOPT("DEBUGGING");                                           20228000
  1173.         HELPER(DEBUGHELP);                                              2022900001.040.031
  1174.       END CASE;                                                         20230000
  1175.     IF DEBUG THEN                                                       20231000
  1176.       IF NOT LOG.OPEN THEN LOG.OPEN := TRUE                             20232000
  1177.       ELSE                                                              20233000
  1178.     ELSE                                                                20234000
  1179.       IF LOG.OPEN THEN LOCK(LOG,CRUNCH);                                20235000
  1180.     END DEBUGGER;                                                       20236000
  1181.   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                         20300000
  1182.   PROCEDURE DELAYER;                                                    20301000
  1183.     BEGIN                                                               20302000
  1184.     REAL N;                                                             20303000
  1185.     N := SCANUM;                                                        20304000
  1186.     IF (N LSS 0)OR(N GTR 31) THEN                                       20305000
  1187.       IF (N = QUESTIONV) THEN                                           20306000
  1188.         BEGIN                                                           20307000
  1189.         SAY("   sets time to delay (in secs) before");                  20308000
  1190.         SAY("   sending first packet during file SEND");                20309000
  1191.         HELPER(LONUMBERHELP);                                           2031000001.040.031
  1192.         END                                                             20311000
  1193.       ELSE                                                              20312000
  1194.         BEGIN                                                           20313000
  1195.         SAYQ("DELAY");                                                  20314000
  1196.         HELPER(LONUMBERHELP);                                           2031500001.040.031
  1197.         END                                                             20316000
  1198.     ELSE                                                                20317000
  1199.       MYDELAY := N                                                      20318000
  1200.     END DELAYER;                                                        20319000
  1201.   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                         20400000
  1202.   PROCEDURE RETRYER;                                                    20401000
  1203.     BEGIN                                                               20402000
  1204.     REAL N;                                                             20403000
  1205.     SPECARA := SPECRETRY;                                               20404000
  1206.     CASE SCANIT OF                                                      20405000
  1207.       BEGIN                                                             20406000
  1208.       QMARKV:                                                           20407000
  1209.         SAY("   sets number of times to retry an operation");           20408000
  1210.         SAY("   before giving up -  options are:");                     20409000
  1211.         HELPER(RETRYHELP);                                              2041000001.040.031
  1212.       INITCONNV:                                                        20411000
  1213.         N := SCANUM;                                                    20412000
  1214.         IF (N LSS 0) THEN                                               20413000
  1215.           IF (N = QUESTIONV) THEN                                       20414000
  1216.             BEGIN                                                       20415000
  1217.             SAY("   sets number of times to retry initial connection"); 20416000
  1218.             HELPER(NUMBERHELP)                                          2041700001.040.031
  1219.             END                                                         20418000
  1220.           ELSE                                                          20419000
  1221.             BEGIN                                                       20420000
  1222.             SAYQ("INITIAL-CONNECTION");                                 20421000
  1223.             HELPER(NUMBERHELP);                                         2042200001.040.031
  1224.             END                                                         20423000
  1225.         ELSE                                                            20424000
  1226.           INITRETRY := N;                                               20425000
  1227.       RETRYPACKETSV:                                                    20426000
  1228.         N := SCANUM;                                                    20427000
  1229.         IF (N LSS 0) THEN                                               20428000
  1230.           IF (N = QUESTIONV) THEN                                       20429000
  1231.             BEGIN                                                       20430000
  1232.             SAY("   sets number of times to retry regular connection"); 20431000
  1233.             HELPER(NUMBERHELP)                                          2043200001.040.031
  1234.             END                                                         20433000
  1235.           ELSE                                                          20434000
  1236.             BEGIN                                                       20435000
  1237.             SAYQ("PACKETS");                                            20436000
  1238.             HELPER(NUMBERHELP);                                         2043700001.040.031
  1239.             END                                                         20438000
  1240.         ELSE                                                            20439000
  1241.           PACKETRETRY := N;                                             20440000
  1242.       ELSE:                                                             20441000
  1243.         SAYQOPT("RETRY");                                               20442000
  1244.         HELPER(RETRYHELP);                                              2044300001.040.031
  1245.       END CASE                                                          20444000
  1246.     END RETRYER;                                                        20445000
  1247.   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                      20500000
  1248.   PROCEDURE BLOCKER;                                                    20501000
  1249.     BEGIN                                                               20502000
  1250.     REAL N;                                                             20503000
  1251.     N := SCANUM;                                                        20504000
  1252.     IF (N LSS 1) THEN                                                   20505000
  1253.       IF (N = QUESTIONV) THEN                                           20506000
  1254.         BEGIN                                                           20507000
  1255.         SAY("  sets BLOCKSIZE attribute of RECEIVED files");            20508000
  1256.         HELPER(NUMBERHELP);                                             2050900001.040.031
  1257.         END                                                             20510000
  1258.       ELSE                                                              20511000
  1259.         BEGIN                                                           20512000
  1260.         SAYQ("BLOCK-SIZE");                                             20513000
  1261.         HELPER(NUMBERHELP);                                             2051400001.040.031
  1262.         END                                                             20515000
  1263.     ELSE                                                                20516000
  1264.       BEGIN                                                             20517000
  1265.       FILEBLOCKSIZE := N;                                               20518000
  1266.       IF (FILEBLOCKSIZE MOD FILERECSIZE) NEQ 0 THEN                     20519000
  1267.         BEGIN                                                           20520000
  1268.         SAY("Warning: BLOCK-SIZE must be a multiple of RECORD-SIZE");   20521000
  1269.         SAY1("  current settings:       RECORD-SIZE = ",FILERECSIZE);   20522000
  1270.         SAY1("                           BLOCK-SIZE = ",FILEBLOCKSIZE); 20523000
  1271.         END                                                             20524000
  1272.       END                                                               20525000
  1273.     END BLOCKER;                                                        20526000
  1274.   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                         20600000
  1275.   PROCEDURE RECSIZER;                                                   20601000
  1276.     BEGIN                                                               20602000
  1277.     REAL N;                                                             20603000
  1278.     N := SCANUM;                                                        20604000
  1279.     IF (N LSS 1) THEN                                                   20605000
  1280.       IF (N = QUESTIONV) THEN                                           20606000
  1281.         BEGIN                                                           20607000
  1282.         SAY("  sets MAXRECSIZE attribute of RECEIVED files");           20608000
  1283.         HELPER(NUMBERHELP);                                             2060900001.040.031
  1284.         END                                                             20610000
  1285.       ELSE                                                              20611000
  1286.         BEGIN                                                           20612000
  1287.         SAYQ("RECORD-SIZE");                                            20613000
  1288.         HELPER(NUMBERHELP);                                             2061400001.040.031
  1289.         END                                                             20615000
  1290.     ELSE                                                                20616000
  1291.       BEGIN                                                             20617000
  1292.       FILERECSIZE := N;                                                 20618000
  1293.       IF (FILEBLOCKSIZE MOD FILERECSIZE) NEQ 0 THEN                     20619000
  1294.         BEGIN                                                           20620000
  1295.         SAY("Warning: BLOCK-SIZE must be a multiple of RECORD-SIZE");   20621000
  1296.         SAY1("  current settings:       RECORD-SIZE = ",FILERECSIZE);   20622000
  1297.         SAY1("                           BLOCK-SIZE = ",FILEBLOCKSIZE); 20623000
  1298.         END                                                             20624000
  1299.       END                                                               20625000
  1300.     END RECSIZER;                                                       20626000
  1301.   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                         20700000
  1302.   PROCEDURE UNITER;                                                     20701000
  1303.     BEGIN                                                               20702000
  1304.     SPECARA := SPECUNITS;                                               20703000
  1305.     CASE SCANIT OF                                                      20704000
  1306.       BEGIN                                                             20705000
  1307.       QMARKV:                                                           20706000
  1308.         SAY(" set UNITS file attribute for received files "             20707000
  1309.                "-- options are:");                                      20707100
  1310.         HELPER(UNITSHELP);                                              2070800001.040.031
  1311.       UWORDSV:                                                          20709000
  1312.         FILEUNITS := VALUE(WORDS);                                      20710000
  1313.       UCHARACTERSV:                                                     20711000
  1314.         FILEUNITS := VALUE(CHARACTERS);                                 20712000
  1315.       ELSE:                                                             20713000
  1316.         SAYQOPT("UNITS");                                               20714000
  1317.         HELPER(UNITSHELP);                                              2071500001.040.031
  1318.       END CASE;                                                         20716000
  1319.     END OF PROCEDURE UNITER;                                            20717000
  1320.   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                      21000000
  1321.   PROCEDURE SENDRECEIVER(WHICH);                                        21001000
  1322.   VALUE    WHICH;                                                       21002000
  1323.   REAL     WHICH;                                                       21003000
  1324.     BEGIN                                                               21004000
  1325.     REAL N;     % [1.018] NEED TO DECLARE LOCALLY                       21005000
  1326.     INTEGER NDX;                                                        21006000
  1327.     SPECARA := SPECRECEIVE;                                             21007000
  1328.     CASE NDX := SCANIT OF                                               21008000
  1329.       BEGIN                                                             21009000
  1330.       QMARKV:                                                           21010000
  1331.         SAY("  sets various packet parameters - options are:");         21011000
  1332.         HELPER(SENDHELP);                                               2101200001.040.031
  1333.       EOLV:                                                             21013000
  1334.         N := SCANUM;                                                    21014000
  1335.         IF (N LSS 1)OR(N GTR 31) THEN                                   21015000
  1336.           IF (N = QUESTIONV) THEN                                       21016000
  1337.             BEGIN                                                       21017000
  1338.             IF WHICH=SETRECEIVEV THEN                                   21018000
  1339.               SAY("  sets the packet terminator character expect")      21019000
  1340.             ELSE                                                        21020000
  1341.               SAY("  sets the packet terminator character to send");    21021000
  1342.             HELPER(LONUMBERHELP)                                        2102200001.040.031
  1343.             END                                                         21023000
  1344.           ELSE                                                          21024000
  1345.             BEGIN                                                       21025000
  1346.             SAYQ("END-OF-LINE");                                        21026000
  1347.             HELPER(LONUMBERHELP);                                       2102700001.040.031
  1348.             END                                                         21028000
  1349.         ELSE                                                            21029000
  1350.           IF WHICH=SETRECEIVEV THEN                                     21030000
  1351.             MYEOL := N                                                  21031000
  1352.           ELSE                                                          21032000
  1353.             EOL := N;                                                   21033000
  1354.       QUOTEV:                                                           21034000
  1355.         IF WHICH=SETRECEIVEV THEN                                       21035000
  1356.           SAY("  not implemented, no need to set QUOTE to expect")      21036000
  1357.         ELSE                                                            21037000
  1358.           BEGIN                                                         21038000
  1359.           COL_OK_TIL := COL;                                            21039000
  1360.           SCAN CP:CP FOR COL:COL WHILE LEQ " ";                         21040000
  1361.           IF COL GTR 0 THEN                                             21041000
  1362.             BEGIN                                                       21042000
  1363.             IF CP = "?" THEN                                            21043000
  1364.               BEGIN                                                     21044000
  1365.               SAY("  sets QUOTE character to send");                    21045000
  1366.               HELPER(QUOTEHELP)                                         2104600001.040.031
  1367.               END                                                       21047000
  1368.             ELSE                                                        21048000
  1369.               IF N := REAL(CP,1) LSS 33 OR N GTR 126 THEN  % ! < N <    21049000
  1370.                 BEGIN                                                   21050000
  1371.                 SAY("  invalid QUOTE character - must be an");          21051000
  1372.                 HELPER(QUOTEHELP);                                      2105200001.040.031
  1373.                 END                                                     21053000
  1374.               ELSE                                                      21054000
  1375.                 IF N=MYQBIN THEN               %  NO WAY!               21055000
  1376.                   SAY("  QUOTE not set, that character is "             21056000
  1377.                       "your binary quote")                              21056100
  1378.                 ELSE                                                    21057000
  1379.                   IF N=MYREPT THEN             %  NO WAY!               21058000
  1380.                     SAY("  QUOTE not set, that character is "           21059000
  1381.                         "your repeat quote")                            21059100
  1382.                   ELSE                                                  21060000
  1383.                     MYQUOTE := N                                        21061000
  1384.             END                                                         21062000
  1385.           ELSE                                                          21063000
  1386.             BEGIN                                                       21064000
  1387.             SAYQ("QUOTE");                                              21065000
  1388.             HELPER(QUOTEHELP);                                          2106600001.040.031
  1389.             END;                                                        21067000
  1390.           END;                                                          21068000
  1391.       LENV:                                                             21069000
  1392.         N := SCANUM;                                                    21070000
  1393.          IF (N LSS 10) OR (N GTR MAXPACKSIZ) THEN                       2107100001.040.029
  1394.           IF (N = QUESTIONV) THEN                                       21072000
  1395.             BEGIN                                                       21073000
  1396.             IF WHICH=SETRECEIVEV THEN                                   21074000
  1397.               SAY("  set PACKET-LENGTH for incoming packets")           21075000
  1398.             ELSE                                                        21076000
  1399.               SAY("  sets PACKET-LENGTH for outgoing packets");         21077000
  1400.               SAY1("   must be an integer from 10 to ",MAXPACKSIZ);     2107800001.040.029
  1401.             END                                                         21079000
  1402.           ELSE                                                          21080000
  1403.             BEGIN                                                       21081000
  1404.             SAYQ("PACKET-LENGTH");                                      21082000
  1405.               SAY1("   must be an integer from 10 to ",MAXPACKSIZ);     2108300001.040.029
  1406.             END                                                         21084000
  1407.         ELSE                                                            21085000
  1408.           IF WHICH=SETRECEIVEV THEN                                     21086000
  1409.             MYPACKSIZ := N                                              21087000
  1410.           ELSE                                                          21088000
  1411.             SPSIZ := N;                                                 21089000
  1412.       PADV:                                                             21090000
  1413.       PCHARV:                                                           21091000
  1414.       PAUSEV:                                                           21092000
  1415.       STARTOFPACKV:                                                     21093000
  1416.       TIMEOUTV:                                                         21094000
  1417.         N := SCANUM;                                                    21095000
  1418.         IF (N LSS 0)OR(N GTR 31) THEN                                   21096000
  1419.           IF (N = QUESTIONV) THEN                                       21097000
  1420.             BEGIN                                                       21098000
  1421.             IF WHICH=SETRECEIVEV THEN                                   21099000
  1422.               SAY("  sets a packet parameter for incoming packets")     21100000
  1423.             ELSE                                                        21101000
  1424.               SAY("  sets a packet parameter for outgoing packets");    21102000
  1425.             HELPER(LONUMBERHELP);                                       2110300001.040.031
  1426.             END                                                         21104000
  1427.           ELSE                                                          21105000
  1428.             BEGIN                                                       21106000
  1429.             SAYQ("packet");                                             21107000
  1430.             HELPER(LONUMBERHELP);                                       2110800001.040.031
  1431.             END                                                         21109000
  1432.         ELSE                                                            21110000
  1433.           CASE NDX OF                                                   21111000
  1434.             BEGIN                                                       21112000
  1435.             PADV:                                                       21113000
  1436.               IF WHICH=SETRECEIVEV THEN                                 21114000
  1437.                 MYPAD := N                                              21115000
  1438.               ELSE                                                      21116000
  1439.                 PAD := N;                                               21117000
  1440.             PCHARV:                                                     21118000
  1441.               IF WHICH=SETRECEIVEV THEN                                 21119000
  1442.                 MYPCHAR := N                                            21120000
  1443.               ELSE                                                      21121000
  1444.                 PCHAR := N;                                             21122000
  1445.             PAUSEV:                                                     21123000
  1446.               MYPAUSE := N/10;                                          21124000
  1447.             STARTOFPACKV:                                               21125000
  1448.               IF WHICH=SETRECEIVEV THEN                                 21126000
  1449.                 MYSOH := N                                              21127000
  1450.               ELSE                                                      21128000
  1451.                 SOHCHAR := N;                                           21129000
  1452.             TIMEOUTV:                                                   21130000
  1453.               IF N = 0 THEN                                             21131000
  1454.                 SAY("  TIMEOUT must be greater than zero")              21132000
  1455.               ELSE                                                      21133000
  1456.                 IF WHICH=SETRECEIVEV THEN                               21134000
  1457.                   MYTIME := N                                           21135000
  1458.                 ELSE                                                    21136000
  1459.                   TIMINT := N;                                          21137000
  1460.             END CASE;                                                   21138000
  1461.       ACTUALTITLEV:                                                     2113900001.040.038
  1462.         SPECARA := SPECONOFF;                                           2114000001.040.038
  1463.         CASE SCANIT OF                                                  2114100001.040.038
  1464.           BEGIN                                                         2114200001.040.038
  1465.           QMARKV:                                                       2114300001.040.038
  1466.             IF WHICH = SETRECEIVEV THEN                                 2114400001.040.038
  1467.               SAY("  inhibits conversion of received file titles to "   2114500001.040.038
  1468.                   "UNISYS form")                                        2114600001.040.038
  1469.             ELSE                                                        2114700001.040.038
  1470.               SAY("  inhibits conversion of sent file titles to MS-DOS" 2114800001.040.038
  1471.                   " form");                                             2114900001.040.038
  1472.             HELPER(ONOFFHELP);                                          2115000001.040.038
  1473.           ONV:                                                          2115100001.040.038
  1474.             IF WHICH = SETRECEIVEV THEN                                 2115200001.040.038
  1475.               RECACTUALTITLE := TRUE                                    2115300001.040.038
  1476.             ELSE                                                        2115400001.040.038
  1477.               SENDACTUALTITLE := TRUE;                                  2115500001.040.038
  1478.           OFFV:                                                         2115600001.040.038
  1479.             IF WHICH = SETRECEIVEV THEN                                 2115700001.040.038
  1480.               RECACTUALTITLE := FALSE                                   2115800001.040.038
  1481.             ELSE                                                        2115900001.040.038
  1482.               SENDACTUALTITLE := FALSE;                                 2116000001.040.038
  1483.           ELSE:                                                         2116100001.040.038
  1484.             SAYQOPT("ACTUAL-TITLE");                                    2116200001.040.038
  1485.             HELPER(ONOFFHELP);                                          2116300001.040.038
  1486.           END CASE;                                                     2116400001.040.038
  1487.       NOERRORV:                                                         21900000
  1488.         ;                                                               21901000
  1489.       ELSE:                                                             21902000
  1490.         IF WHICH=SETRECEIVEV THEN                                       21903000
  1491.           SAYQOPT("RECEIVE")                                            21904000
  1492.         ELSE                                                            21905000
  1493.           SAYQOPT("SEND");                                              21906000
  1494.         HELPER(SENDHELP);                                               2190700001.040.031
  1495.       END CASE;                                                         21908000
  1496.     END SENDRECEIVER;                                                   21909000
  1497.   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                         22000000
  1498.   PROCEDURE BINARER;                                                    22001000
  1499.     BEGIN                                                               22002000
  1500.     SPECARA := SPECONOFF;                                               22003000
  1501.     CASE SCANIT OF                                                      22004000
  1502.       BEGIN                                                             22005000
  1503.       QMARKV:                                                           22006000
  1504.         SAY("  transfer all 8 bits of each character - options are:");  22007000
  1505.         HELPER(ONOFFHELP);                                              2200800001.040.031
  1506.       ONV:                                                              22009000
  1507.         BINARYON := TRUE;                                               22010000
  1508.       OFFV:                                                             22011000
  1509.         BINARYON := FALSE;                                              22012000
  1510.       ELSE:                                                             22013000
  1511.         SAYQOPT("BINARY");                                              22014000
  1512.         HELPER(ONOFFHELP);                                              2201500001.040.031
  1513.       END CASE;                                                         22016000
  1514.     END BINARER;                                                        22017000
  1515.   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                         22100000
  1516.   PROCEDURE FIXER;                                                      22101000
  1517.     BEGIN                                                               22102000
  1518.     SPECARA := SPECONOFF;                                               22103000
  1519.     CASE SCANIT OF                                                      22104000
  1520.       BEGIN                                                             22105000
  1521.       QMARKV:                                                           22106000
  1522.         SAY("  send trailing blanks found at the end of");              22107000
  1523.         SAY("  fixed-length records -- options are:");                  22108000
  1524.         HELPER(ONOFFHELP);                                              2210900001.040.031
  1525.       ONV:                                                              22110000
  1526.         FIXEDRECS := TRUE;                                              22111000
  1527.       OFFV:                                                             22112000
  1528.         FIXEDRECS := FALSE;                                             22113000
  1529.       ELSE:                                                             22114000
  1530.         SAYQOPT("FIXED");                                               22115000
  1531.         HELPER(ONOFFHELP);                                              2211600001.040.031
  1532.       END CASE;                                                         22117000
  1533.     END FIXER;                                                          22118000
  1534.   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                         22200000
  1535.   PROCEDURE EXPANDTABBER;                                               22201000
  1536.     BEGIN                                                               22202000
  1537.     SPECARA := SPECONOFF;                                               22203000
  1538.     CASE SCANIT OF                                                      22204000
  1539.       BEGIN                                                             22205000
  1540.       QMARKV:                                                           22206000
  1541.         SAY("expand TABs to spaces when RECEIVING files - "             22207000
  1542.             "options are:");                                            22207100
  1543.         HELPER(ONOFFHELP);                                              2220800001.040.031
  1544.       ONV:                                                              22209000
  1545.         EXPTABS := TRUE;                                                22210000
  1546.       OFFV:                                                             22211000
  1547.         EXPTABS := FALSE;                                               22212000
  1548.       ELSE:                                                             22213000
  1549.         SAYQOPT("EXPAND-TABS");                                         22214000
  1550.         HELPER(ONOFFHELP);                                              2221500001.040.031
  1551.       END CASE;                                                         22216000
  1552.     END EXPANDTABBER;                                                   22217000
  1553.   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                         22300000
  1554.   PROCEDURE RAWER;                                                      22301000
  1555.     BEGIN                                                               22302000
  1556.     SPECARA := SPECONOFF;                                               22303000
  1557.     CASE SCANIT OF                                                      22304000
  1558.       BEGIN                                                             22305000
  1559.       QMARKV:                                                           22306000
  1560.         SAY("fill each record to MAXRECSIZE when RECEIVING files -");   22307000
  1561.         SAY("  options are:");                                          22308000
  1562.         HELPER(ONOFFHELP);                                              2230900001.040.031
  1563.       ONV:                                                              22310000
  1564.         RAW := TRUE;                                                    22311000
  1565.         EXPTABS := FALSE;                                               22312000
  1566.         SAY("EXPAND-TABS now set to OFF");                              22313000
  1567.       OFFV:                                                             22314000
  1568.         RAW := FALSE;                                                   22315000
  1569.         IF EXPTABS THEN                                                 22315900
  1570.           SAY("EXPAND-TABS is ON")                                      22316000
  1571.         ELSE                                                            22316100
  1572.           SAY("EXPAND-TABS is OFF");                                    22317000
  1573.       ELSE:                                                             22318000
  1574.         SAYQ("RAW");                                                    22319000
  1575.         HELPER(ONOFFHELP);                                              2232000001.040.031
  1576.       END CASE;                                                         22321000
  1577.     END RAWER;                                                          22322000
  1578.                                                                         22323000
  1579.   %%%%%%%%%%%%%%%%%%%%%%                                                22400000
  1580.   PROCEDURE SETFILER;                                                   22401000
  1581.     BEGIN                                                               22402000
  1582.                                                                         22403000
  1583.     INTEGER NDX;                                                        22404000
  1584.     SPECARA := SPECFILE;                                                22405000
  1585.     CASE (NDX := SCANIT) OF                                             22406000
  1586.       BEGIN                                                             22407000
  1587.       QMARKV:                                                           22408000
  1588.         HELPER(SETFILEHELP);                                            2240900001.040.031
  1589.       BLOCKSIZEV:                                                       22410000
  1590.         BLOCKER;                                                        22411000
  1591.       EXPTABSV:                                                         22412000
  1592.         EXPANDTABBER;                                                   22413000
  1593.       FIXEDV:                                                           22414000
  1594.         FIXER;                                                          22415000
  1595.       RAWV:                                                             22416000
  1596.         RAWER;                                                          22417000
  1597.       RECORDSIZEV:                                                      22418000
  1598.         RECSIZER;                                                       22419000
  1599.       UNITSV:                                                           22420000
  1600.         UNITER;                                                         22421000
  1601.       NOERRORV:                                                         22422000
  1602.         ;                                                               22423000
  1603.       ELSE:                                                             22424000
  1604.         SAYQOPT("FILE");                                                22425000
  1605.         HELPER(SETFILEHELP);                                            2242600001.040.031
  1606.       END OF CASE;                                                      22427000
  1607.     END OF PROCEDURE SETFILER;                                          22428000
  1608.   %%%%%%%%%%%%%%%%%%%%%%%%                                              2250000001.040.027
  1609.   PROCEDURE CHECKSUMTYPER;                                              2250100001.040.027
  1610.     BEGIN                                                               2250200001.040.027
  1611.     REAL N;                                                             2250300001.040.027
  1612.     N := SCANUM;                                                        2250400001.040.027
  1613.     IF (N < CSTYPE1) OR (N > CSTYPE3) THEN                              2250500001.040.027
  1614.       BEGIN                                                             2250600001.040.027
  1615.       IF (N = QUESTIONV) THEN                                           2250700001.040.027
  1616.         BEGIN                                                           2250800001.040.027
  1617.         SAY ("   selects prefered checksum type for file transfer");    2250900001.040.027
  1618.         END                                                             2251000001.040.027
  1619.       ELSE                                                              2251100001.040.027
  1620.         BEGIN                                                           2251200001.040.027
  1621.         SAYQ("BLOCK-CHECK");                                            2251300001.040.027
  1622.         END;                                                            2251400001.040.027
  1623.       HELPER(CHKTYPEHELP);                                              2251500001.040.031
  1624.       END                                                               2251600001.040.027
  1625.     ELSE                                                                2251700001.040.027
  1626.       BEGIN                                                             2251800001.040.027
  1627.       MYCHKTYPE := N;                                                   2251900001.040.027
  1628.       END;                                                              2252000001.040.027
  1629.     END CHECKSUMTYPER;                                                  2252100001.040.027
  1630.                                                                         25000000
  1631.   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% mainline for procedure SETSTUFF  25001000
  1632.   SPECARA := SPECSET;                                                   25002000
  1633.   CASE SCANIT OF                                                        25003000
  1634.     BEGIN                                                               25004000
  1635.     QMARKV:                                                             25005000
  1636.       SAY("  sets various KERMIT environment variables -- "             25006000
  1637.           "options are:");                                              25006100
  1638.       HELPER(SETHELP);                                                  2500700001.040.031
  1639.     INCOMPLETEV:                                                        25008000
  1640.       ABORTER;                                                          25009000
  1641.     BINARYV:                                                            25010000
  1642.       BINARER;                                                          25011000
  1643.     DEBUGV:                                                             25012000
  1644.       DEBUGGER;                                                         25013000
  1645.     DELAYV:                                                             25014000
  1646.       DELAYER;                                                          25015000
  1647.     FILEV:                                                              25016000
  1648.       SETFILER;                                                         25017000
  1649.     RETRYV:                                                             25018000
  1650.       RETRYER;                                                          25019000
  1651.     SETRECEIVEV:                                                        25020000
  1652.       SENDRECEIVER(SETRECEIVEV);                                        25021000
  1653.     SETSENDV:                                                           25022000
  1654.       SENDRECEIVER(SETSENDV);                                           25023000
  1655.     NOERRORV:                                                           25024000
  1656.       ;                                                                 25025000
  1657.    CHECKSUMTYPEV:                                                       2502600001.040.027
  1658.         CHECKSUMTYPER;                                                  2502700001.040.027
  1659.     ELSE:                                                               25076000
  1660.       SAYQOPT("SET");                                                   25077000
  1661.       HELPER(SETHELP);                                                  2507800001.040.031
  1662.     END CASE;                                                           25079000
  1663.   END SETSTUFF;                                                         25089000
  1664.                                                                         25097000
  1665.  $ENDSEGMENT                                                            25098000
  1666.                                                                         25099000
  1667. %                                                                       2600000001.040.030
  1668. %T A K E R                                                              2600100001.040.030
  1669. %                                                                       2600200001.040.030
  1670. %READ KERMIT COMMANDS FROM A DISK FILE                                  2600300001.040.030
  1671. %                                                                       2600400001.040.030
  1672. PROCEDURE TAKER(INITIALIZED);                                           2600500001.040.030
  1673. VALUE   INITIALIZED;                                                    2600600001.040.030
  1674. BOOLEAN INITIALIZED;                                                    2600700001.040.030
  1675.   BEGIN                                                                 2600800001.040.030
  1676.   FILE TAKEF;                                                           2600900001.040.030
  1677.                                                                         2601000001.040.030
  1678.   SCAN CP:CP FOR COL:COL WHILE LEQ " ";                                 2601100001.040.030
  1679.   IF COL > 0 THEN                                                       2601200001.040.030
  1680.     BEGIN                                                               2601300001.040.030
  1681.     IF CP = "?" THEN                                                    2601400001.040.030
  1682.       BEGIN                                                             2601500001.040.030
  1683.       SAY("  takes KERMIT input commands from a disk file");            2601600001.040.030
  1684.       HELPER(TAKEHELP);                                                 2601700001.040.031
  1685.       END                                                               2601800001.040.030
  1686.     ELSE                                                                2601900001.040.030
  1687.       BEGIN                                                             2602000001.040.030
  1688.       IF TAKING THEN                                                    2602100001.040.030
  1689.         BEGIN                                                           2602200001.040.030
  1690.         SAY("   Nested TAKE's not allowed. Command ignored.");          2602300001.040.030
  1691.         END                                                             2602400001.040.030
  1692.       ELSE                                                              2602500001.040.030
  1693.         BEGIN                                                           2602600001.040.030
  1694.         REPLACE PFILNAM BY CP FOR COL WHILE GTR " ",".",NULC;           2602700001.040.030
  1695.         IF OPENINPUT(TAKEF,COL) THEN                                    2602800001.040.030
  1696.           BEGIN                                                         2602900001.040.030
  1697.           IF INITIALIZED THEN                                           2603000001.040.030
  1698.             BEGIN                                                       2603100001.040.030
  1699.             SAYN("CANNOT TAKE FILE:",PFILNAM);                          2603200001.040.030
  1700.             END;                                                        2603300001.040.030
  1701.           END                                                           2603400001.040.030
  1702.         ELSE                                                            2603500001.040.030
  1703.           BEGIN                                                         2603600001.040.030
  1704.           TAKING := TRUE;                                               2603700001.040.030
  1705.           PROMPTOFFSET := 7;                                            2603800001.040.030
  1706.           WHILE NOT DISKREADER(TAKEF,RECSIZ_,UNITS_) DO                 2603900001.040.030
  1707.             BEGIN                                                       2604000001.040.030
  1708.             SAYN("TAKEN: ",CP);                                         2604100001.040.030
  1709.             PROCESSIT;                                                  2604200001.040.030
  1710.             END;                                                        2604300001.040.030
  1711.           PROMPTOFFSET := PROMPTLENGTH;                                 2604400001.040.030
  1712.           TAKING := FALSE;                                              2604500001.040.030
  1713.           END;                                                          2604600001.040.030
  1714.         END;                                                            2604700001.040.030
  1715.       END;                                                              2604800001.040.030
  1716.     END                                                                 2604900001.040.030
  1717.   ELSE                                                                  2605000001.040.030
  1718.     BEGIN                                                               2605100001.040.030
  1719.     SAYQOPT("TAKE");                                                    2605200001.040.030
  1720.     HELPER(TAKEHELP);                                                   2605300001.040.031
  1721.     END;                                                                2605400001.040.030
  1722.   END TAKER;                                                            2605500001.040.030
  1723. %                                                                       2700000001.040.032
  1724. % G E T F I L E T I T L E                                               2700100001.040.032
  1725. %                                                                       2700200001.040.032
  1726. % GETS THE DISK FILE TITLE FOR SENDING                                  2700300001.040.032
  1727. % AND RETURNS TRUE IF THERE ARE MORE FILES IN THE LIST                  2700400001.040.032
  1728. %                                                                       2700500001.040.032
  1729. BOOLEAN PROCEDURE GETFILETITLE;                                         2700600001.040.032
  1730.   BEGIN                                                                 2700700001.040.032
  1731.   POINTER P,Q;                                                          2700800001.040.032
  1732.   REAL I,J;                                                             2700900001.040.032
  1733.                                                                         2701000001.040.032
  1734.   SCAN CP:CP FOR COL:COL WHILE LEQ " ";                                 2701100001.040.032
  1735.   IF COL GTR 0 THEN                                                     2701200001.040.032
  1736.     BEGIN                                                               2701300001.040.032
  1737.     SCAN P:CP FOR I:COL WHILE GTR " ";                                  2701400001.040.032
  1738.     REPLACE PFILNAM:=POINTER(FILNAM) BY CP:CP FOR (COL - I),".",NULC;   2701600001.040.032
  1739.     IF (COL := I) - 1 GTR 0 THEN                                        2701700001.040.032
  1740.       BEGIN                                                             2701800001.040.032
  1741.       SCAN Q:P+1 FOR J:I-1 UNTIL GTR " ";                               2701900001.040.032
  1742.       END;                                                              2702000001.040.032
  1743.     IF GETFILETITLE := (NEXTSENDL := J) GTR 0 THEN                      2702100001.040.032
  1744.       BEGIN                                                             2702200001.040.032
  1745.       REPLACE NEXTSEND BY Q FOR J,NULC;                                 2702300001.040.032
  1746.       END;                                                              2702400001.040.032
  1747.     REPLACE PACKET BY NULC FOR MAXPACKWDS WORDS;                        2702500001.040.032
  1748.     END;                                                                2702600001.040.032
  1749.   END GETFILETITLE;                                                     2702700001.040.032
  1750. %                                                                       2710000001.040.032
  1751. % A N O T H E R F I L E T I T L E                                       2710100001.040.032
  1752. %                                                                       2710200001.040.032
  1753. % TELLS SEND IF THERE ARE MORE FILES IN THE SEND LIST                   2710300001.040.032
  1754. % AND USES GETFILE TITLE TO MOVE THE NEXT NAME INTO FILNAM              2710400001.040.032
  1755. %                                                                       2710500001.040.032
  1756. BOOLEAN PROCEDURE ANOTHERFILETITLE;                                     2710600001.040.032
  1757.   BEGIN                                                                 2710700001.040.032
  1758.   IF ANOTHERFILETITLE := MORETOSEND THEN                                2710800001.040.032
  1759.     BEGIN                                                               2710900001.040.032
  1760.     REPLACE CP := POINTER(PACKET) BY NEXTSEND FOR                       2711000001.040.032
  1761.         COL:NEXTSENDL UNTIL = NULC,NULC;                                2711100001.040.032
  1762.     COL := NEXTSENDL - COL;                                             2711200001.040.032
  1763.     MORETOSEND := GETFILETITLE;                                         2711300001.040.032
  1764.     END;                                                                2711400001.040.032
  1765.   END OF ANOTHERFILETITLE;                                              2711500001.040.032
  1766.                                                                         29000000
  1767. %                                                                       29001000
  1768. % S T A T U S                                                           29002000
  1769. %                                                                       29003000
  1770. % DISPLAY THE STATUS OF ALL THE VARIOUS THINGS                          29004000
  1771. %                                                                       29005000
  1772. PROCEDURE STATUS;                                                       29006000
  1773.   BEGIN                                                                 29007000
  1774.   SAY("parameters which can be changed by the SET command");            29008000
  1775.   IF (BINARYON) THEN                                                    29009000
  1776.     SAY("  BINARY ON (8th bit quoting will be requested)")              29010000
  1777.   ELSE                                                                  29011000
  1778.     SAY("  BINARY OFF (No 8th bit quoting will be done)");              29012000
  1779.   SAY1("  BLOCK-CHECK = ",MYCHKTYPE);                                   2901250001.040.027
  1780.   IF DEBUG THEN                                                         29013000
  1781.     BEGIN                                                               29014000
  1782.     REPLACE PFILNAM:=POINTER(FILNAM) BY LOG.TITLE,NULC;                 29015000
  1783.     REPLACE PFILNAM BY PFILNAM FOR 80 WITH EBCDICTOASCII;               29016000
  1784.     IF REAL(DEBUG) GTR 1 THEN                                           29017000
  1785.       SAYN("  DEBUG STATES and PACKETS to file ",PFILNAM)               29018000
  1786.     ELSE                                                                29019000
  1787.       SAYN("  DEBUG STATES to file ",PFILNAM);                          29020000
  1788.     END                                                                 29021000
  1789.   ELSE                                                                  29022000
  1790.     SAY("  DEBUG OFF");                                                 29023000
  1791.   SAY1("  DELAY before first send (in seconds) = ",MYDELAY);            29024000
  1792.   IF KEEPFILE THEN                                                      29025000
  1793.     SAY("  if INCOMPLETE, KEEP partial file")                           29026000
  1794.   ELSE                                                                  29027000
  1795.     SAY("  if INCOMPLETE, DISCARD partial file");                       29028000
  1796.   SAY1("  RETRY INITIAL-CONNECTION = ",INITRETRY);                      29029000
  1797.   SAY1("  RETRY PACKETS = ",PACKETRETRY);                               29030000
  1798.   SAY("parameters which can be changed by the SET FILE command");       29031000
  1799.   FORM1  ("  RECORD-SIZE = ",FILERECSIZE);                              2903200001.040.028
  1800.   APPEND1(", BLOCK-SIZE = ",FILEBLOCKSIZE);                             2903300001.040.028
  1801.   IF FILEUNITS = VALUE(WORDS) THEN                                      29034000
  1802.     APPEND(", UNITS = WORDS")                                           2903500001.040.028
  1803.   ELSE                                                                  29036000
  1804.     APPEND(", UNITS = CHARACTERS");                                     2903700001.040.028
  1805.   SENDIT;                                                               2903710001.040.028
  1806.   IF EXPTABS THEN                                                       29038000
  1807.     SAY("  EXPAND-TABS ON")                                             29039000
  1808.   ELSE                                                                  29040000
  1809.     SAY("  EXPAND-TABS OFF");                                           29041000
  1810.   IF FIXEDRECS THEN                                                     29042000
  1811.     SAY("  FIXED ON (send blanks found at the end of records)")         29043000
  1812.   ELSE                                                                  29044000
  1813.     SAY("  FIXED OFF (strip blanks from the end of records)");          29045000
  1814.   IF RAW THEN                                                           29046000
  1815.     SAY("  RAW ON ( Burroughs records delimited by size only )")        29047000
  1816.   ELSE                                                                  29048000
  1817.     SAY("  RAW OFF ( Burroughs records delimited by CR )");             29049000
  1818.   SPECARA := SPECSHOW;                                                  29050000
  1819.   CASE SCANIT OF                                                        29051000
  1820.     BEGIN                                                               29052000
  1821.     SHOSENDV:                                                           29053000
  1822.       SAY("parameters which can be changed by the SET SEND command");   29054000
  1823.       SAYC("  END-OF-LINE character = ",EOL);                           29055000
  1824.       SAY1("  maximum PACKET-LENGTH = ",SPSIZ);                         29056000
  1825.       SAY1("  number of PADDING characters = ",PAD);                    29057000
  1826.       IF PAD GTR 0 THEN                                                 29058000
  1827.         SAYC("  PADDING CHARACTER = ",PCHAR);                           29059000
  1828.       SAY1("  PAUSE before packet send (in tenths of second) = ",       29060000
  1829.            MYPAUSE*10);                                                 29060100
  1830.       SAYC("  START-OF-PACKET charcter = ",SOHCHAR);                    29061000
  1831.       SAY1("  packet TIMEOUT (in seconds) = ",TIMINT);                  29062000
  1832.       IF SENDACTUALTITLE THEN                                           2906210001.040.038
  1833.         SAY("  ACTUAL-TITLE ON (send title in UNISYS form)")            2906220001.040.038
  1834.       ELSE                                                              2906230001.040.038
  1835.         SAY("  ACTUAL-TITLE OFF (send title in MS-DOS form)");          2906240001.040.038
  1836.     ELSE:                                                               29063000
  1837.       SAY("parameters which can be changed by the SET RECEIVE command");29064000
  1838.       SAYC("  END-OF-LINE character = ",MYEOL);                         29065000
  1839.       SAY1("  maximum PACKET-LENGTH = ",MYPACKSIZ);                     29066000
  1840.       SAY1("  number of PADDING characters = ",MYPAD);                  29067000
  1841.       IF MYPAD GTR 0 THEN                                               29068000
  1842.         SAYC("  PADDING CHARACTER = ",MYPCHAR);                         29069000
  1843.       SAY1("  PAUSE before packet send (in tenths of second) = ",       29070000
  1844.            MYPAUSE*10);                                                 29070100
  1845.       SAYC("  QUOTE character = ",MYQUOTE);                             29071000
  1846.       SAYC("  START-OF-PACKET character = ",MYSOH);                     29072000
  1847.       SAY1("  packet TIMEOUT (in seconds) = ",MYTIME);                  29073000
  1848.       IF RECACTUALTITLE THEN                                            2907310001.040.038
  1849.         SAY("  ACTUAL-TITLE ON (leave title in received form)")         2907320001.040.038
  1850.       ELSE                                                              2907330001.040.038
  1851.         SAY("  ACTUAL-TITLE OFF (change received title to UNISYS "      2907340001.040.038
  1852.             "form)");                                                   2907350001.040.038
  1853.     END CASE;                                                           29074000
  1854.   END STATUS;                                                           29075000
  1855.                                                                         29076000
  1856.                                                                         30000000
  1857. BOOLEAN PROCEDURE PROCESSIT;                                            30001000
  1858.   BEGIN                                                                 30002000
  1859.   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                        31000000
  1860.   PROCEDURE SERVANT;                                                    31001000
  1861.     BEGIN                                                               31002000
  1862.     BOOLEAN DONTQUIT;             %  LOOP CONTROL                       31003000
  1863.     ARRAY BUFFER[0:MAXPACKWDS];   %  TEMPORARY FILE TITLE BUFFER        31004000
  1864.     FILE DUMMY(KIND=PACK,FILETYPE=7);%TEMPORARY DUMMY FILE              31005000
  1865.     REAL NUM,LEN,TIMER;           %  PACKET NUMBER, LENGTH, TIMEOUT     31006000
  1866.                                                                         31007000
  1867.     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                      31100000
  1868.     PROCEDURE GENERICTHINGS;      %  HANDLE "G" REQUESTS                31101000
  1869.       BEGIN                                                             31102000
  1870.       POINTER PR;                 %  POINTER TO PACKET                  31103000
  1871.       PR := POINTER(PACKET);      %  INITIALIZE IT                      31105000
  1872.       CASE REAL(PR,1) OF                                                31106000
  1873.         BEGIN                                                           31107000
  1874.         "F":                      %  FINISH, BUT DON'T LOGOUT           31108000
  1875.           SPACK("Y",N,0,NULLDATA);%  ACK TO PC AND THEN...              31109000
  1876.           DONTQUIT := FALSE;      %  EXIT FROM WHILE LOOP               31110000
  1877.           BRD := TRUE;            %  AND EXIT FROM MAIN LOOP            31111000
  1878.         "L":                      %  FINISH AND LOG OUT, TOO            31112000
  1879. %         SPACK("Y",N,0,NULLDATA);%  ACK TO PC AND THEN...              31113000
  1880.           SAYN("BYE IS NOT IMPLEMENTED:  ",PACKET);                     31114000
  1881.           DONTQUIT := FALSE;      %  EXIT FROM WHILE LOOP               31115000
  1882.           BRD := TRUE;            %  AND EXIT FROM MAIN LOOP            31116000
  1883.           %                       %  THIS PART ISN'T IMPLEMENTED        31117000
  1884.         ELSE:                     %  SOME OTHER NON-IMPLEMENTED THING   31118000
  1885.           SAYN("THIS IS NOT IMPLEMENTED:  ",PACKET);                    31119000
  1886.         END CASE;                                                       31120000
  1887.       END GENERICTHINGS;                                                31121000
  1888.                                                                         31122000
  1889.     %%%%%%%%%%%%%%%%%%%%%%%%%%%%% mainline statements for SERVANT       31900000
  1890.     STATE := "T";                 %  JUST TO INITIALIZE FOR DEBUG       31901000
  1891.     DONTQUIT := SERVER := TRUE;   %  INITIALIZE BOOLEANS                31902000
  1892.     REPLACE PFILNAM:=POINTER(FILNAM) BY NULC FOR MAXPACKWDS WORDS;      31903000
  1893.     TIMER := IF TIMINT LSS MINTIM OR TIMINT GTR MAXTIM THEN             31904000
  1894.                            MYTIME ELSE TIMINT;                          31905000
  1895.                                                                         31906000
  1896.     WHILE DONTQUIT DO                                                   31907000
  1897.       BEGIN                                                             31908000
  1898.       REM.TIMELIMIT := TIMER;     %  SET UP FOR IO TIMEOUT              31909000
  1899.       IF DEBUG THEN BUGC("SERVANT STATE:  ",STATE);                     31910000
  1900.       CASE RPACK(LEN,NUM,PACKET) OF%  DO WHICHEVER ONE WE NEED          31911000
  1901.         BEGIN                                                           31912000
  1902.         "R":                      %  GET OR RECEIVE A FILE(US TO PC)    31913000
  1903.           N := NUM;               %  RESTART PACKET NUMBERS             31914000
  1904.           LEN := GETPACKETDATA(POINTER(PACKET),LEN,PFILNAM,(12*18)-1);  3191500001.040.036
  1905.           REPLACE PFILNAM BY PFILNAM FOR LEN WITH TOUPPER,".",NULC;     3191600001.040.036
  1906.           REPLACE BUFFER BY PFILNAM FOR LEN+1 WITH ASCIITOEBCDIC;       31917000
  1907.           IF DUMMY.OPEN THEN CLOSE(DUMMY);                              31918000
  1908.           REPLACE DUMMY.TITLE BY BUFFER;                                31919000
  1909.           IF NOT DUMMY.RESIDENT THEN                                    31920000
  1910.             SAYN("NO FILE:  ",FILNAM)                                   31921000
  1911.           ELSE                                                          31922000
  1912.             SENDSW;                                                     31923000
  1913.           STATE := "R";           %  FOR DEBUG                          31927000
  1914.         "S":                      %  SEND A FILE (FROM PC TO US)        31928000
  1915.           RPAR(LEN,PACKET,TRUE);  %  EXCHANGE                           3193000001.040.025
  1916.           SPAR(LEN,PACKET,FALSE); %   PARAMETERS                        3193100001.040.025
  1917.           SPACK("Y",NUM,LEN,PACKET);%[1.017]                            31932000
  1918.           OLDTRY := NUMTRY;       % [1.017] RESET COUNTERS              31933000
  1919.           NUMTRY := 0;            % [1.017]                             31934000
  1920.           N := (NUM+1) MOD64;     % [1.017]                             31935000
  1921.           IF (NOT RECSW("F")) THEN% [1.017] ATTEMPT TO RECEIVE          31936000
  1922.             BEGIN                 % [1.017]                             31937000
  1923.             REPLACE FBUF_ BY "RECEIVE FAILED.";                         31938000
  1924.             ERROR(FBUF_);         % [1.017]                             31939000
  1925.             END;                  % [1.017]                             31940000
  1926.           STATE := "S";           %  FOR DEBUG                          31947000
  1927.         "T":                      %  TIMED OUT                          31948000
  1928.           SPACK("N",N,0,NULLDATA);%  NAK ON TIMEOUT                     31949000
  1929.           STATE := "T";           %  FOR DEBUG                          31950000
  1930.         "G":                      %  GENERIC COMMAND                    31951000
  1931.           GENERICTHINGS;          %  TAKE CARE OF THEM ELSEWHERE        31952000
  1932.         "I":                      %  INITIALIZE PACKETS                 31953000
  1933.           RPAR(LEN,PACKET,TRUE);  %  GET HIS INIT DATA                  3195500001.040.025
  1934.           SPAR(LEN,PACKET,FALSE); %  FILL UP PACKET WITH MY INIT DATA   3195600001.040.025
  1935.           SPACK("Y",NUM,LEN,PACKET);%ACK WITH MY PARAMETERS             3195700001.040.024
  1936.           OLDTRY := NUMTRY;       %  SAVE OLD TRY COUNT                 31958000
  1937.           NUMTRY := 0;            %  INITIALIZE NUMTRY                  31959000
  1938.         ELSE:                     %  WHO KNOWS                          31960000
  1939.           SPACK("N",N,6,PACKET);  %  NAK IT                             31961000
  1940.         0:                        %  UNKNOWN DATACOM ERROR              3196110001.040.024
  1941.           BRD := TRUE;            %  PROBABLY EOF SO GIVE UP            3196120001.040.024
  1942.           DONTQUIT := FALSE;                                            3196130001.040.024
  1943.         END CASE;                                                       31962000
  1944.       END WHILE;                                                        31963000
  1945.     WHEN(5);                      %  MAKE SURE ACK GETS OUT             31964000
  1946.     BRD := TRUE;                  %  EXIT THRU TO EOT                   31965000
  1947.     END SERVANT;                                                        31966000
  1948.   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% mainline statements for PROCESSIT   39000000
  1949.   SPECARA := SPECIAL;                                                   39003000
  1950.   COL_BASE := COL;                                                      39008000
  1951.   SCAN CP:CP FOR COL:COL WHILE LEQ " ";                                 39009000
  1952.   IF COL GTR 0 THEN                                                     39010000
  1953.     CASE SCANIT OF                                                      39011000
  1954.       BEGIN                                                             39012000
  1955.       QMARKV:                                                           39013000
  1956.       HELPV:                                                            39014000
  1957.         HELPER(PLAINHELP);        %  ?, HELP                            3901500001.040.031
  1958.       SERVERV:                                                          39016000
  1959.         SERVANT;                  %  SERVER                             39017000
  1960.       SENDV:                                                            39018000
  1961.         MORETOSEND:=GETFILETITLE; %  SEND                               3901900001.040.032
  1962.         SENDSW;                                                         39020000
  1963.       RECEIVEV:                                                         39024000
  1964.         REPLACE PFILNAM := POINTER(FILNAM) BY NULC FOR MAXPACKWDS WORDS;39025000
  1965.         RECSW("R");                              % [1.017]              39026000
  1966.       SETV:                                                             39033000
  1967.         SETSTUFF;                 %  SET                                39034000
  1968.       SHOWV:                                                            39035000
  1969.       STATUSV:                                                          39036000
  1970.         STATUS;                   %  STATUS                             39037000
  1971.       QUITV:                                                            39038000
  1972.       EXITV:                                                            39039000
  1973.         BRD := TRUE;                                                    39040000
  1974.       NOERRORV:                   %  WE ALREADY GAVE THE ERROR          39041000
  1975.         ;                                                               39042000
  1976.       TAKEV:                      %  TAKE                               3904300001.040.030
  1977.         TAKER(TRUE);                                                    3904400001.040.030
  1978.       ELSE:                       %  GARBAGE?                           39900000
  1979.         SAYQOPT(" ");                                                   39901000
  1980.         HELPER(PLAINHELP);                                              3990200001.040.031
  1981.       END CASE;                                                         39903000
  1982.   END PROCESSIT;                                                        39911000
  1983.                                                                         39912000
  1984.                                                                         40000000
  1985. %                                                                       40001000
  1986. % S E N D S W                                                           40002000
  1987. %                                                                       40003000
  1988. % SENDSW IS THE STATE TABLE SWITCHER FOR SENDING FILES.  IT LOOPS UNTI  40004000
  1989. % EITHER IT FINISHES, OR AN ERROR IS ENCOUNTERED.  THE ROUTINES CALLED  40005000
  1990. % BY SENDSW ARE RESPONSIBLE FOR CHANGING THE STATE.                     40006000
  1991. %                                                                       40007000
  1992.                                                                         40008000
  1993.                                                                         40009000
  1994.  $BEGINSEGMENT                                                          40010000
  1995.                                                                         40011000
  1996. BOOLEAN PROCEDURE SENDSW;                                               40012000
  1997.   BEGIN                                                                 40013000
  1998.   BOOLEAN DONTQUIT;               %  LOOP CONTROL                       40014000
  1999.   FILE FP(KIND=DISK,FILETYPE=8,   %  CURRENT DISK FILE                  40015000
  2000.           INTMODE=ASCII,          %  SO CHECKSUM, ETC, WILL WORK        40016000
  2001.           TRANSLATE=FORCESOFT,INPUTTABLE=EBCDICTOASCII,                 40017000
  2002.           MYUSE=IN);                                                    40018000
  2003.                                                                         40019000
  2004.                                                                         40020000
  2005.                                                                         40021000
  2006.   %                                                                     4010000001.040.033
  2007.   % R E S E N D                                                         4010100001.040.033
  2008.   %                                                                     4010200001.040.033
  2009.   % RESEND A PACKET THAT WAS NACKED OR GOT NO REPLY                     4010300001.040.033
  2010.   %                                                                     4010400001.040.033
  2011.   REAL PROCEDURE RESEND(TRIES);                                         4010500001.040.033
  2012.   VALUE   TRIES;                                                        4010600001.040.033
  2013.   INTEGER TRIES;                                                        4010700001.040.033
  2014.     BEGIN                                                               4010800001.040.033
  2015.     IF NUMTRY := * + 1 < TRIES THEN                                     4010900001.040.033
  2016.       BEGIN                                                             4011000001.040.033
  2017.       IF WRITE(REM[STOP],MSGLEN,SBUFFER) THEN;                          4011100001.040.033
  2018.       IF REAL(DEBUG) > 1 THEN                                           4011200001.040.033
  2019.         BUG1("RESENDING ",MSGLEN);                                      4011300001.040.033
  2020.       END                                                               4011400001.040.033
  2021.     ELSE                                                                4011500001.040.033
  2022.       BEGIN                                                             4011600001.040.033
  2023.       RESEND := "A";                                                    4011700001.040.033
  2024.       IF REAL(DEBUG) > 1 THEN                                           4011800001.040.033
  2025.         BUG("RESEND ABORTING");                                         4011900001.040.033
  2026.       END;                                                              4012000001.040.033
  2027.     END;                                                                4012100001.040.033
  2028.   %                                                                     41000000
  2029.   % S I N I T                                                           41001000
  2030.   %                                                                     41002000
  2031.   % SEND INITIATE: SEND THIS HOST'S PARAMETERS AND GET OTHER SIDE'S BACK41003000
  2032.                                                                         41004000
  2033.                                                                         41005000
  2034.   REAL PROCEDURE SINIT;                                                 41006000
  2035.     BEGIN                                                               41007000
  2036.     REAL NUM, LEN;                %  PACKET NUMBER, LENGTH              41008000
  2037.     REAL NEXTSTATE;               %  STATE TO ADVANCE TO                4100900001.040.033
  2038.                                                                         4101000001.040.033
  2039.     SPAR(LEN,PACKET,TRUE);        %  FILL UP INIT INFO PACKET           4101300001.040.025
  2040.                                                                         41014000
  2041.     IF NOT SERVER THEN            %  WAIT A BIT BEFORE SENDING THE      4101500001.040.033
  2042.       WHEN(MYDELAY);              %  INIT PACKET...                     41016000
  2043.     FLUSHINPUT;                   %  FLUSH PENDING INPUT                41017000
  2044.                                                                         41018000
  2045.     SPACK("S",N,LEN,PACKET);      %  SEND AN S PACKET                   41019000
  2046.     DO                            %  UNTIL WE GET A GOOD REPLY OR ABORT 4101910001.040.033
  2047.       BEGIN                                                             4101920001.040.033
  2048.       CASE RPACK(LEN,NUM,RECPKT) OF%  WHAT WAS THE REPLY?               41020000
  2049.         BEGIN                                                           41021000
  2050.         "N":                      %  NAK, TRY IT AGAIN                  41022000
  2051.           NEXTSTATE := RESEND(INITRETRY);% NAK, TRY IT AGAIN            4102300001.040.033
  2052.         "Y":                      %  ACK                                41024000
  2053.           IF (N = NUM) THEN                                             41025000
  2054.             BEGIN                                                       41026000
  2055.             RPAR(LEN,RECPKT,FALSE);% GET OTHER SIDE'S INIT INFO         4102700001.040.025
  2056.             IF EOL = 0 THEN       %  CHECK AND SET DEFAULTS             41028000
  2057.               EOL := MYEOL;                                             41029000
  2058.             IF QUOTE = 0 THEN                                           41030000
  2059.               QUOTE := MYQUOTE;                                         41031000
  2060.             NUMTRY := 0;          %  RESET TRY COUNTER                  41032000
  2061.             N := (N+1) MOD64;     %  BUMP PACKET COUNT                  41033000
  2062.             NEXTSTATE := "F";     %  OK, CASE STATE TO F                4103400001.040.033
  2063.             END                                                         41035000
  2064.           ELSE                                                          41035100
  2065.             NEXTSTATE := RESEND(INITRETRY);% WRONG ACK, STAY IN S       4103600001.040.033
  2066.                                                                         41037000
  2067.         "E":                      %  ERROR PACKET RECEIVED              41038000
  2068.           PRERRPKT(RECPKT);       %  PRINT IT OUT AND                   41039000
  2069.           NEXTSTATE := "A";       %  ABORT                              4104000001.040.033
  2070.                                                                         41041000
  2071.         "Q":                      %  CHECKSUM FAILURE                   4104110001.040.024
  2072.         "T":                      %  RECEIVE FAILURE, TRY AGAIN         41042000
  2073.           NEXTSTATE := RESEND(INITRETRY);                               4104300001.040.033
  2074.                                                                         41044000
  2075.         ELSE:                     %  ANYTHING ELSE, JUST ABORT          41045000
  2076.           NEXTSTATE := "A";                                             4104600001.040.033
  2077.         END CASE;                                                       41047000
  2078.       END OF LOOP                                                       4104800001.040.033
  2079.     UNTIL NEXTSTATE NEQ 0;        %  ONLY RESEND CAN MAKE NEXTSTATE = 0 4104900001.040.033
  2080.     SINIT := NEXTSTATE;                                                 4105000001.040.033
  2081.     END SINIT;                                                          4105100001.040.033
  2082.                                                                         41052000
  2083.   %                                                                     42000000
  2084.   % S F I L E                                                           42001000
  2085.   %                                                                     42002000
  2086.   % SEND FILE HEADER.                                                   42003000
  2087.                                                                         42004000
  2088.                                                                         42005000
  2089.   REAL PROCEDURE SFILE;                                                 42006000
  2090.     BEGIN                                                               42007000
  2091.     LABEL ACKHERE,QUIT;                                                 42008000
  2092.     REAL NUM, LEN, R;             %  PACKET NUMBER, LENGTH              42009000
  2093.     POINTER NEWFILNAM,            %  POINTER TO FILE NAME TO SEND       42011000
  2094.             CP;                   %  CHAR POINTER                       42012000
  2095.     REAL NEXTSTATE;               %  STATE TO ADVANCE TO                4201210001.040.033
  2096.     CHKTYPE := THECHKTYPE;        %  THE ONE AGREED TO BY BOTH SIDES    4201300001.040.027
  2097.     IF OPENINPUT(FP,LEN) THEN     %  FILE ISN'T THERE                   4202200001.040.030
  2098.       BEGIN                                                             42023000
  2099.       REPLACE FBUF_ BY "CANNOT FIND FILE: ",PFILNAM FOR MAXSENDFILESIZ  42024000
  2100.           WHILE GEQ " ",NULC;                                           42025000
  2101.       ERROR(FBUF_);                                                     42026000
  2102.       SFILE := "A";                                                     42027000
  2103.       GO QUIT;                                                          42028000
  2104.       END;                                                              42029000
  2105.     IF DEBUG THEN BUGN("OPENING FOR SENDING:  ",PFILNAM);               42046000
  2106.     RESIZE(GBUF_,(RECSIZ_ * UNITS_ + 5 + 2) DIV 6);%  ROOM FOR CR, LF   4204900001.040.034
  2107.     LEN := *-1;        % GET RID OF THE EXTRA PERIOD...                 42050000
  2108.     CP := PFILNAM;                                                      4205100001.040.030
  2109.     R := REAL(CP,1).[6:7];                % [1.022] STRIP (USERCODE)    42052000
  2110.     IF (R = "(") THEN                     % [1.022]                     42053000
  2111.       BEGIN                               % [1.022]                     42054000
  2112.       SCAN CP:CP FOR LEN:LEN WHILE NEQ ")";%[1.022]                     42055000
  2113.       IF (LEN GTR 0) THEN                 % [1.022]                     42056000
  2114.         SCAN CP:CP FOR LEN:LEN WHILE = ")";                             42057000
  2115.       END;                                % [1.022]                     42058000
  2116.     IF SENDACTUALTITLE THEN       %  DON'T MUCK WITH IT                 4205810001.040.038
  2117.       BEGIN                                                             4205820001.040.038
  2118.       REPLACE FILNAM1 BY CP FOR LEN;                                    4205830001.040.038
  2119.       END                                                               4205840001.040.038
  2120.     ELSE                                                                4205850001.040.038
  2121.       BEGIN                                                             4205860001.040.038
  2122.       NUM := LEN;                                                       42059000
  2123.       WHILE NUM GTR 0 AND LEN GTR MAXSENDFILESIZ DO % PARE DOWN TITLE   42060000
  2124.         BEGIN                                                           42061000
  2125.         SCAN NEWFILNAM:CP FOR NUM:LEN UNTIL ="/";                       42062000
  2126.         IF NUM GTR 0 THEN                                               42063000
  2127.           SCAN CP:NEWFILNAM FOR LEN:NUM WHILE = "/";                    42064000
  2128.         END;                                                            42065000
  2129.       NUM := LEN;                                                       42066000
  2130.       NEWFILNAM := FILNAM1;                                             42067000
  2131.       WHILE NUM GTR 0 DO                                                42068000
  2132.         BEGIN                                                           42069000
  2133.         REPLACE NEWFILNAM:NEWFILNAM BY CP:CP FOR NUM:NUM WHILE NEQ """; 42070000
  2134.         IF NUM GTR 0 THEN                                               42071000
  2135.           BEGIN                                                         42072000
  2136.           SCAN CP:CP FOR NUM:NUM WHILE = """;                           42073000
  2137.           LEN := *-1;                                                   42074000
  2138.           END;                                                          42075000
  2139.         END;                                                            42076000
  2140.       IF LEN GTR 8 THEN           %  WE'LL HAVE TO INSERT A DOT         42077000
  2141.         BEGIN                                                           42078000
  2142.         LEN := *+1;                                                     42079000
  2143.         REPLACE PFILNAM BY CP:FILNAM1 FOR 8 WITH FIXSLASHES,            42080000
  2144.             "." , CP FOR LEN-8 WITH FIXSLASHES                          42081000
  2145.         END                                                             42082000
  2146.       ELSE                                                              42083000
  2147.         REPLACE PFILNAM BY FILNAM1 FOR LEN WITH FIXSLASHES;             42084000
  2148.       REPLACE FILNAM1 BY PFILNAM FOR LEN, NULC;                         42085000
  2149.       END;                                                              4208510001.040.038
  2150.                                                                         42086000
  2151.                                                                         42087000
  2152.     IF DEBUG THEN                                                       42088000
  2153.       BUGN("SENDING:  ",FILNAM1);                                       42089000
  2154.     LEN := MAKEPACKETDATA(POINTER(FILNAM1),LEN,POINTER(PACKET),         4209000001.040.036
  2155.                           (SPSIZ - 2 - CHKTYPE));                       4209010001.040.036
  2156.     SPACK("F",N,LEN,PACKET);      %  SEND AN F PACKET                   4209100001.040.036
  2157.     DO                            %  UNTIL WE GET A GOOD REPLY OR ABORT 4209110001.040.033
  2158.       BEGIN                                                             4209120001.040.033
  2159.       CASE RPACK(LEN,NUM,RECPKT) OF %WHAT WAS THE REPLY?                42092000
  2160.         BEGIN                                                           42093000
  2161.         "N":                      %  NAK, JUST STAY IN THIS STATE,      42094000
  2162.           NUM := (NUM+63) MOD64;  %  UNLESS IT'S NAK FOR NEXT PACKET    42095000
  2163.           IF N NEQ NUM THEN       %  WHICH IS JUST LIKE AN ACK FOR      42096000
  2164.              NEXTSTATE := RESEND(PACKETRETRY)  % THIS PACKET            4209700001.040.033
  2165.           ELSE GO TO ACKHERE;                                           42098000
  2166.                                                                         42099000
  2167.         "Y":                      %  ACK                                42100000
  2168.   ACKHERE:                                                              42100100
  2169.           IF  N = NUM THEN        %  PACKET NUMBER MATCHES              42101000
  2170.             BEGIN                                                       42102000
  2171.             NUMTRY := 0;          %  RESET TRY COUNTER                  42103000
  2172.             N := (N+1) MOD64;     %  BUMP PACKET COUNT                  42104000
  2173.             IF BSIZE := BUFILL(FP,PACKET) = 0 THEN                      42105000
  2174.                                   %  GET FIRST DATA FROM FILE, ERROR?   42106000
  2175.                NEXTSTATE := "Z"   %  YES, QUIT NOW                      4210700001.040.033
  2176.             ELSE                  %  A GOOD READ                        42108000
  2177.                NEXTSTATE := "D";  %  CASE STATE TO D                    4210900001.040.033
  2178.             END                                                         42110000
  2179.           ELSE                                                          42111000
  2180.              NEXTSTATE := RESEND(PACKETRETRY); % WRONG ACK, STAY IN F   4211200001.040.033
  2181.                                                                         42113000
  2182.         "E":                      %  ERROR PACKET RECEIVED              42114000
  2183.           PRERRPKT(RECPKT);       %  PRINT IT OUT AND                   42115000
  2184.            NEXTSTATE := "A";      %  ABORT                              4211600001.040.033
  2185.                                                                         42117000
  2186.         "Q":                      %  CHECKSUM FAILURE                   4211710001.040.024
  2187.         "T":                      %  RECEIVE FAILURE, STAY IN F STATE   42118000
  2188.            NEXTSTATE := RESEND(PACKETRETRY);                            4211900001.040.033
  2189.         ELSE:                                                           42120000
  2190.            NEXTSTATE := "A";      %  SOMETHING ELSE, JUST "ABORT"       4212100001.040.033
  2191.         END CASE;                                                       42122000
  2192.       END                                                               4212300001.040.033
  2193.     UNTIL NEXTSTATE NEQ 0;        %  ONLY RESEND CAN MAKE NEXTSTATE = 0 4212400001.040.033
  2194.     SFILE := NEXTSTATE;                                                 4212500001.040.033
  2195. QUIT:                                                                   4212600001.040.033
  2196.     END SFILE;                                                          4212700001.040.033
  2197.                                                                         42128000
  2198.   %                                                                     44000000
  2199.   % S D A T A                                                           44001000
  2200.   %                                                                     44002000
  2201.   % SEND FILE DATA                                                      44003000
  2202.                                                                         44004000
  2203.                                                                         44005000
  2204.   REAL PROCEDURE SDATA;                                                 44006000
  2205.     BEGIN                                                               44007000
  2206.     LABEL ACKHERE;                                                      44008000
  2207.     REAL NUM, LEN;                %  PACKET NUMBER, LENGTH              44009000
  2208.     REAL NEXTSTATE;               %  STATE TO ADVANCE TO                4401000001.040.033
  2209.                                                                         4401100001.040.033
  2210.     DO                            %  UNTIL NO LONGER IN D STATE         4401200001.040.033
  2211.       BEGIN                                                             4401300001.040.033
  2212.       SPACK("D",N,BSIZE,PACKET);  %  SEND A D PACKET                    44014000
  2213.       DO                          %  UNTIL WE GET A GOOD REPLY OR ABORT 4401410001.040.033
  2214.         BEGIN                                                           4401420001.040.033
  2215.         CASE RPACK(LEN,NUM,RECPKT) OF % WHAT WAS THE REPLY?             44015000
  2216.           BEGIN                                                         44016000
  2217.           "N":                    %  NAK, JUST STAY IN THIS STATE,      44017000
  2218.                                   %  UNLESS IT'S NAK FOR NEXT PACKET    44018000
  2219.             NUM := (NUM+63) MOD64;%  UNLESS IT'S NAK FOR NEXT PACKET    44019000
  2220.             IF N NEQ NUM THEN     %  WHICH IS JUST LIKE AN ACK FOR      44020000
  2221.               NEXTSTATE := RESEND(PACKETRETRY) % THIS PACKET            4402100001.040.033
  2222.             ELSE                                                        44022000
  2223.               GO TO ACKHERE;                                            44023000
  2224.           "Y":                    %  ACK                                44024000
  2225.   ACKHERE:                                                              44024100
  2226.             IF N = NUM THEN       %  IF WRONG ACK, FAIL                 44025000
  2227.               BEGIN                                                     44026000
  2228.               NUMTRY := 0;        %  RESET TRY COUNTER                  44027000
  2229.               N := (N+1)MOD64;    %  BUMP PACKET COUNT                  44028000
  2230.               IF ((BSIZE := BUFILL(FP,PACKET)) = 0) THEN                44029000
  2231.                                   %  GOT DATA FROM FILE                 44030000
  2232.                 NEXTSTATE := "Z"  %  IF EOF SET STATE TO THAT           4403100001.040.033
  2233.               ELSE                                                      44031100
  2234.                 NEXTSTATE := "D"; %  GOT DATA, STAY IN STATE D          4403200001.040.033
  2235.               END                                                       44033000
  2236.             ELSE                                                        44034000
  2237.               NEXTSTATE := RESEND(PACKETRETRY);                         4403500001.040.033
  2238.                                                                         44036000
  2239.           "E":                    %  ERROR PACKET RECEIVED              44037000
  2240.             PRERRPKT(RECPKT);     %  PRINT IT OUT AND                   44038000
  2241.             NEXTSTATE := "A";     %  ABORT                              4403900001.040.033
  2242.                                                                         44040000
  2243.           "Q":                    %  CHECKSUM FAILURE                   4404010001.040.024
  2244.           "T":                                                          44040900
  2245.             NEXTSTATE := RESEND(PACKETRETRY);% RECEIVE FAILED, STAY IN D4404100001.040.033
  2246.                                                                         44042000
  2247.           ELSE:                                                         44042900
  2248.             NEXTSTATE := "A";     %  ANYTHING ELSE, "ABORT"             4404300001.040.033
  2249.           END CASE;                                                     44044000
  2250.         END                                                             4404500001.040.033
  2251.       UNTIL NEXTSTATE NEQ 0;      %  ONLY RESEND CAN MAKE NEXTSTATE = 0 4404600001.040.033
  2252.       END                                                               4404700001.040.033
  2253.     UNTIL NEXTSTATE NEQ "D";                                            4404800001.040.033
  2254.     SDATA := NEXTSTATE;                                                 4404900001.040.033
  2255.     END SDATA;                                                          4405000001.040.033
  2256.                                                                         4405100001.040.033
  2257.   %                                                                     45000000
  2258.   % S E O F                                                             45001000
  2259.   %                                                                     45002000
  2260.   % SEND END-OF-FILE.                                                   45003000
  2261.                                                                         45004000
  2262.                                                                         45005000
  2263.   REAL PROCEDURE SEOF;                                                  45006000
  2264.     BEGIN                                                               45007000
  2265.     LABEL ACKHERE;                                                      45008000
  2266.     REAL NUM, LEN;                %  PACKET NUMBER, LENGTH              45009000
  2267.     REAL NEXTSTATE;               %  STATE TO ADVANCE TO                4501000001.040.033
  2268.                                                                         45012000
  2269.     SPACK("Z",N,0,PACKET);        %  SEND A "Z" PACKET                  45013000
  2270.     DO                            %  UNTIL WE GET A GOOD REPLY OR ABORT 4501310001.040.033
  2271.       BEGIN                                                             4501320001.040.033
  2272.       CASE RPACK(LEN,NUM,RECPKT) OF %WHAT WAS THE REPLY?                45014000
  2273.         BEGIN                                                           45015000
  2274.         "N":                      %  NAK, JUST STAY IN THIS STATE,      45016000
  2275.                                   %  UNLESS IT'S NAK FOR NEXT PACKET,   45017000
  2276.           NUM := (NUM+63) MOD64;  %  UNLESS IT'S NAK FOR NEXT PACKET    45018000
  2277.           IF N NEQ NUM THEN       %  WHICH IS JUST LIKE AN ACK FOR      45019000
  2278.             NEXTSTATE := RESEND(PACKETRETRY)  % THIS PACKET             4502000001.040.033
  2279.           ELSE                                                          45021000
  2280.             GO TO ACKHERE;                                              45022000
  2281.         "Y":                      %  ACK                                45023000
  2282.   ACKHERE:                                                              45024000
  2283.           IF N = NUM THEN                                               45025000
  2284.             BEGIN                                                       45026000
  2285.             NUMTRY := 0;          %  RESET TRY COUNTER                  45027000
  2286.             N := (N+1) MOD64;     %  AND BUMP PACKET COUNT              45028000
  2287.             IF DEBUG THEN BUGN("CLOSING INPUT FILE:  ",PFILNAM);        45029000
  2288.             CLOSE(FP);            %  CLOSE THE INPUT FILE               45030000
  2289.             IF ANOTHERFILETITLE THEN                                    4503100001.040.032
  2290.               NEXTSTATE := "F"    %  MORE FILES TO SEND                 4503110001.040.033
  2291.             ELSE                                                        4503120001.040.032
  2292.               NEXTSTATE := "B"    %  BREAK, EOT, ALL DONE               4503130001.040.033
  2293.             END                   %  IF WRONG ACK, HOLD OUT             45032000
  2294.           ELSE                                                          45032100
  2295.             NEXTSTATE := RESEND(PACKETRETRY);                           4503300001.040.033
  2296.                                                                         45034000
  2297.         "E":                      %  ERROR PACKET RECEIVED              45035000
  2298.           PRERRPKT(RECPKT);       %  PRINT IT OUT AND                   45036000
  2299.           NEXTSTATE := "A";       %  ABORT                              4503700001.040.033
  2300.                                                                         45038000
  2301.         "Q":                      %  CHECKSUM FAILURE                   4503810001.040.024
  2302.         "T":                                                            45038900
  2303.           NEXTSTATE := RESEND(PACKETRETRY); %RECEIVE FAILURE, STAY IN Z 4503900001.040.033
  2304.                                                                         45040000
  2305.         ELSE:                                                           45040900
  2306.           NEXTSTATE := "A";       %  SOMETHING ELSE, "ABORT"            4504100001.040.033
  2307.         END CASE;                                                       45042000
  2308.       END                                                               4504300001.040.033
  2309.     UNTIL NEXTSTATE NEQ 0;        %  ONLY RESEND CAN MAKE NEXTSTATE = 0 4504400001.040.033
  2310.     SEOF := NEXTSTATE;                                                  4504500001.040.033
  2311.     END SEOF;                                                           4504600001.040.033
  2312.                                                                         45047000
  2313.   %                                                                     46000000
  2314.   % S B R E A K                                                         46001000
  2315.   %                                                                     46002000
  2316.   % SEND BREAK (EOT)                                                    46003000
  2317.                                                                         46004000
  2318.                                                                         46005000
  2319.   REAL PROCEDURE SBREAK;                                                46006000
  2320.     BEGIN                                                               46007000
  2321.     LABEL ACKHERE;                                                      46008000
  2322.     REAL NUM, LEN;                %  PACKET NUMBER, LENGTH              46009000
  2323.     REAL NEXTSTATE;               %  STATE TO ADVANCE TO                4601000001.040.033
  2324.                                                                         46012000
  2325.     SPACK("B",N,0,PACKET);        %  SEND A B PACKET                    46013000
  2326.     DO                            %  UNTIL WE GET A GOOD REPLY OR ABORT 4601310001.040.033
  2327.       BEGIN                                                             4601320001.040.033
  2328.       CASE RPACK(LEN,NUM,RECPKT) OF %WHAT WAS THE REPLY?                46014000
  2329.         BEGIN                                                           46015000
  2330.         "N":                      %  NAK, JUST STAY IN THIS STATE,      46016000
  2331.                                   %  UNLESS NAK FOR PREVIOUS PACKET,    46017000
  2332.           NUM := (NUM+63) MOD64;  %  UNLESS IT'S NAK FOR NEXT PACKET    46018000
  2333.           IF N NEQ NUM THEN       %  WHICH IS JUST LIKE AN ACK FOR      46019000
  2334.             NEXTSTATE := RESEND(PACKETRETRY)  % THIS PACKET             4602000001.040.033
  2335.           ELSE                                                          46021000
  2336.             GO TO ACKHERE;                                              46022000
  2337.                                                                         46023000
  2338.         "Y":                      %  ACK                                46024000
  2339.   ACKHERE:                                                              46025000
  2340.           IF N = NUM THEN         %  IF WRONG ACK, FAIL                 46026000
  2341.             BEGIN                                                       46027000
  2342.             NUMTRY := 0;          %  RESET TRY COUNTER                  46028000
  2343.             N := (N+1) MOD64;     %  AND BUMP PACKET COUNT              46029000
  2344.             NEXTSTATE := "C";     %  CASE STATE TO COMPLETE             4603000001.040.033
  2345.             END                                                         46031000
  2346.           ELSE                                                          46031100
  2347.             NEXTSTATE := RESEND(PACKETRETRY);                           4603200001.040.033
  2348.                                                                         46033000
  2349.         "E":                      %  ERROR PACKET RECEIVED              46034000
  2350.           PRERRPKT(RECPKT);       %  PRINT IT OUT AND                   46035000
  2351.           NEXTSTATE := "A";       %  ABORT                              4603600001.040.033
  2352.                                                                         46037000
  2353.         "Q":                      %  CHECKSUM FAILURE                   4603710001.040.024
  2354.         "T":                                                            46037900
  2355.           NEXTSTATE := RESEND(PACKETRETRY); % RECEIVE FAILURE, STAY IN B4603800001.040.033
  2356.                                                                         46041000
  2357.         ELSE:                                                           46041900
  2358.           NEXTSTATE := "A"        %  OTHER, "ABORT"                     4604200001.040.033
  2359.         END CASE;                                                       46043000
  2360.       END                                                               4604400001.040.033
  2361.     UNTIL NEXTSTATE NEQ 0;        %  ONLY RESEND CAN MAKE NEXTSTATE = 0 4604500001.040.033
  2362.     SBREAK := NEXTSTATE;                                                4604600001.040.033
  2363.     END SBREAK;                                                         4604700001.040.033
  2364.   % MAIN LINE TO SENDSW                                                 49000000
  2365.                                                                         49001000
  2366.                                                                         49002000
  2367.                                                                         49003000
  2368.   STATE := "S";                   %  SEND INITIATE IS THE START STATE   49004000
  2369.   N := 0;                         %  INITIALIZE MESSAGE NUMBER          49005000
  2370.   GCNT_ := -1;                    %  INITIALIZE GETCHAR POINTER, ETC    49006000
  2371.   NUMTRY := 0;                    %  BUG NO TRIES YET                   49007000
  2372.   DONTQUIT := TRUE;               %  INITIALIZE FOR LOOP                49008000
  2373.   REM.TIMELIMIT := IF TIMINT LSS MINTIM OR TIMINT GTR MAXTIM THEN       49009000
  2374.                      MYTIME ELSE TIMINT;                                49010000
  2375.   CHKTYPE := CSTYPE1;             %  FOR STARTUP                        4901100001.040.027
  2376.   WHILE DONTQUIT DO               %  DO THIS AS LONG AS NECESSARY       49012000
  2377.     BEGIN                                                               49013000
  2378.     IF DEBUG THEN BUGC("SENDSW STATE:  ",STATE);                        49014000
  2379.     CASE STATE OF                                                       49015000
  2380.       BEGIN                                                             49016000
  2381.       "S": STATE := SINIT;        %  SEND-INIT                          49017000
  2382.       "F": STATE := SFILE;        %  SEND-FILE                          49018000
  2383.       "D": STATE := SDATA;        %  SEND-DATA                          49019000
  2384.       "Z": STATE := SEOF;         %  SEND-END-OF-FILE                   49020000
  2385.       "B": STATE := SBREAK;       %  SEND-BREAK                         49021000
  2386.       "C": SENDSW := TRUE;        %  COMPLETE                           49022000
  2387.            DONTQUIT:=FALSE;       %  LET'S QUIT                         49023000
  2388.       "A": SENDSW := FALSE;       %  "ABORT"                            49024000
  2389.            DONTQUIT:=FALSE;       %  LET'S QUIT                         49025000
  2390.       ELSE:SENDSW := FALSE;       %  UNKNOWN, FAIL                      49026000
  2391.            DONTQUIT:=FALSE;       %  LET'S QUIT                         49027000
  2392.       END CASE;                                                         49028000
  2393.     END WHILE;                                                          49029000
  2394.   REM.TIMELIMIT := 0;             %  DISABLE REMOTE INPUT TIMELIMIT     49030000
  2395.   CHKTYPE := CSTYPE1;             %  BACK TO DEFAULT                    4903100001.040.027
  2396.   END SENDSW;                                                           49099000
  2397.                                                                         49100000
  2398.  $ENDSEGMENT                                                            49101000
  2399.                                                                         49102000
  2400.                                                                         50000000
  2401. %                                                                       50001000
  2402. % R E C S W                                                             50002000
  2403. %                                                                       50003000
  2404. % THIS IS THE STATE TABLE SWITCHER FOR RECEIVING FILES.                 50004000
  2405.                                                                         50005000
  2406.                                                                         50006000
  2407.  $BEGINSEGMENT                                                          50007000
  2408.                                                                         50008000
  2409. BOOLEAN PROCEDURE RECSW(ISTATE);  % [1.017]                             50009000
  2410. REAL ISTATE;                      % [1.017]                             50010000
  2411.   BEGIN                                                                 50011000
  2412.   BOOLEAN DONTQUIT;                                                     50012000
  2413.   FILE FP(KIND=DISK,MYUSE=OUT,    %  FILE POINTER FOR CURRENT DISK FILE 50013000
  2414.          INTMODE=ASCII,EXTMODE=EBCDIC,UNITS=FILEUNITS,                  50014000
  2415.          TRANSLATE=FULLTRANS,OUTPUTTABLE=ASCIITOEBCDIC,                 50015000
  2416.          MAXRECSIZE=FILERECSIZE,BLOCKSIZE=FILEBLOCKSIZE,                50016000
  2417.          AREASIZE=FILEBLOCKSIZE DIV FILERECSIZE * 10);                  50017000
  2418.                                                                         50018000
  2419.                                                                         50019000
  2420.                                                                         50020000
  2421.   %                                                                     51000000
  2422.   % R I N I T                                                           51001000
  2423.   %                                                                     51002000
  2424.   % RECEIVE INITIALIZATION                                              51003000
  2425.                                                                         51004000
  2426.                                                                         51005000
  2427.   REAL PROCEDURE RINIT;                                                 51006000
  2428.     BEGIN                                                               51007000
  2429.     REAL LEN, NUM;                %  PACKET LENGTH, NUMBER              51008000
  2430.                                                                         51009000
  2431.     IF (NUMTRY:=*+1 LEQ INITRETRY) THEN                                 51010000
  2432.       BEGIN                                                             51011000
  2433.                                                                         51012000
  2434.       CASE IF SERVER AND NUMTRY=1 THEN                                  51013000
  2435.              "S"                                                        51013100
  2436.            ELSE                                                         51014000
  2437.              RPACK(LEN,NUM,PACKET) OF %GET A PACKET                     51015000
  2438.         BEGIN                                                           51016000
  2439.         "S":                      %  SEND-INIT                          51017000
  2440.           RPAR(LEN,PACKET,TRUE);  %  GET THE OTHER SIDE'S INIT DATA     5101900001.040.025
  2441.           SPAR(LEN,PACKET,FALSE); %  FILL UP PACKET WITH MY INIT        5102000001.040.025
  2442.           SPACK("Y",NUM,LEN,PACKET);%ACK WITH MY PARAMETERS             5102100001.040.024
  2443.           OLDTRY := NUMTRY;       %  SAVE OLD TRY COUNT                 51022000
  2444.           NUMTRY := 0;            %  START A NEW COUNTER                51023000
  2445.           N := (NUM+1) MOD64;     %  BUMP PACKET NUMBER, MOD 64         5102400001.040.024
  2446.           RINIT := "F";           %  ENTER FILE-RECEIVE STATE           51025000
  2447.                                                                         51026000
  2448.         "E":                      %  ERROR PACKET RECEIVED              51027000
  2449.           PRERRPKT(PACKET);       %  PRINT IT OUT AND                   51028000
  2450.           RINIT := "A";           %  ABORT                              51029000
  2451.                                                                         51030000
  2452.         "Q" :                     %  CHECKSUM FAILURE                   5103010001.040.024
  2453.         "T":                      %  DIDN'T GET PACKET                  51031000
  2454.           SPACK("N",N,0,NULLDATA);%  RETURN A NAK                       51032000
  2455.           RINIT := STATE;         %  KEEP TRYING                        51033000
  2456.                                                                         51034000
  2457.         ELSE:                                                           51034900
  2458.           RINIT := "A";           %  SOME OTHER PACKET TYPE, "ABORT"    51035000
  2459.         END CASE;                                                       51036000
  2460.       END                                                               51037000
  2461.     ELSE                                                                51037100
  2462.       RINIT := "A";               %  ABORT IF TOO MANY TRIES            51038000
  2463.     END RINIT;                                                          51039000
  2464.                                                                         51040000
  2465.                                                                         51041000
  2466.   %                                                                     52000000
  2467.   % R F I L E                                                           52001000
  2468.   %                                                                     52002000
  2469.   % RECEIVE FILE HEADER                                                 52003000
  2470.                                                                         52004000
  2471.                                                                         52005000
  2472.   REAL PROCEDURE RFILE;                                                 52006000
  2473.     BEGIN                                                               52007000
  2474.     LABEL QUIT;                                                         52008000
  2475.     REAL NUM, LEN;                %  PACKET NUMBER, LENGTH              52009000
  2476.     POINTER NEWFILNAM;                                                  52011000
  2477.     CHKTYPE := THECHKTYPE;        %  THE ONE AGREED TO BY BOTH SIDES    5201200001.040.027
  2478.     IF (NUMTRY:=*+1 LEQ PACKETRETRY+1) THEN                             52013000
  2479.       BEGIN                                                             52014000
  2480.                                                                         52015000
  2481.       CASE RPACK(LEN,NUM,PACKET) OF %GET A PACKET                       52016000
  2482.         BEGIN                                                           52017000
  2483.         "S":                      %  SEND-INIT, MAYBE OUR ACK LOST      52018000
  2484.           IF OLDTRY := *+1 LEQ PACKETRETRY+1 THEN                       52019000
  2485.             BEGIN                                                       52020000
  2486.             IF NUM = (N+63) MOD64 THEN                                  52021000
  2487.                                   %  PREVIOUS PACKET, MOD 64 ?          52022000
  2488.               BEGIN               %  YES, ACK IT AGAIN WITH             52023000
  2489.               SPAR(LEN,PACKET,FALSE);%OUR SEND-INIT PARAMETERS          5202500001.040.025
  2490.               SPACK("Y",NUM,LEN,PACKET);% [1.019] FIX LENGTH PARAMETER  52026000
  2491.               NUMTRY := 0;        %  RESET TRY COUNTER                  52027000
  2492.               RFILE := STATE;     %  STAY IN THIS STATE                 52028000
  2493.               END                                                       52029000
  2494.             ELSE                                                        52029900
  2495.               RFILE := "A";       %  NOT PREVIOUS PACKET, "ABORT"       52030000
  2496.             END                                                         52031000
  2497.           ELSE                                                          52031100
  2498.             RFILE := "A";                                               52032000
  2499.                                                                         52033000
  2500.         "Z":                      %  END-OF-FILE                        52034000
  2501.           IF (OLDTRY := *+1 LEQ PACKETRETRY+1) THEN                     52035000
  2502.             BEGIN                                                       52036000
  2503.             IF NUM = (N+63) MOD64 THEN                                  52037000
  2504.                                   %  PREVIOUS PACKET, MOD 64 ?          52038000
  2505.               BEGIN               %  YES, ACK IT AGAIN.                 52039000
  2506.               SPACK("Y",NUM,0,NULLDATA);                                52040000
  2507.               NUMTRY := 0;                                              52041000
  2508.               RFILE := STATE;     %  STAY IN THIS STATE                 52042000
  2509.               END                                                       52043000
  2510.             ELSE                                                        52043100
  2511.               RFILE := "A";       %  NOT PREVIOUS PACKET, "ABORT"       52044000
  2512.             END                                                         52045000
  2513.           ELSE                                                          52045100
  2514.             RFILE := "A";         %  ABORT IT                           52046000
  2515.                                                                         52047000
  2516.         "F":                      %  FILE HEADER (JUST WHAT WE WANT)    52048000
  2517.           IF NUM = N THEN         %  THE PACKET NUMBER MUST BE RIGHT    52049000
  2518.             BEGIN                                                       52050000
  2519.             LEN := GETPACKETDATA(POINTER(PACKET),LEN,PFILNAM,12*18-1);  5205100001.040.036
  2520.             REPLACE PFILNAM BY PFILNAM FOR LEN WITH TOUPPER,".",NULC;   5205200001.040.036
  2521.             REPLACE FILNAM1 BY PFILNAM FOR (LEN+2) WITH ASCIITOEBCDIC;  5205300001.040.037
  2522.             IF NOT RECACTUALTITLE THEN   %  MUCK WITH IT                5205310001.040.038
  2523.               IF COBBLE(FILNAM1,LEN) THEN % NOTHING USABLE              5205400001.040.037
  2524.                 BEGIN                                                   5205500001.040.037
  2525.                 REPLACE PF_:FBUF_ BY "CANNOT USE TITLE: ",              5205510001.040.037
  2526.                     PFILNAM FOR LEN,NULC;                               5205520001.040.037
  2527.                 ERROR(FBUF_);                                           5205530001.040.037
  2528.                 RFILE := "A";                                           5205540001.040.037
  2529.                 GO QUIT;                                                5205550001.040.037
  2530.                 END;                                                    5205600001.040.037
  2531.             IF FP.OPEN THEN                                             52057000
  2532.               CLOSE(FP);                                                52057100
  2533.             IF KEEPFILE THEN                                            52057900
  2534.               FP.PROTECTION := VALUE(SAVE)                              52058000
  2535.             ELSE                                                        52058100
  2536.               FP.PROTECTION := VALUE(TEMPORARY);                        52059000
  2537.             REPLACE FP.TITLE BY FILNAM1;                                52061000
  2538.             IF                                                          5206200001.040.037
  2539.                IF FP.ATTERR THEN                                        5206210001.040.037
  2540.                  TRUE                                                   5206220001.040.037
  2541.                ELSE                                                     5206230001.040.037
  2542.                  NOT FP.PRESENT   THEN % DIDN'T OPEN THE FILE           5206240001.040.037
  2543.               BEGIN                                                     52063000
  2544.               REPLACE FBUF_ BY "CANNOT CREATE: ",PFILNAM FOR LEN,NULC;  52064000
  2545.               ERROR(FBUF_);                                             52065000
  2546.               RFILE := "A";                                             52066000
  2547.               GO QUIT;                                                  52067000
  2548.               END                                                       52068000
  2549.             ELSE                  %  OK, GIVE MESSAGE                   52069000
  2550.               IF DEBUG THEN                                             52070000
  2551.                 BUGN("RECEIVING:  ",PFILNAM);                           52071000
  2552.             RECSIZ_ := FP.MAXRECSIZE;                                   52072000
  2553.             UNITS_  := IF FP.UNITS=VALUE(CHARACTERS) THEN 1 ELSE 6;     52073000
  2554.             RESIZE(PBUF_,(RECSIZ_ * UNITS_ +6) DIV 6);% SET UP BUFFER   52074000
  2555.             REPLACE PP_ := POINTER(PBUF_) BY " " FOR                    52075000
  2556.                 PCNT_ := (RECSIZ_ * UNITS_);                            5207600001.040.035
  2557.             SPACK("Y",N,0,NULLDATA);% ACKNOWLEDGE THE FILE HEADER       52077000
  2558.             OLDTRY := NUMTRY;     %  RESET TRY COUNTERS                 52078000
  2559.             NUMTRY := 0;          %  ...                                52079000
  2560.             N := (N+1) MOD64;     %  BUMP PACKET NUMBER, MOD 64         52080000
  2561.             RFILE := "D";         %  CASE TO DATA STATE                 52081000
  2562.             END                                                         52082000
  2563.           ELSE                                                          52082100
  2564.             RFILE := "A";                                               52083000
  2565.                                                                         52084000
  2566.         "B":                      %  BREAK TRANSMISSION (EOT)           52085000
  2567.           IF NUM = N THEN         %  NEED RIGHT PACKET NUMBER HERE      52086000
  2568.             BEGIN                                                       52087000
  2569.             SPACK("Y",N,0,NULLDATA);% BUG OK                            52088000
  2570.             RFILE := "C";         %  GO TO COMPLETE STATE               52089000
  2571.             END                                                         52090000
  2572.           ELSE                                                          52090100
  2573.             RFILE := "A";                                               52091000
  2574.                                                                         52092000
  2575.         "E":                      %  ERROR PACKET RECEIVED              52093000
  2576.           PRERRPKT(PACKET);       %  PRINT IT OUT AND                   52094000
  2577.           RFILE := "A";           %  ABORT                              52095000
  2578.                                                                         52096000
  2579.         "Q" :                     %  CHECKSUM FAILURE                   5209610001.040.024
  2580.         "T":                      %  DIDN'T GET PACKET                  52097000
  2581.           SPACK("N",N,0,NULLDATA);%  RETURN A NAK                       52098000
  2582.           RFILE := STATE;         %  KEEP TRYING                        52099000
  2583.                                                                         52100000
  2584.         ELSE:                                                           52100900
  2585.           RFILE := "A";           %  SOME OTHER PACKET, "ABORT"         52101000
  2586.         END CASE;                                                       52102000
  2587.       END                                                               52103000
  2588.     ELSE                                                                52103100
  2589.       RFILE := "A";               %  ABORT IF TOO MANY TRIES            52104000
  2590.   QUIT:                                                                 52105000
  2591.     END RFILE;                                                          52106000
  2592.                                                                         52107000
  2593.                                                                         52108000
  2594.   %                                                                     54000000
  2595.   % R D A T A                                                           54001000
  2596.   %                                                                     54002000
  2597.   % RECEIVE DATA                                                        54003000
  2598.                                                                         54004000
  2599.                                                                         54005000
  2600.   REAL PROCEDURE RDATA;                                                 54006000
  2601.     BEGIN                                                               54007000
  2602.     REAL NUM, LEN;                %  PACKET NUMBER, LENGTH              54008000
  2603.     IF NUMTRY:=*+1 LEQ PACKETRETRY+1 THEN                               54009000
  2604.       BEGIN                                                             54010000
  2605.       CASE RPACK(LEN,NUM,PACKET) OF% GET PACKET                         54012000
  2606.         BEGIN                                                           54013000
  2607.         "D":                      %  GOT DATA PACKET                    54014000
  2608.           IF NUM NEQ N THEN       %  RIGHT PACKET?                      54015000
  2609.             BEGIN                 %  NO                                 54016000
  2610.             IF OLDTRY := *+1 LEQ PACKETRETRY+1 THEN                     54017000
  2611.               BEGIN                                                     54018000
  2612.               IF NUM = (N+63) MOD64 THEN                                54019000
  2613.                                   %  ELSE CHECK PACKET NUMBER           54020000
  2614.                 BEGIN             %  PREVIOUS PACKET AGAIN?             54021000
  2615.                 SPACK("Y",NUM,0,NULLDATA);  % [1.020] YES, RE-ACK IT    54022000
  2616.                 NUMTRY := 0;      %  RESET TRY COUNTER                  54023000
  2617.                 RDATA := STATE;   %  DON'T WRITE OUT DATA!              54024000
  2618.                 END                                                     54025000
  2619.               ELSE                                                      54025100
  2620.                 RDATA := "A";     %  SORRY, WRONG NUMBER                54026000
  2621.               END                                                       54027000
  2622.             ELSE                                                        54027100
  2623.               RDATA := "A";                                             54028000
  2624.             END                                                         54029000
  2625.           ELSE                                                          54029100
  2626.             BEGIN                                                       54030000
  2627.                                   %  GOT DATA WITH RIGHT PACKET NUMBER  54031000
  2628.             BUFEMP(FP,PACKET,LEN);%  WRITE THE DATA TO THE FILE         54032000
  2629.             SPACK("Y",N,0,NULLDATA);%ACKNOWLEDGE THE PACKET             54033000
  2630.             OLDTRY := NUMTRY;     %  RESET THE TRY COUNTERS             54034000
  2631.             NUMTRY := 0;          %  ...                                54035000
  2632.             N := (N+1) MOD64;     %  BUMP PACKET NUMBER, MOD 64         54036000
  2633.             RDATA := "D";         %  REMAIN IN DATA STATE               54037000
  2634.             END;                                                        54038000
  2635.                                                                         54039000
  2636.         "F":                      %  GOT A FILE HEADER                  54040000
  2637.           IF OLDTRY := *+1 LEQ PACKETRETRY+1 THEN                       54041000
  2638.             BEGIN                                                       54042000
  2639.             IF NUM = (N+63) MOD64 THEN                                  54043000
  2640.                                   %  ELSE CHECK PACKET NUMBER           54044000
  2641.               BEGIN               %  IT WAS THE PREVIOUS ONE            54045000
  2642.               SPACK("Y",NUM,0,NULLDATA);%  ACK IT AGAIN                 54046000
  2643.               NUMTRY := 0;        %  RESET TRY COUNTER                  54047000
  2644.               RDATA := STATE;     %  STAY IN DATA STATE                 54048000
  2645.               END                                                       54049000
  2646.             ELSE                                                        54049100
  2647.               RDATA := "A";       %  NOT PREVIOUS PACKET, "ABORT"       54050000
  2648.             END                                                         54051000
  2649.           ELSE                                                          54051100
  2650.             RDATA := "A";         %  ABORT IT                           54052000
  2651.                                                                         54053000
  2652.         "Z":                      %  END-OF-FILE                        54054000
  2653.           IF NUM = N THEN         %  MUST HAVE RIGHT PACKET NUMBER      54055000
  2654.             BEGIN                                                       54056000
  2655.             SPACK("Y",N,0,NULLDATA);% OK, ACK IT.                       54057000
  2656.             IF PCNT_ LSS RECSIZ_*UNITS_ THEN                            5405800001.040.035
  2657.               BEGIN                                                     5405810001.040.035
  2658.               REPLACE PP_ BY " " FOR PCNT_;                             5405820001.040.035
  2659.               BRD:=WRITE(FP,RECSIZ_,PBUF_);%  FLUSH THE BUFFER          54059000
  2660.               END;                                                      5405910001.040.035
  2661.             LOCK(FP,CRUNCH);      %  LOCK THE FILE                      54060000
  2662.             N := (N+1) MOD64;     %  BUMP PACKET NUMBER                 54061000
  2663.             RDATA := "F";         %  GO BACK TO RECEIVE FILE STATE      54062000
  2664.             END                                                         54063000
  2665.           ELSE                                                          54063100
  2666.             RDATA := "A";                                               54064000
  2667.                                                                         54065000
  2668.         "E":                      %  ERROR PACKET RECEIVED              54066000
  2669.           PRERRPKT(PACKET);       %  PRINT IT OUT AND                   54067000
  2670.           RDATA := "A";           %  ABORT                              54068000
  2671.                                                                         54069000
  2672.         "Q" :                     %  CHECKSUM FAILURE                   5406910001.040.024
  2673.         "T":                      %  DIDN'T GET PACKET                  54070000
  2674.           SPACK("N",N,0,NULLDATA);%  RETURN A NAK                       54071000
  2675.           RDATA := STATE;         %  KEEP TRYING                        54072000
  2676.                                                                         54073000
  2677.         ELSE:                                                           54073900
  2678.           RDATA := "A";           %  SOME OTHER PACKET, "ABORT"         54074000
  2679.         END CASE;                                                       54075000
  2680.       END                                                               54076000
  2681.     ELSE                                                                54076100
  2682.       RDATA := "A";               %  ABORT IF TOO MANY TRIES            54077000
  2683.     END RDATA;                                                          54078000
  2684.                                                                         54079000
  2685.   % MAIN LINE TO RECSW                                                  59000000
  2686.                                                                         59001000
  2687.                                                                         59002000
  2688.                                                                         59003000
  2689.   STATE := ISTATE;                % [1.017] START STATE IS PASSED IN    59004000
  2690.   % [1.017] N := 0;               %  INITIALIZE MESSAGE NUMBER          59005000
  2691.   NUMTRY := 0;                    %  BUG NO TRIES YET                   59006000
  2692.   DONTQUIT := TRUE;               %  LOOP INITIALIZATION                59007000
  2693.   REM.TIMELIMIT := IF TIMINT LSS MINTIM OR TIMINT GTR MAXTIM THEN       59008000
  2694.                      MYTIME ELSE TIMINT;                                59009000
  2695.   CHKTYPE := CSTYPE1;             %  FOR STARTUP                        5901000001.040.027
  2696.   WHILE DONTQUIT DO                                                     59011000
  2697.     BEGIN                                                               59012000
  2698.     IF DEBUG THEN BUGC("RECSW STATE:  ",STATE);                         59013000
  2699.     CASE STATE OF                                                       59014000
  2700.       BEGIN                                                             59015000
  2701.       "R": STATE := RINIT;        %  RECEIVE-INIT                       59016000
  2702.       "F": STATE := RFILE;        %  RECEIVE-FILE                       59017000
  2703.       "D": STATE := RDATA;        %  RECEIVE-DATA                       59018000
  2704.       "C": RECSW := TRUE;         %  COMPLETE STATE                     59019000
  2705.            DONTQUIT := FALSE;     %  LET'S QUIT                         59020000
  2706.       "A": RECSW := FALSE;        %  "ABORT" STATE                      59021000
  2707.            DONTQUIT := FALSE;     %  LET'S QUIT                         59022000
  2708.       ELSE:RECSW := FALSE;        %  UNKNOWN STATE                      59023000
  2709.            DONTQUIT := FALSE;     %  LET'S QUIT                         59024000
  2710.       END CASE;                                                         59025000
  2711.     END WHILE;                                                          59026000
  2712.   REM.TIMELIMIT := 0;             %  DISABLE REMOTE INPUT TIMELIMIT     59027000
  2713.   CHKTYPE := CSTYPE1;             %  BACK TO DEFAULT                    5902800001.040.027
  2714.   END RECSW;                                                            59099000
  2715.  $ENDSEGMENT                                                            59101000
  2716.                                                                         59102000
  2717.                                                                         60000000
  2718. %                                                                       60001000
  2719. % KERMIT UTILITIES.                                                     60002000
  2720. %                                                                       60003000
  2721.                                                                         60004000
  2722.                                                                         60005000
  2723. %                                                                       60006000
  2724. % S P A C K                                                             60007000
  2725. %                                                                       60008000
  2726. % SEND A PACKET                                                         60009000
  2727.                                                                         60010000
  2728.                                                                         60011000
  2729.  $BEGINSEGMENT                                                          6001200001.040.024
  2730.                                                                         60013000
  2731. PROCEDURE SPACK(TYPE,NUM,LEN,DATA);                                     6001400001.040.024
  2732. VALUE    TYPE,NUM,LEN;                                                  6001500001.040.024
  2733. REAL     TYPE,NUM,LEN;                                                  6001600001.040.024
  2734. ARRAY    DATA[0];                                                       6001700001.040.024
  2735.   BEGIN                                                                 6001800001.040.024
  2736.   INTEGER HEADERTYPE,I;                                                 6001900001.040.033
  2737.   HEADERTYPE := 3;                                                      6002000001.040.024
  2738.   IF LONGPACKETSOK THEN                                                 6002100001.040.024
  2739.     BEGIN                                                               6002200001.040.024
  2740.     IF (LEN + CHKTYPE + 2) > SHORTPACKSIZ THEN                          6002300001.040.029
  2741.       BEGIN                                                             6002400001.040.024
  2742.       HEADERTYPE := 0;                                                  6002500001.040.024
  2743.       END;                                                              6002600001.040.024
  2744.     END;                                                                6002700001.040.024
  2745.   %                                                                     6002800001.040.024
  2746.   IF REAL(DEBUG) GTR 1 THEN       %  DISPLAY OUTGOING PACKET            6002900001.040.024
  2747.     BEGIN                                                               6003000001.040.024
  2748.     BUGC("SPACK TYPE:  ",TYPE);                                         6003100001.040.024
  2749.     BUG1("NUM:  ",NUM);                                                 6003200001.040.024
  2750.     BUG1("LEN:  ",LEN);                                                 6003300001.040.024
  2751.     BUG1("HTYPE:",HEADERTYPE);                                          6003400001.040.024
  2752.     IF LEN GTR 0 THEN                                                   6003500001.040.024
  2753.       BUGN("DATA: ",DATA);                                              6003600001.040.024
  2754.     END;                                                                6003700001.040.024
  2755.   SPB := POINTER(SBUFFER);                                              6003800001.040.024
  2756.   MSGLEN := LEN + 3;              %  # OF BYTES TO CHECKSUM             6003900001.040.024
  2757.   %                                                                     6004000001.040.024
  2758.   IF PAD > 0 THEN                                                       6004100001.040.024
  2759.     BEGIN                                                               6004200001.040.024
  2760.     REPLACE SPB:SPB BY CH(PCHAR,PAD);                                   6004300001.040.024
  2761.     END;                                                                6004400001.040.024
  2762.   REPLACE SPB:SPB BY CH(SOHCHAR,1);% PACKET MARKER                      6004500001.040.024
  2763.   SPC := SPB;                     %  FOR CHECKSUMS                      6004600001.040.024
  2764.   IF HEADERTYPE NEQ 3 THEN        %  PUT IN HEADERTYPE                  6004700001.040.024
  2765.     REPLACE SPB:SPB BY CH(TOCHAR(HEADERTYPE),1)                         6004800001.040.024
  2766.   ELSE                            %  PUT IN LENGTH                      6004900001.040.024
  2767.     REPLACE SPB:SPB BY CH(TOCHAR(LEN + 2 + CHKTYPE),1);                 6005000001.040.024
  2768.   REPLACE SPB:SPB BY CH(TOCHAR(NUM),1),CH(TYPE,1);                      6005100001.040.024
  2769.   IF HEADERTYPE = 0 THEN          %  TYPE 0 HEADER INCLUDES             6005200001.040.024
  2770.     BEGIN                         %  LENGTH AND A CHECKSUM              6005300001.040.024
  2771.     REPLACE SPB:SPB BY                                                  6005400001.040.024
  2772.         CH(TOCHAR((LEN + CHKTYPE) DIV PACKETMOD),1),                    6005500001.040.024
  2773.         CH(TOCHAR((LEN + CHKTYPE) MOD PACKETMOD),1);                    6005600001.040.024
  2774.     REPLACE SPB:SPB BY CHKSUM := CHECKSUM(SPC,5,CSTYPE1) FOR CSTYPE1;   6005700001.040.024
  2775.     MSGLEN := * + 2 + CSTYPE1;                                          6005800001.040.024
  2776.     IF REAL(DEBUG) GTR 1 THEN     %  DISPLAY TYPE 0 HEADER              6005900001.040.024
  2777.       BEGIN                                                             6006000001.040.024
  2778.       BUGH("SCHK: ",CHKSUM);                                            6006100001.040.024
  2779.       END;                                                              6006200001.040.024
  2780.     END;                                                                6006300001.040.024
  2781.   REPLACE SPB:SPB BY POINTER(DATA) FOR LEN;                             6006400001.040.024
  2782.   REPLACE SPB:SPB BY (CHKSUM := CHECKSUM(SPC,MSGLEN,CHKTYPE))           6006500001.040.024
  2783.       FOR CHKTYPE;                                                      6006600001.040.024
  2784.   MSGLEN := * + 2 + CHKTYPE + PAD;%  NOW IT'S THE # OF BYTES TO WRITE   6006700001.040.024
  2785.   IF REAL(DEBUG) GTR 1 THEN       %  DISPLAY DATA AND CHECKSUM          6006800001.040.024
  2786.     BEGIN                                                               6006900001.040.024
  2787.     BUGH("SCHK: ",CHKSUM);                                              6007200001.040.024
  2788.     END;                                                                6007300001.040.024
  2789.   IF SPB - 1 = " " THEN           %  TRAILING BLANK MAY BE STRIPPED     6007400001.040.024
  2790.     BEGIN                                                               6007500001.040.024
  2791.     REPLACE SPB:SPB BY "?",CH(EOL,1);                                   6007600001.040.024
  2792.     MSGLEN := * + 2;                                                    6007700001.040.024
  2793.     END;                                                                6007800001.040.024
  2794.   REPLACE SPB:SPB BY CH(EOL,1);   %  ADD THE END OF LINE CHARACTER      6007900001.040.024
  2795.   IF BRD := WRITE(REM[STOP],MSGLEN,SBUFFER) THEN                        6008000001.040.024
  2796.     BEGIN                                                               6008100001.040.024
  2797.     I := 3+1;                     %  TRY 3  MORE TIMES                  6008200001.040.024
  2798.     WHILE BRD AND I := *-1 GTR 0 DO                                     6008300001.040.024
  2799.       BEGIN                                                             6008400001.040.024
  2800.       IF DEBUG THEN                                                     6008500001.040.024
  2801.         BUGH("SPACK WRITE ERROR (HEX) = ",RD);                          6008600001.040.024
  2802.       WHEN(.5);                   %  WAIT A HALF SECOND                 6008700001.040.024
  2803.       BRD := WRITE(REM[STOP],MSGLEN,SBUFFER);                           6008800001.040.024
  2804.       END;                        %  TRY THE IO AGAIN                   6008900001.040.024
  2805.     END;                                                                6009000001.040.024
  2806.   END OF SPACK;                                                         6009100001.040.024
  2807.                                                                         61000000
  2808. %                                                                       61001000
  2809. % R P A C K                                                             61002000
  2810. %                                                                       61003000
  2811. % READ A PACKET                                                         61004000
  2812.                                                                         61005000
  2813.                                                                         61006000
  2814. REAL PROCEDURE RPACK(LEN,NUM,DATA);                                     6100700001.040.024
  2815. REAL     LEN, NUM;                %  PACKET LENGTH, NUMBER              6100800001.040.024
  2816. ARRAY DATA[0];                    %  PACKET DATA                        6100900001.040.024
  2817.   BEGIN                                                                 6101000001.040.024
  2818.   INTEGER COL,X;                  %  BYTES TO PROCESS,SCRATCH           6101100001.040.024
  2819.   REAL    TYPE;                   %  PACKET TYPE                        6101200001.040.024
  2820.   LABEL QUIT,RETRYSOH;                                                  6101300001.040.024
  2821.   PROCEDURE ABORT(TYPE);          %  TIMED OUT OR DEFICIENT PACKET      6101400001.040.024
  2822.   VALUE    TYPE;                  %  OF FAILURE                         6101500001.040.024
  2823.   REAL     TYPE;                                                        6101600001.040.024
  2824.     BEGIN                                                               6101700001.040.024
  2825.     RPACK := TYPE;                                                      6101800001.040.024
  2826.     IF BRD.TIMEOUTBIT THEN        %  TIMED OUT                          6101900001.040.024
  2827.       IF REAL(DEBUG) GTR 1 THEN                                         6102000001.040.024
  2828.         BUG("TIMED OUT")                                                6102100001.040.024
  2829.       ELSE                                                              6102200001.040.024
  2830.     ELSE                                                                6102300001.040.024
  2831.       IF BRD THEN                 %  SOME OTHER ERROR                   6102400001.040.024
  2832.         BEGIN                                                           6102500001.040.024
  2833.         IF DEBUG THEN                                                   6102600001.040.024
  2834.           BUGH("ERROR ON READ (HEX) = ",RD);                            6102700001.040.024
  2835.         RPACK := 0;               %  I GIVE UP                          6102800001.040.024
  2836.         END                                                             6102900001.040.024
  2837.       ELSE                        %  NO ERROR - MUST BE A BAD PACKET    6103000001.040.024
  2838.         IF DEBUG THEN                                                   6103100001.040.024
  2839.           BEGIN                                                         6103200001.040.024
  2840.           BUG("BAD PACKET");                                            6103300001.040.024
  2841.           BUG1("CHARACTERS LEFT=",COL);                                 6103400001.040.024
  2842.           IF COL GTR 0 THEN                                             6103500001.040.024
  2843.             BUGN("WHICH ARE      :",RPD);                               6103600001.040.024
  2844.           BUGN("BUFFER IS      :",RBUFFER);                             6103700001.040.024
  2845.           END;                                                          6103800001.040.024
  2846.     RD := 0;                      %  RESET RESULT DESCRIPTOR            6103900001.040.024
  2847.     GO QUIT;                                                            6104000001.040.024
  2848.     END OF ABORT;                                                       6104100001.040.024
  2849.   %                                                                     6104200001.040.024
  2850.   RPB := POINTER(RBUFFER);                                              6104500001.040.024
  2851.   IF BRD := READ(REM,ABSOLUTEMAXPACKSIZE,RBUFFER) THEN                  6104600001.040.029
  2852.     ABORT("T");                                                         6104700001.040.024
  2853.   REPLACE RPB BY RPB FOR X := RD.LENGTHF WITH STRIP_PARITY,NULC;        6104800001.040.024
  2854.   SCAN RPB:RPB FOR X:X UNTIL = MYSOH;                                   6104900001.040.024
  2855. RETRYSOH:                                                               6105000001.040.024
  2856.   IF X < 5 THEN                   %  MINIMUM PACKET LENGTH              6105100001.040.024
  2857.     ABORT("T");                                                         6105200001.040.024
  2858.   SCAN RPD:RPB FOR COL:X WHILE = MYSOH;                                 6105300001.040.024
  2859.   SCAN RPB:RPD FOR X:COL UNTIL = MYSOH;                                 6105400001.040.024
  2860.   IF REAL(DEBUG) > 1 THEN         %  RPD POINTS 1 PAST SOH              6105500001.040.024
  2861.     BUG1("COL:  ",(COL - X));     %  (COL - X) IS NUMBER OF CHARS       6105600001.040.024
  2862.   IF (COL := * - X) < 4 THEN      %  TOO SHORT                          6105700001.040.024
  2863.     GO RETRYSOH;                                                        6105800001.040.024
  2864.   %                                                                     6105900001.040.024
  2865.   RPC := RPD;                     %  FOR CHECKSUMS                      6106000001.040.024
  2866.   IF (LEN := UNCHAR(REAL(RPD,1))) < 0 THEN                              6106100001.040.024
  2867.     ABORT(0)                                                            6106200001.040.024
  2868.   ELSE                                                                  6106300001.040.024
  2869.     BEGIN                                                               6106400001.040.024
  2870.     CASE LEN OF                                                         6106500001.040.024
  2871.       BEGIN                                                             6106600001.040.024
  2872.       0:                          %  CHECKSUM TYPE 0 HEADER             6106700001.040.024
  2873.         IF COL < (5 + CSTYPE1) THEN                                     6106800001.040.024
  2874.           GO RETRYSOH;            %  TOO SHORT FOR HEADER               6106900001.040.024
  2875.         CHKSUM := CHECKSUM(RPC,5,CSTYPE1);                              6107000001.040.024
  2876.       1:                                                                6107100001.040.024
  2877.       2:                          %  NOT IMPLEMENTED                    6107200001.040.024
  2878.         ABORT(0);                                                       6107300001.040.024
  2879.       ELSE:                       %  CHECKSUM THE WHOLE MESSAGE         6107400001.040.024
  2880.         IF COL < (LEN + 1) THEN                                         6107500001.040.024
  2881.           GO RETRYSOH;            %  TOO SHORT FOR MESSAGE              6107600001.040.024
  2882.         CHKSUM := CHECKSUM(RPC,(LEN + 1 - CHKTYPE),CHKTYPE);            6107700001.040.024
  2883.       END;                                                              6107800001.040.024
  2884.     END;                                                                6107900001.040.024
  2885.   NUM  := UNCHAR(REAL(RPD:=*+1,1));% PACKET NUMBER                      6108000001.040.024
  2886.   TYPE := REAL(RPD:=*+1,1);       %  PACKET TYPE                        6108100001.040.024
  2887.   RPD  := * + 1;                  %  POINT TO 1 PAST TYPE               6108200001.040.024
  2888.   IF REAL(DEBUG) GTR 1 THEN       %  DISPLAY INCOMING PACKET            6108300001.040.024
  2889.     BEGIN                                                               6108400001.040.024
  2890.     BUGC("RPACK TYPE:  ",TYPE);                                         6108500001.040.024
  2891.     BUG1("NUM:  ",NUM);                                                 6108600001.040.024
  2892.     BUG1("LEN:  ",LEN);                                                 6108700001.040.024
  2893.     END;                                                                6108800001.040.024
  2894.   CASE LEN OF                                                           6108900001.040.024
  2895.     BEGIN                                                               6109000001.040.024
  2896.     0:BEGIN                       %  GET THE LENGTH                     6109100001.040.024
  2897.       LEN := PACKETMOD * UNCHAR(REAL(RPD,1)) +                          6109200001.040.024
  2898.                          UNCHAR(REAL(RPD+1,1));                         6109300001.040.024
  2899.       RPD := * + 2;                                                     6109400001.040.024
  2900.       IF REAL(DEBUG) GTR 1 THEN                                         6109500001.040.024
  2901.         BEGIN                                                           6109600001.040.024
  2902.         BUG1("LEN:  ",LEN);                                             6109700001.040.024
  2903.         BUG1("CKSUM:",CHKSUM.[47:8]);                                   6109800001.040.024
  2904.         BUG1("RCHK: ",REAL(RPD,1));                                     6109900001.040.024
  2905.         END;                                                            6110000001.040.024
  2906.       IF REAL(RPD,1) NEQ CHKSUM.[47:8] THEN                             6110100001.040.024
  2907.         ABORT("Q");               %  BAD HEADER CHECKSUM                6110200001.040.024
  2908.       IF COL < (LEN + 5) THEN                                           6110300001.040.024
  2909.         GO RETRYSOH;              %  NOT ENOUGH BYTES                   6110400001.040.024
  2910.       CHKSUM := CHECKSUM(RPC,(LEN + 5 + CSTYPE1 - CHKTYPE),CHKTYPE);    6110500001.040.024
  2911.       RPD := * + CSTYPE1;         %  MOVE PAST HEADER CHECKSUM          6110600001.040.024
  2912.       LEN := * - CHKTYPE;         %  NUMBER OF DATA BYTES               6110700001.040.024
  2913.       END OF CASE 0;                                                    6110800001.040.024
  2914.     1:                            %  NOT IMPLIMENTED                    6110900001.040.024
  2915.     2:                                                                  6111000001.040.024
  2916.       ABORT(0);                                                         6111100001.040.024
  2917.     ELSE:                         %  TYPE 3 HEADERS                     6111200001.040.024
  2918.       BEGIN                                                             6111300001.040.024
  2919.       LEN := * - 2 - CHKTYPE;     %  NUMBER OF DATA BYTES               6111400001.040.024
  2920.       END; % OF ELSE CASE                                               6111500001.040.024
  2921.     END OF CASES;                                                       6111600001.040.024
  2922.   REPLACE POINTER(DATA) BY RPD:RPD FOR LEN,NULC;                        6111700001.040.024
  2923.   IF REAL(DEBUG) GTR 1 THEN       %  DISPLAY THE DATA                   6111800001.040.024
  2924.     BEGIN                                                               6111900001.040.024
  2925.     BUGH("CKSUM:",CHKSUM);                                              6112000001.040.024
  2926.     BUGH("RCHK: ",REAL(RPD,CHKTYPE));                                   6112100001.040.024
  2927.     IF LEN > 0 THEN                                                     6112200001.040.024
  2928.       BUGN("DATA: ",DATA);                                              6112300001.040.024
  2929.     END;                                                                6112400001.040.024
  2930.   IF CHKSUM.[47:8*CHKTYPE] NEQ REAL(RPD,CHKTYPE) THEN                   6112500001.040.027
  2931.     BEGIN                         %  SOMETIMES REDUCES RECOVERY TIME    6112600001.040.027
  2932.     IF CHKTYPE = CSTYPE1 THEN     %  WITH A BLOCK CHECK MIS-MATCH       6112700001.040.027
  2933.       ABORT("Q")                  %  BETWEEN KERMITS. 'S' PACKETS       6112800001.040.027
  2934.     ELSE                          %  MUST HAVE TYPE 1. SERVER IDLE      6112900001.040.027
  2935.       BEGIN                       %  'N' PACKETS WILL BE TYPE 1.        6113000001.040.027
  2936.       IF NOT (TYPE = "S" OR TYPE ="N") THEN                             6113100001.040.027
  2937.         ABORT("Q")                                                      6113200001.040.027
  2938.       ELSE                                                              6113300001.040.027
  2939.         BEGIN                                                           6113400001.040.027
  2940.         INTEGER CSTYPE;                                                 6113410001.040.027
  2941.         IF TYPE = "S" THEN                                              6113500001.040.027
  2942.           RPD := * + (CHKTYPE - (CSTYPE := CSTYPE1))                    6113510001.040.027
  2943.         ELSE                                                            6113520001.040.027
  2944.           CSTYPE := LEN - 2;      % ALWAYS TRUE FOR NAK'S               6113530001.040.027
  2945.         CHKSUM := CHECKSUM(RPC,OFFSET(RPD)-OFFSET(RPC),CSTYPE);         6113600001.040.027
  2946.         IF REAL(DEBUG) > 1 THEN                                         6113700001.040.027
  2947.           BEGIN                                                         6113800001.040.027
  2948.           BUGH("2CHK: ",CHKSUM);                                        6113900001.040.027
  2949.           BUGH("2RCK: ",REAL(RPD,CSTYPE));                              6114000001.040.027
  2950.           END;                                                          6114100001.040.027
  2951.         IF CHKSUM.[47:8*CSTYPE] NEQ REAL(RPD,CSTYPE) THEN               6114200001.040.027
  2952.           ABORT("Q")                                                    6114300001.040.027
  2953.         ELSE                                                            6114400001.040.027
  2954.           BEGIN                                                         6114500001.040.027
  2955.           THECHKTYPE := CHKTYPE := CSTYPE;                              6114600001.040.027
  2956.           IF TYPE = "S" THEN      %  NOT ALL THE DATA GOT MOVED         6114700001.040.027
  2957.              ABORT("Q");                                                6114800001.040.027
  2958.           END;                                                          6114900001.040.027
  2959.         END;                                                            6115000001.040.027
  2960.       END;                                                              6115100001.040.027
  2961.     END;                          %  SECOND CHANCE TRASH                6115200001.040.027
  2962.   RPACK := TYPE;                                                        6115300001.040.024
  2963. QUIT:                                                                   6115400001.040.024
  2964.   WHEN(MYPAUSE);                  %  WAIT BEFORE SENDING ACK            6115500001.040.024
  2965.   END OF RPACK;                                                         6115600001.040.024
  2966. %                                                                       6200000001.040.034
  2967. % G E T C H A R S                                                       6200100001.040.034
  2968. %                                                                       6200200001.040.034
  2969. % GET CHARACTERS FROM A DISK FILE AND HAND THEM TO BUFILL. CONVERT      6200300001.040.034
  2970. % FIXED LENGTH RECORDS TO VARIABLE LENGTH, AND ADD CR, LF IF NEEDED.    6200400001.040.034
  2971. %                                                                       6200500001.040.034
  2972. REAL PROCEDURE GETCHARS(FID);                                           6200600001.040.034
  2973. FILE FID;                                                               6200700001.040.034
  2974.   BEGIN                                                                 6200800001.040.034
  2975.   POINTER P,Q;                                                          6200900001.040.034
  2976.   REAL    R;                                                            6201000001.040.034
  2977.                                                                         6201100001.040.034
  2978.   IF NOT READ(FID,RECSIZ_,GBUF_) THEN                                   6201200001.040.034
  2979.     BEGIN                                                               6201300001.040.034
  2980.     PG_   := POINTER(GBUF_);                                            6201400001.040.034
  2981.     GCNT_ := RECSIZ_*UNITS_;                                            6201500001.040.034
  2982.     IF NOT RAW THEN               %  ADD THE RECORD SEPARATER           6201600001.040.040
  2983.       BEGIN                                                             6201700001.040.034
  2984.       IF FIXEDRECS THEN                                                 6201800001.040.040
  2985.         BEGIN                                                           6201900001.040.034
  2986.         REPLACE PG_ + GCNT_ BY CH(CR,1),CH(NL,1);                       6202000001.040.034
  2987.         GCNT_ := * + 2;                                                 6202100001.040.034
  2988.         END                                                             6202200001.040.034
  2989.       ELSE                        %  STRIP TRAILING BLANKS              6202300001.040.040
  2990.         BEGIN                     %    (OR LSS BLANK)                   6202400001.040.040
  2991.         Q := PG_;                                                       6202500001.040.040
  2992.         DO                        %  FIND LAST NON-BLANK                6202600001.040.040
  2993.           BEGIN                                                         6202700001.040.040
  2994.           SCAN P:Q FOR R:GCNT_ UNTIL LEQ " ";                           6202800001.040.040
  2995.           SCAN Q:P FOR GCNT_:R WHILE LEQ " ";                           6202900001.040.040
  2996.           END                                                           6203000001.040.040
  2997.         UNTIL GCNT_ LEQ 0;                                              6203100001.040.040
  2998.         REPLACE P BY CH(CR,1),CH(NL,1);                                 6203200001.040.040
  2999.         GCNT_ := RECSIZ_*UNITS_ - R + 2;                                6203300001.040.040
  3000.         END;                                                            6203400001.040.040
  3001.       END;                                                              6203500001.040.034
  3002.     GETCHARS := GCNT_;                                                  6203600001.040.034
  3003.     END                                                                 6203700001.040.034
  3004.   ELSE                            %  IO ERROR                           6203800001.040.034
  3005.     BEGIN                                                               6203900001.040.034
  3006.     GETCHARS := 0;                                                      6204000001.040.034
  3007.     END;                                                                6204100001.040.034
  3008.   END OF GETCHARS;                                                      6204200001.040.034
  3009. %                                                                       6250000001.040.034
  3010. % P A C K D A T A                                                       6250100001.040.034
  3011. %                                                                       6250200001.040.034
  3012. % COPIES DATA FROM SOURCE TO DESTINATION DOING COMPRESSION AND          6250300001.040.034
  3013. % NECESSARY CHARACTER QUOTING FOR KERMIT PACKETS                        6250400001.040.034
  3014. %                                                                       6250500001.040.034
  3015. INTEGER PROCEDURE PACKDATA(SPTR,SCOUNT,DPTR,SPACEAVAILABLE);            6250600001.040.034
  3016. VALUE          SPACEAVAILABLE;                                          6250700001.040.034
  3017. INTEGER SCOUNT,SPACEAVAILABLE;                                          6250800001.040.034
  3018. POINTER SPTR,DPTR;                                                      6250900001.040.034
  3019.   BEGIN                                                                 6251000001.040.034
  3020.   INTEGER COUNT                                                         6251100001.040.034
  3021.          ,CHAR                                                          6251200001.040.034
  3022.          ;                                                              6251300001.040.034
  3023.   BOOLEAN REPEATING;                                                    6251400001.040.034
  3024.   DEFINE  EMIT (X)   =                                                  6251500001.040.034
  3025.             BEGIN                                                       6251600001.040.034
  3026.             REPLACE DPTR:DPTR BY X;                                     6251700001.040.034
  3027.             SPACEAVAILABLE := * - 1;                                    6251800001.040.034
  3028.             PACKDATA       := * + 1;                                    6251900001.040.034
  3029.             END#                                                        6252000001.040.034
  3030.          ,EMIT2(X,Y) =                                                  6252100001.040.034
  3031.             BEGIN                                                       6252200001.040.034
  3032.             REPLACE DPTR:DPTR BY X,Y;                                   6252300001.040.034
  3033.             SPACEAVAILABLE := * - 2;                                    6252400001.040.034
  3034.             PACKDATA       := * + 2;                                    6252500001.040.034
  3035.             END#                                                        6252600001.040.034
  3036.          ,EMITN(X,N) =                                                  6252700001.040.034
  3037.             BEGIN                                                       6252800001.040.034
  3038.             REPLACE DPTR:DPTR BY X FOR N;                               6252900001.040.034
  3039.             SPACEAVAILABLE := * - N;                                    6253000001.040.034
  3040.             PACKDATA       := * + N;                                    6253100001.040.034
  3041.             END#                                                        6253200001.040.034
  3042.          ;                                                              6253300001.040.034
  3043.   WHILE SPACEAVAILABLE GEQ 5 DO   %  THERE'S ROOM FOR WORST CASE        6253400001.040.034
  3044.     BEGIN                                                               6253500001.040.034
  3045.     CHAR := REAL(SPTR,1);                                               6253600001.040.034
  3046.     IF REPTOK THEN                %  FIND IF CHAR IS REPEATED           6253700001.040.034
  3047.       BEGIN                                                             6253800001.040.034
  3048.       SCAN SPTR FOR COUNT:SCOUNT WHILE = CHAR;                          6253900001.040.034
  3049.       COUNT := MIN(SCOUNT - COUNT,MAXREPT);                             6254000001.040.034
  3050.       REPEATING := COUNT > 1;                                           6254100001.040.034
  3051.       END                                                               6254200001.040.034
  3052.     ELSE                          %  PROCESS ONLY ONE CHAR              6254300001.040.034
  3053.       BEGIN                                                             6254400001.040.034
  3054.       COUNT := 1;                                                       6254500001.040.034
  3055.       END;                                                              6254600001.040.034
  3056.                                                                         6254700001.040.034
  3057.     IF BOOLEAN(CHAR).[7:1] THEN                                         6254800001.040.034
  3058.       BEGIN                                                             6254900001.040.034
  3059.       IF QBIN NEQ "N" THEN        %  WE'LL NEED AN 8-BIT QUOTE          6255000001.040.034
  3060.         BEGIN                                                           6255100001.040.034
  3061.         IF REPEATING THEN                                               6255200001.040.034
  3062.           EMIT2(CH(REPT,1),CH(TOCHAR(COUNT),1));                        6255300001.040.034
  3063.         EMIT(CH(QBIN,1));                                               6255400001.040.034
  3064.         REPEATING := FALSE;       %  WE'VE ALREADY EMITTED THE COUNT    6255500001.040.034
  3065. %       REPLACE SPTR BY SPTR FOR COUNT WITH STRIP_PARITY;               6255600001.040.034
  3066.         CHAR := * & 0[7:1];       %  NOW IT'S < 128                     6255700001.040.034
  3067.         END;                                                            6255800001.040.034
  3068.       END;                                                              6255900001.040.034
  3069.     IF CHAR IN ACNTRL[0] THEN     %  CONTROL OR KERMIT 'QUOTE'          6256000001.040.034
  3070.       BEGIN                                                             6256100001.040.034
  3071.       IF REPEATING THEN                                                 6256200001.040.034
  3072.         EMIT2(CH(REPT,1),CH(TOCHAR(COUNT),1));                          6256300001.040.034
  3073.       EMIT(CH(QUOTE,1));          %  THE KERMIT 'QUOTE'                 6256400001.040.034
  3074.       IF CHAR IN BCNTRL[0] THEN   %  IF IT'S A KERMIT 'QUOTE'           6256500001.040.034
  3075.         EMIT(CH(CHAR,1))          %    JUST SEND IT                     6256600001.040.034
  3076.       ELSE                                                              6256700001.040.034
  3077.         EMIT(CH(CTL(CHAR),1));    %    OTHERWISE 'CTL' IT               6256800001.040.034
  3078.       END                                                               6256900001.040.034
  3079.     ELSE                          %  PLAIN OLD TEXT                     6257000001.040.034
  3080.       BEGIN                                                             6257100001.040.034
  3081.       IF REPEATING THEN                                                 6257200001.040.034
  3082.         BEGIN                                                           6257300001.040.034
  3083.         IF COUNT > REPTTHRESH THEN % FOR PLAIN TEXT                     6257400001.040.034
  3084.           BEGIN                                                         6257500001.040.034
  3085.           EMIT2(CH(REPT,1),CH(TOCHAR(COUNT),1));                        6257600001.040.034
  3086.           EMIT(CH(CHAR,1));                                             6257700001.040.034
  3087.           END                                                           6257800001.040.034
  3088.         ELSE                                                            6257900001.040.034
  3089.           EMITN(SPTR,COUNT)                                             6258000001.040.034
  3090.         END                                                             6258100001.040.034
  3091.       ELSE                                                              6258200001.040.034
  3092.         EMIT(CH(CHAR,1));                                               6258300001.040.034
  3093.       END;                                                              6258400001.040.034
  3094.     SPTR := * + COUNT;                                                  6258500001.040.034
  3095.     IF SCOUNT := * - COUNT LEQ 0 THEN                                   6258600001.040.034
  3096.       BEGIN                                                             6258700001.040.034
  3097.       SPACEAVAILABLE := 0;        %  DROP OUT OF THE LOOP               6258800001.040.034
  3098.       END;                                                              6258900001.040.034
  3099.     END;                                                                6259000001.040.034
  3100.   END PACKDATA;                                                         6259100001.040.034
  3101. %                                                                       6300000001.040.034
  3102. %                                                                       6300100001.040.034
  3103. % B U F I L L                                                           6300200001.040.034
  3104. %                                                                       6300300001.040.034
  3105. % GET A BUFFERFUL OF DATA FROM THE FILE THAT'S BEING SENT.              6300400001.040.034
  3106. % CONTROL-QUOTING,  8-BIT & REPEAT COUNT PREFIXES ARE ALL               6300500001.040.034
  3107. % HANDLED.                                                              6300600001.040.034
  3108.                                                                         6300700001.040.034
  3109.                                                                         6300800001.040.034
  3110. REAL PROCEDURE BUFILL(FID,BUFFER);                                      6300900001.040.034
  3111. FILE  FID;                                                              6301000001.040.034
  3112. ARRAY BUFFER[0];                                                        6301100001.040.034
  3113.   BEGIN                                                                 6301200001.040.034
  3114.   POINTER PB;                                                           6301300001.040.034
  3115.   INTEGER SPACEAVAILABLE;                                               6301400001.040.034
  3116.   PB := POINTER(BUFFER);                                                6301500001.040.034
  3117.   SPACEAVAILABLE := SPSIZ - CHKTYPE - 2;                                6301600001.040.034
  3118.   IF GCNT_ LEQ 0 THEN             %  NOTHING IN THE INPUT BUFFER        6301700001.040.034
  3119.     BEGIN                                                               6301800001.040.034
  3120.     IF (GCNT_ := GETCHARS(FID)) LEQ 0 THEN                              6301900001.040.034
  3121.       BEGIN                       %  NOTHING TO PROCESS                 6302000001.040.034
  3122.       SPACEAVAILABLE := 0;        %  STAY OUT OF THE LOOP               6302100001.040.034
  3123.       END;                                                              6302200001.040.034
  3124.     END;                                                                6302300001.040.034
  3125.   WHILE SPACEAVAILABLE GEQ 5 DO   %  ROOM FOR WORST CASE                6302400001.040.034
  3126.     BEGIN                                                               6302500001.040.034
  3127.     SPACEAVAILABLE := * - PACKDATA(PG_,GCNT_,PB,SPACEAVAILABLE);        6302600001.040.034
  3128.     IF GCNT_ LEQ 0 THEN                                                 6302700001.040.034
  3129.       BEGIN                                                             6302800001.040.034
  3130.       IF (GCNT_ := GETCHARS(FID)) LEQ 0 THEN                            6302900001.040.034
  3131.         BEGIN                     %  NOTHING TO PROCESS                 6303000001.040.034
  3132.         SPACEAVAILABLE := 0;      %  DROP OUT OF THE LOOP               6303100001.040.034
  3133.         END;                                                            6303200001.040.034
  3134.       END;                                                              6303300001.040.034
  3135.     END LOOP;                                                           6303400001.040.034
  3136.   BUFILL := OFFSET(PB);                                                 6303500001.040.034
  3137.   REPLACE PB BY NULC;             %  NEEDED BY BUGN                     6303600001.040.034
  3138.   END BUFILL;                                                           6303700001.040.034
  3139.                                                                         6303800001.040.034
  3140. %                                                                       6310000001.040.036
  3141. % M A K E P A C K E T D A T A                                           6310100001.040.036
  3142. %                                                                       6310200001.040.036
  3143. % TAKES AN ARRAY OF DATA AND CONVERTS IT TO PACKET FORM. ALL THE        6310300001.040.036
  3144. % PARAMETERS ARE CALL BY VALUE, WHICH DIFFERS FROM PACKDATA.            6310400001.040.036
  3145. %                                                                       6310500001.040.036
  3146. INTEGER PROCEDURE MAKEPACKETDATA(SPTR,SCOUNT,DPTR,SPACEAVAILABLE);      6310600001.040.036
  3147. VALUE   SPTR,SCOUNT,DPTR,SPACEAVAILABLE;                                6310700001.040.036
  3148. POINTER SPTR,DPTR;                                                      6310800001.040.036
  3149. INTEGER SCOUNT,SPACEAVAILABLE;                                          6310900001.040.036
  3150.   BEGIN                                                                 6311000001.040.036
  3151.   MAKEPACKETDATA := PACKDATA(SPTR,SCOUNT,DPTR,SPACEAVAILABLE);          6311100001.040.036
  3152.   IF SPACEAVAILABLE > 0 THEN                                            6311200001.040.036
  3153.     REPLACE DPTR BY NULC;         %  NEEDED BY BUGN                     6311300001.040.036
  3154.   END MAKEPACKETDATA;                                                   6311400001.040.036
  3155. %                                                                       6400000001.040.035
  3156. % W R I T E O U T P U T                                                 6400200001.040.035
  3157. %                                                                       6400300001.040.035
  3158. % WRITE OUT OUTPUT BUFFER AND RESET POINTERS;                           6400400001.040.035
  3159. %                                                                       6400500001.040.035
  3160. PROCEDURE WRITEOUTPUT(FID);                                             6400600001.040.035
  3161. FILE FID;                                                               6400700001.040.035
  3162.   BEGIN                                                                 6400800001.040.035
  3163.   IF PCNT_ > 0 THEN               %  PRESUME PCNT_ = 0 IF RAW           6400900001.040.035
  3164.     REPLACE PP_ BY " " FOR PCNT_;                                       6401000001.040.035
  3165.   BRD := WRITE(FID,RECSIZ_,PBUF_);                                      6401100001.040.035
  3166.   PP_   := POINTER(PBUF_);                                              6401200001.040.035
  3167.   PCNT_ := RECSIZ_*UNITS_;                                              6401300001.040.035
  3168.   END OF WRITEOUTPUT;                                                   6401400001.040.035
  3169. %                                                                       6410000001.040.035
  3170. % P U T C                                                               6410100001.040.035
  3171. %                                                                       6410200001.040.035
  3172. % PUT OUT A STRING (1 OR MORE) OF CHARACTERS ALL THE SAME               6410300001.040.035
  3173. %                                                                       6410400001.040.035
  3174. PROCEDURE PUTC(C,COUNT,FID);                                            6410500001.040.035
  3175. VALUE   C,COUNT;                                                        6410600001.040.035
  3176. REAL    C;                                                              6410700001.040.035
  3177. INTEGER   COUNT;                                                        6410800001.040.035
  3178. FILE    FID;                                                            6410900001.040.035
  3179.   BEGIN                                                                 6411000001.040.035
  3180.   INTEGER LCOUNT;                                                       6411100001.040.035
  3181.                                                                         6411200001.040.035
  3182.   LCOUNT := (47 + 8);                                                   6411300001.040.035
  3183.   THRU MIN (COUNT,5) DO           %  REPLICATE C FOR REPLACE            6411400001.040.035
  3184.     BEGIN                         %  ALREADY 1 IN C.[7:8]               6411500001.040.035
  3185.     C := * & C [(LCOUNT := * - 8):8];                                   6411600001.040.035
  3186.     END;                                                                6411700001.040.035
  3187.   WHILE COUNT > 0 DO                                                    6411800001.040.035
  3188.     BEGIN                                                               6411900001.040.035
  3189.     IF PCNT_ LEQ 0 THEN           %  NO ROOM IN OUTPUT BUFFER           6412000001.040.035
  3190.       BEGIN                                                             6412100001.040.035
  3191.       WRITEOUTPUT(FID);                                                 6412200001.040.035
  3192.       END;                                                              6412300001.040.035
  3193.     REPLACE PP_:PP_ BY C FOR LCOUNT := MIN(COUNT,PCNT_);                6412400001.040.035
  3194.     COUNT := * - LCOUNT;                                                6412500001.040.035
  3195.     PCNT_ := * - LCOUNT;                                                6412600001.040.035
  3196.     END;                                                                6412700001.040.035
  3197.   END OF PUTC;                                                          6412800001.040.035
  3198. %                                                                       6420000001.040.035
  3199. % P U T C H A R S                                                       6420100001.040.035
  3200. %                                                                       6420200001.040.035
  3201. % PUT A STRING OF CHARACTERS IN THE OUTPUT BUFFER. IF THERE ARE         6420300001.040.035
  3202. % MORE THAN FIT THEN WRITE OUT THE BUFFER;                              6420400001.040.035
  3203. %                                                                       6420500001.040.035
  3204. PROCEDURE PUTCHARS(PB,COUNT,FID);                                       6420600001.040.035
  3205. VALUE   COUNT;                                                          6420700001.040.035
  3206. POINTER PB;                                                             6420800001.040.035
  3207. INTEGER COUNT;                                                          6420900001.040.035
  3208. FILE    FID;                                                            6421000001.040.035
  3209.   BEGIN                                                                 6421100001.040.035
  3210.   INTEGER LCOUNT;                                                       6421200001.040.035
  3211.                                                                         6421300001.040.035
  3212.   WHILE COUNT > 0 DO                                                    6421400001.040.035
  3213.     BEGIN                                                               6421500001.040.035
  3214.     IF PCNT_ LEQ 0 THEN           %  NO ROOM IN OUTPUT BUFFER           6421600001.040.035
  3215.       BEGIN                                                             6421700001.040.035
  3216.       WRITEOUTPUT(FID);                                                 6421800001.040.035
  3217.       END;                                                              6421900001.040.035
  3218.     REPLACE PP_:PP_ BY PB:PB FOR LCOUNT := MIN(COUNT,PCNT_);            6422000001.040.035
  3219.     COUNT := * - LCOUNT;                                                6422100001.040.035
  3220.     PCNT_ := * - LCOUNT;                                                6422200001.040.035
  3221.     END;                                                                6422300001.040.035
  3222.   END OF PUTCHARS;                                                      6422400001.040.035
  3223. %                                                                       6430000001.040.035
  3224. % U N P A C K D A T A                                                   6430100001.040.035
  3225. %                                                                       6430200001.040.035
  3226. % PROCESSES PACKET DATA UN-DOING COMPRESSION AND QUOTING SEQUENCES.     6430300001.040.035
  3227. % RATHER THAN PUTTING THE DATA IN THE OUTPUT BUFFER WE LOCATE IT,       6430400001.040.035
  3228. % AND CONVERT IT, AND THEN LET THE CALLER DECIDE WHAT TO DO WITH IT     6430500001.040.035
  3229. % BECAUSE THE CALLERS HANDLE SOME SPECIAL CHARACTERS DIFFERENTLY.       6430600001.040.035
  3230. %                                                                       6430700001.040.035
  3231. REAL PROCEDURE UNPACKDATA(PB,LEN,CNT);                                  6430800001.040.035
  3232. POINTER PB;                                                             6430900001.040.035
  3233. INTEGER LEN,CNT;                                                        6431000001.040.035
  3234.   BEGIN                                                                 6431100001.040.035
  3235.   BOOLEAN HIBIT;                                                        6431200001.040.035
  3236.   REAL    T;                                                            6431300001.040.035
  3237.                                                                         6431400001.040.035
  3238.   SCAN PB FOR CNT:LEN UNTIL IN BCNTRL[0];                               6431500001.040.035
  3239.   IF CNT := LEN - CNT > 0 THEN    %  A STRING OF NON-CONTROL CHARACTERS 6431600001.040.035
  3240.     BEGIN                                                               6431700001.040.035
  3241.     LEN := * - CNT;                                                     6431800001.040.035
  3242.     END                                                                 6431900001.040.035
  3243.   ELSE                                                                  6432000001.040.035
  3244.     BEGIN                                                               6432100001.040.035
  3245.     HIBIT := FALSE;               %  INITIALIZE IT                      6432200001.040.035
  3246.     CNT := 1;                     %  WE HAVE 1 CHARACTER AT LEAST       6432300001.040.035
  3247.     T := REAL(PB,1);              %  GET CHARACTER                      6432400001.040.035
  3248.     PB := *+1; LEN := *-1;        %  BUMP THE POINTER                   6432500001.040.035
  3249.     IF REPTOK THEN                %  WE CAN USE REPEAT COUNTS           6432600001.040.035
  3250.       IF T = MYREPT THEN          %  WE ARE REPEATING                   6432700001.040.035
  3251.         BEGIN                                                           6432800001.040.035
  3252.         CNT := UNCHAR(REAL(PB,1));%  GET THE COUNT                      6432900001.040.035
  3253.         PB := *+1; LEN := *-1;    %  BUMP THE POINTER                   6433000001.040.035
  3254.         T := REAL(PB,1);          %  GET THE NEXT CHARACTER             6433100001.040.035
  3255.         PB := *+1; LEN := *-1;    %  BUMP THE POINTER                   6433200001.040.035
  3256.         END;                                                            6433300001.040.035
  3257.     IF HIBITOK THEN               %  WE CAN QUOTE 8-BIT STUFF           6433400001.040.035
  3258.       IF T = MYQBIN THEN          %  WE HAVE AN 8-BIT THING             6433500001.040.035
  3259.         BEGIN                                                           6433600001.040.035
  3260.         HIBIT := TRUE;            %  SET THE FLAG                       6433700001.040.035
  3261.         T := REAL(PB,1);          %  GET THE NEXT CHARACTER             6433800001.040.035
  3262.         PB := *+1; LEN := *-1;    %  BUMP THE POINTER                   6433900001.040.035
  3263.         END;                                                            6434000001.040.035
  3264.     IF T = MYQUOTE THEN           %  WE HAVE A QUOTED THING             6434100001.040.035
  3265.       BEGIN                                                             6434200001.040.035
  3266.       T := REAL(PB,1);            %  GET THE NEXT CHARACTER             6434300001.040.035
  3267.       PB := *+1; LEN := *-1;      %  BUMP THE POINTER                   6434400001.040.035
  3268.       IF NOT T IN BCNTRL[0] THEN  %  IT'S NOT QUOTE, QBIN OR REPT       6434500001.040.035
  3269.         T := CTL(T);              %  UNCONTROLIFY IT                    6434600001.040.035
  3270.       END;                                                              6434700001.040.035
  3271.     IF HIBIT THEN                 %  SET THE 8-TH BIT                   6434800001.040.035
  3272.       T := * & 1 [7:1];                                                 6434900001.040.035
  3273.     UNPACKDATA := T & 1 [47:01];  %  RETURN THE CHARACTER               6435000001.040.039
  3274.     END;                          %  BIT 47 IS IN CASE CHAR = NUL       6435100001.040.039
  3275.   END UNPACKDATA;                                                       6435200001.040.035
  3276.                                                                         6500000001.040.035
  3277. %                                                                       6500100001.040.035
  3278. % B U F E M P                                                           6500200001.040.035
  3279. %                                                                       6500300001.040.035
  3280. % PUT DATA FROM AN INCOMING PACKET INTO A FILE.                         6500400001.040.035
  3281.                                                                         6500500001.040.035
  3282.                                                                         6500600001.040.035
  3283. PROCEDURE BUFEMP(FID,BUFFER,LEN);                                       6500700001.040.035
  3284. VALUE LEN;                                                              6500800001.040.035
  3285. REAL LEN;                                                               6500900001.040.035
  3286. FILE FID;                                                               6501000001.040.035
  3287. ARRAY BUFFER[0];                  %  BUFFER                             6501100001.040.035
  3288.   BEGIN                                                                 6501200001.040.035
  3289.   INTEGER CNT;                                                          6501300001.040.035
  3290.   POINTER PB;                                                           6501400001.040.035
  3291.   REAL    T;                                                            6501500001.040.035
  3292.   PB := POINTER(BUFFER);                                                6501600001.040.035
  3293.   WHILE LEN > 0 DO                %  DECREMENTED BY UNPACKDATA          6501700001.040.035
  3294.     BEGIN                                                               6501800001.040.035
  3295.     IF (T := UNPACKDATA(PB,LEN,CNT)) IS 0 THEN                          6501900001.040.039
  3296.       BEGIN                                                             6502000001.040.035
  3297.       PUTCHARS(PB,CNT,FID);                                             6502100001.040.035
  3298.       END                                                               6502200001.040.035
  3299.     ELSE                                                                6502300001.040.035
  3300.       BEGIN                                                             6502400001.040.035
  3301.       IF T = HT THEN              %  IS IT A TAB?                       6502500001.040.035
  3302.         IF EXPTABS THEN           %  WE NEED TO EXPAND IT               6502600001.040.035
  3303.           THRU CNT DO             %  PUT OUT SPACES                     6502700001.040.035
  3304.             PUTC(SP,(TABLEN-((RECSIZ_*UNITS_-PCNT_) MOD TABLEN)),FID)   6502800001.040.035
  3305.         ELSE                                                            6502900001.040.035
  3306.           PUTC(HT,CNT,FID)        %  JUST PUT OUT THE TABS              6503000001.040.035
  3307.       ELSE                        %  IT'S NOT A TAB                     6503100001.040.035
  3308.         IF  T = CR THEN           % [1.017]  IT'S A CR                  6503200001.040.035
  3309.           IF (RAW) THEN           %  DON'T FIDDLE WITH IT               6503300001.040.035
  3310.             PUTC(CR,CNT,FID)      %  PUT OUT THE CR'S                   6503400001.040.035
  3311.           ELSE                    %  IT'S PROBABLY EXTRA, SO            6503500001.040.035
  3312.                                   %  JUST EAT IT!                       6503600001.040.035
  3313.         ELSE                      %  NOT A CR, EITHER                   6503700001.040.035
  3314.           IF T = NL THEN          %  IT'S A NEWLINE                     6503800001.040.035
  3315.             IF (RAW) THEN         %  DON'T FIDDLE                       6503900001.040.035
  3316.               PUTC(NL,CNT,FID)    %  PUT THEM IN THE BUFFER             6504000001.040.035
  3317.             ELSE                  %  WE ARE INTERPRETING NL'S           6504100001.040.035
  3318.               THRU CNT DO                                               6504200001.040.035
  3319.                 WRITEOUTPUT(FID)  %  DUMP THE BUFFER                    6504300001.040.035
  3320.           ELSE                    %  NOTHING SPECIAL                    6504400001.040.035
  3321.             PUTC(T,CNT,FID);      %  PUT THEM OUT                       6504500001.040.035
  3322.       END;                                                              6504600001.040.035
  3323.     END;                                                                6504700001.040.035
  3324.   END BUFEMP;                                                           6504800001.040.035
  3325. %                                                                       6510000001.040.036
  3326. % G E T P A C K E T D A T A                                             6510100001.040.036
  3327. %                                                                       6510200001.040.036
  3328. % TAKES AN ARRAY OF PACKET FORM DATA, 'UNPACKS' IT AND COPIES THE       6510300001.040.036
  3329. % UNPACKED DATA TO THE OUTPUT ARRAY.  OVERFLOW IS NOT SAVED, NOR IS     6510400001.040.036
  3330. % THE NUMBER OF INPUT CHARACTERS PROCESSED SAVED. THIS IS A ONE         6510500001.040.036
  3331. % SHOT PACKET-TO-ARRAY PROCEDURE.                                       6510600001.040.036
  3332. %                                                                       6510700001.040.036
  3333. INTEGER PROCEDURE GETPACKETDATA(SPTR,SCOUNT,DPTR,DCOUNT);               6510800001.040.036
  3334. VALUE   SPTR,SCOUNT,DPTR,DCOUNT;                                        6510900001.040.036
  3335. POINTER SPTR,DPTR;                                                      6511000001.040.036
  3336. INTEGER SCOUNT,DCOUNT;                                                  6511100001.040.036
  3337.   BEGIN                                                                 6511200001.040.036
  3338.   REAL    T;                                                            6511300001.040.036
  3339.   INTEGER CNT;                                                          6511400001.040.036
  3340.                                                                         6511500001.040.036
  3341.   WHILE SCOUNT > 0 DO                                                   6511600001.040.036
  3342.     BEGIN                                                               6511700001.040.036
  3343.     IF (T := UNPACKDATA(SPTR,SCOUNT,CNT)) IS 0 THEN                     6511800001.040.039
  3344.       BEGIN                                                             6511900001.040.036
  3345.       REPLACE DPTR:DPTR BY SPTR:SPTR FOR CNT:=MIN(DCOUNT,CNT);          6512000001.040.036
  3346.       END                                                               6512100001.040.036
  3347.     ELSE                                                                6512200001.040.036
  3348.       BEGIN                                                             6512300001.040.036
  3349.       T := * & T [47:8];                                                6512400001.040.036
  3350.       THRU CNT:=MIN(DCOUNT,CNT) DO                                      6512500001.040.036
  3351.         BEGIN                                                           6512600001.040.036
  3352.         REPLACE DPTR:DPTR BY T FOR 1;                                   6512700001.040.036
  3353.         END;                                                            6512800001.040.036
  3354.       END;                                                              6512900001.040.036
  3355.     GETPACKETDATA := * + CNT;                                           6513000001.040.036
  3356.     IF DCOUNT := * - CNT LEQ 0 THEN                                     6513100001.040.036
  3357.       BEGIN                                                             6513200001.040.036
  3358.       SCOUNT := 0;                %  DROP OUT OF LOOP                   6513300001.040.036
  3359.       END;                                                              6513400001.040.036
  3360.     END;                                                                6513500001.040.036
  3361.   END GETPACKETDATA;                                                    6513600001.040.036
  3362. %                                                                       6600000001.040.024
  3363. % C H E C K S U M                                                       6600100001.040.024
  3364. %                                                                       6600200001.040.024
  3365. % CHECKSUM A PACKET                                                     6600300001.040.024
  3366.                                                                         6600400001.040.024
  3367.                                                                         6600500001.040.024
  3368. REAL PROCEDURE CHECKSUM(PB,LEN,TYPE);                                   6600900001.040.024
  3369. VALUE   PB,LEN,TYPE;                                                    6601000001.040.024
  3370. POINTER PB;                       %  THE DATA TO BE CHECKSUMED          6601100001.040.024
  3371. INTEGER    LEN,TYPE;              %  LENGTH OF DATA, CHECKSUM TYPE      6601200001.040.024
  3372.   BEGIN                                                                 6601300001.040.024
  3373.   INTEGER SUM;                    %  HOLDS CHECKSUM                     6601400001.040.024
  3374.   INTEGER C,Q;                    %  FOR CRC CHECKSUM                   6601410001.040.027
  3375.   DEFINE XOR(A,B) = (NOT(BOOLEAN(A) EQV BOOLEAN(B)))#;                  6601420001.040.027
  3376.   %                                                                     6601500001.040.024
  3377.   CASE TYPE OF                                                          6601600001.040.024
  3378.     BEGIN                                                               6601700001.040.024
  3379.     CSTYPE1:                                                            6601800001.040.027
  3380.     CSTYPE2:                                                            6601900001.040.027
  3381.       BEGIN                       %  TYPE 1 AND 2 CHECKSUMS             6602000001.040.027
  3382.       SUM := REAL(PB,1);                                                6602100001.040.027
  3383.       THRU LEN-1 DO               %  ADD UP THE BYTES                   6602200001.040.027
  3384.         BEGIN                                                           6602300001.040.027
  3385.         SUM := * + REAL(PB := * + 1,1);                                 6602400001.040.027
  3386.         END;                                                            6602500001.040.027
  3387.       IF TYPE = CSTYPE1 THEN                                            6602600001.040.027
  3388.         BEGIN                                                           6602700001.040.027
  3389.         SUM := *.[7:8];           %  'FOLD' THE SUM                     6602800001.040.027
  3390.         SUM := (SUM + SUM.[7:2]).[5:6];                                 6602900001.040.027
  3391.         CHECKSUM := 0 & (TOCHAR(SUM))[47:8]; % READY FOR PACKET         6603000001.040.027
  3392.         END                                                             6603100001.040.027
  3393.       ELSE                                                              6603200001.040.027
  3394.         BEGIN                                                           6603300001.040.027
  3395.         CHECKSUM := 0 & (TOCHAR(SUM.[11:6]))[47:8]                      6603400001.040.027
  3396.                       & (TOCHAR(SUM.[ 5:6]))[39:8];                     6603500001.040.027
  3397.         END                                                             6603600001.040.027
  3398.       END;                        %  CASE 1 AND 2                       6603700001.040.027
  3399.     CSTYPE3:                      %  16-BIT CRC CHECKSUM                6603800001.040.027
  3400.       BEGIN                                                             6603900001.040.027
  3401.       THRU LEN DO                                                       6604000001.040.027
  3402.         BEGIN                                                           6604100001.040.027
  3403.         C := REAL(PB,1);                                                6604200001.040.027
  3404.         PB := * + 1;                                                    6604300001.040.027
  3405.         Q := REAL(XOR((SUM),(C))).[3:4];                                6604400001.040.027
  3406.                                   %  Q = (CRC XOR C) AND 15;            6604500001.040.027
  3407.         SUM := REAL(XOR((SUM.[15:12]),(Q*4225)));                       6604600001.040.027
  3408.                                   %  CRC = (CRC / 16) XOR (Q * 4225);   6604700001.040.027
  3409.         Q := REAL(XOR((SUM),(C.[7:4]))).[3:4];                          6604800001.040.027
  3410.                                   %  Q = (CRC XOR (C / 16)) AND 15;     6604900001.040.027
  3411.         SUM := REAL(XOR((SUM.[15:12]),(Q*4225)));                       6605000001.040.027
  3412.                                   %  CRC = (CRC / 16) XOR (Q * 4225);   6605100001.040.027
  3413.         END;                                                            6605200001.040.027
  3414.       CHECKSUM := 0 & (TOCHAR(SUM.[15:4])) [47:8]                       6605300001.040.027
  3415.                     & (TOCHAR(SUM.[11:6])) [39:8]                       6605400001.040.027
  3416.                     & (TOCHAR(SUM.[ 5:6])) [31:8];                      6605500001.040.027
  3417.       END;                        %  CHECKSUM TYPE 3                    6605600001.040.027
  3418.     END OF CASES;                                                       6605700001.040.024
  3419.   END OF CHECKSUM;                                                      6605800001.040.024
  3420.  $ENDSEGMENT                                                            6609900001.040.024
  3421. %                                                                       6700000001.040.037
  3422. % WARNING ! WARNING ! WARNING ! WARNING ! WARNING                       6700100001.040.037
  3423. % THE FOLLOWING PROCEDURE ONLY HAS '$ RESET ASCII' SO IT CAN            6700200001.040.037
  3424. % EASILY MANIPULATE FILE TITLES. DON'T MESS IT UP.                      6700300001.040.037
  3425. %                                                                       6700400001.040.037
  3426.   $ RESET ASCII                                                         6700500001.040.037
  3427. %                                                                       6700600001.040.037
  3428. % END OF WARNING                                                        6700700001.040.037
  3429. %                                                                       6700800001.040.037
  3430. % C O B B L E                                                           6700900001.040.037
  3431. %                                                                       6701000001.040.037
  3432. % TAKE AN ARBITRARY STRING OF CHARACTERS AND ATTEMP TO MAKE A           6701100001.040.037
  3433. % USABLE FILE NAME FROM THEM.                                           6701200001.040.037
  3434. %                                                                       6701300001.040.037
  3435. BOOLEAN PROCEDURE COBBLE(FILENAME,LEN);                                 6701400001.040.037
  3436. VALUE   LEN;                                                            6701500001.040.037
  3437. ARRAY   FILENAME[0];                                                    6701600001.040.037
  3438. INTEGER LEN;                                                            6701700001.040.037
  3439.   BEGIN                                                                 6701800001.040.037
  3440.   % RETURNS TRUE IF FILE TITLE CAN NOT BE MANIPULATED INTO A            6701900001.040.037
  3441.   % USABLE TITLE.                                                       6702000001.040.037
  3442.   EBCDIC ARRAY COBBLEDNAME,STDCOBBLEDNAME[0:255];                       6702100001.040.037
  3443.   POINTER PN,PM;                                                        6702200001.040.037
  3444.   INTEGER NAMECOUNT;                                                    6702300001.040.037
  3445.   DEFINE PERIOD = "."#                                                  6702400001.040.037
  3446.         ,QUOTE  = """#                                                  6702500001.040.037
  3447.         ,SLASH  = "/"#                                                  6702600001.040.037
  3448.         ;                                                               6702700001.040.037
  3449.   TRUTHSET NULLQUOTESLASH (NULC OR QUOTE OR SLASH)                      6702800001.040.037
  3450.           ,NULLQUOTE      (NULC OR QUOTE)                               6702900001.040.037
  3451.           ;                                                             6703000001.040.037
  3452.   %                                                                     6703100001.040.037
  3453.   PM := POINTER(FILENAME,8);                                            6703200001.040.037
  3454.   PN := COBBLEDNAME[0];                                                 6703300001.040.037
  3455.   SCAN PM:PM FOR LEN:LEN WHILE = SLASH;                                 6703400001.040.037
  3456.   REPLACE PM + LEN BY NULC;                                             6703500001.040.037
  3457.   DO                                                                    6703600001.040.037
  3458.     BEGIN                                                               6703700001.040.037
  3459.     REPLACE PN:PN BY QUOTE;                                             6703800001.040.037
  3460.     IF PM = QUOTE THEN                                                  6703900001.040.037
  3461.       BEGIN                                                             6704000001.040.037
  3462.       REPLACE PN:PN BY PM:PM+1 FOR 17 UNTIL IN NULLQUOTE;               6704100001.040.037
  3463.       IF PM = QUOTE THEN                                                6704200001.040.037
  3464.         BEGIN                                                           6704300001.040.037
  3465.         PM := * + 1;                                                    6704400001.040.037
  3466.         END;                                                            6704500001.040.037
  3467.       END                                                               6704600001.040.037
  3468.     ELSE                                                                6704700001.040.037
  3469.       BEGIN                                                             6704800001.040.037
  3470.       REPLACE PN:PN BY PM:PM FOR 17 UNTIL IN NULLQUOTESLASH;            6704900001.040.037
  3471.       END;                                                              6705000001.040.037
  3472.     REPLACE PN:PN BY QUOTE;                                             6705100001.040.037
  3473.     WHILE PM = SLASH DO           %  WE DONT HAVE A COUNT SO            6705200001.040.037
  3474.       BEGIN                       %  WE CAN'T DO A SCAN                 6705300001.040.037
  3475.       PM := * + 1;                                                      6705400001.040.037
  3476.       END;                                                              6705500001.040.037
  3477.     IF NAMECOUNT := * + 1 < 12 THEN                                     6705600001.040.037
  3478.       BEGIN                                                             6705700001.040.037
  3479.       IF PM NEQ NULC THEN                                               6705800001.040.037
  3480.         BEGIN                                                           6705900001.040.037
  3481.         REPLACE PN:PN BY SLASH;                                         6706000001.040.037
  3482.         END;                                                            6706100001.040.037
  3483.       END;                                                              6706200001.040.037
  3484.     END                                                                 6706300001.040.037
  3485.   UNTIL PM = NULC OR NAMECOUNT GEQ 12;                                  6706400001.040.037
  3486.   REPLACE PN:PN BY PERIOD;                                              6706500001.040.037
  3487.   PN := COBBLEDNAME[0];                                                 6706600001.040.037
  3488.   IF NOT COBBLE := DISPLAYTOSTANDARD(PN,STDCOBBLEDNAME[0]) THEN         6706700001.040.037
  3489.     BEGIN                                                               6706800001.040.037
  3490.     PM := POINTER(FILENAME);                                            6706900001.040.037
  3491.     STANDARDTODISPLAY(STDCOBBLEDNAME[0],PM);                            6707000001.040.037
  3492.     END;                                                                6707100001.040.037
  3493.   END OF COBBLE;                                                        6707200001.040.037
  3494. %                                                                       6707300001.040.037
  3495. % WARNING !                                                             6707400001.040.037
  3496. % THE PRECEEDING PROCEDURE HAS '$ RESET ASCII'. DON'T MESS IT UP.       6707500001.040.037
  3497. %                                                                       6707600001.040.037
  3498.   $ SET ASCII                                                           6707700001.040.037
  3499. %                                                                       6707800001.040.037
  3500. % END OF WARNING                                                        6707900001.040.037
  3501. %                                                                       6708000001.040.037
  3502.                                                                         70000000
  3503. %                                                                       70001000
  3504. % S P A R                                                               70002000
  3505. %                                                                       70003000
  3506. % FILL THE DATA ARRAY WITH MY SEND-INIT PARAMETERS                      70004000
  3507. %                                                                       70005000
  3508.                                                                         70006000
  3509.                                                                         70007000
  3510.  $BEGINSEGMENT                                                          70008000
  3511.                                                                         70009000
  3512. PROCEDURE SPAR(LEN,DATA,FIRSTCALL);                                     7001000001.040.025
  3513. VALUE   FIRSTCALL;                                                      7001010001.040.025
  3514. BOOLEAN FIRSTCALL;                %  OF SPAR:RPAR PAIR                  7001020001.040.025
  3515. REAL    LEN;                                                            7001100001.040.025
  3516. ARRAY   DATA[0];                                                        7001200001.040.025
  3517.   BEGIN                                                                 7001300001.040.025
  3518.   DEFINE FORCESEGMENT=#;          %  SO BEGINSEGMENT WILL WORK          7001400001.040.025
  3519.   POINTER PD;                     %  TEMPORARY POINTER                  7001500001.040.025
  3520.   REPLACE PD:PD := POINTER(DATA) BY                                     7001600001.040.025
  3521.       CH(TOCHAR(MIN(MYPACKSIZ,SHORTPACKSIZ)),1) ,                       7001700001.040.029
  3522.                                   %  BIGGEST PACKET I CAN RECEIVE       7001710001.040.029
  3523.       CH(TOCHAR(MYTIME),1)    ,   %  WHEN I WANT TO BE TIMED OUT        7001800001.040.025
  3524.       CH(TOCHAR(MYPAD),1)     ,   %  HOW MUCH PADDING I NEED            7001900001.040.025
  3525.       CH(CTL(MYPCHAR),1)      ,   %  PADDING CHARACTER I WANT           7002000001.040.025
  3526.       CH(TOCHAR(MYEOL),1)     ,   %  END-OF-LINE CHARACTER I WANT       7002100001.040.025
  3527.       CH(MYQUOTE,1)           ;   %  CONTROL-QUOTE CHARACTER I SEND     7002200001.040.025
  3528.   IF FIRSTCALL THEN               %                                     7002300001.040.025
  3529.     %  IF SPAR IS CALLED FIRST (BEFORE RPAR) WE CONTROL                 7002400001.040.025
  3530.     %  WHETHER OR NOT 8TH BIT QUOTING CAN BE DONE                       7002500001.040.025
  3531.     IF (BINARYON) THEN            %                                     7002600001.040.025
  3532.       REPLACE PD:PD BY CH(MYQBIN,1)% REQUEST 8TH BIT QUOTING            7002700001.040.025
  3533.     ELSE                          %                                     7002800001.040.025
  3534.       REPLACE PD:PD BY "N"        %  PREVENT 8TH BIT QUOTING            7002900001.040.025
  3535.   ELSE                            %                                     7003000001.040.025
  3536.     % IF SPAR IS CALLED SECOND (AFTER RPAR) WE                          7003100001.040.025
  3537.     % RESPOND TO THE REQUEST FROM THE REMOTE KERMIT                     7003200001.040.025
  3538.     IF (BINARYON)AND(HIBITOK) THEN %                                    7003300001.040.025
  3539.      % IF 8TH BIT QUOTING REQUESTED, ACCEPT IF WE ARE IN BINARY MODE    7003400001.040.025
  3540.       IF (QBIN = "Y") THEN        %  USE WHAT WE WANT                   7003500001.040.025
  3541.         BEGIN                                                           7003600001.040.025
  3542.         REPLACE PD:PD BY CH(MYQBIN,1);                                  7003700001.040.025
  3543.         QBIN := MYQBIN;           %  USE MYQBIN CHAR                    7003800001.040.025
  3544.         END                                                             7003900001.040.025
  3545.       ELSE                                                              7004000001.040.025
  3546.         BEGIN                                                           7004100001.040.025
  3547.         REPLACE PD:PD BY "Y";     %  ACK 8BIT QUOTE REQUEST             7004200001.040.025
  3548.         MYQBIN := QBIN;           %  USE INCOMING QBIN CHAR             7004300001.040.025
  3549.         END                                                             7004400001.040.025
  3550.     ELSE                                                                7004500001.040.025
  3551.       BEGIN                                                             7004600001.040.025
  3552.       % 8TH BIT QUOTING WILL NOT BE DONE                                7004700001.040.025
  3553.       REPLACE PD:PD BY "N";       %  NAK 8TH BIT QUOTING                7004800001.040.025
  3554.       HIBITOK := FALSE;                                                 7004900001.040.025
  3555.       END;                                                              7005000001.040.025
  3556.                                                                         7005100001.040.025
  3557.   REPLACE PD:PD BY                                                      7005200001.040.025
  3558.        CH(TONUM(MYCHKTYPE),1);    %  MY PREFERED CHECKSUM TYPE          7005300001.040.027
  3559.   IF FIRSTCALL THEN                                                     7005400001.040.025
  3560.     BEGIN                                                               7005500001.040.025
  3561.     % REQUEST REPEAT CHAR PROCESSING                                    7005600001.040.025
  3562.     REPLACE PD:PD BY CH(MYREPT,1);                                      7005700001.040.025
  3563.     END                                                                 7005900001.040.025
  3564.   ELSE                                                                  7006000001.040.025
  3565.     BEGIN                                                               7006100001.040.025
  3566.     % ACKNOWLEDGE REPEAT PROCESSING IF IT WAS REQUESTED                 7006200001.040.025
  3567.     IF (REPTOK) THEN                                                    7006300001.040.025
  3568.       REPLACE PD:PD BY CH(REPT,1)                                       7006400001.040.025
  3569.     ELSE                                                                7006500001.040.025
  3570.       REPLACE PD:PD BY CH(SP,1);                                        7006600001.040.025
  3571.     END;                                                                7006800001.040.025
  3572.   REPLACE PD:PD BY CH(TOCHAR( %                                         7007000001.040.029
  3573.       0 & 0 [RESERVEDBIT5 :1]                                           7007100001.040.029
  3574.         & 0 [RESERVEDBIT4 :1]                                           7007200001.040.029
  3575.         & 0 [APACKETBIT   :1]                                           7007300001.040.029
  3576.         & 1 [WINDOWSBIT   :1]                                           7007400001.040.029
  3577.         & 1 [LONGPACKETBIT:1]                                           7007500001.040.029
  3578.         & 0 [MORECAPASBIT :1] ),1);                                     7007600001.040.029
  3579.   REPLACE PD:PD BY CH(TOCHAR(MYWINDOWSIZE),1);                          7010000001.040.029
  3580.   REPLACE PD:PD BY                                                      7010100001.040.029
  3581.       CH(TOCHAR(MYPACKSIZ DIV PACKETMOD),1),                            7010200001.040.029
  3582.       CH(TOCHAR(MYPACKSIZ MOD PACKETMOD),1);                            7010300001.040.029
  3583.   LEN := OFFSET(PD);                                                    7090000001.040.025
  3584.   IF REAL(DEBUG) GTR 1 THEN       %  EXPAND IT ALL                      7090100001.040.025
  3585.     BEGIN                                                               7090200001.040.025
  3586.     BUG1("My packet size = ",MYPACKSIZ);                                7090300001.040.025
  3587.     BUG1("My timeout = ",MYTIME);                                       7090400001.040.025
  3588.     BUG1("My padding = ",MYPAD);                                        7090500001.040.025
  3589.     BUGH("My padding character = ",MYPCHAR);                            7090600001.040.025
  3590.     BUGH("My end of line character = ",MYEOL);                          7090700001.040.025
  3591.     BUGC("My quote character = ",MYQUOTE);                              7090800001.040.025
  3592.     BUGC("My binary quote character = ",MYQBIN);                        7090900001.040.025
  3593.     BUGC("My checksum type = ",MYCHKTYPE);                              7091000001.040.025
  3594.     BUGC("My repeat character = ",MYREPT);                              7091100001.040.025
  3595.     BUG1("My checksum type = ",MYCHKTYPE);                              7091200001.040.027
  3596.     BUG1("My window size = ",MYWINDOWSIZE);                             7091300001.040.029
  3597.     IF REPTOK THEN                                                      7095000001.040.025
  3598.       BUG("WE ARE REPEATING")                                           7095100001.040.025
  3599.     ELSE                                                                7095200001.040.025
  3600.       BUG("NO REPEAT CHARACTER");                                       7095300001.040.025
  3601.     IF HIBITOK THEN                                                     7095400001.040.025
  3602.       BUG("WE ARE BINARY QUOTING")                                      7095500001.040.025
  3603.     ELSE                                                                7095600001.040.025
  3604.       BUG("NOT BINARY QUOTING");                                        7095700001.040.025
  3605.     IF WINDOWING THEN                                                   7095800001.040.029
  3606.       BUG("WE ARE WINDOWING")                                           7095900001.040.029
  3607.     ELSE                                                                7096000001.040.029
  3608.       BUG("NOT WINDOWING");                                             7096100001.040.029
  3609.     IF LONGPACKETSOK THEN                                               7096200001.040.029
  3610.       BUG("WE ARE USING LONG PACKETS")                                  7096300001.040.029
  3611.     ELSE                                                                7096400001.040.029
  3612.       BUG("NO LONG PACKETS");                                           7096500001.040.029
  3613.     END;                                                                7099000001.040.025
  3614.   END SPAR;                                                             7099100001.040.025
  3615.                                                                         7099200001.040.025
  3616.                                                                         75000000
  3617. % R P A R                                                               75001000
  3618. %                                                                       75002000
  3619. % GET THE OTHER HOST'S SEND-INIT PARAMETERS                             75003000
  3620. %                                                                       75004000
  3621.                                                                         75005000
  3622.                                                                         75006000
  3623. PROCEDURE RPAR(LEN,DATA,FIRSTCALL);                                     7500700001.040.025
  3624. VALUE   FIRSTCALL;                                                      7500710001.040.025
  3625. BOOLEAN FIRSTCALL;                %  OF RPAR:SPAR PAIR                  7500720001.040.025
  3626. REAL    LEN;                                                            7500800001.040.025
  3627. ARRAY   DATA[0];                                                        7500900001.040.025
  3628.   BEGIN                                                                 7501000001.040.025
  3629.   POINTER PD;                                                           7501100001.040.025
  3630.   INTEGER YOURCHKTYPE;            %  FOR DIAGNOSTICS ONLY               7501110001.040.027
  3631.   BOOLEAN CAPAS;                                                        7501120001.040.029
  3632.   PD := POINTER(DATA);                                                  7501200001.040.025
  3633.                                                                         7501300001.040.025
  3634.   LEN := * - 6;                   %  FIRST 6 CHARACTERS PROCESSED       7501400001.040.025
  3635.   SPSIZ  := UNCHAR(REAL(PD,1));   %  MAXIMUM SEND PACKET SIZE           7501500001.040.025
  3636.   PD := *+1;                                                            7501600001.040.025
  3637.   TIMINT := UNCHAR(REAL(PD,1));   %  WHEN I SHOULD TIME OUT             7501700001.040.025
  3638.   PD := *+1;                                                            7501800001.040.025
  3639.   PAD    := UNCHAR(REAL(PD,1));   %  NUMBER OF PADS TO SEND             7501900001.040.025
  3640.   PD := *+1;                                                            7502000001.040.025
  3641.   PCHAR  := CTL(REAL(PD,1));      %  PADDING CHARACTER TO SEND          7502100001.040.025
  3642.   PD := *+1;                                                            7502200001.040.025
  3643.   EOL    := UNCHAR(REAL(PD,1));   %  EOL CHARACTER I MUST SEND          7502300001.040.025
  3644.   PD := *+1;                                                            7502400001.040.025
  3645.   UNTABLE(ACNTRL,QUOTE);          %  TAKE IT OUT OF THE ATABLE          7502500001.040.025
  3646.   UNTABLE(BCNTRL,QUOTE);          %  TAKE IT OUT OF THE BTABLE          7502600001.040.025
  3647.   QUOTE  := REAL(PD,1);           %  INCOMING DATA QUOTE CHARACTER      7502700001.040.025
  3648.   TABLEIT(ACNTRL,QUOTE);          %  PUT NEW ONE IN THE ATABLE          7502800001.040.025
  3649.   TABLEIT(BCNTRL,QUOTE);          %  PUT NEW ONE IN THE BTABLE          7502900001.040.025
  3650.   % CHECK FOR REQUEST/ACKNOWLEDGE FOR 8TH BIT QUOTING                   7503000001.040.025
  3651.   HIBITOK := FALSE;               %  THE DEFAULT                        7503100001.040.025
  3652.   IF LEN := * - 1 GEQ 0 THEN      %  THERE IS SOMETHING TO LOOK AT      7503200001.040.025
  3653.     BEGIN                                                               7503300001.040.025
  3654.     PD := * + 1;                  %  MOVE TO QBIN                       7503400001.040.025
  3655.     UNTABLE(ACNTRL,QBIN);         %  TAKE OUT OF ATABLE                 7503500001.040.025
  3656.     UNTABLE(BCNTRL,QBIN);         %  TAKE OUT OF BTABLE                 7503600001.040.025
  3657.     QBIN := REAL(PD,1);           %  INCOMING 8BIT QUOTE                7503700001.040.025
  3658.     IF FIRSTCALL THEN                                                   7503800001.040.025
  3659.       BEGIN                                                             7503900001.040.025
  3660.       %  IF 8TH BIT MODE IS ENABLED, SEE IF INCOMING QBIN               7504000001.040.025
  3661.       %  CHAR REQUESTS 8TH BIT QUOTING                                  7504100001.040.025
  3662.       IF (BINARYON) AND ((PD IN QUOTECHARS) OR (PD = "Y")) THEN         7504200001.040.025
  3663.         BEGIN                                                           7504300001.040.025
  3664.         HIBITOK := TRUE;          %  YES, SET OK FLAG                   7504400001.040.025
  3665.         IF (PD = "Y") THEN                                              7504500001.040.025
  3666.           BEGIN                                                         7504600001.040.025
  3667.           TABLEIT(ACNTRL,MYQBIN); %  TABLE MY QBIN CHAR                 7504700001.040.025
  3668.           TABLEIT(BCNTRL,MYQBIN); %                                     7504800001.040.025
  3669.           END                                                           7504900001.040.025
  3670.         ELSE                                                            7505000001.040.025
  3671.           BEGIN                                                         7505100001.040.025
  3672.           TABLEIT(ACNTRL,QBIN);   %  TABLE INCOMING QBIN                7505200001.040.025
  3673.           TABLEIT(BCNTRL,QBIN);                                         7505300001.040.025
  3674.           END;                                                          7505400001.040.025
  3675.         END                                                             7505500001.040.025
  3676.       END                                                               7505600001.040.025
  3677.     ELSE                          %  SPAR WAS CALLED FIRST              7505700001.040.025
  3678.       BEGIN                       %  CHECK THE REPLY                    7505800001.040.025
  3679.       %  IF 8TH BIT MODE IS ENABLED, SEE IF WE                          7505900001.040.025
  3680.       %  GOT AN ACK TO OUR 8TH BIT QUOTE REQUEST                        7506000001.040.025
  3681.       IF (BINARYON) AND ((QBIN = "Y") OR (QBIN = MYQBIN)) THEN          7506100001.040.025
  3682.         BEGIN                                                           7506200001.040.025
  3683.         HIBITOK := TRUE;          %  WILL DO 8TH BIT QUOTING            7506300001.040.025
  3684.         TABLEIT(ACNTRL,MYQBIN);   %  TABLE MY QBIN CHAR                 7506400001.040.025
  3685.         TABLEIT(BCNTRL,MYQBIN);                                         7506500001.040.025
  3686.         END                                                             7506600001.040.025
  3687.       END;                                                              7506700001.040.025
  3688.     END;                                                                7506800001.040.025
  3689.   THECHKTYPE := DEFCHKTYPE;       %  THE DEFAULT                        7510000001.040.027
  3690.   IF LEN := * - 1 GEQ 0 THEN                                            7510100001.040.027
  3691.     BEGIN                                                               7510200001.040.027
  3692.     PD := * + 1;                  %  MOVE TO CHECKSUMTYPE               7510300001.040.027
  3693.     IF (YOURCHKTYPE := UNNUM(REAL(PD,1))) = MYCHKTYPE THEN              7510400001.040.027
  3694.       THECHKTYPE := YOURCHKTYPE;                                        7510500001.040.027
  3695.     END;                                                                7510600001.040.027
  3696.   REPTOK := FALSE;                %  THE DEFAULT                        7520000001.040.025
  3697.   IF LEN := * - 1 GEQ 0 THEN                                            7520100001.040.025
  3698.     BEGIN                                                               7520200001.040.025
  3699.     PD := * + 1;                  %  MOVE TO REPT CHAR                  7520300001.040.025
  3700.     UNTABLE(ACNTRL,REPT);         %  TAKE IT OUT OF ATABLE              7520400001.040.025
  3701.     UNTABLE(BCNTRL,REPT);         %  TAKE IT OUT OF BTABLE              7520500001.040.025
  3702.     REPT := REAL(PD,1);           %  INCOMING REPEAT CHAR               7520600001.040.025
  3703.     IF FIRSTCALL THEN                                                   7520700001.040.025
  3704.       BEGIN                                                             7520800001.040.025
  3705.       % IF CHAR SENT IS A VALID QUOTE CHAR, WE ARE REPEATING            7520900001.040.025
  3706.       IF (PD IN QUOTECHARS) THEN  %  VALID CHAR ?                       7521000001.040.025
  3707.         BEGIN                                                           7521100001.040.025
  3708.         REPTOK := TRUE;                                                 7521200001.040.025
  3709.         MYREPT := REPT;           %  USE THE ONE RECEIVED               7521300001.040.025
  3710.         TABLEIT(ACNTRL,REPT);                                           7521400001.040.025
  3711.         TABLEIT(BCNTRL,REPT);                                           7521500001.040.025
  3712.         END;                                                            7521600001.040.025
  3713.       END                                                               7521700001.040.025
  3714.     ELSE                                                                7521800001.040.025
  3715.       BEGIN                                                             7521900001.040.025
  3716.       % IF CHAR MATCHES CHAR WE SENT, WE ARE REPEATING                  7522000001.040.025
  3717.       IF (REPT = MYREPT) THEN                                           7522100001.040.025
  3718.         BEGIN                                                           7522200001.040.025
  3719.         REPTOK := TRUE;                                                 7522300001.040.025
  3720.         TABLEIT(ACNTRL,REPT);                                           7522400001.040.025
  3721.         TABLEIT(BCNTRL,REPT);                                           7522500001.040.025
  3722.         END;                                                            7522600001.040.025
  3723.       END;                                                              7522700001.040.025
  3724.     END;                                                                7522800001.040.025
  3725.   % RESERVEDBIT5                                                        7523000001.040.029
  3726.   % RESERVEDBIT4                                                        7523100001.040.029
  3727.   % A PACKETS                                                           7523200001.040.029
  3728.   WINDOWING     := FALSE;                                               7523300001.040.029
  3729.   LONGPACKETSOK := FALSE;                                               7523400001.040.029
  3730.                                                                         7523500001.040.029
  3731.   IF LEN := * - 1 GEQ 0 THEN      %  SOME CAPABILITIES                  7525000001.040.029
  3732.     BEGIN                                                               7525100001.040.029
  3733.     PD := * + 1;                  %  MOVE TO FIRST BYTE                 7525200001.040.029
  3734.     CAPAS := BOOLEAN(UNCHAR(REAL(PD,1)));                               7525300001.040.029
  3735.     % RESERVEDBIT5                                                      7525400001.040.029
  3736.     % RESERVEDBIT4                                                      7525500001.040.029
  3737.     % A PACKETS                                                         7525600001.040.029
  3738.     WINDOWING     := CAPAS.[WINDOWSBIT   :1];                           7525700001.040.029
  3739.     LONGPACKETSOK := CAPAS.[LONGPACKETBIT:1];                           7525800001.040.029
  3740.                                                                         7525900001.040.029
  3741.     WHILE CAPAS.[MORECAPASBIT:1] DO% SKIP PASSED CAPAS                  7526000001.040.029
  3742.       IF LEN := * - 1 GEQ 0 THEN                                        7526100001.040.029
  3743.         PD := * + 1                                                     7526200001.040.029
  3744.       ELSE                                                              7526300001.040.029
  3745.         CAPAS := FALSE;                                                 7526400001.040.029
  3746.     END;                                                                7529900001.040.029
  3747.   WINDOWSIZE := 0;                %  THE DEFAULT                        7530000001.040.029
  3748.   IF LEN := * - 1 GEQ 0 THEN                                            7530100001.040.029
  3749.     BEGIN                                                               7530200001.040.029
  3750.     PD := * + 1;                  %  MOVE TO THE WINDOW BYTE            7530300001.040.029
  3751.     WINDOWSIZE := MIN(UNCHAR(REAL(PD,1)),                               7530400001.040.029
  3752.                              MYWINDOWSIZE);                             7530500001.040.029
  3753.     END;                                                                7530600001.040.029
  3754.   WINDOWING := WINDOWSIZE > 1;    %  WHAT'S THE POINT OF 1?             7530700001.040.029
  3755.   IF LONGPACKETSOK THEN                                                 7531000001.040.029
  3756.     SPSIZ := DEFLONGPACKSIZ;      %  IF NO LENGTH FIELD IN PACKET       7531100001.040.029
  3757.   IF LEN := * - 2 GEQ 0 THEN      %  LENGTH PROVIDED                    7531200001.040.029
  3758.     BEGIN                                                               7531300001.040.029
  3759.     PD := * + 1;                  %  MOVE TO FIRST BYTE                 7531400001.040.029
  3760.     SPSIZ := MIN((UNCHAR(REAL(PD  ,1))*PACKETMOD +                      7531500001.040.029
  3761.                   UNCHAR(REAL(PD+1,1))),                                7531600001.040.029
  3762.                  MAXPACKSIZ);                                           7531700001.040.029
  3763.     PD := * + 1;                  %  SKIP SECOND BYTE                   7531800001.040.029
  3764.     END;                                                                7531900001.040.029
  3765.   LONGPACKETSOK := SPSIZ > SHORTPACKSIZ;                                7532000001.040.029
  3766.   IF REAL(DEBUG) GTR 1 THEN       %  EXPAND IT ALL                      7700000001.040.025
  3767.     BEGIN                                                               7700100001.040.025
  3768.     BUG1("Your packet size = ",SPSIZ);                                  7700200001.040.025
  3769.     BUG1("Your timeout = ",TIMINT);                                     7700300001.040.025
  3770.     BUG1("Your padding = ",PAD);                                        7700400001.040.025
  3771.     BUGH("Your padding character = ",PCHAR);                            7700500001.040.025
  3772.     BUGH("Your end of line character = ",EOL);                          7700600001.040.025
  3773.     BUGC("Your quote character = ",QUOTE);                              7700700001.040.025
  3774.     BUGC("Your binary quote character = ",QBIN);                        7700800001.040.025
  3775.     BUGC("Your checksum type = ",CHKTYPE);                              7700900001.040.025
  3776.     BUGC("Your repeat character = ",REPT);                              7701000001.040.025
  3777.     BUG1("Your checksum type = ",YOURCHKTYPE);                          7701100001.040.027
  3778.     BUG1("Your window size = ",WINDOWSIZE);                             7701300001.040.029
  3779.     IF REPTOK THEN                                                      7705000001.040.025
  3780.       BUG("WE ARE REPEATING")                                           7705100001.040.025
  3781.     ELSE                                                                7705200001.040.025
  3782.       BUG("NO REPEAT CHARACTER");                                       7705300001.040.025
  3783.     IF HIBITOK THEN                                                     7705400001.040.025
  3784.       BUG("WE ARE BINARY QUOTING")                                      7705500001.040.025
  3785.     ELSE                                                                7705600001.040.025
  3786.       BUG("NOT BINARY QUOTING");                                        7705700001.040.025
  3787.     IF WINDOWING THEN                                                   7705800001.040.029
  3788.       BUG("WE ARE WINDOWING")                                           7705900001.040.029
  3789.     ELSE                                                                7706000001.040.029
  3790.       BUG("NOT WINDOWING");                                             7706100001.040.029
  3791.     IF LONGPACKETSOK THEN                                               7706200001.040.029
  3792.       BUG("WE ARE USING LONG PACKETS")                                  7706300001.040.029
  3793.     ELSE                                                                7706400001.040.029
  3794.       BUG("NO LONG PACKETS");                                           7706500001.040.029
  3795.     END;                                                                7709000001.040.025
  3796.   END RPAR;                                                             7709100001.040.025
  3797.                                                                         7709200001.040.025
  3798.                                                                         80000000
  3799. %                                                                       80001000
  3800. % F L U S H I N P U T                                                   80002000
  3801. %                                                                       80003000
  3802. % DUMP ALL PENDING INPUT TO CLEAR STACKED UP NAKS.                      80004000
  3803. %                                                                       80005000
  3804.                                                                         80006000
  3805.                                                                         80007000
  3806. PROCEDURE FLUSHINPUT;                                                   80008000
  3807.   BEGIN                                                                 80009000
  3808.                                                                         80010000
  3809.   WHILE REM.CENSUS GTR 0 DO                                             80011000
  3810.     BRD := READ(REM);                                                   80012000
  3811.   END FLUSHINPUT;                                                       80013000
  3812.                                                                         80014000
  3813.  $ENDSEGMENT                                                            80015000
  3814.                                                                         80016000
  3815.                                                                         80017000
  3816. %                                                                       81000000
  3817. % P R E R R P K T                                                       81001000
  3818. %                                                                       81002000
  3819. % PRINT CONTENTS OF ERROR PACKET RECEIVED FROM REMOTE HOST.             81003000
  3820.                                                                         81004000
  3821. PROCEDURE PRERRPKT(MSG);                                                81005000
  3822. ARRAY MSG[0];                                                           81006000
  3823.   BEGIN                                                                 81007000
  3824.   BUG("KERMIT ABORTING WITH FOLLOWING ERROR FROM REMOTE HOST:");        81008000
  3825.   BUGP(MSG);                                                            81009000
  3826.   END PRERRPKT;                                                         81010000
  3827.                                                                         90000000
  3828. INITIALIZE;                                                             90001000
  3829. ON ANYFAULT [ KPROMPT[*] : COL] , ABORTRUN;                             90002000
  3830. WHILE NOT BRD DO                                                        9000300001.040.030
  3831.   IF NOT REMOTEREADER THEN                                              9000400001.040.030
  3832.     PROCESSIT;                                                          9000500001.040.030
  3833. END.                                                                    90006000
  3834.