jac@yoko.rutgers.edu (Jonathan A. Chandross) (05/02/91)
Submitted-by: Andy McFadden (fadden@cory.berkeley.edu)
Posting-number: Volume 1, Source:35
Archive-name: archive/unix/nulib/part04.10
Architecture: UNIX
Version-number: 3.03
=nucomp.h
-/*
- * nucomp.h - declarations for nucomp.c
- *
- * NuLib v3.0 February 1991 Freeware (distribute, don't sell)
- * By Andy McFadden (fadden@cory.berkeley.edu)
- */
-
-#ifdef BSD43
-# define NO_SETVBUF
-#endif
-
-#include <ctype.h>
-#include <string.h>
-#ifdef UNIX /* this is asking for trouble */
-# include <sys/types.h>
-#else
-# ifdef IAPX286
-# include <sys/types.h>
-# else
-# ifdef IAPX386
-# include <sys/types.h>
-# else
-# include <types.h>
-# endif
-# endif
-#endif
-#include <fcntl.h>
-
-/*@H************************ < COMPRESS HEADER > ****************************
-* $@(#) compress.c,v 4.3 88/12/26 08:00:00 don Release ^ *
-* *
-* compress : compress.h <global defines, etc> *
-* *
-* port by : Donald J. Gloistein *
-* *
-* Source, Documentation, Object Code: *
-* released to Public Domain. This code is based on code as documented *
-* below in release notes. *
-* *
-*--------------------------- Module Description --------------------------*
-* THIS HEADER CONTAINS MUCH IMPLEMENTATION INFORMATION AND ASSUMPTIONS *
-* PLEASE PRINT IT OUT AND READ IT BEFORE COMPILING CODE FOR YOURSELF *
-* *
-* This header supports a number of compiler defines and predefines. *
-* Rather than explain all of them, please print the header and read the *
-* notes. Also the unix and xenix makefiles are commented for the *
-* various options. There continues to have a lot of Dos specific info in *
-* the header. This is to help on 16 bit Msdos machines to get their *
-* compiler to work properly. I make no appology for that, as this port *
-* began as a way to implement 16 bit compress on a segmented MsDos machine*
-* *
-* However, for Unix and Xenix, all you should have to define is -DXENIX *
-* or -DUNIX and compile. There may be a problem with whether your library *
-* supports alloc() or malloc(), but there is a define for that, also. *
-* *
-* This header can be maintained to keep up with the different compilers *
-* and systems. As distributed in don Release, the files will compile with *
-* no changes under Microsoft version 5.1 C compiler, and Xenix C compiler *
-* which is the Microsoft version 4 ported. If you are going to bind the *
-* code for use in MsDos and OS/2 machines, then you must uncomment the *
-* #define BIND in this header. Otherwise, this distribution of source *
-* detect Msdos and Xenix predefines from the compiler and adjust. *
-* *
-*--------------------------- Implementation Notes --------------------------*
-* *
-* compiled with : compress.fns *
-*
-* NOTE!!! Defaults of this code now are completely Unix, even for the *
-* msdos ports. That means that the program works as a filter, *
-* and will just sit there waiting for input from stdin if you *
-* issue just the command name. You must use -h or -? to get the *
-* full help screen now. Also, it will unlink (kill) as a default *
-* on successful compression and decompression. That means the *
-* source file will be erased. *
-* These defaults are changed with the FILTER and KEEPFLAG *
-* defines. *
-* *
-* NOTE!!! Compiler predefines were taken out of the compress.h header. *
-* You must either specify them on compile or uncomment the *
-* compiler define in this header. Compiling without doing these *
-* will result in a program that does unspecified actions. *
-* problems: *
-* The inpath and outpath is a bit kludged. It should work okay. *
-* Let me know if you have problems, especially under Unix. *
-* *
-* CAUTION: The bound version will run on Dos 2.x, but you must use the *
-* name compress.exe. If you rename the file, it will not run *
-* The unbound version will run on Dos 2.x with the name changed *
-* but due to the dos version, will not detect its own name. *
-* *
-* CAUTION: Non MsDos users. You must modify the _MAX_PATH defines for *
-* your operating system if it is different from the assumed *
-* standard. *
-* *
-* CAUTION: I have used a number of defines to make it possible to compile *
-* properly under a number of bit sizes and adjust for the memory *
-* allocation scheme needed. If you do not use a dos system, *
-* PLEASE pay attention to the defines for MAXSEG_64 and the one *
-* called SMALLMODEL. The SMALLMODEL define is set in the header *
-* but if you don't have a compiler that triggers the MAXSEG_64 *
-* define, you may end up with bad pointers. Becareful. *
-* *
-* Header for files using version 4 compress routines define MAIN *
-* in the file with defining instance of the global variables. *
-* There are a number of compilers for MsDos and Unix/Xenix. *
-* So the user must define the actions required. *
-* *
-* *
-* Defines: This header file contains most of the system wide defines. *
-* the purpose for this was to consolodate compiler differences *
-* into one area that is easily changed. *
-* *
-* define MAXBITS= if you want a different maximum bits. 16 bits will now *
-* run in about 400K of memory. *
-* define BIND if you are going to use Microsoft bind.exe program on the *
-* executable. *
-* *
-* define MSDOS if you are compiling under MsDos or PcDos and your compiler*
-* does not predefine it. *
-* *
-* Initials ---- Name --------------------------------- *
-* DjG Donald J. Gloistein, current port to MsDos 16 bit *
-* Plus many others, see rev.hst file for full list *
-* LvR Lyle V. Rains, many thanks for improved implementation *
-* of the compression and decompression routines. *
-*************************************************************************@H*/
-
-#ifndef FALSE /* let's get some sense to this */
-#define FALSE 0
-#define TRUE !FALSE
-#endif
-
-#define NDEBUG
-#define NPROTO
-#define COMP40 /* take this out for a little more speed */
-char *malloc();
-#define ALLOCATE(x,y) malloc((unsigned int)x*y)
-#define FREEIT(ptr) free(ptr)
-#define NOSIGNAL /* what the hell is "SIGTYPE"? */
-#define setbinary(fp)
-#define FAR
-#define CONST
-#define _MAX_DIR 64
-
-/* FILTER if you want the program to operate as a unix type filter */
-/* if not defined TRUE, then issuing command without parameters will */
-/* print a usage and help information */
-/* Use -DFILTER=0 to deactivate filter operation */
-#ifndef FILTER
-#define FILTER FALSE
-#endif
-
-/* KEEPFLAG determines the default action on successful completion */
-/* Unix convention is FALSE (erase input file) */
-/* Use -DKEEPFLAG=1 to keep files as default or change here */
-/* if you don't set it before here and you are compiling the debug */
-/* version, then files will be kept. */
-
-#ifndef KEEPFLAG
-#define KEEPFLAG TRUE
-#endif
-
-
-
-
-/* the following tells the system that the maximum segment is 64k */
-/* if your compiler is not one of these and has this limitation */
-/* Because of this, this code should compile with minimum porting */
-/* in the COMPUSI.XEN module to most unix systems. */
-/* This is also used to keep array indexing to 16 bit integer */
-/* if not predefined in compiler implementation, you must define */
-/* it separately if applicable to your compiler/system */
-
-#define MAXSEG_64K
-
-/* put this in if you are compiling in small code */
-/* model and your compiler does not predefine it */
-/* this is for CPU' with 64k segment limitation. */
-/* Use this define for small code, it is used by */
-/* the header to decide on value for NEARHEAP */
-/* #define SMALLMODEL */
-
-/* does your system use far pointers ? if you want it enabled keep this */
-/* if you have segment limit and compile in larger than 13 bits */
-/* then you will have to use compact or large model if your compiler */
-/* does not support far pointer keyword. */
-
-#ifndef FAR
-#define FAR
-#endif
-
-/* What type does the alloc() function return, char or void? */
-
-#ifndef ALLOCTYPE
-#define ALLOCTYPE char
-#endif
-
-/* Does your run time library support the ANSI functions for:*/
-
-/* reverse string set search? strrpbrk() if not: */
-#define NO_REVSEARCH
-
-/* Does your library include strrchr()? If not define this: */
-/*#define NO_STRRCHR*//* unix/xenix module uses this function*/
-
-/* Does your library include strchr()? If not define this: */
-/*#define NO_STRCHR*//* dos module uses this function. */
-
-/* definition for const key word if supported */
-#ifndef CONST
-#define CONST
-#endif
-
-
-/* And now for some typedefs */
-typedef unsigned short CODE;
-typedef unsigned char UCHAR;
-typedef unsigned int HASH;
-typedef int FLAG;
-
- /*
- * You can define the value of MAXBITS to be anything betweeen MINBITS
- * and MAXMAXBITS. This is will determine the maximum memory you will
- * use and how the tables will be handled. I recommend you just leave
- * it at MAXMAXBITS, because you can define DFLTBITS in compiling the
- * module COMPRESS.C to set the default, and you can vary the number
- * of bits at runtime by using the -b switch.
- */
-
- /*
- * The only reason to change MAXBITS is if you absolutely must have
- * faster performance. If you specify 14 bits, the tables will not
- * be split; at 13 bits, you can fit in the MSDOS small memory model
- * and allocate tables in near heap.
- * This value is available to other modules through the variable maxbits.
- */
-
-#define INITBITS 9
-#define MINBITS 12
-#define MAXMAXBITS 16
-
-#ifndef MAXBITS
-#define MAXBITS MAXMAXBITS
-#endif
-
-#if (MAXBITS > MAXMAXBITS)
-#undef MAXBITS
-#define MAXBITS MAXMAXBITS
-#endif
-
-#if (MAXBITS < MINBITS)
-#undef MAXBITS
-#define MAXBITS MINBITS
-#endif
-
- /* You should define DFLTBITS to be the default compression code
- * bit length you desire on your system.
- * (I define mine in the compiler command line in my Makefile.LvR)
- * (I leave mine alone and keep to the maximum. DjG)
- */
-
-#ifndef DFLTBITS
-#define DFLTBITS MAXBITS
-#endif
-#if (DFLTBITS < MINBITS)
-#undef DFLTBITS
-#define DFLTBITS MINBITS
-#endif
-#if (DFLTBITS > MAXBITS)
-#undef DFLTBITS
-#define DFLTBITS MAXBITS
-#endif
-
-/* correcting for different types of pointer arithmatic */
-/* probably won't have to change it */
-#define NULLPTR(type) ((type FAR *) NULL)
-
-
-/* in making this program portable the following allocation and */
-/* free functions are called, with the following parameters: */
-/* ALLOCTYPE FAR *emalloc(unsigned int x, int y) */
-/* void efree(ALLOCTYPE FAR *ptr) */
-/* you must define the allocation function and the free function */
-/* keep in mind that the casts must be correct for your compiler */
-/* NOTE these are the two functions to change for allocating pointers to */
-/* far data space if you are not using Microsoft C v.5.1 */
-/* Consult your compiler manual and find the low level function that */
-/* returns a far pointer when compiled in the small model. */
-/* if your compiler does not support that, you will have to compile with */
-/* a model that defaults to far pointers to data (compact or large model)*/
-/* HERE ARE SOME SAMPLE PREDEFINED ONES */
-
-
-/* default allocation function, in segmented addressing, must return */
-/* a far pointer or compile with far pointer data as default */
-#ifndef ALLOCATE
-#include <malloc.h>
-#define ALLOCATE(x,y) malloc((unsigned int)x*y)
-#define FREEIT(ptr) free((ptr))
-#endif
-
-
-# ifdef MAXSEG_64K
-# if MAXBITS > 14
-# define SPLIT_HT TRUE
-# else
-# define SPLIT_HT 0
-# endif
-# else
-# define SPLIT_HT 0
-# endif
-
-# ifdef MAXSEG_64K
-# if MAXBITS > 15
-# define SPLIT_PFX TRUE
-# else
-# define SPLIT_PFX 0
-# endif
-# else
-# define SPLIT_PFX 0
-# endif
-
-#ifndef BUFSIZ
-#define BUFSIZ 512
-#endif
-
-#ifdef NO_SETBUF
-#define NO_SETVBUF
-#endif
-
-/* NuLib: comment: this ought to use setbuffer() if available */
-#ifdef NO_SETVBUF
-# ifndef NO_SETBUF
-# define setvbuf(fp,buf,mode,size) setbuf((fp),(buf))
-# define ZBUFSIZE BUFSIZ
-# define XBUFSIZE BUFSIZ
-# else
-# define setvbuf(fp,buf,mode,size)
-# define ZBUFSIZE (1)
-# define XBUFSIZE (1)
-# endif
-#else
-# ifdef NEARHEAP
-# define XBUFSIZE (0xC00)
-# define ZBUFSIZE (0x1800)
-# else
-# define XBUFSIZE (0x3000) /* 12k bytes */
-# define ZBUFSIZE (0x6000) /* 24k bytes */
-# endif
-#endif
-
-#define UNUSED ((CODE)0) /* Indicates hash table value unused */
-#define CLEAR ((CODE)256) /* Code requesting table to be cleared */
-#define FIRSTFREE ((CODE)(CLEAR+1))/* First free code for token encoding */
-#define MAXTOKLEN 512 /* Max chars in token; size of buffer */
-#define OK 0 /* Result codes from functions: */
-#define ERROR 1
-#define NORMAL 0
-
-#define SIGNAL_ERROR -1 /* signal function error */
-#define NOMEM 2 /* Ran out of memory */
-#define TOKTOOBIG 3 /* Token longer than MAXTOKLEN chars */
-#define READERR 4 /* I/O error on input */
-#define WRITEERR 5 /* I/O error on output */
-#define INFILEBAD 6 /* Infile not in compressed format */
-#define CODEBAD 7 /* Infile contained a bad token code */
-#define TABLEBAD 8 /* The tables got corrupted (!) */
-#define NOSAVING 9 /* no saving in file size */
-#define NOTOPENED 10 /* output file couldn't be opened */
-#define YES 1
-#define NO 0
-
-
-#include "nucompfn.h" /* This has to come late... needs typedefs above */
-
-/* defines opening mode for files */
-/* and suffixes for compressed file */
-
-
-#define WRITE_FILE_TYPE FWRITE_STR /* NuLib: was "wb" */
-#define READ_FILE_TYPE FREAD_STR /* NuLib: was "rb" */
-#define SUFFIX ".Z"
-
-/* Defines for third byte of header */
-#define BIT_MASK 0x1f
-#define BLOCK_MASK 0x80
-/* Masks 0x40 and 0x20 are free. I think 0x20 should mean that there is
- a fourth header byte (for expansion).
-*/
-
-
-#define CHECK_GAP 10000L /* ratio check interval */
-
-#ifdef MAIN
-UCHAR magic_header[] = { 0x1F,0x9D }; /* 1F 9D */
-
-char rcs_ident[] = "@(#) compress,v 4.3 88/12/26 08:00:00 don Release $";
-
-int overwrite = 0; /* Do not overwrite unless given -f flag */
-int maxbits = DFLTBITS; /* user settable max # bits/code */
-
-int exit_stat = 0;
-int keep = KEEPFLAG; /* True = don't kill file */
-int keep_error = FALSE; /* True = keep output file even if error exist */
-char *prog_name;
-char ifname[_MAX_DIR];
-char inpath[_MAX_DIR];
-char ofname [_MAX_DIR];
-char outpath[_MAX_DIR];
-int is_list = FALSE; /* flag for file parameters */
-char endchar[1];
-char xbuf[XBUFSIZE];
-char zbuf[ZBUFSIZE];
-char separator[] = "/";
-
-int nomagic = FALSE; /* Use a 3-byte magic number header, unless old file */
-int zcat_flg = TRUE; /* Write output on stdout, suppress messages */
-int quiet = TRUE; /* don't tell me about compression */
-/*
- * block compression parameters -- after all codes are used up,
- * and compression rate changes, start over.
- */
-int block_compress = BLOCK_MASK;
-#ifdef COMP40
-long int ratio = 0L;
-long checkpoint = CHECK_GAP;
-#endif
-
-/* force the overwrite */
-int force = 0;
-
-#ifndef NDEBUG
-int verbose = FALSE;
-int debug = FALSE;
-#endif /* !NDEBUG */
-
-int do_decomp = FALSE;
-
-#else /* not defining instance */
-
-extern UCHAR magic_header[];
-extern char rcs_ident[];
-extern int overwrite;
-extern int maxbits;
-
-
-extern int exit_stat;
-extern int keep;
-extern int keep_error;
-extern char *prog_name;
-extern char inpath[];
-extern char outpath[];
-extern int is_list;
-extern char endchar[];
-extern char xbuf[];
-extern char zbuf[];
-extern char ifname[];
-extern char ofname[];
-extern char separator[];
-extern int nomagic;
-extern int zcat_flg;
-extern int quiet;
-extern int block_compress;
-#ifdef COMP40
-extern long int ratio;
-extern long checkpoint;
-#endif
-extern int force;
-
-#ifndef NDEBUG
-extern int verbose;
-extern int debug;
-#endif /* !NDEBUG */
-
-extern int do_decomp;
-#endif
-
=nuview.c
-/*
- * nuview.c - prints the contents of a NuFX archive
- *
- * NuLib v3.0 February 1991 Freeware (distribute, don't sell)
- * By Andy McFadden (fadden@cory.berkeley.edu)
- */
-#ifdef APW
-segment "NuMain"
-#endif
-
-#include "nudefs.h"
-#include <stdio.h>
-#ifdef BSD43
-# include <strings.h>
-#else /* SYSV, APW, MSC */
-# include <string.h>
-#endif
-
-#ifdef APW
-# include <shell.h>
-#endif
-
-#include "nuview.h"
-#include "nuread.h"
-#include "nuetc.h"
-
-
-/*
- * String definitions for NuView
- */
-/* unknown value msg */
-char *unknownStr = "[ unknown ]";
-
-/* weekDay values */
-char *WD[8] = { "[ null ]", "Sunday", "Monday", "Tuesday", "Wednesday",
- "Thursday", "Friday", "Saturday" };
-
-/* month values */
-char *MO[13] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
- "Aug", "Sep", "Oct", "Nov", "Dec" };
-
-/* thread_class */
-/*#define TCn 4*/
-char *TC[TCn] = { "Message_thread", "Control_thread", "Data_thread",
- "Filename_thread" };
-
-/*#define TKn 3 /* max #of thread_kinds in a thread_class */
-char *TK[TCn][TKn] = {
- { "ASCII text", "ASCII text (predef size)", "<undef>" },
- { "Create directory", "<undef>", "<undef>" },
- { "File data_fork", "Disk image", "File resource_fork" },
- { "Generic filename", "<undef>", "<undef>" } };
-
-/* thread_format */
-/*#define TFn 6*/
-char *TF[TFn] = { "Uncompressed", "SQueezed (SQ/USQ)",
- "Dynamic LZW Type I (ShrinkIt)",
- "Dynamic LZW Type II (ShrinkIt)", "12-bit UNIX compress",
- "16-bit UNIX compress" };
-
-/* brief thread format */
-/*#define BTFn 6*/
-char *BTF[BTFn] = { "Uncompr", "SQueezed", "LZW/1", "LZW/2", "Unix/12",
- "Unix/16" };
-
-/* quick thread_format */
-/*#define QTFn 6*/
-char *QTF[QTFn] = { "unc", "squ", "shk", "sh2", "u12", "u16" };
-
-/* file_sys_id */
-/*#define FIDn 14*/
-char *FID[FIDn] = { "Reserved/unknown ($00)", "ProDOS/SOS", "DOS 3.3",
- "DOS 3.2", "Apple II Pascal", "Macintosh (MFS)",
- "Macintosh (HFS)", "LISA file system", "Apple CP/M",
- "Reserved ($09)", "MS-DOS", "High-Sierra", "ISO 9660",
- "AppleShare" };
-
-/* storage_type */
-/*#define STn 14*/
-char *ST[STn] = { "Standard file ($00)", "Standard file ($01)",
- "Standard file ($02)", "Standard file ($03)", "??? ($04)",
- "Extended file ($05)", "??? ($06)", "??? ($07)", "??? ($08)",
- "??? ($09)", "??? ($0a)", "??? ($0b)", "??? ($0c)",
- "Subdirectory ($0d)" };
-
-/* file type names */
-char *FT[256] = {
- "NON", "BAD", "PCD", "PTX", "TXT", "PDA", "BIN", "CHR",
- "PIC", "BA3", "DA3", "WPD", "SOS", "$0D", "$0E", "DIR",
- "RPD", "RPI", "$12", "OUT", "$14", "RPT", "$16", "$17",
- "$18", "ADB", "AWP", "ASP", "$1C", "$1D", "$1E", "$1F",
- "$20", "$21", "$22", "$23", "$24", "$25", "$26", "$27",
- "$28", "$29", "$2A", "$2B", "$2C", "$2D", "$2E", "$2F",
- "$30", "$31", "$32", "$33", "$34", "$35", "$36", "$37",
- "$38", "$39", "$3A", "$3B", "$3C", "$3D", "$3E", "$3F",
- "$40", "$41", "$42", "$43", "$44", "$45", "$46", "$47",
- "$48", "$49", "$4A", "$4B", "$4C", "$4D", "$4E", "$4F",
- "$50", "$51", "$52", "$53", "$54", "$55", "$56", "$57",
- "$58", "$59", "$5A", "$5B", "$5C", "$5D", "$5E", "$5F",
- "PRE", "$61", "$62", "$63", "$64", "$65", "$66", "$67",
- "$68", "$69", "$6A", "NIO", "$6C", "DVR", "$6E", "HDV",
- "$70", "$71", "$72", "$73", "$74", "$75", "$76", "$77",
- "$78", "$79", "$7A", "$7B", "$7C", "$7D", "$7E", "$7F",
- "$80", "$81", "$82", "$83", "$84", "$85", "$86", "$87",
- "$88", "$89", "$8A", "$8B", "$8C", "$8D", "$8E", "$8F",
- "$90", "$91", "$92", "$93", "$94", "$95", "$96", "$97",
- "$98", "$99", "$9A", "$9B", "$9C", "$9D", "$9E", "$9F",
- "WPF", "MAC", "HLP", "DAT", "$A4", "LEX", "$A6", "$A7",
- "$A8", "$A9", "$AA", "GSB", "ARC", "$AD", "$AE", "$AF",
- "SRC", "OBJ", "LIB", "S16", "RTL", "EXE", "STR", "TSF",
- "NDA", "CDA", "TOL", "DRV", "$BC", "FST", "$BE", "DOC",
- "PNT", "SCR", "ANI", "$C3", "$C4", "$C5", "$C6", "$C7",
- "FON", "FND", "ICN", "$CB", "$CC", "$CD", "$CE", "$CF",
- "$D0", "$D1", "$D2", "$D3", "$D4", "$D5", "$D6", "$D7",
- "$D8", "$D9", "$DA", "$DB", "$DC", "DDD", "$DE", "$DF",
- "LBR", "$E1", "ATI", "$E3", "$E4", "$E5", "$E6", "$E7",
- "$E8", "$E9", "$EA", "$EB", "$EC", "$ED", "$EE", "PAS",
- "CMD", "$F1", "$F2", "$F3", "$F4", "$F5", "$F6", "$F7",
- "$F8", "IMG", "INT", "IVR", "BAS", "VAR", "REL", "SYS" };
-
-
-/*
- * NuView program
- */
-
-/* print date from Time structure */
-char *PrintDate(tptr, brief)
-Time *tptr;
-int brief;
-{
- static char buf[64]; /* holds final date string; must be static */
- char buf2[64]; /* space to hold string while building it */
-
- /* check for validity */
- if ( (tptr->day > 30) || (tptr->month > 11) || (tptr->hour > 24) ||
- (tptr->minute > 59) ) {
- strcpy(buf, " <invalid> ");
- return (buf);
- }
-
- if (!tptr->second && !tptr->minute && !tptr->hour && !tptr->day &&
- !tptr->month && !tptr->year && !tptr->weekDay && !tptr->extra) {
- strcpy(buf, " [No Date] ");
- return (buf);
- }
-
- /* only print weekDay if one was stored and if we're in FULL mode */
- if (!brief && tptr->weekDay) {
- (void) sprintf(buf, "%s, ", WD[tptr->weekDay]);
- } else {
- buf[0] = '\0';
- }
- if (brief == 2) { /* special case for ARCZOO format */
- (void) sprintf(buf2, "%.2d-%s-%.2d %.2d:%.2d%c",
- (tptr->day)+1, MO[tptr->month], tptr->year,
- tptr->hour > 12 ? tptr->hour-12 : tptr->hour, tptr->minute,
- tptr->hour > 12 ? 'p' : 'a');
- } else {
- (void) sprintf(buf2, "%.2d-%s-%.2d %.2d:%.2d",
- (tptr->day)+1, MO[tptr->month], tptr->year,
- tptr->hour, tptr->minute);
- }
- (void) strcat(buf, buf2);
- if (!brief) { /* add seconds to long output */
- (void) sprintf(buf2, ":%.2d", tptr->second);
- (void) strcat(buf, buf2);
- }
- return (buf);
-}
-
-
-/*
- * Dump contents of the threads (used by FULL view mode)
- */
-static void DumpThreads(RNodePtr)
-RNode *RNodePtr;
-{
- int i;
- fourbyt count = RNodePtr->RHptr->total_threads;
- static char ind[4] = " "; /* indentation */
- THblock *THptr;
- TNode *TNodePtr;
-
- /* go through all threads, printing as we go */
- TNodePtr = RNodePtr->TNodePtr;
- for (i = 0; (fourbyt) i < count; i++) {
- if (TNodePtr == (TNode *) NULL) {
- fprintf(stderr, "WARNING: fewer threads than expected\n");
- return;
- }
- THptr = TNodePtr->THptr;
-
- printf("%s --> Information for thread %d\n", ind, i);
- printf("%s thread_class: %s\n", ind, THptr->thread_class < TCn ?
- TC[THptr->thread_class] : unknownStr);
- printf("%s thread_format: %s\n", ind, THptr->thread_format < TFn ?
- TF[THptr->thread_format] : unknownStr);
- printf("%s thread_kind: %s ($%.2X)\n", ind,
- (THptr->thread_kind < TKn && THptr->thread_class < TCn) ?
- TK[THptr->thread_class][THptr->thread_kind] : unknownStr,
- THptr->thread_kind);
- printf("%s thread_crc: $%.4x\n", ind, THptr->thread_crc);
- printf("%s thread_eof: %lu ", ind, THptr->thread_eof);
- printf("comp_thread_eof: %lu\n", THptr->comp_thread_eof);
- printf("%s * position within file: %ld\n", ind, TNodePtr->fileposn);
-
- TNodePtr = TNodePtr->TNext;
- }
- /* after all info printed, show sum total of thread lengths */
- printf("%s * total thread_eof: %lu ", ind, RNodePtr->unc_len);
- printf("total comp_thread_eof: %lu\n", RNodePtr->comp_len);
-}
-
-
-/*
- * Scan contents of the threads for certain things (for PROSHK view mode)
- * Returns 65535 as error code (-1 in an unsigned short).
- * Places the format, compressed EOF, and uncompressed EOF in the location
- * pointed to by the appropriate variables.
- *
- * This will probably fail if there are > 32767 threads.
- */
-static twobyt ScanThreads(RNodePtr, format, dataCEOF, dataEOF)
-RNode *RNodePtr;
-twobyt *format; /* format of the data_fork thread */
-long *dataCEOF; /* length of the data_fork thread (compressed) */
-long *dataEOF; /* length of the data_fork thread (uncompressed) */
-{
- int i;
- int count;
- THblock *THptr;
- TNode *TNodePtr;
-
- count = (int) RNodePtr->RHptr->total_threads;
- *format = 65535; /* default = error */
- *dataCEOF = 0L;
- *dataEOF = 0L;
- TNodePtr = RNodePtr->TNodePtr;
- for (i = 0; i < count; i++) {
- if (TNodePtr == (TNode *) NULL) {
- fprintf(stderr, "WARNING: fewer threads than expected\n");
- return (65535);
- }
- THptr = TNodePtr->THptr;
-
- if (THptr->thread_class == 2) { /* data thread? */
- *format = THptr->thread_format;
- *dataCEOF = THptr->comp_thread_eof;
- *dataEOF = THptr->thread_eof;
- return (THptr->thread_kind);
- }
- TNodePtr = TNodePtr->TNext;
- }
- return (65535); /* no data thread found */
-}
-
-
-/*
- * View archive contents
- *
- * Format types:
- * T: NAMEONLY - Brief output of filenames only (good for pipes)
- * V: PROSHK - ProDOS ShrinkIt format
- * A: ARCZOO - Format similar to ARC or ZOO
- * Z: FULL - Fully detailed output
- */
-void NuView(filename, options)
-char *filename;
-char *options;
-{
- ListHdr *archive;
- MHblock *MHptr;
- RHblock *RHptr;
- RNode *RNodePtr;
- outtype prtform;
- int rec;
- char tmpbuf[80]; /* temporary buffer for sprintf + printf */
- twobyt format, datakind; /* PROSHK */
- int percent; /* PROSHK */
- long dataCEOF, dataEOF; /* PROSHK */
- int total_files = 0, total_length = 0, total_complen = 0; /* ARCZOO */
-
-#ifdef APW /* kill "not used" messages */
- char *ptr;
-#endif
- static char *procName = "NuView";
-
- /* process options ourselves */
- switch (options[0]) {
- case 't':
- if (INDEX(options+1, 'v')) prtform = PROSHK; /* -tv is same as -v */
- else if (INDEX(options+1, 'a')) prtform = ARCZOO;
- else if (INDEX(options+1, 'z')) prtform = FULL;
- else prtform = NAMEONLY;
- break;
- case 'v':
- prtform = PROSHK;
- break;
- default:
- fprintf(stderr, "%s internal error: unknown output format\n", prgName);
- Quit (-1);
- }
-
- archive = NuRead(filename);
- MHptr = archive->MHptr;
-
- /* Print master header info */
- if (prtform == NAMEONLY) {
- /* don't print any info from master header for NAMEONLY */
- } else if (prtform == PROSHK) {
-#ifdef APW
- /* strip partial paths from APW filename (if any) */
- ptr = RINDEX(archive->arc_name, '/');
- printf(" %-15.15s ", ptr ? ptr+1 : archive->arc_name);
-#else
- printf(" %-15.15s ", archive->arc_name);
-#endif
- printf("Created:%s ", PrintDate(&MHptr->arc_create_when, TRUE));
- printf("Mod:%s ", PrintDate(&MHptr->arc_mod_when, TRUE));
- printf("Recs:%5lu\n\n", MHptr->total_records);
- printf(" Name Kind Typ Auxtyp Archived");
- printf(" Fmat Size Un-Length\n");
- printf("-------------------------------------------------") ;
- printf("----------------------------\n");
- } else if (prtform == ARCZOO) {
- printf("Name Length Stowage SF Size now");
- printf(" Date Time \n");
- printf("======================== ======== ======== ==== ========");
- printf(" ========= ======\n");
- } else if (prtform == FULL) {
- printf("Now processing archive '%s'\n", archive->arc_name);
- printf("---> Master header information:\n");
- printf("master ID: '%.6s' ", MHptr->ID);
- printf("master_version: $%.4x ", MHptr->master_version);
- printf("master_crc: $%.4X\n", MHptr->master_crc);
- printf("total_records: %lu ", MHptr->total_records);
- if (MHptr->master_version >= 0x0001) {
- printf("master_eof: %lu\n", MHptr->master_eof);
- } else {
- printf("\n");
- }
- printf("created: %s ", PrintDate(&MHptr->arc_create_when, FALSE));
- printf("mod: %s\n", PrintDate(&MHptr->arc_mod_when, FALSE));
- } else {
- printf("NuView internal error: undefined output format\n");
- Quit (-1);
- }
-
- /* Print record info */
- RNodePtr = archive->RNodePtr;
- for (rec = 0; (fourbyt) rec < MHptr->total_records; rec++) {
- if (RNodePtr == (RNode *) NULL) {
- fprintf(stderr, "WARNING: fewer records than expected\n");
- return;
- }
- RHptr = RNodePtr->RHptr;
-
- if (prtform == NAMEONLY) {
- printf("%.79s\n", RNodePtr->filename); /* max 79 chars */
- } else if (prtform == PROSHK) {
- printf("%c", (RHptr->access == 0xE3L || RHptr->access == 0xC3L) ?
- ' ' : '+');
- printf("%-21.21s ", RNodePtr->filename);
- /* get info on data_fork thread */
- datakind = ScanThreads(RNodePtr, &format, &dataCEOF, &dataEOF);
- if (datakind == 65535) { /* no data thread... */
- printf("???? ");
- printf("%s ", RHptr->file_type < 256L ? FT[RHptr->file_type] :
- "???");
- printf("$%.4X ", (twobyt) RHptr->extra_type);
- } else if (datakind == 1) { /* disk */
- printf("Disk ");
- printf("--- ");
- (void) sprintf(tmpbuf, "%dk", (twobyt) RHptr->extra_type / 2);
- printf("%-5s ", tmpbuf);
- } else { /* must be a file */
- printf("File ");
- printf("%s ", RHptr->file_type < 256L ? FT[RHptr->file_type] :
- "???");
- printf("$%.4X ", (twobyt) RHptr->extra_type);
- }
- printf("%s ", PrintDate(&RHptr->archive_when, TRUE));
- printf("%s ", format < QTFn ? QTF[format] : "???");
-
- /* figure out the percent size, and format it appropriately */
- /* Note RNodePtr->comp_len corresponds to dataCEOF, and */
- /* RNodePtr->unc_len corresponds to dataEOF. */
- if (!dataCEOF && !dataEOF) {
- printf("100%% "); /* file is 0 bytes long */
- } else if ((!dataEOF && dataCEOF) || (dataEOF && !dataCEOF)) {
- printf("--- "); /* something weird happened */
- } else if (dataEOF < dataCEOF) {
- printf(">100%% "); /* compression failed?!? */
- } else { /* compute from sum of thread lengths (use only data?) */
- percent = (dataCEOF * 100) / dataEOF;
- (void) sprintf(tmpbuf, "%.2d%%", percent);
- printf("%-4s ", tmpbuf);
- }
- if (!dataEOF && dataCEOF) /* weird */
- printf(" ????\n");
- else
- printf("%7ld\n", dataEOF); /* was 8ld */
- } else if (prtform == ARCZOO) {
- printf("%-24.24s ", RNodePtr->filename);
- datakind = ScanThreads(RNodePtr, &format, &dataCEOF, &dataEOF);
- printf("%8ld ", dataEOF);
- printf("%-8.8s ", format < BTFn ? BTF[format] : "Unknown");
-
- /* figure out the percent size, and format it appropriately */
- /* Note RNodePtr->comp_len corresponds to dataCEOF, and */
- /* RNodePtr->unc_len corresponds to dataEOF. */
- if (!dataCEOF && !dataEOF) {
- printf(" 0%% "); /* file is 0 bytes long */
- } else if ((!dataEOF && dataCEOF) || (dataEOF && !dataCEOF)) {
- printf("--- "); /* something weird happened */
- } else if (dataEOF < dataCEOF) {
- printf(" <0%% "); /* compression failed?!? */
- } else { /* compute from sum of thread lengths (use only data?) */
- percent = 100 - ((dataCEOF * 100) / dataEOF);
- if (percent == 0 || percent == 100)
- (void) sprintf(tmpbuf, "%d%%", percent);
- else
- (void) sprintf(tmpbuf, "%.2d%%", percent);
- printf("%4s ", tmpbuf);
- }
- printf("%8ld ", dataCEOF);
- printf("%s\n", PrintDate(&RHptr->mod_when, 2));
-
- total_files++;
- total_length += dataEOF;
- total_complen += dataCEOF;
- } else if (prtform == FULL) {
- printf("\n---> Information for record %d:\n", rec);
- printf("Filename: (%d) '%s'\n",
- RNodePtr->filename_length, RNodePtr->filename);
- printf("header ID: '%.4s' ", RHptr->ID);
- printf("version_number: $%.4X ", RHptr->version_number);
- printf("header_crc: $%.4X\n", RHptr->header_crc);
- printf("attrib_count: %u ", RHptr->attrib_count);
- printf("total_threads: %u\n", RHptr->total_threads);
- printf("file_sys_id: %s ", RHptr->file_sys_id < FIDn ?
- FID[RHptr->file_sys_id] : unknownStr);
- printf("sep: '%c'\n", RHptr->file_sys_info);
- if (RHptr->file_sys_id == 0x0001) { /* ProDOS-specific */
- printf("access: %s ($%.8lX) ", (RHptr->access == 0xE3L ||
- RHptr->access == 0xC3L) ? "Unlocked" : "Locked", RHptr->access);
- printf("file_type: %s ($%.8lX)\n", RHptr->file_type < 256L ?
- FT[RHptr->file_type] : "???", RHptr->file_type);
- } else { /* all other filesystems */
- printf("access: $%.8lX ", RHptr->access);
- printf("file_type: $%.8lX\n", RHptr->file_type);
- }
- printf("extra_type: $%.8lX ", RHptr->extra_type);
- printf("storage_type: %s\n", RHptr->storage_type < STn ?
- ST[RHptr->storage_type] : unknownStr);
- printf("created: %s ", PrintDate(&RHptr->create_when, FALSE));
- printf("mod: %s\n", PrintDate(&RHptr->mod_when, FALSE));
- printf("archived: %s\n", PrintDate(&RHptr->archive_when,
- FALSE));
- printf("GS/OS option_size: %.4x\n", RHptr->option_size);
- /* future expansion... */
- } else {
- printf("%s internal error: undefined output format\n", prgName);
- Quit (-1);
- }
-
- /* Print thread info */
- if (prtform == FULL) DumpThreads(RNodePtr);
- RNodePtr = RNodePtr->RNext; /* advance to next record */
-#ifdef APW
- if (STOP()) Quit (1); /* check for OA-period */
-#endif
- }
-
- /* end of archive processing */
- if (prtform == ARCZOO) {
- printf(
- " === ======== ==== ========\n");
- printf("Total ");
- printf("%3d ", total_files);
- printf("%8ld ", total_length);
-
- /* figure out the percent size, and format it appropriately */
- if (!total_complen && !total_length) {
- printf(" 0%% "); /* file is 0 bytes long */
- } else if ((!total_length && total_complen) ||
- (total_length && !total_complen)) {
- printf("--- "); /* something weird happened */
- } else if (total_length < total_complen) {
- printf(" <0%% "); /* compression failed?!? */
- } else { /* compute from sum of thread lengths (use only data?) */
- percent = 100 - ((total_complen * 100) / total_length);
- if (percent == 0 || percent == 100)
- (void) sprintf(tmpbuf, "%d%%", percent);
- else
- (void) sprintf(tmpbuf, "%.2d%%", percent);
- printf("%4s ", tmpbuf);
- }
-
- printf("%8ld\n", total_complen);
-
- } else if (prtform == FULL) {
- printf("\n*** end of file position: %ld\n", archive->nextposn);
- } /* else do nothing */
-}
+ END OF ARCHIVE