/*  defs.h: Definitions for xprzmodem.library;
    Version 1.0, 29 July 1989, by Rick Huebner.
    Released to the Public Domain; do as you like with this code.  */


/* #define DEBUG 1 */

/* Return codes */
#define OK        0
#define ERROR   (-1)
#define TIMEOUT (-2)
#define RCDO    (-3)

/* Relevant control characters */
#define CR     ('M'&0x1F)        /* ^M */
#define DLE    ('P'&0x1F)        /* ^P */
#define XON    ('Q'&0x1F)        /* ^Q */
#define XOFF   ('S'&0x1F)        /* ^S */
#define CAN    ('X'&0x1F)        /* ^X */
#define CPMEOF ('Z'&0x1F)        /* ^Z */

/* Misc. program constants */
#define LZMANAG          0       /* Default ZMODEM file management mode */
#define LZTRANS          0       /* Default ZMODEM file transport mode */
#define PATHLEN        256       /* What's the max legal path size? */
#define CONFIGLEN       32       /* Max length of transfer options string */
#define KSIZE         1024       /* Max allowable packet size */
#define MINBLOCK        32       /* Min allowable packet size */
#define MAXGOODNEEDED 8192       /* Max # good bytes required to bump packet size */

/* Provision for future 7-bit ZMODEM; for now, there's no difference */
#define sendline xsendline


/* Replacement for global variables normally used, in order to make code
   fully reentrant; each invocation allocs their own Vars, and passes the
   struct pointer down through the entire program so they're always available.
   Pointer to this struct is usually able to be a register variable, so access
   is no worse than any stack variable (all register-relative).  Kinda
   kludgey, but the original ZModem code design depended on lots of globals,
   and I didn't want to redesign the whole damn thing.  Besides, it's more
   efficient than constantly pushing & popping args all over the place. */

struct Vars {
  struct XPR_IO io;              /* Copy of XProtocol IO struct passed in by term prog. */
  struct XPR_UPDATE xpru;        /* Scratchpad xpr_update() control struct */
  UBYTE Zconv;                   /* ZMODEM file conversion request */
  UBYTE Zmanag;                  /* ZMODEM file management request */
  UBYTE Ztrans;                  /* ZMODEM file transport request */
  UBYTE Lastsent;                /* Last text char written by putsec() */
  UBYTE Lastzsent;               /* Last char sent by zsendline() */
  UBYTE Fileflush;               /* Flush file I/O buffer before closing? */
  UBYTE Msgbuf[128];             /* Scratchpad buffer for printing messages */
  UBYTE Filename[PATHLEN];       /* Name of the file being up/downloaded */
  UBYTE Modembuf[256];           /* Input buffer for data from modem */
  UBYTE *Modemchar;              /* Next char to get from Modembuf */
  UBYTE *Filebuf;                /* File I/O buffer address */
  UBYTE *Filebufptr;             /* Current position within Filebuf */
  char Rxbinary;                 /* Force binary mode download? */
  char Rxascii;                  /* Force text mode download? */
  char Thisbinary;               /* Receive this file in binary mode? */
  char Lzconv;                   /* Suggested binary/text mode for uploads */
  char Eofseen;                  /* Text-mode EOF marker (^Z) received on download? */
  short Filcnt;                  /* Number of files opened for transmission */
  short Errcnt;                  /* Number of files unreadable */
  short Noroom;                  /* Flags 'insufficient disk space' errors */
  short Rxbuflen;                /* Largest frame they're willing to xfer */
  short Tframlen;                /* Largest frame we're willing to xfer */
  short Rxtimeout;               /* Tenths of seconds to wait for something */
  short Tryzhdrtype;             /* Header type to send corresponding to Last rx close */
  short Modemcount;              /* Number of bytes available in Modembuf */
  long File;                     /* Handle of file being transferred */
  long Oldstatus;                /* Original terminal program's modem settings */
  long Baud;                     /* BPS setting of modem */
  long Strtpos;                  /* Starting byte position of transfer */
  long Starttime;                /* Time transfer started */
  long Fsize;                    /* Size of file being transferred */
  long Rxbytes;                  /* Number of bytes received so far */
  long Filebufpos;               /* File offset of data in Filebuf */
  long Filebufmax;               /* Size of Filebuf */
  long Filebuflen;               /* Number of bytes currently stored in Filebuf */
  long Filebufcnt;               /* Number of bytes remaining/written in Filebuf */
  UBYTE Pktbuf[KSIZE];           /* File data packet buffer */
  UBYTE Rxhdr[4];                /* Received header */
  UBYTE Txhdr[4];                /* Transmitted header */
  UBYTE Attn[ZATTNLEN+1];        /* Attention string rx sends to tx on err */
  short Rxframeind;              /* ZBIN or ZHEX; type of frame received */
  short Rxtype;                  /* Type of header received */
  short Rxcount;                 /* Count of data bytes received */
  short Znulls;                  /* Number of nulls to send at beginning of ZDATA hdr */
  long Rxpos;                    /* Received file position */
  long Txpos;                    /* Transmitted file position */
};


/* Function declarations; change to ANSI prototypes when Manx gets their act together */

long  XProtocolSend();
short getzrxinit();
void  sendbatch();
short sendone();
short sendname();
short zsendfile();
short zsendfdata();
short getinsync();
void  saybibi();

long  XProtocolReceive();
short rcvbatch();
short tryz();
short rzfiles();
short rzfile();
short procheader();
short putsec();
void  ackbibi();

long  XProtocolSetup();
long  XProtocolCleanup();
struct Vars *setup();
void  canit();
void  zmputs();
void  xsendline();
short readock();
char  char_avail();
void  update_rate();
long  bfopen();
void  bfclose();
void  bfseek();
long  bfread();
long  brwrite();
void  ioerr();
void  upderr();
void  updmsg();
long  getfree();
char  exist();

void  zsbhdr();
void  zshhdr();
void  zsdata();
short zrdata();
short zgethdr();
short zrbhdr();
short zrhhdr();
void  zputhex();
void  zsendline();
short zgethex();
short zdlread();
short noxrd7();
void  stohdr();
long  rclhdr();

long calla();
long callaa();
long callad();
long calladda();
long calld();
long calldaa();
