text: 
  /* WARNING -- This C source program generated by gwart preprocessor. */
  /* Do not edit this file; edit the gwart-format source file instead, */
  /* and then run it through gwart to produce a new C source file.     */
  
  /* G P R O T O  --  Protocol module for gkermit  */             /* -*-C-*- */
  
  /*
    Author:
      Frank da Cruz
      The Kermit Project
      Columbia University
      612 West 115th Street
      New York NY 10025-7799  USA
      http://www.columbia.edu/kermit/
      kermit@columbia.edu
  
    Copyright (C) 1999,
    The Trustees of Columbia University in the City of New York.
  
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
  
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
  
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
  #include <stdio.h>
  #include "gkermit.h"
  
  _MYPROTOTYPE( int closof, (void) );	/* Close output file */
  _MYPROTOTYPE( VOID errpkt, (char *) );	/* Send Error packet */
  
  extern char * xdata, *rdatap, **cmlist, *cmarg, *rpar(), strbuf[], filnam[];
  extern int start, bctu, bctr, delay, cx, cz, failure, attributes, datalen;
  extern int streamok, streaming, timint;
  extern FILE * db;
  
  static int x;
  
  static VOID
  streamon() {				/* Start streaming if negotiated */
      x = 0;
      if (streamok > 0) {
  	streaming = 1;
  	timint = 0;
      }
  }
  
  /* Declare gwart states (like lex) */
  
  #define ssini 1
  #define ssfil 2
  #define ssdat 3
  #define ssatt 4
  #define sseot 5
  #define sseof 6
  #define sipkt 7
  #define srini 8
  #define srfil 9
  #define srdat 10
  #define sratt 11
  
  /* Packets are read by the input() function, which returns the packet type */
  /* that serves as the input to the state machine, which follows... */
  
  
  #define BEGIN state =
  
  int state = 0;
  
  int
  gwart()
  {
      int c,actno;
      extern short tbl[];
      while (1) {
  	c = input() - 32;
  	if (c < 0 || c > 95) c = 0;
  	if ((actno = tbl[c + state*96]) != -1)
  	    switch(actno) {
  case 1:
      {					/* Start state for Send. */
      tinit();				/* Initialize transaction. */
      if (sinit('S') < 0) { errpkt("sinit"); } /* Build and send the S packet. */
      else BEGIN ssini;
  }
      break;
  case 2:
      {				/* Receive ACK to I packet */
      spar(rdatap);			/* Set parameters from it */
      bctu = bctr;			/* Switch to negotiated block check */
      if (gnfile() > 0) {			/* Is there a file to send? */
          if (sfile() < 0) {		/* Yes, open it, send F packet, */
  	    errpkt("sfile");
  	} else {			/* No error */
  	    streamon();
  	    BEGIN ssfil;
  	}
      } else {				/* No files to send, */
          if (seot() < 0) { errpkt("seot"); } /* so send EOT packet. */
          else BEGIN sseot;
      }
  }
      break;
  case 3:
      {				/* Receive ACK to File header packet */
      if (attributes) {			/* If attributes negotiated */
  	if (sattr() < 0) {		/* Send file attributes */
  	    errpkt("sattr");
  	} else
  	  BEGIN ssatt;
      } else if ((x = sdata()) == 0) {	/* Otherwise send first Data packet */
  	if (seof("") < 0) {		/* Empty file - send EOF */
  	    errpkt("seof");
  	} else {
  	    BEGIN sseof;
  	}
      } else if (x < 0) {			/* Error */
  	errpkt("sdata");
      } else {				/* OK - switch to Data state */
  	BEGIN ssdat;
      }
  }
      break;
  case 4:
      {				/* Receive ACK to Attribute packet */
      if (*rdatap == 'N') {		/* Check for refusal */
  	seof("D");
  	BEGIN sseof;
      } else if ((x = sdata()) == 0) {	/* Otherwise send first Data packet */
  	if (seof("") < 0) {		/* Empty file - send EOF */
  	    errpkt("seof");
  	} else {
  	    BEGIN sseof;
  	}
      } else if (x < 0) {			/* Error */
  	errpkt("sdata");
      } else {				/* OK - switch to Data state */
  	BEGIN ssdat;
      }
  }
      break;
  case 5:
      {				/* Receive ACK to Data packet */
      if (*rdatap == 'X')			/* Check for file cancellation */
        cx = 1;
      else if (*rdatap == 'Z')		/* Check for batch cancellation */
        cz = 1;
      if ((x = sdata()) == 0) {		/* Send data packet if data left. */
  	if (seof((cx | cz) ? "D" : "") < 0) { /* If not, send Z packet */
  	    errpkt("seof");
  	} else {
  	    BEGIN sseof;
  	}
      } else if (x < 0)			/* Fatal error sending data */
        errpkt("sdata");
  }
      break;
  case 6:
      {				/* Receive ACK to EOF */
      if (gnfile() > 0) {			/* Get next file from list */
  	if (sfile() > 0)
  	  BEGIN ssfil;
  	else { errpkt("sfile"); }
      } else {				/* No more files */
  	seot();				/* Send EOT */
  	BEGIN sseot;
      }
  }
      break;
  case 7:
      { return(failure); }
      break;
  case 8:
      { tinit(); rinit(); BEGIN srini; }
      break;
  case 9:
      {				/* Receive S packet */
      spar(rdatap);			/* Set parameters from it */
      ack1(rpar());			/* ACK with our parameters */
      bctu = bctr;			/* Switch to negotiated block check */
      streamon();
      BEGIN srfil;			/* Wait for file or EOT */
  }
      break;
  case 10:
      { ack(); return(failure); }
      break;
  case 11:
      {				/* Receive File header packet */
      if (rcvfil() < 0) {
  	errpkt("rcvfil");
      } else {
  	encstr(filnam);
  	ack1(xdata);
  	streamon();
  	BEGIN sratt;
      }
  }
      break;
  case 12:
      {				/* Receive Attribute packet */
      if (gattr(rdatap) == 0) {
  	ack();
      } else {
  	ack1("\"");
      }
  }
      break;
  case 13:
      {				/* Receive first Data packet */
      if (decode(datalen) < 0) {
  	errpkt("Packet decoding error");
      } else {
  	ack();
  	BEGIN srdat;
      }
  }
      break;
  case 14:
      {				/* Empty file */
      if (*rdatap == 'D')			/* Check for Discard directive */
        cx = 1;
      if (closof() < 0) {			/* Close the output file */
  	errpkt("closof");
      } else {
  	ack();				/* Send ACK */
  	BEGIN srfil;			/* Wait for another file or EOT */
      }
  }
      break;
  case 15:
      {				/* Receive Data packet */
      if (decode(datalen) < 0)
        errpkt("Packet decoding error");
      else
        ack();
  }
      break;
  case 16:
      {				/* Receive EOF packet */
      if (*rdatap == 'D')			/* Check for Discard directive */
        cx = 1;
      if (closof() < 0) {			/* Close the output file */
  	errpkt("closof");
      } else {
  	ack();				/* Send ACK */
  	BEGIN srfil;			/* Wait for another file or EOT */
      }
  }
      break;
  case 17:
      {					/* Start state for Get */
      tinit();				/* Initialize transaction */
      ginit();				/* Initialize Get */
      sinit('I');				/* Send I packet */
      BEGIN sipkt;
  }
      break;
  case 18:
      {				/* Receive ACK for I packet */
      spar(rdatap);			/* Set parameters from it */
      if (scmd('R',cmarg) < 0)		/* Send GET packet file filespec */
        errpkt("scmd");
      else
        BEGIN srini;			/* Wait for S packet */
  }
      break;
  case 19:
      { return(failure = 1); }
      break;
  case 20:
      { errpkt("Unknown packet type"); }
      break;
  
  	    }
      }
  }
  
  short tbl[] = {
   -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 17,  1, 20, 20,  8, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20,  2, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 17,  1, 20, 20,  8, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20,  3, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 17,  1, 20, 20,  8, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20,  5, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 17,  1, 20, 20,  8, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20,  4, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 17,  1, 20, 20,  8, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20,  7, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 17,  1, 20, 20,  8, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20,  6, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 17,  1, 20, 20,  8, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 18, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 17,  1, 20, 20,  8, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20,  9, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 17,  1, 20, 20,  8, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 10, 20, 20, 19, 11, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 17,  1, 20, 20,  8, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 15, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 16, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 17,  1, 20, 20,  8, 20, 20, 20, 20, 20, 20, 20, 20, 20,
    0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 12, 20, 20, 13, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 14, 20, 20, 20, 20, 20,
   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
   20, 20, 17,  1, 20, 20,  8, 20, 20, 20, 20, 20, 20, 20, 20,20
  };
  
  