Thread View: comp.sources.apple2
1 messages
1 total messages
Started by Jonathan A. Chandross
Wed, 01 May 1991 22:10
v001SRC035: Nulib - Archive Library Tools (Unix) 04/10
Author: Jonathan A. Chandross
Date: Wed, 01 May 1991 22:10
Date: Wed, 01 May 1991 22:10
993 lines
38840 bytes
38840 bytes
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
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads