home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Otherware
/
Otherware_1_SB_Development.iso
/
amiga
/
comms
/
comprgs
/
t22bi2.lha
/
Source_Code
/
XPRQuickB
/
quickb.h
< prev
next >
Wrap
C/C++ Source or Header
|
1991-09-02
|
7KB
|
205 lines
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* |_o_o|\\ Copyright (c) 1990 The Software Distillery. All Rights Reserved */
/* |. o.| || This program may not be distributed without the permission of */
/* | . | || the authors: BBS: (919) 382-8265 */
/* | o | || Dave Baker Alan Beale Jim Cooper */
/* | . |// Jay Denebeim Bruce Drake Gordon Keener */
/* ====== John Mainwaring Andy Mercier Jack Rouse */
/* John Toebes Mary Ellen Toebes Doug Walker Mike Whitcher */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* portions are from QUICKB.C by Paul M. Resch
* modified to function as an Amiga XPR protocol library by
* Jack Rouse of the Software Distillery.
*/
#include <exec/types.h>
#include <proto/exec.h>
#include <stdlib.h>
#include <string.h>
#include "xproto.h"
/*#define TRUE 1*/
/*#define FALSE 0*/
#define CPMEOF 0x1A
#define DLE 16
#define ETX 03
#define NAK 21
#define ENQ 05
#define CR 0x0D
#define LF 0x0A
#define MAX_BUF_SIZE 1032 /* Largest data block we can handle */
#define MAX_SA 2 /* Maximum number of waiting packets */
#define DEF_BUF_SIZE 511 /* Default data block */
#define DEF_WS 1 /* I can send 2 packets ahead */
#define DEF_WR 1 /* I can receive single send-ahead */
#define DEF_BS 8 /* I can handle 1024 bytes */
#define DEF_CM 1 /* I can handle CRC */
#define DEF_DQ 1 /* I can handle non-quoted NUL */
#define MAX_ERRORS 10
/* Receive States */
#define R_GET_DLE 0
#define R_GET_B 1
#define R_GET_SEQ 2
#define R_GET_DATA 3
#define R_GET_CHECKSUM 4
#define R_SEND_ACK 5
#define R_TIMED_OUT 6
#define R_SUCCESS 7
/* Send States */
#define S_GET_DLE 1
#define S_GET_NUM 2
#define S_HAVE_ACK 3
#define S_GET_PACKET 4
#define S_TIMED_OUT 5
#define S_SEND_NAK 6
#define S_SEND_ENQ 7
#define S_SEND_DATA 8
typedef struct PACKETB {
int seq; /* Packet's sequence number */
int num; /* Number of bytes in packet */
unsigned char buf[MAX_BUF_SIZE]; /* Actual packet data */
} PACKET;
struct XPR_DATA {
struct XPR_IO *xio; /* back pointer to our XPR_IO structure */
long (*__asm xpr_fopen) /* Open file */
(register __a0 char *filename,
register __a1 char *accessmode);
long (*__asm xpr_fclose) /* Close file */
(register __a0 long fileptr);
long (*__asm xpr_fread) /* Get char from file */
(register __a0 char *buffer,
register __d0 long size,
register __d1 long count,
register __a1 long fileptr);
long (*__asm xpr_fwrite) /* Put string to file */
(register __a0 char *buffer,
register __d0 long size,
register __d1 long count,
register __a1 long fileptr);
long (*__asm xpr_sread) /* Get char from serial */
(register __a0 char *buffer,
register __d0 long size,
register __d1 long timeout);
long (*__asm xpr_swrite) /* Put string to serial */
(register __a0 char *buffer,
register __d0 long size);
long (*__asm xpr_update) /* Print stuff */
(register __a0 struct XPR_UPDATE *updatestruct);
long (*xpr_chkabort)(void); /* Check for abort */
long (*xpr_chkmisc)(void); /* Check misc. stuff */
long (*__asm xpr_gets) /* Get string interactively */
(register __a0 char *prompt,
register __a1 char *buffer);
long (*__asm xpr_setserial) /* Set and Get serial info */
(register __d0 long newstatus);
long (*__asm xpr_finfo) /* Return file info */
(register __a0 char *filename,
register __d0 long typeofinfo);
long (*__asm xpr_options)
(register __d0 long n,
register __a0 struct xpr_option **opt);
long (*__asm xpr_unlink) /* Delete a file. */
(register __a0 char *filename);
int seq_num; /* Current Sequence Number - init by Term_ENQ */
int checksum; /* May hold CRC */
int r_size; /* size of receiver buffer */
unsigned int s_counter;
unsigned int r_counter;
int timed_out; /* we timed out before receiving character */
int cchar; /* current character */
int masked; /* TRUE if ctrl character was 'masked' */
int packet_received; /* True if a packet was received */
/* Other End's Parameters */
char His_WS; /* Sender's Window Send */
char His_WR; /* Sender's Window Receive */
char His_BS; /* Sender's Block Size */
char His_CM; /* Sender's Check Method */
/* Negotiated Parameters */
char Our_WS; /* Negotiated Window Send */
char Our_WR; /* Negotiated Window Receive */
char Our_BS; /* Negotiated Block Size */
char Our_CM; /* Negotiated Check Method */
int Quick_B; /* True if Quick B in effect */
int Use_CRC; /* True if CRC in effect */
int buffer_size; /* Our_BS * 4 */
int SA_Max; /* 1 if SA not enabled, else MAX_SA */
int SA_Enabled; /* True if Send-Ahead is permitted */
int ack_SA; /* Which SA_Buf is waiting for an ACK */
int fill_SA; /* Which SA_Buf is ready for new data */
int SA_Waiting; /* Number of SA_Buf's waiting for ACK */
int Aborting; /* TRUE if aborting transfer */
unsigned short crc_16;
int Done;
unsigned char r_buffer[MAX_BUF_SIZE];
struct XPR_UPDATE xpru;
/* options stuff */
char optText; /* text processing control */
char optOwrt; /* overwrite handling */
char optAuto; /* auto-activate */
char optDelt; /* delete after send */
char optKeep; /* keep partial file */
long TextMode; /* do line terminator translation */
int TextC; /* previous character for text processing */
/* serial buffering */
#define MAX_SERBUF 256
unsigned char serbuf[MAX_SERBUF];
int nserbuf;
unsigned char *serbufp;
/* disk I/O buffering */
char *iobuf;
char *iobufp;
long maxiobuf;
long iobufn;
int writing; /* buffer is for output */
PACKET SA_Buf[MAX_SA+1]; /* Send-ahead buffers */
};
void bp_DLE(struct XPR_DATA *xd);
void bp_ENQ(struct XPR_DATA *xd);
void bp_ESC_I(struct XPR_DATA *xd);
long bfopen(struct XPR_DATA *xd, char *filename, char *mode);
long bfclose(struct XPR_DATA *xd, long file);
long bfwrite(struct XPR_DATA *xd, char *buf, long len, long file);
long bfwread(struct XPR_DATA *xd, char *buf, long len, long file);
long xbfwrite(struct XPR_DATA *xd, char *buf, long len, long file);
long xbfwread(struct XPR_DATA *xd, char *buf, long len, long file);
void cputc(struct XPR_DATA *xd, int c);
int cfilbuf(struct XPR_DATA *xd, long timeout);
#define cgetc(xd, to) \
((--(xd)->nserbuf < 0) ? cfilbuf((xd), (to)) : *(xd)->serbufp++)
void errormsg(struct XPR_DATA *xd, char *msg);
#define min(a, b) ((a)<=(b)?(a):(b))
#define max(a, b) ((a)>=(b)?(a):(b))