home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / perqa / kermitglobals.pas < prev    next >
Pascal/Delphi Source File  |  2020-01-01  |  13KB  |  477 lines

  1. MODULE KermitGlobals;
  2.  
  3. (*)
  4.  * 1-Dec-83.
  5.  *  Split the Kermit program file into: KermitGlobals which contains all
  6.  *  global information, and Kermit.Pas which is the main program file.
  7.  *  this allow all the kermit modules to be used by any other program.
  8. (*)
  9.  
  10. EXPORTS
  11.  
  12. IMPORTS CmdParse        FROM CmdParse ;
  13. IMPORTS SystemDefs      FROM SystemDefs ;
  14.  
  15. CONST
  16.  
  17.  
  18.    (*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*)
  19.    KermitWindow = 1 ;  (* Window numbers - See SysInit for their creation -pt*)
  20.    ErrorWindow  = 2 ;  (* An error window for all messages and errors     -pt*)
  21.    FF = Chr(#014) ;    (* A form feed to clear the windows -pt*)
  22.    PromptChar = Chr(#032) ; (* PERQ character set: grey arrow head -pt*)
  23.    OK_to_Pop = True ;  (* Allow pop-up menus -pt*)
  24.    MaxPopCmds = 10 ;   (* Maximum pop-up commands -pt*)
  25.  
  26.    SetCount = 7  ;        (* Number of SET commands [pgt001]*)
  27.    SetNot = SetCount+1 ;  (* Non-SET command index *)
  28.    SetAmbig = SetCount+2; (* Ambiguous SET command *)
  29.    ShowCount = SetCount+1;(* SET commands plus 'ALL' *)
  30.    ShowNot = ShowCount+1 ;
  31.    ShowAmbig = ShowCount+2 ;
  32.    MainCount = 9 ;
  33.    MainNot = MainCount+1 ;
  34.    MainAmbig = MainCount+2 ;
  35.  
  36.    (*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*)
  37.    return = #015 ;
  38.    formfeed = #014 ;
  39.    controlbar = 28;
  40.  
  41.    { universal manifest constants }
  42.    ENDSTR = -1;    (* End-of-string value  [pgt001] *)
  43.    MAXSTR = 100;   { longest possible string }
  44.    MsgLength = 20; { length of message string -pt}
  45.  
  46.    { ascii character set in decimal }
  47.    BACKSPACE = 8;
  48.    TAB = 9;
  49.    lf = #012 ; (* Line feed/new line *)
  50.    BLANK = 32;
  51.    EXCLAM = 33;    { ! }
  52.    DQUOTE = 34;    { " }
  53.    SHARP = 35;     { # }
  54.    DOLLAR = 36;    { $ }
  55.    PERCENT = 37;   { % }
  56.    AMPER = 38;     { & }
  57.    SQUOTE = 39;    { ' }
  58.    ACUTE = SQUOTE;
  59.    LPAREN = 40;    { ( }
  60.    RPAREN = 41;    { ) }
  61.    STAR = 42;      { * }
  62.    PLUS = 43;      { + }
  63.    COMMA = 44;     { , }
  64.    MINUS = 45;     { - }
  65.    DASH = MINUS;
  66.    PERIOD = 46;    { . }
  67.    SLASH = 47;     { / }
  68.    COLON = 58;     { : }
  69.    SEMICOL = 59;   { ; }
  70.    LESS = 60;      { < }
  71.    EQUALS = 61;    { = }
  72.    GREATER = 62;   { > }
  73.    QUESTION = 63;  { ? }
  74.    ATSIGN = 64;    { @ }
  75.    LBRACK = 91;    { [ }
  76.    BACKSLASH = 92; { \ }
  77.    ESCAPE = BACKSLASH; {  changed  - used to be @ }
  78.    RBRACK = 93;    { ] }
  79.    CARET = 94;     { ^ }
  80.    UNDERLINE = 95; { _ }
  81.    GRAVE = 96;     { ` }
  82.    LETA = 97;      { lower case ... }
  83.    LETB = 98;
  84.    LETC = 99;
  85.    LETD = 100;
  86.    LETE = 101;
  87.    LETF = 102;
  88.    LETG = 103;
  89.    LETH = 104;
  90.    LETI = 105;
  91.    LETJ = 106;
  92.    LETK = 107;
  93.    LETL = 108;
  94.    LETM = 109;
  95.    LETN = 110;
  96.    LETO = 111;
  97.    LETP = 112;
  98.    LETQ = 113;
  99.    LETR = 114;
  100.    LETS = 115;
  101.    LETT = 116;
  102.    LETU = 117;
  103.    LETV = 118;
  104.    LETW = 119;
  105.    LETX = 120;
  106.    LETY = 121;
  107.    LETZ = 122;
  108.    LBRACE = 123;   { left brace }
  109.    BAR = 124;      { | }
  110.    RBRACE = 125;   { right brace }
  111.    TILDE = 126;    { ~ }
  112.  
  113.  
  114.    SOH        = 1;     (* ascii SOH character *)
  115.    CR         = 13;    (* CR *)
  116.    DEL        = 127;   (* rubout *)
  117.  
  118.    DEFEOL     = CR ;   (* default eoln *)
  119.    DEFTRY     = 10;    (* default for number of retries *)
  120.    DEFTIMEOUT = 12;    (* default time out *)
  121.    MAXPACK    = 94;    (* max is 94 ~ - ' ' *)
  122.    DEFDELAY   = 1;     (* delay before sending first init *)
  123.    NUMPARAM   = 6;     (* number of parameters in init packet *)
  124.    DEFQUOTE   = SHARP; (* default quote character  *)
  125.    DEFPAD     = 0;     (* default number OF padding chars  *)
  126.    DEFPADCHAR = 0;     (* default padding character  *)
  127.  
  128.    NumBuffers = 5;         (* Number of packet buffers *)
  129.  
  130.    (* packet types *)
  131.  
  132.    TYPEB  = 66; (* ord('B') *)
  133.    TYPED  = 68; (* ord('D') *)
  134.    TYPEE  = 69; (* ord('E') *)
  135.    TYPEF  = 70; (* ord('F') *)
  136.    TYPEN  = 78; (* ord('N') *)
  137.    TYPES  = 83; (* ord('S') *)
  138.    TYPET  = 84; (* ord('T') *)
  139.    TYPEY  = 89; (* ord('Y') *)
  140.    TYPEZ  = 90; (* ord('Z') *)
  141.  
  142.  
  143.  
  144. TYPE
  145.  
  146.  
  147.    CharBytes = -2..255; (* full 8-bits, with -1 == end-of-string [pgt001]*)
  148.    istring = ARRAY [1..MAXSTR] OF CharBytes;
  149.    MsgString = String[ MsgLength ]; (* String for various messages -pt*)
  150.  
  151.  
  152.    (* Data Types for Kermit *)
  153.  
  154.  
  155.    Packet = RECORD
  156.                mark : CharBytes;       (* SOH character *)
  157.                count: CharBytes;       (* # of bytes following this field *)
  158.                seq  : CharBytes;       (* sequence number modulo 64  *)
  159.                ptype: CharBytes;       (* d,y,n,s,b,f,z,e,t  packet type *)
  160.                data : istring;          (* the actual data *)
  161.                (* chksum is last validchar in data array *)
  162.                (* eol is added, not considered part of packet proper *)
  163.             END;
  164.  
  165.    KermitCommand = (Transmit,Receive,SetParm,Invalid);
  166.  
  167.    KermitStates = (FileData,Init,Break,FileHeader,EOFile,Complete,Abort);
  168.  
  169.    Stats = Real ; (* Statistic counting -pt*)
  170.  
  171.    Ppack = 1..NumBuffers;
  172.  
  173.    CType = RECORD
  174.               check: Integer;
  175.               PacketPtr : Integer;
  176.               i : Integer;
  177.               fld : Integer;
  178.               t : CharBytes;
  179.               finished : Boolean;
  180.               restart : Boolean;
  181.               control : Boolean;
  182.               good : Boolean;
  183.            END;
  184.  
  185.    InType = (abortnow,nothing,CRin);
  186.  
  187.    (* Data types for pop-up menus *)
  188.    MyCmds = ARRAY [1..MaxPopCmds] OF String[25] ;  (* Menu strings *)
  189.    MyMenu = RECORD
  190.                Head: String[25] ;(* Heading *)
  191.                numcmds: Integer ;(* Number of commands *)
  192.                cmd: MyCmds       (* The actual commands *)
  193.             END ;
  194.    MyMenuPtr = ^MyMenu ;
  195.  
  196.  
  197. VAR
  198.  
  199.  
  200.    done:Boolean;
  201.    bufferoverflow, finis, XOFFState:Boolean;
  202.    ch:Char;
  203.    XON, XOFF:Char;
  204.  
  205.    (* Variables for commands *)
  206.    CmdSpelling, CmdLine: CString ;  (* the command and rest of line *)
  207.    CmdIndex: Integer ;  (* Index from command parser *)
  208.    Inf: pCmdList ;      (* Command file pointer *)
  209.    firstPress: Boolean ;(* Inital call to command parser *)
  210.  
  211.    (* Variables for pop-up menus *)
  212.    MainMenu,            (* Main Kermit menu *)
  213.    SetMenu: MyMenuPtr ; (* SET commands *)
  214.    OnOff: CmdArray ;    (* For the SET feature ON/OFF *)
  215.  
  216.  
  217.  
  218.    (* SET variables *)
  219.    EscapeChr: Char ;    (* CONNECT 'escape' character -pt*)
  220.    EscPrint : Char ;    (* Printable verion of this character -pt*)
  221.    BaudRate : String ;
  222.    FileWarning: Boolean ;
  223.    HalfDuplex:Boolean;
  224.    Verbosity: Boolean;  (* true to print verbose messages *)
  225.    Debug    : Boolean;
  226.    EightBitFile: Boolean ; (* 8-bit flag  [pgt001]*)
  227.    (* Varibles for Kermit *)
  228.    dumStr   : String ;(* Dummy string -pt*)
  229.    dumCh: Char ;      (* A dummy character -pt*)
  230.  
  231.    aline    : istring;
  232.    DiskFile : Integer;(* Should be "filedesc" -pt*)
  233.    SaveState: kermitstates;
  234.    MaxTry   : Integer;
  235.    n,J      : Integer;  (* packet number *)
  236.    NumTry   : Integer;  (* times this packet retried *)
  237.    OldTry   : Integer;
  238.    NumPad   : Integer;  (* padding to send *)
  239.    MyPad    : Integer;  (* number of padding characters I need *)
  240.    PadChar  : CharBytes;
  241.    MyPadChar: CharBytes;
  242.    RunType  : KermitCommand;
  243.    State    : kermitstates; (* current state of the automaton *)
  244.    MyTimeOut:  Integer;     (* when i want to be timed out *)
  245.    TheirTimeOut  : Integer;
  246.    Delay    : Integer;
  247.    SizeRecv, SizeSend : Integer;
  248.    SendEOL, SendQuote : CharBytes;
  249.    myEOL,myQuote: CharBytes;
  250.    NumSendPacks : Integer;
  251.    NumRecvPacks : Integer;
  252.    NumACK : Integer;
  253.    NumNAK : Integer;
  254.    NumACKrecv : Integer;
  255.    NumNAKrecv : Integer;
  256.    NumBADrecv : Integer;
  257.    RunTime: Integer;
  258.    ChInFile, ChInPack : Stats;
  259.  
  260.    Buf : ARRAY [1..NumBuffers] OF packet;
  261.    ThisPacket : Ppack;  (* current packet being sent *)
  262.    LastPacket : Ppack;  (* last packet sent *)
  263.    CurrentPacket : Ppack; (* current packet received *)
  264.    NextPacket : Ppack;  (* next packet being received *)
  265.    InputPacket : Ppack; (* save input to do debug *)
  266.  
  267.    TOPacket : packet;   (* Time_Out Packet *)
  268.    OldTime  : Double ;  (* Clock time -pt*)
  269.    TimeLeft : Integer;  (* until Time_Out *)
  270.  
  271.    FromConsole : InType;(* Input from Console during receive *)
  272.  
  273.    PackControl : CType; (* variables for receive packet routine *)
  274.  
  275.  
  276.  
  277.  
  278.    PROCEDURE SYSinit;   (* special initialization *)
  279.  
  280.    PROCEDURE SYSfinish; (* System dependent *)
  281.  
  282.    PROCEDURE KermitInit;(* initialize various parameters  & defaults *)
  283.  
  284.  
  285.    PROCEDURE ErrorPack(c:MsgString);
  286.    (* Send the other host the an error packet with mesage <c> -pt*)
  287.  
  288.  
  289.    EXCEPTION GotErrorPacket(VAR ErrorMsg: istring) ;
  290.    (*)
  291.     * This is used when procedure "BuildPacket" receives an error packet
  292.     * from the other Host. Handlers in procedures "RecvSwitch" and
  293.     * "SendSwitch" are used to abort the current RECEIVE/SEND command
  294.     * and close any disk files open.
  295.    (*)
  296.  
  297.  
  298.  
  299. PRIVATE
  300.  
  301. IMPORTS Screen      FROM Screen ;
  302. IMPORTS PopCmdParse FROM PopCmdParse ;
  303. IMPORTS IO_Others   FROM IO_Others ;
  304. IMPORTS RS232Baud   FROM RS232Baud ;
  305. IMPORTS Stdio       FROM Stdio ;
  306. IMPORTS KermitUtils FROM KermitUtils ;
  307. IMPORTS KermitSend  FROM KermitSend ;
  308.  
  309.  
  310. PROCEDURE SYSinit; (* special initialization *)
  311.    BEGIN
  312.       Writeln( FF ) ;  (* Clear the entire screen *)
  313.  
  314.       (*----------     PERQ     ----------*)
  315.  
  316.       (* Create the windows *)
  317.       CreateWindow(KermitWindow, 0, 0, 767, 700,
  318.                    'PERQ Kermit, Version 2.0') ;
  319.       (* A cursor for the Kermit window *)
  320.       SCurChr( Chr(#177) ) ;  (* A black rectangle *)
  321.       SCurOn ;   (* Turn it on *)
  322.  
  323.       CreateWindow(ErrorWindow, 0, 701, 767, 322, 'Error and Message Window') ;
  324.  
  325.       ChangeWindow( KermitWindow ) ;
  326.  
  327.       (* Create pop-up menus *)
  328.       New(MainMenu) ;
  329.       WITH  MainMenu^  DO
  330.          BEGIN
  331.             Head := 'Kermit' ;
  332.             numcmds := MainCount ;
  333.             cmd[1] := 'CONNECT' ;
  334.             cmd[2] := 'EXIT' ;
  335.             cmd[3] := 'HELP' ;
  336.             cmd[4] := 'QUIT' ;
  337.             cmd[5] := 'RECEIVE' ;
  338.             cmd[6] := 'SEND' ;
  339.             cmd[7] := 'SET' ;
  340.             cmd[8] := 'SHOW' ;
  341.             cmd[9] := 'STATISTICS' ;
  342.          END ; (* with main menu *)
  343.  
  344.       (* ON or OFF *)
  345.       OnOff[1] := 'ON' ;
  346.       OnOff[2] := 'OFF' ;
  347.  
  348.       New(SetMenu) ;
  349.       WITH  SetMenu^  DO
  350.          BEGIN
  351.             Head := 'SET commands' ;
  352.             numcmds := SetCount ;  (* 7 if we include "ALL" for SHOW cmd *)
  353.             cmd[1] := 'SPEED' ;
  354.             cmd[2] := 'DEBUG' ;
  355.             cmd[3] := 'ESCAPE' ;
  356.             cmd[4] := 'WARNING' ;
  357.             cmd[5] := 'LOCAL' ;
  358.             cmd[6] := 'VERBOSE' ;
  359.             cmd[7] := 'EIGHT-BIT' ; (* [pgt001] *)
  360.             cmd[8] := 'ALL' ;   (* <<<< *)
  361.          END ; (* with SET menu *)
  362.  
  363.       (* other initialisation *)
  364.       InitCmdFile(Inf, 0) ;
  365.       InitPopUp ;
  366.       IOCursorMode( TrackCursor ) ;
  367.       firstPress := True ;
  368.  
  369.       (*----------     KERMIT     ----------*)
  370.       finis:=False;
  371.       XOFFState:=False;
  372.       XON:=Chr(#021); XOFF:=Chr(#023);
  373.  
  374.       (* SET values  -pt*)
  375.       EscapeChr := Chr(#034) ;  (* CONNECT escape character ^\ *)
  376.       EscPrint  := '\' ;        (* Printable version *)
  377.       BaudRate := '9600' ;
  378.       SetBaud( '9600', True ) ;
  379.       HalfDuplex:=False ;
  380.       Verbosity := False;       (* default to false / only valid if local *)
  381.       Debug := False;
  382.       EightBitFile := False ;   (* [pgt001] *)
  383.       FileWarning := False ;
  384.  
  385.  
  386.       (* Statistic counters *)
  387.       NumSendPacks := 0;
  388.       NumRecvPacks := 0;
  389.       NumACK := 0;
  390.       NumNAK := 0;
  391.       NumACKrecv := 0;
  392.       NumNAKrecv := 0;
  393.       NumBADrecv := 0;
  394.  
  395.       ChInFile := 0.0;  (* Statsistics are now reals.  -pt*)
  396.       ChInPack := ChInFile;
  397.  
  398.       (* Other values *)
  399.       NumPad := DEFPAD;               (* set defaults *)
  400.       MyPad := DEFPAD;
  401.       PadChar := DEFPADCHAR;
  402.       MyPadChar := DEFPADCHAR;
  403.       TheirTimeOut := DEFTIMEOUT;
  404.       MyTimeOut := DEFTIMEOUT;
  405.       Delay := DEFDELAY;
  406.       SizeRecv := MAXPACK;
  407.       SizeSend := MAXPACK;
  408.       SendEOL := DEFEOL;
  409.       MyEOL := DEFEOL;
  410.       SendQuote := DEFQUOTE;
  411.       MyQuote := DEFQUOTE;
  412.       MaxTry := DEFTRY;
  413.  
  414.    END;
  415.  
  416. PROCEDURE SYSfinish; (* System dependent *)
  417.    BEGIN
  418.       Writeln( FF ) ;
  419.       Dispose( MainMenu ) ;
  420.       Dispose( SetMenu ) ;
  421.       DstryCmdFile( Inf ) ;
  422.    END;
  423.  
  424.  
  425. PROCEDURE KermitInit;  (* initialize various parameters  & defaults *)
  426.    BEGIN
  427.       n := 0;
  428.  
  429.       RunType := invalid;
  430.       DiskFile := StdIOError;      (* to indicate not open yet *)
  431.  
  432.       ThisPacket := 1;
  433.       LastPacket := 2;
  434.       CurrentPacket := 3;
  435.       NextPacket := 4;
  436.       InputPacket := 5;
  437.  
  438.       WITH TOPacket DO
  439.          BEGIN
  440.             count := 3;
  441.             seq := 0;
  442.             ptype := TYPEN;
  443.             data[1] := ENDSTR;
  444.          END;
  445.  
  446.       FROMCONSOLE:=NOTHING;
  447.  
  448.    END;
  449.  
  450.  
  451.  
  452.  
  453. PROCEDURE CtoS(x:MsgString; VAR s:istring);
  454.    (* convert constant to STIP string *)
  455.    VAR
  456.       i : Integer;
  457.    BEGIN
  458.       FOR i:=1 TO Length(x) DO
  459.          s[i] := Ord(x[i]);
  460.       s[Length(x)+1] := ENDSTR;
  461.    END;
  462.  
  463. PROCEDURE ErrorPack(c:MsgString);
  464.    (* output Error packet if necessary -- then exit *)
  465.    BEGIN
  466.       WITH Buf[ThisPacket] DO
  467.          BEGIN
  468.             seq := n;
  469.             ptype := TYPEE;
  470.             CtoS(c,data);
  471.             count := ilength(data);
  472.          END;
  473.       SendPacket;
  474.       Writeln('%Message to other Host: ', c)
  475.    END.
  476.  
  477.