#include <proto/exec.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define ASTERISK '*'        /* The '*' metacharacter */
#define QUESTION '?'        /* The '?' metacharacter */
#define BACK_SLASH '\\'         /* The '\' metacharacter */
#define LEFT_BRACKET '['    /* The '[' metacharacter */
#define RIGHT_BRACKET ']'   /* The ']' metacharacter */

#define IS_OCTAL(ch) (ch >= '0' && ch <= '7')

typedef short int INT;      /* v2.0b */
typedef short int BOOLEAN;  /* v2.0b */
#define TRUE 1
#define FALSE 0
#define EOS '\000'

#define OUTBUFSIZ 0x2000        /* unImplode needs power of 2, >= 0x2000 */
#define LITVALS     256
#define DISTVALS    64
#define LENVALS     64
#define MAXSF       LITVALS
   typedef struct sf_entry {
       byte         Value;
       byte         BitLength;
   } sf_entry;

   typedef struct sf_tree {   /* a shannon-fano "tree" (table) */
      sf_entry     entry[MAXSF];
      int          entries;
      int          MaxLength;
   } sf_tree;

   typedef sf_tree      *sf_treep;

   typedef struct sf_node {   /* node in a true shannon-fano tree */
      UWORD         left;      /* 0 means leaf node */
      UWORD         right;     /* or value if leaf node */
   } sf_node;

typedef short int BOOLEAN;
typedef unsigned char byte;

#define UPDCRC32(res,oct) res=crc_32_tab[(byte)res^(byte)oct] ^ ((res>>8) & 0x00FFFFFFL)
/* Prototypes for functions defined in ascebc.c */
/* Prototypes for functions defined in crc32.c */
void UpdateCRC(unsigned char *s,
               int len);
/* Prototypes for functions defined in mapname.c */
int mapped_name(void);
/* Prototypes for functions defined in match.c */
int match(char *string,
          char *pattern);
BOOLEAN do_list(char *string,
                       char *pattern);
void list_parse(char **patp,
                       char *lowp,
                       char *highp);
char nextch(char **patp);
/* Prototypes for functions defined in unzip.c */
void set_file_time(void);
int create_output_file(void);
int open_input_file(void);
int __regargs readbuf(int fd,
            char *buf,
            unsigned int size);
int ReadByte(UWORD *x);
int __regargs FillBitBuffer(int bits);
int dos2unix(unsigned char *buf,
             int len);
void WriteBuffer(int fd,
                 unsigned char *buf,
                 int len);
void FlushOutput(void);
void LoadFollowers(void);
void unReduce(void);
void partial_clear(void);
void unShrink(void);
void SortLengths(sf_tree *tree);
void ReadLengths(sf_tree *tree);
void GenerateTrees(sf_tree *tree,
                   sf_node *nodes);
void LoadTree(sf_tree *tree,
              int treesize,
              sf_node *nodes);
void LoadTrees(void);
void ReadTree(sf_node *nodes,
              int *dest);
void unImplode(void);
void dir_member(void);
void skip_member(void);
void extract_member(void);
void get_string(int len,
                char *s);
void process_local_file_header(char **fnamev);
void process_central_file_header(void);
void process_end_central_dir(void);
void process_headers(void);
void skip_to_signature(void);
void process_zipfile(void);
void usage(void);
void main(int argc,
          char **argv);
	