jac@yoko.rutgers.edu (Jonathan A. Chandross) (05/02/91)
Submitted-by: Andy McFadden (fadden@cory.berkeley.edu)
Posting-number: Volume 1, Source:38
Archive-name: archive/unix/nulib/part07.10
Architecture: UNIX
Version-number: 3.03
=Benchmarks
-Some (old) benchmarks for NuLib:
-
-Uncompressing Moria GS (from 320K to 577K, ShrinkIt Type I LZW):
-
-Program Run / Machine Used Run Time CPU Time
----------------------------------------------- -------------- --------------
-NuLib v2.1 (APW C), running on a //gs 12 min
-ShrinkIt v3.0.1, running on a //gs (HD) 2 min 03 sec
-ShrinkIt v3.0.1, running on a //gs (RAM disk) 1 min 21 sec
-GS/ShrinkIt v1.0.2 (HD) 1 min 30 sec
-NuLib v2.2 on a lightly loaded VAX 11/750 1 min 33 sec 1 min 28.4 sec
-NuLib v2.2 on a lightly loaded VAX 11/785 38 sec 34.0 sec
-NuLib v2.2 on a lightly loaded Sun 3/50 17 sec 13.0 sec
-NuLib v2.2 on an empty Apollo workstation 12 sec 11.5 sec
-NuLib v2.2 on an empty DEC 3100 9 sec 2.6 sec
-NuLib v2.2 on an empty Sun 4 7 sec 2.2 sec
-
-"Run Time" is total time from start to finish. "CPU Time" is CPU time
-actually used under a multiprogrammed OS (in this case, UNIX).
-
-The hard drive (HD) used on the //gs is an AI InnerDrive 20. The results
-obtained from running on a RAM disk could almost be considered the CPU
-time, but I've decided to keep them separate. All versions of NuLib
-running on UNIX systems used the optimization features of the C compiler.
-
-Doing an uncompressed extract can produce remarkable results... like
-running to completion in less than one second on the Apollo (local disk).
-
-Interestingly enough, 16-bit UNIX uncompress works faster than NuLib does.
-The reason for this is that the compression code in NuLib actually makes
-two passes, one to undo the LZW compression, and the other to undo
-non-repeat compression. Was it worth it do to both kinds? For Moria it
-was; even though "uncompress" ran faster, ShrinkIt's 12-bit LZW packed
-the file smaller than compress's 16-bit LZW.
-
-No benchmarks for compress yet. Be patient.
-
-**********
-
-Raw data for benchmarks
-
-Times on the //gs were from start to finish of compression, timed with a
-stop watch.
-
-All tests were performed in verbose mode (i.e., the filename was printed
-as the file was extracted, etc). This is how I would expect it to be
-run under "normal" conditions. It does add to the overhead, which
-you can pull out by looking at the data below.
-
-/bin/csh time format appears to be (the man page is most unhelpful):
-user_time system_time real_time cpu% ??+??k ??+??io page_faults+??w
-
-user_time is the time actually spent grinding along. This is what appears
- in the "CPU time" column.
-system_time is for I/O (disk accesses, writing to terminal).
-real_time is how long a stopwatch would show (user_time + system_time +
- overhead starting/stopping NuLib + time spent running other processes
- on a multiprogrammed OS like UNIX). This appears in the "Run Time" col.
-cpu% appears to be some kind of estimate of how much time was spent doing
- useful work.
-If you don't know what a page fault is, don't worry about it.
-
-Both cory and holden used the same copy of NuLib (well not the *same* copy,
-but they're identical), so any differences in speed can be attributed
-to the processor.
-
-***** holden.berkeley.edu, a VAX 11/750 *****
-Script started on Sun Mar 25 11:52:52 1990
---- reading aliases...done
-holden 1 c184-cz% ls -s tmp/nulib
- 68 tmp/nulib*
-holden 2 c184-cz% uptime
- 11:52am up 26 days, 3:59, 4 users, load average: 0.31, 0.17, 0.13
-holden 3 c184-cz% time tmp/nulib xv moria.shk
-Extracting 'MORIA' (data)...unshrinking (I)...-\|/-done.
-88.4u 3.3s 1:33 98% 83+252k 49+89io 9pf+0w
-holden 4 c184-cz% exit
-holden 5 c184-cz%
-script done on Sun Mar 25 11:55:34 1990
-
-***** cory.berkeley.edu, a VAX 11/785 *****
-Script started on Sun Mar 25 11:50:07 1990
---- reading aliases...done
-cory 1 foo% ls -s ../bin/nulib
- 68 ../bin/nulib*
-cory 2 foo% uptime
- 11:50am up 2 days, 2:04, 6 users, load average: 0.55, 0.39, 0.27
-cory 3 foo% time nulib xv moria.shk
-Extracting 'MORIA' (data)...unshrinking (I)...-\|/-done.
-34.0u 1.6s 0:37 95% 51+244k 46+82io 5pf+0w
-cory 4 foo% exit
-cory 5 foo%
-script done on Sun Mar 25 11:51:29 1990
-
-***** a Sun 3/50 *****
-Script started on Sat Apr 21 17:00:43 1990
-ux1:nulib% ls -s nulib
- 64 nulib*
-ux1:nulib% uptime
- 5:01pm up 2 days, 10:06, 6 users, load average: 1.84, 1.66, 1.51
-ux1:nulib% time nulib xv moria.shk
-Extracting 'MORIA' (data)...unshrinking (I)...-\|/-done.
-13.0u 0.6s 0:17 76% 0+168k 1+78io 0pf+0w
-ux1:nulib% exit
-ux1:nulib%
-script done on Sat Apr 21 17:02:33 1990
-
-***** avalanche.berkeley.edu, an Apollo DN3500 *****
-Script started Sat Apr 21 17:04:53 1990
---- reading aliases...done
-avalanche 1 nulib% ls -s nulib
- 85 nulib*
-avalanche 2 nulib% uptime
- 5:05pm up 1 day, 1:50, 3 users, load average: 0.06, 0.16, 0.00
-avalanche 3 nulib% time nulib xv ../dwn/moria.shk
-Extracting 'MORIA' (data)...unshrinking (I)...-\|/-done.
-11.5u 2.6s 0:16 86% 0+0k 577+0io 0pf+0w
-avalanche 6 nulib% exit
-avalanche 7 nulib%
-Script done Sat Apr 21 17:06:59 1990
-
-***** a DEC 3100 *****
-Script started on Sat Apr 21 16:18:10 1990
-vampire:nulib% ls -s nulib
- 88 nulib*
-vampire:nulib% uptime
- 4:18pm up 30 days, 5 hrs, 2 users, load average: 0.57, 0.25, 0.00
-vampire:nulib% time nulib xv moria.shk
-Extracting 'MORIA' (data)...unshrinking (I)...-\|/-done.
-2.6u 0.5s 0:09 32% 163+404k 71+71io 3pf+0w
-vampire:nulib% exit
-vampire:nulib%
-script done on Sat Apr 21 16:19:40 1990
-
-***** a Sun 4 *****
-Script started on Sat Apr 21 16:23:47 1990
-ux5:nulib% ls -s nulib
- 64 nulib*
-ux5:nulib% uptime
- 4:23pm up 2 days, 8:50, 7 users, load average: 0.15, 0.24, 0.03
-ux5:nulib% time nulib xv moria.shk
-Extracting 'MORIA' (data)...unshrinking (I)...-\|/-done.
-2.2u 0.2s 0:07 34% 0+368k 0+71io 0pf+0w
-ux5:nulib% exit
-ux5:nulib%
-script done on Sat Apr 21 16:25:20 1990
-
=nuread.h
-/*
- * nuread.h - linked list structures used for holding NuFX header data,
- * and structure definitions for archive innards
- *
- * (this will be included by all source files which access NuFX archives)
- *
- * NuLib v3.0 February 1991 Freeware (distribute, don't sell)
- * By Andy McFadden (fadden@cory.berkeley.edu)
- */
-
-
-/* The NuFX master format version we output, and the maximum we can extract */
-#define OURMVERS 2
-#define MAXMVERS 2
-
-/* The NuFX record format version we output, and the maximum we can extract */
-#define OURVERS 0
-#define MAXVERS 3
-
-/* "NuFile" in alternating ASCII */
-static onebyt MasterID[7] = { 0x4e, 0xf5, 0x46, 0xe9, 0x6c, 0xe5, 0x0 };
-
-/* "NuFX" in alternating ASCII */
-static onebyt RecordID[5] = { 0x4e, 0xf5, 0x46, 0xd8, 0x0 };
-
-
-/*
- * Structure definitions for NuFX innards
- */
-
-/* master header block */
-typedef struct {
- onebyt ID[6];
- twobyt master_crc;
- fourbyt total_records;
- Time arc_create_when;
- Time arc_mod_when;
- twobyt master_version;
- onebyt reserved1[8];
- fourbyt master_eof;
- onebyt reserved2[6];
-} MHblock;
-#define MHsize 48 /* this should not change */
-
-/* record header block */
-typedef struct {
- onebyt ID[4];
- twobyt header_crc;
- twobyt attrib_count;
- twobyt version_number;
- twobyt total_threads;
- twobyt reserved1;
- twobyt file_sys_id;
- onebyt file_sys_info;
- onebyt reserved2;
- fourbyt access;
- fourbyt file_type;
- fourbyt extra_type;
- twobyt storage_type;
- Time create_when;
- Time mod_when;
- Time archive_when;
- twobyt option_size;
- /* future expansion here... */
-} RHblock;
-#define RHsize 58 /* sizeof(RHblock) should work, but might not */
-#define ATTSIZE 64 /* default attrib_count when creating new */
-
-/*
- * This buffer must be able to contain three things (not all at once):
- * - The master header block (size = MHsize)
- * - The record header block (size = RHsize)
- * - Attributes not specified in the RHblock (attrib_count - RHsize - 2)
- *
- * Currently, it only needs to be 64 bytes. Since it is allocated as local
- * storage only once during execution, making it reasonably large should
- * not cause any problems in performance but will make the program stable
- * if it encounters an archive with a drastically expanded RHblock.
- */
-#define RECBUFSIZ 256
-
-/* thread record */
-typedef struct {
- twobyt thread_class;
- twobyt thread_format;
- twobyt thread_kind;
- twobyt thread_crc;
- fourbyt thread_eof;
- fourbyt comp_thread_eof;
-} THblock;
-#define THsize 16 /* this should not change */
-
-
-/*
- * Definitions for the linked lists
- * A linked list of Record headers, with linked lists of Threads attached
- */
-
-/* thread nodes */
-typedef struct TNode_s {
- THblock *THptr; /* points to thread info */
- long fileposn; /* absolute position of this thread in the file */
- struct TNode_s *TNext; /* points to next thread node */
-} TNode;
-
-/* record nodes */
-typedef struct RNode_s {
- RHblock *RHptr; /* points to the record header block */
- char *filename; /* filename of record */
- twobyt filename_length; /* length of filename (as stored in record hdr) */
- twobyt real_fn_length; /* length of filename (actual) */
- TNode *TNodePtr; /* points to first thread node */
- fourbyt unc_len; /* total uncompressed length of all threads */
- fourbyt comp_len; /* total compressed length of all threads */
- struct RNode_s *RNext; /* points to next record node */
-} RNode;
-
-/* head of list */
-typedef struct {
- char *arc_name; /* filename of archive */
- MHblock *MHptr; /* points to master header */
- RNode *RNodePtr; /* points to first record node */
- long nextposn; /* abs. position in file to put next record (for ADD) */
-} ListHdr;
-
-
-/*
- * function declarations
- */
-
-extern ListHdr *NuRead(); /* read archive info into memory */
-extern void NuTest(); /* archive integrity check */
-extern twobyt CalcCRC(); /* calculate a CRC on a range of bytes */
-extern char *PrintDate(); /* print a date from a (Time *) struct */
-extern void BCopy(); /* copy bytes: *src, *dest, num, order? */
-extern void HiSwap(); /* swap bytes (maybe): *ptr, src_index, dst_index */
=nudefs.h
-/*
- * nudefs.h - system-dependent typdefs and #defines for all NuLib files,
- * plus extern declarations for global variables (allocated in
- * numain.c).
- *
- * IMPORTANT: This file must be first on the list of #includes, since some
- * include files will be processed based on these #defines
- *
- * NuLib v3.0 February 1991 Freeware (distribute, don't sell)
- * By Andy McFadden (fadden@cory.berkeley.edu)
- */
-
-
-/* SYSTEM DEPENDENCIES */
-typedef unsigned char onebyt;
-typedef unsigned short twobyt;
-typedef unsigned long fourbyt;
-
-/* byte ordering; TRUE if high byte is first (68xxx), else FALSE (65xxx) */
-extern int HiLo; /* actually part of numain.c */
-
-/* Setup for Apple //gs APW */
-/* [ "APW" is automatically defined by the compiler ] */
-
-/* Setup for MS-DOS machines (80xxx based: IBM PC) */
-/* [ "MSDOS" is defined by the compiler [MS C5.1 anyway] ] */
-
-/* Setup for other microcomputers (Macintosh, Amiga) */
-/* ??? */
-
-/* Setup for AIX */
-/* #define SYSV */
-/* #define BSD_INCLUDES */
-
-/* Setup for BSD UNIX systems */
-#define UNIX
-#define BSD43
-/* #define VAX */
-
-/* Setup for XENIX/386 */
-/* NOTE: if you get error messages about readdir() and opendir() during */
-/* linking, remove the leading '#' from the line "#CLIBS= -lx" in */
-/* "Makefile" */
-/* #define XENIX386 */
-/* #define UNIX */
-/* #define SYSV */
-/* #define NO_RENAME */ /* no rename() call in C library */
-
-/* Setup for AOS/VS @ DG */
-/* #define UNIX */
-/* #define DATAGENERAL */
-/* #define AOSVS */
-
-/* Setup for other UNIX systems */
-/* #define UNIX */
-/* #define SYSV (or whatever) */
-
-/* use table lookups to get CRCs */
-#define CRC_TAB
-
-/*
- * Some global defs
- */
-
-/* errno wasn't defined in <errno.h> on some systems... */
-#ifndef MSDOS
-extern int errno;
-#endif
-
-/* Maximum file name length that we intend to handle (watch stack size!) */
-#define MAXFILENAME 1024
-
-/* file operations */
-#define S_ABS 0 /* seek absolute */
-#define S_REL 1 /* seek relative */
-#define S_END 2 /* seek from end */
-
-#ifdef UNIX /* stuff for open() */
-# define WPERMS 0644 /* read/write for owner, read only for others */
-# define FREAD_STR "r"
-# define FWRITE_STR "w"
-# define O_BINARY 0 /* for non-UNIX open(); easier than #ifdefs */
-#else
-# ifdef APW
-# define WPERMS 0666 /* read/write for all; this may not work for some */
-# define FREAD_STR "rb"
-# define FWRITE_STR "wb"
-# endif
-# ifdef MSDOS
-# define S_IREAD 0000400 /* read permission, owner */
-# define S_IWRITE 0000200 /* write permission, owner */
-# define WPERMS S_IREAD | S_IWRITE
-# define FREAD_STR "rb"
-# define FWRITE_STR "wb"
-# endif
-# ifndef WPERMS /* other system */
-# define WPERMS 0666 /* +PORT+ */
-# define FREAD_STR "rb"
-# define FWRITE_STR "wb"
-# endif
-#endif /*UNIX*/
-
-/* Time structure; same as TimeRec from misctool.h */
-/* one-byte entries should not have alignment problems... */
-typedef struct {
- onebyt second;
- onebyt minute;
- onebyt hour;
- onebyt year;
- onebyt day;
- onebyt month;
- onebyt extra;
- onebyt weekDay;
-} Time;
-
-
-/*
- * global to entire program
- */
-extern int HiLo; /* byte ordering; FALSE on low-first (65816) */
-extern int verbose; /* BOOLEAN: print verbose? */
-extern int interact; /* BOOLEAN: interactive when overwriting? */
-extern int dopack; /* BOOLEAN: do we want to pack/unpack? */
-extern int doSubdir; /* BOOLEAN: expand subdirectories? */
-extern int doExpand; /* BOOLEAN: expand archived filenames? */
-extern int doMessages; /* BOOLEAN: do comments instead of data? */
-extern int transfrom; /* how to do CR<->LF translation? (-1 = none) */
-extern int transto;
-extern int packMethod; /* how to pack a file (thread_format) */
-extern fourbyt defFileType; /* default file type */
-extern fourbyt defAuxType; /* default aux type */
-extern onebyt *pakbuf; /* used by compression routines; created once to */
- /* eliminate overhead involved in malloc()ing a 64K buffer */
-extern char *prgName; /* for errors; don't like argv[0] */
-
=crc.h
-/*
- * crc.h - tables for fast computation of 16-bit CRCS
- *
- * NuLib v3.0 February 1991 Freeware (distribute, don't sell)
- * By Andy McFadden (fadden@cory.berkeley.edu)
- */
-
-/*
- * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell.
- * NOTE: First srgument must be in range 0 to 255.
- * Second argument is referenced twice.
- *
- * Programmers may incorporate any or all code into their programs,
- * giving proper credit within the source. Publication of the
- * source routines is permitted so long as proper credit is given
- * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg,
- * Omen Technology.
- */
-
-
-/*#define updcrc(cp, crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp)*/
-#define updcrc(cp, crc) ( (crctab[((crc >> 8) & 0xFF) ^ cp] ^ (crc << 8)) & 0xFFFF)
-
-
-/* crctab calculated by Mark G. Mendel, Network Systems Corporation */
-static unsigned short crctab[256] = {
- 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
- 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
- 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
- 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
- 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
- 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
- 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
- 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
- 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
- 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
- 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
- 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
- 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
- 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
- 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
- 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
- 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
- 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
- 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
- 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
- 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
- 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
- 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
- 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
- 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
- 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
- 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
- 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
- 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
- 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
- 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
- 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
-};
-
=nucompfn.h
-/*
- * nucompfn.h - function declarations for nucomp.c
- *
- * NuLib v3.0 February 1991 Freeware (distribute, don't sell)
- * By Andy McFadden (fadden@cory.berkeley.edu)
- */
-
-extern int u_compress(),
- u_decompress();
-
-/* COMPRESS.FNS global function declarations */
-/* this should be compatible with any type of declaration for external
- functions. See compress.h for explaination */
-#ifdef NPROTO
-extern void Usage();
-extern int check_error();
-extern char *name_index();
-extern char *get_program_name();
-#ifdef NO_STRCHR
-extern char *strchr();
-#endif
-#ifdef NO_STRRCHR
-extern char *strrchr();
-#endif
-#ifdef NO_REVSEARCH
-extern char *strrpbrk();
-#endif
-extern int is_z_name();
-extern int cl_block();
-extern int make_z_name();
-extern void unmake_z_name();
-extern void compress();
-extern void putcode();
-extern void decompress();
-extern CODE getcode();
-extern void writeerr();
-extern void copystat();
-#ifndef NOSIGNAL
-extern int foreground();
-extern SIGTYPE onintr();
-extern SIGTYPE oops();
-#endif
-extern void prratio();
-extern void version();
-#ifdef NEARHEAP
-extern ALLOCTYPE *emalloc();
-extern void efree();
-#else
-extern ALLOCTYPE FAR *emalloc();
-extern void efree();
-#endif
-extern int alloc_tables();
-extern void init_tables();
-extern int nextcode();
-#else
-extern void Usage(int);
-extern int check_error(void);
-extern char *name_index(char *);
-extern int cl_block(void);
-extern char *get_program_name(char *);
-extern int is_z_name(char *);
-extern int make_z_name(char *);
-extern void unmake_z_name(char *);
-#ifdef NO_STRCHR
-extern char *strchr(char *,int);
-#endif
-#ifdef NO_STRRCHR
-extern char *strrchr(char *,int);
-#endif
-#ifdef NO_REVSEARCH
-extern char *strrpbrk(char *,char *);
-#endif
-extern void compress(void);
-extern void putcode(CODE,int);
-extern void decompress(void);
-extern CODE getcode(void);
-extern void writeerr(void);
-extern void copystat(char *,char *);
-#ifndef NOSIGNAL
-extern int foreground(void);
-extern SIGTYPE onintr(void);
-extern SIGTYPE oops(void);
-#endif
-extern void prratio(FILE *,long,long);
-extern void version(void);
-#ifdef NEARHEAP
-extern ALLOCTYPE *emalloc(unsigned int,int);
-extern void efree(ALLOCTYPE *);
-#else
-extern ALLOCTYPE FAR *emalloc(unsigned int,int);
-extern void efree(ALLOCTYPE FAR *);
-#endif
-extern int alloc_tables(CODE,HASH);
-extern void init_tables(void );
-extern int nextcode(CODE *);
-#endif
-
+ END OF ARCHIVE