home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / burroughs / b78ker.alg < prev    next >
Text File  |  2020-01-01  |  248KB  |  3,068 lines

  1.  $SET NOBINDINFO                                                        00100000
  2.  $VERSION 1.019              % [KS] 5-86                                00101000
  3.  $SET ASCII                 %  BURROUGHS USES 8 BITS FOR ASCII          00102000
  4. BEGIN                                                                   00103000
  5. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%       00104000
  6. %                                                                       00105000
  7. %  K E R M I T  File Transfer Utility                                   00106000
  8. %                                                                       00107000
  9. %  Burroughs 7800, University of California at Davis, 1986              00108000
  10. %    Larry Johnson, Dave Squire, Katie Stevens                          00109000
  11. %                                                                       00110000
  12. %                                                                       00111000
  13. %%%%% REVISIONS                                                         00112000
  14. %       1.019 [KS] 4-86                                                 00113000
  15. %                  FIXED RE-TRY BUG IN SENDSW/SBREAK                    00114000
  16. %                  OVERHAULED HELP PROCEDURES                           00115000
  17. %                  ENABLED 8-TH BIT QUOTING                             00116000
  18. %                  ENABLED VARIABLE START-OF-PACKET CHAR                00117000
  19. %                  FIXED SERVER-SPAR RETRY BUG IN RECSW/RFILE           00117100
  20. %       1.018 [KS] 3-86                                                 00118000
  21. %                  FIXED PACKET # BUG CAUSED BY DUP VARIABLE NAMES      00119000
  22. %       1.017 [KS] 1-86                                                 00120000
  23. %                  ENABLED REPEAT PROCESSING                            00121000
  24. %                  ELIMINATE BLANK RECORD ADDED TO END OF RCV FILES     00122000
  25. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     00123000
  26.                                                                         00124000
  27.  % SYMBOL DEFINITIONS                                                   00125000
  28.                                                                         00126000
  29. DEFINE MAXPACKSIZ     =  94#,   % MAXIMUM PACKET SIZE                   00127000
  30.        MAXPACKWDS     =  15#,   % (MAXPACKSIZ+5)DIV 6-1                 00128000
  31.        MAXSENDFILESIZ =  11#,   % LARGEST FILE NAME I SHOULD SEND       00129000
  32.        MAXREPT        =  94#,   % LARGEST REPEAT COUNT (126-32)         00130000
  33.        EOF            = 4"201"#,% EOF FOR BUFILL                        00131000
  34.        NULC           = 48"00"#,% ASCII NULL CHARACTER                  00132000
  35.        DEFSOH         =   1#,   % [1.019] START OF HEADER               00133000
  36. %      SOHC           = 48"01"#,% SOH CHARACTER                         00134000
  37.        ETXC           = 48"03"#,% ETX CHARACTER                         00135000
  38.        BEL            =   7#,   % ASCII BELL                            00136000
  39.        HT             =   9#,   % ASCII HORIZONTAL TAB                  00137000
  40.        LF             =  10#,   % ASCII LINE FEED                       00138000
  41.        NL             =  LF#,   % NEWLINE CHARACTER                     00139000
  42.        CR             =  13#,   % ASCII CARRIAGE RETURN                 00140000
  43.        SP             =  32#,   % ASCII SPACE                           00141000
  44.        DEL            = 127#,   % ASCII DELETE (RUBOUT)                 00142000
  45.                                                                         00143000
  46.        REPTTHRESH     =   5#,   % CHARACTER REPEAT THRESHOLD            00144000
  47.        DEFINITRETRY   =  20#,   % TIMES TO RETRY INITIALIZATION         00145000
  48.        DEFPACKETRETRY =  10#,   % TIMES TO RETRY A PACKET               00146000
  49.        TABLEN         =   8#,   % LENGTH OF A TAB IF EXPANDED           00147000
  50.        DEFRECSIZE     =  15#,   % MAXRECSIZE IN WORDS OF RECEIVED FILE  00148000
  51.        DEFBLOCKSIZE   = 420#,   % BLOCKSIZE IN WORDS OF RECEIVED FILE   00149000
  52.        DEFUNITS       = VALUE(WORDS)#, % UNITS OF RECEIVED FILE         00150000
  53.        DEFPAD         =   0#,   % DEFAULT # OF PADDING CHARACTERS       00151000
  54.        DEFPCHAR       =   0#,   % DEFAULT PADDING CHARACTER             00152000
  55.        DEFEOL         =  CR#,   % DEFAULT END OF LINE CHAR FOR BURROUGHS00153000
  56.        DEFQUOTE       = "#"#,   % DEFAULT QUOTE CHARACTER               00154000
  57.        DEFQBIN        = "&"#,   % DEFAULT BINARY QUOTE CHARACTER        00155000
  58.        DEFCHKTYPE     = "1"#,   % DEFAULT CHECKSUM TYPE                 00156000
  59.        DEFREPT        = "~"#,   % DEFAULT REPEAT CHARACTER              00157000
  60.        DEFPAUSE       =   0#,   % DEFAULT PAUSE BEFORE ACK              00158000
  61.        DEFDELAY       =   5#,   % DEFAULT DELAY FOR FIRST SEND          00159000
  62.        DEFESCCHR      = "^"#,   % DEFAULT ESCAPE CHARACTER FOR CONNECT  00160000
  63.        DEFTIME        =   5#,   % DEFAULT TIMEOUT INTERVAL              00161000
  64.        MAXTIM         =  60#,   % MAXIMUM TIMEOUT INTERVAL              00162000
  65.        MINTIM         =   2#;   % MINUMUM TIMEOUT INTERVAL              00163000
  66.                                                                         00164000
  67.                                                                         00165000
  68.  % MACRO DEFINITIONS                                                    00166000
  69.                                                                         00167000
  70.  %                                                                      00168000
  71.  % TOCHAR: CONVERTS A CONTROL CHARACTER TO A PRINTABLE ONE BY ADDING A S00169000
  72.  %                                                                      00170000
  73.  % UNCHAR: UNDOES TOCHAR.                                               00171000
  74.  %                                                                      00172000
  75.  % CTL:    CONVERTS BETWEEN CONTROL CHARACTERS AND PRINTABLE CHARACTERS 00173000
  76.  %    TOGGLING THE CONTROL BIT (IE. ^A BECOMES A AND A BECOMES ^A).     00174000
  77.                                                                         00175000
  78. DEFINE TOCHAR(CH)     = ((CH) + 32)  #;                                 00176000
  79. DEFINE UNCHAR(CH)     = ((CH) - 32)  #;                                 00177000
  80. DEFINE CTL(CH)        = ((CH) & (1-(CH).[6:1])[6:1]) #;                 00178000
  81.                                                                         00179000
  82.                                                                         00180000
  83.  % GLOBAL VARIABLES                                                     00181000
  84.                                                                         00182000
  85. REAL                                                                    00183000
  86.         BSIZE,          % SIZE OF PRESENT DATA                          00184000
  87.         RPSIZ,          % MAXIMUM RECEIVE PACKET SIZE                   00185000
  88.         SPSIZ,          % MAXIMUM SEND PACKET SIZE                      00186000
  89.         TIMINT,         % TIMEOUT FOR FOREIGN HOST ON SENDS             00187000
  90.         PAD,            % HOW MUCH PADDING TO SEND                      00188000
  91.         PCHAR,          % PADDING CHARACTER TO SEND                     00189000
  92.         EOL,            % END-OF-LINE CHARACTER TO SEND                 00190000
  93.         SOHCHAR,        % [1.019] START-OF-PACKET CHAR TO SEND          00191000
  94.         QUOTE,          % QUOTE CHARACTER IN INCOMING DATA              00192000
  95.         QBIN,           % BINARY QUOTE CHARACTER IN INCOMING DATA       00193000
  96.         CHKTYPE,        % ERROR DETECTION TYPE IN INCOMING DATA         00194000
  97.         REPT,           % REPEAT CHARACTER IN INCOMING DATA             00195000
  98.         N,              % PACKET NUMBER                                 00196000
  99.         NUMTRY,         % TIMES THIS PACKET RETRIED                     00197000
  100.         OLDTRY;         % TIMES PREVIOUS PACKET RETRIED                 00198000
  101.                                                                         00199000
  102. BOOLEAN                                                                 00200000
  103.         SERVER,         % MEANS WE'RE A KERMIT SERVER                   00201000
  104.         BINARYON,       % [1.019] MEANS 8-BIT QUOTING MODE ENABLED      00202000
  105.         HIBITOK,        % MEANS 8-BIT MODE IN ACTION                    00203000
  106.         CALL1,          % [1.017] KEEPS TRACK OF RPAR/SPAR SEQUENCE     00204000
  107.         REPTOK,         % [1.017] TRUE MEANS REPEAT ENCRIPTION OK       00205000
  108.         DEBUG,          % INDICATES LEVEL OF DEBUGGING OUTPUT (0=NONE)  00206000
  109.         EXPTABS,        % EXPAND TABS ON INPUT                          00207000
  110.         FIXEDRECS,      % SEND FIXEDRECS LENGTH RECORDS                 00208000
  111.         RAW,            % DONT USE NL AS RECORD SEPARATOR               00209000
  112.         KEEPFILE;       % KEEP THE OUTPUT FILE                          00210000
  113.                                                                         00211000
  114. REAL                                                                    00212000
  115.         INITRETRY,      % NUMBER OF RETRIES ON INITIALIZATION           00213000
  116.         PACKETRETRY,    % NUMBER OF RETRIES FOR A DATA PACKET           00214000
  117.         FILERECSIZE,    % MAXRECSIZE OF RECEIVED FILE                   00215000
  118.         FILEBLOCKSIZE,  % BLOCKSIZE OF RECEIVED FILE                    00216000
  119.         FILEUNITS,      % UNITS OF RECEIVED FILE                        00217000
  120.         FILECOUNT,      % NUMBER OF FILES LEFT TO SEND                  00218000
  121.         STATE,          % PRESENT STATE OF THE AUTOMATON                00219000
  122.         MYPACKSIZ,      % MY MAXIMUM PACKET SIZE                        00220000
  123.         MYTIME,         % MY TIMEOUT INTERVAL                           00221000
  124.         MYPAD,          % MY NUMBER OF PADDING CHARACTERS               00222000
  125.         MYPCHAR,        % MY PADDING CHARACTER                          00223000
  126.         MYEOL,          % MY END OF LINE CHARACTER                      00224000
  127.         MYSOH,          % [1.019] MY START-OF-PACKET CHAR               00225000
  128.         MYQUOTE,        % MY QUOTE CHARACTER                            00226000
  129.         MYQBIN,         % MY BINARY QUOTE CHARACTER                     00227000
  130.         MYCHKTYPE,      % MY CHECKSUM TYPE                              00228000
  131.         MYREPT,         % MY REPEAT CHARACTER                           00229000
  132.         MYPAUSE,        % MY PAUSE AFTER ACK TIME                       00230000
  133.         MYDELAY,        % MY DELAY FOR FIRST SEND TIME                  00231000
  134.         MYESCCHR;       % MY ESCAPE CHARACTER FROM CONNECT              00232000
  135.                                                                         00233000
  136.                                                                         00234000
  137. ARRAY                                                                   00235000
  138.         FILNAM[0:MAXPACKWDS];   % TITLE OF CURRENT DISK FILE            00236000
  139.                                                                         00237000
  140. POINTER                                                                 00238000
  141.         PFILNAM;        % POINTER TO FILNAM                             00239000
  142.                                                                         00240000
  143. ARRAY                                                                   00241000
  144.         RECPKT[0:MAXPACKWDS],% RECEIVE PACKET BUFFER                    00242000
  145.         PACKET[0:MAXPACKWDS];% PACKET BUFFER                            00243000
  146.                                                                         00244000
  147. FILE                                                                    00245000
  148.         REM             %  FILE FOR REMOTE INPUT / OUTPUT               00246000
  149.           (KIND=REMOTE,MYUSE=IO,UNITS=CHARACTERS,BUFFERS=1,             00247000
  150.                  MAXRECSIZE=300,FILETYPE=3),                            00248000
  151.         LOG             %  FILE POINTER FOR LOGFILE                     00249000
  152.            (KIND=DISK,UNITS=CHARACTERS,MAXRECSIZE=96,BLOCKSIZE=2880,    00250000
  153.                     PROTECTION=SAVE,NEWFILE,SAVEFACTOR=1,BUFFERS=1,     00251000
  154.                     TITLE=8"KERMIT/LOG.");                              00252000
  155.                                                                         00253000
  156. TRANSLATETABLE TOUPPER(  ASCII TO ASCII,                                00254000
  157.        "abcdefghijklmnopqrstuvwxyz" TO "ABCDEFGHIJKLMNOPQRSTUVWXYZ"),   00255000
  158.                TOLOWER(  ASCII TO ASCII,                                00256000
  159.        "ABCDEFGHIJKLMNOPQRSTUVWXYZ" TO "abcdefghijklmnopqrstuvwxyz"),   00257000
  160.                TOBURROUGHS( ASCII TO ".",                               00258000
  161.        "abcdefghijklmnopqrstuvwxyz" TO "ABCDEFGHIJKLMNOPQRSTUVWXYZ",    00259000
  162.        "ABCDEFGHIJKLMNOPQRSTUVWXYZ" TO "ABCDEFGHIJKLMNOPQRSTUVWXYZ",    00260000
  163.        "0123456789"                 TO "0123456789" );                  00261000
  164. TRANSLATETABLE ASCTOEBC(                                                00262000
  165.    47"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F" 00263000
  166. TO 48"00010203372D2E2F1605250B0C0D0E0F101112133C3D322618193F271C1D1E1F" 00264000
  167.   ,47"202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F" 00265000
  168. TO 48"404F7F7B5B6C507D4D5D5C4E6B604B61F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F" 00266000
  169.   ,47"404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F" 00267000
  170. TO 48"7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6D7D8D9E2E3E4E5E6E7E8E94AE05A5F6D" 00268000
  171.   ,47"606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F" 00269000
  172. TO 48"79818283848586878889919293949596979899A2A3A4A5A6A7A8A9C06AD0A107" 00270000
  173.             );                                                          00271000
  174. TRANSLATETABLE FIXSLASHES( ASCII TO ASCII , "/" TO "_" );               00272000
  175. TRUTHSET NUMBERS(   "0" OR "1" OR "2" OR "3" OR "4" OR                  00273000
  176.                     "5" OR "6" OR "7" OR "8" OR "9");                   00274000
  177. TRUTHSET QUOTECHARS( "!" OR 48"7F" OR "#" OR "$" OR "%" OR "&"          00275000
  178.    OR "'" OR "(" OR ")" OR "*" OR "+" OR "," OR "-" OR "."              00276000
  179.    OR "/" OR "0" OR NUMBERS OR ":" OR ";" OR "<" OR "=" OR ">"          00277000
  180.    OR "`" OR "{" OR "|" OR "}" OR "~" );                                00278000
  181. ARRAY ACNTRL[0:15],              %  TRUTHSET FOR ALL CONTROL CHARS      00279000
  182.       BCNTRL[0:15];              %  TRUTHSET FOR JUST QUOTE,QBIN,REPT   00280000
  183.  %     4"0000FFFFFFFF",          %  ADD IN FROM 0 THRU 31               00281000
  184.  %     0,0,                      %  LEAVE OUT  32 THRU 95               00282000
  185.  %     4"000000000001",          %  ADD IN BIT FOR 127                  00283000
  186.  %     0,0,0,0                   %  ZERO OUT END (MAY NEED FOR EBCDIC)  00284000
  187.  %  TABLE ALGORITHM:                                                    00285000
  188.  %    BOOLEAN(TABLE[CHAR.[7:3]].[(31-CHAR.[4:5]):1]) => IN TABLE        00286000
  189.  %                                                                      00287000
  190. DEFINE TABLEIT(TAB,C)  = TAB[C.[7:3]].[(31-C.[4:5]):1] := 1#,           00288000
  191.        UNTABLE(TAB,C)  = TAB[C.[7:3]].[(31-C.[4:5]):1] := 0#;           00289000
  192.                                                                         00290000
  193. ARRAY FBUF_[0:29],      %  USED BY FPRINT                               00291000
  194.       EBUF_[0:15],      %  USED BY ERROR                                00292000
  195.       TBUF_[0:15],      %  TEMPORARY BUFFER FOR DIGITS CONVERSION       00293000
  196.       GBUF_[0:99],     %  USED BY GETC                                  00294000
  197.       PBUF_[0:99];     %  USED BY PUTC                                  00295000
  198. POINTER PG_,            %  POINTS TO GBUF_                              00296000
  199.         PP_;            %  POINTS TO PBUF_                              00297000
  200. REAL RD,                %  RESULT DESCRIPTOR FOR EVERYBODY              00298000
  201.      GCNT_,             %  NUMBER OF CHARACTERS IN GBUF_                00299000
  202.      PCNT_,             %  NUMBER OF CHARACTERS IN PBUF_                00300000
  203.      RECSIZ_,           %  MAXRECSIZE OF FP                             00301000
  204.      UNITS_,            %  CHARACTERS PER "UNIT" OF FP                  00302000
  205.      HUH_;              %  SILLY LITTLE FILLER                          00303000
  206. BOOLEAN BRD = RD;       %  BOOLEAN RD                                   00304000
  207. DEFINE                  %  SOME BURROUGHS FIELD DEFINES                 00305000
  208.     LENGTHF = [47:20]#, %  CHAR. COUNT RETURNED FROM RESLT. DESCR.      00306000
  209.     EOFBIT  = [ 9: 1]#, %  EOF ON I/O FROM RESLT. DESCR.                00307000
  210.     BRKBIT  = [13: 1]#, %  BREAK ON I/O FROM RESLT. DESCR.              00308000
  211.  TIMEOUTBIT = [15: 1]#, %  TIMEOUT ON I/O FROM RESLT. DESCR.            00309000
  212.     ERRORF  = [16:17]#, %  THE WHOLE ERROR FIELD                        00310000
  213.     MOD64   = .[5:6]#;  %  N MOD 64 == N.[5:6]                          00311000
  214.                                                                         00312000
  215. DEFINE                                                                  00313000
  216.     INDENT   = TRUE#,   % BOOLEAN CONSTANTS                             00314000
  217.     NOINDENT = FALSE#;                                                  00315000
  218.                                                                         00316000
  219. ARRAY NULLDATA[0:0];                                                    00317000
  220.                                                                         00318000
  221. DEFINE CH(NUMBER,N)  = (NUMBER).[ 7:48] FOR N#,% TO USE NUMBER AS A CHAR00319000
  222.       SAY(STR)       =                                                  00320000
  223.         BEGIN                                                           00321000
  224.          REPLACE POINTER(FBUF_) BY STR;                                 00322000
  225.          IF SERVER THEN                                                 00323000
  226.            ERROR(FBUF_)                                                 00324000
  227.          ELSE                                                           00325000
  228.            BRD := WRITE(REM,MAXPACKSIZ,FBUF_[*]);                       00326000
  229.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             00327000
  230.         END#,                                                           00328000
  231.       SAY1(STR,NUMBER)=                                                 00329000
  232.        BEGIN                                                            00330000
  233.          REPLACE TBUF_ BY 8"-" FOR REAL(NUMBER LSS 0),                  00331000
  234.              NUMBER FOR * DIGITS,8" " FOR 12;                           00332000
  235.          REPLACE POINTER(FBUF_) BY STR,TBUF_ FOR 12                     00333000
  236.              WITH EBCDICTOASCII;                                        00334000
  237.          IF SERVER THEN                                                 00335000
  238.            ERROR(FBUF_)                                                 00336000
  239.          ELSE                                                           00337000
  240.            BRD := WRITE(REM,MAXPACKSIZ,FBUF_[*]);                       00338000
  241.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             00339000
  242.        END#,                                                            00340000
  243.       SAYC(STR,NUMBER)=                                                 00341000
  244.        BEGIN                                                            00342000
  245.           IF TBUF_[0] := NUMBER LSS SP THEN                             00343000
  246.             REPLACE POINTER(FBUF_) BY STR,"CTRL-",CH(NUMBER+64,1),      00344000
  247.              " (HEX ",POINTER(TBUF_,4)+10 FOR 2 WITH HEXTOASCII,")"     00345000
  248.           ELSE                                                          00346000
  249.            REPLACE POINTER(FBUF_) BY STR, CH(NUMBER,1), " (HEX ",       00347000
  250.               POINTER(TBUF_,4)+10 FOR 2 WITH HEXTOASCII,")";            00348000
  251.          IF SERVER THEN                                                 00349000
  252.            ERROR(FBUF_)                                                 00350000
  253.          ELSE                                                           00351000
  254.            BRD := WRITE(REM,MAXPACKSIZ,FBUF_[*]);                       00352000
  255.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             00353000
  256.        END#,                                                            00354000
  257.       SAYN(STR,PTR)   =                                                 00355000
  258.        BEGIN                                                            00356000
  259.          REPLACE POINTER(FBUF_) BY STR,                                 00357000
  260.               PTR FOR MAXPACKSIZ UNTIL = NULC;                          00358000
  261.          IF SERVER THEN                                                 00359000
  262.            ERROR(FBUF_)                                                 00360000
  263.          ELSE                                                           00361000
  264.            BRD := WRITE(REM,MAXPACKSIZ,FBUF_[*]);                       00362000
  265.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             00363000
  266.        END#,                                                            00364000
  267.       SAYP(PTR,WHITESPACE)   =                                          00365000
  268.        BEGIN                                                            00366000
  269.          IF WHITESPACE THEN                                             00367000
  270.             REPLACE POINTER(FBUF_) BY "   ",                            00368000
  271.                                       PTR FOR MAXPACKSIZ-3 WHILE GEQ " "00369000
  272.          ELSE                                                           00370000
  273.             REPLACE POINTER(FBUF_) BY PTR FOR MAXPACKSIZ WHILE GEQ " "; 00371000
  274.          IF SERVER THEN                                                 00372000
  275.            ERROR(FBUF_)                                                 00373000
  276.          ELSE                                                           00374000
  277.            BRD := WRITE(REM,MAXPACKSIZ,FBUF_[*]);                       00375000
  278.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             00376000
  279.        END#,                                                            00377000
  280.                                                                         00378000
  281.       SAYQ(STR)      =                                                  00379000
  282.        BEGIN                                                            00380000
  283.          REPLACE POINTER(FBUF_) BY " " FOR COL_BASE+12-COL_OK_TIL,      00381000
  284.                                    "?";                                 00382000
  285.          BRD := WRITE(REM,MAXPACKSIZ,FBUF_[*]);                         00383000
  286.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             00384000
  287.          REPLACE POINTER(FBUF_) BY "  missing or invalid ",             00385000
  288.                                    STR,                                 00386000
  289.                                    " parameter";                        00387000
  290.          BRD := WRITE(REM,MAXPACKSIZ,FBUF_[*]);                         00388000
  291.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             00389000
  292.        END#,                                                            00390000
  293.                                                                         00391000
  294.       SAYQOPT(STR)      =                                               00392000
  295.        BEGIN                                                            00393000
  296.          COL_OK_TIL := COL_BASE + 12 - COL_OK_TIL;                      00394000
  297.          REPLACE POINTER(FBUF_) BY " " FOR COL_OK_TIL,                  00395000
  298.                                    "?";                                 00396000
  299.          BRD := WRITE(REM,MAXPACKSIZ,FBUF_[*]);                         00397000
  300.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             00398000
  301.          REPLACE POINTER(FBUF_) BY "  missing or invalid ",             00399000
  302.                                    STR,                                 00400000
  303.                                    " parameter - options are:";         00401000
  304.          BRD := WRITE(REM,MAXPACKSIZ,FBUF_[*]);                         00402000
  305.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             00403000
  306.        END#,                                                            00404000
  307.                                                                         00405000
  308.                                                                         00406000
  309.       BUG(STR)       =                                                  00407000
  310.         BEGIN                                                           00408000
  311.           REPLACE POINTER(FBUF_) BY STR;                                00409000
  312.           BRD := WRITE(LOG,96,FBUF_[*]);                                00410000
  313.           REPLACE FBUF_ BY " " FOR 16 WORDS;                            00411000
  314.         END#,                                                           00412000
  315.       BUG1(STR,NUMBER)=                                                 00413000
  316.        BEGIN                                                            00414000
  317.          REPLACE TBUF_ BY 8"-" FOR REAL(NUMBER LSS 0),                  00415000
  318.              NUMBER FOR * DIGITS,8" " FOR 12;                           00416000
  319.          REPLACE POINTER(FBUF_) BY STR,TBUF_ FOR 12                     00417000
  320.              WITH EBCDICTOASCII;                                        00418000
  321.          BRD := WRITE(LOG,96,FBUF_[*]);                                 00419000
  322.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             00420000
  323.        END#,                                                            00421000
  324.       BUGH(STR,NUMBER)=                                                 00422000
  325.        BEGIN                                                            00423000
  326.          TBUF_[0] := NUMBER;                                            00424000
  327.          REPLACE POINTER(FBUF_) BY STR,                                 00425000
  328.               POINTER(TBUF_,4) FOR 12 WITH HEXTOASCII;                  00426000
  329.          BRD := WRITE(LOG,96,FBUF_[*]);                                 00427000
  330.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             00428000
  331.        END#,                                                            00429000
  332.       BUGC(STR,NUMBER)=                                                 00430000
  333.        BEGIN                                                            00431000
  334.           IF TBUF_[0] := NUMBER LSS SP THEN                             00432000
  335.             REPLACE POINTER(FBUF_) BY STR,"CTRL-",CH(CTL(NUMBER),1)     00433000
  336.           ELSE                                                          00434000
  337.            REPLACE POINTER(FBUF_) BY STR, CH(NUMBER,1);                 00435000
  338.          BRD := WRITE(LOG,96,FBUF_[*]);                                 00436000
  339.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             00437000
  340.        END#,                                                            00438000
  341.       BUGN(STR,PTR)   =                                                 00439000
  342.        BEGIN                                                            00440000
  343.          REPLACE POINTER(FBUF_) BY STR,                                 00441000
  344.               PTR FOR MAXPACKSIZ UNTIL = NULC;                          00442000
  345.          BRD := WRITE(LOG,96,FBUF_[*]);                                 00443000
  346.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             00444000
  347.        END#,                                                            00445000
  348.       BUGP(PTR)   =                                                     00446000
  349.        BEGIN                                                            00447000
  350.          REPLACE POINTER(FBUF_) BY PTR FOR MAXPACKSIZ UNTIL = NULC;     00448000
  351.          BRD := WRITE(LOG,96,FBUF_[*]);                                 00449000
  352.          REPLACE FBUF_ BY " " FOR 16 WORDS;                             00450000
  353.        END#;                                                            00451000
  354.                                                                         00452000
  355. DEFINE ERROR(ARA) =                                                     00453000
  356.       BEGIN                                                             00454000
  357.         REPLACE EBUF_ BY ARA FOR HUH_:MAXPACKSIZ-5 WHILE GEQ " ";       00455000
  358.         HUH_ := MAXPACKSIZ - HUH_ - 5;                                  00456000
  359.         REPLACE FBUF_ BY " " FOR 16 WORDS; % SO DEBUGGING IN SPACK IS OK00457000
  360.         SPACK("E",N:=(N+1) MOD64,HUH_,EBUF_);                           00458000
  361.         REPLACE EBUF_ BY " " FOR 16 WORDS;                              00459000
  362.       END#;                                                             00460000
  363. REAL PROCEDURE GETC(FID);                                               00461000
  364.  FILE FID;                                                              00462000
  365.  BEGIN                                                                  00463000
  366.    POINTER P,Q;                                                         00464000
  367.    REAL R;                                                              00465000
  368.                                                                         00466000
  369.    IF GCNT_ LEQ 0 THEN                                                  00467000
  370.      IF BRD := READ(FID,RECSIZ_,GBUF_) THEN                             00468000
  371.        GETC := EOF                                                      00469000
  372.      ELSE                                                               00470000
  373.       BEGIN                                                             00471000
  374.         PG_ := POINTER(GBUF_);     %  INITIALIZE POINTER                00472000
  375.         GCNT_ := RECSIZ_ * UNITS_; %  AND COUNT                         00473000
  376.         IF FIXEDRECS THEN                                               00474000
  377.          IF NOT RAW THEN            % [1.019]                           00475000
  378.           REPLACE PG_+GCNT_ BY CH(NL,1)%  ADD IN A NL AT END            00476000
  379.          ELSE                                                           00477000
  380.           GCNT_ := *-1              % [1.019] NO RECORD TERMINATOR      00478000
  381.         ELSE                                                            00479000
  382.          BEGIN                                                          00480000
  383.            Q := PG_;                                                    00481000
  384.            DO BEGIN                                                     00482000
  385.              SCAN P:Q FOR R:GCNT_ UNTIL LEQ " ";                        00483000
  386.              SCAN Q:P FOR GCNT_:R WHILE LEQ " ";                        00484000
  387.            END UNTIL GCNT_ LEQ 0;                                       00485000
  388.            REPLACE P BY CH(NL,1);                                       00486000
  389.            GCNT_ := RECSIZ_ * UNITS_ - R;                               00487000
  390.          END;                                                           00488000
  391.         GETC := REAL(PG_,1);       %  GET FIRST CHAR                    00489000
  392.         PG_ := *+1;                %  BUMP PTR BUT COUNT IS STILL OK    00490000
  393.       END                          %  SINCE WE ADDED THE NL EARLIER     00491000
  394.    ELSE                                                                 00492000
  395.     BEGIN                                                               00493000
  396.       GCNT_ := *-1;                                                     00494000
  397.       GETC := REAL(PG_,1);                                              00495000
  398.       PG_ := *+1;                                                       00496000
  399.     END;                                                                00497000
  400.  END GETC;                                                              00498000
  401.                                                                         00499000
  402. REAL PROCEDURE PUTC(C,FID);                                             00500000
  403.  VALUE C;                                                               00501000
  404.  REAL C;                                                                00502000
  405.  FILE FID;                                                              00503000
  406.  BEGIN                                                                  00504000
  407.                                                                         00505000
  408.    IF C = NL AND NOT RAW THEN                                           00506000
  409.      PCNT_ := -1                                                        00507000
  410.    ELSE                                                                 00508000
  411.      REPLACE PP_:PP_ BY CH(C,1);                                        00509000
  412.    IF PCNT_ := *-1 LEQ 0 THEN                                           00510000
  413.      BEGIN                                                              00511000
  414.        BRD := WRITE(FID,RECSIZ_,PBUF_);                                 00512000
  415.        REPLACE PP_:=POINTER(PBUF_) BY " " FOR PCNT_:=RECSIZ_*UNITS_+1;  00513000
  416.        IF C NEQ NL OR RAW THEN      %  WE JUST LOST A CHARACTER         00514000
  417.          BEGIN                      %  LET'S GET IT BACK                00515000
  418.            REPLACE PP_:PP_ BY CH(C,1);                                  00516000
  419.            PCNT_ := *-1;            %  AND DECREMENT COUNTER            00517000
  420.          END;                                                           00518000
  421.      END;                                                               00519000
  422.    PUTC := C;                                                           00520000
  423.  END PUTC;                                                              00521000
  424.                                                                         00522000
  425.                                                                         00523000
  426.  %                                                                      00524000
  427.  %  M A I N                                                             00525000
  428.  %                                                                      00526000
  429.  %  MAIN ROUTINE - PARSE COMMAND AND OPTIONS, SET UP THE                00527000
  430.  %  TTY LINES, AND DISPATCH TO THE APPROPRIATE ROUTINE.                 00528000
  431.                                                                         00529000
  432.                                                                         00530000
  433. PROCEDURE MAIN;                                                         00531000
  434.  BEGIN                                                                  00532000
  435.   POINTER CP;                      %  CHAR POINTER                      00533000
  436.   REAL COL;                        %  COLUMN COUNTER FOR SCANNER        00534000
  437.   REAL COL_BASE;                   % BEGINNING COLUMN COUNT FOR SCANNER 00535000
  438.   REAL COL_OK_TIL;                 %  COLUMN COUNTER FOR PREVIOUS SCAN  00536000
  439.   ARRAY NEXTSEND[0:MAXPACKWDS];    %  NEXT FILE(S) TO SEND              00537000
  440.   BOOLEAN MORETOSEND;              %  SOMETHING IN NEXTSEND             00538000
  441.   EBCDIC ARRAY MACHINE[0:3];       %  WHAT MACHINE (7800, 6700, ETC)    00539000
  442.   ARRAY KPROMPT[0:15];             %  THE KERMIT PROMPT                 00540000
  443.   ARRAY REFERENCE SPECARA[0];      %  CURRENT COMMAND ARRAY             00541000
  444.                                                                         00542000
  445.                                                                         00543000
  446.   VALUE ARRAY SPECIAL(             %  ALL THE COMMANDS                  00544000
  447.     48"01" "?    "  ,              %  ? FOR HELP                        00545000
  448.     48"04" "EXIT " ,                                                    00546000
  449.     48"04" "HELP " ,                                                    00547000
  450.     48"04" "QUIT " ,                                                    00548000
  451.     48"07" "RECEIVE    " ,                                              00549000
  452.     48"04" "SEND " ,                                                    00550000
  453.     48"06" "SERVER     " ,                                              00551000
  454.     48"03" "SET  " ,                                                    00552000
  455.     48"04" "SHOW " ,                                                    00553000
  456.     48"06" "STATUS     " ,                                              00554000
  457.               0);                                                       00555000
  458.                                                                         00556000
  459. %    DEFINES FOR COMMANDS                                               00557000
  460.                                                                         00558000
  461.   DEFINE                                                                00559000
  462.     QMARKV              =   0#,                                         00560000
  463.     EXITV               =   1#,                                         00561000
  464.     HELPV               =   2#,                                         00562000
  465.     QUITV               =   3#,                                         00563000
  466.     RECEIVEV            =   4#,                                         00564000
  467.     SENDV               =   6#,                                         00565000
  468.     SERVERV             =   7#,                                         00566000
  469.     SETV                =   9#,                                         00567000
  470.     SHOWV               =  10#,                                         00568000
  471.     STATUSV             =  11#,                                         00569000
  472.     QUESTIONV           =  -98#,                                        00570000
  473.     INVALIDV            =  -99#,                                        00571000
  474.     NOERRORV            =  101#;                                        00572000
  475.                                                                         00573000
  476.   VALUE ARRAY SPECSET(             %  ALL THE SPECIAL 'SET' COMMANDS    00574000
  477.     48"01" "?    "  ,                                                   00575000
  478.     48"09" "DEBUGGING  " ,                                              00576000
  479.     48"05" "DELAY" ,                                                    00577000
  480.     48"04" "FILE " ,                                                    00578000
  481.     48"0A" "INCOMPLETE " ,                                              00579000
  482.     48"05" "RETRY" ,                                                    00580000
  483.     48"07" "RECEIVE    " ,                                              00581000
  484.     48"04" "SEND " ,                                                    00582000
  485.     48"06" "BINARY     " ,                                              00583000
  486.               0);                                                       00584000
  487.                                                                         00585000
  488. %    DEFINES FOR SET COMMAND                                            00586000
  489.                                                                         00587000
  490.   DEFINE                                                                00588000
  491. %   QMARKV              =   0#,                                         00589000
  492.     DEBUGV              =   1#,                                         00590000
  493.     DELAYV              =   3#,                                         00591000
  494.     FILEV               =   4#,                                         00592000
  495.     INCOMPLETEV         =   5#,                                         00593000
  496.     RETRYV              =   7#,                                         00594000
  497.     SETRECEIVEV         =   8#,                                         00595000
  498.     SETSENDV            =  10#,                                         00596000
  499.     BINARYV             =  11#;                                         00597000
  500.                                                                         00598000
  501.   VALUE ARRAY SPECFILE(            %  FOR SET FILE COMMANDS             00599000
  502.     48"01" "?    " ,                                                    00600000
  503.     48"0A" "BLOCK-SIZE " ,                                              00601000
  504.     48"0B" "EXPAND-TABS" ,                                              00602000
  505.     48"05" "FIXED" ,                                                    00603000
  506.     48"03" "RAW  " ,                                                    00604000
  507.     48"0B" "RECORD-SIZE" ,                                              00605000
  508.     48"05" "UNITS" ,                                                    00606000
  509.               0);                                                       00607000
  510.                                                                         00608000
  511. %         DEFINES FOR SET FILE COMMANDS                                 00609000
  512.   DEFINE                                                                00610000
  513. %   QMARK                   =  0#,                                      00611000
  514.     BLOCKSIZEV              =  1#,                                      00612000
  515.     EXPTABSV                =  3#,                                      00613000
  516.     FIXEDV                  =  5#,                                      00614000
  517.     RAWV                    =  6#,                                      00615000
  518.     RECORDSIZEV             =  7#,                                      00616000
  519.     UNITSV                  =  9#;                                      00617000
  520.                                                                         00618000
  521.   VALUE ARRAY SPECABORT(           %  FOR SET ABORTED-FILE              00619000
  522.     48"01" "?    " ,                                                    00620000
  523.     48"07" "DISCARD    " ,                                              00621000
  524.     48"04" "KEEP " ,                                                    00622000
  525.               0);                                                       00623000
  526.                                                                         00624000
  527. %    DEFINES FOR SPECABORT                                              00625000
  528.                                                                         00626000
  529.   DEFINE                                                                00627000
  530. %   QMARKV              =   0#,                                         00628000
  531.     DISCARDV            =   1#,                                         00629000
  532.     KEEPV               =   3#;                                         00630000
  533.                                                                         00631000
  534.   VALUE ARRAY SPECDEBUG(           %  FOR SET DEBUGGING                 00632000
  535.     48"01" "?    " ,                                                    00633000
  536.     48"06" "STATES     " ,                                              00634000
  537.     48"07" "PACKETS    " ,                                              00635000
  538.     48"08" "LOG-FILE   " ,                                              00636000
  539.     48"03" "OFF  ",                                                     00637000
  540.               0);                                                       00638000
  541.                                                                         00639000
  542. %    DEFINES FOR SPECDEBUG                                              00640000
  543.                                                                         00641000
  544.   DEFINE                                                                00642000
  545. %   QMARKV              =   0#,                                         00643000
  546.     STATESV             =   1#,                                         00644000
  547.     PACKETSV            =   3#,                                         00645000
  548.     LOGFILEV            =   5#,                                         00646000
  549.     DOFFV               =   7#;                                         00647000
  550.                                                                         00648000
  551.   VALUE ARRAY SPECRETRY(           %  FOR SET RETRY                     00649000
  552.     48"01" "?    " ,                                                    00650000
  553.     48"12" "INITIAL-CONNECTION     " ,                                  00651000
  554.     48"07" "PACKETS    " ,                                              00652000
  555.               0);                                                       00653000
  556.                                                                         00654000
  557. %    DEFINES FOR SPECRETRY                                              00655000
  558.                                                                         00656000
  559.   DEFINE                                                                00657000
  560. %   QMARKV              =   0#,                                         00658000
  561.     INITCONNV           =   1#,                                         00659000
  562.     RETRYPACKETSV       =   5#;                                         00660000
  563.                                                                         00661000
  564.   VALUE ARRAY SPECONOFF(           %  FOR ON/OFF                        00662000
  565.     48"01" "?    " ,                                                    00663000
  566.     48"02" "ON   " ,                                                    00664000
  567.     48"03" "OFF  " ,                                                    00665000
  568.               0);                                                       00666000
  569.                                                                         00667000
  570. %    DEFINES FOR SPECONOFF                                              00668000
  571.                                                                         00669000
  572.   DEFINE                                                                00670000
  573. %   QMARKV              =   0#,                                         00671000
  574.     ONV                 =   1#,                                         00672000
  575.     OFFV                =   2#;                                         00673000
  576.                                                                         00674000
  577.   VALUE ARRAY SPECRECEIVE(         %  FOR SET RECEIVE, SET SEND         00675000
  578.     48"01" "?    " ,                                                    00676000
  579.     48"0B" "END-OF-LINE" ,                                              00677000
  580.     48"0D" "PACKET-LENGTH    " ,                                        00678000
  581.     48"07" "PADDING    " ,                                              00679000
  582.     48"07" "PADCHAR    " ,                                              00680000
  583.     48"05" "PAUSE" ,                                                    00681000
  584.     48"05" "QUOTE" ,                                                    00682000
  585.     48"0F" "START-OF-PACKET  " ,                                        00683000
  586.     48"07" "TIMEOUT    " ,                                              00684000
  587.               0);                                                       00685000
  588.                                                                         00686000
  589. %    DEFINES FOR SPECRECEIVE                                            00687000
  590.                                                                         00688000
  591.   DEFINE                                                                00689000
  592. %   QMARKV              =   0#,                                         00690000
  593.     EOLV                =   1#,                                         00691000
  594.     LENV                =   3#,                                         00692000
  595.     PADV                =   6#,                                         00693000
  596.     PCHARV              =   8#,                                         00694000
  597.     PAUSEV              =  10#,                                         00695000
  598.     QUOTEV              =  11#,                                         00696000
  599.     STARTOFPACKV        =  12#,                                         00697000
  600.     TIMEOUTV            =  15#;                                         00698000
  601.                                                                         00699000
  602.   VALUE ARRAY SPECUNITS(           %  FOR SET RECEIVE UNITS             00700000
  603.     48"01" "?    ",                                                     00701000
  604.     48"05" "WORDS",                                                     00702000
  605.     48"0A" "CHARACTERS ",                                               00703000
  606.               0);                                                       00704000
  607.                                                                         00705000
  608. %    DEFINES FOR SPECUNITS                                              00706000
  609.                                                                         00707000
  610.   DEFINE                                                                00708000
  611. %   QMARKV              =   0#,                                         00709000
  612.     UWORDSV             =   1#,                                         00710000
  613.     UCHARACTERSV        =   2#;                                         00711000
  614.                                                                         00712000
  615.   VALUE ARRAY SPECSHOW(            % FOR SHOW SEND/RECEIVE              00713000
  616.     48"04" "SEND " ,                                                    00714000
  617.             0);                                                         00715000
  618.                                                                         00716000
  619.   DEFINE                                                                00717000
  620.     SHOSENDV            =   0#;                                         00718000
  621.                                                                         00719000
  622.                                                                         00720000
  623.                                                                         00721000
  624.   VALUE ARRAY PLAINHELP(           %  GLOBAL HELP STUFF                 00722000
  625.     48"0D" "EXIT to CANDE    ",                                         00723000
  626.     48"1B" "HELP by giving this message  ",                             00724000
  627.     48"10" "QUIT (like EXIT) ",                                         00725000
  628.     48"16" "RECEIVE file from host ",                                   00726000
  629.     48"11" "SEND file to host",                                         00727000
  630.     48"20" "SERVER   make me a Kermit Server   ",                       00728000
  631.     48"0F" "SET a parameter  ",                                         00729000
  632.     48"0D" "SHOW settings    ",                                         00730000
  633.     48"12" "STATUS (like SHOW)     ",                                   00731000
  634.               0),                                                       00732000
  635.               SETHELP(             %  SET HELP STUFF                    00733000
  636.     48"20" "   BINARY (do 8th bit transfers)   " ,                      00734000
  637.     48"19" "   DEBUGGING level option    ",                             00735000
  638.     48"1F" "   DELAY seconds for first SEND    ",                       00736000
  639.     48"11" "   FILE parameter" ,                                        00737000
  640.     48"19" "   INCOMPLETE disposition    " ,                            00738000
  641.     48"0E" "   RETRY count   ",                                         00739000
  642.     48"14" "   RECEIVE parameter   ",                                   00740000
  643.     48"11" "   SEND parameter",                                         00741000
  644.               0),                                                       00742000
  645.               SETFILEHELP(         % SET FILE  HELP STUFF               00743000
  646.     48"14" "   BLOCK-SIZE length   ",                                   00744000
  647.     48"17" "   EXPAND-TABS on input",                                   00745000
  648.     48"32" "   FIXED (send blanks found at the end of records)" ,       00746000
  649.     48"2A" "   RAW (without any line delimiting chars)     ",           00747000
  650.     48"15" "   RECORD-SIZE length  ",                                   00748000
  651.     48"1E" "   UNITS (words or characters)    ",                        00749000
  652.               0),                                                       00750000
  653.               SENDHELP(            %  SET RECEIVE/SEND HELP             00751000
  654.     48"1C" "   END-OF-LINE (number 0-31) ",                             00752000
  655.     48"17" "   PACKET-LENGTH length",                                   00753000
  656.     48"20" "   PADDING  (number of PADCHARS)   ",                       00754000
  657.     48"19" "   PADCHAR  (number 0-31)    ",                             00755000
  658.     48"1B" "   PAUSE seconds before ACK  ",                             00756000
  659.     48"12" "   QUOTE character     ",                                   00757000
  660.     48"20" "   START-OF-PACKET (number 0-31)   " ,                      00758000
  661.     48"15" "   TIMEOUT in seconds  ",                                   00759000
  662.               0),                                                       00760000
  663.               UNITSHELP(           %  SET RECEIVE UNITS HELP            00761000
  664.     48"08" "   WORDS   ",                                               00762000
  665.     48"0D" "   CHARACTERS    ",                                         00763000
  666.               0),                                                       00764000
  667.               ABORTHELP(           %  SET ABORTED-FILE HELP             00765000
  668.     48"1C" "   DISCARD the file on abort ",                             00766000
  669.     48"19" "   KEEP the file on abort    ",                             00767000
  670.               0),                                                       00768000
  671.               DEBUGHELP(           %  SET DEBUGGING HELP                00769000
  672.     48"1E" "   STATES - flag state changes     ",                       00770000
  673.     48"19" "   PACKETS- flag all data    ",                             00771000
  674.     48"20" "   LOG-FILE changes log filename   ",                       00772000
  675.     48"1E" "   OFF    - turn off all flags     ",                       00773000
  676.               0),                                                       00774000
  677.               RETRYHELP(           %  SET RETRY HELP                    00775000
  678.     48"1C" "    INITIAL-CONNECTION count ",                             00776000
  679.     48"11" "    PACKETS count",                                         00777000
  680.               0),                                                       00778000
  681.               ONOFFHELP(           %  ONLY ON OR OFF                    00779000
  682.     48"05" "   ON",                                                     00780000
  683.     48"06" "   OFF     ",                                               00781000
  684.               0),                                                       00782000
  685.               LONUMBERHELP(         %  ONLY NUMBERS ALLOWED             00783000
  686.     48"24" "   must be an integer from 0 thru 31    ",                  00784000
  687.               0),                                                       00785000
  688.               QUOTEHELP(          %  ONLY 32 < N < 127                  00786000
  689.     48"2B" "   must be an ASCII character from ! thru ~    ",           00787000
  690.     48"2E" "                              (HEX 21 thru 7E) ",           00788000
  691.               0),                                                       00789000
  692.               NUMBERHELP(         %  ANY NUMBERS ALLOWED                00790000
  693.     48"21" "   can be any decimal digit > 0  ",                         00791000
  694.               0);                                                       00792000
  695.                                                                         00793000
  696.    DEFINE                                                               00794000
  697.      PLAINH    =  0#,                                                   00795000
  698.      SETH      =  1#,                                                   00796000
  699.      ABORTH    =  2#,                                                   00797000
  700.      DEBUGH    =  3#,                                                   00798000
  701.      RETRYH    =  4#,                                                   00799000
  702.      RECEIVEH  =  5#,                                                   00800000
  703.      SENDH     =  5#,                                                   00801000
  704.      NUMBERH   =  6#,                                                   00802000
  705.      ONOFFH    =  7#,                                                   00803000
  706.      QUOTEH    =  8#,                                                   00804000
  707.      UNITSH    =  9#,                                                   00805000
  708.      LONUMH    = 10#,                                                   00806000
  709.      SETFILEH  = 11#;                                                   00807000
  710.                                                                         00808000
  711.                                                                         00809000
  712.  BOOLEAN PROCEDURE SENDSW;                    FORWARD;                  00810000
  713.  BOOLEAN PROCEDURE RECSW(ISTATE);                          % [1.017]    00811000
  714.   REAL ISTATE;                                FORWARD;     % [1.017]    00812000
  715.  PROCEDURE SPACK(TYPE,NUM,LEN,DATA);                                    00813000
  716.   VALUE TYPE,NUM,LEN;                                                   00814000
  717.   REAL TYPE;                                                            00815000
  718.   REAL NUM,LEN;                                                         00816000
  719.   ARRAY DATA[0];                              FORWARD;                  00817000
  720.  REAL PROCEDURE RPACK(LEN,NUM,DATA);                                    00818000
  721.   REAL LEN,NUM;                                                         00819000
  722.   ARRAY DATA[0];                              FORWARD;                  00820000
  723.  REAL PROCEDURE BUFILL(FID,BUFFER);                                     00821000
  724.   FILE FID;                                                             00822000
  725.   ARRAY BUFFER[0];                            FORWARD;                  00823000
  726.  PROCEDURE BUFEMP(FID,BUFFER,LEN);                                      00824000
  727.   VALUE LEN;                                                            00825000
  728.   REAL LEN;                                                             00826000
  729.   FILE FID;                                                             00827000
  730.   ARRAY BUFFER[0];                            FORWARD;                  00828000
  731.  PROCEDURE SPAR(LEN,DATA);                                              00829000
  732.  REAL LEN;                                                              00830000
  733.   ARRAY DATA[0];                              FORWARD;                  00831000
  734.  PROCEDURE RPAR(LEN,DATA);                                              00832000
  735.  REAL LEN;                                                              00833000
  736.   ARRAY DATA[0];                              FORWARD;                  00834000
  737.  PROCEDURE FLUSHINPUT;                        FORWARD;                  00835000
  738.  PROCEDURE PRERRPKT(MSG);                                               00836000
  739.   ARRAY MSG[0];                               FORWARD;                  00837000
  740.                                                                         00838000
  741.  %                                                                      00839000
  742.  %   A B O R T R U N                                                    00840000
  743.  %                                                                      00841000
  744.  %   SENDS AN ERROR PACKET AND ABORTS                                   00842000
  745.  %                                                                      00843000
  746.    PROCEDURE ABORTRUN;                                                  00844000
  747.     BEGIN                                                               00845000
  748.       REPLACE TBUF_[0] BY COL FOR * DIGITS,"      ";                    00846000
  749.       REPLACE EBUF_ BY "KERMIT ABORTING DUE TO FAULT # ",               00847000
  750.         TBUF_ FOR 2 WITH EBCDICTOASCII," @ ",                           00848000
  751.         KPROMPT FOR 50 WITH EBCDICTOASCII;                              00849000
  752.       SPACK("E",( N := *+1 ) MOD64, MAXPACKSIZ-5,EBUF_);                00850000
  753.       IF NOT SERVER THEN                                                00851000
  754.         SAYP(EBUF_,NOINDENT);                                           00852000
  755.       IF (MYSELF.OPTION).[VALUE(FAULT) : 1]=1 THEN                      00853000
  756.         PROGRAMDUMP(ARRAYS,FILES);                                      00854000
  757.       WHEN(10);                                                         00855000
  758.       MYSELF.STATUS := VALUE(TERMINATED);                               00856000
  759.     END ABORTRUN;                                                       00857000
  760.                                                                         00858000
  761. %                                                                       00859000
  762. %  I N I T I A L I Z E                                                  00860000
  763. %                                                                       00861000
  764. %  INITIALIZE SETS UP INITIAL VALUES                                    00862000
  765. %                                                                       00863000
  766.   PROCEDURE INITIALIZE;                                                 00864000
  767.    BEGIN                                                                00865000
  768.     ARRAY GREETING[0:13];                                               00866000
  769.     EBCDIC ARRAY VERSION[0:7];                                          00867000
  770.                                                                         00868000
  771.     REPLACE MACHINE BY TIME(23).[7:8]*100 FOR 4 DIGITS;                 00869000
  772.     REPLACE VERSION BY COMPILETIME(20) FOR 1 DIGITS,8".",               00870000
  773.        COMPILETIME(21) FOR 3 DIGITS;                                    00871000
  774.     REPLACE GREETING BY "UCD BURROUGHS KERMIT-",                        00872000
  775.         MACHINE FOR 4 WITH EBCDICTOASCII,                               00873000
  776.        " - VERSION ",VERSION FOR 5 WITH EBCDICTOASCII,NULC;             00874000
  777.     REPLACE FBUF_ BY " " FOR 30 WORDS;                                  00875000
  778.     REPLACE EBUF_ BY " " FOR 16 WORDS;                                  00876000
  779.     SAYP(GREETING,NOINDENT);                                            00877000
  780.     REPLACE KPROMPT BY "KERMIT-",MACHINE FOR 2                          00878000
  781.        WITH EBCDICTOASCII," ",ETXC; %  PUT ETXC AT END TO KEEP BLANK    00879000
  782.                                                                         00880000
  783. %   INITIALIZE THESE VALUES AND HOPE THE FIRST PACKET WILL GET ACROSS OK00881000
  784.                                                                         00882000
  785.     EOL        := CR;              %  EOL FOR OUTGOING PACKETS          00883000
  786.     SOHCHAR    := DEFSOH;          % SOH FOR OUTGOING PACKETS           00884000
  787.     QUOTE      := "#";             %  STANDARD CONTROL-QUOTE CHAR "#"   00885000
  788.     PAD        := 0;               %  NO PADDING                        00886000
  789.     PCHAR      := NULC;            %  USE NULC IF ANY PADDING WANTED    00887000
  790.     QBIN       := "N";             %  DEFAULT TO NO BINARY QUOTING      00888000
  791.     REPT       := SP;              %  DEFAULT TO SPACE                  00889000
  792.     CHKTYPE    := "1";             %  DEFAULT CHKTYPE                   00890000
  793.     MYPACKSIZ  := MAXPACKSIZ;      %  SET MINE TO DEFAULTS              00891000
  794.     INITRETRY  := DEFINITRETRY;    %  INITIALIZE RETRIES                00892000
  795.     PACKETRETRY:= DEFPACKETRETRY;                                       00893000
  796.     FILERECSIZE:= DEFRECSIZE;                                           00894000
  797.     FILEBLOCKSIZE:= DEFBLOCKSIZE;                                       00895000
  798.     FILEUNITS   := DEFUNITS;                                            00896000
  799.     MYTIME     := DEFTIME;                                              00897000
  800.     MYPAD      := DEFPAD;                                               00898000
  801.     MYPCHAR    := DEFPCHAR;                                             00899000
  802.     MYEOL      := DEFEOL;                                               00900000
  803.     MYSOH      := DEFSOH;              % [1.019]                        00901000
  804.     MYQUOTE    := DEFQUOTE;                                             00902000
  805.     MYQBIN     := DEFQBIN;             % [1.019]                        00903000
  806.     MYCHKTYPE  := DEFCHKTYPE;                                           00904000
  807.     MYREPT     := DEFREPT;                                              00905000
  808.     MYPAUSE    := DEFPAUSE;     % SECONDS ( INPUT IS IN 10THS )         00906000
  809.     MYDELAY    := DEFDELAY;                                             00907000
  810.     MYESCCHR   := DEFESCCHR;                                            00908000
  811.                                                                         00909000
  812.     FIXEDRECS  := FALSE;           %  DEFAULT                           00910000
  813.     EXPTABS    := TRUE;            %  DEFAULT -> EXPAND THEM            00911000
  814.     HIBITOK    := FALSE;           % [1.017] 8-BIT ONLY WHEN REQUESTED  00912000
  815.     BINARYON   := FALSE;           % [1.019] CHANGED BY SET BINARY COMMA00913000
  816.     REPTOK     := FALSE;           % [1.017] NO REPEAT PROCESSING       00914000
  817.     KEEPFILE    := TRUE;           %  DEFAULT TO KEEP ALL FILES MADE    00915000
  818.     RAW         := FALSE;          %  USE CR FOR END-OF-LINE            00916000
  819.                                    %  INITIALIZE ACNTRL TABLE           00917000
  820.     REPLACE ACNTRL BY 48"0000FFFFFFFF",0,0,48"000000000001",0,0,0,0;    00918000
  821.     REPLACE BCNTRL BY 0 FOR 8 WORDS;                                    00919000
  822.                                                                         00920000
  823.    END INITIALIZE;                                                      00921000
  824.                                                                         00922000
  825. %                                                                       00923000
  826. %  S C A N I T                                                          00924000
  827. %                                                                       00925000
  828. %  SCANS INPUT AND PUTS ITEMS INTO ARRAY AC IN KUNKER-FORM.  PLACES     00926000
  829. %  ITEM LENGTH INTO LEN AND RETURNS THE ITEM'S INDEX IN THE SPECIAL     00927000
  830. %  ARRAY.                                                               00928000
  831. %                                                                       00929000
  832.                                                                         00930000
  833.     REAL PROCEDURE SCANIT;                                              00931000
  834.       BEGIN                                                             00932000
  835.         ARRAY AC[0:3];                                                  00933000
  836.         REAL I,J,SAVEJ,CNT;                                             00934000
  837.                                                                         00935000
  838.         SCANIT := -1;                                                   00936000
  839.         COL_OK_TIL := COL;                                              00937000
  840.         SCAN CP:CP FOR COL:COL UNTIL GTR " ";                           00938000
  841.         IF COL GTR 0 THEN                                               00939000
  842.           BEGIN                                                         00940000
  843.             SCAN CP FOR I:COL WHILE GTR " ";                            00941000
  844.             IF CP+((I := COL-I)-1) = "?" THEN                           00942000
  845.              IF I GTR 1 THEN                                            00943000
  846.               I := *-1;                                                 00944000
  847.             REPLACE POINTER(AC) BY I.[7:48] FOR 1,                      00945000
  848.                   CP FOR I;                                             00946000
  849.             J := SIZE(SPECARA);                                         00947000
  850.             SAVEJ := CNT := -1;                                         00948000
  851.             WHILE J:=*-1 GEQ 0 DO                                       00949000
  852.               IF J := MASKSEARCH(AC[0],                                 00950000
  853.                40"E0" & REAL(NOT FALSE)[39:MIN(40,I*8)],SPECARA[J])     00951000
  854.                GEQ 0 THEN                                               00952000
  855.               IF CP = POINTER(SPECARA[J])+1 FOR I THEN                  00953000
  856.                 TBUF_[CNT:=*+1] := SAVEJ := J                           00954000
  857.             ;                                                           00955000
  858.             IF (CNT:=*+1 GTR 1)OR(CP+I = "?") THEN                      00956000
  859.               BEGIN                                                     00957000
  860.                 IF CP+I NEQ "?" THEN                                    00958000
  861.               SAY("  ambiguous command, please supply more characters");00959000
  862.                 SAY("  possible commands:");                            00960000
  863.                 WHILE CNT GTR 0 DO                                      00961000
  864.                     IF SAVEJ := TBUF_[CNT := *-1] GTR 0 THEN            00962000
  865.                       SAYP(POINTER(SPECARA[SAVEJ])+1,INDENT);           00963000
  866.                 SCANIT := NOERRORV;                                     00964000
  867.               END                                                       00965000
  868.             ELSE                                                        00966000
  869.                 SCANIT := SAVEJ;                                        00967000
  870.             CP  := *+I;                                                 00968000
  871.             COL := *-I;                                                 00969000
  872.           END;                                                          00970000
  873.       END SCANIT;                                                       00971000
  874.                                                                         00972000
  875. %                                                                       00973000
  876. %  S C A N U M                                                          00974000
  877. %                                                                       00975000
  878.    REAL PROCEDURE SCANUM;                                               00976000
  879.     BEGIN                                                               00977000
  880.       ARRAY AC[0:3];                                                    00978000
  881.       REAL I,J,SAVEJ,CNT;                                               00979000
  882.                                                                         00980000
  883.       SCANUM := INVALIDV;                                               00981000
  884.       COL_OK_TIL := COL;                                                00982000
  885.       SCAN CP:CP FOR COL:COL UNTIL GTR " ";                             00983000
  886.       IF COL GTR 0 THEN                                                 00984000
  887.          IF CP IN NUMBERS THEN                                          00985000
  888.            BEGIN                                                        00986000
  889.              SCAN CP FOR I:COL WHILE IN NUMBERS;                        00987000
  890.              IF I := COL-I LSS 12 THEN                                  00988000
  891.                BEGIN                                                    00989000
  892.                  REPLACE AC BY CP FOR I WITH ASCIITOEBCDIC;             00990000
  893.                  SCANUM := INTEGER(AC,I);                               00991000
  894.                END                                                      00992000
  895.              ELSE                                                       00993000
  896.                SCANUM := INVALIDV;                                      00994000
  897.            END                                                          00995000
  898.          ELSE                                                           00996000
  899.            IF CP = "?" THEN                                             00997000
  900.               SCANUM := QUESTIONV;                                      00998000
  901.      END OF PROCEDURE SCANUM;                                           00999000
  902. %                                                                       01000000
  903. %  H E L P E R                                                          01001000
  904. %                                                                       01002000
  905. %  DOES ALL THE HELP STUFF FROM ? OR HELP INPUT                         01003000
  906. %                                                                       01004000
  907.                                                                         01005000
  908.  $BEGINSEGMENT                                                          01006000
  909.                                                                         01007000
  910. PROCEDURE HELPER(TYPE);                                                 01008000
  911.  VALUE TYPE;                                                            01009000
  912.  REAL TYPE;                                                             01010000
  913.  BEGIN                                                                  01011000
  914.    ARRAY REFERENCE HELPARA[0];                                          01012000
  915.    POINTER P;                                                           01013000
  916.    REAL LENGTH;                                                         01014000
  917.    CASE TYPE OF                                                         01015000
  918.    BEGIN                                                                01016000
  919.    PLAINH:                           %  PLAN OLD HELP                   01017000
  920.         HELPARA := PLAINHELP;                                           01018000
  921.    SETH:                           %  SET HELP                          01019000
  922.         HELPARA := SETHELP;                                             01020000
  923.    ABORTH:                         %  ABORT HELP                        01021000
  924.         HELPARA := ABORTHELP;                                           01022000
  925.    DEBUGH:                         %  DEBUG HELP                        01023000
  926.         HELPARA := DEBUGHELP;                                           01024000
  927.    RETRYH:                         %  RETRY HELP                        01025000
  928.         HELPARA := RETRYHELP;                                           01026000
  929.    SENDH:                          %  SEND HELP                         01027000
  930.         HELPARA := SENDHELP;                                            01028000
  931.    NUMBERH:                        %  NUMBER HELP                       01029000
  932.         HELPARA := NUMBERHELP;                                          01030000
  933.    ONOFFH:                         %  ON/OFF HELP                       01031000
  934.         HELPARA := ONOFFHELP;                                           01032000
  935.    QUOTEH:                         %  QUOTE HELP                        01033000
  936.         HELPARA := QUOTEHELP;                                           01034000
  937.    UNITSH:                         %  RECEIVE UNITS HELP                01035000
  938.         HELPARA := UNITSHELP;                                           01036000
  939.    LONUMH:                         %  LOW NUMBER HELP (0-31)            01037000
  940.         HELPARA := LONUMBERHELP;                                        01038000
  941.    SETFILEH:                                                            01039000
  942.         HELPARA := SETFILEHELP;    %  SET FILE HELP                     01040000
  943.    ELSE:                                                                01041000
  944.         LENGTH := -1;                                                   01042000
  945.    END CASE;                                                            01043000
  946.    IF LENGTH GEQ 0 THEN                                                 01044000
  947.     BEGIN                                                               01045000
  948.      P := POINTER(HELPARA);                                             01046000
  949.      WHILE LENGTH := REAL(P,1) GTR 0 DO                                 01047000
  950.       BEGIN                                                             01048000
  951.         BRD := WRITE(REM,LENGTH,P+1);                                   01049000
  952.         P := *+(((LENGTH + 6) DIV 6) *6);                               01050000
  953.       END;                                                              01051000
  954.     END;                                                                01052000
  955.  END HELPER;                                                            01053000
  956.                                                                         01054000
  957.                                                                         01055000
  958. %                                                                       01056000
  959. %  S E T S T U F F                                                      01057000
  960. %                                                                       01058000
  961. %  SETS THE VARIOUS THINGS                                              01059000
  962. %                                                                       01060000
  963. PROCEDURE SETSTUFF;                                                     01061000
  964.  BEGIN                                                                  01062000
  965. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                           01063000
  966.    PROCEDURE ABORTER;                                                   01064000
  967.     BEGIN                                                               01065000
  968.       SPECARA := SPECABORT;                                             01066000
  969.       CASE SCANIT OF                                                    01067000
  970.       BEGIN                                                             01068000
  971.     QMARKV:                                                             01069000
  972. SAY("  determines what to do if RECEIVE transfer fails - options are:");01070000
  973.            HELPER(ABORTH);                                              01071000
  974.     DISCARDV:                                                           01072000
  975.            KEEPFILE := FALSE;                                           01073000
  976.     KEEPV:                                                              01074000
  977.            KEEPFILE := TRUE;                                            01075000
  978.     ELSE:                                                               01076000
  979.            SAYQOPT("INCOMPLETE");                                       01077000
  980.            HELPER(ABORTH);                                              01078000
  981.       END CASE;                                                         01079000
  982.     END ABORTER;                                                        01080000
  983. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                           01081000
  984.    PROCEDURE DEBUGGER;                                                  01082000
  985.     BEGIN                                                               01083000
  986.       POINTER P;                                                        01084000
  987.       SPECARA := SPECDEBUG;                                             01085000
  988.       CASE SCANIT OF                                                    01086000
  989.       BEGIN                                                             01087000
  990.     QMARKV:                                                             01088000
  991.            SAY("  sets level of DEBUGGING output -- options are:");     01089000
  992.            HELPER(DEBUGH);                                              01090000
  993.     STATESV:                                                            01091000
  994.            DEBUG := TRUE;                                               01092000
  995.     PACKETSV:                                                           01093000
  996.            DEBUG := BOOLEAN(3);                                         01094000
  997.     LOGFILEV:                                                           01095000
  998.            IF NOT DEBUG THEN DEBUG := TRUE;                             01096000
  999.            SCAN CP:CP FOR COL:COL WHILE LEQ " ";                        01097000
  1000.            IF COL GTR 0 THEN                                            01098000
  1001.             BEGIN                                                       01099000
  1002.               SCAN P:CP FOR COL WHILE GEQ "A";                          01100000
  1003.               REPLACE P BY "."48"00";                                   01101000
  1004.               IF LOG.OPEN THEN LOCK(LOG,CRUNCH);                        01102000
  1005.               REPLACE CP BY CP FOR COL+1 WITH ASCIITOEBCDIC;            01103000
  1006.               REPLACE LOG.TITLE BY CP;                                  01104000
  1007.             END;                                                        01105000
  1008.     DOFFV:                                                              01106000
  1009.            DEBUG := FALSE;                                              01107000
  1010.     ELSE:                                                               01108000
  1011.            SAYQOPT("DEBUGGING");                                        01109000
  1012.            HELPER(DEBUGH);                                              01110000
  1013.       END CASE;                                                         01111000
  1014.       IF DEBUG THEN                                                     01112000
  1015.         IF NOT LOG.OPEN THEN LOG.OPEN := TRUE                           01113000
  1016.         ELSE                                                            01114000
  1017.       ELSE                                                              01115000
  1018.         IF LOG.OPEN THEN LOCK(LOG,CRUNCH);                              01116000
  1019.     END DEBUGGER;                                                       01117000
  1020. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                           01118000
  1021.    PROCEDURE DELAYER;                                                   01119000
  1022.     BEGIN                                                               01120000
  1023.       REAL N;                                                           01121000
  1024.       N := SCANUM;                                                      01122000
  1025.       IF (N LSS 0)OR(N GTR 31) THEN                                     01123000
  1026.         IF (N = QUESTIONV) THEN                                         01124000
  1027.         BEGIN                                                           01125000
  1028.              SAY("   sets time to delay (in secs) before");             01126000
  1029.              SAY("   sending first packet during file SEND");           01127000
  1030.              HELPER(LONUMH);                                            01128000
  1031.         END                                                             01129000
  1032.         ELSE                                                            01130000
  1033.         BEGIN                                                           01131000
  1034.              SAYQ("DELAY");                                             01132000
  1035.              HELPER(LONUMH);                                            01133000
  1036.         END                                                             01134000
  1037.       ELSE                                                              01135000
  1038.         MYDELAY := N                                                    01136000
  1039.     END DELAYER;                                                        01137000
  1040. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                           01138000
  1041.    PROCEDURE RETRYER;                                                   01139000
  1042.     BEGIN                                                               01140000
  1043.       REAL N;                                                           01141000
  1044.       SPECARA := SPECRETRY;                                             01142000
  1045.       CASE SCANIT OF                                                    01143000
  1046.       BEGIN                                                             01144000
  1047.     QMARKV:                                                             01145000
  1048.            SAY("   sets number of times to retry an operation");        01146000
  1049.            SAY("   before giving up -  options are:");                  01147000
  1050.            HELPER(RETRYH);                                              01148000
  1051.     INITCONNV:                                                          01149000
  1052.            N := SCANUM;                                                 01150000
  1053.            IF (N LSS 0) THEN                                            01151000
  1054.               IF (N = QUESTIONV) THEN                                   01152000
  1055.               BEGIN                                                     01153000
  1056.              SAY("   sets number of times to retry initial connection");01154000
  1057.                 HELPER(NUMBERH)                                         01155000
  1058.               END                                                       01156000
  1059.               ELSE                                                      01157000
  1060.               BEGIN                                                     01158000
  1061.                 SAYQ("INITIAL-CONNECTION");                             01159000
  1062.                 HELPER(NUMBERH);                                        01160000
  1063.               END                                                       01161000
  1064.            ELSE                                                         01162000
  1065.               INITRETRY := N;                                           01163000
  1066.     RETRYPACKETSV:                                                      01164000
  1067.            N := SCANUM;                                                 01165000
  1068.            IF (N LSS 0) THEN                                            01166000
  1069.               IF (N = QUESTIONV) THEN                                   01167000
  1070.               BEGIN                                                     01168000
  1071.              SAY("   sets number of times to retry regular connection");01169000
  1072.                 HELPER(NUMBERH)                                         01170000
  1073.               END                                                       01171000
  1074.               ELSE                                                      01172000
  1075.               BEGIN                                                     01173000
  1076.                 SAYQ("PACKETS");                                        01174000
  1077.                 HELPER(NUMBERH);                                        01175000
  1078.               END                                                       01176000
  1079.            ELSE                                                         01177000
  1080.               PACKETRETRY := N;                                         01178000
  1081.     ELSE:                                                               01179000
  1082.            SAYQOPT("RETRY");                                            01180000
  1083.            HELPER(RETRYH);                                              01181000
  1084.       END CASE                                                          01182000
  1085.     END RETRYER;                                                        01183000
  1086. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                        01184000
  1087.    PROCEDURE BLOCKER;                                                   01185000
  1088.     BEGIN                                                               01186000
  1089.       REAL N;                                                           01187000
  1090.       N := SCANUM;                                                      01188000
  1091.       IF (N LSS 1) THEN                                                 01189000
  1092.          IF (N = QUESTIONV) THEN                                        01190000
  1093.          BEGIN                                                          01191000
  1094.              SAY("  sets BLOCKSIZE attribute of RECEIVED files");       01192000
  1095.              HELPER(NUMBERH);                                           01193000
  1096.          END                                                            01194000
  1097.          ELSE                                                           01195000
  1098.          BEGIN                                                          01196000
  1099.              SAYQ("BLOCK-SIZE");                                        01197000
  1100.              HELPER(NUMBERH);                                           01198000
  1101.          END                                                            01199000
  1102.        ELSE                                                             01200000
  1103.        BEGIN                                                            01201000
  1104.          FILEBLOCKSIZE := N;                                            01202000
  1105.          IF (FILEBLOCKSIZE MOD FILERECSIZE) NEQ 0 THEN                  01203000
  1106.          BEGIN                                                          01204000
  1107.            SAY("Warning: BLOCK-SIZE must be a multiple of RECORD-SIZE");01205000
  1108.         SAY1("  current settings:       RECORD-SIZE = ",FILERECSIZE);   01206000
  1109.         SAY1("                           BLOCK-SIZE = ",FILEBLOCKSIZE); 01207000
  1110.          END                                                            01208000
  1111.        END                                                              01209000
  1112.     END BLOCKER;                                                        01210000
  1113. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                           01211000
  1114.    PROCEDURE RECSIZER;                                                  01212000
  1115.     BEGIN                                                               01213000
  1116.       REAL N;                                                           01214000
  1117.       N := SCANUM;                                                      01215000
  1118.       IF (N LSS 1) THEN                                                 01216000
  1119.          IF (N = QUESTIONV) THEN                                        01217000
  1120.          BEGIN                                                          01218000
  1121.              SAY("  sets MAXRECSIZE attribute of RECEIVED files");      01219000
  1122.              HELPER(NUMBERH);                                           01220000
  1123.          END                                                            01221000
  1124.          ELSE                                                           01222000
  1125.          BEGIN                                                          01223000
  1126.              SAYQ("RECORD-SIZE");                                       01224000
  1127.              HELPER(NUMBERH);                                           01225000
  1128.          END                                                            01226000
  1129.        ELSE                                                             01227000
  1130.        BEGIN                                                            01228000
  1131.          FILERECSIZE := N;                                              01229000
  1132.          IF (FILEBLOCKSIZE MOD FILERECSIZE) NEQ 0 THEN                  01230000
  1133.          BEGIN                                                          01231000
  1134.            SAY("Warning: BLOCK-SIZE must be a multiple of RECORD-SIZE");01232000
  1135.         SAY1("  current settings:       RECORD-SIZE = ",FILERECSIZE);   01233000
  1136.         SAY1("                           BLOCK-SIZE = ",FILEBLOCKSIZE); 01234000
  1137.          END                                                            01235000
  1138.        END                                                              01236000
  1139.     END RECSIZER;                                                       01237000
  1140. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                           01238000
  1141.   PROCEDURE UNITER;                                                     01239000
  1142.    BEGIN                                                                01240000
  1143.       SPECARA := SPECUNITS;                                             01241000
  1144.       CASE SCANIT OF                                                    01242000
  1145.       BEGIN                                                             01243000
  1146.       QMARKV:                                                           01244000
  1147.  SAY("   set UNITS file attribute for received files -- options are:"); 01245000
  1148.              HELPER(UNITSH);                                            01246000
  1149.      UWORDSV:                                                           01247000
  1150.              FILEUNITS := VALUE(WORDS);                                 01248000
  1151.      UCHARACTERSV:                                                      01249000
  1152.              FILEUNITS := VALUE(CHARACTERS);                            01250000
  1153.         ELSE:                                                           01251000
  1154.              SAYQOPT("UNITS");                                          01252000
  1155.              HELPER(UNITSH);                                            01253000
  1156.      END CASE;                                                          01254000
  1157.    END OF PROCEDURE UNITER;                                             01255000
  1158. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                        01256000
  1159.    PROCEDURE SENDRECEIVER(WHICH);                                       01257000
  1160.     VALUE WHICH;                                                        01258000
  1161.     REAL WHICH;                                                         01259000
  1162.     BEGIN                                                               01260000
  1163.       REAL N;     % [1.018] NEED TO DECLARE LOCALLY                     01261000
  1164.       INTEGER NDX;                                                      01262000
  1165.       SPECARA := SPECRECEIVE;                                           01263000
  1166.        CASE NDX := SCANIT OF                                            01264000
  1167.       BEGIN                                                             01265000
  1168.     QMARKV:                                                             01266000
  1169.             SAY("  sets various packet parameters - options are:");     01267000
  1170.            HELPER(SENDH);                                               01268000
  1171.     EOLV:                                                               01269000
  1172.            N := SCANUM;                                                 01270000
  1173.            IF (N LSS 1)OR(N GTR 31) THEN                                01271000
  1174.               IF (N = QUESTIONV) THEN                                   01272000
  1175.               BEGIN                                                     01273000
  1176.                 IF WHICH=SETRECEIVEV THEN                               01274000
  1177.        SAY("  sets the packet terminator character to expect")          01275000
  1178.                 ELSE                                                    01276000
  1179.        SAY("  sets the packet terminator character to send");           01277000
  1180.                 HELPER(LONUMH)                                          01278000
  1181.               END                                                       01279000
  1182.               ELSE                                                      01280000
  1183.               BEGIN                                                     01281000
  1184.                 SAYQ("END-OF-LINE");                                    01282000
  1185.                 HELPER(LONUMH);                                         01283000
  1186.               END                                                       01284000
  1187.            ELSE                                                         01285000
  1188.              IF WHICH=SETRECEIVEV THEN                                  01286000
  1189.                MYEOL := N                                               01287000
  1190.              ELSE                                                       01288000
  1191.                EOL := N;                                                01289000
  1192.     QUOTEV:                                                             01290000
  1193.           IF WHICH=SETRECEIVEV THEN                                     01291000
  1194.    SAY("  not implemented, no need to set QUOTE to expect")             01292000
  1195.           ELSE                                                          01293000
  1196.           BEGIN                                                         01294000
  1197.            COL_OK_TIL := COL;                                           01295000
  1198.            SCAN CP:CP FOR COL:COL WHILE LEQ " ";                        01296000
  1199.            IF COL GTR 0 THEN                                            01297000
  1200.            BEGIN                                                        01298000
  1201.             IF CP = "?" THEN                                            01299000
  1202.             BEGIN                                                       01300000
  1203.                 SAY("  sets QUOTE character to send");                  01301000
  1204.                 HELPER(QUOTEH)                                          01302000
  1205.             END                                                         01303000
  1206.             ELSE                                                        01304000
  1207.              IF N := REAL(CP,1) LSS 33 OR N GTR 126 THEN  % ! < N < ~   01305000
  1208.              BEGIN                                                      01306000
  1209.                 SAY("  invalid QUOTE character - must be an");          01307000
  1210.                 HELPER(QUOTEH)                                          01308000
  1211.              END                                                        01309000
  1212.              ELSE                                                       01310000
  1213.                IF N=MYQBIN THEN               %  NO WAY!                01311000
  1214.   SAY("  QUOTE not set, that character is your binary quote")           01312000
  1215.                ELSE                                                     01313000
  1216.                  IF N=MYREPT THEN             % NO WAY!                 01314000
  1217.   SAY("  QUOTE not set, that character is your repeat quote")           01315000
  1218.                  ELSE                                                   01316000
  1219.                     MYQUOTE := N                                        01317000
  1220.             END                                                         01318000
  1221.             ELSE                                                        01319000
  1222.             BEGIN                                                       01320000
  1223.               SAYQ("QUOTE");                                            01321000
  1224.               HELPER(QUOTEH);                                           01322000
  1225.             END;                                                        01323000
  1226.           END;                                                          01324000
  1227.     LENV:                                                               01325000
  1228.            N := SCANUM;                                                 01326000
  1229.            IF (N LSS 10)OR(N GTR 94) THEN                               01327000
  1230.               IF (N = QUESTIONV) THEN                                   01328000
  1231.               BEGIN                                                     01329000
  1232.                 IF WHICH=SETRECEIVEV THEN                               01330000
  1233.                   SAY("  set PACKET-LENGTH for incoming packets")       01331000
  1234.                 ELSE                                                    01332000
  1235.                   SAY("  sets PACKET-LENGTH for outgoing packets");     01333000
  1236.                 SAY("   must be an integer from 10 to 94");             01334000
  1237.               END                                                       01335000
  1238.               ELSE                                                      01336000
  1239.               BEGIN                                                     01337000
  1240.                 SAYQ("PACKET-LENGTH");                                  01338000
  1241.                 SAY("   must be an integer from 10 to 94");             01339000
  1242.               END                                                       01340000
  1243.            ELSE                                                         01341000
  1244.              IF WHICH=SETRECEIVEV THEN                                  01342000
  1245.                MYPACKSIZ := N                                           01343000
  1246.              ELSE                                                       01344000
  1247.                SPSIZ := N;                                              01345000
  1248.     PADV:                                                               01346000
  1249.     PCHARV:                                                             01347000
  1250.     PAUSEV:                                                             01348000
  1251.     STARTOFPACKV:                                                       01349000
  1252.     TIMEOUTV:                                                           01350000
  1253.            N := SCANUM;                                                 01351000
  1254.            IF (N LSS 0)OR(N GTR 31) THEN                                01352000
  1255.               IF (N = QUESTIONV) THEN                                   01353000
  1256.               BEGIN                                                     01354000
  1257.                 IF WHICH=SETRECEIVEV THEN                               01355000
  1258.     SAY("  sets a packet parameter for incoming packets")               01356000
  1259.                 ELSE                                                    01357000
  1260.     SAY("  sets a packet parameter for outgoing packets");              01358000
  1261.                 HELPER(LONUMH);                                         01359000
  1262.               END                                                       01360000
  1263.               ELSE                                                      01361000
  1264.               BEGIN                                                     01362000
  1265.                 SAYQ("packet");                                         01363000
  1266.                 HELPER(LONUMH);                                         01364000
  1267.               END                                                       01365000
  1268.            ELSE                                                         01366000
  1269.             CASE NDX OF                                                 01367000
  1270.             BEGIN                                                       01368000
  1271.     PADV:                                                               01369000
  1272.              IF WHICH=SETRECEIVEV THEN                                  01370000
  1273.                MYPAD := N                                               01371000
  1274.              ELSE                                                       01372000
  1275.                PAD := N;                                                01373000
  1276.     PCHARV:                                                             01374000
  1277.              IF WHICH=SETRECEIVEV THEN                                  01375000
  1278.                MYPCHAR := N                                             01376000
  1279.              ELSE                                                       01377000
  1280.                PCHAR := N;                                              01378000
  1281.     PAUSEV:                                                             01379000
  1282.            MYPAUSE := N/10;                                             01380000
  1283.     STARTOFPACKV:                                                       01381000
  1284.            IF WHICH=SETRECEIVEV THEN                                    01382000
  1285.               MYSOH := N                                                01383000
  1286.            ELSE                                                         01384000
  1287.               SOHCHAR := N;                                             01385000
  1288.     TIMEOUTV:                                                           01386000
  1289.            IF N = 0 THEN                                                01387000
  1290.              SAY("  TIMEOUT must be greater than zero")                 01388000
  1291.            ELSE                                                         01389000
  1292.              IF WHICH=SETRECEIVEV THEN                                  01390000
  1293.                MYTIME := N                                              01391000
  1294.              ELSE                                                       01392000
  1295.                 TIMINT := N;                                            01393000
  1296.              END CASE;                                                  01394000
  1297.     NOERRORV:                                                           01395000
  1298.            ;                                                            01396000
  1299.     ELSE:                                                               01397000
  1300.            IF WHICH=SETRECEIVEV THEN                                    01398000
  1301.               SAYQOPT("RECEIVE")                                        01399000
  1302.            ELSE                                                         01400000
  1303.               SAYQOPT("SEND");                                          01401000
  1304.            HELPER(SENDH);                                               01402000
  1305.       END CASE;                                                         01403000
  1306.     END SENDRECEIVER;                                                   01404000
  1307. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                           01405000
  1308.    PROCEDURE BINARER;                                                   01406000
  1309.     BEGIN                                                               01407000
  1310.       SPECARA := SPECONOFF;                                             01408000
  1311.       CASE SCANIT OF                                                    01409000
  1312.       BEGIN                                                             01410000
  1313.     QMARKV:                                                             01411000
  1314.          SAY("  transfer all 8 bits of each character - options are:"); 01412000
  1315.            HELPER(ONOFFH);                                              01413000
  1316.        ONV:                                                             01414000
  1317.            BINARYON := TRUE;                                            01415000
  1318.       OFFV:                                                             01416000
  1319.            BINARYON := FALSE;                                           01417000
  1320.       ELSE:                                                             01418000
  1321.            SAYQOPT("BINARY");                                           01419000
  1322.            HELPER(ONOFFH);                                              01420000
  1323.       END CASE;                                                         01421000
  1324.     END BINARER;                                                        01422000
  1325. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                           01423000
  1326.    PROCEDURE FIXER;                                                     01424000
  1327.     BEGIN                                                               01425000
  1328.       SPECARA := SPECONOFF;                                             01426000
  1329.       CASE SCANIT OF                                                    01427000
  1330.       BEGIN                                                             01428000
  1331.     QMARKV:                                                             01429000
  1332.            SAY("  send trailing blanks found at the end of");           01430000
  1333.            SAY("  fixed-length records -- options are:");               01431000
  1334.            HELPER(ONOFFH);                                              01432000
  1335.        ONV:                                                             01433000
  1336.            FIXEDRECS := TRUE;                                           01434000
  1337.       OFFV:                                                             01435000
  1338.            FIXEDRECS := FALSE;                                          01436000
  1339.       ELSE:                                                             01437000
  1340.            SAYQOPT("FIXED");                                            01438000
  1341.            HELPER(ONOFFH);                                              01439000
  1342.       END CASE;                                                         01440000
  1343.     END FIXER;                                                          01441000
  1344. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                           01442000
  1345.    PROCEDURE EXPANDTABBER;                                              01443000
  1346.     BEGIN                                                               01444000
  1347.       SPECARA := SPECONOFF;                                             01445000
  1348.       CASE SCANIT OF                                                    01446000
  1349.       BEGIN                                                             01447000
  1350.     QMARKV:                                                             01448000
  1351. SAY("  expand TABs to spaces when RECEIVING files - options are:");     01449000
  1352.            HELPER(ONOFFH);                                              01450000
  1353.        ONV:                                                             01451000
  1354.            EXPTABS := TRUE;                                             01452000
  1355.       OFFV:                                                             01453000
  1356.            EXPTABS := FALSE;                                            01454000
  1357.       ELSE:                                                             01455000
  1358.            SAYQOPT("EXPAND-TABS");                                      01456000
  1359.            HELPER(ONOFFH);                                              01457000
  1360.       END CASE;                                                         01458000
  1361.     END EXPANDTABBER;                                                   01459000
  1362. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                           01460000
  1363.    PROCEDURE RAWER;                                                     01461000
  1364.     BEGIN                                                               01462000
  1365.       SPECARA := SPECONOFF;                                             01463000
  1366.       CASE SCANIT OF                                                    01464000
  1367.       BEGIN                                                             01465000
  1368.     QMARKV:                                                             01466000
  1369. SAY("  fill each record to MAXRECSIZE when RECEIVING files -");         01467000
  1370.            SAY("  options are:");                                       01468000
  1371.            HELPER(ONOFFH);                                              01469000
  1372.        ONV:                                                             01470000
  1373.            RAW := TRUE;                                                 01471000
  1374.            EXPTABS := FALSE;                                            01472000
  1375.            SAY("EXPAND-TABS now set to OFF");                           01473000
  1376.       OFFV:                                                             01474000
  1377.            RAW := FALSE;                                                01475000
  1378.            IF EXPTABS THEN SAY("EXPAND-TABS is ON")                     01476000
  1379.            ELSE            SAY("EXPAND-TABS is OFF");                   01477000
  1380.       ELSE:                                                             01478000
  1381.            SAYQ("RAW");                                                 01479000
  1382.            HELPER(ONOFFH);                                              01480000
  1383.       END CASE;                                                         01481000
  1384.     END RAWER;                                                          01482000
  1385.                                                                         01483000
  1386. %%%%%%%%%%%%%%%%%%%%%%                                                  01484000
  1387.    PROCEDURE SETFILER;                                                  01485000
  1388.     BEGIN                                                               01486000
  1389.                                                                         01487000
  1390.       INTEGER NDX;                                                      01488000
  1391.       SPECARA := SPECFILE;                                              01489000
  1392.       CASE (NDX := SCANIT) OF                                           01490000
  1393.       BEGIN                                                             01491000
  1394.   QMARKV:                                                               01492000
  1395.         HELPER(SETFILEH);                                               01493000
  1396.   BLOCKSIZEV:                                                           01494000
  1397.         BLOCKER;                                                        01495000
  1398.   EXPTABSV:                                                             01496000
  1399.         EXPANDTABBER;                                                   01497000
  1400.   FIXEDV:                                                               01498000
  1401.         FIXER;                                                          01499000
  1402.   RAWV:                                                                 01500000
  1403.         RAWER;                                                          01501000
  1404.   RECORDSIZEV:                                                          01502000
  1405.         RECSIZER;                                                       01503000
  1406.   UNITSV:                                                               01504000
  1407.         UNITER;                                                         01505000
  1408.   NOERRORV:                                                             01506000
  1409.            ;                                                            01507000
  1410.   ELSE:                                                                 01508000
  1411.         SAYQOPT("FILE");                                                01509000
  1412.         HELPER(SETFILEH);                                               01510000
  1413.       END OF CASE;                                                      01511000
  1414.     END OF PROCEDURE SETFILER;                                          01512000
  1415. %%%%%%%%%%%%%%%%%%%%%%                                                  01513000
  1416. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% mainline for procedure SETSTUFF    01514000
  1417.    SPECARA := SPECSET;                                                  01515000
  1418.    CASE SCANIT OF                                                       01516000
  1419.    BEGIN                                                                01517000
  1420.   QMARKV:                                                               01518000
  1421.     SAY("  sets various KERMIT environment variables -- options are:"); 01519000
  1422.         HELPER(SETH);                                                   01520000
  1423.   INCOMPLETEV:                                                          01521000
  1424.         ABORTER;                                                        01522000
  1425.   BINARYV:                                                              01523000
  1426.         BINARER;                                                        01524000
  1427.   DEBUGV:                                                               01525000
  1428.         DEBUGGER;                                                       01526000
  1429.   DELAYV:                                                               01527000
  1430.         DELAYER;                                                        01528000
  1431.   FILEV:                                                                01529000
  1432.         SETFILER;                                                       01530000
  1433.   RETRYV:                                                               01531000
  1434.         RETRYER;                                                        01532000
  1435.   SETRECEIVEV:                                                          01533000
  1436.         SENDRECEIVER(SETRECEIVEV);                                      01534000
  1437.   SETSENDV:                                                             01535000
  1438.         SENDRECEIVER(SETSENDV);                                         01536000
  1439.   NOERRORV:                                                             01537000
  1440.         ;                                                               01538000
  1441.   ELSE:                                                                 01539000
  1442.         SAYQOPT("SET");                                                 01540000
  1443.         HELPER(SETH);                                                   01541000
  1444.    END CASE;                                                            01542000
  1445.  END SETSTUFF;                                                          01543000
  1446.                                                                         01544000
  1447.  $ENDSEGMENT                                                            01545000
  1448.                                                                         01546000
  1449.                                                                         01547000
  1450. %                                                                       01548000
  1451. %  S T A T U S                                                          01549000
  1452. %                                                                       01550000
  1453. %  DISPLAY THE STATUS OF ALL THE VARIOUS THINGS                         01551000
  1454. %                                                                       01552000
  1455. PROCEDURE STATUS;                                                       01553000
  1456.  BEGIN                                                                  01554000
  1457.    SAY("parameters which can be changed by the SET command");           01555000
  1458.    IF (BINARYON) THEN                                                   01556000
  1459.       SAY("  BINARY ON (8th bit quoting will be requested)")            01557000
  1460.    ELSE                                                                 01558000
  1461.       SAY("  BINARY OFF (No 8th bit quoting will be done)");            01559000
  1462.    IF DEBUG THEN                                                        01560000
  1463.     BEGIN                                                               01561000
  1464.       REPLACE PFILNAM:=POINTER(FILNAM) BY LOG.TITLE,NULC;               01562000
  1465.       REPLACE PFILNAM BY PFILNAM FOR 80 WITH EBCDICTOASCII;             01563000
  1466.       IF REAL(DEBUG) GTR 1 THEN                                         01564000
  1467.         SAYN("  DEBUG STATES and PACKETS to file ",PFILNAM)             01565000
  1468.       ELSE                                                              01566000
  1469.         SAYN("  DEBUG STATES to file ",PFILNAM);                        01567000
  1470.     END                                                                 01568000
  1471.    ELSE                                                                 01569000
  1472.      SAY("  DEBUG OFF");                                                01570000
  1473.    SAY1("  DELAY before first send (in seconds) = ",MYDELAY);           01571000
  1474.    IF KEEPFILE THEN                                                     01572000
  1475.      SAY("  if INCOMPLETE, KEEP partial file")                          01573000
  1476.    ELSE                                                                 01574000
  1477.      SAY("  if INCOMPLETE, DISCARD partial file");                      01575000
  1478.    SAY1("  RETRY INITIAL-CONNECTION = ",INITRETRY);                     01576000
  1479.    SAY1("  RETRY PACKETS = ",PACKETRETRY);                              01577000
  1480.    SAY("parameters which can be changed by the SET FILE command");      01578000
  1481.    SAY1("  RECORD-SIZE = ",FILERECSIZE);                                01579000
  1482.    SAY1("  BLOCK-SIZE  = ",FILEBLOCKSIZE);                              01580000
  1483.    IF FILEUNITS = VALUE(WORDS) THEN                                     01581000
  1484.      SAY("  UNITS       = WORDS")                                       01582000
  1485.    ELSE                                                                 01583000
  1486.      SAY("  UNITS       = CHARACTERS");                                 01584000
  1487.    IF EXPTABS THEN                                                      01585000
  1488.      SAY("  EXPAND-TABS ON")                                            01586000
  1489.    ELSE                                                                 01587000
  1490.      SAY("  EXPAND-TABS OFF");                                          01588000
  1491.    IF FIXEDRECS THEN                                                    01589000
  1492.      SAY("  FIXED ON (send blanks found at the end of records)")        01590000
  1493.    ELSE                                                                 01591000
  1494.      SAY("  FIXED OFF (strip blanks from the end of records)");         01592000
  1495.    IF RAW THEN                                                          01593000
  1496.      SAY("  RAW ON ( Burroughs records delimited by size only )")       01594000
  1497.    ELSE                                                                 01595000
  1498.      SAY("  RAW OFF ( Burroughs records delimited by CR )");            01596000
  1499.    SPECARA := SPECSHOW;                                                 01597000
  1500.    CASE SCANIT OF                                                       01598000
  1501.    BEGIN                                                                01599000
  1502. SHOSENDV:                                                               01600000
  1503.      SAY("parameters which can be changed by the SET SEND command");    01601000
  1504.      SAYC("  END-OF-LINE character = ",EOL);                            01602000
  1505.      SAY1("  maximum PACKET-LENGTH = ",SPSIZ);                          01603000
  1506.      SAY1("  number of PADDING characters = ",PAD);                     01604000
  1507.      IF PAD GTR 0 THEN                                                  01605000
  1508.        SAYC("  PADDING CHARACTER = ",PCHAR);                            01606000
  1509.  SAY1("  PAUSE before packet send (in tenths of second) = ",MYPAUSE*10);01607000
  1510.      SAYC("  START-OF-PACKET charcter = ",SOHCHAR);                     01608000
  1511.      SAY1("  packet TIMEOUT (in seconds) = ",TIMINT);                   01609000
  1512. ELSE:                                                                   01610000
  1513.      SAY("parameters which can be changed by the SET RECEIVE command"); 01611000
  1514.      SAYC("  END-OF-LINE character = ",MYEOL);                          01612000
  1515.      SAY1("  maximum PACKET-LENGTH = ",MYPACKSIZ);                      01613000
  1516.      SAY1("  number of PADDING characters = ",MYPAD);                   01614000
  1517.      IF MYPAD GTR 0 THEN                                                01615000
  1518.        SAYC("  PADDING CHARACTER = ",MYPCHAR);                          01616000
  1519.  SAY1("  PAUSE before packet send (in tenths of second) = ",MYPAUSE*10);01617000
  1520.      SAYC("  QUOTE character = ",MYQUOTE);                              01618000
  1521.      SAYC("  START-OF-PACKET character = ",MYSOH);                      01619000
  1522.      SAY1("  packet TIMEOUT (in seconds) = ",MYTIME);                   01620000
  1523.    END CASE;                                                            01621000
  1524.  END STATUS;                                                            01622000
  1525.                                                                         01623000
  1526.                                                                         01624000
  1527. BOOLEAN PROCEDURE PROCESSIT;                                            01625000
  1528. BEGIN                                                                   01626000
  1529. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                          01627000
  1530. PROCEDURE SERVANT;                                                      01628000
  1531.  BEGIN                                                                  01629000
  1532.    BOOLEAN DONTQUIT;               %  LOOP CONTROL                      01630000
  1533.    ARRAY BUFFER[0:MAXPACKWDS];     %  TEMPORARY FILE TITLE BUFFER       01631000
  1534.    FILE DUMMY(KIND=PACK,FILETYPE=7);%  TEMPORARY DUMMY FILE             01632000
  1535.    REAL NUM,LEN,TIMER;             %  PACKET NUMBER, LENGTH, TIMEOUT    01633000
  1536.                                                                         01634000
  1537. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                          01635000
  1538.    PROCEDURE GENERICTHINGS;        %  HANDLE "G" REQUESTS               01636000
  1539.     BEGIN                                                               01637000
  1540.       POINTER PR;                  %  POINTER TO PACKET                 01638000
  1541.                                                                         01639000
  1542.       PR := POINTER(PACKET);       %  INITIALIZE IT                     01640000
  1543.       CASE REAL(PR,1) OF                                                01641000
  1544.       BEGIN                                                             01642000
  1545.       "F":                         %  FINISH, BUT DON'T LOGOUT          01643000
  1546.            SPACK("Y",N,0,NULLDATA);%  ACK TO PC AND THEN...             01644000
  1547.            DONTQUIT := FALSE;      %  EXIT FROM WHILE LOOP              01645000
  1548.            BRD := TRUE;            %  AND EXIT FROM MAIN LOOP           01646000
  1549.       "L":                         %  FINISH AND LOG OUT, TOO           01647000
  1550. %          SPACK("Y",N,0,NULLDATA);%  ACK TO PC AND THEN...             01648000
  1551.            SAYN("BYE IS NOT IMPLEMENTED:  ",PACKET);                    01649000
  1552.            DONTQUIT := FALSE;      %  EXIT FROM WHILE LOOP              01650000
  1553.            BRD := TRUE;            %  AND EXIT FROM MAIN LOOP           01651000
  1554.            %                       %  THIS PART ISN'T IMPLEMENTED       01652000
  1555.      ELSE:                         %  SOME OTHER NON-IMPLEMENTED THING  01653000
  1556.            SAYN("THIS IS NOT IMPLEMENTED:  ",PACKET);                   01654000
  1557.       END CASE;                                                         01655000
  1558.     END GENERICTHINGS;                                                  01656000
  1559.                                                                         01657000
  1560. %%%%%%%%%%%%%%%%%%%%%%%%%%%%% mainline statements for SERVANT           01658000
  1561.    STATE := "T";                   %  JUST TO INITIALIZE FOR DEBUG      01659000
  1562.    DONTQUIT := SERVER := TRUE;     %  INITIALIZE BOOLEANS               01660000
  1563.    REPLACE PFILNAM:=POINTER(FILNAM) BY NULC FOR MAXPACKWDS WORDS;       01661000
  1564.    TIMER := IF TIMINT LSS MINTIM OR TIMINT GTR MAXTIM THEN              01662000
  1565.                           MYTIME ELSE TIMINT;                           01663000
  1566.                                                                         01664000
  1567.    WHILE DONTQUIT DO                                                    01665000
  1568.     BEGIN                                                               01666000
  1569.       REM.TIMELIMIT := TIMER;    %  SET UP FOR IO TIMEOUT               01667000
  1570.       IF DEBUG THEN BUGC("SERVANT STATE:  ",STATE);                     01668000
  1571.       CASE RPACK(LEN,NUM,PACKET) OF%  DO WHICHEVER ONE WE NEED          01669000
  1572.       BEGIN                                                             01670000
  1573.       "R":                         %  GET OR RECEIVE A FILE(US TO PC)   01671000
  1574.            N := NUM;               %  RESTART PACKET NUMBERS            01672000
  1575.            REPLACE PFILNAM BY PACKET FOR LEN WITH TOUPPER,              01673000
  1576.                  ".",NULC;                                              01674000
  1577.            REPLACE BUFFER BY PFILNAM FOR LEN+1 WITH ASCIITOEBCDIC;      01675000
  1578.            IF DUMMY.OPEN THEN CLOSE(DUMMY);                             01676000
  1579.            REPLACE DUMMY.TITLE BY BUFFER;                               01677000
  1580.            IF NOT DUMMY.RESIDENT THEN                                   01678000
  1581.              SAYN("NO FILE:  ",FILNAM)                                  01679000
  1582.            ELSE                                                         01680000
  1583.            IF SENDSW THEN                                               01681000
  1584. %            SAYN("SEND DONE FOR:  ",PFILNAM)                           01682000
  1585. %          ELSE                                                         01683000
  1586. %            SAYN("SEND FAILED FOR:  ",PFILNAM);                        01684000
  1587.            STATE := "R";           %  FOR DEBUG                         01685000
  1588.       "S":                         %  SEND A FILE (FROM PC TO US)       01686000
  1589.            CALL1 := TRUE;                   % [1.017]                   01687000
  1590.            RPAR(LEN,PACKET);                % [1.017] EXCHANGE          01688000
  1591.            SPAR(LEN,PACKET);                % [1.017]  PARAMETERS       01689000
  1592.            SPACK("Y",NUM,LEN,PACKET);       % [1.017]                   01690000
  1593.            OLDTRY := NUMTRY;                % [1.017] RESET COUNTERS    01691000
  1594.            NUMTRY := 0;                     % [1.017]                   01692000
  1595.            N := (NUM+1) MOD64;              % [1.017]                   01693000
  1596.            IF (NOT RECSW("F")) THEN         % [1.017] ATTEMPT TO RECEIVE01694000
  1597.            BEGIN                            % [1.017]                   01695000
  1598.              REPLACE FBUF_ BY "RECEIVE FAILED.";                        01696000
  1599.              ERROR(FBUF_);                  % [1.017]                   01697000
  1600.            END;                             % [1.017]                   01698000
  1601. %            SAYN("RECEIVE DONE FOR:  ",PFILNAM)                        01699000
  1602. %          ELSE                    %  NO SUCH LUCK                      01700000
  1603. %          IF KEEPFILE THEN        %  WE GOT PART OF IT...              01701000
  1604. %            SAYN("RECEIVE FAILED, BUT SAVED PART OF:  ",PFILNAM)       01702000
  1605. %          ELSE                                                         01703000
  1606. %            SAYN("RECEIVE FAILED FOR:  ",PFILNAM);                     01704000
  1607.            STATE := "S";           %  FOR DEBUG                         01705000
  1608.       "T":                        %  TIMED OUT                          01706000
  1609.            SPACK("N",N,0,NULLDATA);%  NAK ON TIMEOUT                    01707000
  1610.            STATE := "T";          %  FOR DEBUG                          01708000
  1611.       "G":                         %  GENERIC COMMAND                   01709000
  1612.            GENERICTHINGS;          %  TAKE CARE OF THEM ELSEWHERE       01710000
  1613.       "I":                         %  INITIALIZE PACKETS                01711000
  1614.            CALL1 := TRUE;          % [1.017] RPAR CALLED FIRST          01712000
  1615.            RPAR(LEN,PACKET);       %  GET HIS INIT DATA                 01713000
  1616.            SPAR(LEN,PACKET);       %  FILL UP PACKET WITH MY INIT DATA  01714000
  1617.            SPACK("Y",N,LEN,PACKET);%  ACK WITH MY PARAMETERS            01715000
  1618.            OLDTRY := NUMTRY;       %  SAVE OLD TRY COUNT                01716000
  1619.            NUMTRY := 0;            %  INITIALIZE NUMTRY                 01717000
  1620.      ELSE:                         %  WHO KNOWS                         01718000
  1621.            SPACK("N",N,6,PACKET);  %  NAK IT                            01719000
  1622.       END CASE;                                                         01720000
  1623.     END WHILE;                                                          01721000
  1624.    WHEN(5);                        %  MAKE SURE ACK GETS OUT            01722000
  1625.    BRD := TRUE;                    %  EXIT THRU TO EOT                  01723000
  1626.   END SERVANT;                                                          01724000
  1627. %                                                                       01725000
  1628. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                         01726000
  1629. %  G E T F I L E T I T L E                                              01727000
  1630. %                                                                       01728000
  1631. %  GETS THE DISK FILE TITLE FOR SENDING                                 01729000
  1632. %  AND MAKES SURE THE FILE TITLE WILL FIT INSIDE A PACKET               01730000
  1633. %                                                                       01731000
  1634. PROCEDURE GETFILETITLE;                                                 01732000
  1635.  BEGIN                                                                  01733000
  1636.    POINTER P,Q;                                                         01734000
  1637.    REAL I,J;                                                            01735000
  1638.                                                                         01736000
  1639.    SCAN CP:CP FOR COL:COL WHILE LEQ " ";                                01737000
  1640.    IF COL GTR 0 THEN                                                    01738000
  1641.      BEGIN                                                              01739000
  1642.        SCAN P:CP FOR I:COL WHILE GTR " ";                               01740000
  1643.        COL := *-I;                                                      01741000
  1644.        REPLACE PFILNAM:=POINTER(FILNAM) BY CP FOR COL,".",NULC;         01742000
  1645.        CP := POINTER(PACKET)+COL;                                       01743000
  1646.        IF (COL:=I)-1 GTR 0 THEN                                         01744000
  1647.          SCAN Q:P+1 FOR J:I-1 UNTIL GTR " ";                            01745000
  1648.        IF MORETOSEND := J GTR 0 THEN                                    01746000
  1649.          REPLACE NEXTSEND BY Q FOR J,NULC;                              01747000
  1650.        REPLACE PACKET BY NULC FOR MAXPACKWDS WORDS;                     01748000
  1651.      END;                                                               01749000
  1652.  END GETFILETITLE;                                                      01750000
  1653. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% mainline statements for PROCESSIT     01751000
  1654.   REPLACE CP:=PACKET BY NULC FOR MAXPACKWDS WORDS;                      01752000
  1655.   COL:=80;                                                              01753000
  1656.   SPECARA := SPECIAL;                                                   01754000
  1657.   BRD := WRITE(REM[STOP],11,KPROMPT);                                   01755000
  1658.   IF NOT BRD := READ(REM,COL,PACKET) THEN                               01756000
  1659.   BEGIN                                                                 01757000
  1660.    REPLACE CP BY CP FOR COL := RD.LENGTHF WITH TOUPPER;                 01758000
  1661.    COL_BASE := COL;                                                     01759000
  1662.    SCAN CP:CP FOR COL:COL WHILE LEQ " ";                                01760000
  1663.    IF COL GTR 0 THEN                                                    01761000
  1664.       CASE SCANIT OF                                                    01762000
  1665.       BEGIN                                                             01763000
  1666.  QMARKV:                                                                01764000
  1667.  HELPV:                                                                 01765000
  1668.         HELPER(PLAINH);        %  ?, HELP                               01766000
  1669.  SERVERV:                                                               01767000
  1670.         SERVANT;               %  SERVER                                01768000
  1671.  SENDV:                                                                 01769000
  1672.         GETFILETITLE;          %  SEND                                  01770000
  1673.         IF SENDSW THEN                                                  01771000
  1674. %         SAY("SEND DONE")                                              01772000
  1675. ;%      ELSE                                                            01773000
  1676. %         SAY("SEND FAILED");                                           01774000
  1677.  RECEIVEV:                                                              01775000
  1678.         REPLACE PFILNAM := POINTER(FILNAM) BY NULC FOR MAXPACKWDS WORDS;01776000
  1679.        IF RECSW("R") THEN                    % [1.017]                  01777000
  1680. %         SAY("RECEIVE DONE")                                           01778000
  1681. ;%       ELSE                                                           01779000
  1682. %         IF KEEPFILE THEN                                              01780000
  1683. %           SAY("RECEIVE FAILED - PARTIAL FILE SAVED")                  01781000
  1684. %         ELSE                                                          01782000
  1685. %           SAY("RECEIVE FAILED");                                      01783000
  1686.  SETV:                                                                  01784000
  1687.         SETSTUFF;              %  SET                                   01785000
  1688.  SHOWV:                                                                 01786000
  1689.  STATUSV:                                                               01787000
  1690.         STATUS;                %  STATUS                                01788000
  1691.  QUITV:                                                                 01789000
  1692.  EXITV:                                                                 01790000
  1693.         BRD := TRUE;                                                    01791000
  1694.  NOERRORV:                     %  WE ALREADY GAVE THE ERROR             01792000
  1695.         ;                                                               01793000
  1696.  ELSE:                         %  GARBAGE?                              01794000
  1697.         SAYQOPT(" ");                                                   01795000
  1698.         HELPER(PLAINH);                                                 01796000
  1699.       END CASE;                                                         01797000
  1700.       IF MORETOSEND THEN                                                01798000
  1701.         BEGIN                                                           01799000
  1702.           MORETOSEND := FALSE;                                          01800000
  1703.           REPLACE CP := PACKET BY "SEND ",NEXTSEND FOR                  01801000
  1704.               COL:MAXPACKSIZ-5 UNTIL=NULC, NULC FOR COL;                01802000
  1705.         END;                                                            01803000
  1706.   END IF;                                                               01804000
  1707. END PROCESSIT;                                                          01805000
  1708.                                                                         01806000
  1709.                                                                         01807000
  1710.  %                                                                      01808000
  1711.  %  S E N D S W                                                         01809000
  1712.  %                                                                      01810000
  1713.  %  SENDSW IS THE STATE TABLE SWITCHER FOR SENDING FILES.  IT LOOPS UNTI01811000
  1714.  %  EITHER IT FINISHES, OR AN ERROR IS ENCOUNTERED.  THE ROUTINES CALLED01812000
  1715.  %  BY SENDSW ARE RESPONSIBLE FOR CHANGING THE STATE.                   01813000
  1716.  %                                                                      01814000
  1717.                                                                         01815000
  1718.                                                                         01816000
  1719.  $BEGINSEGMENT                                                          01817000
  1720.                                                                         01818000
  1721. BOOLEAN PROCEDURE SENDSW;                                               01819000
  1722.  BEGIN                                                                  01820000
  1723.   BOOLEAN DONTQUIT;            %  LOOP CONTROL                          01821000
  1724.   FILE FP(KIND=DISK,FILETYPE=8,        %  CURRENT DISK FILE             01822000
  1725.           INTMODE=ASCII,               %  SO CHECKSUM, ETC, WILL WORK   01823000
  1726.           TRANSLATE=FORCESOFT,INPUTTABLE=EBCDICTOASCII,                 01824000
  1727.           MYUSE=IN);                                                    01825000
  1728.                                                                         01826000
  1729.                                                                         01827000
  1730.                                                                         01828000
  1731.  %                                                                      01829000
  1732.  %  S I N I T                                                           01830000
  1733.  %                                                                      01831000
  1734.  %  SEND INITIATE: SEND THIS HOST'S PARAMETERS AND GET OTHER SIDE'S BACK01832000
  1735.                                                                         01833000
  1736.                                                                         01834000
  1737. REAL PROCEDURE SINIT;                                                   01835000
  1738.  BEGIN                                                                  01836000
  1739.   REAL NUM, LEN;                   %  PACKET NUMBER, LENGTH             01837000
  1740.                                                                         01838000
  1741.   IF (NUMTRY:=*+1 LEQ INITRETRY) THEN                                   01839000
  1742.   BEGIN                                                                 01840000
  1743.     CALL1 := TRUE;                 % [1.017] SPAR CALLED FIRST          01841000
  1744.     SPAR(LEN,PACKET);              %  FILL UP INIT INFO PACKET          01842000
  1745.                                                                         01843000
  1746.     IF NOT SERVER AND NUMTRY = 1 THEN % WAIT A BIT BEFORE SENDING THE   01844000
  1747.       WHEN(MYDELAY);               %  INIT PACKET...                    01845000
  1748.     FLUSHINPUT;                    %  FLUSH PENDING INPUT               01846000
  1749.                                                                         01847000
  1750.     SPACK("S",N,LEN,PACKET);       %  SEND AN S PACKET                  01848000
  1751.     CASE RPACK(LEN,NUM,RECPKT) OF  %  WHAT WAS THE REPLY?               01849000
  1752.      BEGIN                                                              01850000
  1753.      "N":  SINIT := STATE;         %  NAK, TRY IT AGAIN                 01851000
  1754.                                                                         01852000
  1755.      "Y":                          %  ACK                               01853000
  1756.            IF (N = NUM) THEN                                            01854000
  1757.              BEGIN                                                      01855000
  1758.                RPAR(LEN,RECPKT);   %  GET OTHER SIDE'S INIT INFO        01856000
  1759.                IF EOL = 0 THEN     %  CHECK AND SET DEFAULTS            01857000
  1760.                  EOL := MYEOL;                                          01858000
  1761.                IF QUOTE = 0 THEN                                        01859000
  1762.                  QUOTE := MYQUOTE;                                      01860000
  1763.                NUMTRY := 0;        %  RESET TRY COUNTER                 01861000
  1764.                N := (N+1) MOD64;   %  BUMP PACKET COUNT                 01862000
  1765.                SINIT := "F";       %  OK, CASE STATE TO F               01863000
  1766.              END ELSE                                                   01864000
  1767.                SINIT := STATE;     %  IF WRONG ACK, STAY IN S STATE     01865000
  1768.                                                                         01866000
  1769.      "E":                          %  ERROR PACKET RECEIVED             01867000
  1770.            PRERRPKT(RECPKT);       %  PRINT IT OUT AND                  01868000
  1771.            SINIT := "A";           %  ABORT                             01869000
  1772.                                                                         01870000
  1773.      "T":                         %  RECEIVE FAILURE, TRY AGAIN         01871000
  1774.            SINIT := STATE;                                              01872000
  1775.                                                                         01873000
  1776.     ELSE:                          %  ANYTHING ELSE, JUST ABORT         01874000
  1777.            SINIT := "A";                                                01875000
  1778.     END CASE;                                                           01876000
  1779.   END ELSE                                                              01877000
  1780.       SINIT := "A";                %  IF TOO MANY TRIES, GIVE UP        01878000
  1781.  END SINIT;                                                             01879000
  1782.                                                                         01880000
  1783.                                                                         01881000
  1784.  %                                                                      01882000
  1785.  %  S F I L E                                                           01883000
  1786.  %                                                                      01884000
  1787.  %  SEND FILE HEADER.                                                   01885000
  1788.                                                                         01886000
  1789.                                                                         01887000
  1790. REAL PROCEDURE SFILE;                                                   01888000
  1791.  BEGIN                                                                  01889000
  1792.   LABEL ACKHERE,QUIT;                                                   01890000
  1793.   REAL NUM, LEN;                   %  PACKET NUMBER, LENGTH             01891000
  1794.   ARRAY FILNAM1[0:MAXPACKWDS];             %  CONVERTED FILE NAME       01892000
  1795.   POINTER NEWFILNAM,               %  POINTER TO FILE NAME TO SEND      01893000
  1796.           CP;                      %  CHAR POINTER                      01894000
  1797.                                                                         01895000
  1798.   IF (NUMTRY:=*+1 LEQ PACKETRETRY+1) THEN                               01896000
  1799.   BEGIN                                                                 01897000
  1800.                                                                         01898000
  1801.     IF FP.OPEN THEN CLOSE(FP);     %  MAKE SURE IT'S CLOSED             01899000
  1802.     SCAN CP := PFILNAM FOR LEN:MAXPACKSIZ UNTIL = NULC;                 01900000
  1803.     LEN := MAXPACKSIZ - LEN;       %  LENGTH OF BURROUGHS TITLE         01901000
  1804.     REPLACE FILNAM1 BY PFILNAM FOR LEN WITH ASCIITOEBCDIC;              01902000
  1805.     REPLACE FP.TITLE BY FILNAM1;   %  GIVE IT THE NEW NAME              01903000
  1806.     IF NOT FP.PRESENT THEN         %  FILE ISN'T THERE                  01904000
  1807.       BEGIN                                                             01905000
  1808.         REPLACE FBUF_ BY "CANNOT FIND FILE: ",PFILNAM FOR MAXSENDFILESIZ01906000
  1809.             WHILE GEQ " ",NULC;                                         01907000
  1810.         ERROR(FBUF_);                                                   01908000
  1811.         SFILE := "A";                                                   01909000
  1812.         GO QUIT;                                                        01910000
  1813.       END;                                                              01911000
  1814.     IF FP.EXTMODE = VALUE(EBCDIC) THEN % DEFAULT IS TO TRANSLATE IT...  01912000
  1815.       BEGIN                                                             01913000
  1816.         CLOSE(FP);                                                      01914000
  1817.         FP.EXTMODE := VALUE(EBCDIC);                                    01915000
  1818.         FP.OPEN := TRUE;                                                01916000
  1819.       END                                                               01917000
  1820.     ELSE                                                                01918000
  1821.     IF FP.EXTMODE = VALUE(ASCII) THEN % DONT TRANSLATE IT...            01919000
  1822.       BEGIN                                                             01920000
  1823.         CLOSE(FP);                                                      01921000
  1824.         FP.EXTMODE := VALUE(ASCII);                                     01922000
  1825.         FP.TRANSLATE := VALUE(FULLTRANS);                               01923000
  1826.         FP.OPEN := TRUE;                                                01924000
  1827.       END                                                               01925000
  1828.     ELSE                                                                01926000
  1829.           ;            %  GIVE UP...?                                   01927000
  1830.     IF DEBUG THEN BUGN("OPENING FOR SENDING:  ",PFILNAM);               01928000
  1831.     RECSIZ_ := FP.MAXRECSIZE;                                           01929000
  1832.     UNITS_  := IF FP.UNITS=VALUE(CHARACTERS) THEN 1 ELSE 6;             01930000
  1833.     RESIZE(GBUF_,(RECSIZ_ * UNITS_ + 6) DIV 6);% MAKE BUFFER CORRECT SIZ01931000
  1834.     LEN := *-1;        % GET RID OF THE EXTRA PERIOD...                 01932000
  1835.                                                                         01933000
  1836.     NUM := LEN;                                                         01934000
  1837.     WHILE NUM GTR 0 AND LEN GTR MAXSENDFILESIZ DO % PARE DOWN TITLE     01935000
  1838.      BEGIN                                                              01936000
  1839.        SCAN NEWFILNAM:CP FOR NUM:LEN UNTIL ="/";                        01937000
  1840.        IF NUM GTR 0 THEN                                                01938000
  1841.          SCAN CP:NEWFILNAM FOR LEN:NUM WHILE = "/";                     01939000
  1842.      END;                                                               01940000
  1843.     NUM := LEN;                                                         01941000
  1844.     NEWFILNAM := FILNAM1;                                               01942000
  1845.     WHILE NUM GTR 0 DO                                                  01943000
  1846.      BEGIN                                                              01944000
  1847.        REPLACE NEWFILNAM:NEWFILNAM BY CP:CP FOR NUM:NUM WHILE NEQ """;  01945000
  1848.        IF NUM GTR 0 THEN                                                01946000
  1849.          BEGIN                                                          01947000
  1850.            SCAN CP:CP FOR NUM:NUM WHILE = """;                          01948000
  1851.            LEN := *-1;                                                  01949000
  1852.          END;                                                           01950000
  1853.      END;                                                               01951000
  1854.     IF LEN GTR 8 THEN             %  WE'LL HAVE TO INSERT A DOT         01952000
  1855.       BEGIN                                                             01953000
  1856.         LEN := *+1;                                                     01954000
  1857.         REPLACE PFILNAM BY CP:FILNAM1 FOR 8 WITH FIXSLASHES,            01955000
  1858.            "." , CP FOR LEN-8 WITH FIXSLASHES                           01956000
  1859.       END                                                               01957000
  1860.     ELSE                                                                01958000
  1861.       REPLACE PFILNAM BY FILNAM1 FOR LEN WITH FIXSLASHES;               01959000
  1862.     REPLACE FILNAM1 BY PFILNAM FOR LEN, NULC;                           01960000
  1863.                                                                         01961000
  1864.                                                                         01962000
  1865.     IF DEBUG THEN                                                       01963000
  1866.       BUGN("SENDING:  ",FILNAM1);                                       01964000
  1867.                                                                         01965000
  1868.     SPACK("F",N,LEN,FILNAM1);      %  SEND AN F PACKET                  01966000
  1869.     CASE RPACK(LEN,NUM,RECPKT) OF  % WHAT WAS THE REPLY?                01967000
  1870.      BEGIN                                                              01968000
  1871.      "N":                          %  NAK, JUST STAY IN THIS STATE,     01969000
  1872.            NUM := (NUM+63) MOD64;  %  UNLESS IT'S NAK FOR NEXT PACKET   01970000
  1873.            IF N NEQ NUM THEN       %  WHICH IS JUST LIKE AN ACK FOR     01971000
  1874.              SFILE := STATE        %  THIS PACKET SO FALL THRU TO...    01972000
  1875.            ELSE GO TO ACKHERE;                                          01973000
  1876.                                                                         01974000
  1877.      "Y":                          %  ACK                               01975000
  1878.  ACKHERE:  IF  N = NUM THEN        %  PACKET NUMBER MATCHES             01976000
  1879.             BEGIN                                                       01977000
  1880.              NUMTRY := 0;          %  RESET TRY COUNTER                 01978000
  1881.              N := (N+1) MOD64;     %  BUMP PACKET COUNT                 01979000
  1882.              IF BSIZE := BUFILL(FP,PACKET)=0                            01980000
  1883.               THEN                 %  GET FIRST DATA FROM FILE, ERROR?  01981000
  1884.                 SFILE := "Z"       %  YES, QUIT NOW                     01982000
  1885.              ELSE                  %  A GOOD READ                       01983000
  1886.               SFILE := "D";        %  CASE STATE TO D                   01984000
  1887.             END                                                         01985000
  1888.            ELSE                                                         01986000
  1889.              SFILE := STATE;       %  WRONG ACK, STAY IN F STATE        01987000
  1890.                                                                         01988000
  1891.      "E":                          %  ERROR PACKET RECEIVED             01989000
  1892.            PRERRPKT(RECPKT);       %  PRINT IT OUT AND                  01990000
  1893.            SFILE := "A";           %  ABORT                             01991000
  1894.                                                                         01992000
  1895.      "T":                         %  RECEIVE FAILURE, STAY IN F STATE   01993000
  1896.            SFILE := STATE;                                              01994000
  1897.                                                                         01995000
  1898.     ELSE:  SFILE := "A";           %  SOMETHING ELSE, JUST "ABORT"      01996000
  1899.       END CASE;                                                         01997000
  1900.    END ELSE                                                             01998000
  1901.      SFILE := "A";                 %  IF TOO MANY TRIES, GIVE UP        01999000
  1902.  QUIT:                                                                  02000000
  1903.   END SFILE;                                                            02001000
  1904.                                                                         02002000
  1905.                                                                         02003000
  1906.  %                                                                      02004000
  1907.  %  S D A T A                                                           02005000
  1908.  %                                                                      02006000
  1909.  %  SEND FILE DATA                                                      02007000
  1910.                                                                         02008000
  1911.                                                                         02009000
  1912. REAL PROCEDURE SDATA;                                                   02010000
  1913.  BEGIN                                                                  02011000
  1914.   LABEL ACKHERE;                                                        02012000
  1915.   REAL NUM, LEN;                   %  PACKET NUMBER, LENGTH             02013000
  1916.                                                                         02014000
  1917.   IF (NUMTRY:=*+1 LEQ PACKETRETRY+1) THEN                               02015000
  1918.   BEGIN                                                                 02016000
  1919.                                                                         02017000
  1920.     SPACK("D",N,BSIZE,PACKET);      %  SEND A D PACKET                  02018000
  1921.     CASE RPACK(LEN,NUM,RECPKT) OF  %  WHAT WAS THE REPLY?               02019000
  1922.      BEGIN                                                              02020000
  1923.      "N":                          %  NAK, JUST STAY IN THIS STATE,     02021000
  1924.                                    %  UNLESS IT'S NAK FOR NEXT PACKET   02022000
  1925.            NUM := (NUM+63) MOD64;  %  UNLESS IT'S NAK FOR NEXT PACKET   02023000
  1926.            IF N NEQ NUM THEN       %  WHICH IS JUST LIKE AN ACK FOR     02024000
  1927.              SDATA := STATE        %  THIS PACKET SO FALL THRU TO...    02025000
  1928.            ELSE GO TO ACKHERE;                                          02026000
  1929.                                                                         02027000
  1930.      "Y":                          %  ACK                               02028000
  1931.  ACKHERE:   IF N = NUM THEN        %  IF WRONG ACK, FAIL                02029000
  1932.              BEGIN                                                      02030000
  1933.               NUMTRY := 0;         %  RESET TRY COUNTER                 02031000
  1934.               N := (N+1)MOD64;     %  BUMP PACKET COUNT                 02032000
  1935.               IF ((BSIZE := BUFILL(FP,PACKET)) = 0)                     02033000
  1936.                     THEN           %  GET DATA FROM FILE                02034000
  1937.                 SDATA := "Z"       %  IF EOF SET STATE TO THAT          02035000
  1938.               ELSE SDATA := "D";   %  GOT DATA, STAY IN STATE D         02036000
  1939.              END                                                        02037000
  1940.             ELSE                                                        02038000
  1941.              SDATA := STATE;                                            02039000
  1942.                                                                         02040000
  1943.      "E":                          %  ERROR PACKET RECEIVED             02041000
  1944.            PRERRPKT(RECPKT);       %  PRINT IT OUT AND                  02042000
  1945.            SDATA := "A";           %  ABORT                             02043000
  1946.                                                                         02044000
  1947.      "T": SDATA := STATE;         %  RECEIVE FAILURE, STAY IN D         02045000
  1948.                                                                         02046000
  1949.     ELSE:  SDATA := "A";           %  ANYTHING ELSE, "ABORT"            02047000
  1950.      END CASE;                                                          02048000
  1951.   END ELSE                                                              02049000
  1952.     SDATA := "A";                  %  IF TOO MANY TRIES, GIVE UP        02050000
  1953.  END SDATA;                                                             02051000
  1954.                                                                         02052000
  1955.                                                                         02053000
  1956.  %                                                                      02054000
  1957.  %  S E O F                                                             02055000
  1958.  %                                                                      02056000
  1959.  %  SEND END-OF-FILE.                                                   02057000
  1960.                                                                         02058000
  1961.                                                                         02059000
  1962. REAL PROCEDURE SEOF;                                                    02060000
  1963.  BEGIN                                                                  02061000
  1964.   LABEL ACKHERE;                                                        02062000
  1965.   REAL NUM, LEN;                   %  PACKET NUMBER, LENGTH             02063000
  1966.   IF (NUMTRY:=*+1 LEQ PACKETRETRY+1) THEN                               02064000
  1967.   BEGIN                                                                 02065000
  1968.                                                                         02066000
  1969.     SPACK("Z",N,0,PACKET);         %  SEND A "Z" PACKET                 02067000
  1970.     CASE RPACK(LEN,NUM,RECPKT) OF  %  WHAT WAS THE REPLY?               02068000
  1971.      BEGIN                                                              02069000
  1972.      "N":                          %  NAK, JUST STAY IN THIS STATE,     02070000
  1973.                                    %  UNLESS IT'S NAK FOR NEXT PACKET,  02071000
  1974.            NUM := (NUM+63) MOD64;  %  UNLESS IT'S NAK FOR NEXT PACKET   02072000
  1975.            IF N NEQ NUM THEN       %  WHICH IS JUST LIKE AN ACK FOR     02073000
  1976.              SEOF := STATE         %  THIS PACKET SO FALL THRU TO...    02074000
  1977.            ELSE GO TO ACKHERE;                                          02075000
  1978.                                                                         02076000
  1979.      "Y":                          %  ACK                               02077000
  1980.  ACKHERE:                                                               02078000
  1981.            IF N = NUM THEN                                              02079000
  1982.              BEGIN                                                      02080000
  1983.                NUMTRY := 0;        %  RESET TRY COUNTER                 02081000
  1984.                N := (N+1) MOD64;   %  AND BUMP PACKET COUNT             02082000
  1985.                IF DEBUG THEN BUGN("CLOSING INPUT FILE:  ",PFILNAM);     02083000
  1986.                CLOSE(FP);          %  CLOSE THE INPUT FILE              02084000
  1987.                    SEOF := "B";    %  BREAK, EOT, ALL DONE              02085000
  1988.              END ELSE              %  IF WRONG ACK, HOLD OUT            02086000
  1989.                SEOF := STATE;                                           02087000
  1990.                                                                         02088000
  1991.      "E":                          %  ERROR PACKET RECEIVED             02089000
  1992.            PRERRPKT(RECPKT);       %  PRINT IT OUT AND                  02090000
  1993.            SEOF := "A";            %  ABORT                             02091000
  1994.                                                                         02092000
  1995.      "T": SEOF := STATE;          %  RECEIVE FAILURE, STAY IN Z         02093000
  1996.                                                                         02094000
  1997.      ELSE: SEOF := "A";            %  SOMETHING ELSE, "ABORT"           02095000
  1998.      END CASE;                                                          02096000
  1999.   END ELSE                                                              02097000
  2000.     SEOF := "A";                   %  IF TOO MANY TRIES, ABORT          02098000
  2001.  END SEOF;                                                              02099000
  2002.                                                                         02100000
  2003.                                                                         02101000
  2004.  %                                                                      02102000
  2005.  %  S B R E A K                                                         02103000
  2006.  %                                                                      02104000
  2007.  %  SEND BREAK (EOT)                                                    02105000
  2008.                                                                         02106000
  2009.                                                                         02107000
  2010. REAL PROCEDURE SBREAK;                                                  02108000
  2011.  BEGIN                                                                  02109000
  2012.   LABEL ACKHERE;                                                        02110000
  2013.   REAL NUM, LEN;   %  PACKET NUMBER, LENGTH                             02111000
  2014.   IF (NUMTRY:=*+1 LEQ PACKETRETRY+1) THEN                               02112000
  2015.   BEGIN                                                                 02113000
  2016.                                                                         02114000
  2017.     SPACK("B",N,0,PACKET);         %  SEND A B PACKET                   02115000
  2018.     CASE RPACK(LEN,NUM,RECPKT) OF  %  WHAT WAS THE REPLY?               02116000
  2019.      BEGIN                                                              02117000
  2020.      "N":                          %  NAK, JUST STAY IN THIS STATE,     02118000
  2021.                                    %  UNLESS NAK FOR PREVIOUS PACKET,   02119000
  2022.            NUM := (NUM+63) MOD64;  %  UNLESS IT'S NAK FOR NEXT PACKET   02120000
  2023.            IF N NEQ NUM THEN       %  WHICH IS JUST LIKE AN ACK FOR     02121000
  2024.              SBREAK := STATE       %  THIS PACKET SO FALL THRU TO...    02122000
  2025.            ELSE                                                         02123000
  2026.              GO TO ACKHERE;                                             02124000
  2027.                                                                         02125000
  2028.      "Y":                          %  ACK                               02126000
  2029.  ACKHERE:                                                               02127000
  2030.            IF N = NUM THEN         %  IF WRONG ACK, FAIL                02128000
  2031.              BEGIN                                                      02129000
  2032.            NUMTRY := 0;            %  RESET TRY COUNTER                 02130000
  2033.            N := (N+1) MOD64;       %  AND BUMP PACKET COUNT             02131000
  2034.            SBREAK := "C";          %  CASE STATE TO COMPLETE            02132000
  2035.              END ELSE                                                   02133000
  2036.              SBREAK := STATE;                                           02134000
  2037.                                                                         02135000
  2038.      "E":                          %  ERROR PACKET RECEIVED             02136000
  2039.            PRERRPKT(RECPKT);       %  PRINT IT OUT AND                  02137000
  2040.            SBREAK := "A";          %  ABORT                             02138000
  2041.                                                                         02139000
  2042.      "T": SBREAK := STATE;        %  RECEIVE FAILURE, STAY IN B         02140000
  2043. %     [KS019] NEED TO RETRY ON TIME OUT                                 02141000
  2044. %    "T": SBREAK := "C";          %  TIMED OUT WAITING FOR LAST ACK     02142000
  2045.                                                                         02143000
  2046.     ELSE:  SBREAK := "A";          %  OTHER, "ABORT"                    02144000
  2047.     END CASE;                                                           02145000
  2048.   END ELSE                                                              02146000
  2049.     SBREAK := "A";                 %  IF TOO MANY TRIES, ABORT          02147000
  2050.  END SBREAK;                                                            02148000
  2051.                                                                         02149000
  2052. %    MAIN LINE TO SENDSW                                                02150000
  2053.                                                                         02151000
  2054.                                                                         02152000
  2055.                                                                         02153000
  2056.   STATE := "S";                    %  SEND INITIATE IS THE START STATE  02154000
  2057.   N := 0;                          %  INITIALIZE MESSAGE NUMBER         02155000
  2058.   GCNT_ := -1;                     %  INITIALIZE GETCHAR POINTER, ETC   02156000
  2059.   NUMTRY := 0;                     %  BUG NO TRIES YET                  02157000
  2060.   DONTQUIT := TRUE;                %  INITIALIZE FOR LOOP               02158000
  2061.   REM.TIMELIMIT := IF TIMINT LSS MINTIM OR TIMINT GTR MAXTIM THEN       02159000
  2062.                           MYTIME ELSE TIMINT;                           02160000
  2063.                                                                         02161000
  2064.   WHILE DONTQUIT DO                %  DO THIS AS LONG AS NECESSARY      02162000
  2065.    BEGIN                                                                02163000
  2066.      IF DEBUG THEN BUGC("SENDSW STATE:  ",STATE);                       02164000
  2067.      CASE STATE OF                                                      02165000
  2068.       BEGIN                                                             02166000
  2069.       "S": STATE := SINIT;         %  SEND-INIT                         02167000
  2070.       "F": STATE := SFILE;         %  SEND-FILE                         02168000
  2071.       "D": STATE := SDATA;         %  SEND-DATA                         02169000
  2072.       "Z": STATE := SEOF;          %  SEND-END-OF-FILE                  02170000
  2073.       "B": STATE := SBREAK;        %  SEND-BREAK                        02171000
  2074.       "C": SENDSW := TRUE;         %  COMPLETE                          02172000
  2075.            DONTQUIT:=FALSE;        %  LET'S QUIT                        02173000
  2076.       "A": SENDSW := FALSE;        %  "ABORT"                           02174000
  2077.            DONTQUIT:=FALSE;        %  LET'S QUIT                        02175000
  2078.      ELSE: SENDSW := FALSE;        %  UNKNOWN, FAIL                     02176000
  2079.            DONTQUIT:=FALSE;        %  LET'S QUIT                        02177000
  2080.       END CASE;                                                         02178000
  2081.    END WHILE;                                                           02179000
  2082.    REM.TIMELIMIT := 0;          %  DISABLE REMOTE INPUT TIMELIMIT       02180000
  2083.  END SENDSW;                                                            02181000
  2084.                                                                         02182000
  2085.  $ENDSEGMENT                                                            02183000
  2086.                                                                         02184000
  2087.                                                                         02185000
  2088.  %                                                                      02186000
  2089.  %  R E C S W                                                           02187000
  2090.  %                                                                      02188000
  2091.  %  THIS IS THE STATE TABLE SWITCHER FOR RECEIVING FILES.               02189000
  2092.                                                                         02190000
  2093.                                                                         02191000
  2094.  $BEGINSEGMENT                                                          02192000
  2095.                                                                         02193000
  2096. BOOLEAN PROCEDURE RECSW(ISTATE);   % [1.017]                            02194000
  2097.   REAL ISTATE;                     % [1.017]                            02195000
  2098.  BEGIN                                                                  02196000
  2099.   BOOLEAN DONTQUIT;                                                     02197000
  2100.   FILE FP(KIND=DISK,MYUSE=OUT,     %  FILE POINTER FOR CURRENT DISK FILE02198000
  2101.           INTMODE=ASCII,EXTMODE=EBCDIC,UNITS=FILEUNITS,                 02199000
  2102.           TRANSLATE=FULLTRANS,OUTPUTTABLE=ASCIITOEBCDIC,                02200000
  2103.           MAXRECSIZE=FILERECSIZE,BLOCKSIZE=FILEBLOCKSIZE,               02201000
  2104.           AREASIZE=FILEBLOCKSIZE DIV FILERECSIZE * 10);                 02202000
  2105.                                                                         02203000
  2106.                                                                         02204000
  2107.                                                                         02205000
  2108.  %                                                                      02206000
  2109.  %  R I N I T                                                           02207000
  2110.  %                                                                      02208000
  2111.  %  RECEIVE INITIALIZATION                                              02209000
  2112.                                                                         02210000
  2113.                                                                         02211000
  2114. REAL PROCEDURE RINIT;                                                   02212000
  2115.  BEGIN                                                                  02213000
  2116.   REAL LEN, NUM;                   %  PACKET LENGTH, NUMBER             02214000
  2117.                                                                         02215000
  2118.   IF (NUMTRY:=*+1 LEQ INITRETRY) THEN                                   02216000
  2119.   BEGIN                                                                 02217000
  2120.                                                                         02218000
  2121.     CASE IF SERVER AND NUMTRY=1 THEN "S"                                02219000
  2122.          ELSE                                                           02220000
  2123.            RPACK(LEN,NUM,PACKET) OF%  GET A PACKET                      02221000
  2124.      BEGIN                                                              02222000
  2125.      "S":                          %  SEND-INIT                         02223000
  2126.            CALL1 := TRUE;          % [1.017] RPAR CALLED FIRST          02224000
  2127.            RPAR(LEN,PACKET);       %  GET THE OTHER SIDE'S INIT DATA    02225000
  2128.            SPAR(LEN,PACKET);       %  FILL UP PACKET WITH MY INIT       02226000
  2129.            SPACK("Y",N,LEN,PACKET);%  ACK WITH MY PARAMETERS            02227000
  2130.            OLDTRY := NUMTRY;       %  SAVE OLD TRY COUNT                02228000
  2131.            NUMTRY := 0;            %  START A NEW COUNTER               02229000
  2132.            N := (N+1) MOD64;       %  BUMP PACKET NUMBER, MOD 64        02230000
  2133.            RINIT := "F";           %  ENTER FILE-RECEIVE STATE          02231000
  2134.                                                                         02232000
  2135.      "E":                          %  ERROR PACKET RECEIVED             02233000
  2136.            PRERRPKT(PACKET);       %  PRINT IT OUT AND                  02234000
  2137.            RINIT := "A";           %  ABORT                             02235000
  2138.                                                                         02236000
  2139.      "T":                         %  DIDN'T GET PACKET                  02237000
  2140.            SPACK("N",N,0,NULLDATA);%  RETURN A NAK                      02238000
  2141.            RINIT := STATE;         %  KEEP TRYING                       02239000
  2142.                                                                         02240000
  2143.     ELSE:  RINIT := "A";           %  SOME OTHER PACKET TYPE, "ABORT"   02241000
  2144.    END CASE;                                                            02242000
  2145. END ELSE                                                                02243000
  2146.   RINIT := "A";                    %  SOME OTHER PACKET TYPE, ABORT     02244000
  2147.  END RINIT;                                                             02245000
  2148.                                                                         02246000
  2149.                                                                         02247000
  2150.  %                                                                      02248000
  2151.  %  R F I L E                                                           02249000
  2152.  %                                                                      02250000
  2153.  %  RECEIVE FILE HEADER                                                 02251000
  2154.                                                                         02252000
  2155.                                                                         02253000
  2156. REAL PROCEDURE RFILE;                                                   02254000
  2157.  BEGIN                                                                  02255000
  2158.   LABEL QUIT;                                                           02256000
  2159.   REAL NUM, LEN;                   %  PACKET NUMBER, LENGTH             02257000
  2160.   ARRAY FILNAM1[0:MAXPACKWDS];     %  HOLDS THE CONVERTED FILE NAME     02258000
  2161.   POINTER NEWFILNAM;                                                    02259000
  2162.                                                                         02260000
  2163.   IF (NUMTRY:=*+1 LEQ PACKETRETRY+1) THEN                               02261000
  2164.   BEGIN                                                                 02262000
  2165.                                                                         02263000
  2166.     CASE RPACK(LEN,NUM,PACKET) OF%  GET A PACKET                        02264000
  2167.      BEGIN                                                              02265000
  2168.      "S":                          %  SEND-INIT, MAYBE OUR ACK LOST     02266000
  2169.           IF OLDTRY := *+1 LEQ PACKETRETRY+1 THEN                       02267000
  2170.           BEGIN                                                         02268000
  2171.            IF NUM = (N+63) MOD64                                        02269000
  2172.                 THEN               %  PREVIOUS PACKET, MOD 64 ?         02270000
  2173.              BEGIN                 %  YES, ACK IT AGAIN WITH            02271000
  2174.                CALL1 := FALSE;     % [1.017] RPAR WAS ALREADY CALLED    02272000
  2175.                SPAR(LEN,PACKET);       %  OUR SEND-INIT PARAMETERS      02273000
  2176.                SPACK("Y",NUM,LEN,PACKET); % [1.019] FIX LENGTH PARAMETER02274000
  2177.                NUMTRY := 0;        %  RESET TRY COUNTER                 02275000
  2178.                RFILE := STATE;     %  STAY IN THIS STATE                02276000
  2179.              END                                                        02277000
  2180.            ELSE RFILE := "A";      %  NOT PREVIOUS PACKET, "ABORT"      02278000
  2181.           END ELSE                                                      02279000
  2182.             RFILE := "A";                                               02280000
  2183.                                                                         02281000
  2184.      "Z":                          %  END-OF-FILE                       02282000
  2185.           IF (OLDTRY := *+1 LEQ PACKETRETRY+1) THEN                     02283000
  2186.            BEGIN                                                        02284000
  2187.              IF NUM = (N+63) MOD64                                      02285000
  2188.               THEN                 %  PREVIOUS PACKET, MOD 64 ?         02286000
  2189.                BEGIN               %  YES, ACK IT AGAIN.                02287000
  2190.                 SPACK("Y",NUM,0,NULLDATA);                              02288000
  2191.                 NUMTRY := 0;                                            02289000
  2192.                 RFILE := STATE;    %  STAY IN THIS STATE                02290000
  2193.                END                                                      02291000
  2194.              ELSE RFILE := "A";    %  NOT PREVIOUS PACKET, "ABORT"      02292000
  2195.            END ELSE                                                     02293000
  2196.              RFILE := "A";         %  ABORT IT                          02294000
  2197.                                                                         02295000
  2198.      "F":                          %  FILE HEADER (JUST WHAT WE WANT)   02296000
  2199.           IF NUM = N THEN          %  THE PACKET NUMBER MUST BE RIGHT   02297000
  2200.             BEGIN                                                       02298000
  2201.              IF LEN LEQ 17 THEN                                         02299000
  2202.              REPLACE PFILNAM BY """,PACKET FOR LEN WITH TOBURROUGHS,    02300000
  2203.                    "".",NULC                                            02301000
  2204.              ELSE                                                       02302000
  2205.              REPLACE PFILNAM BY """,POINTER(PACKET)+(LEN-17) FOR 17 WITH02303000
  2206.                     TOBURROUGHS, "".",NULC;                             02304000
  2207.              IF FP.OPEN THEN CLOSE(FP);                                 02305000
  2208.              IF KEEPFILE THEN FP.PROTECTION := VALUE(SAVE)              02306000
  2209.              ELSE             FP.PROTECTION := VALUE(TEMPORARY);        02307000
  2210.              REPLACE FILNAM1 BY PFILNAM FOR LEN+4 WITH ASCIITOEBCDIC;   02308000
  2211.              REPLACE FP.TITLE BY FILNAM1;                               02309000
  2212.              IF NOT FP.PRESENT THEN%  DIDN'T OPEN THE FILE              02310000
  2213.                BEGIN                                                    02311000
  2214.                 REPLACE FBUF_ BY "CANNOT CREATE: ",PFILNAM FOR LEN,NULC;02312000
  2215.                  ERROR(FBUF_);                                          02313000
  2216.                  RFILE := "A";                                          02314000
  2217.                  GO QUIT;                                               02315000
  2218.                END                                                      02316000
  2219.              ELSE                  %  OK, GIVE MESSAGE                  02317000
  2220.               IF DEBUG THEN                                             02318000
  2221.                 BUGN("RECEIVING:  ",PFILNAM);                           02319000
  2222.           RECSIZ_ := FP.MAXRECSIZE;                                     02320000
  2223.           UNITS_  := IF FP.UNITS=VALUE(CHARACTERS) THEN 1 ELSE 6;       02321000
  2224.           RESIZE(PBUF_,(RECSIZ_ * UNITS_ +6) DIV 6);% SET UP BUFFER SIZE02322000
  2225.           REPLACE PP_ := POINTER(PBUF_) BY " " FOR                      02323000
  2226.                PCNT_ := (RECSIZ_ * UNITS_) + 1;                         02324000
  2227.           SPACK("Y",N,0,NULLDATA); %  ACKNOWLEDGE THE FILE HEADER       02325000
  2228.           OLDTRY := NUMTRY;        %  RESET TRY COUNTERS                02326000
  2229.           NUMTRY := 0;             %  ...                               02327000
  2230.           N := (N+1) MOD64;        %  BUMP PACKET NUMBER, MOD 64        02328000
  2231.           RFILE := "D";            %  CASE TO DATA STATE                02329000
  2232.             END ELSE                                                    02330000
  2233.               RFILE := "A";                                             02331000
  2234.                                                                         02332000
  2235.      "B":                          %  BREAK TRANSMISSION (EOT)          02333000
  2236.           IF NUM = N THEN          %  NEED RIGHT PACKET NUMBER HERE     02334000
  2237.           BEGIN                                                         02335000
  2238.            SPACK("Y",N,0,NULLDATA);%  BUG OK                            02336000
  2239.            RFILE := "C";           %  GO TO COMPLETE STATE              02337000
  2240.           END ELSE                                                      02338000
  2241.             RFILE := "A";                                               02339000
  2242.                                                                         02340000
  2243.      "E":                          %  ERROR PACKET RECEIVED             02341000
  2244.           PRERRPKT(PACKET);        %  PRINT IT OUT AND                  02342000
  2245.           RFILE := "A";            %  ABORT                             02343000
  2246.                                                                         02344000
  2247.      "T":                         %  DIDN'T GET PACKET                  02345000
  2248.           SPACK("N",N,0,NULLDATA); %  RETURN A NAK                      02346000
  2249.           RFILE := STATE;          %  KEEP TRYING                       02347000
  2250.                                                                         02348000
  2251.     ELSE: RFILE := "A";            %  SOME OTHER PACKET, "ABORT"        02349000
  2252.   END CASE;                                                             02350000
  2253.     END ELSE                                                            02351000
  2254.  RFILE := "A";                     %  ABORT IF TOO MANY TRIES           02352000
  2255. QUIT:                                                                   02353000
  2256.  END RFILE;                                                             02354000
  2257.                                                                         02355000
  2258.                                                                         02356000
  2259.  %                                                                      02357000
  2260.  %  R D A T A                                                           02358000
  2261.  %                                                                      02359000
  2262.  %  RECEIVE DATA                                                        02360000
  2263.                                                                         02361000
  2264.                                                                         02362000
  2265. REAL PROCEDURE RDATA;                                                   02363000
  2266.  BEGIN                                                                  02364000
  2267.   REAL NUM, LEN;                   %  PACKET NUMBER, LENGTH             02365000
  2268.   IF NUMTRY:=*+1 LEQ PACKETRETRY+1 THEN                                 02366000
  2269.   BEGIN                                                                 02367000
  2270.                                                                         02368000
  2271.     CASE RPACK(LEN,NUM,PACKET) OF%  GET PACKET                          02369000
  2272.      BEGIN                                                              02370000
  2273.      "D":                          %  GOT DATA PACKET                   02371000
  2274.           IF NUM NEQ N THEN        %  RIGHT PACKET?                     02372000
  2275.             BEGIN                  %  NO                                02373000
  2276.              IF OLDTRY := *+1 LEQ PACKETRETRY+1 THEN                    02374000
  2277.               BEGIN                                                     02375000
  2278.                IF NUM = (N+63) MOD64                                    02376000
  2279.                 THEN               %  ELSE CHECK PACKET NUMBER          02377000
  2280.                 BEGIN              %  PREVIOUS PACKET AGAIN?            02378000
  2281.                  SPACK("Y",NUM,6,PACKET);   %  YES, RE-ACK IT           02379000
  2282.                  NUMTRY := 0;      %  RESET TRY COUNTER                 02380000
  2283.                  RDATA := STATE;   %  DON'T WRITE OUT DATA!             02381000
  2284.                 END                                                     02382000
  2285.                ELSE RDATA := "A";  %  SORRY, WRONG NUMBER               02383000
  2286.               END                                                       02384000
  2287.              ELSE RDATA := "A";                                         02385000
  2288.             END ELSE                                                    02386000
  2289.            BEGIN                                                        02387000
  2290.                                    %  GOT DATA WITH RIGHT PACKET NUMBER 02388000
  2291.              BUFEMP(FP,PACKET,LEN);%  WRITE THE DATA TO THE FILE        02389000
  2292.              SPACK("Y",N,0,NULLDATA);%  ACKNOWLEDGE THE PACKET          02390000
  2293.              OLDTRY := NUMTRY;     %  RESET THE TRY COUNTERS            02391000
  2294.              NUMTRY := 0;          %  ...                               02392000
  2295.              N := (N+1) MOD64;     %  BUMP PACKET NUMBER, MOD 64        02393000
  2296.              RDATA := "D";         %  REMAIN IN DATA STATE              02394000
  2297.            END;                                                         02395000
  2298.                                                                         02396000
  2299.      "F":                          %  GOT A FILE HEADER                 02397000
  2300.           IF OLDTRY := *+1 LEQ PACKETRETRY+1 THEN                       02398000
  2301.           BEGIN                                                         02399000
  2302.            IF NUM = (N+63) MOD64                                        02400000
  2303.             THEN                   %  ELSE CHECK PACKET NUMBER          02401000
  2304.             BEGIN                  %  IT WAS THE PREVIOUS ONE           02402000
  2305.               SPACK("Y",NUM,0,NULLDATA);  %  ACK IT AGAIN               02403000
  2306.               NUMTRY := 0;         %  RESET TRY COUNTER                 02404000
  2307.               RDATA := STATE;      %  STAY IN DATA STATE                02405000
  2308.             END                                                         02406000
  2309.            ELSE RDATA := "A";      %  NOT PREVIOUS PACKET, "ABORT"      02407000
  2310.           END ELSE                                                      02408000
  2311.             RDATA := "A";          %  ABORT IT                          02409000
  2312.                                                                         02410000
  2313.      "Z":                          %  END-OF-FILE                       02411000
  2314.           IF NUM = N THEN          %  MUST HAVE RIGHT PACKET NUMBER     02412000
  2315.           BEGIN                                                         02413000
  2316.            SPACK("Y",N,0,NULLDATA);%  OK, ACK IT.                       02414000
  2317.            IF PCNT_ LSS RECSIZ_*UNITS_+1 THEN                           02415000
  2318.              BRD:=WRITE(FP,RECSIZ_,PBUF_);%    FLUSH THE BUFFER         02416000
  2319.            LOCK(FP,CRUNCH);        %  LOCK THE FILE                     02417000
  2320.            N := (N+1) MOD64;       %  BUMP PACKET NUMBER                02418000
  2321.            RDATA := "F";           %  GO BACK TO RECEIVE FILE STATE     02419000
  2322.           END ELSE                                                      02420000
  2323.            RDATA := "A";                                                02421000
  2324.                                                                         02422000
  2325.      "E":                          %  ERROR PACKET RECEIVED             02423000
  2326.            PRERRPKT(PACKET);       %  PRINT IT OUT AND                  02424000
  2327.            RDATA := "A";           %  ABORT                             02425000
  2328.                                                                         02426000
  2329.      "T":                         %  DIDN'T GET PACKET                  02427000
  2330.            SPACK("N",N,0,NULLDATA);%  RETURN A NAK                      02428000
  2331.            RDATA := STATE;         %  KEEP TRYING                       02429000
  2332.                                                                         02430000
  2333.     ELSE:  RDATA := "A";           %  SOME OTHER PACKET, "ABORT"        02431000
  2334. END CASE;                                                               02432000
  2335.     END ELSE                                                            02433000
  2336.  RDATA := "A";                     %  ABORT IF TOO MANY TRIES           02434000
  2337.  END RDATA;                                                             02435000
  2338.                                                                         02436000
  2339. %   MAIN LINE TO RECSW                                                  02437000
  2340.                                                                         02438000
  2341.                                                                         02439000
  2342.                                                                         02440000
  2343.   STATE := ISTATE;                 % [1.017] START STATE IS PASSED IN   02441000
  2344.   % [1.017] N := 0;                  %  INITIALIZE MESSAGE NUMBER       02442000
  2345.   NUMTRY := 0;                     %  BUG NO TRIES YET                  02443000
  2346.   DONTQUIT := TRUE;                %  LOOP INITIALIZATION               02444000
  2347.   REM.TIMELIMIT := IF TIMINT LSS MINTIM OR TIMINT GTR MAXTIM THEN       02445000
  2348.                           MYTIME ELSE TIMINT;                           02446000
  2349.                                                                         02447000
  2350.   WHILE DONTQUIT DO                                                     02448000
  2351.     BEGIN                                                               02449000
  2352.       IF DEBUG THEN BUGC("RECSW STATE:  ",STATE);                       02450000
  2353.       CASE STATE OF                                                     02451000
  2354.        BEGIN                                                            02452000
  2355.        "R": STATE := RINIT;        %  RECEIVE-INIT                      02453000
  2356.        "F": STATE := RFILE;        %  RECEIVE-FILE                      02454000
  2357.        "D": STATE := RDATA;        %  RECEIVE-DATA                      02455000
  2358.        "C": RECSW := TRUE;         %  COMPLETE STATE                    02456000
  2359.             DONTQUIT := FALSE;     %  LET'S QUIT                        02457000
  2360.        "A": RECSW := FALSE;        %  "ABORT" STATE                     02458000
  2361.             DONTQUIT := FALSE;     %  LET'S QUIT                        02459000
  2362.       ELSE: RECSW := FALSE;        %  UNKNOWN STATE                     02460000
  2363.             DONTQUIT := FALSE;     %  LET'S QUIT                        02461000
  2364.        END CASE;                                                        02462000
  2365.    END WHILE;                                                           02463000
  2366.    REM.TIMELIMIT := 0;          %  DISABLE REMOTE INPUT TIMELIMIT       02464000
  2367.  END RECSW;                                                             02465000
  2368.                                                                         02466000
  2369.  $ENDSEGMENT                                                            02467000
  2370.                                                                         02468000
  2371.                                                                         02469000
  2372.  %                                                                      02470000
  2373.  % KERMIT UTILITIES.                                                    02471000
  2374.  %                                                                      02472000
  2375.                                                                         02473000
  2376.                                                                         02474000
  2377.  %                                                                      02475000
  2378.  %  S P A C K                                                           02476000
  2379.  %                                                                      02477000
  2380.  %  SEND A PACKET                                                       02478000
  2381.                                                                         02479000
  2382.                                                                         02480000
  2383.  $BEGINSEGMENT                                                          02481000
  2384.                                                                         02482000
  2385. PROCEDURE SPACK(TYPE,NUM,LEN,DATA);                                     02483000
  2386. VALUE TYPE,NUM,LEN;                                                     02484000
  2387. REAL TYPE;                                                              02485000
  2388. REAL NUM, LEN;                                                          02486000
  2389. ARRAY DATA[0];                                                          02487000
  2390.  BEGIN                                                                  02488000
  2391.   REAL I;                          %  CHARACTER LOOP COUNTER            02489000
  2392.   REAL CHKSUM;                     %  CHECKSUM                          02490000
  2393.   ARRAY BUFFER[0:MAXPACKWDS+1+(PAD+5)DIV 6];  %  PACKET BUFFER          02491000
  2394.   POINTER PB,PD;                   %  BUFFER POINTERS                   02492000
  2395.                                                                         02493000
  2396.   PD := POINTER(DATA);                                                  02494000
  2397.   REPLACE PD + LEN BY NULC;                                             02495000
  2398.   IF REAL(DEBUG) GTR 1 THEN        %  DISPLAY OUTGOING PACKET           02496000
  2399.    BEGIN                                                                02497000
  2400.      BUGC("SPACK TYPE:  ",TYPE);                                        02498000
  2401.      BUG1("NUM:  ",NUM);                                                02499000
  2402.      BUG1("LEN:  ",LEN);                                                02500000
  2403.      IF LEN GTR 0 THEN                                                  02501000
  2404.        BUGN("DATA:  ",DATA);                                            02502000
  2405.    END;                                                                 02503000
  2406.                                                                         02504000
  2407.   IF PAD GTR 0 THEN                                                     02505000
  2408.     REPLACE PB:PB:=POINTER(BUFFER) BY CH(PCHAR,PAD)                     02506000
  2409.   ELSE                                                                  02507000
  2410.     PB := POINTER(BUFFER);                                              02508000
  2411.                                                                         02509000
  2412.   REPLACE PB:PB BY CH(SOHCHAR,1),  %  PACKET MARKER, ASCII 1 (SOH)      02510000
  2413.          CH(TOCHAR(LEN+3),1),      %  SEND THE CHARACTER COUNT          02511000
  2414.            CH(TOCHAR(NUM),1),      %  PACKET NUMBER                     02512000
  2415.                   CH(TYPE,1);      %  PACKET TYPE                       02513000
  2416.   CHKSUM := TOCHAR(LEN+3)          %  CHECKSUM CHARACTER COUNT          02514000
  2417.           + TOCHAR(NUM)            %  CHECKSUM PACKET NUMBER            02515000
  2418.           + TYPE;                  %  CHECKSUM PACKET TYPE              02516000
  2419.                                                                         02517000
  2420.   FOR I:=0 STEP 1 UNTIL LEN-1 DO   %  LOOP FOR ALL DATA CHARACTERS      02518000
  2421.     BEGIN                                                               02519000
  2422.       CHKSUM := *+REAL(PD,1);      %  UPDATE CHECKSUM                   02520000
  2423.       REPLACE PB:PB BY PD:PD FOR 1;% GET A CHARACTER                    02521000
  2424.     END;                                                                02522000
  2425.   CHKSUM := *.[7:8];               %  SIMULATE CHAR ARITHMETIC          02523000
  2426.   CHKSUM := * + CHKSUM.[7:2];                                           02524000
  2427.   CHKSUM := *.[5:6];               %  COMPUTE FINAL CHECKSUM            02525000
  2428.   IF CHKSUM=0 THEN                 %  WE MAY STRIP TRAILING BLANKS...   02526000
  2429.     BEGIN                                                               02527000
  2430.     REPLACE PB:PB BY CH(TOCHAR(CHKSUM),1),% SO LET'S PUT IN A DUMMY     02528000
  2431.                     "?",CH(EOL,1); %  ? BEFORE ANOTHER EOL...           02529000
  2432.     LEN := *+2;                    %  WE HAVE TO WRITE OUT 2 MORE, NOW  02530000
  2433.     END                                                                 02531000
  2434.   ELSE                             %  NO NEED TO WORRY ABOUT IT         02532000
  2435.     REPLACE PB:PB BY CH(TOCHAR(CHKSUM),1);%  PUT IT IN THE PACKET       02533000
  2436.   REPLACE PB:PB BY CH(EOL,1);      %  PUT IN LINE TERMINATOR            02534000
  2437.   IF BRD := WRITE(REM[STOP],LEN+6+PAD,BUFFER) THEN                      02535000
  2438.     BEGIN                                                               02536000
  2439.       I := 3+1;                    %  TRY 3 TIMES                       02537000
  2440.       WHILE BRD AND I := *-1 GTR 0 DO                                   02538000
  2441.         BEGIN                                                           02539000
  2442.           IF DEBUG THEN BUGH("SPACK WRITE ERROR (HEX) = ",RD);          02540000
  2443.           WHEN(.5);                %  WAIT A HALF SECOND                02541000
  2444.           BRD := WRITE(REM,LEN+6+PAD,BUFFER);                           02542000
  2445.         END;                       %  TRY THE IO AGAIN                  02543000
  2446.     END;                                                                02544000
  2447.   IF REAL(DEBUG) GTR 1 THEN                                             02545000
  2448.     BUG1("CSUM:  ",CHKSUM);                                             02546000
  2449.   WHEN(.1);                        %  ALLOW FOR TURN AROUND DELAY       02547000
  2450.  END SPACK;                                                             02548000
  2451.                                                                         02549000
  2452.  %                                                                      02550000
  2453.  %  R P A C K                                                           02551000
  2454.  %                                                                      02552000
  2455.  %  READ A PACKET                                                       02553000
  2456.                                                                         02554000
  2457.                                                                         02555000
  2458. REAL PROCEDURE RPACK(LEN,NUM,DATA);                                     02556000
  2459. REAL LEN, NUM;                    %  PACKET LENGTH, NUMBER              02557000
  2460. ARRAY DATA[0];                    %  PACKET DATA                        02558000
  2461.  BEGIN                                                                  02559000
  2462.   LABEL GOTSOH,QUIT;                                                    02560000
  2463.   REAL I;                         %  DATA CHARACTER NUMBER, LOOP EXIT   02561000
  2464.   REAL     R,                     %  CURRENT INPUT CHARACTER            02562000
  2465.         TYPE,                     %  PACKET TYPE                        02563000
  2466.      CCHKSUM,                     %  OUR (COMPUTED) CHECKSUM            02564000
  2467.      RCHKSUM,                     %  CHECKSUM RECEIVED FROM OTHER HOST  02565000
  2468.      COL;                         %  COLUMN COUNTER FOR PB              02566000
  2469.   BOOLEAN DONE;                   %  ARE WE THRU?                       02567000
  2470.   ARRAY BUFFER[0:49];                                                   02568000
  2471.   POINTER PB,PD;                                                        02569000
  2472.   DEFINE ABORT =                   %  TIMED OUT OR DEFICIENT PACKET     02570000
  2473.        BEGIN                                                            02571000
  2474.          RPACK := "T";             %  DEFAULT TO TIMED OUT OR SHORT PACK02572000
  2475.          IF BRD.TIMEOUTBIT THEN                                         02573000
  2476.            IF REAL(DEBUG) GTR 1 THEN                                    02574000
  2477.              BUG("TIMED OUT")                                           02575000
  2478.            ELSE                                                         02576000
  2479.          ELSE                                                           02577000
  2480.          IF BRD THEN               %  SOME OTHER ERROR                  02578000
  2481.            BEGIN                                                        02579000
  2482.              IF DEBUG THEN                                              02580000
  2483.                BUGH("ERROR ON READ (HEX) = ",RD);                       02581000
  2484.              RPACK := 0;           %  ABORT ... NOW                     02582000
  2485.            END                                                          02583000
  2486.          ELSE                      %  NO ERROR - MUST BE A SHORT PACKET 02584000
  2487.          IF DEBUG THEN                                                  02585000
  2488.            BEGIN                                                        02586000
  2489.              BUG("SHORT PACKET");                                       02587000
  2490.              BUG1("CHARACTERS LEFT=",COL);                              02588000
  2491.              IF COL GTR 0 THEN                                          02589000
  2492.                BUGN("WHICH ARE      :",PB);                             02590000
  2493.              BUGN("BUFFER IS      :",BUFFER);                           02591000
  2494.            END;                                                         02592000
  2495.          RD := 0;                  %  RESET RESULT DESCRIPTOR           02593000
  2496.          GO QUIT;                                                       02594000
  2497.        END#;                                                            02595000
  2498.                                                                         02596000
  2499.                                                                         02597000
  2500.   DO                                                                    02598000
  2501.     BEGIN                                                               02599000
  2502.       IF BRD := READ(REM,300,BUFFER) THEN ABORT;                        02600000
  2503.       SCAN PB:PB:=POINTER(BUFFER)  %  FIND A SOH HEADER                 02601000
  2504.           FOR COL:RD.LENGTHF UNTIL = MYSOH;                             02602000
  2505.       IF COL := *-1 GTR 0 THEN     %  ADJUST POINTER AFTER SOH          02603000
  2506.           PB := *+1;                                                    02604000
  2507.     END UNTIL COL GTR 0;                                                02605000
  2508.                                                                         02606000
  2509.   DONE := FALSE;                  %  GOT SOH, INIT LOOP                 02607000
  2510. GOTSOH:                                                                 02608000
  2511.                                                                         02609000
  2512.   IF COL LSS 4 THEN ABORT;        %  NOT A WHOLE PACKET LEFT            02610000
  2513.   WHILE NOT DONE DO               %  LOOP TO GET A PACKET               02611000
  2514.    BEGIN                                                                02612000
  2515. % [1.017]     IF HIBITOK THEN                                           02613000
  2516. % [1.017]       R := REAL(PB,1)            %  TAKE 8 BITS               02614000
  2517. % [1.017]     ELSE                                                      02615000
  2518.        R := REAL(PB,1).[6:7];     %  HANDLE PARITY                      02616000
  2519.      PB := *+1; COL := *-1;       %  BUMP THE POINTER                   02617000
  2520.      IF R = MYSOH THEN GO TO GOTSOH;%  RESYNCHRONIZE IF SOH             02618000
  2521.      CCHKSUM := R;                %  START THE CHECKSUM                 02619000
  2522.      LEN := UNCHAR(R)-3;          %  CHARACTER COUNT                    02620000
  2523.                                                                         02621000
  2524. % [1.017]     IF HIBITOK THEN                                           02622000
  2525. % [1.017]       R := REAL(PB,1)            %  TAKE 8 BITS               02623000
  2526. % [1.017]     ELSE                                                      02624000
  2527.        R := REAL(PB,1).[6:7];     %  HANDLE PARITY                      02625000
  2528.      PB := *+1; COL := *-1;       %  BUMP THE POINTER                   02626000
  2529.      IF R = MYSOH THEN GO TO GOTSOH;%  RESYNCHRONIZE IF SOH             02627000
  2530.      CCHKSUM := * + R;            %  UPDATE CHECKSUM                    02628000
  2531.      NUM := UNCHAR(R);            %  PACKET NUMBER                      02629000
  2532.                                                                         02630000
  2533. % [1.017]     IF HIBITOK THEN                                           02631000
  2534. % [1.017]       R := REAL(PB,1)            %  TAKE 8 BITS               02632000
  2535. % [1.017]     ELSE                                                      02633000
  2536.        R := REAL(PB,1).[6:7];     %  HANDLE PARITY                      02634000
  2537.      PB := *+1; COL := *-1;       %  BUMP THE POINTER                   02635000
  2538.      IF R = MYSOH THEN GO TO GOTSOH;%  SYNCHRONIZE IF SOH               02636000
  2539.      CCHKSUM := * + R;            %  UPDATE CHECKSUM                    02637000
  2540.      TYPE := R;                   %  PACKET TYPE                        02638000
  2541.                                                                         02639000
  2542.      IF COL LSS LEN+1 THEN ABORT; %  NOT A WHOLE PACKET LEFT            02640000
  2543.      REPLACE PD := POINTER(DATA) BY NULC FOR MAXPACKSIZ;                02641000
  2544.      FOR I := 0 STEP 1 UNTIL LEN-1 DO                                   02642000
  2545.        BEGIN                      %  LOOP FOR CHARACTER COUNT           02643000
  2546. % [1.017]   IF HIBITOK THEN                                             02644000
  2547. % [1.017]     R := REAL(PB,1)        %  TAKE 8 BITS                     02645000
  2548. % [1.017]   ELSE                                                        02646000
  2549.            R := REAL(PB,1).[6:7]; %  HANDLE PARITY                      02647000
  2550.          IF R = MYSOH THEN GO GOTSOH;%  RESYNCH IF SOH                  02648000
  2551.          CCHKSUM := * + R;        %  UPDATE CHECKSUM                    02649000
  2552.          REPLACE PD:PD BY PB:PB FOR 1;%PUT IT IN THE DATA BUFFER        02650000
  2553.          COL := *-1;              %  BUMP THE POINTER                   02651000
  2554.        END;                                                             02652000
  2555.                                                                         02653000
  2556.      R := REAL(PB,1);             %  TAKE 8 BITS                        02654000
  2557.      PB := *+1; COL := *-1;       %  BUMP THE POINTER                   02655000
  2558.      RCHKSUM := UNCHAR(R);        %  CONVERT TO NUMERIC                 02656000
  2559. % [1.017] IF HIBITOK THEN           %  GET EOL CHARACTER AND TOSS IT    02657000
  2560. % [1.017]   R := REAL(PB,1)            %  TAKE 8 BITS                   02658000
  2561. % [1.017] ELSE                                                          02659000
  2562.        R := REAL(PB,1).[6:7];     %  HANDLE PARITY                      02660000
  2563.      PB := *+1; COL := *-1;       %  BUMP THE POINTER                   02661000
  2564.      IF R = MYSOH THEN GO TO GOTSOH;%  RESYNCHRONIZE IF SOH             02662000
  2565.      DONE := TRUE;                %  GOT CHECKSUM, DONE                 02663000
  2566.    END;                                                                 02664000
  2567.                                                                         02665000
  2568.    IF REAL(DEBUG) GTR 1 THEN      %  DISPLAY INCOMING PACKET            02666000
  2569.     BEGIN                                                               02667000
  2570.      BUGC("RPACK TYPE:  ",TYPE);                                        02668000
  2571.      BUG1("NUM:  ",NUM);                                                02669000
  2572.      BUG1("LEN:  ",LEN);                                                02670000
  2573.      IF LEN GTR 0 THEN                                                  02671000
  2574.        BUGN("DATA:  ",DATA);                                            02672000
  2575.     END;                                                                02673000
  2576.                                   %  FOLD IN BITS 7:8 TO COMPUTE        02674000
  2577.    CCHKSUM := * + CCHKSUM.[7:2];  %  FINAL CHECKSUM                     02675000
  2578.    CCHKSUM := *.[5:6];                                                  02676000
  2579.                                                                         02677000
  2580.    IF CCHKSUM NEQ RCHKSUM THEN                                          02678000
  2581.      RPACK := 0                                                         02679000
  2582.    ELSE                                                                 02680000
  2583.      RPACK := TYPE;               %  ALL OK, RETURN PACKET TYPE         02681000
  2584.   IF REAL(DEBUG) GTR 1 THEN                                             02682000
  2585.     BEGIN                                                               02683000
  2586.       BUG1("CCSUM:  ",CCHKSUM);                                         02684000
  2587.       BUG1("RCSUM:  ",RCHKSUM);                                         02685000
  2588.     END;                                                                02686000
  2589.  QUIT:                                                                  02687000
  2590.    WHEN(MYPAUSE);                 %  WAIT BEFORE SENDING ACK            02688000
  2591.  END RPACK;                                                             02689000
  2592.                                                                         02690000
  2593.  $ENDSEGMENT                                                            02691000
  2594.                                                                         02692000
  2595.                                                                         02693000
  2596.  %                                                                      02694000
  2597.  %  B U F I L L                                                         02695000
  2598.  %                                                                      02696000
  2599.  %  GET A BUFFERFUL OF DATA FROM THE FILE THAT'S BEING SENT.            02697000
  2600.  %  CONTROL-QUOTING,  8-BIT & REPEAT COUNT PREFIXES ARE ALL             02698000
  2601.  %  HANDLED.                                                            02699000
  2602.                                                                         02700000
  2603.                                                                         02701000
  2604. REAL PROCEDURE BUFILL(FID,BUFFER);                                      02702000
  2605. FILE FID;                        %  DISK FILE TO FILL FROM              02703000
  2606. ARRAY BUFFER[0];                 %  BUFFER                              02704000
  2607.  BEGIN                                                                  02705000
  2608.   LABEL QUIT;                                                           02706000
  2609.   REAL I,                         %  LOOP INDEX                         02707000
  2610.        LASTT,                     %  PREVIOUS CHARACTER READ FROM FILE  02708000
  2611.        CNT,                       %  COUNT OF IDENTICAL PREVIOUS CHARS  02709000
  2612.        T;                         %  CHAR READ FROM FILE                02710000
  2613.   REAL T7;                        %  7-BIT VERSION OF ABOVE             02711000
  2614.   BOOLEAN BT = T,                 %  A BOOLEAN VERSION OF T             02712000
  2615.           REPTON;                 % [1.017] TRUE WHEN REPEAT IN ACTION  02713000
  2616.   POINTER PB,                     %  POINTER TO BUFFER                  02714000
  2617.           PBSAVE;                 % [1.017] PTS TO SLOT FOR REPEAT COUNT02715000
  2618.                                                                         02716000
  2619.   REAL PROCEDURE FIXIT;        %  FIXES UP BINARY QUOTING, ETC          02717000
  2620.    BEGIN                                                                02718000
  2621.       IF QBIN NEQ "N" THEN         % [1.019]  WE MAY USE 8-BIT STUFF    02719000
  2622.        IF BT.[7:1] THEN            % [1.019]  HIGH BIT IS ON            02720000
  2623.         BEGIN                      % [1.019]                            02721000
  2624.           REPLACE PB:PB BY CH(QBIN,1);                                  02722000
  2625.           FIXIT := *+1;            % [1.019]                            02723000
  2626.         END;                       % [1.019]                            02724000
  2627.      IF T7 IN ACNTRL[0] THEN % CONTROL, QUOTE, QBIN, REPT               02725000
  2628.       BEGIN                                                             02726000
  2629.         REPLACE PB:PB BY CH(QUOTE,1);                                   02727000
  2630.         IF T7 IN BCNTRL[0] THEN    %  DON'T CTL IT                      02728000
  2631.           REPLACE PB:PB BY CH(T7,1)%  PUT IT OUT STRAIGHT               02729000
  2632.         ELSE                      %  IT'S 0 <= N <= 31 OR 127           02730000
  2633.         IF T7 = NL THEN            %  TREAT NL SPECIALLY                02731000
  2634.          IF NOT HIBITOK THEN       % [1.019]                            02732000
  2635.           BEGIN                                                         02733000
  2636.             REPLACE PB:PB BY CH(CTL(CR),1),                             02734000
  2637.                              CH(QUOTE,1),                               02735000
  2638.                              CH(CTL(T7),1);                             02736000
  2639.             FIXIT := *+2;         %  WE'LL COUNT THE CHARACTER LATER    02737000
  2640.           END                                                           02738000
  2641.          ELSE                     %  CAN'T ADD CR IF USING 8 BITS       02739000
  2642.           REPLACE PB:PB BY CH(CTL(T7),1)                                02740000
  2643.         ELSE                      %  IT WASN'T A CR, ANYWAY             02741000
  2644.           REPLACE PB:PB BY CH(CTL(T7),1);                               02742000
  2645.         FIXIT := *+1;             %  ADD 1 FOR THE QUOTE                02743000
  2646.       END                                                               02744000
  2647.      ELSE                         %  NOT A CONTROL CHARACTER            02745000
  2648.       REPLACE PB:PB BY CH(T7,1);   %  PUT IT OUT NORMALLY               02746000
  2649.      FIXIT := *+1;                %  FINALLY ADD IN THE LAST ONE        02747000
  2650.   END FIXIT;                                                            02748000
  2651.                                                                         02749000
  2652.                                                                         02750000
  2653.   PB := POINTER(BUFFER);                                                02751000
  2654.   I := 0;                         %  INIT DATA BUFFER POINTER           02752000
  2655.   WHILE (T:=GETC(FID)) NEQ EOF DO %  GET THE NEXT CHARACTER             02753000
  2656.    BEGIN                                                                02754000
  2657.      T7 := T.[6:7];               %  GET LOW ORDER 7 BITS               02755000
  2658.                                                                         02756000
  2659.      IF (T = LASTT)AND(REPTOK) THEN    % [1.017] CHECK FOR REPEAT       02757000
  2660.      BEGIN                             % [1.017]                        02758000
  2661.        IF (I >0) THEN                  % [1.017] COUNT UNLESS FIRST CHAR02759000
  2662.        BEGIN                           % [1.017]   IN PACKET            02760000
  2663.          CNT := *+1;                   % [1.017]                        02761000
  2664.        END;                            % [1.017]                        02762000
  2665.           % PROCESS CHAR NORMALLY UNTIL REPEAT THRESHOLD EXCEEDED       02763000
  2666.        IF (NOT REPTON) THEN            % [1.017]                        02764000
  2667.        BEGIN                           % [1.017]                        02765000
  2668.           % WHEN THRESHOLD EXCEEDED, BACKUP AND INSERT REPEAT PREFIX    02766000
  2669.          IF (CNT > REPTTHRESH) THEN    % [1.017]                        02767000
  2670.          BEGIN                         % [1.017]                        02768000
  2671.            IF (T7 IN ACNTRL[0]) THEN   % [1.017]                        02769000
  2672.            BEGIN                       % [1.017]                        02770000
  2673.              PB := *-5;                % [1.017] BACKUP FOR CTL QUOTE   02771000
  2674.              I := *-5;                 % [1.017]                        02772000
  2675.            END;                        % [1.017]                        02773000
  2676.            PB := *-5;                  % [1.017] BACKUP FOR CHAR ITSELF 02774000
  2677.            I := *-5;                   % [1.017]                        02775000
  2678.            REPLACE PB:PB BY CH(REPT,1);% [1.017] INSERT REPT QUOTE      02776000
  2679.            I := *+1;                   % [1.017]                        02777000
  2680.            PBSAVE := PB;               % [1.017] LEAVE SLOT FOR COUNT   02778000
  2681.            PB := *+1;                  % [1.017]                        02779000
  2682.            I := *+1;                   % [1.017]                        02780000
  2683.            REPTON := TRUE;             % [1.017] SET REPEAT FLAG        02781000
  2684.          END;                          % [1.017]                        02782000
  2685.          I := *+FIXIT;                 % [1.017] INSERT CHAR WITH QUOTES02783000
  2686.        END;                            % [1.017]                        02784000
  2687.        IF (CNT > MAXREPT) THEN         % [1.017] CHECK FOR REPEAT LIMIT 02785000
  2688.        BEGIN                           % [1.017]                        02786000
  2689.          REPLACE PBSAVE BY CH(TOCHAR(CNT),1); % FILL COUNT SLOT         02787000
  2690.          REPTON := FALSE;              % [1.017] RESET REPEAT FLAG      02788000
  2691.          CNT := 0;                     % [1.017]                        02789000
  2692.        END;                            % [1.017]                        02790000
  2693.      END                               % [1.017]                        02791000
  2694.      ELSE                              % [1.017]                        02792000
  2695.      BEGIN                             % [1.017]                        02793000
  2696.        IF (REPTON) THEN                % [1.017] CHECK FOR END OF REPEAT02794000
  2697.        BEGIN                           % [1.017]                        02795000
  2698.          REPLACE PBSAVE BY CH(TOCHAR(CNT),1); % FILL COUNT SLOT         02796000
  2699.          REPTON := FALSE;              % [1.017]                        02797000
  2700.        END;                            % [1.017]                        02798000
  2701.        CNT := 1;                       % [1.017]                        02799000
  2702.        I := *+FIXIT;                 % [1.017] INSERT CHAR WITH QUOTING 02800000
  2703.        LASTT := T;                     % [1.017]                        02801000
  2704.      END;                              % [1.017]                        02802000
  2705.                                                                         02803000
  2706.      IF I GEQ SPSIZ-11 THEN  %  ALLOW FOR SOH,LEN,#,TYP,CHK,?,EOL,EOL,UP02804000
  2707.        BEGIN                                                            02805000
  2708.          BUFILL := I;             %  CHECK LENGTH                       02806000
  2709.          GO TO QUIT;                                                    02807000
  2710.        END;                                                             02808000
  2711.    END WHILE;                                                           02809000
  2712.   BUFILL := I;                    %  HANDLE PARTIAL BUFFER              02810000
  2713. QUIT:                                                                   02811000
  2714.  END BUFILL;                                                            02812000
  2715.                                                                         02813000
  2716.                                                                         02814000
  2717.  %                                                                      02815000
  2718.  % B U F E M P                                                          02816000
  2719.  %                                                                      02817000
  2720.  %  PUT DATA FROM AN INCOMING PACKET INTO A FILE.                       02818000
  2721.                                                                         02819000
  2722.                                                                         02820000
  2723. PROCEDURE BUFEMP(FID,BUFFER,LEN);                                       02821000
  2724. VALUE LEN;                                                              02822000
  2725. REAL LEN;                                                               02823000
  2726. FILE FID;                                                               02824000
  2727. ARRAY BUFFER[0];                  %  BUFFER                             02825000
  2728.  BEGIN                                                                  02826000
  2729.   REAL I;                         %  COUNTER                            02827000
  2730.   REAL T;                         %  CHARACTER HOLDER                   02828000
  2731.   BOOLEAN HIBIT;                  %  8 BIT STUFF                        02829000
  2732.   REAL CNT;                       %  REPEAT COUNT                       02830000
  2733.   POINTER PB;                     %  BUFFER POINTER                     02831000
  2734.                                                                         02832000
  2735.   PB := POINTER(BUFFER);                                                02833000
  2736.   FOR I:=0 STEP 1 UNTIL LEN-1 DO  % LOOP THRU THE DATA FIELD            02834000
  2737.    BEGIN                                                                02835000
  2738.     HIBIT := FALSE;               %  INITIALIZE IT                      02836000
  2739.     CNT := 1;                     %  WE HAVE 1 CHARACTER AT LEAST       02837000
  2740.     T := REAL(PB,1);              %  GET CHARACTER                      02838000
  2741.     PB := *+1;                                                          02839000
  2742.     IF REPTOK THEN                % WE CAN USE REPEAT COUNTS            02840000
  2743.      IF T = MYREPT THEN           %  WE ARE REPEATING                   02841000
  2744.       BEGIN                                                             02842000
  2745.         CNT := UNCHAR(REAL(PB,1));%  GET THE COUNT                      02843000
  2746.         PB := *+1; I := *+1;      %  BUMP THE POINTER                   02844000
  2747.         T := REAL(PB,1);          %  GET THE NEXT CHARACTER             02845000
  2748.         PB := *+1; I := *+1;      %  BUMP THE POINTER                   02846000
  2749.       END;                                                              02847000
  2750.     IF HIBITOK THEN               %  WE CAN QUOTE 8-BIT STUFF           02848000
  2751.      IF T = MYQBIN THEN           %  WE HAVE AN 8-BIT THING             02849000
  2752.       BEGIN                                                             02850000
  2753.         HIBIT := TRUE;            %  SET THE FLAG                       02851000
  2754.         T := REAL(PB,1);          %  GET THE NEXT CHARACTER             02852000
  2755.         PB := *+1; I := *+1;      %  BUMP THE POINTER                   02853000
  2756.       END;                                                              02854000
  2757.     IF T = MYQUOTE THEN           %  WE HAVE A QUOTED THING             02855000
  2758.       BEGIN                                                             02856000
  2759.         T := REAL(PB,1);          %  GET THE NEXT CHARACTER             02857000
  2760.         PB := *+1; I := *+1;      %  BUMP THE POINTER                   02858000
  2761.         IF NOT T IN BCNTRL[0] THEN%  IT'S NOT QUOTE, QBIN OR REPT       02859000
  2762.           T := CTL(T);            %  UNCONTROLIFY IT                    02860000
  2763.       END;                                                              02861000
  2764.     IF HIBIT THEN T := * & 1[7:1];%  SET THE 8-TH BIT                   02862000
  2765.     THRU CNT DO                                                         02863000
  2766.      IF T = HT THEN               %  IS IT A TAB?                       02864000
  2767.       IF EXPTABS THEN             %  WE NEED TO EXPAND IT               02865000
  2768.         THRU (TABLEN-((RECSIZ_*UNITS_-PCNT_) MOD TABLEN)) DO            02866000
  2769.                PUTC(SP,FID)       %  FILL IN WITH SPACES                02867000
  2770.       ELSE                                                              02868000
  2771.         PUTC(T,FID)               %  JUST PUT OUT THE TAB               02869000
  2772.      ELSE                         %  IT'S NOT A TAB                     02870000
  2773.      IF  T = CR THEN           % [1.017]  IT'S A CR                     02871000
  2774.       IF (HIBITOK)OR(RAW) THEN             %  DON'T FIDDLE WITH IT      02872000
  2775.         PUTC(T,FID)               %  PUT OUT A CR                       02873000
  2776.       ELSE                        %  IT'S PROBABLY EXTRA, SO            02874000
  2777.                                   %  JUST EAT IT!                       02875000
  2778.      ELSE                         %  NOT A CR, EITHER                   02876000
  2779.        PUTC(T,FID);               %  PUT IT OUT                         02877000
  2780.    END FOR LOOP;                                                        02878000
  2781.                                                                         02879000
  2782.  END BUFEMP;                                                            02880000
  2783.                                                                         02881000
  2784.                                                                         02882000
  2785.  %                                                                      02883000
  2786.  %  S P A R                                                             02884000
  2787.  %                                                                      02885000
  2788.  %  FILL THE DATA ARRAY WITH MY SEND-INIT PARAMETERS                    02886000
  2789.  %                                                                      02887000
  2790.                                                                         02888000
  2791.                                                                         02889000
  2792.  $BEGINSEGMENT                                                          02890000
  2793.                                                                         02891000
  2794. PROCEDURE SPAR(LEN,DATA);                                               02892000
  2795. REAL LEN;                                                               02893000
  2796. ARRAY DATA[0];                                                          02894000
  2797.  BEGIN                                                                  02895000
  2798.    DEFINE FORCESEGMENT=#;         % SO BEGINSEGMENT WILL WORK           02896000
  2799.   POINTER PD;                     % [1.017] TEMPORARY POINTER           02897000
  2800.   REPLACE PD:PD := POINTER(DATA) BY                                     02898000
  2801.         CH(TOCHAR(MYPACKSIZ),1) , %  BIGGEST PACKET I CAN RECEIVE       02899000
  2802.         CH(TOCHAR(MYTIME),1)    , %  WHEN I WANT TO BE TIMED OUT        02900000
  2803.         CH(TOCHAR(MYPAD),1)     , %  HOW MUCH PADDING I NEED            02901000
  2804.         CH(CTL(MYPCHAR),1)      , %  PADDING CHARACTER I WANT           02902000
  2805.         CH(TOCHAR(MYEOL),1)     , %  END-OF-LINE CHARACTER I WANT       02903000
  2806.         CH(MYQUOTE,1)           ; %  CONTROL-QUOTE CHARACTER I SEND     02904000
  2807.   IF CALL1 THEN                      % [1.019]                          02905000
  2808.     % IF SPAR IS CALLED FIRST (BEFORE RPAR) WE CONTROL                  02906000
  2809.     %  WHETHER OR NOT 8TH BIT QUOTING CAN BE DONE                       02907000
  2810.     IF (BINARYON) THEN               % [1.019]                          02908000
  2811.        REPLACE PD:PD BY CH(MYQBIN,1) % [1.019] REQUEST 8TH BIT QUOTING  02909000
  2812.     ELSE                             % [1.019]                          02910000
  2813.        REPLACE PD:PD BY "N"          % [1.019] PREVENT 8TH BIT QUOTING  02911000
  2814.   ELSE                               % [1.019]                          02912000
  2815.     % IF SPAR IS CALLED SECOND (AFTER RPAR) WE                          02913000
  2816.     % RESPOND TO THE REQUEST FROM THE REMOTE KERMIT                     02914000
  2817.     IF (BINARYON)AND(HIBITOK) THEN   % [1.019]                          02915000
  2818.       % IF 8TH BIT QUOTING REQUESTED, ACCEPT IF WE ARE IN BINARY MODE   02916000
  2819.       IF (QBIN = "Y") THEN           % [1.019] USE OUR QBIN CHAR        02917000
  2820.       BEGIN                          % [1.019]                          02918000
  2821.         REPLACE PD:PD BY CH(MYQBIN,1); % [1.019]                        02919000
  2822.         QBIN := MYQBIN;              % [1.019]                          02920000
  2823.       END                            % [1.019]                          02921000
  2824.       ELSE                           % [1.019]                          02922000
  2825.       BEGIN                          % [1.019]                          02923000
  2826.         REPLACE PD:PD BY "Y";        % [1.019] ACK 8BIT QUOTE REQUEST   02924000
  2827.         MYQBIN := QBIN;              % [1.019] USE INCOMING QBIN CHAR   02925000
  2828.       END                            % [1.019]                          02926000
  2829.     ELSE                             % [1.019]                          02927000
  2830.     BEGIN                            % [1.019]                          02928000
  2831.       % 8TH BIT QUOTING WILL NOT BE DONE                                02929000
  2832.       REPLACE PD:PD BY "N";          % [1.019] NAK 8TH BIT QUOTING      02930000
  2833.       HIBITOK := FALSE;              % [1.019]                          02931000
  2834.     END;                             % [1.019]                          02932000
  2835.                                      % [1.019]                          02933000
  2836.   REPLACE PD:PD BY                                                      02934000
  2837.         CH(MYCHKTYPE,1)         ; % [1.017] STANDARD CHECKTYPE          02935000
  2838.   IF CALL1 THEN                             % [1.017]                   02936000
  2839.   BEGIN                                     % [1.017]                   02937000
  2840.      % REQUEST REPEAT CHAR PROCESSING                                   02938000
  2841.     REPLACE PD BY CH(MYREPT,1);             % [1.017]                   02939000
  2842.     CALL1 := FALSE;                         % [1.017]                   02940000
  2843.   END                                       % [1.017]                   02941000
  2844.   ELSE                                      % [1.017]                   02942000
  2845.   BEGIN                                     % [1.017]                   02943000
  2846.      % ACKNOWLEDGE REPEAT PROCESSING IF IT WAS REQUESTED                02944000
  2847.     IF (REPTOK) THEN                        % [1.017]                   02945000
  2848.       REPLACE PD BY CH(REPT,1)          % [1.017]                       02946000
  2849.     ELSE                                    % [1.017]                   02947000
  2850.       REPLACE PD BY CH(SP,1);               % [1.017]                   02948000
  2851.     CALL1 := TRUE;                          % [1.017]                   02949000
  2852.   END;                                      % [1.017]                   02950000
  2853.   LEN := 9;                                 % [1.017]                   02951000
  2854.   IF REAL(DEBUG) GTR 1 THEN       %  EXPAND IT ALL                      02952000
  2855.     BEGIN                                                               02953000
  2856.       BUG1("My packet size = ",MYPACKSIZ);                              02954000
  2857.       BUG1("My timeout = ",MYTIME);                                     02955000
  2858.       BUG1("My padding = ",MYPAD);                                      02956000
  2859.       BUGH("My padding character = ",MYPCHAR);                          02957000
  2860.       BUGH("My end of line character = ",MYEOL);                        02958000
  2861.       BUGC("My quote character = ",MYQUOTE);                            02959000
  2862.       BUGC("My binary quote character = ",MYQBIN);                      02960000
  2863.       BUGC("My checksum type = ",MYCHKTYPE);                            02961000
  2864.       BUGC("My repeat character = ",MYREPT);                            02962000
  2865.       IF REPTOK THEN                                                    02963000
  2866.         BUG("WE ARE REPEATING")                                         02964000
  2867.       ELSE                                                              02965000
  2868.         BUG("NO REPEAT CHARACTER");                                     02966000
  2869.       IF HIBITOK THEN                                                   02967000
  2870.         BUG("WE ARE BINARY QUOTING")                                    02968000
  2871.       ELSE                                                              02969000
  2872.         BUG("NOT BINARY QUOTING");                                      02970000
  2873.      END;                                                               02971000
  2874.  END SPAR;                                                              02972000
  2875.                                                                         02973000
  2876.                                                                         02974000
  2877.  %   R P A R                                                            02975000
  2878.  %                                                                      02976000
  2879.  %  GET THE OTHER HOST'S SEND-INIT PARAMETERS                           02977000
  2880.  %                                                                      02978000
  2881.                                                                         02979000
  2882.                                                                         02980000
  2883. PROCEDURE RPAR(LEN,DATA);                                               02981000
  2884. REAL LEN;                                                               02982000
  2885. ARRAY DATA[0];                                                          02983000
  2886.  BEGIN                                                                  02984000
  2887.   POINTER PD;                                                           02985000
  2888.   PD := POINTER(DATA);                                                  02986000
  2889.                                                                         02987000
  2890.                                                                         02988000
  2891.   SPSIZ  := UNCHAR(REAL(PD,1)); %  MAXIMUM SEND PACKET SIZE             02989000
  2892.   PD := *+1;                                                            02990000
  2893.   TIMINT := UNCHAR(REAL(PD,1)); %  WHEN I SHOULD TIME OUT               02991000
  2894.   PD := *+1;                                                            02992000
  2895.   PAD    := UNCHAR(REAL(PD,1)); %  NUMBER OF PADS TO SEND               02993000
  2896.   PD := *+1;                                                            02994000
  2897.   PCHAR:= CTL(REAL(PD,1));      %  PADDING CHARACTER TO SEND            02995000
  2898.   PD := *+1;                                                            02996000
  2899.   EOL    := UNCHAR(REAL(PD,1)); %  EOL CHARACTER I MUST SEND            02997000
  2900.   PD := *+1;                                                            02998000
  2901.   UNTABLE(ACNTRL,QUOTE);           %  TAKE IT OUT OF THE ATABLE         02999000
  2902.   UNTABLE(BCNTRL,QUOTE);           %  TAKE IT OUT OF THE BTABLE         03000000
  2903.   QUOTE  := REAL(PD,1);            %  INCOMING DATA QUOTE CHARACTER     03001000
  2904.   TABLEIT(ACNTRL,QUOTE);           %  PUT NEW ONE IN THE ATABLE         03002000
  2905.   TABLEIT(BCNTRL,QUOTE);           %  PUT NEW ONE IN THE BTABLE         03003000
  2906.      % CHECK FOR REQUEST/ACKNOWLEDGE FOR 8TH BIT QUOTING                03004000
  2907.   IF LEN := *-6 GTR 0 THEN         % [1.019]                            03005000
  2908.   BEGIN                            % [1.019]                            03006000
  2909.     PD := *+1;                     % [1.019] SKIP PAST QUOTE            03007000
  2910.     UNTABLE(ACNTRL,QBIN);          % [1.019] TAKE OUT OF ATABLE         03008000
  2911.     UNTABLE(BCNTRL,QBIN);          % [1.019] TAKE OUT OF BTABLE         03009000
  2912.     QBIN := REAL(PD,1);            % [1.019] INCOMING 8BIT QUOTE        03010000
  2913.     IF (CALL1) THEN                % [1.019]                            03011000
  2914.     BEGIN                          % [1.019]                            03012000
  2915.       % [1.019] IF 8TH BIT MODE IS ENABLED, SEE IF INCOMING QBIN        03013000
  2916.       % [1.019] CHAR REQUESTS 8TH BIT QUOTING                           03014000
  2917.       IF (BINARYON)AND((PD IN QUOTECHARS)OR(PD = "Y")) THEN             03015000
  2918.       BEGIN                        % [1.019]                            03016000
  2919.         HIBITOK := TRUE;           % [1.019] YES, SET OK FLAG           03017000
  2920.         IF (PD = "Y") THEN         % [1.019]                            03018000
  2921.         BEGIN                      % [1.019]                            03019000
  2922.           TABLEIT(ACNTRL,MYQBIN);  % [1.019] TABLE MY QBIN CHAR         03020000
  2923.           TABLEIT(BCNTRL,MYQBIN);  % [1.019]                            03021000
  2924.         END                        % [1.019]                            03022000
  2925.         ELSE                       % [1.019]                            03023000
  2926.         BEGIN                      % [1.019]                            03024000
  2927.           TABLEIT(ACNTRL,QBIN);    % [1.019] TABLE INCOMING QBIN        03025000
  2928.           TABLEIT(BCNTRL,QBIN);    % [1.019]                            03026000
  2929.         END;                       % [1.019]                            03027000
  2930.       END                          % [1.019]                            03028000
  2931.       ELSE                         % [1.019] 8TH BIT QUOTING WILL       03029000
  2932.         HIBITOK := FALSE;           % [1.019] NOT BE DONE               03030000
  2933.     END                                                                 03031000
  2934.     ELSE                 % [1.019] CALL 2, SPAR WAS CALLED FIRST        03032000
  2935.     BEGIN                          % [1.019]                            03033000
  2936.       % [1.019] IF 8TH BIT MODE IS ENABLED, SEE IF WE                   03034000
  2937.       % [1.019]  GOT AN ACK TO OUR 8TH BIT QUOTE REQUEST                03035000
  2938.       IF (BINARYON)AND((QBIN = "Y")OR(QBIN = MYQBIN)) THEN              03036000
  2939.       BEGIN                        % [1.019]                            03037000
  2940.         HIBITOK := TRUE;           % [1.019] WILL DO 8TH BIT QUOTING    03038000
  2941.         TABLEIT(ACNTRL,MYQBIN);    % [1.019] TABLE MY QBIN CHAR         03039000
  2942.         TABLEIT(BCNTRL,MYQBIN);    % [1.019]                            03040000
  2943.       END                          % [1.019]                            03041000
  2944.       ELSE                         % [1.019]                            03042000
  2945.         HIBITOK := FALSE;          % [1.019] 8TH BIT QUOTING WILL       03043000
  2946.     END;                           % [1.019]  NOT BE DONE               03044000
  2947.   END;                             % [1.019]                            03045000
  2948.   IF LEN := *-2 GTR 0 THEN                                              03046000
  2949.   BEGIN                                                                 03047000
  2950.     PD := *+2;                     % [1.017] SKIP PAST QBIN,CHKTYPE     03048000
  2951.     UNTABLE(ACNTRL,REPT);          % [1.017] TAKE IT OUT OF ATABLE      03049000
  2952.     UNTABLE(BCNTRL,REPT);          % [1.017] TAKE IT OUT OF BTABLE      03050000
  2953.     REPT := REAL(PD,1);            % [1.017] INCOMING REPEAT CHAR       03051000
  2954.     IF CALL1 THEN                  % [1.017]                            03052000
  2955.     BEGIN                          % [1.017]                            03053000
  2956.          % IF CHAR SENT IS A VALID QUOTE CHAR, WE ARE REPEATING         03054000
  2957.       IF (PD IN QUOTECHARS) THEN   % [1.017] VALID CHAR ?               03055000
  2958.       BEGIN                        % [1.017]                            03056000
  2959.         REPTOK := TRUE;            % [1.017]                            03057000
  2960.         MYREPT := REPT;            % [1.017]                            03058000
  2961.         TABLEIT(ACNTRL,REPT);      % [1.017]                            03059000
  2962.         TABLEIT(BCNTRL,REPT);      % [1.017]                            03060000
  2963.       END                          % [1.017]                            03061000
  2964.       ELSE                         % [1.017]                            03062000
  2965.         REPTOK := FALSE;           % [1.017]                            03063000
  2966.       CALL1 := FALSE;              % [1.017]                            03064000
  2967.     END                            % [1.017]                            03065000
  2968.     ELSE                           % [1.017]                            03066000
  2969.     BEGIN                          % [1.017]                            03067000
  2970.          % IF CHAR MATCHES CHAR WE SENT, WE ARE REPEATING               03068000
  2971.       IF (REPT = MYREPT) THEN      % [1.017]                            03069000
  2972.       BEGIN                        % [1.017]                            03070000
  2973.         REPTOK := TRUE;            % [1.017]                            03071000
  2974.         TABLEIT(ACNTRL,REPT);      % [1.017]                            03072000
  2975.         TABLEIT(BCNTRL,REPT);      % [1.017]                            03073000
  2976.       END                          % [1.017]                            03074000
  2977.       ELSE                         % [1.017]                            03075000
  2978.         REPTOK := FALSE;           % [1.017]                            03076000
  2979.       CALL1 := TRUE;               % [1.017]                            03077000
  2980.     END                            % [1.017]                            03078000
  2981.   END                              % [1.017]                            03079000
  2982.   ELSE                                      % [1.017]                   03080000
  2983.          % DEFAULT TO NO REPEAT PROCESSING                              03081000
  2984.   BEGIN                                     % [1.017]                   03082000
  2985.     REPTOK := FALSE;                        % [1.017]                   03083000
  2986.   END;                                      % [1.017]                   03084000
  2987.   IF REAL(DEBUG) GTR 1 THEN       %  EXPAND IT ALL                      03085000
  2988.     BEGIN                                                               03086000
  2989.       BUG1("Your packet size = ",SPSIZ);                                03087000
  2990.       BUG1("Your timeout = ",TIMINT);                                   03088000
  2991.       BUG1("Your padding = ",PAD);                                      03089000
  2992.       BUGH("Your padding character = ",PCHAR);                          03090000
  2993.       BUGH("Your end of line character = ",EOL);                        03091000
  2994.       BUGC("Your quote character = ",QUOTE);                            03092000
  2995.       BUGC("Your binary quote character = ",QBIN);                      03093000
  2996.       BUGC("Your checksum type = ",CHKTYPE);                            03094000
  2997.       BUGC("Your repeat character = ",REPT);                            03095000
  2998.       IF REPTOK THEN                                                    03096000
  2999.         BUG("WE ARE REPEATING")                                         03097000
  3000.       ELSE                                                              03098000
  3001.         BUG("NO REPEAT CHARACTER");                                     03099000
  3002.       IF HIBITOK THEN                                                   03100000
  3003.         BUG("WE ARE BINARY QUOTING")                                    03101000
  3004.       ELSE                                                              03102000
  3005.         BUG("NOT BINARY QUOTING");                                      03103000
  3006.      END;                                                               03104000
  3007.  END RPAR;                                                              03105000
  3008.                                                                         03106000
  3009.                                                                         03107000
  3010.  %                                                                      03108000
  3011.  %  F L U S H I N P U T                                                 03109000
  3012.  %                                                                      03110000
  3013.  %  DUMP ALL PENDING INPUT TO CLEAR STACKED UP NAKS.                    03111000
  3014.  %                                                                      03112000
  3015.                                                                         03113000
  3016.                                                                         03114000
  3017. PROCEDURE FLUSHINPUT;                                                   03115000
  3018.  BEGIN                                                                  03116000
  3019.                                                                         03117000
  3020.    WHILE REM.CENSUS GTR 0 DO                                            03118000
  3021.      BRD := READ(REM);                                                  03119000
  3022.  END FLUSHINPUT;                                                        03120000
  3023.                                                                         03121000
  3024.  $ENDSEGMENT                                                            03122000
  3025.                                                                         03123000
  3026.                                                                         03124000
  3027.  %                                                                      03125000
  3028.  %  KERMIT PRINTING ROUTINES:                                           03126000
  3029.  %                                                                      03127000
  3030.  %  PRERRPKT - PRINT CONTENTS OF ERROR PACKET RECEIVED FROM REMOTE HOST 03128000
  3031.                                                                         03129000
  3032.                                                                         03130000
  3033.  %                                                                      03131000
  3034.  %  E R R O R                                                           03132000
  3035.  %                                                                      03133000
  3036.  %  PRINT ERROR MESSAGE.                                                03134000
  3037.  %                                                                      03135000
  3038.  %  IF LOCAL, PRINT ERROR MESSAGE WITH PRINTMSG.                        03136000
  3039.  %  IF REMOTE, SEND AN ERROR PACKET WITH THE MESSAGE.                   03137000
  3040.                                                                         03138000
  3041.                                                                         03139000
  3042.  %                                                                      03140000
  3043.  %  P R E R R P K T                                                     03141000
  3044.  %                                                                      03142000
  3045.  %  PRINT CONTENTS OF ERROR PACKET RECEIVED FROM REMOTE HOST.           03143000
  3046.                                                                         03144000
  3047. PROCEDURE PRERRPKT(MSG);                                                03145000
  3048.  ARRAY MSG[0];                                                          03146000
  3049.  BEGIN                                                                  03147000
  3050.     BUG("KERMIT ABORTING WITH FOLLOWING ERROR FROM REMOTE HOST:");      03148000
  3051.     BUGP(MSG);                                                          03149000
  3052.  END PRERRPKT;                                                          03150000
  3053.                                                                         03151000
  3054.   INITIALIZE;                                                           03152000
  3055.     ON ANYFAULT [ KPROMPT[*] : COL] , ABORTRUN;                         03153000
  3056.                                                                         03154000
  3057.   WHILE NOT BRD DO PROCESSIT;                                           03155000
  3058.                                                                         03156000
  3059.  END MAIN;                                                              03157000
  3060.                                                                         03158000
  3061.  %                                                                      03159000
  3062.  %  O U T E R   B L O C K                                               03160000
  3063.  %                                                                      03161000
  3064.  %  OUTER BLOCK OF KERMIT                                               03162000
  3065.                                                                         03163000
  3066. MAIN;                                                                   03164000
  3067. END.                                                                    03165000
  3068.