Milán Major

netscape-revival

1 branch
Code

lib/libmsg/m_binhex.h

/* -*- Mode: C; tab-width: 4 -*-
*	The head file for Bin Hex 4.0 encode/decode 
* 	-------------------------------------------
*	
*		10sep95	mym	created
*/

#ifndef	binhex_h
#define	binhex_h

#define BINHEX_STATE_START  	0
#define BINHEX_STATE_FNAME  	1
#define BINHEX_STATE_HEADER 	2
#define BINHEX_STATE_HCRC   	3
#define BINHEX_STATE_DFORK  	4
#define BINHEX_STATE_DCRC   	5
#define BINHEX_STATE_RFORK  	6
#define BINHEX_STATE_RCRC   	7
#define BINHEX_STATE_FINISH   	8
#define BINHEX_STATE_DONE  		9
/* #define BINHEX_STATE_ERROR		10 */

/*
**	The Definations for the binhex encoder
*/
typedef struct _binhex_header
{
	uint32	type, creator;
	uint16  flags;
	int32	dlen, rlen ;

} binhex_header;

typedef	struct _binhex_encode_object
{
	int		state;				/*	progress state.				*/
	
	int 	state86;			/*	binhex encode state.		*/
	unsigned long CRC;			/*  accumulated CRC				*/
	int		line_length;		/*	the line length count 		*/
	char	saved_bits;
	
	int		s_inbuff;			/*	the inbuff size				*/
	int		pos_inbuff;			/*  the inbuff position			*/
	char*	inbuff;				/*	the inbuff pool				*/
	
	int		s_outbuff;			/*	the outbuff size			*/
	int		pos_outbuff;		/*	the outbuff position		*/
	char*	outbuff;			/*	the outbuf pool				*/
	
	int		s_overflow;			/*	the real size of overflow	*/
	char	overflow[32];		/*	a small overflow buffer		*/
	
	char	c[2];
	char	newline[4];			/*	the new line char seq.		*/

	/* -- for last fix up. -- */

	char 			name[64];
	binhex_header	head;
	
} binhex_encode_object;

/*
**	The defination for the binhex decoder.
**	NOTE:	This define is for Mac only.
*/

typedef union 
{
	unsigned char c[4];
	uint32 		  val;

} longbuf;

#define MAX_BUFF_SIZE			256

typedef struct _binhex_decode_object
{
	int	    state;			/* current state 						*/
	uint16  CRC;			/* cumulative CRC 						*/
	uint16  fileCRC;		/* CRC value from file 					*/

	longbuf octetbuf;		/* buffer for decoded 6-bit values 		*/
	int16 	octetin;		/* current input position in octetbuf 	*/
	int16 	donepos;		/* ending position in octetbuf 			*/
	int16 	inCRC;			/* flag set when reading a CRC 			*/

	int32 	count;			/* generic counter 						*/
	int16 	marker;			/* flag indicating maker 				*/
	unsigned char rlebuf;	/* buffer for last run length encoding value */

	binhex_header head;		/* buffer for header 					*/

#ifdef XP_MAC
	char 	name[64];		/* fsspec for the output file 		*/
	int16	vRefNum;
	int32	parID ;
	int16	fileId;			/* the refnum of the output file 		*/
#else
	char	*name;			/* file name for the output file in non-mac OS */
	XP_File	fileId;			/* the file if for the outpur file. non-mac OS */
#endif

	MWContext* context; 	/* context for call back function.		*/
	
	int32	s_inbuff;		/* the valid size of the inbuff			*/
	int32	pos_inbuff;		/* the index of the inbuff.				*/
	char*	inbuff;			/* the inbuff pointer.					*/
	int32	pos_outbuff;	/* the position of the out buff.		*/		
	char	outbuff[MAX_BUFF_SIZE];
	
} binhex_decode_object;

XP_BEGIN_PROTOS

/*
**  The binhex file encode prototypes. 
*/
int binhex_encode_init(binhex_encode_object *p_bh_encode_obj);

int binhex_encode_next(binhex_encode_object *p_bh_encode_obj, 
					char	*in_buff,
					int32	in_size,
					char 	*out_buff, 
					int32	buff_size,
					int32	*real_size);
					
int binhex_encode_end (binhex_encode_object *p_bh_encode_obj, 
					XP_Bool is_aborting);
					
int binhex_reencode_head(
					binhex_encode_object *p_bh_encode_obj,
					char* 	outbuff,
					int32	buff_size,
					int32*  real_size);


/*
**	The binhex stream decode prototypes. 
*/

int binhex_decode_init(binhex_decode_object *p_bh_decode_env, 		
					MWContext  *context);
					
int binhex_decode_next(binhex_decode_object *p_bh_decode_env, 
					const char 	*in_buff, 
					int32 		buff_size); 
int binhex_decode_end (binhex_decode_object *p_bh_decode_env, 
					XP_Bool 	is_aborting);

XP_END_PROTOS

#endif