home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / fish / libraries / xprzmodem_459 / xprzmodem.h < prev    next >
C/C++ Source or Header  |  1991-02-18  |  10KB  |  196 lines

  1. /*  xprzmodem.h: Definitions for xprzmodem.library;
  2.     Version 2.0, 28 October 1989, by Rick Huebner.
  3.     Released to the Public Domain; do as you like with this code.  */
  4.  
  5. /* #define DEBUGLOG 1 */
  6.  
  7. /* Return codes */
  8. #define OK        0
  9. #define ERROR   (-1)
  10. #define TIMEOUT (-2)
  11. #define RCDO    (-3)
  12.  
  13. /* Relevant control characters */
  14. #define CR     ('M'&0x1F)        /* ^M */
  15. #define DLE    ('P'&0x1F)        /* ^P */
  16. #define XON    ('Q'&0x1F)        /* ^Q */
  17. #define XOFF   ('S'&0x1F)        /* ^S */
  18. #define CAN    ('X'&0x1F)        /* ^X */
  19. #define CPMEOF ('Z'&0x1F)        /* ^Z */
  20.  
  21. /* Misc. program constants */
  22. #define LZMANAG          0       /* Default ZMODEM file management mode */
  23. #define LZTRANS          0       /* Default ZMODEM file transport mode */
  24. #define PATHLEN        256       /* What's the max legal path size? */
  25. #define CONFIGLEN       32       /* Max length of transfer options string */
  26. #define KSIZE         1024       /* Max allowable packet size */
  27. #define MINBLOCK        64       /* Min allowable packet size */
  28. #define MAXGOODNEEDED 8192       /* Max # good bytes required to bump packet size */
  29.  
  30. /* Provision for future 7-bit ZMODEM; for now, there's no difference */
  31. #define sendline xsendline
  32.  
  33.  
  34. /* Replacement for global variables normally used, in order to make code
  35.    fully reentrant; each invocation allocs their own Vars, and passes the
  36.    struct pointer down through the entire program so they're always available.
  37.    Pointer to this struct is usually able to be a register variable, so access
  38.    is no worse than any stack variable (all register-relative).  Kinda
  39.    kludgey, but the original ZModem code design depended on lots of globals,
  40.    and I didn't want to redesign the whole damn thing.  Besides, it's more
  41.    efficient than constantly pushing & popping args all over the place. */
  42.  
  43. struct Vars {
  44.   struct XPR_IO io;              /* Copy of XProtocol IO struct passed in by term prog. */
  45.   struct XPR_UPDATE __aligned xpru;   /* Scratchpad xpr_update() control struct */
  46.   struct timeval __aligned Starttime; /* Time transfer started */
  47.   UBYTE __aligned Rxhdr[4];      /* Received header */
  48.   UBYTE Txhdr[4];                /* Transmitted header */
  49.   UBYTE Msgbuf[128];             /* Scratchpad buffer for printing messages */
  50.   UBYTE Filename[PATHLEN];       /* Name of the file being up/downloaded */
  51.   UBYTE Pktbuf[KSIZE];           /* File data packet buffer */
  52.   UBYTE Modembuf[256];           /* Input buffer for data from modem */
  53.   UBYTE Outbuf[KSIZE*2+256];     /* Output buffer for data to modem */
  54.   UBYTE *Modemchar;              /* Next char to get from Modembuf */
  55.   UBYTE *Filebuf;                /* File I/O buffer address */
  56.   UBYTE *Filebufptr;             /* Current position within Filebuf */
  57.   void *File;                    /* Handle of file being transferred */
  58.   long Oldstatus;                /* Original terminal program's modem settings */
  59.   long Baud;                     /* BPS setting of modem */
  60.   long Strtpos;                  /* Starting byte position of transfer */
  61.   long Fsize;                    /* Size of file being transferred */
  62.   long Rxbytes;                  /* Number of bytes received so far */
  63.   long Filebufpos;               /* File offset of data in Filebuf */
  64.   long Filebufmax;               /* Size of Filebuf */
  65.   long Filebuflen;               /* Number of bytes currently stored in Filebuf */
  66.   long Filebufcnt;               /* Number of bytes remaining/written in Filebuf */
  67.   long Rxpos;                    /* Received file position */
  68.   long Txpos;                    /* Transmitted file position */
  69.   short Filcnt;                  /* Number of files opened for transmission */
  70.   short Errcnt;                  /* Number of files unreadable */
  71.   short Noroom;                  /* Flags 'insufficient disk space' errors */
  72.   short Rxbuflen;                /* Largest frame they're willing to xfer */
  73.   short Tframlen;                /* Largest frame we're willing to xfer */
  74.   short Rxtimeout;               /* Tenths of seconds to wait for something */
  75.   short Tryzhdrtype;             /* Header type to send corresponding to Last rx close */
  76.   short Modemcount;              /* Number of bytes available in Modembuf */
  77.   short Outbuflen;               /* Number of bytes currently stored in Outbuf */
  78.   short Rxframeind;              /* ZBIN or ZHEX; type of frame received */
  79.   short Rxtype;                  /* Type of header received */
  80.   short Rxcount;                 /* Count of data bytes received */
  81.   short Znulls;                  /* Number of nulls to send at beginning of ZDATA hdr */
  82.   short ErrorLimit;              /* How many sequential errors before abort */
  83.   char Rxbinary;                 /* Force binary mode download? */
  84.   char Rxascii;                  /* Force text mode download? */
  85.   char Thisbinary;               /* Receive this file in binary mode? */
  86.   char Lzconv;                   /* Suggested binary/text mode for uploads */
  87.   char Eofseen;                  /* Text-mode EOF marker (^Z) received on download? */
  88.   UBYTE Zconv;                   /* ZMODEM file conversion request */
  89.   UBYTE Zmanag;                  /* ZMODEM file management request */
  90.   UBYTE Ztrans;                  /* ZMODEM file transport request */
  91.   UBYTE Lastsent;                /* Last text char written by putsec() */
  92.   UBYTE Lastzsent;               /* Last char sent by zsendline() */
  93.   UBYTE Fileflush;               /* Flush file I/O buffer before closing? */
  94.   UBYTE Attn[ZATTNLEN+1];        /* Attention string rx sends to tx on err */
  95. };
  96.  
  97. /* Option settings and other variables needed outside of XProtocolSend/Receive;
  98.    separated from rest of Vars so that huge Vars struct doesn't have to be
  99.    allocated except during transfers.  Pointer to this struct kept in xpr_data. */
  100. struct SetupVars {
  101.   UBYTE *matchptr, *bufpos;
  102.   short buflen;
  103.   UBYTE option_t[2], option_o[2], option_b[8], option_f[8], option_e[8], option_s[4];
  104.   UBYTE option_r[4], option_a[4], option_d[4], option_k[4], option_p[256];
  105. };
  106.  
  107.  
  108. /* Function prototypes */
  109.  
  110. long  __saveds XProtocolSend(struct XPR_IO *io);
  111. short getzrxinit(struct Vars *v);
  112. void sendbatch(struct Vars *v);
  113. short sendone(struct Vars *v);
  114. short sendname(struct Vars *v);
  115. short zsendfile(struct Vars *v,short blen);
  116. short zsendfdata(struct Vars *v);
  117. short getinsync(struct Vars *v);
  118. void saybibi(struct Vars *v);
  119.  
  120. long __saveds XProtocolReceive(struct XPR_IO *io);
  121. short rcvbatch(struct Vars *v);
  122. short tryz(struct Vars *v);
  123. short rzfiles(struct Vars *v);
  124. short rzfile(struct Vars *v);
  125. short procheader(struct Vars *v);
  126. short putsec(struct Vars *v);
  127. void ackbibi(struct Vars *v);
  128.  
  129. long __saveds XProtocolSetup(struct XPR_IO *io);
  130. long __saveds XProtocolCleanup(struct XPR_IO *io);
  131. long __saveds XProtocolHostMon(struct XPR_IO *io,UBYTE *serbuff,long actual,long maxsize);
  132. long __saveds XProtocolUserMon(struct XPR_IO *io,UBYTE *serbuff,long actual,long maxsize);
  133. struct Vars *setup(struct XPR_IO *io);
  134. UBYTE *find_option(UBYTE *buf,UBYTE option);
  135. void set_textmode(struct Vars *v);
  136. void canit(struct Vars *v);
  137. void zmputs(struct Vars *v,UBYTE *s);
  138. void xsendline(struct Vars *v,UBYTE c);
  139. void sendbuf(struct Vars *v);
  140. short readock(struct Vars *v,short tenths);
  141. char char_avail(struct Vars *v);
  142. void update_rate(struct Vars *v);
  143. void *bfopen(struct Vars *v,UBYTE *mode);
  144. void bfclose(struct Vars *v);
  145. void bfseek(struct Vars *v,long pos);
  146. long bfread(struct Vars *v,UBYTE *buf,long length);
  147. long bfwrite(struct Vars *v,UBYTE *buf,long length);
  148. void ioerr(struct XPR_IO *io,char *msg);
  149. void upderr(struct Vars *v,char *msg);
  150. void updmsg(struct Vars *v,char *msg);
  151. long getfree(void);
  152. char exist(struct Vars *v);
  153. #ifdef DEBUG
  154. void dlog(struct Vars *v,UBYTE *s);
  155. #endif
  156.  
  157. void zsbhdr(struct Vars *v,USHORT type);
  158. void zshhdr(struct Vars *v,USHORT type);
  159. void zsdata(struct Vars *v,short length,USHORT frameend);
  160. short zrdata(struct Vars *v,UBYTE *buf,short length);
  161. short zgethdr(struct Vars *v);
  162. short zrbhdr(struct Vars *v);
  163. short zrhhdr(struct Vars *v);
  164. void zputhex(struct Vars *v,UBYTE c);
  165. void zsendline(struct Vars *v,UBYTE c);
  166. short zgethex(struct Vars *v);
  167. short zdlread(struct Vars *v);
  168. short noxrd7(struct Vars *v);
  169. void stohdr(struct Vars *v,long pos);
  170. long rclhdr(struct Vars *v);
  171.  
  172. extern ULONG UnixTimeOffset;
  173. ULONG GetSysTime(struct timeval *tv);
  174. void TimeOut(long ticks);
  175.  
  176. void * __asm xpr_fopen(register __a3 struct XPR_IO *io,register __a0 char *filename,register __a1 char *accessmode);
  177. void __asm xpr_fclose(register __a3 struct XPR_IO *io,register __a0 void *fileptr);
  178. long __asm xpr_fread(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __d0 long size,register __d1 long count,register __a1 void *fileptr);
  179. long __asm xpr_fwrite(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __d0 long size,register __d1 long count,register __a1 void *fileptr);
  180. long __asm xpr_sread(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __d0 long size,register __d1 long timeout);
  181. long __asm xpr_swrite(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __d0 long size);
  182. long __asm xpr_sflush(register __a3 struct XPR_IO *io);
  183. void __asm xpr_update(register __a3 struct XPR_IO *io,register __a0 struct XPR_UPDATE *updatestruct);
  184. long __asm xpr_chkabort(register __a3 struct XPR_IO *io);
  185. long __asm xpr_chkmisc(register __a3 struct XPR_IO *io);
  186. long __asm xpr_gets(register __a3 struct XPR_IO *io,register __a0 char *prompt,register __a1 char *buffer);
  187. long __asm xpr_setserial(register __a3 struct XPR_IO *io,register __d0 long newstatus);
  188. long __asm xpr_ffirst(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __a1 char *pattern);
  189. long __asm xpr_fnext(register __a3 struct XPR_IO *io,register __d0 long oldstate,register __a0 char *buffer,register __a1 char *pattern);
  190. long __asm xpr_finfo(register __a3 struct XPR_IO *io,register __a0 char *filename,register __d0 long typeofinfo);
  191. long __asm xpr_fseek(register __a3 struct XPR_IO *io,register __a0 void *fileptr,register __d0 long offset,register __d1 long origin);
  192. long __asm xpr_options(register __a3 struct XPR_IO *io,register __d0 long n,register __a0 struct xpr_option **opt);
  193. long __asm xpr_unlink(register __a3 struct XPR_IO *io,register __a0 char *filename);
  194. long __asm xpr_squery(register __a3 struct XPR_IO *io);
  195. long * __asm xpr_getptr(register __a3 struct XPR_IO *io,register __d0 long type);
  196.